llm-stream-assemble 1.4.0 → 1.4.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (38) hide show
  1. package/README.md +4 -4
  2. package/dist/adapters/anthropic.cjs +181 -125
  3. package/dist/adapters/anthropic.cjs.map +1 -1
  4. package/dist/adapters/anthropic.d.cts +1 -3
  5. package/dist/adapters/anthropic.d.ts +1 -3
  6. package/dist/adapters/anthropic.js +181 -125
  7. package/dist/adapters/anthropic.js.map +1 -1
  8. package/dist/adapters/bedrock.cjs +155 -118
  9. package/dist/adapters/bedrock.cjs.map +1 -1
  10. package/dist/adapters/bedrock.js +155 -118
  11. package/dist/adapters/bedrock.js.map +1 -1
  12. package/dist/adapters/gemini.cjs +86 -44
  13. package/dist/adapters/gemini.cjs.map +1 -1
  14. package/dist/adapters/gemini.js +86 -44
  15. package/dist/adapters/gemini.js.map +1 -1
  16. package/dist/adapters/openai-chat.cjs +20 -8
  17. package/dist/adapters/openai-chat.cjs.map +1 -1
  18. package/dist/adapters/openai-chat.js +20 -8
  19. package/dist/adapters/openai-chat.js.map +1 -1
  20. package/dist/adapters/openai-compatible.cjs +20 -8
  21. package/dist/adapters/openai-compatible.cjs.map +1 -1
  22. package/dist/adapters/openai-compatible.js +20 -8
  23. package/dist/adapters/openai-compatible.js.map +1 -1
  24. package/dist/adapters/openai-responses.cjs +37 -27
  25. package/dist/adapters/openai-responses.cjs.map +1 -1
  26. package/dist/adapters/openai-responses.js +37 -27
  27. package/dist/adapters/openai-responses.js.map +1 -1
  28. package/dist/core/index.cjs +9 -2
  29. package/dist/core/index.cjs.map +1 -1
  30. package/dist/core/index.js +9 -2
  31. package/dist/core/index.js.map +1 -1
  32. package/dist/index.cjs +266 -304
  33. package/dist/index.cjs.map +1 -1
  34. package/dist/index.d.cts +1 -1
  35. package/dist/index.d.ts +1 -1
  36. package/dist/index.js +266 -304
  37. package/dist/index.js.map +1 -1
  38. package/package.json +1 -1
@@ -1,3 +1,34 @@
1
+ // src/core/utils/object.ts
2
+ function stripUndefined(obj) {
3
+ return Object.fromEntries(Object.entries(obj).filter(([, value]) => value !== void 0));
4
+ }
5
+
6
+ // src/adapters/errors.ts
7
+ function libraryError(message) {
8
+ return new Error(`llm-stream-assemble: ${message}`);
9
+ }
10
+ function adapterScopedError(scope, message) {
11
+ return new Error(`llm-stream-assemble: ${scope}: ${message}`);
12
+ }
13
+ function providerErrorChunks(error, recoverable = false) {
14
+ return [
15
+ { kind: "provider-error", error, recoverable },
16
+ { kind: "finish", reason: "error" }
17
+ ];
18
+ }
19
+ function providerErrorChunksFromMessage(message, recoverable = false) {
20
+ return providerErrorChunks(libraryError(message), recoverable);
21
+ }
22
+ function providerErrorChunksFromPayload(errorPayload, scope, recoverable, fallbackMessage) {
23
+ const message = asString(errorPayload.message) ?? fallbackMessage;
24
+ const error = adapterScopedError(scope, message);
25
+ Object.defineProperty(error, "raw", {
26
+ value: errorPayload,
27
+ enumerable: false
28
+ });
29
+ return providerErrorChunks(error, recoverable);
30
+ }
31
+
1
32
  // src/adapters/utils.ts
2
33
  function isRecord(value) {
3
34
  return typeof value === "object" && value !== null && !Array.isArray(value);
@@ -9,9 +40,7 @@ function asNumber(value) {
9
40
  return typeof value === "number" && Number.isFinite(value) ? value : void 0;
10
41
  }
11
42
  function optionalRawChunk(input) {
12
- return Object.fromEntries(
13
- Object.entries(input).filter(([, value]) => value !== void 0)
14
- );
43
+ return stripUndefined(input);
15
44
  }
16
45
  function prefixedAdapterError(feature, message) {
17
46
  return adapterScopedError(feature, message);
@@ -35,21 +64,125 @@ function parseAdapterJSON(raw, feature) {
35
64
  }
36
65
  }
37
66
 
38
- // src/adapters/errors.ts
39
- function libraryError(message) {
40
- return new Error(`llm-stream-assemble: ${message}`);
67
+ // src/adapters/shared/anthropic-blocks.ts
68
+ function anthropicResponseBlockChunks(block, index, context) {
69
+ return anthropicBlockStartChunks(block, index, { ...context, mode: "response" });
41
70
  }
42
- function adapterScopedError(scope, message) {
43
- return new Error(`llm-stream-assemble: ${scope}: ${message}`);
71
+ function anthropicBlockStartChunks(block, index, context) {
72
+ const mode = context.mode ?? "stream-start";
73
+ const blockType = asString(block.type) ?? "unknown";
74
+ switch (blockType) {
75
+ case "text": {
76
+ const text = asString(block.text);
77
+ if (!text) return [];
78
+ if (context.jsonMode) return [{ kind: "json-delta", delta: text }];
79
+ return [{ kind: "text-delta", text }];
80
+ }
81
+ case "thinking": {
82
+ const text = asString(block.thinking);
83
+ return text ? [{ kind: "reasoning-delta", text, variant: "detail" }] : [];
84
+ }
85
+ case "redacted_thinking":
86
+ return [];
87
+ case "tool_use":
88
+ return anthropicToolUseBlockChunks(block, index, mode);
89
+ case "json": {
90
+ const text = asString(block.text) ?? asString(block.partial_json);
91
+ return text ? [{ kind: "json-delta", delta: text }] : [];
92
+ }
93
+ case "refusal": {
94
+ const text = asString(block.refusal) ?? asString(block.text);
95
+ return text ? [{ kind: "refusal-delta", text }] : [];
96
+ }
97
+ default:
98
+ return [];
99
+ }
44
100
  }
45
- function providerErrorChunks(error, recoverable = false) {
46
- return [
47
- { kind: "provider-error", error, recoverable },
48
- { kind: "finish", reason: "error" }
49
- ];
101
+ function anthropicToolUseBlockChunks(block, index, mode) {
102
+ const id = asString(block.id);
103
+ const name = asString(block.name) ?? "unknown";
104
+ const chunks = [optionalRawChunk({ kind: "tool-start", id, name, index })];
105
+ const input = block.input;
106
+ if (input !== void 0 && !(isRecord(input) && Object.keys(input).length === 0)) {
107
+ chunks.push(
108
+ optionalRawChunk({ kind: "tool-args-delta", id, delta: JSON.stringify(input), index })
109
+ );
110
+ }
111
+ if (mode === "response") {
112
+ chunks.push(optionalRawChunk({ kind: "tool-done", id, index }));
113
+ }
114
+ return chunks;
50
115
  }
51
- function providerErrorChunksFromMessage(message, recoverable = false) {
52
- return providerErrorChunks(libraryError(message), recoverable);
116
+
117
+ // src/adapters/shared/parse-payload.ts
118
+ function parseAdapterObjectPayload(raw, scope, options = {}) {
119
+ const { trim = true, allowDone = true } = options;
120
+ const input = trim ? raw.trim() : raw;
121
+ if (input.length === 0 || allowDone && input === "[DONE]") return null;
122
+ const payload = parseAdapterJSON(input, scope);
123
+ if (!isRecord(payload)) {
124
+ throw adapterScopedError(scope, "expected a JSON object");
125
+ }
126
+ return payload;
127
+ }
128
+
129
+ // src/adapters/shared/stop-reasons.ts
130
+ function mapAnthropicLikeStopReason(value) {
131
+ switch (value) {
132
+ case "end_turn":
133
+ case "stop_sequence":
134
+ return "stop";
135
+ case "tool_use":
136
+ return "tool_calls";
137
+ case "max_tokens":
138
+ return "length";
139
+ case "content_filtered":
140
+ case "guardrail_intervened":
141
+ case "refusal":
142
+ return "content_filter";
143
+ default:
144
+ return "stop";
145
+ }
146
+ }
147
+
148
+ // src/adapters/shared/usage.ts
149
+ var DEFAULT_ALIASES = {
150
+ input: ["inputTokens", "input_tokens", "promptTokens", "promptTokenCount", "inputTokenCount"],
151
+ output: [
152
+ "outputTokens",
153
+ "output_tokens",
154
+ "completionTokens",
155
+ "candidatesTokenCount",
156
+ "outputTokenCount"
157
+ ],
158
+ reasoning: ["reasoningTokens", "reasoning_tokens", "thoughtsTokenCount"],
159
+ total: ["totalTokens", "totalTokenCount", "total_tokens"]
160
+ };
161
+ function firstNumber(value, fields) {
162
+ if (!fields) return void 0;
163
+ for (const field of fields) {
164
+ const number = asNumber(value[field]);
165
+ if (number !== void 0) return number;
166
+ }
167
+ return void 0;
168
+ }
169
+ function buildUsageChunk(value, aliases = DEFAULT_ALIASES, options) {
170
+ if (!isRecord(value)) return void 0;
171
+ const inputTokens = firstNumber(value, aliases.input);
172
+ const outputTokens = firstNumber(value, aliases.output);
173
+ const reasoningTokens = firstNumber(value, aliases.reasoning);
174
+ const totalTokens = firstNumber(value, aliases.total);
175
+ if (inputTokens === void 0 && outputTokens === void 0 && reasoningTokens === void 0 && totalTokens === void 0) {
176
+ return void 0;
177
+ }
178
+ const raw = value;
179
+ return optionalRawChunk({
180
+ kind: "usage",
181
+ inputTokens,
182
+ outputTokens,
183
+ reasoningTokens,
184
+ raw
185
+ });
53
186
  }
54
187
 
55
188
  // src/adapters/anthropic.ts
@@ -69,10 +202,8 @@ var AnthropicStreamParser = class {
69
202
  blocks = /* @__PURE__ */ new Map();
70
203
  sawFinish = false;
71
204
  parseChunk(raw) {
72
- const payload = parseAdapterJSON(raw, "anthropicAdapter.parseChunk");
73
- if (!isRecord(payload)) {
74
- throw libraryError("anthropicAdapter.parseChunk expected a JSON object");
75
- }
205
+ const payload = parseAdapterObjectPayload(raw, "anthropicAdapter.parseChunk");
206
+ if (!payload) return [];
76
207
  const type = asString(payload.type);
77
208
  switch (type) {
78
209
  case "ping":
@@ -90,7 +221,7 @@ var AnthropicStreamParser = class {
90
221
  case "message_stop":
91
222
  return this.messageStop();
92
223
  case "error":
93
- return providerErrorChunks2(payload.error);
224
+ return providerErrorFromPayload(payload.error);
94
225
  default:
95
226
  throw libraryError(`anthropicAdapter.parseChunk unknown event type: ${String(type)}`);
96
227
  }
@@ -105,7 +236,7 @@ var AnthropicStreamParser = class {
105
236
  if (id || model) {
106
237
  chunks.push(optionalRawChunk({ kind: "metadata", responseId: id, model, raw: message }));
107
238
  }
108
- const usage = usageChunk(message.usage);
239
+ const usage = buildUsageChunk(message.usage);
109
240
  if (usage) chunks.push(usage);
110
241
  return chunks;
111
242
  }
@@ -116,42 +247,16 @@ var AnthropicStreamParser = class {
116
247
  const blockType = asString(block.type) ?? "unknown";
117
248
  const state = { type: blockType };
118
249
  this.blocks.set(index, state);
119
- switch (blockType) {
120
- case "text": {
121
- const text = asString(block.text);
122
- return text ? [{ kind: "text-delta", text }] : [];
123
- }
124
- case "thinking": {
125
- const text = asString(block.thinking);
126
- return text ? [{ kind: "reasoning-delta", text, variant: "detail" }] : [];
127
- }
128
- case "redacted_thinking":
129
- return [];
130
- case "tool_use": {
131
- const id = asString(block.id);
132
- const name = asString(block.name) ?? "unknown";
133
- if (id) state.id = id;
134
- state.name = name;
135
- const chunks = [optionalRawChunk({ kind: "tool-start", id, name, index })];
136
- const input = block.input;
137
- if (input !== void 0 && !(isRecord(input) && Object.keys(input).length === 0)) {
138
- chunks.push(
139
- optionalRawChunk({ kind: "tool-args-delta", id, delta: JSON.stringify(input), index })
140
- );
141
- }
142
- return chunks;
143
- }
144
- case "json": {
145
- const text = asString(block.text) ?? asString(block.partial_json);
146
- return text ? [{ kind: "json-delta", delta: text }] : [];
147
- }
148
- case "refusal": {
149
- const text = asString(block.refusal) ?? asString(block.text);
150
- return text ? [{ kind: "refusal-delta", text }] : [];
151
- }
152
- default:
153
- return [];
250
+ if (blockType === "tool_use") {
251
+ const id = asString(block.id);
252
+ const name = asString(block.name) ?? "unknown";
253
+ if (id) state.id = id;
254
+ state.name = name;
154
255
  }
256
+ return anthropicBlockStartChunks(block, index, {
257
+ jsonMode: this.options.jsonMode,
258
+ mode: "stream-start"
259
+ });
155
260
  }
156
261
  contentBlockDelta(payload) {
157
262
  const index = asNumber(payload.index) ?? 0;
@@ -163,8 +268,9 @@ var AnthropicStreamParser = class {
163
268
  case "text_delta": {
164
269
  const text = asString(delta.text);
165
270
  if (!text) return [];
166
- if (this.options.jsonMode || state?.type === "json")
271
+ if (this.options.jsonMode || state?.type === "json") {
167
272
  return [{ kind: "json-delta", delta: text }];
273
+ }
168
274
  if (state?.type === "refusal") return [{ kind: "refusal-delta", text }];
169
275
  return [{ kind: "text-delta", text }];
170
276
  }
@@ -196,7 +302,7 @@ var AnthropicStreamParser = class {
196
302
  }
197
303
  messageDelta(payload) {
198
304
  const chunks = [];
199
- const usage = usageChunk(payload.usage);
305
+ const usage = buildUsageChunk(payload.usage);
200
306
  if (usage) chunks.push(usage);
201
307
  const delta = isRecord(payload.delta) ? payload.delta : void 0;
202
308
  const stopReason = delta ? asString(delta.stop_reason) : void 0;
@@ -218,91 +324,41 @@ function parseResponse(body, options) {
218
324
  throw libraryError("anthropicAdapter.parseResponse expected an Anthropic message object");
219
325
  }
220
326
  if (asString(body.type) === "error" || isRecord(body.error)) {
221
- return providerErrorChunks2(body.error);
327
+ return providerErrorFromPayload(body.error);
222
328
  }
223
329
  const chunks = [];
224
330
  const id = asString(body.id);
225
331
  const model = asString(body.model);
226
332
  if (id) chunks.push({ kind: "message-start", id });
227
- if (id || model)
333
+ if (id || model) {
228
334
  chunks.push(optionalRawChunk({ kind: "metadata", responseId: id, model, raw: body }));
229
- const inputUsage = usageChunk(body.usage);
335
+ }
336
+ const inputUsage = buildUsageChunk(body.usage);
230
337
  if (inputUsage) chunks.push(inputUsage);
231
338
  const content = Array.isArray(body.content) ? body.content : [];
232
339
  for (let index = 0; index < content.length; index += 1) {
233
340
  const block = content[index];
234
341
  if (!isRecord(block)) continue;
235
- chunks.push(...responseBlockChunks(block, index, options));
342
+ chunks.push(...anthropicResponseBlockChunks(block, index, { jsonMode: options.jsonMode }));
236
343
  }
237
344
  const reason = finishReason(asString(body.stop_reason));
238
345
  if (reason) chunks.push({ kind: "finish", reason });
239
346
  return chunks;
240
347
  }
241
- function responseBlockChunks(block, index, options) {
242
- const type = asString(block.type);
243
- switch (type) {
244
- case "text": {
245
- const text = asString(block.text);
246
- if (!text) return [];
247
- return options.jsonMode ? [{ kind: "json-delta", delta: text }] : [{ kind: "text-delta", text }];
248
- }
249
- case "thinking": {
250
- const text = asString(block.thinking);
251
- return text ? [{ kind: "reasoning-delta", text, variant: "detail" }] : [];
252
- }
253
- case "tool_use": {
254
- const id = asString(block.id);
255
- const name = asString(block.name) ?? "unknown";
256
- const chunks = [optionalRawChunk({ kind: "tool-start", id, name, index })];
257
- if (block.input !== void 0) {
258
- chunks.push(
259
- optionalRawChunk({
260
- kind: "tool-args-delta",
261
- id,
262
- delta: JSON.stringify(block.input),
263
- index
264
- })
265
- );
266
- }
267
- chunks.push(optionalRawChunk({ kind: "tool-done", id, index }));
268
- return chunks;
269
- }
270
- case "refusal": {
271
- const text = asString(block.refusal) ?? asString(block.text);
272
- return text ? [{ kind: "refusal-delta", text }] : [];
273
- }
274
- default:
275
- return [];
276
- }
277
- }
278
348
  function finishReason(value) {
279
- switch (value) {
280
- case "end_turn":
281
- case "stop_sequence":
282
- return "stop";
283
- case "max_tokens":
284
- return "length";
285
- case "tool_use":
286
- return "tool_calls";
287
- case "refusal":
288
- return "content_filter";
289
- case void 0:
290
- case null:
291
- return void 0;
292
- default:
293
- return "stop";
294
- }
295
- }
296
- function usageChunk(value) {
297
- if (!isRecord(value)) return void 0;
298
- const inputTokens = asNumber(value.input_tokens);
299
- const outputTokens = asNumber(value.output_tokens);
300
- if (inputTokens === void 0 && outputTokens === void 0) return void 0;
301
- return optionalRawChunk({ kind: "usage", inputTokens, outputTokens, raw: value });
349
+ if (value === void 0 || value === null) return void 0;
350
+ return mapAnthropicLikeStopReason(value);
302
351
  }
303
- function providerErrorChunks2(value) {
304
- const message = isRecord(value) ? asString(value.message) : void 0;
305
- return providerErrorChunksFromMessage(message ?? "Anthropic provider error", false);
352
+ function providerErrorFromPayload(value) {
353
+ if (isRecord(value)) {
354
+ return providerErrorChunksFromPayload(
355
+ value,
356
+ "anthropicAdapter.parseChunk",
357
+ false,
358
+ "Anthropic provider error"
359
+ );
360
+ }
361
+ return providerErrorChunksFromMessage("Anthropic provider error", false);
306
362
  }
307
363
 
308
364
  export { anthropicAdapter };
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/adapters/utils.ts","../../src/adapters/errors.ts","../../src/adapters/anthropic.ts"],"names":["providerErrorChunks"],"mappings":";AAIO,SAAS,SAAS,KAAA,EAAkD;AAC1E,EAAA,OAAO,OAAO,UAAU,QAAA,IAAY,KAAA,KAAU,QAAQ,CAAC,KAAA,CAAM,QAAQ,KAAK,CAAA;AAC3E;AAEO,SAAS,SAAS,KAAA,EAAoC;AAC5D,EAAA,OAAO,OAAO,KAAA,KAAU,QAAA,GAAW,KAAA,GAAQ,MAAA;AAC5C;AAEO,SAAS,SAAS,KAAA,EAAoC;AAC5D,EAAA,OAAO,OAAO,KAAA,KAAU,QAAA,IAAY,OAAO,QAAA,CAAS,KAAK,IAAI,KAAA,GAAQ,MAAA;AACtE;AAEO,SAAS,iBAAiB,KAAA,EAA0C;AAC1E,EAAA,OAAO,MAAA,CAAO,WAAA;AAAA,IACb,MAAA,CAAO,OAAA,CAAQ,KAAK,CAAA,CAAE,MAAA,CAAO,CAAC,GAAG,KAAK,CAAA,KAAM,KAAA,KAAU,MAAS;AAAA,GAChE;AACD;AAEO,SAAS,oBAAA,CAAqB,SAAiB,OAAA,EAAwB;AAC7E,EAAA,OAAO,kBAAA,CAAmB,SAAS,OAAO,CAAA;AAC3C;AAEO,SAAS,oBAA8B,MAAA,EAI5B;AACjB,EAAA,OAAO;AAAA,IACN,WAAW,GAAA,EAAK;AACf,MAAA,OAAO,MAAA,CAAO,MAAA,CAAO,UAAA,CAAW,GAAG,CAAA;AAAA,IACpC,CAAA;AAAA,IACA,cAAc,IAAA,EAAM;AACnB,MAAA,OAAO,MAAA,CAAO,aAAA,CAAc,IAAA,EAAM,MAAA,CAAO,OAAO,CAAA;AAAA,IACjD;AAAA,GACD;AACD;AAEO,SAAS,gBAAA,CAAiB,KAAa,OAAA,EAA0B;AACvE,EAAA,IAAI;AACH,IAAA,OAAO,IAAA,CAAK,MAAM,GAAG,CAAA;AAAA,EACtB,SAAS,KAAA,EAAO;AACf,IAAA,MAAM,UAAU,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,OAAO,KAAK,CAAA;AACrE,IAAA,MAAM,oBAAA,CAAqB,SAAS,OAAO,CAAA;AAAA,EAC5C;AACD;;;AC5CO,SAAS,aAAa,OAAA,EAAwB;AACpD,EAAA,OAAO,IAAI,KAAA,CAAM,CAAA,qBAAA,EAAwB,OAAO,CAAA,CAAE,CAAA;AACnD;AAEO,SAAS,kBAAA,CAAmB,OAAe,OAAA,EAAwB;AACzE,EAAA,OAAO,IAAI,KAAA,CAAM,CAAA,qBAAA,EAAwB,KAAK,CAAA,EAAA,EAAK,OAAO,CAAA,CAAE,CAAA;AAC7D;AAEO,SAAS,mBAAA,CAAoB,KAAA,EAAc,WAAA,GAAc,KAAA,EAAmB;AAClF,EAAA,OAAO;AAAA,IACN,EAAE,IAAA,EAAM,gBAAA,EAAkB,KAAA,EAAO,WAAA,EAAY;AAAA,IAC7C,EAAE,IAAA,EAAM,QAAA,EAAU,MAAA,EAAQ,OAAA;AAAQ,GACnC;AACD;AAEO,SAAS,8BAAA,CAA+B,OAAA,EAAiB,WAAA,GAAc,KAAA,EAAmB;AAChG,EAAA,OAAO,mBAAA,CAAoB,YAAA,CAAa,OAAO,CAAA,EAAG,WAAW,CAAA;AAC9D;;;ACGO,SAAS,gBAAA,CAAiB,OAAA,GAAmC,EAAC,EAAkB;AACtF,EAAA,MAAM,MAAA,GAAS,IAAI,qBAAA,CAAsB,OAAO,CAAA;AAChD,EAAA,OAAO,mBAAA,CAAoB;AAAA,IAC1B,MAAA;AAAA,IACA,aAAA;AAAA,IACA;AAAA,GACA,CAAA;AACF;AAEA,IAAM,wBAAN,MAA4B;AAAA,EAI3B,YAA6B,OAAA,EAAkC;AAAlC,IAAA,IAAA,CAAA,OAAA,GAAA,OAAA;AAAA,EAAmC;AAAA,EAAnC,OAAA;AAAA,EAHZ,MAAA,uBAAa,GAAA,EAAwB;AAAA,EAC9C,SAAA,GAAY,KAAA;AAAA,EAIpB,WAAW,GAAA,EAAyB;AACnC,IAAA,MAAM,OAAA,GAAU,gBAAA,CAAiB,GAAA,EAAK,6BAA6B,CAAA;AACnE,IAAA,IAAI,CAAC,QAAA,CAAS,OAAO,CAAA,EAAG;AACvB,MAAA,MAAM,aAAa,oDAAoD,CAAA;AAAA,IACxE;AAEA,IAAA,MAAM,IAAA,GAAO,QAAA,CAAS,OAAA,CAAQ,IAAI,CAAA;AAClC,IAAA,QAAQ,IAAA;AAAM,MACb,KAAK,MAAA;AACJ,QAAA,OAAO,EAAC;AAAA,MACT,KAAK,eAAA;AACJ,QAAA,OAAO,IAAA,CAAK,aAAa,OAAO,CAAA;AAAA,MACjC,KAAK,qBAAA;AACJ,QAAA,OAAO,IAAA,CAAK,kBAAkB,OAAO,CAAA;AAAA,MACtC,KAAK,qBAAA;AACJ,QAAA,OAAO,IAAA,CAAK,kBAAkB,OAAO,CAAA;AAAA,MACtC,KAAK,oBAAA;AACJ,QAAA,OAAO,IAAA,CAAK,iBAAiB,OAAO,CAAA;AAAA,MACrC,KAAK,eAAA;AACJ,QAAA,OAAO,IAAA,CAAK,aAAa,OAAO,CAAA;AAAA,MACjC,KAAK,cAAA;AACJ,QAAA,OAAO,KAAK,WAAA,EAAY;AAAA,MACzB,KAAK,OAAA;AACJ,QAAA,OAAOA,oBAAAA,CAAoB,QAAQ,KAAK,CAAA;AAAA,MACzC;AACC,QAAA,MAAM,YAAA,CAAa,CAAA,gDAAA,EAAmD,MAAA,CAAO,IAAI,CAAC,CAAA,CAAE,CAAA;AAAA;AACtF,EACD;AAAA,EAEQ,aAAa,OAAA,EAA8C;AAClE,IAAA,MAAM,UAAU,QAAA,CAAS,OAAA,CAAQ,OAAO,CAAA,GAAI,QAAQ,OAAA,GAAU,MAAA;AAC9D,IAAA,IAAI,CAAC,OAAA,EAAS,OAAO,EAAC;AACtB,IAAA,MAAM,SAAqB,EAAC;AAC5B,IAAA,MAAM,EAAA,GAAK,QAAA,CAAS,OAAA,CAAQ,EAAE,CAAA;AAC9B,IAAA,MAAM,KAAA,GAAQ,QAAA,CAAS,OAAA,CAAQ,KAAK,CAAA;AACpC,IAAA,IAAI,IAAI,MAAA,CAAO,IAAA,CAAK,EAAE,IAAA,EAAM,eAAA,EAAiB,IAAI,CAAA;AACjD,IAAA,IAAI,MAAM,KAAA,EAAO;AAChB,MAAA,MAAA,CAAO,IAAA,CAAK,gBAAA,CAAiB,EAAE,IAAA,EAAM,UAAA,EAAY,UAAA,EAAY,EAAA,EAAI,KAAA,EAAO,GAAA,EAAK,OAAA,EAAS,CAAC,CAAA;AAAA,IACxF;AACA,IAAA,MAAM,KAAA,GAAQ,UAAA,CAAW,OAAA,CAAQ,KAAK,CAAA;AACtC,IAAA,IAAI,KAAA,EAAO,MAAA,CAAO,IAAA,CAAK,KAAK,CAAA;AAC5B,IAAA,OAAO,MAAA;AAAA,EACR;AAAA,EAEQ,kBAAkB,OAAA,EAA8C;AACvE,IAAA,MAAM,KAAA,GAAQ,QAAA,CAAS,OAAA,CAAQ,KAAK,CAAA,IAAK,CAAA;AACzC,IAAA,MAAM,QAAQ,QAAA,CAAS,OAAA,CAAQ,aAAa,CAAA,GAAI,QAAQ,aAAA,GAAgB,MAAA;AACxE,IAAA,IAAI,CAAC,KAAA,EAAO,OAAO,EAAC;AACpB,IAAA,MAAM,SAAA,GAAY,QAAA,CAAS,KAAA,CAAM,IAAI,CAAA,IAAK,SAAA;AAC1C,IAAA,MAAM,KAAA,GAAoB,EAAE,IAAA,EAAM,SAAA,EAAU;AAC5C,IAAA,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,KAAA,EAAO,KAAK,CAAA;AAE5B,IAAA,QAAQ,SAAA;AAAW,MAClB,KAAK,MAAA,EAAQ;AACZ,QAAA,MAAM,IAAA,GAAO,QAAA,CAAS,KAAA,CAAM,IAAI,CAAA;AAChC,QAAA,OAAO,IAAA,GAAO,CAAC,EAAE,IAAA,EAAM,cAAc,IAAA,EAAM,IAAI,EAAC;AAAA,MACjD;AAAA,MACA,KAAK,UAAA,EAAY;AAChB,QAAA,MAAM,IAAA,GAAO,QAAA,CAAS,KAAA,CAAM,QAAQ,CAAA;AACpC,QAAA,OAAO,IAAA,GAAO,CAAC,EAAE,IAAA,EAAM,iBAAA,EAAmB,MAAM,OAAA,EAAS,QAAA,EAAU,CAAA,GAAI,EAAC;AAAA,MACzE;AAAA,MACA,KAAK,mBAAA;AACJ,QAAA,OAAO,EAAC;AAAA,MACT,KAAK,UAAA,EAAY;AAChB,QAAA,MAAM,EAAA,GAAK,QAAA,CAAS,KAAA,CAAM,EAAE,CAAA;AAC5B,QAAA,MAAM,IAAA,GAAO,QAAA,CAAS,KAAA,CAAM,IAAI,CAAA,IAAK,SAAA;AACrC,QAAA,IAAI,EAAA,QAAU,EAAA,GAAK,EAAA;AACnB,QAAA,KAAA,CAAM,IAAA,GAAO,IAAA;AACb,QAAA,MAAM,MAAA,GAAqB,CAAC,gBAAA,CAAiB,EAAE,IAAA,EAAM,cAAc,EAAA,EAAI,IAAA,EAAM,KAAA,EAAO,CAAC,CAAA;AACrF,QAAA,MAAM,QAAQ,KAAA,CAAM,KAAA;AACpB,QAAA,IAAI,KAAA,KAAU,MAAA,IAAa,EAAE,QAAA,CAAS,KAAK,CAAA,IAAK,MAAA,CAAO,IAAA,CAAK,KAAK,CAAA,CAAE,MAAA,KAAW,CAAA,CAAA,EAAI;AACjF,UAAA,MAAA,CAAO,IAAA;AAAA,YACN,gBAAA,CAAiB,EAAE,IAAA,EAAM,iBAAA,EAAmB,EAAA,EAAI,KAAA,EAAO,IAAA,CAAK,SAAA,CAAU,KAAK,CAAA,EAAG,KAAA,EAAO;AAAA,WACtF;AAAA,QACD;AACA,QAAA,OAAO,MAAA;AAAA,MACR;AAAA,MACA,KAAK,MAAA,EAAQ;AACZ,QAAA,MAAM,OAAO,QAAA,CAAS,KAAA,CAAM,IAAI,CAAA,IAAK,QAAA,CAAS,MAAM,YAAY,CAAA;AAChE,QAAA,OAAO,IAAA,GAAO,CAAC,EAAE,IAAA,EAAM,cAAc,KAAA,EAAO,IAAA,EAAM,CAAA,GAAI,EAAC;AAAA,MACxD;AAAA,MACA,KAAK,SAAA,EAAW;AACf,QAAA,MAAM,OAAO,QAAA,CAAS,KAAA,CAAM,OAAO,CAAA,IAAK,QAAA,CAAS,MAAM,IAAI,CAAA;AAC3D,QAAA,OAAO,IAAA,GAAO,CAAC,EAAE,IAAA,EAAM,iBAAiB,IAAA,EAAM,IAAI,EAAC;AAAA,MACpD;AAAA,MACA;AACC,QAAA,OAAO,EAAC;AAAA;AACV,EACD;AAAA,EAEQ,kBAAkB,OAAA,EAA8C;AACvE,IAAA,MAAM,KAAA,GAAQ,QAAA,CAAS,OAAA,CAAQ,KAAK,CAAA,IAAK,CAAA;AACzC,IAAA,MAAM,QAAQ,QAAA,CAAS,OAAA,CAAQ,KAAK,CAAA,GAAI,QAAQ,KAAA,GAAQ,MAAA;AACxD,IAAA,IAAI,CAAC,KAAA,EAAO,OAAO,EAAC;AACpB,IAAA,MAAM,SAAA,GAAY,QAAA,CAAS,KAAA,CAAM,IAAI,CAAA;AACrC,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,KAAK,CAAA;AAEnC,IAAA,QAAQ,SAAA;AAAW,MAClB,KAAK,YAAA,EAAc;AAClB,QAAA,MAAM,IAAA,GAAO,QAAA,CAAS,KAAA,CAAM,IAAI,CAAA;AAChC,QAAA,IAAI,CAAC,IAAA,EAAM,OAAO,EAAC;AACnB,QAAA,IAAI,IAAA,CAAK,OAAA,CAAQ,QAAA,IAAY,KAAA,EAAO,IAAA,KAAS,MAAA;AAC5C,UAAA,OAAO,CAAC,EAAE,IAAA,EAAM,YAAA,EAAc,KAAA,EAAO,MAAM,CAAA;AAC5C,QAAA,IAAI,KAAA,EAAO,SAAS,SAAA,EAAW,OAAO,CAAC,EAAE,IAAA,EAAM,eAAA,EAAiB,IAAA,EAAM,CAAA;AACtE,QAAA,OAAO,CAAC,EAAE,IAAA,EAAM,YAAA,EAAc,MAAM,CAAA;AAAA,MACrC;AAAA,MACA,KAAK,gBAAA,EAAkB;AACtB,QAAA,MAAM,IAAA,GAAO,QAAA,CAAS,KAAA,CAAM,QAAQ,CAAA;AACpC,QAAA,OAAO,IAAA,GAAO,CAAC,EAAE,IAAA,EAAM,iBAAA,EAAmB,MAAM,OAAA,EAAS,QAAA,EAAU,CAAA,GAAI,EAAC;AAAA,MACzE;AAAA,MACA,KAAK,kBAAA,EAAoB;AACxB,QAAA,MAAM,OAAA,GAAU,QAAA,CAAS,KAAA,CAAM,YAAY,CAAA;AAC3C,QAAA,IAAI,CAAC,OAAA,EAAS,OAAO,EAAC;AACtB,QAAA,OAAO;AAAA,UACN,gBAAA,CAAiB,EAAE,IAAA,EAAM,iBAAA,EAAmB,EAAA,EAAI,OAAO,EAAA,EAAI,KAAA,EAAO,OAAA,EAAS,KAAA,EAAO;AAAA,SACnF;AAAA,MACD;AAAA,MACA,KAAK,iBAAA;AACJ,QAAA,OAAO,EAAC;AAAA,MACT;AACC,QAAA,OAAO,EAAC;AAAA;AACV,EACD;AAAA,EAEQ,iBAAiB,OAAA,EAA8C;AACtE,IAAA,MAAM,KAAA,GAAQ,QAAA,CAAS,OAAA,CAAQ,KAAK,CAAA,IAAK,CAAA;AACzC,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,KAAK,CAAA;AACnC,IAAA,IAAA,CAAK,MAAA,CAAO,OAAO,KAAK,CAAA;AACxB,IAAA,IAAI,KAAA,EAAO,SAAS,UAAA,EAAY;AAC/B,MAAA,OAAO,CAAC,gBAAA,CAAiB,EAAE,IAAA,EAAM,WAAA,EAAa,IAAI,KAAA,CAAM,EAAA,EAAI,KAAA,EAAO,CAAC,CAAA;AAAA,IACrE;AACA,IAAA,OAAO,EAAC;AAAA,EACT;AAAA,EAEQ,aAAa,OAAA,EAA8C;AAClE,IAAA,MAAM,SAAqB,EAAC;AAC5B,IAAA,MAAM,KAAA,GAAQ,UAAA,CAAW,OAAA,CAAQ,KAAK,CAAA;AACtC,IAAA,IAAI,KAAA,EAAO,MAAA,CAAO,IAAA,CAAK,KAAK,CAAA;AAC5B,IAAA,MAAM,QAAQ,QAAA,CAAS,OAAA,CAAQ,KAAK,CAAA,GAAI,QAAQ,KAAA,GAAQ,MAAA;AACxD,IAAA,MAAM,UAAA,GAAa,KAAA,GAAQ,QAAA,CAAS,KAAA,CAAM,WAAW,CAAA,GAAI,MAAA;AACzD,IAAA,IAAI,UAAA,EAAY;AACf,MAAA,MAAM,MAAA,GAAS,aAAa,UAAU,CAAA;AACtC,MAAA,IAAI,QAAQ,MAAA,CAAO,IAAA,CAAK,EAAE,IAAA,EAAM,QAAA,EAAU,QAAQ,CAAA;AAClD,MAAA,IAAA,CAAK,SAAA,GAAY,IAAA;AAAA,IAClB;AACA,IAAA,OAAO,MAAA;AAAA,EACR;AAAA,EAEQ,WAAA,GAA0B;AACjC,IAAA,IAAI,IAAA,CAAK,SAAA,EAAW,OAAO,EAAC;AAC5B,IAAA,IAAA,CAAK,SAAA,GAAY,IAAA;AACjB,IAAA,OAAO,CAAC,EAAE,IAAA,EAAM,QAAA,EAAU,MAAA,EAAQ,QAAQ,CAAA;AAAA,EAC3C;AACD,CAAA;AAEA,SAAS,aAAA,CAAc,MAAe,OAAA,EAA8C;AACnF,EAAA,IAAI,CAAC,QAAA,CAAS,IAAI,CAAA,EAAG;AACpB,IAAA,MAAM,aAAa,qEAAqE,CAAA;AAAA,EACzF;AACA,EAAA,IAAI,QAAA,CAAS,KAAK,IAAI,CAAA,KAAM,WAAW,QAAA,CAAS,IAAA,CAAK,KAAK,CAAA,EAAG;AAC5D,IAAA,OAAOA,oBAAAA,CAAoB,KAAK,KAAK,CAAA;AAAA,EACtC;AAEA,EAAA,MAAM,SAAqB,EAAC;AAC5B,EAAA,MAAM,EAAA,GAAK,QAAA,CAAS,IAAA,CAAK,EAAE,CAAA;AAC3B,EAAA,MAAM,KAAA,GAAQ,QAAA,CAAS,IAAA,CAAK,KAAK,CAAA;AACjC,EAAA,IAAI,IAAI,MAAA,CAAO,IAAA,CAAK,EAAE,IAAA,EAAM,eAAA,EAAiB,IAAI,CAAA;AACjD,EAAA,IAAI,EAAA,IAAM,KAAA;AACT,IAAA,MAAA,CAAO,IAAA,CAAK,gBAAA,CAAiB,EAAE,IAAA,EAAM,UAAA,EAAY,UAAA,EAAY,EAAA,EAAI,KAAA,EAAO,GAAA,EAAK,IAAA,EAAM,CAAC,CAAA;AACrF,EAAA,MAAM,UAAA,GAAa,UAAA,CAAW,IAAA,CAAK,KAAK,CAAA;AACxC,EAAA,IAAI,UAAA,EAAY,MAAA,CAAO,IAAA,CAAK,UAAU,CAAA;AAEtC,EAAA,MAAM,OAAA,GAAU,MAAM,OAAA,CAAQ,IAAA,CAAK,OAAO,CAAA,GAAI,IAAA,CAAK,UAAU,EAAC;AAC9D,EAAA,KAAA,IAAS,QAAQ,CAAA,EAAG,KAAA,GAAQ,OAAA,CAAQ,MAAA,EAAQ,SAAS,CAAA,EAAG;AACvD,IAAA,MAAM,KAAA,GAAQ,QAAQ,KAAK,CAAA;AAC3B,IAAA,IAAI,CAAC,QAAA,CAAS,KAAK,CAAA,EAAG;AACtB,IAAA,MAAA,CAAO,KAAK,GAAG,mBAAA,CAAoB,KAAA,EAAO,KAAA,EAAO,OAAO,CAAC,CAAA;AAAA,EAC1D;AAEA,EAAA,MAAM,MAAA,GAAS,YAAA,CAAa,QAAA,CAAS,IAAA,CAAK,WAAW,CAAC,CAAA;AACtD,EAAA,IAAI,QAAQ,MAAA,CAAO,IAAA,CAAK,EAAE,IAAA,EAAM,QAAA,EAAU,QAAQ,CAAA;AAClD,EAAA,OAAO,MAAA;AACR;AAEA,SAAS,mBAAA,CACR,KAAA,EACA,KAAA,EACA,OAAA,EACa;AACb,EAAA,MAAM,IAAA,GAAO,QAAA,CAAS,KAAA,CAAM,IAAI,CAAA;AAChC,EAAA,QAAQ,IAAA;AAAM,IACb,KAAK,MAAA,EAAQ;AACZ,MAAA,MAAM,IAAA,GAAO,QAAA,CAAS,KAAA,CAAM,IAAI,CAAA;AAChC,MAAA,IAAI,CAAC,IAAA,EAAM,OAAO,EAAC;AACnB,MAAA,OAAO,OAAA,CAAQ,QAAA,GACZ,CAAC,EAAE,MAAM,YAAA,EAAc,KAAA,EAAO,IAAA,EAAM,IACpC,CAAC,EAAE,IAAA,EAAM,YAAA,EAAc,MAAM,CAAA;AAAA,IACjC;AAAA,IACA,KAAK,UAAA,EAAY;AAChB,MAAA,MAAM,IAAA,GAAO,QAAA,CAAS,KAAA,CAAM,QAAQ,CAAA;AACpC,MAAA,OAAO,IAAA,GAAO,CAAC,EAAE,IAAA,EAAM,iBAAA,EAAmB,MAAM,OAAA,EAAS,QAAA,EAAU,CAAA,GAAI,EAAC;AAAA,IACzE;AAAA,IACA,KAAK,UAAA,EAAY;AAChB,MAAA,MAAM,EAAA,GAAK,QAAA,CAAS,KAAA,CAAM,EAAE,CAAA;AAC5B,MAAA,MAAM,IAAA,GAAO,QAAA,CAAS,KAAA,CAAM,IAAI,CAAA,IAAK,SAAA;AACrC,MAAA,MAAM,MAAA,GAAqB,CAAC,gBAAA,CAAiB,EAAE,IAAA,EAAM,cAAc,EAAA,EAAI,IAAA,EAAM,KAAA,EAAO,CAAC,CAAA;AACrF,MAAA,IAAI,KAAA,CAAM,UAAU,MAAA,EAAW;AAC9B,QAAA,MAAA,CAAO,IAAA;AAAA,UACN,gBAAA,CAAiB;AAAA,YAChB,IAAA,EAAM,iBAAA;AAAA,YACN,EAAA;AAAA,YACA,KAAA,EAAO,IAAA,CAAK,SAAA,CAAU,KAAA,CAAM,KAAK,CAAA;AAAA,YACjC;AAAA,WACA;AAAA,SACF;AAAA,MACD;AACA,MAAA,MAAA,CAAO,IAAA,CAAK,iBAAiB,EAAE,IAAA,EAAM,aAAa,EAAA,EAAI,KAAA,EAAO,CAAC,CAAA;AAC9D,MAAA,OAAO,MAAA;AAAA,IACR;AAAA,IACA,KAAK,SAAA,EAAW;AACf,MAAA,MAAM,OAAO,QAAA,CAAS,KAAA,CAAM,OAAO,CAAA,IAAK,QAAA,CAAS,MAAM,IAAI,CAAA;AAC3D,MAAA,OAAO,IAAA,GAAO,CAAC,EAAE,IAAA,EAAM,iBAAiB,IAAA,EAAM,IAAI,EAAC;AAAA,IACpD;AAAA,IACA;AACC,MAAA,OAAO,EAAC;AAAA;AAEX;AAEA,SAAS,aAAa,KAAA,EAAqD;AAC1E,EAAA,QAAQ,KAAA;AAAO,IACd,KAAK,UAAA;AAAA,IACL,KAAK,eAAA;AACJ,MAAA,OAAO,MAAA;AAAA,IACR,KAAK,YAAA;AACJ,MAAA,OAAO,QAAA;AAAA,IACR,KAAK,UAAA;AACJ,MAAA,OAAO,YAAA;AAAA,IACR,KAAK,SAAA;AACJ,MAAA,OAAO,gBAAA;AAAA,IACR,KAAK,MAAA;AAAA,IACL,KAAK,IAAA;AACJ,MAAA,OAAO,MAAA;AAAA,IACR;AACC,MAAA,OAAO,MAAA;AAAA;AAEV;AAEA,SAAS,WAAW,KAAA,EAAsC;AACzD,EAAA,IAAI,CAAC,QAAA,CAAS,KAAK,CAAA,EAAG,OAAO,MAAA;AAC7B,EAAA,MAAM,WAAA,GAAc,QAAA,CAAS,KAAA,CAAM,YAAY,CAAA;AAC/C,EAAA,MAAM,YAAA,GAAe,QAAA,CAAS,KAAA,CAAM,aAAa,CAAA;AACjD,EAAA,IAAI,WAAA,KAAgB,MAAA,IAAa,YAAA,KAAiB,MAAA,EAAW,OAAO,MAAA;AACpE,EAAA,OAAO,gBAAA,CAAiB,EAAE,IAAA,EAAM,OAAA,EAAS,aAAa,YAAA,EAAc,GAAA,EAAK,OAAO,CAAA;AACjF;AAEA,SAASA,qBAAoB,KAAA,EAA4B;AACxD,EAAA,MAAM,UAAU,QAAA,CAAS,KAAK,IAAI,QAAA,CAAS,KAAA,CAAM,OAAO,CAAA,GAAI,MAAA;AAC5D,EAAA,OAAO,8BAAA,CAA+B,OAAA,IAAW,0BAAA,EAA4B,KAAK,CAAA;AACnF","file":"anthropic.js","sourcesContent":["/** Internal adapter utilities. Not part of the public API. */\nimport type { RawChunk, StreamAdapter } from \"../core/types\";\nimport { adapterScopedError } from \"./errors\";\n\nexport function isRecord(value: unknown): value is Record<string, unknown> {\n\treturn typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nexport function asString(value: unknown): string | undefined {\n\treturn typeof value === \"string\" ? value : undefined;\n}\n\nexport function asNumber(value: unknown): number | undefined {\n\treturn typeof value === \"number\" && Number.isFinite(value) ? value : undefined;\n}\n\nexport function optionalRawChunk(input: Record<string, unknown>): RawChunk {\n\treturn Object.fromEntries(\n\t\tObject.entries(input).filter(([, value]) => value !== undefined),\n\t) as RawChunk;\n}\n\nexport function prefixedAdapterError(feature: string, message: string): Error {\n\treturn adapterScopedError(feature, message);\n}\n\nexport function createStreamAdapter<TOptions>(config: {\n\tparser: { parseChunk(raw: string): RawChunk[] };\n\tparseResponse: (body: unknown, options: TOptions) => RawChunk[];\n\toptions: TOptions;\n}): StreamAdapter {\n\treturn {\n\t\tparseChunk(raw) {\n\t\t\treturn config.parser.parseChunk(raw);\n\t\t},\n\t\tparseResponse(body) {\n\t\t\treturn config.parseResponse(body, config.options);\n\t\t},\n\t};\n}\n\nexport function parseAdapterJSON(raw: string, feature: string): unknown {\n\ttry {\n\t\treturn JSON.parse(raw) as unknown;\n\t} catch (error) {\n\t\tconst message = error instanceof Error ? error.message : String(error);\n\t\tthrow prefixedAdapterError(feature, message);\n\t}\n}\n","/** Internal adapter error helpers. Not part of the public API. */\nimport type { RawChunk } from \"../core/types\";\nimport { asString } from \"./utils\";\n\nexport function libraryError(message: string): Error {\n\treturn new Error(`llm-stream-assemble: ${message}`);\n}\n\nexport function adapterScopedError(scope: string, message: string): Error {\n\treturn new Error(`llm-stream-assemble: ${scope}: ${message}`);\n}\n\nexport function providerErrorChunks(error: Error, recoverable = false): RawChunk[] {\n\treturn [\n\t\t{ kind: \"provider-error\", error, recoverable },\n\t\t{ kind: \"finish\", reason: \"error\" },\n\t];\n}\n\nexport function providerErrorChunksFromMessage(message: string, recoverable = false): RawChunk[] {\n\treturn providerErrorChunks(libraryError(message), recoverable);\n}\n\nexport function providerErrorChunksFromPayload(\n\terrorPayload: Record<string, unknown>,\n\tscope: string,\n\trecoverable: boolean,\n\tfallbackMessage: string,\n): RawChunk[] {\n\tconst message = asString(errorPayload.message) ?? fallbackMessage;\n\tconst error = adapterScopedError(scope, message);\n\tObject.defineProperty(error, \"raw\", {\n\t\tvalue: errorPayload,\n\t\tenumerable: false,\n\t});\n\treturn providerErrorChunks(error, recoverable);\n}\n","import type { FinishReason, RawChunk, StreamAdapter } from \"../core/types\";\nimport { libraryError, providerErrorChunksFromMessage } from \"./errors\";\nimport {\n\tasNumber,\n\tasString,\n\tcreateStreamAdapter,\n\tisRecord,\n\toptionalRawChunk,\n\tparseAdapterJSON,\n} from \"./utils\";\n\nexport interface AnthropicAdapterOptions {\n\t/**\n\t * Map `json` content blocks to json-delta instead of text-delta.\n\t */\n\tjsonMode?: boolean;\n}\n\ninterface BlockState {\n\ttype: string;\n\tid?: string;\n\tname?: string;\n}\n\nexport function anthropicAdapter(options: AnthropicAdapterOptions = {}): StreamAdapter {\n\tconst parser = new AnthropicStreamParser(options);\n\treturn createStreamAdapter({\n\t\tparser,\n\t\tparseResponse,\n\t\toptions,\n\t});\n}\n\nclass AnthropicStreamParser {\n\tprivate readonly blocks = new Map<number, BlockState>();\n\tprivate sawFinish = false;\n\n\tconstructor(private readonly options: AnthropicAdapterOptions) {}\n\n\tparseChunk(raw: string): RawChunk[] {\n\t\tconst payload = parseAdapterJSON(raw, \"anthropicAdapter.parseChunk\");\n\t\tif (!isRecord(payload)) {\n\t\t\tthrow libraryError(\"anthropicAdapter.parseChunk expected a JSON object\");\n\t\t}\n\n\t\tconst type = asString(payload.type);\n\t\tswitch (type) {\n\t\t\tcase \"ping\":\n\t\t\t\treturn [];\n\t\t\tcase \"message_start\":\n\t\t\t\treturn this.messageStart(payload);\n\t\t\tcase \"content_block_start\":\n\t\t\t\treturn this.contentBlockStart(payload);\n\t\t\tcase \"content_block_delta\":\n\t\t\t\treturn this.contentBlockDelta(payload);\n\t\t\tcase \"content_block_stop\":\n\t\t\t\treturn this.contentBlockStop(payload);\n\t\t\tcase \"message_delta\":\n\t\t\t\treturn this.messageDelta(payload);\n\t\t\tcase \"message_stop\":\n\t\t\t\treturn this.messageStop();\n\t\t\tcase \"error\":\n\t\t\t\treturn providerErrorChunks(payload.error);\n\t\t\tdefault:\n\t\t\t\tthrow libraryError(`anthropicAdapter.parseChunk unknown event type: ${String(type)}`);\n\t\t}\n\t}\n\n\tprivate messageStart(payload: Record<string, unknown>): RawChunk[] {\n\t\tconst message = isRecord(payload.message) ? payload.message : undefined;\n\t\tif (!message) return [];\n\t\tconst chunks: RawChunk[] = [];\n\t\tconst id = asString(message.id);\n\t\tconst model = asString(message.model);\n\t\tif (id) chunks.push({ kind: \"message-start\", id });\n\t\tif (id || model) {\n\t\t\tchunks.push(optionalRawChunk({ kind: \"metadata\", responseId: id, model, raw: message }));\n\t\t}\n\t\tconst usage = usageChunk(message.usage);\n\t\tif (usage) chunks.push(usage);\n\t\treturn chunks;\n\t}\n\n\tprivate contentBlockStart(payload: Record<string, unknown>): RawChunk[] {\n\t\tconst index = asNumber(payload.index) ?? 0;\n\t\tconst block = isRecord(payload.content_block) ? payload.content_block : undefined;\n\t\tif (!block) return [];\n\t\tconst blockType = asString(block.type) ?? \"unknown\";\n\t\tconst state: BlockState = { type: blockType };\n\t\tthis.blocks.set(index, state);\n\n\t\tswitch (blockType) {\n\t\t\tcase \"text\": {\n\t\t\t\tconst text = asString(block.text);\n\t\t\t\treturn text ? [{ kind: \"text-delta\", text }] : [];\n\t\t\t}\n\t\t\tcase \"thinking\": {\n\t\t\t\tconst text = asString(block.thinking);\n\t\t\t\treturn text ? [{ kind: \"reasoning-delta\", text, variant: \"detail\" }] : [];\n\t\t\t}\n\t\t\tcase \"redacted_thinking\":\n\t\t\t\treturn [];\n\t\t\tcase \"tool_use\": {\n\t\t\t\tconst id = asString(block.id);\n\t\t\t\tconst name = asString(block.name) ?? \"unknown\";\n\t\t\t\tif (id) state.id = id;\n\t\t\t\tstate.name = name;\n\t\t\t\tconst chunks: RawChunk[] = [optionalRawChunk({ kind: \"tool-start\", id, name, index })];\n\t\t\t\tconst input = block.input;\n\t\t\t\tif (input !== undefined && !(isRecord(input) && Object.keys(input).length === 0)) {\n\t\t\t\t\tchunks.push(\n\t\t\t\t\t\toptionalRawChunk({ kind: \"tool-args-delta\", id, delta: JSON.stringify(input), index }),\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\treturn chunks;\n\t\t\t}\n\t\t\tcase \"json\": {\n\t\t\t\tconst text = asString(block.text) ?? asString(block.partial_json);\n\t\t\t\treturn text ? [{ kind: \"json-delta\", delta: text }] : [];\n\t\t\t}\n\t\t\tcase \"refusal\": {\n\t\t\t\tconst text = asString(block.refusal) ?? asString(block.text);\n\t\t\t\treturn text ? [{ kind: \"refusal-delta\", text }] : [];\n\t\t\t}\n\t\t\tdefault:\n\t\t\t\treturn [];\n\t\t}\n\t}\n\n\tprivate contentBlockDelta(payload: Record<string, unknown>): RawChunk[] {\n\t\tconst index = asNumber(payload.index) ?? 0;\n\t\tconst delta = isRecord(payload.delta) ? payload.delta : undefined;\n\t\tif (!delta) return [];\n\t\tconst deltaType = asString(delta.type);\n\t\tconst state = this.blocks.get(index);\n\n\t\tswitch (deltaType) {\n\t\t\tcase \"text_delta\": {\n\t\t\t\tconst text = asString(delta.text);\n\t\t\t\tif (!text) return [];\n\t\t\t\tif (this.options.jsonMode || state?.type === \"json\")\n\t\t\t\t\treturn [{ kind: \"json-delta\", delta: text }];\n\t\t\t\tif (state?.type === \"refusal\") return [{ kind: \"refusal-delta\", text }];\n\t\t\t\treturn [{ kind: \"text-delta\", text }];\n\t\t\t}\n\t\t\tcase \"thinking_delta\": {\n\t\t\t\tconst text = asString(delta.thinking);\n\t\t\t\treturn text ? [{ kind: \"reasoning-delta\", text, variant: \"detail\" }] : [];\n\t\t\t}\n\t\t\tcase \"input_json_delta\": {\n\t\t\t\tconst partial = asString(delta.partial_json);\n\t\t\t\tif (!partial) return [];\n\t\t\t\treturn [\n\t\t\t\t\toptionalRawChunk({ kind: \"tool-args-delta\", id: state?.id, delta: partial, index }),\n\t\t\t\t];\n\t\t\t}\n\t\t\tcase \"signature_delta\":\n\t\t\t\treturn [];\n\t\t\tdefault:\n\t\t\t\treturn [];\n\t\t}\n\t}\n\n\tprivate contentBlockStop(payload: Record<string, unknown>): RawChunk[] {\n\t\tconst index = asNumber(payload.index) ?? 0;\n\t\tconst state = this.blocks.get(index);\n\t\tthis.blocks.delete(index);\n\t\tif (state?.type === \"tool_use\") {\n\t\t\treturn [optionalRawChunk({ kind: \"tool-done\", id: state.id, index })];\n\t\t}\n\t\treturn [];\n\t}\n\n\tprivate messageDelta(payload: Record<string, unknown>): RawChunk[] {\n\t\tconst chunks: RawChunk[] = [];\n\t\tconst usage = usageChunk(payload.usage);\n\t\tif (usage) chunks.push(usage);\n\t\tconst delta = isRecord(payload.delta) ? payload.delta : undefined;\n\t\tconst stopReason = delta ? asString(delta.stop_reason) : undefined;\n\t\tif (stopReason) {\n\t\t\tconst reason = finishReason(stopReason);\n\t\t\tif (reason) chunks.push({ kind: \"finish\", reason });\n\t\t\tthis.sawFinish = true;\n\t\t}\n\t\treturn chunks;\n\t}\n\n\tprivate messageStop(): RawChunk[] {\n\t\tif (this.sawFinish) return [];\n\t\tthis.sawFinish = true;\n\t\treturn [{ kind: \"finish\", reason: \"stop\" }];\n\t}\n}\n\nfunction parseResponse(body: unknown, options: AnthropicAdapterOptions): RawChunk[] {\n\tif (!isRecord(body)) {\n\t\tthrow libraryError(\"anthropicAdapter.parseResponse expected an Anthropic message object\");\n\t}\n\tif (asString(body.type) === \"error\" || isRecord(body.error)) {\n\t\treturn providerErrorChunks(body.error);\n\t}\n\n\tconst chunks: RawChunk[] = [];\n\tconst id = asString(body.id);\n\tconst model = asString(body.model);\n\tif (id) chunks.push({ kind: \"message-start\", id });\n\tif (id || model)\n\t\tchunks.push(optionalRawChunk({ kind: \"metadata\", responseId: id, model, raw: body }));\n\tconst inputUsage = usageChunk(body.usage);\n\tif (inputUsage) chunks.push(inputUsage);\n\n\tconst content = Array.isArray(body.content) ? body.content : [];\n\tfor (let index = 0; index < content.length; index += 1) {\n\t\tconst block = content[index];\n\t\tif (!isRecord(block)) continue;\n\t\tchunks.push(...responseBlockChunks(block, index, options));\n\t}\n\n\tconst reason = finishReason(asString(body.stop_reason));\n\tif (reason) chunks.push({ kind: \"finish\", reason });\n\treturn chunks;\n}\n\nfunction responseBlockChunks(\n\tblock: Record<string, unknown>,\n\tindex: number,\n\toptions: AnthropicAdapterOptions,\n): RawChunk[] {\n\tconst type = asString(block.type);\n\tswitch (type) {\n\t\tcase \"text\": {\n\t\t\tconst text = asString(block.text);\n\t\t\tif (!text) return [];\n\t\t\treturn options.jsonMode\n\t\t\t\t? [{ kind: \"json-delta\", delta: text }]\n\t\t\t\t: [{ kind: \"text-delta\", text }];\n\t\t}\n\t\tcase \"thinking\": {\n\t\t\tconst text = asString(block.thinking);\n\t\t\treturn text ? [{ kind: \"reasoning-delta\", text, variant: \"detail\" }] : [];\n\t\t}\n\t\tcase \"tool_use\": {\n\t\t\tconst id = asString(block.id);\n\t\t\tconst name = asString(block.name) ?? \"unknown\";\n\t\t\tconst chunks: RawChunk[] = [optionalRawChunk({ kind: \"tool-start\", id, name, index })];\n\t\t\tif (block.input !== undefined) {\n\t\t\t\tchunks.push(\n\t\t\t\t\toptionalRawChunk({\n\t\t\t\t\t\tkind: \"tool-args-delta\",\n\t\t\t\t\t\tid,\n\t\t\t\t\t\tdelta: JSON.stringify(block.input),\n\t\t\t\t\t\tindex,\n\t\t\t\t\t}),\n\t\t\t\t);\n\t\t\t}\n\t\t\tchunks.push(optionalRawChunk({ kind: \"tool-done\", id, index }));\n\t\t\treturn chunks;\n\t\t}\n\t\tcase \"refusal\": {\n\t\t\tconst text = asString(block.refusal) ?? asString(block.text);\n\t\t\treturn text ? [{ kind: \"refusal-delta\", text }] : [];\n\t\t}\n\t\tdefault:\n\t\t\treturn [];\n\t}\n}\n\nfunction finishReason(value: string | undefined): FinishReason | undefined {\n\tswitch (value) {\n\t\tcase \"end_turn\":\n\t\tcase \"stop_sequence\":\n\t\t\treturn \"stop\";\n\t\tcase \"max_tokens\":\n\t\t\treturn \"length\";\n\t\tcase \"tool_use\":\n\t\t\treturn \"tool_calls\";\n\t\tcase \"refusal\":\n\t\t\treturn \"content_filter\";\n\t\tcase undefined:\n\t\tcase null:\n\t\t\treturn undefined;\n\t\tdefault:\n\t\t\treturn \"stop\";\n\t}\n}\n\nfunction usageChunk(value: unknown): RawChunk | undefined {\n\tif (!isRecord(value)) return undefined;\n\tconst inputTokens = asNumber(value.input_tokens);\n\tconst outputTokens = asNumber(value.output_tokens);\n\tif (inputTokens === undefined && outputTokens === undefined) return undefined;\n\treturn optionalRawChunk({ kind: \"usage\", inputTokens, outputTokens, raw: value });\n}\n\nfunction providerErrorChunks(value: unknown): RawChunk[] {\n\tconst message = isRecord(value) ? asString(value.message) : undefined;\n\treturn providerErrorChunksFromMessage(message ?? \"Anthropic provider error\", false);\n}\n"]}
1
+ {"version":3,"sources":["../../src/core/utils/object.ts","../../src/adapters/errors.ts","../../src/adapters/utils.ts","../../src/adapters/shared/anthropic-blocks.ts","../../src/adapters/shared/parse-payload.ts","../../src/adapters/shared/stop-reasons.ts","../../src/adapters/shared/usage.ts","../../src/adapters/anthropic.ts"],"names":[],"mappings":"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","file":"anthropic.js","sourcesContent":["/** Strip undefined own properties; preserve explicit null. */\nexport function stripUndefined<T extends Record<string, unknown>>(obj: T): T {\n\treturn Object.fromEntries(Object.entries(obj).filter(([, value]) => value !== undefined)) as T;\n}\n","/** Internal adapter error helpers. Not part of the public API. */\nimport type { RawChunk } from \"../core/types\";\nimport { asString } from \"./utils\";\n\nexport function libraryError(message: string): Error {\n\treturn new Error(`llm-stream-assemble: ${message}`);\n}\n\nexport function adapterScopedError(scope: string, message: string): Error {\n\treturn new Error(`llm-stream-assemble: ${scope}: ${message}`);\n}\n\nexport function providerErrorChunks(error: Error, recoverable = false): RawChunk[] {\n\treturn [\n\t\t{ kind: \"provider-error\", error, recoverable },\n\t\t{ kind: \"finish\", reason: \"error\" },\n\t];\n}\n\nexport function providerErrorChunksFromMessage(message: string, recoverable = false): RawChunk[] {\n\treturn providerErrorChunks(libraryError(message), recoverable);\n}\n\nexport function providerErrorChunksFromPayload(\n\terrorPayload: Record<string, unknown>,\n\tscope: string,\n\trecoverable: boolean,\n\tfallbackMessage: string,\n): RawChunk[] {\n\tconst message = asString(errorPayload.message) ?? fallbackMessage;\n\tconst error = adapterScopedError(scope, message);\n\tObject.defineProperty(error, \"raw\", {\n\t\tvalue: errorPayload,\n\t\tenumerable: false,\n\t});\n\treturn providerErrorChunks(error, recoverable);\n}\n","/** Internal adapter utilities. Not part of the public API. */\nimport type { RawChunk, StreamAdapter } from \"../core/types\";\nimport { stripUndefined } from \"../core/utils/object\";\nimport { adapterScopedError } from \"./errors\";\n\nexport function isRecord(value: unknown): value is Record<string, unknown> {\n\treturn typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nexport function asString(value: unknown): string | undefined {\n\treturn typeof value === \"string\" ? value : undefined;\n}\n\nexport function asNumber(value: unknown): number | undefined {\n\treturn typeof value === \"number\" && Number.isFinite(value) ? value : undefined;\n}\n\nexport function optionalRawChunk(input: Record<string, unknown>): RawChunk {\n\treturn stripUndefined(input) as RawChunk;\n}\n\nexport function prefixedAdapterError(feature: string, message: string): Error {\n\treturn adapterScopedError(feature, message);\n}\n\nexport function createStreamAdapter<TOptions>(config: {\n\tparser: { parseChunk(raw: string): RawChunk[] };\n\tparseResponse: (body: unknown, options: TOptions) => RawChunk[];\n\toptions: TOptions;\n}): StreamAdapter {\n\treturn {\n\t\tparseChunk(raw) {\n\t\t\treturn config.parser.parseChunk(raw);\n\t\t},\n\t\tparseResponse(body) {\n\t\t\treturn config.parseResponse(body, config.options);\n\t\t},\n\t};\n}\n\nexport function parseAdapterJSON(raw: string, feature: string): unknown {\n\ttry {\n\t\treturn JSON.parse(raw) as unknown;\n\t} catch (error) {\n\t\tconst message = error instanceof Error ? error.message : String(error);\n\t\tthrow prefixedAdapterError(feature, message);\n\t}\n}\n","import type { RawChunk } from \"../../core/types\";\nimport { asString, isRecord, optionalRawChunk } from \"../utils\";\n\nexport interface AnthropicBlockContext {\n\tjsonMode?: boolean | undefined;\n\tmode?: AnthropicBlockMode;\n}\n\nexport type AnthropicBlockMode = \"stream-start\" | \"response\";\n\n/** Map a complete Anthropic content block (response body) to raw chunks. */\nexport function anthropicResponseBlockChunks(\n\tblock: Record<string, unknown>,\n\tindex: number,\n\tcontext: AnthropicBlockContext,\n): RawChunk[] {\n\treturn anthropicBlockStartChunks(block, index, { ...context, mode: \"response\" });\n}\n\n/** Map content_block_start envelope block to raw chunks. */\nexport function anthropicBlockStartChunks(\n\tblock: Record<string, unknown>,\n\tindex: number,\n\tcontext: AnthropicBlockContext,\n): RawChunk[] {\n\tconst mode = context.mode ?? \"stream-start\";\n\tconst blockType = asString(block.type) ?? \"unknown\";\n\tswitch (blockType) {\n\t\tcase \"text\": {\n\t\t\tconst text = asString(block.text);\n\t\t\tif (!text) return [];\n\t\t\tif (context.jsonMode) return [{ kind: \"json-delta\", delta: text }];\n\t\t\treturn [{ kind: \"text-delta\", text }];\n\t\t}\n\t\tcase \"thinking\": {\n\t\t\tconst text = asString(block.thinking);\n\t\t\treturn text ? [{ kind: \"reasoning-delta\", text, variant: \"detail\" }] : [];\n\t\t}\n\t\tcase \"redacted_thinking\":\n\t\t\treturn [];\n\t\tcase \"tool_use\":\n\t\t\treturn anthropicToolUseBlockChunks(block, index, mode);\n\t\tcase \"json\": {\n\t\t\tconst text = asString(block.text) ?? asString(block.partial_json);\n\t\t\treturn text ? [{ kind: \"json-delta\", delta: text }] : [];\n\t\t}\n\t\tcase \"refusal\": {\n\t\t\tconst text = asString(block.refusal) ?? asString(block.text);\n\t\t\treturn text ? [{ kind: \"refusal-delta\", text }] : [];\n\t\t}\n\t\tdefault:\n\t\t\treturn [];\n\t}\n}\n\nfunction anthropicToolUseBlockChunks(\n\tblock: Record<string, unknown>,\n\tindex: number,\n\tmode: AnthropicBlockMode,\n): RawChunk[] {\n\tconst id = asString(block.id);\n\tconst name = asString(block.name) ?? \"unknown\";\n\tconst chunks: RawChunk[] = [optionalRawChunk({ kind: \"tool-start\", id, name, index })];\n\tconst input = block.input;\n\tif (input !== undefined && !(isRecord(input) && Object.keys(input).length === 0)) {\n\t\tchunks.push(\n\t\t\toptionalRawChunk({ kind: \"tool-args-delta\", id, delta: JSON.stringify(input), index }),\n\t\t);\n\t}\n\tif (mode === \"response\") {\n\t\tchunks.push(optionalRawChunk({ kind: \"tool-done\", id, index }));\n\t}\n\treturn chunks;\n}\n","import { adapterScopedError } from \"../errors\";\nimport { isRecord, parseAdapterJSON } from \"../utils\";\n\nexport interface ParseAdapterObjectOptions {\n\ttrim?: boolean;\n\tallowDone?: boolean;\n}\n\n/**\n * Parse a single adapter payload string into a JSON object.\n * Returns null for empty / [DONE] lines when configured.\n */\nexport function parseAdapterObjectPayload(\n\traw: string,\n\tscope: string,\n\toptions: ParseAdapterObjectOptions = {},\n): Record<string, unknown> | null {\n\tconst { trim = true, allowDone = true } = options;\n\tconst input = trim ? raw.trim() : raw;\n\tif (input.length === 0 || (allowDone && input === \"[DONE]\")) return null;\n\n\tconst payload = parseAdapterJSON(input, scope);\n\tif (!isRecord(payload)) {\n\t\tthrow adapterScopedError(scope, \"expected a JSON object\");\n\t}\n\treturn payload;\n}\n","import type { FinishReason } from \"../../core/types\";\n\n/** Anthropic Messages and Bedrock Converse share similar stop-reason strings. */\nexport function mapAnthropicLikeStopReason(value: string): FinishReason {\n\tswitch (value) {\n\t\tcase \"end_turn\":\n\t\tcase \"stop_sequence\":\n\t\t\treturn \"stop\";\n\t\tcase \"tool_use\":\n\t\t\treturn \"tool_calls\";\n\t\tcase \"max_tokens\":\n\t\t\treturn \"length\";\n\t\tcase \"content_filtered\":\n\t\tcase \"guardrail_intervened\":\n\t\tcase \"refusal\":\n\t\t\treturn \"content_filter\";\n\t\tdefault:\n\t\t\treturn \"stop\";\n\t}\n}\n","import type { RawChunk } from \"../../core/types\";\nimport { asNumber, isRecord, optionalRawChunk } from \"../utils\";\n\nexport interface UsageFieldAliases {\n\tinput?: string[];\n\toutput?: string[];\n\treasoning?: string[];\n\ttotal?: string[];\n}\n\nconst DEFAULT_ALIASES: UsageFieldAliases = {\n\tinput: [\"inputTokens\", \"input_tokens\", \"promptTokens\", \"promptTokenCount\", \"inputTokenCount\"],\n\toutput: [\n\t\t\"outputTokens\",\n\t\t\"output_tokens\",\n\t\t\"completionTokens\",\n\t\t\"candidatesTokenCount\",\n\t\t\"outputTokenCount\",\n\t],\n\treasoning: [\"reasoningTokens\", \"reasoning_tokens\", \"thoughtsTokenCount\"],\n\ttotal: [\"totalTokens\", \"totalTokenCount\", \"total_tokens\"],\n};\n\nfunction firstNumber(\n\tvalue: Record<string, unknown>,\n\tfields: string[] | undefined,\n): number | undefined {\n\tif (!fields) return undefined;\n\tfor (const field of fields) {\n\t\tconst number = asNumber(value[field]);\n\t\tif (number !== undefined) return number;\n\t}\n\treturn undefined;\n}\n\nexport function buildUsageChunk(\n\tvalue: unknown,\n\taliases: UsageFieldAliases = DEFAULT_ALIASES,\n\toptions?: { mirrorTotalTokens?: boolean },\n): RawChunk | undefined {\n\tif (!isRecord(value)) return undefined;\n\tconst inputTokens = firstNumber(value, aliases.input);\n\tconst outputTokens = firstNumber(value, aliases.output);\n\tconst reasoningTokens = firstNumber(value, aliases.reasoning);\n\tconst totalTokens = firstNumber(value, aliases.total);\n\tif (\n\t\tinputTokens === undefined &&\n\t\toutputTokens === undefined &&\n\t\treasoningTokens === undefined &&\n\t\ttotalTokens === undefined\n\t) {\n\t\treturn undefined;\n\t}\n\tconst raw =\n\t\toptions?.mirrorTotalTokens && totalTokens !== undefined ? { ...value, totalTokens } : value;\n\treturn optionalRawChunk({\n\t\tkind: \"usage\",\n\t\tinputTokens,\n\t\toutputTokens,\n\t\treasoningTokens,\n\t\traw,\n\t});\n}\n","import type { FinishReason, RawChunk, StreamAdapter } from \"../core/types\";\nimport { anthropicBlockStartChunks, anthropicResponseBlockChunks } from \"./shared/anthropic-blocks\";\nimport { parseAdapterObjectPayload } from \"./shared/parse-payload\";\nimport { mapAnthropicLikeStopReason } from \"./shared/stop-reasons\";\nimport { buildUsageChunk } from \"./shared/usage\";\nimport {\n\tlibraryError,\n\tproviderErrorChunksFromMessage,\n\tproviderErrorChunksFromPayload,\n} from \"./errors\";\nimport { asNumber, asString, createStreamAdapter, isRecord, optionalRawChunk } from \"./utils\";\n\nexport interface AnthropicAdapterOptions {\n\t/** Map `json` content blocks to json-delta instead of text-delta. */\n\tjsonMode?: boolean;\n}\n\ninterface BlockState {\n\ttype: string;\n\tid?: string;\n\tname?: string;\n}\n\nexport function anthropicAdapter(options: AnthropicAdapterOptions = {}): StreamAdapter {\n\tconst parser = new AnthropicStreamParser(options);\n\treturn createStreamAdapter({\n\t\tparser,\n\t\tparseResponse,\n\t\toptions,\n\t});\n}\n\nclass AnthropicStreamParser {\n\tprivate readonly blocks = new Map<number, BlockState>();\n\tprivate sawFinish = false;\n\n\tconstructor(private readonly options: AnthropicAdapterOptions) {}\n\n\tparseChunk(raw: string): RawChunk[] {\n\t\tconst payload = parseAdapterObjectPayload(raw, \"anthropicAdapter.parseChunk\");\n\t\tif (!payload) return [];\n\n\t\tconst type = asString(payload.type);\n\t\tswitch (type) {\n\t\t\tcase \"ping\":\n\t\t\t\treturn [];\n\t\t\tcase \"message_start\":\n\t\t\t\treturn this.messageStart(payload);\n\t\t\tcase \"content_block_start\":\n\t\t\t\treturn this.contentBlockStart(payload);\n\t\t\tcase \"content_block_delta\":\n\t\t\t\treturn this.contentBlockDelta(payload);\n\t\t\tcase \"content_block_stop\":\n\t\t\t\treturn this.contentBlockStop(payload);\n\t\t\tcase \"message_delta\":\n\t\t\t\treturn this.messageDelta(payload);\n\t\t\tcase \"message_stop\":\n\t\t\t\treturn this.messageStop();\n\t\t\tcase \"error\":\n\t\t\t\treturn providerErrorFromPayload(payload.error);\n\t\t\tdefault:\n\t\t\t\tthrow libraryError(`anthropicAdapter.parseChunk unknown event type: ${String(type)}`);\n\t\t}\n\t}\n\n\tprivate messageStart(payload: Record<string, unknown>): RawChunk[] {\n\t\tconst message = isRecord(payload.message) ? payload.message : undefined;\n\t\tif (!message) return [];\n\t\tconst chunks: RawChunk[] = [];\n\t\tconst id = asString(message.id);\n\t\tconst model = asString(message.model);\n\t\tif (id) chunks.push({ kind: \"message-start\", id });\n\t\tif (id || model) {\n\t\t\tchunks.push(optionalRawChunk({ kind: \"metadata\", responseId: id, model, raw: message }));\n\t\t}\n\t\tconst usage = buildUsageChunk(message.usage);\n\t\tif (usage) chunks.push(usage);\n\t\treturn chunks;\n\t}\n\n\tprivate contentBlockStart(payload: Record<string, unknown>): RawChunk[] {\n\t\tconst index = asNumber(payload.index) ?? 0;\n\t\tconst block = isRecord(payload.content_block) ? payload.content_block : undefined;\n\t\tif (!block) return [];\n\t\tconst blockType = asString(block.type) ?? \"unknown\";\n\t\tconst state: BlockState = { type: blockType };\n\t\tthis.blocks.set(index, state);\n\n\t\tif (blockType === \"tool_use\") {\n\t\t\tconst id = asString(block.id);\n\t\t\tconst name = asString(block.name) ?? \"unknown\";\n\t\t\tif (id) state.id = id;\n\t\t\tstate.name = name;\n\t\t}\n\n\t\treturn anthropicBlockStartChunks(block, index, {\n\t\t\tjsonMode: this.options.jsonMode,\n\t\t\tmode: \"stream-start\",\n\t\t});\n\t}\n\n\tprivate contentBlockDelta(payload: Record<string, unknown>): RawChunk[] {\n\t\tconst index = asNumber(payload.index) ?? 0;\n\t\tconst delta = isRecord(payload.delta) ? payload.delta : undefined;\n\t\tif (!delta) return [];\n\t\tconst deltaType = asString(delta.type);\n\t\tconst state = this.blocks.get(index);\n\n\t\tswitch (deltaType) {\n\t\t\tcase \"text_delta\": {\n\t\t\t\tconst text = asString(delta.text);\n\t\t\t\tif (!text) return [];\n\t\t\t\tif (this.options.jsonMode || state?.type === \"json\") {\n\t\t\t\t\treturn [{ kind: \"json-delta\", delta: text }];\n\t\t\t\t}\n\t\t\t\tif (state?.type === \"refusal\") return [{ kind: \"refusal-delta\", text }];\n\t\t\t\treturn [{ kind: \"text-delta\", text }];\n\t\t\t}\n\t\t\tcase \"thinking_delta\": {\n\t\t\t\tconst text = asString(delta.thinking);\n\t\t\t\treturn text ? [{ kind: \"reasoning-delta\", text, variant: \"detail\" }] : [];\n\t\t\t}\n\t\t\tcase \"input_json_delta\": {\n\t\t\t\tconst partial = asString(delta.partial_json);\n\t\t\t\tif (!partial) return [];\n\t\t\t\treturn [\n\t\t\t\t\toptionalRawChunk({ kind: \"tool-args-delta\", id: state?.id, delta: partial, index }),\n\t\t\t\t];\n\t\t\t}\n\t\t\tcase \"signature_delta\":\n\t\t\t\treturn [];\n\t\t\tdefault:\n\t\t\t\treturn [];\n\t\t}\n\t}\n\n\tprivate contentBlockStop(payload: Record<string, unknown>): RawChunk[] {\n\t\tconst index = asNumber(payload.index) ?? 0;\n\t\tconst state = this.blocks.get(index);\n\t\tthis.blocks.delete(index);\n\t\tif (state?.type === \"tool_use\") {\n\t\t\treturn [optionalRawChunk({ kind: \"tool-done\", id: state.id, index })];\n\t\t}\n\t\treturn [];\n\t}\n\n\tprivate messageDelta(payload: Record<string, unknown>): RawChunk[] {\n\t\tconst chunks: RawChunk[] = [];\n\t\tconst usage = buildUsageChunk(payload.usage);\n\t\tif (usage) chunks.push(usage);\n\t\tconst delta = isRecord(payload.delta) ? payload.delta : undefined;\n\t\tconst stopReason = delta ? asString(delta.stop_reason) : undefined;\n\t\tif (stopReason) {\n\t\t\tconst reason = finishReason(stopReason);\n\t\t\tif (reason) chunks.push({ kind: \"finish\", reason });\n\t\t\tthis.sawFinish = true;\n\t\t}\n\t\treturn chunks;\n\t}\n\n\tprivate messageStop(): RawChunk[] {\n\t\tif (this.sawFinish) return [];\n\t\tthis.sawFinish = true;\n\t\treturn [{ kind: \"finish\", reason: \"stop\" }];\n\t}\n}\n\nfunction parseResponse(body: unknown, options: AnthropicAdapterOptions): RawChunk[] {\n\tif (!isRecord(body)) {\n\t\tthrow libraryError(\"anthropicAdapter.parseResponse expected an Anthropic message object\");\n\t}\n\tif (asString(body.type) === \"error\" || isRecord(body.error)) {\n\t\treturn providerErrorFromPayload(body.error);\n\t}\n\n\tconst chunks: RawChunk[] = [];\n\tconst id = asString(body.id);\n\tconst model = asString(body.model);\n\tif (id) chunks.push({ kind: \"message-start\", id });\n\tif (id || model) {\n\t\tchunks.push(optionalRawChunk({ kind: \"metadata\", responseId: id, model, raw: body }));\n\t}\n\tconst inputUsage = buildUsageChunk(body.usage);\n\tif (inputUsage) chunks.push(inputUsage);\n\n\tconst content = Array.isArray(body.content) ? body.content : [];\n\tfor (let index = 0; index < content.length; index += 1) {\n\t\tconst block = content[index];\n\t\tif (!isRecord(block)) continue;\n\t\tchunks.push(...anthropicResponseBlockChunks(block, index, { jsonMode: options.jsonMode }));\n\t}\n\n\tconst reason = finishReason(asString(body.stop_reason));\n\tif (reason) chunks.push({ kind: \"finish\", reason });\n\treturn chunks;\n}\n\nfunction finishReason(value: string | undefined): FinishReason | undefined {\n\tif (value === undefined || value === null) return undefined;\n\treturn mapAnthropicLikeStopReason(value);\n}\n\nfunction providerErrorFromPayload(value: unknown): RawChunk[] {\n\tif (isRecord(value)) {\n\t\treturn providerErrorChunksFromPayload(\n\t\t\tvalue,\n\t\t\t\"anthropicAdapter.parseChunk\",\n\t\t\tfalse,\n\t\t\t\"Anthropic provider error\",\n\t\t);\n\t}\n\treturn providerErrorChunksFromMessage(\"Anthropic provider error\", false);\n}\n"]}