@jxburros/ai-nugget 0.4.1 → 0.7.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 (187) hide show
  1. package/README.md +158 -382
  2. package/UPGRADING.md +182 -0
  3. package/dist/adapters/engines/anthropic.d.ts +7 -1
  4. package/dist/adapters/engines/anthropic.js +82 -37
  5. package/dist/adapters/engines/base.d.ts +29 -2
  6. package/dist/adapters/engines/base.js +52 -8
  7. package/dist/adapters/engines/google.d.ts +7 -1
  8. package/dist/adapters/engines/google.js +80 -29
  9. package/dist/adapters/engines/ollama.d.ts +2 -1
  10. package/dist/adapters/engines/ollama.js +57 -15
  11. package/dist/adapters/engines/openaiChat.d.ts +8 -1
  12. package/dist/adapters/engines/openaiChat.js +109 -29
  13. package/dist/adapters/profiles.d.ts +21 -1
  14. package/dist/adapters/profiles.js +12 -2
  15. package/dist/agent/loop.d.ts +45 -1
  16. package/dist/agent/loop.js +117 -12
  17. package/dist/cjs/adapters/engines/anthropic.js +326 -0
  18. package/dist/cjs/adapters/engines/base.js +147 -0
  19. package/dist/cjs/adapters/engines/google.js +291 -0
  20. package/dist/cjs/adapters/engines/ollama.js +205 -0
  21. package/dist/cjs/adapters/engines/openaiChat.js +312 -0
  22. package/dist/cjs/adapters/index.js +22 -0
  23. package/dist/cjs/adapters/profiles.js +125 -0
  24. package/dist/cjs/agent/index.js +18 -0
  25. package/dist/cjs/agent/loop.js +373 -0
  26. package/dist/cjs/agent/tools.js +51 -0
  27. package/dist/cjs/connect.js +27 -0
  28. package/dist/cjs/errors.js +110 -0
  29. package/dist/cjs/handler.js +586 -0
  30. package/dist/cjs/index.js +28 -0
  31. package/dist/cjs/json.js +121 -0
  32. package/dist/cjs/keys.js +81 -0
  33. package/dist/cjs/package.json +3 -0
  34. package/dist/cjs/policy.js +42 -0
  35. package/dist/cjs/reasoning.js +159 -0
  36. package/dist/cjs/redact.js +78 -0
  37. package/dist/cjs/tokens.js +22 -0
  38. package/dist/cjs/transport.js +172 -0
  39. package/dist/cjs/types.js +6 -0
  40. package/dist/cjs/util.js +126 -0
  41. package/dist/errors.js +25 -1
  42. package/dist/handler.d.ts +67 -1
  43. package/dist/handler.js +266 -61
  44. package/dist/index.d.ts +1 -0
  45. package/dist/index.js +1 -0
  46. package/dist/reasoning.d.ts +45 -0
  47. package/dist/reasoning.js +154 -0
  48. package/dist/redact.d.ts +18 -0
  49. package/dist/redact.js +29 -1
  50. package/dist/transport.d.ts +3 -1
  51. package/dist/transport.js +21 -1
  52. package/dist/types.d.ts +112 -2
  53. package/dist/util.d.ts +22 -0
  54. package/dist/util.js +59 -0
  55. package/nugget/VERSION.txt +2 -2
  56. package/nugget/dist/adapters/engines/anthropic.d.ts +14 -0
  57. package/nugget/dist/adapters/engines/anthropic.d.ts.map +1 -0
  58. package/nugget/dist/adapters/engines/anthropic.js +323 -0
  59. package/nugget/dist/adapters/engines/anthropic.js.map +1 -0
  60. package/nugget/dist/adapters/engines/base.d.ts +50 -0
  61. package/nugget/dist/adapters/engines/base.d.ts.map +1 -0
  62. package/nugget/dist/adapters/engines/base.js +137 -0
  63. package/nugget/dist/adapters/engines/base.js.map +1 -0
  64. package/nugget/dist/adapters/engines/google.d.ts +24 -0
  65. package/nugget/dist/adapters/engines/google.d.ts.map +1 -0
  66. package/nugget/dist/adapters/engines/google.js +288 -0
  67. package/nugget/dist/adapters/engines/google.js.map +1 -0
  68. package/nugget/dist/adapters/engines/ollama.d.ts +11 -0
  69. package/nugget/dist/adapters/engines/ollama.d.ts.map +1 -0
  70. package/nugget/dist/adapters/engines/ollama.js +202 -0
  71. package/nugget/dist/adapters/engines/ollama.js.map +1 -0
  72. package/nugget/dist/adapters/engines/openaiChat.d.ts +22 -0
  73. package/nugget/dist/adapters/engines/openaiChat.d.ts.map +1 -0
  74. package/nugget/dist/adapters/engines/openaiChat.js +308 -0
  75. package/nugget/dist/adapters/engines/openaiChat.js.map +1 -0
  76. package/nugget/dist/adapters/index.d.ts +5 -0
  77. package/nugget/dist/adapters/index.d.ts.map +1 -0
  78. package/nugget/dist/adapters/index.js +17 -0
  79. package/nugget/dist/adapters/index.js.map +1 -0
  80. package/nugget/dist/adapters/profiles.d.ts +62 -0
  81. package/nugget/dist/adapters/profiles.d.ts.map +1 -0
  82. package/nugget/dist/adapters/profiles.js +121 -0
  83. package/nugget/dist/adapters/profiles.js.map +1 -0
  84. package/nugget/dist/agent/index.d.ts +3 -0
  85. package/nugget/dist/agent/index.d.ts.map +1 -0
  86. package/nugget/dist/agent/index.js +3 -0
  87. package/nugget/dist/agent/index.js.map +1 -0
  88. package/nugget/dist/agent/loop.d.ts +114 -0
  89. package/nugget/dist/agent/loop.d.ts.map +1 -0
  90. package/nugget/dist/agent/loop.js +371 -0
  91. package/nugget/dist/agent/loop.js.map +1 -0
  92. package/nugget/dist/agent/tools.d.ts +29 -0
  93. package/nugget/dist/agent/tools.d.ts.map +1 -0
  94. package/nugget/dist/agent/tools.js +48 -0
  95. package/nugget/dist/agent/tools.js.map +1 -0
  96. package/nugget/dist/cjs/adapters/engines/anthropic.js +326 -0
  97. package/nugget/dist/cjs/adapters/engines/base.js +147 -0
  98. package/nugget/dist/cjs/adapters/engines/google.js +291 -0
  99. package/nugget/dist/cjs/adapters/engines/ollama.js +205 -0
  100. package/nugget/dist/cjs/adapters/engines/openaiChat.js +312 -0
  101. package/nugget/dist/cjs/adapters/index.js +22 -0
  102. package/nugget/dist/cjs/adapters/profiles.js +125 -0
  103. package/nugget/dist/cjs/agent/index.js +18 -0
  104. package/nugget/dist/cjs/agent/loop.js +373 -0
  105. package/nugget/dist/cjs/agent/tools.js +51 -0
  106. package/nugget/dist/cjs/connect.js +27 -0
  107. package/nugget/dist/cjs/errors.js +110 -0
  108. package/nugget/dist/cjs/handler.js +586 -0
  109. package/nugget/dist/cjs/index.js +28 -0
  110. package/nugget/dist/cjs/json.js +121 -0
  111. package/nugget/dist/cjs/keys.js +81 -0
  112. package/nugget/dist/cjs/package.json +3 -0
  113. package/nugget/dist/cjs/policy.js +42 -0
  114. package/nugget/dist/cjs/reasoning.js +159 -0
  115. package/nugget/dist/cjs/redact.js +78 -0
  116. package/nugget/dist/cjs/tokens.js +22 -0
  117. package/nugget/dist/cjs/transport.js +172 -0
  118. package/nugget/dist/cjs/types.js +6 -0
  119. package/nugget/dist/cjs/util.js +126 -0
  120. package/nugget/dist/connect.d.ts +31 -0
  121. package/nugget/dist/connect.d.ts.map +1 -0
  122. package/nugget/dist/connect.js +25 -0
  123. package/nugget/dist/connect.js.map +1 -0
  124. package/nugget/dist/errors.d.ts +22 -0
  125. package/nugget/dist/errors.d.ts.map +1 -0
  126. package/nugget/dist/errors.js +104 -0
  127. package/nugget/dist/errors.js.map +1 -0
  128. package/nugget/dist/handler.d.ts +114 -0
  129. package/nugget/dist/handler.d.ts.map +1 -0
  130. package/nugget/dist/handler.js +582 -0
  131. package/nugget/dist/handler.js.map +1 -0
  132. package/nugget/dist/index.d.ts +13 -0
  133. package/nugget/dist/index.d.ts.map +1 -0
  134. package/nugget/dist/index.js +13 -0
  135. package/nugget/dist/index.js.map +1 -0
  136. package/nugget/dist/json.d.ts +7 -0
  137. package/nugget/dist/json.d.ts.map +1 -0
  138. package/nugget/dist/json.js +114 -0
  139. package/nugget/dist/json.js.map +1 -0
  140. package/nugget/dist/keys.d.ts +7 -0
  141. package/nugget/dist/keys.d.ts.map +1 -0
  142. package/nugget/dist/keys.js +75 -0
  143. package/nugget/dist/keys.js.map +1 -0
  144. package/nugget/dist/policy.d.ts +6 -0
  145. package/nugget/dist/policy.d.ts.map +1 -0
  146. package/nugget/dist/policy.js +37 -0
  147. package/nugget/dist/policy.js.map +1 -0
  148. package/nugget/dist/reasoning.d.ts +45 -0
  149. package/nugget/dist/reasoning.d.ts.map +1 -0
  150. package/nugget/dist/reasoning.js +154 -0
  151. package/nugget/dist/reasoning.js.map +1 -0
  152. package/nugget/dist/redact.d.ts +26 -0
  153. package/nugget/dist/redact.d.ts.map +1 -0
  154. package/nugget/dist/redact.js +74 -0
  155. package/nugget/dist/redact.js.map +1 -0
  156. package/nugget/dist/tokens.d.ts +5 -0
  157. package/nugget/dist/tokens.d.ts.map +1 -0
  158. package/nugget/dist/tokens.js +18 -0
  159. package/nugget/dist/tokens.js.map +1 -0
  160. package/nugget/dist/transport.d.ts +30 -0
  161. package/nugget/dist/transport.d.ts.map +1 -0
  162. package/nugget/dist/transport.js +165 -0
  163. package/nugget/dist/transport.js.map +1 -0
  164. package/nugget/dist/types.d.ts +301 -0
  165. package/nugget/dist/types.d.ts.map +1 -0
  166. package/nugget/dist/types.js +4 -0
  167. package/nugget/dist/types.js.map +1 -0
  168. package/nugget/dist/util.d.ts +31 -0
  169. package/nugget/dist/util.d.ts.map +1 -0
  170. package/nugget/dist/util.js +114 -0
  171. package/nugget/dist/util.js.map +1 -0
  172. package/nugget/src/adapters/engines/anthropic.ts +78 -37
  173. package/nugget/src/adapters/engines/base.ts +50 -7
  174. package/nugget/src/adapters/engines/google.ts +79 -29
  175. package/nugget/src/adapters/engines/ollama.ts +56 -17
  176. package/nugget/src/adapters/engines/openaiChat.ts +104 -30
  177. package/nugget/src/adapters/profiles.ts +53 -3
  178. package/nugget/src/agent/loop.ts +156 -13
  179. package/nugget/src/errors.ts +25 -1
  180. package/nugget/src/handler.ts +308 -59
  181. package/nugget/src/index.ts +1 -0
  182. package/nugget/src/reasoning.ts +174 -0
  183. package/nugget/src/redact.ts +32 -1
  184. package/nugget/src/transport.ts +20 -1
  185. package/nugget/src/types.ts +113 -1
  186. package/nugget/src/util.ts +64 -0
  187. package/package.json +18 -5
@@ -0,0 +1,323 @@
1
+ import { AIError } from '../../errors.js';
2
+ import { estimatedUsage } from '../../tokens.js';
3
+ import { fetchJson, postResponse, sseLines } from '../../transport.js';
4
+ import { applyProviderOptions, REASONING_BUDGET_TOKENS, asNumber, asRecord, asString, joinUrl, textFromMessages } from '../../util.js';
5
+ import { DEFAULT_TIMEOUT_MS, parseArgs, randomId, safeParse, streamAnomaly, streamError, streamTimeout } from './base.js';
6
+ const JSON_MODE_TOOL = 'json_output';
7
+ export class AnthropicAdapter {
8
+ provider;
9
+ constructor(provider) {
10
+ this.provider = provider;
11
+ }
12
+ async chat(conn, req) {
13
+ let result;
14
+ for await (const event of this.stream(conn, req)) {
15
+ if (event.type === 'done')
16
+ result = event.result;
17
+ if (event.type === 'error')
18
+ throw event.error;
19
+ }
20
+ if (!result)
21
+ throw new AIError('Anthropic stream ended without a result', { kind: 'invalid_response', provider: conn.provider });
22
+ return result;
23
+ }
24
+ async *stream(conn, req) {
25
+ const started = Date.now();
26
+ const jsonMode = req.responseFormat?.type === 'json' && !req.tools?.length;
27
+ let firstTokenMs = null;
28
+ let text = '';
29
+ let inputTokens;
30
+ let outputTokens;
31
+ let stopReason;
32
+ let sawTerminal = false;
33
+ const emittedTools = [];
34
+ // Partial tool_use blocks keyed by content-block index (input_json_delta accumulation).
35
+ const blocks = new Map();
36
+ const timeout = streamTimeout(conn, req.signal);
37
+ yield { type: 'start', callId: '', provider: conn.provider, model: req.model };
38
+ // Anthropic JSON mode is implemented as a forced `json_output` tool, which
39
+ // cannot coexist with the caller's own tools — same silent-downgrade shape
40
+ // as Gemini, so it gets the same signal rather than quietly dropping.
41
+ if (req.responseFormat?.type === 'json' && req.tools?.length) {
42
+ yield {
43
+ type: 'context',
44
+ kind: 'json_mode_downgraded',
45
+ data: { reason: 'Anthropic JSON mode uses a forced tool and cannot be combined with caller tools; the request was sent without JSON mode', provider: conn.provider },
46
+ };
47
+ }
48
+ try {
49
+ const res = await postResponse(`${conn.baseUrl}/v1/messages`, body(req, jsonMode), conn.headers, timeout.signal, conn.provider);
50
+ const contentType = res.headers.get('content-type') ?? '';
51
+ if (!contentType.includes('text/event-stream')) {
52
+ const data = await res.json();
53
+ const parsed = parseResponse(data);
54
+ inputTokens = parsed.inputTokens;
55
+ outputTokens = parsed.outputTokens;
56
+ stopReason = parsed.stopReason;
57
+ sawTerminal = true;
58
+ if (jsonMode) {
59
+ text = jsonTextFrom(parsed.toolCalls, parsed.text);
60
+ if (text)
61
+ yield { type: 'delta', text };
62
+ }
63
+ else {
64
+ text = parsed.text;
65
+ if (text)
66
+ yield { type: 'delta', text };
67
+ for (const call of parsed.toolCalls) {
68
+ emittedTools.push(call);
69
+ yield { type: 'tool_call', call };
70
+ }
71
+ }
72
+ }
73
+ else {
74
+ for await (const line of sseLines(res)) {
75
+ timeout.bump();
76
+ const record = asRecord(safeParse(line));
77
+ if (!record)
78
+ continue;
79
+ const type = asString(record.type);
80
+ if (type === 'message_start') {
81
+ const usage = asRecord(asRecord(record.message)?.usage);
82
+ inputTokens = asNumber(usage?.input_tokens) ?? inputTokens;
83
+ outputTokens = asNumber(usage?.output_tokens) ?? outputTokens;
84
+ }
85
+ else if (type === 'content_block_start') {
86
+ const index = asNumber(record.index) ?? 0;
87
+ const block = asRecord(record.content_block);
88
+ if (block?.type === 'tool_use') {
89
+ blocks.set(index, { id: asString(block.id) ?? randomId(), name: asString(block.name) ?? 'unknown', raw: '' });
90
+ }
91
+ }
92
+ else if (type === 'content_block_delta') {
93
+ const index = asNumber(record.index) ?? 0;
94
+ const delta = asRecord(record.delta);
95
+ if (delta?.type === 'text_delta') {
96
+ const piece = asString(delta.text) ?? '';
97
+ if (piece) {
98
+ if (firstTokenMs === null)
99
+ firstTokenMs = Date.now() - started;
100
+ text += piece;
101
+ yield { type: 'delta', text: piece };
102
+ }
103
+ }
104
+ else if (delta?.type === 'thinking_delta') {
105
+ // Extended-thinking tokens ride the reasoning channel, kept out of `text`.
106
+ const piece = asString(delta.thinking) ?? '';
107
+ if (piece)
108
+ yield { type: 'reasoning', text: piece };
109
+ }
110
+ else if (delta?.type === 'input_json_delta') {
111
+ const partial = blocks.get(index);
112
+ if (partial)
113
+ partial.raw += asString(delta.partial_json) ?? '';
114
+ }
115
+ }
116
+ else if (type === 'content_block_stop') {
117
+ const index = asNumber(record.index) ?? 0;
118
+ const partial = blocks.get(index);
119
+ if (partial) {
120
+ const call = { id: partial.id, name: partial.name, raw: partial.raw, arguments: parseArgs(partial.raw) };
121
+ blocks.delete(index);
122
+ if (jsonMode && call.name === JSON_MODE_TOOL) {
123
+ text = jsonTextFrom([call], text);
124
+ if (firstTokenMs === null)
125
+ firstTokenMs = Date.now() - started;
126
+ yield { type: 'delta', text };
127
+ }
128
+ else {
129
+ emittedTools.push(call);
130
+ yield { type: 'tool_call', call };
131
+ }
132
+ }
133
+ }
134
+ else if (type === 'message_stop') {
135
+ sawTerminal = true;
136
+ }
137
+ else if (type === 'message_delta') {
138
+ const delta = asRecord(record.delta);
139
+ if (asString(delta?.stop_reason))
140
+ sawTerminal = true;
141
+ stopReason = asString(delta?.stop_reason) ?? stopReason;
142
+ const usage = asRecord(record.usage);
143
+ outputTokens = asNumber(usage?.output_tokens) ?? outputTokens;
144
+ }
145
+ }
146
+ }
147
+ if (!sawTerminal)
148
+ yield streamAnomaly('stream ended without a stop_reason or message_stop');
149
+ const hasTools = emittedTools.length > 0;
150
+ yield { type: 'done', result: {
151
+ text,
152
+ toolCalls: hasTools ? emittedTools : undefined,
153
+ finishReason: mapStop(stopReason, hasTools),
154
+ usage: inputTokens !== undefined || outputTokens !== undefined ? { inputTokens, outputTokens, estimated: false } : estimatedUsage(textFromMessages(req.messages), text),
155
+ timing: { firstTokenMs, totalMs: Date.now() - started },
156
+ model: req.model,
157
+ source: { provider: conn.provider, connectionId: conn.id, baseUrl: conn.baseUrl },
158
+ } };
159
+ }
160
+ catch (error) {
161
+ throw streamError(error, timeout, conn.provider);
162
+ }
163
+ finally {
164
+ timeout.done();
165
+ }
166
+ }
167
+ /**
168
+ * Lists models from Anthropic's `/v1/models` endpoint (auth + version headers
169
+ * already applied to `conn.headers`). The endpoint does not report a context
170
+ * window, so `contextWindow` is left undefined rather than guessed.
171
+ */
172
+ async listModels(conn) {
173
+ const { data } = await fetchJson(joinUrl(conn.baseUrl, '/v1/models'), {
174
+ method: 'GET',
175
+ headers: conn.headers,
176
+ timeoutMs: Math.min(conn.timeoutMs ?? DEFAULT_TIMEOUT_MS, 15_000),
177
+ provider: conn.provider,
178
+ });
179
+ const rows = Array.isArray(asRecord(data)?.data) ? asRecord(data).data : [];
180
+ return rows
181
+ .map((row) => asString(asRecord(row)?.id))
182
+ .filter((id) => Boolean(id))
183
+ .map((id) => ({ id, source: { provider: conn.provider, connectionId: conn.id, baseUrl: conn.baseUrl } }));
184
+ }
185
+ }
186
+ function body(req, jsonMode) {
187
+ const system = req.messages.filter((m) => m.role === 'system').map((m) => textContent(m.content)).join('\n\n') || undefined;
188
+ const base = {
189
+ model: req.model,
190
+ max_tokens: req.maxTokens ?? 4096,
191
+ temperature: req.temperature,
192
+ top_p: req.topP,
193
+ stop_sequences: req.stopSequences,
194
+ system,
195
+ messages: toAnthropicMessages(req.messages.filter((m) => m.role !== 'system')),
196
+ stream: true,
197
+ };
198
+ if (jsonMode) {
199
+ // Forced-tool JSON mode: Anthropic has no response_format, so we make the
200
+ // model answer through a single required tool whose input is the JSON we want.
201
+ base.tools = [{ name: JSON_MODE_TOOL, description: 'Return the answer as a JSON object.', input_schema: schemaFor(req) }];
202
+ base.tool_choice = { type: 'tool', name: JSON_MODE_TOOL };
203
+ }
204
+ else if (req.tools?.length) {
205
+ base.tools = req.tools.map((tool) => ({ name: tool.name, description: tool.description, input_schema: tool.parameters }));
206
+ if (typeof req.toolChoice === 'object')
207
+ base.tool_choice = { type: 'tool', name: req.toolChoice.name };
208
+ else if (req.toolChoice === 'auto')
209
+ base.tool_choice = { type: 'auto' };
210
+ else if (req.toolChoice === 'none')
211
+ base.tool_choice = { type: 'none' };
212
+ }
213
+ if (req.reasoningEffort !== undefined) {
214
+ // First-class reasoning effort → extended thinking. Anthropic requires
215
+ // `budget_tokens < max_tokens` and rejects temperature/top_p alongside
216
+ // thinking, so the budget is fitted under max_tokens (raising max_tokens
217
+ // when the caller's value leaves no room) and the samplers are dropped.
218
+ if (req.reasoningEffort === 'none') {
219
+ base.thinking = { type: 'disabled' };
220
+ }
221
+ else {
222
+ const budget = REASONING_BUDGET_TOKENS[req.reasoningEffort];
223
+ const maxTokens = typeof base.max_tokens === 'number' ? base.max_tokens : 4096;
224
+ if (maxTokens <= budget)
225
+ base.max_tokens = budget + 1024;
226
+ base.thinking = { type: 'enabled', budget_tokens: budget };
227
+ delete base.temperature;
228
+ delete base.top_p;
229
+ }
230
+ }
231
+ // providerOptions carries Anthropic-native fields (`thinking`, `metadata`,
232
+ // top-level `cache_control` extras, `service_tier`, …) without a release.
233
+ return applyProviderOptions(base, req.providerOptions);
234
+ }
235
+ function toAnthropicMessages(messages) {
236
+ const out = [];
237
+ for (let index = 0; index < messages.length; index += 1) {
238
+ const message = messages[index];
239
+ if (message.role !== 'tool') {
240
+ out.push(toAnthropicMessage(message));
241
+ continue;
242
+ }
243
+ const content = [];
244
+ while (index < messages.length && messages[index]?.role === 'tool') {
245
+ const toolMessage = messages[index];
246
+ content.push({ type: 'tool_result', tool_use_id: toolMessage.toolCallId ?? '', content: textContent(toolMessage.content) });
247
+ index += 1;
248
+ }
249
+ index -= 1;
250
+ out.push({ role: 'user', content });
251
+ }
252
+ return out;
253
+ }
254
+ function toAnthropicMessage(m) {
255
+ // Tool-role messages are handled by toAnthropicMessages' batching loop and
256
+ // never reach here, so no tool branch is needed.
257
+ // assistant turns that carried tool calls replay them as tool_use blocks,
258
+ // preserving any text/image content parts that accompanied the calls.
259
+ if (m.role === 'assistant' && m.toolCalls?.length) {
260
+ const content = [...contentBlocks(m.content)];
261
+ for (const call of m.toolCalls)
262
+ content.push({ type: 'tool_use', id: call.id, name: call.name, input: call.arguments ?? {} });
263
+ return { role: 'assistant', content };
264
+ }
265
+ return {
266
+ role: m.role === 'assistant' ? 'assistant' : 'user',
267
+ content: typeof m.content === 'string' ? m.content : contentBlocks(m.content),
268
+ };
269
+ }
270
+ /** Maps text/image content — a string or a ContentPart[] — onto Anthropic content blocks. */
271
+ function contentBlocks(content) {
272
+ if (typeof content === 'string')
273
+ return content ? [{ type: 'text', text: content }] : [];
274
+ return content.map((part) => part.type === 'image'
275
+ ? { type: 'image', source: { type: 'base64', media_type: part.mimeType ?? 'image/png', data: part.imageBase64 ?? '' } }
276
+ : { type: 'text', text: part.text ?? '' });
277
+ }
278
+ function textContent(content) {
279
+ if (typeof content === 'string')
280
+ return content;
281
+ if (!content)
282
+ return '';
283
+ return content.filter((part) => part.type === 'text').map((part) => part.text ?? '').join('\n');
284
+ }
285
+ function parseResponse(data) {
286
+ const record = asRecord(data);
287
+ const content = Array.isArray(record?.content) ? record.content : [];
288
+ let text = '';
289
+ const toolCalls = [];
290
+ for (const blockValue of content) {
291
+ const block = asRecord(blockValue);
292
+ if (block?.type === 'text')
293
+ text += asString(block.text) ?? '';
294
+ if (block?.type === 'tool_use') {
295
+ toolCalls.push({
296
+ id: asString(block.id) ?? randomId(),
297
+ name: asString(block.name) ?? 'unknown',
298
+ arguments: block.input ?? {},
299
+ raw: JSON.stringify(block.input ?? {}),
300
+ });
301
+ }
302
+ }
303
+ const usage = asRecord(record?.usage);
304
+ return { text, inputTokens: asNumber(usage?.input_tokens), outputTokens: asNumber(usage?.output_tokens), stopReason: asString(record?.stop_reason), toolCalls };
305
+ }
306
+ function schemaFor(req) {
307
+ const schema = req.responseFormat?.type === 'json' ? req.responseFormat.schema : undefined;
308
+ return schema ?? { type: 'object' };
309
+ }
310
+ function jsonTextFrom(toolCalls, fallback) {
311
+ const json = toolCalls.find((call) => call.name === JSON_MODE_TOOL) ?? toolCalls[0];
312
+ if (json)
313
+ return json.raw && json.raw.trim() ? json.raw : JSON.stringify(json.arguments ?? {});
314
+ return fallback;
315
+ }
316
+ function mapStop(stop, hasTools) {
317
+ if (stop === 'tool_use' && hasTools)
318
+ return 'tool';
319
+ if (stop === 'max_tokens')
320
+ return 'length';
321
+ return 'stop';
322
+ }
323
+ //# sourceMappingURL=anthropic.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"anthropic.js","sourceRoot":"","sources":["../../../src/adapters/engines/anthropic.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,50 @@
1
+ import { AIError } from '../../errors.js';
2
+ import { withTimeout } from '../../transport.js';
3
+ import type { ModelInfo, ResolvedConnection } from '../../types.js';
4
+ import type { ProviderProfile } from '../profiles.js';
5
+ export declare const DEFAULT_TIMEOUT_MS = 120000;
6
+ /**
7
+ * Maps a raw streaming failure onto a typed {@link AIError}. A fired timeout is
8
+ * reported as `timeout` regardless of how the underlying `fetch` surfaced the
9
+ * abort; anything else is normalized through {@link fromUnknown} (which passes
10
+ * an existing {@link AIError} through untouched, preserving retryability).
11
+ */
12
+ export declare function streamError(error: unknown, timeout: {
13
+ timedOut(): boolean;
14
+ }, provider: string): AIError;
15
+ /**
16
+ * Create a timeout/abort scope covering the full stream lifetime, plus an
17
+ * optional idle timeout (`conn.idleTimeoutMs`) that the engine rearms via
18
+ * `bump()` on each received chunk.
19
+ */
20
+ export declare function streamTimeout(conn: ResolvedConnection, signal?: AbortSignal): ReturnType<typeof withTimeout>;
21
+ export declare function listOpenModels(conn: ResolvedConnection, profile: ProviderProfile): Promise<ModelInfo[]>;
22
+ export declare function health(conn: ResolvedConnection, profile: ProviderProfile): Promise<{
23
+ ok: boolean;
24
+ detail?: string;
25
+ }>;
26
+ /**
27
+ * Coerce a provider's tool-call `arguments` into an object. Providers disagree
28
+ * on the shape: OpenAI/Anthropic stream a JSON *string*, Google and Ollama send
29
+ * a native object — but Ollama-compatible backends (llama.cpp and friends)
30
+ * sometimes send a string too. Malformed JSON degrades to `{}` so a single bad
31
+ * tool call surfaces as an argument-validation error rather than a stream crash.
32
+ */
33
+ export declare function parseArgs(raw: unknown): unknown;
34
+ /** JSON.parse that returns undefined instead of throwing — for per-line stream frames. */
35
+ export declare function safeParse(line: string): unknown;
36
+ /** Stable-enough id for a tool call a provider didn't give one for. */
37
+ export declare function randomId(): string;
38
+ /**
39
+ * A stream that ended without the provider's terminal marker (an OpenAI
40
+ * `finish_reason`, an Anthropic `message_delta.stop_reason`, a Google
41
+ * `finishReason`, an Ollama `done`) was almost certainly truncated. Every
42
+ * engine yields this so a dropped connection is diagnosable identically
43
+ * regardless of provider.
44
+ */
45
+ export declare function streamAnomaly(reason?: string): {
46
+ type: 'context';
47
+ kind: string;
48
+ data: unknown;
49
+ };
50
+ //# sourceMappingURL=base.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"base.d.ts","sourceRoot":"","sources":["../../../src/adapters/engines/base.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAe,MAAM,iBAAiB,CAAC;AACvD,OAAO,EAAa,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAC5D,OAAO,KAAK,EAAE,SAAS,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AAEpE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAEtD,eAAO,MAAM,kBAAkB,SAAU,CAAC;AAE1C;;;;;GAKG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE;IAAE,QAAQ,IAAI,OAAO,CAAA;CAAE,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAGvG;AAED;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,kBAAkB,EAAE,MAAM,CAAC,EAAE,WAAW,GAAG,UAAU,CAAC,OAAO,WAAW,CAAC,CAE5G;AAED,wBAAsB,cAAc,CAAC,IAAI,EAAE,kBAAkB,EAAE,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC,SAAS,EAAE,CAAC,CA0B7G;AAED,wBAAsB,MAAM,CAAC,IAAI,EAAE,kBAAkB,EAAE,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC;IAAE,EAAE,EAAE,OAAO,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CAc1H;AAED;;;;;;GAMG;AACH,wBAAgB,SAAS,CAAC,GAAG,EAAE,OAAO,GAAG,OAAO,CAS/C;AAED,0FAA0F;AAC1F,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAM/C;AAED,uEAAuE;AACvE,wBAAgB,QAAQ,IAAI,MAAM,CAEjC;AAED;;;;;;GAMG;AACH,wBAAgB,aAAa,CAAC,MAAM,SAAkD,GAAG;IAAE,IAAI,EAAE,SAAS,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,OAAO,CAAA;CAAE,CAExI"}
@@ -0,0 +1,137 @@
1
+ import { AIError, fromUnknown } from '../../errors.js';
2
+ import { fetchJson, withTimeout } from '../../transport.js';
3
+ import { asRecord, asString, joinUrl } from '../../util.js';
4
+ export const DEFAULT_TIMEOUT_MS = 120_000;
5
+ /**
6
+ * Maps a raw streaming failure onto a typed {@link AIError}. A fired timeout is
7
+ * reported as `timeout` regardless of how the underlying `fetch` surfaced the
8
+ * abort; anything else is normalized through {@link fromUnknown} (which passes
9
+ * an existing {@link AIError} through untouched, preserving retryability).
10
+ */
11
+ export function streamError(error, timeout, provider) {
12
+ if (timeout.timedOut())
13
+ return new AIError('Request timed out', { kind: 'timeout', provider });
14
+ return fromUnknown(error, provider);
15
+ }
16
+ /**
17
+ * Create a timeout/abort scope covering the full stream lifetime, plus an
18
+ * optional idle timeout (`conn.idleTimeoutMs`) that the engine rearms via
19
+ * `bump()` on each received chunk.
20
+ */
21
+ export function streamTimeout(conn, signal) {
22
+ return withTimeout(conn.timeoutMs ?? DEFAULT_TIMEOUT_MS, signal, conn.idleTimeoutMs);
23
+ }
24
+ export async function listOpenModels(conn, profile) {
25
+ if (!profile.listModelsPath)
26
+ return [];
27
+ const { data } = await fetchJson(joinUrl(conn.baseUrl, profile.listModelsPath), {
28
+ method: 'GET',
29
+ headers: conn.headers,
30
+ timeoutMs: conn.timeoutMs ?? DEFAULT_TIMEOUT_MS,
31
+ provider: conn.provider,
32
+ });
33
+ const record = asRecord(data);
34
+ const items = Array.isArray(record?.data) ? record.data : Array.isArray(record?.models) ? record.models : [];
35
+ const models = [];
36
+ for (const item of items) {
37
+ const row = asRecord(item);
38
+ const id = asString(row?.id) ?? asString(row?.name);
39
+ if (!id)
40
+ continue;
41
+ const contextWindow = asContextWindow(row);
42
+ const capabilities = asCapabilities(row);
43
+ const model = {
44
+ id,
45
+ source: { provider: conn.provider, connectionId: conn.id, baseUrl: conn.baseUrl },
46
+ };
47
+ if (contextWindow !== undefined)
48
+ model.contextWindow = contextWindow;
49
+ if (capabilities)
50
+ model.capabilities = capabilities;
51
+ models.push(model);
52
+ }
53
+ return models;
54
+ }
55
+ export async function health(conn, profile) {
56
+ const path = profile.healthPath ?? profile.listModelsPath;
57
+ if (!path)
58
+ return { ok: true };
59
+ try {
60
+ await fetchJson(joinUrl(conn.baseUrl, path), {
61
+ method: 'GET',
62
+ headers: conn.headers,
63
+ timeoutMs: Math.min(conn.timeoutMs ?? DEFAULT_TIMEOUT_MS, 10_000),
64
+ provider: conn.provider,
65
+ });
66
+ return { ok: true };
67
+ }
68
+ catch (error) {
69
+ return { ok: false, detail: error instanceof Error ? error.message : 'Health check failed' };
70
+ }
71
+ }
72
+ /**
73
+ * Coerce a provider's tool-call `arguments` into an object. Providers disagree
74
+ * on the shape: OpenAI/Anthropic stream a JSON *string*, Google and Ollama send
75
+ * a native object — but Ollama-compatible backends (llama.cpp and friends)
76
+ * sometimes send a string too. Malformed JSON degrades to `{}` so a single bad
77
+ * tool call surfaces as an argument-validation error rather than a stream crash.
78
+ */
79
+ export function parseArgs(raw) {
80
+ if (raw === undefined || raw === null)
81
+ return {};
82
+ if (typeof raw !== 'string')
83
+ return raw;
84
+ if (!raw.trim())
85
+ return {};
86
+ try {
87
+ return JSON.parse(raw);
88
+ }
89
+ catch {
90
+ return {};
91
+ }
92
+ }
93
+ /** JSON.parse that returns undefined instead of throwing — for per-line stream frames. */
94
+ export function safeParse(line) {
95
+ try {
96
+ return JSON.parse(line);
97
+ }
98
+ catch {
99
+ return undefined;
100
+ }
101
+ }
102
+ /** Stable-enough id for a tool call a provider didn't give one for. */
103
+ export function randomId() {
104
+ return globalThis.crypto?.randomUUID?.() ?? `tool_${Date.now()}_${Math.random().toString(36).slice(2)}`;
105
+ }
106
+ /**
107
+ * A stream that ended without the provider's terminal marker (an OpenAI
108
+ * `finish_reason`, an Anthropic `message_delta.stop_reason`, a Google
109
+ * `finishReason`, an Ollama `done`) was almost certainly truncated. Every
110
+ * engine yields this so a dropped connection is diagnosable identically
111
+ * regardless of provider.
112
+ */
113
+ export function streamAnomaly(reason = 'stream ended without a terminal finish reason') {
114
+ return { type: 'context', kind: 'stream_anomaly', data: { reason } };
115
+ }
116
+ /**
117
+ * Pulls a context-window figure out of the many shapes providers use for it
118
+ * (OpenRouter `context_length`, OpenAI-style `context_window`, Ollama
119
+ * `/api/show` `model_info` entries surfaced as `contextWindow`).
120
+ */
121
+ function asContextWindow(row) {
122
+ if (!row)
123
+ return undefined;
124
+ const direct = row['context_length'] ?? row['context_window'] ?? row['contextWindow'];
125
+ return typeof direct === 'number' && Number.isFinite(direct) ? direct : undefined;
126
+ }
127
+ function asCapabilities(row) {
128
+ if (!row)
129
+ return undefined;
130
+ const value = row['capabilities'] ?? asRecord(row['architecture'])?.['modality'];
131
+ if (Array.isArray(value) && value.every((entry) => typeof entry === 'string'))
132
+ return value;
133
+ if (typeof value === 'string')
134
+ return [value];
135
+ return undefined;
136
+ }
137
+ //# sourceMappingURL=base.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"base.js","sourceRoot":"","sources":["../../../src/adapters/engines/base.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,24 @@
1
+ import type { ChatRequest, ChatResult, ModelInfo, ProviderAdapter, ResolvedConnection, StreamEvent } from '../../types.js';
2
+ export declare class GoogleAdapter implements ProviderAdapter {
3
+ readonly provider: string;
4
+ constructor(provider: string);
5
+ chat(conn: ResolvedConnection, req: ChatRequest): Promise<ChatResult>;
6
+ stream(conn: ResolvedConnection, req: ChatRequest): AsyncIterable<StreamEvent>;
7
+ /**
8
+ * `GoogleAdapter` has no `listModels`, so without a `health` probe
9
+ * `AIHandler.testConnection` would report `ok: true` without ever making a
10
+ * network call. `/v1beta/models` is a lightweight, key-authenticated GET
11
+ * that gives an honest connectivity/auth check.
12
+ */
13
+ health(conn: ResolvedConnection): Promise<{
14
+ ok: boolean;
15
+ detail?: string;
16
+ }>;
17
+ /**
18
+ * Lists models from Google's `/v1beta/models`. Strips the `models/` name
19
+ * prefix, and maps `inputTokenLimit` → `contextWindow` and
20
+ * `supportedGenerationMethods` → `capabilities`.
21
+ */
22
+ listModels(conn: ResolvedConnection): Promise<ModelInfo[]>;
23
+ }
24
+ //# sourceMappingURL=google.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"google.d.ts","sourceRoot":"","sources":["../../../src/adapters/engines/google.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAe,WAAW,EAAE,UAAU,EAAE,SAAS,EAAE,eAAe,EAAE,kBAAkB,EAAE,WAAW,EAAY,MAAM,gBAAgB,CAAC;AAIlJ,qBAAa,aAAc,YAAW,eAAe;IACnD,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;gBACd,QAAQ,EAAE,MAAM;IAItB,IAAI,CAAC,IAAI,EAAE,kBAAkB,EAAE,GAAG,EAAE,WAAW,GAAG,OAAO,CAAC,UAAU,CAAC;IAUpE,MAAM,CAAC,IAAI,EAAE,kBAAkB,EAAE,GAAG,EAAE,WAAW,GAAG,aAAa,CAAC,WAAW,CAAC;IA+ErF;;;;;OAKG;IACG,MAAM,CAAC,IAAI,EAAE,kBAAkB,GAAG,OAAO,CAAC;QAAE,EAAE,EAAE,OAAO,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAcjF;;;;OAIG;IACG,UAAU,CAAC,IAAI,EAAE,kBAAkB,GAAG,OAAO,CAAC,SAAS,EAAE,CAAC;CAuBjE"}