@copilotkit/aimock 1.45.1 → 1.47.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (492) hide show
  1. package/.claude-plugin/marketplace.json +1 -1
  2. package/.claude-plugin/plugin.json +1 -1
  3. package/CHANGELOG.md +25 -1
  4. package/README.md +11 -2
  5. package/dist/agui-mock.cjs +25 -25
  6. package/dist/agui-mock.cjs.map +1 -1
  7. package/dist/agui-mock.d.cts.map +1 -1
  8. package/dist/agui-mock.d.ts.map +1 -1
  9. package/dist/agui-mock.js +25 -25
  10. package/dist/agui-mock.js.map +1 -1
  11. package/dist/agui-types.d.cts.map +1 -1
  12. package/dist/aimock-cli.cjs +15 -1
  13. package/dist/aimock-cli.cjs.map +1 -1
  14. package/dist/aimock-cli.d.cts.map +1 -1
  15. package/dist/aimock-cli.d.ts.map +1 -1
  16. package/dist/aimock-cli.js +16 -2
  17. package/dist/aimock-cli.js.map +1 -1
  18. package/dist/api-key-auth.cjs +10 -9
  19. package/dist/api-key-auth.cjs.map +1 -1
  20. package/dist/api-key-auth.d.cts.map +1 -1
  21. package/dist/api-key-auth.d.ts.map +1 -1
  22. package/dist/api-key-auth.js +11 -10
  23. package/dist/api-key-auth.js.map +1 -1
  24. package/dist/aws-event-stream.cjs +20 -23
  25. package/dist/aws-event-stream.cjs.map +1 -1
  26. package/dist/aws-event-stream.d.cts +0 -1
  27. package/dist/aws-event-stream.d.ts +0 -1
  28. package/dist/aws-event-stream.js +20 -24
  29. package/dist/aws-event-stream.js.map +1 -1
  30. package/dist/batches.cjs +2 -4
  31. package/dist/batches.cjs.map +1 -1
  32. package/dist/batches.d.cts.map +1 -1
  33. package/dist/batches.d.ts.map +1 -1
  34. package/dist/batches.js +2 -4
  35. package/dist/batches.js.map +1 -1
  36. package/dist/bedrock-converse.cjs +139 -161
  37. package/dist/bedrock-converse.cjs.map +1 -1
  38. package/dist/bedrock-converse.d.cts.map +1 -1
  39. package/dist/bedrock-converse.d.ts.map +1 -1
  40. package/dist/bedrock-converse.js +137 -159
  41. package/dist/bedrock-converse.js.map +1 -1
  42. package/dist/bedrock.cjs +175 -216
  43. package/dist/bedrock.cjs.map +1 -1
  44. package/dist/bedrock.d.cts.map +1 -1
  45. package/dist/bedrock.d.ts.map +1 -1
  46. package/dist/bedrock.js +172 -213
  47. package/dist/bedrock.js.map +1 -1
  48. package/dist/byteplus-video.cjs +11 -10
  49. package/dist/byteplus-video.cjs.map +1 -1
  50. package/dist/byteplus-video.d.cts.map +1 -1
  51. package/dist/byteplus-video.d.ts.map +1 -1
  52. package/dist/byteplus-video.js +5 -4
  53. package/dist/byteplus-video.js.map +1 -1
  54. package/dist/chaos.cjs +5 -4
  55. package/dist/chaos.cjs.map +1 -1
  56. package/dist/chaos.d.cts.map +1 -1
  57. package/dist/chaos.d.ts.map +1 -1
  58. package/dist/chaos.js +5 -4
  59. package/dist/chaos.js.map +1 -1
  60. package/dist/cli.cjs +15 -0
  61. package/dist/cli.cjs.map +1 -1
  62. package/dist/cli.js +15 -0
  63. package/dist/cli.js.map +1 -1
  64. package/dist/cohere.cjs +107 -180
  65. package/dist/cohere.cjs.map +1 -1
  66. package/dist/cohere.d.cts.map +1 -1
  67. package/dist/cohere.d.ts.map +1 -1
  68. package/dist/cohere.js +106 -179
  69. package/dist/cohere.js.map +1 -1
  70. package/dist/config-loader.cjs +29 -1
  71. package/dist/config-loader.cjs.map +1 -1
  72. package/dist/config-loader.d.cts +7 -1
  73. package/dist/config-loader.d.cts.map +1 -1
  74. package/dist/config-loader.d.ts +7 -1
  75. package/dist/config-loader.d.ts.map +1 -1
  76. package/dist/config-loader.js +29 -2
  77. package/dist/config-loader.js.map +1 -1
  78. package/dist/count-tokens.cjs +146 -0
  79. package/dist/count-tokens.cjs.map +1 -0
  80. package/dist/count-tokens.js +146 -0
  81. package/dist/count-tokens.js.map +1 -0
  82. package/dist/elevenlabs-audio.cjs +36 -34
  83. package/dist/elevenlabs-audio.cjs.map +1 -1
  84. package/dist/elevenlabs-audio.d.cts.map +1 -1
  85. package/dist/elevenlabs-audio.d.ts.map +1 -1
  86. package/dist/elevenlabs-audio.js +33 -31
  87. package/dist/elevenlabs-audio.js.map +1 -1
  88. package/dist/elevenlabs-voice.cjs +38 -37
  89. package/dist/elevenlabs-voice.cjs.map +1 -1
  90. package/dist/elevenlabs-voice.d.cts.map +1 -1
  91. package/dist/elevenlabs-voice.d.ts.map +1 -1
  92. package/dist/elevenlabs-voice.js +33 -32
  93. package/dist/elevenlabs-voice.js.map +1 -1
  94. package/dist/embedding-request.cjs +16 -0
  95. package/dist/embedding-request.cjs.map +1 -0
  96. package/dist/embedding-request.js +14 -0
  97. package/dist/embedding-request.js.map +1 -0
  98. package/dist/embeddings.cjs +30 -20
  99. package/dist/embeddings.cjs.map +1 -1
  100. package/dist/embeddings.d.cts.map +1 -1
  101. package/dist/embeddings.d.ts.map +1 -1
  102. package/dist/embeddings.js +30 -20
  103. package/dist/embeddings.js.map +1 -1
  104. package/dist/fal-audio.cjs +45 -43
  105. package/dist/fal-audio.cjs.map +1 -1
  106. package/dist/fal-audio.d.cts.map +1 -1
  107. package/dist/fal-audio.d.ts.map +1 -1
  108. package/dist/fal-audio.js +42 -40
  109. package/dist/fal-audio.js.map +1 -1
  110. package/dist/fal.cjs +17 -15
  111. package/dist/fal.cjs.map +1 -1
  112. package/dist/fal.js +16 -14
  113. package/dist/fal.js.map +1 -1
  114. package/dist/files.cjs +2 -4
  115. package/dist/files.cjs.map +1 -1
  116. package/dist/files.d.cts.map +1 -1
  117. package/dist/files.d.ts.map +1 -1
  118. package/dist/files.js +2 -4
  119. package/dist/files.js.map +1 -1
  120. package/dist/fine-tuning.cjs +2 -4
  121. package/dist/fine-tuning.cjs.map +1 -1
  122. package/dist/fine-tuning.d.cts.map +1 -1
  123. package/dist/fine-tuning.d.ts.map +1 -1
  124. package/dist/fine-tuning.js +2 -4
  125. package/dist/fine-tuning.js.map +1 -1
  126. package/dist/fixture-loader.cjs +140 -44
  127. package/dist/fixture-loader.cjs.map +1 -1
  128. package/dist/fixture-loader.d.cts.map +1 -1
  129. package/dist/fixture-loader.d.ts.map +1 -1
  130. package/dist/fixture-loader.js +141 -46
  131. package/dist/fixture-loader.js.map +1 -1
  132. package/dist/gemini-embeddings.cjs +26 -24
  133. package/dist/gemini-embeddings.cjs.map +1 -1
  134. package/dist/gemini-embeddings.js +26 -24
  135. package/dist/gemini-embeddings.js.map +1 -1
  136. package/dist/gemini-interactions.cjs +113 -156
  137. package/dist/gemini-interactions.cjs.map +1 -1
  138. package/dist/gemini-interactions.d.cts +0 -1
  139. package/dist/gemini-interactions.d.cts.map +1 -1
  140. package/dist/gemini-interactions.d.ts +0 -1
  141. package/dist/gemini-interactions.d.ts.map +1 -1
  142. package/dist/gemini-interactions.js +113 -156
  143. package/dist/gemini-interactions.js.map +1 -1
  144. package/dist/gemini.cjs +295 -218
  145. package/dist/gemini.cjs.map +1 -1
  146. package/dist/gemini.d.cts.map +1 -1
  147. package/dist/gemini.d.ts.map +1 -1
  148. package/dist/gemini.js +295 -219
  149. package/dist/gemini.js.map +1 -1
  150. package/dist/grok-video.cjs +14 -12
  151. package/dist/grok-video.cjs.map +1 -1
  152. package/dist/grok-video.d.cts.map +1 -1
  153. package/dist/grok-video.d.ts.map +1 -1
  154. package/dist/grok-video.js +8 -6
  155. package/dist/grok-video.js.map +1 -1
  156. package/dist/helpers.cjs +411 -75
  157. package/dist/helpers.cjs.map +1 -1
  158. package/dist/helpers.d.cts +51 -1
  159. package/dist/helpers.d.cts.map +1 -1
  160. package/dist/helpers.d.ts +51 -1
  161. package/dist/helpers.d.ts.map +1 -1
  162. package/dist/helpers.js +402 -74
  163. package/dist/helpers.js.map +1 -1
  164. package/dist/images.cjs +30 -28
  165. package/dist/images.cjs.map +1 -1
  166. package/dist/images.d.cts.map +1 -1
  167. package/dist/images.d.ts.map +1 -1
  168. package/dist/images.js +27 -25
  169. package/dist/images.js.map +1 -1
  170. package/dist/index.cjs +4 -2
  171. package/dist/index.d.cts +4 -4
  172. package/dist/index.d.ts +4 -4
  173. package/dist/index.js +4 -4
  174. package/dist/journal.cjs +3 -1
  175. package/dist/journal.cjs.map +1 -1
  176. package/dist/journal.d.cts.map +1 -1
  177. package/dist/journal.d.ts.map +1 -1
  178. package/dist/journal.js +2 -1
  179. package/dist/journal.js.map +1 -1
  180. package/dist/llmock.cjs +3 -0
  181. package/dist/llmock.cjs.map +1 -1
  182. package/dist/llmock.d.cts.map +1 -1
  183. package/dist/llmock.d.ts.map +1 -1
  184. package/dist/llmock.js +3 -0
  185. package/dist/llmock.js.map +1 -1
  186. package/dist/mcp-fakes.d.cts.map +1 -1
  187. package/dist/mcp-handler.cjs +7 -3
  188. package/dist/mcp-handler.cjs.map +1 -1
  189. package/dist/mcp-handler.js +7 -3
  190. package/dist/mcp-handler.js.map +1 -1
  191. package/dist/mcp-recorder.cjs +2 -1
  192. package/dist/mcp-recorder.cjs.map +1 -1
  193. package/dist/mcp-recorder.js +3 -2
  194. package/dist/mcp-recorder.js.map +1 -1
  195. package/dist/messages.cjs +235 -202
  196. package/dist/messages.cjs.map +1 -1
  197. package/dist/messages.d.cts.map +1 -1
  198. package/dist/messages.d.ts.map +1 -1
  199. package/dist/messages.js +234 -202
  200. package/dist/messages.js.map +1 -1
  201. package/dist/metrics.cjs +5 -2
  202. package/dist/metrics.cjs.map +1 -1
  203. package/dist/metrics.d.cts.map +1 -1
  204. package/dist/metrics.d.ts.map +1 -1
  205. package/dist/metrics.js +6 -3
  206. package/dist/metrics.js.map +1 -1
  207. package/dist/misbehavior.cjs +62 -3
  208. package/dist/misbehavior.cjs.map +1 -1
  209. package/dist/misbehavior.d.cts.map +1 -1
  210. package/dist/misbehavior.d.ts.map +1 -1
  211. package/dist/misbehavior.js +63 -4
  212. package/dist/misbehavior.js.map +1 -1
  213. package/dist/model-utils.cjs +1 -0
  214. package/dist/model-utils.cjs.map +1 -1
  215. package/dist/model-utils.js +1 -1
  216. package/dist/model-utils.js.map +1 -1
  217. package/dist/moderation.cjs +15 -12
  218. package/dist/moderation.cjs.map +1 -1
  219. package/dist/moderation.js +14 -11
  220. package/dist/moderation.js.map +1 -1
  221. package/dist/ndjson-writer.cjs +21 -23
  222. package/dist/ndjson-writer.cjs.map +1 -1
  223. package/dist/ndjson-writer.d.cts +0 -1
  224. package/dist/ndjson-writer.d.cts.map +1 -1
  225. package/dist/ndjson-writer.d.ts +0 -1
  226. package/dist/ndjson-writer.d.ts.map +1 -1
  227. package/dist/ndjson-writer.js +21 -24
  228. package/dist/ndjson-writer.js.map +1 -1
  229. package/dist/ollama.cjs +276 -210
  230. package/dist/ollama.cjs.map +1 -1
  231. package/dist/ollama.d.cts.map +1 -1
  232. package/dist/ollama.d.ts.map +1 -1
  233. package/dist/ollama.js +273 -207
  234. package/dist/ollama.js.map +1 -1
  235. package/dist/openapi.cjs +323 -3
  236. package/dist/openapi.cjs.map +1 -1
  237. package/dist/openapi.d.cts.map +1 -1
  238. package/dist/openapi.d.ts.map +1 -1
  239. package/dist/openapi.js +324 -4
  240. package/dist/openapi.js.map +1 -1
  241. package/dist/openrouter-chat.cjs +11 -155
  242. package/dist/openrouter-chat.cjs.map +1 -1
  243. package/dist/openrouter-chat.js +11 -155
  244. package/dist/openrouter-chat.js.map +1 -1
  245. package/dist/openrouter-video.cjs +51 -74
  246. package/dist/openrouter-video.cjs.map +1 -1
  247. package/dist/openrouter-video.d.cts.map +1 -1
  248. package/dist/openrouter-video.d.ts.map +1 -1
  249. package/dist/openrouter-video.js +37 -60
  250. package/dist/openrouter-video.js.map +1 -1
  251. package/dist/raw-validation.cjs +177 -0
  252. package/dist/raw-validation.cjs.map +1 -0
  253. package/dist/raw-validation.js +176 -0
  254. package/dist/raw-validation.js.map +1 -0
  255. package/dist/recorder.cjs +176 -95
  256. package/dist/recorder.cjs.map +1 -1
  257. package/dist/recorder.d.cts.map +1 -1
  258. package/dist/recorder.d.ts.map +1 -1
  259. package/dist/recorder.js +176 -95
  260. package/dist/recorder.js.map +1 -1
  261. package/dist/rerank.cjs +13 -11
  262. package/dist/rerank.cjs.map +1 -1
  263. package/dist/rerank.js +12 -10
  264. package/dist/rerank.js.map +1 -1
  265. package/dist/response/catalog/anthropic-page.cjs +39 -0
  266. package/dist/response/catalog/anthropic-page.cjs.map +1 -0
  267. package/dist/response/catalog/anthropic-page.js +38 -0
  268. package/dist/response/catalog/anthropic-page.js.map +1 -0
  269. package/dist/response/catalog/collect.cjs +61 -0
  270. package/dist/response/catalog/collect.cjs.map +1 -0
  271. package/dist/response/catalog/collect.js +59 -0
  272. package/dist/response/catalog/collect.js.map +1 -0
  273. package/dist/response/catalog/gemini-page.cjs +25 -0
  274. package/dist/response/catalog/gemini-page.cjs.map +1 -0
  275. package/dist/response/catalog/gemini-page.js +24 -0
  276. package/dist/response/catalog/gemini-page.js.map +1 -0
  277. package/dist/response/catalog/render.cjs +182 -0
  278. package/dist/response/catalog/render.cjs.map +1 -0
  279. package/dist/response/catalog/render.js +171 -0
  280. package/dist/response/catalog/render.js.map +1 -0
  281. package/dist/response/deliver.cjs +144 -0
  282. package/dist/response/deliver.cjs.map +1 -0
  283. package/dist/response/deliver.js +143 -0
  284. package/dist/response/deliver.js.map +1 -0
  285. package/dist/response/errors.cjs +225 -0
  286. package/dist/response/errors.cjs.map +1 -0
  287. package/dist/response/errors.js +224 -0
  288. package/dist/response/errors.js.map +1 -0
  289. package/dist/response/finish.cjs +39 -0
  290. package/dist/response/finish.cjs.map +1 -0
  291. package/dist/response/finish.js +35 -0
  292. package/dist/response/finish.js.map +1 -0
  293. package/dist/response/frame-loop.cjs +102 -0
  294. package/dist/response/frame-loop.cjs.map +1 -0
  295. package/dist/response/frame-loop.js +100 -0
  296. package/dist/response/frame-loop.js.map +1 -0
  297. package/dist/response/lifecycle.cjs +223 -0
  298. package/dist/response/lifecycle.cjs.map +1 -0
  299. package/dist/response/lifecycle.js +211 -0
  300. package/dist/response/lifecycle.js.map +1 -0
  301. package/dist/response/policy.cjs +126 -0
  302. package/dist/response/policy.cjs.map +1 -0
  303. package/dist/response/policy.js +120 -0
  304. package/dist/response/policy.js.map +1 -0
  305. package/dist/response/profiles.cjs +69 -0
  306. package/dist/response/profiles.cjs.map +1 -0
  307. package/dist/response/profiles.js +65 -0
  308. package/dist/response/profiles.js.map +1 -0
  309. package/dist/response/proxy.cjs +71 -0
  310. package/dist/response/proxy.cjs.map +1 -0
  311. package/dist/response/proxy.js +70 -0
  312. package/dist/response/proxy.js.map +1 -0
  313. package/dist/response/raw.cjs +228 -0
  314. package/dist/response/raw.cjs.map +1 -0
  315. package/dist/response/raw.js +227 -0
  316. package/dist/response/raw.js.map +1 -0
  317. package/dist/response/timing.cjs +157 -0
  318. package/dist/response/timing.cjs.map +1 -0
  319. package/dist/response/timing.js +150 -0
  320. package/dist/response/timing.js.map +1 -0
  321. package/dist/response/usage/codecs/anthropic.cjs +52 -0
  322. package/dist/response/usage/codecs/anthropic.cjs.map +1 -0
  323. package/dist/response/usage/codecs/anthropic.js +50 -0
  324. package/dist/response/usage/codecs/anthropic.js.map +1 -0
  325. package/dist/response/usage/codecs/cohere.cjs +36 -0
  326. package/dist/response/usage/codecs/cohere.cjs.map +1 -0
  327. package/dist/response/usage/codecs/cohere.js +35 -0
  328. package/dist/response/usage/codecs/cohere.js.map +1 -0
  329. package/dist/response/usage/codecs/converse.cjs +16 -0
  330. package/dist/response/usage/codecs/converse.cjs.map +1 -0
  331. package/dist/response/usage/codecs/converse.js +15 -0
  332. package/dist/response/usage/codecs/converse.js.map +1 -0
  333. package/dist/response/usage/codecs/gemini.cjs +31 -0
  334. package/dist/response/usage/codecs/gemini.cjs.map +1 -0
  335. package/dist/response/usage/codecs/gemini.js +31 -0
  336. package/dist/response/usage/codecs/gemini.js.map +1 -0
  337. package/dist/response/usage/codecs/interactions.cjs +22 -0
  338. package/dist/response/usage/codecs/interactions.cjs.map +1 -0
  339. package/dist/response/usage/codecs/interactions.js +21 -0
  340. package/dist/response/usage/codecs/interactions.js.map +1 -0
  341. package/dist/response/usage/codecs/ollama.cjs +17 -0
  342. package/dist/response/usage/codecs/ollama.cjs.map +1 -0
  343. package/dist/response/usage/codecs/ollama.js +17 -0
  344. package/dist/response/usage/codecs/ollama.js.map +1 -0
  345. package/dist/response/usage/codecs/openai.cjs +52 -0
  346. package/dist/response/usage/codecs/openai.cjs.map +1 -0
  347. package/dist/response/usage/codecs/openai.js +50 -0
  348. package/dist/response/usage/codecs/openai.js.map +1 -0
  349. package/dist/response/usage/codecs/openrouter.cjs +68 -0
  350. package/dist/response/usage/codecs/openrouter.cjs.map +1 -0
  351. package/dist/response/usage/codecs/openrouter.js +67 -0
  352. package/dist/response/usage/codecs/openrouter.js.map +1 -0
  353. package/dist/response/usage/codecs/realtime.cjs +19 -0
  354. package/dist/response/usage/codecs/realtime.cjs.map +1 -0
  355. package/dist/response/usage/codecs/realtime.js +18 -0
  356. package/dist/response/usage/codecs/realtime.js.map +1 -0
  357. package/dist/response/usage/codecs/responses.cjs +21 -0
  358. package/dist/response/usage/codecs/responses.cjs.map +1 -0
  359. package/dist/response/usage/codecs/responses.js +20 -0
  360. package/dist/response/usage/codecs/responses.js.map +1 -0
  361. package/dist/response/usage/estimate.cjs +23 -0
  362. package/dist/response/usage/estimate.cjs.map +1 -0
  363. package/dist/response/usage/estimate.js +21 -0
  364. package/dist/response/usage/estimate.js.map +1 -0
  365. package/dist/response/usage/fields.cjs +72 -0
  366. package/dist/response/usage/fields.cjs.map +1 -0
  367. package/dist/response/usage/fields.js +70 -0
  368. package/dist/response/usage/fields.js.map +1 -0
  369. package/dist/response/usage/recording.cjs +52 -0
  370. package/dist/response/usage/recording.cjs.map +1 -0
  371. package/dist/response/usage/recording.js +52 -0
  372. package/dist/response/usage/recording.js.map +1 -0
  373. package/dist/responses.cjs +304 -196
  374. package/dist/responses.cjs.map +1 -1
  375. package/dist/responses.d.cts.map +1 -1
  376. package/dist/responses.d.ts.map +1 -1
  377. package/dist/responses.js +303 -195
  378. package/dist/responses.js.map +1 -1
  379. package/dist/route-registry.cjs +45 -0
  380. package/dist/route-registry.cjs.map +1 -1
  381. package/dist/route-registry.d.cts.map +1 -1
  382. package/dist/route-registry.d.ts.map +1 -1
  383. package/dist/route-registry.js +41 -1
  384. package/dist/route-registry.js.map +1 -1
  385. package/dist/router.cjs +24 -4
  386. package/dist/router.cjs.map +1 -1
  387. package/dist/router.d.cts +7 -1
  388. package/dist/router.d.cts.map +1 -1
  389. package/dist/router.d.ts +7 -1
  390. package/dist/router.d.ts.map +1 -1
  391. package/dist/router.js +24 -5
  392. package/dist/router.js.map +1 -1
  393. package/dist/search.cjs +13 -11
  394. package/dist/search.cjs.map +1 -1
  395. package/dist/search.js +12 -10
  396. package/dist/search.js.map +1 -1
  397. package/dist/server.cjs +293 -248
  398. package/dist/server.cjs.map +1 -1
  399. package/dist/server.d.cts.map +1 -1
  400. package/dist/server.d.ts.map +1 -1
  401. package/dist/server.js +294 -249
  402. package/dist/server.js.map +1 -1
  403. package/dist/speech.cjs +20 -18
  404. package/dist/speech.cjs.map +1 -1
  405. package/dist/speech.d.cts.map +1 -1
  406. package/dist/speech.d.ts.map +1 -1
  407. package/dist/speech.js +19 -17
  408. package/dist/speech.js.map +1 -1
  409. package/dist/sse-writer.cjs +56 -30
  410. package/dist/sse-writer.cjs.map +1 -1
  411. package/dist/sse-writer.d.cts +0 -1
  412. package/dist/sse-writer.d.cts.map +1 -1
  413. package/dist/sse-writer.d.ts +0 -1
  414. package/dist/sse-writer.d.ts.map +1 -1
  415. package/dist/sse-writer.js +55 -31
  416. package/dist/sse-writer.js.map +1 -1
  417. package/dist/stream-collapse.cjs +118 -11
  418. package/dist/stream-collapse.cjs.map +1 -1
  419. package/dist/stream-collapse.d.cts +10 -9
  420. package/dist/stream-collapse.d.cts.map +1 -1
  421. package/dist/stream-collapse.d.ts +10 -9
  422. package/dist/stream-collapse.d.ts.map +1 -1
  423. package/dist/stream-collapse.js +118 -11
  424. package/dist/stream-collapse.js.map +1 -1
  425. package/dist/transcription.cjs +31 -43
  426. package/dist/transcription.cjs.map +1 -1
  427. package/dist/transcription.d.cts.map +1 -1
  428. package/dist/transcription.d.ts.map +1 -1
  429. package/dist/transcription.js +31 -43
  430. package/dist/transcription.js.map +1 -1
  431. package/dist/types.cjs.map +1 -1
  432. package/dist/types.d.cts +231 -9
  433. package/dist/types.d.cts.map +1 -1
  434. package/dist/types.d.ts +231 -9
  435. package/dist/types.d.ts.map +1 -1
  436. package/dist/types.js.map +1 -1
  437. package/dist/vector-mock.cjs +3 -8
  438. package/dist/vector-mock.cjs.map +1 -1
  439. package/dist/vector-mock.d.cts.map +1 -1
  440. package/dist/vector-mock.d.ts.map +1 -1
  441. package/dist/vector-mock.js +3 -8
  442. package/dist/vector-mock.js.map +1 -1
  443. package/dist/vector-stores.cjs +2 -4
  444. package/dist/vector-stores.cjs.map +1 -1
  445. package/dist/vector-stores.d.cts.map +1 -1
  446. package/dist/vector-stores.d.ts.map +1 -1
  447. package/dist/vector-stores.js +2 -4
  448. package/dist/vector-stores.js.map +1 -1
  449. package/dist/veo-video.cjs +16 -14
  450. package/dist/veo-video.cjs.map +1 -1
  451. package/dist/veo-video.js +10 -8
  452. package/dist/veo-video.js.map +1 -1
  453. package/dist/video.cjs +21 -19
  454. package/dist/video.cjs.map +1 -1
  455. package/dist/video.d.cts.map +1 -1
  456. package/dist/video.d.ts.map +1 -1
  457. package/dist/video.js +20 -18
  458. package/dist/video.js.map +1 -1
  459. package/dist/ws-framing.cjs +12 -6
  460. package/dist/ws-framing.cjs.map +1 -1
  461. package/dist/ws-framing.d.cts +2 -0
  462. package/dist/ws-framing.d.cts.map +1 -1
  463. package/dist/ws-framing.d.ts +2 -0
  464. package/dist/ws-framing.d.ts.map +1 -1
  465. package/dist/ws-framing.js +12 -6
  466. package/dist/ws-framing.js.map +1 -1
  467. package/dist/ws-gemini-live.cjs +131 -96
  468. package/dist/ws-gemini-live.cjs.map +1 -1
  469. package/dist/ws-gemini-live.d.cts +0 -1
  470. package/dist/ws-gemini-live.d.cts.map +1 -1
  471. package/dist/ws-gemini-live.d.ts +0 -1
  472. package/dist/ws-gemini-live.d.ts.map +1 -1
  473. package/dist/ws-gemini-live.js +130 -95
  474. package/dist/ws-gemini-live.js.map +1 -1
  475. package/dist/ws-live.cjs +6 -5
  476. package/dist/ws-live.cjs.map +1 -1
  477. package/dist/ws-live.js +5 -4
  478. package/dist/ws-live.js.map +1 -1
  479. package/dist/ws-realtime.cjs +108 -124
  480. package/dist/ws-realtime.cjs.map +1 -1
  481. package/dist/ws-realtime.d.cts.map +1 -1
  482. package/dist/ws-realtime.d.ts.map +1 -1
  483. package/dist/ws-realtime.js +105 -121
  484. package/dist/ws-realtime.js.map +1 -1
  485. package/dist/ws-responses.cjs +80 -59
  486. package/dist/ws-responses.cjs.map +1 -1
  487. package/dist/ws-responses.d.cts.map +1 -1
  488. package/dist/ws-responses.d.ts.map +1 -1
  489. package/dist/ws-responses.js +79 -58
  490. package/dist/ws-responses.js.map +1 -1
  491. package/package.json +4 -1
  492. package/skills/write-fixtures/SKILL.md +57 -16
package/dist/cohere.js CHANGED
@@ -1,47 +1,25 @@
1
- import { extractOverrides, flattenHeaders, generateDeterministicEmbedding, generateMessageId, generateToolCallId, getContext, getTestId, isCombinedFixtureResponse, isEmbeddingResponse, isErrorResponse, isJsonObject, isTextResponse, isToolCallResponse, prepareOpenAIChatMisbehavior, requireEmittedFunctionToolCalls, resolveFixtureBlockOutcome, resolveOpenAIChatMisbehaviorUsage, resolveReasoningForModel, resolveResponse, resolveStrictMode, serializeErrorResponse, servedToolArgs, strictNoMatchLogLine, strictNoMatchMessage, strictOverrideField, validateChatMessages, validateToolsField } from "./helpers.js";
2
- import { calculateDelay, delay, writeErrorResponse } from "./sse-writer.js";
1
+ import { renderError } from "./response/errors.js";
2
+ import { resolveRequestDecisions, strictOverrideField } from "./response/policy.js";
3
+ import { extractOverrides, flattenHeaders, generateDeterministicEmbedding, generateMessageId, generateToolCallId, getContext, getTestId, isCombinedFixtureResponse, isEmbeddingResponse, isErrorResponse, isJsonObject, isRawResponse, isTextResponse, isToolCallResponse, prepareOpenAIChatMisbehavior, requireEmittedFunctionToolCalls, resolveFixtureBlockOutcome, resolveOpenAIChatMisbehaviorUsage, resolveReasoningForModel, resolveResponse, servedToolArgs, strictNoMatchLogLine, strictNoMatchMessage, validateChatMessages, validateToolsField } from "./helpers.js";
4
+ import { typedSseCodec, writeErrorResponse } from "./sse-writer.js";
3
5
  import { applyChaosAsync } from "./chaos.js";
4
6
  import { normalizeDirectToolSchema, planMisbehavior, recordMisbehaviorOutcome } from "./misbehavior.js";
5
7
  import { matchFixtureDiagnostic, recordMatchOptions } from "./router.js";
6
8
  import { proxyAndRecord } from "./recorder.js";
7
- import { createInterruptionSignal } from "./interruption.js";
9
+ import { servedPayloadLength } from "./response/timing.js";
10
+ import { deliverJson, deliverStream } from "./response/deliver.js";
11
+ import { proxyInterruption, withHangUpDetection } from "./response/proxy.js";
12
+ import { serveRawResponse } from "./response/raw.js";
13
+ import { mapCohereFinish } from "./response/finish.js";
14
+ import { render } from "./response/usage/codecs/cohere.js";
8
15
 
9
16
  //#region src/cohere.ts
10
- const ZERO_USAGE = {
11
- billed_units: {
12
- input_tokens: 0,
13
- output_tokens: 0,
14
- search_units: 0,
15
- classifications: 0
16
- },
17
- tokens: {
18
- input_tokens: 0,
19
- output_tokens: 0
20
- }
21
- };
22
17
  function cohereFinishReason(overrideFinishReason, defaultReason) {
23
18
  if (!overrideFinishReason) return defaultReason;
24
- if (overrideFinishReason === "stop") return "COMPLETE";
25
- if (overrideFinishReason === "tool_calls") return "TOOL_CALL";
26
- if (overrideFinishReason === "length") return "MAX_TOKENS";
27
- return overrideFinishReason;
19
+ return mapCohereFinish(overrideFinishReason);
28
20
  }
29
21
  function cohereUsage(overrides) {
30
- if (!overrides?.usage) return ZERO_USAGE;
31
- const inputTokens = overrides.usage.input_tokens ?? overrides.usage.prompt_tokens ?? 0;
32
- const outputTokens = overrides.usage.output_tokens ?? overrides.usage.completion_tokens ?? 0;
33
- return {
34
- billed_units: {
35
- input_tokens: inputTokens,
36
- output_tokens: outputTokens,
37
- search_units: 0,
38
- classifications: 0
39
- },
40
- tokens: {
41
- input_tokens: inputTokens,
42
- output_tokens: outputTokens
43
- }
44
- };
22
+ return render(overrides);
45
23
  }
46
24
  /** Extract plain text from structured content (array of { type, text } parts) or passthrough string. */
47
25
  function extractTextContent(content) {
@@ -530,34 +508,6 @@ function buildCohereContentWithToolCallsStreamEvents(content, toolCalls, chunkSi
530
508
  });
531
509
  return events;
532
510
  }
533
- async function writeCohereSSEStream(res, events, optionsOrLatency) {
534
- const opts = typeof optionsOrLatency === "number" ? { latency: optionsOrLatency } : optionsOrLatency ?? {};
535
- const latency = opts.latency ?? 0;
536
- const profile = opts.streamingProfile;
537
- const { recordedTimings, replaySpeed } = opts;
538
- const signal = opts.signal;
539
- const onChunkSent = opts.onChunkSent;
540
- if (res.writableEnded) return true;
541
- res.setHeader("Content-Type", "text/event-stream");
542
- res.setHeader("Cache-Control", "no-cache");
543
- res.setHeader("Connection", "keep-alive");
544
- let chunkIndex = 0;
545
- for (const event of events) {
546
- const chunkDelay = calculateDelay(chunkIndex, profile, latency, recordedTimings, replaySpeed);
547
- if (chunkDelay > 0) await delay(chunkDelay, signal);
548
- if (signal?.aborted) return false;
549
- if (res.writableEnded) return true;
550
- res.write(`event: ${event.type}\ndata: ${JSON.stringify(event)}\n\n`);
551
- onChunkSent?.();
552
- if (signal?.aborted) return false;
553
- chunkIndex++;
554
- }
555
- if (!res.writableEnded) {
556
- if (opts.terminalSentinel && !signal?.aborted) res.write("data: [DONE]\n\n");
557
- res.end();
558
- }
559
- return true;
560
- }
561
511
  async function handleCohere(req, res, raw, fixtures, journal, defaults, setCorsHeaders) {
562
512
  const { logger } = defaults;
563
513
  setCorsHeaders(res);
@@ -576,10 +526,10 @@ async function handleCohere(req, res, raw, fixtures, journal, defaults, setCorsH
576
526
  fixture: null
577
527
  }
578
528
  });
579
- writeErrorResponse(res, 400, JSON.stringify({ error: {
529
+ writeErrorResponse(res, 400, renderError("cohere", "validation", {
580
530
  message: `Malformed JSON body: ${detail}`,
581
531
  type: "invalid_request_error"
582
- } }));
532
+ }).body);
583
533
  return;
584
534
  }
585
535
  if (!isJsonObject(cohereReq)) {
@@ -593,10 +543,10 @@ async function handleCohere(req, res, raw, fixtures, journal, defaults, setCorsH
593
543
  fixture: null
594
544
  }
595
545
  });
596
- writeErrorResponse(res, 400, JSON.stringify({ error: {
546
+ writeErrorResponse(res, 400, renderError("cohere", "validation", {
597
547
  message: "Request body must be a JSON object",
598
548
  type: "invalid_request_error"
599
- } }));
549
+ }).body);
600
550
  return;
601
551
  }
602
552
  if (!cohereReq.model) {
@@ -610,10 +560,10 @@ async function handleCohere(req, res, raw, fixtures, journal, defaults, setCorsH
610
560
  fixture: null
611
561
  }
612
562
  });
613
- writeErrorResponse(res, 400, JSON.stringify({ error: {
563
+ writeErrorResponse(res, 400, renderError("cohere", "validation", {
614
564
  message: "model is required",
615
565
  type: "invalid_request_error"
616
- } }));
566
+ }).body);
617
567
  return;
618
568
  }
619
569
  let shapeError = validateChatMessages(cohereReq.messages) ?? validateToolsField(cohereReq.tools);
@@ -632,17 +582,20 @@ async function handleCohere(req, res, raw, fixtures, journal, defaults, setCorsH
632
582
  fixture: null
633
583
  }
634
584
  });
635
- writeErrorResponse(res, 400, JSON.stringify({ error: {
585
+ writeErrorResponse(res, 400, renderError("cohere", "validation", {
636
586
  message: `Invalid request: ${shapeError}`,
637
587
  type: "invalid_request_error"
638
- } }));
588
+ }).body);
639
589
  return;
640
590
  }
641
591
  const completionReq = cohereToCompletionRequest(cohereReq);
642
592
  completionReq._endpointType = "chat";
643
593
  completionReq._context = getContext(req);
644
594
  const testId = getTestId(req);
645
- const { fixture, skippedBySequenceOrTurn } = matchFixtureDiagnostic(fixtures, completionReq, journal.getFixtureMatchCountsForTest(testId), defaults.requestTransform, recordMatchOptions(!!defaults.record, defaults.logger));
595
+ const { fixture, skippedBySequenceOrTurn } = matchFixtureDiagnostic(fixtures, completionReq, journal.getFixtureMatchCountsForTest(testId), defaults.requestTransform, {
596
+ ...recordMatchOptions(!!defaults.record, defaults.logger),
597
+ wire: "cohere"
598
+ });
646
599
  if (fixture) {
647
600
  journal.incrementFixtureMatchCount(fixture, fixtures, testId);
648
601
  logger.debug(`Fixture matched: ${JSON.stringify(fixture.match).slice(0, 120)}`);
@@ -654,7 +607,7 @@ async function handleCohere(req, res, raw, fixtures, journal, defaults, setCorsH
654
607
  body: completionReq
655
608
  }, fixture ? "fixture" : "proxy", defaults.registry, defaults.logger)) return;
656
609
  if (!fixture) {
657
- if (resolveStrictMode(defaults.strict, req.headers)) {
610
+ if (resolveRequestDecisions(defaults.strict, req.headers).fixtureMiss) {
658
611
  const strictStatus = 503;
659
612
  const strictMessage = strictNoMatchMessage(skippedBySequenceOrTurn);
660
613
  logger.error(strictNoMatchLogLine(req.method ?? "POST", req.url ?? "/v2/chat", skippedBySequenceOrTurn));
@@ -669,14 +622,14 @@ async function handleCohere(req, res, raw, fixtures, journal, defaults, setCorsH
669
622
  ...strictOverrideField(defaults.strict, req.headers)
670
623
  }
671
624
  });
672
- writeErrorResponse(res, strictStatus, JSON.stringify({ error: {
625
+ writeErrorResponse(res, strictStatus, renderError("cohere", "strict-miss", {
673
626
  message: strictMessage,
674
627
  type: "invalid_request_error"
675
- } }));
628
+ }).body);
676
629
  return;
677
630
  }
678
631
  if (defaults.record) {
679
- const outcome = await proxyAndRecord(req, res, completionReq, "cohere", req.url ?? "/v2/chat", fixtures, defaults, raw);
632
+ const { outcome, clientHungUp } = await withHangUpDetection(req, res, () => proxyAndRecord(req, res, completionReq, "cohere", req.url ?? "/v2/chat", fixtures, defaults, raw));
680
633
  if (outcome === "handled_by_hook") return;
681
634
  if (outcome !== "not_configured") {
682
635
  journal.add({
@@ -687,7 +640,8 @@ async function handleCohere(req, res, raw, fixtures, journal, defaults, setCorsH
687
640
  response: {
688
641
  status: res.statusCode ?? 200,
689
642
  fixture: null,
690
- source: "proxy"
643
+ source: "proxy",
644
+ ...proxyInterruption(res, clientHungUp)
691
645
  }
692
646
  });
693
647
  return;
@@ -704,10 +658,10 @@ async function handleCohere(req, res, raw, fixtures, journal, defaults, setCorsH
704
658
  ...strictOverrideField(defaults.strict, req.headers)
705
659
  }
706
660
  });
707
- writeErrorResponse(res, 404, JSON.stringify({ error: {
661
+ writeErrorResponse(res, 404, renderError("cohere", "fixture-miss", {
708
662
  message: "No fixture matched",
709
663
  type: "invalid_request_error"
710
- } }));
664
+ }).body);
711
665
  return;
712
666
  }
713
667
  const resolvedResponse = await resolveResponse(fixture, completionReq);
@@ -739,15 +693,32 @@ async function handleCohere(req, res, raw, fixtures, journal, defaults, setCorsH
739
693
  testId
740
694
  });
741
695
  if (!misbehavior.summary?.evaluations.length) logger.error(misbehavior.message);
742
- writeErrorResponse(res, misbehavior.status, JSON.stringify({
696
+ writeErrorResponse(res, misbehavior.status, renderError("cohere", "misbehavior", {
743
697
  message: misbehavior.message,
744
698
  code: misbehavior.code
745
- }));
699
+ }).body);
700
+ return;
701
+ }
702
+ if (isRawResponse(resolvedResponse)) {
703
+ await serveRawResponse({
704
+ wire: "cohere",
705
+ stream: cohereReq.stream === true,
706
+ req,
707
+ res,
708
+ fixture,
709
+ response: resolvedResponse,
710
+ body: completionReq,
711
+ journal,
712
+ defaults,
713
+ testId,
714
+ misbehaviorSummary: misbehavior.summary,
715
+ errorWire: "cohere"
716
+ });
746
717
  return;
747
718
  }
748
719
  const prepared = misbehavior.kind === "applied" ? prepareOpenAIChatMisbehavior(misbehavior) : void 0;
749
720
  const observedK5Stream = cohereReq.stream === true && prepared?.summary.fault === "stop-length-mid-tool";
750
- const appliedReasoning = prepared && "reasoning" in prepared.response ? resolveReasoningForModel(prepared.response.reasoning, cohereReq.model, resolveStrictMode(defaults.strict, req.headers), logger) : void 0;
721
+ const appliedReasoning = prepared && "reasoning" in prepared.response ? resolveReasoningForModel(prepared.response.reasoning, cohereReq.model, resolveRequestDecisions(defaults.strict, req.headers).reasoningSuppression, logger) : void 0;
751
722
  const usage = prepared ? resolveOpenAIChatMisbehaviorUsage(prepared, completionReq, appliedReasoning !== void 0) : void 0;
752
723
  const response = prepared && usage ? {
753
724
  ...prepared.response,
@@ -758,6 +729,22 @@ async function handleCohere(req, res, raw, fixtures, journal, defaults, setCorsH
758
729
  const empty = prepared?.summary.fault === "empty-response";
759
730
  const latency = fixture.latency ?? defaults.latency;
760
731
  const chunkSize = Math.max(1, fixture.chunkSize ?? defaults.chunkSize);
732
+ const replaySpeed = fixture.replaySpeed ?? defaults.replaySpeed;
733
+ const streamTiming = {
734
+ latency,
735
+ streamingProfile: fixture.streamingProfile,
736
+ recordedTimings: fixture.recordedTimings,
737
+ replaySpeed
738
+ };
739
+ const codec = typedSseCodec({ terminalSentinel: observedK5Stream });
740
+ const jsonOpts = (payloadLength) => ({
741
+ surface: "other",
742
+ payloadLength,
743
+ chunkSize,
744
+ recordedTimings: fixture.recordedTimings,
745
+ duplicateId: !!prepared?.duplicateId,
746
+ replaySpeed
747
+ });
761
748
  if (isErrorResponse(response)) {
762
749
  const status = response.status ?? 500;
763
750
  recordMisbehaviorOutcome({
@@ -775,13 +762,13 @@ async function handleCohere(req, res, raw, fixtures, journal, defaults, setCorsH
775
762
  defaults,
776
763
  testId
777
764
  });
778
- writeErrorResponse(res, status, serializeErrorResponse(response), { retryAfter: response.retryAfter });
765
+ writeErrorResponse(res, status, renderError("openai", "fixture", response.error).body, { retryAfter: response.retryAfter });
779
766
  return;
780
767
  }
781
768
  if (isCombinedFixtureResponse(response)) {
782
769
  if (response.webSearches?.length) logger.warn("webSearches in fixture response are not supported for Cohere v2 Chat API — ignoring");
783
770
  const overrides = extractOverrides(response);
784
- const effectiveStrict = resolveStrictMode(defaults.strict, req.headers);
771
+ const effectiveStrict = resolveRequestDecisions(defaults.strict, req.headers).reasoningSuppression;
785
772
  const effReasoning = prepared ? appliedReasoning : resolveReasoningForModel(response.reasoning, cohereReq.model, effectiveStrict, logger);
786
773
  const journalEntry = journal.add({
787
774
  method: req.method ?? "POST",
@@ -800,34 +787,14 @@ async function handleCohere(req, res, raw, fixtures, journal, defaults, setCorsH
800
787
  testId
801
788
  });
802
789
  const functionToolCalls = requireEmittedFunctionToolCalls(response, "Cohere");
803
- if (cohereReq.stream !== true) {
804
- const body = buildCohereContentWithToolCallsResponse(response.content ?? "", functionToolCalls, logger, effReasoning, overrides, response.blocks);
805
- res.writeHead(200, { "Content-Type": "application/json" });
806
- res.end(JSON.stringify(body));
807
- } else {
808
- const events = buildCohereContentWithToolCallsStreamEvents(response.content ?? "", functionToolCalls, chunkSize, logger, effReasoning, overrides, response.blocks);
809
- const interruption = createInterruptionSignal(fixture);
810
- if (!await writeCohereSSEStream(res, events, {
811
- terminalSentinel: observedK5Stream,
812
- latency,
813
- streamingProfile: fixture.streamingProfile,
814
- recordedTimings: fixture.recordedTimings,
815
- replaySpeed: fixture.replaySpeed ?? defaults.replaySpeed,
816
- signal: interruption?.signal,
817
- onChunkSent: interruption?.tick
818
- })) {
819
- if (!res.writableEnded) res.destroy();
820
- journalEntry.response.interrupted = true;
821
- journalEntry.response.interruptReason = interruption?.reason();
822
- }
823
- interruption?.cleanup();
824
- }
790
+ if (cohereReq.stream !== true) await deliverJson(res, journalEntry, fixture, () => buildCohereContentWithToolCallsResponse(response.content ?? "", functionToolCalls, logger, effReasoning, overrides, response.blocks), jsonOpts(servedPayloadLength(response, effReasoning)));
791
+ else await deliverStream(res, journalEntry, fixture, codec, buildCohereContentWithToolCallsStreamEvents(response.content ?? "", functionToolCalls, chunkSize, logger, effReasoning, overrides, response.blocks), streamTiming);
825
792
  return;
826
793
  }
827
794
  if (isTextResponse(response)) {
828
795
  if (response.webSearches?.length) logger.warn("webSearches in fixture response are not supported for Cohere v2 Chat API — ignoring");
829
796
  const overrides = extractOverrides(response);
830
- const effectiveStrict = resolveStrictMode(defaults.strict, req.headers);
797
+ const effectiveStrict = resolveRequestDecisions(defaults.strict, req.headers).reasoningSuppression;
831
798
  const effReasoning = prepared ? appliedReasoning : resolveReasoningForModel(response.reasoning, cohereReq.model, effectiveStrict, logger);
832
799
  const journalEntry = journal.add({
833
800
  method: req.method ?? "POST",
@@ -845,43 +812,23 @@ async function handleCohere(req, res, raw, fixtures, journal, defaults, setCorsH
845
812
  defaults,
846
813
  testId
847
814
  });
848
- if (cohereReq.stream !== true) {
849
- const body = empty ? {
850
- ...buildCohereTextResponse("", void 0, overrides),
851
- message: {
852
- role: "assistant",
853
- content: [],
854
- tool_calls: [],
855
- tool_plan: "",
856
- citations: []
857
- }
858
- } : buildCohereTextResponse(response.content, effReasoning, overrides);
859
- res.writeHead(200, { "Content-Type": "application/json" });
860
- res.end(JSON.stringify(body));
861
- } else {
862
- const events = buildCohereTextStreamEvents(response.content, chunkSize, effReasoning, overrides).filter((event) => !empty || event.type === "message-start" || event.type === "message-end");
863
- const interruption = createInterruptionSignal(fixture);
864
- if (!await writeCohereSSEStream(res, events, {
865
- terminalSentinel: observedK5Stream,
866
- latency,
867
- streamingProfile: fixture.streamingProfile,
868
- recordedTimings: fixture.recordedTimings,
869
- replaySpeed: fixture.replaySpeed ?? defaults.replaySpeed,
870
- signal: interruption?.signal,
871
- onChunkSent: interruption?.tick
872
- })) {
873
- if (!res.writableEnded) res.destroy();
874
- journalEntry.response.interrupted = true;
875
- journalEntry.response.interruptReason = interruption?.reason();
815
+ if (cohereReq.stream !== true) await deliverJson(res, journalEntry, fixture, () => empty ? {
816
+ ...buildCohereTextResponse("", void 0, overrides),
817
+ message: {
818
+ role: "assistant",
819
+ content: [],
820
+ tool_calls: [],
821
+ tool_plan: "",
822
+ citations: []
876
823
  }
877
- interruption?.cleanup();
878
- }
824
+ } : buildCohereTextResponse(response.content, effReasoning, overrides), jsonOpts(servedPayloadLength(response, effReasoning)));
825
+ else await deliverStream(res, journalEntry, fixture, codec, buildCohereTextStreamEvents(response.content, chunkSize, effReasoning, overrides).filter((event) => !empty || event.type === "message-start" || event.type === "message-end"), streamTiming);
879
826
  return;
880
827
  }
881
828
  if (isToolCallResponse(response)) {
882
829
  if (response.webSearches?.length) logger.warn("webSearches in fixture response are not supported for Cohere v2 Chat API — ignoring");
883
830
  const overrides = extractOverrides(response);
884
- const effectiveStrict = resolveStrictMode(defaults.strict, req.headers);
831
+ const effectiveStrict = resolveRequestDecisions(defaults.strict, req.headers).reasoningSuppression;
885
832
  const effReasoning = prepared ? appliedReasoning : resolveReasoningForModel(response.reasoning, cohereReq.model, effectiveStrict, logger);
886
833
  const journalEntry = journal.add({
887
834
  method: req.method ?? "POST",
@@ -900,28 +847,8 @@ async function handleCohere(req, res, raw, fixtures, journal, defaults, setCorsH
900
847
  testId
901
848
  });
902
849
  const functionToolCalls = requireEmittedFunctionToolCalls(response, "Cohere");
903
- if (cohereReq.stream !== true) {
904
- const body = buildCohereToolCallResponse(functionToolCalls, logger, effReasoning, overrides);
905
- res.writeHead(200, { "Content-Type": "application/json" });
906
- res.end(JSON.stringify(body));
907
- } else {
908
- const events = buildCohereToolCallStreamEvents(functionToolCalls, chunkSize, logger, effReasoning, overrides);
909
- const interruption = createInterruptionSignal(fixture);
910
- if (!await writeCohereSSEStream(res, events, {
911
- terminalSentinel: observedK5Stream,
912
- latency,
913
- streamingProfile: fixture.streamingProfile,
914
- recordedTimings: fixture.recordedTimings,
915
- replaySpeed: fixture.replaySpeed ?? defaults.replaySpeed,
916
- signal: interruption?.signal,
917
- onChunkSent: interruption?.tick
918
- })) {
919
- if (!res.writableEnded) res.destroy();
920
- journalEntry.response.interrupted = true;
921
- journalEntry.response.interruptReason = interruption?.reason();
922
- }
923
- interruption?.cleanup();
924
- }
850
+ if (cohereReq.stream !== true) await deliverJson(res, journalEntry, fixture, () => buildCohereToolCallResponse(functionToolCalls, logger, effReasoning, overrides), jsonOpts(servedPayloadLength(response, effReasoning)));
851
+ else await deliverStream(res, journalEntry, fixture, codec, buildCohereToolCallStreamEvents(functionToolCalls, chunkSize, logger, effReasoning, overrides), streamTiming);
925
852
  return;
926
853
  }
927
854
  recordMisbehaviorOutcome({
@@ -939,10 +866,10 @@ async function handleCohere(req, res, raw, fixtures, journal, defaults, setCorsH
939
866
  defaults,
940
867
  testId
941
868
  });
942
- writeErrorResponse(res, 500, JSON.stringify({ error: {
869
+ writeErrorResponse(res, 500, renderError("cohere", "unknown-response", {
943
870
  message: "Fixture response did not match any known type",
944
871
  type: "server_error"
945
- } }));
872
+ }).body);
946
873
  }
947
874
  async function handleCohereEmbed(req, res, raw, fixtures, journal, defaults, setCorsHeaders) {
948
875
  const { logger } = defaults;
@@ -962,10 +889,10 @@ async function handleCohereEmbed(req, res, raw, fixtures, journal, defaults, set
962
889
  fixture: null
963
890
  }
964
891
  });
965
- writeErrorResponse(res, 400, JSON.stringify({ error: {
892
+ writeErrorResponse(res, 400, renderError("cohere", "validation", {
966
893
  message: `Malformed JSON body: ${detail}`,
967
894
  type: "invalid_request_error"
968
- } }));
895
+ }).body);
969
896
  return;
970
897
  }
971
898
  if (!isJsonObject(embedReq)) {
@@ -979,10 +906,10 @@ async function handleCohereEmbed(req, res, raw, fixtures, journal, defaults, set
979
906
  fixture: null
980
907
  }
981
908
  });
982
- writeErrorResponse(res, 400, JSON.stringify({ error: {
909
+ writeErrorResponse(res, 400, renderError("cohere", "validation", {
983
910
  message: "Request body must be a JSON object",
984
911
  type: "invalid_request_error"
985
- } }));
912
+ }).body);
986
913
  return;
987
914
  }
988
915
  if (!embedReq.model) {
@@ -996,10 +923,10 @@ async function handleCohereEmbed(req, res, raw, fixtures, journal, defaults, set
996
923
  fixture: null
997
924
  }
998
925
  });
999
- writeErrorResponse(res, 400, JSON.stringify({ error: {
926
+ writeErrorResponse(res, 400, renderError("cohere", "validation", {
1000
927
  message: "model is required",
1001
928
  type: "invalid_request_error"
1002
- } }));
929
+ }).body);
1003
930
  return;
1004
931
  }
1005
932
  if (!embedReq.texts || !Array.isArray(embedReq.texts)) {
@@ -1013,10 +940,10 @@ async function handleCohereEmbed(req, res, raw, fixtures, journal, defaults, set
1013
940
  fixture: null
1014
941
  }
1015
942
  });
1016
- writeErrorResponse(res, 400, JSON.stringify({ error: {
943
+ writeErrorResponse(res, 400, renderError("cohere", "validation", {
1017
944
  message: "Invalid request: texts array is required",
1018
945
  type: "invalid_request_error"
1019
- } }));
946
+ }).body);
1020
947
  return;
1021
948
  }
1022
949
  if (!embedReq.texts.every((text) => typeof text === "string")) {
@@ -1030,10 +957,10 @@ async function handleCohereEmbed(req, res, raw, fixtures, journal, defaults, set
1030
957
  fixture: null
1031
958
  }
1032
959
  });
1033
- writeErrorResponse(res, 400, JSON.stringify({ error: {
960
+ writeErrorResponse(res, 400, renderError("cohere", "validation", {
1034
961
  message: "Invalid request: texts must be an array of strings",
1035
962
  type: "invalid_request_error"
1036
- } }));
963
+ }).body);
1037
964
  return;
1038
965
  }
1039
966
  const combinedInput = embedReq.texts.join(" ");
@@ -1071,10 +998,10 @@ async function handleCohereEmbed(req, res, raw, fixtures, journal, defaults, set
1071
998
  fixture: fixture ?? null
1072
999
  }
1073
1000
  });
1074
- writeErrorResponse(res, 400, JSON.stringify({ error: {
1001
+ writeErrorResponse(res, 400, renderError("cohere", "validation", {
1075
1002
  message: isArray ? "Invalid request: embedding_types must be an array of strings" : "Invalid request: embedding_types must be an array",
1076
1003
  type: "invalid_request_error"
1077
- } }));
1004
+ }).body);
1078
1005
  return true;
1079
1006
  }
1080
1007
  if (fixture) {
@@ -1091,7 +1018,7 @@ async function handleCohereEmbed(req, res, raw, fixtures, journal, defaults, set
1091
1018
  fixture
1092
1019
  }
1093
1020
  });
1094
- writeErrorResponse(res, status, serializeErrorResponse(response), { retryAfter: response.retryAfter });
1021
+ writeErrorResponse(res, status, renderError("openai", "fixture", response.error).body, { retryAfter: response.retryAfter });
1095
1022
  return;
1096
1023
  }
1097
1024
  if (isEmbeddingResponse(response)) {
@@ -1129,13 +1056,13 @@ async function handleCohereEmbed(req, res, raw, fixtures, journal, defaults, set
1129
1056
  fixture
1130
1057
  }
1131
1058
  });
1132
- writeErrorResponse(res, 500, JSON.stringify({ error: {
1059
+ writeErrorResponse(res, 500, renderError("cohere", "unknown-response", {
1133
1060
  message: "Fixture response did not match any known embedding type (must have embedding or error)",
1134
1061
  type: "server_error"
1135
- } }));
1062
+ }).body);
1136
1063
  return;
1137
1064
  }
1138
- if (resolveStrictMode(defaults.strict, req.headers)) {
1065
+ if (resolveRequestDecisions(defaults.strict, req.headers).fixtureMiss) {
1139
1066
  const strictMessage = strictNoMatchMessage(skippedBySequenceOrTurn);
1140
1067
  logger.error(strictNoMatchLogLine(req.method ?? "POST", req.url ?? "/v2/embed", skippedBySequenceOrTurn));
1141
1068
  journal.add({
@@ -1149,10 +1076,10 @@ async function handleCohereEmbed(req, res, raw, fixtures, journal, defaults, set
1149
1076
  ...strictOverrideField(defaults.strict, req.headers)
1150
1077
  }
1151
1078
  });
1152
- writeErrorResponse(res, 503, JSON.stringify({ error: {
1079
+ writeErrorResponse(res, 503, renderError("cohere", "strict-miss", {
1153
1080
  message: strictMessage,
1154
1081
  type: "invalid_request_error"
1155
- } }));
1082
+ }).body);
1156
1083
  return;
1157
1084
  }
1158
1085
  if (defaults.record) {