llm-stream-assemble 1.3.5 → 1.4.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.
- package/README.md +74 -13
- package/dist/adapters/bedrock.cjs +413 -0
- package/dist/adapters/bedrock.cjs.map +1 -0
- package/dist/adapters/bedrock.d.cts +15 -0
- package/dist/adapters/bedrock.d.ts +15 -0
- package/dist/adapters/bedrock.js +411 -0
- package/dist/adapters/bedrock.js.map +1 -0
- package/dist/index.cjs +349 -0
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +1 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.js +349 -1
- package/dist/index.js.map +1 -1
- package/package.json +11 -2
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { S as StreamAdapter } from '../types-CskRfrmD.js';
|
|
2
|
+
|
|
3
|
+
type BedrockModelFamily = "anthropic" | "openai-like" | "nova" | "auto";
|
|
4
|
+
interface BedrockAdapterOptions {
|
|
5
|
+
/**
|
|
6
|
+
* Hint which ConverseStream payload dialect to prefer when envelopes overlap.
|
|
7
|
+
* "auto" uses structural detection (document heuristics in adapter-guide).
|
|
8
|
+
*/
|
|
9
|
+
modelFamily?: BedrockModelFamily;
|
|
10
|
+
/** Map structured JSON text blocks to json-delta instead of text-delta. */
|
|
11
|
+
jsonMode?: boolean;
|
|
12
|
+
}
|
|
13
|
+
declare function bedrockAdapter(options?: BedrockAdapterOptions): StreamAdapter;
|
|
14
|
+
|
|
15
|
+
export { type BedrockAdapterOptions, type BedrockModelFamily, bedrockAdapter };
|
|
@@ -0,0 +1,411 @@
|
|
|
1
|
+
// src/adapters/utils.ts
|
|
2
|
+
function isRecord(value) {
|
|
3
|
+
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
4
|
+
}
|
|
5
|
+
function asString(value) {
|
|
6
|
+
return typeof value === "string" ? value : void 0;
|
|
7
|
+
}
|
|
8
|
+
function asNumber(value) {
|
|
9
|
+
return typeof value === "number" && Number.isFinite(value) ? value : void 0;
|
|
10
|
+
}
|
|
11
|
+
function optionalRawChunk(input) {
|
|
12
|
+
return Object.fromEntries(
|
|
13
|
+
Object.entries(input).filter(([, value]) => value !== void 0)
|
|
14
|
+
);
|
|
15
|
+
}
|
|
16
|
+
function prefixedAdapterError(feature, message) {
|
|
17
|
+
return adapterScopedError(feature, message);
|
|
18
|
+
}
|
|
19
|
+
function createStreamAdapter(config) {
|
|
20
|
+
return {
|
|
21
|
+
parseChunk(raw) {
|
|
22
|
+
return config.parser.parseChunk(raw);
|
|
23
|
+
},
|
|
24
|
+
parseResponse(body) {
|
|
25
|
+
return config.parseResponse(body, config.options);
|
|
26
|
+
}
|
|
27
|
+
};
|
|
28
|
+
}
|
|
29
|
+
function parseAdapterJSON(raw, feature) {
|
|
30
|
+
try {
|
|
31
|
+
return JSON.parse(raw);
|
|
32
|
+
} catch (error) {
|
|
33
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
34
|
+
throw prefixedAdapterError(feature, message);
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
// src/adapters/errors.ts
|
|
39
|
+
function libraryError(message) {
|
|
40
|
+
return new Error(`llm-stream-assemble: ${message}`);
|
|
41
|
+
}
|
|
42
|
+
function adapterScopedError(scope, message) {
|
|
43
|
+
return new Error(`llm-stream-assemble: ${scope}: ${message}`);
|
|
44
|
+
}
|
|
45
|
+
function providerErrorChunks(error, recoverable = false) {
|
|
46
|
+
return [
|
|
47
|
+
{ kind: "provider-error", error, recoverable },
|
|
48
|
+
{ kind: "finish", reason: "error" }
|
|
49
|
+
];
|
|
50
|
+
}
|
|
51
|
+
function providerErrorChunksFromPayload(errorPayload, scope, recoverable, fallbackMessage) {
|
|
52
|
+
const message = asString(errorPayload.message) ?? fallbackMessage;
|
|
53
|
+
const error = adapterScopedError(scope, message);
|
|
54
|
+
Object.defineProperty(error, "raw", {
|
|
55
|
+
value: errorPayload,
|
|
56
|
+
enumerable: false
|
|
57
|
+
});
|
|
58
|
+
return providerErrorChunks(error, recoverable);
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
// src/adapters/bedrock.ts
|
|
62
|
+
var EXCEPTION_KEYS = [
|
|
63
|
+
"internalServerException",
|
|
64
|
+
"modelStreamErrorException",
|
|
65
|
+
"validationException",
|
|
66
|
+
"throttlingException",
|
|
67
|
+
"serviceUnavailableException"
|
|
68
|
+
];
|
|
69
|
+
function bedrockAdapter(options = {}) {
|
|
70
|
+
const parser = new BedrockStreamParser(options);
|
|
71
|
+
return createStreamAdapter({
|
|
72
|
+
parser,
|
|
73
|
+
parseResponse,
|
|
74
|
+
options
|
|
75
|
+
});
|
|
76
|
+
}
|
|
77
|
+
var BedrockStreamParser = class {
|
|
78
|
+
constructor(options) {
|
|
79
|
+
this.options = options;
|
|
80
|
+
}
|
|
81
|
+
options;
|
|
82
|
+
messageStarted = false;
|
|
83
|
+
blocks = /* @__PURE__ */ new Map();
|
|
84
|
+
parseChunk(raw) {
|
|
85
|
+
const trimmed = raw.trim();
|
|
86
|
+
if (trimmed.length === 0 || trimmed === "[DONE]") return [];
|
|
87
|
+
const payload = parseAdapterJSON(trimmed, "bedrockAdapter.parseChunk");
|
|
88
|
+
if (!isRecord(payload)) {
|
|
89
|
+
throw libraryError("bedrockAdapter.parseChunk expected a JSON object");
|
|
90
|
+
}
|
|
91
|
+
for (const key of EXCEPTION_KEYS) {
|
|
92
|
+
const exception = payload[key];
|
|
93
|
+
if (isRecord(exception)) {
|
|
94
|
+
return providerErrorChunksFromPayload(
|
|
95
|
+
exception,
|
|
96
|
+
"bedrockAdapter.parseChunk",
|
|
97
|
+
false,
|
|
98
|
+
`Bedrock ${key}`
|
|
99
|
+
);
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
if (payload.messageStart !== void 0) {
|
|
103
|
+
return this.messageStartChunks(payload.messageStart);
|
|
104
|
+
}
|
|
105
|
+
if (payload.contentBlockStart !== void 0) {
|
|
106
|
+
return this.contentBlockStartChunks(payload.contentBlockStart);
|
|
107
|
+
}
|
|
108
|
+
if (payload.contentBlockDelta !== void 0) {
|
|
109
|
+
return this.contentBlockDeltaChunks(payload.contentBlockDelta);
|
|
110
|
+
}
|
|
111
|
+
if (payload.contentBlockStop !== void 0) {
|
|
112
|
+
return this.contentBlockStopChunks(payload.contentBlockStop);
|
|
113
|
+
}
|
|
114
|
+
if (payload.messageStop !== void 0) {
|
|
115
|
+
return this.messageStopChunks(payload.messageStop);
|
|
116
|
+
}
|
|
117
|
+
if (payload.metadata !== void 0) {
|
|
118
|
+
return this.metadataChunks(payload.metadata);
|
|
119
|
+
}
|
|
120
|
+
return optionalMetadataRaw(payload);
|
|
121
|
+
}
|
|
122
|
+
messageStartChunks(value) {
|
|
123
|
+
if (!isRecord(value)) return [];
|
|
124
|
+
if (this.messageStarted) return [];
|
|
125
|
+
this.messageStarted = true;
|
|
126
|
+
const role = asString(value.role);
|
|
127
|
+
return [
|
|
128
|
+
{ kind: "message-start" },
|
|
129
|
+
...role ? [
|
|
130
|
+
optionalRawChunk({
|
|
131
|
+
kind: "metadata",
|
|
132
|
+
raw: { role }
|
|
133
|
+
})
|
|
134
|
+
] : []
|
|
135
|
+
];
|
|
136
|
+
}
|
|
137
|
+
contentBlockStartChunks(value) {
|
|
138
|
+
if (!isRecord(value)) return [];
|
|
139
|
+
const blockIndex = asNumber(value.contentBlockIndex) ?? 0;
|
|
140
|
+
const start = isRecord(value.start) ? value.start : void 0;
|
|
141
|
+
const toolUse = start && isRecord(start.toolUse) ? start.toolUse : void 0;
|
|
142
|
+
if (!toolUse) return [];
|
|
143
|
+
const id = asString(toolUse.toolUseId) ?? `bedrock:${blockIndex}`;
|
|
144
|
+
const name = asString(toolUse.name) ?? "unknown";
|
|
145
|
+
this.blocks.set(blockIndex, {
|
|
146
|
+
id,
|
|
147
|
+
name,
|
|
148
|
+
index: blockIndex,
|
|
149
|
+
open: true,
|
|
150
|
+
lastArgsJson: ""
|
|
151
|
+
});
|
|
152
|
+
return [
|
|
153
|
+
optionalRawChunk({
|
|
154
|
+
kind: "tool-start",
|
|
155
|
+
id,
|
|
156
|
+
name,
|
|
157
|
+
index: blockIndex,
|
|
158
|
+
choiceIndex: 0
|
|
159
|
+
})
|
|
160
|
+
];
|
|
161
|
+
}
|
|
162
|
+
contentBlockDeltaChunks(value) {
|
|
163
|
+
if (!isRecord(value)) return [];
|
|
164
|
+
const blockIndex = asNumber(value.contentBlockIndex) ?? 0;
|
|
165
|
+
const delta = isRecord(value.delta) ? value.delta : void 0;
|
|
166
|
+
if (!delta) return [];
|
|
167
|
+
const chunks = [];
|
|
168
|
+
const text = asString(delta.text);
|
|
169
|
+
if (text !== void 0 && text.length > 0) {
|
|
170
|
+
if (this.options.jsonMode) {
|
|
171
|
+
chunks.push({ kind: "json-delta", delta: text });
|
|
172
|
+
} else {
|
|
173
|
+
chunks.push({ kind: "text-delta", text, choiceIndex: 0 });
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
const reasoning = delta.reasoningContent;
|
|
177
|
+
const reasoningText = reasoningTextFromDelta(reasoning, this.options.modelFamily);
|
|
178
|
+
if (reasoningText) {
|
|
179
|
+
chunks.push({ kind: "reasoning-delta", text: reasoningText, variant: "detail" });
|
|
180
|
+
}
|
|
181
|
+
const toolUse = isRecord(delta.toolUse) ? delta.toolUse : void 0;
|
|
182
|
+
if (toolUse) {
|
|
183
|
+
chunks.push(...this.toolInputDelta(blockIndex, toolUse));
|
|
184
|
+
}
|
|
185
|
+
return chunks;
|
|
186
|
+
}
|
|
187
|
+
toolInputDelta(blockIndex, toolUse) {
|
|
188
|
+
const state = this.blocks.get(blockIndex);
|
|
189
|
+
if (!state) return [];
|
|
190
|
+
const input = toolUse.input;
|
|
191
|
+
let delta;
|
|
192
|
+
if (typeof input === "string") {
|
|
193
|
+
delta = incrementalArgsDelta(state, input);
|
|
194
|
+
} else if (isRecord(input)) {
|
|
195
|
+
delta = incrementalArgsDelta(state, JSON.stringify(input));
|
|
196
|
+
}
|
|
197
|
+
if (!delta) return [];
|
|
198
|
+
return [
|
|
199
|
+
optionalRawChunk({
|
|
200
|
+
kind: "tool-args-delta",
|
|
201
|
+
id: state.id,
|
|
202
|
+
delta,
|
|
203
|
+
index: state.index,
|
|
204
|
+
choiceIndex: 0
|
|
205
|
+
})
|
|
206
|
+
];
|
|
207
|
+
}
|
|
208
|
+
contentBlockStopChunks(value) {
|
|
209
|
+
if (!isRecord(value)) return [];
|
|
210
|
+
const blockIndex = asNumber(value.contentBlockIndex) ?? 0;
|
|
211
|
+
const state = this.blocks.get(blockIndex);
|
|
212
|
+
if (!state?.open) return [];
|
|
213
|
+
state.open = false;
|
|
214
|
+
return [
|
|
215
|
+
optionalRawChunk({
|
|
216
|
+
kind: "tool-done",
|
|
217
|
+
id: state.id,
|
|
218
|
+
index: state.index,
|
|
219
|
+
choiceIndex: 0
|
|
220
|
+
})
|
|
221
|
+
];
|
|
222
|
+
}
|
|
223
|
+
messageStopChunks(value) {
|
|
224
|
+
if (!isRecord(value)) return [];
|
|
225
|
+
const stopReason = asString(value.stopReason) ?? "unknown";
|
|
226
|
+
const additional = value.additionalModelResponseFields;
|
|
227
|
+
const chunks = [];
|
|
228
|
+
chunks.push(
|
|
229
|
+
optionalRawChunk({
|
|
230
|
+
kind: "metadata",
|
|
231
|
+
raw: {
|
|
232
|
+
stopReason,
|
|
233
|
+
...additional !== void 0 ? { additionalModelResponseFields: additional } : {}
|
|
234
|
+
}
|
|
235
|
+
})
|
|
236
|
+
);
|
|
237
|
+
chunks.push({ kind: "finish", reason: mapStopReason(stopReason), choiceIndex: 0 });
|
|
238
|
+
return chunks;
|
|
239
|
+
}
|
|
240
|
+
metadataChunks(value) {
|
|
241
|
+
if (!isRecord(value)) return [];
|
|
242
|
+
const chunks = [];
|
|
243
|
+
const usage = usageChunk(value.usage);
|
|
244
|
+
if (usage) chunks.push(usage);
|
|
245
|
+
const metrics = value.metrics;
|
|
246
|
+
const trace = value.trace;
|
|
247
|
+
if (metrics !== void 0 || trace !== void 0) {
|
|
248
|
+
chunks.push(
|
|
249
|
+
optionalRawChunk({
|
|
250
|
+
kind: "metadata",
|
|
251
|
+
raw: { metrics, trace }
|
|
252
|
+
})
|
|
253
|
+
);
|
|
254
|
+
}
|
|
255
|
+
return chunks;
|
|
256
|
+
}
|
|
257
|
+
};
|
|
258
|
+
function parseResponse(body, options) {
|
|
259
|
+
if (!isRecord(body)) {
|
|
260
|
+
throw libraryError("bedrockAdapter.parseResponse expected a Converse response object");
|
|
261
|
+
}
|
|
262
|
+
for (const key of EXCEPTION_KEYS) {
|
|
263
|
+
const exception = body[key];
|
|
264
|
+
if (isRecord(exception)) {
|
|
265
|
+
return providerErrorChunksFromPayload(
|
|
266
|
+
exception,
|
|
267
|
+
"bedrockAdapter.parseResponse",
|
|
268
|
+
false,
|
|
269
|
+
`Bedrock ${key}`
|
|
270
|
+
);
|
|
271
|
+
}
|
|
272
|
+
}
|
|
273
|
+
const chunks = [];
|
|
274
|
+
const output = isRecord(body.output) ? body.output : void 0;
|
|
275
|
+
const message = output && isRecord(output.message) ? output.message : void 0;
|
|
276
|
+
if (message) {
|
|
277
|
+
chunks.push({ kind: "message-start" });
|
|
278
|
+
const role = asString(message.role);
|
|
279
|
+
if (role) {
|
|
280
|
+
chunks.push(optionalRawChunk({ kind: "metadata", raw: { role } }));
|
|
281
|
+
}
|
|
282
|
+
const content = Array.isArray(message.content) ? message.content : [];
|
|
283
|
+
let blockIndex = 0;
|
|
284
|
+
for (const block of content) {
|
|
285
|
+
if (!isRecord(block)) continue;
|
|
286
|
+
const text = asString(block.text);
|
|
287
|
+
if (text !== void 0 && text.length > 0) {
|
|
288
|
+
if (options.jsonMode) {
|
|
289
|
+
chunks.push({ kind: "json-delta", delta: text });
|
|
290
|
+
} else {
|
|
291
|
+
chunks.push({ kind: "text-delta", text, choiceIndex: 0 });
|
|
292
|
+
}
|
|
293
|
+
}
|
|
294
|
+
const toolUse = isRecord(block.toolUse) ? block.toolUse : void 0;
|
|
295
|
+
if (toolUse) {
|
|
296
|
+
const id = asString(toolUse.toolUseId) ?? `bedrock:${blockIndex}`;
|
|
297
|
+
const name = asString(toolUse.name) ?? "unknown";
|
|
298
|
+
chunks.push(
|
|
299
|
+
optionalRawChunk({
|
|
300
|
+
kind: "tool-start",
|
|
301
|
+
id,
|
|
302
|
+
name,
|
|
303
|
+
index: blockIndex,
|
|
304
|
+
choiceIndex: 0
|
|
305
|
+
})
|
|
306
|
+
);
|
|
307
|
+
const input = toolUse.input;
|
|
308
|
+
if (input !== void 0) {
|
|
309
|
+
const argsJson = typeof input === "string" ? input : JSON.stringify(input);
|
|
310
|
+
if (argsJson.length > 0) {
|
|
311
|
+
chunks.push(
|
|
312
|
+
optionalRawChunk({
|
|
313
|
+
kind: "tool-args-delta",
|
|
314
|
+
id,
|
|
315
|
+
delta: argsJson,
|
|
316
|
+
index: blockIndex,
|
|
317
|
+
choiceIndex: 0
|
|
318
|
+
})
|
|
319
|
+
);
|
|
320
|
+
}
|
|
321
|
+
}
|
|
322
|
+
chunks.push(
|
|
323
|
+
optionalRawChunk({
|
|
324
|
+
kind: "tool-done",
|
|
325
|
+
id,
|
|
326
|
+
index: blockIndex,
|
|
327
|
+
choiceIndex: 0
|
|
328
|
+
})
|
|
329
|
+
);
|
|
330
|
+
}
|
|
331
|
+
blockIndex += 1;
|
|
332
|
+
}
|
|
333
|
+
}
|
|
334
|
+
const usage = usageChunk(body.usage);
|
|
335
|
+
if (usage) chunks.push(usage);
|
|
336
|
+
const stopReason = asString(body.stopReason);
|
|
337
|
+
if (stopReason) {
|
|
338
|
+
chunks.push({ kind: "finish", reason: mapStopReason(stopReason), choiceIndex: 0 });
|
|
339
|
+
} else if (!chunks.some((chunk) => chunk.kind === "finish")) {
|
|
340
|
+
chunks.push({ kind: "finish", reason: "stop" });
|
|
341
|
+
}
|
|
342
|
+
return chunks;
|
|
343
|
+
}
|
|
344
|
+
function reasoningTextFromDelta(reasoning, modelFamily) {
|
|
345
|
+
if (reasoning === void 0) return void 0;
|
|
346
|
+
if (typeof reasoning === "string") return reasoning.length > 0 ? reasoning : void 0;
|
|
347
|
+
if (!isRecord(reasoning)) return void 0;
|
|
348
|
+
const text = asString(reasoning.text);
|
|
349
|
+
if (text !== void 0 && text.length > 0) return text;
|
|
350
|
+
if (modelFamily === "anthropic" || modelFamily === "auto") {
|
|
351
|
+
const thinking = asString(reasoning.thinking);
|
|
352
|
+
if (thinking !== void 0 && thinking.length > 0) return thinking;
|
|
353
|
+
}
|
|
354
|
+
return void 0;
|
|
355
|
+
}
|
|
356
|
+
function incrementalArgsDelta(state, nextInput) {
|
|
357
|
+
const prev = state.lastArgsJson;
|
|
358
|
+
if (nextInput === prev) return void 0;
|
|
359
|
+
let delta;
|
|
360
|
+
if (prev.length > 0 && nextInput.startsWith(prev)) {
|
|
361
|
+
delta = nextInput.slice(prev.length);
|
|
362
|
+
} else {
|
|
363
|
+
delta = nextInput;
|
|
364
|
+
}
|
|
365
|
+
state.lastArgsJson = nextInput;
|
|
366
|
+
return delta.length > 0 ? delta : void 0;
|
|
367
|
+
}
|
|
368
|
+
function mapStopReason(value) {
|
|
369
|
+
switch (value) {
|
|
370
|
+
case "end_turn":
|
|
371
|
+
case "stop_sequence":
|
|
372
|
+
return "stop";
|
|
373
|
+
case "tool_use":
|
|
374
|
+
return "tool_calls";
|
|
375
|
+
case "max_tokens":
|
|
376
|
+
return "length";
|
|
377
|
+
case "content_filtered":
|
|
378
|
+
case "guardrail_intervened":
|
|
379
|
+
return "content_filter";
|
|
380
|
+
default:
|
|
381
|
+
return "stop";
|
|
382
|
+
}
|
|
383
|
+
}
|
|
384
|
+
function usageChunk(value) {
|
|
385
|
+
if (!isRecord(value)) return void 0;
|
|
386
|
+
const inputTokens = asNumber(value.inputTokens) ?? asNumber(value.promptTokens) ?? asNumber(value.inputTokenCount);
|
|
387
|
+
const outputTokens = asNumber(value.outputTokens) ?? asNumber(value.completionTokens) ?? asNumber(value.outputTokenCount);
|
|
388
|
+
const totalTokens = asNumber(value.totalTokens) ?? asNumber(value.totalTokenCount);
|
|
389
|
+
if (inputTokens === void 0 && outputTokens === void 0 && totalTokens === void 0) {
|
|
390
|
+
return void 0;
|
|
391
|
+
}
|
|
392
|
+
return optionalRawChunk({
|
|
393
|
+
kind: "usage",
|
|
394
|
+
inputTokens,
|
|
395
|
+
outputTokens,
|
|
396
|
+
raw: { ...value, totalTokens }
|
|
397
|
+
});
|
|
398
|
+
}
|
|
399
|
+
function optionalMetadataRaw(payload) {
|
|
400
|
+
if (Object.keys(payload).length === 0) return [];
|
|
401
|
+
return [
|
|
402
|
+
optionalRawChunk({
|
|
403
|
+
kind: "metadata",
|
|
404
|
+
raw: payload
|
|
405
|
+
})
|
|
406
|
+
];
|
|
407
|
+
}
|
|
408
|
+
|
|
409
|
+
export { bedrockAdapter };
|
|
410
|
+
//# sourceMappingURL=bedrock.js.map
|
|
411
|
+
//# sourceMappingURL=bedrock.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/adapters/utils.ts","../../src/adapters/errors.ts","../../src/adapters/bedrock.ts"],"names":[],"mappings":"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","file":"bedrock.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, providerErrorChunksFromPayload } from \"./errors\";\nimport {\n\tasNumber,\n\tasString,\n\tcreateStreamAdapter,\n\tisRecord,\n\toptionalRawChunk,\n\tparseAdapterJSON,\n} from \"./utils\";\n\nexport type BedrockModelFamily = \"anthropic\" | \"openai-like\" | \"nova\" | \"auto\";\n\nexport interface BedrockAdapterOptions {\n\t/**\n\t * Hint which ConverseStream payload dialect to prefer when envelopes overlap.\n\t * \"auto\" uses structural detection (document heuristics in adapter-guide).\n\t */\n\tmodelFamily?: BedrockModelFamily;\n\t/** Map structured JSON text blocks to json-delta instead of text-delta. */\n\tjsonMode?: boolean;\n}\n\ninterface BlockToolState {\n\tid: string;\n\tname: string;\n\tindex: number;\n\topen: boolean;\n\tlastArgsJson: string;\n}\n\nconst EXCEPTION_KEYS = [\n\t\"internalServerException\",\n\t\"modelStreamErrorException\",\n\t\"validationException\",\n\t\"throttlingException\",\n\t\"serviceUnavailableException\",\n] as const;\n\nexport function bedrockAdapter(options: BedrockAdapterOptions = {}): StreamAdapter {\n\tconst parser = new BedrockStreamParser(options);\n\treturn createStreamAdapter({\n\t\tparser,\n\t\tparseResponse,\n\t\toptions,\n\t});\n}\n\nclass BedrockStreamParser {\n\tprivate messageStarted = false;\n\tprivate readonly blocks = new Map<number, BlockToolState>();\n\n\tconstructor(private readonly options: BedrockAdapterOptions) {}\n\n\tparseChunk(raw: string): RawChunk[] {\n\t\tconst trimmed = raw.trim();\n\t\tif (trimmed.length === 0 || trimmed === \"[DONE]\") return [];\n\n\t\tconst payload = parseAdapterJSON(trimmed, \"bedrockAdapter.parseChunk\");\n\t\tif (!isRecord(payload)) {\n\t\t\tthrow libraryError(\"bedrockAdapter.parseChunk expected a JSON object\");\n\t\t}\n\n\t\tfor (const key of EXCEPTION_KEYS) {\n\t\t\tconst exception = payload[key];\n\t\t\tif (isRecord(exception)) {\n\t\t\t\treturn providerErrorChunksFromPayload(\n\t\t\t\t\texception,\n\t\t\t\t\t\"bedrockAdapter.parseChunk\",\n\t\t\t\t\tfalse,\n\t\t\t\t\t`Bedrock ${key}`,\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\n\t\tif (payload.messageStart !== undefined) {\n\t\t\treturn this.messageStartChunks(payload.messageStart);\n\t\t}\n\t\tif (payload.contentBlockStart !== undefined) {\n\t\t\treturn this.contentBlockStartChunks(payload.contentBlockStart);\n\t\t}\n\t\tif (payload.contentBlockDelta !== undefined) {\n\t\t\treturn this.contentBlockDeltaChunks(payload.contentBlockDelta);\n\t\t}\n\t\tif (payload.contentBlockStop !== undefined) {\n\t\t\treturn this.contentBlockStopChunks(payload.contentBlockStop);\n\t\t}\n\t\tif (payload.messageStop !== undefined) {\n\t\t\treturn this.messageStopChunks(payload.messageStop);\n\t\t}\n\t\tif (payload.metadata !== undefined) {\n\t\t\treturn this.metadataChunks(payload.metadata);\n\t\t}\n\n\t\treturn optionalMetadataRaw(payload);\n\t}\n\n\tprivate messageStartChunks(value: unknown): RawChunk[] {\n\t\tif (!isRecord(value)) return [];\n\t\tif (this.messageStarted) return [];\n\t\tthis.messageStarted = true;\n\t\tconst role = asString(value.role);\n\t\treturn [\n\t\t\t{ kind: \"message-start\" },\n\t\t\t...(role\n\t\t\t\t? [\n\t\t\t\t\t\toptionalRawChunk({\n\t\t\t\t\t\t\tkind: \"metadata\",\n\t\t\t\t\t\t\traw: { role },\n\t\t\t\t\t\t}),\n\t\t\t\t\t]\n\t\t\t\t: []),\n\t\t];\n\t}\n\n\tprivate contentBlockStartChunks(value: unknown): RawChunk[] {\n\t\tif (!isRecord(value)) return [];\n\t\tconst blockIndex = asNumber(value.contentBlockIndex) ?? 0;\n\t\tconst start = isRecord(value.start) ? value.start : undefined;\n\t\tconst toolUse = start && isRecord(start.toolUse) ? start.toolUse : undefined;\n\t\tif (!toolUse) return [];\n\n\t\tconst id = asString(toolUse.toolUseId) ?? `bedrock:${blockIndex}`;\n\t\tconst name = asString(toolUse.name) ?? \"unknown\";\n\t\tthis.blocks.set(blockIndex, {\n\t\t\tid,\n\t\t\tname,\n\t\t\tindex: blockIndex,\n\t\t\topen: true,\n\t\t\tlastArgsJson: \"\",\n\t\t});\n\t\treturn [\n\t\t\toptionalRawChunk({\n\t\t\t\tkind: \"tool-start\",\n\t\t\t\tid,\n\t\t\t\tname,\n\t\t\t\tindex: blockIndex,\n\t\t\t\tchoiceIndex: 0,\n\t\t\t}),\n\t\t];\n\t}\n\n\tprivate contentBlockDeltaChunks(value: unknown): RawChunk[] {\n\t\tif (!isRecord(value)) return [];\n\t\tconst blockIndex = asNumber(value.contentBlockIndex) ?? 0;\n\t\tconst delta = isRecord(value.delta) ? value.delta : undefined;\n\t\tif (!delta) return [];\n\n\t\tconst chunks: RawChunk[] = [];\n\t\tconst text = asString(delta.text);\n\t\tif (text !== undefined && text.length > 0) {\n\t\t\tif (this.options.jsonMode) {\n\t\t\t\tchunks.push({ kind: \"json-delta\", delta: text });\n\t\t\t} else {\n\t\t\t\tchunks.push({ kind: \"text-delta\", text, choiceIndex: 0 });\n\t\t\t}\n\t\t}\n\n\t\tconst reasoning = delta.reasoningContent;\n\t\tconst reasoningText = reasoningTextFromDelta(reasoning, this.options.modelFamily);\n\t\tif (reasoningText) {\n\t\t\tchunks.push({ kind: \"reasoning-delta\", text: reasoningText, variant: \"detail\" });\n\t\t}\n\n\t\tconst toolUse = isRecord(delta.toolUse) ? delta.toolUse : undefined;\n\t\tif (toolUse) {\n\t\t\tchunks.push(...this.toolInputDelta(blockIndex, toolUse));\n\t\t}\n\n\t\treturn chunks;\n\t}\n\n\tprivate toolInputDelta(blockIndex: number, toolUse: Record<string, unknown>): RawChunk[] {\n\t\tconst state = this.blocks.get(blockIndex);\n\t\tif (!state) return [];\n\n\t\tconst input = toolUse.input;\n\t\tlet delta: string | undefined;\n\t\tif (typeof input === \"string\") {\n\t\t\tdelta = incrementalArgsDelta(state, input);\n\t\t} else if (isRecord(input)) {\n\t\t\tdelta = incrementalArgsDelta(state, JSON.stringify(input));\n\t\t}\n\t\tif (!delta) return [];\n\n\t\treturn [\n\t\t\toptionalRawChunk({\n\t\t\t\tkind: \"tool-args-delta\",\n\t\t\t\tid: state.id,\n\t\t\t\tdelta,\n\t\t\t\tindex: state.index,\n\t\t\t\tchoiceIndex: 0,\n\t\t\t}),\n\t\t];\n\t}\n\n\tprivate contentBlockStopChunks(value: unknown): RawChunk[] {\n\t\tif (!isRecord(value)) return [];\n\t\tconst blockIndex = asNumber(value.contentBlockIndex) ?? 0;\n\t\tconst state = this.blocks.get(blockIndex);\n\t\tif (!state?.open) return [];\n\n\t\tstate.open = false;\n\t\treturn [\n\t\t\toptionalRawChunk({\n\t\t\t\tkind: \"tool-done\",\n\t\t\t\tid: state.id,\n\t\t\t\tindex: state.index,\n\t\t\t\tchoiceIndex: 0,\n\t\t\t}),\n\t\t];\n\t}\n\n\tprivate messageStopChunks(value: unknown): RawChunk[] {\n\t\tif (!isRecord(value)) return [];\n\t\tconst stopReason = asString(value.stopReason) ?? \"unknown\";\n\t\tconst additional = value.additionalModelResponseFields;\n\t\tconst chunks: RawChunk[] = [];\n\t\tchunks.push(\n\t\t\toptionalRawChunk({\n\t\t\t\tkind: \"metadata\",\n\t\t\t\traw: {\n\t\t\t\t\tstopReason,\n\t\t\t\t\t...(additional !== undefined ? { additionalModelResponseFields: additional } : {}),\n\t\t\t\t},\n\t\t\t}),\n\t\t);\n\t\tchunks.push({ kind: \"finish\", reason: mapStopReason(stopReason), choiceIndex: 0 });\n\t\treturn chunks;\n\t}\n\n\tprivate metadataChunks(value: unknown): RawChunk[] {\n\t\tif (!isRecord(value)) return [];\n\t\tconst chunks: RawChunk[] = [];\n\n\t\tconst usage = usageChunk(value.usage);\n\t\tif (usage) chunks.push(usage);\n\n\t\tconst metrics = value.metrics;\n\t\tconst trace = value.trace;\n\t\tif (metrics !== undefined || trace !== undefined) {\n\t\t\tchunks.push(\n\t\t\t\toptionalRawChunk({\n\t\t\t\t\tkind: \"metadata\",\n\t\t\t\t\traw: { metrics, trace },\n\t\t\t\t}),\n\t\t\t);\n\t\t}\n\n\t\treturn chunks;\n\t}\n}\n\nfunction parseResponse(body: unknown, options: BedrockAdapterOptions): RawChunk[] {\n\tif (!isRecord(body)) {\n\t\tthrow libraryError(\"bedrockAdapter.parseResponse expected a Converse response object\");\n\t}\n\n\tfor (const key of EXCEPTION_KEYS) {\n\t\tconst exception = body[key];\n\t\tif (isRecord(exception)) {\n\t\t\treturn providerErrorChunksFromPayload(\n\t\t\t\texception,\n\t\t\t\t\"bedrockAdapter.parseResponse\",\n\t\t\t\tfalse,\n\t\t\t\t`Bedrock ${key}`,\n\t\t\t);\n\t\t}\n\t}\n\n\tconst parser = new BedrockStreamParser(options);\n\tconst chunks: RawChunk[] = [];\n\n\tconst output = isRecord(body.output) ? body.output : undefined;\n\tconst message = output && isRecord(output.message) ? output.message : undefined;\n\tif (message) {\n\t\tchunks.push({ kind: \"message-start\" });\n\t\tconst role = asString(message.role);\n\t\tif (role) {\n\t\t\tchunks.push(optionalRawChunk({ kind: \"metadata\", raw: { role } }));\n\t\t}\n\n\t\tconst content = Array.isArray(message.content) ? message.content : [];\n\t\tlet blockIndex = 0;\n\t\tfor (const block of content) {\n\t\t\tif (!isRecord(block)) continue;\n\t\t\tconst text = asString(block.text);\n\t\t\tif (text !== undefined && text.length > 0) {\n\t\t\t\tif (options.jsonMode) {\n\t\t\t\t\tchunks.push({ kind: \"json-delta\", delta: text });\n\t\t\t\t} else {\n\t\t\t\t\tchunks.push({ kind: \"text-delta\", text, choiceIndex: 0 });\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tconst toolUse = isRecord(block.toolUse) ? block.toolUse : undefined;\n\t\t\tif (toolUse) {\n\t\t\t\tconst id = asString(toolUse.toolUseId) ?? `bedrock:${blockIndex}`;\n\t\t\t\tconst name = asString(toolUse.name) ?? \"unknown\";\n\t\t\t\tchunks.push(\n\t\t\t\t\toptionalRawChunk({\n\t\t\t\t\t\tkind: \"tool-start\",\n\t\t\t\t\t\tid,\n\t\t\t\t\t\tname,\n\t\t\t\t\t\tindex: blockIndex,\n\t\t\t\t\t\tchoiceIndex: 0,\n\t\t\t\t\t}),\n\t\t\t\t);\n\t\t\t\tconst input = toolUse.input;\n\t\t\t\tif (input !== undefined) {\n\t\t\t\t\tconst argsJson = typeof input === \"string\" ? input : JSON.stringify(input);\n\t\t\t\t\tif (argsJson.length > 0) {\n\t\t\t\t\t\tchunks.push(\n\t\t\t\t\t\t\toptionalRawChunk({\n\t\t\t\t\t\t\t\tkind: \"tool-args-delta\",\n\t\t\t\t\t\t\t\tid,\n\t\t\t\t\t\t\t\tdelta: argsJson,\n\t\t\t\t\t\t\t\tindex: blockIndex,\n\t\t\t\t\t\t\t\tchoiceIndex: 0,\n\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tchunks.push(\n\t\t\t\t\toptionalRawChunk({\n\t\t\t\t\t\tkind: \"tool-done\",\n\t\t\t\t\t\tid,\n\t\t\t\t\t\tindex: blockIndex,\n\t\t\t\t\t\tchoiceIndex: 0,\n\t\t\t\t\t}),\n\t\t\t\t);\n\t\t\t}\n\t\t\tblockIndex += 1;\n\t\t}\n\t}\n\n\tconst usage = usageChunk(body.usage);\n\tif (usage) chunks.push(usage);\n\n\tconst stopReason = asString(body.stopReason);\n\tif (stopReason) {\n\t\tchunks.push({ kind: \"finish\", reason: mapStopReason(stopReason), choiceIndex: 0 });\n\t} else if (!chunks.some((chunk) => chunk.kind === \"finish\")) {\n\t\tchunks.push({ kind: \"finish\", reason: \"stop\" });\n\t}\n\n\t// Touch parser options for modelFamily-specific paths in stream mode parity.\n\tvoid parser;\n\n\treturn chunks;\n}\n\nfunction reasoningTextFromDelta(\n\treasoning: unknown,\n\tmodelFamily: BedrockModelFamily | undefined,\n): string | undefined {\n\tif (reasoning === undefined) return undefined;\n\tif (typeof reasoning === \"string\") return reasoning.length > 0 ? reasoning : undefined;\n\tif (!isRecord(reasoning)) return undefined;\n\n\tconst text = asString(reasoning.text);\n\tif (text !== undefined && text.length > 0) return text;\n\n\tif (modelFamily === \"anthropic\" || modelFamily === \"auto\") {\n\t\tconst thinking = asString(reasoning.thinking);\n\t\tif (thinking !== undefined && thinking.length > 0) return thinking;\n\t}\n\n\treturn undefined;\n}\n\nfunction incrementalArgsDelta(state: BlockToolState, nextInput: string): string | undefined {\n\tconst prev = state.lastArgsJson;\n\tif (nextInput === prev) return undefined;\n\tlet delta: string;\n\tif (prev.length > 0 && nextInput.startsWith(prev)) {\n\t\tdelta = nextInput.slice(prev.length);\n\t} else {\n\t\tdelta = nextInput;\n\t}\n\tstate.lastArgsJson = nextInput;\n\treturn delta.length > 0 ? delta : undefined;\n}\n\nfunction mapStopReason(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\t\treturn \"content_filter\";\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 =\n\t\tasNumber(value.inputTokens) ?? asNumber(value.promptTokens) ?? asNumber(value.inputTokenCount);\n\tconst outputTokens =\n\t\tasNumber(value.outputTokens) ??\n\t\tasNumber(value.completionTokens) ??\n\t\tasNumber(value.outputTokenCount);\n\tconst totalTokens = asNumber(value.totalTokens) ?? asNumber(value.totalTokenCount);\n\tif (inputTokens === undefined && outputTokens === undefined && totalTokens === undefined) {\n\t\treturn undefined;\n\t}\n\treturn optionalRawChunk({\n\t\tkind: \"usage\",\n\t\tinputTokens,\n\t\toutputTokens,\n\t\traw: { ...value, totalTokens },\n\t});\n}\n\nfunction optionalMetadataRaw(payload: Record<string, unknown>): RawChunk[] {\n\tif (Object.keys(payload).length === 0) return [];\n\treturn [\n\t\toptionalRawChunk({\n\t\t\tkind: \"metadata\",\n\t\t\traw: payload,\n\t\t}),\n\t];\n}\n"]}
|