@copilotkit/aimock 1.15.0 → 1.16.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 (148) hide show
  1. package/.claude-plugin/plugin.json +1 -1
  2. package/CHANGELOG.md +33 -15
  3. package/README.md +1 -1
  4. package/dist/bedrock-converse.cjs +133 -25
  5. package/dist/bedrock-converse.cjs.map +1 -1
  6. package/dist/bedrock-converse.d.cts.map +1 -1
  7. package/dist/bedrock-converse.d.ts.map +1 -1
  8. package/dist/bedrock-converse.js +135 -27
  9. package/dist/bedrock-converse.js.map +1 -1
  10. package/dist/bedrock.cjs +262 -48
  11. package/dist/bedrock.cjs.map +1 -1
  12. package/dist/bedrock.d.cts.map +1 -1
  13. package/dist/bedrock.d.ts.map +1 -1
  14. package/dist/bedrock.js +263 -50
  15. package/dist/bedrock.js.map +1 -1
  16. package/dist/chaos.cjs +9 -35
  17. package/dist/chaos.cjs.map +1 -1
  18. package/dist/chaos.d.cts +2 -17
  19. package/dist/chaos.d.cts.map +1 -1
  20. package/dist/chaos.d.ts +2 -17
  21. package/dist/chaos.d.ts.map +1 -1
  22. package/dist/chaos.js +10 -35
  23. package/dist/chaos.js.map +1 -1
  24. package/dist/cohere.cjs +289 -33
  25. package/dist/cohere.cjs.map +1 -1
  26. package/dist/cohere.d.cts +9 -0
  27. package/dist/cohere.d.cts.map +1 -1
  28. package/dist/cohere.d.ts +9 -0
  29. package/dist/cohere.d.ts.map +1 -1
  30. package/dist/cohere.js +290 -34
  31. package/dist/cohere.js.map +1 -1
  32. package/dist/config-loader.d.cts.map +1 -1
  33. package/dist/embeddings.cjs +22 -4
  34. package/dist/embeddings.cjs.map +1 -1
  35. package/dist/embeddings.d.cts +2 -2
  36. package/dist/embeddings.d.cts.map +1 -1
  37. package/dist/embeddings.d.ts +2 -2
  38. package/dist/embeddings.d.ts.map +1 -1
  39. package/dist/embeddings.js +22 -4
  40. package/dist/embeddings.js.map +1 -1
  41. package/dist/fixture-loader.cjs +19 -4
  42. package/dist/fixture-loader.cjs.map +1 -1
  43. package/dist/fixture-loader.d.cts.map +1 -1
  44. package/dist/fixture-loader.d.ts.map +1 -1
  45. package/dist/fixture-loader.js +19 -4
  46. package/dist/fixture-loader.js.map +1 -1
  47. package/dist/gemini.cjs +48 -45
  48. package/dist/gemini.cjs.map +1 -1
  49. package/dist/gemini.d.cts.map +1 -1
  50. package/dist/gemini.d.ts.map +1 -1
  51. package/dist/gemini.js +48 -45
  52. package/dist/gemini.js.map +1 -1
  53. package/dist/helpers.cjs +9 -0
  54. package/dist/helpers.cjs.map +1 -1
  55. package/dist/helpers.d.cts.map +1 -1
  56. package/dist/helpers.d.ts.map +1 -1
  57. package/dist/helpers.js +9 -0
  58. package/dist/helpers.js.map +1 -1
  59. package/dist/images.cjs +21 -3
  60. package/dist/images.cjs.map +1 -1
  61. package/dist/images.js +21 -3
  62. package/dist/images.js.map +1 -1
  63. package/dist/index.cjs +2 -0
  64. package/dist/index.d.cts +2 -2
  65. package/dist/index.d.ts +2 -2
  66. package/dist/index.js +3 -3
  67. package/dist/jest.cjs +10 -3
  68. package/dist/jest.cjs.map +1 -1
  69. package/dist/jest.js +10 -3
  70. package/dist/jest.js.map +1 -1
  71. package/dist/journal.cjs +1 -1
  72. package/dist/journal.cjs.map +1 -1
  73. package/dist/journal.d.cts.map +1 -1
  74. package/dist/journal.d.ts.map +1 -1
  75. package/dist/journal.js +1 -1
  76. package/dist/journal.js.map +1 -1
  77. package/dist/llmock.cjs +6 -0
  78. package/dist/llmock.cjs.map +1 -1
  79. package/dist/llmock.d.cts +1 -0
  80. package/dist/llmock.d.cts.map +1 -1
  81. package/dist/llmock.d.ts +1 -0
  82. package/dist/llmock.d.ts.map +1 -1
  83. package/dist/llmock.js +6 -0
  84. package/dist/llmock.js.map +1 -1
  85. package/dist/messages.cjs +5 -4
  86. package/dist/messages.cjs.map +1 -1
  87. package/dist/messages.js +5 -4
  88. package/dist/messages.js.map +1 -1
  89. package/dist/ollama.cjs +129 -8
  90. package/dist/ollama.cjs.map +1 -1
  91. package/dist/ollama.d.cts.map +1 -1
  92. package/dist/ollama.d.ts.map +1 -1
  93. package/dist/ollama.js +130 -9
  94. package/dist/ollama.js.map +1 -1
  95. package/dist/recorder.cjs +234 -69
  96. package/dist/recorder.cjs.map +1 -1
  97. package/dist/recorder.d.cts +5 -50
  98. package/dist/recorder.d.cts.map +1 -1
  99. package/dist/recorder.d.ts +5 -50
  100. package/dist/recorder.d.ts.map +1 -1
  101. package/dist/recorder.js +234 -69
  102. package/dist/recorder.js.map +1 -1
  103. package/dist/responses.cjs +12 -3
  104. package/dist/responses.cjs.map +1 -1
  105. package/dist/responses.d.cts +2 -1
  106. package/dist/responses.d.cts.map +1 -1
  107. package/dist/responses.d.ts +2 -1
  108. package/dist/responses.d.ts.map +1 -1
  109. package/dist/responses.js +12 -4
  110. package/dist/responses.js.map +1 -1
  111. package/dist/router.cjs +19 -6
  112. package/dist/router.cjs.map +1 -1
  113. package/dist/router.js +19 -6
  114. package/dist/router.js.map +1 -1
  115. package/dist/server.cjs +150 -94
  116. package/dist/server.cjs.map +1 -1
  117. package/dist/server.d.cts.map +1 -1
  118. package/dist/server.d.ts.map +1 -1
  119. package/dist/server.js +152 -96
  120. package/dist/server.js.map +1 -1
  121. package/dist/speech.cjs +21 -3
  122. package/dist/speech.cjs.map +1 -1
  123. package/dist/speech.js +21 -3
  124. package/dist/speech.js.map +1 -1
  125. package/dist/transcription.cjs +10 -6
  126. package/dist/transcription.cjs.map +1 -1
  127. package/dist/transcription.d.cts.map +1 -1
  128. package/dist/transcription.d.ts.map +1 -1
  129. package/dist/transcription.js +10 -6
  130. package/dist/transcription.js.map +1 -1
  131. package/dist/types.d.cts +5 -16
  132. package/dist/types.d.cts.map +1 -1
  133. package/dist/types.d.ts +5 -16
  134. package/dist/types.d.ts.map +1 -1
  135. package/dist/video.cjs +66 -10
  136. package/dist/video.cjs.map +1 -1
  137. package/dist/video.d.cts +16 -3
  138. package/dist/video.d.cts.map +1 -1
  139. package/dist/video.d.ts +16 -3
  140. package/dist/video.d.ts.map +1 -1
  141. package/dist/video.js +66 -11
  142. package/dist/video.js.map +1 -1
  143. package/dist/vitest.cjs +10 -3
  144. package/dist/vitest.cjs.map +1 -1
  145. package/dist/vitest.js +10 -3
  146. package/dist/vitest.js.map +1 -1
  147. package/package.json +1 -1
  148. package/skills/write-fixtures/SKILL.md +75 -49
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) {
@@ -192,10 +203,10 @@ async function handleBedrock(req, res, raw, modelId, fixtures, journal, defaults
192
203
  path: urlPath,
193
204
  headers: flattenHeaders(req.headers),
194
205
  body: completionReq
195
- }, fixture ? "fixture" : "proxy", defaults.registry, defaults.logger)) return;
206
+ }, defaults.registry, defaults.logger)) return;
196
207
  if (!fixture) {
197
208
  if (defaults.record) {
198
- if (await proxyAndRecord(req, res, completionReq, "bedrock", urlPath, fixtures, defaults, raw) !== "not_configured") {
209
+ if (await proxyAndRecord(req, res, completionReq, "bedrock", urlPath, fixtures, defaults, raw)) {
199
210
  journal.add({
200
211
  method: req.method ?? "POST",
201
212
  path: urlPath,
@@ -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
- start: { type: "thinking" }
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
- delta: {
323
- type: "thinking_delta",
324
- thinking: slice
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
- start: {}
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
- delta: {
349
- type: "text_delta",
350
- text: slice
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 buildBedrockStreamToolCallEvents(toolCalls, chunkSize, logger) {
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
- start: { toolUse: {
379
- toolUseId,
380
- name: tc.name
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
- delta: {
399
- type: "input_json_delta",
400
- inputJSON: slice
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
  }
@@ -464,10 +638,10 @@ async function handleBedrockStream(req, res, raw, modelId, fixtures, journal, de
464
638
  path: urlPath,
465
639
  headers: flattenHeaders(req.headers),
466
640
  body: completionReq
467
- }, fixture ? "fixture" : "proxy", defaults.registry, defaults.logger)) return;
641
+ }, defaults.registry, defaults.logger)) return;
468
642
  if (!fixture) {
469
643
  if (defaults.record) {
470
- if (await proxyAndRecord(req, res, completionReq, "bedrock", urlPath, fixtures, defaults, raw) !== "not_configured") {
644
+ if (await proxyAndRecord(req, res, completionReq, "bedrock", urlPath, fixtures, defaults, raw)) {
471
645
  journal.add({
472
646
  method: req.method ?? "POST",
473
647
  path: urlPath,
@@ -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
- writeErrorResponse(res, status, JSON.stringify(response));
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