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,156 @@
1
+ "use strict";
2
+ /**
3
+ * ChatSession - Manages conversational state with automatic context window management
4
+ */
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.ChatSession = void 0;
7
+ const models_1 = require("./models");
8
+ const tokenizerGateway_1 = require("./gateways/tokenizerGateway");
9
+ /**
10
+ * Manages the state of a conversation with an LLM, automatically handling
11
+ * context window limits by removing older messages when needed.
12
+ *
13
+ * @example
14
+ * ```typescript
15
+ * const broker = new LlmBroker('qwen3:32b', new OllamaGateway());
16
+ * const session = new ChatSession(broker, {
17
+ * systemPrompt: 'You are a helpful coding assistant.',
18
+ * tools: [new DateResolverTool()],
19
+ * maxContext: 8192
20
+ * });
21
+ *
22
+ * const response = await session.send('What is TypeScript?');
23
+ * console.log(response);
24
+ * ```
25
+ */
26
+ class ChatSession {
27
+ messages = [];
28
+ llm;
29
+ systemPrompt;
30
+ tools;
31
+ maxContext;
32
+ temperature;
33
+ tokenizerGateway;
34
+ /**
35
+ * Create a new ChatSession instance.
36
+ *
37
+ * @param llm - The LLM broker to use for generating responses
38
+ * @param config - Optional configuration options
39
+ */
40
+ constructor(llm, config = {}) {
41
+ this.llm = llm;
42
+ this.systemPrompt = config.systemPrompt || 'You are a helpful assistant.';
43
+ this.tools = config.tools;
44
+ this.maxContext = config.maxContext || 32768;
45
+ this.temperature = config.temperature || 1.0;
46
+ this.tokenizerGateway = config.tokenizerGateway || new tokenizerGateway_1.TokenizerGateway();
47
+ // Initialize with system prompt
48
+ this.insertMessage({
49
+ role: models_1.MessageRole.System,
50
+ content: this.systemPrompt,
51
+ });
52
+ }
53
+ /**
54
+ * Send a query to the LLM and return the response.
55
+ * Also records the query and response in the ongoing chat session.
56
+ *
57
+ * @param query - The query to send to the LLM
58
+ * @returns The response from the LLM
59
+ *
60
+ * @example
61
+ * ```typescript
62
+ * const response = await session.send('Hello, how are you?');
63
+ * console.log(response);
64
+ * ```
65
+ */
66
+ async send(query) {
67
+ // Add user message
68
+ this.insertMessage({
69
+ role: models_1.MessageRole.User,
70
+ content: query,
71
+ });
72
+ // Generate response
73
+ const result = await this.llm.generate(this.messages, this.tools, {
74
+ temperature: this.temperature,
75
+ });
76
+ if (!result.ok) {
77
+ throw result.error;
78
+ }
79
+ // Ensure all messages have token counts
80
+ this.ensureAllMessagesAreSized();
81
+ // Add assistant response
82
+ this.insertMessage({
83
+ role: models_1.MessageRole.Assistant,
84
+ content: result.value,
85
+ });
86
+ return result.value;
87
+ }
88
+ /**
89
+ * Get the current message history.
90
+ *
91
+ * @returns Array of messages in the session
92
+ */
93
+ getMessages() {
94
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
95
+ return this.messages.map(({ tokenLength, ...msg }) => msg);
96
+ }
97
+ /**
98
+ * Clear all messages except the system prompt.
99
+ */
100
+ clear() {
101
+ const systemMessage = this.messages[0];
102
+ this.messages = [systemMessage];
103
+ }
104
+ /**
105
+ * Insert a message into the chat session.
106
+ * If the total token count exceeds maxContext, older messages are removed.
107
+ *
108
+ * @param message - The message to add
109
+ */
110
+ insertMessage(message) {
111
+ const sizedMessage = this.buildSizedMessage(message);
112
+ this.messages.push(sizedMessage);
113
+ // Remove old messages if we exceed context limit
114
+ let totalLength = this.messages.reduce((sum, msg) => sum + msg.tokenLength, 0);
115
+ while (totalLength > this.maxContext && this.messages.length > 1) {
116
+ // Remove the second message (keep system prompt at index 0)
117
+ const removed = this.messages.splice(1, 1)[0];
118
+ totalLength -= removed.tokenLength;
119
+ }
120
+ }
121
+ /**
122
+ * Build a sized message with token count.
123
+ *
124
+ * @param message - The message to size
125
+ * @returns Message with token length
126
+ */
127
+ buildSizedMessage(message) {
128
+ if (!message.content || typeof message.content !== 'string') {
129
+ return { ...message, tokenLength: 0 };
130
+ }
131
+ const tokens = this.tokenizerGateway.encode(message.content);
132
+ return { ...message, tokenLength: tokens.length };
133
+ }
134
+ /**
135
+ * Ensure all messages in the history have token counts.
136
+ * This is needed after tool calls which may add messages without sizing.
137
+ */
138
+ ensureAllMessagesAreSized() {
139
+ for (let i = 0; i < this.messages.length; i++) {
140
+ // eslint-disable-next-line security/detect-object-injection -- Safe: bounded numeric array index
141
+ const msg = this.messages[i];
142
+ if (!('tokenLength' in msg) || msg.tokenLength === undefined) {
143
+ // eslint-disable-next-line security/detect-object-injection -- Safe: bounded numeric array index
144
+ this.messages[i] = this.buildSizedMessage(msg);
145
+ }
146
+ }
147
+ }
148
+ /**
149
+ * Clean up resources when done with the session.
150
+ */
151
+ dispose() {
152
+ this.tokenizerGateway.free();
153
+ }
154
+ }
155
+ exports.ChatSession = ChatSession;
156
+ //# sourceMappingURL=chat-session.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chat-session.js","sourceRoot":"","sources":["../../src/llm/chat-session.ts"],"names":[],"mappings":";AAAA;;GAEG;;;AAGH,qCAAmD;AAEnD,kEAA+D;AAoB/D;;;;;;;;;;;;;;;;GAgBG;AACH,MAAa,WAAW;IACd,QAAQ,GAAsB,EAAE,CAAC;IACxB,GAAG,CAAY;IACf,YAAY,CAAS;IACrB,KAAK,CAAa;IAClB,UAAU,CAAS;IACnB,WAAW,CAAS;IACpB,gBAAgB,CAAmB;IAEpD;;;;;OAKG;IACH,YAAY,GAAc,EAAE,SAA4B,EAAE;QACxD,IAAI,CAAC,GAAG,GAAG,GAAG,CAAC;QACf,IAAI,CAAC,YAAY,GAAG,MAAM,CAAC,YAAY,IAAI,8BAA8B,CAAC;QAC1E,IAAI,CAAC,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC;QAC1B,IAAI,CAAC,UAAU,GAAG,MAAM,CAAC,UAAU,IAAI,KAAK,CAAC;QAC7C,IAAI,CAAC,WAAW,GAAG,MAAM,CAAC,WAAW,IAAI,GAAG,CAAC;QAC7C,IAAI,CAAC,gBAAgB,GAAG,MAAM,CAAC,gBAAgB,IAAI,IAAI,mCAAgB,EAAE,CAAC;QAE1E,gCAAgC;QAChC,IAAI,CAAC,aAAa,CAAC;YACjB,IAAI,EAAE,oBAAW,CAAC,MAAM;YACxB,OAAO,EAAE,IAAI,CAAC,YAAY;SAC3B,CAAC,CAAC;IACL,CAAC;IAED;;;;;;;;;;;;OAYG;IACH,KAAK,CAAC,IAAI,CAAC,KAAa;QACtB,mBAAmB;QACnB,IAAI,CAAC,aAAa,CAAC;YACjB,IAAI,EAAE,oBAAW,CAAC,IAAI;YACtB,OAAO,EAAE,KAAK;SACf,CAAC,CAAC;QAEH,oBAAoB;QACpB,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC,QAAwB,EAAE,IAAI,CAAC,KAAK,EAAE;YAChF,WAAW,EAAE,IAAI,CAAC,WAAW;SAC9B,CAAC,CAAC;QAEH,IAAI,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC;YACf,MAAM,MAAM,CAAC,KAAK,CAAC;QACrB,CAAC;QAED,wCAAwC;QACxC,IAAI,CAAC,yBAAyB,EAAE,CAAC;QAEjC,yBAAyB;QACzB,IAAI,CAAC,aAAa,CAAC;YACjB,IAAI,EAAE,oBAAW,CAAC,SAAS;YAC3B,OAAO,EAAE,MAAM,CAAC,KAAK;SACtB,CAAC,CAAC;QAEH,OAAO,MAAM,CAAC,KAAK,CAAC;IACtB,CAAC;IAED;;;;OAIG;IACH,WAAW;QACT,6DAA6D;QAC7D,OAAO,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,EAAE,WAAW,EAAE,GAAG,GAAG,EAAE,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC;IAC7D,CAAC;IAED;;OAEG;IACH,KAAK;QACH,MAAM,aAAa,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;QACvC,IAAI,CAAC,QAAQ,GAAG,CAAC,aAAa,CAAC,CAAC;IAClC,CAAC;IAED;;;;;OAKG;IACK,aAAa,CAAC,OAAmB;QACvC,MAAM,YAAY,GAAG,IAAI,CAAC,iBAAiB,CAAC,OAAO,CAAC,CAAC;QACrD,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;QAEjC,iDAAiD;QACjD,IAAI,WAAW,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,CAAC,GAAG,GAAG,GAAG,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC;QAE/E,OAAO,WAAW,GAAG,IAAI,CAAC,UAAU,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACjE,4DAA4D;YAC5D,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YAC9C,WAAW,IAAI,OAAO,CAAC,WAAW,CAAC;QACrC,CAAC;IACH,CAAC;IAED;;;;;OAKG;IACK,iBAAiB,CAAC,OAAmB;QAC3C,IAAI,CAAC,OAAO,CAAC,OAAO,IAAI,OAAO,OAAO,CAAC,OAAO,KAAK,QAAQ,EAAE,CAAC;YAC5D,OAAO,EAAE,GAAG,OAAO,EAAE,WAAW,EAAE,CAAC,EAAE,CAAC;QACxC,CAAC;QAED,MAAM,MAAM,GAAG,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;QAC7D,OAAO,EAAE,GAAG,OAAO,EAAE,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC;IACpD,CAAC;IAED;;;OAGG;IACK,yBAAyB;QAC/B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YAC9C,iGAAiG;YACjG,MAAM,GAAG,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;YAC7B,IAAI,CAAC,CAAC,aAAa,IAAI,GAAG,CAAC,IAAI,GAAG,CAAC,WAAW,KAAK,SAAS,EAAE,CAAC;gBAC7D,iGAAiG;gBACjG,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,iBAAiB,CAAC,GAAiB,CAAC,CAAC;YAC/D,CAAC;QACH,CAAC;IACH,CAAC;IAED;;OAEG;IACH,OAAO;QACL,IAAI,CAAC,gBAAgB,CAAC,IAAI,EAAE,CAAC;IAC/B,CAAC;CACF;AAjJD,kCAiJC"}
@@ -0,0 +1,28 @@
1
+ /**
2
+ * Gateway interface and implementations for LLM providers
3
+ */
4
+ import { LlmMessage, CompletionConfig, GatewayResponse, StreamChunk } from './models';
5
+ import { ToolDescriptor } from './tools';
6
+ import { Result } from '../error';
7
+ /**
8
+ * Interface for LLM gateway implementations
9
+ */
10
+ export interface LlmGateway {
11
+ /**
12
+ * Generate a completion from the LLM
13
+ */
14
+ generate(model: string, messages: LlmMessage[], config?: CompletionConfig, tools?: ToolDescriptor[]): Promise<Result<GatewayResponse, Error>>;
15
+ /**
16
+ * Generate a streaming completion from the LLM
17
+ */
18
+ generateStream(model: string, messages: LlmMessage[], config?: CompletionConfig, tools?: ToolDescriptor[]): AsyncGenerator<Result<StreamChunk, Error>>;
19
+ /**
20
+ * List available models
21
+ */
22
+ listModels(): Promise<Result<string[], Error>>;
23
+ /**
24
+ * Calculate embeddings for the given text
25
+ */
26
+ calculateEmbeddings(text: string, model?: string): Promise<Result<number[], Error>>;
27
+ }
28
+ //# sourceMappingURL=gateway.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gateway.d.ts","sourceRoot":"","sources":["../../src/llm/gateway.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,UAAU,EAAE,gBAAgB,EAAE,eAAe,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AACtF,OAAO,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AACzC,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAElC;;GAEG;AACH,MAAM,WAAW,UAAU;IACzB;;OAEG;IACH,QAAQ,CACN,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,CAAC;IAE3C;;OAEG;IACH,cAAc,CACZ,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,CAAC;IAE9C;;OAEG;IACH,UAAU,IAAI,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,EAAE,KAAK,CAAC,CAAC,CAAC;IAE/C;;OAEG;IACH,mBAAmB,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,EAAE,KAAK,CAAC,CAAC,CAAC;CACrF"}
@@ -0,0 +1,6 @@
1
+ "use strict";
2
+ /**
3
+ * Gateway interface and implementations for LLM providers
4
+ */
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ //# sourceMappingURL=gateway.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gateway.js","sourceRoot":"","sources":["../../src/llm/gateway.ts"],"names":[],"mappings":";AAAA;;GAEG"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * Gateway exports
3
+ */
4
+ export * from './ollama';
5
+ export * from './openai';
6
+ export * from './openai-model-registry';
7
+ export * from './openai-messages-adapter';
8
+ export * from './tokenizerGateway';
9
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/llm/gateways/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,cAAc,UAAU,CAAC;AACzB,cAAc,UAAU,CAAC;AACzB,cAAc,yBAAyB,CAAC;AACxC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,oBAAoB,CAAC"}
@@ -0,0 +1,25 @@
1
+ "use strict";
2
+ /**
3
+ * Gateway exports
4
+ */
5
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
6
+ if (k2 === undefined) k2 = k;
7
+ var desc = Object.getOwnPropertyDescriptor(m, k);
8
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
9
+ desc = { enumerable: true, get: function() { return m[k]; } };
10
+ }
11
+ Object.defineProperty(o, k2, desc);
12
+ }) : (function(o, m, k, k2) {
13
+ if (k2 === undefined) k2 = k;
14
+ o[k2] = m[k];
15
+ }));
16
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
17
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
18
+ };
19
+ Object.defineProperty(exports, "__esModule", { value: true });
20
+ __exportStar(require("./ollama"), exports);
21
+ __exportStar(require("./openai"), exports);
22
+ __exportStar(require("./openai-model-registry"), exports);
23
+ __exportStar(require("./openai-messages-adapter"), exports);
24
+ __exportStar(require("./tokenizerGateway"), exports);
25
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/llm/gateways/index.ts"],"names":[],"mappings":";AAAA;;GAEG;;;;;;;;;;;;;;;;AAEH,2CAAyB;AACzB,2CAAyB;AACzB,0DAAwC;AACxC,4DAA0C;AAC1C,qDAAmC"}
@@ -0,0 +1,30 @@
1
+ /**
2
+ * Ollama gateway implementation
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
+ interface OllamaPullProgress {
9
+ status: string;
10
+ digest?: string;
11
+ total?: number;
12
+ completed?: number;
13
+ }
14
+ export type PullProgressCallback = (progress: OllamaPullProgress) => void;
15
+ /**
16
+ * Gateway for Ollama local LLM provider
17
+ */
18
+ export declare class OllamaGateway implements LlmGateway {
19
+ private readonly baseUrl;
20
+ constructor(baseUrl?: string);
21
+ generate(model: string, messages: LlmMessage[], config?: CompletionConfig, tools?: ToolDescriptor[]): Promise<Result<GatewayResponse, Error>>;
22
+ generateStream(model: string, messages: LlmMessage[], config?: CompletionConfig, tools?: ToolDescriptor[]): AsyncGenerator<Result<StreamChunk, Error>>;
23
+ listModels(): Promise<Result<string[], Error>>;
24
+ private adaptMessages;
25
+ private adaptTool;
26
+ calculateEmbeddings(text: string, model?: string): Promise<Result<number[], Error>>;
27
+ pullModel(modelName: string, onProgress?: PullProgressCallback): Promise<Result<void, Error>>;
28
+ }
29
+ export {};
30
+ //# sourceMappingURL=ollama.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ollama.d.ts","sourceRoot":"","sources":["../../../src/llm/gateways/ollama.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;AA4C5D,UAAU,kBAAkB;IAC1B,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,MAAM,oBAAoB,GAAG,CAAC,QAAQ,EAAE,kBAAkB,KAAK,IAAI,CAAC;AAE1E;;GAEG;AACH,qBAAa,aAAc,YAAW,UAAU;IAC9C,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;gBAErB,OAAO,CAAC,EAAE,MAAM;IAItB,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;IA6FnC,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;IAqHvC,UAAU,IAAI,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,EAAE,KAAK,CAAC,CAAC;IA0BpD,OAAO,CAAC,aAAa;IAgDrB,OAAO,CAAC,SAAS;IAWX,mBAAmB,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,EAAE,KAAK,CAAC,CAAC;IAqCnF,SAAS,CACb,SAAS,EAAE,MAAM,EACjB,UAAU,CAAC,EAAE,oBAAoB,GAChC,OAAO,CAAC,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;CAuEhC"}
@@ -0,0 +1,322 @@
1
+ "use strict";
2
+ /**
3
+ * Ollama gateway implementation
4
+ */
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.OllamaGateway = void 0;
7
+ const error_1 = require("../../error");
8
+ /**
9
+ * Gateway for Ollama local LLM provider
10
+ */
11
+ class OllamaGateway {
12
+ baseUrl;
13
+ constructor(baseUrl) {
14
+ this.baseUrl = baseUrl || process.env.OLLAMA_HOST || 'http://localhost:11434';
15
+ }
16
+ async generate(model, messages, config, tools) {
17
+ try {
18
+ const ollamaMessages = this.adaptMessages(messages);
19
+ const ollamaTools = tools?.map(this.adaptTool);
20
+ const requestBody = {
21
+ model,
22
+ messages: ollamaMessages,
23
+ stream: false,
24
+ options: {},
25
+ };
26
+ if (config?.temperature !== undefined) {
27
+ requestBody.options.temperature = config.temperature;
28
+ }
29
+ // numPredict takes precedence over maxTokens for Ollama-specific control
30
+ if (config?.numPredict !== undefined) {
31
+ requestBody.options.num_predict = config.numPredict;
32
+ }
33
+ else if (config?.maxTokens !== undefined) {
34
+ requestBody.options.num_predict = config.maxTokens;
35
+ }
36
+ if (config?.topP !== undefined) {
37
+ requestBody.options.top_p = config.topP;
38
+ }
39
+ if (config?.topK !== undefined) {
40
+ requestBody.options.top_k = config.topK;
41
+ }
42
+ if (config?.numCtx !== undefined) {
43
+ requestBody.options.num_ctx = config.numCtx;
44
+ }
45
+ if (config?.stop) {
46
+ requestBody.options.stop = config.stop;
47
+ }
48
+ if (ollamaTools && ollamaTools.length > 0) {
49
+ requestBody.tools = ollamaTools;
50
+ }
51
+ if (config?.responseFormat?.type === 'json_object') {
52
+ // Pass the schema to Ollama's format field for structured output
53
+ requestBody.format = config.responseFormat.schema || 'json';
54
+ }
55
+ const response = await fetch(`${this.baseUrl}/api/chat`, {
56
+ method: 'POST',
57
+ headers: {
58
+ 'Content-Type': 'application/json',
59
+ },
60
+ body: JSON.stringify(requestBody),
61
+ });
62
+ if (!response.ok) {
63
+ const errorText = await response.text();
64
+ return (0, error_1.Err)(new error_1.GatewayError(`Ollama API error: ${response.status} ${response.statusText} - ${errorText}`, response.status));
65
+ }
66
+ const data = (await response.json());
67
+ const gatewayResponse = {
68
+ content: data.message.content,
69
+ toolCalls: data.message.tool_calls,
70
+ finishReason: data.done ? 'stop' : undefined,
71
+ model: data.model,
72
+ };
73
+ if (data.prompt_eval_count !== undefined && data.eval_count !== undefined) {
74
+ gatewayResponse.usage = {
75
+ promptTokens: data.prompt_eval_count,
76
+ completionTokens: data.eval_count,
77
+ totalTokens: data.prompt_eval_count + data.eval_count,
78
+ };
79
+ }
80
+ return (0, error_1.Ok)(gatewayResponse);
81
+ }
82
+ catch (error) {
83
+ return (0, error_1.Err)(new error_1.GatewayError(`Failed to generate completion: ${error instanceof Error ? error.message : String(error)}`));
84
+ }
85
+ }
86
+ async *generateStream(model, messages, config, tools) {
87
+ try {
88
+ const ollamaMessages = this.adaptMessages(messages);
89
+ const ollamaTools = tools?.map(this.adaptTool);
90
+ const requestBody = {
91
+ model,
92
+ messages: ollamaMessages,
93
+ stream: true,
94
+ options: {},
95
+ };
96
+ if (config?.temperature !== undefined) {
97
+ requestBody.options.temperature = config.temperature;
98
+ }
99
+ // numPredict takes precedence over maxTokens for Ollama-specific control
100
+ if (config?.numPredict !== undefined) {
101
+ requestBody.options.num_predict = config.numPredict;
102
+ }
103
+ else if (config?.maxTokens !== undefined) {
104
+ requestBody.options.num_predict = config.maxTokens;
105
+ }
106
+ if (config?.topP !== undefined) {
107
+ requestBody.options.top_p = config.topP;
108
+ }
109
+ if (config?.topK !== undefined) {
110
+ requestBody.options.top_k = config.topK;
111
+ }
112
+ if (config?.numCtx !== undefined) {
113
+ requestBody.options.num_ctx = config.numCtx;
114
+ }
115
+ if (config?.stop) {
116
+ requestBody.options.stop = config.stop;
117
+ }
118
+ if (ollamaTools && ollamaTools.length > 0) {
119
+ requestBody.tools = ollamaTools;
120
+ }
121
+ if (config?.responseFormat?.type === 'json_object') {
122
+ // Pass the schema to Ollama's format field for structured output
123
+ requestBody.format = config.responseFormat.schema || 'json';
124
+ }
125
+ const response = await fetch(`${this.baseUrl}/api/chat`, {
126
+ method: 'POST',
127
+ headers: {
128
+ 'Content-Type': 'application/json',
129
+ },
130
+ body: JSON.stringify(requestBody),
131
+ });
132
+ if (!response.ok) {
133
+ const errorText = await response.text();
134
+ yield (0, error_1.Err)(new error_1.GatewayError(`Ollama API error: ${response.status} ${response.statusText} - ${errorText}`, response.status));
135
+ return;
136
+ }
137
+ if (!response.body) {
138
+ yield (0, error_1.Err)(new error_1.GatewayError('No response body'));
139
+ return;
140
+ }
141
+ const reader = response.body.getReader();
142
+ const decoder = new TextDecoder();
143
+ let buffer = '';
144
+ while (true) {
145
+ const { done, value } = await reader.read();
146
+ if (done)
147
+ break;
148
+ buffer += decoder.decode(value, { stream: true });
149
+ const lines = buffer.split('\n');
150
+ buffer = lines.pop() || '';
151
+ for (const line of lines) {
152
+ if (line.trim()) {
153
+ try {
154
+ const data = JSON.parse(line);
155
+ const chunk = {
156
+ content: data.message?.content,
157
+ toolCalls: data.message?.tool_calls,
158
+ done: data.done,
159
+ };
160
+ if (data.done) {
161
+ chunk.finishReason = 'stop';
162
+ }
163
+ yield (0, error_1.Ok)(chunk);
164
+ }
165
+ catch (parseError) {
166
+ yield (0, error_1.Err)(new error_1.GatewayError(`Failed to parse stream chunk: ${parseError instanceof Error ? parseError.message : String(parseError)}`));
167
+ }
168
+ }
169
+ }
170
+ }
171
+ }
172
+ catch (error) {
173
+ yield (0, error_1.Err)(new error_1.GatewayError(`Failed to generate stream: ${error instanceof Error ? error.message : String(error)}`));
174
+ }
175
+ }
176
+ async listModels() {
177
+ try {
178
+ const response = await fetch(`${this.baseUrl}/api/tags`);
179
+ if (!response.ok) {
180
+ return (0, error_1.Err)(new error_1.GatewayError(`Ollama API error: ${response.status} ${response.statusText}`, response.status));
181
+ }
182
+ const data = (await response.json());
183
+ const modelNames = data.models.map((m) => m.name);
184
+ return (0, error_1.Ok)(modelNames);
185
+ }
186
+ catch (error) {
187
+ return (0, error_1.Err)(new error_1.GatewayError(`Failed to list models: ${error instanceof Error ? error.message : String(error)}`));
188
+ }
189
+ }
190
+ adaptMessages(messages) {
191
+ return messages.map((msg) => {
192
+ const ollamaMsg = {
193
+ role: msg.role,
194
+ content: typeof msg.content === 'string' ? msg.content : '',
195
+ };
196
+ // Handle array content (multimodal)
197
+ if (Array.isArray(msg.content)) {
198
+ const textParts = [];
199
+ const images = [];
200
+ for (const item of msg.content) {
201
+ if (item.type === 'text' && item.text) {
202
+ textParts.push(item.text);
203
+ }
204
+ else if (item.type === 'image_url' && item.image_url) {
205
+ // Ollama expects base64-encoded images
206
+ // If the URL is a data URI (data:image/...;base64,...), extract the base64 part
207
+ // If it's a file path, we need to read and encode it (handled in example)
208
+ const url = item.image_url.url;
209
+ if (url.startsWith('data:image')) {
210
+ // Extract base64 from data URI: data:image/jpeg;base64,<base64data>
211
+ const base64Part = url.split(',')[1];
212
+ if (base64Part) {
213
+ images.push(base64Part);
214
+ }
215
+ }
216
+ else {
217
+ // Assume it's already base64-encoded or will be handled by caller
218
+ images.push(url);
219
+ }
220
+ }
221
+ }
222
+ ollamaMsg.content = textParts.join('\n');
223
+ if (images.length > 0) {
224
+ ollamaMsg.images = images;
225
+ }
226
+ }
227
+ // Handle tool calls
228
+ if (msg.tool_calls) {
229
+ ollamaMsg.tool_calls = msg.tool_calls;
230
+ }
231
+ return ollamaMsg;
232
+ });
233
+ }
234
+ adaptTool(tool) {
235
+ return {
236
+ type: 'function',
237
+ function: {
238
+ name: tool.function.name,
239
+ description: tool.function.description,
240
+ parameters: tool.function.parameters,
241
+ },
242
+ };
243
+ }
244
+ async calculateEmbeddings(text, model) {
245
+ try {
246
+ const embeddingModel = model || 'nomic-embed-text';
247
+ const response = await fetch(`${this.baseUrl}/api/embeddings`, {
248
+ method: 'POST',
249
+ headers: {
250
+ 'Content-Type': 'application/json',
251
+ },
252
+ body: JSON.stringify({
253
+ model: embeddingModel,
254
+ prompt: text,
255
+ }),
256
+ });
257
+ if (!response.ok) {
258
+ const errorText = await response.text();
259
+ return (0, error_1.Err)(new error_1.GatewayError(`Ollama embeddings API error: ${response.status} ${response.statusText} - ${errorText}`, response.status));
260
+ }
261
+ const data = (await response.json());
262
+ return (0, error_1.Ok)(data.embedding);
263
+ }
264
+ catch (error) {
265
+ return (0, error_1.Err)(new error_1.GatewayError(`Failed to calculate embeddings: ${error instanceof Error ? error.message : String(error)}`));
266
+ }
267
+ }
268
+ async pullModel(modelName, onProgress) {
269
+ try {
270
+ const response = await fetch(`${this.baseUrl}/api/pull`, {
271
+ method: 'POST',
272
+ headers: {
273
+ 'Content-Type': 'application/json',
274
+ },
275
+ body: JSON.stringify({
276
+ name: modelName,
277
+ stream: true,
278
+ }),
279
+ });
280
+ if (!response.ok) {
281
+ const errorText = await response.text();
282
+ return (0, error_1.Err)(new error_1.GatewayError(`Ollama pull API error: ${response.status} ${response.statusText} - ${errorText}`, response.status));
283
+ }
284
+ if (!response.body) {
285
+ return (0, error_1.Err)(new error_1.GatewayError('No response body from pull endpoint'));
286
+ }
287
+ const reader = response.body.getReader();
288
+ const decoder = new TextDecoder();
289
+ let buffer = '';
290
+ let streamDone = false;
291
+ while (!streamDone) {
292
+ const { done, value } = await reader.read();
293
+ if (done) {
294
+ streamDone = true;
295
+ break;
296
+ }
297
+ buffer += decoder.decode(value, { stream: true });
298
+ const lines = buffer.split('\n');
299
+ buffer = lines.pop() || '';
300
+ for (const line of lines) {
301
+ if (line.trim()) {
302
+ try {
303
+ const progress = JSON.parse(line);
304
+ if (onProgress) {
305
+ onProgress(progress);
306
+ }
307
+ }
308
+ catch (parseError) {
309
+ return (0, error_1.Err)(new error_1.GatewayError(`Failed to parse pull progress: ${parseError instanceof Error ? parseError.message : String(parseError)}`));
310
+ }
311
+ }
312
+ }
313
+ }
314
+ return (0, error_1.Ok)(undefined);
315
+ }
316
+ catch (error) {
317
+ return (0, error_1.Err)(new error_1.GatewayError(`Failed to pull model: ${error instanceof Error ? error.message : String(error)}`));
318
+ }
319
+ }
320
+ }
321
+ exports.OllamaGateway = OllamaGateway;
322
+ //# sourceMappingURL=ollama.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ollama.js","sourceRoot":"","sources":["../../../src/llm/gateways/ollama.ts"],"names":[],"mappings":";AAAA;;GAEG;;;AAKH,uCAA4D;AAqD5D;;GAEG;AACH,MAAa,aAAa;IACP,OAAO,CAAS;IAEjC,YAAY,OAAgB;QAC1B,IAAI,CAAC,OAAO,GAAG,OAAO,IAAI,OAAO,CAAC,GAAG,CAAC,WAAW,IAAI,wBAAwB,CAAC;IAChF,CAAC;IAED,KAAK,CAAC,QAAQ,CACZ,KAAa,EACb,QAAsB,EACtB,MAAyB,EACzB,KAAwB;QAExB,IAAI,CAAC;YACH,MAAM,cAAc,GAAG,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC;YACpD,MAAM,WAAW,GAAG,KAAK,EAAE,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;YAE/C,MAAM,WAAW,GAA4B;gBAC3C,KAAK;gBACL,QAAQ,EAAE,cAAc;gBACxB,MAAM,EAAE,KAAK;gBACb,OAAO,EAAE,EAAE;aACZ,CAAC;YAEF,IAAI,MAAM,EAAE,WAAW,KAAK,SAAS,EAAE,CAAC;gBACrC,WAAW,CAAC,OAAmC,CAAC,WAAW,GAAG,MAAM,CAAC,WAAW,CAAC;YACpF,CAAC;YAED,yEAAyE;YACzE,IAAI,MAAM,EAAE,UAAU,KAAK,SAAS,EAAE,CAAC;gBACpC,WAAW,CAAC,OAAmC,CAAC,WAAW,GAAG,MAAM,CAAC,UAAU,CAAC;YACnF,CAAC;iBAAM,IAAI,MAAM,EAAE,SAAS,KAAK,SAAS,EAAE,CAAC;gBAC1C,WAAW,CAAC,OAAmC,CAAC,WAAW,GAAG,MAAM,CAAC,SAAS,CAAC;YAClF,CAAC;YAED,IAAI,MAAM,EAAE,IAAI,KAAK,SAAS,EAAE,CAAC;gBAC9B,WAAW,CAAC,OAAmC,CAAC,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC;YACvE,CAAC;YAED,IAAI,MAAM,EAAE,IAAI,KAAK,SAAS,EAAE,CAAC;gBAC9B,WAAW,CAAC,OAAmC,CAAC,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC;YACvE,CAAC;YAED,IAAI,MAAM,EAAE,MAAM,KAAK,SAAS,EAAE,CAAC;gBAChC,WAAW,CAAC,OAAmC,CAAC,OAAO,GAAG,MAAM,CAAC,MAAM,CAAC;YAC3E,CAAC;YAED,IAAI,MAAM,EAAE,IAAI,EAAE,CAAC;gBAChB,WAAW,CAAC,OAAmC,CAAC,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC;YACtE,CAAC;YAED,IAAI,WAAW,IAAI,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAC1C,WAAW,CAAC,KAAK,GAAG,WAAW,CAAC;YAClC,CAAC;YAED,IAAI,MAAM,EAAE,cAAc,EAAE,IAAI,KAAK,aAAa,EAAE,CAAC;gBACnD,iEAAiE;gBACjE,WAAW,CAAC,MAAM,GAAG,MAAM,CAAC,cAAc,CAAC,MAAM,IAAI,MAAM,CAAC;YAC9D,CAAC;YAED,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,IAAI,CAAC,OAAO,WAAW,EAAE;gBACvD,MAAM,EAAE,MAAM;gBACd,OAAO,EAAE;oBACP,cAAc,EAAE,kBAAkB;iBACnC;gBACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC;aAClC,CAAC,CAAC;YAEH,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;gBACjB,MAAM,SAAS,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;gBACxC,OAAO,IAAA,WAAG,EACR,IAAI,oBAAY,CACd,qBAAqB,QAAQ,CAAC,MAAM,IAAI,QAAQ,CAAC,UAAU,MAAM,SAAS,EAAE,EAC5E,QAAQ,CAAC,MAAM,CAChB,CACF,CAAC;YACJ,CAAC;YAED,MAAM,IAAI,GAAG,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAmB,CAAC;YAEvD,MAAM,eAAe,GAAoB;gBACvC,OAAO,EAAE,IAAI,CAAC,OAAO,CAAC,OAAO;gBAC7B,SAAS,EAAE,IAAI,CAAC,OAAO,CAAC,UAAU;gBAClC,YAAY,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS;gBAC5C,KAAK,EAAE,IAAI,CAAC,KAAK;aAClB,CAAC;YAEF,IAAI,IAAI,CAAC,iBAAiB,KAAK,SAAS,IAAI,IAAI,CAAC,UAAU,KAAK,SAAS,EAAE,CAAC;gBAC1E,eAAe,CAAC,KAAK,GAAG;oBACtB,YAAY,EAAE,IAAI,CAAC,iBAAiB;oBACpC,gBAAgB,EAAE,IAAI,CAAC,UAAU;oBACjC,WAAW,EAAE,IAAI,CAAC,iBAAiB,GAAG,IAAI,CAAC,UAAU;iBACtD,CAAC;YACJ,CAAC;YAED,OAAO,IAAA,UAAE,EAAC,eAAe,CAAC,CAAC;QAC7B,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,IAAA,WAAG,EACR,IAAI,oBAAY,CACd,kCAAkC,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAC3F,CACF,CAAC;QACJ,CAAC;IACH,CAAC;IAED,KAAK,CAAC,CAAC,cAAc,CACnB,KAAa,EACb,QAAsB,EACtB,MAAyB,EACzB,KAAwB;QAExB,IAAI,CAAC;YACH,MAAM,cAAc,GAAG,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC;YACpD,MAAM,WAAW,GAAG,KAAK,EAAE,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;YAE/C,MAAM,WAAW,GAA4B;gBAC3C,KAAK;gBACL,QAAQ,EAAE,cAAc;gBACxB,MAAM,EAAE,IAAI;gBACZ,OAAO,EAAE,EAAE;aACZ,CAAC;YAEF,IAAI,MAAM,EAAE,WAAW,KAAK,SAAS,EAAE,CAAC;gBACrC,WAAW,CAAC,OAAmC,CAAC,WAAW,GAAG,MAAM,CAAC,WAAW,CAAC;YACpF,CAAC;YAED,yEAAyE;YACzE,IAAI,MAAM,EAAE,UAAU,KAAK,SAAS,EAAE,CAAC;gBACpC,WAAW,CAAC,OAAmC,CAAC,WAAW,GAAG,MAAM,CAAC,UAAU,CAAC;YACnF,CAAC;iBAAM,IAAI,MAAM,EAAE,SAAS,KAAK,SAAS,EAAE,CAAC;gBAC1C,WAAW,CAAC,OAAmC,CAAC,WAAW,GAAG,MAAM,CAAC,SAAS,CAAC;YAClF,CAAC;YAED,IAAI,MAAM,EAAE,IAAI,KAAK,SAAS,EAAE,CAAC;gBAC9B,WAAW,CAAC,OAAmC,CAAC,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC;YACvE,CAAC;YAED,IAAI,MAAM,EAAE,IAAI,KAAK,SAAS,EAAE,CAAC;gBAC9B,WAAW,CAAC,OAAmC,CAAC,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC;YACvE,CAAC;YAED,IAAI,MAAM,EAAE,MAAM,KAAK,SAAS,EAAE,CAAC;gBAChC,WAAW,CAAC,OAAmC,CAAC,OAAO,GAAG,MAAM,CAAC,MAAM,CAAC;YAC3E,CAAC;YAED,IAAI,MAAM,EAAE,IAAI,EAAE,CAAC;gBAChB,WAAW,CAAC,OAAmC,CAAC,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC;YACtE,CAAC;YAED,IAAI,WAAW,IAAI,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAC1C,WAAW,CAAC,KAAK,GAAG,WAAW,CAAC;YAClC,CAAC;YAED,IAAI,MAAM,EAAE,cAAc,EAAE,IAAI,KAAK,aAAa,EAAE,CAAC;gBACnD,iEAAiE;gBACjE,WAAW,CAAC,MAAM,GAAG,MAAM,CAAC,cAAc,CAAC,MAAM,IAAI,MAAM,CAAC;YAC9D,CAAC;YAED,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,IAAI,CAAC,OAAO,WAAW,EAAE;gBACvD,MAAM,EAAE,MAAM;gBACd,OAAO,EAAE;oBACP,cAAc,EAAE,kBAAkB;iBACnC;gBACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC;aAClC,CAAC,CAAC;YAEH,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;gBACjB,MAAM,SAAS,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;gBACxC,MAAM,IAAA,WAAG,EACP,IAAI,oBAAY,CACd,qBAAqB,QAAQ,CAAC,MAAM,IAAI,QAAQ,CAAC,UAAU,MAAM,SAAS,EAAE,EAC5E,QAAQ,CAAC,MAAM,CAChB,CACF,CAAC;gBACF,OAAO;YACT,CAAC;YAED,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC;gBACnB,MAAM,IAAA,WAAG,EAAC,IAAI,oBAAY,CAAC,kBAAkB,CAAC,CAAC,CAAC;gBAChD,OAAO;YACT,CAAC;YAED,MAAM,MAAM,GAAG,QAAQ,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC;YACzC,MAAM,OAAO,GAAG,IAAI,WAAW,EAAE,CAAC;YAClC,IAAI,MAAM,GAAG,EAAE,CAAC;YAEhB,OAAO,IAAI,EAAE,CAAC;gBACZ,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,MAAM,MAAM,CAAC,IAAI,EAAE,CAAC;gBAE5C,IAAI,IAAI;oBAAE,MAAM;gBAEhB,MAAM,IAAI,OAAO,CAAC,MAAM,CAAC,KAAK,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;gBAClD,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;gBACjC,MAAM,GAAG,KAAK,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC;gBAE3B,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;oBACzB,IAAI,IAAI,CAAC,IAAI,EAAE,EAAE,CAAC;wBAChB,IAAI,CAAC;4BACH,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAyB,CAAC;4BACtD,MAAM,KAAK,GAAgB;gCACzB,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,OAAO;gCAC9B,SAAS,EAAE,IAAI,CAAC,OAAO,EAAE,UAAU;gCACnC,IAAI,EAAE,IAAI,CAAC,IAAI;6BAChB,CAAC;4BACF,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;gCACd,KAAK,CAAC,YAAY,GAAG,MAAM,CAAC;4BAC9B,CAAC;4BACD,MAAM,IAAA,UAAE,EAAC,KAAK,CAAC,CAAC;wBAClB,CAAC;wBAAC,OAAO,UAAU,EAAE,CAAC;4BACpB,MAAM,IAAA,WAAG,EACP,IAAI,oBAAY,CACd,iCAAiC,UAAU,YAAY,KAAK,CAAC,CAAC,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,UAAU,CAAC,EAAE,CACzG,CACF,CAAC;wBACJ,CAAC;oBACH,CAAC;gBACH,CAAC;YACH,CAAC;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,IAAA,WAAG,EACP,IAAI,oBAAY,CACd,8BAA8B,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CACvF,CACF,CAAC;QACJ,CAAC;IACH,CAAC;IAED,KAAK,CAAC,UAAU;QACd,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,IAAI,CAAC,OAAO,WAAW,CAAC,CAAC;YAEzD,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;gBACjB,OAAO,IAAA,WAAG,EACR,IAAI,oBAAY,CACd,qBAAqB,QAAQ,CAAC,MAAM,IAAI,QAAQ,CAAC,UAAU,EAAE,EAC7D,QAAQ,CAAC,MAAM,CAChB,CACF,CAAC;YACJ,CAAC;YAED,MAAM,IAAI,GAAG,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAwC,CAAC;YAC5E,MAAM,UAAU,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;YAElD,OAAO,IAAA,UAAE,EAAC,UAAU,CAAC,CAAC;QACxB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,IAAA,WAAG,EACR,IAAI,oBAAY,CACd,0BAA0B,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CACnF,CACF,CAAC;QACJ,CAAC;IACH,CAAC;IAEO,aAAa,CAAC,QAAsB;QAC1C,OAAO,QAAQ,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE;YAC1B,MAAM,SAAS,GAAkB;gBAC/B,IAAI,EAAE,GAAG,CAAC,IAAI;gBACd,OAAO,EAAE,OAAO,GAAG,CAAC,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE;aAC5D,CAAC;YAEF,oCAAoC;YACpC,IAAI,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC;gBAC/B,MAAM,SAAS,GAAa,EAAE,CAAC;gBAC/B,MAAM,MAAM,GAAa,EAAE,CAAC;gBAE5B,KAAK,MAAM,IAAI,IAAI,GAAG,CAAC,OAAO,EAAE,CAAC;oBAC/B,IAAI,IAAI,CAAC,IAAI,KAAK,MAAM,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;wBACtC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;oBAC5B,CAAC;yBAAM,IAAI,IAAI,CAAC,IAAI,KAAK,WAAW,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;wBACvD,uCAAuC;wBACvC,gFAAgF;wBAChF,0EAA0E;wBAC1E,MAAM,GAAG,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC;wBAC/B,IAAI,GAAG,CAAC,UAAU,CAAC,YAAY,CAAC,EAAE,CAAC;4BACjC,oEAAoE;4BACpE,MAAM,UAAU,GAAG,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;4BACrC,IAAI,UAAU,EAAE,CAAC;gCACf,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;4BAC1B,CAAC;wBACH,CAAC;6BAAM,CAAC;4BACN,kEAAkE;4BAClE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;wBACnB,CAAC;oBACH,CAAC;gBACH,CAAC;gBAED,SAAS,CAAC,OAAO,GAAG,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;gBACzC,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;oBACtB,SAAS,CAAC,MAAM,GAAG,MAAM,CAAC;gBAC5B,CAAC;YACH,CAAC;YAED,oBAAoB;YACpB,IAAI,GAAG,CAAC,UAAU,EAAE,CAAC;gBACnB,SAAS,CAAC,UAAU,GAAG,GAAG,CAAC,UAAU,CAAC;YACxC,CAAC;YAED,OAAO,SAAS,CAAC;QACnB,CAAC,CAAC,CAAC;IACL,CAAC;IAEO,SAAS,CAAC,IAAoB;QACpC,OAAO;YACL,IAAI,EAAE,UAAU;YAChB,QAAQ,EAAE;gBACR,IAAI,EAAE,IAAI,CAAC,QAAQ,CAAC,IAAI;gBACxB,WAAW,EAAE,IAAI,CAAC,QAAQ,CAAC,WAAW;gBACtC,UAAU,EAAE,IAAI,CAAC,QAAQ,CAAC,UAAU;aACrC;SACF,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,mBAAmB,CAAC,IAAY,EAAE,KAAc;QACpD,IAAI,CAAC;YACH,MAAM,cAAc,GAAG,KAAK,IAAI,kBAAkB,CAAC;YAEnD,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,IAAI,CAAC,OAAO,iBAAiB,EAAE;gBAC7D,MAAM,EAAE,MAAM;gBACd,OAAO,EAAE;oBACP,cAAc,EAAE,kBAAkB;iBACnC;gBACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;oBACnB,KAAK,EAAE,cAAc;oBACrB,MAAM,EAAE,IAAI;iBACb,CAAC;aACH,CAAC,CAAC;YAEH,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;gBACjB,MAAM,SAAS,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;gBACxC,OAAO,IAAA,WAAG,EACR,IAAI,oBAAY,CACd,gCAAgC,QAAQ,CAAC,MAAM,IAAI,QAAQ,CAAC,UAAU,MAAM,SAAS,EAAE,EACvF,QAAQ,CAAC,MAAM,CAChB,CACF,CAAC;YACJ,CAAC;YAED,MAAM,IAAI,GAAG,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAA4B,CAAC;YAEhE,OAAO,IAAA,UAAE,EAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QAC5B,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,IAAA,WAAG,EACR,IAAI,oBAAY,CACd,mCAAmC,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAC5F,CACF,CAAC;QACJ,CAAC;IACH,CAAC;IAED,KAAK,CAAC,SAAS,CACb,SAAiB,EACjB,UAAiC;QAEjC,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,IAAI,CAAC,OAAO,WAAW,EAAE;gBACvD,MAAM,EAAE,MAAM;gBACd,OAAO,EAAE;oBACP,cAAc,EAAE,kBAAkB;iBACnC;gBACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;oBACnB,IAAI,EAAE,SAAS;oBACf,MAAM,EAAE,IAAI;iBACb,CAAC;aACH,CAAC,CAAC;YAEH,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;gBACjB,MAAM,SAAS,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;gBACxC,OAAO,IAAA,WAAG,EACR,IAAI,oBAAY,CACd,0BAA0B,QAAQ,CAAC,MAAM,IAAI,QAAQ,CAAC,UAAU,MAAM,SAAS,EAAE,EACjF,QAAQ,CAAC,MAAM,CAChB,CACF,CAAC;YACJ,CAAC;YAED,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC;gBACnB,OAAO,IAAA,WAAG,EAAC,IAAI,oBAAY,CAAC,qCAAqC,CAAC,CAAC,CAAC;YACtE,CAAC;YAED,MAAM,MAAM,GAAG,QAAQ,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC;YACzC,MAAM,OAAO,GAAG,IAAI,WAAW,EAAE,CAAC;YAClC,IAAI,MAAM,GAAG,EAAE,CAAC;YAChB,IAAI,UAAU,GAAG,KAAK,CAAC;YAEvB,OAAO,CAAC,UAAU,EAAE,CAAC;gBACnB,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,MAAM,MAAM,CAAC,IAAI,EAAE,CAAC;gBAE5C,IAAI,IAAI,EAAE,CAAC;oBACT,UAAU,GAAG,IAAI,CAAC;oBAClB,MAAM;gBACR,CAAC;gBAED,MAAM,IAAI,OAAO,CAAC,MAAM,CAAC,KAAK,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;gBAClD,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;gBACjC,MAAM,GAAG,KAAK,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC;gBAE3B,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;oBACzB,IAAI,IAAI,CAAC,IAAI,EAAE,EAAE,CAAC;wBAChB,IAAI,CAAC;4BACH,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAuB,CAAC;4BACxD,IAAI,UAAU,EAAE,CAAC;gCACf,UAAU,CAAC,QAAQ,CAAC,CAAC;4BACvB,CAAC;wBACH,CAAC;wBAAC,OAAO,UAAU,EAAE,CAAC;4BACpB,OAAO,IAAA,WAAG,EACR,IAAI,oBAAY,CACd,kCAAkC,UAAU,YAAY,KAAK,CAAC,CAAC,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,UAAU,CAAC,EAAE,CAC1G,CACF,CAAC;wBACJ,CAAC;oBACH,CAAC;gBACH,CAAC;YACH,CAAC;YAED,OAAO,IAAA,UAAE,EAAC,SAAS,CAAC,CAAC;QACvB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,IAAA,WAAG,EACR,IAAI,oBAAY,CACd,yBAAyB,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAClF,CACF,CAAC;QACJ,CAAC;IACH,CAAC;CACF;AAvaD,sCAuaC"}
@@ -0,0 +1,29 @@
1
+ /**
2
+ * Adapter for converting LLM messages to OpenAI format.
3
+ */
4
+ import { LlmMessage } from '../models';
5
+ interface OpenAIMessage {
6
+ role: string;
7
+ content: string | Array<{
8
+ type: string;
9
+ text?: string;
10
+ image_url?: {
11
+ url: string;
12
+ };
13
+ }>;
14
+ tool_calls?: Array<{
15
+ id: string;
16
+ type: 'function';
17
+ function: {
18
+ name: string;
19
+ arguments: string;
20
+ };
21
+ }>;
22
+ tool_call_id?: string;
23
+ }
24
+ /**
25
+ * Adapt LLM messages to OpenAI format.
26
+ */
27
+ export declare function adaptMessagesToOpenAI(messages: LlmMessage[]): OpenAIMessage[];
28
+ export {};
29
+ //# sourceMappingURL=openai-messages-adapter.d.ts.map