@copilotkit/aimock 1.43.0 → 1.45.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 (396) hide show
  1. package/.claude-plugin/marketplace.json +1 -1
  2. package/.claude-plugin/plugin.json +1 -1
  3. package/CHANGELOG.md +46 -0
  4. package/README.md +14 -2
  5. package/dist/agui-handler.d.ts.map +1 -1
  6. package/dist/aimock-cli.cjs +31 -5
  7. package/dist/aimock-cli.cjs.map +1 -1
  8. package/dist/aimock-cli.d.cts.map +1 -1
  9. package/dist/aimock-cli.d.ts.map +1 -1
  10. package/dist/aimock-cli.js +31 -5
  11. package/dist/aimock-cli.js.map +1 -1
  12. package/dist/bedrock-converse.cjs +344 -43
  13. package/dist/bedrock-converse.cjs.map +1 -1
  14. package/dist/bedrock-converse.d.cts.map +1 -1
  15. package/dist/bedrock-converse.d.ts.map +1 -1
  16. package/dist/bedrock-converse.js +345 -44
  17. package/dist/bedrock-converse.js.map +1 -1
  18. package/dist/bedrock.cjs +195 -42
  19. package/dist/bedrock.cjs.map +1 -1
  20. package/dist/bedrock.d.cts.map +1 -1
  21. package/dist/bedrock.d.ts.map +1 -1
  22. package/dist/bedrock.js +196 -43
  23. package/dist/bedrock.js.map +1 -1
  24. package/dist/chaos.cjs +9 -5
  25. package/dist/chaos.cjs.map +1 -1
  26. package/dist/chaos.d.cts.map +1 -1
  27. package/dist/chaos.d.ts.map +1 -1
  28. package/dist/chaos.js +10 -7
  29. package/dist/chaos.js.map +1 -1
  30. package/dist/cli.cjs +238 -9
  31. package/dist/cli.cjs.map +1 -1
  32. package/dist/cli.js +242 -13
  33. package/dist/cli.js.map +1 -1
  34. package/dist/cohere.cjs +159 -72
  35. package/dist/cohere.cjs.map +1 -1
  36. package/dist/cohere.d.cts.map +1 -1
  37. package/dist/cohere.d.ts.map +1 -1
  38. package/dist/cohere.js +160 -73
  39. package/dist/cohere.js.map +1 -1
  40. package/dist/config-loader.cjs +63 -5
  41. package/dist/config-loader.cjs.map +1 -1
  42. package/dist/config-loader.d.cts +37 -4
  43. package/dist/config-loader.d.cts.map +1 -1
  44. package/dist/config-loader.d.ts +37 -4
  45. package/dist/config-loader.d.ts.map +1 -1
  46. package/dist/config-loader.js +63 -5
  47. package/dist/config-loader.js.map +1 -1
  48. package/dist/constants.cjs +8 -0
  49. package/dist/constants.cjs.map +1 -1
  50. package/dist/constants.d.cts +6 -2
  51. package/dist/constants.d.ts +6 -2
  52. package/dist/constants.js +8 -1
  53. package/dist/constants.js.map +1 -1
  54. package/dist/echo-text.cjs +65 -0
  55. package/dist/echo-text.cjs.map +1 -0
  56. package/dist/echo-text.d.cts +22 -0
  57. package/dist/echo-text.d.cts.map +1 -0
  58. package/dist/echo-text.d.ts +22 -0
  59. package/dist/echo-text.d.ts.map +1 -0
  60. package/dist/echo-text.js +65 -0
  61. package/dist/echo-text.js.map +1 -0
  62. package/dist/embeddings.cjs +18 -1
  63. package/dist/embeddings.cjs.map +1 -1
  64. package/dist/embeddings.d.cts +1 -1
  65. package/dist/embeddings.d.cts.map +1 -1
  66. package/dist/embeddings.d.ts +1 -1
  67. package/dist/embeddings.d.ts.map +1 -1
  68. package/dist/embeddings.js +18 -1
  69. package/dist/embeddings.js.map +1 -1
  70. package/dist/fakes-plugin.cjs +131 -0
  71. package/dist/fakes-plugin.cjs.map +1 -0
  72. package/dist/fakes-plugin.d.cts +23 -0
  73. package/dist/fakes-plugin.d.cts.map +1 -0
  74. package/dist/fakes-plugin.d.ts +23 -0
  75. package/dist/fakes-plugin.d.ts.map +1 -0
  76. package/dist/fakes-plugin.js +127 -0
  77. package/dist/fakes-plugin.js.map +1 -0
  78. package/dist/files.cjs +9 -11
  79. package/dist/files.cjs.map +1 -1
  80. package/dist/files.d.cts.map +1 -1
  81. package/dist/files.d.ts.map +1 -1
  82. package/dist/files.js +10 -13
  83. package/dist/files.js.map +1 -1
  84. package/dist/fine-tuning.cjs +1 -19
  85. package/dist/fine-tuning.cjs.map +1 -1
  86. package/dist/fine-tuning.d.cts.map +1 -1
  87. package/dist/fine-tuning.d.ts.map +1 -1
  88. package/dist/fine-tuning.js +2 -20
  89. package/dist/fine-tuning.js.map +1 -1
  90. package/dist/fixture-loader-services.cjs +116 -0
  91. package/dist/fixture-loader-services.cjs.map +1 -0
  92. package/dist/fixture-loader-services.d.cts +48 -0
  93. package/dist/fixture-loader-services.d.cts.map +1 -0
  94. package/dist/fixture-loader-services.d.ts +48 -0
  95. package/dist/fixture-loader-services.d.ts.map +1 -0
  96. package/dist/fixture-loader-services.js +114 -0
  97. package/dist/fixture-loader-services.js.map +1 -0
  98. package/dist/fixture-loader.cjs +552 -29
  99. package/dist/fixture-loader.cjs.map +1 -1
  100. package/dist/fixture-loader.d.cts +140 -2
  101. package/dist/fixture-loader.d.cts.map +1 -1
  102. package/dist/fixture-loader.d.ts +140 -2
  103. package/dist/fixture-loader.d.ts.map +1 -1
  104. package/dist/fixture-loader.js +542 -31
  105. package/dist/fixture-loader.js.map +1 -1
  106. package/dist/gemini-embeddings.cjs +42 -2
  107. package/dist/gemini-embeddings.cjs.map +1 -1
  108. package/dist/gemini-embeddings.js +43 -3
  109. package/dist/gemini-embeddings.js.map +1 -1
  110. package/dist/gemini-interactions.cjs +288 -52
  111. package/dist/gemini-interactions.cjs.map +1 -1
  112. package/dist/gemini-interactions.d.cts.map +1 -1
  113. package/dist/gemini-interactions.d.ts.map +1 -1
  114. package/dist/gemini-interactions.js +289 -53
  115. package/dist/gemini-interactions.js.map +1 -1
  116. package/dist/gemini.cjs +234 -38
  117. package/dist/gemini.cjs.map +1 -1
  118. package/dist/gemini.d.cts.map +1 -1
  119. package/dist/gemini.d.ts.map +1 -1
  120. package/dist/gemini.js +235 -39
  121. package/dist/gemini.js.map +1 -1
  122. package/dist/helpers.cjs +1157 -12
  123. package/dist/helpers.cjs.map +1 -1
  124. package/dist/helpers.d.cts +85 -4
  125. package/dist/helpers.d.cts.map +1 -1
  126. package/dist/helpers.d.ts +85 -4
  127. package/dist/helpers.d.ts.map +1 -1
  128. package/dist/helpers.js +1113 -14
  129. package/dist/helpers.js.map +1 -1
  130. package/dist/images.cjs +3 -2
  131. package/dist/images.cjs.map +1 -1
  132. package/dist/images.js +3 -2
  133. package/dist/images.js.map +1 -1
  134. package/dist/index.cjs +39 -1
  135. package/dist/index.d.cts +11 -4
  136. package/dist/index.d.ts +11 -4
  137. package/dist/index.js +11 -4
  138. package/dist/jest.cjs +43 -14
  139. package/dist/jest.cjs.map +1 -1
  140. package/dist/jest.d.cts +47 -5
  141. package/dist/jest.d.cts.map +1 -1
  142. package/dist/jest.d.ts +47 -5
  143. package/dist/jest.d.ts.map +1 -1
  144. package/dist/jest.js +45 -16
  145. package/dist/jest.js.map +1 -1
  146. package/dist/journal.cjs +155 -13
  147. package/dist/journal.cjs.map +1 -1
  148. package/dist/journal.d.cts +54 -4
  149. package/dist/journal.d.cts.map +1 -1
  150. package/dist/journal.d.ts +54 -4
  151. package/dist/journal.d.ts.map +1 -1
  152. package/dist/journal.js +155 -13
  153. package/dist/journal.js.map +1 -1
  154. package/dist/live-sanitize.cjs +4 -32
  155. package/dist/live-sanitize.cjs.map +1 -1
  156. package/dist/live-sanitize.js +4 -32
  157. package/dist/live-sanitize.js.map +1 -1
  158. package/dist/llmock.cjs +204 -39
  159. package/dist/llmock.cjs.map +1 -1
  160. package/dist/llmock.d.cts +51 -1
  161. package/dist/llmock.d.cts.map +1 -1
  162. package/dist/llmock.d.ts +51 -1
  163. package/dist/llmock.d.ts.map +1 -1
  164. package/dist/llmock.js +206 -41
  165. package/dist/llmock.js.map +1 -1
  166. package/dist/mcp-fakes-mount.cjs +217 -0
  167. package/dist/mcp-fakes-mount.cjs.map +1 -0
  168. package/dist/mcp-fakes-mount.js +211 -0
  169. package/dist/mcp-fakes-mount.js.map +1 -0
  170. package/dist/mcp-fakes-report.cjs +111 -0
  171. package/dist/mcp-fakes-report.cjs.map +1 -0
  172. package/dist/mcp-fakes-report.d.cts +40 -0
  173. package/dist/mcp-fakes-report.d.cts.map +1 -0
  174. package/dist/mcp-fakes-report.d.ts +40 -0
  175. package/dist/mcp-fakes-report.d.ts.map +1 -0
  176. package/dist/mcp-fakes-report.js +107 -0
  177. package/dist/mcp-fakes-report.js.map +1 -0
  178. package/dist/mcp-fakes.cjs +1942 -0
  179. package/dist/mcp-fakes.cjs.map +1 -0
  180. package/dist/mcp-fakes.d.cts +504 -0
  181. package/dist/mcp-fakes.d.cts.map +1 -0
  182. package/dist/mcp-fakes.d.ts +504 -0
  183. package/dist/mcp-fakes.d.ts.map +1 -0
  184. package/dist/mcp-fakes.js +1937 -0
  185. package/dist/mcp-fakes.js.map +1 -0
  186. package/dist/mcp-handler.cjs +534 -27
  187. package/dist/mcp-handler.cjs.map +1 -1
  188. package/dist/mcp-handler.d.cts +49 -0
  189. package/dist/mcp-handler.d.cts.map +1 -0
  190. package/dist/mcp-handler.d.ts +49 -0
  191. package/dist/mcp-handler.d.ts.map +1 -0
  192. package/dist/mcp-handler.js +530 -28
  193. package/dist/mcp-handler.js.map +1 -1
  194. package/dist/mcp-mock.cjs +326 -47
  195. package/dist/mcp-mock.cjs.map +1 -1
  196. package/dist/mcp-mock.d.cts +97 -1
  197. package/dist/mcp-mock.d.cts.map +1 -1
  198. package/dist/mcp-mock.d.ts +97 -1
  199. package/dist/mcp-mock.d.ts.map +1 -1
  200. package/dist/mcp-mock.js +327 -48
  201. package/dist/mcp-mock.js.map +1 -1
  202. package/dist/mcp-recorder.cjs +1224 -0
  203. package/dist/mcp-recorder.cjs.map +1 -0
  204. package/dist/mcp-recorder.d.cts +108 -0
  205. package/dist/mcp-recorder.d.cts.map +1 -0
  206. package/dist/mcp-recorder.d.ts +108 -0
  207. package/dist/mcp-recorder.d.ts.map +1 -0
  208. package/dist/mcp-recorder.js +1215 -0
  209. package/dist/mcp-recorder.js.map +1 -0
  210. package/dist/mcp-stub.cjs +5 -1
  211. package/dist/mcp-stub.d.cts +3 -1
  212. package/dist/mcp-stub.d.ts +3 -1
  213. package/dist/mcp-stub.js +3 -1
  214. package/dist/mcp-types.d.cts +6 -0
  215. package/dist/mcp-types.d.ts +6 -0
  216. package/dist/message-text.cjs +192 -0
  217. package/dist/message-text.cjs.map +1 -0
  218. package/dist/message-text.d.cts +31 -0
  219. package/dist/message-text.d.cts.map +1 -0
  220. package/dist/message-text.d.ts +31 -0
  221. package/dist/message-text.d.ts.map +1 -0
  222. package/dist/message-text.js +184 -0
  223. package/dist/message-text.js.map +1 -0
  224. package/dist/messages.cjs +400 -56
  225. package/dist/messages.cjs.map +1 -1
  226. package/dist/messages.d.cts.map +1 -1
  227. package/dist/messages.d.ts.map +1 -1
  228. package/dist/messages.js +401 -58
  229. package/dist/messages.js.map +1 -1
  230. package/dist/metrics.cjs +46 -66
  231. package/dist/metrics.cjs.map +1 -1
  232. package/dist/metrics.d.cts +14 -6
  233. package/dist/metrics.d.cts.map +1 -1
  234. package/dist/metrics.d.ts +14 -6
  235. package/dist/metrics.d.ts.map +1 -1
  236. package/dist/metrics.js +32 -40
  237. package/dist/metrics.js.map +1 -1
  238. package/dist/misbehavior.cjs +1523 -0
  239. package/dist/misbehavior.cjs.map +1 -0
  240. package/dist/misbehavior.d.cts +43 -0
  241. package/dist/misbehavior.d.cts.map +1 -0
  242. package/dist/misbehavior.d.ts +43 -0
  243. package/dist/misbehavior.d.ts.map +1 -0
  244. package/dist/misbehavior.js +1511 -0
  245. package/dist/misbehavior.js.map +1 -0
  246. package/dist/ollama.cjs +315 -113
  247. package/dist/ollama.cjs.map +1 -1
  248. package/dist/ollama.d.cts.map +1 -1
  249. package/dist/ollama.d.ts.map +1 -1
  250. package/dist/ollama.js +316 -114
  251. package/dist/ollama.js.map +1 -1
  252. package/dist/openapi.cjs +3405 -0
  253. package/dist/openapi.cjs.map +1 -0
  254. package/dist/openapi.d.cts +30 -0
  255. package/dist/openapi.d.cts.map +1 -0
  256. package/dist/openapi.d.ts +30 -0
  257. package/dist/openapi.d.ts.map +1 -0
  258. package/dist/openapi.js +3404 -0
  259. package/dist/openapi.js.map +1 -0
  260. package/dist/openrouter-video.cjs +4 -4
  261. package/dist/openrouter-video.cjs.map +1 -1
  262. package/dist/openrouter-video.d.cts.map +1 -1
  263. package/dist/openrouter-video.d.ts.map +1 -1
  264. package/dist/openrouter-video.js +4 -4
  265. package/dist/openrouter-video.js.map +1 -1
  266. package/dist/record-sanitize.cjs +231 -0
  267. package/dist/record-sanitize.cjs.map +1 -0
  268. package/dist/record-sanitize.js +224 -0
  269. package/dist/record-sanitize.js.map +1 -0
  270. package/dist/recorder.cjs +115 -6
  271. package/dist/recorder.cjs.map +1 -1
  272. package/dist/recorder.d.cts +2 -1
  273. package/dist/recorder.d.cts.map +1 -1
  274. package/dist/recorder.d.ts +2 -1
  275. package/dist/recorder.d.ts.map +1 -1
  276. package/dist/recorder.js +116 -8
  277. package/dist/recorder.js.map +1 -1
  278. package/dist/responses.cjs +701 -166
  279. package/dist/responses.cjs.map +1 -1
  280. package/dist/responses.d.cts +5 -13
  281. package/dist/responses.d.cts.map +1 -1
  282. package/dist/responses.d.ts +5 -13
  283. package/dist/responses.d.ts.map +1 -1
  284. package/dist/responses.js +699 -169
  285. package/dist/responses.js.map +1 -1
  286. package/dist/route-registry.cjs +951 -0
  287. package/dist/route-registry.cjs.map +1 -0
  288. package/dist/route-registry.d.cts +33 -0
  289. package/dist/route-registry.d.cts.map +1 -0
  290. package/dist/route-registry.d.ts +33 -0
  291. package/dist/route-registry.d.ts.map +1 -0
  292. package/dist/route-registry.js +866 -0
  293. package/dist/route-registry.js.map +1 -0
  294. package/dist/router.cjs +24 -2
  295. package/dist/router.cjs.map +1 -1
  296. package/dist/router.d.cts.map +1 -1
  297. package/dist/router.d.ts.map +1 -1
  298. package/dist/router.js +25 -4
  299. package/dist/router.js.map +1 -1
  300. package/dist/server.cjs +1159 -264
  301. package/dist/server.cjs.map +1 -1
  302. package/dist/server.d.cts +4 -1
  303. package/dist/server.d.cts.map +1 -1
  304. package/dist/server.d.ts +4 -1
  305. package/dist/server.d.ts.map +1 -1
  306. package/dist/server.js +1067 -172
  307. package/dist/server.js.map +1 -1
  308. package/dist/speech.cjs +4 -2
  309. package/dist/speech.cjs.map +1 -1
  310. package/dist/speech.js +4 -2
  311. package/dist/speech.js.map +1 -1
  312. package/dist/stream-collapse.cjs +236 -34
  313. package/dist/stream-collapse.cjs.map +1 -1
  314. package/dist/stream-collapse.d.cts +39 -4
  315. package/dist/stream-collapse.d.cts.map +1 -1
  316. package/dist/stream-collapse.d.ts +39 -4
  317. package/dist/stream-collapse.d.ts.map +1 -1
  318. package/dist/stream-collapse.js +235 -35
  319. package/dist/stream-collapse.js.map +1 -1
  320. package/dist/suite.cjs +1 -1
  321. package/dist/suite.js +1 -1
  322. package/dist/transcription.cjs +2 -2
  323. package/dist/transcription.cjs.map +1 -1
  324. package/dist/transcription.d.cts.map +1 -1
  325. package/dist/transcription.d.ts.map +1 -1
  326. package/dist/transcription.js +2 -2
  327. package/dist/transcription.js.map +1 -1
  328. package/dist/types.cjs +18 -0
  329. package/dist/types.cjs.map +1 -0
  330. package/dist/types.d.cts +516 -5
  331. package/dist/types.d.cts.map +1 -1
  332. package/dist/types.d.ts +516 -5
  333. package/dist/types.d.ts.map +1 -1
  334. package/dist/types.js +17 -0
  335. package/dist/types.js.map +1 -0
  336. package/dist/validate-cli.cjs +123 -33
  337. package/dist/validate-cli.cjs.map +1 -1
  338. package/dist/validate-cli.js +125 -35
  339. package/dist/validate-cli.js.map +1 -1
  340. package/dist/vector-stores.cjs +1180 -0
  341. package/dist/vector-stores.cjs.map +1 -0
  342. package/dist/vector-stores.d.cts +106 -0
  343. package/dist/vector-stores.d.cts.map +1 -0
  344. package/dist/vector-stores.d.ts +106 -0
  345. package/dist/vector-stores.d.ts.map +1 -0
  346. package/dist/vector-stores.js +1164 -0
  347. package/dist/vector-stores.js.map +1 -0
  348. package/dist/vector-types.d.cts.map +1 -1
  349. package/dist/version.cjs +45 -0
  350. package/dist/version.cjs.map +1 -0
  351. package/dist/version.js +44 -0
  352. package/dist/version.js.map +1 -0
  353. package/dist/video.cjs +19 -0
  354. package/dist/video.cjs.map +1 -1
  355. package/dist/video.d.cts.map +1 -1
  356. package/dist/video.d.ts.map +1 -1
  357. package/dist/video.js +19 -0
  358. package/dist/video.js.map +1 -1
  359. package/dist/vitest.cjs +77 -16
  360. package/dist/vitest.cjs.map +1 -1
  361. package/dist/vitest.d.cts +38 -5
  362. package/dist/vitest.d.cts.map +1 -1
  363. package/dist/vitest.d.ts +38 -5
  364. package/dist/vitest.d.ts.map +1 -1
  365. package/dist/vitest.js +78 -17
  366. package/dist/vitest.js.map +1 -1
  367. package/dist/watcher.cjs +6 -2
  368. package/dist/watcher.cjs.map +1 -1
  369. package/dist/watcher.js +6 -2
  370. package/dist/watcher.js.map +1 -1
  371. package/dist/ws-gemini-live.cjs +210 -101
  372. package/dist/ws-gemini-live.cjs.map +1 -1
  373. package/dist/ws-gemini-live.d.cts +9 -3
  374. package/dist/ws-gemini-live.d.cts.map +1 -1
  375. package/dist/ws-gemini-live.d.ts +9 -3
  376. package/dist/ws-gemini-live.d.ts.map +1 -1
  377. package/dist/ws-gemini-live.js +211 -102
  378. package/dist/ws-gemini-live.js.map +1 -1
  379. package/dist/ws-realtime.cjs +175 -62
  380. package/dist/ws-realtime.cjs.map +1 -1
  381. package/dist/ws-realtime.d.cts +8 -3
  382. package/dist/ws-realtime.d.cts.map +1 -1
  383. package/dist/ws-realtime.d.ts +8 -3
  384. package/dist/ws-realtime.d.ts.map +1 -1
  385. package/dist/ws-realtime.js +176 -63
  386. package/dist/ws-realtime.js.map +1 -1
  387. package/dist/ws-responses.cjs +121 -16
  388. package/dist/ws-responses.cjs.map +1 -1
  389. package/dist/ws-responses.d.cts +8 -12
  390. package/dist/ws-responses.d.cts.map +1 -1
  391. package/dist/ws-responses.d.ts +8 -12
  392. package/dist/ws-responses.d.ts.map +1 -1
  393. package/dist/ws-responses.js +123 -18
  394. package/dist/ws-responses.js.map +1 -1
  395. package/package.json +13 -2
  396. package/skills/write-fixtures/SKILL.md +179 -21
@@ -1,6 +1,7 @@
1
1
  const require_helpers = require('./helpers.cjs');
2
2
  const require_sse_writer = require('./sse-writer.cjs');
3
3
  const require_chaos = require('./chaos.cjs');
4
+ const require_misbehavior = require('./misbehavior.cjs');
4
5
  const require_router = require('./router.cjs');
5
6
  const require_recorder = require('./recorder.cjs');
6
7
  const require_interruption = require('./interruption.cjs');
@@ -37,13 +38,7 @@ function converseUsage(overrides) {
37
38
  };
38
39
  }
39
40
  function parseConverseToolArgumentsForStream(toolCall, logger) {
40
- try {
41
- const parsed = JSON.parse(toolCall.arguments || "{}");
42
- return JSON.stringify(parsed);
43
- } catch {
44
- logger.warn(`Malformed JSON in fixture tool call arguments for "${toolCall.name}": ${toolCall.arguments}`);
45
- return "{}";
46
- }
41
+ return require_helpers.servedToolArgs(toolCall, "string", logger).text;
47
42
  }
48
43
  function buildBedrockStreamTextEvents(content, chunkSize, reasoning, overrides) {
49
44
  const events = [{
@@ -311,6 +306,32 @@ function buildBedrockStreamToolCallEvents(toolCalls, chunkSize, logger, reasonin
311
306
  });
312
307
  return events;
313
308
  }
309
+ /** Validate only message fields consumed by the user-message converter. */
310
+ function validateConverseMessages(req) {
311
+ for (const [i, message] of req.messages.entries()) {
312
+ if (message === null) return `Invalid request: messages[${i}] must not be null`;
313
+ if (message.role !== "user") continue;
314
+ if (!Array.isArray(message.content)) return `Invalid request: messages[${i}].content must be an array`;
315
+ for (const [j, block] of message.content.entries()) {
316
+ if (block === null) return `Invalid request: messages[${i}].content[${j}] must not be null`;
317
+ if (block.toolResult && !Array.isArray(block.toolResult.content)) return `Invalid request: messages[${i}].content[${j}].toolResult.content must be an array`;
318
+ }
319
+ }
320
+ }
321
+ /** Validate only system fields consumed by the converter. */
322
+ function validateConverseSystem(req) {
323
+ if (req.system && req.system.length > 0) {
324
+ if (!Array.isArray(req.system)) return "Invalid request: system must be an array";
325
+ for (const [i, block] of req.system.entries()) if (block === null) return `Invalid request: system[${i}] must not be null`;
326
+ }
327
+ }
328
+ /** Validate only tool fields consumed by the converter. */
329
+ function validateConverseTools(req) {
330
+ if (req.toolConfig?.tools && req.toolConfig.tools.length > 0) {
331
+ if (!Array.isArray(req.toolConfig.tools)) return "Invalid request: toolConfig.tools must be an array";
332
+ for (const [i, tool] of req.toolConfig.tools.entries()) if (tool?.toolSpec === null) return `Invalid request: toolConfig.tools[${i}].toolSpec must not be null`;
333
+ }
334
+ }
314
335
  function converseToCompletionRequest(req, modelId, logger) {
315
336
  const messages = [];
316
337
  if (req.system && req.system.length > 0) {
@@ -404,17 +425,11 @@ function buildConverseToolCallResponse(toolCalls, logger, reasoning, overrides)
404
425
  const contentBlocks = [];
405
426
  if (reasoning) contentBlocks.push({ reasoningContent: { reasoningText: { text: reasoning } } });
406
427
  for (const tc of toolCalls) {
407
- let argsObj;
408
- try {
409
- argsObj = JSON.parse(tc.arguments || "{}");
410
- } catch {
411
- logger.warn(`Malformed JSON in fixture tool call arguments for "${tc.name}": ${tc.arguments}`);
412
- argsObj = {};
413
- }
428
+ const args = require_helpers.servedToolArgs(tc, "object", logger);
414
429
  contentBlocks.push({ toolUse: {
415
430
  toolUseId: tc.id || require_helpers.generateToolUseId(),
416
431
  name: tc.name,
417
- input: argsObj
432
+ input: args.value
418
433
  } });
419
434
  }
420
435
  return {
@@ -431,17 +446,11 @@ function buildConverseContentWithToolCallsResponse(content, toolCalls, logger, r
431
446
  const contentBlocks = [];
432
447
  if (reasoning) contentBlocks.push({ reasoningContent: { reasoningText: { text: reasoning } } });
433
448
  const toolUseBlock = (tc) => {
434
- let argsObj;
435
- try {
436
- argsObj = JSON.parse(tc.arguments || "{}");
437
- } catch {
438
- logger.warn(`Malformed JSON in fixture tool call arguments for "${tc.name}": ${tc.arguments}`);
439
- argsObj = {};
440
- }
449
+ const args = require_helpers.servedToolArgs(tc, "object", logger);
441
450
  return { toolUse: {
442
451
  toolUseId: tc.id || require_helpers.generateToolUseId(),
443
452
  name: tc.name,
444
- input: argsObj
453
+ input: args.value
445
454
  } };
446
455
  };
447
456
  let blockHasTools;
@@ -469,6 +478,160 @@ function buildConverseContentWithToolCallsResponse(content, toolCalls, logger, r
469
478
  metrics: { latencyMs: 0 }
470
479
  };
471
480
  }
481
+ /** Prepare actual emitted calls and identities before journaling or writing bytes. */
482
+ function prepareConverseMisbehavior(plan, request, stream, defaults, headers) {
483
+ const response = plan.response;
484
+ const combined = require_helpers.isCombinedFixtureResponse(response);
485
+ let blocks = (combined && response.blocks?.length ? require_helpers.resolveFixtureBlockOutcome(response.blocks) : void 0)?.ordered.map((block) => ({ ...block })) ?? [..."content" in response && response.content ? [{
486
+ type: "text",
487
+ text: response.content
488
+ }] : [], ...(combined || require_helpers.isToolCallResponse(response) ? response.toolCalls ?? [] : []).map((call) => ({
489
+ type: "toolCall",
490
+ ...call
491
+ }))];
492
+ const calls = blocks.filter((block) => block.type === "toolCall");
493
+ const preparedCalls = calls.map((call, index) => {
494
+ const args = require_helpers.toolArgsForWire(call);
495
+ return {
496
+ ...call,
497
+ arguments: args.kind === "parsed" ? args.text : args.raw,
498
+ ...index === plan.duplicateId?.destinationIndex ? {} : { id: call.id || require_helpers.generateToolUseId() }
499
+ };
500
+ });
501
+ if (plan.duplicateId) preparedCalls[plan.duplicateId.destinationIndex].id = preparedCalls[plan.duplicateId.sourceIndex].id;
502
+ let callIndex = 0;
503
+ blocks = blocks.map((block) => block.type === "toolCall" ? preparedCalls[callIndex++] : block);
504
+ let stopReason = converseStopReason("finishReason" in response ? response.finishReason : void 0, calls.length ? "tool_use" : "end_turn");
505
+ if (plan.stop === "stop") stopReason = "end_turn";
506
+ if (plan.stop === "length") stopReason = "max_tokens";
507
+ if (plan.stop === "content_filter") stopReason = "content_filtered";
508
+ if (!stream && plan.summary.fault === "tool-args-invalid-json") {
509
+ blocks = blocks.filter((block) => block.type !== "toolCall");
510
+ stopReason = "malformed_tool_use";
511
+ }
512
+ if (!stream && plan.summary.fault === "stop-length-mid-tool") {
513
+ let index = 0;
514
+ blocks = blocks.map((block) => {
515
+ if (block.type !== "toolCall") return block;
516
+ return index++ === plan.target?.index ? {
517
+ ...block,
518
+ arguments: "{}"
519
+ } : block;
520
+ });
521
+ }
522
+ const reasoning = plan.reasoning ?? require_helpers.resolveReasoningForModel("reasoning" in response ? response.reasoning : void 0, request.model, require_helpers.resolveStrictMode(defaults.strict, headers), defaults.logger) ?? "";
523
+ const servedToolCalls = blocks.flatMap((block) => block.type === "toolCall" ? [{
524
+ name: block.name,
525
+ arguments: block.arguments,
526
+ id: block.id
527
+ }] : []);
528
+ const inputTokens = require_helpers.estimatePromptTokens(request.messages);
529
+ const outputTokens = require_helpers.estimateTokens(reasoning + blocks.map((block) => block.type === "text" ? block.text : block.name + block.arguments).join(""));
530
+ return {
531
+ plan: {
532
+ ...plan,
533
+ summary: {
534
+ ...plan.summary,
535
+ servedToolCalls
536
+ }
537
+ },
538
+ blocks,
539
+ reasoning,
540
+ stopReason,
541
+ usage: {
542
+ inputTokens,
543
+ outputTokens,
544
+ totalTokens: inputTokens + outputTokens
545
+ }
546
+ };
547
+ }
548
+ function buildConverseMisbehaviorResponse(prepared) {
549
+ const content = prepared.reasoning || prepared.plan.summary.fault === "reasoning-only" ? [{ reasoningContent: { reasoningText: { text: prepared.reasoning } } }] : [];
550
+ for (const block of prepared.blocks) if (block.type === "text") content.push({ text: block.text });
551
+ else {
552
+ const args = require_helpers.toolArgsForWire(block);
553
+ if (args.kind === "verbatim") throw new require_helpers.InvalidToolArgumentsError(block);
554
+ content.push({ toolUse: {
555
+ toolUseId: block.id,
556
+ name: block.name,
557
+ input: args.value
558
+ } });
559
+ }
560
+ return {
561
+ output: { message: {
562
+ role: "assistant",
563
+ content
564
+ } },
565
+ stopReason: prepared.stopReason,
566
+ usage: prepared.usage,
567
+ metrics: { latencyMs: 0 }
568
+ };
569
+ }
570
+ function buildConverseMisbehaviorEvents(prepared, chunkSize) {
571
+ const events = [{
572
+ eventType: "messageStart",
573
+ payload: { role: "assistant" }
574
+ }];
575
+ let index = 0;
576
+ if (prepared.reasoning || prepared.plan.summary.fault === "reasoning-only") {
577
+ events.push({
578
+ eventType: "contentBlockStart",
579
+ payload: {
580
+ contentBlockIndex: index,
581
+ start: { reasoningContent: {} }
582
+ }
583
+ });
584
+ for (let i = 0; i < prepared.reasoning.length; i += chunkSize) events.push({
585
+ eventType: "contentBlockDelta",
586
+ payload: {
587
+ contentBlockIndex: index,
588
+ delta: { reasoningContent: { text: prepared.reasoning.slice(i, i + chunkSize) } }
589
+ }
590
+ });
591
+ events.push({
592
+ eventType: "contentBlockStop",
593
+ payload: { contentBlockIndex: index++ }
594
+ });
595
+ }
596
+ for (const block of prepared.blocks) {
597
+ events.push({
598
+ eventType: "contentBlockStart",
599
+ payload: {
600
+ contentBlockIndex: index,
601
+ start: block.type === "toolCall" ? { toolUse: {
602
+ toolUseId: block.id,
603
+ name: block.name
604
+ } } : {}
605
+ }
606
+ });
607
+ const value = block.type === "text" ? block.text : block.arguments;
608
+ for (let i = 0; i < value.length; i += chunkSize) {
609
+ const part = value.slice(i, i + chunkSize);
610
+ events.push({
611
+ eventType: "contentBlockDelta",
612
+ payload: {
613
+ contentBlockIndex: index,
614
+ delta: block.type === "text" ? { text: part } : { toolUse: { input: part } }
615
+ }
616
+ });
617
+ }
618
+ events.push({
619
+ eventType: "contentBlockStop",
620
+ payload: { contentBlockIndex: index++ }
621
+ });
622
+ }
623
+ events.push({
624
+ eventType: "messageStop",
625
+ payload: { stopReason: prepared.stopReason }
626
+ }, {
627
+ eventType: "metadata",
628
+ payload: {
629
+ usage: prepared.usage,
630
+ metrics: { latencyMs: 0 }
631
+ }
632
+ });
633
+ return events;
634
+ }
472
635
  async function handleConverse(req, res, raw, modelId, fixtures, journal, defaults, setCorsHeaders) {
473
636
  const { logger } = defaults;
474
637
  setCorsHeaders(res);
@@ -511,7 +674,8 @@ async function handleConverse(req, res, raw, modelId, fixtures, journal, default
511
674
  } }));
512
675
  return;
513
676
  }
514
- if (!converseReq.messages || !Array.isArray(converseReq.messages)) {
677
+ const messageError = !Array.isArray(converseReq.messages) ? "Invalid request: messages array is required" : validateConverseMessages(converseReq) ?? validateConverseSystem(converseReq) ?? validateConverseTools(converseReq);
678
+ if (messageError) {
515
679
  journal.add({
516
680
  method: req.method ?? "POST",
517
681
  path: urlPath,
@@ -523,7 +687,7 @@ async function handleConverse(req, res, raw, modelId, fixtures, journal, default
523
687
  }
524
688
  });
525
689
  require_sse_writer.writeErrorResponse(res, 400, JSON.stringify({ error: {
526
- message: "Invalid request: messages array is required",
690
+ message: messageError,
527
691
  type: "invalid_request_error"
528
692
  } }));
529
693
  return;
@@ -600,9 +764,70 @@ async function handleConverse(req, res, raw, modelId, fixtures, journal, default
600
764
  return;
601
765
  }
602
766
  const response = await require_helpers.resolveResponse(fixture, completionReq);
767
+ let misbehavior = require_misbehavior.planMisbehavior({
768
+ wire: "bedrock-converse",
769
+ emitsToolCallIds: true,
770
+ fixture,
771
+ response,
772
+ request: completionReq,
773
+ stream: false,
774
+ defaults,
775
+ rawHeaders: req.headers,
776
+ url: req.url
777
+ });
778
+ const addResponseEntry = (input) => {
779
+ const entry = journal.add(input);
780
+ require_misbehavior.recordMisbehaviorOutcome({
781
+ entry,
782
+ summary: misbehavior.summary,
783
+ defaults,
784
+ testId
785
+ });
786
+ return entry;
787
+ };
788
+ if (misbehavior.kind === "error") {
789
+ if (!misbehavior.summary?.evaluations.length) logger.error(misbehavior.message);
790
+ addResponseEntry({
791
+ method: req.method ?? "POST",
792
+ path: urlPath,
793
+ headers: require_helpers.flattenHeaders(req.headers),
794
+ body: completionReq,
795
+ response: {
796
+ status: misbehavior.status,
797
+ fixture,
798
+ error: misbehavior.message
799
+ }
800
+ });
801
+ const type = misbehavior.status === 400 ? "ValidationException" : "InternalServerException";
802
+ res.setHeader("x-amzn-errortype", type);
803
+ require_sse_writer.writeErrorResponse(res, misbehavior.status, JSON.stringify({
804
+ __type: type,
805
+ message: misbehavior.message,
806
+ code: misbehavior.code
807
+ }));
808
+ return;
809
+ }
810
+ if (misbehavior.kind === "applied") {
811
+ const prepared = prepareConverseMisbehavior(misbehavior, completionReq, false, defaults, req.headers);
812
+ misbehavior = prepared.plan;
813
+ const body = buildConverseMisbehaviorResponse(prepared);
814
+ addResponseEntry({
815
+ method: req.method ?? "POST",
816
+ path: urlPath,
817
+ headers: require_helpers.flattenHeaders(req.headers),
818
+ body: completionReq,
819
+ response: {
820
+ status: 200,
821
+ fixture
822
+ }
823
+ });
824
+ res.writeHead(200, { "Content-Type": "application/json" });
825
+ res.end(JSON.stringify(body));
826
+ return;
827
+ }
603
828
  if (require_helpers.isErrorResponse(response)) {
604
829
  const status = response.status ?? 500;
605
- journal.add({
830
+ addResponseEntry({
606
831
  method: req.method ?? "POST",
607
832
  path: urlPath,
608
833
  headers: require_helpers.flattenHeaders(req.headers),
@@ -622,11 +847,11 @@ async function handleConverse(req, res, raw, modelId, fixtures, journal, default
622
847
  require_sse_writer.writeErrorResponse(res, status, JSON.stringify(errBody), { retryAfter: response.retryAfter });
623
848
  return;
624
849
  }
625
- if (require_helpers.isContentWithToolCallsResponse(response)) {
850
+ if (require_helpers.isCombinedFixtureResponse(response)) {
626
851
  if (response.webSearches?.length) logger.warn("webSearches in fixture response are not supported for Bedrock Converse API — ignoring");
627
852
  const overrides = require_helpers.extractOverrides(response);
628
853
  const effReasoning = require_helpers.resolveReasoningForModel(response.reasoning, completionReq.model, require_helpers.resolveStrictMode(defaults.strict, req.headers), logger);
629
- journal.add({
854
+ addResponseEntry({
630
855
  method: req.method ?? "POST",
631
856
  path: urlPath,
632
857
  headers: require_helpers.flattenHeaders(req.headers),
@@ -636,7 +861,8 @@ async function handleConverse(req, res, raw, modelId, fixtures, journal, default
636
861
  fixture
637
862
  }
638
863
  });
639
- const body = buildConverseContentWithToolCallsResponse(response.content ?? "", response.toolCalls ?? [], logger, effReasoning, overrides, response.blocks);
864
+ const functionToolCalls = require_helpers.requireEmittedFunctionToolCalls(response, "Bedrock Converse");
865
+ const body = buildConverseContentWithToolCallsResponse(response.content ?? "", functionToolCalls, logger, effReasoning, overrides, response.blocks);
640
866
  res.writeHead(200, { "Content-Type": "application/json" });
641
867
  res.end(JSON.stringify(body));
642
868
  return;
@@ -645,7 +871,7 @@ async function handleConverse(req, res, raw, modelId, fixtures, journal, default
645
871
  if (response.webSearches?.length) logger.warn("webSearches in fixture response are not supported for Bedrock Converse API — ignoring");
646
872
  const overrides = require_helpers.extractOverrides(response);
647
873
  const effReasoning = require_helpers.resolveReasoningForModel(response.reasoning, completionReq.model, require_helpers.resolveStrictMode(defaults.strict, req.headers), logger);
648
- journal.add({
874
+ addResponseEntry({
649
875
  method: req.method ?? "POST",
650
876
  path: urlPath,
651
877
  headers: require_helpers.flattenHeaders(req.headers),
@@ -664,7 +890,7 @@ async function handleConverse(req, res, raw, modelId, fixtures, journal, default
664
890
  if (response.webSearches?.length) logger.warn("webSearches in fixture response are not supported for Bedrock Converse API — ignoring");
665
891
  const overrides = require_helpers.extractOverrides(response);
666
892
  const effReasoning = require_helpers.resolveReasoningForModel(response.reasoning, completionReq.model, require_helpers.resolveStrictMode(defaults.strict, req.headers), logger);
667
- journal.add({
893
+ addResponseEntry({
668
894
  method: req.method ?? "POST",
669
895
  path: urlPath,
670
896
  headers: require_helpers.flattenHeaders(req.headers),
@@ -674,12 +900,12 @@ async function handleConverse(req, res, raw, modelId, fixtures, journal, default
674
900
  fixture
675
901
  }
676
902
  });
677
- const body = buildConverseToolCallResponse(response.toolCalls, logger, effReasoning, overrides);
903
+ const body = buildConverseToolCallResponse(require_helpers.requireEmittedFunctionToolCalls(response, "Bedrock Converse"), logger, effReasoning, overrides);
678
904
  res.writeHead(200, { "Content-Type": "application/json" });
679
905
  res.end(JSON.stringify(body));
680
906
  return;
681
907
  }
682
- journal.add({
908
+ addResponseEntry({
683
909
  method: req.method ?? "POST",
684
910
  path: urlPath,
685
911
  headers: require_helpers.flattenHeaders(req.headers),
@@ -736,7 +962,8 @@ async function handleConverseStream(req, res, raw, modelId, fixtures, journal, d
736
962
  } }));
737
963
  return;
738
964
  }
739
- if (!converseReq.messages || !Array.isArray(converseReq.messages)) {
965
+ const messageError = !Array.isArray(converseReq.messages) ? "Invalid request: messages array is required" : validateConverseMessages(converseReq) ?? validateConverseSystem(converseReq) ?? validateConverseTools(converseReq);
966
+ if (messageError) {
740
967
  journal.add({
741
968
  method: req.method ?? "POST",
742
969
  path: urlPath,
@@ -748,7 +975,7 @@ async function handleConverseStream(req, res, raw, modelId, fixtures, journal, d
748
975
  }
749
976
  });
750
977
  require_sse_writer.writeErrorResponse(res, 400, JSON.stringify({ error: {
751
- message: "Invalid request: messages array is required",
978
+ message: messageError,
752
979
  type: "invalid_request_error"
753
980
  } }));
754
981
  return;
@@ -826,11 +1053,84 @@ async function handleConverseStream(req, res, raw, modelId, fixtures, journal, d
826
1053
  return;
827
1054
  }
828
1055
  const response = await require_helpers.resolveResponse(fixture, completionReq);
1056
+ let misbehavior = require_misbehavior.planMisbehavior({
1057
+ wire: "bedrock-converse",
1058
+ emitsToolCallIds: true,
1059
+ fixture,
1060
+ response,
1061
+ request: completionReq,
1062
+ stream: true,
1063
+ defaults,
1064
+ rawHeaders: req.headers,
1065
+ url: req.url
1066
+ });
1067
+ const addResponseEntry = (input) => {
1068
+ const entry = journal.add(input);
1069
+ require_misbehavior.recordMisbehaviorOutcome({
1070
+ entry,
1071
+ summary: misbehavior.summary,
1072
+ defaults,
1073
+ testId
1074
+ });
1075
+ return entry;
1076
+ };
1077
+ if (misbehavior.kind === "error") {
1078
+ if (!misbehavior.summary?.evaluations.length) logger.error(misbehavior.message);
1079
+ addResponseEntry({
1080
+ method: req.method ?? "POST",
1081
+ path: urlPath,
1082
+ headers: require_helpers.flattenHeaders(req.headers),
1083
+ body: completionReq,
1084
+ response: {
1085
+ status: misbehavior.status,
1086
+ fixture,
1087
+ error: misbehavior.message
1088
+ }
1089
+ });
1090
+ const type = misbehavior.status === 400 ? "ValidationException" : "InternalServerException";
1091
+ res.setHeader("x-amzn-errortype", type);
1092
+ require_sse_writer.writeErrorResponse(res, misbehavior.status, JSON.stringify({
1093
+ __type: type,
1094
+ message: misbehavior.message,
1095
+ code: misbehavior.code
1096
+ }));
1097
+ return;
1098
+ }
829
1099
  const latency = fixture.latency ?? defaults.latency;
830
1100
  const chunkSize = Math.max(1, fixture.chunkSize ?? defaults.chunkSize);
1101
+ if (misbehavior.kind === "applied") {
1102
+ const prepared = prepareConverseMisbehavior(misbehavior, completionReq, true, defaults, req.headers);
1103
+ misbehavior = prepared.plan;
1104
+ const events = buildConverseMisbehaviorEvents(prepared, chunkSize);
1105
+ const entry = addResponseEntry({
1106
+ method: req.method ?? "POST",
1107
+ path: urlPath,
1108
+ headers: require_helpers.flattenHeaders(req.headers),
1109
+ body: completionReq,
1110
+ response: {
1111
+ status: 200,
1112
+ fixture
1113
+ }
1114
+ });
1115
+ const interruption = require_interruption.createInterruptionSignal(fixture);
1116
+ if (!await require_aws_event_stream.writeEventStream(res, events, {
1117
+ latency,
1118
+ streamingProfile: fixture.streamingProfile,
1119
+ recordedTimings: fixture.recordedTimings,
1120
+ replaySpeed: fixture.replaySpeed ?? defaults.replaySpeed,
1121
+ signal: interruption?.signal,
1122
+ onChunkSent: interruption?.tick
1123
+ })) {
1124
+ if (!res.writableEnded) res.destroy();
1125
+ entry.response.interrupted = true;
1126
+ entry.response.interruptReason = interruption?.reason();
1127
+ }
1128
+ interruption?.cleanup();
1129
+ return;
1130
+ }
831
1131
  if (require_helpers.isErrorResponse(response)) {
832
1132
  const status = response.status ?? 500;
833
- journal.add({
1133
+ addResponseEntry({
834
1134
  method: req.method ?? "POST",
835
1135
  path: urlPath,
836
1136
  headers: require_helpers.flattenHeaders(req.headers),
@@ -850,11 +1150,11 @@ async function handleConverseStream(req, res, raw, modelId, fixtures, journal, d
850
1150
  require_sse_writer.writeErrorResponse(res, status, JSON.stringify(errBody), { retryAfter: response.retryAfter });
851
1151
  return;
852
1152
  }
853
- if (require_helpers.isContentWithToolCallsResponse(response)) {
1153
+ if (require_helpers.isCombinedFixtureResponse(response)) {
854
1154
  if (response.webSearches?.length) logger.warn("webSearches in fixture response are not supported for Bedrock Converse API — ignoring");
855
1155
  const overrides = require_helpers.extractOverrides(response);
856
1156
  const effReasoning = require_helpers.resolveReasoningForModel(response.reasoning, completionReq.model, require_helpers.resolveStrictMode(defaults.strict, req.headers), logger);
857
- const journalEntry = journal.add({
1157
+ const journalEntry = addResponseEntry({
858
1158
  method: req.method ?? "POST",
859
1159
  path: urlPath,
860
1160
  headers: require_helpers.flattenHeaders(req.headers),
@@ -864,7 +1164,8 @@ async function handleConverseStream(req, res, raw, modelId, fixtures, journal, d
864
1164
  fixture
865
1165
  }
866
1166
  });
867
- const events = buildBedrockStreamContentWithToolCallsEvents(response.content ?? "", response.toolCalls ?? [], chunkSize, logger, effReasoning, overrides, response.blocks);
1167
+ const functionToolCalls = require_helpers.requireEmittedFunctionToolCalls(response, "Bedrock Converse");
1168
+ const events = buildBedrockStreamContentWithToolCallsEvents(response.content ?? "", functionToolCalls, chunkSize, logger, effReasoning, overrides, response.blocks);
868
1169
  const interruption = require_interruption.createInterruptionSignal(fixture);
869
1170
  if (!await require_aws_event_stream.writeEventStream(res, events, {
870
1171
  latency,
@@ -885,7 +1186,7 @@ async function handleConverseStream(req, res, raw, modelId, fixtures, journal, d
885
1186
  if (response.webSearches?.length) logger.warn("webSearches in fixture response are not supported for Bedrock Converse API — ignoring");
886
1187
  const overrides = require_helpers.extractOverrides(response);
887
1188
  const effReasoning = require_helpers.resolveReasoningForModel(response.reasoning, completionReq.model, require_helpers.resolveStrictMode(defaults.strict, req.headers), logger);
888
- const journalEntry = journal.add({
1189
+ const journalEntry = addResponseEntry({
889
1190
  method: req.method ?? "POST",
890
1191
  path: urlPath,
891
1192
  headers: require_helpers.flattenHeaders(req.headers),
@@ -916,7 +1217,7 @@ async function handleConverseStream(req, res, raw, modelId, fixtures, journal, d
916
1217
  if (response.webSearches?.length) logger.warn("webSearches in fixture response are not supported for Bedrock Converse API — ignoring");
917
1218
  const overrides = require_helpers.extractOverrides(response);
918
1219
  const effReasoning = require_helpers.resolveReasoningForModel(response.reasoning, completionReq.model, require_helpers.resolveStrictMode(defaults.strict, req.headers), logger);
919
- const journalEntry = journal.add({
1220
+ const journalEntry = addResponseEntry({
920
1221
  method: req.method ?? "POST",
921
1222
  path: urlPath,
922
1223
  headers: require_helpers.flattenHeaders(req.headers),
@@ -926,7 +1227,7 @@ async function handleConverseStream(req, res, raw, modelId, fixtures, journal, d
926
1227
  fixture
927
1228
  }
928
1229
  });
929
- const events = buildBedrockStreamToolCallEvents(response.toolCalls, chunkSize, logger, effReasoning, overrides);
1230
+ const events = buildBedrockStreamToolCallEvents(require_helpers.requireEmittedFunctionToolCalls(response, "Bedrock Converse"), chunkSize, logger, effReasoning, overrides);
930
1231
  const interruption = require_interruption.createInterruptionSignal(fixture);
931
1232
  if (!await require_aws_event_stream.writeEventStream(res, events, {
932
1233
  latency,
@@ -943,7 +1244,7 @@ async function handleConverseStream(req, res, raw, modelId, fixtures, journal, d
943
1244
  interruption?.cleanup();
944
1245
  return;
945
1246
  }
946
- journal.add({
1247
+ addResponseEntry({
947
1248
  method: req.method ?? "POST",
948
1249
  path: urlPath,
949
1250
  headers: require_helpers.flattenHeaders(req.headers),