universal-llm-client 3.1.0 → 4.1.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 (135) hide show
  1. package/CHANGELOG.md +39 -0
  2. package/README.md +177 -0
  3. package/dist/ai-model.d.ts +87 -0
  4. package/dist/ai-model.d.ts.map +1 -1
  5. package/dist/ai-model.js +99 -0
  6. package/dist/ai-model.js.map +1 -1
  7. package/dist/auditor.d.ts +5 -1
  8. package/dist/auditor.d.ts.map +1 -1
  9. package/dist/auditor.js +9 -0
  10. package/dist/auditor.js.map +1 -1
  11. package/dist/client.d.ts +14 -0
  12. package/dist/client.d.ts.map +1 -1
  13. package/dist/client.js +60 -0
  14. package/dist/client.js.map +1 -1
  15. package/dist/http.d.ts +2 -0
  16. package/dist/http.d.ts.map +1 -1
  17. package/dist/http.js +1 -0
  18. package/dist/http.js.map +1 -1
  19. package/dist/index.d.ts +3 -2
  20. package/dist/index.d.ts.map +1 -1
  21. package/dist/index.js +12 -2
  22. package/dist/index.js.map +1 -1
  23. package/dist/interfaces.d.ts +186 -6
  24. package/dist/interfaces.d.ts.map +1 -1
  25. package/dist/interfaces.js +14 -0
  26. package/dist/interfaces.js.map +1 -1
  27. package/dist/providers/anthropic.d.ts +56 -0
  28. package/dist/providers/anthropic.d.ts.map +1 -0
  29. package/dist/providers/anthropic.js +524 -0
  30. package/dist/providers/anthropic.js.map +1 -0
  31. package/dist/providers/google.d.ts +5 -0
  32. package/dist/providers/google.d.ts.map +1 -1
  33. package/dist/providers/google.js +81 -4
  34. package/dist/providers/google.js.map +1 -1
  35. package/dist/providers/index.d.ts +1 -0
  36. package/dist/providers/index.d.ts.map +1 -1
  37. package/dist/providers/index.js +1 -0
  38. package/dist/providers/index.js.map +1 -1
  39. package/dist/providers/ollama.d.ts +13 -1
  40. package/dist/providers/ollama.d.ts.map +1 -1
  41. package/dist/providers/ollama.js +72 -10
  42. package/dist/providers/ollama.js.map +1 -1
  43. package/dist/providers/openai.d.ts +4 -0
  44. package/dist/providers/openai.d.ts.map +1 -1
  45. package/dist/providers/openai.js +53 -1
  46. package/dist/providers/openai.js.map +1 -1
  47. package/dist/router.d.ts +50 -0
  48. package/dist/router.d.ts.map +1 -1
  49. package/dist/router.js +319 -0
  50. package/dist/router.js.map +1 -1
  51. package/dist/stream-decoder.d.ts +29 -2
  52. package/dist/stream-decoder.d.ts.map +1 -1
  53. package/dist/stream-decoder.js +39 -11
  54. package/dist/stream-decoder.js.map +1 -1
  55. package/dist/structured-output.d.ts +370 -0
  56. package/dist/structured-output.d.ts.map +1 -0
  57. package/dist/structured-output.js +397 -0
  58. package/dist/structured-output.js.map +1 -0
  59. package/dist/zod-adapter.d.ts +44 -0
  60. package/dist/zod-adapter.d.ts.map +1 -0
  61. package/dist/zod-adapter.js +61 -0
  62. package/dist/zod-adapter.js.map +1 -0
  63. package/package.json +23 -4
  64. package/src/ai-model.ts +350 -0
  65. package/src/auditor.ts +213 -0
  66. package/src/client.ts +402 -0
  67. package/src/debug/debug-google-streaming.ts +97 -0
  68. package/src/debug/debug-tool-execution.ts +86 -0
  69. package/src/debug/test-lmstudio-tools.ts +155 -0
  70. package/src/demos/README.md +47 -0
  71. package/src/demos/basic/universal-llm-examples.ts +161 -0
  72. package/src/demos/mcp/astrid-memory-demo.ts +295 -0
  73. package/src/demos/mcp/astrid-persona-memory.ts +357 -0
  74. package/src/demos/mcp/mcp-mongodb-demo.ts +275 -0
  75. package/src/demos/mcp/simple-astrid-memory.ts +148 -0
  76. package/src/demos/mcp/simple-mcp-demo.ts +68 -0
  77. package/src/demos/mcp/working-mcp-demo.ts +62 -0
  78. package/src/demos/model-alias-demo.ts +0 -0
  79. package/src/demos/tools/RAG_MEMORY_INTEGRATION.md +267 -0
  80. package/src/demos/tools/astrid-memory-demo.ts +270 -0
  81. package/src/demos/tools/astrid-production-memory-clean.ts +785 -0
  82. package/src/demos/tools/astrid-production-memory.ts +558 -0
  83. package/src/demos/tools/basic-translation-test.ts +66 -0
  84. package/src/demos/tools/chromadb-similarity-tuning.ts +390 -0
  85. package/src/demos/tools/clean-multilingual-conversation.ts +209 -0
  86. package/src/demos/tools/clean-translation-test.ts +119 -0
  87. package/src/demos/tools/clean-universal-multilingual-test.ts +131 -0
  88. package/src/demos/tools/complete-rag-demo.ts +369 -0
  89. package/src/demos/tools/complete-tool-demo.ts +132 -0
  90. package/src/demos/tools/demo-tool-calling.ts +124 -0
  91. package/src/demos/tools/dynamic-language-switching-test.ts +251 -0
  92. package/src/demos/tools/hybrid-thinking-test.ts +154 -0
  93. package/src/demos/tools/memory-integration-test.ts +420 -0
  94. package/src/demos/tools/multilingual-memory-system.ts +802 -0
  95. package/src/demos/tools/ondemand-translation-demo.ts +655 -0
  96. package/src/demos/tools/production-tool-demo.ts +245 -0
  97. package/src/demos/tools/revolutionary-multilingual-test.ts +151 -0
  98. package/src/demos/tools/rigorous-language-analysis.ts +218 -0
  99. package/src/demos/tools/test-universal-memory-system.ts +126 -0
  100. package/src/demos/tools/translation-integration-guide.ts +346 -0
  101. package/src/demos/tools/universal-memory-system.ts +560 -0
  102. package/src/http.ts +247 -0
  103. package/src/index.ts +160 -0
  104. package/src/interfaces.ts +657 -0
  105. package/src/mcp.ts +345 -0
  106. package/src/providers/anthropic.ts +762 -0
  107. package/src/providers/google.ts +620 -0
  108. package/src/providers/index.ts +8 -0
  109. package/src/providers/ollama.ts +469 -0
  110. package/src/providers/openai.ts +392 -0
  111. package/src/router.ts +780 -0
  112. package/src/stream-decoder.ts +361 -0
  113. package/src/structured-output.ts +702 -0
  114. package/src/test-scripts/test-advanced-tools.ts +310 -0
  115. package/src/test-scripts/test-google-streaming-enhanced.ts +147 -0
  116. package/src/test-scripts/test-google-streaming.ts +63 -0
  117. package/src/test-scripts/test-google-system-prompt-comprehensive.ts +189 -0
  118. package/src/test-scripts/test-mcp-config.ts +28 -0
  119. package/src/test-scripts/test-mcp-connection.ts +29 -0
  120. package/src/test-scripts/test-system-message-positions.ts +163 -0
  121. package/src/test-scripts/test-system-prompt-improvement-demo.ts +83 -0
  122. package/src/test-scripts/test-tool-calling.ts +231 -0
  123. package/src/tests/ai-model.test.ts +1614 -0
  124. package/src/tests/auditor.test.ts +224 -0
  125. package/src/tests/http.test.ts +200 -0
  126. package/src/tests/interfaces.test.ts +117 -0
  127. package/src/tests/providers/google.test.ts +660 -0
  128. package/src/tests/providers/ollama.test.ts +954 -0
  129. package/src/tests/providers/openai.test.ts +1122 -0
  130. package/src/tests/router.test.ts +254 -0
  131. package/src/tests/stream-decoder.test.ts +179 -0
  132. package/src/tests/structured-output.test.ts +1340 -0
  133. package/src/tests/tools.test.ts +175 -0
  134. package/src/tools.ts +246 -0
  135. package/src/zod-adapter.ts +72 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"anthropic.d.ts","sourceRoot":"","sources":["../../src/providers/anthropic.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAG7C,OAAO,KAAK,EACR,gBAAgB,EAChB,cAAc,EACd,eAAe,EAGf,WAAW,EAEX,aAAa,EAGhB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACzD,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AA8J7C,qBAAa,eAAgB,SAAQ,aAAa;IAC9C,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;gBAErB,OAAO,EAAE,gBAAgB,EAAE,OAAO,CAAC,EAAE,OAAO;IAUxD,OAAO,CAAC,qBAAqB;IAed,IAAI,CACf,QAAQ,EAAE,cAAc,EAAE,EAC1B,OAAO,CAAC,EAAE,WAAW,GACtB,OAAO,CAAC,eAAe,CAAC;IAsCX,UAAU,CACtB,QAAQ,EAAE,cAAc,EAAE,EAC1B,OAAO,CAAC,EAAE,WAAW,GACtB,cAAc,CAAC,YAAY,EAAE,eAAe,GAAG,IAAI,EAAE,OAAO,CAAC;IAoKjD,KAAK,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IAQvC,SAAS,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;IAoB9B,YAAY,CAAC,UAAU,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC;IAyBxE,OAAO,CAAC,gBAAgB;IAiDxB;;;;;;OAMG;IACH,OAAO,CAAC,eAAe;IA2EvB;;OAEG;IACH,OAAO,CAAC,kBAAkB;IA0C1B;;;OAGG;IACH,OAAO,CAAC,iBAAiB;IAkCzB;;OAEG;IACH,OAAO,CAAC,sBAAsB;IA4C9B,gEAAgE;IAChE,OAAO,CAAC,cAAc;IAYtB,2CAA2C;IAC3C,OAAO,CAAC,WAAW;CAOtB"}
@@ -0,0 +1,524 @@
1
+ /**
2
+ * Universal LLM Client v3 — Anthropic Messages API Provider
3
+ *
4
+ * Implements BaseLLMClient for Anthropic's Messages API (Claude).
5
+ * Uses the custom Anthropic protocol — NOT OpenAI-compatible.
6
+ *
7
+ * Key differences from OpenAI:
8
+ * - Endpoint: POST /v1/messages (not /chat/completions)
9
+ * - Auth: x-api-key header (not Authorization: Bearer)
10
+ * - System prompt: top-level `system` field, not a message
11
+ * - Messages: content is always an array of content blocks
12
+ * - Tool calls: `tool_use` content blocks (not tool_calls array)
13
+ * - Tool results: `tool_result` content blocks in user messages
14
+ * - Streaming: content_block_start/delta/stop events with typed deltas
15
+ */
16
+ import { BaseLLMClient } from '../client.js';
17
+ import { httpRequest, httpStream, parseSSE } from '../http.js';
18
+ import { StandardChatDecoder } from '../stream-decoder.js';
19
+ // ============================================================================
20
+ // Anthropic Client
21
+ // ============================================================================
22
+ export class AnthropicClient extends BaseLLMClient {
23
+ baseUrl;
24
+ constructor(options, auditor) {
25
+ const url = (options.url || 'https://api.anthropic.com').replace(/\/+$/, '');
26
+ super({ ...options, url }, auditor);
27
+ this.baseUrl = url;
28
+ }
29
+ // ========================================================================
30
+ // Headers
31
+ // ========================================================================
32
+ buildAnthropicHeaders() {
33
+ const headers = {
34
+ 'Content-Type': 'application/json',
35
+ 'anthropic-version': '2023-06-01',
36
+ };
37
+ if (this.options.apiKey) {
38
+ headers['x-api-key'] = this.options.apiKey;
39
+ }
40
+ return headers;
41
+ }
42
+ // ========================================================================
43
+ // Chat (non-streaming)
44
+ // ========================================================================
45
+ async chat(messages, options) {
46
+ const url = `${this.baseUrl}/v1/messages`;
47
+ const body = this.buildRequestBody(messages, options, false);
48
+ const start = Date.now();
49
+ this.auditor.record({
50
+ timestamp: start,
51
+ type: 'request',
52
+ provider: 'anthropic',
53
+ model: this.options.model,
54
+ });
55
+ const response = await httpRequest(url, {
56
+ method: 'POST',
57
+ headers: this.buildAnthropicHeaders(),
58
+ body,
59
+ timeout: this.options.timeout ?? 60000,
60
+ });
61
+ const data = response.data;
62
+ const result = this.parseAnthropicResponse(data);
63
+ this.auditor.record({
64
+ timestamp: Date.now(),
65
+ type: 'response',
66
+ provider: 'anthropic',
67
+ model: this.options.model,
68
+ duration: Date.now() - start,
69
+ usage: result.usage,
70
+ });
71
+ return result;
72
+ }
73
+ // ========================================================================
74
+ // Streaming
75
+ // ========================================================================
76
+ async *chatStream(messages, options) {
77
+ const url = `${this.baseUrl}/v1/messages`;
78
+ const body = this.buildRequestBody(messages, options, true);
79
+ const start = Date.now();
80
+ this.auditor.record({
81
+ timestamp: start,
82
+ type: 'stream_start',
83
+ provider: 'anthropic',
84
+ model: this.options.model,
85
+ });
86
+ const decoder = new StandardChatDecoder(() => { });
87
+ // Track content blocks as they stream in
88
+ const contentBlocks = new Map();
89
+ let usage;
90
+ let inputTokens = 0;
91
+ const stream = httpStream(url, {
92
+ method: 'POST',
93
+ headers: this.buildAnthropicHeaders(),
94
+ body,
95
+ timeout: this.options.timeout ?? 120000,
96
+ });
97
+ for await (const { data } of parseSSE(stream)) {
98
+ try {
99
+ const event = JSON.parse(data);
100
+ switch (event.type) {
101
+ case 'message_start': {
102
+ inputTokens = event.message.usage?.input_tokens ?? 0;
103
+ break;
104
+ }
105
+ case 'content_block_start': {
106
+ const block = event.content_block;
107
+ if (block.type === 'text') {
108
+ contentBlocks.set(event.index, { type: 'text', text: '' });
109
+ }
110
+ else if (block.type === 'tool_use') {
111
+ contentBlocks.set(event.index, {
112
+ type: 'tool_use',
113
+ text: '',
114
+ toolId: block.id,
115
+ toolName: block.name,
116
+ inputJson: '',
117
+ });
118
+ }
119
+ else if (block.type === 'thinking') {
120
+ contentBlocks.set(event.index, { type: 'thinking', text: '', thinking: '' });
121
+ }
122
+ break;
123
+ }
124
+ case 'content_block_delta': {
125
+ const block = contentBlocks.get(event.index);
126
+ if (!block)
127
+ break;
128
+ if (event.delta.type === 'text_delta') {
129
+ block.text += event.delta.text;
130
+ decoder.push(event.delta.text);
131
+ yield { type: 'text', content: event.delta.text };
132
+ }
133
+ else if (event.delta.type === 'input_json_delta') {
134
+ block.inputJson = (block.inputJson ?? '') + event.delta.partial_json;
135
+ }
136
+ else if (event.delta.type === 'thinking_delta') {
137
+ block.thinking = (block.thinking ?? '') + event.delta.thinking;
138
+ decoder.pushReasoning(event.delta.thinking);
139
+ yield { type: 'thinking', content: event.delta.thinking };
140
+ }
141
+ else if (event.delta.type === 'signature_delta') {
142
+ block.signature = event.delta.signature;
143
+ }
144
+ break;
145
+ }
146
+ case 'content_block_stop': {
147
+ const block = contentBlocks.get(event.index);
148
+ if (block?.type === 'tool_use' && block.toolId && block.toolName) {
149
+ // Parse accumulated JSON and emit tool call
150
+ const toolCall = {
151
+ id: block.toolId,
152
+ type: 'function',
153
+ function: {
154
+ name: block.toolName,
155
+ arguments: block.inputJson ?? '{}',
156
+ },
157
+ };
158
+ yield { type: 'tool_call', calls: [toolCall] };
159
+ }
160
+ break;
161
+ }
162
+ case 'message_delta': {
163
+ const outputTokens = event.usage?.output_tokens ?? 0;
164
+ usage = {
165
+ inputTokens,
166
+ outputTokens,
167
+ totalTokens: inputTokens + outputTokens,
168
+ };
169
+ break;
170
+ }
171
+ case 'error': {
172
+ throw new Error(`Anthropic stream error: ${event.error.type} — ${event.error.message}`);
173
+ }
174
+ }
175
+ }
176
+ catch (e) {
177
+ if (e instanceof Error && e.message.startsWith('Anthropic stream error')) {
178
+ throw e;
179
+ }
180
+ // Skip unparseable SSE data
181
+ }
182
+ }
183
+ decoder.flush();
184
+ this.auditor.record({
185
+ timestamp: Date.now(),
186
+ type: 'stream_end',
187
+ provider: 'anthropic',
188
+ model: this.options.model,
189
+ duration: Date.now() - start,
190
+ usage,
191
+ });
192
+ // Build final tool calls from accumulated content blocks
193
+ const toolCalls = [];
194
+ for (const block of contentBlocks.values()) {
195
+ if (block.type === 'tool_use' && block.toolId && block.toolName) {
196
+ toolCalls.push({
197
+ id: block.toolId,
198
+ type: 'function',
199
+ function: {
200
+ name: block.toolName,
201
+ arguments: block.inputJson ?? '{}',
202
+ },
203
+ });
204
+ }
205
+ }
206
+ return {
207
+ message: {
208
+ role: 'assistant',
209
+ content: decoder.getCleanContent(),
210
+ tool_calls: toolCalls.length > 0 ? toolCalls : undefined,
211
+ },
212
+ reasoning: decoder.getReasoning(),
213
+ usage,
214
+ provider: 'anthropic',
215
+ };
216
+ }
217
+ // ========================================================================
218
+ // Embeddings (not supported by Anthropic)
219
+ // ========================================================================
220
+ async embed(_text) {
221
+ throw new Error('Anthropic does not support embeddings. Use a different provider.');
222
+ }
223
+ // ========================================================================
224
+ // Model Discovery
225
+ // ========================================================================
226
+ async getModels() {
227
+ const url = `${this.baseUrl}/v1/models`;
228
+ try {
229
+ const response = await httpRequest(url, {
230
+ headers: this.buildAnthropicHeaders(),
231
+ timeout: 5000,
232
+ });
233
+ return response.data.data.map(m => m.id);
234
+ }
235
+ catch {
236
+ // Fallback: return well-known Claude models
237
+ return [
238
+ 'claude-sonnet-4-20250514',
239
+ 'claude-haiku-4-20250514',
240
+ 'claude-opus-4-20250514',
241
+ ];
242
+ }
243
+ }
244
+ async getModelInfo(_modelName) {
245
+ // Claude models support large context windows
246
+ const model = _modelName ?? this.options.model;
247
+ // Claude 4 models have 200K context
248
+ if (model.includes('claude-4') || model.includes('claude-opus') ||
249
+ model.includes('claude-sonnet') || model.includes('claude-haiku')) {
250
+ return {
251
+ model,
252
+ contextLength: 200_000,
253
+ capabilities: ['tools', 'vision', 'thinking'],
254
+ };
255
+ }
256
+ return {
257
+ model,
258
+ contextLength: 200_000,
259
+ capabilities: ['tools', 'vision'],
260
+ };
261
+ }
262
+ // ========================================================================
263
+ // Internal: Request Building
264
+ // ========================================================================
265
+ buildRequestBody(messages, options, stream) {
266
+ // Extract system prompt from messages
267
+ const systemMessages = messages.filter(m => m.role === 'system');
268
+ const nonSystemMessages = messages.filter(m => m.role !== 'system');
269
+ const systemPrompt = systemMessages.length > 0
270
+ ? systemMessages
271
+ .map(m => typeof m.content === 'string' ? m.content : this.extractText(m.content))
272
+ .join('\n\n')
273
+ : undefined;
274
+ // Convert tools from OpenAI format to Anthropic format
275
+ const tools = options?.tools ?? (Object.keys(this.toolRegistry).length > 0 ? this.getToolDefinitions() : undefined);
276
+ const anthropicTools = tools?.map(t => this.convertToolDef(t));
277
+ // Map tool_choice
278
+ let toolChoice;
279
+ if (options?.toolChoice === 'required') {
280
+ toolChoice = { type: 'any' };
281
+ }
282
+ else if (options?.toolChoice === 'none') {
283
+ toolChoice = { type: 'auto' }; // Anthropic doesn't have 'none', closest is 'auto'
284
+ }
285
+ else if (options?.toolChoice === 'auto') {
286
+ toolChoice = { type: 'auto' };
287
+ }
288
+ const body = {
289
+ model: this.options.model,
290
+ messages: this.convertMessages(nonSystemMessages),
291
+ max_tokens: options?.maxTokens ?? 4096,
292
+ ...(systemPrompt && { system: systemPrompt }),
293
+ ...(anthropicTools?.length && { tools: anthropicTools }),
294
+ ...(toolChoice && { tool_choice: toolChoice }),
295
+ ...(stream && { stream: true }),
296
+ ...(options?.temperature !== undefined && { temperature: options.temperature }),
297
+ };
298
+ return body;
299
+ }
300
+ // ========================================================================
301
+ // Internal: Message Conversion
302
+ // ========================================================================
303
+ /**
304
+ * Convert our canonical LLMChatMessage[] to Anthropic's message format.
305
+ * Key conversions:
306
+ * - 'tool' role messages → merged into preceding user message as tool_result blocks
307
+ * - assistant messages with tool_calls → assistant message with tool_use blocks
308
+ * - multimodal content → Anthropic image blocks
309
+ */
310
+ convertMessages(messages) {
311
+ const result = [];
312
+ for (let i = 0; i < messages.length; i++) {
313
+ const msg = messages[i];
314
+ if (msg.role === 'assistant') {
315
+ // Build content blocks for assistant
316
+ const blocks = [];
317
+ // Add text content if present
318
+ const text = typeof msg.content === 'string'
319
+ ? msg.content
320
+ : this.extractText(msg.content);
321
+ if (text) {
322
+ blocks.push({ type: 'text', text });
323
+ }
324
+ // Convert tool_calls to tool_use blocks
325
+ if (msg.tool_calls) {
326
+ for (const tc of msg.tool_calls) {
327
+ let input = {};
328
+ try {
329
+ input = JSON.parse(tc.function.arguments);
330
+ }
331
+ catch {
332
+ // Keep empty object if parse fails
333
+ }
334
+ blocks.push({
335
+ type: 'tool_use',
336
+ id: tc.id,
337
+ name: tc.function.name,
338
+ input,
339
+ });
340
+ }
341
+ }
342
+ if (blocks.length > 0) {
343
+ result.push({ role: 'assistant', content: blocks });
344
+ }
345
+ }
346
+ else if (msg.role === 'tool') {
347
+ // Anthropic needs tool results inside user messages
348
+ const toolResultBlock = {
349
+ type: 'tool_result',
350
+ tool_call_id: msg.tool_call_id ?? '',
351
+ content: typeof msg.content === 'string'
352
+ ? msg.content
353
+ : this.extractText(msg.content),
354
+ };
355
+ // Collect consecutive tool results
356
+ const toolResults = [toolResultBlock];
357
+ while (i + 1 < messages.length && messages[i + 1].role === 'tool') {
358
+ i++;
359
+ const nextMsg = messages[i];
360
+ toolResults.push({
361
+ type: 'tool_result',
362
+ tool_call_id: nextMsg.tool_call_id ?? '',
363
+ content: typeof nextMsg.content === 'string'
364
+ ? nextMsg.content
365
+ : this.extractText(nextMsg.content),
366
+ });
367
+ }
368
+ result.push({ role: 'user', content: toolResults });
369
+ }
370
+ else if (msg.role === 'user') {
371
+ const blocks = this.convertUserContent(msg.content);
372
+ result.push({ role: 'user', content: blocks });
373
+ }
374
+ }
375
+ // Anthropic requires alternating user/assistant messages.
376
+ // Merge consecutive same-role messages if needed.
377
+ return this.ensureAlternating(result);
378
+ }
379
+ /**
380
+ * Convert user message content (string or multimodal) to Anthropic blocks.
381
+ */
382
+ convertUserContent(content) {
383
+ if (typeof content === 'string') {
384
+ return [{ type: 'text', text: content }];
385
+ }
386
+ const blocks = [];
387
+ for (const part of content) {
388
+ if (part.type === 'text') {
389
+ blocks.push({ type: 'text', text: part.text });
390
+ }
391
+ else if (part.type === 'audio') {
392
+ // Anthropic does not yet support audio input — skip silently
393
+ this.debugLog('[Anthropic] Audio content dropped — not supported');
394
+ }
395
+ else if (part.type === 'image_url') {
396
+ const url = part.image_url.url;
397
+ if (url.startsWith('data:')) {
398
+ // Extract base64 data from data URI
399
+ const match = url.match(/^data:([^;]+);base64,(.+)$/);
400
+ if (match) {
401
+ blocks.push({
402
+ type: 'image',
403
+ source: {
404
+ type: 'base64',
405
+ media_type: match[1],
406
+ data: match[2],
407
+ },
408
+ });
409
+ }
410
+ }
411
+ else {
412
+ // URL-based image
413
+ blocks.push({
414
+ type: 'image',
415
+ source: {
416
+ type: 'url',
417
+ url,
418
+ },
419
+ });
420
+ }
421
+ }
422
+ }
423
+ return blocks.length > 0 ? blocks : [{ type: 'text', text: '' }];
424
+ }
425
+ /**
426
+ * Ensure messages alternate between user and assistant roles.
427
+ * Anthropic requires strict alternation. Merge consecutive same-role messages.
428
+ */
429
+ ensureAlternating(messages) {
430
+ if (messages.length <= 1)
431
+ return messages;
432
+ const merged = [messages[0]];
433
+ for (let i = 1; i < messages.length; i++) {
434
+ const current = messages[i];
435
+ const last = merged[merged.length - 1];
436
+ if (current.role === last.role) {
437
+ // Merge content arrays
438
+ const lastContent = Array.isArray(last.content)
439
+ ? last.content
440
+ : [{ type: 'text', text: last.content }];
441
+ const currentContent = Array.isArray(current.content)
442
+ ? current.content
443
+ : [{ type: 'text', text: current.content }];
444
+ merged[merged.length - 1] = {
445
+ role: current.role,
446
+ content: [...lastContent, ...currentContent],
447
+ };
448
+ }
449
+ else {
450
+ merged.push(current);
451
+ }
452
+ }
453
+ return merged;
454
+ }
455
+ // ========================================================================
456
+ // Internal: Response Parsing
457
+ // ========================================================================
458
+ /**
459
+ * Parse Anthropic's response format into our canonical LLMChatResponse.
460
+ */
461
+ parseAnthropicResponse(data) {
462
+ let textContent = '';
463
+ let reasoning;
464
+ const toolCalls = [];
465
+ for (const block of data.content) {
466
+ if (block.type === 'text') {
467
+ textContent += block.text;
468
+ }
469
+ else if (block.type === 'tool_use') {
470
+ toolCalls.push({
471
+ id: block.id,
472
+ type: 'function',
473
+ function: {
474
+ name: block.name,
475
+ arguments: JSON.stringify(block.input),
476
+ },
477
+ });
478
+ }
479
+ else if (block.type === 'thinking') {
480
+ reasoning = (reasoning ?? '') + block.thinking;
481
+ }
482
+ }
483
+ const usage = {
484
+ inputTokens: data.usage.input_tokens,
485
+ outputTokens: data.usage.output_tokens,
486
+ totalTokens: data.usage.input_tokens + data.usage.output_tokens,
487
+ };
488
+ return {
489
+ message: {
490
+ role: 'assistant',
491
+ content: textContent,
492
+ tool_calls: toolCalls.length > 0 ? toolCalls : undefined,
493
+ },
494
+ reasoning,
495
+ usage,
496
+ provider: 'anthropic',
497
+ };
498
+ }
499
+ // ========================================================================
500
+ // Internal: Helpers
501
+ // ========================================================================
502
+ /** Convert OpenAI-format tool definition to Anthropic format */
503
+ convertToolDef(tool) {
504
+ return {
505
+ name: tool.function.name,
506
+ description: tool.function.description,
507
+ input_schema: {
508
+ type: 'object',
509
+ properties: tool.function.parameters.properties,
510
+ required: tool.function.parameters.required,
511
+ },
512
+ };
513
+ }
514
+ /** Extract text from multimodal content */
515
+ extractText(content) {
516
+ if (typeof content === 'string')
517
+ return content;
518
+ return content
519
+ .filter((p) => p.type === 'text')
520
+ .map(p => p.text)
521
+ .join('');
522
+ }
523
+ }
524
+ //# sourceMappingURL=anthropic.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"anthropic.js","sourceRoot":"","sources":["../../src/providers/anthropic.ts"],"names":[],"mappings":"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"}
@@ -29,5 +29,10 @@ export declare class GoogleClient extends BaseLLMClient {
29
29
  private convertToGoogleTool;
30
30
  private convertFunctionCallToToolCall;
31
31
  private parseGoogleResponse;
32
+ /**
33
+ * Retry HTTP requests for Flex tier when receiving 503/429 errors.
34
+ * Uses exponential backoff (5s → 10s → 20s) as recommended by Google.
35
+ */
36
+ private fetchWithFlexRetry;
32
37
  }
33
38
  //# sourceMappingURL=google.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"google.d.ts","sourceRoot":"","sources":["../../src/providers/google.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAG7C,OAAO,KAAK,EACR,gBAAgB,EAChB,cAAc,EACd,eAAe,EACf,WAAW,EAYd,MAAM,kBAAkB,CAAC;AAC1B,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACzD,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AAE7C,qBAAa,YAAa,SAAQ,aAAa;IAC3C,OAAO,CAAC,QAAQ,CAAU;IAC1B,OAAO,CAAC,UAAU,CAAS;gBAEf,OAAO,EAAE,gBAAgB,EAAE,OAAO,CAAC,EAAE,OAAO;IAUxD,OAAO,CAAC,UAAU;IASlB,OAAO,CAAC,UAAU;IAQlB,OAAO,CAAC,YAAY;IAQpB,OAAO,CAAC,WAAW;IAQnB,OAAO,CAAC,UAAU;IAcZ,IAAI,CACN,QAAQ,EAAE,cAAc,EAAE,EAC1B,OAAO,CAAC,EAAE,WAAW,GACtB,OAAO,CAAC,eAAe,CAAC;IAqCpB,UAAU,CACb,QAAQ,EAAE,cAAc,EAAE,EAC1B,OAAO,CAAC,EAAE,WAAW,GACtB,cAAc,CAAC,YAAY,EAAE,eAAe,GAAG,IAAI,EAAE,OAAO,CAAC;IAkG1D,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IAqBtC,SAAS,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;IAwBpC,OAAO,CAAC,gBAAgB;IA+BxB,OAAO,CAAC,qBAAqB;IAiB7B,OAAO,CAAC,uBAAuB;IA4F/B,OAAO,CAAC,2BAA2B;IA+BnC,OAAO,CAAC,mBAAmB;IAY3B,OAAO,CAAC,6BAA6B;IAsBrC,OAAO,CAAC,mBAAmB;CAwC9B"}
1
+ {"version":3,"file":"google.d.ts","sourceRoot":"","sources":["../../src/providers/google.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAS7C,OAAO,KAAK,EACR,gBAAgB,EAChB,cAAc,EACd,eAAe,EACf,WAAW,EAYd,MAAM,kBAAkB,CAAC;AAC1B,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACzD,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AAE7C,qBAAa,YAAa,SAAQ,aAAa;IAC3C,OAAO,CAAC,QAAQ,CAAU;IAC1B,OAAO,CAAC,UAAU,CAAS;gBAEf,OAAO,EAAE,gBAAgB,EAAE,OAAO,CAAC,EAAE,OAAO;IAUxD,OAAO,CAAC,UAAU;IASlB,OAAO,CAAC,UAAU;IAQlB,OAAO,CAAC,YAAY;IAQpB,OAAO,CAAC,WAAW;IAQnB,OAAO,CAAC,UAAU;IAcZ,IAAI,CACN,QAAQ,EAAE,cAAc,EAAE,EAC1B,OAAO,CAAC,EAAE,WAAW,GACtB,OAAO,CAAC,eAAe,CAAC;IAuDpB,UAAU,CACb,QAAQ,EAAE,cAAc,EAAE,EAC1B,OAAO,CAAC,EAAE,WAAW,GACtB,cAAc,CAAC,YAAY,EAAE,eAAe,GAAG,IAAI,EAAE,OAAO,CAAC;IAyG1D,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IAqBtC,SAAS,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;IAwBpC,OAAO,CAAC,gBAAgB;IAqCxB,OAAO,CAAC,qBAAqB;IAsC7B,OAAO,CAAC,uBAAuB;IA4F/B,OAAO,CAAC,2BAA2B;IAuCnC,OAAO,CAAC,mBAAmB;IAY3B,OAAO,CAAC,6BAA6B;IAsBrC,OAAO,CAAC,mBAAmB;IA8C3B;;;OAGG;YACW,kBAAkB;CAoBnC"}