@copilotkit/aimock 1.45.1 → 1.47.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (492) hide show
  1. package/.claude-plugin/marketplace.json +1 -1
  2. package/.claude-plugin/plugin.json +1 -1
  3. package/CHANGELOG.md +25 -1
  4. package/README.md +11 -2
  5. package/dist/agui-mock.cjs +25 -25
  6. package/dist/agui-mock.cjs.map +1 -1
  7. package/dist/agui-mock.d.cts.map +1 -1
  8. package/dist/agui-mock.d.ts.map +1 -1
  9. package/dist/agui-mock.js +25 -25
  10. package/dist/agui-mock.js.map +1 -1
  11. package/dist/agui-types.d.cts.map +1 -1
  12. package/dist/aimock-cli.cjs +15 -1
  13. package/dist/aimock-cli.cjs.map +1 -1
  14. package/dist/aimock-cli.d.cts.map +1 -1
  15. package/dist/aimock-cli.d.ts.map +1 -1
  16. package/dist/aimock-cli.js +16 -2
  17. package/dist/aimock-cli.js.map +1 -1
  18. package/dist/api-key-auth.cjs +10 -9
  19. package/dist/api-key-auth.cjs.map +1 -1
  20. package/dist/api-key-auth.d.cts.map +1 -1
  21. package/dist/api-key-auth.d.ts.map +1 -1
  22. package/dist/api-key-auth.js +11 -10
  23. package/dist/api-key-auth.js.map +1 -1
  24. package/dist/aws-event-stream.cjs +20 -23
  25. package/dist/aws-event-stream.cjs.map +1 -1
  26. package/dist/aws-event-stream.d.cts +0 -1
  27. package/dist/aws-event-stream.d.ts +0 -1
  28. package/dist/aws-event-stream.js +20 -24
  29. package/dist/aws-event-stream.js.map +1 -1
  30. package/dist/batches.cjs +2 -4
  31. package/dist/batches.cjs.map +1 -1
  32. package/dist/batches.d.cts.map +1 -1
  33. package/dist/batches.d.ts.map +1 -1
  34. package/dist/batches.js +2 -4
  35. package/dist/batches.js.map +1 -1
  36. package/dist/bedrock-converse.cjs +139 -161
  37. package/dist/bedrock-converse.cjs.map +1 -1
  38. package/dist/bedrock-converse.d.cts.map +1 -1
  39. package/dist/bedrock-converse.d.ts.map +1 -1
  40. package/dist/bedrock-converse.js +137 -159
  41. package/dist/bedrock-converse.js.map +1 -1
  42. package/dist/bedrock.cjs +175 -216
  43. package/dist/bedrock.cjs.map +1 -1
  44. package/dist/bedrock.d.cts.map +1 -1
  45. package/dist/bedrock.d.ts.map +1 -1
  46. package/dist/bedrock.js +172 -213
  47. package/dist/bedrock.js.map +1 -1
  48. package/dist/byteplus-video.cjs +11 -10
  49. package/dist/byteplus-video.cjs.map +1 -1
  50. package/dist/byteplus-video.d.cts.map +1 -1
  51. package/dist/byteplus-video.d.ts.map +1 -1
  52. package/dist/byteplus-video.js +5 -4
  53. package/dist/byteplus-video.js.map +1 -1
  54. package/dist/chaos.cjs +5 -4
  55. package/dist/chaos.cjs.map +1 -1
  56. package/dist/chaos.d.cts.map +1 -1
  57. package/dist/chaos.d.ts.map +1 -1
  58. package/dist/chaos.js +5 -4
  59. package/dist/chaos.js.map +1 -1
  60. package/dist/cli.cjs +15 -0
  61. package/dist/cli.cjs.map +1 -1
  62. package/dist/cli.js +15 -0
  63. package/dist/cli.js.map +1 -1
  64. package/dist/cohere.cjs +107 -180
  65. package/dist/cohere.cjs.map +1 -1
  66. package/dist/cohere.d.cts.map +1 -1
  67. package/dist/cohere.d.ts.map +1 -1
  68. package/dist/cohere.js +106 -179
  69. package/dist/cohere.js.map +1 -1
  70. package/dist/config-loader.cjs +29 -1
  71. package/dist/config-loader.cjs.map +1 -1
  72. package/dist/config-loader.d.cts +7 -1
  73. package/dist/config-loader.d.cts.map +1 -1
  74. package/dist/config-loader.d.ts +7 -1
  75. package/dist/config-loader.d.ts.map +1 -1
  76. package/dist/config-loader.js +29 -2
  77. package/dist/config-loader.js.map +1 -1
  78. package/dist/count-tokens.cjs +146 -0
  79. package/dist/count-tokens.cjs.map +1 -0
  80. package/dist/count-tokens.js +146 -0
  81. package/dist/count-tokens.js.map +1 -0
  82. package/dist/elevenlabs-audio.cjs +36 -34
  83. package/dist/elevenlabs-audio.cjs.map +1 -1
  84. package/dist/elevenlabs-audio.d.cts.map +1 -1
  85. package/dist/elevenlabs-audio.d.ts.map +1 -1
  86. package/dist/elevenlabs-audio.js +33 -31
  87. package/dist/elevenlabs-audio.js.map +1 -1
  88. package/dist/elevenlabs-voice.cjs +38 -37
  89. package/dist/elevenlabs-voice.cjs.map +1 -1
  90. package/dist/elevenlabs-voice.d.cts.map +1 -1
  91. package/dist/elevenlabs-voice.d.ts.map +1 -1
  92. package/dist/elevenlabs-voice.js +33 -32
  93. package/dist/elevenlabs-voice.js.map +1 -1
  94. package/dist/embedding-request.cjs +16 -0
  95. package/dist/embedding-request.cjs.map +1 -0
  96. package/dist/embedding-request.js +14 -0
  97. package/dist/embedding-request.js.map +1 -0
  98. package/dist/embeddings.cjs +30 -20
  99. package/dist/embeddings.cjs.map +1 -1
  100. package/dist/embeddings.d.cts.map +1 -1
  101. package/dist/embeddings.d.ts.map +1 -1
  102. package/dist/embeddings.js +30 -20
  103. package/dist/embeddings.js.map +1 -1
  104. package/dist/fal-audio.cjs +45 -43
  105. package/dist/fal-audio.cjs.map +1 -1
  106. package/dist/fal-audio.d.cts.map +1 -1
  107. package/dist/fal-audio.d.ts.map +1 -1
  108. package/dist/fal-audio.js +42 -40
  109. package/dist/fal-audio.js.map +1 -1
  110. package/dist/fal.cjs +17 -15
  111. package/dist/fal.cjs.map +1 -1
  112. package/dist/fal.js +16 -14
  113. package/dist/fal.js.map +1 -1
  114. package/dist/files.cjs +2 -4
  115. package/dist/files.cjs.map +1 -1
  116. package/dist/files.d.cts.map +1 -1
  117. package/dist/files.d.ts.map +1 -1
  118. package/dist/files.js +2 -4
  119. package/dist/files.js.map +1 -1
  120. package/dist/fine-tuning.cjs +2 -4
  121. package/dist/fine-tuning.cjs.map +1 -1
  122. package/dist/fine-tuning.d.cts.map +1 -1
  123. package/dist/fine-tuning.d.ts.map +1 -1
  124. package/dist/fine-tuning.js +2 -4
  125. package/dist/fine-tuning.js.map +1 -1
  126. package/dist/fixture-loader.cjs +140 -44
  127. package/dist/fixture-loader.cjs.map +1 -1
  128. package/dist/fixture-loader.d.cts.map +1 -1
  129. package/dist/fixture-loader.d.ts.map +1 -1
  130. package/dist/fixture-loader.js +141 -46
  131. package/dist/fixture-loader.js.map +1 -1
  132. package/dist/gemini-embeddings.cjs +26 -24
  133. package/dist/gemini-embeddings.cjs.map +1 -1
  134. package/dist/gemini-embeddings.js +26 -24
  135. package/dist/gemini-embeddings.js.map +1 -1
  136. package/dist/gemini-interactions.cjs +113 -156
  137. package/dist/gemini-interactions.cjs.map +1 -1
  138. package/dist/gemini-interactions.d.cts +0 -1
  139. package/dist/gemini-interactions.d.cts.map +1 -1
  140. package/dist/gemini-interactions.d.ts +0 -1
  141. package/dist/gemini-interactions.d.ts.map +1 -1
  142. package/dist/gemini-interactions.js +113 -156
  143. package/dist/gemini-interactions.js.map +1 -1
  144. package/dist/gemini.cjs +295 -218
  145. package/dist/gemini.cjs.map +1 -1
  146. package/dist/gemini.d.cts.map +1 -1
  147. package/dist/gemini.d.ts.map +1 -1
  148. package/dist/gemini.js +295 -219
  149. package/dist/gemini.js.map +1 -1
  150. package/dist/grok-video.cjs +14 -12
  151. package/dist/grok-video.cjs.map +1 -1
  152. package/dist/grok-video.d.cts.map +1 -1
  153. package/dist/grok-video.d.ts.map +1 -1
  154. package/dist/grok-video.js +8 -6
  155. package/dist/grok-video.js.map +1 -1
  156. package/dist/helpers.cjs +411 -75
  157. package/dist/helpers.cjs.map +1 -1
  158. package/dist/helpers.d.cts +51 -1
  159. package/dist/helpers.d.cts.map +1 -1
  160. package/dist/helpers.d.ts +51 -1
  161. package/dist/helpers.d.ts.map +1 -1
  162. package/dist/helpers.js +402 -74
  163. package/dist/helpers.js.map +1 -1
  164. package/dist/images.cjs +30 -28
  165. package/dist/images.cjs.map +1 -1
  166. package/dist/images.d.cts.map +1 -1
  167. package/dist/images.d.ts.map +1 -1
  168. package/dist/images.js +27 -25
  169. package/dist/images.js.map +1 -1
  170. package/dist/index.cjs +4 -2
  171. package/dist/index.d.cts +4 -4
  172. package/dist/index.d.ts +4 -4
  173. package/dist/index.js +4 -4
  174. package/dist/journal.cjs +3 -1
  175. package/dist/journal.cjs.map +1 -1
  176. package/dist/journal.d.cts.map +1 -1
  177. package/dist/journal.d.ts.map +1 -1
  178. package/dist/journal.js +2 -1
  179. package/dist/journal.js.map +1 -1
  180. package/dist/llmock.cjs +3 -0
  181. package/dist/llmock.cjs.map +1 -1
  182. package/dist/llmock.d.cts.map +1 -1
  183. package/dist/llmock.d.ts.map +1 -1
  184. package/dist/llmock.js +3 -0
  185. package/dist/llmock.js.map +1 -1
  186. package/dist/mcp-fakes.d.cts.map +1 -1
  187. package/dist/mcp-handler.cjs +7 -3
  188. package/dist/mcp-handler.cjs.map +1 -1
  189. package/dist/mcp-handler.js +7 -3
  190. package/dist/mcp-handler.js.map +1 -1
  191. package/dist/mcp-recorder.cjs +2 -1
  192. package/dist/mcp-recorder.cjs.map +1 -1
  193. package/dist/mcp-recorder.js +3 -2
  194. package/dist/mcp-recorder.js.map +1 -1
  195. package/dist/messages.cjs +235 -202
  196. package/dist/messages.cjs.map +1 -1
  197. package/dist/messages.d.cts.map +1 -1
  198. package/dist/messages.d.ts.map +1 -1
  199. package/dist/messages.js +234 -202
  200. package/dist/messages.js.map +1 -1
  201. package/dist/metrics.cjs +5 -2
  202. package/dist/metrics.cjs.map +1 -1
  203. package/dist/metrics.d.cts.map +1 -1
  204. package/dist/metrics.d.ts.map +1 -1
  205. package/dist/metrics.js +6 -3
  206. package/dist/metrics.js.map +1 -1
  207. package/dist/misbehavior.cjs +62 -3
  208. package/dist/misbehavior.cjs.map +1 -1
  209. package/dist/misbehavior.d.cts.map +1 -1
  210. package/dist/misbehavior.d.ts.map +1 -1
  211. package/dist/misbehavior.js +63 -4
  212. package/dist/misbehavior.js.map +1 -1
  213. package/dist/model-utils.cjs +1 -0
  214. package/dist/model-utils.cjs.map +1 -1
  215. package/dist/model-utils.js +1 -1
  216. package/dist/model-utils.js.map +1 -1
  217. package/dist/moderation.cjs +15 -12
  218. package/dist/moderation.cjs.map +1 -1
  219. package/dist/moderation.js +14 -11
  220. package/dist/moderation.js.map +1 -1
  221. package/dist/ndjson-writer.cjs +21 -23
  222. package/dist/ndjson-writer.cjs.map +1 -1
  223. package/dist/ndjson-writer.d.cts +0 -1
  224. package/dist/ndjson-writer.d.cts.map +1 -1
  225. package/dist/ndjson-writer.d.ts +0 -1
  226. package/dist/ndjson-writer.d.ts.map +1 -1
  227. package/dist/ndjson-writer.js +21 -24
  228. package/dist/ndjson-writer.js.map +1 -1
  229. package/dist/ollama.cjs +276 -210
  230. package/dist/ollama.cjs.map +1 -1
  231. package/dist/ollama.d.cts.map +1 -1
  232. package/dist/ollama.d.ts.map +1 -1
  233. package/dist/ollama.js +273 -207
  234. package/dist/ollama.js.map +1 -1
  235. package/dist/openapi.cjs +323 -3
  236. package/dist/openapi.cjs.map +1 -1
  237. package/dist/openapi.d.cts.map +1 -1
  238. package/dist/openapi.d.ts.map +1 -1
  239. package/dist/openapi.js +324 -4
  240. package/dist/openapi.js.map +1 -1
  241. package/dist/openrouter-chat.cjs +11 -155
  242. package/dist/openrouter-chat.cjs.map +1 -1
  243. package/dist/openrouter-chat.js +11 -155
  244. package/dist/openrouter-chat.js.map +1 -1
  245. package/dist/openrouter-video.cjs +51 -74
  246. package/dist/openrouter-video.cjs.map +1 -1
  247. package/dist/openrouter-video.d.cts.map +1 -1
  248. package/dist/openrouter-video.d.ts.map +1 -1
  249. package/dist/openrouter-video.js +37 -60
  250. package/dist/openrouter-video.js.map +1 -1
  251. package/dist/raw-validation.cjs +177 -0
  252. package/dist/raw-validation.cjs.map +1 -0
  253. package/dist/raw-validation.js +176 -0
  254. package/dist/raw-validation.js.map +1 -0
  255. package/dist/recorder.cjs +176 -95
  256. package/dist/recorder.cjs.map +1 -1
  257. package/dist/recorder.d.cts.map +1 -1
  258. package/dist/recorder.d.ts.map +1 -1
  259. package/dist/recorder.js +176 -95
  260. package/dist/recorder.js.map +1 -1
  261. package/dist/rerank.cjs +13 -11
  262. package/dist/rerank.cjs.map +1 -1
  263. package/dist/rerank.js +12 -10
  264. package/dist/rerank.js.map +1 -1
  265. package/dist/response/catalog/anthropic-page.cjs +39 -0
  266. package/dist/response/catalog/anthropic-page.cjs.map +1 -0
  267. package/dist/response/catalog/anthropic-page.js +38 -0
  268. package/dist/response/catalog/anthropic-page.js.map +1 -0
  269. package/dist/response/catalog/collect.cjs +61 -0
  270. package/dist/response/catalog/collect.cjs.map +1 -0
  271. package/dist/response/catalog/collect.js +59 -0
  272. package/dist/response/catalog/collect.js.map +1 -0
  273. package/dist/response/catalog/gemini-page.cjs +25 -0
  274. package/dist/response/catalog/gemini-page.cjs.map +1 -0
  275. package/dist/response/catalog/gemini-page.js +24 -0
  276. package/dist/response/catalog/gemini-page.js.map +1 -0
  277. package/dist/response/catalog/render.cjs +182 -0
  278. package/dist/response/catalog/render.cjs.map +1 -0
  279. package/dist/response/catalog/render.js +171 -0
  280. package/dist/response/catalog/render.js.map +1 -0
  281. package/dist/response/deliver.cjs +144 -0
  282. package/dist/response/deliver.cjs.map +1 -0
  283. package/dist/response/deliver.js +143 -0
  284. package/dist/response/deliver.js.map +1 -0
  285. package/dist/response/errors.cjs +225 -0
  286. package/dist/response/errors.cjs.map +1 -0
  287. package/dist/response/errors.js +224 -0
  288. package/dist/response/errors.js.map +1 -0
  289. package/dist/response/finish.cjs +39 -0
  290. package/dist/response/finish.cjs.map +1 -0
  291. package/dist/response/finish.js +35 -0
  292. package/dist/response/finish.js.map +1 -0
  293. package/dist/response/frame-loop.cjs +102 -0
  294. package/dist/response/frame-loop.cjs.map +1 -0
  295. package/dist/response/frame-loop.js +100 -0
  296. package/dist/response/frame-loop.js.map +1 -0
  297. package/dist/response/lifecycle.cjs +223 -0
  298. package/dist/response/lifecycle.cjs.map +1 -0
  299. package/dist/response/lifecycle.js +211 -0
  300. package/dist/response/lifecycle.js.map +1 -0
  301. package/dist/response/policy.cjs +126 -0
  302. package/dist/response/policy.cjs.map +1 -0
  303. package/dist/response/policy.js +120 -0
  304. package/dist/response/policy.js.map +1 -0
  305. package/dist/response/profiles.cjs +69 -0
  306. package/dist/response/profiles.cjs.map +1 -0
  307. package/dist/response/profiles.js +65 -0
  308. package/dist/response/profiles.js.map +1 -0
  309. package/dist/response/proxy.cjs +71 -0
  310. package/dist/response/proxy.cjs.map +1 -0
  311. package/dist/response/proxy.js +70 -0
  312. package/dist/response/proxy.js.map +1 -0
  313. package/dist/response/raw.cjs +228 -0
  314. package/dist/response/raw.cjs.map +1 -0
  315. package/dist/response/raw.js +227 -0
  316. package/dist/response/raw.js.map +1 -0
  317. package/dist/response/timing.cjs +157 -0
  318. package/dist/response/timing.cjs.map +1 -0
  319. package/dist/response/timing.js +150 -0
  320. package/dist/response/timing.js.map +1 -0
  321. package/dist/response/usage/codecs/anthropic.cjs +52 -0
  322. package/dist/response/usage/codecs/anthropic.cjs.map +1 -0
  323. package/dist/response/usage/codecs/anthropic.js +50 -0
  324. package/dist/response/usage/codecs/anthropic.js.map +1 -0
  325. package/dist/response/usage/codecs/cohere.cjs +36 -0
  326. package/dist/response/usage/codecs/cohere.cjs.map +1 -0
  327. package/dist/response/usage/codecs/cohere.js +35 -0
  328. package/dist/response/usage/codecs/cohere.js.map +1 -0
  329. package/dist/response/usage/codecs/converse.cjs +16 -0
  330. package/dist/response/usage/codecs/converse.cjs.map +1 -0
  331. package/dist/response/usage/codecs/converse.js +15 -0
  332. package/dist/response/usage/codecs/converse.js.map +1 -0
  333. package/dist/response/usage/codecs/gemini.cjs +31 -0
  334. package/dist/response/usage/codecs/gemini.cjs.map +1 -0
  335. package/dist/response/usage/codecs/gemini.js +31 -0
  336. package/dist/response/usage/codecs/gemini.js.map +1 -0
  337. package/dist/response/usage/codecs/interactions.cjs +22 -0
  338. package/dist/response/usage/codecs/interactions.cjs.map +1 -0
  339. package/dist/response/usage/codecs/interactions.js +21 -0
  340. package/dist/response/usage/codecs/interactions.js.map +1 -0
  341. package/dist/response/usage/codecs/ollama.cjs +17 -0
  342. package/dist/response/usage/codecs/ollama.cjs.map +1 -0
  343. package/dist/response/usage/codecs/ollama.js +17 -0
  344. package/dist/response/usage/codecs/ollama.js.map +1 -0
  345. package/dist/response/usage/codecs/openai.cjs +52 -0
  346. package/dist/response/usage/codecs/openai.cjs.map +1 -0
  347. package/dist/response/usage/codecs/openai.js +50 -0
  348. package/dist/response/usage/codecs/openai.js.map +1 -0
  349. package/dist/response/usage/codecs/openrouter.cjs +68 -0
  350. package/dist/response/usage/codecs/openrouter.cjs.map +1 -0
  351. package/dist/response/usage/codecs/openrouter.js +67 -0
  352. package/dist/response/usage/codecs/openrouter.js.map +1 -0
  353. package/dist/response/usage/codecs/realtime.cjs +19 -0
  354. package/dist/response/usage/codecs/realtime.cjs.map +1 -0
  355. package/dist/response/usage/codecs/realtime.js +18 -0
  356. package/dist/response/usage/codecs/realtime.js.map +1 -0
  357. package/dist/response/usage/codecs/responses.cjs +21 -0
  358. package/dist/response/usage/codecs/responses.cjs.map +1 -0
  359. package/dist/response/usage/codecs/responses.js +20 -0
  360. package/dist/response/usage/codecs/responses.js.map +1 -0
  361. package/dist/response/usage/estimate.cjs +23 -0
  362. package/dist/response/usage/estimate.cjs.map +1 -0
  363. package/dist/response/usage/estimate.js +21 -0
  364. package/dist/response/usage/estimate.js.map +1 -0
  365. package/dist/response/usage/fields.cjs +72 -0
  366. package/dist/response/usage/fields.cjs.map +1 -0
  367. package/dist/response/usage/fields.js +70 -0
  368. package/dist/response/usage/fields.js.map +1 -0
  369. package/dist/response/usage/recording.cjs +52 -0
  370. package/dist/response/usage/recording.cjs.map +1 -0
  371. package/dist/response/usage/recording.js +52 -0
  372. package/dist/response/usage/recording.js.map +1 -0
  373. package/dist/responses.cjs +304 -196
  374. package/dist/responses.cjs.map +1 -1
  375. package/dist/responses.d.cts.map +1 -1
  376. package/dist/responses.d.ts.map +1 -1
  377. package/dist/responses.js +303 -195
  378. package/dist/responses.js.map +1 -1
  379. package/dist/route-registry.cjs +45 -0
  380. package/dist/route-registry.cjs.map +1 -1
  381. package/dist/route-registry.d.cts.map +1 -1
  382. package/dist/route-registry.d.ts.map +1 -1
  383. package/dist/route-registry.js +41 -1
  384. package/dist/route-registry.js.map +1 -1
  385. package/dist/router.cjs +24 -4
  386. package/dist/router.cjs.map +1 -1
  387. package/dist/router.d.cts +7 -1
  388. package/dist/router.d.cts.map +1 -1
  389. package/dist/router.d.ts +7 -1
  390. package/dist/router.d.ts.map +1 -1
  391. package/dist/router.js +24 -5
  392. package/dist/router.js.map +1 -1
  393. package/dist/search.cjs +13 -11
  394. package/dist/search.cjs.map +1 -1
  395. package/dist/search.js +12 -10
  396. package/dist/search.js.map +1 -1
  397. package/dist/server.cjs +293 -248
  398. package/dist/server.cjs.map +1 -1
  399. package/dist/server.d.cts.map +1 -1
  400. package/dist/server.d.ts.map +1 -1
  401. package/dist/server.js +294 -249
  402. package/dist/server.js.map +1 -1
  403. package/dist/speech.cjs +20 -18
  404. package/dist/speech.cjs.map +1 -1
  405. package/dist/speech.d.cts.map +1 -1
  406. package/dist/speech.d.ts.map +1 -1
  407. package/dist/speech.js +19 -17
  408. package/dist/speech.js.map +1 -1
  409. package/dist/sse-writer.cjs +56 -30
  410. package/dist/sse-writer.cjs.map +1 -1
  411. package/dist/sse-writer.d.cts +0 -1
  412. package/dist/sse-writer.d.cts.map +1 -1
  413. package/dist/sse-writer.d.ts +0 -1
  414. package/dist/sse-writer.d.ts.map +1 -1
  415. package/dist/sse-writer.js +55 -31
  416. package/dist/sse-writer.js.map +1 -1
  417. package/dist/stream-collapse.cjs +118 -11
  418. package/dist/stream-collapse.cjs.map +1 -1
  419. package/dist/stream-collapse.d.cts +10 -9
  420. package/dist/stream-collapse.d.cts.map +1 -1
  421. package/dist/stream-collapse.d.ts +10 -9
  422. package/dist/stream-collapse.d.ts.map +1 -1
  423. package/dist/stream-collapse.js +118 -11
  424. package/dist/stream-collapse.js.map +1 -1
  425. package/dist/transcription.cjs +31 -43
  426. package/dist/transcription.cjs.map +1 -1
  427. package/dist/transcription.d.cts.map +1 -1
  428. package/dist/transcription.d.ts.map +1 -1
  429. package/dist/transcription.js +31 -43
  430. package/dist/transcription.js.map +1 -1
  431. package/dist/types.cjs.map +1 -1
  432. package/dist/types.d.cts +231 -9
  433. package/dist/types.d.cts.map +1 -1
  434. package/dist/types.d.ts +231 -9
  435. package/dist/types.d.ts.map +1 -1
  436. package/dist/types.js.map +1 -1
  437. package/dist/vector-mock.cjs +3 -8
  438. package/dist/vector-mock.cjs.map +1 -1
  439. package/dist/vector-mock.d.cts.map +1 -1
  440. package/dist/vector-mock.d.ts.map +1 -1
  441. package/dist/vector-mock.js +3 -8
  442. package/dist/vector-mock.js.map +1 -1
  443. package/dist/vector-stores.cjs +2 -4
  444. package/dist/vector-stores.cjs.map +1 -1
  445. package/dist/vector-stores.d.cts.map +1 -1
  446. package/dist/vector-stores.d.ts.map +1 -1
  447. package/dist/vector-stores.js +2 -4
  448. package/dist/vector-stores.js.map +1 -1
  449. package/dist/veo-video.cjs +16 -14
  450. package/dist/veo-video.cjs.map +1 -1
  451. package/dist/veo-video.js +10 -8
  452. package/dist/veo-video.js.map +1 -1
  453. package/dist/video.cjs +21 -19
  454. package/dist/video.cjs.map +1 -1
  455. package/dist/video.d.cts.map +1 -1
  456. package/dist/video.d.ts.map +1 -1
  457. package/dist/video.js +20 -18
  458. package/dist/video.js.map +1 -1
  459. package/dist/ws-framing.cjs +12 -6
  460. package/dist/ws-framing.cjs.map +1 -1
  461. package/dist/ws-framing.d.cts +2 -0
  462. package/dist/ws-framing.d.cts.map +1 -1
  463. package/dist/ws-framing.d.ts +2 -0
  464. package/dist/ws-framing.d.ts.map +1 -1
  465. package/dist/ws-framing.js +12 -6
  466. package/dist/ws-framing.js.map +1 -1
  467. package/dist/ws-gemini-live.cjs +131 -96
  468. package/dist/ws-gemini-live.cjs.map +1 -1
  469. package/dist/ws-gemini-live.d.cts +0 -1
  470. package/dist/ws-gemini-live.d.cts.map +1 -1
  471. package/dist/ws-gemini-live.d.ts +0 -1
  472. package/dist/ws-gemini-live.d.ts.map +1 -1
  473. package/dist/ws-gemini-live.js +130 -95
  474. package/dist/ws-gemini-live.js.map +1 -1
  475. package/dist/ws-live.cjs +6 -5
  476. package/dist/ws-live.cjs.map +1 -1
  477. package/dist/ws-live.js +5 -4
  478. package/dist/ws-live.js.map +1 -1
  479. package/dist/ws-realtime.cjs +108 -124
  480. package/dist/ws-realtime.cjs.map +1 -1
  481. package/dist/ws-realtime.d.cts.map +1 -1
  482. package/dist/ws-realtime.d.ts.map +1 -1
  483. package/dist/ws-realtime.js +105 -121
  484. package/dist/ws-realtime.js.map +1 -1
  485. package/dist/ws-responses.cjs +80 -59
  486. package/dist/ws-responses.cjs.map +1 -1
  487. package/dist/ws-responses.d.cts.map +1 -1
  488. package/dist/ws-responses.d.ts.map +1 -1
  489. package/dist/ws-responses.js +79 -58
  490. package/dist/ws-responses.js.map +1 -1
  491. package/package.json +4 -1
  492. package/skills/write-fixtures/SKILL.md +57 -16
@@ -1,12 +1,26 @@
1
- import { extractOverrides, flattenHeaders, generateToolCallId, getContext, getTestId, isCombinedFixtureResponse, isErrorResponse, isJsonObject, isTextResponse, isToolCallResponse, prepareOpenAIChatMisbehavior, requireEmittedFunctionToolCalls, resolveFixtureBlockOutcome, resolveOpenAIChatMisbehaviorUsage, resolveResponse, resolveStrictMode, servedToolArgs, strictNoMatchLogLine, strictNoMatchMessage, strictOverrideField } 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, generateToolCallId, getContext, getTestId, isCombinedFixtureResponse, isErrorResponse, isJsonObject, isRawResponse, isTextResponse, isToolCallResponse, prepareOpenAIChatMisbehavior, requireEmittedFunctionToolCalls, resolveFixtureBlockOutcome, resolveOpenAIChatMisbehaviorUsage, resolveResponse, servedToolArgs, strictNoMatchLogLine, strictNoMatchMessage } from "./helpers.js";
4
+ import { sseCodec, writeErrorResponse } from "./sse-writer.js";
3
5
  import { applyChaosAsync } from "./chaos.js";
4
6
  import { planMisbehavior, recordMisbehaviorOutcome } from "./misbehavior.js";
5
7
  import { matchFixtureDiagnostic } from "./router.js";
6
8
  import { proxyAndRecord } from "./recorder.js";
7
- import { createInterruptionSignal } from "./interruption.js";
9
+ import { misbehaviorPayloadLength, servedPayloadLength } from "./response/timing.js";
10
+ import { deliverJson, deliverStream } from "./response/deliver.js";
11
+ import { proxyInterruption, withHangUpDetection } from "./response/proxy.js";
12
+ import { serveRawResponse } from "./response/raw.js";
13
+ import { render } from "./response/usage/codecs/interactions.js";
8
14
 
9
15
  //#region src/gemini-interactions.ts
16
+ /**
17
+ * Google Gemini Interactions API support.
18
+ *
19
+ * Translates incoming Interactions requests into the ChatCompletionRequest
20
+ * format used by the fixture router, and converts fixture responses back
21
+ * into the Gemini Interactions format — either a single JSON response or
22
+ * an SSE stream with event_type-based framing.
23
+ */
10
24
  /** Step types whose payload is a tool/agent result keyed by call_id. */
11
25
  const STEP_RESULT_TYPES = new Set([
12
26
  "function_result",
@@ -185,18 +199,7 @@ function nextInteractionId() {
185
199
  return `aimock-int-${interactionCounter++}`;
186
200
  }
187
201
  function interactionsUsage(overrides) {
188
- if (!overrides?.usage) return {
189
- total_input_tokens: 0,
190
- total_output_tokens: 0,
191
- total_tokens: 0
192
- };
193
- const input = overrides.usage.input_tokens ?? overrides.usage.prompt_tokens ?? overrides.usage.promptTokenCount ?? 0;
194
- const output = overrides.usage.output_tokens ?? overrides.usage.completion_tokens ?? overrides.usage.candidatesTokenCount ?? 0;
195
- return {
196
- total_input_tokens: input,
197
- total_output_tokens: output,
198
- total_tokens: overrides.usage.total_tokens ?? overrides.usage.totalTokenCount ?? input + output
199
- };
202
+ return render(overrides);
200
203
  }
201
204
  function buildInteractionsTextResponse(content, model, interactionId, overrides) {
202
205
  return {
@@ -277,12 +280,6 @@ function buildInteractionsContentWithToolCallsResponse(content, toolCalls, model
277
280
  usage: interactionsUsage(overrides)
278
281
  };
279
282
  }
280
- function buildInteractionsErrorResponse(message, code) {
281
- return { error: {
282
- code: code ?? "INVALID_ARGUMENT",
283
- message
284
- } };
285
- }
286
283
  let eventIdCounter = 0;
287
284
  function resetEventIdCounter() {
288
285
  eventIdCounter = 0;
@@ -495,33 +492,10 @@ function buildInteractionsContentWithToolCallsSSEEvents(content, toolCalls, inte
495
492
  });
496
493
  return events;
497
494
  }
498
- async function writeGeminiInteractionsSSEStream(res, events, optionsOrLatency) {
499
- const opts = typeof optionsOrLatency === "number" ? { latency: optionsOrLatency } : optionsOrLatency ?? {};
500
- const latency = opts.latency ?? 0;
501
- const profile = opts.streamingProfile;
502
- const { recordedTimings, replaySpeed } = opts;
503
- const signal = opts.signal;
504
- const onChunkSent = opts.onChunkSent;
505
- if (res.writableEnded) return true;
506
- res.setHeader("Content-Type", "text/event-stream");
507
- res.setHeader("Cache-Control", "no-cache");
508
- res.setHeader("Connection", "keep-alive");
509
- let chunkIndex = 0;
510
- for (const event of events) {
511
- const chunkDelay = calculateDelay(chunkIndex, profile, latency, recordedTimings, replaySpeed);
512
- if (chunkDelay > 0) await delay(chunkDelay, signal);
513
- if (signal?.aborted) return false;
514
- if (res.writableEnded) return true;
515
- res.write(`data: ${JSON.stringify(event)}\n\n`);
516
- if (event.event_type === "step.delta") {
517
- onChunkSent?.();
518
- chunkIndex++;
519
- }
520
- if (signal?.aborted) return false;
521
- }
522
- if (!res.writableEnded) res.end();
523
- return true;
524
- }
495
+ const interactionsCodec = {
496
+ ...sseCodec({ done: false }),
497
+ counts: (event) => event.event_type === "step.delta"
498
+ };
525
499
  function prepareInteractionsMisbehavior(plan, streaming) {
526
500
  if (!streaming && plan.summary.fault === "stop-length-mid-tool") {
527
501
  const response = plan.response;
@@ -570,7 +544,10 @@ async function handleGeminiInteractions(req, res, raw, fixtures, journal, defaul
570
544
  fixture: null
571
545
  }
572
546
  });
573
- writeErrorResponse(res, 400, JSON.stringify(buildInteractionsErrorResponse(`Malformed JSON body: ${detail}`, "INVALID_ARGUMENT")));
547
+ writeErrorResponse(res, 400, renderError("interactions", "validation", {
548
+ message: `Malformed JSON body: ${detail}`,
549
+ code: "INVALID_ARGUMENT"
550
+ }).body);
574
551
  return;
575
552
  }
576
553
  if (!isJsonObject(interactionsReq)) {
@@ -584,7 +561,10 @@ async function handleGeminiInteractions(req, res, raw, fixtures, journal, defaul
584
561
  fixture: null
585
562
  }
586
563
  });
587
- writeErrorResponse(res, 400, JSON.stringify(buildInteractionsErrorResponse("Request body must be a JSON object", "INVALID_ARGUMENT")));
564
+ writeErrorResponse(res, 400, renderError("interactions", "validation", {
565
+ message: "Request body must be a JSON object",
566
+ code: "INVALID_ARGUMENT"
567
+ }).body);
588
568
  return;
589
569
  }
590
570
  const validationError = validateInteractionsInput(interactionsReq.input) ?? validateInteractionsTools(interactionsReq.tools);
@@ -599,7 +579,10 @@ async function handleGeminiInteractions(req, res, raw, fixtures, journal, defaul
599
579
  fixture: null
600
580
  }
601
581
  });
602
- writeErrorResponse(res, 400, JSON.stringify(buildInteractionsErrorResponse(validationError, "INVALID_ARGUMENT")));
582
+ writeErrorResponse(res, 400, renderError("interactions", "validation", {
583
+ message: validationError,
584
+ code: "INVALID_ARGUMENT"
585
+ }).body);
603
586
  return;
604
587
  }
605
588
  const completionReq = geminiInteractionsToCompletionRequest(interactionsReq);
@@ -608,7 +591,7 @@ async function handleGeminiInteractions(req, res, raw, fixtures, journal, defaul
608
591
  const streaming = interactionsReq.stream !== false;
609
592
  const model = completionReq.model;
610
593
  const testId = getTestId(req);
611
- const { fixture, skippedBySequenceOrTurn } = matchFixtureDiagnostic(fixtures, completionReq, journal.getFixtureMatchCountsForTest(testId), defaults.requestTransform);
594
+ const { fixture, skippedBySequenceOrTurn } = matchFixtureDiagnostic(fixtures, completionReq, journal.getFixtureMatchCountsForTest(testId), defaults.requestTransform, { wire: "gemini-interactions" });
612
595
  if (fixture) journal.incrementFixtureMatchCount(fixture, fixtures, testId);
613
596
  if (await applyChaosAsync(res, fixture, defaults.chaos, req.headers, req.url, journal, {
614
597
  method: req.method ?? "POST",
@@ -617,7 +600,8 @@ async function handleGeminiInteractions(req, res, raw, fixtures, journal, defaul
617
600
  body: completionReq
618
601
  }, fixture ? "fixture" : "proxy", defaults.registry, defaults.logger)) return;
619
602
  if (!fixture) {
620
- if (resolveStrictMode(defaults.strict, req.headers)) {
603
+ const decisions = resolveRequestDecisions(defaults.strict, req.headers);
604
+ if (decisions.fixtureMiss) {
621
605
  const strictStatus = 503;
622
606
  const strictMessage = strictNoMatchMessage(skippedBySequenceOrTurn);
623
607
  logger.error(strictNoMatchLogLine(req.method ?? "POST", urlPath, skippedBySequenceOrTurn));
@@ -632,11 +616,14 @@ async function handleGeminiInteractions(req, res, raw, fixtures, journal, defaul
632
616
  ...strictOverrideField(defaults.strict, req.headers)
633
617
  }
634
618
  });
635
- writeErrorResponse(res, strictStatus, JSON.stringify(buildInteractionsErrorResponse(strictMessage, "UNAVAILABLE")));
619
+ writeErrorResponse(res, strictStatus, renderError("interactions", "strict-miss", {
620
+ message: strictMessage,
621
+ code: "UNAVAILABLE"
622
+ }).body);
636
623
  return;
637
624
  }
638
- if (defaults.record) {
639
- const outcome = await proxyAndRecord(req, res, completionReq, "gemini-interactions", urlPath, fixtures, defaults, raw);
625
+ if (decisions.upstream && defaults.record) {
626
+ const { outcome, clientHungUp } = await withHangUpDetection(req, res, () => proxyAndRecord(req, res, completionReq, "gemini-interactions", urlPath, fixtures, defaults, raw));
640
627
  if (outcome === "handled_by_hook") return;
641
628
  if (outcome !== "not_configured") {
642
629
  journal.add({
@@ -647,7 +634,8 @@ async function handleGeminiInteractions(req, res, raw, fixtures, journal, defaul
647
634
  response: {
648
635
  status: res.statusCode ?? 200,
649
636
  fixture: null,
650
- source: "proxy"
637
+ source: "proxy",
638
+ ...proxyInterruption(res, clientHungUp)
651
639
  }
652
640
  });
653
641
  return;
@@ -664,7 +652,10 @@ async function handleGeminiInteractions(req, res, raw, fixtures, journal, defaul
664
652
  ...strictOverrideField(defaults.strict, req.headers)
665
653
  }
666
654
  });
667
- writeErrorResponse(res, 404, JSON.stringify(buildInteractionsErrorResponse("No fixture matched", "NOT_FOUND")));
655
+ writeErrorResponse(res, 404, renderError("interactions", "fixture-miss", {
656
+ message: "No fixture matched",
657
+ code: "NOT_FOUND"
658
+ }).body);
668
659
  return;
669
660
  }
670
661
  let response = await resolveResponse(fixture, completionReq);
@@ -696,7 +687,10 @@ async function handleGeminiInteractions(req, res, raw, fixtures, journal, defaul
696
687
  testId
697
688
  });
698
689
  if (!misbehavior.summary?.evaluations.some((evaluation) => evaluation.outcome === "error")) logger.error(`${req.method ?? "POST"} ${urlPath}: ${misbehavior.message}`);
699
- writeErrorResponse(res, misbehavior.status, JSON.stringify(buildInteractionsErrorResponse(misbehavior.message, misbehavior.code)));
690
+ writeErrorResponse(res, misbehavior.status, renderError("interactions", "misbehavior", {
691
+ message: misbehavior.message,
692
+ code: misbehavior.code
693
+ }).body);
700
694
  return;
701
695
  }
702
696
  if (misbehavior.kind === "applied") {
@@ -707,6 +701,42 @@ async function handleGeminiInteractions(req, res, raw, fixtures, journal, defaul
707
701
  const latency = fixture.latency ?? defaults.latency;
708
702
  const chunkSize = Math.max(1, fixture.chunkSize ?? defaults.chunkSize);
709
703
  const replaySpeed = fixture.replaySpeed ?? defaults.replaySpeed;
704
+ const streamTiming = {
705
+ latency,
706
+ streamingProfile: fixture.streamingProfile,
707
+ recordedTimings: fixture.recordedTimings,
708
+ replaySpeed
709
+ };
710
+ const applied = misbehavior.kind === "applied" ? misbehavior : void 0;
711
+ const jsonOpts = () => ({
712
+ surface: "other",
713
+ payloadLength: applied ? misbehaviorPayloadLength(applied, void 0) : servedPayloadLength(response),
714
+ chunkSize,
715
+ recordedTimings: fixture.recordedTimings,
716
+ duplicateId: !!applied?.duplicateId,
717
+ replaySpeed
718
+ });
719
+ const markIncomplete = (body) => applied?.summary.fault === "stop-length-mid-tool" ? {
720
+ ...body,
721
+ status: "incomplete"
722
+ } : body;
723
+ if (isRawResponse(response)) {
724
+ await serveRawResponse({
725
+ wire: "gemini-interactions",
726
+ stream: streaming,
727
+ req,
728
+ res,
729
+ fixture,
730
+ response,
731
+ body: completionReq,
732
+ journal,
733
+ defaults,
734
+ testId,
735
+ misbehaviorSummary: misbehavior.summary,
736
+ errorWire: "interactions"
737
+ });
738
+ return;
739
+ }
710
740
  if (isErrorResponse(response)) {
711
741
  const status = response.status ?? 500;
712
742
  recordMisbehaviorOutcome({
@@ -724,7 +754,10 @@ async function handleGeminiInteractions(req, res, raw, fixtures, journal, defaul
724
754
  defaults,
725
755
  testId
726
756
  });
727
- writeErrorResponse(res, status, JSON.stringify(buildInteractionsErrorResponse(response.error.message, response.error.type ?? "ERROR")), { retryAfter: response.retryAfter });
757
+ writeErrorResponse(res, status, renderError("interactions", "fixture", {
758
+ message: response.error.message,
759
+ code: response.error.type ?? "ERROR"
760
+ }).body, { retryAfter: response.retryAfter });
728
761
  return;
729
762
  }
730
763
  if (misbehavior.kind === "applied" && misbehavior.summary.fault === "reasoning-only") {
@@ -745,15 +778,11 @@ async function handleGeminiInteractions(req, res, raw, fixtures, journal, defaul
745
778
  testId
746
779
  });
747
780
  const interactionId = nextInteractionId();
748
- const usage = {
749
- ...interactionsUsage({ usage: appliedUsage }),
750
- total_output_tokens: 0,
751
- total_thought_tokens: appliedUsage?.completion_tokens ?? 0
752
- };
781
+ const usage = render({ usage: appliedUsage }, "applied-reasoning-only");
753
782
  if (!streaming) {
754
783
  const overrides = isTextResponse(response) || isToolCallResponse(response) || isCombinedFixtureResponse(response) ? extractOverrides(response) : void 0;
755
- res.writeHead(200, { "Content-Type": "application/json" });
756
- res.end(JSON.stringify({
784
+ const reasoning = misbehavior.reasoning ?? "";
785
+ await deliverJson(res, journalEntry, fixture, () => ({
757
786
  id: interactionId,
758
787
  model: overrides?.model ?? model,
759
788
  status: "incomplete",
@@ -762,14 +791,14 @@ async function handleGeminiInteractions(req, res, raw, fixtures, journal, defaul
762
791
  signature: "",
763
792
  summary: [{
764
793
  type: "text",
765
- text: misbehavior.reasoning ?? ""
794
+ text: reasoning
766
795
  }]
767
796
  }],
768
797
  usage
769
- }));
798
+ }), jsonOpts());
770
799
  return;
771
800
  }
772
- const events = [
801
+ await deliverStream(res, journalEntry, fixture, interactionsCodec, [
773
802
  {
774
803
  event_type: "interaction.created",
775
804
  interaction: {
@@ -810,21 +839,7 @@ async function handleGeminiInteractions(req, res, raw, fixtures, journal, defaul
810
839
  },
811
840
  event_id: nextEventId()
812
841
  }
813
- ];
814
- const interruption = createInterruptionSignal(fixture);
815
- if (!await writeGeminiInteractionsSSEStream(res, events, {
816
- latency,
817
- streamingProfile: fixture.streamingProfile,
818
- recordedTimings: fixture.recordedTimings,
819
- replaySpeed,
820
- signal: interruption?.signal,
821
- onChunkSent: interruption?.tick
822
- })) {
823
- if (!res.writableEnded) res.destroy();
824
- journalEntry.response.interrupted = true;
825
- journalEntry.response.interruptReason = interruption?.reason();
826
- }
827
- interruption?.cleanup();
842
+ ], streamTiming);
828
843
  return;
829
844
  }
830
845
  if (isCombinedFixtureResponse(response)) {
@@ -852,29 +867,10 @@ async function handleGeminiInteractions(req, res, raw, fixtures, journal, defaul
852
867
  const functionToolCalls = requireEmittedFunctionToolCalls(response, "Gemini Interactions");
853
868
  const interactionId = nextInteractionId();
854
869
  if (!streaming) {
855
- const body = buildInteractionsContentWithToolCallsResponse(response.content ?? "", functionToolCalls, model, interactionId, logger, overrides, response.blocks);
856
- res.writeHead(200, { "Content-Type": "application/json" });
857
- res.end(JSON.stringify(misbehavior.kind === "applied" && misbehavior.summary.fault === "stop-length-mid-tool" ? {
858
- ...body,
859
- status: "incomplete"
860
- } : body));
861
- } else {
862
- const events = buildInteractionsContentWithToolCallsSSEEvents(response.content ?? "", functionToolCalls, interactionId, chunkSize, logger, overrides, response.blocks);
863
- const interruption = createInterruptionSignal(fixture);
864
- if (!await writeGeminiInteractionsSSEStream(res, finalizeInteractionsMisbehavior(events, misbehavior), {
865
- latency,
866
- streamingProfile: fixture.streamingProfile,
867
- recordedTimings: fixture.recordedTimings,
868
- replaySpeed,
869
- signal: interruption?.signal,
870
- onChunkSent: interruption?.tick
871
- })) {
872
- if (!res.writableEnded) res.destroy();
873
- journalEntry.response.interrupted = true;
874
- journalEntry.response.interruptReason = interruption?.reason();
875
- }
876
- interruption?.cleanup();
877
- }
870
+ const content = response.content ?? "";
871
+ const blocks = response.blocks;
872
+ await deliverJson(res, journalEntry, fixture, () => markIncomplete(buildInteractionsContentWithToolCallsResponse(content, functionToolCalls, model, interactionId, logger, overrides, blocks)), jsonOpts());
873
+ } else await deliverStream(res, journalEntry, fixture, interactionsCodec, finalizeInteractionsMisbehavior(buildInteractionsContentWithToolCallsSSEEvents(response.content ?? "", functionToolCalls, interactionId, chunkSize, logger, overrides, response.blocks), misbehavior), streamTiming);
878
874
  return;
879
875
  }
880
876
  if (isTextResponse(response)) {
@@ -901,29 +897,9 @@ async function handleGeminiInteractions(req, res, raw, fixtures, journal, defaul
901
897
  });
902
898
  const interactionId = nextInteractionId();
903
899
  if (!streaming) {
904
- const body = buildInteractionsTextResponse(response.content, model, interactionId, overrides);
905
- res.writeHead(200, { "Content-Type": "application/json" });
906
- res.end(JSON.stringify(misbehavior.kind === "applied" && misbehavior.summary.fault === "stop-length-mid-tool" ? {
907
- ...body,
908
- status: "incomplete"
909
- } : body));
910
- } else {
911
- const events = buildInteractionsTextSSEEvents(response.content, interactionId, chunkSize, overrides);
912
- const interruption = createInterruptionSignal(fixture);
913
- if (!await writeGeminiInteractionsSSEStream(res, finalizeInteractionsMisbehavior(events, misbehavior), {
914
- latency,
915
- streamingProfile: fixture.streamingProfile,
916
- recordedTimings: fixture.recordedTimings,
917
- replaySpeed,
918
- signal: interruption?.signal,
919
- onChunkSent: interruption?.tick
920
- })) {
921
- if (!res.writableEnded) res.destroy();
922
- journalEntry.response.interrupted = true;
923
- journalEntry.response.interruptReason = interruption?.reason();
924
- }
925
- interruption?.cleanup();
926
- }
900
+ const content = response.content;
901
+ await deliverJson(res, journalEntry, fixture, () => markIncomplete(buildInteractionsTextResponse(content, model, interactionId, overrides)), jsonOpts());
902
+ } else await deliverStream(res, journalEntry, fixture, interactionsCodec, finalizeInteractionsMisbehavior(buildInteractionsTextSSEEvents(response.content, interactionId, chunkSize, overrides), misbehavior), streamTiming);
927
903
  return;
928
904
  }
929
905
  if (isToolCallResponse(response)) {
@@ -950,30 +926,8 @@ async function handleGeminiInteractions(req, res, raw, fixtures, journal, defaul
950
926
  });
951
927
  const functionToolCalls = requireEmittedFunctionToolCalls(response, "Gemini Interactions");
952
928
  const interactionId = nextInteractionId();
953
- if (!streaming) {
954
- const body = buildInteractionsToolCallResponse(functionToolCalls, model, interactionId, logger, overrides);
955
- res.writeHead(200, { "Content-Type": "application/json" });
956
- res.end(JSON.stringify(misbehavior.kind === "applied" && misbehavior.summary.fault === "stop-length-mid-tool" ? {
957
- ...body,
958
- status: "incomplete"
959
- } : body));
960
- } else {
961
- const events = buildInteractionsToolCallSSEEvents(functionToolCalls, interactionId, logger, overrides);
962
- const interruption = createInterruptionSignal(fixture);
963
- if (!await writeGeminiInteractionsSSEStream(res, finalizeInteractionsMisbehavior(events, misbehavior), {
964
- latency,
965
- streamingProfile: fixture.streamingProfile,
966
- recordedTimings: fixture.recordedTimings,
967
- replaySpeed,
968
- signal: interruption?.signal,
969
- onChunkSent: interruption?.tick
970
- })) {
971
- if (!res.writableEnded) res.destroy();
972
- journalEntry.response.interrupted = true;
973
- journalEntry.response.interruptReason = interruption?.reason();
974
- }
975
- interruption?.cleanup();
976
- }
929
+ if (!streaming) await deliverJson(res, journalEntry, fixture, () => markIncomplete(buildInteractionsToolCallResponse(functionToolCalls, model, interactionId, logger, overrides)), jsonOpts());
930
+ else await deliverStream(res, journalEntry, fixture, interactionsCodec, finalizeInteractionsMisbehavior(buildInteractionsToolCallSSEEvents(functionToolCalls, interactionId, logger, overrides), misbehavior), streamTiming);
977
931
  return;
978
932
  }
979
933
  recordMisbehaviorOutcome({
@@ -991,7 +945,10 @@ async function handleGeminiInteractions(req, res, raw, fixtures, journal, defaul
991
945
  defaults,
992
946
  testId
993
947
  });
994
- writeErrorResponse(res, 500, JSON.stringify(buildInteractionsErrorResponse("Fixture response did not match any known type", "INTERNAL")));
948
+ writeErrorResponse(res, 500, renderError("interactions", "unknown-response", {
949
+ message: "Fixture response did not match any known type",
950
+ code: "INTERNAL"
951
+ }).body);
995
952
  }
996
953
 
997
954
  //#endregion