@copilotkit/aimock 1.45.1 → 1.46.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 (425) hide show
  1. package/.claude-plugin/marketplace.json +1 -1
  2. package/.claude-plugin/plugin.json +1 -1
  3. package/CHANGELOG.md +13 -0
  4. package/README.md +7 -1
  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/batches.cjs +2 -4
  25. package/dist/batches.cjs.map +1 -1
  26. package/dist/batches.d.cts.map +1 -1
  27. package/dist/batches.d.ts.map +1 -1
  28. package/dist/batches.js +2 -4
  29. package/dist/batches.js.map +1 -1
  30. package/dist/bedrock-converse.cjs +61 -80
  31. package/dist/bedrock-converse.cjs.map +1 -1
  32. package/dist/bedrock-converse.d.cts.map +1 -1
  33. package/dist/bedrock-converse.d.ts.map +1 -1
  34. package/dist/bedrock-converse.js +58 -77
  35. package/dist/bedrock-converse.js.map +1 -1
  36. package/dist/bedrock.cjs +65 -97
  37. package/dist/bedrock.cjs.map +1 -1
  38. package/dist/bedrock.d.cts.map +1 -1
  39. package/dist/bedrock.d.ts.map +1 -1
  40. package/dist/bedrock.js +62 -94
  41. package/dist/bedrock.js.map +1 -1
  42. package/dist/byteplus-video.cjs +11 -10
  43. package/dist/byteplus-video.cjs.map +1 -1
  44. package/dist/byteplus-video.d.cts.map +1 -1
  45. package/dist/byteplus-video.d.ts.map +1 -1
  46. package/dist/byteplus-video.js +5 -4
  47. package/dist/byteplus-video.js.map +1 -1
  48. package/dist/chaos.cjs +5 -4
  49. package/dist/chaos.cjs.map +1 -1
  50. package/dist/chaos.d.cts.map +1 -1
  51. package/dist/chaos.d.ts.map +1 -1
  52. package/dist/chaos.js +5 -4
  53. package/dist/chaos.js.map +1 -1
  54. package/dist/cli.cjs +15 -0
  55. package/dist/cli.cjs.map +1 -1
  56. package/dist/cli.js +15 -0
  57. package/dist/cli.js.map +1 -1
  58. package/dist/cohere.cjs +49 -74
  59. package/dist/cohere.cjs.map +1 -1
  60. package/dist/cohere.d.cts.map +1 -1
  61. package/dist/cohere.d.ts.map +1 -1
  62. package/dist/cohere.js +47 -72
  63. package/dist/cohere.js.map +1 -1
  64. package/dist/config-loader.cjs +29 -1
  65. package/dist/config-loader.cjs.map +1 -1
  66. package/dist/config-loader.d.cts +7 -1
  67. package/dist/config-loader.d.cts.map +1 -1
  68. package/dist/config-loader.d.ts +7 -1
  69. package/dist/config-loader.d.ts.map +1 -1
  70. package/dist/config-loader.js +29 -2
  71. package/dist/config-loader.js.map +1 -1
  72. package/dist/count-tokens.cjs +146 -0
  73. package/dist/count-tokens.cjs.map +1 -0
  74. package/dist/count-tokens.js +146 -0
  75. package/dist/count-tokens.js.map +1 -0
  76. package/dist/elevenlabs-audio.cjs +36 -34
  77. package/dist/elevenlabs-audio.cjs.map +1 -1
  78. package/dist/elevenlabs-audio.d.cts.map +1 -1
  79. package/dist/elevenlabs-audio.d.ts.map +1 -1
  80. package/dist/elevenlabs-audio.js +33 -31
  81. package/dist/elevenlabs-audio.js.map +1 -1
  82. package/dist/elevenlabs-voice.cjs +38 -37
  83. package/dist/elevenlabs-voice.cjs.map +1 -1
  84. package/dist/elevenlabs-voice.d.cts.map +1 -1
  85. package/dist/elevenlabs-voice.d.ts.map +1 -1
  86. package/dist/elevenlabs-voice.js +33 -32
  87. package/dist/elevenlabs-voice.js.map +1 -1
  88. package/dist/embedding-request.cjs +16 -0
  89. package/dist/embedding-request.cjs.map +1 -0
  90. package/dist/embedding-request.js +14 -0
  91. package/dist/embedding-request.js.map +1 -0
  92. package/dist/embeddings.cjs +30 -20
  93. package/dist/embeddings.cjs.map +1 -1
  94. package/dist/embeddings.d.cts.map +1 -1
  95. package/dist/embeddings.d.ts.map +1 -1
  96. package/dist/embeddings.js +30 -20
  97. package/dist/embeddings.js.map +1 -1
  98. package/dist/fal-audio.cjs +45 -43
  99. package/dist/fal-audio.cjs.map +1 -1
  100. package/dist/fal-audio.d.cts.map +1 -1
  101. package/dist/fal-audio.d.ts.map +1 -1
  102. package/dist/fal-audio.js +42 -40
  103. package/dist/fal-audio.js.map +1 -1
  104. package/dist/fal.cjs +17 -15
  105. package/dist/fal.cjs.map +1 -1
  106. package/dist/fal.js +16 -14
  107. package/dist/fal.js.map +1 -1
  108. package/dist/files.cjs +2 -4
  109. package/dist/files.cjs.map +1 -1
  110. package/dist/files.d.cts.map +1 -1
  111. package/dist/files.d.ts.map +1 -1
  112. package/dist/files.js +2 -4
  113. package/dist/files.js.map +1 -1
  114. package/dist/fine-tuning.cjs +2 -4
  115. package/dist/fine-tuning.cjs.map +1 -1
  116. package/dist/fine-tuning.d.cts.map +1 -1
  117. package/dist/fine-tuning.d.ts.map +1 -1
  118. package/dist/fine-tuning.js +2 -4
  119. package/dist/fine-tuning.js.map +1 -1
  120. package/dist/fixture-loader.cjs +37 -42
  121. package/dist/fixture-loader.cjs.map +1 -1
  122. package/dist/fixture-loader.d.cts.map +1 -1
  123. package/dist/fixture-loader.d.ts.map +1 -1
  124. package/dist/fixture-loader.js +37 -42
  125. package/dist/fixture-loader.js.map +1 -1
  126. package/dist/gemini-embeddings.cjs +26 -24
  127. package/dist/gemini-embeddings.cjs.map +1 -1
  128. package/dist/gemini-embeddings.js +26 -24
  129. package/dist/gemini-embeddings.js.map +1 -1
  130. package/dist/gemini-interactions.cjs +50 -35
  131. package/dist/gemini-interactions.cjs.map +1 -1
  132. package/dist/gemini-interactions.d.cts +0 -1
  133. package/dist/gemini-interactions.d.cts.map +1 -1
  134. package/dist/gemini-interactions.d.ts +0 -1
  135. package/dist/gemini-interactions.d.ts.map +1 -1
  136. package/dist/gemini-interactions.js +49 -34
  137. package/dist/gemini-interactions.js.map +1 -1
  138. package/dist/gemini.cjs +57 -67
  139. package/dist/gemini.cjs.map +1 -1
  140. package/dist/gemini.d.cts.map +1 -1
  141. package/dist/gemini.d.ts.map +1 -1
  142. package/dist/gemini.js +56 -67
  143. package/dist/gemini.js.map +1 -1
  144. package/dist/grok-video.cjs +14 -12
  145. package/dist/grok-video.cjs.map +1 -1
  146. package/dist/grok-video.d.cts.map +1 -1
  147. package/dist/grok-video.d.ts.map +1 -1
  148. package/dist/grok-video.js +8 -6
  149. package/dist/grok-video.js.map +1 -1
  150. package/dist/helpers.cjs +11 -68
  151. package/dist/helpers.cjs.map +1 -1
  152. package/dist/helpers.d.cts.map +1 -1
  153. package/dist/helpers.d.ts.map +1 -1
  154. package/dist/helpers.js +12 -67
  155. package/dist/helpers.js.map +1 -1
  156. package/dist/images.cjs +30 -28
  157. package/dist/images.cjs.map +1 -1
  158. package/dist/images.d.cts.map +1 -1
  159. package/dist/images.d.ts.map +1 -1
  160. package/dist/images.js +27 -25
  161. package/dist/images.js.map +1 -1
  162. package/dist/index.d.cts +2 -2
  163. package/dist/index.d.ts +2 -2
  164. package/dist/journal.cjs +3 -1
  165. package/dist/journal.cjs.map +1 -1
  166. package/dist/journal.d.cts.map +1 -1
  167. package/dist/journal.d.ts.map +1 -1
  168. package/dist/journal.js +2 -1
  169. package/dist/journal.js.map +1 -1
  170. package/dist/llmock.cjs +3 -0
  171. package/dist/llmock.cjs.map +1 -1
  172. package/dist/llmock.d.cts.map +1 -1
  173. package/dist/llmock.d.ts.map +1 -1
  174. package/dist/llmock.js +3 -0
  175. package/dist/llmock.js.map +1 -1
  176. package/dist/mcp-handler.cjs +7 -3
  177. package/dist/mcp-handler.cjs.map +1 -1
  178. package/dist/mcp-handler.js +7 -3
  179. package/dist/mcp-handler.js.map +1 -1
  180. package/dist/mcp-recorder.cjs +2 -1
  181. package/dist/mcp-recorder.cjs.map +1 -1
  182. package/dist/mcp-recorder.js +3 -2
  183. package/dist/mcp-recorder.js.map +1 -1
  184. package/dist/messages.cjs +111 -96
  185. package/dist/messages.cjs.map +1 -1
  186. package/dist/messages.d.cts.map +1 -1
  187. package/dist/messages.d.ts.map +1 -1
  188. package/dist/messages.js +109 -95
  189. package/dist/messages.js.map +1 -1
  190. package/dist/metrics.cjs +5 -2
  191. package/dist/metrics.cjs.map +1 -1
  192. package/dist/metrics.d.cts.map +1 -1
  193. package/dist/metrics.d.ts.map +1 -1
  194. package/dist/metrics.js +6 -3
  195. package/dist/metrics.js.map +1 -1
  196. package/dist/model-utils.cjs +1 -0
  197. package/dist/model-utils.cjs.map +1 -1
  198. package/dist/model-utils.js +1 -1
  199. package/dist/model-utils.js.map +1 -1
  200. package/dist/moderation.cjs +15 -12
  201. package/dist/moderation.cjs.map +1 -1
  202. package/dist/moderation.js +14 -11
  203. package/dist/moderation.js.map +1 -1
  204. package/dist/ollama.cjs +128 -68
  205. package/dist/ollama.cjs.map +1 -1
  206. package/dist/ollama.d.cts.map +1 -1
  207. package/dist/ollama.d.ts.map +1 -1
  208. package/dist/ollama.js +124 -64
  209. package/dist/ollama.js.map +1 -1
  210. package/dist/openapi.cjs +323 -3
  211. package/dist/openapi.cjs.map +1 -1
  212. package/dist/openapi.d.cts.map +1 -1
  213. package/dist/openapi.d.ts.map +1 -1
  214. package/dist/openapi.js +324 -4
  215. package/dist/openapi.js.map +1 -1
  216. package/dist/openrouter-chat.cjs +11 -155
  217. package/dist/openrouter-chat.cjs.map +1 -1
  218. package/dist/openrouter-chat.js +11 -155
  219. package/dist/openrouter-chat.js.map +1 -1
  220. package/dist/openrouter-video.cjs +51 -74
  221. package/dist/openrouter-video.cjs.map +1 -1
  222. package/dist/openrouter-video.d.cts.map +1 -1
  223. package/dist/openrouter-video.d.ts.map +1 -1
  224. package/dist/openrouter-video.js +37 -60
  225. package/dist/openrouter-video.js.map +1 -1
  226. package/dist/recorder.cjs +176 -95
  227. package/dist/recorder.cjs.map +1 -1
  228. package/dist/recorder.d.cts.map +1 -1
  229. package/dist/recorder.d.ts.map +1 -1
  230. package/dist/recorder.js +176 -95
  231. package/dist/recorder.js.map +1 -1
  232. package/dist/rerank.cjs +13 -11
  233. package/dist/rerank.cjs.map +1 -1
  234. package/dist/rerank.js +12 -10
  235. package/dist/rerank.js.map +1 -1
  236. package/dist/response/catalog/anthropic-page.cjs +39 -0
  237. package/dist/response/catalog/anthropic-page.cjs.map +1 -0
  238. package/dist/response/catalog/anthropic-page.js +38 -0
  239. package/dist/response/catalog/anthropic-page.js.map +1 -0
  240. package/dist/response/catalog/collect.cjs +61 -0
  241. package/dist/response/catalog/collect.cjs.map +1 -0
  242. package/dist/response/catalog/collect.js +59 -0
  243. package/dist/response/catalog/collect.js.map +1 -0
  244. package/dist/response/catalog/gemini-page.cjs +25 -0
  245. package/dist/response/catalog/gemini-page.cjs.map +1 -0
  246. package/dist/response/catalog/gemini-page.js +24 -0
  247. package/dist/response/catalog/gemini-page.js.map +1 -0
  248. package/dist/response/catalog/render.cjs +182 -0
  249. package/dist/response/catalog/render.cjs.map +1 -0
  250. package/dist/response/catalog/render.js +171 -0
  251. package/dist/response/catalog/render.js.map +1 -0
  252. package/dist/response/errors.cjs +225 -0
  253. package/dist/response/errors.cjs.map +1 -0
  254. package/dist/response/errors.js +224 -0
  255. package/dist/response/errors.js.map +1 -0
  256. package/dist/response/finish.cjs +39 -0
  257. package/dist/response/finish.cjs.map +1 -0
  258. package/dist/response/finish.js +35 -0
  259. package/dist/response/finish.js.map +1 -0
  260. package/dist/response/policy.cjs +126 -0
  261. package/dist/response/policy.cjs.map +1 -0
  262. package/dist/response/policy.js +120 -0
  263. package/dist/response/policy.js.map +1 -0
  264. package/dist/response/profiles.cjs +69 -0
  265. package/dist/response/profiles.cjs.map +1 -0
  266. package/dist/response/profiles.js +65 -0
  267. package/dist/response/profiles.js.map +1 -0
  268. package/dist/response/usage/codecs/anthropic.cjs +52 -0
  269. package/dist/response/usage/codecs/anthropic.cjs.map +1 -0
  270. package/dist/response/usage/codecs/anthropic.js +50 -0
  271. package/dist/response/usage/codecs/anthropic.js.map +1 -0
  272. package/dist/response/usage/codecs/cohere.cjs +36 -0
  273. package/dist/response/usage/codecs/cohere.cjs.map +1 -0
  274. package/dist/response/usage/codecs/cohere.js +35 -0
  275. package/dist/response/usage/codecs/cohere.js.map +1 -0
  276. package/dist/response/usage/codecs/converse.cjs +16 -0
  277. package/dist/response/usage/codecs/converse.cjs.map +1 -0
  278. package/dist/response/usage/codecs/converse.js +15 -0
  279. package/dist/response/usage/codecs/converse.js.map +1 -0
  280. package/dist/response/usage/codecs/gemini.cjs +31 -0
  281. package/dist/response/usage/codecs/gemini.cjs.map +1 -0
  282. package/dist/response/usage/codecs/gemini.js +31 -0
  283. package/dist/response/usage/codecs/gemini.js.map +1 -0
  284. package/dist/response/usage/codecs/interactions.cjs +22 -0
  285. package/dist/response/usage/codecs/interactions.cjs.map +1 -0
  286. package/dist/response/usage/codecs/interactions.js +21 -0
  287. package/dist/response/usage/codecs/interactions.js.map +1 -0
  288. package/dist/response/usage/codecs/ollama.cjs +17 -0
  289. package/dist/response/usage/codecs/ollama.cjs.map +1 -0
  290. package/dist/response/usage/codecs/ollama.js +17 -0
  291. package/dist/response/usage/codecs/ollama.js.map +1 -0
  292. package/dist/response/usage/codecs/openai.cjs +52 -0
  293. package/dist/response/usage/codecs/openai.cjs.map +1 -0
  294. package/dist/response/usage/codecs/openai.js +50 -0
  295. package/dist/response/usage/codecs/openai.js.map +1 -0
  296. package/dist/response/usage/codecs/openrouter.cjs +68 -0
  297. package/dist/response/usage/codecs/openrouter.cjs.map +1 -0
  298. package/dist/response/usage/codecs/openrouter.js +67 -0
  299. package/dist/response/usage/codecs/openrouter.js.map +1 -0
  300. package/dist/response/usage/codecs/realtime.cjs +19 -0
  301. package/dist/response/usage/codecs/realtime.cjs.map +1 -0
  302. package/dist/response/usage/codecs/realtime.js +18 -0
  303. package/dist/response/usage/codecs/realtime.js.map +1 -0
  304. package/dist/response/usage/codecs/responses.cjs +21 -0
  305. package/dist/response/usage/codecs/responses.cjs.map +1 -0
  306. package/dist/response/usage/codecs/responses.js +20 -0
  307. package/dist/response/usage/codecs/responses.js.map +1 -0
  308. package/dist/response/usage/estimate.cjs +23 -0
  309. package/dist/response/usage/estimate.cjs.map +1 -0
  310. package/dist/response/usage/estimate.js +21 -0
  311. package/dist/response/usage/estimate.js.map +1 -0
  312. package/dist/response/usage/fields.cjs +72 -0
  313. package/dist/response/usage/fields.cjs.map +1 -0
  314. package/dist/response/usage/fields.js +70 -0
  315. package/dist/response/usage/fields.js.map +1 -0
  316. package/dist/response/usage/recording.cjs +52 -0
  317. package/dist/response/usage/recording.cjs.map +1 -0
  318. package/dist/response/usage/recording.js +52 -0
  319. package/dist/response/usage/recording.js.map +1 -0
  320. package/dist/responses.cjs +45 -58
  321. package/dist/responses.cjs.map +1 -1
  322. package/dist/responses.d.cts.map +1 -1
  323. package/dist/responses.d.ts.map +1 -1
  324. package/dist/responses.js +44 -57
  325. package/dist/responses.js.map +1 -1
  326. package/dist/route-registry.cjs +45 -0
  327. package/dist/route-registry.cjs.map +1 -1
  328. package/dist/route-registry.d.cts.map +1 -1
  329. package/dist/route-registry.d.ts.map +1 -1
  330. package/dist/route-registry.js +41 -1
  331. package/dist/route-registry.js.map +1 -1
  332. package/dist/router.cjs +4 -0
  333. package/dist/router.cjs.map +1 -1
  334. package/dist/router.d.cts.map +1 -1
  335. package/dist/router.d.ts.map +1 -1
  336. package/dist/router.js +3 -0
  337. package/dist/router.js.map +1 -1
  338. package/dist/search.cjs +13 -11
  339. package/dist/search.cjs.map +1 -1
  340. package/dist/search.js +12 -10
  341. package/dist/search.js.map +1 -1
  342. package/dist/server.cjs +222 -146
  343. package/dist/server.cjs.map +1 -1
  344. package/dist/server.d.cts.map +1 -1
  345. package/dist/server.d.ts.map +1 -1
  346. package/dist/server.js +223 -147
  347. package/dist/server.js.map +1 -1
  348. package/dist/speech.cjs +20 -18
  349. package/dist/speech.cjs.map +1 -1
  350. package/dist/speech.d.cts.map +1 -1
  351. package/dist/speech.d.ts.map +1 -1
  352. package/dist/speech.js +19 -17
  353. package/dist/speech.js.map +1 -1
  354. package/dist/sse-writer.cjs +7 -0
  355. package/dist/sse-writer.cjs.map +1 -1
  356. package/dist/sse-writer.d.cts.map +1 -1
  357. package/dist/sse-writer.d.ts.map +1 -1
  358. package/dist/sse-writer.js +7 -1
  359. package/dist/sse-writer.js.map +1 -1
  360. package/dist/stream-collapse.cjs +118 -11
  361. package/dist/stream-collapse.cjs.map +1 -1
  362. package/dist/stream-collapse.d.cts +10 -9
  363. package/dist/stream-collapse.d.cts.map +1 -1
  364. package/dist/stream-collapse.d.ts +10 -9
  365. package/dist/stream-collapse.d.ts.map +1 -1
  366. package/dist/stream-collapse.js +118 -11
  367. package/dist/stream-collapse.js.map +1 -1
  368. package/dist/transcription.cjs +12 -10
  369. package/dist/transcription.cjs.map +1 -1
  370. package/dist/transcription.d.cts.map +1 -1
  371. package/dist/transcription.d.ts.map +1 -1
  372. package/dist/transcription.js +11 -9
  373. package/dist/transcription.js.map +1 -1
  374. package/dist/types.cjs.map +1 -1
  375. package/dist/types.d.cts +62 -3
  376. package/dist/types.d.cts.map +1 -1
  377. package/dist/types.d.ts +62 -3
  378. package/dist/types.d.ts.map +1 -1
  379. package/dist/types.js.map +1 -1
  380. package/dist/vector-mock.cjs +3 -8
  381. package/dist/vector-mock.cjs.map +1 -1
  382. package/dist/vector-mock.d.cts.map +1 -1
  383. package/dist/vector-mock.d.ts.map +1 -1
  384. package/dist/vector-mock.js +3 -8
  385. package/dist/vector-mock.js.map +1 -1
  386. package/dist/vector-stores.cjs +2 -4
  387. package/dist/vector-stores.cjs.map +1 -1
  388. package/dist/vector-stores.d.cts.map +1 -1
  389. package/dist/vector-stores.d.ts.map +1 -1
  390. package/dist/vector-stores.js +2 -4
  391. package/dist/vector-stores.js.map +1 -1
  392. package/dist/veo-video.cjs +16 -14
  393. package/dist/veo-video.cjs.map +1 -1
  394. package/dist/veo-video.js +10 -8
  395. package/dist/veo-video.js.map +1 -1
  396. package/dist/video.cjs +21 -19
  397. package/dist/video.cjs.map +1 -1
  398. package/dist/video.d.cts.map +1 -1
  399. package/dist/video.d.ts.map +1 -1
  400. package/dist/video.js +20 -18
  401. package/dist/video.js.map +1 -1
  402. package/dist/ws-gemini-live.cjs +11 -3
  403. package/dist/ws-gemini-live.cjs.map +1 -1
  404. package/dist/ws-gemini-live.d.cts +0 -1
  405. package/dist/ws-gemini-live.d.cts.map +1 -1
  406. package/dist/ws-gemini-live.d.ts +0 -1
  407. package/dist/ws-gemini-live.d.ts.map +1 -1
  408. package/dist/ws-gemini-live.js +10 -2
  409. package/dist/ws-gemini-live.js.map +1 -1
  410. package/dist/ws-live.cjs +6 -5
  411. package/dist/ws-live.cjs.map +1 -1
  412. package/dist/ws-live.js +5 -4
  413. package/dist/ws-live.js.map +1 -1
  414. package/dist/ws-realtime.cjs +28 -54
  415. package/dist/ws-realtime.cjs.map +1 -1
  416. package/dist/ws-realtime.d.cts.map +1 -1
  417. package/dist/ws-realtime.d.ts.map +1 -1
  418. package/dist/ws-realtime.js +25 -51
  419. package/dist/ws-realtime.js.map +1 -1
  420. package/dist/ws-responses.cjs +8 -6
  421. package/dist/ws-responses.cjs.map +1 -1
  422. package/dist/ws-responses.js +7 -5
  423. package/dist/ws-responses.js.map +1 -1
  424. package/package.json +4 -1
  425. package/skills/write-fixtures/SKILL.md +25 -16
@@ -0,0 +1,52 @@
1
+ const require_fields = require('./fields.cjs');
2
+ const require_anthropic = require('./codecs/anthropic.cjs');
3
+
4
+ //#region src/response/usage/recording.ts
5
+ /** Content-type precedence matches the content dispatcher, including its SSE fallback. */
6
+ function selectedFamily(context) {
7
+ if (context.family !== "stream-dispatch") return context.family;
8
+ const ct = context.contentType?.toLowerCase() ?? "";
9
+ if (ct.includes("application/vnd.amazon.eventstream")) return "bedrock-invoke";
10
+ if (ct.includes("application/x-ndjson")) return "ollama";
11
+ if (!ct.includes("text/event-stream")) return void 0;
12
+ switch (context.provider) {
13
+ case "anthropic":
14
+ case "bedrock": return "anthropic";
15
+ case "gemini":
16
+ case "vertexai": return "gemini";
17
+ case "gemini-interactions": return "interactions";
18
+ case "cohere": return "cohere";
19
+ default: return "openai";
20
+ }
21
+ }
22
+ function mode(context, stage) {
23
+ if (stage === "final") return "sanitize";
24
+ switch (selectedFamily(context)) {
25
+ case "openai": return stage === "nonstream" ? "sanitize" : "last-nonempty";
26
+ case "transcription": return stage === "nonstream" ? "transcription-object" : "last-nonempty";
27
+ case "anthropic":
28
+ case "bedrock-invoke": return "anthropic-merge";
29
+ default: return "omit";
30
+ }
31
+ }
32
+ function captureUsage(context) {
33
+ const { observation, previous, stage } = context;
34
+ const raw = stage === "final" ? observation : observation?.usage;
35
+ switch (mode(context, stage)) {
36
+ case "sanitize": return require_fields.sanitizeUsage(raw);
37
+ case "last-nonempty": return raw && typeof raw === "object" && !Array.isArray(raw) && Object.keys(raw).length > 0 ? raw : previous;
38
+ case "transcription-object": return raw && typeof raw === "object" ? raw : void 0;
39
+ case "anthropic-merge": {
40
+ if (stage !== "stream") return require_anthropic.capture(previous, raw);
41
+ const event = observation;
42
+ if (event?.type === "message_start") return require_anthropic.capture(previous, event.message?.usage, "start");
43
+ if (event?.type === "message_delta") return require_anthropic.capture(previous, raw, "delta");
44
+ return previous;
45
+ }
46
+ case "omit": return;
47
+ }
48
+ }
49
+
50
+ //#endregion
51
+ exports.captureUsage = captureUsage;
52
+ //# sourceMappingURL=recording.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"recording.cjs","names":["sanitizeUsage","captureAnthropicUsage"],"sources":["../../../src/response/usage/recording.ts"],"sourcesContent":["import type { RecordProviderKey, ResponseOverrides } from \"../../types.js\";\nimport { capture as captureAnthropicUsage } from \"./codecs/anthropic.js\";\nimport { sanitizeUsage } from \"./fields.js\";\n\ntype BodyFamily =\n | \"openai\"\n | \"anthropic\"\n | \"gemini\"\n | \"ollama\"\n | \"cohere\"\n | \"bedrock-invoke\"\n | \"bedrock-converse\"\n | \"interactions\"\n | \"transcription\"\n | \"stream-dispatch\"\n | \"final\";\ninterface CaptureContext {\n provider?: RecordProviderKey;\n contentType?: string;\n /** Recognition remains with content readers; operation does not override their family. */\n operation?: string;\n family: BodyFamily;\n previous?: Record<string, unknown>;\n observation: unknown;\n}\ntype CaptureMode =\n | \"last-nonempty\"\n | \"transcription-object\"\n | \"sanitize\"\n | \"anthropic-merge\"\n | \"omit\";\n\n/** Content-type precedence matches the content dispatcher, including its SSE fallback. */\nfunction selectedFamily(context: CaptureContext): BodyFamily | undefined {\n if (context.family !== \"stream-dispatch\") return context.family;\n const ct = context.contentType?.toLowerCase() ?? \"\";\n if (ct.includes(\"application/vnd.amazon.eventstream\")) return \"bedrock-invoke\";\n if (ct.includes(\"application/x-ndjson\")) return \"ollama\";\n if (!ct.includes(\"text/event-stream\")) return undefined;\n switch (context.provider) {\n case \"anthropic\":\n case \"bedrock\":\n return \"anthropic\";\n case \"gemini\":\n case \"vertexai\":\n return \"gemini\";\n case \"gemini-interactions\":\n return \"interactions\";\n case \"cohere\":\n return \"cohere\";\n default:\n return \"openai\";\n }\n}\n\nfunction mode(\n context: CaptureContext,\n stage: \"stream\" | \"nonstream\" | \"collapsed\" | \"final\",\n): CaptureMode {\n if (stage === \"final\") return \"sanitize\";\n switch (selectedFamily(context)) {\n case \"openai\":\n return stage === \"nonstream\" ? \"sanitize\" : \"last-nonempty\";\n case \"transcription\":\n return stage === \"nonstream\" ? \"transcription-object\" : \"last-nonempty\";\n case \"anthropic\":\n case \"bedrock-invoke\":\n return \"anthropic-merge\";\n // These families intentionally do not acquire usage during extraction.\n case \"gemini\":\n case \"ollama\":\n case \"cohere\":\n case \"bedrock-converse\":\n case \"interactions\":\n default:\n return \"omit\";\n }\n}\n\n/** @internal Capture preserves the recognized wire's existing recording contract. */\nexport function captureUsage(\n context: CaptureContext & { family: \"transcription\"; stage: \"nonstream\" },\n): Record<string, unknown> | undefined;\nexport function captureUsage(\n context: CaptureContext & { stage: \"final\" | \"nonstream\" },\n): ResponseOverrides[\"usage\"] | undefined;\nexport function captureUsage(\n context: CaptureContext & { stage: \"stream\" | \"collapsed\" },\n): Record<string, unknown> | undefined;\nexport function captureUsage(\n context: CaptureContext & { stage: \"stream\" | \"nonstream\" | \"collapsed\" | \"final\" },\n): Record<string, unknown> | undefined {\n const { observation, previous, stage } = context;\n // Final fixture sanitation receives raw usage; other stages receive the\n // recognized envelope/event, leaving body recognition with the content reader.\n const raw = stage === \"final\" ? observation : (observation as { usage?: unknown } | null)?.usage;\n switch (mode(context, stage)) {\n case \"sanitize\":\n return sanitizeUsage(raw);\n case \"last-nonempty\":\n return raw && typeof raw === \"object\" && !Array.isArray(raw) && Object.keys(raw).length > 0\n ? (raw as Record<string, unknown>)\n : previous;\n case \"transcription-object\":\n // Nonstream transcription historically retains arrays and empty objects;\n // its discriminator contract is separate from chat fixture sanitation.\n return raw && typeof raw === \"object\" ? (raw as Record<string, unknown>) : undefined;\n case \"anthropic-merge\": {\n if (stage !== \"stream\") return captureAnthropicUsage(previous, raw);\n const event = observation as { type?: unknown; message?: { usage?: unknown } } | null;\n if (event?.type === \"message_start\")\n return captureAnthropicUsage(previous, event.message?.usage, \"start\");\n if (event?.type === \"message_delta\") return captureAnthropicUsage(previous, raw, \"delta\");\n return previous;\n }\n case \"omit\":\n return undefined;\n }\n}\n"],"mappings":";;;;;AAiCA,SAAS,eAAe,SAAiD;AACvE,KAAI,QAAQ,WAAW,kBAAmB,QAAO,QAAQ;CACzD,MAAM,KAAK,QAAQ,aAAa,aAAa,IAAI;AACjD,KAAI,GAAG,SAAS,qCAAqC,CAAE,QAAO;AAC9D,KAAI,GAAG,SAAS,uBAAuB,CAAE,QAAO;AAChD,KAAI,CAAC,GAAG,SAAS,oBAAoB,CAAE,QAAO;AAC9C,SAAQ,QAAQ,UAAhB;EACE,KAAK;EACL,KAAK,UACH,QAAO;EACT,KAAK;EACL,KAAK,WACH,QAAO;EACT,KAAK,sBACH,QAAO;EACT,KAAK,SACH,QAAO;EACT,QACE,QAAO;;;AAIb,SAAS,KACP,SACA,OACa;AACb,KAAI,UAAU,QAAS,QAAO;AAC9B,SAAQ,eAAe,QAAQ,EAA/B;EACE,KAAK,SACH,QAAO,UAAU,cAAc,aAAa;EAC9C,KAAK,gBACH,QAAO,UAAU,cAAc,yBAAyB;EAC1D,KAAK;EACL,KAAK,iBACH,QAAO;EAOT,QACE,QAAO;;;AAcb,SAAgB,aACd,SACqC;CACrC,MAAM,EAAE,aAAa,UAAU,UAAU;CAGzC,MAAM,MAAM,UAAU,UAAU,cAAe,aAA4C;AAC3F,SAAQ,KAAK,SAAS,MAAM,EAA5B;EACE,KAAK,WACH,QAAOA,6BAAc,IAAI;EAC3B,KAAK,gBACH,QAAO,OAAO,OAAO,QAAQ,YAAY,CAAC,MAAM,QAAQ,IAAI,IAAI,OAAO,KAAK,IAAI,CAAC,SAAS,IACrF,MACD;EACN,KAAK,uBAGH,QAAO,OAAO,OAAO,QAAQ,WAAY,MAAkC;EAC7E,KAAK,mBAAmB;AACtB,OAAI,UAAU,SAAU,QAAOC,0BAAsB,UAAU,IAAI;GACnE,MAAM,QAAQ;AACd,OAAI,OAAO,SAAS,gBAClB,QAAOA,0BAAsB,UAAU,MAAM,SAAS,OAAO,QAAQ;AACvE,OAAI,OAAO,SAAS,gBAAiB,QAAOA,0BAAsB,UAAU,KAAK,QAAQ;AACzF,UAAO;;EAET,KAAK,OACH"}
@@ -0,0 +1,52 @@
1
+ import { sanitizeUsage } from "./fields.js";
2
+ import { capture } from "./codecs/anthropic.js";
3
+
4
+ //#region src/response/usage/recording.ts
5
+ /** Content-type precedence matches the content dispatcher, including its SSE fallback. */
6
+ function selectedFamily(context) {
7
+ if (context.family !== "stream-dispatch") return context.family;
8
+ const ct = context.contentType?.toLowerCase() ?? "";
9
+ if (ct.includes("application/vnd.amazon.eventstream")) return "bedrock-invoke";
10
+ if (ct.includes("application/x-ndjson")) return "ollama";
11
+ if (!ct.includes("text/event-stream")) return void 0;
12
+ switch (context.provider) {
13
+ case "anthropic":
14
+ case "bedrock": return "anthropic";
15
+ case "gemini":
16
+ case "vertexai": return "gemini";
17
+ case "gemini-interactions": return "interactions";
18
+ case "cohere": return "cohere";
19
+ default: return "openai";
20
+ }
21
+ }
22
+ function mode(context, stage) {
23
+ if (stage === "final") return "sanitize";
24
+ switch (selectedFamily(context)) {
25
+ case "openai": return stage === "nonstream" ? "sanitize" : "last-nonempty";
26
+ case "transcription": return stage === "nonstream" ? "transcription-object" : "last-nonempty";
27
+ case "anthropic":
28
+ case "bedrock-invoke": return "anthropic-merge";
29
+ default: return "omit";
30
+ }
31
+ }
32
+ function captureUsage(context) {
33
+ const { observation, previous, stage } = context;
34
+ const raw = stage === "final" ? observation : observation?.usage;
35
+ switch (mode(context, stage)) {
36
+ case "sanitize": return sanitizeUsage(raw);
37
+ case "last-nonempty": return raw && typeof raw === "object" && !Array.isArray(raw) && Object.keys(raw).length > 0 ? raw : previous;
38
+ case "transcription-object": return raw && typeof raw === "object" ? raw : void 0;
39
+ case "anthropic-merge": {
40
+ if (stage !== "stream") return capture(previous, raw);
41
+ const event = observation;
42
+ if (event?.type === "message_start") return capture(previous, event.message?.usage, "start");
43
+ if (event?.type === "message_delta") return capture(previous, raw, "delta");
44
+ return previous;
45
+ }
46
+ case "omit": return;
47
+ }
48
+ }
49
+
50
+ //#endregion
51
+ export { captureUsage };
52
+ //# sourceMappingURL=recording.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"recording.js","names":["captureAnthropicUsage"],"sources":["../../../src/response/usage/recording.ts"],"sourcesContent":["import type { RecordProviderKey, ResponseOverrides } from \"../../types.js\";\nimport { capture as captureAnthropicUsage } from \"./codecs/anthropic.js\";\nimport { sanitizeUsage } from \"./fields.js\";\n\ntype BodyFamily =\n | \"openai\"\n | \"anthropic\"\n | \"gemini\"\n | \"ollama\"\n | \"cohere\"\n | \"bedrock-invoke\"\n | \"bedrock-converse\"\n | \"interactions\"\n | \"transcription\"\n | \"stream-dispatch\"\n | \"final\";\ninterface CaptureContext {\n provider?: RecordProviderKey;\n contentType?: string;\n /** Recognition remains with content readers; operation does not override their family. */\n operation?: string;\n family: BodyFamily;\n previous?: Record<string, unknown>;\n observation: unknown;\n}\ntype CaptureMode =\n | \"last-nonempty\"\n | \"transcription-object\"\n | \"sanitize\"\n | \"anthropic-merge\"\n | \"omit\";\n\n/** Content-type precedence matches the content dispatcher, including its SSE fallback. */\nfunction selectedFamily(context: CaptureContext): BodyFamily | undefined {\n if (context.family !== \"stream-dispatch\") return context.family;\n const ct = context.contentType?.toLowerCase() ?? \"\";\n if (ct.includes(\"application/vnd.amazon.eventstream\")) return \"bedrock-invoke\";\n if (ct.includes(\"application/x-ndjson\")) return \"ollama\";\n if (!ct.includes(\"text/event-stream\")) return undefined;\n switch (context.provider) {\n case \"anthropic\":\n case \"bedrock\":\n return \"anthropic\";\n case \"gemini\":\n case \"vertexai\":\n return \"gemini\";\n case \"gemini-interactions\":\n return \"interactions\";\n case \"cohere\":\n return \"cohere\";\n default:\n return \"openai\";\n }\n}\n\nfunction mode(\n context: CaptureContext,\n stage: \"stream\" | \"nonstream\" | \"collapsed\" | \"final\",\n): CaptureMode {\n if (stage === \"final\") return \"sanitize\";\n switch (selectedFamily(context)) {\n case \"openai\":\n return stage === \"nonstream\" ? \"sanitize\" : \"last-nonempty\";\n case \"transcription\":\n return stage === \"nonstream\" ? \"transcription-object\" : \"last-nonempty\";\n case \"anthropic\":\n case \"bedrock-invoke\":\n return \"anthropic-merge\";\n // These families intentionally do not acquire usage during extraction.\n case \"gemini\":\n case \"ollama\":\n case \"cohere\":\n case \"bedrock-converse\":\n case \"interactions\":\n default:\n return \"omit\";\n }\n}\n\n/** @internal Capture preserves the recognized wire's existing recording contract. */\nexport function captureUsage(\n context: CaptureContext & { family: \"transcription\"; stage: \"nonstream\" },\n): Record<string, unknown> | undefined;\nexport function captureUsage(\n context: CaptureContext & { stage: \"final\" | \"nonstream\" },\n): ResponseOverrides[\"usage\"] | undefined;\nexport function captureUsage(\n context: CaptureContext & { stage: \"stream\" | \"collapsed\" },\n): Record<string, unknown> | undefined;\nexport function captureUsage(\n context: CaptureContext & { stage: \"stream\" | \"nonstream\" | \"collapsed\" | \"final\" },\n): Record<string, unknown> | undefined {\n const { observation, previous, stage } = context;\n // Final fixture sanitation receives raw usage; other stages receive the\n // recognized envelope/event, leaving body recognition with the content reader.\n const raw = stage === \"final\" ? observation : (observation as { usage?: unknown } | null)?.usage;\n switch (mode(context, stage)) {\n case \"sanitize\":\n return sanitizeUsage(raw);\n case \"last-nonempty\":\n return raw && typeof raw === \"object\" && !Array.isArray(raw) && Object.keys(raw).length > 0\n ? (raw as Record<string, unknown>)\n : previous;\n case \"transcription-object\":\n // Nonstream transcription historically retains arrays and empty objects;\n // its discriminator contract is separate from chat fixture sanitation.\n return raw && typeof raw === \"object\" ? (raw as Record<string, unknown>) : undefined;\n case \"anthropic-merge\": {\n if (stage !== \"stream\") return captureAnthropicUsage(previous, raw);\n const event = observation as { type?: unknown; message?: { usage?: unknown } } | null;\n if (event?.type === \"message_start\")\n return captureAnthropicUsage(previous, event.message?.usage, \"start\");\n if (event?.type === \"message_delta\") return captureAnthropicUsage(previous, raw, \"delta\");\n return previous;\n }\n case \"omit\":\n return undefined;\n }\n}\n"],"mappings":";;;;;AAiCA,SAAS,eAAe,SAAiD;AACvE,KAAI,QAAQ,WAAW,kBAAmB,QAAO,QAAQ;CACzD,MAAM,KAAK,QAAQ,aAAa,aAAa,IAAI;AACjD,KAAI,GAAG,SAAS,qCAAqC,CAAE,QAAO;AAC9D,KAAI,GAAG,SAAS,uBAAuB,CAAE,QAAO;AAChD,KAAI,CAAC,GAAG,SAAS,oBAAoB,CAAE,QAAO;AAC9C,SAAQ,QAAQ,UAAhB;EACE,KAAK;EACL,KAAK,UACH,QAAO;EACT,KAAK;EACL,KAAK,WACH,QAAO;EACT,KAAK,sBACH,QAAO;EACT,KAAK,SACH,QAAO;EACT,QACE,QAAO;;;AAIb,SAAS,KACP,SACA,OACa;AACb,KAAI,UAAU,QAAS,QAAO;AAC9B,SAAQ,eAAe,QAAQ,EAA/B;EACE,KAAK,SACH,QAAO,UAAU,cAAc,aAAa;EAC9C,KAAK,gBACH,QAAO,UAAU,cAAc,yBAAyB;EAC1D,KAAK;EACL,KAAK,iBACH,QAAO;EAOT,QACE,QAAO;;;AAcb,SAAgB,aACd,SACqC;CACrC,MAAM,EAAE,aAAa,UAAU,UAAU;CAGzC,MAAM,MAAM,UAAU,UAAU,cAAe,aAA4C;AAC3F,SAAQ,KAAK,SAAS,MAAM,EAA5B;EACE,KAAK,WACH,QAAO,cAAc,IAAI;EAC3B,KAAK,gBACH,QAAO,OAAO,OAAO,QAAQ,YAAY,CAAC,MAAM,QAAQ,IAAI,IAAI,OAAO,KAAK,IAAI,CAAC,SAAS,IACrF,MACD;EACN,KAAK,uBAGH,QAAO,OAAO,OAAO,QAAQ,WAAY,MAAkC;EAC7E,KAAK,mBAAmB;AACtB,OAAI,UAAU,SAAU,QAAOA,QAAsB,UAAU,IAAI;GACnE,MAAM,QAAQ;AACd,OAAI,OAAO,SAAS,gBAClB,QAAOA,QAAsB,UAAU,MAAM,SAAS,OAAO,QAAQ;AACvE,OAAI,OAAO,SAAS,gBAAiB,QAAOA,QAAsB,UAAU,KAAK,QAAQ;AACzF,UAAO;;EAET,KAAK,OACH"}
@@ -1,5 +1,7 @@
1
1
  const require_runtime = require('./_virtual/_rolldown/runtime.cjs');
2
+ const require_errors = require('./response/errors.cjs');
2
3
  const require_model_utils = require('./model-utils.cjs');
4
+ const require_policy = require('./response/policy.cjs');
3
5
  const require_helpers = require('./helpers.cjs');
4
6
  const require_sse_writer = require('./sse-writer.cjs');
5
7
  const require_chaos = require('./chaos.cjs');
@@ -7,6 +9,8 @@ const require_misbehavior = require('./misbehavior.cjs');
7
9
  const require_router = require('./router.cjs');
8
10
  const require_recorder = require('./recorder.cjs');
9
11
  const require_interruption = require('./interruption.cjs');
12
+ const require_responses = require('./response/usage/codecs/responses.cjs');
13
+ const require_finish = require('./response/finish.cjs');
10
14
  let node_crypto = require("node:crypto");
11
15
 
12
16
  //#region src/responses.ts
@@ -311,25 +315,7 @@ function validateResponsesTools(tools) {
311
315
  }
312
316
  function responsesStatus(finishReason, defaultStatus) {
313
317
  if (!finishReason) return defaultStatus;
314
- if (finishReason === "stop") return "completed";
315
- if (finishReason === "tool_calls") return "completed";
316
- if (finishReason === "length") return "incomplete";
317
- if (finishReason === "content_filter") return "failed";
318
- return finishReason;
319
- }
320
- function responsesUsage(overrides) {
321
- if (!overrides?.usage) return {
322
- input_tokens: 0,
323
- output_tokens: 0,
324
- total_tokens: 0
325
- };
326
- const input = overrides.usage.input_tokens ?? overrides.usage.prompt_tokens ?? 0;
327
- const output = overrides.usage.output_tokens ?? overrides.usage.completion_tokens ?? 0;
328
- return {
329
- input_tokens: input,
330
- output_tokens: output,
331
- total_tokens: overrides.usage.total_tokens ?? input + output
332
- };
318
+ return require_finish.mapResponsesFinish(finishReason);
333
319
  }
334
320
  function responseId() {
335
321
  return require_helpers.generateId("resp");
@@ -339,7 +325,7 @@ function itemId() {
339
325
  }
340
326
  function buildTextStreamEvents(content, model, chunkSize, reasoning, webSearches, overrides, emitEncryptedReasoning = false, synthesizeSummarylessReasoning = false) {
341
327
  const { respId, created, events, prefixOutputItems, nextOutputIndex } = buildResponsePreamble(model, chunkSize, reasoning, webSearches, overrides, emitEncryptedReasoning, synthesizeSummarylessReasoning);
342
- const { events: msgEvents, msgItem } = buildMessageOutputEvents(content, chunkSize, nextOutputIndex);
328
+ const { events: msgEvents, msgItem } = buildMessageOutputEvents(content, chunkSize, nextOutputIndex, overrides?.phase);
343
329
  events.push(...msgEvents);
344
330
  events.push({
345
331
  type: "response.completed",
@@ -350,7 +336,7 @@ function buildTextStreamEvents(content, model, chunkSize, reasoning, webSearches
350
336
  model: overrides?.model ?? model,
351
337
  status: responsesStatus(overrides?.finishReason, "completed"),
352
338
  output: [...prefixOutputItems, msgItem],
353
- usage: responsesUsage(overrides)
339
+ usage: require_responses.render(overrides)
354
340
  }
355
341
  });
356
342
  return events;
@@ -464,7 +450,7 @@ function toolCallStreamEvents(toolCalls, model, chunkSize, reasoning, webSearche
464
450
  model: overrides?.model ?? model,
465
451
  status: responsesStatus(overrides?.finishReason, "completed"),
466
452
  output: [...prefixOutputItems, ...fcOutputItems],
467
- usage: responsesUsage(overrides)
453
+ usage: require_responses.render(overrides)
468
454
  }
469
455
  });
470
456
  return events;
@@ -735,7 +721,7 @@ function buildResponsePreamble(model, chunkSize, reasoning, webSearches, overrid
735
721
  nextOutputIndex
736
722
  };
737
723
  }
738
- function buildMessageOutputEvents(content, chunkSize, outputIndex) {
724
+ function buildMessageOutputEvents(content, chunkSize, outputIndex, phase) {
739
725
  const msgId = itemId();
740
726
  const events = [];
741
727
  events.push({
@@ -746,6 +732,7 @@ function buildMessageOutputEvents(content, chunkSize, outputIndex) {
746
732
  id: msgId,
747
733
  status: "in_progress",
748
734
  role: "assistant",
735
+ ...phase !== void 0 ? { phase } : {},
749
736
  content: []
750
737
  }
751
738
  });
@@ -790,6 +777,7 @@ function buildMessageOutputEvents(content, chunkSize, outputIndex) {
790
777
  id: msgId,
791
778
  status: "completed",
792
779
  role: "assistant",
780
+ ...phase !== void 0 ? { phase } : {},
793
781
  content: [{
794
782
  type: "output_text",
795
783
  text: content,
@@ -908,7 +896,7 @@ function buildCustomToolCallOutputEvents(call, chunkSize, outputIndex) {
908
896
  function buildToolCallOutputEvents(call, chunkSize, outputIndex) {
909
897
  return isCustomEmittable(call) ? buildCustomToolCallOutputEvents(call, chunkSize, outputIndex) : buildFunctionCallOutputEvents(call, chunkSize, outputIndex);
910
898
  }
911
- function buildOutputPrefix(content, model, reasoning, webSearches, emitEncryptedReasoning = false, synthesizeSummarylessReasoning = false) {
899
+ function buildOutputPrefix(content, model, reasoning, webSearches, emitEncryptedReasoning = false, synthesizeSummarylessReasoning = false, phase) {
912
900
  const output = [];
913
901
  if (reasoning || shouldSynthesizeBlobOnlyReasoning(reasoning, model, synthesizeSummarylessReasoning)) output.push(buildReasoningOutputItem(require_helpers.generateId("rs"), {
914
902
  summaryText: reasoning,
@@ -928,6 +916,7 @@ function buildOutputPrefix(content, model, reasoning, webSearches, emitEncrypted
928
916
  id: itemId(),
929
917
  status: "completed",
930
918
  role: "assistant",
919
+ ...phase !== void 0 ? { phase } : {},
931
920
  content: [{
932
921
  type: "output_text",
933
922
  text: content,
@@ -944,11 +933,11 @@ function buildResponseEnvelope(model, output, overrides) {
944
933
  model: overrides?.model ?? model,
945
934
  status: responsesStatus(overrides?.finishReason, "completed"),
946
935
  output,
947
- usage: responsesUsage(overrides)
936
+ usage: require_responses.render(overrides)
948
937
  };
949
938
  }
950
939
  function buildTextResponse(content, model, reasoning, webSearches, overrides, emitEncryptedReasoning = false, synthesizeSummarylessReasoning = false) {
951
- return buildResponseEnvelope(model, buildOutputPrefix(content, model, reasoning, webSearches, emitEncryptedReasoning, synthesizeSummarylessReasoning), overrides);
940
+ return buildResponseEnvelope(model, buildOutputPrefix(content, model, reasoning, webSearches, emitEncryptedReasoning, synthesizeSummarylessReasoning, overrides?.phase), overrides);
952
941
  }
953
942
  function buildToolCallResponse(toolCalls, model, reasoning, webSearches, overrides, emitEncryptedReasoning = false, synthesizeSummarylessReasoning = false) {
954
943
  require_helpers.assertResponsesToolCalls(toolCalls);
@@ -985,7 +974,7 @@ function contentWithToolCallsStreamEvents(content, toolCalls, model, chunkSize,
985
974
  let outputIndex = nextOutputIndex;
986
975
  for (const block of ordered) {
987
976
  if (block.type === "text") {
988
- const { events: msgEvents, msgItem } = buildMessageOutputEvents(block.text, chunkSize, outputIndex);
977
+ const { events: msgEvents, msgItem } = buildMessageOutputEvents(block.text, chunkSize, outputIndex, overrides?.phase);
989
978
  events.push(...msgEvents);
990
979
  orderedOutputItems.push(msgItem);
991
980
  } else {
@@ -997,7 +986,7 @@ function contentWithToolCallsStreamEvents(content, toolCalls, model, chunkSize,
997
986
  }
998
987
  } else {
999
988
  require_helpers.assertResponsesToolCalls(toolCalls);
1000
- const { events: msgEvents, msgItem } = buildMessageOutputEvents(content, chunkSize, nextOutputIndex);
989
+ const { events: msgEvents, msgItem } = buildMessageOutputEvents(content, chunkSize, nextOutputIndex, overrides?.phase);
1001
990
  events.push(...msgEvents);
1002
991
  orderedOutputItems.push(msgItem);
1003
992
  for (let idx = 0; idx < toolCalls.length; idx++) {
@@ -1015,7 +1004,7 @@ function contentWithToolCallsStreamEvents(content, toolCalls, model, chunkSize,
1015
1004
  model: overrides?.model ?? model,
1016
1005
  status: responsesStatus(overrides?.finishReason, "completed"),
1017
1006
  output: [...prefixOutputItems, ...orderedOutputItems],
1018
- usage: responsesUsage(overrides)
1007
+ usage: require_responses.render(overrides)
1019
1008
  }
1020
1009
  });
1021
1010
  return events;
@@ -1025,12 +1014,13 @@ function buildToolCallOutputItem(tc) {
1025
1014
  if (isCustomEmittable(tc)) return customToolCallItem(tc, customToolCallItemId(), tc.id || require_helpers.generateToolCallId(), requireFixtureToolInput(tc.input), "completed");
1026
1015
  return functionCallItem(tc, require_helpers.generateId("fc"), tc.id || require_helpers.generateToolCallId(), requireFixtureToolArguments(tc.arguments), "completed");
1027
1016
  }
1028
- function buildMessageOutputItem(content) {
1017
+ function buildMessageOutputItem(content, phase) {
1029
1018
  return {
1030
1019
  type: "message",
1031
1020
  id: itemId(),
1032
1021
  status: "completed",
1033
1022
  role: "assistant",
1023
+ ...phase !== void 0 ? { phase } : {},
1034
1024
  content: [{
1035
1025
  type: "output_text",
1036
1026
  text: content,
@@ -1054,12 +1044,12 @@ function buildContentWithToolCallsResponse(content, toolCalls, model, reasoning,
1054
1044
  query
1055
1045
  }
1056
1046
  });
1057
- for (const block of ordered) if (block.type === "text") output.push(buildMessageOutputItem(block.text));
1047
+ for (const block of ordered) if (block.type === "text") output.push(buildMessageOutputItem(block.text, overrides?.phase));
1058
1048
  else output.push(buildToolCallOutputItem(block));
1059
1049
  return buildResponseEnvelope(model, output, overrides);
1060
1050
  }
1061
1051
  require_helpers.assertResponsesToolCalls(toolCalls);
1062
- const output = buildOutputPrefix(content, model, reasoning, webSearches, emitEncryptedReasoning, synthesizeSummarylessReasoning);
1052
+ const output = buildOutputPrefix(content, model, reasoning, webSearches, emitEncryptedReasoning, synthesizeSummarylessReasoning, overrides?.phase);
1063
1053
  for (const tc of toolCalls) output.push(buildToolCallOutputItem(tc));
1064
1054
  return buildResponseEnvelope(model, output, overrides);
1065
1055
  }
@@ -1105,11 +1095,11 @@ async function handleResponses(req, res, raw, fixtures, journal, defaults, setCo
1105
1095
  fixture: null
1106
1096
  }
1107
1097
  });
1108
- require_sse_writer.writeErrorResponse(res, 400, JSON.stringify({ error: {
1098
+ require_sse_writer.writeErrorResponse(res, 400, require_errors.renderError("openai", "validation", {
1109
1099
  message: `Malformed JSON: ${detail}`,
1110
1100
  type: "invalid_request_error",
1111
1101
  code: "invalid_json"
1112
- } }));
1102
+ }).body);
1113
1103
  return;
1114
1104
  }
1115
1105
  if (!require_helpers.isJsonObject(responsesReq)) {
@@ -1123,10 +1113,10 @@ async function handleResponses(req, res, raw, fixtures, journal, defaults, setCo
1123
1113
  fixture: null
1124
1114
  }
1125
1115
  });
1126
- require_sse_writer.writeErrorResponse(res, 400, JSON.stringify({ error: {
1116
+ require_sse_writer.writeErrorResponse(res, 400, require_errors.renderError("openai", "validation", {
1127
1117
  message: "Request body must be a JSON object",
1128
1118
  type: "invalid_request_error"
1129
- } }));
1119
+ }).body);
1130
1120
  return;
1131
1121
  }
1132
1122
  let inputError;
@@ -1153,10 +1143,10 @@ async function handleResponses(req, res, raw, fixtures, journal, defaults, setCo
1153
1143
  fixture: null
1154
1144
  }
1155
1145
  });
1156
- require_sse_writer.writeErrorResponse(res, 400, JSON.stringify({ error: {
1146
+ require_sse_writer.writeErrorResponse(res, 400, require_errors.renderError("openai", "validation", {
1157
1147
  message: validationError,
1158
1148
  type: "invalid_request_error"
1159
- } }));
1149
+ }).body);
1160
1150
  return;
1161
1151
  }
1162
1152
  const extendedTools = defaults.responsesTools === "extended";
@@ -1181,7 +1171,7 @@ async function handleResponses(req, res, raw, fixtures, journal, defaults, setCo
1181
1171
  body: completionReq
1182
1172
  }, fixture ? "fixture" : "proxy", defaults.registry, defaults.logger)) return;
1183
1173
  if (!fixture) {
1184
- if (require_helpers.resolveStrictMode(defaults.strict, req.headers)) {
1174
+ if (require_policy.resolveRequestDecisions(defaults.strict, req.headers).fixtureMiss) {
1185
1175
  const strictStatus = 503;
1186
1176
  const strictMessage = require_helpers.strictNoMatchMessage(skippedBySequenceOrTurn);
1187
1177
  defaults.logger.error(require_helpers.strictNoMatchLogLine(req.method ?? "POST", req.url ?? "/v1/responses", skippedBySequenceOrTurn));
@@ -1193,14 +1183,14 @@ async function handleResponses(req, res, raw, fixtures, journal, defaults, setCo
1193
1183
  response: {
1194
1184
  status: strictStatus,
1195
1185
  fixture: null,
1196
- ...require_helpers.strictOverrideField(defaults.strict, req.headers)
1186
+ ...require_policy.strictOverrideField(defaults.strict, req.headers)
1197
1187
  }
1198
1188
  });
1199
- require_sse_writer.writeErrorResponse(res, strictStatus, JSON.stringify({ error: {
1189
+ require_sse_writer.writeErrorResponse(res, strictStatus, require_errors.renderError("openai", "strict-miss", {
1200
1190
  message: strictMessage,
1201
1191
  type: "invalid_request_error",
1202
1192
  code: "no_fixture_match"
1203
- } }));
1193
+ }).body);
1204
1194
  return;
1205
1195
  }
1206
1196
  if (defaults.record) {
@@ -1229,14 +1219,14 @@ async function handleResponses(req, res, raw, fixtures, journal, defaults, setCo
1229
1219
  response: {
1230
1220
  status: 404,
1231
1221
  fixture: null,
1232
- ...require_helpers.strictOverrideField(defaults.strict, req.headers)
1222
+ ...require_policy.strictOverrideField(defaults.strict, req.headers)
1233
1223
  }
1234
1224
  });
1235
- require_sse_writer.writeErrorResponse(res, 404, JSON.stringify({ error: {
1225
+ require_sse_writer.writeErrorResponse(res, 404, require_errors.renderError("openai", "fixture-miss", {
1236
1226
  message: "No fixture matched",
1237
1227
  type: "invalid_request_error",
1238
1228
  code: "no_fixture_match"
1239
- } }));
1229
+ }).body);
1240
1230
  return;
1241
1231
  }
1242
1232
  const resolvedResponse = await require_helpers.resolveResponse(fixture, completionReq);
@@ -1269,11 +1259,11 @@ async function handleResponses(req, res, raw, fixtures, journal, defaults, setCo
1269
1259
  testId
1270
1260
  });
1271
1261
  if (!misbehavior.summary?.evaluations.some((evaluation) => evaluation.outcome === "error")) defaults.logger.error(misbehavior.message);
1272
- require_sse_writer.writeErrorResponse(res, misbehavior.status, JSON.stringify({ error: {
1262
+ require_sse_writer.writeErrorResponse(res, misbehavior.status, require_errors.renderError("openai", "misbehavior", {
1273
1263
  message: misbehavior.message,
1274
1264
  type: "invalid_request_error",
1275
1265
  code: misbehavior.code
1276
- } }));
1266
+ }).body);
1277
1267
  return;
1278
1268
  }
1279
1269
  const latency = fixture.latency ?? defaults.latency;
@@ -1350,7 +1340,7 @@ async function handleResponses(req, res, raw, fixtures, journal, defaults, setCo
1350
1340
  }
1351
1341
  if (require_helpers.isCombinedFixtureResponse(response)) {
1352
1342
  const overrides = require_helpers.extractOverrides(response);
1353
- const effectiveStrict = require_helpers.resolveStrictMode(defaults.strict, req.headers);
1343
+ const effectiveStrict = require_policy.resolveRequestDecisions(defaults.strict, req.headers).reasoningSuppression;
1354
1344
  const effReasoning = require_helpers.resolveReasoningForModel(response.reasoning, completionReq.model, effectiveStrict, defaults.logger);
1355
1345
  const journalEntry = journal.add({
1356
1346
  method: req.method ?? "POST",
@@ -1396,7 +1386,7 @@ async function handleResponses(req, res, raw, fixtures, journal, defaults, setCo
1396
1386
  }
1397
1387
  if (require_helpers.isTextResponse(response)) {
1398
1388
  const overrides = require_helpers.extractOverrides(response);
1399
- const effectiveStrict = require_helpers.resolveStrictMode(defaults.strict, req.headers);
1389
+ const effectiveStrict = require_policy.resolveRequestDecisions(defaults.strict, req.headers).reasoningSuppression;
1400
1390
  const effReasoning = require_helpers.resolveReasoningForModel(response.reasoning, completionReq.model, effectiveStrict, defaults.logger);
1401
1391
  const journalEntry = journal.add({
1402
1392
  method: req.method ?? "POST",
@@ -1439,7 +1429,7 @@ async function handleResponses(req, res, raw, fixtures, journal, defaults, setCo
1439
1429
  }
1440
1430
  if (require_helpers.isToolCallResponse(response)) {
1441
1431
  const overrides = require_helpers.extractOverrides(response);
1442
- const effectiveStrict = require_helpers.resolveStrictMode(defaults.strict, req.headers);
1432
+ const effectiveStrict = require_policy.resolveRequestDecisions(defaults.strict, req.headers).reasoningSuppression;
1443
1433
  const effReasoning = require_helpers.resolveReasoningForModel(response.reasoning, completionReq.model, effectiveStrict, defaults.logger);
1444
1434
  const journalEntry = journal.add({
1445
1435
  method: req.method ?? "POST",
@@ -1496,10 +1486,10 @@ async function handleResponses(req, res, raw, fixtures, journal, defaults, setCo
1496
1486
  defaults,
1497
1487
  testId
1498
1488
  });
1499
- require_sse_writer.writeErrorResponse(res, 500, JSON.stringify({ error: {
1489
+ require_sse_writer.writeErrorResponse(res, 500, require_errors.renderError("openai", "unknown-response", {
1500
1490
  message: "Fixture response did not match any known type",
1501
1491
  type: "server_error"
1502
- } }));
1492
+ }).body);
1503
1493
  }
1504
1494
  /** Prepare call IDs once, retaining the engine's effective blocks and exact served-call metadata. */
1505
1495
  function prepareResponsesMisbehavior(plan) {
@@ -1527,6 +1517,7 @@ function buildResponsesMisbehavior(plan, request, chunkSize, emitEncryptedReason
1527
1517
  type: "message",
1528
1518
  role: "assistant",
1529
1519
  status: "completed",
1520
+ ...overrides.phase !== void 0 ? { phase: overrides.phase } : {},
1530
1521
  content: [part]
1531
1522
  };
1532
1523
  const position = {
@@ -1578,7 +1569,7 @@ function buildResponsesMisbehavior(plan, request, chunkSize, emitEncryptedReason
1578
1569
  let callIndex = 0;
1579
1570
  for (const block of blocks) {
1580
1571
  if (block.type === "text") {
1581
- const message = buildMessageOutputEvents(block.text, chunkSize, outputIndex);
1572
+ const message = buildMessageOutputEvents(block.text, chunkSize, outputIndex, overrides.phase);
1582
1573
  events.push(...message.events);
1583
1574
  output.push(message.msgItem);
1584
1575
  } else {
@@ -1607,11 +1598,7 @@ function buildResponsesMisbehavior(plan, request, chunkSize, emitEncryptedReason
1607
1598
  status: incomplete ? "incomplete" : responsesStatus(overrides?.finishReason, "completed"),
1608
1599
  ...incomplete ? { incomplete_details: { reason: plan.stop === "content_filter" ? "content_filter" : "max_output_tokens" } } : {},
1609
1600
  output,
1610
- usage: {
1611
- input_tokens: usage.prompt_tokens,
1612
- output_tokens: usage.completion_tokens,
1613
- total_tokens: usage.total_tokens
1614
- }
1601
+ usage: require_responses.render({ usage })
1615
1602
  };
1616
1603
  events.push({
1617
1604
  type: incomplete ? "response.incomplete" : "response.completed",