@copilotkit/aimock 1.14.9 → 1.15.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.
- package/CHANGELOG.md +29 -0
- package/dist/bedrock-converse.cjs +129 -21
- package/dist/bedrock-converse.cjs.map +1 -1
- package/dist/bedrock-converse.d.cts.map +1 -1
- package/dist/bedrock-converse.d.ts.map +1 -1
- package/dist/bedrock-converse.js +131 -23
- package/dist/bedrock-converse.js.map +1 -1
- package/dist/bedrock.cjs +258 -44
- package/dist/bedrock.cjs.map +1 -1
- package/dist/bedrock.d.cts.map +1 -1
- package/dist/bedrock.d.ts.map +1 -1
- package/dist/bedrock.js +259 -46
- package/dist/bedrock.js.map +1 -1
- package/dist/cohere.cjs +287 -31
- package/dist/cohere.cjs.map +1 -1
- package/dist/cohere.d.cts +9 -0
- package/dist/cohere.d.cts.map +1 -1
- package/dist/cohere.d.ts +9 -0
- package/dist/cohere.d.ts.map +1 -1
- package/dist/cohere.js +288 -32
- package/dist/cohere.js.map +1 -1
- package/dist/config-loader.d.ts.map +1 -1
- package/dist/embeddings.cjs +21 -3
- package/dist/embeddings.cjs.map +1 -1
- package/dist/embeddings.d.cts +2 -2
- package/dist/embeddings.d.cts.map +1 -1
- package/dist/embeddings.d.ts +2 -2
- package/dist/embeddings.d.ts.map +1 -1
- package/dist/embeddings.js +21 -3
- package/dist/embeddings.js.map +1 -1
- package/dist/gemini.cjs +46 -43
- package/dist/gemini.cjs.map +1 -1
- package/dist/gemini.d.cts.map +1 -1
- package/dist/gemini.d.ts.map +1 -1
- package/dist/gemini.js +46 -43
- package/dist/gemini.js.map +1 -1
- package/dist/helpers.cjs +9 -0
- package/dist/helpers.cjs.map +1 -1
- package/dist/helpers.d.cts.map +1 -1
- package/dist/helpers.d.ts.map +1 -1
- package/dist/helpers.js +9 -0
- package/dist/helpers.js.map +1 -1
- package/dist/images.cjs +19 -1
- package/dist/images.cjs.map +1 -1
- package/dist/images.js +19 -1
- package/dist/images.js.map +1 -1
- package/dist/index.cjs +2 -0
- package/dist/index.d.cts +2 -2
- package/dist/index.d.ts +2 -2
- package/dist/index.js +3 -3
- package/dist/jest.cjs +10 -3
- package/dist/jest.cjs.map +1 -1
- package/dist/jest.js +10 -3
- package/dist/jest.js.map +1 -1
- package/dist/journal.cjs +1 -1
- package/dist/journal.cjs.map +1 -1
- package/dist/journal.d.cts.map +1 -1
- package/dist/journal.d.ts.map +1 -1
- package/dist/journal.js +1 -1
- package/dist/journal.js.map +1 -1
- package/dist/messages.cjs +3 -2
- package/dist/messages.cjs.map +1 -1
- package/dist/messages.js +3 -2
- package/dist/messages.js.map +1 -1
- package/dist/ollama.cjs +125 -4
- package/dist/ollama.cjs.map +1 -1
- package/dist/ollama.d.cts.map +1 -1
- package/dist/ollama.d.ts.map +1 -1
- package/dist/ollama.js +126 -5
- package/dist/ollama.js.map +1 -1
- package/dist/recorder.cjs +224 -53
- package/dist/recorder.cjs.map +1 -1
- package/dist/recorder.js +224 -53
- package/dist/recorder.js.map +1 -1
- package/dist/responses.cjs +10 -1
- package/dist/responses.cjs.map +1 -1
- package/dist/responses.d.cts +2 -1
- package/dist/responses.d.cts.map +1 -1
- package/dist/responses.d.ts +2 -1
- package/dist/responses.d.ts.map +1 -1
- package/dist/responses.js +10 -2
- package/dist/responses.js.map +1 -1
- package/dist/router.cjs +13 -6
- package/dist/router.cjs.map +1 -1
- package/dist/router.js +13 -6
- package/dist/router.js.map +1 -1
- package/dist/server.cjs +144 -62
- package/dist/server.cjs.map +1 -1
- package/dist/server.d.cts.map +1 -1
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +145 -63
- package/dist/server.js.map +1 -1
- package/dist/speech.cjs +19 -1
- package/dist/speech.cjs.map +1 -1
- package/dist/speech.js +19 -1
- package/dist/speech.js.map +1 -1
- package/dist/transcription.cjs +8 -4
- package/dist/transcription.cjs.map +1 -1
- package/dist/transcription.d.cts.map +1 -1
- package/dist/transcription.d.ts.map +1 -1
- package/dist/transcription.js +8 -4
- package/dist/transcription.js.map +1 -1
- package/dist/types.d.cts +1 -0
- package/dist/types.d.cts.map +1 -1
- package/dist/types.d.ts +1 -0
- package/dist/types.d.ts.map +1 -1
- package/dist/video.cjs +63 -1
- package/dist/video.cjs.map +1 -1
- package/dist/video.d.cts +15 -2
- package/dist/video.d.cts.map +1 -1
- package/dist/video.d.ts +15 -2
- package/dist/video.d.ts.map +1 -1
- package/dist/video.js +63 -2
- package/dist/video.js.map +1 -1
- package/dist/vitest.cjs +10 -3
- package/dist/vitest.cjs.map +1 -1
- package/dist/vitest.js +10 -3
- package/dist/vitest.js.map +1 -1
- package/package.json +1 -1
package/dist/bedrock.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { flattenHeaders, generateMessageId, generateToolUseId, getTestId, isErrorResponse, isTextResponse, isToolCallResponse } from "./helpers.js";
|
|
1
|
+
import { extractOverrides, flattenHeaders, generateMessageId, generateToolUseId, getTestId, isContentWithToolCallsResponse, isErrorResponse, isTextResponse, isToolCallResponse } from "./helpers.js";
|
|
2
2
|
import { matchFixture } from "./router.js";
|
|
3
3
|
import { writeErrorResponse } from "./sse-writer.js";
|
|
4
4
|
import { createInterruptionSignal } from "./interruption.js";
|
|
@@ -7,6 +7,23 @@ import { proxyAndRecord } from "./recorder.js";
|
|
|
7
7
|
import { writeEventStream } from "./aws-event-stream.js";
|
|
8
8
|
|
|
9
9
|
//#region src/bedrock.ts
|
|
10
|
+
function bedrockStopReason(overrideFinishReason, defaultReason) {
|
|
11
|
+
if (!overrideFinishReason) return defaultReason;
|
|
12
|
+
if (overrideFinishReason === "stop") return "end_turn";
|
|
13
|
+
if (overrideFinishReason === "tool_calls") return "tool_use";
|
|
14
|
+
if (overrideFinishReason === "length") return "max_tokens";
|
|
15
|
+
return overrideFinishReason;
|
|
16
|
+
}
|
|
17
|
+
function bedrockUsage(overrides) {
|
|
18
|
+
if (!overrides?.usage) return {
|
|
19
|
+
input_tokens: 0,
|
|
20
|
+
output_tokens: 0
|
|
21
|
+
};
|
|
22
|
+
return {
|
|
23
|
+
input_tokens: overrides.usage.input_tokens ?? overrides.usage.prompt_tokens ?? 0,
|
|
24
|
+
output_tokens: overrides.usage.output_tokens ?? overrides.usage.completion_tokens ?? 0
|
|
25
|
+
};
|
|
26
|
+
}
|
|
10
27
|
function extractTextContent(content) {
|
|
11
28
|
if (typeof content === "string") return content;
|
|
12
29
|
return content.filter((b) => b.type === "text").map((b) => b.text ?? "").join("");
|
|
@@ -88,7 +105,7 @@ function bedrockToCompletionRequest(req, modelId) {
|
|
|
88
105
|
tools
|
|
89
106
|
};
|
|
90
107
|
}
|
|
91
|
-
function buildBedrockTextResponse(content, model, reasoning) {
|
|
108
|
+
function buildBedrockTextResponse(content, model, reasoning, overrides) {
|
|
92
109
|
const contentBlocks = [];
|
|
93
110
|
if (reasoning) contentBlocks.push({
|
|
94
111
|
type: "thinking",
|
|
@@ -99,22 +116,19 @@ function buildBedrockTextResponse(content, model, reasoning) {
|
|
|
99
116
|
text: content
|
|
100
117
|
});
|
|
101
118
|
return {
|
|
102
|
-
id: generateMessageId(),
|
|
119
|
+
id: overrides?.id ?? generateMessageId(),
|
|
103
120
|
type: "message",
|
|
104
121
|
role: "assistant",
|
|
105
122
|
content: contentBlocks,
|
|
106
|
-
model,
|
|
107
|
-
stop_reason: "end_turn",
|
|
123
|
+
model: overrides?.model ?? model,
|
|
124
|
+
stop_reason: bedrockStopReason(overrides?.finishReason, "end_turn"),
|
|
108
125
|
stop_sequence: null,
|
|
109
|
-
usage:
|
|
110
|
-
input_tokens: 0,
|
|
111
|
-
output_tokens: 0
|
|
112
|
-
}
|
|
126
|
+
usage: bedrockUsage(overrides)
|
|
113
127
|
};
|
|
114
128
|
}
|
|
115
|
-
function buildBedrockToolCallResponse(toolCalls, model, logger) {
|
|
129
|
+
function buildBedrockToolCallResponse(toolCalls, model, logger, overrides) {
|
|
116
130
|
return {
|
|
117
|
-
id: generateMessageId(),
|
|
131
|
+
id: overrides?.id ?? generateMessageId(),
|
|
118
132
|
type: "message",
|
|
119
133
|
role: "assistant",
|
|
120
134
|
content: toolCalls.map((tc) => {
|
|
@@ -132,13 +146,10 @@ function buildBedrockToolCallResponse(toolCalls, model, logger) {
|
|
|
132
146
|
input: argsObj
|
|
133
147
|
};
|
|
134
148
|
}),
|
|
135
|
-
model,
|
|
136
|
-
stop_reason: "tool_use",
|
|
149
|
+
model: overrides?.model ?? model,
|
|
150
|
+
stop_reason: bedrockStopReason(overrides?.finishReason, "tool_use"),
|
|
137
151
|
stop_sequence: null,
|
|
138
|
-
usage:
|
|
139
|
-
input_tokens: 0,
|
|
140
|
-
output_tokens: 0
|
|
141
|
-
}
|
|
152
|
+
usage: bedrockUsage(overrides)
|
|
142
153
|
};
|
|
143
154
|
}
|
|
144
155
|
async function handleBedrock(req, res, raw, modelId, fixtures, journal, defaults, setCorsHeaders) {
|
|
@@ -203,7 +214,8 @@ async function handleBedrock(req, res, raw, modelId, fixtures, journal, defaults
|
|
|
203
214
|
body: completionReq,
|
|
204
215
|
response: {
|
|
205
216
|
status: res.statusCode ?? 200,
|
|
206
|
-
fixture: null
|
|
217
|
+
fixture: null,
|
|
218
|
+
source: "proxy"
|
|
207
219
|
}
|
|
208
220
|
});
|
|
209
221
|
return;
|
|
@@ -251,7 +263,33 @@ async function handleBedrock(req, res, raw, modelId, fixtures, journal, defaults
|
|
|
251
263
|
writeErrorResponse(res, status, JSON.stringify(anthropicError));
|
|
252
264
|
return;
|
|
253
265
|
}
|
|
266
|
+
if (isContentWithToolCallsResponse(response)) {
|
|
267
|
+
if (response.webSearches?.length) logger.warn("webSearches in fixture response are not supported for Bedrock API — ignoring");
|
|
268
|
+
const overrides = extractOverrides(response);
|
|
269
|
+
journal.add({
|
|
270
|
+
method: req.method ?? "POST",
|
|
271
|
+
path: urlPath,
|
|
272
|
+
headers: flattenHeaders(req.headers),
|
|
273
|
+
body: completionReq,
|
|
274
|
+
response: {
|
|
275
|
+
status: 200,
|
|
276
|
+
fixture
|
|
277
|
+
}
|
|
278
|
+
});
|
|
279
|
+
const textBody = buildBedrockTextResponse(response.content, completionReq.model, response.reasoning, overrides);
|
|
280
|
+
const toolBody = buildBedrockToolCallResponse(response.toolCalls, completionReq.model, logger, overrides);
|
|
281
|
+
const merged = {
|
|
282
|
+
...textBody,
|
|
283
|
+
content: [...textBody.content, ...toolBody.content],
|
|
284
|
+
stop_reason: bedrockStopReason(overrides?.finishReason, "tool_use")
|
|
285
|
+
};
|
|
286
|
+
res.writeHead(200, { "Content-Type": "application/json" });
|
|
287
|
+
res.end(JSON.stringify(merged));
|
|
288
|
+
return;
|
|
289
|
+
}
|
|
254
290
|
if (isTextResponse(response)) {
|
|
291
|
+
if (response.webSearches?.length) logger.warn("webSearches in fixture response are not supported for Bedrock API — ignoring");
|
|
292
|
+
const overrides = extractOverrides(response);
|
|
255
293
|
journal.add({
|
|
256
294
|
method: req.method ?? "POST",
|
|
257
295
|
path: urlPath,
|
|
@@ -262,12 +300,13 @@ async function handleBedrock(req, res, raw, modelId, fixtures, journal, defaults
|
|
|
262
300
|
fixture
|
|
263
301
|
}
|
|
264
302
|
});
|
|
265
|
-
const body = buildBedrockTextResponse(response.content, completionReq.model, response.reasoning);
|
|
303
|
+
const body = buildBedrockTextResponse(response.content, completionReq.model, response.reasoning, overrides);
|
|
266
304
|
res.writeHead(200, { "Content-Type": "application/json" });
|
|
267
305
|
res.end(JSON.stringify(body));
|
|
268
306
|
return;
|
|
269
307
|
}
|
|
270
308
|
if (isToolCallResponse(response)) {
|
|
309
|
+
const overrides = extractOverrides(response);
|
|
271
310
|
journal.add({
|
|
272
311
|
method: req.method ?? "POST",
|
|
273
312
|
path: urlPath,
|
|
@@ -278,7 +317,7 @@ async function handleBedrock(req, res, raw, modelId, fixtures, journal, defaults
|
|
|
278
317
|
fixture
|
|
279
318
|
}
|
|
280
319
|
});
|
|
281
|
-
const body = buildBedrockToolCallResponse(response.toolCalls, completionReq.model, logger);
|
|
320
|
+
const body = buildBedrockToolCallResponse(response.toolCalls, completionReq.model, logger, overrides);
|
|
282
321
|
res.writeHead(200, { "Content-Type": "application/json" });
|
|
283
322
|
res.end(JSON.stringify(body));
|
|
284
323
|
return;
|
|
@@ -298,11 +337,11 @@ async function handleBedrock(req, res, raw, modelId, fixtures, journal, defaults
|
|
|
298
337
|
type: "server_error"
|
|
299
338
|
} }));
|
|
300
339
|
}
|
|
301
|
-
function buildBedrockStreamTextEvents(content, chunkSize, reasoning) {
|
|
340
|
+
function buildBedrockStreamTextEvents(content, chunkSize, reasoning, overrides) {
|
|
302
341
|
const events = [];
|
|
303
342
|
events.push({
|
|
304
343
|
eventType: "messageStart",
|
|
305
|
-
payload: { role: "assistant" }
|
|
344
|
+
payload: { messageStart: { role: "assistant" } }
|
|
306
345
|
});
|
|
307
346
|
if (reasoning) {
|
|
308
347
|
const blockIndex = 0;
|
|
@@ -310,7 +349,10 @@ function buildBedrockStreamTextEvents(content, chunkSize, reasoning) {
|
|
|
310
349
|
eventType: "contentBlockStart",
|
|
311
350
|
payload: {
|
|
312
351
|
contentBlockIndex: blockIndex,
|
|
313
|
-
|
|
352
|
+
contentBlockStart: {
|
|
353
|
+
contentBlockIndex: blockIndex,
|
|
354
|
+
start: { type: "thinking" }
|
|
355
|
+
}
|
|
314
356
|
}
|
|
315
357
|
});
|
|
316
358
|
for (let i = 0; i < reasoning.length; i += chunkSize) {
|
|
@@ -319,9 +361,12 @@ function buildBedrockStreamTextEvents(content, chunkSize, reasoning) {
|
|
|
319
361
|
eventType: "contentBlockDelta",
|
|
320
362
|
payload: {
|
|
321
363
|
contentBlockIndex: blockIndex,
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
364
|
+
contentBlockDelta: {
|
|
365
|
+
contentBlockIndex: blockIndex,
|
|
366
|
+
delta: {
|
|
367
|
+
type: "thinking_delta",
|
|
368
|
+
thinking: slice
|
|
369
|
+
}
|
|
325
370
|
}
|
|
326
371
|
}
|
|
327
372
|
});
|
|
@@ -336,7 +381,10 @@ function buildBedrockStreamTextEvents(content, chunkSize, reasoning) {
|
|
|
336
381
|
eventType: "contentBlockStart",
|
|
337
382
|
payload: {
|
|
338
383
|
contentBlockIndex: textBlockIndex,
|
|
339
|
-
|
|
384
|
+
contentBlockStart: {
|
|
385
|
+
contentBlockIndex: textBlockIndex,
|
|
386
|
+
start: { type: "text" }
|
|
387
|
+
}
|
|
340
388
|
}
|
|
341
389
|
});
|
|
342
390
|
for (let i = 0; i < content.length; i += chunkSize) {
|
|
@@ -345,9 +393,12 @@ function buildBedrockStreamTextEvents(content, chunkSize, reasoning) {
|
|
|
345
393
|
eventType: "contentBlockDelta",
|
|
346
394
|
payload: {
|
|
347
395
|
contentBlockIndex: textBlockIndex,
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
396
|
+
contentBlockDelta: {
|
|
397
|
+
contentBlockIndex: textBlockIndex,
|
|
398
|
+
delta: {
|
|
399
|
+
type: "text_delta",
|
|
400
|
+
text: slice
|
|
401
|
+
}
|
|
351
402
|
}
|
|
352
403
|
}
|
|
353
404
|
});
|
|
@@ -358,15 +409,135 @@ function buildBedrockStreamTextEvents(content, chunkSize, reasoning) {
|
|
|
358
409
|
});
|
|
359
410
|
events.push({
|
|
360
411
|
eventType: "messageStop",
|
|
361
|
-
payload: { stopReason: "end_turn" }
|
|
412
|
+
payload: { stopReason: bedrockStopReason(overrides?.finishReason, "end_turn") }
|
|
362
413
|
});
|
|
363
414
|
return events;
|
|
364
415
|
}
|
|
365
|
-
function
|
|
416
|
+
function buildBedrockStreamContentWithToolCallsEvents(content, toolCalls, chunkSize, logger, reasoning, overrides) {
|
|
366
417
|
const events = [];
|
|
367
418
|
events.push({
|
|
368
419
|
eventType: "messageStart",
|
|
369
|
-
payload: { role: "assistant" }
|
|
420
|
+
payload: { messageStart: { role: "assistant" } }
|
|
421
|
+
});
|
|
422
|
+
let blockIndex = 0;
|
|
423
|
+
if (reasoning) {
|
|
424
|
+
events.push({
|
|
425
|
+
eventType: "contentBlockStart",
|
|
426
|
+
payload: {
|
|
427
|
+
contentBlockIndex: blockIndex,
|
|
428
|
+
contentBlockStart: {
|
|
429
|
+
contentBlockIndex: blockIndex,
|
|
430
|
+
start: { type: "thinking" }
|
|
431
|
+
}
|
|
432
|
+
}
|
|
433
|
+
});
|
|
434
|
+
for (let i = 0; i < reasoning.length; i += chunkSize) {
|
|
435
|
+
const slice = reasoning.slice(i, i + chunkSize);
|
|
436
|
+
events.push({
|
|
437
|
+
eventType: "contentBlockDelta",
|
|
438
|
+
payload: {
|
|
439
|
+
contentBlockIndex: blockIndex,
|
|
440
|
+
contentBlockDelta: {
|
|
441
|
+
contentBlockIndex: blockIndex,
|
|
442
|
+
delta: {
|
|
443
|
+
type: "thinking_delta",
|
|
444
|
+
thinking: slice
|
|
445
|
+
}
|
|
446
|
+
}
|
|
447
|
+
}
|
|
448
|
+
});
|
|
449
|
+
}
|
|
450
|
+
events.push({
|
|
451
|
+
eventType: "contentBlockStop",
|
|
452
|
+
payload: { contentBlockIndex: blockIndex }
|
|
453
|
+
});
|
|
454
|
+
blockIndex++;
|
|
455
|
+
}
|
|
456
|
+
events.push({
|
|
457
|
+
eventType: "contentBlockStart",
|
|
458
|
+
payload: {
|
|
459
|
+
contentBlockIndex: blockIndex,
|
|
460
|
+
contentBlockStart: {
|
|
461
|
+
contentBlockIndex: blockIndex,
|
|
462
|
+
start: { type: "text" }
|
|
463
|
+
}
|
|
464
|
+
}
|
|
465
|
+
});
|
|
466
|
+
for (let i = 0; i < content.length; i += chunkSize) {
|
|
467
|
+
const slice = content.slice(i, i + chunkSize);
|
|
468
|
+
events.push({
|
|
469
|
+
eventType: "contentBlockDelta",
|
|
470
|
+
payload: {
|
|
471
|
+
contentBlockIndex: blockIndex,
|
|
472
|
+
contentBlockDelta: {
|
|
473
|
+
contentBlockIndex: blockIndex,
|
|
474
|
+
delta: {
|
|
475
|
+
type: "text_delta",
|
|
476
|
+
text: slice
|
|
477
|
+
}
|
|
478
|
+
}
|
|
479
|
+
}
|
|
480
|
+
});
|
|
481
|
+
}
|
|
482
|
+
events.push({
|
|
483
|
+
eventType: "contentBlockStop",
|
|
484
|
+
payload: { contentBlockIndex: blockIndex }
|
|
485
|
+
});
|
|
486
|
+
blockIndex++;
|
|
487
|
+
for (let tcIdx = 0; tcIdx < toolCalls.length; tcIdx++) {
|
|
488
|
+
const tc = toolCalls[tcIdx];
|
|
489
|
+
const toolUseId = tc.id || generateToolUseId();
|
|
490
|
+
const currentBlock = blockIndex + tcIdx;
|
|
491
|
+
events.push({
|
|
492
|
+
eventType: "contentBlockStart",
|
|
493
|
+
payload: {
|
|
494
|
+
contentBlockIndex: currentBlock,
|
|
495
|
+
contentBlockStart: {
|
|
496
|
+
contentBlockIndex: currentBlock,
|
|
497
|
+
start: { toolUse: {
|
|
498
|
+
toolUseId,
|
|
499
|
+
name: tc.name
|
|
500
|
+
} }
|
|
501
|
+
}
|
|
502
|
+
}
|
|
503
|
+
});
|
|
504
|
+
let argsStr;
|
|
505
|
+
try {
|
|
506
|
+
const parsed = JSON.parse(tc.arguments || "{}");
|
|
507
|
+
argsStr = JSON.stringify(parsed);
|
|
508
|
+
} catch {
|
|
509
|
+
logger.warn(`Malformed JSON in fixture tool call arguments for "${tc.name}": ${tc.arguments}`);
|
|
510
|
+
argsStr = "{}";
|
|
511
|
+
}
|
|
512
|
+
for (let i = 0; i < argsStr.length; i += chunkSize) {
|
|
513
|
+
const slice = argsStr.slice(i, i + chunkSize);
|
|
514
|
+
events.push({
|
|
515
|
+
eventType: "contentBlockDelta",
|
|
516
|
+
payload: {
|
|
517
|
+
contentBlockIndex: currentBlock,
|
|
518
|
+
contentBlockDelta: {
|
|
519
|
+
contentBlockIndex: currentBlock,
|
|
520
|
+
delta: { toolUse: { input: slice } }
|
|
521
|
+
}
|
|
522
|
+
}
|
|
523
|
+
});
|
|
524
|
+
}
|
|
525
|
+
events.push({
|
|
526
|
+
eventType: "contentBlockStop",
|
|
527
|
+
payload: { contentBlockIndex: currentBlock }
|
|
528
|
+
});
|
|
529
|
+
}
|
|
530
|
+
events.push({
|
|
531
|
+
eventType: "messageStop",
|
|
532
|
+
payload: { stopReason: bedrockStopReason(overrides?.finishReason, "tool_use") }
|
|
533
|
+
});
|
|
534
|
+
return events;
|
|
535
|
+
}
|
|
536
|
+
function buildBedrockStreamToolCallEvents(toolCalls, chunkSize, logger, overrides) {
|
|
537
|
+
const events = [];
|
|
538
|
+
events.push({
|
|
539
|
+
eventType: "messageStart",
|
|
540
|
+
payload: { messageStart: { role: "assistant" } }
|
|
370
541
|
});
|
|
371
542
|
for (let tcIdx = 0; tcIdx < toolCalls.length; tcIdx++) {
|
|
372
543
|
const tc = toolCalls[tcIdx];
|
|
@@ -375,10 +546,13 @@ function buildBedrockStreamToolCallEvents(toolCalls, chunkSize, logger) {
|
|
|
375
546
|
eventType: "contentBlockStart",
|
|
376
547
|
payload: {
|
|
377
548
|
contentBlockIndex: tcIdx,
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
|
|
549
|
+
contentBlockStart: {
|
|
550
|
+
contentBlockIndex: tcIdx,
|
|
551
|
+
start: { toolUse: {
|
|
552
|
+
toolUseId,
|
|
553
|
+
name: tc.name
|
|
554
|
+
} }
|
|
555
|
+
}
|
|
382
556
|
}
|
|
383
557
|
});
|
|
384
558
|
let argsStr;
|
|
@@ -395,9 +569,9 @@ function buildBedrockStreamToolCallEvents(toolCalls, chunkSize, logger) {
|
|
|
395
569
|
eventType: "contentBlockDelta",
|
|
396
570
|
payload: {
|
|
397
571
|
contentBlockIndex: tcIdx,
|
|
398
|
-
|
|
399
|
-
|
|
400
|
-
|
|
572
|
+
contentBlockDelta: {
|
|
573
|
+
contentBlockIndex: tcIdx,
|
|
574
|
+
delta: { toolUse: { input: slice } }
|
|
401
575
|
}
|
|
402
576
|
}
|
|
403
577
|
});
|
|
@@ -409,7 +583,7 @@ function buildBedrockStreamToolCallEvents(toolCalls, chunkSize, logger) {
|
|
|
409
583
|
}
|
|
410
584
|
events.push({
|
|
411
585
|
eventType: "messageStop",
|
|
412
|
-
payload: { stopReason: "tool_use" }
|
|
586
|
+
payload: { stopReason: bedrockStopReason(overrides?.finishReason, "tool_use") }
|
|
413
587
|
});
|
|
414
588
|
return events;
|
|
415
589
|
}
|
|
@@ -475,7 +649,8 @@ async function handleBedrockStream(req, res, raw, modelId, fixtures, journal, de
|
|
|
475
649
|
body: completionReq,
|
|
476
650
|
response: {
|
|
477
651
|
status: res.statusCode ?? 200,
|
|
478
|
-
fixture: null
|
|
652
|
+
fixture: null,
|
|
653
|
+
source: "proxy"
|
|
479
654
|
}
|
|
480
655
|
});
|
|
481
656
|
return;
|
|
@@ -515,10 +690,47 @@ async function handleBedrockStream(req, res, raw, modelId, fixtures, journal, de
|
|
|
515
690
|
fixture
|
|
516
691
|
}
|
|
517
692
|
});
|
|
518
|
-
|
|
693
|
+
const anthropicError = {
|
|
694
|
+
type: "error",
|
|
695
|
+
error: {
|
|
696
|
+
type: response.error.type ?? "api_error",
|
|
697
|
+
message: response.error.message
|
|
698
|
+
}
|
|
699
|
+
};
|
|
700
|
+
writeErrorResponse(res, status, JSON.stringify(anthropicError));
|
|
701
|
+
return;
|
|
702
|
+
}
|
|
703
|
+
if (isContentWithToolCallsResponse(response)) {
|
|
704
|
+
if (response.webSearches?.length) logger.warn("webSearches in fixture response are not supported for Bedrock API — ignoring");
|
|
705
|
+
const overrides = extractOverrides(response);
|
|
706
|
+
const journalEntry = journal.add({
|
|
707
|
+
method: req.method ?? "POST",
|
|
708
|
+
path: urlPath,
|
|
709
|
+
headers: flattenHeaders(req.headers),
|
|
710
|
+
body: completionReq,
|
|
711
|
+
response: {
|
|
712
|
+
status: 200,
|
|
713
|
+
fixture
|
|
714
|
+
}
|
|
715
|
+
});
|
|
716
|
+
const events = buildBedrockStreamContentWithToolCallsEvents(response.content, response.toolCalls, chunkSize, logger, response.reasoning, overrides);
|
|
717
|
+
const interruption = createInterruptionSignal(fixture);
|
|
718
|
+
if (!await writeEventStream(res, events, {
|
|
719
|
+
latency,
|
|
720
|
+
streamingProfile: fixture.streamingProfile,
|
|
721
|
+
signal: interruption?.signal,
|
|
722
|
+
onChunkSent: interruption?.tick
|
|
723
|
+
})) {
|
|
724
|
+
if (!res.writableEnded) res.destroy();
|
|
725
|
+
journalEntry.response.interrupted = true;
|
|
726
|
+
journalEntry.response.interruptReason = interruption?.reason();
|
|
727
|
+
}
|
|
728
|
+
interruption?.cleanup();
|
|
519
729
|
return;
|
|
520
730
|
}
|
|
521
731
|
if (isTextResponse(response)) {
|
|
732
|
+
if (response.webSearches?.length) logger.warn("webSearches in fixture response are not supported for Bedrock API — ignoring");
|
|
733
|
+
const overrides = extractOverrides(response);
|
|
522
734
|
const journalEntry = journal.add({
|
|
523
735
|
method: req.method ?? "POST",
|
|
524
736
|
path: urlPath,
|
|
@@ -529,7 +741,7 @@ async function handleBedrockStream(req, res, raw, modelId, fixtures, journal, de
|
|
|
529
741
|
fixture
|
|
530
742
|
}
|
|
531
743
|
});
|
|
532
|
-
const events = buildBedrockStreamTextEvents(response.content, chunkSize, response.reasoning);
|
|
744
|
+
const events = buildBedrockStreamTextEvents(response.content, chunkSize, response.reasoning, overrides);
|
|
533
745
|
const interruption = createInterruptionSignal(fixture);
|
|
534
746
|
if (!await writeEventStream(res, events, {
|
|
535
747
|
latency,
|
|
@@ -545,6 +757,7 @@ async function handleBedrockStream(req, res, raw, modelId, fixtures, journal, de
|
|
|
545
757
|
return;
|
|
546
758
|
}
|
|
547
759
|
if (isToolCallResponse(response)) {
|
|
760
|
+
const overrides = extractOverrides(response);
|
|
548
761
|
const journalEntry = journal.add({
|
|
549
762
|
method: req.method ?? "POST",
|
|
550
763
|
path: urlPath,
|
|
@@ -555,7 +768,7 @@ async function handleBedrockStream(req, res, raw, modelId, fixtures, journal, de
|
|
|
555
768
|
fixture
|
|
556
769
|
}
|
|
557
770
|
});
|
|
558
|
-
const events = buildBedrockStreamToolCallEvents(response.toolCalls, chunkSize, logger);
|
|
771
|
+
const events = buildBedrockStreamToolCallEvents(response.toolCalls, chunkSize, logger, overrides);
|
|
559
772
|
const interruption = createInterruptionSignal(fixture);
|
|
560
773
|
if (!await writeEventStream(res, events, {
|
|
561
774
|
latency,
|
|
@@ -587,5 +800,5 @@ async function handleBedrockStream(req, res, raw, modelId, fixtures, journal, de
|
|
|
587
800
|
}
|
|
588
801
|
|
|
589
802
|
//#endregion
|
|
590
|
-
export { bedrockToCompletionRequest, buildBedrockStreamTextEvents, buildBedrockStreamToolCallEvents, handleBedrock, handleBedrockStream };
|
|
803
|
+
export { bedrockToCompletionRequest, buildBedrockStreamContentWithToolCallsEvents, buildBedrockStreamTextEvents, buildBedrockStreamToolCallEvents, handleBedrock, handleBedrockStream };
|
|
591
804
|
//# sourceMappingURL=bedrock.js.map
|