@copilotkit/aimock 1.45.1 → 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 (492) hide show
  1. package/.claude-plugin/marketplace.json +1 -1
  2. package/.claude-plugin/plugin.json +1 -1
  3. package/CHANGELOG.md +25 -1
  4. package/README.md +11 -2
  5. package/dist/agui-mock.cjs +25 -25
  6. package/dist/agui-mock.cjs.map +1 -1
  7. package/dist/agui-mock.d.cts.map +1 -1
  8. package/dist/agui-mock.d.ts.map +1 -1
  9. package/dist/agui-mock.js +25 -25
  10. package/dist/agui-mock.js.map +1 -1
  11. package/dist/agui-types.d.cts.map +1 -1
  12. package/dist/aimock-cli.cjs +15 -1
  13. package/dist/aimock-cli.cjs.map +1 -1
  14. package/dist/aimock-cli.d.cts.map +1 -1
  15. package/dist/aimock-cli.d.ts.map +1 -1
  16. package/dist/aimock-cli.js +16 -2
  17. package/dist/aimock-cli.js.map +1 -1
  18. package/dist/api-key-auth.cjs +10 -9
  19. package/dist/api-key-auth.cjs.map +1 -1
  20. package/dist/api-key-auth.d.cts.map +1 -1
  21. package/dist/api-key-auth.d.ts.map +1 -1
  22. package/dist/api-key-auth.js +11 -10
  23. package/dist/api-key-auth.js.map +1 -1
  24. package/dist/aws-event-stream.cjs +20 -23
  25. package/dist/aws-event-stream.cjs.map +1 -1
  26. package/dist/aws-event-stream.d.cts +0 -1
  27. package/dist/aws-event-stream.d.ts +0 -1
  28. package/dist/aws-event-stream.js +20 -24
  29. package/dist/aws-event-stream.js.map +1 -1
  30. package/dist/batches.cjs +2 -4
  31. package/dist/batches.cjs.map +1 -1
  32. package/dist/batches.d.cts.map +1 -1
  33. package/dist/batches.d.ts.map +1 -1
  34. package/dist/batches.js +2 -4
  35. package/dist/batches.js.map +1 -1
  36. package/dist/bedrock-converse.cjs +139 -161
  37. package/dist/bedrock-converse.cjs.map +1 -1
  38. package/dist/bedrock-converse.d.cts.map +1 -1
  39. package/dist/bedrock-converse.d.ts.map +1 -1
  40. package/dist/bedrock-converse.js +137 -159
  41. package/dist/bedrock-converse.js.map +1 -1
  42. package/dist/bedrock.cjs +175 -216
  43. package/dist/bedrock.cjs.map +1 -1
  44. package/dist/bedrock.d.cts.map +1 -1
  45. package/dist/bedrock.d.ts.map +1 -1
  46. package/dist/bedrock.js +172 -213
  47. package/dist/bedrock.js.map +1 -1
  48. package/dist/byteplus-video.cjs +11 -10
  49. package/dist/byteplus-video.cjs.map +1 -1
  50. package/dist/byteplus-video.d.cts.map +1 -1
  51. package/dist/byteplus-video.d.ts.map +1 -1
  52. package/dist/byteplus-video.js +5 -4
  53. package/dist/byteplus-video.js.map +1 -1
  54. package/dist/chaos.cjs +5 -4
  55. package/dist/chaos.cjs.map +1 -1
  56. package/dist/chaos.d.cts.map +1 -1
  57. package/dist/chaos.d.ts.map +1 -1
  58. package/dist/chaos.js +5 -4
  59. package/dist/chaos.js.map +1 -1
  60. package/dist/cli.cjs +15 -0
  61. package/dist/cli.cjs.map +1 -1
  62. package/dist/cli.js +15 -0
  63. package/dist/cli.js.map +1 -1
  64. package/dist/cohere.cjs +107 -180
  65. package/dist/cohere.cjs.map +1 -1
  66. package/dist/cohere.d.cts.map +1 -1
  67. package/dist/cohere.d.ts.map +1 -1
  68. package/dist/cohere.js +106 -179
  69. package/dist/cohere.js.map +1 -1
  70. package/dist/config-loader.cjs +29 -1
  71. package/dist/config-loader.cjs.map +1 -1
  72. package/dist/config-loader.d.cts +7 -1
  73. package/dist/config-loader.d.cts.map +1 -1
  74. package/dist/config-loader.d.ts +7 -1
  75. package/dist/config-loader.d.ts.map +1 -1
  76. package/dist/config-loader.js +29 -2
  77. package/dist/config-loader.js.map +1 -1
  78. package/dist/count-tokens.cjs +146 -0
  79. package/dist/count-tokens.cjs.map +1 -0
  80. package/dist/count-tokens.js +146 -0
  81. package/dist/count-tokens.js.map +1 -0
  82. package/dist/elevenlabs-audio.cjs +36 -34
  83. package/dist/elevenlabs-audio.cjs.map +1 -1
  84. package/dist/elevenlabs-audio.d.cts.map +1 -1
  85. package/dist/elevenlabs-audio.d.ts.map +1 -1
  86. package/dist/elevenlabs-audio.js +33 -31
  87. package/dist/elevenlabs-audio.js.map +1 -1
  88. package/dist/elevenlabs-voice.cjs +38 -37
  89. package/dist/elevenlabs-voice.cjs.map +1 -1
  90. package/dist/elevenlabs-voice.d.cts.map +1 -1
  91. package/dist/elevenlabs-voice.d.ts.map +1 -1
  92. package/dist/elevenlabs-voice.js +33 -32
  93. package/dist/elevenlabs-voice.js.map +1 -1
  94. package/dist/embedding-request.cjs +16 -0
  95. package/dist/embedding-request.cjs.map +1 -0
  96. package/dist/embedding-request.js +14 -0
  97. package/dist/embedding-request.js.map +1 -0
  98. package/dist/embeddings.cjs +30 -20
  99. package/dist/embeddings.cjs.map +1 -1
  100. package/dist/embeddings.d.cts.map +1 -1
  101. package/dist/embeddings.d.ts.map +1 -1
  102. package/dist/embeddings.js +30 -20
  103. package/dist/embeddings.js.map +1 -1
  104. package/dist/fal-audio.cjs +45 -43
  105. package/dist/fal-audio.cjs.map +1 -1
  106. package/dist/fal-audio.d.cts.map +1 -1
  107. package/dist/fal-audio.d.ts.map +1 -1
  108. package/dist/fal-audio.js +42 -40
  109. package/dist/fal-audio.js.map +1 -1
  110. package/dist/fal.cjs +17 -15
  111. package/dist/fal.cjs.map +1 -1
  112. package/dist/fal.js +16 -14
  113. package/dist/fal.js.map +1 -1
  114. package/dist/files.cjs +2 -4
  115. package/dist/files.cjs.map +1 -1
  116. package/dist/files.d.cts.map +1 -1
  117. package/dist/files.d.ts.map +1 -1
  118. package/dist/files.js +2 -4
  119. package/dist/files.js.map +1 -1
  120. package/dist/fine-tuning.cjs +2 -4
  121. package/dist/fine-tuning.cjs.map +1 -1
  122. package/dist/fine-tuning.d.cts.map +1 -1
  123. package/dist/fine-tuning.d.ts.map +1 -1
  124. package/dist/fine-tuning.js +2 -4
  125. package/dist/fine-tuning.js.map +1 -1
  126. package/dist/fixture-loader.cjs +140 -44
  127. package/dist/fixture-loader.cjs.map +1 -1
  128. package/dist/fixture-loader.d.cts.map +1 -1
  129. package/dist/fixture-loader.d.ts.map +1 -1
  130. package/dist/fixture-loader.js +141 -46
  131. package/dist/fixture-loader.js.map +1 -1
  132. package/dist/gemini-embeddings.cjs +26 -24
  133. package/dist/gemini-embeddings.cjs.map +1 -1
  134. package/dist/gemini-embeddings.js +26 -24
  135. package/dist/gemini-embeddings.js.map +1 -1
  136. package/dist/gemini-interactions.cjs +113 -156
  137. package/dist/gemini-interactions.cjs.map +1 -1
  138. package/dist/gemini-interactions.d.cts +0 -1
  139. package/dist/gemini-interactions.d.cts.map +1 -1
  140. package/dist/gemini-interactions.d.ts +0 -1
  141. package/dist/gemini-interactions.d.ts.map +1 -1
  142. package/dist/gemini-interactions.js +113 -156
  143. package/dist/gemini-interactions.js.map +1 -1
  144. package/dist/gemini.cjs +295 -218
  145. package/dist/gemini.cjs.map +1 -1
  146. package/dist/gemini.d.cts.map +1 -1
  147. package/dist/gemini.d.ts.map +1 -1
  148. package/dist/gemini.js +295 -219
  149. package/dist/gemini.js.map +1 -1
  150. package/dist/grok-video.cjs +14 -12
  151. package/dist/grok-video.cjs.map +1 -1
  152. package/dist/grok-video.d.cts.map +1 -1
  153. package/dist/grok-video.d.ts.map +1 -1
  154. package/dist/grok-video.js +8 -6
  155. package/dist/grok-video.js.map +1 -1
  156. package/dist/helpers.cjs +411 -75
  157. package/dist/helpers.cjs.map +1 -1
  158. package/dist/helpers.d.cts +51 -1
  159. package/dist/helpers.d.cts.map +1 -1
  160. package/dist/helpers.d.ts +51 -1
  161. package/dist/helpers.d.ts.map +1 -1
  162. package/dist/helpers.js +402 -74
  163. package/dist/helpers.js.map +1 -1
  164. package/dist/images.cjs +30 -28
  165. package/dist/images.cjs.map +1 -1
  166. package/dist/images.d.cts.map +1 -1
  167. package/dist/images.d.ts.map +1 -1
  168. package/dist/images.js +27 -25
  169. package/dist/images.js.map +1 -1
  170. package/dist/index.cjs +4 -2
  171. package/dist/index.d.cts +4 -4
  172. package/dist/index.d.ts +4 -4
  173. package/dist/index.js +4 -4
  174. package/dist/journal.cjs +3 -1
  175. package/dist/journal.cjs.map +1 -1
  176. package/dist/journal.d.cts.map +1 -1
  177. package/dist/journal.d.ts.map +1 -1
  178. package/dist/journal.js +2 -1
  179. package/dist/journal.js.map +1 -1
  180. package/dist/llmock.cjs +3 -0
  181. package/dist/llmock.cjs.map +1 -1
  182. package/dist/llmock.d.cts.map +1 -1
  183. package/dist/llmock.d.ts.map +1 -1
  184. package/dist/llmock.js +3 -0
  185. package/dist/llmock.js.map +1 -1
  186. package/dist/mcp-fakes.d.cts.map +1 -1
  187. package/dist/mcp-handler.cjs +7 -3
  188. package/dist/mcp-handler.cjs.map +1 -1
  189. package/dist/mcp-handler.js +7 -3
  190. package/dist/mcp-handler.js.map +1 -1
  191. package/dist/mcp-recorder.cjs +2 -1
  192. package/dist/mcp-recorder.cjs.map +1 -1
  193. package/dist/mcp-recorder.js +3 -2
  194. package/dist/mcp-recorder.js.map +1 -1
  195. package/dist/messages.cjs +235 -202
  196. package/dist/messages.cjs.map +1 -1
  197. package/dist/messages.d.cts.map +1 -1
  198. package/dist/messages.d.ts.map +1 -1
  199. package/dist/messages.js +234 -202
  200. package/dist/messages.js.map +1 -1
  201. package/dist/metrics.cjs +5 -2
  202. package/dist/metrics.cjs.map +1 -1
  203. package/dist/metrics.d.cts.map +1 -1
  204. package/dist/metrics.d.ts.map +1 -1
  205. package/dist/metrics.js +6 -3
  206. package/dist/metrics.js.map +1 -1
  207. package/dist/misbehavior.cjs +62 -3
  208. package/dist/misbehavior.cjs.map +1 -1
  209. package/dist/misbehavior.d.cts.map +1 -1
  210. package/dist/misbehavior.d.ts.map +1 -1
  211. package/dist/misbehavior.js +63 -4
  212. package/dist/misbehavior.js.map +1 -1
  213. package/dist/model-utils.cjs +1 -0
  214. package/dist/model-utils.cjs.map +1 -1
  215. package/dist/model-utils.js +1 -1
  216. package/dist/model-utils.js.map +1 -1
  217. package/dist/moderation.cjs +15 -12
  218. package/dist/moderation.cjs.map +1 -1
  219. package/dist/moderation.js +14 -11
  220. package/dist/moderation.js.map +1 -1
  221. package/dist/ndjson-writer.cjs +21 -23
  222. package/dist/ndjson-writer.cjs.map +1 -1
  223. package/dist/ndjson-writer.d.cts +0 -1
  224. package/dist/ndjson-writer.d.cts.map +1 -1
  225. package/dist/ndjson-writer.d.ts +0 -1
  226. package/dist/ndjson-writer.d.ts.map +1 -1
  227. package/dist/ndjson-writer.js +21 -24
  228. package/dist/ndjson-writer.js.map +1 -1
  229. package/dist/ollama.cjs +276 -210
  230. package/dist/ollama.cjs.map +1 -1
  231. package/dist/ollama.d.cts.map +1 -1
  232. package/dist/ollama.d.ts.map +1 -1
  233. package/dist/ollama.js +273 -207
  234. package/dist/ollama.js.map +1 -1
  235. package/dist/openapi.cjs +323 -3
  236. package/dist/openapi.cjs.map +1 -1
  237. package/dist/openapi.d.cts.map +1 -1
  238. package/dist/openapi.d.ts.map +1 -1
  239. package/dist/openapi.js +324 -4
  240. package/dist/openapi.js.map +1 -1
  241. package/dist/openrouter-chat.cjs +11 -155
  242. package/dist/openrouter-chat.cjs.map +1 -1
  243. package/dist/openrouter-chat.js +11 -155
  244. package/dist/openrouter-chat.js.map +1 -1
  245. package/dist/openrouter-video.cjs +51 -74
  246. package/dist/openrouter-video.cjs.map +1 -1
  247. package/dist/openrouter-video.d.cts.map +1 -1
  248. package/dist/openrouter-video.d.ts.map +1 -1
  249. package/dist/openrouter-video.js +37 -60
  250. package/dist/openrouter-video.js.map +1 -1
  251. package/dist/raw-validation.cjs +177 -0
  252. package/dist/raw-validation.cjs.map +1 -0
  253. package/dist/raw-validation.js +176 -0
  254. package/dist/raw-validation.js.map +1 -0
  255. package/dist/recorder.cjs +176 -95
  256. package/dist/recorder.cjs.map +1 -1
  257. package/dist/recorder.d.cts.map +1 -1
  258. package/dist/recorder.d.ts.map +1 -1
  259. package/dist/recorder.js +176 -95
  260. package/dist/recorder.js.map +1 -1
  261. package/dist/rerank.cjs +13 -11
  262. package/dist/rerank.cjs.map +1 -1
  263. package/dist/rerank.js +12 -10
  264. package/dist/rerank.js.map +1 -1
  265. package/dist/response/catalog/anthropic-page.cjs +39 -0
  266. package/dist/response/catalog/anthropic-page.cjs.map +1 -0
  267. package/dist/response/catalog/anthropic-page.js +38 -0
  268. package/dist/response/catalog/anthropic-page.js.map +1 -0
  269. package/dist/response/catalog/collect.cjs +61 -0
  270. package/dist/response/catalog/collect.cjs.map +1 -0
  271. package/dist/response/catalog/collect.js +59 -0
  272. package/dist/response/catalog/collect.js.map +1 -0
  273. package/dist/response/catalog/gemini-page.cjs +25 -0
  274. package/dist/response/catalog/gemini-page.cjs.map +1 -0
  275. package/dist/response/catalog/gemini-page.js +24 -0
  276. package/dist/response/catalog/gemini-page.js.map +1 -0
  277. package/dist/response/catalog/render.cjs +182 -0
  278. package/dist/response/catalog/render.cjs.map +1 -0
  279. package/dist/response/catalog/render.js +171 -0
  280. package/dist/response/catalog/render.js.map +1 -0
  281. package/dist/response/deliver.cjs +144 -0
  282. package/dist/response/deliver.cjs.map +1 -0
  283. package/dist/response/deliver.js +143 -0
  284. package/dist/response/deliver.js.map +1 -0
  285. package/dist/response/errors.cjs +225 -0
  286. package/dist/response/errors.cjs.map +1 -0
  287. package/dist/response/errors.js +224 -0
  288. package/dist/response/errors.js.map +1 -0
  289. package/dist/response/finish.cjs +39 -0
  290. package/dist/response/finish.cjs.map +1 -0
  291. package/dist/response/finish.js +35 -0
  292. package/dist/response/finish.js.map +1 -0
  293. package/dist/response/frame-loop.cjs +102 -0
  294. package/dist/response/frame-loop.cjs.map +1 -0
  295. package/dist/response/frame-loop.js +100 -0
  296. package/dist/response/frame-loop.js.map +1 -0
  297. package/dist/response/lifecycle.cjs +223 -0
  298. package/dist/response/lifecycle.cjs.map +1 -0
  299. package/dist/response/lifecycle.js +211 -0
  300. package/dist/response/lifecycle.js.map +1 -0
  301. package/dist/response/policy.cjs +126 -0
  302. package/dist/response/policy.cjs.map +1 -0
  303. package/dist/response/policy.js +120 -0
  304. package/dist/response/policy.js.map +1 -0
  305. package/dist/response/profiles.cjs +69 -0
  306. package/dist/response/profiles.cjs.map +1 -0
  307. package/dist/response/profiles.js +65 -0
  308. package/dist/response/profiles.js.map +1 -0
  309. package/dist/response/proxy.cjs +71 -0
  310. package/dist/response/proxy.cjs.map +1 -0
  311. package/dist/response/proxy.js +70 -0
  312. package/dist/response/proxy.js.map +1 -0
  313. package/dist/response/raw.cjs +228 -0
  314. package/dist/response/raw.cjs.map +1 -0
  315. package/dist/response/raw.js +227 -0
  316. package/dist/response/raw.js.map +1 -0
  317. package/dist/response/timing.cjs +157 -0
  318. package/dist/response/timing.cjs.map +1 -0
  319. package/dist/response/timing.js +150 -0
  320. package/dist/response/timing.js.map +1 -0
  321. package/dist/response/usage/codecs/anthropic.cjs +52 -0
  322. package/dist/response/usage/codecs/anthropic.cjs.map +1 -0
  323. package/dist/response/usage/codecs/anthropic.js +50 -0
  324. package/dist/response/usage/codecs/anthropic.js.map +1 -0
  325. package/dist/response/usage/codecs/cohere.cjs +36 -0
  326. package/dist/response/usage/codecs/cohere.cjs.map +1 -0
  327. package/dist/response/usage/codecs/cohere.js +35 -0
  328. package/dist/response/usage/codecs/cohere.js.map +1 -0
  329. package/dist/response/usage/codecs/converse.cjs +16 -0
  330. package/dist/response/usage/codecs/converse.cjs.map +1 -0
  331. package/dist/response/usage/codecs/converse.js +15 -0
  332. package/dist/response/usage/codecs/converse.js.map +1 -0
  333. package/dist/response/usage/codecs/gemini.cjs +31 -0
  334. package/dist/response/usage/codecs/gemini.cjs.map +1 -0
  335. package/dist/response/usage/codecs/gemini.js +31 -0
  336. package/dist/response/usage/codecs/gemini.js.map +1 -0
  337. package/dist/response/usage/codecs/interactions.cjs +22 -0
  338. package/dist/response/usage/codecs/interactions.cjs.map +1 -0
  339. package/dist/response/usage/codecs/interactions.js +21 -0
  340. package/dist/response/usage/codecs/interactions.js.map +1 -0
  341. package/dist/response/usage/codecs/ollama.cjs +17 -0
  342. package/dist/response/usage/codecs/ollama.cjs.map +1 -0
  343. package/dist/response/usage/codecs/ollama.js +17 -0
  344. package/dist/response/usage/codecs/ollama.js.map +1 -0
  345. package/dist/response/usage/codecs/openai.cjs +52 -0
  346. package/dist/response/usage/codecs/openai.cjs.map +1 -0
  347. package/dist/response/usage/codecs/openai.js +50 -0
  348. package/dist/response/usage/codecs/openai.js.map +1 -0
  349. package/dist/response/usage/codecs/openrouter.cjs +68 -0
  350. package/dist/response/usage/codecs/openrouter.cjs.map +1 -0
  351. package/dist/response/usage/codecs/openrouter.js +67 -0
  352. package/dist/response/usage/codecs/openrouter.js.map +1 -0
  353. package/dist/response/usage/codecs/realtime.cjs +19 -0
  354. package/dist/response/usage/codecs/realtime.cjs.map +1 -0
  355. package/dist/response/usage/codecs/realtime.js +18 -0
  356. package/dist/response/usage/codecs/realtime.js.map +1 -0
  357. package/dist/response/usage/codecs/responses.cjs +21 -0
  358. package/dist/response/usage/codecs/responses.cjs.map +1 -0
  359. package/dist/response/usage/codecs/responses.js +20 -0
  360. package/dist/response/usage/codecs/responses.js.map +1 -0
  361. package/dist/response/usage/estimate.cjs +23 -0
  362. package/dist/response/usage/estimate.cjs.map +1 -0
  363. package/dist/response/usage/estimate.js +21 -0
  364. package/dist/response/usage/estimate.js.map +1 -0
  365. package/dist/response/usage/fields.cjs +72 -0
  366. package/dist/response/usage/fields.cjs.map +1 -0
  367. package/dist/response/usage/fields.js +70 -0
  368. package/dist/response/usage/fields.js.map +1 -0
  369. package/dist/response/usage/recording.cjs +52 -0
  370. package/dist/response/usage/recording.cjs.map +1 -0
  371. package/dist/response/usage/recording.js +52 -0
  372. package/dist/response/usage/recording.js.map +1 -0
  373. package/dist/responses.cjs +304 -196
  374. package/dist/responses.cjs.map +1 -1
  375. package/dist/responses.d.cts.map +1 -1
  376. package/dist/responses.d.ts.map +1 -1
  377. package/dist/responses.js +303 -195
  378. package/dist/responses.js.map +1 -1
  379. package/dist/route-registry.cjs +45 -0
  380. package/dist/route-registry.cjs.map +1 -1
  381. package/dist/route-registry.d.cts.map +1 -1
  382. package/dist/route-registry.d.ts.map +1 -1
  383. package/dist/route-registry.js +41 -1
  384. package/dist/route-registry.js.map +1 -1
  385. package/dist/router.cjs +24 -4
  386. package/dist/router.cjs.map +1 -1
  387. package/dist/router.d.cts +7 -1
  388. package/dist/router.d.cts.map +1 -1
  389. package/dist/router.d.ts +7 -1
  390. package/dist/router.d.ts.map +1 -1
  391. package/dist/router.js +24 -5
  392. package/dist/router.js.map +1 -1
  393. package/dist/search.cjs +13 -11
  394. package/dist/search.cjs.map +1 -1
  395. package/dist/search.js +12 -10
  396. package/dist/search.js.map +1 -1
  397. package/dist/server.cjs +293 -248
  398. package/dist/server.cjs.map +1 -1
  399. package/dist/server.d.cts.map +1 -1
  400. package/dist/server.d.ts.map +1 -1
  401. package/dist/server.js +294 -249
  402. package/dist/server.js.map +1 -1
  403. package/dist/speech.cjs +20 -18
  404. package/dist/speech.cjs.map +1 -1
  405. package/dist/speech.d.cts.map +1 -1
  406. package/dist/speech.d.ts.map +1 -1
  407. package/dist/speech.js +19 -17
  408. package/dist/speech.js.map +1 -1
  409. package/dist/sse-writer.cjs +56 -30
  410. package/dist/sse-writer.cjs.map +1 -1
  411. package/dist/sse-writer.d.cts +0 -1
  412. package/dist/sse-writer.d.cts.map +1 -1
  413. package/dist/sse-writer.d.ts +0 -1
  414. package/dist/sse-writer.d.ts.map +1 -1
  415. package/dist/sse-writer.js +55 -31
  416. package/dist/sse-writer.js.map +1 -1
  417. package/dist/stream-collapse.cjs +118 -11
  418. package/dist/stream-collapse.cjs.map +1 -1
  419. package/dist/stream-collapse.d.cts +10 -9
  420. package/dist/stream-collapse.d.cts.map +1 -1
  421. package/dist/stream-collapse.d.ts +10 -9
  422. package/dist/stream-collapse.d.ts.map +1 -1
  423. package/dist/stream-collapse.js +118 -11
  424. package/dist/stream-collapse.js.map +1 -1
  425. package/dist/transcription.cjs +31 -43
  426. package/dist/transcription.cjs.map +1 -1
  427. package/dist/transcription.d.cts.map +1 -1
  428. package/dist/transcription.d.ts.map +1 -1
  429. package/dist/transcription.js +31 -43
  430. package/dist/transcription.js.map +1 -1
  431. package/dist/types.cjs.map +1 -1
  432. package/dist/types.d.cts +231 -9
  433. package/dist/types.d.cts.map +1 -1
  434. package/dist/types.d.ts +231 -9
  435. package/dist/types.d.ts.map +1 -1
  436. package/dist/types.js.map +1 -1
  437. package/dist/vector-mock.cjs +3 -8
  438. package/dist/vector-mock.cjs.map +1 -1
  439. package/dist/vector-mock.d.cts.map +1 -1
  440. package/dist/vector-mock.d.ts.map +1 -1
  441. package/dist/vector-mock.js +3 -8
  442. package/dist/vector-mock.js.map +1 -1
  443. package/dist/vector-stores.cjs +2 -4
  444. package/dist/vector-stores.cjs.map +1 -1
  445. package/dist/vector-stores.d.cts.map +1 -1
  446. package/dist/vector-stores.d.ts.map +1 -1
  447. package/dist/vector-stores.js +2 -4
  448. package/dist/vector-stores.js.map +1 -1
  449. package/dist/veo-video.cjs +16 -14
  450. package/dist/veo-video.cjs.map +1 -1
  451. package/dist/veo-video.js +10 -8
  452. package/dist/veo-video.js.map +1 -1
  453. package/dist/video.cjs +21 -19
  454. package/dist/video.cjs.map +1 -1
  455. package/dist/video.d.cts.map +1 -1
  456. package/dist/video.d.ts.map +1 -1
  457. package/dist/video.js +20 -18
  458. package/dist/video.js.map +1 -1
  459. package/dist/ws-framing.cjs +12 -6
  460. package/dist/ws-framing.cjs.map +1 -1
  461. package/dist/ws-framing.d.cts +2 -0
  462. package/dist/ws-framing.d.cts.map +1 -1
  463. package/dist/ws-framing.d.ts +2 -0
  464. package/dist/ws-framing.d.ts.map +1 -1
  465. package/dist/ws-framing.js +12 -6
  466. package/dist/ws-framing.js.map +1 -1
  467. package/dist/ws-gemini-live.cjs +131 -96
  468. package/dist/ws-gemini-live.cjs.map +1 -1
  469. package/dist/ws-gemini-live.d.cts +0 -1
  470. package/dist/ws-gemini-live.d.cts.map +1 -1
  471. package/dist/ws-gemini-live.d.ts +0 -1
  472. package/dist/ws-gemini-live.d.ts.map +1 -1
  473. package/dist/ws-gemini-live.js +130 -95
  474. package/dist/ws-gemini-live.js.map +1 -1
  475. package/dist/ws-live.cjs +6 -5
  476. package/dist/ws-live.cjs.map +1 -1
  477. package/dist/ws-live.js +5 -4
  478. package/dist/ws-live.js.map +1 -1
  479. package/dist/ws-realtime.cjs +108 -124
  480. package/dist/ws-realtime.cjs.map +1 -1
  481. package/dist/ws-realtime.d.cts.map +1 -1
  482. package/dist/ws-realtime.d.ts.map +1 -1
  483. package/dist/ws-realtime.js +105 -121
  484. package/dist/ws-realtime.js.map +1 -1
  485. package/dist/ws-responses.cjs +80 -59
  486. package/dist/ws-responses.cjs.map +1 -1
  487. package/dist/ws-responses.d.cts.map +1 -1
  488. package/dist/ws-responses.d.ts.map +1 -1
  489. package/dist/ws-responses.js +79 -58
  490. package/dist/ws-responses.js.map +1 -1
  491. package/package.json +4 -1
  492. package/skills/write-fixtures/SKILL.md +57 -16
@@ -1,19 +1,23 @@
1
- import { InvalidToolArgumentsError, estimatePromptTokens, estimateTokens, extractOverrides, flattenHeaders, generateToolUseId, getContext, getTestId, isCombinedFixtureResponse, isErrorResponse, isJsonObject, isTextResponse, isToolCallResponse, requireEmittedFunctionToolCalls, resolveFixtureBlockOutcome, resolveReasoningForModel, resolveResponse, resolveStrictMode, servedToolArgs, strictNoMatchLogLine, strictNoMatchMessage, strictOverrideField, toolArgsForWire } from "./helpers.js";
1
+ import { renderError } from "./response/errors.js";
2
+ import { resolveRequestDecisions, strictOverrideField } from "./response/policy.js";
3
+ import { InvalidToolArgumentsError, estimatePromptTokens, estimateTokens, extractOverrides, flattenHeaders, generateToolUseId, getContext, getTestId, isCombinedFixtureResponse, isErrorResponse, isJsonObject, isRawResponse, isTextResponse, isToolCallResponse, requireEmittedFunctionToolCalls, resolveFixtureBlockOutcome, resolveReasoningForModel, resolveResponse, servedToolArgs, strictNoMatchLogLine, strictNoMatchMessage, toolArgsForWire } from "./helpers.js";
2
4
  import { writeErrorResponse } from "./sse-writer.js";
3
5
  import { applyChaosAsync } from "./chaos.js";
4
6
  import { planMisbehavior, recordMisbehaviorOutcome } from "./misbehavior.js";
5
7
  import { matchFixtureDiagnostic, recordMatchOptions } from "./router.js";
6
8
  import { proxyAndRecord } from "./recorder.js";
7
- import { createInterruptionSignal } from "./interruption.js";
8
- import { writeEventStream } from "./aws-event-stream.js";
9
+ import { misbehaviorPayloadLength, servedPayloadLength } from "./response/timing.js";
10
+ import { deliverJson, deliverStream } from "./response/deliver.js";
11
+ import { proxyInterruption, withHangUpDetection } from "./response/proxy.js";
12
+ import { eventStreamCodec } from "./aws-event-stream.js";
13
+ import { serveRawResponse } from "./response/raw.js";
14
+ import { mapAnthropicFinish } from "./response/finish.js";
15
+ import { render } from "./response/usage/codecs/converse.js";
9
16
 
10
17
  //#region src/bedrock-converse.ts
11
18
  function converseStopReason(overrideFinishReason, defaultReason) {
12
19
  if (!overrideFinishReason) return defaultReason;
13
- if (overrideFinishReason === "stop") return "end_turn";
14
- if (overrideFinishReason === "tool_calls") return "tool_use";
15
- if (overrideFinishReason === "length") return "max_tokens";
16
- return overrideFinishReason;
20
+ return mapAnthropicFinish(overrideFinishReason);
17
21
  }
18
22
  /**
19
23
  * Build Converse-format usage from fixture overrides.
@@ -24,18 +28,7 @@ function converseStopReason(overrideFinishReason, defaultReason) {
24
28
  * usage should supply explicit `usage` overrides in their fixture.
25
29
  */
26
30
  function converseUsage(overrides) {
27
- if (!overrides?.usage) return {
28
- inputTokens: 0,
29
- outputTokens: 0,
30
- totalTokens: 0
31
- };
32
- const inputTokens = overrides.usage.input_tokens ?? overrides.usage.prompt_tokens ?? 0;
33
- const outputTokens = overrides.usage.output_tokens ?? overrides.usage.completion_tokens ?? 0;
34
- return {
35
- inputTokens,
36
- outputTokens,
37
- totalTokens: inputTokens + outputTokens
38
- };
31
+ return render(overrides);
39
32
  }
40
33
  function parseConverseToolArgumentsForStream(toolCall, logger) {
41
34
  return servedToolArgs(toolCall, "string", logger).text;
@@ -519,7 +512,7 @@ function prepareConverseMisbehavior(plan, request, stream, defaults, headers) {
519
512
  } : block;
520
513
  });
521
514
  }
522
- const reasoning = plan.reasoning ?? resolveReasoningForModel("reasoning" in response ? response.reasoning : void 0, request.model, resolveStrictMode(defaults.strict, headers), defaults.logger) ?? "";
515
+ const reasoning = plan.reasoning ?? resolveReasoningForModel("reasoning" in response ? response.reasoning : void 0, request.model, resolveRequestDecisions(defaults.strict, headers).reasoningSuppression, defaults.logger) ?? "";
523
516
  const servedToolCalls = blocks.flatMap((block) => block.type === "toolCall" ? [{
524
517
  name: block.name,
525
518
  arguments: block.arguments,
@@ -538,11 +531,10 @@ function prepareConverseMisbehavior(plan, request, stream, defaults, headers) {
538
531
  blocks,
539
532
  reasoning,
540
533
  stopReason,
541
- usage: {
542
- inputTokens,
543
- outputTokens,
544
- totalTokens: inputTokens + outputTokens
545
- }
534
+ usage: render(void 0, {
535
+ input: inputTokens,
536
+ output: outputTokens
537
+ })
546
538
  };
547
539
  }
548
540
  function buildConverseMisbehaviorResponse(prepared) {
@@ -651,10 +643,10 @@ async function handleConverse(req, res, raw, modelId, fixtures, journal, default
651
643
  fixture: null
652
644
  }
653
645
  });
654
- writeErrorResponse(res, 400, JSON.stringify({ error: {
646
+ writeErrorResponse(res, 400, renderError("bedrock", "validation", {
655
647
  message: `Malformed JSON: ${detail}`,
656
648
  type: "invalid_request_error"
657
- } }));
649
+ }).body);
658
650
  return;
659
651
  }
660
652
  if (!isJsonObject(converseReq)) {
@@ -668,10 +660,10 @@ async function handleConverse(req, res, raw, modelId, fixtures, journal, default
668
660
  fixture: null
669
661
  }
670
662
  });
671
- writeErrorResponse(res, 400, JSON.stringify({ error: {
663
+ writeErrorResponse(res, 400, renderError("bedrock", "validation", {
672
664
  message: "Request body must be a JSON object",
673
665
  type: "invalid_request_error"
674
- } }));
666
+ }).body);
675
667
  return;
676
668
  }
677
669
  const messageError = !Array.isArray(converseReq.messages) ? "Invalid request: messages array is required" : validateConverseMessages(converseReq) ?? validateConverseSystem(converseReq) ?? validateConverseTools(converseReq);
@@ -686,17 +678,20 @@ async function handleConverse(req, res, raw, modelId, fixtures, journal, default
686
678
  fixture: null
687
679
  }
688
680
  });
689
- writeErrorResponse(res, 400, JSON.stringify({ error: {
681
+ writeErrorResponse(res, 400, renderError("bedrock", "validation", {
690
682
  message: messageError,
691
683
  type: "invalid_request_error"
692
- } }));
684
+ }).body);
693
685
  return;
694
686
  }
695
687
  const completionReq = converseToCompletionRequest(converseReq, modelId, logger);
696
688
  completionReq._endpointType = "chat";
697
689
  completionReq._context = getContext(req);
698
690
  const testId = getTestId(req);
699
- const { fixture, skippedBySequenceOrTurn } = matchFixtureDiagnostic(fixtures, completionReq, journal.getFixtureMatchCountsForTest(testId), defaults.requestTransform, recordMatchOptions(!!defaults.record, defaults.logger));
691
+ const { fixture, skippedBySequenceOrTurn } = matchFixtureDiagnostic(fixtures, completionReq, journal.getFixtureMatchCountsForTest(testId), defaults.requestTransform, {
692
+ ...recordMatchOptions(!!defaults.record, defaults.logger),
693
+ wire: "bedrock-converse"
694
+ });
700
695
  if (fixture) logger.debug(`Fixture matched: ${JSON.stringify(fixture.match).slice(0, 120)}`);
701
696
  else logger.debug(`No fixture matched for request`);
702
697
  if (fixture) journal.incrementFixtureMatchCount(fixture, fixtures, testId);
@@ -707,7 +702,7 @@ async function handleConverse(req, res, raw, modelId, fixtures, journal, default
707
702
  body: completionReq
708
703
  }, fixture ? "fixture" : "proxy", defaults.registry, defaults.logger)) return;
709
704
  if (!fixture) {
710
- if (resolveStrictMode(defaults.strict, req.headers)) {
705
+ if (resolveRequestDecisions(defaults.strict, req.headers).fixtureMiss) {
711
706
  const strictStatus = 503;
712
707
  const strictMessage = strictNoMatchMessage(skippedBySequenceOrTurn);
713
708
  logger.error(strictNoMatchLogLine(req.method ?? "POST", urlPath, skippedBySequenceOrTurn));
@@ -722,14 +717,14 @@ async function handleConverse(req, res, raw, modelId, fixtures, journal, default
722
717
  ...strictOverrideField(defaults.strict, req.headers)
723
718
  }
724
719
  });
725
- writeErrorResponse(res, strictStatus, JSON.stringify({ error: {
720
+ writeErrorResponse(res, strictStatus, renderError("bedrock", "strict-miss", {
726
721
  message: strictMessage,
727
722
  type: "invalid_request_error"
728
- } }));
723
+ }).body);
729
724
  return;
730
725
  }
731
726
  if (defaults.record) {
732
- const outcome = await proxyAndRecord(req, res, completionReq, "bedrock", urlPath, fixtures, defaults, raw);
727
+ const { outcome, clientHungUp } = await withHangUpDetection(req, res, () => proxyAndRecord(req, res, completionReq, "bedrock", urlPath, fixtures, defaults, raw));
733
728
  if (outcome === "handled_by_hook") return;
734
729
  if (outcome !== "not_configured") {
735
730
  journal.add({
@@ -740,7 +735,8 @@ async function handleConverse(req, res, raw, modelId, fixtures, journal, default
740
735
  response: {
741
736
  status: res.statusCode ?? 200,
742
737
  fixture: null,
743
- source: "proxy"
738
+ source: "proxy",
739
+ ...proxyInterruption(res, clientHungUp)
744
740
  }
745
741
  });
746
742
  return;
@@ -757,10 +753,10 @@ async function handleConverse(req, res, raw, modelId, fixtures, journal, default
757
753
  ...strictOverrideField(defaults.strict, req.headers)
758
754
  }
759
755
  });
760
- writeErrorResponse(res, 404, JSON.stringify({ error: {
756
+ writeErrorResponse(res, 404, renderError("bedrock", "fixture-miss", {
761
757
  message: "No fixture matched",
762
758
  type: "invalid_request_error"
763
- } }));
759
+ }).body);
764
760
  return;
765
761
  }
766
762
  const response = await resolveResponse(fixture, completionReq);
@@ -800,18 +796,26 @@ async function handleConverse(req, res, raw, modelId, fixtures, journal, default
800
796
  });
801
797
  const type = misbehavior.status === 400 ? "ValidationException" : "InternalServerException";
802
798
  res.setHeader("x-amzn-errortype", type);
803
- writeErrorResponse(res, misbehavior.status, JSON.stringify({
804
- __type: type,
799
+ writeErrorResponse(res, misbehavior.status, renderError("bedrock-converse", "misbehavior", {
800
+ type,
805
801
  message: misbehavior.message,
806
802
  code: misbehavior.code
807
- }));
803
+ }).body);
808
804
  return;
809
805
  }
806
+ const jsonOpts = (payloadLength, duplicateId = false) => ({
807
+ surface: "other",
808
+ payloadLength,
809
+ chunkSize: Math.max(1, fixture.chunkSize ?? defaults.chunkSize),
810
+ recordedTimings: fixture.recordedTimings,
811
+ duplicateId,
812
+ replaySpeed: fixture.replaySpeed ?? defaults.replaySpeed
813
+ });
810
814
  if (misbehavior.kind === "applied") {
811
815
  const prepared = prepareConverseMisbehavior(misbehavior, completionReq, false, defaults, req.headers);
812
816
  misbehavior = prepared.plan;
813
817
  const body = buildConverseMisbehaviorResponse(prepared);
814
- addResponseEntry({
818
+ await deliverJson(res, addResponseEntry({
815
819
  method: req.method ?? "POST",
816
820
  path: urlPath,
817
821
  headers: flattenHeaders(req.headers),
@@ -820,9 +824,24 @@ async function handleConverse(req, res, raw, modelId, fixtures, journal, default
820
824
  status: 200,
821
825
  fixture
822
826
  }
827
+ }), fixture, () => body, jsonOpts(misbehaviorPayloadLength(prepared.plan, prepared.plan.reasoning === void 0 ? prepared.reasoning : void 0), !!prepared.plan.duplicateId));
828
+ return;
829
+ }
830
+ if (isRawResponse(response)) {
831
+ await serveRawResponse({
832
+ wire: "bedrock-converse",
833
+ stream: false,
834
+ req,
835
+ res,
836
+ fixture,
837
+ response,
838
+ body: completionReq,
839
+ journal,
840
+ defaults,
841
+ testId,
842
+ misbehaviorSummary: misbehavior.summary,
843
+ errorWire: "bedrock-converse"
823
844
  });
824
- res.writeHead(200, { "Content-Type": "application/json" });
825
- res.end(JSON.stringify(body));
826
845
  return;
827
846
  }
828
847
  if (isErrorResponse(response)) {
@@ -837,21 +856,17 @@ async function handleConverse(req, res, raw, modelId, fixtures, journal, default
837
856
  fixture
838
857
  }
839
858
  });
840
- const errBody = {
841
- type: "error",
842
- error: {
843
- type: response.error.type ?? "invalid_request_error",
844
- message: response.error.message
845
- }
846
- };
847
- writeErrorResponse(res, status, JSON.stringify(errBody), { retryAfter: response.retryAfter });
859
+ writeErrorResponse(res, status, renderError("bedrock", "fixture", {
860
+ message: response.error.message,
861
+ type: response.error.type ?? "invalid_request_error"
862
+ }).body, { retryAfter: response.retryAfter });
848
863
  return;
849
864
  }
850
865
  if (isCombinedFixtureResponse(response)) {
851
866
  if (response.webSearches?.length) logger.warn("webSearches in fixture response are not supported for Bedrock Converse API — ignoring");
852
867
  const overrides = extractOverrides(response);
853
- const effReasoning = resolveReasoningForModel(response.reasoning, completionReq.model, resolveStrictMode(defaults.strict, req.headers), logger);
854
- addResponseEntry({
868
+ const effReasoning = resolveReasoningForModel(response.reasoning, completionReq.model, resolveRequestDecisions(defaults.strict, req.headers).reasoningSuppression, logger);
869
+ const journalEntry = addResponseEntry({
855
870
  method: req.method ?? "POST",
856
871
  path: urlPath,
857
872
  headers: flattenHeaders(req.headers),
@@ -862,16 +877,14 @@ async function handleConverse(req, res, raw, modelId, fixtures, journal, default
862
877
  }
863
878
  });
864
879
  const functionToolCalls = requireEmittedFunctionToolCalls(response, "Bedrock Converse");
865
- const body = buildConverseContentWithToolCallsResponse(response.content ?? "", functionToolCalls, logger, effReasoning, overrides, response.blocks);
866
- res.writeHead(200, { "Content-Type": "application/json" });
867
- res.end(JSON.stringify(body));
880
+ await deliverJson(res, journalEntry, fixture, () => buildConverseContentWithToolCallsResponse(response.content ?? "", functionToolCalls, logger, effReasoning, overrides, response.blocks), jsonOpts(servedPayloadLength(response, effReasoning)));
868
881
  return;
869
882
  }
870
883
  if (isTextResponse(response)) {
871
884
  if (response.webSearches?.length) logger.warn("webSearches in fixture response are not supported for Bedrock Converse API — ignoring");
872
885
  const overrides = extractOverrides(response);
873
- const effReasoning = resolveReasoningForModel(response.reasoning, completionReq.model, resolveStrictMode(defaults.strict, req.headers), logger);
874
- addResponseEntry({
886
+ const effReasoning = resolveReasoningForModel(response.reasoning, completionReq.model, resolveRequestDecisions(defaults.strict, req.headers).reasoningSuppression, logger);
887
+ await deliverJson(res, addResponseEntry({
875
888
  method: req.method ?? "POST",
876
889
  path: urlPath,
877
890
  headers: flattenHeaders(req.headers),
@@ -880,17 +893,14 @@ async function handleConverse(req, res, raw, modelId, fixtures, journal, default
880
893
  status: 200,
881
894
  fixture
882
895
  }
883
- });
884
- const body = buildConverseTextResponse(response.content, effReasoning, overrides);
885
- res.writeHead(200, { "Content-Type": "application/json" });
886
- res.end(JSON.stringify(body));
896
+ }), fixture, () => buildConverseTextResponse(response.content, effReasoning, overrides), jsonOpts(servedPayloadLength(response, effReasoning)));
887
897
  return;
888
898
  }
889
899
  if (isToolCallResponse(response)) {
890
900
  if (response.webSearches?.length) logger.warn("webSearches in fixture response are not supported for Bedrock Converse API — ignoring");
891
901
  const overrides = extractOverrides(response);
892
- const effReasoning = resolveReasoningForModel(response.reasoning, completionReq.model, resolveStrictMode(defaults.strict, req.headers), logger);
893
- addResponseEntry({
902
+ const effReasoning = resolveReasoningForModel(response.reasoning, completionReq.model, resolveRequestDecisions(defaults.strict, req.headers).reasoningSuppression, logger);
903
+ const journalEntry = addResponseEntry({
894
904
  method: req.method ?? "POST",
895
905
  path: urlPath,
896
906
  headers: flattenHeaders(req.headers),
@@ -900,9 +910,8 @@ async function handleConverse(req, res, raw, modelId, fixtures, journal, default
900
910
  fixture
901
911
  }
902
912
  });
903
- const body = buildConverseToolCallResponse(requireEmittedFunctionToolCalls(response, "Bedrock Converse"), logger, effReasoning, overrides);
904
- res.writeHead(200, { "Content-Type": "application/json" });
905
- res.end(JSON.stringify(body));
913
+ const functionToolCalls = requireEmittedFunctionToolCalls(response, "Bedrock Converse");
914
+ await deliverJson(res, journalEntry, fixture, () => buildConverseToolCallResponse(functionToolCalls, logger, effReasoning, overrides), jsonOpts(servedPayloadLength(response, effReasoning)));
906
915
  return;
907
916
  }
908
917
  addResponseEntry({
@@ -915,10 +924,10 @@ async function handleConverse(req, res, raw, modelId, fixtures, journal, default
915
924
  fixture
916
925
  }
917
926
  });
918
- writeErrorResponse(res, 500, JSON.stringify({ error: {
927
+ writeErrorResponse(res, 500, renderError("bedrock", "unknown-response", {
919
928
  message: "Fixture response did not match any known type",
920
929
  type: "server_error"
921
- } }));
930
+ }).body);
922
931
  }
923
932
  async function handleConverseStream(req, res, raw, modelId, fixtures, journal, defaults, setCorsHeaders) {
924
933
  const { logger } = defaults;
@@ -939,10 +948,10 @@ async function handleConverseStream(req, res, raw, modelId, fixtures, journal, d
939
948
  fixture: null
940
949
  }
941
950
  });
942
- writeErrorResponse(res, 400, JSON.stringify({ error: {
951
+ writeErrorResponse(res, 400, renderError("bedrock", "validation", {
943
952
  message: `Malformed JSON: ${detail}`,
944
953
  type: "invalid_request_error"
945
- } }));
954
+ }).body);
946
955
  return;
947
956
  }
948
957
  if (!isJsonObject(converseReq)) {
@@ -956,10 +965,10 @@ async function handleConverseStream(req, res, raw, modelId, fixtures, journal, d
956
965
  fixture: null
957
966
  }
958
967
  });
959
- writeErrorResponse(res, 400, JSON.stringify({ error: {
968
+ writeErrorResponse(res, 400, renderError("bedrock", "validation", {
960
969
  message: "Request body must be a JSON object",
961
970
  type: "invalid_request_error"
962
- } }));
971
+ }).body);
963
972
  return;
964
973
  }
965
974
  const messageError = !Array.isArray(converseReq.messages) ? "Invalid request: messages array is required" : validateConverseMessages(converseReq) ?? validateConverseSystem(converseReq) ?? validateConverseTools(converseReq);
@@ -974,10 +983,10 @@ async function handleConverseStream(req, res, raw, modelId, fixtures, journal, d
974
983
  fixture: null
975
984
  }
976
985
  });
977
- writeErrorResponse(res, 400, JSON.stringify({ error: {
986
+ writeErrorResponse(res, 400, renderError("bedrock", "validation", {
978
987
  message: messageError,
979
988
  type: "invalid_request_error"
980
- } }));
989
+ }).body);
981
990
  return;
982
991
  }
983
992
  const completionReq = converseToCompletionRequest(converseReq, modelId, logger);
@@ -985,7 +994,10 @@ async function handleConverseStream(req, res, raw, modelId, fixtures, journal, d
985
994
  completionReq._endpointType = "chat";
986
995
  completionReq._context = getContext(req);
987
996
  const testId = getTestId(req);
988
- const { fixture, skippedBySequenceOrTurn } = matchFixtureDiagnostic(fixtures, completionReq, journal.getFixtureMatchCountsForTest(testId), defaults.requestTransform, recordMatchOptions(!!defaults.record, defaults.logger));
997
+ const { fixture, skippedBySequenceOrTurn } = matchFixtureDiagnostic(fixtures, completionReq, journal.getFixtureMatchCountsForTest(testId), defaults.requestTransform, {
998
+ ...recordMatchOptions(!!defaults.record, defaults.logger),
999
+ wire: "bedrock-converse"
1000
+ });
989
1001
  if (fixture) logger.debug(`Fixture matched: ${JSON.stringify(fixture.match).slice(0, 120)}`);
990
1002
  else logger.debug(`No fixture matched for request`);
991
1003
  if (fixture) journal.incrementFixtureMatchCount(fixture, fixtures, testId);
@@ -996,7 +1008,7 @@ async function handleConverseStream(req, res, raw, modelId, fixtures, journal, d
996
1008
  body: completionReq
997
1009
  }, fixture ? "fixture" : "proxy", defaults.registry, defaults.logger)) return;
998
1010
  if (!fixture) {
999
- if (resolveStrictMode(defaults.strict, req.headers)) {
1011
+ if (resolveRequestDecisions(defaults.strict, req.headers).fixtureMiss) {
1000
1012
  const strictStatus = 503;
1001
1013
  const strictMessage = strictNoMatchMessage(skippedBySequenceOrTurn);
1002
1014
  logger.error(strictNoMatchLogLine(req.method ?? "POST", urlPath, skippedBySequenceOrTurn));
@@ -1011,14 +1023,14 @@ async function handleConverseStream(req, res, raw, modelId, fixtures, journal, d
1011
1023
  ...strictOverrideField(defaults.strict, req.headers)
1012
1024
  }
1013
1025
  });
1014
- writeErrorResponse(res, strictStatus, JSON.stringify({ error: {
1026
+ writeErrorResponse(res, strictStatus, renderError("bedrock", "strict-miss", {
1015
1027
  message: strictMessage,
1016
1028
  type: "invalid_request_error"
1017
- } }));
1029
+ }).body);
1018
1030
  return;
1019
1031
  }
1020
1032
  if (defaults.record) {
1021
- const outcome = await proxyAndRecord(req, res, completionReq, "bedrock", urlPath, fixtures, defaults, raw);
1033
+ const { outcome, clientHungUp } = await withHangUpDetection(req, res, () => proxyAndRecord(req, res, completionReq, "bedrock", urlPath, fixtures, defaults, raw));
1022
1034
  if (outcome === "handled_by_hook") return;
1023
1035
  if (outcome !== "not_configured") {
1024
1036
  journal.add({
@@ -1029,7 +1041,8 @@ async function handleConverseStream(req, res, raw, modelId, fixtures, journal, d
1029
1041
  response: {
1030
1042
  status: res.statusCode ?? 200,
1031
1043
  fixture: null,
1032
- source: "proxy"
1044
+ source: "proxy",
1045
+ ...proxyInterruption(res, clientHungUp)
1033
1046
  }
1034
1047
  });
1035
1048
  return;
@@ -1046,10 +1059,10 @@ async function handleConverseStream(req, res, raw, modelId, fixtures, journal, d
1046
1059
  ...strictOverrideField(defaults.strict, req.headers)
1047
1060
  }
1048
1061
  });
1049
- writeErrorResponse(res, 404, JSON.stringify({ error: {
1062
+ writeErrorResponse(res, 404, renderError("bedrock", "fixture-miss", {
1050
1063
  message: "No fixture matched",
1051
1064
  type: "invalid_request_error"
1052
- } }));
1065
+ }).body);
1053
1066
  return;
1054
1067
  }
1055
1068
  const response = await resolveResponse(fixture, completionReq);
@@ -1089,20 +1102,25 @@ async function handleConverseStream(req, res, raw, modelId, fixtures, journal, d
1089
1102
  });
1090
1103
  const type = misbehavior.status === 400 ? "ValidationException" : "InternalServerException";
1091
1104
  res.setHeader("x-amzn-errortype", type);
1092
- writeErrorResponse(res, misbehavior.status, JSON.stringify({
1093
- __type: type,
1105
+ writeErrorResponse(res, misbehavior.status, renderError("bedrock-converse", "misbehavior", {
1106
+ type,
1094
1107
  message: misbehavior.message,
1095
1108
  code: misbehavior.code
1096
- }));
1109
+ }).body);
1097
1110
  return;
1098
1111
  }
1099
- const latency = fixture.latency ?? defaults.latency;
1100
1112
  const chunkSize = Math.max(1, fixture.chunkSize ?? defaults.chunkSize);
1113
+ const streamTiming = {
1114
+ latency: fixture.latency ?? defaults.latency,
1115
+ streamingProfile: fixture.streamingProfile,
1116
+ recordedTimings: fixture.recordedTimings,
1117
+ replaySpeed: fixture.replaySpeed ?? defaults.replaySpeed
1118
+ };
1101
1119
  if (misbehavior.kind === "applied") {
1102
1120
  const prepared = prepareConverseMisbehavior(misbehavior, completionReq, true, defaults, req.headers);
1103
1121
  misbehavior = prepared.plan;
1104
1122
  const events = buildConverseMisbehaviorEvents(prepared, chunkSize);
1105
- const entry = addResponseEntry({
1123
+ await deliverStream(res, addResponseEntry({
1106
1124
  method: req.method ?? "POST",
1107
1125
  path: urlPath,
1108
1126
  headers: flattenHeaders(req.headers),
@@ -1111,21 +1129,24 @@ async function handleConverseStream(req, res, raw, modelId, fixtures, journal, d
1111
1129
  status: 200,
1112
1130
  fixture
1113
1131
  }
1132
+ }), fixture, eventStreamCodec(), events, streamTiming);
1133
+ return;
1134
+ }
1135
+ if (isRawResponse(response)) {
1136
+ await serveRawResponse({
1137
+ wire: "bedrock-converse",
1138
+ stream: true,
1139
+ req,
1140
+ res,
1141
+ fixture,
1142
+ response,
1143
+ body: completionReq,
1144
+ journal,
1145
+ defaults,
1146
+ testId,
1147
+ misbehaviorSummary: misbehavior.summary,
1148
+ errorWire: "bedrock-converse"
1114
1149
  });
1115
- const interruption = createInterruptionSignal(fixture);
1116
- if (!await writeEventStream(res, events, {
1117
- latency,
1118
- streamingProfile: fixture.streamingProfile,
1119
- recordedTimings: fixture.recordedTimings,
1120
- replaySpeed: fixture.replaySpeed ?? defaults.replaySpeed,
1121
- signal: interruption?.signal,
1122
- onChunkSent: interruption?.tick
1123
- })) {
1124
- if (!res.writableEnded) res.destroy();
1125
- entry.response.interrupted = true;
1126
- entry.response.interruptReason = interruption?.reason();
1127
- }
1128
- interruption?.cleanup();
1129
1150
  return;
1130
1151
  }
1131
1152
  if (isErrorResponse(response)) {
@@ -1140,20 +1161,16 @@ async function handleConverseStream(req, res, raw, modelId, fixtures, journal, d
1140
1161
  fixture
1141
1162
  }
1142
1163
  });
1143
- const errBody = {
1144
- type: "error",
1145
- error: {
1146
- type: response.error.type ?? "invalid_request_error",
1147
- message: response.error.message
1148
- }
1149
- };
1150
- writeErrorResponse(res, status, JSON.stringify(errBody), { retryAfter: response.retryAfter });
1164
+ writeErrorResponse(res, status, renderError("bedrock", "fixture", {
1165
+ message: response.error.message,
1166
+ type: response.error.type ?? "invalid_request_error"
1167
+ }).body, { retryAfter: response.retryAfter });
1151
1168
  return;
1152
1169
  }
1153
1170
  if (isCombinedFixtureResponse(response)) {
1154
1171
  if (response.webSearches?.length) logger.warn("webSearches in fixture response are not supported for Bedrock Converse API — ignoring");
1155
1172
  const overrides = extractOverrides(response);
1156
- const effReasoning = resolveReasoningForModel(response.reasoning, completionReq.model, resolveStrictMode(defaults.strict, req.headers), logger);
1173
+ const effReasoning = resolveReasoningForModel(response.reasoning, completionReq.model, resolveRequestDecisions(defaults.strict, req.headers).reasoningSuppression, logger);
1157
1174
  const journalEntry = addResponseEntry({
1158
1175
  method: req.method ?? "POST",
1159
1176
  path: urlPath,
@@ -1166,26 +1183,13 @@ async function handleConverseStream(req, res, raw, modelId, fixtures, journal, d
1166
1183
  });
1167
1184
  const functionToolCalls = requireEmittedFunctionToolCalls(response, "Bedrock Converse");
1168
1185
  const events = buildBedrockStreamContentWithToolCallsEvents(response.content ?? "", functionToolCalls, chunkSize, logger, effReasoning, overrides, response.blocks);
1169
- const interruption = createInterruptionSignal(fixture);
1170
- if (!await writeEventStream(res, events, {
1171
- latency,
1172
- streamingProfile: fixture.streamingProfile,
1173
- recordedTimings: fixture.recordedTimings,
1174
- replaySpeed: fixture.replaySpeed ?? defaults.replaySpeed,
1175
- signal: interruption?.signal,
1176
- onChunkSent: interruption?.tick
1177
- })) {
1178
- if (!res.writableEnded) res.destroy();
1179
- journalEntry.response.interrupted = true;
1180
- journalEntry.response.interruptReason = interruption?.reason();
1181
- }
1182
- interruption?.cleanup();
1186
+ await deliverStream(res, journalEntry, fixture, eventStreamCodec(), events, streamTiming);
1183
1187
  return;
1184
1188
  }
1185
1189
  if (isTextResponse(response)) {
1186
1190
  if (response.webSearches?.length) logger.warn("webSearches in fixture response are not supported for Bedrock Converse API — ignoring");
1187
1191
  const overrides = extractOverrides(response);
1188
- const effReasoning = resolveReasoningForModel(response.reasoning, completionReq.model, resolveStrictMode(defaults.strict, req.headers), logger);
1192
+ const effReasoning = resolveReasoningForModel(response.reasoning, completionReq.model, resolveRequestDecisions(defaults.strict, req.headers).reasoningSuppression, logger);
1189
1193
  const journalEntry = addResponseEntry({
1190
1194
  method: req.method ?? "POST",
1191
1195
  path: urlPath,
@@ -1197,26 +1201,13 @@ async function handleConverseStream(req, res, raw, modelId, fixtures, journal, d
1197
1201
  }
1198
1202
  });
1199
1203
  const events = buildBedrockStreamTextEvents(response.content, chunkSize, effReasoning, overrides);
1200
- const interruption = createInterruptionSignal(fixture);
1201
- if (!await writeEventStream(res, events, {
1202
- latency,
1203
- streamingProfile: fixture.streamingProfile,
1204
- recordedTimings: fixture.recordedTimings,
1205
- replaySpeed: fixture.replaySpeed ?? defaults.replaySpeed,
1206
- signal: interruption?.signal,
1207
- onChunkSent: interruption?.tick
1208
- })) {
1209
- if (!res.writableEnded) res.destroy();
1210
- journalEntry.response.interrupted = true;
1211
- journalEntry.response.interruptReason = interruption?.reason();
1212
- }
1213
- interruption?.cleanup();
1204
+ await deliverStream(res, journalEntry, fixture, eventStreamCodec(), events, streamTiming);
1214
1205
  return;
1215
1206
  }
1216
1207
  if (isToolCallResponse(response)) {
1217
1208
  if (response.webSearches?.length) logger.warn("webSearches in fixture response are not supported for Bedrock Converse API — ignoring");
1218
1209
  const overrides = extractOverrides(response);
1219
- const effReasoning = resolveReasoningForModel(response.reasoning, completionReq.model, resolveStrictMode(defaults.strict, req.headers), logger);
1210
+ const effReasoning = resolveReasoningForModel(response.reasoning, completionReq.model, resolveRequestDecisions(defaults.strict, req.headers).reasoningSuppression, logger);
1220
1211
  const journalEntry = addResponseEntry({
1221
1212
  method: req.method ?? "POST",
1222
1213
  path: urlPath,
@@ -1228,20 +1219,7 @@ async function handleConverseStream(req, res, raw, modelId, fixtures, journal, d
1228
1219
  }
1229
1220
  });
1230
1221
  const events = buildBedrockStreamToolCallEvents(requireEmittedFunctionToolCalls(response, "Bedrock Converse"), chunkSize, logger, effReasoning, overrides);
1231
- const interruption = createInterruptionSignal(fixture);
1232
- if (!await writeEventStream(res, events, {
1233
- latency,
1234
- streamingProfile: fixture.streamingProfile,
1235
- recordedTimings: fixture.recordedTimings,
1236
- replaySpeed: fixture.replaySpeed ?? defaults.replaySpeed,
1237
- signal: interruption?.signal,
1238
- onChunkSent: interruption?.tick
1239
- })) {
1240
- if (!res.writableEnded) res.destroy();
1241
- journalEntry.response.interrupted = true;
1242
- journalEntry.response.interruptReason = interruption?.reason();
1243
- }
1244
- interruption?.cleanup();
1222
+ await deliverStream(res, journalEntry, fixture, eventStreamCodec(), events, streamTiming);
1245
1223
  return;
1246
1224
  }
1247
1225
  addResponseEntry({
@@ -1254,10 +1232,10 @@ async function handleConverseStream(req, res, raw, modelId, fixtures, journal, d
1254
1232
  fixture
1255
1233
  }
1256
1234
  });
1257
- writeErrorResponse(res, 500, JSON.stringify({ error: {
1235
+ writeErrorResponse(res, 500, renderError("bedrock", "unknown-response", {
1258
1236
  message: "Fixture response did not match any known type",
1259
1237
  type: "server_error"
1260
- } }));
1238
+ }).body);
1261
1239
  }
1262
1240
 
1263
1241
  //#endregion