@copilotkit/aimock 1.42.1 → 1.44.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 (442) hide show
  1. package/.claude-plugin/marketplace.json +1 -1
  2. package/.claude-plugin/plugin.json +1 -1
  3. package/CHANGELOG.md +65 -0
  4. package/README.md +108 -16
  5. package/dist/agui-handler.d.ts.map +1 -1
  6. package/dist/agui-mock.cjs +1 -1
  7. package/dist/agui-mock.cjs.map +1 -1
  8. package/dist/agui-mock.d.cts.map +1 -1
  9. package/dist/agui-mock.d.ts.map +1 -1
  10. package/dist/agui-mock.js +1 -1
  11. package/dist/agui-mock.js.map +1 -1
  12. package/dist/agui-recorder.cjs +33 -11
  13. package/dist/agui-recorder.cjs.map +1 -1
  14. package/dist/agui-recorder.d.cts +10 -1
  15. package/dist/agui-recorder.d.cts.map +1 -1
  16. package/dist/agui-recorder.d.ts +10 -1
  17. package/dist/agui-recorder.d.ts.map +1 -1
  18. package/dist/agui-recorder.js +33 -11
  19. package/dist/agui-recorder.js.map +1 -1
  20. package/dist/agui-types.d.cts +1 -0
  21. package/dist/agui-types.d.cts.map +1 -1
  22. package/dist/agui-types.d.ts +1 -0
  23. package/dist/agui-types.d.ts.map +1 -1
  24. package/dist/aimock-cli.cjs +38 -10
  25. package/dist/aimock-cli.cjs.map +1 -1
  26. package/dist/aimock-cli.d.cts +5 -0
  27. package/dist/aimock-cli.d.cts.map +1 -1
  28. package/dist/aimock-cli.d.ts +5 -0
  29. package/dist/aimock-cli.d.ts.map +1 -1
  30. package/dist/aimock-cli.js +38 -10
  31. package/dist/aimock-cli.js.map +1 -1
  32. package/dist/batches.cjs +458 -0
  33. package/dist/batches.cjs.map +1 -0
  34. package/dist/batches.d.cts +57 -0
  35. package/dist/batches.d.cts.map +1 -0
  36. package/dist/batches.d.ts +57 -0
  37. package/dist/batches.d.ts.map +1 -0
  38. package/dist/batches.js +453 -0
  39. package/dist/batches.js.map +1 -0
  40. package/dist/bedrock-converse.cjs +44 -12
  41. package/dist/bedrock-converse.cjs.map +1 -1
  42. package/dist/bedrock-converse.d.cts.map +1 -1
  43. package/dist/bedrock-converse.d.ts.map +1 -1
  44. package/dist/bedrock-converse.js +46 -14
  45. package/dist/bedrock-converse.js.map +1 -1
  46. package/dist/bedrock.cjs +10 -8
  47. package/dist/bedrock.cjs.map +1 -1
  48. package/dist/bedrock.d.cts.map +1 -1
  49. package/dist/bedrock.d.ts.map +1 -1
  50. package/dist/bedrock.js +12 -10
  51. package/dist/bedrock.js.map +1 -1
  52. package/dist/byteplus-video.cjs +3 -3
  53. package/dist/byteplus-video.cjs.map +1 -1
  54. package/dist/byteplus-video.js +4 -4
  55. package/dist/byteplus-video.js.map +1 -1
  56. package/dist/chaos.cjs +625 -72
  57. package/dist/chaos.cjs.map +1 -1
  58. package/dist/chaos.d.cts +164 -7
  59. package/dist/chaos.d.cts.map +1 -1
  60. package/dist/chaos.d.ts +164 -7
  61. package/dist/chaos.d.ts.map +1 -1
  62. package/dist/chaos.js +616 -74
  63. package/dist/chaos.js.map +1 -1
  64. package/dist/cli.cjs +131 -30
  65. package/dist/cli.cjs.map +1 -1
  66. package/dist/cli.js +132 -31
  67. package/dist/cli.js.map +1 -1
  68. package/dist/cohere.cjs +37 -9
  69. package/dist/cohere.cjs.map +1 -1
  70. package/dist/cohere.d.cts.map +1 -1
  71. package/dist/cohere.d.ts.map +1 -1
  72. package/dist/cohere.js +39 -11
  73. package/dist/cohere.js.map +1 -1
  74. package/dist/config-loader.cjs +1 -1
  75. package/dist/config-loader.js +1 -1
  76. package/dist/constants.cjs +8 -0
  77. package/dist/constants.cjs.map +1 -1
  78. package/dist/constants.d.cts +6 -2
  79. package/dist/constants.d.ts +6 -2
  80. package/dist/constants.js +8 -1
  81. package/dist/constants.js.map +1 -1
  82. package/dist/convert.cjs +1 -1
  83. package/dist/convert.cjs.map +1 -1
  84. package/dist/convert.js +1 -1
  85. package/dist/convert.js.map +1 -1
  86. package/dist/echo-text.cjs +65 -0
  87. package/dist/echo-text.cjs.map +1 -0
  88. package/dist/echo-text.d.cts +22 -0
  89. package/dist/echo-text.d.cts.map +1 -0
  90. package/dist/echo-text.d.ts +22 -0
  91. package/dist/echo-text.d.ts.map +1 -0
  92. package/dist/echo-text.js +65 -0
  93. package/dist/echo-text.js.map +1 -0
  94. package/dist/elevenlabs-audio.cjs +3 -3
  95. package/dist/elevenlabs-audio.cjs.map +1 -1
  96. package/dist/elevenlabs-audio.js +4 -4
  97. package/dist/elevenlabs-audio.js.map +1 -1
  98. package/dist/elevenlabs-voice.cjs +1053 -0
  99. package/dist/elevenlabs-voice.cjs.map +1 -0
  100. package/dist/elevenlabs-voice.d.cts +72 -0
  101. package/dist/elevenlabs-voice.d.cts.map +1 -0
  102. package/dist/elevenlabs-voice.d.ts +72 -0
  103. package/dist/elevenlabs-voice.d.ts.map +1 -0
  104. package/dist/elevenlabs-voice.js +1048 -0
  105. package/dist/elevenlabs-voice.js.map +1 -0
  106. package/dist/embeddings.cjs +26 -5
  107. package/dist/embeddings.cjs.map +1 -1
  108. package/dist/embeddings.d.cts +1 -1
  109. package/dist/embeddings.d.cts.map +1 -1
  110. package/dist/embeddings.d.ts +1 -1
  111. package/dist/embeddings.d.ts.map +1 -1
  112. package/dist/embeddings.js +27 -6
  113. package/dist/embeddings.js.map +1 -1
  114. package/dist/fal-audio.cjs +3 -3
  115. package/dist/fal-audio.cjs.map +1 -1
  116. package/dist/fal-audio.js +4 -4
  117. package/dist/fal-audio.js.map +1 -1
  118. package/dist/fal.cjs +28 -4
  119. package/dist/fal.cjs.map +1 -1
  120. package/dist/fal.d.cts +16 -1
  121. package/dist/fal.d.cts.map +1 -1
  122. package/dist/fal.d.ts +16 -1
  123. package/dist/fal.d.ts.map +1 -1
  124. package/dist/fal.js +28 -5
  125. package/dist/fal.js.map +1 -1
  126. package/dist/files.cjs +1069 -0
  127. package/dist/files.cjs.map +1 -0
  128. package/dist/files.d.cts +68 -0
  129. package/dist/files.d.cts.map +1 -0
  130. package/dist/files.d.ts +68 -0
  131. package/dist/files.d.ts.map +1 -0
  132. package/dist/files.js +1056 -0
  133. package/dist/files.js.map +1 -0
  134. package/dist/fine-tuning.cjs +1033 -0
  135. package/dist/fine-tuning.cjs.map +1 -0
  136. package/dist/fine-tuning.d.cts +96 -0
  137. package/dist/fine-tuning.d.cts.map +1 -0
  138. package/dist/fine-tuning.d.ts +96 -0
  139. package/dist/fine-tuning.d.ts.map +1 -0
  140. package/dist/fine-tuning.js +1026 -0
  141. package/dist/fine-tuning.js.map +1 -0
  142. package/dist/fixture-loader-services.cjs +116 -0
  143. package/dist/fixture-loader-services.cjs.map +1 -0
  144. package/dist/fixture-loader-services.d.cts +48 -0
  145. package/dist/fixture-loader-services.d.cts.map +1 -0
  146. package/dist/fixture-loader-services.d.ts +48 -0
  147. package/dist/fixture-loader-services.d.ts.map +1 -0
  148. package/dist/fixture-loader-services.js +114 -0
  149. package/dist/fixture-loader-services.js.map +1 -0
  150. package/dist/fixture-loader.cjs +0 -0
  151. package/dist/fixture-loader.cjs.map +1 -1
  152. package/dist/fixture-loader.d.cts +131 -5
  153. package/dist/fixture-loader.d.cts.map +1 -1
  154. package/dist/fixture-loader.d.ts +131 -5
  155. package/dist/fixture-loader.d.ts.map +1 -1
  156. package/dist/fixture-loader.js +0 -0
  157. package/dist/fixture-loader.js.map +1 -1
  158. package/dist/gemini-embeddings.cjs +44 -4
  159. package/dist/gemini-embeddings.cjs.map +1 -1
  160. package/dist/gemini-embeddings.js +46 -6
  161. package/dist/gemini-embeddings.js.map +1 -1
  162. package/dist/gemini-interactions.cjs +51 -7
  163. package/dist/gemini-interactions.cjs.map +1 -1
  164. package/dist/gemini-interactions.d.cts.map +1 -1
  165. package/dist/gemini-interactions.d.ts.map +1 -1
  166. package/dist/gemini-interactions.js +53 -9
  167. package/dist/gemini-interactions.js.map +1 -1
  168. package/dist/gemini.cjs +19 -8
  169. package/dist/gemini.cjs.map +1 -1
  170. package/dist/gemini.d.cts.map +1 -1
  171. package/dist/gemini.d.ts.map +1 -1
  172. package/dist/gemini.js +21 -10
  173. package/dist/gemini.js.map +1 -1
  174. package/dist/grok-video.cjs +14 -14
  175. package/dist/grok-video.cjs.map +1 -1
  176. package/dist/grok-video.js +15 -15
  177. package/dist/grok-video.js.map +1 -1
  178. package/dist/helpers.cjs +497 -10
  179. package/dist/helpers.cjs.map +1 -1
  180. package/dist/helpers.d.cts +38 -2
  181. package/dist/helpers.d.cts.map +1 -1
  182. package/dist/helpers.d.ts +38 -2
  183. package/dist/helpers.d.ts.map +1 -1
  184. package/dist/helpers.js +487 -12
  185. package/dist/helpers.js.map +1 -1
  186. package/dist/images.cjs +57 -125
  187. package/dist/images.cjs.map +1 -1
  188. package/dist/images.d.cts.map +1 -1
  189. package/dist/images.d.ts.map +1 -1
  190. package/dist/images.js +58 -126
  191. package/dist/images.js.map +1 -1
  192. package/dist/index.cjs +71 -9
  193. package/dist/index.d.cts +17 -7
  194. package/dist/index.d.ts +17 -7
  195. package/dist/index.js +21 -11
  196. package/dist/jest.cjs +24 -12
  197. package/dist/jest.cjs.map +1 -1
  198. package/dist/jest.d.cts +6 -3
  199. package/dist/jest.d.cts.map +1 -1
  200. package/dist/jest.d.ts +6 -3
  201. package/dist/jest.d.ts.map +1 -1
  202. package/dist/jest.js +25 -13
  203. package/dist/jest.js.map +1 -1
  204. package/dist/journal.cjs +61 -4
  205. package/dist/journal.cjs.map +1 -1
  206. package/dist/journal.d.cts +60 -3
  207. package/dist/journal.d.cts.map +1 -1
  208. package/dist/journal.d.ts +60 -3
  209. package/dist/journal.d.ts.map +1 -1
  210. package/dist/journal.js +61 -5
  211. package/dist/journal.js.map +1 -1
  212. package/dist/live-fixture.cjs +1192 -0
  213. package/dist/live-fixture.cjs.map +1 -0
  214. package/dist/live-fixture.js +1187 -0
  215. package/dist/live-fixture.js.map +1 -0
  216. package/dist/live-recorder.cjs +256 -0
  217. package/dist/live-recorder.cjs.map +1 -0
  218. package/dist/live-recorder.js +254 -0
  219. package/dist/live-recorder.js.map +1 -0
  220. package/dist/live-replay.cjs +286 -0
  221. package/dist/live-replay.cjs.map +1 -0
  222. package/dist/live-replay.js +285 -0
  223. package/dist/live-replay.js.map +1 -0
  224. package/dist/live-sanitize.cjs +196 -0
  225. package/dist/live-sanitize.cjs.map +1 -0
  226. package/dist/live-sanitize.js +196 -0
  227. package/dist/live-sanitize.js.map +1 -0
  228. package/dist/live-types.d.cts +71 -0
  229. package/dist/live-types.d.cts.map +1 -0
  230. package/dist/live-types.d.ts +71 -0
  231. package/dist/live-types.d.ts.map +1 -0
  232. package/dist/llmock.cjs +132 -49
  233. package/dist/llmock.cjs.map +1 -1
  234. package/dist/llmock.d.cts +51 -5
  235. package/dist/llmock.d.cts.map +1 -1
  236. package/dist/llmock.d.ts +51 -5
  237. package/dist/llmock.d.ts.map +1 -1
  238. package/dist/llmock.js +133 -50
  239. package/dist/llmock.js.map +1 -1
  240. package/dist/mcp-fakes-mount.cjs +216 -0
  241. package/dist/mcp-fakes-mount.cjs.map +1 -0
  242. package/dist/mcp-fakes-mount.js +210 -0
  243. package/dist/mcp-fakes-mount.js.map +1 -0
  244. package/dist/mcp-fakes.cjs +1619 -0
  245. package/dist/mcp-fakes.cjs.map +1 -0
  246. package/dist/mcp-fakes.d.cts +101 -0
  247. package/dist/mcp-fakes.d.cts.map +1 -0
  248. package/dist/mcp-fakes.d.ts +101 -0
  249. package/dist/mcp-fakes.d.ts.map +1 -0
  250. package/dist/mcp-fakes.js +1614 -0
  251. package/dist/mcp-fakes.js.map +1 -0
  252. package/dist/mcp-handler.cjs +331 -17
  253. package/dist/mcp-handler.cjs.map +1 -1
  254. package/dist/mcp-handler.js +330 -18
  255. package/dist/mcp-handler.js.map +1 -1
  256. package/dist/mcp-mock.cjs +217 -49
  257. package/dist/mcp-mock.cjs.map +1 -1
  258. package/dist/mcp-mock.d.cts +66 -1
  259. package/dist/mcp-mock.d.cts.map +1 -1
  260. package/dist/mcp-mock.d.ts +66 -1
  261. package/dist/mcp-mock.d.ts.map +1 -1
  262. package/dist/mcp-mock.js +218 -50
  263. package/dist/mcp-mock.js.map +1 -1
  264. package/dist/mcp-stub.cjs +5 -1
  265. package/dist/mcp-stub.d.cts +3 -1
  266. package/dist/mcp-stub.d.ts +3 -1
  267. package/dist/mcp-stub.js +3 -1
  268. package/dist/mcp-types.d.cts +6 -0
  269. package/dist/mcp-types.d.ts +6 -0
  270. package/dist/message-text.cjs +192 -0
  271. package/dist/message-text.cjs.map +1 -0
  272. package/dist/message-text.d.cts +31 -0
  273. package/dist/message-text.d.cts.map +1 -0
  274. package/dist/message-text.d.ts +31 -0
  275. package/dist/message-text.d.ts.map +1 -0
  276. package/dist/message-text.js +184 -0
  277. package/dist/message-text.js.map +1 -0
  278. package/dist/messages.cjs +49 -7
  279. package/dist/messages.cjs.map +1 -1
  280. package/dist/messages.d.cts.map +1 -1
  281. package/dist/messages.d.ts.map +1 -1
  282. package/dist/messages.js +51 -9
  283. package/dist/messages.js.map +1 -1
  284. package/dist/metrics.cjs +278 -45
  285. package/dist/metrics.cjs.map +1 -1
  286. package/dist/metrics.d.cts +17 -7
  287. package/dist/metrics.d.cts.map +1 -1
  288. package/dist/metrics.d.ts +17 -7
  289. package/dist/metrics.d.ts.map +1 -1
  290. package/dist/metrics.js +270 -29
  291. package/dist/metrics.js.map +1 -1
  292. package/dist/moderation.cjs +10 -1
  293. package/dist/moderation.cjs.map +1 -1
  294. package/dist/moderation.d.cts.map +1 -1
  295. package/dist/moderation.d.ts.map +1 -1
  296. package/dist/moderation.js +10 -1
  297. package/dist/moderation.js.map +1 -1
  298. package/dist/ollama.cjs +10 -6
  299. package/dist/ollama.cjs.map +1 -1
  300. package/dist/ollama.d.cts.map +1 -1
  301. package/dist/ollama.d.ts.map +1 -1
  302. package/dist/ollama.js +11 -7
  303. package/dist/ollama.js.map +1 -1
  304. package/dist/openapi.cjs +3405 -0
  305. package/dist/openapi.cjs.map +1 -0
  306. package/dist/openapi.d.cts +30 -0
  307. package/dist/openapi.d.cts.map +1 -0
  308. package/dist/openapi.d.ts +30 -0
  309. package/dist/openapi.d.ts.map +1 -0
  310. package/dist/openapi.js +3404 -0
  311. package/dist/openapi.js.map +1 -0
  312. package/dist/openrouter-video.cjs +9 -9
  313. package/dist/openrouter-video.cjs.map +1 -1
  314. package/dist/openrouter-video.d.cts.map +1 -1
  315. package/dist/openrouter-video.d.ts.map +1 -1
  316. package/dist/openrouter-video.js +10 -10
  317. package/dist/openrouter-video.js.map +1 -1
  318. package/dist/recorder.cjs +54 -10
  319. package/dist/recorder.cjs.map +1 -1
  320. package/dist/recorder.d.cts.map +1 -1
  321. package/dist/recorder.d.ts.map +1 -1
  322. package/dist/recorder.js +52 -12
  323. package/dist/recorder.js.map +1 -1
  324. package/dist/responses.cjs +47 -7
  325. package/dist/responses.cjs.map +1 -1
  326. package/dist/responses.d.cts.map +1 -1
  327. package/dist/responses.d.ts.map +1 -1
  328. package/dist/responses.js +48 -9
  329. package/dist/responses.js.map +1 -1
  330. package/dist/route-registry.cjs +951 -0
  331. package/dist/route-registry.cjs.map +1 -0
  332. package/dist/route-registry.d.cts +33 -0
  333. package/dist/route-registry.d.cts.map +1 -0
  334. package/dist/route-registry.d.ts +33 -0
  335. package/dist/route-registry.d.ts.map +1 -0
  336. package/dist/route-registry.js +866 -0
  337. package/dist/route-registry.js.map +1 -0
  338. package/dist/router.cjs +21 -34
  339. package/dist/router.cjs.map +1 -1
  340. package/dist/router.d.cts +4 -1
  341. package/dist/router.d.cts.map +1 -1
  342. package/dist/router.d.ts +4 -1
  343. package/dist/router.d.ts.map +1 -1
  344. package/dist/router.js +21 -35
  345. package/dist/router.js.map +1 -1
  346. package/dist/server.cjs +1252 -777
  347. package/dist/server.cjs.map +1 -1
  348. package/dist/server.d.cts +5 -1
  349. package/dist/server.d.cts.map +1 -1
  350. package/dist/server.d.ts +5 -1
  351. package/dist/server.d.ts.map +1 -1
  352. package/dist/server.js +1185 -710
  353. package/dist/server.js.map +1 -1
  354. package/dist/speech.cjs +6 -4
  355. package/dist/speech.cjs.map +1 -1
  356. package/dist/speech.js +7 -5
  357. package/dist/speech.js.map +1 -1
  358. package/dist/suite.cjs +1 -1
  359. package/dist/suite.js +1 -1
  360. package/dist/transcription.cjs +6 -6
  361. package/dist/transcription.cjs.map +1 -1
  362. package/dist/transcription.d.cts.map +1 -1
  363. package/dist/transcription.d.ts.map +1 -1
  364. package/dist/transcription.js +7 -7
  365. package/dist/transcription.js.map +1 -1
  366. package/dist/types.cjs +18 -0
  367. package/dist/types.cjs.map +1 -0
  368. package/dist/types.d.cts +320 -17
  369. package/dist/types.d.cts.map +1 -1
  370. package/dist/types.d.ts +320 -17
  371. package/dist/types.d.ts.map +1 -1
  372. package/dist/types.js +17 -0
  373. package/dist/types.js.map +1 -0
  374. package/dist/validate-cli.cjs +983 -0
  375. package/dist/validate-cli.cjs.map +1 -0
  376. package/dist/validate-cli.js +982 -0
  377. package/dist/validate-cli.js.map +1 -0
  378. package/dist/vector-stores.cjs +1180 -0
  379. package/dist/vector-stores.cjs.map +1 -0
  380. package/dist/vector-stores.d.cts +106 -0
  381. package/dist/vector-stores.d.cts.map +1 -0
  382. package/dist/vector-stores.d.ts +106 -0
  383. package/dist/vector-stores.d.ts.map +1 -0
  384. package/dist/vector-stores.js +1164 -0
  385. package/dist/vector-stores.js.map +1 -0
  386. package/dist/vector-types.d.cts.map +1 -1
  387. package/dist/vector-types.d.ts.map +1 -1
  388. package/dist/veo-video.cjs +13 -13
  389. package/dist/veo-video.cjs.map +1 -1
  390. package/dist/veo-video.js +14 -14
  391. package/dist/veo-video.js.map +1 -1
  392. package/dist/video.cjs +23 -4
  393. package/dist/video.cjs.map +1 -1
  394. package/dist/video.d.cts +1 -1
  395. package/dist/video.d.cts.map +1 -1
  396. package/dist/video.d.ts +1 -1
  397. package/dist/video.d.ts.map +1 -1
  398. package/dist/video.js +24 -5
  399. package/dist/video.js.map +1 -1
  400. package/dist/vitest.cjs +23 -11
  401. package/dist/vitest.cjs.map +1 -1
  402. package/dist/vitest.d.cts +5 -2
  403. package/dist/vitest.d.cts.map +1 -1
  404. package/dist/vitest.d.ts +5 -2
  405. package/dist/vitest.d.ts.map +1 -1
  406. package/dist/vitest.js +25 -13
  407. package/dist/vitest.js.map +1 -1
  408. package/dist/watcher.cjs +2 -1
  409. package/dist/watcher.cjs.map +1 -1
  410. package/dist/watcher.js +2 -1
  411. package/dist/watcher.js.map +1 -1
  412. package/dist/ws-framing.cjs +150 -35
  413. package/dist/ws-framing.cjs.map +1 -1
  414. package/dist/ws-framing.d.cts +18 -3
  415. package/dist/ws-framing.d.cts.map +1 -1
  416. package/dist/ws-framing.d.ts +18 -3
  417. package/dist/ws-framing.d.ts.map +1 -1
  418. package/dist/ws-framing.js +151 -36
  419. package/dist/ws-framing.js.map +1 -1
  420. package/dist/ws-gemini-live.cjs +2 -2
  421. package/dist/ws-gemini-live.js +2 -2
  422. package/dist/ws-live.cjs +401 -0
  423. package/dist/ws-live.cjs.map +1 -0
  424. package/dist/ws-live.js +400 -0
  425. package/dist/ws-live.js.map +1 -0
  426. package/dist/ws-realtime.cjs +46 -2
  427. package/dist/ws-realtime.cjs.map +1 -1
  428. package/dist/ws-realtime.d.cts.map +1 -1
  429. package/dist/ws-realtime.d.ts.map +1 -1
  430. package/dist/ws-realtime.js +46 -2
  431. package/dist/ws-realtime.js.map +1 -1
  432. package/dist/ws-responses.cjs +16 -4
  433. package/dist/ws-responses.cjs.map +1 -1
  434. package/dist/ws-responses.js +16 -4
  435. package/dist/ws-responses.js.map +1 -1
  436. package/dist/ws-upstream.cjs +118 -0
  437. package/dist/ws-upstream.cjs.map +1 -0
  438. package/dist/ws-upstream.js +115 -0
  439. package/dist/ws-upstream.js.map +1 -0
  440. package/fixtures/openai-live-client.json +390 -0
  441. package/fixtures/openai-live-managed.json +709 -0
  442. package/package.json +4 -1
@@ -1 +1 @@
1
- {"version":3,"file":"bedrock-converse.cjs","names":["resolveFixtureBlocks","generateToolUseId","flattenHeaders","isJsonObject","getContext","getTestId","matchFixtureDiagnostic","recordMatchOptions","applyChaos","resolveStrictMode","strictNoMatchMessage","strictNoMatchLogLine","strictOverrideField","proxyAndRecord","resolveResponse","isErrorResponse","isContentWithToolCallsResponse","extractOverrides","resolveReasoningForModel","isTextResponse","isToolCallResponse","createInterruptionSignal","writeEventStream"],"sources":["../src/bedrock-converse.ts"],"sourcesContent":["/**\n * AWS Bedrock Converse API support.\n *\n * Translates incoming Converse and Converse-stream requests (Bedrock Converse\n * format) into the ChatCompletionRequest format used by the fixture router,\n * and converts fixture responses back into Converse API format — either a\n * single JSON response or an Event Stream binary stream.\n */\n\nimport type * as http from \"node:http\";\nimport type {\n ChatCompletionRequest,\n ChatMessage,\n Fixture,\n FixtureBlock,\n HandlerDefaults,\n ResponseOverrides,\n ToolCall,\n ToolDefinition,\n} from \"./types.js\";\nimport {\n generateToolUseId,\n extractOverrides,\n isTextResponse,\n isToolCallResponse,\n isContentWithToolCallsResponse,\n resolveFixtureBlocks,\n isErrorResponse,\n flattenHeaders,\n isJsonObject,\n getContext,\n getTestId,\n resolveResponse,\n resolveReasoningForModel,\n resolveStrictMode,\n strictOverrideField,\n strictNoMatchMessage,\n strictNoMatchLogLine,\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 { applyChaos } from \"./chaos.js\";\nimport { proxyAndRecord } from \"./recorder.js\";\n\n// ─── Converse request types ─────────────────────────────────────────────────\n\ninterface ConverseContentBlock {\n text?: string;\n toolUse?: { toolUseId: string; name: string; input: object };\n toolResult?: { toolUseId: string; content: { text?: string }[] };\n}\n\ninterface ConverseMessage {\n role: \"user\" | \"assistant\";\n content: ConverseContentBlock[];\n}\n\ninterface ConverseToolSpec {\n name: string;\n description?: string;\n inputSchema?: object;\n}\n\ninterface ConverseRequest {\n messages: ConverseMessage[];\n system?: { text: string }[];\n inferenceConfig?: { maxTokens?: number; temperature?: number };\n toolConfig?: { tools: { toolSpec: ConverseToolSpec }[] };\n}\n\n// ─── Converse stop_reason mapping ──────────────────────────────────────────\n\nfunction converseStopReason(\n overrideFinishReason: string | undefined,\n defaultReason: string,\n): string {\n if (!overrideFinishReason) return defaultReason;\n if (overrideFinishReason === \"stop\") return \"end_turn\";\n if (overrideFinishReason === \"tool_calls\") return \"tool_use\";\n if (overrideFinishReason === \"length\") return \"max_tokens\";\n return overrideFinishReason;\n}\n\n/**\n * Build Converse-format usage from fixture overrides.\n *\n * When no overrides are provided (the common case for mocks), all token\n * counts default to zero. This is intentional — aimock is a mock server\n * and does not perform real tokenisation. Callers that need non-zero\n * usage should supply explicit `usage` overrides in their fixture.\n */\nfunction converseUsage(overrides?: ResponseOverrides): {\n inputTokens: number;\n outputTokens: number;\n totalTokens: number;\n} {\n if (!overrides?.usage) return { inputTokens: 0, outputTokens: 0, totalTokens: 0 };\n const inputTokens = overrides.usage.input_tokens ?? overrides.usage.prompt_tokens ?? 0;\n const outputTokens = overrides.usage.output_tokens ?? overrides.usage.completion_tokens ?? 0;\n return { inputTokens, outputTokens, totalTokens: inputTokens + outputTokens };\n}\n\nfunction parseConverseToolArgumentsForStream(toolCall: ToolCall, logger: Logger): string {\n try {\n const parsed = JSON.parse(toolCall.arguments || \"{}\");\n return JSON.stringify(parsed);\n } catch {\n logger.warn(\n `Malformed JSON in fixture tool call arguments for \"${toolCall.name}\": ${toolCall.arguments}`,\n );\n return \"{}\";\n }\n}\n\nfunction buildBedrockStreamTextEvents(\n content: 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 { eventType: \"messageStart\", payload: { role: \"assistant\" } },\n ];\n\n if (reasoning) {\n const blockIndex = 0;\n events.push({\n eventType: \"contentBlockStart\",\n payload: { contentBlockIndex: blockIndex, start: { reasoningContent: {} } },\n });\n for (let i = 0; i < reasoning.length; i += chunkSize) {\n events.push({\n eventType: \"contentBlockDelta\",\n payload: {\n contentBlockIndex: blockIndex,\n delta: { reasoningContent: { text: reasoning.slice(i, i + chunkSize) } },\n },\n });\n }\n events.push({\n eventType: \"contentBlockStop\",\n payload: { contentBlockIndex: blockIndex },\n });\n }\n\n const textBlockIndex = reasoning ? 1 : 0;\n events.push({\n eventType: \"contentBlockStart\",\n payload: { contentBlockIndex: textBlockIndex, start: {} },\n });\n for (let i = 0; i < content.length; i += chunkSize) {\n events.push({\n eventType: \"contentBlockDelta\",\n payload: {\n contentBlockIndex: textBlockIndex,\n delta: { text: content.slice(i, i + chunkSize) },\n },\n });\n }\n events.push({\n eventType: \"contentBlockStop\",\n payload: { contentBlockIndex: textBlockIndex },\n });\n events.push({\n eventType: \"messageStop\",\n payload: { stopReason: converseStopReason(overrides?.finishReason, \"end_turn\") },\n });\n const usage = converseUsage(overrides);\n events.push({\n eventType: \"metadata\",\n payload: { usage, metrics: { latencyMs: 0 } },\n });\n return events;\n}\n\nfunction buildBedrockStreamContentWithToolCallsEvents(\n content: string,\n toolCalls: ToolCall[],\n chunkSize: number,\n logger: Logger,\n reasoning?: string,\n overrides?: ResponseOverrides,\n blocks?: FixtureBlock[],\n): Array<{ eventType: string; payload: object }> {\n if (blocks && blocks.length > 0) {\n // NEW PATH: stream `text`/`toolUse` content blocks in the fixture's array\n // order. Converse's indexed contentBlock events make ordering observable —\n // a `toolCall` block can take a lower `contentBlockIndex` than a `text`\n // block. Indices are assigned in encounter order, continuing from any\n // leading reasoning block (which occupies index 0).\n const events: Array<{ eventType: string; payload: object }> = [\n { eventType: \"messageStart\", payload: { role: \"assistant\" } },\n ];\n\n let blockIndex = 0;\n if (reasoning) {\n events.push({\n eventType: \"contentBlockStart\",\n payload: { contentBlockIndex: blockIndex, start: { reasoningContent: {} } },\n });\n for (let i = 0; i < reasoning.length; i += chunkSize) {\n events.push({\n eventType: \"contentBlockDelta\",\n payload: {\n contentBlockIndex: blockIndex,\n delta: { reasoningContent: { text: reasoning.slice(i, i + chunkSize) } },\n },\n });\n }\n events.push({\n eventType: \"contentBlockStop\",\n payload: { contentBlockIndex: blockIndex },\n });\n blockIndex++;\n }\n\n const ordered = resolveFixtureBlocks(blocks);\n for (const block of ordered) {\n if (block.type === \"text\") {\n events.push({\n eventType: \"contentBlockStart\",\n payload: { contentBlockIndex: blockIndex, start: {} },\n });\n for (let i = 0; i < block.text.length; i += chunkSize) {\n events.push({\n eventType: \"contentBlockDelta\",\n payload: {\n contentBlockIndex: blockIndex,\n delta: { text: block.text.slice(i, i + chunkSize) },\n },\n });\n }\n events.push({\n eventType: \"contentBlockStop\",\n payload: { contentBlockIndex: blockIndex },\n });\n } else {\n const toolUseId = block.id || generateToolUseId();\n events.push({\n eventType: \"contentBlockStart\",\n payload: {\n contentBlockIndex: blockIndex,\n start: { toolUse: { toolUseId, name: block.name } },\n },\n });\n const argsStr = parseConverseToolArgumentsForStream(\n { name: block.name, arguments: block.arguments } as ToolCall,\n logger,\n );\n for (let i = 0; i < argsStr.length; i += chunkSize) {\n events.push({\n eventType: \"contentBlockDelta\",\n payload: {\n contentBlockIndex: blockIndex,\n delta: { toolUse: { input: argsStr.slice(i, i + chunkSize) } },\n },\n });\n }\n events.push({\n eventType: \"contentBlockStop\",\n payload: { contentBlockIndex: blockIndex },\n });\n }\n blockIndex++;\n }\n\n events.push({\n eventType: \"messageStop\",\n payload: { stopReason: converseStopReason(overrides?.finishReason, \"tool_use\") },\n });\n events.push({\n eventType: \"metadata\",\n payload: { usage: converseUsage(overrides), metrics: { latencyMs: 0 } },\n });\n return events;\n }\n\n const events = buildBedrockStreamTextEvents(content, chunkSize, reasoning, overrides);\n // Remove trailing metadata + messageStop events — we re-emit them after tool blocks\n for (let i = events.length - 1; i >= 0; i--) {\n const et = (events[i] as { eventType: string }).eventType;\n if (et === \"metadata\" || et === \"messageStop\") {\n events.splice(i, 1);\n }\n }\n let blockIndex = reasoning ? 2 : 1;\n\n for (const tc of toolCalls) {\n const toolUseId = tc.id || generateToolUseId();\n events.push({\n eventType: \"contentBlockStart\",\n payload: {\n contentBlockIndex: blockIndex,\n start: { toolUse: { toolUseId, name: tc.name } },\n },\n });\n const argsStr = parseConverseToolArgumentsForStream(tc, logger);\n for (let i = 0; i < argsStr.length; i += chunkSize) {\n events.push({\n eventType: \"contentBlockDelta\",\n payload: {\n contentBlockIndex: blockIndex,\n delta: { toolUse: { input: argsStr.slice(i, i + chunkSize) } },\n },\n });\n }\n events.push({\n eventType: \"contentBlockStop\",\n payload: { contentBlockIndex: blockIndex },\n });\n blockIndex++;\n }\n events.push({\n eventType: \"messageStop\",\n payload: { stopReason: converseStopReason(overrides?.finishReason, \"tool_use\") },\n });\n const usage = converseUsage(overrides);\n events.push({\n eventType: \"metadata\",\n payload: { usage, metrics: { latencyMs: 0 } },\n });\n return events;\n}\n\nfunction buildBedrockStreamToolCallEvents(\n toolCalls: ToolCall[],\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 { eventType: \"messageStart\", payload: { role: \"assistant\" } },\n ];\n\n // A leading reasoning block occupies contentBlockIndex 0, shifting the\n // toolUse blocks by +1 (mirrors the content+tool builder's sequencing).\n if (reasoning) {\n const reasoningBlockIndex = 0;\n events.push({\n eventType: \"contentBlockStart\",\n payload: { contentBlockIndex: reasoningBlockIndex, start: { reasoningContent: {} } },\n });\n for (let i = 0; i < reasoning.length; i += chunkSize) {\n events.push({\n eventType: \"contentBlockDelta\",\n payload: {\n contentBlockIndex: reasoningBlockIndex,\n delta: { reasoningContent: { text: reasoning.slice(i, i + chunkSize) } },\n },\n });\n }\n events.push({\n eventType: \"contentBlockStop\",\n payload: { contentBlockIndex: reasoningBlockIndex },\n });\n }\n\n const toolBlockOffset = reasoning ? 1 : 0;\n\n for (let tcIdx = 0; tcIdx < toolCalls.length; tcIdx++) {\n const blockIndex = tcIdx + toolBlockOffset;\n const tc = toolCalls[tcIdx];\n const toolUseId = tc.id || generateToolUseId();\n events.push({\n eventType: \"contentBlockStart\",\n payload: {\n contentBlockIndex: blockIndex,\n start: { toolUse: { toolUseId, name: tc.name } },\n },\n });\n const argsStr = parseConverseToolArgumentsForStream(tc, logger);\n for (let i = 0; i < argsStr.length; i += chunkSize) {\n events.push({\n eventType: \"contentBlockDelta\",\n payload: {\n contentBlockIndex: blockIndex,\n delta: { toolUse: { input: argsStr.slice(i, i + chunkSize) } },\n },\n });\n }\n events.push({\n eventType: \"contentBlockStop\",\n payload: { contentBlockIndex: blockIndex },\n });\n }\n events.push({\n eventType: \"messageStop\",\n payload: { stopReason: converseStopReason(overrides?.finishReason, \"tool_use\") },\n });\n const usage = converseUsage(overrides);\n events.push({\n eventType: \"metadata\",\n payload: { usage, metrics: { latencyMs: 0 } },\n });\n return events;\n}\n\n// ─── Input conversion: Converse → ChatCompletionRequest ─────────────────────\n\nexport function converseToCompletionRequest(\n req: ConverseRequest,\n modelId: string,\n logger?: Logger,\n): ChatCompletionRequest {\n const messages: ChatMessage[] = [];\n\n // system field → system message\n if (req.system && req.system.length > 0) {\n const systemText = req.system.map((s) => s.text).join(\"\");\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 toolResult blocks\n const toolResults = msg.content.filter((b) => b.toolResult);\n const textBlocks = msg.content.filter(\n (b) => b.text !== undefined && b.text !== \"\" && !b.toolResult,\n );\n const unsupportedBlocks = msg.content.filter(\n (b) => b.text === undefined && !b.toolResult && !b.toolUse,\n );\n if (unsupportedBlocks.length > 0 && logger) {\n logger.warn(\n `Converse user message contains unsupported content block types — these will be dropped during conversion`,\n );\n }\n\n if (toolResults.length > 0) {\n for (const block of toolResults) {\n const tr = block.toolResult!;\n const resultContent = tr.content.map((c) => c.text ?? \"\").join(\"\");\n messages.push({\n role: \"tool\",\n content: resultContent,\n tool_call_id: tr.toolUseId,\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 // Plain user message\n const text = msg.content\n .filter((b) => b.text !== undefined && b.text !== \"\")\n .map((b) => b.text ?? \"\")\n .join(\"\");\n messages.push({ role: \"user\", content: text });\n } else if (msg.role === \"assistant\") {\n const toolUseBlocks = msg.content.filter((b) => b.toolUse);\n const textContent = msg.content\n .filter((b) => b.text !== undefined && b.text !== \"\")\n .map((b) => b.text ?? \"\")\n .join(\"\");\n\n if (toolUseBlocks.length > 0) {\n messages.push({\n role: \"assistant\",\n content: textContent || null,\n tool_calls: toolUseBlocks.map((b) => ({\n id: b.toolUse!.toolUseId,\n type: \"function\" as const,\n function: {\n name: b.toolUse!.name,\n arguments: JSON.stringify(b.toolUse!.input),\n },\n })),\n });\n } else {\n messages.push({ role: \"assistant\", content: textContent || null });\n }\n } else {\n const warnMsg = `Unexpected message role \"${msg.role}\" in Converse request — skipping`;\n if (logger) {\n logger.warn(warnMsg);\n }\n }\n }\n\n // Convert tools\n let tools: ToolDefinition[] | undefined;\n if (req.toolConfig?.tools && req.toolConfig.tools.length > 0) {\n tools = req.toolConfig.tools.map((t) => ({\n type: \"function\" as const,\n function: {\n name: t.toolSpec.name,\n description: t.toolSpec.description,\n parameters: (t.toolSpec.inputSchema && \"json\" in t.toolSpec.inputSchema\n ? (t.toolSpec.inputSchema as Record<string, unknown>).json\n : t.toolSpec.inputSchema) as object | undefined,\n },\n }));\n }\n\n return {\n model: modelId,\n messages,\n stream: false,\n temperature: req.inferenceConfig?.temperature,\n max_tokens: req.inferenceConfig?.maxTokens,\n tools,\n };\n}\n\n// ─── Response builders ──────────────────────────────────────────────────────\n\nfunction buildConverseTextResponse(\n content: string,\n reasoning?: string,\n overrides?: ResponseOverrides,\n): object {\n const contentBlocks: object[] = [];\n if (reasoning) {\n contentBlocks.push({\n reasoningContent: { reasoningText: { text: reasoning } },\n });\n }\n contentBlocks.push({ text: content });\n\n return {\n output: {\n message: {\n role: \"assistant\",\n content: contentBlocks,\n },\n },\n stopReason: converseStopReason(overrides?.finishReason, \"end_turn\"),\n usage: converseUsage(overrides),\n metrics: { latencyMs: 0 },\n };\n}\n\nfunction buildConverseToolCallResponse(\n toolCalls: ToolCall[],\n logger: Logger,\n reasoning?: string,\n overrides?: ResponseOverrides,\n): object {\n const contentBlocks: object[] = [];\n if (reasoning) {\n contentBlocks.push({\n reasoningContent: { reasoningText: { text: reasoning } },\n });\n }\n for (const tc of toolCalls) {\n let argsObj: unknown;\n try {\n argsObj = JSON.parse(tc.arguments || \"{}\");\n } catch {\n logger.warn(\n `Malformed JSON in fixture tool call arguments for \"${tc.name}\": ${tc.arguments}`,\n );\n argsObj = {};\n }\n contentBlocks.push({\n toolUse: {\n toolUseId: tc.id || generateToolUseId(),\n name: tc.name,\n input: argsObj,\n },\n });\n }\n\n return {\n output: {\n message: {\n role: \"assistant\",\n content: contentBlocks,\n },\n },\n stopReason: converseStopReason(overrides?.finishReason, \"tool_use\"),\n usage: converseUsage(overrides),\n metrics: { latencyMs: 0 },\n };\n}\n\nfunction buildConverseContentWithToolCallsResponse(\n content: string,\n toolCalls: ToolCall[],\n logger: Logger,\n reasoning?: string,\n overrides?: ResponseOverrides,\n blocks?: FixtureBlock[],\n): object {\n const contentBlocks: object[] = [];\n if (reasoning) {\n contentBlocks.push({\n reasoningContent: { reasoningText: { text: reasoning } },\n });\n }\n\n // Build a Converse `toolUse` content block from a fixture tool call, parsing\n // its string `arguments` into the object `input` Converse emits (warning on\n // malformed JSON — same idiom as the legacy/streaming paths).\n const toolUseBlock = (tc: { name: string; arguments: string; id?: string }): object => {\n let argsObj: unknown;\n try {\n argsObj = JSON.parse(tc.arguments || \"{}\");\n } catch {\n logger.warn(\n `Malformed JSON in fixture tool call arguments for \"${tc.name}\": ${tc.arguments}`,\n );\n argsObj = {};\n }\n return {\n toolUse: {\n toolUseId: tc.id || generateToolUseId(),\n name: tc.name,\n input: argsObj,\n },\n };\n };\n\n if (blocks && blocks.length > 0) {\n // NEW PATH: the non-streaming `content[]` array is positionally observable,\n // so emit `text`/`toolUse` content blocks in the fixture's ARRAY ORDER\n // (after any leading reasoning block). A toolCall block before a text block\n // therefore yields a toolUse ahead of the text — matching the streaming\n // path for the same `blocks` fixture.\n const ordered = resolveFixtureBlocks(blocks);\n for (const block of ordered) {\n if (block.type === \"text\") {\n contentBlocks.push({ text: block.text });\n } else {\n contentBlocks.push(\n toolUseBlock({ name: block.name, arguments: block.arguments, id: block.id }),\n );\n }\n }\n } else {\n // LEGACY PATH (unchanged): text content block, then toolUse blocks in\n // `toolCalls` order.\n contentBlocks.push({ text: content });\n for (const tc of toolCalls) {\n contentBlocks.push(toolUseBlock(tc));\n }\n }\n\n return {\n output: {\n message: {\n role: \"assistant\",\n content: contentBlocks,\n },\n },\n stopReason: converseStopReason(overrides?.finishReason, \"tool_use\"),\n usage: converseUsage(overrides),\n metrics: { latencyMs: 0 },\n };\n}\n\n// ─── Request handlers ───────────────────────────────────────────────────────\n\nexport async function handleConverse(\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}/converse`;\n\n let converseReq: ConverseRequest;\n try {\n converseReq = JSON.parse(raw) as ConverseRequest;\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 JSON.stringify({\n error: {\n message: `Malformed JSON: ${detail}`,\n type: \"invalid_request_error\",\n },\n }),\n );\n return;\n }\n\n // Reject bodies that parsed but are not a JSON object (e.g. `null`) before\n // touching fields — otherwise `converseReq.messages` throws a TypeError that\n // surfaces as a 500 instead of a 400.\n if (!isJsonObject(converseReq)) {\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 JSON.stringify({\n error: {\n message: \"Request body must be a JSON object\",\n type: \"invalid_request_error\",\n },\n }),\n );\n return;\n }\n\n if (!converseReq.messages || !Array.isArray(converseReq.messages)) {\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 JSON.stringify({\n error: {\n message: \"Invalid request: messages array is required\",\n type: \"invalid_request_error\",\n },\n }),\n );\n return;\n }\n\n const completionReq = converseToCompletionRequest(converseReq, 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 applyChaos(\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 = resolveStrictMode(defaults.strict, req.headers);\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 JSON.stringify({\n error: {\n message: strictMessage,\n type: \"invalid_request_error\",\n },\n }),\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 JSON.stringify({\n error: {\n message: \"No fixture matched\",\n type: \"invalid_request_error\",\n },\n }),\n );\n return;\n }\n\n const response = await resolveResponse(fixture, completionReq);\n\n // Error response\n if (isErrorResponse(response)) {\n const status = response.status ?? 500;\n journal.add({\n method: req.method ?? \"POST\",\n path: urlPath,\n headers: flattenHeaders(req.headers),\n body: completionReq,\n response: { status, fixture },\n });\n const errBody = {\n type: \"error\",\n error: {\n type: response.error.type ?? \"invalid_request_error\",\n message: response.error.message,\n },\n };\n writeErrorResponse(res, status, JSON.stringify(errBody), {\n retryAfter: response.retryAfter,\n });\n return;\n }\n\n // Content + tool calls response\n if (isContentWithToolCallsResponse(response)) {\n if (response.webSearches?.length) {\n logger.warn(\n \"webSearches in fixture response are not supported for Bedrock Converse API — ignoring\",\n );\n }\n const overrides = extractOverrides(response);\n const effReasoning = resolveReasoningForModel(\n response.reasoning,\n completionReq.model,\n resolveStrictMode(defaults.strict, req.headers),\n logger,\n );\n 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 const body = buildConverseContentWithToolCallsResponse(\n response.content ?? \"\",\n response.toolCalls ?? [],\n logger,\n effReasoning,\n overrides,\n response.blocks,\n );\n res.writeHead(200, { \"Content-Type\": \"application/json\" });\n res.end(JSON.stringify(body));\n return;\n }\n\n // Text response\n if (isTextResponse(response)) {\n if (response.webSearches?.length) {\n logger.warn(\n \"webSearches in fixture response are not supported for Bedrock Converse API — ignoring\",\n );\n }\n const overrides = extractOverrides(response);\n const effReasoning = resolveReasoningForModel(\n response.reasoning,\n completionReq.model,\n resolveStrictMode(defaults.strict, req.headers),\n logger,\n );\n 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 const body = buildConverseTextResponse(response.content, effReasoning, overrides);\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(\n \"webSearches in fixture response are not supported for Bedrock Converse API — ignoring\",\n );\n }\n const overrides = extractOverrides(response);\n const effReasoning = resolveReasoningForModel(\n response.reasoning,\n completionReq.model,\n resolveStrictMode(defaults.strict, req.headers),\n logger,\n );\n 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 const body = buildConverseToolCallResponse(response.toolCalls, logger, effReasoning, overrides);\n res.writeHead(200, { \"Content-Type\": \"application/json\" });\n res.end(JSON.stringify(body));\n return;\n }\n\n // Unknown response type\n journal.add({\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 JSON.stringify({\n error: {\n message: \"Fixture response did not match any known type\",\n type: \"server_error\",\n },\n }),\n );\n}\n\nexport async function handleConverseStream(\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}/converse-stream`;\n\n let converseReq: ConverseRequest;\n try {\n converseReq = JSON.parse(raw) as ConverseRequest;\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 JSON.stringify({\n error: {\n message: `Malformed JSON: ${detail}`,\n type: \"invalid_request_error\",\n },\n }),\n );\n return;\n }\n\n // Reject bodies that parsed but are not a JSON object (e.g. `null`) before\n // touching fields — otherwise `converseReq.messages` throws a TypeError that\n // surfaces as a 500 instead of a 400.\n if (!isJsonObject(converseReq)) {\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 JSON.stringify({\n error: {\n message: \"Request body must be a JSON object\",\n type: \"invalid_request_error\",\n },\n }),\n );\n return;\n }\n\n if (!converseReq.messages || !Array.isArray(converseReq.messages)) {\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 JSON.stringify({\n error: {\n message: \"Invalid request: messages array is required\",\n type: \"invalid_request_error\",\n },\n }),\n );\n return;\n }\n\n const completionReq = converseToCompletionRequest(converseReq, 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 applyChaos(\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 = resolveStrictMode(defaults.strict, req.headers);\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 JSON.stringify({\n error: {\n message: strictMessage,\n type: \"invalid_request_error\",\n },\n }),\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 JSON.stringify({\n error: {\n message: \"No fixture matched\",\n type: \"invalid_request_error\",\n },\n }),\n );\n return;\n }\n\n const response = await resolveResponse(fixture, completionReq);\n const latency = fixture.latency ?? defaults.latency;\n const chunkSize = Math.max(1, fixture.chunkSize ?? defaults.chunkSize);\n\n // Error response\n if (isErrorResponse(response)) {\n const status = response.status ?? 500;\n journal.add({\n method: req.method ?? \"POST\",\n path: urlPath,\n headers: flattenHeaders(req.headers),\n body: completionReq,\n response: { status, fixture },\n });\n const errBody = {\n type: \"error\",\n error: {\n type: response.error.type ?? \"invalid_request_error\",\n message: response.error.message,\n },\n };\n writeErrorResponse(res, status, JSON.stringify(errBody), {\n retryAfter: response.retryAfter,\n });\n return;\n }\n\n // Content + tool calls response — stream as Event Stream\n if (isContentWithToolCallsResponse(response)) {\n if (response.webSearches?.length) {\n logger.warn(\n \"webSearches in fixture response are not supported for Bedrock Converse API — ignoring\",\n );\n }\n const overrides = extractOverrides(response);\n const effReasoning = resolveReasoningForModel(\n response.reasoning,\n completionReq.model,\n resolveStrictMode(defaults.strict, req.headers),\n logger,\n );\n const journalEntry = 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 const events = buildBedrockStreamContentWithToolCallsEvents(\n response.content ?? \"\",\n response.toolCalls ?? [],\n chunkSize,\n logger,\n effReasoning,\n overrides,\n response.blocks,\n );\n const interruption = createInterruptionSignal(fixture);\n const completed = await writeEventStream(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(\n \"webSearches in fixture response are not supported for Bedrock Converse API — ignoring\",\n );\n }\n const overrides = extractOverrides(response);\n const effReasoning = resolveReasoningForModel(\n response.reasoning,\n completionReq.model,\n resolveStrictMode(defaults.strict, req.headers),\n logger,\n );\n const journalEntry = 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 const events = buildBedrockStreamTextEvents(\n response.content,\n chunkSize,\n effReasoning,\n overrides,\n );\n const interruption = createInterruptionSignal(fixture);\n const completed = await writeEventStream(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(\n \"webSearches in fixture response are not supported for Bedrock Converse API — ignoring\",\n );\n }\n const overrides = extractOverrides(response);\n const effReasoning = resolveReasoningForModel(\n response.reasoning,\n completionReq.model,\n resolveStrictMode(defaults.strict, req.headers),\n logger,\n );\n const journalEntry = 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 const events = buildBedrockStreamToolCallEvents(\n response.toolCalls,\n chunkSize,\n logger,\n effReasoning,\n overrides,\n );\n const interruption = createInterruptionSignal(fixture);\n const completed = await writeEventStream(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 journal.add({\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 JSON.stringify({\n error: {\n message: \"Fixture response did not match any known type\",\n type: \"server_error\",\n },\n }),\n );\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"bedrock-converse.cjs","names":["resolveFixtureBlockOutcome","generateToolUseId","flattenHeaders","isJsonObject","getContext","getTestId","matchFixtureDiagnostic","recordMatchOptions","applyChaosAsync","resolveStrictMode","strictNoMatchMessage","strictNoMatchLogLine","strictOverrideField","proxyAndRecord","resolveResponse","isErrorResponse","isContentWithToolCallsResponse","extractOverrides","resolveReasoningForModel","isTextResponse","isToolCallResponse","createInterruptionSignal","writeEventStream"],"sources":["../src/bedrock-converse.ts"],"sourcesContent":["/**\n * AWS Bedrock Converse API support.\n *\n * Translates incoming Converse and Converse-stream requests (Bedrock Converse\n * format) into the ChatCompletionRequest format used by the fixture router,\n * and converts fixture responses back into Converse API format — either a\n * single JSON response or an Event Stream binary stream.\n */\n\nimport type * as http from \"node:http\";\nimport type {\n ChatCompletionRequest,\n ChatMessage,\n Fixture,\n FixtureBlock,\n HandlerDefaults,\n ResponseOverrides,\n ToolCall,\n ToolDefinition,\n} from \"./types.js\";\nimport {\n generateToolUseId,\n extractOverrides,\n isTextResponse,\n isToolCallResponse,\n isContentWithToolCallsResponse,\n resolveFixtureBlockOutcome,\n isErrorResponse,\n flattenHeaders,\n isJsonObject,\n getContext,\n getTestId,\n resolveResponse,\n resolveReasoningForModel,\n resolveStrictMode,\n strictOverrideField,\n strictNoMatchMessage,\n strictNoMatchLogLine,\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 { proxyAndRecord } from \"./recorder.js\";\n\n// ─── Converse request types ─────────────────────────────────────────────────\n\ninterface ConverseContentBlock {\n text?: string;\n toolUse?: { toolUseId: string; name: string; input: object };\n toolResult?: { toolUseId: string; content: { text?: string }[] };\n}\n\ninterface ConverseMessage {\n role: \"user\" | \"assistant\";\n content: ConverseContentBlock[];\n}\n\ninterface ConverseToolSpec {\n name: string;\n description?: string;\n inputSchema?: object;\n}\n\ninterface ConverseRequest {\n messages: ConverseMessage[];\n system?: { text: string }[];\n inferenceConfig?: { maxTokens?: number; temperature?: number };\n toolConfig?: { tools: { toolSpec: ConverseToolSpec }[] };\n}\n\n// ─── Converse stop_reason mapping ──────────────────────────────────────────\n\nfunction converseStopReason(\n overrideFinishReason: string | undefined,\n defaultReason: string,\n): string {\n if (!overrideFinishReason) return defaultReason;\n if (overrideFinishReason === \"stop\") return \"end_turn\";\n if (overrideFinishReason === \"tool_calls\") return \"tool_use\";\n if (overrideFinishReason === \"length\") return \"max_tokens\";\n return overrideFinishReason;\n}\n\n/**\n * Build Converse-format usage from fixture overrides.\n *\n * When no overrides are provided (the common case for mocks), all token\n * counts default to zero. This is intentional — aimock is a mock server\n * and does not perform real tokenisation. Callers that need non-zero\n * usage should supply explicit `usage` overrides in their fixture.\n */\nfunction converseUsage(overrides?: ResponseOverrides): {\n inputTokens: number;\n outputTokens: number;\n totalTokens: number;\n} {\n if (!overrides?.usage) return { inputTokens: 0, outputTokens: 0, totalTokens: 0 };\n const inputTokens = overrides.usage.input_tokens ?? overrides.usage.prompt_tokens ?? 0;\n const outputTokens = overrides.usage.output_tokens ?? overrides.usage.completion_tokens ?? 0;\n return { inputTokens, outputTokens, totalTokens: inputTokens + outputTokens };\n}\n\nfunction parseConverseToolArgumentsForStream(toolCall: ToolCall, logger: Logger): string {\n try {\n const parsed = JSON.parse(toolCall.arguments || \"{}\");\n return JSON.stringify(parsed);\n } catch {\n logger.warn(\n `Malformed JSON in fixture tool call arguments for \"${toolCall.name}\": ${toolCall.arguments}`,\n );\n return \"{}\";\n }\n}\n\nfunction buildBedrockStreamTextEvents(\n content: 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 { eventType: \"messageStart\", payload: { role: \"assistant\" } },\n ];\n\n if (reasoning) {\n const blockIndex = 0;\n events.push({\n eventType: \"contentBlockStart\",\n payload: { contentBlockIndex: blockIndex, start: { reasoningContent: {} } },\n });\n for (let i = 0; i < reasoning.length; i += chunkSize) {\n events.push({\n eventType: \"contentBlockDelta\",\n payload: {\n contentBlockIndex: blockIndex,\n delta: { reasoningContent: { text: reasoning.slice(i, i + chunkSize) } },\n },\n });\n }\n events.push({\n eventType: \"contentBlockStop\",\n payload: { contentBlockIndex: blockIndex },\n });\n }\n\n const textBlockIndex = reasoning ? 1 : 0;\n events.push({\n eventType: \"contentBlockStart\",\n payload: { contentBlockIndex: textBlockIndex, start: {} },\n });\n for (let i = 0; i < content.length; i += chunkSize) {\n events.push({\n eventType: \"contentBlockDelta\",\n payload: {\n contentBlockIndex: textBlockIndex,\n delta: { text: content.slice(i, i + chunkSize) },\n },\n });\n }\n events.push({\n eventType: \"contentBlockStop\",\n payload: { contentBlockIndex: textBlockIndex },\n });\n events.push({\n eventType: \"messageStop\",\n payload: { stopReason: converseStopReason(overrides?.finishReason, \"end_turn\") },\n });\n const usage = converseUsage(overrides);\n events.push({\n eventType: \"metadata\",\n payload: { usage, metrics: { latencyMs: 0 } },\n });\n return events;\n}\n\nfunction buildBedrockStreamContentWithToolCallsEvents(\n content: string,\n toolCalls: ToolCall[],\n chunkSize: number,\n logger: Logger,\n reasoning?: string,\n overrides?: ResponseOverrides,\n blocks?: FixtureBlock[],\n): Array<{ eventType: string; payload: object }> {\n if (blocks && blocks.length > 0) {\n // NEW PATH: stream `text`/`toolUse` content blocks in the fixture's array\n // order. Converse's indexed contentBlock events make ordering observable —\n // a `toolCall` block can take a lower `contentBlockIndex` than a `text`\n // block. Indices are assigned in encounter order, continuing from any\n // leading reasoning block (which occupies index 0).\n const events: Array<{ eventType: string; payload: object }> = [\n { eventType: \"messageStart\", payload: { role: \"assistant\" } },\n ];\n\n let blockIndex = 0;\n if (reasoning) {\n events.push({\n eventType: \"contentBlockStart\",\n payload: { contentBlockIndex: blockIndex, start: { reasoningContent: {} } },\n });\n for (let i = 0; i < reasoning.length; i += chunkSize) {\n events.push({\n eventType: \"contentBlockDelta\",\n payload: {\n contentBlockIndex: blockIndex,\n delta: { reasoningContent: { text: reasoning.slice(i, i + chunkSize) } },\n },\n });\n }\n events.push({\n eventType: \"contentBlockStop\",\n payload: { contentBlockIndex: blockIndex },\n });\n blockIndex++;\n }\n\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: \"contentBlockStart\",\n payload: { contentBlockIndex: blockIndex, start: {} },\n });\n for (let i = 0; i < block.text.length; i += chunkSize) {\n events.push({\n eventType: \"contentBlockDelta\",\n payload: {\n contentBlockIndex: blockIndex,\n delta: { text: block.text.slice(i, i + chunkSize) },\n },\n });\n }\n events.push({\n eventType: \"contentBlockStop\",\n payload: { contentBlockIndex: blockIndex },\n });\n } else {\n const toolUseId = block.id || generateToolUseId();\n events.push({\n eventType: \"contentBlockStart\",\n payload: {\n contentBlockIndex: blockIndex,\n start: { toolUse: { toolUseId, name: block.name } },\n },\n });\n const argsStr = parseConverseToolArgumentsForStream(\n { name: block.name, arguments: block.arguments } as ToolCall,\n logger,\n );\n for (let i = 0; i < argsStr.length; i += chunkSize) {\n events.push({\n eventType: \"contentBlockDelta\",\n payload: {\n contentBlockIndex: blockIndex,\n delta: { toolUse: { input: argsStr.slice(i, i + chunkSize) } },\n },\n });\n }\n events.push({\n eventType: \"contentBlockStop\",\n payload: { contentBlockIndex: blockIndex },\n });\n }\n blockIndex++;\n }\n\n events.push({\n eventType: \"messageStop\",\n payload: {\n stopReason: converseStopReason(\n overrides?.finishReason,\n outcome.hasToolCalls ? \"tool_use\" : \"end_turn\",\n ),\n },\n });\n events.push({\n eventType: \"metadata\",\n payload: { usage: converseUsage(overrides), metrics: { latencyMs: 0 } },\n });\n return events;\n }\n\n const events = buildBedrockStreamTextEvents(content, chunkSize, reasoning, overrides);\n // Remove trailing metadata + messageStop events — we re-emit them after tool blocks\n for (let i = events.length - 1; i >= 0; i--) {\n const et = (events[i] as { eventType: string }).eventType;\n if (et === \"metadata\" || et === \"messageStop\") {\n events.splice(i, 1);\n }\n }\n let blockIndex = reasoning ? 2 : 1;\n\n for (const tc of toolCalls) {\n const toolUseId = tc.id || generateToolUseId();\n events.push({\n eventType: \"contentBlockStart\",\n payload: {\n contentBlockIndex: blockIndex,\n start: { toolUse: { toolUseId, name: tc.name } },\n },\n });\n const argsStr = parseConverseToolArgumentsForStream(tc, logger);\n for (let i = 0; i < argsStr.length; i += chunkSize) {\n events.push({\n eventType: \"contentBlockDelta\",\n payload: {\n contentBlockIndex: blockIndex,\n delta: { toolUse: { input: argsStr.slice(i, i + chunkSize) } },\n },\n });\n }\n events.push({\n eventType: \"contentBlockStop\",\n payload: { contentBlockIndex: blockIndex },\n });\n blockIndex++;\n }\n events.push({\n eventType: \"messageStop\",\n payload: { stopReason: converseStopReason(overrides?.finishReason, \"tool_use\") },\n });\n const usage = converseUsage(overrides);\n events.push({\n eventType: \"metadata\",\n payload: { usage, metrics: { latencyMs: 0 } },\n });\n return events;\n}\n\nfunction buildBedrockStreamToolCallEvents(\n toolCalls: ToolCall[],\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 { eventType: \"messageStart\", payload: { role: \"assistant\" } },\n ];\n\n // A leading reasoning block occupies contentBlockIndex 0, shifting the\n // toolUse blocks by +1 (mirrors the content+tool builder's sequencing).\n if (reasoning) {\n const reasoningBlockIndex = 0;\n events.push({\n eventType: \"contentBlockStart\",\n payload: { contentBlockIndex: reasoningBlockIndex, start: { reasoningContent: {} } },\n });\n for (let i = 0; i < reasoning.length; i += chunkSize) {\n events.push({\n eventType: \"contentBlockDelta\",\n payload: {\n contentBlockIndex: reasoningBlockIndex,\n delta: { reasoningContent: { text: reasoning.slice(i, i + chunkSize) } },\n },\n });\n }\n events.push({\n eventType: \"contentBlockStop\",\n payload: { contentBlockIndex: reasoningBlockIndex },\n });\n }\n\n const toolBlockOffset = reasoning ? 1 : 0;\n\n for (let tcIdx = 0; tcIdx < toolCalls.length; tcIdx++) {\n const blockIndex = tcIdx + toolBlockOffset;\n const tc = toolCalls[tcIdx];\n const toolUseId = tc.id || generateToolUseId();\n events.push({\n eventType: \"contentBlockStart\",\n payload: {\n contentBlockIndex: blockIndex,\n start: { toolUse: { toolUseId, name: tc.name } },\n },\n });\n const argsStr = parseConverseToolArgumentsForStream(tc, logger);\n for (let i = 0; i < argsStr.length; i += chunkSize) {\n events.push({\n eventType: \"contentBlockDelta\",\n payload: {\n contentBlockIndex: blockIndex,\n delta: { toolUse: { input: argsStr.slice(i, i + chunkSize) } },\n },\n });\n }\n events.push({\n eventType: \"contentBlockStop\",\n payload: { contentBlockIndex: blockIndex },\n });\n }\n events.push({\n eventType: \"messageStop\",\n payload: { stopReason: converseStopReason(overrides?.finishReason, \"tool_use\") },\n });\n const usage = converseUsage(overrides);\n events.push({\n eventType: \"metadata\",\n payload: { usage, metrics: { latencyMs: 0 } },\n });\n return events;\n}\n\n// ─── Input conversion: Converse → ChatCompletionRequest ─────────────────────\n\n/** Validate only message fields consumed by the user-message converter. */\nfunction validateConverseMessages(req: ConverseRequest): string | undefined {\n for (const [i, message] of req.messages.entries()) {\n if (message === null) return `Invalid request: messages[${i}] must not be null`;\n // Unknown roles are intentionally skipped; assistant toolResult is inert.\n if (message.role !== \"user\") continue;\n if (!Array.isArray(message.content)) {\n return `Invalid request: messages[${i}].content must be an array`;\n }\n for (const [j, block] of message.content.entries()) {\n if (block === null) {\n return `Invalid request: messages[${i}].content[${j}] must not be null`;\n }\n if (block.toolResult && !Array.isArray(block.toolResult.content)) {\n return `Invalid request: messages[${i}].content[${j}].toolResult.content must be an array`;\n }\n }\n }\n return undefined;\n}\n\n/** Validate only system fields consumed by the converter. */\nfunction validateConverseSystem(req: ConverseRequest): string | undefined {\n if (req.system && req.system.length > 0) {\n if (!Array.isArray(req.system)) {\n return \"Invalid request: system must be an array\";\n }\n for (const [i, block] of req.system.entries()) {\n if (block === null) return `Invalid request: system[${i}] must not be null`;\n }\n }\n return undefined;\n}\n\n/** Validate only tool fields consumed by the converter. */\nfunction validateConverseTools(req: ConverseRequest): string | undefined {\n if (req.toolConfig?.tools && req.toolConfig.tools.length > 0) {\n if (!Array.isArray(req.toolConfig.tools)) {\n return \"Invalid request: toolConfig.tools must be an array\";\n }\n for (const [i, tool] of req.toolConfig.tools.entries()) {\n if (tool?.toolSpec === null) {\n return `Invalid request: toolConfig.tools[${i}].toolSpec must not be null`;\n }\n }\n }\n return undefined;\n}\n\nexport function converseToCompletionRequest(\n req: ConverseRequest,\n modelId: string,\n logger?: Logger,\n): ChatCompletionRequest {\n const messages: ChatMessage[] = [];\n\n // system field → system message\n if (req.system && req.system.length > 0) {\n const systemText = req.system.map((s) => s.text).join(\"\");\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 toolResult blocks\n const toolResults = msg.content.filter((b) => b.toolResult);\n const textBlocks = msg.content.filter(\n (b) => b.text !== undefined && b.text !== \"\" && !b.toolResult,\n );\n const unsupportedBlocks = msg.content.filter(\n (b) => b.text === undefined && !b.toolResult && !b.toolUse,\n );\n if (unsupportedBlocks.length > 0 && logger) {\n logger.warn(\n `Converse user message contains unsupported content block types — these will be dropped during conversion`,\n );\n }\n\n if (toolResults.length > 0) {\n for (const block of toolResults) {\n const tr = block.toolResult!;\n const resultContent = tr.content.map((c) => c.text ?? \"\").join(\"\");\n messages.push({\n role: \"tool\",\n content: resultContent,\n tool_call_id: tr.toolUseId,\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 // Plain user message\n const text = msg.content\n .filter((b) => b.text !== undefined && b.text !== \"\")\n .map((b) => b.text ?? \"\")\n .join(\"\");\n messages.push({ role: \"user\", content: text });\n } else if (msg.role === \"assistant\") {\n const toolUseBlocks = msg.content.filter((b) => b.toolUse);\n const textContent = msg.content\n .filter((b) => b.text !== undefined && b.text !== \"\")\n .map((b) => b.text ?? \"\")\n .join(\"\");\n\n if (toolUseBlocks.length > 0) {\n messages.push({\n role: \"assistant\",\n content: textContent || null,\n tool_calls: toolUseBlocks.map((b) => ({\n id: b.toolUse!.toolUseId,\n type: \"function\" as const,\n function: {\n name: b.toolUse!.name,\n arguments: JSON.stringify(b.toolUse!.input),\n },\n })),\n });\n } else {\n messages.push({ role: \"assistant\", content: textContent || null });\n }\n } else {\n const warnMsg = `Unexpected message role \"${msg.role}\" in Converse request — skipping`;\n if (logger) {\n logger.warn(warnMsg);\n }\n }\n }\n\n // Convert tools\n let tools: ToolDefinition[] | undefined;\n if (req.toolConfig?.tools && req.toolConfig.tools.length > 0) {\n tools = req.toolConfig.tools.map((t) => ({\n type: \"function\" as const,\n function: {\n name: t.toolSpec.name,\n description: t.toolSpec.description,\n parameters: (t.toolSpec.inputSchema && \"json\" in t.toolSpec.inputSchema\n ? (t.toolSpec.inputSchema as Record<string, unknown>).json\n : t.toolSpec.inputSchema) as object | undefined,\n },\n }));\n }\n\n return {\n model: modelId,\n messages,\n stream: false,\n temperature: req.inferenceConfig?.temperature,\n max_tokens: req.inferenceConfig?.maxTokens,\n tools,\n };\n}\n\n// ─── Response builders ──────────────────────────────────────────────────────\n\nfunction buildConverseTextResponse(\n content: string,\n reasoning?: string,\n overrides?: ResponseOverrides,\n): object {\n const contentBlocks: object[] = [];\n if (reasoning) {\n contentBlocks.push({\n reasoningContent: { reasoningText: { text: reasoning } },\n });\n }\n contentBlocks.push({ text: content });\n\n return {\n output: {\n message: {\n role: \"assistant\",\n content: contentBlocks,\n },\n },\n stopReason: converseStopReason(overrides?.finishReason, \"end_turn\"),\n usage: converseUsage(overrides),\n metrics: { latencyMs: 0 },\n };\n}\n\nfunction buildConverseToolCallResponse(\n toolCalls: ToolCall[],\n logger: Logger,\n reasoning?: string,\n overrides?: ResponseOverrides,\n): object {\n const contentBlocks: object[] = [];\n if (reasoning) {\n contentBlocks.push({\n reasoningContent: { reasoningText: { text: reasoning } },\n });\n }\n for (const tc of toolCalls) {\n let argsObj: unknown;\n try {\n argsObj = JSON.parse(tc.arguments || \"{}\");\n } catch {\n logger.warn(\n `Malformed JSON in fixture tool call arguments for \"${tc.name}\": ${tc.arguments}`,\n );\n argsObj = {};\n }\n contentBlocks.push({\n toolUse: {\n toolUseId: tc.id || generateToolUseId(),\n name: tc.name,\n input: argsObj,\n },\n });\n }\n\n return {\n output: {\n message: {\n role: \"assistant\",\n content: contentBlocks,\n },\n },\n stopReason: converseStopReason(overrides?.finishReason, \"tool_use\"),\n usage: converseUsage(overrides),\n metrics: { latencyMs: 0 },\n };\n}\n\nfunction buildConverseContentWithToolCallsResponse(\n content: string,\n toolCalls: ToolCall[],\n logger: Logger,\n reasoning?: string,\n overrides?: ResponseOverrides,\n blocks?: FixtureBlock[],\n): object {\n const contentBlocks: object[] = [];\n if (reasoning) {\n contentBlocks.push({\n reasoningContent: { reasoningText: { text: reasoning } },\n });\n }\n\n // Build a Converse `toolUse` content block from a fixture tool call, parsing\n // its string `arguments` into the object `input` Converse emits (warning on\n // malformed JSON — same idiom as the legacy/streaming paths).\n const toolUseBlock = (tc: { name: string; arguments: string; id?: string }): object => {\n let argsObj: unknown;\n try {\n argsObj = JSON.parse(tc.arguments || \"{}\");\n } catch {\n logger.warn(\n `Malformed JSON in fixture tool call arguments for \"${tc.name}\": ${tc.arguments}`,\n );\n argsObj = {};\n }\n return {\n toolUse: {\n toolUseId: tc.id || generateToolUseId(),\n name: tc.name,\n input: argsObj,\n },\n };\n };\n\n let blockHasTools: boolean | undefined;\n if (blocks && blocks.length > 0) {\n // NEW PATH: the non-streaming `content[]` array is positionally observable,\n // so emit `text`/`toolUse` content blocks in the fixture's ARRAY ORDER\n // (after any leading reasoning block). A toolCall block before a text block\n // therefore yields a toolUse ahead of the text — matching the streaming\n // path for the same `blocks` fixture.\n const outcome = resolveFixtureBlockOutcome(blocks);\n const ordered = outcome.ordered;\n blockHasTools = outcome.hasToolCalls;\n for (const block of ordered) {\n if (block.type === \"text\") {\n contentBlocks.push({ text: block.text });\n } else {\n contentBlocks.push(\n toolUseBlock({ name: block.name, arguments: block.arguments, id: block.id }),\n );\n }\n }\n } else {\n // LEGACY PATH (unchanged): text content block, then toolUse blocks in\n // `toolCalls` order.\n contentBlocks.push({ text: content });\n for (const tc of toolCalls) {\n contentBlocks.push(toolUseBlock(tc));\n }\n }\n\n return {\n output: {\n message: {\n role: \"assistant\",\n content: contentBlocks,\n },\n },\n stopReason: converseStopReason(\n overrides?.finishReason,\n blockHasTools === false ? \"end_turn\" : \"tool_use\",\n ),\n usage: converseUsage(overrides),\n metrics: { latencyMs: 0 },\n };\n}\n\n// ─── Request handlers ───────────────────────────────────────────────────────\n\nexport async function handleConverse(\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}/converse`;\n\n let converseReq: ConverseRequest;\n try {\n converseReq = JSON.parse(raw) as ConverseRequest;\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 JSON.stringify({\n error: {\n message: `Malformed JSON: ${detail}`,\n type: \"invalid_request_error\",\n },\n }),\n );\n return;\n }\n\n // Reject bodies that parsed but are not a JSON object (e.g. `null`) before\n // touching fields — otherwise `converseReq.messages` throws a TypeError that\n // surfaces as a 500 instead of a 400.\n if (!isJsonObject(converseReq)) {\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 JSON.stringify({\n error: {\n message: \"Request body must be a JSON object\",\n type: \"invalid_request_error\",\n },\n }),\n );\n return;\n }\n\n const messageError = !Array.isArray(converseReq.messages)\n ? \"Invalid request: messages array is required\"\n : (validateConverseMessages(converseReq) ??\n validateConverseSystem(converseReq) ??\n validateConverseTools(converseReq));\n if (messageError) {\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 JSON.stringify({\n error: {\n message: messageError,\n type: \"invalid_request_error\",\n },\n }),\n );\n return;\n }\n\n const completionReq = converseToCompletionRequest(converseReq, 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 = resolveStrictMode(defaults.strict, req.headers);\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 JSON.stringify({\n error: {\n message: strictMessage,\n type: \"invalid_request_error\",\n },\n }),\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 JSON.stringify({\n error: {\n message: \"No fixture matched\",\n type: \"invalid_request_error\",\n },\n }),\n );\n return;\n }\n\n const response = await resolveResponse(fixture, completionReq);\n\n // Error response\n if (isErrorResponse(response)) {\n const status = response.status ?? 500;\n journal.add({\n method: req.method ?? \"POST\",\n path: urlPath,\n headers: flattenHeaders(req.headers),\n body: completionReq,\n response: { status, fixture },\n });\n const errBody = {\n type: \"error\",\n error: {\n type: response.error.type ?? \"invalid_request_error\",\n message: response.error.message,\n },\n };\n writeErrorResponse(res, status, JSON.stringify(errBody), {\n retryAfter: response.retryAfter,\n });\n return;\n }\n\n // Content + tool calls response\n if (isContentWithToolCallsResponse(response)) {\n if (response.webSearches?.length) {\n logger.warn(\n \"webSearches in fixture response are not supported for Bedrock Converse API — ignoring\",\n );\n }\n const overrides = extractOverrides(response);\n const effReasoning = resolveReasoningForModel(\n response.reasoning,\n completionReq.model,\n resolveStrictMode(defaults.strict, req.headers),\n logger,\n );\n 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 const body = buildConverseContentWithToolCallsResponse(\n response.content ?? \"\",\n response.toolCalls ?? [],\n logger,\n effReasoning,\n overrides,\n response.blocks,\n );\n res.writeHead(200, { \"Content-Type\": \"application/json\" });\n res.end(JSON.stringify(body));\n return;\n }\n\n // Text response\n if (isTextResponse(response)) {\n if (response.webSearches?.length) {\n logger.warn(\n \"webSearches in fixture response are not supported for Bedrock Converse API — ignoring\",\n );\n }\n const overrides = extractOverrides(response);\n const effReasoning = resolveReasoningForModel(\n response.reasoning,\n completionReq.model,\n resolveStrictMode(defaults.strict, req.headers),\n logger,\n );\n 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 const body = buildConverseTextResponse(response.content, effReasoning, overrides);\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(\n \"webSearches in fixture response are not supported for Bedrock Converse API — ignoring\",\n );\n }\n const overrides = extractOverrides(response);\n const effReasoning = resolveReasoningForModel(\n response.reasoning,\n completionReq.model,\n resolveStrictMode(defaults.strict, req.headers),\n logger,\n );\n 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 const body = buildConverseToolCallResponse(response.toolCalls, logger, effReasoning, overrides);\n res.writeHead(200, { \"Content-Type\": \"application/json\" });\n res.end(JSON.stringify(body));\n return;\n }\n\n // Unknown response type\n journal.add({\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 JSON.stringify({\n error: {\n message: \"Fixture response did not match any known type\",\n type: \"server_error\",\n },\n }),\n );\n}\n\nexport async function handleConverseStream(\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}/converse-stream`;\n\n let converseReq: ConverseRequest;\n try {\n converseReq = JSON.parse(raw) as ConverseRequest;\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 JSON.stringify({\n error: {\n message: `Malformed JSON: ${detail}`,\n type: \"invalid_request_error\",\n },\n }),\n );\n return;\n }\n\n // Reject bodies that parsed but are not a JSON object (e.g. `null`) before\n // touching fields — otherwise `converseReq.messages` throws a TypeError that\n // surfaces as a 500 instead of a 400.\n if (!isJsonObject(converseReq)) {\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 JSON.stringify({\n error: {\n message: \"Request body must be a JSON object\",\n type: \"invalid_request_error\",\n },\n }),\n );\n return;\n }\n\n const messageError = !Array.isArray(converseReq.messages)\n ? \"Invalid request: messages array is required\"\n : (validateConverseMessages(converseReq) ??\n validateConverseSystem(converseReq) ??\n validateConverseTools(converseReq));\n if (messageError) {\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 JSON.stringify({\n error: {\n message: messageError,\n type: \"invalid_request_error\",\n },\n }),\n );\n return;\n }\n\n const completionReq = converseToCompletionRequest(converseReq, 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 = resolveStrictMode(defaults.strict, req.headers);\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 JSON.stringify({\n error: {\n message: strictMessage,\n type: \"invalid_request_error\",\n },\n }),\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 JSON.stringify({\n error: {\n message: \"No fixture matched\",\n type: \"invalid_request_error\",\n },\n }),\n );\n return;\n }\n\n const response = await resolveResponse(fixture, completionReq);\n const latency = fixture.latency ?? defaults.latency;\n const chunkSize = Math.max(1, fixture.chunkSize ?? defaults.chunkSize);\n\n // Error response\n if (isErrorResponse(response)) {\n const status = response.status ?? 500;\n journal.add({\n method: req.method ?? \"POST\",\n path: urlPath,\n headers: flattenHeaders(req.headers),\n body: completionReq,\n response: { status, fixture },\n });\n const errBody = {\n type: \"error\",\n error: {\n type: response.error.type ?? \"invalid_request_error\",\n message: response.error.message,\n },\n };\n writeErrorResponse(res, status, JSON.stringify(errBody), {\n retryAfter: response.retryAfter,\n });\n return;\n }\n\n // Content + tool calls response — stream as Event Stream\n if (isContentWithToolCallsResponse(response)) {\n if (response.webSearches?.length) {\n logger.warn(\n \"webSearches in fixture response are not supported for Bedrock Converse API — ignoring\",\n );\n }\n const overrides = extractOverrides(response);\n const effReasoning = resolveReasoningForModel(\n response.reasoning,\n completionReq.model,\n resolveStrictMode(defaults.strict, req.headers),\n logger,\n );\n const journalEntry = 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 const events = buildBedrockStreamContentWithToolCallsEvents(\n response.content ?? \"\",\n response.toolCalls ?? [],\n chunkSize,\n logger,\n effReasoning,\n overrides,\n response.blocks,\n );\n const interruption = createInterruptionSignal(fixture);\n const completed = await writeEventStream(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(\n \"webSearches in fixture response are not supported for Bedrock Converse API — ignoring\",\n );\n }\n const overrides = extractOverrides(response);\n const effReasoning = resolveReasoningForModel(\n response.reasoning,\n completionReq.model,\n resolveStrictMode(defaults.strict, req.headers),\n logger,\n );\n const journalEntry = 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 const events = buildBedrockStreamTextEvents(\n response.content,\n chunkSize,\n effReasoning,\n overrides,\n );\n const interruption = createInterruptionSignal(fixture);\n const completed = await writeEventStream(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(\n \"webSearches in fixture response are not supported for Bedrock Converse API — ignoring\",\n );\n }\n const overrides = extractOverrides(response);\n const effReasoning = resolveReasoningForModel(\n response.reasoning,\n completionReq.model,\n resolveStrictMode(defaults.strict, req.headers),\n logger,\n );\n const journalEntry = 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 const events = buildBedrockStreamToolCallEvents(\n response.toolCalls,\n chunkSize,\n logger,\n effReasoning,\n overrides,\n );\n const interruption = createInterruptionSignal(fixture);\n const completed = await writeEventStream(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 journal.add({\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 JSON.stringify({\n error: {\n message: \"Fixture response did not match any known type\",\n type: \"server_error\",\n },\n }),\n );\n}\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"bedrock-converse.d.cts","names":[],"sources":["../src/bedrock-converse.ts"],"sourcesContent":[],"mappings":";;;;;;;UAkDU,oBAAA,CAqB0B;EAAgB,IAAA,CAAA,EAAA,MAAA;EA6UpC,OAAA,CAAA,EAAA;IAA2B,SAAA,EAAA,MAAA;IACpC,IAAA,EAAA,MAAA;IAEI,KAAA,EAAA,MAAA;;EACa,UAAA,CAAA,EAAA;IAiQF,SAAA,EAAA,MAAc;IAAA,OAAA,EAAA;MAC7B,IAAK,CAAA,EAAA,MAAA;IACL,CAAA,EAAA;;;UAnmBG,eAAA,CAwmBE;MACY,EAAA,MAAK,GAAA,WAAA;SAC1B,EAxmBQ,oBAwmBR,EAAA;;AA4UH,UAj7BU,gBAAA,CAi7BgC;EAAA,IAAA,EAAA,MAAA;aAC9B,CAAA,EAAA,MAAA;aACA,CAAA,EAAA,MAAA;;UA76BF,eAAA,CAi7BC;UACC,EAj7BA,eAi7BA,EAAA;QACY,CAAA,EAAA;IACrB,IAAA,EAAA,MAAA;EAAO,CAAA,EAAA;;;;;;;gBAh7B0B;;;;iBA6UpB,2BAAA,MACT,2CAEI,SACR;iBAiQmB,cAAA,MACf,MAAA,CAAK,sBACL,MAAA,CAAK,wDAGA,oBACD,mBACC,uCACY,MAAA,CAAK,0BAC1B;iBA4UmB,oBAAA,MACf,MAAA,CAAK,sBACL,MAAA,CAAK,wDAGA,oBACD,mBACC,uCACY,MAAA,CAAK,0BAC1B"}
1
+ {"version":3,"file":"bedrock-converse.d.cts","names":[],"sources":["../src/bedrock-converse.ts"],"sourcesContent":[],"mappings":";;;;;;;UAkDU,oBAAA,CAqB0B;EAAgB,IAAA,CAAA,EAAA,MAAA;EAoYpC,OAAA,CAAA,EAAA;IAA2B,SAAA,EAAA,MAAA;IACpC,IAAA,EAAA,MAAA;IAEI,KAAA,EAAA,MAAA;;EACa,UAAA,CAAA,EAAA;IAuQF,SAAA,EAAA,MAAc;IAAA,OAAA,EAAA;MAC7B,IAAK,CAAA,EAAA,MAAA;IACL,CAAA,EAAA;;;UAhqBG,eAAA,CAqqBE;MACY,EAAA,MAAK,GAAA,WAAA;SAC1B,EArqBQ,oBAqqBR,EAAA;;AAiVH,UAn/BU,gBAAA,CAm/BgC;EAAA,IAAA,EAAA,MAAA;aAC9B,CAAA,EAAA,MAAA;aACA,CAAA,EAAA,MAAA;;UA/+BF,eAAA,CAm/BC;UACC,EAn/BA,eAm/BA,EAAA;QACY,CAAA,EAAA;IACrB,IAAA,EAAA,MAAA;EAAO,CAAA,EAAA;;;;;;;gBAl/B0B;;;;iBAoYpB,2BAAA,MACT,2CAEI,SACR;iBAuQmB,cAAA,MACf,MAAA,CAAK,sBACL,MAAA,CAAK,wDAGA,oBACD,mBACC,uCACY,MAAA,CAAK,0BAC1B;iBAiVmB,oBAAA,MACf,MAAA,CAAK,sBACL,MAAA,CAAK,wDAGA,oBACD,mBACC,uCACY,MAAA,CAAK,0BAC1B"}
@@ -1 +1 @@
1
- {"version":3,"file":"bedrock-converse.d.ts","names":[],"sources":["../src/bedrock-converse.ts"],"sourcesContent":[],"mappings":";;;;;;;UAkDU,oBAAA,CAqB0B;EAAgB,IAAA,CAAA,EAAA,MAAA;EA6UpC,OAAA,CAAA,EAAA;IAA2B,SAAA,EAAA,MAAA;IACpC,IAAA,EAAA,MAAA;IAEI,KAAA,EAAA,MAAA;;EACa,UAAA,CAAA,EAAA;IAiQF,SAAA,EAAA,MAAc;IAAA,OAAA,EAAA;MAC7B,IAAK,CAAA,EAAA,MAAA;IACL,CAAA,EAAA;;;UAnmBG,eAAA,CAwmBE;MACY,EAAA,MAAK,GAAA,WAAA;SAC1B,EAxmBQ,oBAwmBR,EAAA;;AA4UH,UAj7BU,gBAAA,CAi7BgC;EAAA,IAAA,EAAA,MAAA;aAC9B,CAAA,EAAA,MAAA;aACA,CAAA,EAAA,MAAA;;UA76BF,eAAA,CAi7BC;UACC,EAj7BA,eAi7BA,EAAA;QACY,CAAA,EAAA;IACrB,IAAA,EAAA,MAAA;EAAO,CAAA,EAAA;;;;;;;gBAh7B0B;;;;iBA6UpB,2BAAA,MACT,2CAEI,SACR;iBAiQmB,cAAA,MACf,MAAA,CAAK,sBACL,MAAA,CAAK,wDAGA,oBACD,mBACC,uCACY,MAAA,CAAK,0BAC1B;iBA4UmB,oBAAA,MACf,MAAA,CAAK,sBACL,MAAA,CAAK,wDAGA,oBACD,mBACC,uCACY,MAAA,CAAK,0BAC1B"}
1
+ {"version":3,"file":"bedrock-converse.d.ts","names":[],"sources":["../src/bedrock-converse.ts"],"sourcesContent":[],"mappings":";;;;;;;UAkDU,oBAAA,CAqB0B;EAAgB,IAAA,CAAA,EAAA,MAAA;EAoYpC,OAAA,CAAA,EAAA;IAA2B,SAAA,EAAA,MAAA;IACpC,IAAA,EAAA,MAAA;IAEI,KAAA,EAAA,MAAA;;EACa,UAAA,CAAA,EAAA;IAuQF,SAAA,EAAA,MAAc;IAAA,OAAA,EAAA;MAC7B,IAAK,CAAA,EAAA,MAAA;IACL,CAAA,EAAA;;;UAhqBG,eAAA,CAqqBE;MACY,EAAA,MAAK,GAAA,WAAA;SAC1B,EArqBQ,oBAqqBR,EAAA;;AAiVH,UAn/BU,gBAAA,CAm/BgC;EAAA,IAAA,EAAA,MAAA;aAC9B,CAAA,EAAA,MAAA;aACA,CAAA,EAAA,MAAA;;UA/+BF,eAAA,CAm/BC;UACC,EAn/BA,eAm/BA,EAAA;QACY,CAAA,EAAA;IACrB,IAAA,EAAA,MAAA;EAAO,CAAA,EAAA;;;;;;;gBAl/B0B;;;;iBAoYpB,2BAAA,MACT,2CAEI,SACR;iBAuQmB,cAAA,MACf,MAAA,CAAK,sBACL,MAAA,CAAK,wDAGA,oBACD,mBACC,uCACY,MAAA,CAAK,0BAC1B;iBAiVmB,oBAAA,MACf,MAAA,CAAK,sBACL,MAAA,CAAK,wDAGA,oBACD,mBACC,uCACY,MAAA,CAAK,0BAC1B"}
@@ -1,9 +1,9 @@
1
- import { extractOverrides, flattenHeaders, generateToolUseId, getContext, getTestId, isContentWithToolCallsResponse, isErrorResponse, isJsonObject, isTextResponse, isToolCallResponse, resolveFixtureBlocks, resolveReasoningForModel, resolveResponse, resolveStrictMode, strictNoMatchLogLine, strictNoMatchMessage, strictOverrideField } from "./helpers.js";
2
- import { matchFixtureDiagnostic, recordMatchOptions } from "./router.js";
1
+ import { extractOverrides, flattenHeaders, generateToolUseId, getContext, getTestId, isContentWithToolCallsResponse, isErrorResponse, isJsonObject, isTextResponse, isToolCallResponse, resolveFixtureBlockOutcome, resolveReasoningForModel, resolveResponse, resolveStrictMode, strictNoMatchLogLine, strictNoMatchMessage, strictOverrideField } from "./helpers.js";
3
2
  import { writeErrorResponse } from "./sse-writer.js";
4
- import { createInterruptionSignal } from "./interruption.js";
5
- import { applyChaos } from "./chaos.js";
3
+ import { applyChaosAsync } from "./chaos.js";
4
+ import { matchFixtureDiagnostic, recordMatchOptions } from "./router.js";
6
5
  import { proxyAndRecord } from "./recorder.js";
6
+ import { createInterruptionSignal } from "./interruption.js";
7
7
  import { writeEventStream } from "./aws-event-stream.js";
8
8
 
9
9
  //#region src/bedrock-converse.ts
@@ -132,7 +132,8 @@ function buildBedrockStreamContentWithToolCallsEvents(content, toolCalls, chunkS
132
132
  });
133
133
  blockIndex++;
134
134
  }
135
- const ordered = resolveFixtureBlocks(blocks);
135
+ const outcome = resolveFixtureBlockOutcome(blocks);
136
+ const ordered = outcome.ordered;
136
137
  for (const block of ordered) {
137
138
  if (block.type === "text") {
138
139
  events.push({
@@ -185,7 +186,7 @@ function buildBedrockStreamContentWithToolCallsEvents(content, toolCalls, chunkS
185
186
  }
186
187
  events.push({
187
188
  eventType: "messageStop",
188
- payload: { stopReason: converseStopReason(overrides?.finishReason, "tool_use") }
189
+ payload: { stopReason: converseStopReason(overrides?.finishReason, outcome.hasToolCalls ? "tool_use" : "end_turn") }
189
190
  });
190
191
  events.push({
191
192
  eventType: "metadata",
@@ -310,6 +311,32 @@ function buildBedrockStreamToolCallEvents(toolCalls, chunkSize, logger, reasonin
310
311
  });
311
312
  return events;
312
313
  }
314
+ /** Validate only message fields consumed by the user-message converter. */
315
+ function validateConverseMessages(req) {
316
+ for (const [i, message] of req.messages.entries()) {
317
+ if (message === null) return `Invalid request: messages[${i}] must not be null`;
318
+ if (message.role !== "user") continue;
319
+ if (!Array.isArray(message.content)) return `Invalid request: messages[${i}].content must be an array`;
320
+ for (const [j, block] of message.content.entries()) {
321
+ if (block === null) return `Invalid request: messages[${i}].content[${j}] must not be null`;
322
+ if (block.toolResult && !Array.isArray(block.toolResult.content)) return `Invalid request: messages[${i}].content[${j}].toolResult.content must be an array`;
323
+ }
324
+ }
325
+ }
326
+ /** Validate only system fields consumed by the converter. */
327
+ function validateConverseSystem(req) {
328
+ if (req.system && req.system.length > 0) {
329
+ if (!Array.isArray(req.system)) return "Invalid request: system must be an array";
330
+ for (const [i, block] of req.system.entries()) if (block === null) return `Invalid request: system[${i}] must not be null`;
331
+ }
332
+ }
333
+ /** Validate only tool fields consumed by the converter. */
334
+ function validateConverseTools(req) {
335
+ if (req.toolConfig?.tools && req.toolConfig.tools.length > 0) {
336
+ if (!Array.isArray(req.toolConfig.tools)) return "Invalid request: toolConfig.tools must be an array";
337
+ for (const [i, tool] of req.toolConfig.tools.entries()) if (tool?.toolSpec === null) return `Invalid request: toolConfig.tools[${i}].toolSpec must not be null`;
338
+ }
339
+ }
313
340
  function converseToCompletionRequest(req, modelId, logger) {
314
341
  const messages = [];
315
342
  if (req.system && req.system.length > 0) {
@@ -443,8 +470,11 @@ function buildConverseContentWithToolCallsResponse(content, toolCalls, logger, r
443
470
  input: argsObj
444
471
  } };
445
472
  };
473
+ let blockHasTools;
446
474
  if (blocks && blocks.length > 0) {
447
- const ordered = resolveFixtureBlocks(blocks);
475
+ const outcome = resolveFixtureBlockOutcome(blocks);
476
+ const ordered = outcome.ordered;
477
+ blockHasTools = outcome.hasToolCalls;
448
478
  for (const block of ordered) if (block.type === "text") contentBlocks.push({ text: block.text });
449
479
  else contentBlocks.push(toolUseBlock({
450
480
  name: block.name,
@@ -460,7 +490,7 @@ function buildConverseContentWithToolCallsResponse(content, toolCalls, logger, r
460
490
  role: "assistant",
461
491
  content: contentBlocks
462
492
  } },
463
- stopReason: converseStopReason(overrides?.finishReason, "tool_use"),
493
+ stopReason: converseStopReason(overrides?.finishReason, blockHasTools === false ? "end_turn" : "tool_use"),
464
494
  usage: converseUsage(overrides),
465
495
  metrics: { latencyMs: 0 }
466
496
  };
@@ -507,7 +537,8 @@ async function handleConverse(req, res, raw, modelId, fixtures, journal, default
507
537
  } }));
508
538
  return;
509
539
  }
510
- if (!converseReq.messages || !Array.isArray(converseReq.messages)) {
540
+ const messageError = !Array.isArray(converseReq.messages) ? "Invalid request: messages array is required" : validateConverseMessages(converseReq) ?? validateConverseSystem(converseReq) ?? validateConverseTools(converseReq);
541
+ if (messageError) {
511
542
  journal.add({
512
543
  method: req.method ?? "POST",
513
544
  path: urlPath,
@@ -519,7 +550,7 @@ async function handleConverse(req, res, raw, modelId, fixtures, journal, default
519
550
  }
520
551
  });
521
552
  writeErrorResponse(res, 400, JSON.stringify({ error: {
522
- message: "Invalid request: messages array is required",
553
+ message: messageError,
523
554
  type: "invalid_request_error"
524
555
  } }));
525
556
  return;
@@ -532,7 +563,7 @@ async function handleConverse(req, res, raw, modelId, fixtures, journal, default
532
563
  if (fixture) logger.debug(`Fixture matched: ${JSON.stringify(fixture.match).slice(0, 120)}`);
533
564
  else logger.debug(`No fixture matched for request`);
534
565
  if (fixture) journal.incrementFixtureMatchCount(fixture, fixtures, testId);
535
- if (applyChaos(res, fixture, defaults.chaos, req.headers, req.url, journal, {
566
+ if (await applyChaosAsync(res, fixture, defaults.chaos, req.headers, req.url, journal, {
536
567
  method: req.method ?? "POST",
537
568
  path: urlPath,
538
569
  headers: flattenHeaders(req.headers),
@@ -732,7 +763,8 @@ async function handleConverseStream(req, res, raw, modelId, fixtures, journal, d
732
763
  } }));
733
764
  return;
734
765
  }
735
- if (!converseReq.messages || !Array.isArray(converseReq.messages)) {
766
+ const messageError = !Array.isArray(converseReq.messages) ? "Invalid request: messages array is required" : validateConverseMessages(converseReq) ?? validateConverseSystem(converseReq) ?? validateConverseTools(converseReq);
767
+ if (messageError) {
736
768
  journal.add({
737
769
  method: req.method ?? "POST",
738
770
  path: urlPath,
@@ -744,7 +776,7 @@ async function handleConverseStream(req, res, raw, modelId, fixtures, journal, d
744
776
  }
745
777
  });
746
778
  writeErrorResponse(res, 400, JSON.stringify({ error: {
747
- message: "Invalid request: messages array is required",
779
+ message: messageError,
748
780
  type: "invalid_request_error"
749
781
  } }));
750
782
  return;
@@ -758,7 +790,7 @@ async function handleConverseStream(req, res, raw, modelId, fixtures, journal, d
758
790
  if (fixture) logger.debug(`Fixture matched: ${JSON.stringify(fixture.match).slice(0, 120)}`);
759
791
  else logger.debug(`No fixture matched for request`);
760
792
  if (fixture) journal.incrementFixtureMatchCount(fixture, fixtures, testId);
761
- if (applyChaos(res, fixture, defaults.chaos, req.headers, req.url, journal, {
793
+ if (await applyChaosAsync(res, fixture, defaults.chaos, req.headers, req.url, journal, {
762
794
  method: req.method ?? "POST",
763
795
  path: urlPath,
764
796
  headers: flattenHeaders(req.headers),