mojentic 1.0.0

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 (247) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +459 -0
  3. package/dist/agents/async-aggregator-agent.d.ts +101 -0
  4. package/dist/agents/async-aggregator-agent.d.ts.map +1 -0
  5. package/dist/agents/async-aggregator-agent.js +160 -0
  6. package/dist/agents/async-aggregator-agent.js.map +1 -0
  7. package/dist/agents/async-dispatcher.d.ts +98 -0
  8. package/dist/agents/async-dispatcher.d.ts.map +1 -0
  9. package/dist/agents/async-dispatcher.js +173 -0
  10. package/dist/agents/async-dispatcher.js.map +1 -0
  11. package/dist/agents/async-llm-agent-with-memory.d.ts +95 -0
  12. package/dist/agents/async-llm-agent-with-memory.d.ts.map +1 -0
  13. package/dist/agents/async-llm-agent-with-memory.js +136 -0
  14. package/dist/agents/async-llm-agent-with-memory.js.map +1 -0
  15. package/dist/agents/async-llm-agent.d.ts +85 -0
  16. package/dist/agents/async-llm-agent.d.ts.map +1 -0
  17. package/dist/agents/async-llm-agent.js +87 -0
  18. package/dist/agents/async-llm-agent.js.map +1 -0
  19. package/dist/agents/base-agent.d.ts +59 -0
  20. package/dist/agents/base-agent.d.ts.map +1 -0
  21. package/dist/agents/base-agent.js +24 -0
  22. package/dist/agents/base-agent.js.map +1 -0
  23. package/dist/agents/base-async-agent.d.ts +42 -0
  24. package/dist/agents/base-async-agent.d.ts.map +1 -0
  25. package/dist/agents/base-async-agent.js +6 -0
  26. package/dist/agents/base-async-agent.js.map +1 -0
  27. package/dist/agents/event.d.ts +26 -0
  28. package/dist/agents/event.d.ts.map +1 -0
  29. package/dist/agents/event.js +13 -0
  30. package/dist/agents/event.js.map +1 -0
  31. package/dist/agents/index.d.ts +14 -0
  32. package/dist/agents/index.d.ts.map +1 -0
  33. package/dist/agents/index.js +30 -0
  34. package/dist/agents/index.js.map +1 -0
  35. package/dist/agents/iterative-problem-solver.d.ts +83 -0
  36. package/dist/agents/iterative-problem-solver.d.ts.map +1 -0
  37. package/dist/agents/iterative-problem-solver.js +120 -0
  38. package/dist/agents/iterative-problem-solver.js.map +1 -0
  39. package/dist/agents/router.d.ts +44 -0
  40. package/dist/agents/router.d.ts.map +1 -0
  41. package/dist/agents/router.js +53 -0
  42. package/dist/agents/router.js.map +1 -0
  43. package/dist/agents/simple-recursive-agent.d.ts +182 -0
  44. package/dist/agents/simple-recursive-agent.d.ts.map +1 -0
  45. package/dist/agents/simple-recursive-agent.js +272 -0
  46. package/dist/agents/simple-recursive-agent.js.map +1 -0
  47. package/dist/context/index.d.ts +5 -0
  48. package/dist/context/index.d.ts.map +1 -0
  49. package/dist/context/index.js +21 -0
  50. package/dist/context/index.js.map +1 -0
  51. package/dist/context/shared-working-memory.d.ts +76 -0
  52. package/dist/context/shared-working-memory.d.ts.map +1 -0
  53. package/dist/context/shared-working-memory.js +121 -0
  54. package/dist/context/shared-working-memory.js.map +1 -0
  55. package/dist/error.d.ts +93 -0
  56. package/dist/error.d.ts.map +1 -0
  57. package/dist/error.js +149 -0
  58. package/dist/error.js.map +1 -0
  59. package/dist/examples/react/decisioning-agent.d.ts +48 -0
  60. package/dist/examples/react/decisioning-agent.d.ts.map +1 -0
  61. package/dist/examples/react/decisioning-agent.js +204 -0
  62. package/dist/examples/react/decisioning-agent.js.map +1 -0
  63. package/dist/examples/react/events.d.ts +77 -0
  64. package/dist/examples/react/events.d.ts.map +1 -0
  65. package/dist/examples/react/events.js +9 -0
  66. package/dist/examples/react/events.js.map +1 -0
  67. package/dist/examples/react/formatters.d.ts +23 -0
  68. package/dist/examples/react/formatters.d.ts.map +1 -0
  69. package/dist/examples/react/formatters.js +68 -0
  70. package/dist/examples/react/formatters.js.map +1 -0
  71. package/dist/examples/react/index.d.ts +12 -0
  72. package/dist/examples/react/index.d.ts.map +1 -0
  73. package/dist/examples/react/index.js +28 -0
  74. package/dist/examples/react/index.js.map +1 -0
  75. package/dist/examples/react/models.d.ts +57 -0
  76. package/dist/examples/react/models.d.ts.map +1 -0
  77. package/dist/examples/react/models.js +19 -0
  78. package/dist/examples/react/models.js.map +1 -0
  79. package/dist/examples/react/output-agent.d.ts +23 -0
  80. package/dist/examples/react/output-agent.d.ts.map +1 -0
  81. package/dist/examples/react/output-agent.js +28 -0
  82. package/dist/examples/react/output-agent.js.map +1 -0
  83. package/dist/examples/react/summarization-agent.d.ts +46 -0
  84. package/dist/examples/react/summarization-agent.d.ts.map +1 -0
  85. package/dist/examples/react/summarization-agent.js +102 -0
  86. package/dist/examples/react/summarization-agent.js.map +1 -0
  87. package/dist/examples/react/thinking-agent.d.ts +47 -0
  88. package/dist/examples/react/thinking-agent.d.ts.map +1 -0
  89. package/dist/examples/react/thinking-agent.js +127 -0
  90. package/dist/examples/react/thinking-agent.js.map +1 -0
  91. package/dist/examples/react/tool-call-agent.d.ts +25 -0
  92. package/dist/examples/react/tool-call-agent.d.ts.map +1 -0
  93. package/dist/examples/react/tool-call-agent.js +83 -0
  94. package/dist/examples/react/tool-call-agent.js.map +1 -0
  95. package/dist/index.d.ts +10 -0
  96. package/dist/index.d.ts.map +1 -0
  97. package/dist/index.js +28 -0
  98. package/dist/index.js.map +1 -0
  99. package/dist/llm/agent.d.ts +68 -0
  100. package/dist/llm/agent.d.ts.map +1 -0
  101. package/dist/llm/agent.js +85 -0
  102. package/dist/llm/agent.js.map +1 -0
  103. package/dist/llm/broker.d.ts +150 -0
  104. package/dist/llm/broker.d.ts.map +1 -0
  105. package/dist/llm/broker.js +355 -0
  106. package/dist/llm/broker.js.map +1 -0
  107. package/dist/llm/chat-session.d.ts +98 -0
  108. package/dist/llm/chat-session.d.ts.map +1 -0
  109. package/dist/llm/chat-session.js +156 -0
  110. package/dist/llm/chat-session.js.map +1 -0
  111. package/dist/llm/gateway.d.ts +28 -0
  112. package/dist/llm/gateway.d.ts.map +1 -0
  113. package/dist/llm/gateway.js +6 -0
  114. package/dist/llm/gateway.js.map +1 -0
  115. package/dist/llm/gateways/index.d.ts +9 -0
  116. package/dist/llm/gateways/index.d.ts.map +1 -0
  117. package/dist/llm/gateways/index.js +25 -0
  118. package/dist/llm/gateways/index.js.map +1 -0
  119. package/dist/llm/gateways/ollama.d.ts +30 -0
  120. package/dist/llm/gateways/ollama.d.ts.map +1 -0
  121. package/dist/llm/gateways/ollama.js +322 -0
  122. package/dist/llm/gateways/ollama.js.map +1 -0
  123. package/dist/llm/gateways/openai-messages-adapter.d.ts +29 -0
  124. package/dist/llm/gateways/openai-messages-adapter.d.ts.map +1 -0
  125. package/dist/llm/gateways/openai-messages-adapter.js +188 -0
  126. package/dist/llm/gateways/openai-messages-adapter.js.map +1 -0
  127. package/dist/llm/gateways/openai-model-registry.d.ts +82 -0
  128. package/dist/llm/gateways/openai-model-registry.d.ts.map +1 -0
  129. package/dist/llm/gateways/openai-model-registry.js +352 -0
  130. package/dist/llm/gateways/openai-model-registry.js.map +1 -0
  131. package/dist/llm/gateways/openai.d.ts +40 -0
  132. package/dist/llm/gateways/openai.d.ts.map +1 -0
  133. package/dist/llm/gateways/openai.js +469 -0
  134. package/dist/llm/gateways/openai.js.map +1 -0
  135. package/dist/llm/gateways/tokenizerGateway.d.ts +61 -0
  136. package/dist/llm/gateways/tokenizerGateway.d.ts.map +1 -0
  137. package/dist/llm/gateways/tokenizerGateway.js +75 -0
  138. package/dist/llm/gateways/tokenizerGateway.js.map +1 -0
  139. package/dist/llm/index.d.ts +11 -0
  140. package/dist/llm/index.d.ts.map +1 -0
  141. package/dist/llm/index.js +27 -0
  142. package/dist/llm/index.js.map +1 -0
  143. package/dist/llm/models.d.ts +95 -0
  144. package/dist/llm/models.d.ts.map +1 -0
  145. package/dist/llm/models.js +50 -0
  146. package/dist/llm/models.js.map +1 -0
  147. package/dist/llm/tools/ask-user.d.ts +39 -0
  148. package/dist/llm/tools/ask-user.d.ts.map +1 -0
  149. package/dist/llm/tools/ask-user.js +111 -0
  150. package/dist/llm/tools/ask-user.js.map +1 -0
  151. package/dist/llm/tools/current-datetime.d.ts +17 -0
  152. package/dist/llm/tools/current-datetime.d.ts.map +1 -0
  153. package/dist/llm/tools/current-datetime.js +76 -0
  154. package/dist/llm/tools/current-datetime.js.map +1 -0
  155. package/dist/llm/tools/date-resolver.d.ts +17 -0
  156. package/dist/llm/tools/date-resolver.d.ts.map +1 -0
  157. package/dist/llm/tools/date-resolver.js +135 -0
  158. package/dist/llm/tools/date-resolver.js.map +1 -0
  159. package/dist/llm/tools/ephemeral-task-manager/append-task.d.ts +13 -0
  160. package/dist/llm/tools/ephemeral-task-manager/append-task.d.ts.map +1 -0
  161. package/dist/llm/tools/ephemeral-task-manager/append-task.js +54 -0
  162. package/dist/llm/tools/ephemeral-task-manager/append-task.js.map +1 -0
  163. package/dist/llm/tools/ephemeral-task-manager/clear-tasks.d.ts +13 -0
  164. package/dist/llm/tools/ephemeral-task-manager/clear-tasks.d.ts.map +1 -0
  165. package/dist/llm/tools/ephemeral-task-manager/clear-tasks.js +37 -0
  166. package/dist/llm/tools/ephemeral-task-manager/clear-tasks.js.map +1 -0
  167. package/dist/llm/tools/ephemeral-task-manager/complete-task.d.ts +15 -0
  168. package/dist/llm/tools/ephemeral-task-manager/complete-task.d.ts.map +1 -0
  169. package/dist/llm/tools/ephemeral-task-manager/complete-task.js +56 -0
  170. package/dist/llm/tools/ephemeral-task-manager/complete-task.js.map +1 -0
  171. package/dist/llm/tools/ephemeral-task-manager/index.d.ts +44 -0
  172. package/dist/llm/tools/ephemeral-task-manager/index.d.ts.map +1 -0
  173. package/dist/llm/tools/ephemeral-task-manager/index.js +73 -0
  174. package/dist/llm/tools/ephemeral-task-manager/index.js.map +1 -0
  175. package/dist/llm/tools/ephemeral-task-manager/insert-task-after.d.ts +13 -0
  176. package/dist/llm/tools/ephemeral-task-manager/insert-task-after.d.ts.map +1 -0
  177. package/dist/llm/tools/ephemeral-task-manager/insert-task-after.js +59 -0
  178. package/dist/llm/tools/ephemeral-task-manager/insert-task-after.js.map +1 -0
  179. package/dist/llm/tools/ephemeral-task-manager/list-tasks.d.ts +14 -0
  180. package/dist/llm/tools/ephemeral-task-manager/list-tasks.d.ts.map +1 -0
  181. package/dist/llm/tools/ephemeral-task-manager/list-tasks.js +45 -0
  182. package/dist/llm/tools/ephemeral-task-manager/list-tasks.js.map +1 -0
  183. package/dist/llm/tools/ephemeral-task-manager/prepend-task.d.ts +13 -0
  184. package/dist/llm/tools/ephemeral-task-manager/prepend-task.d.ts.map +1 -0
  185. package/dist/llm/tools/ephemeral-task-manager/prepend-task.js +54 -0
  186. package/dist/llm/tools/ephemeral-task-manager/prepend-task.js.map +1 -0
  187. package/dist/llm/tools/ephemeral-task-manager/start-task.d.ts +15 -0
  188. package/dist/llm/tools/ephemeral-task-manager/start-task.d.ts.map +1 -0
  189. package/dist/llm/tools/ephemeral-task-manager/start-task.js +56 -0
  190. package/dist/llm/tools/ephemeral-task-manager/start-task.js.map +1 -0
  191. package/dist/llm/tools/ephemeral-task-manager/task-list.d.ts +68 -0
  192. package/dist/llm/tools/ephemeral-task-manager/task-list.d.ts.map +1 -0
  193. package/dist/llm/tools/ephemeral-task-manager/task-list.js +120 -0
  194. package/dist/llm/tools/ephemeral-task-manager/task-list.js.map +1 -0
  195. package/dist/llm/tools/ephemeral-task-manager/task.d.ts +21 -0
  196. package/dist/llm/tools/ephemeral-task-manager/task.d.ts.map +1 -0
  197. package/dist/llm/tools/ephemeral-task-manager/task.js +24 -0
  198. package/dist/llm/tools/ephemeral-task-manager/task.js.map +1 -0
  199. package/dist/llm/tools/file-manager.d.ts +127 -0
  200. package/dist/llm/tools/file-manager.d.ts.map +1 -0
  201. package/dist/llm/tools/file-manager.js +598 -0
  202. package/dist/llm/tools/file-manager.js.map +1 -0
  203. package/dist/llm/tools/index.d.ts +11 -0
  204. package/dist/llm/tools/index.d.ts.map +1 -0
  205. package/dist/llm/tools/index.js +27 -0
  206. package/dist/llm/tools/index.js.map +1 -0
  207. package/dist/llm/tools/tell-user.d.ts +31 -0
  208. package/dist/llm/tools/tell-user.d.ts.map +1 -0
  209. package/dist/llm/tools/tell-user.js +57 -0
  210. package/dist/llm/tools/tell-user.js.map +1 -0
  211. package/dist/llm/tools/tool-wrapper.d.ts +54 -0
  212. package/dist/llm/tools/tool-wrapper.d.ts.map +1 -0
  213. package/dist/llm/tools/tool-wrapper.js +91 -0
  214. package/dist/llm/tools/tool-wrapper.js.map +1 -0
  215. package/dist/llm/tools/tool.d.ts +70 -0
  216. package/dist/llm/tools/tool.d.ts.map +1 -0
  217. package/dist/llm/tools/tool.js +19 -0
  218. package/dist/llm/tools/tool.js.map +1 -0
  219. package/dist/llm/tools/web-search-tool.d.ts +35 -0
  220. package/dist/llm/tools/web-search-tool.d.ts.map +1 -0
  221. package/dist/llm/tools/web-search-tool.js +105 -0
  222. package/dist/llm/tools/web-search-tool.js.map +1 -0
  223. package/dist/llm/utils/image.d.ts +30 -0
  224. package/dist/llm/utils/image.d.ts.map +1 -0
  225. package/dist/llm/utils/image.js +65 -0
  226. package/dist/llm/utils/image.js.map +1 -0
  227. package/dist/tracer/eventStore.d.ts +101 -0
  228. package/dist/tracer/eventStore.d.ts.map +1 -0
  229. package/dist/tracer/eventStore.js +120 -0
  230. package/dist/tracer/eventStore.js.map +1 -0
  231. package/dist/tracer/index.d.ts +8 -0
  232. package/dist/tracer/index.d.ts.map +1 -0
  233. package/dist/tracer/index.js +24 -0
  234. package/dist/tracer/index.js.map +1 -0
  235. package/dist/tracer/nullTracer.d.ts +127 -0
  236. package/dist/tracer/nullTracer.d.ts.map +1 -0
  237. package/dist/tracer/nullTracer.js +148 -0
  238. package/dist/tracer/nullTracer.js.map +1 -0
  239. package/dist/tracer/tracerEvents.d.ts +209 -0
  240. package/dist/tracer/tracerEvents.d.ts.map +1 -0
  241. package/dist/tracer/tracerEvents.js +312 -0
  242. package/dist/tracer/tracerEvents.js.map +1 -0
  243. package/dist/tracer/tracerSystem.d.ts +149 -0
  244. package/dist/tracer/tracerSystem.d.ts.map +1 -0
  245. package/dist/tracer/tracerSystem.js +196 -0
  246. package/dist/tracer/tracerSystem.js.map +1 -0
  247. package/package.json +87 -0
@@ -0,0 +1,40 @@
1
+ /**
2
+ * OpenAI gateway implementation for chat completions, embeddings, and streaming.
3
+ */
4
+ import { LlmGateway } from '../gateway';
5
+ import { LlmMessage, CompletionConfig, GatewayResponse, StreamChunk } from '../models';
6
+ import { ToolDescriptor } from '../tools';
7
+ import { Result } from '../../error';
8
+ /**
9
+ * Gateway for OpenAI API provider.
10
+ *
11
+ * Supports chat completions, structured output, tool calling, streaming, and embeddings.
12
+ */
13
+ export declare class OpenAIGateway implements LlmGateway {
14
+ private readonly apiKey;
15
+ private readonly baseUrl;
16
+ private readonly modelRegistry;
17
+ constructor(apiKey?: string, baseUrl?: string);
18
+ /**
19
+ * Adapt parameters based on the model type and capabilities.
20
+ */
21
+ private adaptParametersForModel;
22
+ /**
23
+ * Validate that the parameters are compatible with the model.
24
+ */
25
+ private validateModelParameters;
26
+ generate(model: string, messages: LlmMessage[], config?: CompletionConfig, tools?: ToolDescriptor[]): Promise<Result<GatewayResponse, Error>>;
27
+ generateStream(model: string, messages: LlmMessage[], config?: CompletionConfig, tools?: ToolDescriptor[]): AsyncGenerator<Result<StreamChunk, Error>>;
28
+ listModels(): Promise<Result<string[], Error>>;
29
+ calculateEmbeddings(text: string, model?: string): Promise<Result<number[], Error>>;
30
+ /**
31
+ * Split text into chunks of tokens.
32
+ */
33
+ private chunkedTokens;
34
+ /**
35
+ * Calculate weighted average of embeddings.
36
+ * Uses array destructuring to avoid object-injection security warnings.
37
+ */
38
+ private weightedAverageEmbeddings;
39
+ }
40
+ //# sourceMappingURL=openai.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"openai.d.ts","sourceRoot":"","sources":["../../../src/llm/gateways/openai.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AACxC,OAAO,EAAE,UAAU,EAAE,gBAAgB,EAAE,eAAe,EAAE,WAAW,EAAY,MAAM,WAAW,CAAC;AACjG,OAAO,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAC1C,OAAO,EAAE,MAAM,EAAyB,MAAM,aAAa,CAAC;AA2E5D;;;;GAIG;AACH,qBAAa,aAAc,YAAW,UAAU;IAC9C,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;IAChC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;IACjC,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAsB;gBAExC,MAAM,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM;IAK7C;;OAEG;IACH,OAAO,CAAC,uBAAuB;IA2D/B;;OAEG;IACH,OAAO,CAAC,uBAAuB;IA6BzB,QAAQ,CACZ,KAAK,EAAE,MAAM,EACb,QAAQ,EAAE,UAAU,EAAE,EACtB,MAAM,CAAC,EAAE,gBAAgB,EACzB,KAAK,CAAC,EAAE,cAAc,EAAE,GACvB,OAAO,CAAC,MAAM,CAAC,eAAe,EAAE,KAAK,CAAC,CAAC;IAkInC,cAAc,CACnB,KAAK,EAAE,MAAM,EACb,QAAQ,EAAE,UAAU,EAAE,EACtB,MAAM,CAAC,EAAE,gBAAgB,EACzB,KAAK,CAAC,EAAE,cAAc,EAAE,GACvB,cAAc,CAAC,MAAM,CAAC,WAAW,EAAE,KAAK,CAAC,CAAC;IAoNvC,UAAU,IAAI,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,EAAE,KAAK,CAAC,CAAC;IA8B9C,mBAAmB,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,EAAE,KAAK,CAAC,CAAC;IAmEzF;;OAEG;IACH,OAAO,CAAE,aAAa;IAYtB;;;OAGG;IACH,OAAO,CAAC,yBAAyB;CA0BlC"}
@@ -0,0 +1,469 @@
1
+ "use strict";
2
+ /**
3
+ * OpenAI gateway implementation for chat completions, embeddings, and streaming.
4
+ */
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.OpenAIGateway = void 0;
7
+ const error_1 = require("../../error");
8
+ const openai_messages_adapter_1 = require("./openai-messages-adapter");
9
+ const openai_model_registry_1 = require("./openai-model-registry");
10
+ const tokenizerGateway_1 = require("./tokenizerGateway");
11
+ /**
12
+ * Gateway for OpenAI API provider.
13
+ *
14
+ * Supports chat completions, structured output, tool calling, streaming, and embeddings.
15
+ */
16
+ class OpenAIGateway {
17
+ apiKey;
18
+ baseUrl;
19
+ modelRegistry = (0, openai_model_registry_1.getModelRegistry)();
20
+ constructor(apiKey, baseUrl) {
21
+ this.apiKey = apiKey || process.env.OPENAI_API_KEY || '';
22
+ this.baseUrl = baseUrl || process.env.OPENAI_API_ENDPOINT || 'https://api.openai.com/v1';
23
+ }
24
+ /**
25
+ * Adapt parameters based on the model type and capabilities.
26
+ */
27
+ adaptParametersForModel(model, args) {
28
+ const adaptedArgs = { ...args };
29
+ const capabilities = this.modelRegistry.getModelCapabilities(model);
30
+ // Handle token limit parameter conversion
31
+ if ('maxTokens' in adaptedArgs && adaptedArgs.maxTokens !== undefined) {
32
+ const tokenParam = (0, openai_model_registry_1.getTokenLimitParam)(capabilities);
33
+ if (tokenParam !== 'max_tokens') {
34
+ // Convert max_tokens to max_completion_tokens for reasoning models
35
+ adaptedArgs['maxCompletionTokens'] = adaptedArgs.maxTokens;
36
+ delete adaptedArgs.maxTokens;
37
+ }
38
+ }
39
+ // Validate tool usage for models that don't support tools
40
+ if ('tools' in adaptedArgs &&
41
+ adaptedArgs.tools &&
42
+ Array.isArray(adaptedArgs.tools) &&
43
+ adaptedArgs.tools.length > 0 &&
44
+ !capabilities.supportsTools) {
45
+ console.warn(`Model ${model} does not support tools, removing tool configuration (${adaptedArgs.tools.length} tools)`);
46
+ adaptedArgs.tools = undefined;
47
+ }
48
+ // Handle temperature restrictions for specific models
49
+ if ('temperature' in adaptedArgs && adaptedArgs.temperature !== undefined) {
50
+ const temperature = adaptedArgs.temperature;
51
+ if (capabilities.supportedTemperatures !== undefined) {
52
+ if (Array.isArray(capabilities.supportedTemperatures) &&
53
+ capabilities.supportedTemperatures.length === 0) {
54
+ // Model doesn't support temperature parameter at all - remove it
55
+ console.warn(`Model ${model} does not support temperature parameter at all (requested: ${temperature})`);
56
+ delete adaptedArgs.temperature;
57
+ }
58
+ else if (!(0, openai_model_registry_1.supportsTemperature)(capabilities, temperature)) {
59
+ // Model supports temperature but not this specific value - use default
60
+ const defaultTemp = 1.0;
61
+ console.warn(`Model ${model} does not support requested temperature ${temperature}, using default ${defaultTemp}`);
62
+ adaptedArgs.temperature = defaultTemp;
63
+ }
64
+ }
65
+ }
66
+ return adaptedArgs;
67
+ }
68
+ /**
69
+ * Validate that the parameters are compatible with the model.
70
+ */
71
+ validateModelParameters(model, args) {
72
+ const capabilities = this.modelRegistry.getModelCapabilities(model);
73
+ // Warning for tools on reasoning models that don't support them
74
+ if (capabilities.modelType === openai_model_registry_1.ModelType.REASONING &&
75
+ !capabilities.supportsTools &&
76
+ 'tools' in args &&
77
+ args.tools &&
78
+ Array.isArray(args.tools) &&
79
+ args.tools.length > 0) {
80
+ console.warn(`Reasoning model ${model} may not support tools (${args.tools.length} tools provided)`);
81
+ }
82
+ // Validate token limits (check both possible parameter names)
83
+ const tokenValue = args.maxTokens || args.maxCompletionTokens;
84
+ if (tokenValue && capabilities.maxOutputTokens) {
85
+ if (tokenValue > capabilities.maxOutputTokens) {
86
+ console.warn(`Requested token limit ${tokenValue} exceeds model maximum ${capabilities.maxOutputTokens} for ${model}`);
87
+ }
88
+ }
89
+ }
90
+ async generate(model, messages, config, tools) {
91
+ try {
92
+ // Build args object for adaptation
93
+ const args = {
94
+ model,
95
+ messages,
96
+ objectModel: config?.responseFormat?.schema,
97
+ tools,
98
+ temperature: config?.temperature ?? 1.0,
99
+ numCtx: config?.numCtx ?? 32768,
100
+ maxTokens: config?.maxTokens ?? 16384,
101
+ numPredict: config?.numPredict,
102
+ };
103
+ // Adapt parameters based on model type
104
+ const adaptedArgs = this.adaptParametersForModel(model, args);
105
+ // Validate parameters after adaptation
106
+ this.validateModelParameters(model, adaptedArgs);
107
+ // Build OpenAI request
108
+ const openaiMessages = (0, openai_messages_adapter_1.adaptMessagesToOpenAI)(messages);
109
+ const requestBody = {
110
+ model: adaptedArgs.model,
111
+ messages: openaiMessages,
112
+ };
113
+ // Add temperature if specified
114
+ if ('temperature' in adaptedArgs) {
115
+ requestBody.temperature = adaptedArgs.temperature;
116
+ }
117
+ // Handle response format for structured output
118
+ if (config?.responseFormat?.type === 'json_object' && config?.responseFormat?.schema) {
119
+ requestBody.response_format = {
120
+ type: 'json_schema',
121
+ json_schema: {
122
+ name: 'response',
123
+ schema: config.responseFormat.schema,
124
+ },
125
+ };
126
+ }
127
+ // Add tools if provided
128
+ if (adaptedArgs.tools && Array.isArray(adaptedArgs.tools) && adaptedArgs.tools.length > 0) {
129
+ requestBody.tools = adaptedArgs.tools.map((t) => ({
130
+ type: 'function',
131
+ function: {
132
+ name: t.function.name,
133
+ description: t.function.description,
134
+ parameters: t.function.parameters,
135
+ },
136
+ }));
137
+ }
138
+ // Handle token limit parameters
139
+ if ('maxTokens' in adaptedArgs && adaptedArgs.maxTokens !== undefined) {
140
+ requestBody.max_tokens = adaptedArgs.maxTokens;
141
+ }
142
+ else if ('maxCompletionTokens' in adaptedArgs &&
143
+ adaptedArgs.maxCompletionTokens !== undefined) {
144
+ requestBody.max_completion_tokens = adaptedArgs.maxCompletionTokens;
145
+ }
146
+ const response = await fetch(`${this.baseUrl}/chat/completions`, {
147
+ method: 'POST',
148
+ headers: {
149
+ 'Content-Type': 'application/json',
150
+ Authorization: `Bearer ${this.apiKey}`,
151
+ },
152
+ body: JSON.stringify(requestBody),
153
+ });
154
+ if (!response.ok) {
155
+ const errorText = await response.text();
156
+ return (0, error_1.Err)(new error_1.GatewayError(`OpenAI API error: ${response.status} ${response.statusText} - ${errorText}`, response.status));
157
+ }
158
+ const data = (await response.json());
159
+ const message = data.choices[0]?.message;
160
+ if (!message) {
161
+ return (0, error_1.Err)(new error_1.GatewayError('No message in OpenAI response'));
162
+ }
163
+ // Parse tool calls if present
164
+ let toolCalls;
165
+ if (message.tool_calls && message.tool_calls.length > 0) {
166
+ toolCalls = message.tool_calls.map((tc) => ({
167
+ id: tc.id,
168
+ type: 'function',
169
+ function: {
170
+ name: tc.function.name,
171
+ arguments: tc.function.arguments,
172
+ },
173
+ }));
174
+ }
175
+ const gatewayResponse = {
176
+ content: message.content || '',
177
+ toolCalls,
178
+ finishReason: data.choices[0]?.finish_reason,
179
+ model: data.model,
180
+ };
181
+ if (data.usage) {
182
+ gatewayResponse.usage = {
183
+ promptTokens: data.usage.prompt_tokens,
184
+ completionTokens: data.usage.completion_tokens,
185
+ totalTokens: data.usage.total_tokens,
186
+ };
187
+ }
188
+ return (0, error_1.Ok)(gatewayResponse);
189
+ }
190
+ catch (error) {
191
+ return (0, error_1.Err)(new error_1.GatewayError(`Failed to generate completion: ${error instanceof Error ? error.message : String(error)}`));
192
+ }
193
+ }
194
+ async *generateStream(model, messages, config, tools) {
195
+ try {
196
+ // Build args object for adaptation
197
+ const args = {
198
+ model,
199
+ messages,
200
+ objectModel: config?.responseFormat?.schema,
201
+ tools,
202
+ temperature: config?.temperature ?? 1.0,
203
+ numCtx: config?.numCtx ?? 32768,
204
+ maxTokens: config?.maxTokens ?? 16384,
205
+ numPredict: config?.numPredict,
206
+ };
207
+ // Adapt parameters based on model type
208
+ const adaptedArgs = this.adaptParametersForModel(model, args);
209
+ // Validate parameters after adaptation
210
+ this.validateModelParameters(model, adaptedArgs);
211
+ // Check if model supports streaming
212
+ const capabilities = this.modelRegistry.getModelCapabilities(model);
213
+ if (!capabilities.supportsStreaming) {
214
+ yield (0, error_1.Err)(new error_1.GatewayError(`Model ${model} does not support streaming`));
215
+ return;
216
+ }
217
+ // Structured output doesn't work with streaming
218
+ if (config?.responseFormat?.type === 'json_object' && config?.responseFormat?.schema) {
219
+ yield (0, error_1.Err)(new error_1.GatewayError('Streaming with structured output (responseFormat) is not supported'));
220
+ return;
221
+ }
222
+ // Build OpenAI request
223
+ const openaiMessages = (0, openai_messages_adapter_1.adaptMessagesToOpenAI)(messages);
224
+ const requestBody = {
225
+ model: adaptedArgs.model,
226
+ messages: openaiMessages,
227
+ stream: true,
228
+ };
229
+ // Add temperature if specified
230
+ if ('temperature' in adaptedArgs) {
231
+ requestBody.temperature = adaptedArgs.temperature;
232
+ }
233
+ // Add tools if provided
234
+ if (adaptedArgs.tools && Array.isArray(adaptedArgs.tools) && adaptedArgs.tools.length > 0) {
235
+ requestBody.tools = adaptedArgs.tools.map((t) => ({
236
+ type: 'function',
237
+ function: {
238
+ name: t.function.name,
239
+ description: t.function.description,
240
+ parameters: t.function.parameters,
241
+ },
242
+ }));
243
+ }
244
+ // Handle token limit parameters
245
+ if ('maxTokens' in adaptedArgs && adaptedArgs.maxTokens !== undefined) {
246
+ requestBody.max_tokens = adaptedArgs.maxTokens;
247
+ }
248
+ else if ('maxCompletionTokens' in adaptedArgs &&
249
+ adaptedArgs.maxCompletionTokens !== undefined) {
250
+ requestBody.max_completion_tokens = adaptedArgs.maxCompletionTokens;
251
+ }
252
+ const response = await fetch(`${this.baseUrl}/chat/completions`, {
253
+ method: 'POST',
254
+ headers: {
255
+ 'Content-Type': 'application/json',
256
+ Authorization: `Bearer ${this.apiKey}`,
257
+ },
258
+ body: JSON.stringify(requestBody),
259
+ });
260
+ if (!response.ok) {
261
+ const errorText = await response.text();
262
+ yield (0, error_1.Err)(new error_1.GatewayError(`OpenAI API error: ${response.status} ${response.statusText} - ${errorText}`, response.status));
263
+ return;
264
+ }
265
+ if (!response.body) {
266
+ yield (0, error_1.Err)(new error_1.GatewayError('No response body'));
267
+ return;
268
+ }
269
+ const reader = response.body.getReader();
270
+ const decoder = new TextDecoder();
271
+ let buffer = '';
272
+ // Accumulate tool calls as they stream in
273
+ // OpenAI streams tool arguments incrementally, indexed by tool call index
274
+ const toolCallsAccumulator = new Map();
275
+ while (true) {
276
+ const { done, value } = await reader.read();
277
+ if (done)
278
+ break;
279
+ buffer += decoder.decode(value, { stream: true });
280
+ const lines = buffer.split('\n');
281
+ buffer = lines.pop() || '';
282
+ for (const line of lines) {
283
+ const trimmedLine = line.trim();
284
+ if (!trimmedLine || trimmedLine === 'data: [DONE]')
285
+ continue;
286
+ if (trimmedLine.startsWith('data: ')) {
287
+ try {
288
+ const data = JSON.parse(trimmedLine.slice(6));
289
+ const choice = data.choices[0];
290
+ if (!choice)
291
+ continue;
292
+ const delta = choice.delta;
293
+ const finishReason = choice.finish_reason;
294
+ // Yield content chunks as they arrive
295
+ if (delta.content) {
296
+ yield (0, error_1.Ok)({ content: delta.content, done: false });
297
+ }
298
+ // Accumulate tool call chunks
299
+ if (delta.tool_calls) {
300
+ for (const toolCallDelta of delta.tool_calls) {
301
+ const index = toolCallDelta.index;
302
+ // Initialize accumulator for this tool call if needed
303
+ if (!toolCallsAccumulator.has(index)) {
304
+ toolCallsAccumulator.set(index, { id: null, name: null, arguments: '' });
305
+ }
306
+ // We just ensured the key exists above, so this is guaranteed to be defined
307
+ const acc = toolCallsAccumulator.get(index);
308
+ if (!acc)
309
+ continue;
310
+ // First chunk has id and name
311
+ if (toolCallDelta.id) {
312
+ acc.id = toolCallDelta.id;
313
+ }
314
+ if (toolCallDelta.function?.name) {
315
+ acc.name = toolCallDelta.function.name;
316
+ }
317
+ // All chunks may have argument fragments
318
+ if (toolCallDelta.function?.arguments) {
319
+ acc.arguments += toolCallDelta.function.arguments;
320
+ }
321
+ }
322
+ }
323
+ // When stream is complete with tool_calls, yield accumulated tool calls
324
+ if (finishReason === 'tool_calls' && toolCallsAccumulator.size > 0) {
325
+ const completeToolCalls = [];
326
+ // Sort by index to maintain order
327
+ const sortedIndices = Array.from(toolCallsAccumulator.keys()).sort((a, b) => a - b);
328
+ for (const index of sortedIndices) {
329
+ const tc = toolCallsAccumulator.get(index);
330
+ if (!tc)
331
+ continue;
332
+ // Keep arguments as string for ToolCall interface
333
+ completeToolCalls.push({
334
+ id: tc.id || '',
335
+ type: 'function',
336
+ function: {
337
+ name: tc.name || '',
338
+ arguments: tc.arguments,
339
+ },
340
+ });
341
+ }
342
+ if (completeToolCalls.length > 0) {
343
+ yield (0, error_1.Ok)({
344
+ toolCalls: completeToolCalls,
345
+ done: true,
346
+ finishReason: 'tool_calls',
347
+ });
348
+ }
349
+ }
350
+ if (finishReason && finishReason !== 'tool_calls') {
351
+ yield (0, error_1.Ok)({ done: true, finishReason: finishReason });
352
+ }
353
+ }
354
+ catch (parseError) {
355
+ console.error(`Failed to parse stream chunk: ${trimmedLine}`, parseError);
356
+ }
357
+ }
358
+ }
359
+ }
360
+ }
361
+ catch (error) {
362
+ yield (0, error_1.Err)(new error_1.GatewayError(`Failed to generate stream: ${error instanceof Error ? error.message : String(error)}`));
363
+ }
364
+ }
365
+ async listModels() {
366
+ try {
367
+ const response = await fetch(`${this.baseUrl}/models`, {
368
+ headers: {
369
+ Authorization: `Bearer ${this.apiKey}`,
370
+ },
371
+ });
372
+ if (!response.ok) {
373
+ return (0, error_1.Err)(new error_1.GatewayError(`OpenAI API error: ${response.status} ${response.statusText}`, response.status));
374
+ }
375
+ const data = (await response.json());
376
+ const modelNames = data.data.map((m) => m.id).sort();
377
+ return (0, error_1.Ok)(modelNames);
378
+ }
379
+ catch (error) {
380
+ return (0, error_1.Err)(new error_1.GatewayError(`Failed to list models: ${error instanceof Error ? error.message : String(error)}`));
381
+ }
382
+ }
383
+ async calculateEmbeddings(text, model) {
384
+ try {
385
+ const embeddingModel = model || 'text-embedding-3-large';
386
+ // Chunk the text if it's too long (8191 tokens max for OpenAI embeddings)
387
+ const tokenizer = new tokenizerGateway_1.TokenizerGateway();
388
+ const chunks = this.chunkedTokens(tokenizer, text, 8191);
389
+ const allEmbeddings = [];
390
+ const lengths = [];
391
+ for (const chunk of chunks) {
392
+ const response = await fetch(`${this.baseUrl}/embeddings`, {
393
+ method: 'POST',
394
+ headers: {
395
+ 'Content-Type': 'application/json',
396
+ Authorization: `Bearer ${this.apiKey}`,
397
+ },
398
+ body: JSON.stringify({
399
+ model: embeddingModel,
400
+ input: chunk,
401
+ }),
402
+ });
403
+ if (!response.ok) {
404
+ const errorText = await response.text();
405
+ tokenizer.free();
406
+ return (0, error_1.Err)(new error_1.GatewayError(`OpenAI embeddings API error: ${response.status} ${response.statusText} - ${errorText}`, response.status));
407
+ }
408
+ const data = (await response.json());
409
+ const embedding = data.data[0]?.embedding;
410
+ if (embedding) {
411
+ allEmbeddings.push(embedding);
412
+ lengths.push(embedding.length);
413
+ }
414
+ }
415
+ tokenizer.free();
416
+ if (allEmbeddings.length === 0) {
417
+ return (0, error_1.Err)(new error_1.GatewayError('No embeddings returned'));
418
+ }
419
+ // If only one chunk, return it directly
420
+ if (allEmbeddings.length === 1) {
421
+ return (0, error_1.Ok)(allEmbeddings[0]);
422
+ }
423
+ // Average the embeddings weighted by length
424
+ const average = this.weightedAverageEmbeddings(allEmbeddings, lengths);
425
+ return (0, error_1.Ok)(average);
426
+ }
427
+ catch (error) {
428
+ return (0, error_1.Err)(new error_1.GatewayError(`Failed to calculate embeddings: ${error instanceof Error ? error.message : String(error)}`));
429
+ }
430
+ }
431
+ /**
432
+ * Split text into chunks of tokens.
433
+ */
434
+ *chunkedTokens(tokenizer, text, chunkLength) {
435
+ const tokens = tokenizer.encode(text);
436
+ for (let i = 0; i < tokens.length; i += chunkLength) {
437
+ yield tokens.slice(i, i + chunkLength);
438
+ }
439
+ }
440
+ /**
441
+ * Calculate weighted average of embeddings.
442
+ * Uses array destructuring to avoid object-injection security warnings.
443
+ */
444
+ weightedAverageEmbeddings(embeddings, weights) {
445
+ if (embeddings.length === 0)
446
+ return [];
447
+ const dimension = embeddings[0].length;
448
+ const totalWeight = weights.reduce((a, b) => a + b, 0);
449
+ // Build weighted sum for each dimension
450
+ const average = Array.from({ length: dimension }, (_, dimIdx) => {
451
+ let sum = 0;
452
+ embeddings.forEach((embedding, embIdx) => {
453
+ // Use Array.prototype.at() which is safer than bracket notation
454
+ const weight = weights.at(embIdx) ?? 0;
455
+ const value = embedding.at(dimIdx) ?? 0;
456
+ sum += value * (weight / totalWeight);
457
+ });
458
+ return sum;
459
+ });
460
+ // Normalize
461
+ const norm = Math.sqrt(average.reduce((sum, x) => sum + x * x, 0));
462
+ if (norm > 0) {
463
+ return average.map((x) => x / norm);
464
+ }
465
+ return average;
466
+ }
467
+ }
468
+ exports.OpenAIGateway = OpenAIGateway;
469
+ //# sourceMappingURL=openai.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"openai.js","sourceRoot":"","sources":["../../../src/llm/gateways/openai.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,61 @@
1
+ /**
2
+ * Gateway for tokenizing and detokenizing text using tiktoken.
3
+ *
4
+ * This gateway provides encoding and decoding functionality for text,
5
+ * which is useful for:
6
+ * - Counting tokens to manage context windows
7
+ * - Understanding token usage for cost estimation
8
+ * - Debugging token-related issues
9
+ *
10
+ * @example
11
+ * ```typescript
12
+ * const tokenizer = new TokenizerGateway();
13
+ * const tokens = tokenizer.encode("Hello, world!");
14
+ * const text = tokenizer.decode(tokens);
15
+ * ```
16
+ */
17
+ export declare class TokenizerGateway {
18
+ private tokenizer;
19
+ /**
20
+ * Creates a new TokenizerGateway instance.
21
+ *
22
+ * @param model - The encoding model to use. Defaults to "cl100k_base" which is used by GPT-4 and GPT-3.5-turbo.
23
+ * Other options include "p50k_base" (GPT-3), "r50k_base" (older models), etc.
24
+ */
25
+ constructor(model?: string);
26
+ /**
27
+ * Encodes text into tokens.
28
+ *
29
+ * @param text - The text to encode
30
+ * @returns An array of token IDs
31
+ *
32
+ * @example
33
+ * ```typescript
34
+ * const tokenizer = new TokenizerGateway();
35
+ * const tokens = tokenizer.encode("Hello, world!");
36
+ * console.log(`Token count: ${tokens.length}`);
37
+ * ```
38
+ */
39
+ encode(text: string): number[];
40
+ /**
41
+ * Decodes tokens back into text.
42
+ *
43
+ * @param tokens - The array of token IDs to decode
44
+ * @returns The decoded text
45
+ *
46
+ * @example
47
+ * ```typescript
48
+ * const tokenizer = new TokenizerGateway();
49
+ * const tokens = [9906, 11, 1917, 0];
50
+ * const text = tokenizer.decode(tokens);
51
+ * console.log(text); // "Hello, world!"
52
+ * ```
53
+ */
54
+ decode(tokens: number[]): string;
55
+ /**
56
+ * Frees the tokenizer resources.
57
+ * Call this when you're done using the tokenizer to prevent memory leaks.
58
+ */
59
+ free(): void;
60
+ }
61
+ //# sourceMappingURL=tokenizerGateway.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tokenizerGateway.d.ts","sourceRoot":"","sources":["../../../src/llm/gateways/tokenizerGateway.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;;;GAeG;AACH,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,SAAS,CAAW;IAE5B;;;;;OAKG;gBACS,KAAK,GAAE,MAAsB;IAIzC;;;;;;;;;;;;OAYG;IACH,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE;IAI9B;;;;;;;;;;;;;OAaG;IACH,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM;IAKhC;;;OAGG;IACH,IAAI,IAAI,IAAI;CAGb"}