llm-stream-assemble 1.4.0 → 1.5.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 (44) hide show
  1. package/README.md +47 -6
  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/cohere.cjs +594 -0
  13. package/dist/adapters/cohere.cjs.map +1 -0
  14. package/dist/adapters/cohere.d.cts +9 -0
  15. package/dist/adapters/cohere.d.ts +9 -0
  16. package/dist/adapters/cohere.js +592 -0
  17. package/dist/adapters/cohere.js.map +1 -0
  18. package/dist/adapters/gemini.cjs +86 -44
  19. package/dist/adapters/gemini.cjs.map +1 -1
  20. package/dist/adapters/gemini.js +86 -44
  21. package/dist/adapters/gemini.js.map +1 -1
  22. package/dist/adapters/openai-chat.cjs +20 -8
  23. package/dist/adapters/openai-chat.cjs.map +1 -1
  24. package/dist/adapters/openai-chat.js +20 -8
  25. package/dist/adapters/openai-chat.js.map +1 -1
  26. package/dist/adapters/openai-compatible.cjs +20 -8
  27. package/dist/adapters/openai-compatible.cjs.map +1 -1
  28. package/dist/adapters/openai-compatible.js +20 -8
  29. package/dist/adapters/openai-compatible.js.map +1 -1
  30. package/dist/adapters/openai-responses.cjs +37 -27
  31. package/dist/adapters/openai-responses.cjs.map +1 -1
  32. package/dist/adapters/openai-responses.js +37 -27
  33. package/dist/adapters/openai-responses.js.map +1 -1
  34. package/dist/core/index.cjs +9 -2
  35. package/dist/core/index.cjs.map +1 -1
  36. package/dist/core/index.js +9 -2
  37. package/dist/core/index.js.map +1 -1
  38. package/dist/index.cjs +715 -297
  39. package/dist/index.cjs.map +1 -1
  40. package/dist/index.d.cts +2 -1
  41. package/dist/index.d.ts +2 -1
  42. package/dist/index.js +715 -298
  43. package/dist/index.js.map +1 -1
  44. package/package.json +9 -2
package/README.md CHANGED
@@ -1,19 +1,19 @@
1
1
  # llm-stream-assemble
2
2
 
3
- ![core](https://img.shields.io/badge/core-1.4.0-blue)
3
+ ![core](https://img.shields.io/badge/core-1.5.0-blue)
4
4
  ![node](https://img.shields.io/badge/node-%3E%3D18-339933)
5
5
  ![runtime deps](https://img.shields.io/badge/runtime_deps-0-brightgreen)
6
- ![tests](https://img.shields.io/badge/tests-1124_passing-brightgreen)
6
+ ![tests](https://img.shields.io/badge/tests-1316_passing-brightgreen)
7
7
  [![ci](https://github.com/01laky/llm-stream-assemble/actions/workflows/ci.yml/badge.svg)](https://github.com/01laky/llm-stream-assemble/actions/workflows/ci.yml)
8
- ![status](https://img.shields.io/badge/status-stable_1.4.0-brightgreen)
8
+ ![status](https://img.shields.io/badge/status-stable_1.5.0-brightgreen)
9
9
 
10
10
  **One typed event model for every LLM stream** — text, tool calls, reasoning, JSON, usage, refusals, errors, and non-streaming responses.
11
11
 
12
- > A zero-dependency TypeScript layer between raw LLM provider bytes and your app: six built-in adapters, thirteen host presets, and a single StreamEvent model for text, tools, reasoning, JSON, and lifecycle — from Ollama to Azure to Bedrock to Cloudflare Workers AI.
12
+ > A zero-dependency TypeScript layer between raw LLM provider bytes and your app: seven built-in adapters, thirteen host presets, and a single StreamEvent model for text, tools, reasoning, JSON, and lifecycle — from Ollama to Azure to Bedrock to Cohere to Cloudflare Workers AI.
13
13
 
14
14
  Turn provider SSE fragments into typed events — **not another `+=` loop**.
15
15
 
16
- **Status:** Stable `1.4.0`. Six built-in adapters, thirteen OpenAI-compatible host presets (including **Azure OpenAI** and **Cloudflare Workers AI**), transforms, replay helpers, and examples are production-ready. Pin semver ranges as usual and review [CHANGELOG.md](./CHANGELOG.md) before major upgrades.
16
+ **Status:** Stable `1.5.0`. Seven built-in adapters, thirteen OpenAI-compatible host presets (including **Azure OpenAI** and **Cloudflare Workers AI**), transforms, replay helpers, and examples are production-ready. Pin semver ranges as usual and review [CHANGELOG.md](./CHANGELOG.md) before major upgrades.
17
17
 
18
18
  ---
19
19
 
@@ -146,6 +146,7 @@ Diagram sources: [`docs/img/`](./docs/img/) (Mermaid `.mmd` + committed SVG). Re
146
146
  | `openaiResponsesAdapter()` | OpenAI Responses API | `llm-stream-assemble` |
147
147
  | `geminiAdapter()` | Google AI Gemini | `llm-stream-assemble` or `/adapters/gemini` |
148
148
  | `bedrockAdapter()` | AWS Bedrock Converse / ConverseStream | `llm-stream-assemble` or `/adapters/bedrock` |
149
+ | `cohereAdapter()` | Cohere Chat v2 (`api.cohere.com/v2/chat`) | `llm-stream-assemble` or `/adapters/cohere` |
149
150
 
150
151
  Full feature flags and quirks: [compatibility matrix](./docs/compatibility.md).
151
152
 
@@ -202,6 +203,7 @@ Pick an adapter in ~30 seconds:
202
203
  - **Anthropic Messages** → `anthropicAdapter()`
203
204
  - **Google Gemini** → `geminiAdapter()`
204
205
  - **AWS Bedrock ConverseStream** → `bedrockAdapter()` (decoded JSON per event — see [Bedrock Usage](#bedrock-usage))
206
+ - **Cohere Chat v2 SSE** → `cohereAdapter()` (not OpenAI-compatible — see [Cohere Usage](#cohere-usage))
205
207
  - **Groq, Ollama, Azure, Cloudflare, OpenRouter, …** → `openaiCompatibleAdapter({ provider })`
206
208
  - **Non-streaming JSON body** → `assembleResponse(body, adapter)`
207
209
  - **React chat UI / full agent framework** → not this package — see [comparison](./docs/comparison.md)
@@ -277,6 +279,10 @@ for await (const event of assembleStream(response.body!, adapter)) {
277
279
 
278
280
  → [`examples/node-fetch/bedrock.ts`](./examples/node-fetch/bedrock.ts) · Usage: [Bedrock](#bedrock-usage) · Decode helper: [`examples/bedrock/README.md`](./examples/bedrock/README.md)
279
281
 
282
+ ### Cohere Chat v2
283
+
284
+ → [`examples/node-fetch/cohere.ts`](./examples/node-fetch/cohere.ts) · Usage: [Cohere](#cohere-usage)
285
+
280
286
  ### Streaming JSON (structured output)
281
287
 
282
288
  ```ts
@@ -317,7 +323,7 @@ Wire unified events into **Hono**, **Express**, **Cloudflare Workers**, **LiteLL
317
323
 
318
324
  ### Core Usage
319
325
 
320
- The core pipeline works with any adapter that emits `RawChunk[]`, including the built-in OpenAI Chat, OpenAI-compatible, Anthropic Messages, OpenAI Responses, Google Gemini, and AWS Bedrock adapters:
326
+ The core pipeline works with any adapter that emits `RawChunk[]`, including the built-in OpenAI Chat, OpenAI-compatible, Anthropic Messages, OpenAI Responses, Google Gemini, AWS Bedrock, and Cohere adapters:
321
327
 
322
328
  ```ts
323
329
  import { assembleFromPayloads, type StreamAdapter } from "llm-stream-assemble";
@@ -605,6 +611,41 @@ Subpath import: `import { bedrockAdapter } from "llm-stream-assemble/adapters/be
605
611
 
606
612
  Worker proxy recipe: [`examples/integrations/bedrock-worker-proxy.ts`](./examples/integrations/bedrock-worker-proxy.ts). EventStream decode helper (examples only): [`examples/bedrock/decode-event-stream.ts`](./examples/bedrock/decode-event-stream.ts).
607
613
 
614
+ ### Cohere Usage
615
+
616
+ `cohereAdapter()` parses Cohere Chat **v2** SSE events from `https://api.cohere.com/v2/chat` and non-streaming v2 response bodies. Create one adapter instance per request/stream. Cohere is **not** OpenAI-compatible — use `cohereAdapter()`, not `openaiCompatibleAdapter()`.
617
+
618
+ Core `parseSSE()` frames the HTTP body; `assembleStream` yields one JSON payload string per `data:` line to `cohereAdapter().parseChunk`.
619
+
620
+ ```ts
621
+ import { assembleStream, cohereAdapter } from "llm-stream-assemble";
622
+
623
+ const response = await fetch("https://api.cohere.com/v2/chat", {
624
+ method: "POST",
625
+ headers: {
626
+ Authorization: `Bearer ${process.env.COHERE_API_KEY}`,
627
+ "Content-Type": "application/json",
628
+ },
629
+ body: JSON.stringify({
630
+ model: "command-r-plus-08-2024",
631
+ messages: [{ role: "user", content: "Hello" }],
632
+ stream: true,
633
+ }),
634
+ });
635
+
636
+ for await (const event of assembleStream(response.body!, cohereAdapter())) {
637
+ if (event.type === "text.delta") process.stdout.write(event.text);
638
+ if (event.type === "reasoning.delta") process.stdout.write(event.text);
639
+ if (event.type === "tool_call.done") console.log(event.name, event.args);
640
+ }
641
+ ```
642
+
643
+ Use `cohereAdapter({ jsonMode: true })` when structured JSON output should map to `json.*` instead of `text.*`. **`tool-plan-delta`** events map to `reasoning.*` with `variant: "detail"`. **`citation-start`** payloads are preserved in `metadata.raw` — there are no dedicated `citation.*` unified events in 1.x. Legacy Cohere v1 endpoints are out of scope.
644
+
645
+ Subpath import: `import { cohereAdapter } from "llm-stream-assemble/adapters/cohere"`.
646
+
647
+ Live smoke: `pnpm smoke:cohere` — see [`docs/live-smoke.md`](./docs/live-smoke.md) for `COHERE_API_KEY`, `COHERE_MODEL`, and `COHERE_SMOKE_TOOLS`.
648
+
608
649
  ---
609
650
 
610
651
  ## Transforms & replay
@@ -1,5 +1,36 @@
1
1
  'use strict';
2
2
 
3
+ // src/core/utils/object.ts
4
+ function stripUndefined(obj) {
5
+ return Object.fromEntries(Object.entries(obj).filter(([, value]) => value !== void 0));
6
+ }
7
+
8
+ // src/adapters/errors.ts
9
+ function libraryError(message) {
10
+ return new Error(`llm-stream-assemble: ${message}`);
11
+ }
12
+ function adapterScopedError(scope, message) {
13
+ return new Error(`llm-stream-assemble: ${scope}: ${message}`);
14
+ }
15
+ function providerErrorChunks(error, recoverable = false) {
16
+ return [
17
+ { kind: "provider-error", error, recoverable },
18
+ { kind: "finish", reason: "error" }
19
+ ];
20
+ }
21
+ function providerErrorChunksFromMessage(message, recoverable = false) {
22
+ return providerErrorChunks(libraryError(message), recoverable);
23
+ }
24
+ function providerErrorChunksFromPayload(errorPayload, scope, recoverable, fallbackMessage) {
25
+ const message = asString(errorPayload.message) ?? fallbackMessage;
26
+ const error = adapterScopedError(scope, message);
27
+ Object.defineProperty(error, "raw", {
28
+ value: errorPayload,
29
+ enumerable: false
30
+ });
31
+ return providerErrorChunks(error, recoverable);
32
+ }
33
+
3
34
  // src/adapters/utils.ts
4
35
  function isRecord(value) {
5
36
  return typeof value === "object" && value !== null && !Array.isArray(value);
@@ -11,9 +42,7 @@ function asNumber(value) {
11
42
  return typeof value === "number" && Number.isFinite(value) ? value : void 0;
12
43
  }
13
44
  function optionalRawChunk(input) {
14
- return Object.fromEntries(
15
- Object.entries(input).filter(([, value]) => value !== void 0)
16
- );
45
+ return stripUndefined(input);
17
46
  }
18
47
  function prefixedAdapterError(feature, message) {
19
48
  return adapterScopedError(feature, message);
@@ -37,21 +66,125 @@ function parseAdapterJSON(raw, feature) {
37
66
  }
38
67
  }
39
68
 
40
- // src/adapters/errors.ts
41
- function libraryError(message) {
42
- return new Error(`llm-stream-assemble: ${message}`);
69
+ // src/adapters/shared/anthropic-blocks.ts
70
+ function anthropicResponseBlockChunks(block, index, context) {
71
+ return anthropicBlockStartChunks(block, index, { ...context, mode: "response" });
43
72
  }
44
- function adapterScopedError(scope, message) {
45
- return new Error(`llm-stream-assemble: ${scope}: ${message}`);
73
+ function anthropicBlockStartChunks(block, index, context) {
74
+ const mode = context.mode ?? "stream-start";
75
+ const blockType = asString(block.type) ?? "unknown";
76
+ switch (blockType) {
77
+ case "text": {
78
+ const text = asString(block.text);
79
+ if (!text) return [];
80
+ if (context.jsonMode) return [{ kind: "json-delta", delta: text }];
81
+ return [{ kind: "text-delta", text }];
82
+ }
83
+ case "thinking": {
84
+ const text = asString(block.thinking);
85
+ return text ? [{ kind: "reasoning-delta", text, variant: "detail" }] : [];
86
+ }
87
+ case "redacted_thinking":
88
+ return [];
89
+ case "tool_use":
90
+ return anthropicToolUseBlockChunks(block, index, mode);
91
+ case "json": {
92
+ const text = asString(block.text) ?? asString(block.partial_json);
93
+ return text ? [{ kind: "json-delta", delta: text }] : [];
94
+ }
95
+ case "refusal": {
96
+ const text = asString(block.refusal) ?? asString(block.text);
97
+ return text ? [{ kind: "refusal-delta", text }] : [];
98
+ }
99
+ default:
100
+ return [];
101
+ }
46
102
  }
47
- function providerErrorChunks(error, recoverable = false) {
48
- return [
49
- { kind: "provider-error", error, recoverable },
50
- { kind: "finish", reason: "error" }
51
- ];
103
+ function anthropicToolUseBlockChunks(block, index, mode) {
104
+ const id = asString(block.id);
105
+ const name = asString(block.name) ?? "unknown";
106
+ const chunks = [optionalRawChunk({ kind: "tool-start", id, name, index })];
107
+ const input = block.input;
108
+ if (input !== void 0 && !(isRecord(input) && Object.keys(input).length === 0)) {
109
+ chunks.push(
110
+ optionalRawChunk({ kind: "tool-args-delta", id, delta: JSON.stringify(input), index })
111
+ );
112
+ }
113
+ if (mode === "response") {
114
+ chunks.push(optionalRawChunk({ kind: "tool-done", id, index }));
115
+ }
116
+ return chunks;
52
117
  }
53
- function providerErrorChunksFromMessage(message, recoverable = false) {
54
- return providerErrorChunks(libraryError(message), recoverable);
118
+
119
+ // src/adapters/shared/parse-payload.ts
120
+ function parseAdapterObjectPayload(raw, scope, options = {}) {
121
+ const { trim = true, allowDone = true } = options;
122
+ const input = trim ? raw.trim() : raw;
123
+ if (input.length === 0 || allowDone && input === "[DONE]") return null;
124
+ const payload = parseAdapterJSON(input, scope);
125
+ if (!isRecord(payload)) {
126
+ throw adapterScopedError(scope, "expected a JSON object");
127
+ }
128
+ return payload;
129
+ }
130
+
131
+ // src/adapters/shared/stop-reasons.ts
132
+ function mapAnthropicLikeStopReason(value) {
133
+ switch (value) {
134
+ case "end_turn":
135
+ case "stop_sequence":
136
+ return "stop";
137
+ case "tool_use":
138
+ return "tool_calls";
139
+ case "max_tokens":
140
+ return "length";
141
+ case "content_filtered":
142
+ case "guardrail_intervened":
143
+ case "refusal":
144
+ return "content_filter";
145
+ default:
146
+ return "stop";
147
+ }
148
+ }
149
+
150
+ // src/adapters/shared/usage.ts
151
+ var DEFAULT_ALIASES = {
152
+ input: ["inputTokens", "input_tokens", "promptTokens", "promptTokenCount", "inputTokenCount"],
153
+ output: [
154
+ "outputTokens",
155
+ "output_tokens",
156
+ "completionTokens",
157
+ "candidatesTokenCount",
158
+ "outputTokenCount"
159
+ ],
160
+ reasoning: ["reasoningTokens", "reasoning_tokens", "thoughtsTokenCount"],
161
+ total: ["totalTokens", "totalTokenCount", "total_tokens"]
162
+ };
163
+ function firstNumber(value, fields) {
164
+ if (!fields) return void 0;
165
+ for (const field of fields) {
166
+ const number = asNumber(value[field]);
167
+ if (number !== void 0) return number;
168
+ }
169
+ return void 0;
170
+ }
171
+ function buildUsageChunk(value, aliases = DEFAULT_ALIASES, options) {
172
+ if (!isRecord(value)) return void 0;
173
+ const inputTokens = firstNumber(value, aliases.input);
174
+ const outputTokens = firstNumber(value, aliases.output);
175
+ const reasoningTokens = firstNumber(value, aliases.reasoning);
176
+ const totalTokens = firstNumber(value, aliases.total);
177
+ if (inputTokens === void 0 && outputTokens === void 0 && reasoningTokens === void 0 && totalTokens === void 0) {
178
+ return void 0;
179
+ }
180
+ const raw = value;
181
+ return optionalRawChunk({
182
+ kind: "usage",
183
+ inputTokens,
184
+ outputTokens,
185
+ reasoningTokens,
186
+ raw
187
+ });
55
188
  }
56
189
 
57
190
  // src/adapters/anthropic.ts
@@ -71,10 +204,8 @@ var AnthropicStreamParser = class {
71
204
  blocks = /* @__PURE__ */ new Map();
72
205
  sawFinish = false;
73
206
  parseChunk(raw) {
74
- const payload = parseAdapterJSON(raw, "anthropicAdapter.parseChunk");
75
- if (!isRecord(payload)) {
76
- throw libraryError("anthropicAdapter.parseChunk expected a JSON object");
77
- }
207
+ const payload = parseAdapterObjectPayload(raw, "anthropicAdapter.parseChunk");
208
+ if (!payload) return [];
78
209
  const type = asString(payload.type);
79
210
  switch (type) {
80
211
  case "ping":
@@ -92,7 +223,7 @@ var AnthropicStreamParser = class {
92
223
  case "message_stop":
93
224
  return this.messageStop();
94
225
  case "error":
95
- return providerErrorChunks2(payload.error);
226
+ return providerErrorFromPayload(payload.error);
96
227
  default:
97
228
  throw libraryError(`anthropicAdapter.parseChunk unknown event type: ${String(type)}`);
98
229
  }
@@ -107,7 +238,7 @@ var AnthropicStreamParser = class {
107
238
  if (id || model) {
108
239
  chunks.push(optionalRawChunk({ kind: "metadata", responseId: id, model, raw: message }));
109
240
  }
110
- const usage = usageChunk(message.usage);
241
+ const usage = buildUsageChunk(message.usage);
111
242
  if (usage) chunks.push(usage);
112
243
  return chunks;
113
244
  }
@@ -118,42 +249,16 @@ var AnthropicStreamParser = class {
118
249
  const blockType = asString(block.type) ?? "unknown";
119
250
  const state = { type: blockType };
120
251
  this.blocks.set(index, state);
121
- switch (blockType) {
122
- case "text": {
123
- const text = asString(block.text);
124
- return text ? [{ kind: "text-delta", text }] : [];
125
- }
126
- case "thinking": {
127
- const text = asString(block.thinking);
128
- return text ? [{ kind: "reasoning-delta", text, variant: "detail" }] : [];
129
- }
130
- case "redacted_thinking":
131
- return [];
132
- case "tool_use": {
133
- const id = asString(block.id);
134
- const name = asString(block.name) ?? "unknown";
135
- if (id) state.id = id;
136
- state.name = name;
137
- const chunks = [optionalRawChunk({ kind: "tool-start", id, name, index })];
138
- const input = block.input;
139
- if (input !== void 0 && !(isRecord(input) && Object.keys(input).length === 0)) {
140
- chunks.push(
141
- optionalRawChunk({ kind: "tool-args-delta", id, delta: JSON.stringify(input), index })
142
- );
143
- }
144
- return chunks;
145
- }
146
- case "json": {
147
- const text = asString(block.text) ?? asString(block.partial_json);
148
- return text ? [{ kind: "json-delta", delta: text }] : [];
149
- }
150
- case "refusal": {
151
- const text = asString(block.refusal) ?? asString(block.text);
152
- return text ? [{ kind: "refusal-delta", text }] : [];
153
- }
154
- default:
155
- return [];
252
+ if (blockType === "tool_use") {
253
+ const id = asString(block.id);
254
+ const name = asString(block.name) ?? "unknown";
255
+ if (id) state.id = id;
256
+ state.name = name;
156
257
  }
258
+ return anthropicBlockStartChunks(block, index, {
259
+ jsonMode: this.options.jsonMode,
260
+ mode: "stream-start"
261
+ });
157
262
  }
158
263
  contentBlockDelta(payload) {
159
264
  const index = asNumber(payload.index) ?? 0;
@@ -165,8 +270,9 @@ var AnthropicStreamParser = class {
165
270
  case "text_delta": {
166
271
  const text = asString(delta.text);
167
272
  if (!text) return [];
168
- if (this.options.jsonMode || state?.type === "json")
273
+ if (this.options.jsonMode || state?.type === "json") {
169
274
  return [{ kind: "json-delta", delta: text }];
275
+ }
170
276
  if (state?.type === "refusal") return [{ kind: "refusal-delta", text }];
171
277
  return [{ kind: "text-delta", text }];
172
278
  }
@@ -198,7 +304,7 @@ var AnthropicStreamParser = class {
198
304
  }
199
305
  messageDelta(payload) {
200
306
  const chunks = [];
201
- const usage = usageChunk(payload.usage);
307
+ const usage = buildUsageChunk(payload.usage);
202
308
  if (usage) chunks.push(usage);
203
309
  const delta = isRecord(payload.delta) ? payload.delta : void 0;
204
310
  const stopReason = delta ? asString(delta.stop_reason) : void 0;
@@ -220,91 +326,41 @@ function parseResponse(body, options) {
220
326
  throw libraryError("anthropicAdapter.parseResponse expected an Anthropic message object");
221
327
  }
222
328
  if (asString(body.type) === "error" || isRecord(body.error)) {
223
- return providerErrorChunks2(body.error);
329
+ return providerErrorFromPayload(body.error);
224
330
  }
225
331
  const chunks = [];
226
332
  const id = asString(body.id);
227
333
  const model = asString(body.model);
228
334
  if (id) chunks.push({ kind: "message-start", id });
229
- if (id || model)
335
+ if (id || model) {
230
336
  chunks.push(optionalRawChunk({ kind: "metadata", responseId: id, model, raw: body }));
231
- const inputUsage = usageChunk(body.usage);
337
+ }
338
+ const inputUsage = buildUsageChunk(body.usage);
232
339
  if (inputUsage) chunks.push(inputUsage);
233
340
  const content = Array.isArray(body.content) ? body.content : [];
234
341
  for (let index = 0; index < content.length; index += 1) {
235
342
  const block = content[index];
236
343
  if (!isRecord(block)) continue;
237
- chunks.push(...responseBlockChunks(block, index, options));
344
+ chunks.push(...anthropicResponseBlockChunks(block, index, { jsonMode: options.jsonMode }));
238
345
  }
239
346
  const reason = finishReason(asString(body.stop_reason));
240
347
  if (reason) chunks.push({ kind: "finish", reason });
241
348
  return chunks;
242
349
  }
243
- function responseBlockChunks(block, index, options) {
244
- const type = asString(block.type);
245
- switch (type) {
246
- case "text": {
247
- const text = asString(block.text);
248
- if (!text) return [];
249
- return options.jsonMode ? [{ kind: "json-delta", delta: text }] : [{ kind: "text-delta", text }];
250
- }
251
- case "thinking": {
252
- const text = asString(block.thinking);
253
- return text ? [{ kind: "reasoning-delta", text, variant: "detail" }] : [];
254
- }
255
- case "tool_use": {
256
- const id = asString(block.id);
257
- const name = asString(block.name) ?? "unknown";
258
- const chunks = [optionalRawChunk({ kind: "tool-start", id, name, index })];
259
- if (block.input !== void 0) {
260
- chunks.push(
261
- optionalRawChunk({
262
- kind: "tool-args-delta",
263
- id,
264
- delta: JSON.stringify(block.input),
265
- index
266
- })
267
- );
268
- }
269
- chunks.push(optionalRawChunk({ kind: "tool-done", id, index }));
270
- return chunks;
271
- }
272
- case "refusal": {
273
- const text = asString(block.refusal) ?? asString(block.text);
274
- return text ? [{ kind: "refusal-delta", text }] : [];
275
- }
276
- default:
277
- return [];
278
- }
279
- }
280
350
  function finishReason(value) {
281
- switch (value) {
282
- case "end_turn":
283
- case "stop_sequence":
284
- return "stop";
285
- case "max_tokens":
286
- return "length";
287
- case "tool_use":
288
- return "tool_calls";
289
- case "refusal":
290
- return "content_filter";
291
- case void 0:
292
- case null:
293
- return void 0;
294
- default:
295
- return "stop";
296
- }
297
- }
298
- function usageChunk(value) {
299
- if (!isRecord(value)) return void 0;
300
- const inputTokens = asNumber(value.input_tokens);
301
- const outputTokens = asNumber(value.output_tokens);
302
- if (inputTokens === void 0 && outputTokens === void 0) return void 0;
303
- return optionalRawChunk({ kind: "usage", inputTokens, outputTokens, raw: value });
351
+ if (value === void 0 || value === null) return void 0;
352
+ return mapAnthropicLikeStopReason(value);
304
353
  }
305
- function providerErrorChunks2(value) {
306
- const message = isRecord(value) ? asString(value.message) : void 0;
307
- return providerErrorChunksFromMessage(message ?? "Anthropic provider error", false);
354
+ function providerErrorFromPayload(value) {
355
+ if (isRecord(value)) {
356
+ return providerErrorChunksFromPayload(
357
+ value,
358
+ "anthropicAdapter.parseChunk",
359
+ false,
360
+ "Anthropic provider error"
361
+ );
362
+ }
363
+ return providerErrorChunksFromMessage("Anthropic provider error", false);
308
364
  }
309
365
 
310
366
  exports.anthropicAdapter = anthropicAdapter;
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/adapters/utils.ts","../../src/adapters/errors.ts","../../src/adapters/anthropic.ts"],"names":["providerErrorChunks"],"mappings":"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","file":"anthropic.cjs","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.cjs","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"]}
@@ -1,9 +1,7 @@
1
1
  import { S as StreamAdapter } from '../types-CskRfrmD.cjs';
2
2
 
3
3
  interface AnthropicAdapterOptions {
4
- /**
5
- * Map `json` content blocks to json-delta instead of text-delta.
6
- */
4
+ /** Map `json` content blocks to json-delta instead of text-delta. */
7
5
  jsonMode?: boolean;
8
6
  }
9
7
  declare function anthropicAdapter(options?: AnthropicAdapterOptions): StreamAdapter;
@@ -1,9 +1,7 @@
1
1
  import { S as StreamAdapter } from '../types-CskRfrmD.js';
2
2
 
3
3
  interface AnthropicAdapterOptions {
4
- /**
5
- * Map `json` content blocks to json-delta instead of text-delta.
6
- */
4
+ /** Map `json` content blocks to json-delta instead of text-delta. */
7
5
  jsonMode?: boolean;
8
6
  }
9
7
  declare function anthropicAdapter(options?: AnthropicAdapterOptions): StreamAdapter;