@copilotkit/aimock 1.45.0 → 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 (426) hide show
  1. package/.claude-plugin/marketplace.json +1 -1
  2. package/.claude-plugin/plugin.json +1 -1
  3. package/CHANGELOG.md +24 -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.ts.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-fakes.d.cts.map +1 -1
  177. package/dist/mcp-handler.cjs +14 -4
  178. package/dist/mcp-handler.cjs.map +1 -1
  179. package/dist/mcp-handler.js +14 -4
  180. package/dist/mcp-handler.js.map +1 -1
  181. package/dist/mcp-recorder.cjs +2 -1
  182. package/dist/mcp-recorder.cjs.map +1 -1
  183. package/dist/mcp-recorder.js +3 -2
  184. package/dist/mcp-recorder.js.map +1 -1
  185. package/dist/messages.cjs +111 -96
  186. package/dist/messages.cjs.map +1 -1
  187. package/dist/messages.d.cts.map +1 -1
  188. package/dist/messages.d.ts.map +1 -1
  189. package/dist/messages.js +109 -95
  190. package/dist/messages.js.map +1 -1
  191. package/dist/metrics.cjs +5 -2
  192. package/dist/metrics.cjs.map +1 -1
  193. package/dist/metrics.d.cts.map +1 -1
  194. package/dist/metrics.d.ts.map +1 -1
  195. package/dist/metrics.js +6 -3
  196. package/dist/metrics.js.map +1 -1
  197. package/dist/model-utils.cjs +1 -0
  198. package/dist/model-utils.cjs.map +1 -1
  199. package/dist/model-utils.js +1 -1
  200. package/dist/model-utils.js.map +1 -1
  201. package/dist/moderation.cjs +15 -12
  202. package/dist/moderation.cjs.map +1 -1
  203. package/dist/moderation.js +14 -11
  204. package/dist/moderation.js.map +1 -1
  205. package/dist/ollama.cjs +128 -68
  206. package/dist/ollama.cjs.map +1 -1
  207. package/dist/ollama.d.cts.map +1 -1
  208. package/dist/ollama.d.ts.map +1 -1
  209. package/dist/ollama.js +124 -64
  210. package/dist/ollama.js.map +1 -1
  211. package/dist/openapi.cjs +323 -3
  212. package/dist/openapi.cjs.map +1 -1
  213. package/dist/openapi.d.cts.map +1 -1
  214. package/dist/openapi.d.ts.map +1 -1
  215. package/dist/openapi.js +324 -4
  216. package/dist/openapi.js.map +1 -1
  217. package/dist/openrouter-chat.cjs +11 -155
  218. package/dist/openrouter-chat.cjs.map +1 -1
  219. package/dist/openrouter-chat.js +11 -155
  220. package/dist/openrouter-chat.js.map +1 -1
  221. package/dist/openrouter-video.cjs +76 -71
  222. package/dist/openrouter-video.cjs.map +1 -1
  223. package/dist/openrouter-video.d.cts.map +1 -1
  224. package/dist/openrouter-video.d.ts.map +1 -1
  225. package/dist/openrouter-video.js +63 -58
  226. package/dist/openrouter-video.js.map +1 -1
  227. package/dist/recorder.cjs +176 -95
  228. package/dist/recorder.cjs.map +1 -1
  229. package/dist/recorder.d.cts.map +1 -1
  230. package/dist/recorder.d.ts.map +1 -1
  231. package/dist/recorder.js +176 -95
  232. package/dist/recorder.js.map +1 -1
  233. package/dist/rerank.cjs +13 -11
  234. package/dist/rerank.cjs.map +1 -1
  235. package/dist/rerank.js +12 -10
  236. package/dist/rerank.js.map +1 -1
  237. package/dist/response/catalog/anthropic-page.cjs +39 -0
  238. package/dist/response/catalog/anthropic-page.cjs.map +1 -0
  239. package/dist/response/catalog/anthropic-page.js +38 -0
  240. package/dist/response/catalog/anthropic-page.js.map +1 -0
  241. package/dist/response/catalog/collect.cjs +61 -0
  242. package/dist/response/catalog/collect.cjs.map +1 -0
  243. package/dist/response/catalog/collect.js +59 -0
  244. package/dist/response/catalog/collect.js.map +1 -0
  245. package/dist/response/catalog/gemini-page.cjs +25 -0
  246. package/dist/response/catalog/gemini-page.cjs.map +1 -0
  247. package/dist/response/catalog/gemini-page.js +24 -0
  248. package/dist/response/catalog/gemini-page.js.map +1 -0
  249. package/dist/response/catalog/render.cjs +182 -0
  250. package/dist/response/catalog/render.cjs.map +1 -0
  251. package/dist/response/catalog/render.js +171 -0
  252. package/dist/response/catalog/render.js.map +1 -0
  253. package/dist/response/errors.cjs +225 -0
  254. package/dist/response/errors.cjs.map +1 -0
  255. package/dist/response/errors.js +224 -0
  256. package/dist/response/errors.js.map +1 -0
  257. package/dist/response/finish.cjs +39 -0
  258. package/dist/response/finish.cjs.map +1 -0
  259. package/dist/response/finish.js +35 -0
  260. package/dist/response/finish.js.map +1 -0
  261. package/dist/response/policy.cjs +126 -0
  262. package/dist/response/policy.cjs.map +1 -0
  263. package/dist/response/policy.js +120 -0
  264. package/dist/response/policy.js.map +1 -0
  265. package/dist/response/profiles.cjs +69 -0
  266. package/dist/response/profiles.cjs.map +1 -0
  267. package/dist/response/profiles.js +65 -0
  268. package/dist/response/profiles.js.map +1 -0
  269. package/dist/response/usage/codecs/anthropic.cjs +52 -0
  270. package/dist/response/usage/codecs/anthropic.cjs.map +1 -0
  271. package/dist/response/usage/codecs/anthropic.js +50 -0
  272. package/dist/response/usage/codecs/anthropic.js.map +1 -0
  273. package/dist/response/usage/codecs/cohere.cjs +36 -0
  274. package/dist/response/usage/codecs/cohere.cjs.map +1 -0
  275. package/dist/response/usage/codecs/cohere.js +35 -0
  276. package/dist/response/usage/codecs/cohere.js.map +1 -0
  277. package/dist/response/usage/codecs/converse.cjs +16 -0
  278. package/dist/response/usage/codecs/converse.cjs.map +1 -0
  279. package/dist/response/usage/codecs/converse.js +15 -0
  280. package/dist/response/usage/codecs/converse.js.map +1 -0
  281. package/dist/response/usage/codecs/gemini.cjs +31 -0
  282. package/dist/response/usage/codecs/gemini.cjs.map +1 -0
  283. package/dist/response/usage/codecs/gemini.js +31 -0
  284. package/dist/response/usage/codecs/gemini.js.map +1 -0
  285. package/dist/response/usage/codecs/interactions.cjs +22 -0
  286. package/dist/response/usage/codecs/interactions.cjs.map +1 -0
  287. package/dist/response/usage/codecs/interactions.js +21 -0
  288. package/dist/response/usage/codecs/interactions.js.map +1 -0
  289. package/dist/response/usage/codecs/ollama.cjs +17 -0
  290. package/dist/response/usage/codecs/ollama.cjs.map +1 -0
  291. package/dist/response/usage/codecs/ollama.js +17 -0
  292. package/dist/response/usage/codecs/ollama.js.map +1 -0
  293. package/dist/response/usage/codecs/openai.cjs +52 -0
  294. package/dist/response/usage/codecs/openai.cjs.map +1 -0
  295. package/dist/response/usage/codecs/openai.js +50 -0
  296. package/dist/response/usage/codecs/openai.js.map +1 -0
  297. package/dist/response/usage/codecs/openrouter.cjs +68 -0
  298. package/dist/response/usage/codecs/openrouter.cjs.map +1 -0
  299. package/dist/response/usage/codecs/openrouter.js +67 -0
  300. package/dist/response/usage/codecs/openrouter.js.map +1 -0
  301. package/dist/response/usage/codecs/realtime.cjs +19 -0
  302. package/dist/response/usage/codecs/realtime.cjs.map +1 -0
  303. package/dist/response/usage/codecs/realtime.js +18 -0
  304. package/dist/response/usage/codecs/realtime.js.map +1 -0
  305. package/dist/response/usage/codecs/responses.cjs +21 -0
  306. package/dist/response/usage/codecs/responses.cjs.map +1 -0
  307. package/dist/response/usage/codecs/responses.js +20 -0
  308. package/dist/response/usage/codecs/responses.js.map +1 -0
  309. package/dist/response/usage/estimate.cjs +23 -0
  310. package/dist/response/usage/estimate.cjs.map +1 -0
  311. package/dist/response/usage/estimate.js +21 -0
  312. package/dist/response/usage/estimate.js.map +1 -0
  313. package/dist/response/usage/fields.cjs +72 -0
  314. package/dist/response/usage/fields.cjs.map +1 -0
  315. package/dist/response/usage/fields.js +70 -0
  316. package/dist/response/usage/fields.js.map +1 -0
  317. package/dist/response/usage/recording.cjs +52 -0
  318. package/dist/response/usage/recording.cjs.map +1 -0
  319. package/dist/response/usage/recording.js +52 -0
  320. package/dist/response/usage/recording.js.map +1 -0
  321. package/dist/responses.cjs +45 -58
  322. package/dist/responses.cjs.map +1 -1
  323. package/dist/responses.d.cts.map +1 -1
  324. package/dist/responses.d.ts.map +1 -1
  325. package/dist/responses.js +44 -57
  326. package/dist/responses.js.map +1 -1
  327. package/dist/route-registry.cjs +45 -0
  328. package/dist/route-registry.cjs.map +1 -1
  329. package/dist/route-registry.d.cts.map +1 -1
  330. package/dist/route-registry.d.ts.map +1 -1
  331. package/dist/route-registry.js +41 -1
  332. package/dist/route-registry.js.map +1 -1
  333. package/dist/router.cjs +4 -0
  334. package/dist/router.cjs.map +1 -1
  335. package/dist/router.d.cts.map +1 -1
  336. package/dist/router.d.ts.map +1 -1
  337. package/dist/router.js +3 -0
  338. package/dist/router.js.map +1 -1
  339. package/dist/search.cjs +13 -11
  340. package/dist/search.cjs.map +1 -1
  341. package/dist/search.js +12 -10
  342. package/dist/search.js.map +1 -1
  343. package/dist/server.cjs +222 -146
  344. package/dist/server.cjs.map +1 -1
  345. package/dist/server.d.cts.map +1 -1
  346. package/dist/server.d.ts.map +1 -1
  347. package/dist/server.js +223 -147
  348. package/dist/server.js.map +1 -1
  349. package/dist/speech.cjs +20 -18
  350. package/dist/speech.cjs.map +1 -1
  351. package/dist/speech.d.cts.map +1 -1
  352. package/dist/speech.d.ts.map +1 -1
  353. package/dist/speech.js +19 -17
  354. package/dist/speech.js.map +1 -1
  355. package/dist/sse-writer.cjs +7 -0
  356. package/dist/sse-writer.cjs.map +1 -1
  357. package/dist/sse-writer.d.cts.map +1 -1
  358. package/dist/sse-writer.d.ts.map +1 -1
  359. package/dist/sse-writer.js +7 -1
  360. package/dist/sse-writer.js.map +1 -1
  361. package/dist/stream-collapse.cjs +118 -11
  362. package/dist/stream-collapse.cjs.map +1 -1
  363. package/dist/stream-collapse.d.cts +10 -9
  364. package/dist/stream-collapse.d.cts.map +1 -1
  365. package/dist/stream-collapse.d.ts +10 -9
  366. package/dist/stream-collapse.d.ts.map +1 -1
  367. package/dist/stream-collapse.js +118 -11
  368. package/dist/stream-collapse.js.map +1 -1
  369. package/dist/transcription.cjs +12 -10
  370. package/dist/transcription.cjs.map +1 -1
  371. package/dist/transcription.d.cts.map +1 -1
  372. package/dist/transcription.d.ts.map +1 -1
  373. package/dist/transcription.js +11 -9
  374. package/dist/transcription.js.map +1 -1
  375. package/dist/types.cjs.map +1 -1
  376. package/dist/types.d.cts +62 -3
  377. package/dist/types.d.cts.map +1 -1
  378. package/dist/types.d.ts +62 -3
  379. package/dist/types.d.ts.map +1 -1
  380. package/dist/types.js.map +1 -1
  381. package/dist/vector-mock.cjs +3 -8
  382. package/dist/vector-mock.cjs.map +1 -1
  383. package/dist/vector-mock.d.cts.map +1 -1
  384. package/dist/vector-mock.d.ts.map +1 -1
  385. package/dist/vector-mock.js +3 -8
  386. package/dist/vector-mock.js.map +1 -1
  387. package/dist/vector-stores.cjs +2 -4
  388. package/dist/vector-stores.cjs.map +1 -1
  389. package/dist/vector-stores.d.cts.map +1 -1
  390. package/dist/vector-stores.d.ts.map +1 -1
  391. package/dist/vector-stores.js +2 -4
  392. package/dist/vector-stores.js.map +1 -1
  393. package/dist/veo-video.cjs +16 -14
  394. package/dist/veo-video.cjs.map +1 -1
  395. package/dist/veo-video.js +10 -8
  396. package/dist/veo-video.js.map +1 -1
  397. package/dist/video.cjs +21 -19
  398. package/dist/video.cjs.map +1 -1
  399. package/dist/video.d.cts.map +1 -1
  400. package/dist/video.d.ts.map +1 -1
  401. package/dist/video.js +20 -18
  402. package/dist/video.js.map +1 -1
  403. package/dist/ws-gemini-live.cjs +11 -3
  404. package/dist/ws-gemini-live.cjs.map +1 -1
  405. package/dist/ws-gemini-live.d.cts +0 -1
  406. package/dist/ws-gemini-live.d.cts.map +1 -1
  407. package/dist/ws-gemini-live.d.ts +0 -1
  408. package/dist/ws-gemini-live.d.ts.map +1 -1
  409. package/dist/ws-gemini-live.js +10 -2
  410. package/dist/ws-gemini-live.js.map +1 -1
  411. package/dist/ws-live.cjs +6 -5
  412. package/dist/ws-live.cjs.map +1 -1
  413. package/dist/ws-live.js +5 -4
  414. package/dist/ws-live.js.map +1 -1
  415. package/dist/ws-realtime.cjs +28 -54
  416. package/dist/ws-realtime.cjs.map +1 -1
  417. package/dist/ws-realtime.d.cts.map +1 -1
  418. package/dist/ws-realtime.d.ts.map +1 -1
  419. package/dist/ws-realtime.js +25 -51
  420. package/dist/ws-realtime.js.map +1 -1
  421. package/dist/ws-responses.cjs +8 -6
  422. package/dist/ws-responses.cjs.map +1 -1
  423. package/dist/ws-responses.js +7 -5
  424. package/dist/ws-responses.js.map +1 -1
  425. package/package.json +4 -1
  426. package/skills/write-fixtures/SKILL.md +25 -16
@@ -1 +1 @@
1
- {"version":3,"file":"openrouter-video.d.cts","names":[],"sources":["../src/openrouter-video.ts"],"sourcesContent":[],"mappings":";;;;;cAmEa,4BAAA;KAGR,qBAAA;AAHL,UAKU,wBAAA,CAL+B;EAGpC,IAAA,EAAA,QAAA;EAEK,KAAA,EAAA,MAAA;EAAwB,MAAA,EAGxB,qBAHwB;;WAWzB,EAAA,MAAA;EAAa;EAyBZ,qBAAA,EAAA,MAAwB;EAAA;sBAYxB,EAAA,MAAA;;EAWM,KAAA,EAhDP,aAgDO,CAAA,OAAA,CAAA;EAwBJ;;;;EAAwE,gBAAA,CAAA,EAAA,OAAA;EAoBvE;;;;;AAqNb;EAAiD,mBAAA,CAAA,EAAA,OAAA;;;;;;;;;;AAkKjD;;UA1bU,wBAAA,CA2bE;MACL,EAAA,QAAK;;OAGA,EAAA,MAAA;;;;;AAgnBZ;;;;QAGY,EAtiCF,qBAsiCE;;eAEA,EAAA,MAAA;;oBAET,EAAA,MAAA;EAAO;AA2IV;;;;;OAKW,EA/qCF,OA+qCE,CAAA,OAAA,CAAA;;;;;;AA0mBX;;;;;;;;;;;;;;;;;KAjwDY,kBAAA,GAAqB,2BAA2B;;;;;;;;;;;;;;cAoB/C,qBAAA;;;;;;;;;;;;oBAgBO;wBAUI;;;;;iBA2LF,2BAAA,MACf,MAAA,CAAK,sBACL,MAAA,CAAK,yCAEA,oBACD,mBACC,uCACY,MAAA,CAAK,+BACrB,wBACL;iBAyJmB,4BAAA,MACf,MAAA,CAAK,sBACL,MAAA,CAAK,wCAED,mBACC,uCACY,MAAA,CAAK,+BACrB,wBACL;;;;;;;;;;;;;;;iBA6mBmB,2BAAA,MACf,MAAA,CAAK,sBACL,MAAA,CAAK,0BACA,oBACD,mBACC,uCACY,MAAA,CAAK,0BAC1B;iBA2ImB,2BAAA,MACf,MAAA,CAAK,sBACL,MAAA,CAAK,uCAEA,oBACD,mBACC,uCACY,MAAA,CAAK,+BACrB,wBACL;;;;;;;;;;;;;cAsmBU"}
1
+ {"version":3,"file":"openrouter-video.d.cts","names":[],"sources":["../src/openrouter-video.ts"],"sourcesContent":[],"mappings":";;;;;cAgFa,4BAAA;KAGR,qBAAA;AAHL,UAKU,wBAAA,CAL+B;EAGpC,IAAA,EAAA,QAAA;EAEK,KAAA,EAAA,MAAA;EAAwB,MAAA,EAGxB,qBAHwB;;WAWzB,EAAA,MAAA;EAAa;EAyBZ,qBAAA,EAAA,MAAwB;EAAA;sBAYxB,EAAA,MAAA;;EAWM,KAAA,EAhDP,aAgDO,CAAA,OAAA,CAAA;EAwBJ;;;;EAAwE,gBAAA,CAAA,EAAA,OAAA;EAoBvE;;;;;AAqNb;EAAiD,mBAAA,CAAA,EAAA,OAAA;;;;;;;;;;AAgKjD;;UAxbU,wBAAA,CAybE;MACL,EAAA,QAAK;;OAGA,EAAA,MAAA;;;;;AA8lBZ;;;;QAGY,EAlhCF,qBAkhCE;;eAEA,EAAA,MAAA;;oBAET,EAAA,MAAA;EAAO;AAkIV;;;;;OAKW,EAlpCF,OAkpCE,CAAA,OAAA,CAAA;;;;;;AAunBX;;;;;;;;;;;;;;;;;KAjvDY,kBAAA,GAAqB,2BAA2B;;;;;;;;;;;;;;cAoB/C,qBAAA;;;;;;;;;;;;oBAgBO;wBAUI;;;;;iBA2LF,2BAAA,MACf,MAAA,CAAK,sBACL,MAAA,CAAK,yCAEA,oBACD,mBACC,uCACY,MAAA,CAAK,+BACrB,wBACL;iBAuJmB,4BAAA,MACf,MAAA,CAAK,sBACL,MAAA,CAAK,wCAED,mBACC,uCACY,MAAA,CAAK,+BACrB,wBACL;;;;;;;;;;;;;;;iBA2lBmB,2BAAA,MACf,MAAA,CAAK,sBACL,MAAA,CAAK,0BACA,oBACD,mBACC,uCACY,MAAA,CAAK,0BAC1B;iBAkImB,2BAAA,MACf,MAAA,CAAK,sBACL,MAAA,CAAK,uCAEA,oBACD,mBACC,uCACY,MAAA,CAAK,+BACrB,wBACL;;;;;;;;;;;;;cAmnBU"}
@@ -1 +1 @@
1
- {"version":3,"file":"openrouter-video.d.ts","names":[],"sources":["../src/openrouter-video.ts"],"sourcesContent":[],"mappings":";;;;;cAmEa,4BAAA;KAGR,qBAAA;AAHL,UAKU,wBAAA,CAL+B;EAGpC,IAAA,EAAA,QAAA;EAEK,KAAA,EAAA,MAAA;EAAwB,MAAA,EAGxB,qBAHwB;;WAWzB,EAAA,MAAA;EAAa;EAyBZ,qBAAA,EAAA,MAAwB;EAAA;sBAYxB,EAAA,MAAA;;EAWM,KAAA,EAhDP,aAgDO,CAAA,OAAA,CAAA;EAwBJ;;;;EAAwE,gBAAA,CAAA,EAAA,OAAA;EAoBvE;;;;;AAqNb;EAAiD,mBAAA,CAAA,EAAA,OAAA;;;;;;;;;;AAkKjD;;UA1bU,wBAAA,CA2bE;MACL,EAAA,QAAK;;OAGA,EAAA,MAAA;;;;;AAgnBZ;;;;QAGY,EAtiCF,qBAsiCE;;eAEA,EAAA,MAAA;;oBAET,EAAA,MAAA;EAAO;AA2IV;;;;;OAKW,EA/qCF,OA+qCE,CAAA,OAAA,CAAA;;;;;;AA0mBX;;;;;;;;;;;;;;;;;KAjwDY,kBAAA,GAAqB,2BAA2B;;;;;;;;;;;;;;cAoB/C,qBAAA;;;;;;;;;;;;oBAgBO;wBAUI;;;;;iBA2LF,2BAAA,MACf,MAAA,CAAK,sBACL,MAAA,CAAK,yCAEA,oBACD,mBACC,uCACY,MAAA,CAAK,+BACrB,wBACL;iBAyJmB,4BAAA,MACf,MAAA,CAAK,sBACL,MAAA,CAAK,wCAED,mBACC,uCACY,MAAA,CAAK,+BACrB,wBACL;;;;;;;;;;;;;;;iBA6mBmB,2BAAA,MACf,MAAA,CAAK,sBACL,MAAA,CAAK,0BACA,oBACD,mBACC,uCACY,MAAA,CAAK,0BAC1B;iBA2ImB,2BAAA,MACf,MAAA,CAAK,sBACL,MAAA,CAAK,uCAEA,oBACD,mBACC,uCACY,MAAA,CAAK,+BACrB,wBACL;;;;;;;;;;;;;cAsmBU"}
1
+ {"version":3,"file":"openrouter-video.d.ts","names":[],"sources":["../src/openrouter-video.ts"],"sourcesContent":[],"mappings":";;;;;cAgFa,4BAAA;KAGR,qBAAA;AAHL,UAKU,wBAAA,CAL+B;EAGpC,IAAA,EAAA,QAAA;EAEK,KAAA,EAAA,MAAA;EAAwB,MAAA,EAGxB,qBAHwB;;WAWzB,EAAA,MAAA;EAAa;EAyBZ,qBAAA,EAAA,MAAwB;EAAA;sBAYxB,EAAA,MAAA;;EAWM,KAAA,EAhDP,aAgDO,CAAA,OAAA,CAAA;EAwBJ;;;;EAAwE,gBAAA,CAAA,EAAA,OAAA;EAoBvE;;;;;AAqNb;EAAiD,mBAAA,CAAA,EAAA,OAAA;;;;;;;;;;AAgKjD;;UAxbU,wBAAA,CAybE;MACL,EAAA,QAAK;;OAGA,EAAA,MAAA;;;;;AA8lBZ;;;;QAGY,EAlhCF,qBAkhCE;;eAEA,EAAA,MAAA;;oBAET,EAAA,MAAA;EAAO;AAkIV;;;;;OAKW,EAlpCF,OAkpCE,CAAA,OAAA,CAAA;;;;;;AAunBX;;;;;;;;;;;;;;;;;KAjvDY,kBAAA,GAAqB,2BAA2B;;;;;;;;;;;;;;cAoB/C,qBAAA;;;;;;;;;;;;oBAgBO;wBAUI;;;;;iBA2LF,2BAAA,MACf,MAAA,CAAK,sBACL,MAAA,CAAK,yCAEA,oBACD,mBACC,uCACY,MAAA,CAAK,+BACrB,wBACL;iBAuJmB,4BAAA,MACf,MAAA,CAAK,sBACL,MAAA,CAAK,wCAED,mBACC,uCACY,MAAA,CAAK,+BACrB,wBACL;;;;;;;;;;;;;;;iBA2lBmB,2BAAA,MACf,MAAA,CAAK,sBACL,MAAA,CAAK,0BACA,oBACD,mBACC,uCACY,MAAA,CAAK,0BAC1B;iBAkImB,2BAAA,MACf,MAAA,CAAK,sBACL,MAAA,CAAK,uCAEA,oBACD,mBACC,uCACY,MAAA,CAAK,+BACrB,wBACL;;;;;;;;;;;;;cAmnBU"}
@@ -1,15 +1,28 @@
1
- import { flattenHeaders, getContext, getTestId, isErrorResponse, isVideoResponse, resolveResponse, resolveStrictMode, serializeErrorResponse, strictNoMatchLogLine, strictNoMatchMessage, strictOverrideField } from "./helpers.js";
1
+ import { renderError } from "./response/errors.js";
2
+ import { resolveRequestDecisions, strictOverrideField } from "./response/policy.js";
3
+ import { flattenHeaders, getContext, getTestId, isErrorResponse, isVideoResponse, resolveResponse, serializeErrorResponse, strictNoMatchLogLine, strictNoMatchMessage } from "./helpers.js";
2
4
  import { writeErrorResponse } from "./sse-writer.js";
3
5
  import { applyChaosAsync } from "./chaos.js";
4
6
  import { matchFixtureDiagnostic } from "./router.js";
5
7
  import { resolveUpstreamUrl } from "./url.js";
6
8
  import { buildFixtureMatch, clampTimeout, persistFixture, prepareEgressHeaders, removeForwardHeader, sanitizeHeaderValue } from "./recorder.js";
9
+ import { OPENROUTER_VIDEO_SUNSET_MODELS, collect } from "./response/catalog/collect.js";
10
+ import { DEFAULT_OPENROUTER_VIDEO_MODEL, renderOpenRouterVideoModels } from "./response/catalog/render.js";
7
11
  import { resolveProgression } from "./fal.js";
8
12
  import { DEFAULT_UPSTREAM_TIMEOUT_MS, readBodyIdle, readEnvelopeText, requestBase, testIdSuffix, upstreamTimeoutSignal } from "./video-proxy-shared.js";
9
13
  import crypto from "node:crypto";
10
14
 
11
15
  //#region src/openrouter-video.ts
12
- const DEFAULT_OPENROUTER_VIDEO_MODEL = "bytedance/seedance-2.0";
16
+ /**
17
+ * Video models OpenRouter has REMOVED (deprecation policy: a removed surface
18
+ * never mocks success — it serves the rejection the real API serves now).
19
+ *
20
+ * openai/sora-2: gone from the live /api/v1/videos/models listing and from
21
+ * /api/v1/models (its /endpoints page is a 404). A live submit observed on
22
+ * 2026-10-10 is rejected with HTTP 400, content-type application/json, body
23
+ * `{"error":{"message":"Model openai/sora-2 does not exist","code":400}}` —
24
+ * the same rejection OpenRouter gives any unknown model id.
25
+ */
13
26
  const OPENROUTER_VIDEO_MAX_ENTRIES = 1e4;
14
27
  const OPENROUTER_VIDEO_TTL_MS = 36e5;
15
28
  /**
@@ -215,7 +228,7 @@ async function handleOpenRouterVideoStatus(req, res, jobId, fixtures, journal, d
215
228
  return;
216
229
  }
217
230
  if (job.kind === "record") {
218
- if (resolveStrictMode(defaults.strict, req.headers)) {
231
+ if (!resolveRequestDecisions(defaults.strict, req.headers).upstream) {
219
232
  defaults.logger.error(`STRICT: video job ${jobId} is proxied live upstream (record mode) — refusing the upstream poll`);
220
233
  journal.add({
221
234
  method,
@@ -228,11 +241,11 @@ async function handleOpenRouterVideoStatus(req, res, jobId, fixtures, journal, d
228
241
  ...strictOverrideField(defaults.strict, req.headers)
229
242
  }
230
243
  });
231
- writeErrorResponse(res, 503, JSON.stringify({ error: {
244
+ writeErrorResponse(res, 503, renderError("openai", "strict-miss", {
232
245
  message: `Strict mode: video job ${jobId} is proxied live upstream (record mode) — nothing reaches an upstream under strict mode`,
233
246
  type: "invalid_request_error",
234
247
  code: "no_fixture_match"
235
- } }));
248
+ }).body);
236
249
  return;
237
250
  }
238
251
  await proxyOpenRouterVideoRecordPoll({
@@ -373,7 +386,7 @@ async function handleOpenRouterVideoContent(req, res, jobId, journal, defaults,
373
386
  const queryIdx = path.indexOf("?");
374
387
  const indexParam = queryIdx === -1 ? null : new URLSearchParams(path.slice(queryIdx + 1)).get("index");
375
388
  if (job.kind === "record") {
376
- if (resolveStrictMode(defaults.strict, req.headers)) {
389
+ if (!resolveRequestDecisions(defaults.strict, req.headers).upstream) {
377
390
  defaults.logger.error(`STRICT: video job ${jobId} content is proxied live upstream (record mode) — refusing the upstream fetch`);
378
391
  journal.add({
379
392
  method,
@@ -386,11 +399,11 @@ async function handleOpenRouterVideoContent(req, res, jobId, journal, defaults,
386
399
  ...strictOverrideField(defaults.strict, req.headers)
387
400
  }
388
401
  });
389
- writeErrorResponse(res, 503, JSON.stringify({ error: {
402
+ writeErrorResponse(res, 503, renderError("openai", "strict-miss", {
390
403
  message: `Strict mode: video job ${jobId} is proxied live upstream (record mode) — nothing reaches an upstream under strict mode`,
391
404
  type: "invalid_request_error",
392
405
  code: "no_fixture_match"
393
- } }));
406
+ }).body);
394
407
  return;
395
408
  }
396
409
  await proxyOpenRouterVideoRecordContent({
@@ -476,10 +489,10 @@ async function proxyOpenRouterVideoRecordContent(args) {
476
489
  ...strictOverrideField(defaults.strict, req.headers)
477
490
  }
478
491
  });
479
- writeErrorResponse(res, 502, JSON.stringify({ error: {
492
+ writeErrorResponse(res, 502, renderError("openai", "transport-failure", {
480
493
  message: `Proxy to upstream failed: ${msg}`,
481
494
  type: "proxy_error"
482
- } }));
495
+ }).body);
483
496
  };
484
497
  const record = defaults.record;
485
498
  if (!record) {
@@ -647,25 +660,6 @@ async function proxyOpenRouterVideoRecordContent(args) {
647
660
  reader.cancel().catch(() => {});
648
661
  }
649
662
  }
650
- const DEFAULT_OPENROUTER_VIDEO_MODELS = [DEFAULT_OPENROUTER_VIDEO_MODEL, "openai/sora-2"];
651
- function modelEntry(id) {
652
- return {
653
- id,
654
- name: id,
655
- supported_durations: [4, 8],
656
- supported_resolutions: ["720p", "1080p"],
657
- supported_aspect_ratios: [
658
- "16:9",
659
- "9:16",
660
- "1:1"
661
- ],
662
- supported_frame_images: [],
663
- supported_sizes: [],
664
- generate_audio: false,
665
- seed: true,
666
- pricing_skus: []
667
- };
668
- }
669
663
  /**
670
664
  * Synthesizes the OpenRouter video model listing from loaded fixtures —
671
665
  * video-endpoint fixtures with a string `match.model` (mirrors the Ollama
@@ -693,7 +687,7 @@ async function handleOpenRouterVideoModels(req, res, fixtures, journal, defaults
693
687
  const record = defaults.record;
694
688
  const upstreamBase = record?.providers.openrouter;
695
689
  let proxyAttemptFailed = false;
696
- if (upstreamBase && !resolveStrictMode(defaults.strict, req.headers)) {
690
+ if (upstreamBase && resolveRequestDecisions(defaults.strict, req.headers).upstream) {
697
691
  let relay;
698
692
  try {
699
693
  const target = resolveUpstreamUrl(upstreamBase, "/api/v1/videos/models");
@@ -733,14 +727,9 @@ async function handleOpenRouterVideoModels(req, res, fixtures, journal, defaults
733
727
  return;
734
728
  }
735
729
  }
736
- const modelIds = /* @__PURE__ */ new Set();
737
- let sawVideoFixture = false;
738
- for (const f of fixtures) if (f.match.endpoint === "video") {
739
- sawVideoFixture = true;
740
- if (f.match.model && typeof f.match.model === "string") modelIds.add(f.match.model);
741
- }
742
- if (modelIds.size === 0 && sawVideoFixture) defaults.logger.warn("No video fixture contributes a string model — serving the default video model set");
743
- const ids = modelIds.size > 0 ? [...modelIds] : DEFAULT_OPENROUTER_VIDEO_MODELS;
730
+ const collection = collect(fixtures, "video-active");
731
+ if (collection.ids.length === 0 && collection.diagnostics.sawVideoFixture) defaults.logger.warn("No video fixture contributes a string model — serving the default video model set");
732
+ const body = renderOpenRouterVideoModels(collection.ids);
744
733
  if (res.destroyed || res.writableEnded) return;
745
734
  journal.add({
746
735
  method,
@@ -755,7 +744,7 @@ async function handleOpenRouterVideoModels(req, res, fixtures, journal, defaults
755
744
  }
756
745
  });
757
746
  res.writeHead(200, { "Content-Type": "application/json" });
758
- res.end(JSON.stringify({ data: ids.map((id) => modelEntry(id)) }));
747
+ res.end(JSON.stringify(body));
759
748
  }
760
749
  async function handleOpenRouterVideoCreate(req, res, raw, fixtures, journal, defaults, setCorsHeaders, jobs) {
761
750
  setCorsHeaders(res);
@@ -776,11 +765,11 @@ async function handleOpenRouterVideoCreate(req, res, raw, fixtures, journal, def
776
765
  fixture: null
777
766
  }
778
767
  });
779
- writeErrorResponse(res, 400, JSON.stringify({ error: {
768
+ writeErrorResponse(res, 400, renderError("openai", "validation", {
780
769
  message: `Malformed JSON: ${detail}`,
781
770
  type: "invalid_request_error",
782
771
  code: "invalid_json"
783
- } }));
772
+ }).body);
784
773
  return;
785
774
  }
786
775
  if (videoReq === null || typeof videoReq !== "object" || Array.isArray(videoReq)) {
@@ -794,10 +783,10 @@ async function handleOpenRouterVideoCreate(req, res, raw, fixtures, journal, def
794
783
  fixture: null
795
784
  }
796
785
  });
797
- writeErrorResponse(res, 400, JSON.stringify({ error: {
786
+ writeErrorResponse(res, 400, renderError("openai", "validation", {
798
787
  message: "Request body must be a JSON object",
799
788
  type: "invalid_request_error"
800
- } }));
789
+ }).body);
801
790
  return;
802
791
  }
803
792
  const parsedBody = validationJournalBody(videoReq);
@@ -812,11 +801,10 @@ async function handleOpenRouterVideoCreate(req, res, raw, fixtures, journal, def
812
801
  fixture: null
813
802
  }
814
803
  });
815
- const message = videoReq.prompt === void 0 ? "Missing required parameter: 'prompt'" : "Invalid type for parameter: 'prompt' must be a non-empty string";
816
- writeErrorResponse(res, 400, JSON.stringify({ error: {
817
- message,
804
+ writeErrorResponse(res, 400, renderError("openai", "validation", {
805
+ message: videoReq.prompt === void 0 ? "Missing required parameter: 'prompt'" : "Invalid type for parameter: 'prompt' must be a non-empty string",
818
806
  type: "invalid_request_error"
819
- } }));
807
+ }).body);
820
808
  return;
821
809
  }
822
810
  if (videoReq.model !== void 0 && (typeof videoReq.model !== "string" || !videoReq.model)) {
@@ -830,9 +818,26 @@ async function handleOpenRouterVideoCreate(req, res, raw, fixtures, journal, def
830
818
  fixture: null
831
819
  }
832
820
  });
833
- writeErrorResponse(res, 400, JSON.stringify({ error: {
821
+ writeErrorResponse(res, 400, renderError("openai", "validation", {
834
822
  message: "Invalid type for parameter: 'model' must be a non-empty string",
835
823
  type: "invalid_request_error"
824
+ }).body);
825
+ return;
826
+ }
827
+ if (videoReq.model !== void 0 && OPENROUTER_VIDEO_SUNSET_MODELS.has(videoReq.model)) {
828
+ journal.add({
829
+ method,
830
+ path,
831
+ headers: flattenHeaders(req.headers),
832
+ body: parsedBody,
833
+ response: {
834
+ status: 400,
835
+ fixture: null
836
+ }
837
+ });
838
+ writeErrorResponse(res, 400, JSON.stringify({ error: {
839
+ message: `Model ${videoReq.model} does not exist`,
840
+ code: 400
836
841
  } }));
837
842
  return;
838
843
  }
@@ -859,9 +864,9 @@ async function handleOpenRouterVideoCreate(req, res, raw, fixtures, journal, def
859
864
  path,
860
865
  headers: flattenHeaders(req.headers),
861
866
  body: syntheticReq
862
- }, fixture ? "fixture" : resolveStrictMode(defaults.strict, req.headers) ? "internal" : defaults.record?.providers.openrouter ? "proxy" : "internal", defaults.registry, defaults.logger)) return;
867
+ }, fixture ? "fixture" : resolveRequestDecisions(defaults.strict, req.headers).fixtureMiss ? "internal" : defaults.record?.providers.openrouter ? "proxy" : "internal", defaults.registry, defaults.logger)) return;
863
868
  if (!fixture) {
864
- if (resolveStrictMode(defaults.strict, req.headers)) {
869
+ if (resolveRequestDecisions(defaults.strict, req.headers).fixtureMiss) {
865
870
  const strictMessage = strictNoMatchMessage(skippedBySequenceOrTurn);
866
871
  defaults.logger.error(strictNoMatchLogLine(method, path, skippedBySequenceOrTurn));
867
872
  journal.add({
@@ -875,11 +880,11 @@ async function handleOpenRouterVideoCreate(req, res, raw, fixtures, journal, def
875
880
  ...strictOverrideField(defaults.strict, req.headers)
876
881
  }
877
882
  });
878
- writeErrorResponse(res, 503, JSON.stringify({ error: {
883
+ writeErrorResponse(res, 503, renderError("openai", "strict-miss", {
879
884
  message: strictMessage,
880
885
  type: "invalid_request_error",
881
886
  code: "no_fixture_match"
882
- } }));
887
+ }).body);
883
888
  return;
884
889
  }
885
890
  if (defaults.record) {
@@ -943,10 +948,10 @@ async function handleOpenRouterVideoCreate(req, res, raw, fixtures, journal, def
943
948
  fixture
944
949
  }
945
950
  });
946
- writeErrorResponse(res, 500, JSON.stringify({ error: {
951
+ writeErrorResponse(res, 500, renderError("openai", "unknown-response", {
947
952
  message: "Fixture response is not a video type",
948
953
  type: "server_error"
949
- } }));
954
+ }).body);
950
955
  return;
951
956
  }
952
957
  if (res.destroyed || res.writableEnded) return;
@@ -1017,10 +1022,10 @@ async function proxyOpenRouterVideoSubmit(args) {
1017
1022
  ...strictOverrideField(defaults.strict, req.headers)
1018
1023
  }
1019
1024
  });
1020
- writeErrorResponse(res, 502, JSON.stringify({ error: {
1025
+ writeErrorResponse(res, 502, renderError("openai", "transport-failure", {
1021
1026
  message: `Proxy to upstream failed: ${msg}`,
1022
1027
  type: "proxy_error"
1023
- } }));
1028
+ }).body);
1024
1029
  return "handled";
1025
1030
  };
1026
1031
  let submitUrl;
@@ -1185,10 +1190,10 @@ async function proxyOpenRouterVideoRecordPoll(args) {
1185
1190
  logger.error(`OpenRouter video poll proxy failed: ${msg}`);
1186
1191
  if (res.destroyed || res.writableEnded) return;
1187
1192
  journalProxy(502);
1188
- writeErrorResponse(res, 502, JSON.stringify({ error: {
1193
+ writeErrorResponse(res, 502, renderError("openai", "transport-failure", {
1189
1194
  message: `Proxy to upstream failed: ${msg}`,
1190
1195
  type: "proxy_error"
1191
- } }));
1196
+ }).body);
1192
1197
  };
1193
1198
  const record = defaults.record;
1194
1199
  if (!record) {