@idevconn/ai-chat-be 0.1.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (173) hide show
  1. package/dist/ai-chat.module.d.ts +6 -0
  2. package/dist/ai-chat.module.d.ts.map +1 -0
  3. package/dist/ai-chat.module.js +109 -0
  4. package/dist/ai-chat.module.js.map +1 -0
  5. package/dist/audit/audit.service.d.ts +39 -0
  6. package/dist/audit/audit.service.d.ts.map +1 -0
  7. package/dist/audit/audit.service.js +139 -0
  8. package/dist/audit/audit.service.js.map +1 -0
  9. package/dist/chat/chat.controller.d.ts +20 -0
  10. package/dist/chat/chat.controller.d.ts.map +1 -0
  11. package/dist/chat/chat.controller.js +104 -0
  12. package/dist/chat/chat.controller.js.map +1 -0
  13. package/dist/chat/chat.service.d.ts +15 -0
  14. package/dist/chat/chat.service.d.ts.map +1 -0
  15. package/dist/chat/chat.service.js +95 -0
  16. package/dist/chat/chat.service.js.map +1 -0
  17. package/dist/guards/api-key.guard.d.ts +8 -0
  18. package/dist/guards/api-key.guard.d.ts.map +1 -0
  19. package/dist/guards/api-key.guard.js +44 -0
  20. package/dist/guards/api-key.guard.js.map +1 -0
  21. package/dist/guards/llm-injection-classifier.d.ts +17 -0
  22. package/dist/guards/llm-injection-classifier.d.ts.map +1 -0
  23. package/dist/guards/llm-injection-classifier.js +82 -0
  24. package/dist/guards/llm-injection-classifier.js.map +1 -0
  25. package/dist/guards/pii.guard.d.ts +14 -0
  26. package/dist/guards/pii.guard.d.ts.map +1 -0
  27. package/dist/guards/pii.guard.js +67 -0
  28. package/dist/guards/pii.guard.js.map +1 -0
  29. package/dist/guards/prompt-injection.guard.d.ts +9 -0
  30. package/dist/guards/prompt-injection.guard.d.ts.map +1 -0
  31. package/dist/guards/prompt-injection.guard.js +157 -0
  32. package/dist/guards/prompt-injection.guard.js.map +1 -0
  33. package/dist/guards/rate-limit.guard.d.ts +8 -0
  34. package/dist/guards/rate-limit.guard.d.ts.map +1 -0
  35. package/dist/guards/rate-limit.guard.js +59 -0
  36. package/dist/guards/rate-limit.guard.js.map +1 -0
  37. package/dist/guards/topic-relevance.guard.d.ts +21 -0
  38. package/dist/guards/topic-relevance.guard.d.ts.map +1 -0
  39. package/dist/guards/topic-relevance.guard.js +59 -0
  40. package/dist/guards/topic-relevance.guard.js.map +1 -0
  41. package/dist/index.d.ts +22 -0
  42. package/dist/index.d.ts.map +1 -0
  43. package/dist/index.js +31 -0
  44. package/dist/index.js.map +1 -0
  45. package/dist/intent/embedding-intent-router.d.ts +23 -0
  46. package/dist/intent/embedding-intent-router.d.ts.map +1 -0
  47. package/dist/intent/embedding-intent-router.js +103 -0
  48. package/dist/intent/embedding-intent-router.js.map +1 -0
  49. package/dist/intent/intent-router.interface.d.ts +8 -0
  50. package/dist/intent/intent-router.interface.d.ts.map +1 -0
  51. package/dist/intent/intent-router.interface.js +5 -0
  52. package/dist/intent/intent-router.interface.js.map +1 -0
  53. package/dist/intent/intent.types.d.ts +7 -0
  54. package/dist/intent/intent.types.d.ts.map +1 -0
  55. package/dist/intent/intent.types.js +3 -0
  56. package/dist/intent/intent.types.js.map +1 -0
  57. package/dist/orchestrator/default.orchestrator.d.ts +36 -0
  58. package/dist/orchestrator/default.orchestrator.d.ts.map +1 -0
  59. package/dist/orchestrator/default.orchestrator.js +231 -0
  60. package/dist/orchestrator/default.orchestrator.js.map +1 -0
  61. package/dist/orchestrator/input-sanitizer.d.ts +8 -0
  62. package/dist/orchestrator/input-sanitizer.d.ts.map +1 -0
  63. package/dist/orchestrator/input-sanitizer.js +36 -0
  64. package/dist/orchestrator/input-sanitizer.js.map +1 -0
  65. package/dist/orchestrator/orchestrator.interface.d.ts +6 -0
  66. package/dist/orchestrator/orchestrator.interface.d.ts.map +1 -0
  67. package/dist/orchestrator/orchestrator.interface.js +5 -0
  68. package/dist/orchestrator/orchestrator.interface.js.map +1 -0
  69. package/dist/orchestrator/prompt-builder.d.ts +12 -0
  70. package/dist/orchestrator/prompt-builder.d.ts.map +1 -0
  71. package/dist/orchestrator/prompt-builder.js +55 -0
  72. package/dist/orchestrator/prompt-builder.js.map +1 -0
  73. package/dist/orchestrator/prompt-normalizer.d.ts +9 -0
  74. package/dist/orchestrator/prompt-normalizer.d.ts.map +1 -0
  75. package/dist/orchestrator/prompt-normalizer.js +77 -0
  76. package/dist/orchestrator/prompt-normalizer.js.map +1 -0
  77. package/dist/orchestrator/response-sanitizer.d.ts +26 -0
  78. package/dist/orchestrator/response-sanitizer.d.ts.map +1 -0
  79. package/dist/orchestrator/response-sanitizer.js +127 -0
  80. package/dist/orchestrator/response-sanitizer.js.map +1 -0
  81. package/dist/orchestrator/response-validator.d.ts +10 -0
  82. package/dist/orchestrator/response-validator.d.ts.map +1 -0
  83. package/dist/orchestrator/response-validator.js +31 -0
  84. package/dist/orchestrator/response-validator.js.map +1 -0
  85. package/dist/providers/gemini.provider.d.ts +13 -0
  86. package/dist/providers/gemini.provider.d.ts.map +1 -0
  87. package/dist/providers/gemini.provider.js +132 -0
  88. package/dist/providers/gemini.provider.js.map +1 -0
  89. package/dist/providers/grok.provider.d.ts +11 -0
  90. package/dist/providers/grok.provider.d.ts.map +1 -0
  91. package/dist/providers/grok.provider.js +69 -0
  92. package/dist/providers/grok.provider.js.map +1 -0
  93. package/dist/providers/openai.provider.d.ts +12 -0
  94. package/dist/providers/openai.provider.d.ts.map +1 -0
  95. package/dist/providers/openai.provider.js +87 -0
  96. package/dist/providers/openai.provider.js.map +1 -0
  97. package/dist/providers/provider-registry.d.ts +17 -0
  98. package/dist/providers/provider-registry.d.ts.map +1 -0
  99. package/dist/providers/provider-registry.js +42 -0
  100. package/dist/providers/provider-registry.js.map +1 -0
  101. package/dist/providers/provider-settings.d.ts +12 -0
  102. package/dist/providers/provider-settings.d.ts.map +1 -0
  103. package/dist/providers/provider-settings.js +3 -0
  104. package/dist/providers/provider-settings.js.map +1 -0
  105. package/dist/providers/provider.factory.d.ts +18 -0
  106. package/dist/providers/provider.factory.d.ts.map +1 -0
  107. package/dist/providers/provider.factory.js +107 -0
  108. package/dist/providers/provider.factory.js.map +1 -0
  109. package/dist/rag/chunker.d.ts +7 -0
  110. package/dist/rag/chunker.d.ts.map +1 -0
  111. package/dist/rag/chunker.js +32 -0
  112. package/dist/rag/chunker.js.map +1 -0
  113. package/dist/rag/rag.service.d.ts +20 -0
  114. package/dist/rag/rag.service.d.ts.map +1 -0
  115. package/dist/rag/rag.service.js +171 -0
  116. package/dist/rag/rag.service.js.map +1 -0
  117. package/dist/session/session.service.d.ts +32 -0
  118. package/dist/session/session.service.d.ts.map +1 -0
  119. package/dist/session/session.service.js +161 -0
  120. package/dist/session/session.service.js.map +1 -0
  121. package/dist/types/chat.types.d.ts +31 -0
  122. package/dist/types/chat.types.d.ts.map +1 -0
  123. package/dist/types/chat.types.js +3 -0
  124. package/dist/types/chat.types.js.map +1 -0
  125. package/dist/types/config.types.d.ts +139 -0
  126. package/dist/types/config.types.d.ts.map +1 -0
  127. package/dist/types/config.types.js +5 -0
  128. package/dist/types/config.types.js.map +1 -0
  129. package/dist/types/index.d.ts +4 -0
  130. package/dist/types/index.d.ts.map +1 -0
  131. package/dist/types/index.js +20 -0
  132. package/dist/types/index.js.map +1 -0
  133. package/dist/types/provider.types.d.ts +15 -0
  134. package/dist/types/provider.types.d.ts.map +1 -0
  135. package/dist/types/provider.types.js +3 -0
  136. package/dist/types/provider.types.js.map +1 -0
  137. package/dist/utils/cosine-similarity.d.ts +2 -0
  138. package/dist/utils/cosine-similarity.d.ts.map +1 -0
  139. package/dist/utils/cosine-similarity.js +21 -0
  140. package/dist/utils/cosine-similarity.js.map +1 -0
  141. package/dist/utils/error-sanitizer.d.ts +8 -0
  142. package/dist/utils/error-sanitizer.d.ts.map +1 -0
  143. package/dist/utils/error-sanitizer.js +44 -0
  144. package/dist/utils/error-sanitizer.js.map +1 -0
  145. package/dist/utils/index.d.ts +6 -0
  146. package/dist/utils/index.d.ts.map +1 -0
  147. package/dist/utils/index.js +22 -0
  148. package/dist/utils/index.js.map +1 -0
  149. package/dist/utils/logger.d.ts +11 -0
  150. package/dist/utils/logger.d.ts.map +1 -0
  151. package/dist/utils/logger.js +47 -0
  152. package/dist/utils/logger.js.map +1 -0
  153. package/dist/utils/pii-detector.d.ts +8 -0
  154. package/dist/utils/pii-detector.d.ts.map +1 -0
  155. package/dist/utils/pii-detector.js +82 -0
  156. package/dist/utils/pii-detector.js.map +1 -0
  157. package/dist/utils/retry.d.ts +8 -0
  158. package/dist/utils/retry.d.ts.map +1 -0
  159. package/dist/utils/retry.js +33 -0
  160. package/dist/utils/retry.js.map +1 -0
  161. package/dist/utils/session-token.d.ts +8 -0
  162. package/dist/utils/session-token.d.ts.map +1 -0
  163. package/dist/utils/session-token.js +46 -0
  164. package/dist/utils/session-token.js.map +1 -0
  165. package/dist/utils/sse-parser.d.ts +5 -0
  166. package/dist/utils/sse-parser.d.ts.map +1 -0
  167. package/dist/utils/sse-parser.js +45 -0
  168. package/dist/utils/sse-parser.js.map +1 -0
  169. package/dist/utils/text.d.ts +4 -0
  170. package/dist/utils/text.d.ts.map +1 -0
  171. package/dist/utils/text.js +25 -0
  172. package/dist/utils/text.js.map +1 -0
  173. package/package.json +62 -0
@@ -0,0 +1,9 @@
1
+ import { ChatMessage, ProviderId } from '../types';
2
+ export declare class PromptNormalizer {
3
+ normalize(messages: ChatMessage[], provider: ProviderId, tokenBudget?: number): ChatMessage[];
4
+ private removeEmpty;
5
+ private orderForProvider;
6
+ private trimToTokenBudget;
7
+ private ensureAlternation;
8
+ }
9
+ //# sourceMappingURL=prompt-normalizer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prompt-normalizer.d.ts","sourceRoot":"","sources":["../../src/orchestrator/prompt-normalizer.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AAGnD,qBACa,gBAAgB;IAC3B,SAAS,CAAC,QAAQ,EAAE,WAAW,EAAE,EAAE,QAAQ,EAAE,UAAU,EAAE,WAAW,SAAO,GAAG,WAAW,EAAE;IAQ3F,OAAO,CAAC,WAAW;IAInB,OAAO,CAAC,gBAAgB;IASxB,OAAO,CAAC,iBAAiB;IA4BzB,OAAO,CAAC,iBAAiB;CAmB1B"}
@@ -0,0 +1,77 @@
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ Object.defineProperty(exports, "__esModule", { value: true });
9
+ exports.PromptNormalizer = void 0;
10
+ const common_1 = require("@nestjs/common");
11
+ const text_1 = require("../utils/text");
12
+ let PromptNormalizer = class PromptNormalizer {
13
+ normalize(messages, provider, tokenBudget = 8000) {
14
+ let result = this.removeEmpty(messages);
15
+ result = this.orderForProvider(result, provider);
16
+ result = this.trimToTokenBudget(result, tokenBudget);
17
+ result = this.ensureAlternation(result, provider);
18
+ return result;
19
+ }
20
+ removeEmpty(messages) {
21
+ return messages.filter((m) => m.content.trim().length > 0);
22
+ }
23
+ orderForProvider(messages, provider) {
24
+ if (provider === 'gemini') {
25
+ const system = messages.filter((m) => m.role === 'system');
26
+ const nonSystem = messages.filter((m) => m.role !== 'system');
27
+ return [...system, ...nonSystem];
28
+ }
29
+ return messages;
30
+ }
31
+ trimToTokenBudget(messages, budget) {
32
+ const systemMessages = messages.filter((m) => m.role === 'system');
33
+ const nonSystem = messages.filter((m) => m.role !== 'system');
34
+ let systemCost = 0;
35
+ for (const msg of systemMessages) {
36
+ systemCost += (0, text_1.estimateTokens)(msg.content);
37
+ }
38
+ const remainingBudget = budget - systemCost;
39
+ if (remainingBudget <= 0) {
40
+ return systemMessages;
41
+ }
42
+ const kept = [];
43
+ let used = 0;
44
+ for (let i = nonSystem.length - 1; i >= 0; i--) {
45
+ const cost = (0, text_1.estimateTokens)(nonSystem[i].content);
46
+ if (used + cost > remainingBudget)
47
+ break;
48
+ kept.unshift(nonSystem[i]);
49
+ used += cost;
50
+ }
51
+ return [...systemMessages, ...kept];
52
+ }
53
+ ensureAlternation(messages, provider) {
54
+ if (provider !== 'gemini')
55
+ return messages;
56
+ const result = [];
57
+ for (const msg of messages) {
58
+ if (msg.role === 'system') {
59
+ result.push(msg);
60
+ continue;
61
+ }
62
+ const lastNonSystem = result.filter((m) => m.role !== 'system').pop();
63
+ if (lastNonSystem && lastNonSystem.role === msg.role) {
64
+ lastNonSystem.content += '\n\n' + msg.content;
65
+ }
66
+ else {
67
+ result.push({ ...msg });
68
+ }
69
+ }
70
+ return result;
71
+ }
72
+ };
73
+ exports.PromptNormalizer = PromptNormalizer;
74
+ exports.PromptNormalizer = PromptNormalizer = __decorate([
75
+ (0, common_1.Injectable)()
76
+ ], PromptNormalizer);
77
+ //# sourceMappingURL=prompt-normalizer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prompt-normalizer.js","sourceRoot":"","sources":["../../src/orchestrator/prompt-normalizer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,26 @@
1
+ import { AiChatModuleConfig } from '../types';
2
+ export declare class ResponseSanitizer {
3
+ private readonly config;
4
+ private readonly needles;
5
+ private readonly redactSysPrompt;
6
+ private readonly redactPii;
7
+ constructor(config: AiChatModuleConfig);
8
+ createStream(): SanitizerStream;
9
+ }
10
+ interface SanitizerOpts {
11
+ needles: string[];
12
+ redactSysPrompt: boolean;
13
+ redactPii: boolean;
14
+ }
15
+ export declare class SanitizerStream {
16
+ private readonly opts;
17
+ private buffer;
18
+ private readonly maxNeedleLen;
19
+ constructor(opts: SanitizerOpts);
20
+ push(chunk: string): string;
21
+ flush(): string;
22
+ private consumeSafePrefix;
23
+ private scrub;
24
+ }
25
+ export {};
26
+ //# sourceMappingURL=response-sanitizer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"response-sanitizer.d.ts","sourceRoot":"","sources":["../../src/orchestrator/response-sanitizer.ts"],"names":[],"mappings":"AACA,OAAO,EAAkB,kBAAkB,EAAE,MAAM,UAAU,CAAC;AA8B9D,qBACa,iBAAiB;IAKQ,OAAO,CAAC,QAAQ,CAAC,MAAM;IAJ3D,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAW;IACnC,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAU;IAC1C,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAU;gBAEiB,MAAM,EAAE,kBAAkB;IAQ/E,YAAY,IAAI,eAAe;CAOhC;AAED,UAAU,aAAa;IACrB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,eAAe,EAAE,OAAO,CAAC;IACzB,SAAS,EAAE,OAAO,CAAC;CACpB;AAED,qBAAa,eAAe;IAId,OAAO,CAAC,QAAQ,CAAC,IAAI;IAHjC,OAAO,CAAC,MAAM,CAAM;IACpB,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAS;gBAET,IAAI,EAAE,aAAa;IAIhD,IAAI,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM;IAK3B,KAAK,IAAI,MAAM;IAMf,OAAO,CAAC,iBAAiB;IAczB,OAAO,CAAC,KAAK;CAyBd"}
@@ -0,0 +1,127 @@
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ var __metadata = (this && this.__metadata) || function (k, v) {
9
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
10
+ };
11
+ var __param = (this && this.__param) || function (paramIndex, decorator) {
12
+ return function (target, key) { decorator(target, key, paramIndex); }
13
+ };
14
+ Object.defineProperty(exports, "__esModule", { value: true });
15
+ exports.SanitizerStream = exports.ResponseSanitizer = void 0;
16
+ const common_1 = require("@nestjs/common");
17
+ const types_1 = require("../types");
18
+ const DEFAULT_NEEDLES = [
19
+ 'You are a helpful AI assistant',
20
+ '<DOCUMENT_CONTEXT>',
21
+ '</DOCUMENT_CONTEXT>',
22
+ '[INST]',
23
+ '[/INST]',
24
+ '<|im_start|>',
25
+ '<|im_end|>',
26
+ ];
27
+ const TEMPLATE_TOKEN_PATTERN = /\[\/?INST\]|<\|im_(start|end)\|>/gi;
28
+ const SECURITY_LINE_PATTERN = /^SECURITY:.*$/gm;
29
+ const EMAIL_REGEX = /[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}/g;
30
+ const IPV4_REGEX = /\b(?:\d{1,3}\.){3}\d{1,3}\b/g;
31
+ const CREDIT_CARD_REGEX = /\b(?:\d[ -]?){13,19}\b/g;
32
+ const ROLLING_BUFFER_SIZE = 256;
33
+ let ResponseSanitizer = class ResponseSanitizer {
34
+ config;
35
+ needles;
36
+ redactSysPrompt;
37
+ redactPii;
38
+ constructor(config) {
39
+ this.config = config;
40
+ this.redactSysPrompt = config.output?.redactSystemPrompt !== false;
41
+ this.redactPii = config.output?.redactPii === true;
42
+ this.needles = [...DEFAULT_NEEDLES, ...(config.output?.customNeedles ?? [])].filter((n) => n.length > 0);
43
+ }
44
+ createStream() {
45
+ return new SanitizerStream({
46
+ needles: this.needles,
47
+ redactSysPrompt: this.redactSysPrompt,
48
+ redactPii: this.redactPii,
49
+ });
50
+ }
51
+ };
52
+ exports.ResponseSanitizer = ResponseSanitizer;
53
+ exports.ResponseSanitizer = ResponseSanitizer = __decorate([
54
+ (0, common_1.Injectable)(),
55
+ __param(0, (0, common_1.Inject)(types_1.AI_CHAT_CONFIG)),
56
+ __metadata("design:paramtypes", [Object])
57
+ ], ResponseSanitizer);
58
+ class SanitizerStream {
59
+ opts;
60
+ buffer = '';
61
+ maxNeedleLen;
62
+ constructor(opts) {
63
+ this.opts = opts;
64
+ this.maxNeedleLen = opts.needles.reduce((max, n) => Math.max(max, n.length), 0);
65
+ }
66
+ push(chunk) {
67
+ this.buffer += chunk;
68
+ return this.consumeSafePrefix();
69
+ }
70
+ flush() {
71
+ const tail = this.buffer;
72
+ this.buffer = '';
73
+ return this.scrub(tail);
74
+ }
75
+ consumeSafePrefix() {
76
+ if (this.buffer.length <= ROLLING_BUFFER_SIZE) {
77
+ return '';
78
+ }
79
+ const holdback = Math.max(this.maxNeedleLen, 32);
80
+ const safeLen = this.buffer.length - holdback;
81
+ if (safeLen <= 0)
82
+ return '';
83
+ const safe = this.buffer.slice(0, safeLen);
84
+ this.buffer = this.buffer.slice(safeLen);
85
+ return this.scrub(safe);
86
+ }
87
+ scrub(text) {
88
+ let out = text;
89
+ if (this.opts.redactSysPrompt) {
90
+ for (const needle of this.opts.needles) {
91
+ if (!needle)
92
+ continue;
93
+ const escaped = needle.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
94
+ const re = new RegExp(escaped, 'gi');
95
+ out = out.replace(re, '[REDACTED]');
96
+ }
97
+ out = out.replace(TEMPLATE_TOKEN_PATTERN, '');
98
+ out = out.replace(SECURITY_LINE_PATTERN, '');
99
+ }
100
+ if (this.opts.redactPii) {
101
+ out = out.replace(EMAIL_REGEX, '[REDACTED_EMAIL]');
102
+ out = out.replace(IPV4_REGEX, '[REDACTED_IP]');
103
+ out = out.replace(CREDIT_CARD_REGEX, (match) => looksLikeLuhn(match) ? '[REDACTED_CARD]' : match);
104
+ }
105
+ return out;
106
+ }
107
+ }
108
+ exports.SanitizerStream = SanitizerStream;
109
+ function looksLikeLuhn(text) {
110
+ const digits = text.replace(/\D/g, '');
111
+ if (digits.length < 13 || digits.length > 19)
112
+ return false;
113
+ let sum = 0;
114
+ let alt = false;
115
+ for (let i = digits.length - 1; i >= 0; i--) {
116
+ let d = digits.charCodeAt(i) - 48;
117
+ if (alt) {
118
+ d *= 2;
119
+ if (d > 9)
120
+ d -= 9;
121
+ }
122
+ sum += d;
123
+ alt = !alt;
124
+ }
125
+ return sum % 10 === 0;
126
+ }
127
+ //# sourceMappingURL=response-sanitizer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"response-sanitizer.js","sourceRoot":"","sources":["../../src/orchestrator/response-sanitizer.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;AAAA,2CAAoD;AACpD,oCAA8D;AAE9D,MAAM,eAAe,GAAG;IACtB,gCAAgC;IAChC,oBAAoB;IACpB,qBAAqB;IACrB,QAAQ;IACR,SAAS;IACT,cAAc;IACd,YAAY;CACb,CAAC;AAEF,MAAM,sBAAsB,GAAG,oCAAoC,CAAC;AACpE,MAAM,qBAAqB,GAAG,iBAAiB,CAAC;AAEhD,MAAM,WAAW,GAAG,iDAAiD,CAAC;AACtE,MAAM,UAAU,GAAG,8BAA8B,CAAC;AAClD,MAAM,iBAAiB,GAAG,yBAAyB,CAAC;AAEpD,MAAM,mBAAmB,GAAG,GAAG,CAAC;AAYzB,IAAM,iBAAiB,GAAvB,MAAM,iBAAiB;IAKyB;IAJpC,OAAO,CAAW;IAClB,eAAe,CAAU;IACzB,SAAS,CAAU;IAEpC,YAAqD,MAA0B;QAA1B,WAAM,GAAN,MAAM,CAAoB;QAC7E,IAAI,CAAC,eAAe,GAAG,MAAM,CAAC,MAAM,EAAE,kBAAkB,KAAK,KAAK,CAAC;QACnE,IAAI,CAAC,SAAS,GAAG,MAAM,CAAC,MAAM,EAAE,SAAS,KAAK,IAAI,CAAC;QACnD,IAAI,CAAC,OAAO,GAAG,CAAC,GAAG,eAAe,EAAE,GAAG,CAAC,MAAM,CAAC,MAAM,EAAE,aAAa,IAAI,EAAE,CAAC,CAAC,CAAC,MAAM,CACjF,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CACpB,CAAC;IACJ,CAAC;IAED,YAAY;QACV,OAAO,IAAI,eAAe,CAAC;YACzB,OAAO,EAAE,IAAI,CAAC,OAAO;YACrB,eAAe,EAAE,IAAI,CAAC,eAAe;YACrC,SAAS,EAAE,IAAI,CAAC,SAAS;SAC1B,CAAC,CAAC;IACL,CAAC;CACF,CAAA;AApBY,8CAAiB;4BAAjB,iBAAiB;IAD7B,IAAA,mBAAU,GAAE;IAME,WAAA,IAAA,eAAM,EAAC,sBAAc,CAAC,CAAA;;GALxB,iBAAiB,CAoB7B;AAQD,MAAa,eAAe;IAIG;IAHrB,MAAM,GAAG,EAAE,CAAC;IACH,YAAY,CAAS;IAEtC,YAA6B,IAAmB;QAAnB,SAAI,GAAJ,IAAI,CAAe;QAC9C,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC;IAClF,CAAC;IAED,IAAI,CAAC,KAAa;QAChB,IAAI,CAAC,MAAM,IAAI,KAAK,CAAC;QACrB,OAAO,IAAI,CAAC,iBAAiB,EAAE,CAAC;IAClC,CAAC;IAED,KAAK;QACH,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC;QACzB,IAAI,CAAC,MAAM,GAAG,EAAE,CAAC;QACjB,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAC1B,CAAC;IAEO,iBAAiB;QACvB,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,IAAI,mBAAmB,EAAE,CAAC;YAC9C,OAAO,EAAE,CAAC;QACZ,CAAC;QAED,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,YAAY,EAAE,EAAE,CAAC,CAAC;QACjD,MAAM,OAAO,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,GAAG,QAAQ,CAAC;QAC9C,IAAI,OAAO,IAAI,CAAC;YAAE,OAAO,EAAE,CAAC;QAE5B,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;QAC3C,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QACzC,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAC1B,CAAC;IAEO,KAAK,CAAC,IAAY;QACxB,IAAI,GAAG,GAAG,IAAI,CAAC;QAEf,IAAI,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE,CAAC;YAC9B,KAAK,MAAM,MAAM,IAAI,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;gBACvC,IAAI,CAAC,MAAM;oBAAE,SAAS;gBAEtB,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,qBAAqB,EAAE,MAAM,CAAC,CAAC;gBAC9D,MAAM,EAAE,GAAG,IAAI,MAAM,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;gBACrC,GAAG,GAAG,GAAG,CAAC,OAAO,CAAC,EAAE,EAAE,YAAY,CAAC,CAAC;YACtC,CAAC;YACD,GAAG,GAAG,GAAG,CAAC,OAAO,CAAC,sBAAsB,EAAE,EAAE,CAAC,CAAC;YAC9C,GAAG,GAAG,GAAG,CAAC,OAAO,CAAC,qBAAqB,EAAE,EAAE,CAAC,CAAC;QAC/C,CAAC;QAED,IAAI,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC;YACxB,GAAG,GAAG,GAAG,CAAC,OAAO,CAAC,WAAW,EAAE,kBAAkB,CAAC,CAAC;YACnD,GAAG,GAAG,GAAG,CAAC,OAAO,CAAC,UAAU,EAAE,eAAe,CAAC,CAAC;YAC/C,GAAG,GAAG,GAAG,CAAC,OAAO,CAAC,iBAAiB,EAAE,CAAC,KAAK,EAAE,EAAE,CAC7C,aAAa,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,iBAAiB,CAAC,CAAC,CAAC,KAAK,CACjD,CAAC;QACJ,CAAC;QAED,OAAO,GAAG,CAAC;IACb,CAAC;CACF;AA1DD,0CA0DC;AAED,SAAS,aAAa,CAAC,IAAY;IACjC,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;IACvC,IAAI,MAAM,CAAC,MAAM,GAAG,EAAE,IAAI,MAAM,CAAC,MAAM,GAAG,EAAE;QAAE,OAAO,KAAK,CAAC;IAE3D,IAAI,GAAG,GAAG,CAAC,CAAC;IACZ,IAAI,GAAG,GAAG,KAAK,CAAC;IAChB,KAAK,IAAI,CAAC,GAAG,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QAC5C,IAAI,CAAC,GAAG,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC;QAClC,IAAI,GAAG,EAAE,CAAC;YACR,CAAC,IAAI,CAAC,CAAC;YACP,IAAI,CAAC,GAAG,CAAC;gBAAE,CAAC,IAAI,CAAC,CAAC;QACpB,CAAC;QACD,GAAG,IAAI,CAAC,CAAC;QACT,GAAG,GAAG,CAAC,GAAG,CAAC;IACb,CAAC;IACD,OAAO,GAAG,GAAG,EAAE,KAAK,CAAC,CAAC;AACxB,CAAC"}
@@ -0,0 +1,10 @@
1
+ import { ChatMessage } from '../types';
2
+ export interface ValidationResult {
3
+ valid: boolean;
4
+ error?: string;
5
+ }
6
+ export declare class ResponseValidator {
7
+ validate(response: string): ValidationResult;
8
+ buildCorrectionMessages(error: string): ChatMessage[];
9
+ }
10
+ //# sourceMappingURL=response-validator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"response-validator.d.ts","sourceRoot":"","sources":["../../src/orchestrator/response-validator.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAEvC,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,OAAO,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,qBACa,iBAAiB;IAC5B,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,gBAAgB;IAO5C,uBAAuB,CAAC,KAAK,EAAE,MAAM,GAAG,WAAW,EAAE;CAQtD"}
@@ -0,0 +1,31 @@
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ Object.defineProperty(exports, "__esModule", { value: true });
9
+ exports.ResponseValidator = void 0;
10
+ const common_1 = require("@nestjs/common");
11
+ let ResponseValidator = class ResponseValidator {
12
+ validate(response) {
13
+ if (!response || response.trim().length === 0) {
14
+ return { valid: false, error: 'Empty response from LLM' };
15
+ }
16
+ return { valid: true };
17
+ }
18
+ buildCorrectionMessages(error) {
19
+ return [
20
+ {
21
+ role: 'system',
22
+ content: `Your previous response was invalid: ${error}. Please provide a valid response.`,
23
+ },
24
+ ];
25
+ }
26
+ };
27
+ exports.ResponseValidator = ResponseValidator;
28
+ exports.ResponseValidator = ResponseValidator = __decorate([
29
+ (0, common_1.Injectable)()
30
+ ], ResponseValidator);
31
+ //# sourceMappingURL=response-validator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"response-validator.js","sourceRoot":"","sources":["../../src/orchestrator/response-validator.ts"],"names":[],"mappings":";;;;;;;;;AAAA,2CAA4C;AASrC,IAAM,iBAAiB,GAAvB,MAAM,iBAAiB;IAC5B,QAAQ,CAAC,QAAgB;QACvB,IAAI,CAAC,QAAQ,IAAI,QAAQ,CAAC,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC9C,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,yBAAyB,EAAE,CAAC;QAC5D,CAAC;QACD,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;IACzB,CAAC;IAED,uBAAuB,CAAC,KAAa;QACnC,OAAO;YACL;gBACE,IAAI,EAAE,QAAQ;gBACd,OAAO,EAAE,uCAAuC,KAAK,oCAAoC;aAC1F;SACF,CAAC;IACJ,CAAC;CACF,CAAA;AAhBY,8CAAiB;4BAAjB,iBAAiB;IAD7B,IAAA,mBAAU,GAAE;GACA,iBAAiB,CAgB7B"}
@@ -0,0 +1,13 @@
1
+ import { ChatMessage, ChatStreamEvent, ILlmProvider, StreamOptions } from '../types';
2
+ import { ProviderSettings } from './provider-settings';
3
+ export declare class GeminiProvider implements ILlmProvider {
4
+ private readonly s;
5
+ readonly id: "gemini";
6
+ readonly supportsEmbedding = true;
7
+ constructor(s: ProviderSettings);
8
+ chatStream(messages: ChatMessage[], options?: StreamOptions): AsyncGenerator<ChatStreamEvent>;
9
+ embed(texts: string[]): Promise<number[][]>;
10
+ private toGeminiContents;
11
+ private extractSystemInstruction;
12
+ }
13
+ //# sourceMappingURL=gemini.provider.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gemini.provider.d.ts","sourceRoot":"","sources":["../../src/providers/gemini.provider.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,eAAe,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAGrF,OAAO,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAEvD,qBAAa,cAAe,YAAW,YAAY;IAIrC,OAAO,CAAC,QAAQ,CAAC,CAAC;IAH9B,QAAQ,CAAC,EAAE,EAAG,QAAQ,CAAU;IAChC,QAAQ,CAAC,iBAAiB,QAAQ;gBAEL,CAAC,EAAE,gBAAgB;IAEzC,UAAU,CACf,QAAQ,EAAE,WAAW,EAAE,EACvB,OAAO,CAAC,EAAE,aAAa,GACtB,cAAc,CAAC,eAAe,CAAC;IAkG5B,KAAK,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC;IA0BjD,OAAO,CAAC,gBAAgB;IAWxB,OAAO,CAAC,wBAAwB;CAKjC"}
@@ -0,0 +1,132 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.GeminiProvider = void 0;
4
+ const retry_1 = require("../utils/retry");
5
+ const logger_1 = require("../utils/logger");
6
+ class GeminiProvider {
7
+ s;
8
+ id = 'gemini';
9
+ supportsEmbedding = true;
10
+ constructor(s) {
11
+ this.s = s;
12
+ }
13
+ async *chatStream(messages, options) {
14
+ const url = `${this.s.baseUrl}/models/${this.s.chatModel}:streamGenerateContent?alt=sse&key=${this.s.apiKey}`;
15
+ const contents = this.toGeminiContents(messages);
16
+ const systemInstruction = this.extractSystemInstruction(messages);
17
+ const body = {
18
+ contents,
19
+ generationConfig: {
20
+ temperature: options?.temperature ?? 0.7,
21
+ maxOutputTokens: options?.maxTokens ?? 2048,
22
+ },
23
+ };
24
+ if (systemInstruction) {
25
+ body.systemInstruction = { parts: [{ text: systemInstruction }] };
26
+ }
27
+ let response;
28
+ try {
29
+ response = await (0, retry_1.withRetry)(() => fetch(url, {
30
+ method: 'POST',
31
+ headers: { 'Content-Type': 'application/json' },
32
+ body: JSON.stringify(body),
33
+ signal: options?.signal,
34
+ }), this.s.retry);
35
+ }
36
+ catch (error) {
37
+ (0, logger_1.logStreamError)('Gemini', error);
38
+ yield { type: 'error', error: 'Failed to connect to Gemini API' };
39
+ return;
40
+ }
41
+ if (!response.ok) {
42
+ const errorBody = await response.text().catch(() => '');
43
+ (0, logger_1.logStreamError)('Gemini', `HTTP ${response.status}: ${errorBody}`);
44
+ yield {
45
+ type: 'error',
46
+ error: `Gemini API error: ${response.status}`,
47
+ };
48
+ return;
49
+ }
50
+ const reader = response.body?.getReader();
51
+ if (!reader) {
52
+ yield { type: 'error', error: 'No response body from Gemini' };
53
+ return;
54
+ }
55
+ const decoder = new TextDecoder();
56
+ let buffer = '';
57
+ let totalTokens = 0;
58
+ try {
59
+ while (true) {
60
+ const { done, value } = await reader.read();
61
+ if (done)
62
+ break;
63
+ buffer += decoder.decode(value, { stream: true });
64
+ const lines = buffer.split('\n');
65
+ buffer = lines.pop() || '';
66
+ for (const line of lines) {
67
+ if (!line.startsWith('data: '))
68
+ continue;
69
+ const data = line.slice(6).trim();
70
+ if (!data || data === '[DONE]')
71
+ continue;
72
+ try {
73
+ const parsed = JSON.parse(data);
74
+ const text = parsed?.candidates?.[0]?.content?.parts?.[0]?.text;
75
+ if (text) {
76
+ totalTokens += Math.ceil(text.length / 4);
77
+ yield { type: 'token', content: text };
78
+ }
79
+ }
80
+ catch {
81
+ }
82
+ }
83
+ }
84
+ }
85
+ catch (error) {
86
+ (0, logger_1.logStreamError)('Gemini', error);
87
+ yield { type: 'error', error: 'Stream interrupted' };
88
+ return;
89
+ }
90
+ yield {
91
+ type: 'done',
92
+ usage: {
93
+ promptTokens: 0,
94
+ completionTokens: totalTokens,
95
+ totalTokens,
96
+ },
97
+ };
98
+ }
99
+ async embed(texts) {
100
+ const url = `${this.s.baseUrl}/models/${this.s.embeddingModel}:batchEmbedContents?key=${this.s.apiKey}`;
101
+ const requests = texts.map((text) => ({
102
+ model: `models/${this.s.embeddingModel}`,
103
+ content: { parts: [{ text }] },
104
+ }));
105
+ const response = await (0, retry_1.withRetry)(() => fetch(url, {
106
+ method: 'POST',
107
+ headers: { 'Content-Type': 'application/json' },
108
+ body: JSON.stringify({ requests }),
109
+ }), this.s.retry);
110
+ if (!response.ok) {
111
+ throw new Error(`Gemini embedding failed: ${response.status}`);
112
+ }
113
+ const data = await response.json();
114
+ return data.embeddings.map((e) => e.values);
115
+ }
116
+ toGeminiContents(messages) {
117
+ return messages
118
+ .filter((m) => m.role !== 'system')
119
+ .map((m) => ({
120
+ role: m.role === 'assistant' ? 'model' : 'user',
121
+ parts: [{ text: m.content }],
122
+ }));
123
+ }
124
+ extractSystemInstruction(messages) {
125
+ const systemMessages = messages.filter((m) => m.role === 'system');
126
+ if (systemMessages.length === 0)
127
+ return null;
128
+ return systemMessages.map((m) => m.content).join('\n\n');
129
+ }
130
+ }
131
+ exports.GeminiProvider = GeminiProvider;
132
+ //# sourceMappingURL=gemini.provider.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gemini.provider.js","sourceRoot":"","sources":["../../src/providers/gemini.provider.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ import { ChatMessage, ChatStreamEvent, ILlmProvider, StreamOptions } from '../types';
2
+ import { ProviderSettings } from './provider-settings';
3
+ export declare class GrokProvider implements ILlmProvider {
4
+ private readonly s;
5
+ readonly id: "grok";
6
+ readonly supportsEmbedding = false;
7
+ private readonly client;
8
+ constructor(s: ProviderSettings);
9
+ chatStream(messages: ChatMessage[], options?: StreamOptions): AsyncGenerator<ChatStreamEvent>;
10
+ }
11
+ //# sourceMappingURL=grok.provider.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"grok.provider.d.ts","sourceRoot":"","sources":["../../src/providers/grok.provider.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,eAAe,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAErF,OAAO,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAEvD,qBAAa,YAAa,YAAW,YAAY;IAMnC,OAAO,CAAC,QAAQ,CAAC,CAAC;IAL9B,QAAQ,CAAC,EAAE,EAAG,MAAM,CAAU;IAC9B,QAAQ,CAAC,iBAAiB,SAAS;IAEnC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;gBAEH,CAAC,EAAE,gBAAgB;IAOzC,UAAU,CACf,QAAQ,EAAE,WAAW,EAAE,EACvB,OAAO,CAAC,EAAE,aAAa,GACtB,cAAc,CAAC,eAAe,CAAC;CAgDnC"}
@@ -0,0 +1,69 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.GrokProvider = void 0;
7
+ const openai_1 = __importDefault(require("openai"));
8
+ const logger_1 = require("../utils/logger");
9
+ class GrokProvider {
10
+ s;
11
+ id = 'grok';
12
+ supportsEmbedding = false;
13
+ client;
14
+ constructor(s) {
15
+ this.s = s;
16
+ this.client = new openai_1.default({
17
+ apiKey: s.apiKey,
18
+ baseURL: s.baseUrl,
19
+ });
20
+ }
21
+ async *chatStream(messages, options) {
22
+ let stream;
23
+ try {
24
+ stream = await this.client.chat.completions.create({
25
+ model: this.s.chatModel,
26
+ messages: messages.map((m) => ({
27
+ role: m.role,
28
+ content: m.content,
29
+ })),
30
+ stream: true,
31
+ temperature: options?.temperature ?? 0.7,
32
+ max_tokens: options?.maxTokens ?? 2048,
33
+ });
34
+ }
35
+ catch (error) {
36
+ (0, logger_1.logStreamError)('Grok', error);
37
+ yield {
38
+ type: 'error',
39
+ error: 'Failed to connect to Grok API',
40
+ };
41
+ return;
42
+ }
43
+ let totalTokens = 0;
44
+ try {
45
+ for await (const chunk of stream) {
46
+ const delta = chunk.choices[0]?.delta;
47
+ if (delta?.content) {
48
+ totalTokens += Math.ceil(delta.content.length / 4);
49
+ yield { type: 'token', content: delta.content };
50
+ }
51
+ }
52
+ }
53
+ catch (error) {
54
+ (0, logger_1.logStreamError)('Grok', error);
55
+ yield { type: 'error', error: 'Stream interrupted' };
56
+ return;
57
+ }
58
+ yield {
59
+ type: 'done',
60
+ usage: {
61
+ promptTokens: 0,
62
+ completionTokens: totalTokens,
63
+ totalTokens,
64
+ },
65
+ };
66
+ }
67
+ }
68
+ exports.GrokProvider = GrokProvider;
69
+ //# sourceMappingURL=grok.provider.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"grok.provider.js","sourceRoot":"","sources":["../../src/providers/grok.provider.ts"],"names":[],"mappings":";;;;;;AAAA,oDAA4B;AAE5B,4CAAiD;AAGjD,MAAa,YAAY;IAMM;IALpB,EAAE,GAAG,MAAe,CAAC;IACrB,iBAAiB,GAAG,KAAK,CAAC;IAElB,MAAM,CAAS;IAEhC,YAA6B,CAAmB;QAAnB,MAAC,GAAD,CAAC,CAAkB;QAC9C,IAAI,CAAC,MAAM,GAAG,IAAI,gBAAM,CAAC;YACvB,MAAM,EAAE,CAAC,CAAC,MAAM;YAChB,OAAO,EAAE,CAAC,CAAC,OAAQ;SACpB,CAAC,CAAC;IACL,CAAC;IAED,KAAK,CAAC,CAAC,UAAU,CACf,QAAuB,EACvB,OAAuB;QAEvB,IAAI,MAAkE,CAAC;QAEvE,IAAI,CAAC;YACH,MAAM,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC;gBACjD,KAAK,EAAE,IAAI,CAAC,CAAC,CAAC,SAAS;gBACvB,QAAQ,EAAE,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;oBAC7B,IAAI,EAAE,CAAC,CAAC,IAAI;oBACZ,OAAO,EAAE,CAAC,CAAC,OAAO;iBACnB,CAAC,CAAC;gBACH,MAAM,EAAE,IAAI;gBACZ,WAAW,EAAE,OAAO,EAAE,WAAW,IAAI,GAAG;gBACxC,UAAU,EAAE,OAAO,EAAE,SAAS,IAAI,IAAI;aACvC,CAAC,CAAC;QACL,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAA,uBAAc,EAAC,MAAM,EAAE,KAAK,CAAC,CAAC;YAC9B,MAAM;gBACJ,IAAI,EAAE,OAAO;gBACb,KAAK,EAAE,+BAA+B;aACvC,CAAC;YACF,OAAO;QACT,CAAC;QAED,IAAI,WAAW,GAAG,CAAC,CAAC;QAEpB,IAAI,CAAC;YACH,IAAI,KAAK,EAAE,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;gBACjC,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC;gBACtC,IAAI,KAAK,EAAE,OAAO,EAAE,CAAC;oBACnB,WAAW,IAAI,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;oBACnD,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,KAAK,CAAC,OAAO,EAAE,CAAC;gBAClD,CAAC;YACH,CAAC;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAA,uBAAc,EAAC,MAAM,EAAE,KAAK,CAAC,CAAC;YAC9B,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,oBAAoB,EAAE,CAAC;YACrD,OAAO;QACT,CAAC;QAED,MAAM;YACJ,IAAI,EAAE,MAAM;YACZ,KAAK,EAAE;gBACL,YAAY,EAAE,CAAC;gBACf,gBAAgB,EAAE,WAAW;gBAC7B,WAAW;aACZ;SACF,CAAC;IACJ,CAAC;CACF;AAhED,oCAgEC"}
@@ -0,0 +1,12 @@
1
+ import { ChatMessage, ChatStreamEvent, ILlmProvider, StreamOptions } from '../types';
2
+ import { ProviderSettings } from './provider-settings';
3
+ export declare class OpenAIProvider implements ILlmProvider {
4
+ private readonly s;
5
+ readonly id: "openai";
6
+ readonly supportsEmbedding = true;
7
+ private readonly client;
8
+ constructor(s: ProviderSettings);
9
+ chatStream(messages: ChatMessage[], options?: StreamOptions): AsyncGenerator<ChatStreamEvent>;
10
+ embed(texts: string[]): Promise<number[][]>;
11
+ }
12
+ //# sourceMappingURL=openai.provider.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"openai.provider.d.ts","sourceRoot":"","sources":["../../src/providers/openai.provider.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,eAAe,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAErF,OAAO,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAEvD,qBAAa,cAAe,YAAW,YAAY;IAMrC,OAAO,CAAC,QAAQ,CAAC,CAAC;IAL9B,QAAQ,CAAC,EAAE,EAAG,QAAQ,CAAU;IAChC,QAAQ,CAAC,iBAAiB,QAAQ;IAElC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;gBAEH,CAAC,EAAE,gBAAgB;IAOzC,UAAU,CACf,QAAQ,EAAE,WAAW,EAAE,EACvB,OAAO,CAAC,EAAE,aAAa,GACtB,cAAc,CAAC,eAAe,CAAC;IA6D5B,KAAK,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC;CAQlD"}