@copilotkit/aimock 1.46.0 → 1.47.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 (183) hide show
  1. package/.claude-plugin/marketplace.json +1 -1
  2. package/.claude-plugin/plugin.json +1 -1
  3. package/CHANGELOG.md +12 -1
  4. package/README.md +4 -1
  5. package/dist/aws-event-stream.cjs +20 -23
  6. package/dist/aws-event-stream.cjs.map +1 -1
  7. package/dist/aws-event-stream.d.cts +0 -1
  8. package/dist/aws-event-stream.d.ts +0 -1
  9. package/dist/aws-event-stream.js +20 -24
  10. package/dist/aws-event-stream.js.map +1 -1
  11. package/dist/bedrock-converse.cjs +79 -82
  12. package/dist/bedrock-converse.cjs.map +1 -1
  13. package/dist/bedrock-converse.d.cts.map +1 -1
  14. package/dist/bedrock-converse.d.ts.map +1 -1
  15. package/dist/bedrock-converse.js +80 -83
  16. package/dist/bedrock-converse.js.map +1 -1
  17. package/dist/bedrock.cjs +112 -121
  18. package/dist/bedrock.cjs.map +1 -1
  19. package/dist/bedrock.d.cts.map +1 -1
  20. package/dist/bedrock.d.ts.map +1 -1
  21. package/dist/bedrock.js +113 -122
  22. package/dist/bedrock.js.map +1 -1
  23. package/dist/cohere.cjs +58 -106
  24. package/dist/cohere.cjs.map +1 -1
  25. package/dist/cohere.d.cts.map +1 -1
  26. package/dist/cohere.d.ts.map +1 -1
  27. package/dist/cohere.js +60 -108
  28. package/dist/cohere.js.map +1 -1
  29. package/dist/config-loader.d.cts.map +1 -1
  30. package/dist/config-loader.d.ts.map +1 -1
  31. package/dist/fixture-loader.cjs +103 -2
  32. package/dist/fixture-loader.cjs.map +1 -1
  33. package/dist/fixture-loader.d.cts.map +1 -1
  34. package/dist/fixture-loader.d.ts.map +1 -1
  35. package/dist/fixture-loader.js +104 -4
  36. package/dist/fixture-loader.js.map +1 -1
  37. package/dist/gemini-interactions.cjs +63 -121
  38. package/dist/gemini-interactions.cjs.map +1 -1
  39. package/dist/gemini-interactions.d.cts.map +1 -1
  40. package/dist/gemini-interactions.d.ts.map +1 -1
  41. package/dist/gemini-interactions.js +65 -123
  42. package/dist/gemini-interactions.js.map +1 -1
  43. package/dist/gemini.cjs +242 -155
  44. package/dist/gemini.cjs.map +1 -1
  45. package/dist/gemini.d.cts.map +1 -1
  46. package/dist/gemini.d.ts.map +1 -1
  47. package/dist/gemini.js +244 -157
  48. package/dist/gemini.js.map +1 -1
  49. package/dist/helpers.cjs +400 -7
  50. package/dist/helpers.cjs.map +1 -1
  51. package/dist/helpers.d.cts +51 -1
  52. package/dist/helpers.d.cts.map +1 -1
  53. package/dist/helpers.d.ts +51 -1
  54. package/dist/helpers.d.ts.map +1 -1
  55. package/dist/helpers.js +391 -8
  56. package/dist/helpers.js.map +1 -1
  57. package/dist/index.cjs +4 -2
  58. package/dist/index.d.cts +4 -4
  59. package/dist/index.d.ts +4 -4
  60. package/dist/index.js +4 -4
  61. package/dist/mcp-fakes.d.cts.map +1 -1
  62. package/dist/messages.cjs +159 -141
  63. package/dist/messages.cjs.map +1 -1
  64. package/dist/messages.d.cts.map +1 -1
  65. package/dist/messages.d.ts.map +1 -1
  66. package/dist/messages.js +161 -143
  67. package/dist/messages.js.map +1 -1
  68. package/dist/misbehavior.cjs +62 -3
  69. package/dist/misbehavior.cjs.map +1 -1
  70. package/dist/misbehavior.d.cts.map +1 -1
  71. package/dist/misbehavior.d.ts.map +1 -1
  72. package/dist/misbehavior.js +63 -4
  73. package/dist/misbehavior.js.map +1 -1
  74. package/dist/ndjson-writer.cjs +21 -23
  75. package/dist/ndjson-writer.cjs.map +1 -1
  76. package/dist/ndjson-writer.d.cts +0 -1
  77. package/dist/ndjson-writer.d.cts.map +1 -1
  78. package/dist/ndjson-writer.d.ts +0 -1
  79. package/dist/ndjson-writer.d.ts.map +1 -1
  80. package/dist/ndjson-writer.js +21 -24
  81. package/dist/ndjson-writer.js.map +1 -1
  82. package/dist/ollama.cjs +153 -147
  83. package/dist/ollama.cjs.map +1 -1
  84. package/dist/ollama.d.cts.map +1 -1
  85. package/dist/ollama.d.ts.map +1 -1
  86. package/dist/ollama.js +155 -149
  87. package/dist/ollama.js.map +1 -1
  88. package/dist/openrouter-chat.cjs +1 -1
  89. package/dist/openrouter-chat.js +1 -1
  90. package/dist/raw-validation.cjs +177 -0
  91. package/dist/raw-validation.cjs.map +1 -0
  92. package/dist/raw-validation.js +176 -0
  93. package/dist/raw-validation.js.map +1 -0
  94. package/dist/response/deliver.cjs +144 -0
  95. package/dist/response/deliver.cjs.map +1 -0
  96. package/dist/response/deliver.js +143 -0
  97. package/dist/response/deliver.js.map +1 -0
  98. package/dist/response/frame-loop.cjs +102 -0
  99. package/dist/response/frame-loop.cjs.map +1 -0
  100. package/dist/response/frame-loop.js +100 -0
  101. package/dist/response/frame-loop.js.map +1 -0
  102. package/dist/response/lifecycle.cjs +223 -0
  103. package/dist/response/lifecycle.cjs.map +1 -0
  104. package/dist/response/lifecycle.js +211 -0
  105. package/dist/response/lifecycle.js.map +1 -0
  106. package/dist/response/proxy.cjs +71 -0
  107. package/dist/response/proxy.cjs.map +1 -0
  108. package/dist/response/proxy.js +70 -0
  109. package/dist/response/proxy.js.map +1 -0
  110. package/dist/response/raw.cjs +228 -0
  111. package/dist/response/raw.cjs.map +1 -0
  112. package/dist/response/raw.js +227 -0
  113. package/dist/response/raw.js.map +1 -0
  114. package/dist/response/timing.cjs +157 -0
  115. package/dist/response/timing.cjs.map +1 -0
  116. package/dist/response/timing.js +150 -0
  117. package/dist/response/timing.js.map +1 -0
  118. package/dist/responses.cjs +269 -148
  119. package/dist/responses.cjs.map +1 -1
  120. package/dist/responses.d.cts.map +1 -1
  121. package/dist/responses.d.ts.map +1 -1
  122. package/dist/responses.js +270 -149
  123. package/dist/responses.js.map +1 -1
  124. package/dist/router.cjs +20 -4
  125. package/dist/router.cjs.map +1 -1
  126. package/dist/router.d.cts +7 -1
  127. package/dist/router.d.cts.map +1 -1
  128. package/dist/router.d.ts +7 -1
  129. package/dist/router.d.ts.map +1 -1
  130. package/dist/router.js +21 -5
  131. package/dist/router.js.map +1 -1
  132. package/dist/server.cjs +89 -120
  133. package/dist/server.cjs.map +1 -1
  134. package/dist/server.d.cts.map +1 -1
  135. package/dist/server.d.ts.map +1 -1
  136. package/dist/server.js +91 -122
  137. package/dist/server.js.map +1 -1
  138. package/dist/sse-writer.cjs +49 -30
  139. package/dist/sse-writer.cjs.map +1 -1
  140. package/dist/sse-writer.d.cts +0 -1
  141. package/dist/sse-writer.d.cts.map +1 -1
  142. package/dist/sse-writer.d.ts +0 -1
  143. package/dist/sse-writer.d.ts.map +1 -1
  144. package/dist/sse-writer.js +49 -31
  145. package/dist/sse-writer.js.map +1 -1
  146. package/dist/transcription.cjs +19 -33
  147. package/dist/transcription.cjs.map +1 -1
  148. package/dist/transcription.d.cts.map +1 -1
  149. package/dist/transcription.d.ts.map +1 -1
  150. package/dist/transcription.js +20 -34
  151. package/dist/transcription.js.map +1 -1
  152. package/dist/types.cjs.map +1 -1
  153. package/dist/types.d.cts +173 -10
  154. package/dist/types.d.cts.map +1 -1
  155. package/dist/types.d.ts +173 -10
  156. package/dist/types.d.ts.map +1 -1
  157. package/dist/types.js.map +1 -1
  158. package/dist/ws-framing.cjs +12 -6
  159. package/dist/ws-framing.cjs.map +1 -1
  160. package/dist/ws-framing.d.cts +2 -0
  161. package/dist/ws-framing.d.cts.map +1 -1
  162. package/dist/ws-framing.d.ts +2 -0
  163. package/dist/ws-framing.d.ts.map +1 -1
  164. package/dist/ws-framing.js +12 -6
  165. package/dist/ws-framing.js.map +1 -1
  166. package/dist/ws-gemini-live.cjs +120 -93
  167. package/dist/ws-gemini-live.cjs.map +1 -1
  168. package/dist/ws-gemini-live.js +120 -93
  169. package/dist/ws-gemini-live.js.map +1 -1
  170. package/dist/ws-realtime.cjs +80 -70
  171. package/dist/ws-realtime.cjs.map +1 -1
  172. package/dist/ws-realtime.d.cts.map +1 -1
  173. package/dist/ws-realtime.d.ts.map +1 -1
  174. package/dist/ws-realtime.js +80 -70
  175. package/dist/ws-realtime.js.map +1 -1
  176. package/dist/ws-responses.cjs +72 -53
  177. package/dist/ws-responses.cjs.map +1 -1
  178. package/dist/ws-responses.d.cts.map +1 -1
  179. package/dist/ws-responses.d.ts.map +1 -1
  180. package/dist/ws-responses.js +73 -54
  181. package/dist/ws-responses.js.map +1 -1
  182. package/package.json +1 -1
  183. package/skills/write-fixtures/SKILL.md +34 -2
@@ -1 +1 @@
1
- {"version":3,"file":"bedrock.js","names":["renderAnthropicUsage","resolveAnthropicUsage"],"sources":["../src/bedrock.ts"],"sourcesContent":["/**\n * AWS Bedrock Claude endpoint support — invoke and invoke-with-response-stream.\n *\n * Handles four Bedrock endpoint families (split across two modules):\n *\n * This file (bedrock.ts):\n * - POST /model/{modelId}/invoke — non-streaming invoke\n * - POST /model/{modelId}/invoke-with-response-stream — binary EventStream streaming\n *\n * bedrock-converse.ts:\n * - POST /model/{modelId}/converse — Converse API (non-streaming)\n * - POST /model/{modelId}/converse-stream — Converse API (EventStream streaming)\n *\n * Translates incoming Bedrock Claude format into the ChatCompletionRequest\n * format used by the fixture router, and converts fixture responses back into\n * the appropriate Bedrock response format (JSON for invoke, AWS Event Stream\n * binary encoding for streaming).\n */\n\nimport type * as http from \"node:http\";\nimport { renderError } from \"./response/errors.js\";\nimport { resolveRequestDecisions, strictOverrideField } from \"./response/policy.js\";\nimport type {\n ChatCompletionRequest,\n ChatMessage,\n Fixture,\n FixtureBlock,\n HandlerDefaults,\n ResponseOverrides,\n ToolCall,\n ToolDefinition,\n} from \"./types.js\";\nimport {\n requireEmittedFunctionToolCalls,\n generateMessageId,\n generateToolUseId,\n extractOverrides,\n isTextResponse,\n isToolCallResponse,\n isCombinedFixtureResponse,\n isErrorResponse,\n flattenHeaders,\n isJsonObject,\n getContext,\n getTestId,\n resolveResponse,\n resolveFixtureBlockOutcome,\n resolveReasoningForModel,\n strictNoMatchMessage,\n strictNoMatchLogLine,\n validateChatMessages,\n validateToolsField,\n servedToolArgs,\n} from \"./helpers.js\";\nimport { matchFixtureDiagnostic, recordMatchOptions } from \"./router.js\";\nimport { writeErrorResponse } from \"./sse-writer.js\";\nimport { writeEventStream } from \"./aws-event-stream.js\";\nimport { createInterruptionSignal } from \"./interruption.js\";\nimport type { Journal } from \"./journal.js\";\nimport type { Logger } from \"./logger.js\";\nimport { applyChaosAsync } from \"./chaos.js\";\nimport { planMisbehavior, recordMisbehaviorOutcome } from \"./misbehavior.js\";\nimport { prepareClaudeMisbehavior } from \"./messages.js\";\nimport { proxyAndRecord } from \"./recorder.js\";\nimport { mapAnthropicFinish } from \"./response/finish.js\";\nimport {\n resolve as resolveAnthropicUsage,\n render as renderAnthropicUsage,\n} from \"./response/usage/codecs/anthropic.js\";\n\n// ─── Bedrock Claude request types ────────────────────────────────────────────\n\ninterface BedrockContentBlock {\n type: \"text\" | \"tool_use\" | \"tool_result\" | \"image\" | \"document\";\n text?: string;\n id?: string;\n name?: string;\n input?: unknown;\n tool_use_id?: string;\n content?: string | BedrockContentBlock[];\n is_error?: boolean;\n}\n\ninterface BedrockMessage {\n role: \"user\" | \"assistant\";\n content: string | BedrockContentBlock[];\n}\n\ninterface BedrockToolDef {\n name: string;\n description?: string;\n input_schema?: object;\n}\n\ninterface BedrockRequest {\n anthropic_version?: string;\n messages: BedrockMessage[];\n system?: string | BedrockContentBlock[];\n tools?: BedrockToolDef[];\n tool_choice?: unknown;\n max_tokens: number;\n temperature?: number;\n [key: string]: unknown;\n}\n\n// ─── Bedrock stop_reason mapping ───────────────────────────────────────────\n\nfunction bedrockStopReason(\n overrideFinishReason: string | undefined,\n defaultReason: string,\n): string {\n if (!overrideFinishReason) return defaultReason;\n return mapAnthropicFinish(overrideFinishReason);\n}\n\n// ─── Input conversion: Bedrock → ChatCompletionRequest ──────────────────────\n\nfunction extractTextContent(content: string | BedrockContentBlock[] | null | undefined): string {\n if (content === null || content === undefined) return \"\";\n if (typeof content === \"string\") return content;\n return content\n .filter((b) => b !== null && b !== undefined && b.type === \"text\")\n .map((b) => b.text ?? \"\")\n .join(\"\");\n}\n\nexport function bedrockToCompletionRequest(\n req: BedrockRequest,\n modelId: string,\n logger?: Logger,\n): ChatCompletionRequest {\n const messages: ChatMessage[] = [];\n\n // system field → system message\n if (req.system) {\n const systemText =\n typeof req.system === \"string\"\n ? req.system\n : Array.isArray(req.system)\n ? req.system\n .filter((b) => b !== null && b !== undefined && b.type === \"text\")\n .map((b) => b.text ?? \"\")\n .join(\"\")\n : \"\";\n if (systemText) {\n messages.push({ role: \"system\", content: systemText });\n }\n }\n\n for (const msg of req.messages) {\n if (msg.role === \"user\") {\n // Check for tool_result blocks\n if (typeof msg.content !== \"string\" && Array.isArray(msg.content)) {\n // Warn about non-text content blocks that will be dropped (image, document, etc.)\n const unsupportedBlocks = msg.content.filter(\n (b) => b === null || b === undefined || (b.type !== \"text\" && b.type !== \"tool_result\"),\n );\n if (unsupportedBlocks.length > 0 && logger) {\n const types = [...new Set(unsupportedBlocks.map((b) => b.type))].join(\", \");\n logger.warn(\n `Bedrock user message contains unsupported content block types [${types}] — these will be dropped during conversion`,\n );\n }\n\n const toolResults = msg.content.filter(\n (b) => b !== null && b !== undefined && b.type === \"tool_result\",\n );\n const textBlocks = msg.content.filter(\n (b) => b !== null && b !== undefined && b.type === \"text\",\n );\n\n if (toolResults.length > 0) {\n for (const tr of toolResults) {\n const resultContent =\n typeof tr.content === \"string\"\n ? tr.content\n : Array.isArray(tr.content)\n ? tr.content\n .filter((b) => b !== null && b !== undefined && b.type === \"text\")\n .map((b) => b.text ?? \"\")\n .join(\"\")\n : \"\";\n messages.push({\n role: \"tool\",\n content: resultContent,\n tool_call_id: tr.tool_use_id,\n });\n }\n if (textBlocks.length > 0) {\n messages.push({\n role: \"user\",\n content: textBlocks.map((b) => b.text ?? \"\").join(\"\"),\n });\n }\n continue;\n }\n }\n messages.push({\n role: \"user\",\n content: extractTextContent(msg.content),\n });\n } else if (msg.role === \"assistant\") {\n if (typeof msg.content === \"string\") {\n messages.push({ role: \"assistant\", content: msg.content });\n } else if (Array.isArray(msg.content)) {\n const toolUseBlocks = msg.content.filter(\n (b) => b !== null && b !== undefined && b.type === \"tool_use\",\n );\n const textContent = extractTextContent(msg.content);\n\n if (toolUseBlocks.length > 0) {\n messages.push({\n role: \"assistant\",\n content: textContent || null,\n tool_calls: toolUseBlocks.map((b, index) => {\n if (!b.id && logger) {\n logger.warn(\n `Bedrock assistant tool_use block at index ${index} is missing an id — using deterministic fallback \"tool_use_${index}\"`,\n );\n }\n return {\n id: b.id ?? `tool_use_${index}`,\n type: \"function\" as const,\n function: {\n name: b.name ?? \"\",\n arguments: typeof b.input === \"string\" ? b.input : JSON.stringify(b.input ?? {}),\n },\n };\n }),\n });\n } else {\n messages.push({ role: \"assistant\", content: textContent || null });\n }\n } else {\n messages.push({ role: \"assistant\", content: null });\n }\n } else {\n if (logger) {\n logger.warn(\n `Bedrock message has unexpected role \"${(msg as { role: string }).role}\" — skipping`,\n );\n }\n }\n }\n\n // Convert tools\n let tools: ToolDefinition[] | undefined;\n if (req.tools && req.tools.length > 0) {\n tools = req.tools.map((t) => ({\n type: \"function\" as const,\n function: {\n name: t.name,\n description: t.description,\n parameters: t.input_schema,\n },\n }));\n }\n\n return {\n model: modelId,\n messages,\n stream: false,\n temperature: req.temperature,\n max_tokens: req.max_tokens,\n tools,\n };\n}\n\n// ─── Response builders ──────────────────────────────────────────────────────\n\nfunction buildBedrockTextResponse(\n content: string,\n model: string,\n reasoning?: string,\n overrides?: ResponseOverrides,\n): object {\n const contentBlocks: object[] = [];\n if (reasoning) {\n contentBlocks.push({ type: \"thinking\", thinking: reasoning, signature: \"\" });\n }\n contentBlocks.push({ type: \"text\", text: content });\n\n return {\n id: overrides?.id ?? generateMessageId(),\n type: \"message\",\n role: \"assistant\",\n content: contentBlocks,\n model: overrides?.model ?? model,\n stop_reason: bedrockStopReason(overrides?.finishReason, \"end_turn\"),\n stop_sequence: null,\n usage: renderAnthropicUsage(resolveAnthropicUsage(overrides), \"bedrock-final\"),\n };\n}\n\nfunction buildBedrockToolCallResponse(\n toolCalls: ToolCall[],\n model: string,\n logger: Logger,\n reasoning?: string,\n overrides?: ResponseOverrides,\n): object {\n const contentBlocks: object[] = [];\n // Thinking block (emitted before tool_use blocks when reasoning is present)\n if (reasoning) {\n contentBlocks.push({ type: \"thinking\", thinking: reasoning, signature: \"\" });\n }\n for (const tc of toolCalls) {\n const args = servedToolArgs(tc, \"object\", logger);\n contentBlocks.push({\n type: \"tool_use\",\n id: tc.id || generateToolUseId(),\n name: tc.name,\n input: args.value,\n });\n }\n return {\n id: overrides?.id ?? generateMessageId(),\n type: \"message\",\n role: \"assistant\",\n content: contentBlocks,\n model: overrides?.model ?? model,\n stop_reason: bedrockStopReason(overrides?.finishReason, \"tool_use\"),\n stop_sequence: null,\n usage: renderAnthropicUsage(resolveAnthropicUsage(overrides), \"bedrock-final\"),\n };\n}\n\n/**\n * Build a Bedrock-invoke (Anthropic-style) non-streaming response whose\n * `content[]` array honors the fixture's ordered `blocks`. Bedrock-invoke\n * mirrors the Anthropic Messages content array, which is positionally\n * observable, so a `toolCall` block ahead of a `text` block yields a `tool_use`\n * content entry ahead of the `text` entry (tool-first is wire-expressible).\n *\n * Any leading thinking block (when reasoning is present) precedes the ordered\n * blocks, matching the legacy builders. Reached only when `blocks` is non-empty;\n * the legacy `{content, toolCalls}` text-first path is untouched.\n */\nfunction buildBedrockBlocksResponse(\n blocks: FixtureBlock[],\n model: string,\n logger: Logger,\n reasoning?: string,\n overrides?: ResponseOverrides,\n): object {\n const contentBlocks: object[] = [];\n if (reasoning) {\n contentBlocks.push({ type: \"thinking\", thinking: reasoning, signature: \"\" });\n }\n\n const outcome = resolveFixtureBlockOutcome(blocks);\n const ordered = outcome.ordered;\n for (const block of ordered) {\n if (block.type === \"text\") {\n contentBlocks.push({ type: \"text\", text: block.text });\n } else {\n const args = servedToolArgs(block, \"object\", logger);\n contentBlocks.push({\n type: \"tool_use\",\n id: block.id || generateToolUseId(),\n name: block.name,\n input: args.value,\n });\n }\n }\n\n return {\n id: overrides?.id ?? generateMessageId(),\n type: \"message\",\n role: \"assistant\",\n content: contentBlocks,\n model: overrides?.model ?? model,\n stop_reason: bedrockStopReason(\n overrides?.finishReason,\n outcome.hasToolCalls ? \"tool_use\" : \"end_turn\",\n ),\n stop_sequence: null,\n usage: renderAnthropicUsage(resolveAnthropicUsage(overrides), \"bedrock-final\"),\n };\n}\n\n// ─── Request handler ────────────────────────────────────────────────────────\n\nexport async function handleBedrock(\n req: http.IncomingMessage,\n res: http.ServerResponse,\n raw: string,\n modelId: string,\n fixtures: Fixture[],\n journal: Journal,\n defaults: HandlerDefaults,\n setCorsHeaders: (res: http.ServerResponse) => void,\n): Promise<void> {\n const { logger } = defaults;\n setCorsHeaders(res);\n\n const urlPath = req.url ?? `/model/${modelId}/invoke`;\n\n let bedrockReq: BedrockRequest;\n try {\n bedrockReq = JSON.parse(raw) as BedrockRequest;\n } catch (parseErr) {\n const detail = parseErr instanceof Error ? parseErr.message : \"unknown\";\n journal.add({\n method: req.method ?? \"POST\",\n path: urlPath,\n headers: flattenHeaders(req.headers),\n body: null,\n response: { status: 400, fixture: null },\n });\n writeErrorResponse(\n res,\n 400,\n renderError(\"bedrock\", \"validation\", {\n message: `Malformed JSON: ${detail}`,\n type: \"invalid_request_error\",\n }).body,\n );\n return;\n }\n\n // Reject non-object bodies (e.g. `null`) before touching fields —\n // otherwise `bedrockReq.messages` throws a TypeError that surfaces as a 500\n // instead of a 400.\n if (!isJsonObject(bedrockReq)) {\n journal.add({\n method: req.method ?? \"POST\",\n path: urlPath,\n headers: flattenHeaders(req.headers),\n body: null,\n response: { status: 400, fixture: null },\n });\n writeErrorResponse(\n res,\n 400,\n renderError(\"bedrock\", \"validation\", {\n message: \"Request body must be a JSON object\",\n type: \"invalid_request_error\",\n }).body,\n );\n return;\n }\n\n // Reject wrong-typed fields before the converter dereferences them. A\n // missing/non-array `messages` keeps the historic message below.\n const bedrockShapeError =\n validateChatMessages(bedrockReq.messages, { checkToolCalls: false }) ??\n validateToolsField(bedrockReq.tools) ??\n (bedrockReq.system !== undefined &&\n bedrockReq.system !== null &&\n typeof bedrockReq.system !== \"string\" &&\n !Array.isArray(bedrockReq.system)\n ? \"system must be a string or an array\"\n : null);\n if (bedrockShapeError) {\n journal.add({\n method: req.method ?? \"POST\",\n path: urlPath,\n headers: flattenHeaders(req.headers),\n body: null,\n response: { status: 400, fixture: null },\n });\n writeErrorResponse(\n res,\n 400,\n renderError(\"bedrock\", \"validation\", {\n message: `Invalid request: ${bedrockShapeError}`,\n type: \"invalid_request_error\",\n }).body,\n );\n return;\n }\n\n // Convert to ChatCompletionRequest for fixture matching\n const completionReq = bedrockToCompletionRequest(bedrockReq, modelId, logger);\n completionReq._endpointType = \"chat\";\n completionReq._context = getContext(req);\n\n const testId = getTestId(req);\n const { fixture, skippedBySequenceOrTurn } = matchFixtureDiagnostic(\n fixtures,\n completionReq,\n journal.getFixtureMatchCountsForTest(testId),\n defaults.requestTransform,\n // Record mode proxies on a miss to capture a fresh turn (see record gate\n // below), so keep turnIndex strict to prevent an earlier-turn fixture from\n // shadowing a longer request and skipping the new turn's recording.\n recordMatchOptions(!!defaults.record, defaults.logger),\n );\n\n if (fixture) {\n logger.debug(`Fixture matched: ${JSON.stringify(fixture.match).slice(0, 120)}`);\n } else {\n logger.debug(`No fixture matched for request`);\n }\n\n if (fixture) {\n journal.incrementFixtureMatchCount(fixture, fixtures, testId);\n }\n\n if (\n await applyChaosAsync(\n res,\n fixture,\n defaults.chaos,\n req.headers,\n req.url,\n journal,\n {\n method: req.method ?? \"POST\",\n path: urlPath,\n headers: flattenHeaders(req.headers),\n body: completionReq,\n },\n fixture ? \"fixture\" : \"proxy\",\n defaults.registry,\n defaults.logger,\n )\n )\n return;\n\n if (!fixture) {\n const effectiveStrict = resolveRequestDecisions(defaults.strict, req.headers).fixtureMiss;\n if (effectiveStrict) {\n const strictStatus = 503;\n const strictMessage = strictNoMatchMessage(skippedBySequenceOrTurn);\n logger.error(strictNoMatchLogLine(req.method ?? \"POST\", urlPath, skippedBySequenceOrTurn));\n journal.add({\n method: req.method ?? \"POST\",\n path: urlPath,\n headers: flattenHeaders(req.headers),\n body: completionReq,\n response: {\n status: strictStatus,\n fixture: null,\n ...strictOverrideField(defaults.strict, req.headers),\n },\n });\n writeErrorResponse(\n res,\n strictStatus,\n renderError(\"bedrock\", \"strict-miss\", {\n message: strictMessage,\n type: \"invalid_request_error\",\n }).body,\n );\n return;\n }\n if (defaults.record) {\n const outcome = await proxyAndRecord(\n req,\n res,\n completionReq,\n \"bedrock\",\n urlPath,\n fixtures,\n defaults,\n raw,\n );\n if (outcome === \"handled_by_hook\") return;\n if (outcome !== \"not_configured\") {\n journal.add({\n method: req.method ?? \"POST\",\n path: urlPath,\n headers: flattenHeaders(req.headers),\n body: completionReq,\n response: { status: res.statusCode ?? 200, fixture: null, source: \"proxy\" },\n });\n return;\n }\n }\n journal.add({\n method: req.method ?? \"POST\",\n path: urlPath,\n headers: flattenHeaders(req.headers),\n body: completionReq,\n response: {\n status: 404,\n fixture: null,\n ...strictOverrideField(defaults.strict, req.headers),\n },\n });\n writeErrorResponse(\n res,\n 404,\n renderError(\"bedrock\", \"fixture-miss\", {\n message: \"No fixture matched\",\n type: \"invalid_request_error\",\n }).body,\n );\n return;\n }\n\n const response = await resolveResponse(fixture, completionReq);\n const misbehavior = planMisbehavior({\n wire: \"bedrock-invoke\",\n emitsToolCallIds: true,\n fixture,\n response,\n request: completionReq,\n stream: completionReq.stream === true,\n defaults,\n rawHeaders: req.headers,\n url: req.url,\n });\n const addResponseEntry = (input: Parameters<Journal[\"add\"]>[0]) => {\n const entry = journal.add(input);\n recordMisbehaviorOutcome({ entry, summary: misbehavior.summary, defaults, testId });\n return entry;\n };\n if (misbehavior.kind === \"error\") {\n if (!misbehavior.summary?.evaluations.length) {\n logger.error(`[misbehavior] ${misbehavior.message}`);\n }\n addResponseEntry({\n method: req.method ?? \"POST\",\n path: urlPath,\n headers: flattenHeaders(req.headers),\n body: completionReq,\n response: { status: misbehavior.status, fixture },\n });\n const type = misbehavior.status === 400 ? \"ValidationException\" : \"NotImplementedException\";\n const renderedError = renderError(\"bedrock\", \"misbehavior\", {\n type,\n code: misbehavior.code,\n message: misbehavior.message,\n });\n for (const [name, value] of Object.entries(renderedError.headers ?? {}))\n res.setHeader(name, value);\n writeErrorResponse(res, misbehavior.status, renderedError.body);\n return;\n }\n\n if (misbehavior.kind === \"applied\") {\n const prepared = prepareClaudeMisbehavior(misbehavior, {\n request: completionReq,\n stream: false,\n chunkSize: Math.max(1, fixture.chunkSize ?? defaults.chunkSize),\n logger,\n strict: resolveRequestDecisions(defaults.strict, req.headers).reasoningSuppression,\n });\n if (prepared.stream) throw new TypeError(\"InvokeModel requires non-stream Claude output\");\n const entry = journal.add({\n method: req.method ?? \"POST\",\n path: urlPath,\n headers: flattenHeaders(req.headers),\n body: completionReq,\n response: { status: 200, fixture },\n });\n recordMisbehaviorOutcome({ entry, summary: prepared.plan.summary, defaults, testId });\n res.writeHead(200, { \"Content-Type\": \"application/json\" });\n res.end(JSON.stringify(prepared.body));\n return;\n }\n\n // Error response\n if (isErrorResponse(response)) {\n const status = response.status ?? 500;\n addResponseEntry({\n method: req.method ?? \"POST\",\n path: urlPath,\n headers: flattenHeaders(req.headers),\n body: completionReq,\n response: { status, fixture },\n });\n // Bedrock Claude error format: { type: \"error\", error: { type, message } }\n // Uses ?? (nullish coalescing) intentionally — preserves explicit empty-string types from fixtures.\n writeErrorResponse(res, status, renderError(\"bedrock\", \"fixture\", response.error).body, {\n retryAfter: response.retryAfter,\n });\n return;\n }\n\n // Content + tool calls response\n if (isCombinedFixtureResponse(response)) {\n if (response.webSearches?.length) {\n logger.warn(\"webSearches in fixture response are not supported for Bedrock API — ignoring\");\n }\n const overrides = extractOverrides(response);\n const effReasoning = resolveReasoningForModel(\n response.reasoning,\n completionReq.model,\n resolveRequestDecisions(defaults.strict, req.headers).reasoningSuppression,\n logger,\n );\n addResponseEntry({\n method: req.method ?? \"POST\",\n path: urlPath,\n headers: flattenHeaders(req.headers),\n body: completionReq,\n response: { status: 200, fixture },\n });\n const functionToolCalls = requireEmittedFunctionToolCalls(response, \"Bedrock InvokeModel\");\n if (response.blocks && response.blocks.length > 0) {\n // NEW PATH: honor the fixture's ordered `blocks` in the positionally\n // observable Anthropic-style content array (tool-first expressible).\n const blocksBody = buildBedrockBlocksResponse(\n response.blocks,\n completionReq.model,\n logger,\n effReasoning,\n overrides,\n );\n res.writeHead(200, { \"Content-Type\": \"application/json\" });\n res.end(JSON.stringify(blocksBody));\n return;\n }\n const textBody = buildBedrockTextResponse(\n response.content ?? \"\",\n completionReq.model,\n effReasoning,\n overrides,\n );\n const toolBody = buildBedrockToolCallResponse(\n functionToolCalls,\n completionReq.model,\n logger,\n // Reasoning is rendered by the text response in this merged path; pass\n // undefined here to avoid emitting a duplicate thinking block.\n undefined,\n overrides,\n );\n // Merge: take the text response as base, append tool_use blocks, set stop_reason to tool_use\n const merged = {\n ...(textBody as Record<string, unknown>),\n content: [\n ...((textBody as Record<string, unknown>).content as object[]),\n ...((toolBody as Record<string, unknown>).content as object[]),\n ],\n stop_reason: bedrockStopReason(overrides?.finishReason, \"tool_use\"),\n };\n res.writeHead(200, { \"Content-Type\": \"application/json\" });\n res.end(JSON.stringify(merged));\n return;\n }\n\n // Text response\n if (isTextResponse(response)) {\n if (response.webSearches?.length) {\n logger.warn(\"webSearches in fixture response are not supported for Bedrock API — ignoring\");\n }\n const overrides = extractOverrides(response);\n const effReasoning = resolveReasoningForModel(\n response.reasoning,\n completionReq.model,\n resolveRequestDecisions(defaults.strict, req.headers).reasoningSuppression,\n logger,\n );\n addResponseEntry({\n method: req.method ?? \"POST\",\n path: urlPath,\n headers: flattenHeaders(req.headers),\n body: completionReq,\n response: { status: 200, fixture },\n });\n const body = buildBedrockTextResponse(\n response.content,\n completionReq.model,\n effReasoning,\n overrides,\n );\n res.writeHead(200, { \"Content-Type\": \"application/json\" });\n res.end(JSON.stringify(body));\n return;\n }\n\n // Tool call response\n if (isToolCallResponse(response)) {\n if (response.webSearches?.length) {\n logger.warn(\"webSearches in fixture response are not supported for Bedrock API — ignoring\");\n }\n const overrides = extractOverrides(response);\n const effReasoning = resolveReasoningForModel(\n response.reasoning,\n completionReq.model,\n resolveRequestDecisions(defaults.strict, req.headers).reasoningSuppression,\n logger,\n );\n addResponseEntry({\n method: req.method ?? \"POST\",\n path: urlPath,\n headers: flattenHeaders(req.headers),\n body: completionReq,\n response: { status: 200, fixture },\n });\n const functionToolCalls = requireEmittedFunctionToolCalls(response, \"Bedrock InvokeModel\");\n const body = buildBedrockToolCallResponse(\n functionToolCalls,\n completionReq.model,\n logger,\n effReasoning,\n overrides,\n );\n res.writeHead(200, { \"Content-Type\": \"application/json\" });\n res.end(JSON.stringify(body));\n return;\n }\n\n // Unknown response type\n addResponseEntry({\n method: req.method ?? \"POST\",\n path: urlPath,\n headers: flattenHeaders(req.headers),\n body: completionReq,\n response: { status: 500, fixture },\n });\n writeErrorResponse(\n res,\n 500,\n renderError(\"bedrock\", \"unknown-response\", {\n message: \"Fixture response did not match any known type\",\n type: \"server_error\",\n }).body,\n );\n}\n\n// ─── Streaming event builders ───────────────────────────────────────────────\n\nconst BEDROCK_INVOKE_STREAM_EVENT_TYPE = \"chunk\";\n/** Serialize Claude events as InvokeModel PayloadPart, leaving generic AWS framing unchanged. */\nfunction writeBedrockInvokeStream(\n res: http.ServerResponse,\n events: Parameters<typeof writeEventStream>[1],\n options: Parameters<typeof writeEventStream>[2],\n): Promise<boolean> {\n return writeEventStream(\n res,\n events.map((event) => ({\n eventType: event.eventType,\n payload: { bytes: Buffer.from(JSON.stringify(event.payload), \"utf8\").toString(\"base64\") },\n })),\n options,\n );\n}\n\nfunction buildBedrockInvokeMessageStart(\n model: string,\n overrides?: ResponseOverrides,\n): { eventType: string; payload: object } {\n return {\n eventType: BEDROCK_INVOKE_STREAM_EVENT_TYPE,\n payload: {\n type: \"message_start\",\n message: {\n id: overrides?.id ?? generateMessageId(),\n type: \"message\",\n role: \"assistant\",\n content: [],\n model: overrides?.model ?? model,\n stop_reason: null,\n stop_sequence: null,\n usage: renderAnthropicUsage(resolveAnthropicUsage(overrides), \"bedrock-start\"),\n },\n },\n };\n}\n\nfunction buildBedrockInvokeMessageDelta(\n stopReason: string,\n overrides?: ResponseOverrides,\n): {\n eventType: string;\n payload: object;\n} {\n return {\n eventType: BEDROCK_INVOKE_STREAM_EVENT_TYPE,\n payload: {\n type: \"message_delta\",\n delta: { stop_reason: stopReason, stop_sequence: null },\n usage: renderAnthropicUsage(resolveAnthropicUsage(overrides), \"bedrock-delta\"),\n },\n };\n}\n\nfunction buildBedrockInvokeMessageStop(): { eventType: string; payload: object } {\n return {\n eventType: BEDROCK_INVOKE_STREAM_EVENT_TYPE,\n payload: { type: \"message_stop\" },\n };\n}\n\nfunction parseToolArgumentsForStream(toolCall: ToolCall, logger: Logger): string {\n return servedToolArgs(toolCall, \"string\", logger).text;\n}\n\nexport function buildBedrockStreamTextEvents(\n content: string,\n model: string,\n chunkSize: number,\n reasoning?: string,\n overrides?: ResponseOverrides,\n): Array<{ eventType: string; payload: object }> {\n const events: Array<{ eventType: string; payload: object }> = [];\n\n events.push(buildBedrockInvokeMessageStart(model, overrides));\n\n // Thinking block (emitted before text when reasoning is present)\n if (reasoning) {\n const blockIndex = 0;\n events.push({\n eventType: BEDROCK_INVOKE_STREAM_EVENT_TYPE,\n payload: {\n type: \"content_block_start\",\n index: blockIndex,\n content_block: { type: \"thinking\", thinking: \"\", signature: \"\" },\n },\n });\n\n for (let i = 0; i < reasoning.length; i += chunkSize) {\n const slice = reasoning.slice(i, i + chunkSize);\n events.push({\n eventType: BEDROCK_INVOKE_STREAM_EVENT_TYPE,\n payload: {\n type: \"content_block_delta\",\n index: blockIndex,\n delta: { type: \"thinking_delta\", thinking: slice },\n },\n });\n }\n\n events.push({\n eventType: BEDROCK_INVOKE_STREAM_EVENT_TYPE,\n payload: {\n type: \"content_block_delta\",\n index: blockIndex,\n delta: { type: \"signature_delta\", signature: \"\" },\n },\n });\n\n events.push({\n eventType: BEDROCK_INVOKE_STREAM_EVENT_TYPE,\n payload: { type: \"content_block_stop\", index: blockIndex },\n });\n }\n\n // Text block\n const textBlockIndex = reasoning ? 1 : 0;\n\n events.push({\n eventType: BEDROCK_INVOKE_STREAM_EVENT_TYPE,\n payload: {\n type: \"content_block_start\",\n index: textBlockIndex,\n content_block: { type: \"text\", text: \"\" },\n },\n });\n\n for (let i = 0; i < content.length; i += chunkSize) {\n const slice = content.slice(i, i + chunkSize);\n events.push({\n eventType: BEDROCK_INVOKE_STREAM_EVENT_TYPE,\n payload: {\n type: \"content_block_delta\",\n index: textBlockIndex,\n delta: { type: \"text_delta\", text: slice },\n },\n });\n }\n\n events.push({\n eventType: BEDROCK_INVOKE_STREAM_EVENT_TYPE,\n payload: { type: \"content_block_stop\", index: textBlockIndex },\n });\n\n events.push(\n buildBedrockInvokeMessageDelta(\n bedrockStopReason(overrides?.finishReason, \"end_turn\"),\n overrides,\n ),\n );\n events.push(buildBedrockInvokeMessageStop());\n\n return events;\n}\n\nexport function buildBedrockStreamContentWithToolCallsEvents(\n content: string,\n toolCalls: ToolCall[],\n model: string,\n chunkSize: number,\n logger: Logger,\n reasoning?: string,\n overrides?: ResponseOverrides,\n blocks?: FixtureBlock[],\n): Array<{ eventType: string; payload: object }> {\n const events: Array<{ eventType: string; payload: object }> = [];\n\n events.push(buildBedrockInvokeMessageStart(model, overrides));\n\n let blockIndex = 0;\n\n // Thinking block (emitted before text/tool_use when reasoning is present);\n // shared by both the legacy and the ordered-`blocks` paths.\n if (reasoning) {\n events.push({\n eventType: BEDROCK_INVOKE_STREAM_EVENT_TYPE,\n payload: {\n type: \"content_block_start\",\n index: blockIndex,\n content_block: { type: \"thinking\", thinking: \"\", signature: \"\" },\n },\n });\n for (let i = 0; i < reasoning.length; i += chunkSize) {\n const slice = reasoning.slice(i, i + chunkSize);\n events.push({\n eventType: BEDROCK_INVOKE_STREAM_EVENT_TYPE,\n payload: {\n type: \"content_block_delta\",\n index: blockIndex,\n delta: { type: \"thinking_delta\", thinking: slice },\n },\n });\n }\n events.push({\n eventType: BEDROCK_INVOKE_STREAM_EVENT_TYPE,\n payload: {\n type: \"content_block_delta\",\n index: blockIndex,\n delta: { type: \"signature_delta\", signature: \"\" },\n },\n });\n events.push({\n eventType: BEDROCK_INVOKE_STREAM_EVENT_TYPE,\n payload: { type: \"content_block_stop\", index: blockIndex },\n });\n blockIndex++;\n }\n\n if (blocks && blocks.length > 0) {\n // NEW PATH: emit `text`/`tool_use` content_block events in the fixture's\n // array order. Bedrock-invoke binary `content_block_*` events are\n // positional, so a `toolCall` block can take a lower `index` than a `text`\n // block (tool-first is wire-expressible). Indices continue from any leading\n // thinking block above.\n const outcome = resolveFixtureBlockOutcome(blocks);\n const ordered = outcome.ordered;\n for (const block of ordered) {\n if (block.type === \"text\") {\n events.push({\n eventType: BEDROCK_INVOKE_STREAM_EVENT_TYPE,\n payload: {\n type: \"content_block_start\",\n index: blockIndex,\n content_block: { type: \"text\", text: \"\" },\n },\n });\n for (let i = 0; i < block.text.length; i += chunkSize) {\n const slice = block.text.slice(i, i + chunkSize);\n events.push({\n eventType: BEDROCK_INVOKE_STREAM_EVENT_TYPE,\n payload: {\n type: \"content_block_delta\",\n index: blockIndex,\n delta: { type: \"text_delta\", text: slice },\n },\n });\n }\n events.push({\n eventType: BEDROCK_INVOKE_STREAM_EVENT_TYPE,\n payload: { type: \"content_block_stop\", index: blockIndex },\n });\n blockIndex++;\n } else {\n const toolUseId = block.id || generateToolUseId();\n events.push({\n eventType: BEDROCK_INVOKE_STREAM_EVENT_TYPE,\n payload: {\n type: \"content_block_start\",\n index: blockIndex,\n content_block: {\n type: \"tool_use\",\n id: toolUseId,\n name: block.name,\n input: {},\n },\n },\n });\n const argsStr = parseToolArgumentsForStream(\n { name: block.name, arguments: block.arguments } as ToolCall,\n logger,\n );\n for (let i = 0; i < argsStr.length; i += chunkSize) {\n const slice = argsStr.slice(i, i + chunkSize);\n events.push({\n eventType: BEDROCK_INVOKE_STREAM_EVENT_TYPE,\n payload: {\n type: \"content_block_delta\",\n index: blockIndex,\n delta: { type: \"input_json_delta\", partial_json: slice },\n },\n });\n }\n events.push({\n eventType: BEDROCK_INVOKE_STREAM_EVENT_TYPE,\n payload: { type: \"content_block_stop\", index: blockIndex },\n });\n blockIndex++;\n }\n }\n\n events.push(\n buildBedrockInvokeMessageDelta(\n bedrockStopReason(overrides?.finishReason, outcome.hasToolCalls ? \"tool_use\" : \"end_turn\"),\n overrides,\n ),\n );\n events.push(buildBedrockInvokeMessageStop());\n return events;\n }\n\n // LEGACY PATH (unchanged): text block, then tool_use blocks in toolCalls order.\n // Text block\n events.push({\n eventType: BEDROCK_INVOKE_STREAM_EVENT_TYPE,\n payload: {\n type: \"content_block_start\",\n index: blockIndex,\n content_block: { type: \"text\", text: \"\" },\n },\n });\n for (let i = 0; i < content.length; i += chunkSize) {\n const slice = content.slice(i, i + chunkSize);\n events.push({\n eventType: BEDROCK_INVOKE_STREAM_EVENT_TYPE,\n payload: {\n type: \"content_block_delta\",\n index: blockIndex,\n delta: { type: \"text_delta\", text: slice },\n },\n });\n }\n events.push({\n eventType: BEDROCK_INVOKE_STREAM_EVENT_TYPE,\n payload: { type: \"content_block_stop\", index: blockIndex },\n });\n blockIndex++;\n\n // Tool call blocks\n for (let tcIdx = 0; tcIdx < toolCalls.length; tcIdx++) {\n const tc = toolCalls[tcIdx];\n const toolUseId = tc.id || generateToolUseId();\n const currentBlock = blockIndex + tcIdx;\n\n events.push({\n eventType: BEDROCK_INVOKE_STREAM_EVENT_TYPE,\n payload: {\n type: \"content_block_start\",\n index: currentBlock,\n content_block: {\n type: \"tool_use\",\n id: toolUseId,\n name: tc.name,\n input: {},\n },\n },\n });\n\n const argsStr = parseToolArgumentsForStream(tc, logger);\n\n for (let i = 0; i < argsStr.length; i += chunkSize) {\n const slice = argsStr.slice(i, i + chunkSize);\n events.push({\n eventType: BEDROCK_INVOKE_STREAM_EVENT_TYPE,\n payload: {\n type: \"content_block_delta\",\n index: currentBlock,\n delta: { type: \"input_json_delta\", partial_json: slice },\n },\n });\n }\n\n events.push({\n eventType: BEDROCK_INVOKE_STREAM_EVENT_TYPE,\n payload: { type: \"content_block_stop\", index: currentBlock },\n });\n }\n\n events.push(\n buildBedrockInvokeMessageDelta(\n bedrockStopReason(overrides?.finishReason, \"tool_use\"),\n overrides,\n ),\n );\n events.push(buildBedrockInvokeMessageStop());\n\n return events;\n}\n\nexport function buildBedrockStreamToolCallEvents(\n toolCalls: ToolCall[],\n model: string,\n chunkSize: number,\n logger: Logger,\n reasoning?: string,\n overrides?: ResponseOverrides,\n): Array<{ eventType: string; payload: object }> {\n const events: Array<{ eventType: string; payload: object }> = [];\n\n events.push(buildBedrockInvokeMessageStart(model, overrides));\n\n // Leading reasoning block shifts every subsequent tool_use block index by 1.\n let blockIndex = 0;\n\n // Thinking block (emitted before tool_use blocks when reasoning is present)\n if (reasoning) {\n events.push({\n eventType: BEDROCK_INVOKE_STREAM_EVENT_TYPE,\n payload: {\n type: \"content_block_start\",\n index: blockIndex,\n content_block: { type: \"thinking\", thinking: \"\", signature: \"\" },\n },\n });\n for (let i = 0; i < reasoning.length; i += chunkSize) {\n const slice = reasoning.slice(i, i + chunkSize);\n events.push({\n eventType: BEDROCK_INVOKE_STREAM_EVENT_TYPE,\n payload: {\n type: \"content_block_delta\",\n index: blockIndex,\n delta: { type: \"thinking_delta\", thinking: slice },\n },\n });\n }\n events.push({\n eventType: BEDROCK_INVOKE_STREAM_EVENT_TYPE,\n payload: {\n type: \"content_block_delta\",\n index: blockIndex,\n delta: { type: \"signature_delta\", signature: \"\" },\n },\n });\n events.push({\n eventType: BEDROCK_INVOKE_STREAM_EVENT_TYPE,\n payload: { type: \"content_block_stop\", index: blockIndex },\n });\n blockIndex++;\n }\n\n for (let tcIdx = 0; tcIdx < toolCalls.length; tcIdx++) {\n const tc = toolCalls[tcIdx];\n const toolUseId = tc.id || generateToolUseId();\n const currentBlock = blockIndex + tcIdx;\n\n events.push({\n eventType: BEDROCK_INVOKE_STREAM_EVENT_TYPE,\n payload: {\n type: \"content_block_start\",\n index: currentBlock,\n content_block: {\n type: \"tool_use\",\n id: toolUseId,\n name: tc.name,\n input: {},\n },\n },\n });\n\n const argsStr = parseToolArgumentsForStream(tc, logger);\n\n for (let i = 0; i < argsStr.length; i += chunkSize) {\n const slice = argsStr.slice(i, i + chunkSize);\n events.push({\n eventType: BEDROCK_INVOKE_STREAM_EVENT_TYPE,\n payload: {\n type: \"content_block_delta\",\n index: currentBlock,\n delta: { type: \"input_json_delta\", partial_json: slice },\n },\n });\n }\n\n events.push({\n eventType: BEDROCK_INVOKE_STREAM_EVENT_TYPE,\n payload: { type: \"content_block_stop\", index: currentBlock },\n });\n }\n\n events.push(\n buildBedrockInvokeMessageDelta(\n bedrockStopReason(overrides?.finishReason, \"tool_use\"),\n overrides,\n ),\n );\n events.push(buildBedrockInvokeMessageStop());\n\n return events;\n}\n\n// ─── Streaming request handler ──────────────────────────────────────────────\n\nexport async function handleBedrockStream(\n req: http.IncomingMessage,\n res: http.ServerResponse,\n raw: string,\n modelId: string,\n fixtures: Fixture[],\n journal: Journal,\n defaults: HandlerDefaults,\n setCorsHeaders: (res: http.ServerResponse) => void,\n): Promise<void> {\n const { logger } = defaults;\n setCorsHeaders(res);\n\n const urlPath = req.url ?? `/model/${modelId}/invoke-with-response-stream`;\n\n let bedrockReq: BedrockRequest;\n try {\n bedrockReq = JSON.parse(raw) as BedrockRequest;\n } catch (parseErr) {\n const detail = parseErr instanceof Error ? parseErr.message : \"unknown\";\n journal.add({\n method: req.method ?? \"POST\",\n path: urlPath,\n headers: flattenHeaders(req.headers),\n body: null,\n response: { status: 400, fixture: null },\n });\n writeErrorResponse(\n res,\n 400,\n renderError(\"bedrock\", \"validation\", {\n message: `Malformed JSON: ${detail}`,\n type: \"invalid_request_error\",\n }).body,\n );\n return;\n }\n\n // Reject non-object bodies (e.g. `null`) before touching fields —\n // otherwise `bedrockReq.messages` throws a TypeError that surfaces as a 500\n // instead of a 400.\n if (!isJsonObject(bedrockReq)) {\n journal.add({\n method: req.method ?? \"POST\",\n path: urlPath,\n headers: flattenHeaders(req.headers),\n body: null,\n response: { status: 400, fixture: null },\n });\n writeErrorResponse(\n res,\n 400,\n renderError(\"bedrock\", \"validation\", {\n message: \"Request body must be a JSON object\",\n type: \"invalid_request_error\",\n }).body,\n );\n return;\n }\n\n // Reject wrong-typed fields before the converter dereferences them. A\n // missing/non-array `messages` keeps the historic message below.\n const bedrockShapeError =\n validateChatMessages(bedrockReq.messages, { checkToolCalls: false }) ??\n validateToolsField(bedrockReq.tools) ??\n (bedrockReq.system !== undefined &&\n bedrockReq.system !== null &&\n typeof bedrockReq.system !== \"string\" &&\n !Array.isArray(bedrockReq.system)\n ? \"system must be a string or an array\"\n : null);\n if (bedrockShapeError) {\n journal.add({\n method: req.method ?? \"POST\",\n path: urlPath,\n headers: flattenHeaders(req.headers),\n body: null,\n response: { status: 400, fixture: null },\n });\n writeErrorResponse(\n res,\n 400,\n renderError(\"bedrock\", \"validation\", {\n message: `Invalid request: ${bedrockShapeError}`,\n type: \"invalid_request_error\",\n }).body,\n );\n return;\n }\n\n const completionReq = bedrockToCompletionRequest(bedrockReq, modelId, logger);\n completionReq.stream = true;\n completionReq._endpointType = \"chat\";\n completionReq._context = getContext(req);\n\n const testId = getTestId(req);\n const { fixture, skippedBySequenceOrTurn } = matchFixtureDiagnostic(\n fixtures,\n completionReq,\n journal.getFixtureMatchCountsForTest(testId),\n defaults.requestTransform,\n // Record mode proxies on a miss to capture a fresh turn (see record gate\n // below), so keep turnIndex strict to prevent an earlier-turn fixture from\n // shadowing a longer request and skipping the new turn's recording.\n recordMatchOptions(!!defaults.record, defaults.logger),\n );\n\n if (fixture) {\n logger.debug(`Fixture matched: ${JSON.stringify(fixture.match).slice(0, 120)}`);\n } else {\n logger.debug(`No fixture matched for request`);\n }\n\n if (fixture) {\n journal.incrementFixtureMatchCount(fixture, fixtures, testId);\n }\n\n if (\n await applyChaosAsync(\n res,\n fixture,\n defaults.chaos,\n req.headers,\n req.url,\n journal,\n {\n method: req.method ?? \"POST\",\n path: urlPath,\n headers: flattenHeaders(req.headers),\n body: completionReq,\n },\n fixture ? \"fixture\" : \"proxy\",\n defaults.registry,\n defaults.logger,\n )\n )\n return;\n\n if (!fixture) {\n const effectiveStrict = resolveRequestDecisions(defaults.strict, req.headers).fixtureMiss;\n if (effectiveStrict) {\n const strictStatus = 503;\n const strictMessage = strictNoMatchMessage(skippedBySequenceOrTurn);\n logger.error(strictNoMatchLogLine(req.method ?? \"POST\", urlPath, skippedBySequenceOrTurn));\n journal.add({\n method: req.method ?? \"POST\",\n path: urlPath,\n headers: flattenHeaders(req.headers),\n body: completionReq,\n response: {\n status: strictStatus,\n fixture: null,\n ...strictOverrideField(defaults.strict, req.headers),\n },\n });\n writeErrorResponse(\n res,\n strictStatus,\n renderError(\"bedrock\", \"strict-miss\", {\n message: strictMessage,\n type: \"invalid_request_error\",\n }).body,\n );\n return;\n }\n if (defaults.record) {\n const outcome = await proxyAndRecord(\n req,\n res,\n completionReq,\n \"bedrock\",\n urlPath,\n fixtures,\n defaults,\n raw,\n );\n if (outcome === \"handled_by_hook\") return;\n if (outcome !== \"not_configured\") {\n journal.add({\n method: req.method ?? \"POST\",\n path: urlPath,\n headers: flattenHeaders(req.headers),\n body: completionReq,\n response: { status: res.statusCode ?? 200, fixture: null, source: \"proxy\" },\n });\n return;\n }\n }\n journal.add({\n method: req.method ?? \"POST\",\n path: urlPath,\n headers: flattenHeaders(req.headers),\n body: completionReq,\n response: {\n status: 404,\n fixture: null,\n ...strictOverrideField(defaults.strict, req.headers),\n },\n });\n writeErrorResponse(\n res,\n 404,\n renderError(\"bedrock\", \"fixture-miss\", {\n message: \"No fixture matched\",\n type: \"invalid_request_error\",\n }).body,\n );\n return;\n }\n\n const response = await resolveResponse(fixture, completionReq);\n const misbehavior = planMisbehavior({\n wire: \"bedrock-invoke\",\n emitsToolCallIds: true,\n fixture,\n response,\n request: completionReq,\n stream: completionReq.stream === true,\n defaults,\n rawHeaders: req.headers,\n url: req.url,\n });\n const addResponseEntry = (input: Parameters<Journal[\"add\"]>[0]) => {\n const entry = journal.add(input);\n recordMisbehaviorOutcome({ entry, summary: misbehavior.summary, defaults, testId });\n return entry;\n };\n if (misbehavior.kind === \"error\") {\n if (!misbehavior.summary?.evaluations.length) {\n logger.error(`[misbehavior] ${misbehavior.message}`);\n }\n addResponseEntry({\n method: req.method ?? \"POST\",\n path: urlPath,\n headers: flattenHeaders(req.headers),\n body: completionReq,\n response: { status: misbehavior.status, fixture },\n });\n const type = misbehavior.status === 400 ? \"ValidationException\" : \"NotImplementedException\";\n const renderedError = renderError(\"bedrock\", \"misbehavior\", {\n type,\n code: misbehavior.code,\n message: misbehavior.message,\n });\n for (const [name, value] of Object.entries(renderedError.headers ?? {}))\n res.setHeader(name, value);\n writeErrorResponse(res, misbehavior.status, renderedError.body);\n return;\n }\n const latency = fixture.latency ?? defaults.latency;\n const chunkSize = Math.max(1, fixture.chunkSize ?? defaults.chunkSize);\n\n if (misbehavior.kind === \"applied\") {\n const prepared = prepareClaudeMisbehavior(misbehavior, {\n request: completionReq,\n stream: true,\n chunkSize,\n logger,\n strict: resolveRequestDecisions(defaults.strict, req.headers).reasoningSuppression,\n });\n if (!prepared.stream) throw new TypeError(\"InvokeModel stream requires Claude events\");\n const entry = journal.add({\n method: req.method ?? \"POST\",\n path: urlPath,\n headers: flattenHeaders(req.headers),\n body: completionReq,\n response: { status: 200, fixture },\n });\n recordMisbehaviorOutcome({ entry, summary: prepared.plan.summary, defaults, testId });\n const events = prepared.events.map((event) => ({\n eventType: BEDROCK_INVOKE_STREAM_EVENT_TYPE,\n payload: event,\n }));\n const interruption = createInterruptionSignal(fixture);\n try {\n const completed = await writeBedrockInvokeStream(res, events, {\n latency,\n streamingProfile: fixture.streamingProfile,\n recordedTimings: fixture.recordedTimings,\n replaySpeed: fixture.replaySpeed ?? defaults.replaySpeed,\n signal: interruption?.signal,\n onChunkSent: interruption?.tick,\n });\n if (!completed) {\n if (!res.writableEnded) res.destroy();\n entry.response.interrupted = true;\n entry.response.interruptReason = interruption?.reason();\n }\n } finally {\n interruption?.cleanup();\n }\n return;\n }\n\n // Error response\n if (isErrorResponse(response)) {\n const status = response.status ?? 500;\n addResponseEntry({\n method: req.method ?? \"POST\",\n path: urlPath,\n headers: flattenHeaders(req.headers),\n body: completionReq,\n response: { status, fixture },\n });\n // Bedrock Claude error format: { type: \"error\", error: { type, message } }\n // Uses ?? (nullish coalescing) intentionally — preserves explicit empty-string types from fixtures.\n writeErrorResponse(res, status, renderError(\"bedrock\", \"fixture\", response.error).body, {\n retryAfter: response.retryAfter,\n });\n return;\n }\n\n // Content + tool calls response — stream as Event Stream\n if (isCombinedFixtureResponse(response)) {\n if (response.webSearches?.length) {\n logger.warn(\"webSearches in fixture response are not supported for Bedrock API — ignoring\");\n }\n const overrides = extractOverrides(response);\n const effReasoning = resolveReasoningForModel(\n response.reasoning,\n completionReq.model,\n resolveRequestDecisions(defaults.strict, req.headers).reasoningSuppression,\n logger,\n );\n const journalEntry = addResponseEntry({\n method: req.method ?? \"POST\",\n path: urlPath,\n headers: flattenHeaders(req.headers),\n body: completionReq,\n response: { status: 200, fixture },\n });\n const functionToolCalls = requireEmittedFunctionToolCalls(response, \"Bedrock InvokeModel\");\n const events = buildBedrockStreamContentWithToolCallsEvents(\n response.content ?? \"\",\n functionToolCalls,\n completionReq.model,\n chunkSize,\n logger,\n effReasoning,\n overrides,\n response.blocks,\n );\n const interruption = createInterruptionSignal(fixture);\n const completed = await writeBedrockInvokeStream(res, events, {\n latency,\n streamingProfile: fixture.streamingProfile,\n recordedTimings: fixture.recordedTimings,\n replaySpeed: fixture.replaySpeed ?? defaults.replaySpeed,\n signal: interruption?.signal,\n onChunkSent: interruption?.tick,\n });\n if (!completed) {\n if (!res.writableEnded) res.destroy();\n journalEntry.response.interrupted = true;\n journalEntry.response.interruptReason = interruption?.reason();\n }\n interruption?.cleanup();\n return;\n }\n\n // Text response — stream as Event Stream\n if (isTextResponse(response)) {\n if (response.webSearches?.length) {\n logger.warn(\"webSearches in fixture response are not supported for Bedrock API — ignoring\");\n }\n const overrides = extractOverrides(response);\n const effReasoning = resolveReasoningForModel(\n response.reasoning,\n completionReq.model,\n resolveRequestDecisions(defaults.strict, req.headers).reasoningSuppression,\n logger,\n );\n const journalEntry = addResponseEntry({\n method: req.method ?? \"POST\",\n path: urlPath,\n headers: flattenHeaders(req.headers),\n body: completionReq,\n response: { status: 200, fixture },\n });\n const events = buildBedrockStreamTextEvents(\n response.content,\n completionReq.model,\n chunkSize,\n effReasoning,\n overrides,\n );\n const interruption = createInterruptionSignal(fixture);\n const completed = await writeBedrockInvokeStream(res, events, {\n latency,\n streamingProfile: fixture.streamingProfile,\n recordedTimings: fixture.recordedTimings,\n replaySpeed: fixture.replaySpeed ?? defaults.replaySpeed,\n signal: interruption?.signal,\n onChunkSent: interruption?.tick,\n });\n if (!completed) {\n if (!res.writableEnded) res.destroy();\n journalEntry.response.interrupted = true;\n journalEntry.response.interruptReason = interruption?.reason();\n }\n interruption?.cleanup();\n return;\n }\n\n // Tool call response — stream as Event Stream\n if (isToolCallResponse(response)) {\n if (response.webSearches?.length) {\n logger.warn(\"webSearches in fixture response are not supported for Bedrock API — ignoring\");\n }\n const overrides = extractOverrides(response);\n const effReasoning = resolveReasoningForModel(\n response.reasoning,\n completionReq.model,\n resolveRequestDecisions(defaults.strict, req.headers).reasoningSuppression,\n logger,\n );\n const journalEntry = addResponseEntry({\n method: req.method ?? \"POST\",\n path: urlPath,\n headers: flattenHeaders(req.headers),\n body: completionReq,\n response: { status: 200, fixture },\n });\n const functionToolCalls = requireEmittedFunctionToolCalls(response, \"Bedrock InvokeModel\");\n const events = buildBedrockStreamToolCallEvents(\n functionToolCalls,\n completionReq.model,\n chunkSize,\n logger,\n effReasoning,\n overrides,\n );\n const interruption = createInterruptionSignal(fixture);\n const completed = await writeBedrockInvokeStream(res, events, {\n latency,\n streamingProfile: fixture.streamingProfile,\n recordedTimings: fixture.recordedTimings,\n replaySpeed: fixture.replaySpeed ?? defaults.replaySpeed,\n signal: interruption?.signal,\n onChunkSent: interruption?.tick,\n });\n if (!completed) {\n if (!res.writableEnded) res.destroy();\n journalEntry.response.interrupted = true;\n journalEntry.response.interruptReason = interruption?.reason();\n }\n interruption?.cleanup();\n return;\n }\n\n // Unknown response type\n addResponseEntry({\n method: req.method ?? \"POST\",\n path: urlPath,\n headers: flattenHeaders(req.headers),\n body: completionReq,\n response: { status: 500, fixture },\n });\n writeErrorResponse(\n res,\n 500,\n renderError(\"bedrock\", \"unknown-response\", {\n message: \"Fixture response did not match any known type\",\n type: \"server_error\",\n }).body,\n );\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"bedrock.js","names":["renderAnthropicUsage","resolveAnthropicUsage"],"sources":["../src/bedrock.ts"],"sourcesContent":["/**\n * AWS Bedrock Claude endpoint support — invoke and invoke-with-response-stream.\n *\n * Handles four Bedrock endpoint families (split across two modules):\n *\n * This file (bedrock.ts):\n * - POST /model/{modelId}/invoke — non-streaming invoke\n * - POST /model/{modelId}/invoke-with-response-stream — binary EventStream streaming\n *\n * bedrock-converse.ts:\n * - POST /model/{modelId}/converse — Converse API (non-streaming)\n * - POST /model/{modelId}/converse-stream — Converse API (EventStream streaming)\n *\n * Translates incoming Bedrock Claude format into the ChatCompletionRequest\n * format used by the fixture router, and converts fixture responses back into\n * the appropriate Bedrock response format (JSON for invoke, AWS Event Stream\n * binary encoding for streaming).\n */\n\nimport type * as http from \"node:http\";\nimport { renderError } from \"./response/errors.js\";\nimport { serveRawResponse } from \"./response/raw.js\";\nimport { resolveRequestDecisions, strictOverrideField } from \"./response/policy.js\";\nimport type {\n ChatCompletionRequest,\n ChatMessage,\n Fixture,\n FixtureBlock,\n HandlerDefaults,\n ResponseOverrides,\n ToolCall,\n ToolDefinition,\n} from \"./types.js\";\nimport {\n requireEmittedFunctionToolCalls,\n generateMessageId,\n generateToolUseId,\n extractOverrides,\n isTextResponse,\n isToolCallResponse,\n isCombinedFixtureResponse,\n isErrorResponse,\n isRawResponse,\n flattenHeaders,\n isJsonObject,\n getContext,\n getTestId,\n resolveResponse,\n resolveFixtureBlockOutcome,\n resolveReasoningForModel,\n strictNoMatchMessage,\n strictNoMatchLogLine,\n validateChatMessages,\n validateToolsField,\n servedToolArgs,\n} from \"./helpers.js\";\nimport { matchFixtureDiagnostic, recordMatchOptions } from \"./router.js\";\nimport { writeErrorResponse } from \"./sse-writer.js\";\nimport { encodeEventStreamMessage, eventStreamCodec } from \"./aws-event-stream.js\";\nimport { deliverJson, deliverStream } from \"./response/deliver.js\";\nimport { proxyInterruption, withHangUpDetection } from \"./response/proxy.js\";\nimport { misbehaviorPayloadLength, servedPayloadLength } from \"./response/timing.js\";\nimport type { Journal } from \"./journal.js\";\nimport type { Logger } from \"./logger.js\";\nimport { applyChaosAsync } from \"./chaos.js\";\nimport { planMisbehavior, recordMisbehaviorOutcome } from \"./misbehavior.js\";\nimport { prepareClaudeMisbehavior } from \"./messages.js\";\nimport { proxyAndRecord } from \"./recorder.js\";\nimport { mapAnthropicFinish } from \"./response/finish.js\";\nimport {\n resolve as resolveAnthropicUsage,\n render as renderAnthropicUsage,\n} from \"./response/usage/codecs/anthropic.js\";\n\n// ─── Bedrock Claude request types ────────────────────────────────────────────\n\ninterface BedrockContentBlock {\n type: \"text\" | \"tool_use\" | \"tool_result\" | \"image\" | \"document\";\n text?: string;\n id?: string;\n name?: string;\n input?: unknown;\n tool_use_id?: string;\n content?: string | BedrockContentBlock[];\n is_error?: boolean;\n}\n\ninterface BedrockMessage {\n role: \"user\" | \"assistant\";\n content: string | BedrockContentBlock[];\n}\n\ninterface BedrockToolDef {\n name: string;\n description?: string;\n input_schema?: object;\n}\n\ninterface BedrockRequest {\n anthropic_version?: string;\n messages: BedrockMessage[];\n system?: string | BedrockContentBlock[];\n tools?: BedrockToolDef[];\n tool_choice?: unknown;\n max_tokens: number;\n temperature?: number;\n [key: string]: unknown;\n}\n\n// ─── Bedrock stop_reason mapping ───────────────────────────────────────────\n\nfunction bedrockStopReason(\n overrideFinishReason: string | undefined,\n defaultReason: string,\n): string {\n if (!overrideFinishReason) return defaultReason;\n return mapAnthropicFinish(overrideFinishReason);\n}\n\n// ─── Input conversion: Bedrock → ChatCompletionRequest ──────────────────────\n\nfunction extractTextContent(content: string | BedrockContentBlock[] | null | undefined): string {\n if (content === null || content === undefined) return \"\";\n if (typeof content === \"string\") return content;\n return content\n .filter((b) => b !== null && b !== undefined && b.type === \"text\")\n .map((b) => b.text ?? \"\")\n .join(\"\");\n}\n\nexport function bedrockToCompletionRequest(\n req: BedrockRequest,\n modelId: string,\n logger?: Logger,\n): ChatCompletionRequest {\n const messages: ChatMessage[] = [];\n\n // system field → system message\n if (req.system) {\n const systemText =\n typeof req.system === \"string\"\n ? req.system\n : Array.isArray(req.system)\n ? req.system\n .filter((b) => b !== null && b !== undefined && b.type === \"text\")\n .map((b) => b.text ?? \"\")\n .join(\"\")\n : \"\";\n if (systemText) {\n messages.push({ role: \"system\", content: systemText });\n }\n }\n\n for (const msg of req.messages) {\n if (msg.role === \"user\") {\n // Check for tool_result blocks\n if (typeof msg.content !== \"string\" && Array.isArray(msg.content)) {\n // Warn about non-text content blocks that will be dropped (image, document, etc.)\n const unsupportedBlocks = msg.content.filter(\n (b) => b === null || b === undefined || (b.type !== \"text\" && b.type !== \"tool_result\"),\n );\n if (unsupportedBlocks.length > 0 && logger) {\n const types = [...new Set(unsupportedBlocks.map((b) => b.type))].join(\", \");\n logger.warn(\n `Bedrock user message contains unsupported content block types [${types}] — these will be dropped during conversion`,\n );\n }\n\n const toolResults = msg.content.filter(\n (b) => b !== null && b !== undefined && b.type === \"tool_result\",\n );\n const textBlocks = msg.content.filter(\n (b) => b !== null && b !== undefined && b.type === \"text\",\n );\n\n if (toolResults.length > 0) {\n for (const tr of toolResults) {\n const resultContent =\n typeof tr.content === \"string\"\n ? tr.content\n : Array.isArray(tr.content)\n ? tr.content\n .filter((b) => b !== null && b !== undefined && b.type === \"text\")\n .map((b) => b.text ?? \"\")\n .join(\"\")\n : \"\";\n messages.push({\n role: \"tool\",\n content: resultContent,\n tool_call_id: tr.tool_use_id,\n });\n }\n if (textBlocks.length > 0) {\n messages.push({\n role: \"user\",\n content: textBlocks.map((b) => b.text ?? \"\").join(\"\"),\n });\n }\n continue;\n }\n }\n messages.push({\n role: \"user\",\n content: extractTextContent(msg.content),\n });\n } else if (msg.role === \"assistant\") {\n if (typeof msg.content === \"string\") {\n messages.push({ role: \"assistant\", content: msg.content });\n } else if (Array.isArray(msg.content)) {\n const toolUseBlocks = msg.content.filter(\n (b) => b !== null && b !== undefined && b.type === \"tool_use\",\n );\n const textContent = extractTextContent(msg.content);\n\n if (toolUseBlocks.length > 0) {\n messages.push({\n role: \"assistant\",\n content: textContent || null,\n tool_calls: toolUseBlocks.map((b, index) => {\n if (!b.id && logger) {\n logger.warn(\n `Bedrock assistant tool_use block at index ${index} is missing an id — using deterministic fallback \"tool_use_${index}\"`,\n );\n }\n return {\n id: b.id ?? `tool_use_${index}`,\n type: \"function\" as const,\n function: {\n name: b.name ?? \"\",\n arguments: typeof b.input === \"string\" ? b.input : JSON.stringify(b.input ?? {}),\n },\n };\n }),\n });\n } else {\n messages.push({ role: \"assistant\", content: textContent || null });\n }\n } else {\n messages.push({ role: \"assistant\", content: null });\n }\n } else {\n if (logger) {\n logger.warn(\n `Bedrock message has unexpected role \"${(msg as { role: string }).role}\" — skipping`,\n );\n }\n }\n }\n\n // Convert tools\n let tools: ToolDefinition[] | undefined;\n if (req.tools && req.tools.length > 0) {\n tools = req.tools.map((t) => ({\n type: \"function\" as const,\n function: {\n name: t.name,\n description: t.description,\n parameters: t.input_schema,\n },\n }));\n }\n\n return {\n model: modelId,\n messages,\n stream: false,\n temperature: req.temperature,\n max_tokens: req.max_tokens,\n tools,\n };\n}\n\n// ─── Response builders ──────────────────────────────────────────────────────\n\nfunction buildBedrockTextResponse(\n content: string,\n model: string,\n reasoning?: string,\n overrides?: ResponseOverrides,\n): object {\n const contentBlocks: object[] = [];\n if (reasoning) {\n contentBlocks.push({ type: \"thinking\", thinking: reasoning, signature: \"\" });\n }\n contentBlocks.push({ type: \"text\", text: content });\n\n return {\n id: overrides?.id ?? generateMessageId(),\n type: \"message\",\n role: \"assistant\",\n content: contentBlocks,\n model: overrides?.model ?? model,\n stop_reason: bedrockStopReason(overrides?.finishReason, \"end_turn\"),\n stop_sequence: null,\n usage: renderAnthropicUsage(resolveAnthropicUsage(overrides), \"bedrock-final\"),\n };\n}\n\nfunction buildBedrockToolCallResponse(\n toolCalls: ToolCall[],\n model: string,\n logger: Logger,\n reasoning?: string,\n overrides?: ResponseOverrides,\n): object {\n const contentBlocks: object[] = [];\n // Thinking block (emitted before tool_use blocks when reasoning is present)\n if (reasoning) {\n contentBlocks.push({ type: \"thinking\", thinking: reasoning, signature: \"\" });\n }\n for (const tc of toolCalls) {\n const args = servedToolArgs(tc, \"object\", logger);\n contentBlocks.push({\n type: \"tool_use\",\n id: tc.id || generateToolUseId(),\n name: tc.name,\n input: args.value,\n });\n }\n return {\n id: overrides?.id ?? generateMessageId(),\n type: \"message\",\n role: \"assistant\",\n content: contentBlocks,\n model: overrides?.model ?? model,\n stop_reason: bedrockStopReason(overrides?.finishReason, \"tool_use\"),\n stop_sequence: null,\n usage: renderAnthropicUsage(resolveAnthropicUsage(overrides), \"bedrock-final\"),\n };\n}\n\n/**\n * Build a Bedrock-invoke (Anthropic-style) non-streaming response whose\n * `content[]` array honors the fixture's ordered `blocks`. Bedrock-invoke\n * mirrors the Anthropic Messages content array, which is positionally\n * observable, so a `toolCall` block ahead of a `text` block yields a `tool_use`\n * content entry ahead of the `text` entry (tool-first is wire-expressible).\n *\n * Any leading thinking block (when reasoning is present) precedes the ordered\n * blocks, matching the legacy builders. Reached only when `blocks` is non-empty;\n * the legacy `{content, toolCalls}` text-first path is untouched.\n */\nfunction buildBedrockBlocksResponse(\n blocks: FixtureBlock[],\n model: string,\n logger: Logger,\n reasoning?: string,\n overrides?: ResponseOverrides,\n): object {\n const contentBlocks: object[] = [];\n if (reasoning) {\n contentBlocks.push({ type: \"thinking\", thinking: reasoning, signature: \"\" });\n }\n\n const outcome = resolveFixtureBlockOutcome(blocks);\n const ordered = outcome.ordered;\n for (const block of ordered) {\n if (block.type === \"text\") {\n contentBlocks.push({ type: \"text\", text: block.text });\n } else {\n const args = servedToolArgs(block, \"object\", logger);\n contentBlocks.push({\n type: \"tool_use\",\n id: block.id || generateToolUseId(),\n name: block.name,\n input: args.value,\n });\n }\n }\n\n return {\n id: overrides?.id ?? generateMessageId(),\n type: \"message\",\n role: \"assistant\",\n content: contentBlocks,\n model: overrides?.model ?? model,\n stop_reason: bedrockStopReason(\n overrides?.finishReason,\n outcome.hasToolCalls ? \"tool_use\" : \"end_turn\",\n ),\n stop_sequence: null,\n usage: renderAnthropicUsage(resolveAnthropicUsage(overrides), \"bedrock-final\"),\n };\n}\n\n// ─── Request handler ────────────────────────────────────────────────────────\n\nexport async function handleBedrock(\n req: http.IncomingMessage,\n res: http.ServerResponse,\n raw: string,\n modelId: string,\n fixtures: Fixture[],\n journal: Journal,\n defaults: HandlerDefaults,\n setCorsHeaders: (res: http.ServerResponse) => void,\n): Promise<void> {\n const { logger } = defaults;\n setCorsHeaders(res);\n\n const urlPath = req.url ?? `/model/${modelId}/invoke`;\n\n let bedrockReq: BedrockRequest;\n try {\n bedrockReq = JSON.parse(raw) as BedrockRequest;\n } catch (parseErr) {\n const detail = parseErr instanceof Error ? parseErr.message : \"unknown\";\n journal.add({\n method: req.method ?? \"POST\",\n path: urlPath,\n headers: flattenHeaders(req.headers),\n body: null,\n response: { status: 400, fixture: null },\n });\n writeErrorResponse(\n res,\n 400,\n renderError(\"bedrock\", \"validation\", {\n message: `Malformed JSON: ${detail}`,\n type: \"invalid_request_error\",\n }).body,\n );\n return;\n }\n\n // Reject non-object bodies (e.g. `null`) before touching fields —\n // otherwise `bedrockReq.messages` throws a TypeError that surfaces as a 500\n // instead of a 400.\n if (!isJsonObject(bedrockReq)) {\n journal.add({\n method: req.method ?? \"POST\",\n path: urlPath,\n headers: flattenHeaders(req.headers),\n body: null,\n response: { status: 400, fixture: null },\n });\n writeErrorResponse(\n res,\n 400,\n renderError(\"bedrock\", \"validation\", {\n message: \"Request body must be a JSON object\",\n type: \"invalid_request_error\",\n }).body,\n );\n return;\n }\n\n // Reject wrong-typed fields before the converter dereferences them. A\n // missing/non-array `messages` keeps the historic message below.\n const bedrockShapeError =\n validateChatMessages(bedrockReq.messages, { checkToolCalls: false }) ??\n validateToolsField(bedrockReq.tools) ??\n (bedrockReq.system !== undefined &&\n bedrockReq.system !== null &&\n typeof bedrockReq.system !== \"string\" &&\n !Array.isArray(bedrockReq.system)\n ? \"system must be a string or an array\"\n : null);\n if (bedrockShapeError) {\n journal.add({\n method: req.method ?? \"POST\",\n path: urlPath,\n headers: flattenHeaders(req.headers),\n body: null,\n response: { status: 400, fixture: null },\n });\n writeErrorResponse(\n res,\n 400,\n renderError(\"bedrock\", \"validation\", {\n message: `Invalid request: ${bedrockShapeError}`,\n type: \"invalid_request_error\",\n }).body,\n );\n return;\n }\n\n // Convert to ChatCompletionRequest for fixture matching\n const completionReq = bedrockToCompletionRequest(bedrockReq, modelId, logger);\n completionReq._endpointType = \"chat\";\n completionReq._context = getContext(req);\n\n const testId = getTestId(req);\n const { fixture, skippedBySequenceOrTurn } = matchFixtureDiagnostic(\n fixtures,\n completionReq,\n journal.getFixtureMatchCountsForTest(testId),\n defaults.requestTransform,\n // Record mode proxies on a miss to capture a fresh turn (see record gate\n // below), so keep turnIndex strict to prevent an earlier-turn fixture from\n // shadowing a longer request and skipping the new turn's recording.\n { ...recordMatchOptions(!!defaults.record, defaults.logger), wire: \"bedrock-invoke\" },\n );\n\n if (fixture) {\n logger.debug(`Fixture matched: ${JSON.stringify(fixture.match).slice(0, 120)}`);\n } else {\n logger.debug(`No fixture matched for request`);\n }\n\n if (fixture) {\n journal.incrementFixtureMatchCount(fixture, fixtures, testId);\n }\n\n if (\n await applyChaosAsync(\n res,\n fixture,\n defaults.chaos,\n req.headers,\n req.url,\n journal,\n {\n method: req.method ?? \"POST\",\n path: urlPath,\n headers: flattenHeaders(req.headers),\n body: completionReq,\n },\n fixture ? \"fixture\" : \"proxy\",\n defaults.registry,\n defaults.logger,\n )\n )\n return;\n\n if (!fixture) {\n const effectiveStrict = resolveRequestDecisions(defaults.strict, req.headers).fixtureMiss;\n if (effectiveStrict) {\n const strictStatus = 503;\n const strictMessage = strictNoMatchMessage(skippedBySequenceOrTurn);\n logger.error(strictNoMatchLogLine(req.method ?? \"POST\", urlPath, skippedBySequenceOrTurn));\n journal.add({\n method: req.method ?? \"POST\",\n path: urlPath,\n headers: flattenHeaders(req.headers),\n body: completionReq,\n response: {\n status: strictStatus,\n fixture: null,\n ...strictOverrideField(defaults.strict, req.headers),\n },\n });\n writeErrorResponse(\n res,\n strictStatus,\n renderError(\"bedrock\", \"strict-miss\", {\n message: strictMessage,\n type: \"invalid_request_error\",\n }).body,\n );\n return;\n }\n if (defaults.record) {\n const { outcome, clientHungUp } = await withHangUpDetection(req, res, () =>\n proxyAndRecord(req, res, completionReq, \"bedrock\", urlPath, fixtures, defaults, raw),\n );\n if (outcome === \"handled_by_hook\") return;\n if (outcome !== \"not_configured\") {\n journal.add({\n method: req.method ?? \"POST\",\n path: urlPath,\n headers: flattenHeaders(req.headers),\n body: completionReq,\n response: {\n status: res.statusCode ?? 200,\n fixture: null,\n source: \"proxy\",\n ...proxyInterruption(res, clientHungUp),\n },\n });\n return;\n }\n }\n journal.add({\n method: req.method ?? \"POST\",\n path: urlPath,\n headers: flattenHeaders(req.headers),\n body: completionReq,\n response: {\n status: 404,\n fixture: null,\n ...strictOverrideField(defaults.strict, req.headers),\n },\n });\n writeErrorResponse(\n res,\n 404,\n renderError(\"bedrock\", \"fixture-miss\", {\n message: \"No fixture matched\",\n type: \"invalid_request_error\",\n }).body,\n );\n return;\n }\n\n const response = await resolveResponse(fixture, completionReq);\n const misbehavior = planMisbehavior({\n wire: \"bedrock-invoke\",\n emitsToolCallIds: true,\n fixture,\n response,\n request: completionReq,\n stream: completionReq.stream === true,\n defaults,\n rawHeaders: req.headers,\n url: req.url,\n });\n const addResponseEntry = (input: Parameters<Journal[\"add\"]>[0]) => {\n const entry = journal.add(input);\n recordMisbehaviorOutcome({ entry, summary: misbehavior.summary, defaults, testId });\n return entry;\n };\n if (misbehavior.kind === \"error\") {\n if (!misbehavior.summary?.evaluations.length) {\n logger.error(`[misbehavior] ${misbehavior.message}`);\n }\n addResponseEntry({\n method: req.method ?? \"POST\",\n path: urlPath,\n headers: flattenHeaders(req.headers),\n body: completionReq,\n response: { status: misbehavior.status, fixture },\n });\n const type = misbehavior.status === 400 ? \"ValidationException\" : \"NotImplementedException\";\n const renderedError = renderError(\"bedrock\", \"misbehavior\", {\n type,\n code: misbehavior.code,\n message: misbehavior.message,\n });\n for (const [name, value] of Object.entries(renderedError.headers ?? {}))\n res.setHeader(name, value);\n writeErrorResponse(res, misbehavior.status, renderedError.body);\n return;\n }\n const chunkSize = Math.max(1, fixture.chunkSize ?? defaults.chunkSize);\n const jsonOpts = (payloadLength: number, duplicateId = false) => ({\n surface: \"other\" as const,\n payloadLength,\n chunkSize,\n recordedTimings: fixture.recordedTimings,\n duplicateId,\n replaySpeed: fixture.replaySpeed ?? defaults.replaySpeed,\n });\n\n if (misbehavior.kind === \"applied\") {\n const prepared = prepareClaudeMisbehavior(misbehavior, {\n request: completionReq,\n stream: false,\n chunkSize,\n logger,\n strict: resolveRequestDecisions(defaults.strict, req.headers).reasoningSuppression,\n citations: false,\n });\n if (prepared.stream) throw new TypeError(\"InvokeModel requires non-stream Claude output\");\n const entry = journal.add({\n method: req.method ?? \"POST\",\n path: urlPath,\n headers: flattenHeaders(req.headers),\n body: completionReq,\n response: { status: 200, fixture },\n });\n recordMisbehaviorOutcome({ entry, summary: prepared.plan.summary, defaults, testId });\n const preparedBody = prepared.body;\n await deliverJson(\n res,\n entry,\n fixture,\n () => preparedBody,\n jsonOpts(\n misbehaviorPayloadLength(\n misbehavior,\n misbehavior.reasoning === undefined ? prepared.reasoning : undefined,\n ),\n !!misbehavior.duplicateId,\n ),\n );\n return;\n }\n\n // Raw passthrough (#549): the authored events or JSON, framed for this wire.\n if (isRawResponse(response)) {\n await serveRawResponse({\n wire: \"bedrock-invoke\",\n stream: false,\n req,\n res,\n fixture,\n response,\n body: completionReq,\n journal,\n defaults,\n testId,\n misbehaviorSummary: misbehavior.summary,\n errorWire: \"bedrock\",\n });\n return;\n }\n\n // Error response\n if (isErrorResponse(response)) {\n const status = response.status ?? 500;\n addResponseEntry({\n method: req.method ?? \"POST\",\n path: urlPath,\n headers: flattenHeaders(req.headers),\n body: completionReq,\n response: { status, fixture },\n });\n // Bedrock Claude error format: { type: \"error\", error: { type, message } }\n // Uses ?? (nullish coalescing) intentionally — preserves explicit empty-string types from fixtures.\n writeErrorResponse(res, status, renderError(\"bedrock\", \"fixture\", response.error).body, {\n retryAfter: response.retryAfter,\n });\n return;\n }\n\n // Content + tool calls response\n if (isCombinedFixtureResponse(response)) {\n if (response.webSearches?.length) {\n logger.warn(\"webSearches in fixture response are not supported for Bedrock API — ignoring\");\n }\n const overrides = extractOverrides(response);\n const effReasoning = resolveReasoningForModel(\n response.reasoning,\n completionReq.model,\n resolveRequestDecisions(defaults.strict, req.headers).reasoningSuppression,\n logger,\n );\n const journalEntry = addResponseEntry({\n method: req.method ?? \"POST\",\n path: urlPath,\n headers: flattenHeaders(req.headers),\n body: completionReq,\n response: { status: 200, fixture },\n });\n const functionToolCalls = requireEmittedFunctionToolCalls(response, \"Bedrock InvokeModel\");\n const blocks = response.blocks;\n if (blocks && blocks.length > 0) {\n // NEW PATH: honor the fixture's ordered `blocks` in the positionally\n // observable Anthropic-style content array (tool-first expressible).\n await deliverJson(\n res,\n journalEntry,\n fixture,\n () =>\n buildBedrockBlocksResponse(blocks, completionReq.model, logger, effReasoning, overrides),\n jsonOpts(servedPayloadLength(response, effReasoning)),\n );\n return;\n }\n await deliverJson(\n res,\n journalEntry,\n fixture,\n () => {\n const textBody = buildBedrockTextResponse(\n response.content ?? \"\",\n completionReq.model,\n effReasoning,\n overrides,\n );\n const toolBody = buildBedrockToolCallResponse(\n functionToolCalls,\n completionReq.model,\n logger,\n // Reasoning is rendered by the text response in this merged path; pass\n // undefined here to avoid emitting a duplicate thinking block.\n undefined,\n overrides,\n );\n // Merge: take the text response as base, append tool_use blocks, set stop_reason to tool_use\n return {\n ...(textBody as Record<string, unknown>),\n content: [\n ...((textBody as Record<string, unknown>).content as object[]),\n ...((toolBody as Record<string, unknown>).content as object[]),\n ],\n stop_reason: bedrockStopReason(overrides?.finishReason, \"tool_use\"),\n };\n },\n jsonOpts(servedPayloadLength(response, effReasoning)),\n );\n return;\n }\n\n // Text response\n if (isTextResponse(response)) {\n if (response.webSearches?.length) {\n logger.warn(\"webSearches in fixture response are not supported for Bedrock API — ignoring\");\n }\n const overrides = extractOverrides(response);\n const effReasoning = resolveReasoningForModel(\n response.reasoning,\n completionReq.model,\n resolveRequestDecisions(defaults.strict, req.headers).reasoningSuppression,\n logger,\n );\n const journalEntry = addResponseEntry({\n method: req.method ?? \"POST\",\n path: urlPath,\n headers: flattenHeaders(req.headers),\n body: completionReq,\n response: { status: 200, fixture },\n });\n await deliverJson(\n res,\n journalEntry,\n fixture,\n () =>\n buildBedrockTextResponse(response.content, completionReq.model, effReasoning, overrides),\n jsonOpts(servedPayloadLength(response, effReasoning)),\n );\n return;\n }\n\n // Tool call response\n if (isToolCallResponse(response)) {\n if (response.webSearches?.length) {\n logger.warn(\"webSearches in fixture response are not supported for Bedrock API — ignoring\");\n }\n const overrides = extractOverrides(response);\n const effReasoning = resolveReasoningForModel(\n response.reasoning,\n completionReq.model,\n resolveRequestDecisions(defaults.strict, req.headers).reasoningSuppression,\n logger,\n );\n const journalEntry = addResponseEntry({\n method: req.method ?? \"POST\",\n path: urlPath,\n headers: flattenHeaders(req.headers),\n body: completionReq,\n response: { status: 200, fixture },\n });\n const functionToolCalls = requireEmittedFunctionToolCalls(response, \"Bedrock InvokeModel\");\n await deliverJson(\n res,\n journalEntry,\n fixture,\n () =>\n buildBedrockToolCallResponse(\n functionToolCalls,\n completionReq.model,\n logger,\n effReasoning,\n overrides,\n ),\n jsonOpts(servedPayloadLength(response, effReasoning)),\n );\n return;\n }\n\n // Unknown response type\n addResponseEntry({\n method: req.method ?? \"POST\",\n path: urlPath,\n headers: flattenHeaders(req.headers),\n body: completionReq,\n response: { status: 500, fixture },\n });\n writeErrorResponse(\n res,\n 500,\n renderError(\"bedrock\", \"unknown-response\", {\n message: \"Fixture response did not match any known type\",\n type: \"server_error\",\n }).body,\n );\n}\n\n// ─── Streaming event builders ───────────────────────────────────────────────\n\nconst BEDROCK_INVOKE_STREAM_EVENT_TYPE = \"chunk\";\n/** Serialize Claude events as InvokeModel PayloadPart, leaving generic AWS framing unchanged. */\nconst bedrockInvokeCodec = eventStreamCodec<{ eventType: string; payload: object }>((event) =>\n encodeEventStreamMessage(event.eventType, {\n bytes: Buffer.from(JSON.stringify(event.payload), \"utf8\").toString(\"base64\"),\n }),\n);\n\nfunction buildBedrockInvokeMessageStart(\n model: string,\n overrides?: ResponseOverrides,\n): { eventType: string; payload: object } {\n return {\n eventType: BEDROCK_INVOKE_STREAM_EVENT_TYPE,\n payload: {\n type: \"message_start\",\n message: {\n id: overrides?.id ?? generateMessageId(),\n type: \"message\",\n role: \"assistant\",\n content: [],\n model: overrides?.model ?? model,\n stop_reason: null,\n stop_sequence: null,\n usage: renderAnthropicUsage(resolveAnthropicUsage(overrides), \"bedrock-start\"),\n },\n },\n };\n}\n\nfunction buildBedrockInvokeMessageDelta(\n stopReason: string,\n overrides?: ResponseOverrides,\n): {\n eventType: string;\n payload: object;\n} {\n return {\n eventType: BEDROCK_INVOKE_STREAM_EVENT_TYPE,\n payload: {\n type: \"message_delta\",\n delta: { stop_reason: stopReason, stop_sequence: null },\n usage: renderAnthropicUsage(resolveAnthropicUsage(overrides), \"bedrock-delta\"),\n },\n };\n}\n\nfunction buildBedrockInvokeMessageStop(): { eventType: string; payload: object } {\n return {\n eventType: BEDROCK_INVOKE_STREAM_EVENT_TYPE,\n payload: { type: \"message_stop\" },\n };\n}\n\nfunction parseToolArgumentsForStream(toolCall: ToolCall, logger: Logger): string {\n return servedToolArgs(toolCall, \"string\", logger).text;\n}\n\nexport function buildBedrockStreamTextEvents(\n content: string,\n model: string,\n chunkSize: number,\n reasoning?: string,\n overrides?: ResponseOverrides,\n): Array<{ eventType: string; payload: object }> {\n const events: Array<{ eventType: string; payload: object }> = [];\n\n events.push(buildBedrockInvokeMessageStart(model, overrides));\n\n // Thinking block (emitted before text when reasoning is present)\n if (reasoning) {\n const blockIndex = 0;\n events.push({\n eventType: BEDROCK_INVOKE_STREAM_EVENT_TYPE,\n payload: {\n type: \"content_block_start\",\n index: blockIndex,\n content_block: { type: \"thinking\", thinking: \"\", signature: \"\" },\n },\n });\n\n for (let i = 0; i < reasoning.length; i += chunkSize) {\n const slice = reasoning.slice(i, i + chunkSize);\n events.push({\n eventType: BEDROCK_INVOKE_STREAM_EVENT_TYPE,\n payload: {\n type: \"content_block_delta\",\n index: blockIndex,\n delta: { type: \"thinking_delta\", thinking: slice },\n },\n });\n }\n\n events.push({\n eventType: BEDROCK_INVOKE_STREAM_EVENT_TYPE,\n payload: {\n type: \"content_block_delta\",\n index: blockIndex,\n delta: { type: \"signature_delta\", signature: \"\" },\n },\n });\n\n events.push({\n eventType: BEDROCK_INVOKE_STREAM_EVENT_TYPE,\n payload: { type: \"content_block_stop\", index: blockIndex },\n });\n }\n\n // Text block\n const textBlockIndex = reasoning ? 1 : 0;\n\n events.push({\n eventType: BEDROCK_INVOKE_STREAM_EVENT_TYPE,\n payload: {\n type: \"content_block_start\",\n index: textBlockIndex,\n content_block: { type: \"text\", text: \"\" },\n },\n });\n\n for (let i = 0; i < content.length; i += chunkSize) {\n const slice = content.slice(i, i + chunkSize);\n events.push({\n eventType: BEDROCK_INVOKE_STREAM_EVENT_TYPE,\n payload: {\n type: \"content_block_delta\",\n index: textBlockIndex,\n delta: { type: \"text_delta\", text: slice },\n },\n });\n }\n\n events.push({\n eventType: BEDROCK_INVOKE_STREAM_EVENT_TYPE,\n payload: { type: \"content_block_stop\", index: textBlockIndex },\n });\n\n events.push(\n buildBedrockInvokeMessageDelta(\n bedrockStopReason(overrides?.finishReason, \"end_turn\"),\n overrides,\n ),\n );\n events.push(buildBedrockInvokeMessageStop());\n\n return events;\n}\n\nexport function buildBedrockStreamContentWithToolCallsEvents(\n content: string,\n toolCalls: ToolCall[],\n model: string,\n chunkSize: number,\n logger: Logger,\n reasoning?: string,\n overrides?: ResponseOverrides,\n blocks?: FixtureBlock[],\n): Array<{ eventType: string; payload: object }> {\n const events: Array<{ eventType: string; payload: object }> = [];\n\n events.push(buildBedrockInvokeMessageStart(model, overrides));\n\n let blockIndex = 0;\n\n // Thinking block (emitted before text/tool_use when reasoning is present);\n // shared by both the legacy and the ordered-`blocks` paths.\n if (reasoning) {\n events.push({\n eventType: BEDROCK_INVOKE_STREAM_EVENT_TYPE,\n payload: {\n type: \"content_block_start\",\n index: blockIndex,\n content_block: { type: \"thinking\", thinking: \"\", signature: \"\" },\n },\n });\n for (let i = 0; i < reasoning.length; i += chunkSize) {\n const slice = reasoning.slice(i, i + chunkSize);\n events.push({\n eventType: BEDROCK_INVOKE_STREAM_EVENT_TYPE,\n payload: {\n type: \"content_block_delta\",\n index: blockIndex,\n delta: { type: \"thinking_delta\", thinking: slice },\n },\n });\n }\n events.push({\n eventType: BEDROCK_INVOKE_STREAM_EVENT_TYPE,\n payload: {\n type: \"content_block_delta\",\n index: blockIndex,\n delta: { type: \"signature_delta\", signature: \"\" },\n },\n });\n events.push({\n eventType: BEDROCK_INVOKE_STREAM_EVENT_TYPE,\n payload: { type: \"content_block_stop\", index: blockIndex },\n });\n blockIndex++;\n }\n\n if (blocks && blocks.length > 0) {\n // NEW PATH: emit `text`/`tool_use` content_block events in the fixture's\n // array order. Bedrock-invoke binary `content_block_*` events are\n // positional, so a `toolCall` block can take a lower `index` than a `text`\n // block (tool-first is wire-expressible). Indices continue from any leading\n // thinking block above.\n const outcome = resolveFixtureBlockOutcome(blocks);\n const ordered = outcome.ordered;\n for (const block of ordered) {\n if (block.type === \"text\") {\n events.push({\n eventType: BEDROCK_INVOKE_STREAM_EVENT_TYPE,\n payload: {\n type: \"content_block_start\",\n index: blockIndex,\n content_block: { type: \"text\", text: \"\" },\n },\n });\n for (let i = 0; i < block.text.length; i += chunkSize) {\n const slice = block.text.slice(i, i + chunkSize);\n events.push({\n eventType: BEDROCK_INVOKE_STREAM_EVENT_TYPE,\n payload: {\n type: \"content_block_delta\",\n index: blockIndex,\n delta: { type: \"text_delta\", text: slice },\n },\n });\n }\n events.push({\n eventType: BEDROCK_INVOKE_STREAM_EVENT_TYPE,\n payload: { type: \"content_block_stop\", index: blockIndex },\n });\n blockIndex++;\n } else {\n const toolUseId = block.id || generateToolUseId();\n events.push({\n eventType: BEDROCK_INVOKE_STREAM_EVENT_TYPE,\n payload: {\n type: \"content_block_start\",\n index: blockIndex,\n content_block: {\n type: \"tool_use\",\n id: toolUseId,\n name: block.name,\n input: {},\n },\n },\n });\n const argsStr = parseToolArgumentsForStream(\n { name: block.name, arguments: block.arguments } as ToolCall,\n logger,\n );\n for (let i = 0; i < argsStr.length; i += chunkSize) {\n const slice = argsStr.slice(i, i + chunkSize);\n events.push({\n eventType: BEDROCK_INVOKE_STREAM_EVENT_TYPE,\n payload: {\n type: \"content_block_delta\",\n index: blockIndex,\n delta: { type: \"input_json_delta\", partial_json: slice },\n },\n });\n }\n events.push({\n eventType: BEDROCK_INVOKE_STREAM_EVENT_TYPE,\n payload: { type: \"content_block_stop\", index: blockIndex },\n });\n blockIndex++;\n }\n }\n\n events.push(\n buildBedrockInvokeMessageDelta(\n bedrockStopReason(overrides?.finishReason, outcome.hasToolCalls ? \"tool_use\" : \"end_turn\"),\n overrides,\n ),\n );\n events.push(buildBedrockInvokeMessageStop());\n return events;\n }\n\n // LEGACY PATH (unchanged): text block, then tool_use blocks in toolCalls order.\n // Text block\n events.push({\n eventType: BEDROCK_INVOKE_STREAM_EVENT_TYPE,\n payload: {\n type: \"content_block_start\",\n index: blockIndex,\n content_block: { type: \"text\", text: \"\" },\n },\n });\n for (let i = 0; i < content.length; i += chunkSize) {\n const slice = content.slice(i, i + chunkSize);\n events.push({\n eventType: BEDROCK_INVOKE_STREAM_EVENT_TYPE,\n payload: {\n type: \"content_block_delta\",\n index: blockIndex,\n delta: { type: \"text_delta\", text: slice },\n },\n });\n }\n events.push({\n eventType: BEDROCK_INVOKE_STREAM_EVENT_TYPE,\n payload: { type: \"content_block_stop\", index: blockIndex },\n });\n blockIndex++;\n\n // Tool call blocks\n for (let tcIdx = 0; tcIdx < toolCalls.length; tcIdx++) {\n const tc = toolCalls[tcIdx];\n const toolUseId = tc.id || generateToolUseId();\n const currentBlock = blockIndex + tcIdx;\n\n events.push({\n eventType: BEDROCK_INVOKE_STREAM_EVENT_TYPE,\n payload: {\n type: \"content_block_start\",\n index: currentBlock,\n content_block: {\n type: \"tool_use\",\n id: toolUseId,\n name: tc.name,\n input: {},\n },\n },\n });\n\n const argsStr = parseToolArgumentsForStream(tc, logger);\n\n for (let i = 0; i < argsStr.length; i += chunkSize) {\n const slice = argsStr.slice(i, i + chunkSize);\n events.push({\n eventType: BEDROCK_INVOKE_STREAM_EVENT_TYPE,\n payload: {\n type: \"content_block_delta\",\n index: currentBlock,\n delta: { type: \"input_json_delta\", partial_json: slice },\n },\n });\n }\n\n events.push({\n eventType: BEDROCK_INVOKE_STREAM_EVENT_TYPE,\n payload: { type: \"content_block_stop\", index: currentBlock },\n });\n }\n\n events.push(\n buildBedrockInvokeMessageDelta(\n bedrockStopReason(overrides?.finishReason, \"tool_use\"),\n overrides,\n ),\n );\n events.push(buildBedrockInvokeMessageStop());\n\n return events;\n}\n\nexport function buildBedrockStreamToolCallEvents(\n toolCalls: ToolCall[],\n model: string,\n chunkSize: number,\n logger: Logger,\n reasoning?: string,\n overrides?: ResponseOverrides,\n): Array<{ eventType: string; payload: object }> {\n const events: Array<{ eventType: string; payload: object }> = [];\n\n events.push(buildBedrockInvokeMessageStart(model, overrides));\n\n // Leading reasoning block shifts every subsequent tool_use block index by 1.\n let blockIndex = 0;\n\n // Thinking block (emitted before tool_use blocks when reasoning is present)\n if (reasoning) {\n events.push({\n eventType: BEDROCK_INVOKE_STREAM_EVENT_TYPE,\n payload: {\n type: \"content_block_start\",\n index: blockIndex,\n content_block: { type: \"thinking\", thinking: \"\", signature: \"\" },\n },\n });\n for (let i = 0; i < reasoning.length; i += chunkSize) {\n const slice = reasoning.slice(i, i + chunkSize);\n events.push({\n eventType: BEDROCK_INVOKE_STREAM_EVENT_TYPE,\n payload: {\n type: \"content_block_delta\",\n index: blockIndex,\n delta: { type: \"thinking_delta\", thinking: slice },\n },\n });\n }\n events.push({\n eventType: BEDROCK_INVOKE_STREAM_EVENT_TYPE,\n payload: {\n type: \"content_block_delta\",\n index: blockIndex,\n delta: { type: \"signature_delta\", signature: \"\" },\n },\n });\n events.push({\n eventType: BEDROCK_INVOKE_STREAM_EVENT_TYPE,\n payload: { type: \"content_block_stop\", index: blockIndex },\n });\n blockIndex++;\n }\n\n for (let tcIdx = 0; tcIdx < toolCalls.length; tcIdx++) {\n const tc = toolCalls[tcIdx];\n const toolUseId = tc.id || generateToolUseId();\n const currentBlock = blockIndex + tcIdx;\n\n events.push({\n eventType: BEDROCK_INVOKE_STREAM_EVENT_TYPE,\n payload: {\n type: \"content_block_start\",\n index: currentBlock,\n content_block: {\n type: \"tool_use\",\n id: toolUseId,\n name: tc.name,\n input: {},\n },\n },\n });\n\n const argsStr = parseToolArgumentsForStream(tc, logger);\n\n for (let i = 0; i < argsStr.length; i += chunkSize) {\n const slice = argsStr.slice(i, i + chunkSize);\n events.push({\n eventType: BEDROCK_INVOKE_STREAM_EVENT_TYPE,\n payload: {\n type: \"content_block_delta\",\n index: currentBlock,\n delta: { type: \"input_json_delta\", partial_json: slice },\n },\n });\n }\n\n events.push({\n eventType: BEDROCK_INVOKE_STREAM_EVENT_TYPE,\n payload: { type: \"content_block_stop\", index: currentBlock },\n });\n }\n\n events.push(\n buildBedrockInvokeMessageDelta(\n bedrockStopReason(overrides?.finishReason, \"tool_use\"),\n overrides,\n ),\n );\n events.push(buildBedrockInvokeMessageStop());\n\n return events;\n}\n\n// ─── Streaming request handler ──────────────────────────────────────────────\n\nexport async function handleBedrockStream(\n req: http.IncomingMessage,\n res: http.ServerResponse,\n raw: string,\n modelId: string,\n fixtures: Fixture[],\n journal: Journal,\n defaults: HandlerDefaults,\n setCorsHeaders: (res: http.ServerResponse) => void,\n): Promise<void> {\n const { logger } = defaults;\n setCorsHeaders(res);\n\n const urlPath = req.url ?? `/model/${modelId}/invoke-with-response-stream`;\n\n let bedrockReq: BedrockRequest;\n try {\n bedrockReq = JSON.parse(raw) as BedrockRequest;\n } catch (parseErr) {\n const detail = parseErr instanceof Error ? parseErr.message : \"unknown\";\n journal.add({\n method: req.method ?? \"POST\",\n path: urlPath,\n headers: flattenHeaders(req.headers),\n body: null,\n response: { status: 400, fixture: null },\n });\n writeErrorResponse(\n res,\n 400,\n renderError(\"bedrock\", \"validation\", {\n message: `Malformed JSON: ${detail}`,\n type: \"invalid_request_error\",\n }).body,\n );\n return;\n }\n\n // Reject non-object bodies (e.g. `null`) before touching fields —\n // otherwise `bedrockReq.messages` throws a TypeError that surfaces as a 500\n // instead of a 400.\n if (!isJsonObject(bedrockReq)) {\n journal.add({\n method: req.method ?? \"POST\",\n path: urlPath,\n headers: flattenHeaders(req.headers),\n body: null,\n response: { status: 400, fixture: null },\n });\n writeErrorResponse(\n res,\n 400,\n renderError(\"bedrock\", \"validation\", {\n message: \"Request body must be a JSON object\",\n type: \"invalid_request_error\",\n }).body,\n );\n return;\n }\n\n // Reject wrong-typed fields before the converter dereferences them. A\n // missing/non-array `messages` keeps the historic message below.\n const bedrockShapeError =\n validateChatMessages(bedrockReq.messages, { checkToolCalls: false }) ??\n validateToolsField(bedrockReq.tools) ??\n (bedrockReq.system !== undefined &&\n bedrockReq.system !== null &&\n typeof bedrockReq.system !== \"string\" &&\n !Array.isArray(bedrockReq.system)\n ? \"system must be a string or an array\"\n : null);\n if (bedrockShapeError) {\n journal.add({\n method: req.method ?? \"POST\",\n path: urlPath,\n headers: flattenHeaders(req.headers),\n body: null,\n response: { status: 400, fixture: null },\n });\n writeErrorResponse(\n res,\n 400,\n renderError(\"bedrock\", \"validation\", {\n message: `Invalid request: ${bedrockShapeError}`,\n type: \"invalid_request_error\",\n }).body,\n );\n return;\n }\n\n const completionReq = bedrockToCompletionRequest(bedrockReq, modelId, logger);\n completionReq.stream = true;\n completionReq._endpointType = \"chat\";\n completionReq._context = getContext(req);\n\n const testId = getTestId(req);\n const { fixture, skippedBySequenceOrTurn } = matchFixtureDiagnostic(\n fixtures,\n completionReq,\n journal.getFixtureMatchCountsForTest(testId),\n defaults.requestTransform,\n // Record mode proxies on a miss to capture a fresh turn (see record gate\n // below), so keep turnIndex strict to prevent an earlier-turn fixture from\n // shadowing a longer request and skipping the new turn's recording.\n { ...recordMatchOptions(!!defaults.record, defaults.logger), wire: \"bedrock-invoke\" },\n );\n\n if (fixture) {\n logger.debug(`Fixture matched: ${JSON.stringify(fixture.match).slice(0, 120)}`);\n } else {\n logger.debug(`No fixture matched for request`);\n }\n\n if (fixture) {\n journal.incrementFixtureMatchCount(fixture, fixtures, testId);\n }\n\n if (\n await applyChaosAsync(\n res,\n fixture,\n defaults.chaos,\n req.headers,\n req.url,\n journal,\n {\n method: req.method ?? \"POST\",\n path: urlPath,\n headers: flattenHeaders(req.headers),\n body: completionReq,\n },\n fixture ? \"fixture\" : \"proxy\",\n defaults.registry,\n defaults.logger,\n )\n )\n return;\n\n if (!fixture) {\n const effectiveStrict = resolveRequestDecisions(defaults.strict, req.headers).fixtureMiss;\n if (effectiveStrict) {\n const strictStatus = 503;\n const strictMessage = strictNoMatchMessage(skippedBySequenceOrTurn);\n logger.error(strictNoMatchLogLine(req.method ?? \"POST\", urlPath, skippedBySequenceOrTurn));\n journal.add({\n method: req.method ?? \"POST\",\n path: urlPath,\n headers: flattenHeaders(req.headers),\n body: completionReq,\n response: {\n status: strictStatus,\n fixture: null,\n ...strictOverrideField(defaults.strict, req.headers),\n },\n });\n writeErrorResponse(\n res,\n strictStatus,\n renderError(\"bedrock\", \"strict-miss\", {\n message: strictMessage,\n type: \"invalid_request_error\",\n }).body,\n );\n return;\n }\n if (defaults.record) {\n const { outcome, clientHungUp } = await withHangUpDetection(req, res, () =>\n proxyAndRecord(req, res, completionReq, \"bedrock\", urlPath, fixtures, defaults, raw),\n );\n if (outcome === \"handled_by_hook\") return;\n if (outcome !== \"not_configured\") {\n journal.add({\n method: req.method ?? \"POST\",\n path: urlPath,\n headers: flattenHeaders(req.headers),\n body: completionReq,\n response: {\n status: res.statusCode ?? 200,\n fixture: null,\n source: \"proxy\",\n ...proxyInterruption(res, clientHungUp),\n },\n });\n return;\n }\n }\n journal.add({\n method: req.method ?? \"POST\",\n path: urlPath,\n headers: flattenHeaders(req.headers),\n body: completionReq,\n response: {\n status: 404,\n fixture: null,\n ...strictOverrideField(defaults.strict, req.headers),\n },\n });\n writeErrorResponse(\n res,\n 404,\n renderError(\"bedrock\", \"fixture-miss\", {\n message: \"No fixture matched\",\n type: \"invalid_request_error\",\n }).body,\n );\n return;\n }\n\n const response = await resolveResponse(fixture, completionReq);\n const misbehavior = planMisbehavior({\n wire: \"bedrock-invoke\",\n emitsToolCallIds: true,\n fixture,\n response,\n request: completionReq,\n stream: completionReq.stream === true,\n defaults,\n rawHeaders: req.headers,\n url: req.url,\n });\n const addResponseEntry = (input: Parameters<Journal[\"add\"]>[0]) => {\n const entry = journal.add(input);\n recordMisbehaviorOutcome({ entry, summary: misbehavior.summary, defaults, testId });\n return entry;\n };\n if (misbehavior.kind === \"error\") {\n if (!misbehavior.summary?.evaluations.length) {\n logger.error(`[misbehavior] ${misbehavior.message}`);\n }\n addResponseEntry({\n method: req.method ?? \"POST\",\n path: urlPath,\n headers: flattenHeaders(req.headers),\n body: completionReq,\n response: { status: misbehavior.status, fixture },\n });\n const type = misbehavior.status === 400 ? \"ValidationException\" : \"NotImplementedException\";\n const renderedError = renderError(\"bedrock\", \"misbehavior\", {\n type,\n code: misbehavior.code,\n message: misbehavior.message,\n });\n for (const [name, value] of Object.entries(renderedError.headers ?? {}))\n res.setHeader(name, value);\n writeErrorResponse(res, misbehavior.status, renderedError.body);\n return;\n }\n const chunkSize = Math.max(1, fixture.chunkSize ?? defaults.chunkSize);\n const streamTiming = {\n latency: fixture.latency ?? defaults.latency,\n streamingProfile: fixture.streamingProfile,\n recordedTimings: fixture.recordedTimings,\n replaySpeed: fixture.replaySpeed ?? defaults.replaySpeed,\n };\n\n if (misbehavior.kind === \"applied\") {\n const prepared = prepareClaudeMisbehavior(misbehavior, {\n request: completionReq,\n stream: true,\n chunkSize,\n logger,\n strict: resolveRequestDecisions(defaults.strict, req.headers).reasoningSuppression,\n citations: false,\n });\n if (!prepared.stream) throw new TypeError(\"InvokeModel stream requires Claude events\");\n const entry = journal.add({\n method: req.method ?? \"POST\",\n path: urlPath,\n headers: flattenHeaders(req.headers),\n body: completionReq,\n response: { status: 200, fixture },\n });\n recordMisbehaviorOutcome({ entry, summary: prepared.plan.summary, defaults, testId });\n const events = prepared.events.map((event) => ({\n eventType: BEDROCK_INVOKE_STREAM_EVENT_TYPE,\n payload: event,\n }));\n await deliverStream(res, entry, fixture, bedrockInvokeCodec, events, streamTiming);\n return;\n }\n\n // Raw passthrough (#549): the authored events or JSON, framed for this wire.\n if (isRawResponse(response)) {\n await serveRawResponse({\n wire: \"bedrock-invoke\",\n stream: true,\n req,\n res,\n fixture,\n response,\n body: completionReq,\n journal,\n defaults,\n testId,\n misbehaviorSummary: misbehavior.summary,\n errorWire: \"bedrock\",\n });\n return;\n }\n\n // Error response\n if (isErrorResponse(response)) {\n const status = response.status ?? 500;\n addResponseEntry({\n method: req.method ?? \"POST\",\n path: urlPath,\n headers: flattenHeaders(req.headers),\n body: completionReq,\n response: { status, fixture },\n });\n // Bedrock Claude error format: { type: \"error\", error: { type, message } }\n // Uses ?? (nullish coalescing) intentionally — preserves explicit empty-string types from fixtures.\n writeErrorResponse(res, status, renderError(\"bedrock\", \"fixture\", response.error).body, {\n retryAfter: response.retryAfter,\n });\n return;\n }\n\n // Content + tool calls response — stream as Event Stream\n if (isCombinedFixtureResponse(response)) {\n if (response.webSearches?.length) {\n logger.warn(\"webSearches in fixture response are not supported for Bedrock API — ignoring\");\n }\n const overrides = extractOverrides(response);\n const effReasoning = resolveReasoningForModel(\n response.reasoning,\n completionReq.model,\n resolveRequestDecisions(defaults.strict, req.headers).reasoningSuppression,\n logger,\n );\n const journalEntry = addResponseEntry({\n method: req.method ?? \"POST\",\n path: urlPath,\n headers: flattenHeaders(req.headers),\n body: completionReq,\n response: { status: 200, fixture },\n });\n const functionToolCalls = requireEmittedFunctionToolCalls(response, \"Bedrock InvokeModel\");\n const events = buildBedrockStreamContentWithToolCallsEvents(\n response.content ?? \"\",\n functionToolCalls,\n completionReq.model,\n chunkSize,\n logger,\n effReasoning,\n overrides,\n response.blocks,\n );\n await deliverStream(res, journalEntry, fixture, bedrockInvokeCodec, events, streamTiming);\n return;\n }\n\n // Text response — stream as Event Stream\n if (isTextResponse(response)) {\n if (response.webSearches?.length) {\n logger.warn(\"webSearches in fixture response are not supported for Bedrock API — ignoring\");\n }\n const overrides = extractOverrides(response);\n const effReasoning = resolveReasoningForModel(\n response.reasoning,\n completionReq.model,\n resolveRequestDecisions(defaults.strict, req.headers).reasoningSuppression,\n logger,\n );\n const journalEntry = addResponseEntry({\n method: req.method ?? \"POST\",\n path: urlPath,\n headers: flattenHeaders(req.headers),\n body: completionReq,\n response: { status: 200, fixture },\n });\n const events = buildBedrockStreamTextEvents(\n response.content,\n completionReq.model,\n chunkSize,\n effReasoning,\n overrides,\n );\n await deliverStream(res, journalEntry, fixture, bedrockInvokeCodec, events, streamTiming);\n return;\n }\n\n // Tool call response — stream as Event Stream\n if (isToolCallResponse(response)) {\n if (response.webSearches?.length) {\n logger.warn(\"webSearches in fixture response are not supported for Bedrock API — ignoring\");\n }\n const overrides = extractOverrides(response);\n const effReasoning = resolveReasoningForModel(\n response.reasoning,\n completionReq.model,\n resolveRequestDecisions(defaults.strict, req.headers).reasoningSuppression,\n logger,\n );\n const journalEntry = addResponseEntry({\n method: req.method ?? \"POST\",\n path: urlPath,\n headers: flattenHeaders(req.headers),\n body: completionReq,\n response: { status: 200, fixture },\n });\n const functionToolCalls = requireEmittedFunctionToolCalls(response, \"Bedrock InvokeModel\");\n const events = buildBedrockStreamToolCallEvents(\n functionToolCalls,\n completionReq.model,\n chunkSize,\n logger,\n effReasoning,\n overrides,\n );\n await deliverStream(res, journalEntry, fixture, bedrockInvokeCodec, events, streamTiming);\n return;\n }\n\n // Unknown response type\n addResponseEntry({\n method: req.method ?? \"POST\",\n path: urlPath,\n headers: flattenHeaders(req.headers),\n body: completionReq,\n response: { status: 500, fixture },\n });\n writeErrorResponse(\n res,\n 500,\n renderError(\"bedrock\", \"unknown-response\", {\n message: \"Fixture response did not match any known type\",\n type: \"server_error\",\n }).body,\n );\n}\n"],"mappings":"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"}
package/dist/cohere.cjs CHANGED
@@ -6,7 +6,10 @@ const require_chaos = require('./chaos.cjs');
6
6
  const require_misbehavior = require('./misbehavior.cjs');
7
7
  const require_router = require('./router.cjs');
8
8
  const require_recorder = require('./recorder.cjs');
9
- const require_interruption = require('./interruption.cjs');
9
+ const require_timing = require('./response/timing.cjs');
10
+ const require_deliver = require('./response/deliver.cjs');
11
+ const require_proxy = require('./response/proxy.cjs');
12
+ const require_raw = require('./response/raw.cjs');
10
13
  const require_finish = require('./response/finish.cjs');
11
14
  const require_cohere = require('./response/usage/codecs/cohere.cjs');
12
15
 
@@ -505,34 +508,6 @@ function buildCohereContentWithToolCallsStreamEvents(content, toolCalls, chunkSi
505
508
  });
506
509
  return events;
507
510
  }
508
- async function writeCohereSSEStream(res, events, optionsOrLatency) {
509
- const opts = typeof optionsOrLatency === "number" ? { latency: optionsOrLatency } : optionsOrLatency ?? {};
510
- const latency = opts.latency ?? 0;
511
- const profile = opts.streamingProfile;
512
- const { recordedTimings, replaySpeed } = opts;
513
- const signal = opts.signal;
514
- const onChunkSent = opts.onChunkSent;
515
- if (res.writableEnded) return true;
516
- res.setHeader("Content-Type", "text/event-stream");
517
- res.setHeader("Cache-Control", "no-cache");
518
- res.setHeader("Connection", "keep-alive");
519
- let chunkIndex = 0;
520
- for (const event of events) {
521
- const chunkDelay = require_sse_writer.calculateDelay(chunkIndex, profile, latency, recordedTimings, replaySpeed);
522
- if (chunkDelay > 0) await require_sse_writer.delay(chunkDelay, signal);
523
- if (signal?.aborted) return false;
524
- if (res.writableEnded) return true;
525
- res.write(`event: ${event.type}\ndata: ${JSON.stringify(event)}\n\n`);
526
- onChunkSent?.();
527
- if (signal?.aborted) return false;
528
- chunkIndex++;
529
- }
530
- if (!res.writableEnded) {
531
- if (opts.terminalSentinel && !signal?.aborted) res.write("data: [DONE]\n\n");
532
- res.end();
533
- }
534
- return true;
535
- }
536
511
  async function handleCohere(req, res, raw, fixtures, journal, defaults, setCorsHeaders) {
537
512
  const { logger } = defaults;
538
513
  setCorsHeaders(res);
@@ -617,7 +592,10 @@ async function handleCohere(req, res, raw, fixtures, journal, defaults, setCorsH
617
592
  completionReq._endpointType = "chat";
618
593
  completionReq._context = require_helpers.getContext(req);
619
594
  const testId = require_helpers.getTestId(req);
620
- const { fixture, skippedBySequenceOrTurn } = require_router.matchFixtureDiagnostic(fixtures, completionReq, journal.getFixtureMatchCountsForTest(testId), defaults.requestTransform, require_router.recordMatchOptions(!!defaults.record, defaults.logger));
595
+ const { fixture, skippedBySequenceOrTurn } = require_router.matchFixtureDiagnostic(fixtures, completionReq, journal.getFixtureMatchCountsForTest(testId), defaults.requestTransform, {
596
+ ...require_router.recordMatchOptions(!!defaults.record, defaults.logger),
597
+ wire: "cohere"
598
+ });
621
599
  if (fixture) {
622
600
  journal.incrementFixtureMatchCount(fixture, fixtures, testId);
623
601
  logger.debug(`Fixture matched: ${JSON.stringify(fixture.match).slice(0, 120)}`);
@@ -651,7 +629,7 @@ async function handleCohere(req, res, raw, fixtures, journal, defaults, setCorsH
651
629
  return;
652
630
  }
653
631
  if (defaults.record) {
654
- const outcome = await require_recorder.proxyAndRecord(req, res, completionReq, "cohere", req.url ?? "/v2/chat", fixtures, defaults, raw);
632
+ const { outcome, clientHungUp } = await require_proxy.withHangUpDetection(req, res, () => require_recorder.proxyAndRecord(req, res, completionReq, "cohere", req.url ?? "/v2/chat", fixtures, defaults, raw));
655
633
  if (outcome === "handled_by_hook") return;
656
634
  if (outcome !== "not_configured") {
657
635
  journal.add({
@@ -662,7 +640,8 @@ async function handleCohere(req, res, raw, fixtures, journal, defaults, setCorsH
662
640
  response: {
663
641
  status: res.statusCode ?? 200,
664
642
  fixture: null,
665
- source: "proxy"
643
+ source: "proxy",
644
+ ...require_proxy.proxyInterruption(res, clientHungUp)
666
645
  }
667
646
  });
668
647
  return;
@@ -720,6 +699,23 @@ async function handleCohere(req, res, raw, fixtures, journal, defaults, setCorsH
720
699
  }).body);
721
700
  return;
722
701
  }
702
+ if (require_helpers.isRawResponse(resolvedResponse)) {
703
+ await require_raw.serveRawResponse({
704
+ wire: "cohere",
705
+ stream: cohereReq.stream === true,
706
+ req,
707
+ res,
708
+ fixture,
709
+ response: resolvedResponse,
710
+ body: completionReq,
711
+ journal,
712
+ defaults,
713
+ testId,
714
+ misbehaviorSummary: misbehavior.summary,
715
+ errorWire: "cohere"
716
+ });
717
+ return;
718
+ }
723
719
  const prepared = misbehavior.kind === "applied" ? require_helpers.prepareOpenAIChatMisbehavior(misbehavior) : void 0;
724
720
  const observedK5Stream = cohereReq.stream === true && prepared?.summary.fault === "stop-length-mid-tool";
725
721
  const appliedReasoning = prepared && "reasoning" in prepared.response ? require_helpers.resolveReasoningForModel(prepared.response.reasoning, cohereReq.model, require_policy.resolveRequestDecisions(defaults.strict, req.headers).reasoningSuppression, logger) : void 0;
@@ -733,6 +729,22 @@ async function handleCohere(req, res, raw, fixtures, journal, defaults, setCorsH
733
729
  const empty = prepared?.summary.fault === "empty-response";
734
730
  const latency = fixture.latency ?? defaults.latency;
735
731
  const chunkSize = Math.max(1, fixture.chunkSize ?? defaults.chunkSize);
732
+ const replaySpeed = fixture.replaySpeed ?? defaults.replaySpeed;
733
+ const streamTiming = {
734
+ latency,
735
+ streamingProfile: fixture.streamingProfile,
736
+ recordedTimings: fixture.recordedTimings,
737
+ replaySpeed
738
+ };
739
+ const codec = require_sse_writer.typedSseCodec({ terminalSentinel: observedK5Stream });
740
+ const jsonOpts = (payloadLength) => ({
741
+ surface: "other",
742
+ payloadLength,
743
+ chunkSize,
744
+ recordedTimings: fixture.recordedTimings,
745
+ duplicateId: !!prepared?.duplicateId,
746
+ replaySpeed
747
+ });
736
748
  if (require_helpers.isErrorResponse(response)) {
737
749
  const status = response.status ?? 500;
738
750
  require_misbehavior.recordMisbehaviorOutcome({
@@ -775,28 +787,8 @@ async function handleCohere(req, res, raw, fixtures, journal, defaults, setCorsH
775
787
  testId
776
788
  });
777
789
  const functionToolCalls = require_helpers.requireEmittedFunctionToolCalls(response, "Cohere");
778
- if (cohereReq.stream !== true) {
779
- const body = buildCohereContentWithToolCallsResponse(response.content ?? "", functionToolCalls, logger, effReasoning, overrides, response.blocks);
780
- res.writeHead(200, { "Content-Type": "application/json" });
781
- res.end(JSON.stringify(body));
782
- } else {
783
- const events = buildCohereContentWithToolCallsStreamEvents(response.content ?? "", functionToolCalls, chunkSize, logger, effReasoning, overrides, response.blocks);
784
- const interruption = require_interruption.createInterruptionSignal(fixture);
785
- if (!await writeCohereSSEStream(res, events, {
786
- terminalSentinel: observedK5Stream,
787
- latency,
788
- streamingProfile: fixture.streamingProfile,
789
- recordedTimings: fixture.recordedTimings,
790
- replaySpeed: fixture.replaySpeed ?? defaults.replaySpeed,
791
- signal: interruption?.signal,
792
- onChunkSent: interruption?.tick
793
- })) {
794
- if (!res.writableEnded) res.destroy();
795
- journalEntry.response.interrupted = true;
796
- journalEntry.response.interruptReason = interruption?.reason();
797
- }
798
- interruption?.cleanup();
799
- }
790
+ if (cohereReq.stream !== true) await require_deliver.deliverJson(res, journalEntry, fixture, () => buildCohereContentWithToolCallsResponse(response.content ?? "", functionToolCalls, logger, effReasoning, overrides, response.blocks), jsonOpts(require_timing.servedPayloadLength(response, effReasoning)));
791
+ else await require_deliver.deliverStream(res, journalEntry, fixture, codec, buildCohereContentWithToolCallsStreamEvents(response.content ?? "", functionToolCalls, chunkSize, logger, effReasoning, overrides, response.blocks), streamTiming);
800
792
  return;
801
793
  }
802
794
  if (require_helpers.isTextResponse(response)) {
@@ -820,37 +812,17 @@ async function handleCohere(req, res, raw, fixtures, journal, defaults, setCorsH
820
812
  defaults,
821
813
  testId
822
814
  });
823
- if (cohereReq.stream !== true) {
824
- const body = empty ? {
825
- ...buildCohereTextResponse("", void 0, overrides),
826
- message: {
827
- role: "assistant",
828
- content: [],
829
- tool_calls: [],
830
- tool_plan: "",
831
- citations: []
832
- }
833
- } : buildCohereTextResponse(response.content, effReasoning, overrides);
834
- res.writeHead(200, { "Content-Type": "application/json" });
835
- res.end(JSON.stringify(body));
836
- } else {
837
- const events = buildCohereTextStreamEvents(response.content, chunkSize, effReasoning, overrides).filter((event) => !empty || event.type === "message-start" || event.type === "message-end");
838
- const interruption = require_interruption.createInterruptionSignal(fixture);
839
- if (!await writeCohereSSEStream(res, events, {
840
- terminalSentinel: observedK5Stream,
841
- latency,
842
- streamingProfile: fixture.streamingProfile,
843
- recordedTimings: fixture.recordedTimings,
844
- replaySpeed: fixture.replaySpeed ?? defaults.replaySpeed,
845
- signal: interruption?.signal,
846
- onChunkSent: interruption?.tick
847
- })) {
848
- if (!res.writableEnded) res.destroy();
849
- journalEntry.response.interrupted = true;
850
- journalEntry.response.interruptReason = interruption?.reason();
815
+ if (cohereReq.stream !== true) await require_deliver.deliverJson(res, journalEntry, fixture, () => empty ? {
816
+ ...buildCohereTextResponse("", void 0, overrides),
817
+ message: {
818
+ role: "assistant",
819
+ content: [],
820
+ tool_calls: [],
821
+ tool_plan: "",
822
+ citations: []
851
823
  }
852
- interruption?.cleanup();
853
- }
824
+ } : buildCohereTextResponse(response.content, effReasoning, overrides), jsonOpts(require_timing.servedPayloadLength(response, effReasoning)));
825
+ else await require_deliver.deliverStream(res, journalEntry, fixture, codec, buildCohereTextStreamEvents(response.content, chunkSize, effReasoning, overrides).filter((event) => !empty || event.type === "message-start" || event.type === "message-end"), streamTiming);
854
826
  return;
855
827
  }
856
828
  if (require_helpers.isToolCallResponse(response)) {
@@ -875,28 +847,8 @@ async function handleCohere(req, res, raw, fixtures, journal, defaults, setCorsH
875
847
  testId
876
848
  });
877
849
  const functionToolCalls = require_helpers.requireEmittedFunctionToolCalls(response, "Cohere");
878
- if (cohereReq.stream !== true) {
879
- const body = buildCohereToolCallResponse(functionToolCalls, logger, effReasoning, overrides);
880
- res.writeHead(200, { "Content-Type": "application/json" });
881
- res.end(JSON.stringify(body));
882
- } else {
883
- const events = buildCohereToolCallStreamEvents(functionToolCalls, chunkSize, logger, effReasoning, overrides);
884
- const interruption = require_interruption.createInterruptionSignal(fixture);
885
- if (!await writeCohereSSEStream(res, events, {
886
- terminalSentinel: observedK5Stream,
887
- latency,
888
- streamingProfile: fixture.streamingProfile,
889
- recordedTimings: fixture.recordedTimings,
890
- replaySpeed: fixture.replaySpeed ?? defaults.replaySpeed,
891
- signal: interruption?.signal,
892
- onChunkSent: interruption?.tick
893
- })) {
894
- if (!res.writableEnded) res.destroy();
895
- journalEntry.response.interrupted = true;
896
- journalEntry.response.interruptReason = interruption?.reason();
897
- }
898
- interruption?.cleanup();
899
- }
850
+ if (cohereReq.stream !== true) await require_deliver.deliverJson(res, journalEntry, fixture, () => buildCohereToolCallResponse(functionToolCalls, logger, effReasoning, overrides), jsonOpts(require_timing.servedPayloadLength(response, effReasoning)));
851
+ else await require_deliver.deliverStream(res, journalEntry, fixture, codec, buildCohereToolCallStreamEvents(functionToolCalls, chunkSize, logger, effReasoning, overrides), streamTiming);
900
852
  return;
901
853
  }
902
854
  require_misbehavior.recordMisbehaviorOutcome({