@multiplayer-app/ai-agent-node 0.0.1

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 (210) hide show
  1. package/.env.example +45 -0
  2. package/README.md +611 -0
  3. package/config.example.json +73 -0
  4. package/dist/config.d.ts +35 -0
  5. package/dist/config.d.ts.map +1 -0
  6. package/dist/config.js +44 -0
  7. package/dist/config.js.map +1 -0
  8. package/dist/helpers/AIHelper.d.ts +23 -0
  9. package/dist/helpers/AIHelper.d.ts.map +1 -0
  10. package/dist/helpers/AIHelper.js +326 -0
  11. package/dist/helpers/AIHelper.js.map +1 -0
  12. package/dist/helpers/AIHelper.test.d.ts +2 -0
  13. package/dist/helpers/AIHelper.test.d.ts.map +1 -0
  14. package/dist/helpers/AIHelper.test.js +332 -0
  15. package/dist/helpers/AIHelper.test.js.map +1 -0
  16. package/dist/helpers/ConfigHelper.d.ts +20 -0
  17. package/dist/helpers/ConfigHelper.d.ts.map +1 -0
  18. package/dist/helpers/ConfigHelper.js +118 -0
  19. package/dist/helpers/ConfigHelper.js.map +1 -0
  20. package/dist/helpers/ContextLimiter.d.ts +82 -0
  21. package/dist/helpers/ContextLimiter.d.ts.map +1 -0
  22. package/dist/helpers/ContextLimiter.js +165 -0
  23. package/dist/helpers/ContextLimiter.js.map +1 -0
  24. package/dist/helpers/FileHelper.d.ts +31 -0
  25. package/dist/helpers/FileHelper.d.ts.map +1 -0
  26. package/dist/helpers/FileHelper.js +175 -0
  27. package/dist/helpers/FileHelper.js.map +1 -0
  28. package/dist/helpers/SetupHelper.d.ts +5 -0
  29. package/dist/helpers/SetupHelper.d.ts.map +1 -0
  30. package/dist/helpers/SetupHelper.js +32 -0
  31. package/dist/helpers/SetupHelper.js.map +1 -0
  32. package/dist/helpers/index.d.ts +6 -0
  33. package/dist/helpers/index.d.ts.map +1 -0
  34. package/dist/helpers/index.js +6 -0
  35. package/dist/helpers/index.js.map +1 -0
  36. package/dist/index.d.ts +18 -0
  37. package/dist/index.d.ts.map +1 -0
  38. package/dist/index.js +17 -0
  39. package/dist/index.js.map +1 -0
  40. package/dist/libs/index.d.ts +4 -0
  41. package/dist/libs/index.d.ts.map +1 -0
  42. package/dist/libs/index.js +4 -0
  43. package/dist/libs/index.js.map +1 -0
  44. package/dist/libs/kafka/config.d.ts +5 -0
  45. package/dist/libs/kafka/config.d.ts.map +1 -0
  46. package/dist/libs/kafka/config.js +5 -0
  47. package/dist/libs/kafka/config.js.map +1 -0
  48. package/dist/libs/kafka/consumer.d.ts +16 -0
  49. package/dist/libs/kafka/consumer.d.ts.map +1 -0
  50. package/dist/libs/kafka/consumer.js +126 -0
  51. package/dist/libs/kafka/consumer.js.map +1 -0
  52. package/dist/libs/kafka/index.d.ts +3 -0
  53. package/dist/libs/kafka/index.d.ts.map +1 -0
  54. package/dist/libs/kafka/index.js +3 -0
  55. package/dist/libs/kafka/index.js.map +1 -0
  56. package/dist/libs/kafka/kafka.d.ts +3 -0
  57. package/dist/libs/kafka/kafka.d.ts.map +1 -0
  58. package/dist/libs/kafka/kafka.js +24 -0
  59. package/dist/libs/kafka/kafka.js.map +1 -0
  60. package/dist/libs/kafka/producer.d.ts +11 -0
  61. package/dist/libs/kafka/producer.d.ts.map +1 -0
  62. package/dist/libs/kafka/producer.js +44 -0
  63. package/dist/libs/kafka/producer.js.map +1 -0
  64. package/dist/libs/logger/config.d.ts +5 -0
  65. package/dist/libs/logger/config.d.ts.map +1 -0
  66. package/dist/libs/logger/config.js +6 -0
  67. package/dist/libs/logger/config.js.map +1 -0
  68. package/dist/libs/logger/index.d.ts +10 -0
  69. package/dist/libs/logger/index.d.ts.map +1 -0
  70. package/dist/libs/logger/index.js +20 -0
  71. package/dist/libs/logger/index.js.map +1 -0
  72. package/dist/libs/logger/kafkajs-logger-creator.d.ts +12 -0
  73. package/dist/libs/logger/kafkajs-logger-creator.d.ts.map +1 -0
  74. package/dist/libs/logger/kafkajs-logger-creator.js +29 -0
  75. package/dist/libs/logger/kafkajs-logger-creator.js.map +1 -0
  76. package/dist/libs/logger/logger.d.ts +42 -0
  77. package/dist/libs/logger/logger.d.ts.map +1 -0
  78. package/dist/libs/logger/logger.js +44 -0
  79. package/dist/libs/logger/logger.js.map +1 -0
  80. package/dist/libs/s3/config.d.ts +7 -0
  81. package/dist/libs/s3/config.d.ts.map +1 -0
  82. package/dist/libs/s3/config.js +7 -0
  83. package/dist/libs/s3/config.js.map +1 -0
  84. package/dist/libs/s3/index.d.ts +4 -0
  85. package/dist/libs/s3/index.d.ts.map +1 -0
  86. package/dist/libs/s3/index.js +4 -0
  87. package/dist/libs/s3/index.js.map +1 -0
  88. package/dist/libs/s3/s3.lib.d.ts +25 -0
  89. package/dist/libs/s3/s3.lib.d.ts.map +1 -0
  90. package/dist/libs/s3/s3.lib.js +202 -0
  91. package/dist/libs/s3/s3.lib.js.map +1 -0
  92. package/dist/processors/ChatProcessor.d.ts +66 -0
  93. package/dist/processors/ChatProcessor.d.ts.map +1 -0
  94. package/dist/processors/ChatProcessor.js +610 -0
  95. package/dist/processors/ChatProcessor.js.map +1 -0
  96. package/dist/processors/ModelsProcessor.d.ts +11 -0
  97. package/dist/processors/ModelsProcessor.d.ts.map +1 -0
  98. package/dist/processors/ModelsProcessor.js +30 -0
  99. package/dist/processors/ModelsProcessor.js.map +1 -0
  100. package/dist/processors/index.d.ts +3 -0
  101. package/dist/processors/index.d.ts.map +1 -0
  102. package/dist/processors/index.js +3 -0
  103. package/dist/processors/index.js.map +1 -0
  104. package/dist/services/AIService.d.ts +48 -0
  105. package/dist/services/AIService.d.ts.map +1 -0
  106. package/dist/services/AIService.js +196 -0
  107. package/dist/services/AIService.js.map +1 -0
  108. package/dist/services/InternalEventsHandler.d.ts +21 -0
  109. package/dist/services/InternalEventsHandler.d.ts.map +1 -0
  110. package/dist/services/InternalEventsHandler.js +56 -0
  111. package/dist/services/InternalEventsHandler.js.map +1 -0
  112. package/dist/services/KafkaService.d.ts +35 -0
  113. package/dist/services/KafkaService.d.ts.map +1 -0
  114. package/dist/services/KafkaService.js +120 -0
  115. package/dist/services/KafkaService.js.map +1 -0
  116. package/dist/services/ModelFetcher.d.ts +54 -0
  117. package/dist/services/ModelFetcher.d.ts.map +1 -0
  118. package/dist/services/ModelFetcher.js +247 -0
  119. package/dist/services/ModelFetcher.js.map +1 -0
  120. package/dist/services/RedisService.d.ts +90 -0
  121. package/dist/services/RedisService.d.ts.map +1 -0
  122. package/dist/services/RedisService.js +236 -0
  123. package/dist/services/RedisService.js.map +1 -0
  124. package/dist/services/SocketService.d.ts +39 -0
  125. package/dist/services/SocketService.d.ts.map +1 -0
  126. package/dist/services/SocketService.js +128 -0
  127. package/dist/services/SocketService.js.map +1 -0
  128. package/dist/services/index.d.ts +7 -0
  129. package/dist/services/index.d.ts.map +1 -0
  130. package/dist/services/index.js +7 -0
  131. package/dist/services/index.js.map +1 -0
  132. package/dist/store/AgentStore.d.ts +48 -0
  133. package/dist/store/AgentStore.d.ts.map +1 -0
  134. package/dist/store/AgentStore.js +98 -0
  135. package/dist/store/AgentStore.js.map +1 -0
  136. package/dist/store/ArtifactStore.d.ts +13 -0
  137. package/dist/store/ArtifactStore.d.ts.map +1 -0
  138. package/dist/store/ArtifactStore.js +27 -0
  139. package/dist/store/ArtifactStore.js.map +1 -0
  140. package/dist/store/ConfigStore.d.ts +89 -0
  141. package/dist/store/ConfigStore.d.ts.map +1 -0
  142. package/dist/store/ConfigStore.js +214 -0
  143. package/dist/store/ConfigStore.js.map +1 -0
  144. package/dist/store/ConfigStore.test.d.ts +2 -0
  145. package/dist/store/ConfigStore.test.d.ts.map +1 -0
  146. package/dist/store/ConfigStore.test.js +259 -0
  147. package/dist/store/ConfigStore.test.js.map +1 -0
  148. package/dist/store/ModelStore.d.ts +44 -0
  149. package/dist/store/ModelStore.d.ts.map +1 -0
  150. package/dist/store/ModelStore.js +81 -0
  151. package/dist/store/ModelStore.js.map +1 -0
  152. package/dist/store/ModelStore.test.d.ts +2 -0
  153. package/dist/store/ModelStore.test.d.ts.map +1 -0
  154. package/dist/store/ModelStore.test.js +390 -0
  155. package/dist/store/ModelStore.test.js.map +1 -0
  156. package/dist/store/index.d.ts +5 -0
  157. package/dist/store/index.d.ts.map +1 -0
  158. package/dist/store/index.js +5 -0
  159. package/dist/store/index.js.map +1 -0
  160. package/dist/tools/generateChartTool.d.ts +24 -0
  161. package/dist/tools/generateChartTool.d.ts.map +1 -0
  162. package/dist/tools/generateChartTool.js +124 -0
  163. package/dist/tools/generateChartTool.js.map +1 -0
  164. package/dist/tools/proposeFormValuesTool.d.ts +35 -0
  165. package/dist/tools/proposeFormValuesTool.d.ts.map +1 -0
  166. package/dist/tools/proposeFormValuesTool.js +56 -0
  167. package/dist/tools/proposeFormValuesTool.js.map +1 -0
  168. package/package.json +71 -0
  169. package/src/config.ts +46 -0
  170. package/src/helpers/AIHelper.test.ts +375 -0
  171. package/src/helpers/AIHelper.ts +353 -0
  172. package/src/helpers/ConfigHelper.ts +130 -0
  173. package/src/helpers/ContextLimiter.ts +228 -0
  174. package/src/helpers/FileHelper.ts +197 -0
  175. package/src/helpers/SetupHelper.ts +35 -0
  176. package/src/helpers/index.ts +5 -0
  177. package/src/index.ts +18 -0
  178. package/src/libs/index.ts +3 -0
  179. package/src/libs/kafka/config.ts +4 -0
  180. package/src/libs/kafka/consumer.ts +161 -0
  181. package/src/libs/kafka/index.ts +2 -0
  182. package/src/libs/kafka/kafka.ts +27 -0
  183. package/src/libs/kafka/producer.ts +48 -0
  184. package/src/libs/logger/config.ts +4 -0
  185. package/src/libs/logger/index.ts +21 -0
  186. package/src/libs/logger/kafkajs-logger-creator.ts +28 -0
  187. package/src/libs/logger/logger.ts +60 -0
  188. package/src/libs/s3/config.ts +7 -0
  189. package/src/libs/s3/index.ts +3 -0
  190. package/src/libs/s3/s3.lib.ts +284 -0
  191. package/src/processors/ChatProcessor.ts +713 -0
  192. package/src/processors/ModelsProcessor.ts +34 -0
  193. package/src/processors/index.ts +2 -0
  194. package/src/services/AIService.ts +241 -0
  195. package/src/services/InternalEventsHandler.ts +61 -0
  196. package/src/services/KafkaService.ts +142 -0
  197. package/src/services/ModelFetcher.ts +286 -0
  198. package/src/services/RedisService.ts +285 -0
  199. package/src/services/SocketService.ts +153 -0
  200. package/src/services/index.ts +6 -0
  201. package/src/store/AgentStore.ts +138 -0
  202. package/src/store/ArtifactStore.ts +29 -0
  203. package/src/store/ConfigStore.test.ts +314 -0
  204. package/src/store/ConfigStore.ts +239 -0
  205. package/src/store/ModelStore.test.ts +473 -0
  206. package/src/store/ModelStore.ts +93 -0
  207. package/src/store/index.ts +4 -0
  208. package/src/tools/generateChartTool.ts +131 -0
  209. package/src/tools/proposeFormValuesTool.ts +67 -0
  210. package/tsconfig.json +24 -0
@@ -0,0 +1,30 @@
1
+ import { ModelStore } from "../store";
2
+ const providerNames = {
3
+ openai: 'OpenAI',
4
+ anthropic: 'Anthropic',
5
+ google: 'Google',
6
+ openrouter: 'OpenRouter'
7
+ };
8
+ export class ModelsProcessor {
9
+ async getModels() {
10
+ const modelStore = ModelStore.getInstance();
11
+ if (!modelStore.hasModels()) {
12
+ // Return empty if models haven't been loaded yet
13
+ return {
14
+ models: [],
15
+ providers: []
16
+ };
17
+ }
18
+ const models = modelStore.getModels();
19
+ const providers = modelStore.getProviders();
20
+ return {
21
+ models,
22
+ providers: providers.map((providerId) => ({
23
+ id: providerId,
24
+ name: providerNames[providerId] || providerId,
25
+ models: modelStore.getModelsByProvider(providerId)
26
+ }))
27
+ };
28
+ }
29
+ }
30
+ //# sourceMappingURL=ModelsProcessor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ModelsProcessor.js","sourceRoot":"","sources":["../../src/processors/ModelsProcessor.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AAEtC,MAAM,aAAa,GAA2B;IAC1C,MAAM,EAAE,QAAQ;IAChB,SAAS,EAAE,WAAW;IACtB,MAAM,EAAE,QAAQ;IAChB,UAAU,EAAE,YAAY;CAC3B,CAAC;AACF,MAAM,OAAO,eAAe;IAEzB,KAAK,CAAC,SAAS;QACd,MAAM,UAAU,GAAG,UAAU,CAAC,WAAW,EAAE,CAAC;QAE5C,IAAI,CAAC,UAAU,CAAC,SAAS,EAAE,EAAE,CAAC;YAC5B,iDAAiD;YACjD,OAAO;gBACL,MAAM,EAAE,EAAE;gBACV,SAAS,EAAE,EAAE;aACd,CAAC;QACJ,CAAC;QAED,MAAM,MAAM,GAAG,UAAU,CAAC,SAAS,EAAE,CAAC;QACtC,MAAM,SAAS,GAAG,UAAU,CAAC,YAAY,EAAE,CAAC;QAE5C,OAAO;YACL,MAAM;YACN,SAAS,EAAE,SAAS,CAAC,GAAG,CAAC,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;gBACxC,EAAE,EAAE,UAAU;gBACd,IAAI,EAAE,aAAa,CAAC,UAAU,CAAC,IAAI,UAAU;gBAC7C,MAAM,EAAE,UAAU,CAAC,mBAAmB,CAAC,UAAU,CAAC;aACnD,CAAC,CAAC;SACJ,CAAC;IACJ,CAAC;CACF"}
@@ -0,0 +1,3 @@
1
+ export * from './ChatProcessor';
2
+ export * from './ModelsProcessor';
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/processors/index.ts"],"names":[],"mappings":"AAAA,cAAc,iBAAiB,CAAC;AAChC,cAAc,mBAAmB,CAAC"}
@@ -0,0 +1,3 @@
1
+ export * from './ChatProcessor';
2
+ export * from './ModelsProcessor';
3
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/processors/index.ts"],"names":[],"mappings":"AAAA,cAAc,iBAAiB,CAAC;AAChC,cAAc,mBAAmB,CAAC"}
@@ -0,0 +1,48 @@
1
+ import { streamText, type LanguageModel, ModelMessage, ToolSet, Tool } from 'ai';
2
+ import type { AgentConfig, ToolChoice, AdditionalContext } from '@multiplayer-app/ai-agent-types';
3
+ import { ModelStore } from '../store/ModelStore';
4
+ export interface GenerateTextOptions {
5
+ messages: ModelMessage[];
6
+ system?: string;
7
+ temperature?: number;
8
+ maxOutputTokens?: number;
9
+ topP?: number;
10
+ toolChoice?: ToolChoice<ToolSet>;
11
+ tools?: ToolSet;
12
+ model?: string;
13
+ signal?: AbortSignal;
14
+ }
15
+ export interface StreamTextOptions extends GenerateTextOptions {
16
+ onChunk?: (chunk: any) => void;
17
+ onError?: (error: Error) => void;
18
+ onFinish?: (data: {
19
+ text: string;
20
+ finishReason: string;
21
+ usage: any;
22
+ response: any;
23
+ steps: any;
24
+ totalUsage: any;
25
+ }) => void;
26
+ onAbort?: (data: any) => void;
27
+ onStepFinish?: (step: any) => void;
28
+ }
29
+ export interface LocalFunctionTool extends Omit<Tool, 'title'> {
30
+ title: string;
31
+ }
32
+ export declare class AIService {
33
+ private modelStore;
34
+ constructor(modelStore: ModelStore);
35
+ getLanguageModel(modelId: string | undefined, websearchEnabled: boolean): LanguageModel;
36
+ /**
37
+ * Create a language model instance based on the provider
38
+ */
39
+ private createLanguageModel;
40
+ private getWebSearchTool;
41
+ private getTool;
42
+ getAgentOptions(config: AgentConfig<LocalFunctionTool>, modelId?: string, context?: AdditionalContext): Omit<GenerateTextOptions, 'messages'> & {
43
+ name: string;
44
+ };
45
+ generateText(options: GenerateTextOptions): Promise<string>;
46
+ streamText(options: StreamTextOptions): ReturnType<typeof streamText>;
47
+ }
48
+ //# sourceMappingURL=AIService.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AIService.d.ts","sourceRoot":"","sources":["../../src/services/AIService.ts"],"names":[],"mappings":"AAIA,OAAO,EAEL,UAAU,EACV,KAAK,aAAa,EAClB,YAAY,EACZ,OAAO,EAEP,IAAI,EAEL,MAAM,IAAI,CAAC;AACZ,OAAO,KAAK,EAAwC,WAAW,EAAE,UAAU,EAA0B,iBAAiB,EAAC,MAAM,iCAAiC,CAAC;AAE/J,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAIjD,MAAM,WAAW,mBAAmB;IAClC,QAAQ,EAAE,YAAY,EAAE,CAAC;IACzB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,UAAU,CAAC,EAAE,UAAU,CAAC,OAAO,CAAC,CAAC;IACjC,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,WAAW,CAAC;CACtB;AAED,MAAM,WAAW,iBAAkB,SAAQ,mBAAmB;IAC5D,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,GAAG,KAAK,IAAI,CAAC;IAC/B,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;IACjC,QAAQ,CAAC,EAAE,CAAC,IAAI,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,YAAY,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,GAAG,CAAC;QAAC,QAAQ,EAAE,GAAG,CAAC;QAAC,KAAK,EAAE,GAAG,CAAC;QAAC,UAAU,EAAE,GAAG,CAAA;KAAE,KAAK,IAAI,CAAC;IAC1H,OAAO,CAAC,EAAE,CAAC,IAAI,EAAE,GAAG,KAAK,IAAI,CAAC;IAC9B,YAAY,CAAC,EAAE,CAAC,IAAI,EAAE,GAAG,KAAK,IAAI,CAAC;CACpC;AAED,MAAM,WAAW,iBAAkB,SAAQ,IAAI,CAAC,IAAI,EAAE,OAAO,CAAC;IAC5D,KAAK,EAAE,MAAM,CAAC;CACf;AAED,qBAAa,SAAS;IACpB,OAAO,CAAC,UAAU,CAAa;gBAEnB,UAAU,EAAE,UAAU;IAIlC,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG,SAAS,EAAE,gBAAgB,EAAE,OAAO,GAAG,aAAa;IAWvF;;OAEG;IACH,OAAO,CAAC,mBAAmB;IAkB3B,OAAO,CAAC,gBAAgB;IAsBxB,OAAO,CAAC,OAAO;IA4Ef,eAAe,CAAC,MAAM,EAAE,WAAW,CAAC,iBAAiB,CAAC,EAAE,OAAO,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,iBAAiB,GAAG,IAAI,CAAC,mBAAmB,EAAE,UAAU,CAAC,GAAG;QAAC,IAAI,EAAE,MAAM,CAAA;KAAC;IAkBxJ,YAAY,CAAC,OAAO,EAAE,mBAAmB,GAAG,OAAO,CAAC,MAAM,CAAC;IAejE,UAAU,CAAC,OAAO,EAAE,iBAAiB,GAAG,UAAU,CAAC,OAAO,UAAU,CAAC;CA0BtE"}
@@ -0,0 +1,196 @@
1
+ import { openai } from '@ai-sdk/openai';
2
+ import { anthropic } from '@ai-sdk/anthropic';
3
+ import { google } from '@ai-sdk/google';
4
+ import { z } from 'zod';
5
+ import { generateText, streamText, tool, } from 'ai';
6
+ import { AgentToolType } from '@multiplayer-app/ai-agent-types';
7
+ import { createOpenRouter } from '@openrouter/ai-sdk-provider';
8
+ import { config } from '../config';
9
+ import { logger } from '../libs/logger';
10
+ export class AIService {
11
+ constructor(modelStore) {
12
+ this.modelStore = modelStore;
13
+ }
14
+ getLanguageModel(modelId, websearchEnabled) {
15
+ const selectedModel = modelId || config.ai.defaultModel || this.modelStore.getModels()[0].id;
16
+ const model = selectedModel ?
17
+ this.modelStore.getModelById(selectedModel) :
18
+ this.modelStore.getModels()[0]; //get first model if no model is selected
19
+ if (!model) {
20
+ throw new Error(`Model with id "${selectedModel}" is not available. Ensure you have appropriate key in the environment variables.`);
21
+ }
22
+ return this.createLanguageModel(model, websearchEnabled);
23
+ }
24
+ /**
25
+ * Create a language model instance based on the provider
26
+ */
27
+ createLanguageModel(model, websearchEnabled = false) {
28
+ const provider = model.provider || 'openai'; // Default to openai if provider not specified
29
+ switch (provider) {
30
+ case 'openai':
31
+ return openai(model.id);
32
+ case 'anthropic':
33
+ return anthropic(model.id);
34
+ case 'google':
35
+ return google(model.id);
36
+ case 'openrouter':
37
+ return createOpenRouter({
38
+ apiKey: config.ai.openrouterApiKey,
39
+ })(model.id, { plugins: websearchEnabled ? [{ id: "web", engine: undefined, max_results: 2 }] : [] });
40
+ default:
41
+ throw new Error(`Unsupported provider: ${provider}`);
42
+ }
43
+ }
44
+ getWebSearchTool(modelId) {
45
+ const selectedModel = modelId || config.ai.defaultModel || this.modelStore.getModels()[0].id;
46
+ const model = selectedModel ?
47
+ this.modelStore.getModelById(selectedModel) :
48
+ this.modelStore.getModels()[0]; //get first model if no model is selected
49
+ if (!model) {
50
+ throw new Error(`Model with id "${selectedModel}" is not available. Ensure you have appropriate key in the environment variables.`);
51
+ }
52
+ switch (model.provider) {
53
+ case 'openai':
54
+ return openai.tools.webSearch();
55
+ case 'anthropic':
56
+ return anthropic.tools.webSearch_20250305();
57
+ case 'google':
58
+ return google.tools.googleSearch({});
59
+ case 'openrouter': // is set through plugins
60
+ return undefined;
61
+ default:
62
+ return undefined;
63
+ }
64
+ }
65
+ getTool(toolConfig, modelId, context) {
66
+ if (toolConfig.type === AgentToolType.API_TOOL) {
67
+ const data = toolConfig.data;
68
+ return tool({
69
+ title: data.title,
70
+ description: data.description,
71
+ needsApproval: data.needsApproval,
72
+ inputSchema: z.object({
73
+ body: data.body ? data.body : z.any().optional(),
74
+ queryParams: data.queryParams ? data.queryParams : z.any().optional()
75
+ }),
76
+ execute: async (input) => {
77
+ try {
78
+ let url = data.url;
79
+ const params = { method: data.method };
80
+ if (data.body) {
81
+ params.body = JSON.stringify(input.body);
82
+ }
83
+ if (data.queryParams) {
84
+ url = url + '?' + new URLSearchParams(input.queryParams).toString();
85
+ }
86
+ if (data.headersToPass) {
87
+ params.headers = data.headersToPass.reduce((acc, headerName) => {
88
+ var _a, _b;
89
+ acc[headerName] = (_b = (_a = context === null || context === void 0 ? void 0 : context.headers) === null || _a === void 0 ? void 0 : _a[headerName]) !== null && _b !== void 0 ? _b : '';
90
+ return acc;
91
+ }, {});
92
+ }
93
+ const response = await fetch(url, params);
94
+ const result = await response.json();
95
+ return result;
96
+ }
97
+ catch (error) {
98
+ return error;
99
+ }
100
+ }
101
+ });
102
+ }
103
+ if (toolConfig.type === AgentToolType.WEB_SEARCH) {
104
+ return this.getWebSearchTool(modelId);
105
+ }
106
+ if (toolConfig.type === AgentToolType.LOCAL_FUNCTION) {
107
+ const data = toolConfig.data;
108
+ // Support both "tool definition" objects and already-constructed Tool instances.
109
+ if (data && typeof data.execute === 'function') {
110
+ return tool({
111
+ ...data,
112
+ execute: async (input, options) => {
113
+ return data.execute(input, context, options);
114
+ }
115
+ });
116
+ }
117
+ return tool(data);
118
+ }
119
+ return undefined;
120
+ }
121
+ // getToolLoopAgent(config: AgentConfig, modelId?: string): Agent<ToolSet, never, never> {
122
+ // const tools: ToolSet = config.tools.reduce((acc, toolConfig) => {
123
+ // const tool = this.getTool(toolConfig, modelId);
124
+ // if (tool && toolConfig.data?.name) {
125
+ // acc[toolConfig.data.name] = tool
126
+ // }
127
+ // return acc;
128
+ // }, {} as ToolSet);
129
+ // return new Agent({
130
+ // model: this.getLanguageModel(modelId || config.defaultModel),
131
+ // system: config.systemPrompt,
132
+ // tools,
133
+ // ...(config.outputSchema ? { output: Output.object({ schema: config.outputSchema})} : {})
134
+ // });
135
+ // }
136
+ getAgentOptions(config, modelId, context) {
137
+ const tools = config.tools.reduce((acc, toolConfig) => {
138
+ var _a;
139
+ const tool = this.getTool(toolConfig, modelId, context);
140
+ if (tool && ((_a = toolConfig.data) === null || _a === void 0 ? void 0 : _a.title)) {
141
+ acc[toolConfig.data.title] = tool;
142
+ }
143
+ return acc;
144
+ }, {});
145
+ return {
146
+ model: modelId || config.defaultModel,
147
+ tools,
148
+ system: config.systemPrompt,
149
+ toolChoice: config.toolChoice,
150
+ name: config.name,
151
+ };
152
+ }
153
+ async generateText(options) {
154
+ var _a;
155
+ const websearchEnabled = !!((_a = options.tools) === null || _a === void 0 ? void 0 : _a[AgentToolType.WEB_SEARCH]);
156
+ try {
157
+ const { text } = await generateText({
158
+ ...options,
159
+ model: this.getLanguageModel(options.model, websearchEnabled),
160
+ });
161
+ return text;
162
+ }
163
+ catch (error) {
164
+ logger.error(error);
165
+ throw new Error(`Failed to generate text: ${error instanceof Error ? error.message : 'Unknown error'}`);
166
+ }
167
+ }
168
+ streamText(options) {
169
+ var _a;
170
+ const { onError, onChunk, onFinish, onStepFinish } = options;
171
+ const websearchEnabled = !!((_a = options.tools) === null || _a === void 0 ? void 0 : _a[AgentToolType.WEB_SEARCH]);
172
+ try {
173
+ return streamText({
174
+ ...options,
175
+ model: this.getLanguageModel(options.model, websearchEnabled),
176
+ onError({ error }) {
177
+ logger.error(error);
178
+ onError === null || onError === void 0 ? void 0 : onError(error);
179
+ },
180
+ onChunk(chunk) {
181
+ onChunk === null || onChunk === void 0 ? void 0 : onChunk(chunk);
182
+ },
183
+ onFinish({ text, finishReason, usage, response, steps, totalUsage }) {
184
+ onFinish === null || onFinish === void 0 ? void 0 : onFinish({ text, finishReason, usage, response, steps, totalUsage });
185
+ },
186
+ onStepFinish(step) {
187
+ onStepFinish === null || onStepFinish === void 0 ? void 0 : onStepFinish(step);
188
+ }
189
+ });
190
+ }
191
+ catch (error) {
192
+ throw new Error(`Failed to stream text: ${error instanceof Error ? error.message : 'Unknown error'}`);
193
+ }
194
+ }
195
+ }
196
+ //# sourceMappingURL=AIService.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AIService.js","sourceRoot":"","sources":["../../src/services/AIService.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ /**
2
+ * Lightweight Redis pub/sub helper to share events across service replicas.
3
+ */
4
+ export declare class InternalEventsHandler<T = unknown> {
5
+ private readonly channel;
6
+ constructor(channel: string);
7
+ private pubClient;
8
+ private subClient;
9
+ private initialized;
10
+ private subscribed;
11
+ private ensureClients;
12
+ /**
13
+ * Publish a payload to a channel.
14
+ */
15
+ publish<T>(payload: T): Promise<number>;
16
+ /**
17
+ * Subscribe to a channel and handle messages.
18
+ */
19
+ listen<T>(handler: (payload: T) => void | Promise<void>): Promise<void>;
20
+ }
21
+ //# sourceMappingURL=InternalEventsHandler.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"InternalEventsHandler.d.ts","sourceRoot":"","sources":["../../src/services/InternalEventsHandler.ts"],"names":[],"mappings":"AAKA;;GAEG;AACH,qBAAa,qBAAqB,CAAC,CAAC,GAAG,OAAO;IAChC,OAAO,CAAC,QAAQ,CAAC,OAAO;gBAAP,OAAO,EAAE,MAAM;IAE5C,OAAO,CAAC,SAAS,CAAkC;IACnD,OAAO,CAAC,SAAS,CAAkC;IACnD,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,UAAU,CAAS;YAEb,aAAa;IAS3B;;OAEG;IACG,OAAO,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC;IAS7C;;OAEG;IACG,MAAM,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,OAAO,EAAE,CAAC,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;CAoB9E"}
@@ -0,0 +1,56 @@
1
+ import { redisService } from './RedisService';
2
+ import { logger } from '../libs/logger';
3
+ /**
4
+ * Lightweight Redis pub/sub helper to share events across service replicas.
5
+ */
6
+ export class InternalEventsHandler {
7
+ constructor(channel) {
8
+ this.channel = channel;
9
+ this.pubClient = null;
10
+ this.subClient = null;
11
+ this.initialized = false;
12
+ this.subscribed = false;
13
+ }
14
+ async ensureClients() {
15
+ if (this.initialized)
16
+ return;
17
+ const { pubClient, subClient } = await redisService.getPubSubClients(this.channel);
18
+ this.pubClient = pubClient;
19
+ this.subClient = subClient;
20
+ this.initialized = true;
21
+ }
22
+ /**
23
+ * Publish a payload to a channel.
24
+ */
25
+ async publish(payload) {
26
+ await this.ensureClients();
27
+ if (!this.pubClient) {
28
+ throw new Error('Redis pub client not available');
29
+ }
30
+ const message = JSON.stringify(payload);
31
+ return this.pubClient.publish(this.channel, message);
32
+ }
33
+ /**
34
+ * Subscribe to a channel and handle messages.
35
+ */
36
+ async listen(handler) {
37
+ await this.ensureClients();
38
+ if (!this.subClient) {
39
+ throw new Error('Redis sub client not available');
40
+ }
41
+ if (this.subscribed) {
42
+ return;
43
+ }
44
+ this.subscribed = true;
45
+ await this.subClient.subscribe(this.channel, async (message) => {
46
+ try {
47
+ const parsed = JSON.parse(message);
48
+ await handler(parsed);
49
+ }
50
+ catch (error) {
51
+ logger.error(`InternalEventsHandler failed to process message on ${this.channel}:`, error);
52
+ }
53
+ });
54
+ }
55
+ }
56
+ //# sourceMappingURL=InternalEventsHandler.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"InternalEventsHandler.js","sourceRoot":"","sources":["../../src/services/InternalEventsHandler.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,OAAO,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAC;AAIxC;;GAEG;AACH,MAAM,OAAO,qBAAqB;IAChC,YAA6B,OAAe;QAAf,YAAO,GAAP,OAAO,CAAQ;QAEpC,cAAS,GAA6B,IAAI,CAAC;QAC3C,cAAS,GAA6B,IAAI,CAAC;QAC3C,gBAAW,GAAG,KAAK,CAAC;QACpB,eAAU,GAAG,KAAK,CAAC;IALoB,CAAC;IAOxC,KAAK,CAAC,aAAa;QACzB,IAAI,IAAI,CAAC,WAAW;YAAE,OAAO;QAE7B,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,GAAG,MAAM,YAAY,CAAC,gBAAgB,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACnF,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;QAC3B,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;QAC3B,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC;IAC1B,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,OAAO,CAAI,OAAU;QACzB,MAAM,IAAI,CAAC,aAAa,EAAE,CAAC;QAC3B,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC;YACpB,MAAM,IAAI,KAAK,CAAC,gCAAgC,CAAC,CAAC;QACpD,CAAC;QACD,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;QACxC,OAAO,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;IACvD,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,MAAM,CAAI,OAA6C;QAC3D,MAAM,IAAI,CAAC,aAAa,EAAE,CAAC;QAC3B,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC;YACpB,MAAM,IAAI,KAAK,CAAC,gCAAgC,CAAC,CAAC;QACpD,CAAC;QAED,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;YACpB,OAAO;QACT,CAAC;QACD,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC;QAEvB,MAAM,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE;YAC7D,IAAI,CAAC;gBACH,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAM,CAAC;gBACxC,MAAM,OAAO,CAAC,MAAM,CAAC,CAAC;YACxB,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,MAAM,CAAC,KAAK,CAAC,sDAAsD,IAAI,CAAC,OAAO,GAAG,EAAE,KAAK,CAAC,CAAC;YAC7F,CAAC;QACH,CAAC,CAAC,CAAC;IACL,CAAC;CACF"}
@@ -0,0 +1,35 @@
1
+ import type { AgentChatRepository, AgentMessageRepository } from '@multiplayer-app/ai-agent-db';
2
+ declare enum BackgroundChatProcessingEvent {
3
+ Start = "start"
4
+ }
5
+ declare class KafkaService {
6
+ private kafkaConsumer;
7
+ private kafkaProducer;
8
+ private chatRepository?;
9
+ private messageRepository?;
10
+ private readonly MAX_RETRIES;
11
+ private readonly BASE_DELAY_MS;
12
+ private readonly MAX_DELAY_MS;
13
+ constructor(chatRepository?: AgentChatRepository, messageRepository?: AgentMessageRepository);
14
+ setRepositories(chatRepository: AgentChatRepository, messageRepository: AgentMessageRepository): void;
15
+ start(): Promise<void>;
16
+ stop(): Promise<void>;
17
+ sendStartBackgroundAgentEvent(chatId: string): Promise<void>;
18
+ sendChatTitleGenerationEvent(chatId: string, retryCount?: number): Promise<void>;
19
+ private sleep;
20
+ private calculateBackoffDelay;
21
+ onBackgroundAgentEvent(key: any, message: {
22
+ event: BackgroundChatProcessingEvent;
23
+ chatId: string;
24
+ }): Promise<void>;
25
+ onChatTitleGenerationEvent(key: any, message: {
26
+ chatId: string;
27
+ retryCount?: number;
28
+ }): Promise<void>;
29
+ onStartBackgroundAgentEvent(chatId: string): Promise<void>;
30
+ connect(): Promise<void>;
31
+ disconnect(): Promise<void>;
32
+ }
33
+ export declare const kafkaService: KafkaService;
34
+ export {};
35
+ //# sourceMappingURL=KafkaService.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"KafkaService.d.ts","sourceRoot":"","sources":["../../src/services/KafkaService.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,mBAAmB,EAAE,sBAAsB,EAAE,MAAM,8BAA8B,CAAC;AAEhG,aAAK,6BAA6B;IAChC,KAAK,UAAU;CAChB;AAED,cAAM,YAAY;IAChB,OAAO,CAAC,aAAa,CAAe;IACpC,OAAO,CAAC,aAAa,CAAe;IACpC,OAAO,CAAC,cAAc,CAAC,CAAqB;IAC5C,OAAO,CAAC,iBAAiB,CAAC,CAAwB;IAElD,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAI;IAChC,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAO;IACrC,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAQ;gBAEzB,cAAc,CAAC,EAAE,mBAAmB,EAAE,iBAAiB,CAAC,EAAE,sBAAsB;IAO5F,eAAe,CAAC,cAAc,EAAE,mBAAmB,EAAE,iBAAiB,EAAE,sBAAsB;IAKxF,KAAK;IAIL,IAAI;IAIJ,6BAA6B,CAAC,MAAM,EAAE,MAAM;IAI5C,4BAA4B,CAAC,MAAM,EAAE,MAAM,EAAE,UAAU,GAAE,MAAU;YAI3D,KAAK;IAInB,OAAO,CAAC,qBAAqB;IAUvB,sBAAsB,CAAC,GAAG,KAAA,EAAE,OAAO,EAAE;QAAE,KAAK,EAAE,6BAA6B,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE;IAQ7F,0BAA0B,CAAC,GAAG,KAAA,EAAE,OAAO,EAAE;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,UAAU,CAAC,EAAE,MAAM,CAAA;KAAE;IAuChF,2BAA2B,CAAC,MAAM,EAAE,MAAM;IAkB1C,OAAO;IAOP,UAAU;CAGjB;AACD,eAAO,MAAM,YAAY,cAAqB,CAAA"}
@@ -0,0 +1,120 @@
1
+ import { KafkaConsumer, KafkaProducer } from '../libs/kafka';
2
+ import { config } from '../config';
3
+ import { AIHelper } from '../helpers/AIHelper';
4
+ import { logger } from "../libs/logger";
5
+ import { socketService } from "./SocketService";
6
+ var BackgroundChatProcessingEvent;
7
+ (function (BackgroundChatProcessingEvent) {
8
+ BackgroundChatProcessingEvent["Start"] = "start";
9
+ })(BackgroundChatProcessingEvent || (BackgroundChatProcessingEvent = {}));
10
+ class KafkaService {
11
+ constructor(chatRepository, messageRepository) {
12
+ this.MAX_RETRIES = 5;
13
+ this.BASE_DELAY_MS = 1000; // 1 second base delay
14
+ this.MAX_DELAY_MS = 60000; // 60 seconds max delay
15
+ this.kafkaConsumer = new KafkaConsumer(config.kafka.groupId);
16
+ this.kafkaProducer = new KafkaProducer();
17
+ this.chatRepository = chatRepository;
18
+ this.messageRepository = messageRepository;
19
+ }
20
+ setRepositories(chatRepository, messageRepository) {
21
+ this.chatRepository = chatRepository;
22
+ this.messageRepository = messageRepository;
23
+ }
24
+ async start() {
25
+ await Promise.all([this.connect(), this.kafkaProducer.connect()]);
26
+ }
27
+ async stop() {
28
+ await Promise.all([this.kafkaConsumer.disconnect(), this.kafkaProducer.disconnect()]);
29
+ }
30
+ async sendStartBackgroundAgentEvent(chatId) {
31
+ await this.kafkaProducer.send(config.kafka.backgroundChatProcessingTopic, { event: BackgroundChatProcessingEvent.Start, chatId });
32
+ }
33
+ async sendChatTitleGenerationEvent(chatId, retryCount = 0) {
34
+ await this.kafkaProducer.send(config.kafka.chatTitleGenerationTopic, { chatId, retryCount });
35
+ }
36
+ async sleep(ms) {
37
+ return new Promise(resolve => setTimeout(resolve, ms));
38
+ }
39
+ calculateBackoffDelay(retryCount) {
40
+ // Exponential backoff: baseDelay * 2^retryCount with jitter
41
+ const exponentialDelay = this.BASE_DELAY_MS * Math.pow(2, retryCount);
42
+ // Add jitter (random 0-25% of delay) to prevent thundering herd
43
+ const jitter = Math.random() * 0.25 * exponentialDelay;
44
+ const delay = exponentialDelay + jitter;
45
+ // Cap at max delay
46
+ return Math.min(delay, this.MAX_DELAY_MS);
47
+ }
48
+ async onBackgroundAgentEvent(key, message) {
49
+ switch (message.event) {
50
+ case BackgroundChatProcessingEvent.Start:
51
+ await this.onStartBackgroundAgentEvent(message.chatId);
52
+ break;
53
+ }
54
+ }
55
+ async onChatTitleGenerationEvent(key, message) {
56
+ var _a;
57
+ if (!this.chatRepository || !this.messageRepository) {
58
+ logger.warn('KafkaService: Repositories not set, skipping chat title generation');
59
+ return;
60
+ }
61
+ const retryCount = (_a = message.retryCount) !== null && _a !== void 0 ? _a : 0;
62
+ try {
63
+ const chat = await this.chatRepository.findById(message.chatId);
64
+ if (!chat) {
65
+ return;
66
+ }
67
+ const messages = await this.messageRepository.findByChatId(message.chatId);
68
+ if (messages.length === 0) {
69
+ return;
70
+ }
71
+ const title = await AIHelper.generateTitleForMessage(chat.contextKey, messages);
72
+ await this.chatRepository.update(chat.id, { title });
73
+ // Update the chat object with the new title before emitting
74
+ const updatedChat = {
75
+ ...chat,
76
+ title
77
+ };
78
+ if (chat.userId)
79
+ socketService.emitChatUpdate(chat.userId, { ...updatedChat, messages });
80
+ }
81
+ catch (error) {
82
+ logger.error(`KafkaService: Error generating chat title for chatId ${message.chatId}, retryCount: ${retryCount}`, error);
83
+ if (retryCount < this.MAX_RETRIES) {
84
+ const delay = this.calculateBackoffDelay(retryCount);
85
+ logger.info(`KafkaService: Retrying chat title generation for chatId ${message.chatId} after ${Math.round(delay)}ms (attempt ${retryCount + 1}/${this.MAX_RETRIES})`);
86
+ await this.sleep(delay);
87
+ await this.sendChatTitleGenerationEvent(message.chatId, retryCount + 1);
88
+ }
89
+ else {
90
+ logger.error(`KafkaService: Max retries (${this.MAX_RETRIES}) exceeded for chat title generation, chatId: ${message.chatId}`);
91
+ }
92
+ }
93
+ }
94
+ async onStartBackgroundAgentEvent(chatId) {
95
+ if (!this.chatRepository || !this.messageRepository) {
96
+ logger.warn('KafkaService: Repositories not set, skipping background agent event');
97
+ return;
98
+ }
99
+ const chat = await this.chatRepository.findById(chatId);
100
+ if (!chat) {
101
+ return;
102
+ }
103
+ const messages = await this.messageRepository.findByChatId(chatId);
104
+ if (messages.length === 0) {
105
+ return;
106
+ }
107
+ // TODO: Implement background agent processing
108
+ }
109
+ async connect() {
110
+ await this.kafkaConsumer.connect();
111
+ await this.kafkaConsumer.subscribe(config.kafka.chatTitleGenerationTopic, this.onChatTitleGenerationEvent.bind(this));
112
+ await this.kafkaConsumer.subscribe(config.kafka.backgroundChatProcessingTopic, this.onBackgroundAgentEvent.bind(this));
113
+ await this.kafkaConsumer.listen();
114
+ }
115
+ async disconnect() {
116
+ await this.kafkaConsumer.disconnect();
117
+ }
118
+ }
119
+ export const kafkaService = new KafkaService();
120
+ //# sourceMappingURL=KafkaService.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"KafkaService.js","sourceRoot":"","sources":["../../src/services/KafkaService.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,54 @@
1
+ import type { ModelOption } from '@multiplayer-app/ai-agent-types';
2
+ export interface ModelFetcherConfig {
3
+ openaiApiKey?: string;
4
+ anthropicApiKey?: string;
5
+ googleApiKey?: string;
6
+ openrouterApiKey?: string;
7
+ }
8
+ export interface FetchedModel {
9
+ id: string;
10
+ provider: string;
11
+ label?: string;
12
+ description?: string;
13
+ }
14
+ export declare class ModelFetcher {
15
+ private config;
16
+ constructor(config?: ModelFetcherConfig);
17
+ /**
18
+ * Analyze environment and fetch models for all available providers
19
+ */
20
+ fetchAllModels(): Promise<ModelOption[]>;
21
+ /**
22
+ * Detect which providers are available based on API keys
23
+ */
24
+ private detectAvailableProviders;
25
+ /**
26
+ * Fetch models for a specific provider
27
+ */
28
+ fetchModelsForProvider(provider: string): Promise<ModelOption[]>;
29
+ /**
30
+ * Fetch models from OpenAI
31
+ */
32
+ private fetchOpenAIModels;
33
+ /**
34
+ * Fetch models from Anthropic
35
+ */
36
+ private fetchAnthropicModels;
37
+ /**
38
+ * Fetch models from Google
39
+ */
40
+ private fetchGoogleModels;
41
+ /**
42
+ * Fetch models from OpenRouter
43
+ */
44
+ private fetchOpenRouterModels;
45
+ /**
46
+ * Format model ID into a readable label
47
+ */
48
+ private formatModelLabel;
49
+ /**
50
+ * Get description for known models
51
+ */
52
+ private getModelDescription;
53
+ }
54
+ //# sourceMappingURL=ModelFetcher.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ModelFetcher.d.ts","sourceRoot":"","sources":["../../src/services/ModelFetcher.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,iCAAiC,CAAC;AAInE,MAAM,WAAW,kBAAkB;IACjC,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B;AAED,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,MAAM,CAAC;IACX,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,qBAAa,YAAY;IACvB,OAAO,CAAC,MAAM,CAAqB;gBAEvB,MAAM,GAAE,kBAAuB;IAS3C;;OAEG;IACG,cAAc,IAAI,OAAO,CAAC,WAAW,EAAE,CAAC;IAiB9C;;OAEG;IACH,OAAO,CAAC,wBAAwB;IAoBhC;;OAEG;IACG,sBAAsB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;IAetE;;OAEG;YACW,iBAAiB;IAkC/B;;OAEG;YACW,oBAAoB;IAmClC;;OAEG;YACW,iBAAiB;IAwC/B;;OAEG;YACW,qBAAqB;IAuCnC;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAQxB;;OAEG;IACH,OAAO,CAAC,mBAAmB;CAoB5B"}