@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
package/dist/ollama.cjs CHANGED
@@ -1,20 +1,24 @@
1
+ const require_errors = require('./response/errors.cjs');
2
+ const require_policy = require('./response/policy.cjs');
1
3
  const require_helpers = require('./helpers.cjs');
2
4
  const require_sse_writer = require('./sse-writer.cjs');
3
5
  const require_chaos = require('./chaos.cjs');
4
6
  const require_misbehavior = require('./misbehavior.cjs');
7
+ const require_embedding_request = require('./embedding-request.cjs');
5
8
  const require_router = require('./router.cjs');
6
9
  const require_recorder = require('./recorder.cjs');
7
10
  const require_interruption = require('./interruption.cjs');
8
11
  const require_ndjson_writer = require('./ndjson-writer.cjs');
12
+ const require_ollama = require('./response/usage/codecs/ollama.cjs');
9
13
 
10
14
  //#region src/ollama.ts
11
15
  const DURATION_FIELDS = {
12
16
  done_reason: "stop",
13
17
  total_duration: 0,
14
18
  load_duration: 0,
15
- prompt_eval_count: 0,
19
+ ...require_ollama.render({ kind: "ordinary-zero" }, "prompt"),
16
20
  prompt_eval_duration: 0,
17
- eval_count: 0,
21
+ ...require_ollama.render({ kind: "ordinary-zero" }, "completion"),
18
22
  eval_duration: 0
19
23
  };
20
24
  function ollamaToCompletionRequest(req) {
@@ -393,8 +397,11 @@ function prepareOllamaMisbehavior(plan, request, stream, chunkSize, effectiveStr
393
397
  const terminal = chunks.length - 1;
394
398
  chunks[terminal] = {
395
399
  ...chunks[terminal],
396
- prompt_eval_count: require_helpers.estimatePromptTokens(request.messages),
397
- eval_count: require_helpers.estimateTokens(completion)
400
+ ...require_ollama.render({
401
+ kind: "applied-chat-estimate",
402
+ messages: request.messages,
403
+ completion
404
+ })
398
405
  };
399
406
  return {
400
407
  chunks,
@@ -467,10 +474,10 @@ async function handleOllama(req, res, raw, fixtures, journal, defaults, setCorsH
467
474
  fixture: null
468
475
  }
469
476
  });
470
- require_sse_writer.writeErrorResponse(res, 400, JSON.stringify({ error: {
477
+ require_sse_writer.writeErrorResponse(res, 400, require_errors.renderError("ollama", "validation", {
471
478
  message: `Malformed JSON body: ${detail}`,
472
479
  type: "invalid_request_error"
473
- } }));
480
+ }).body);
474
481
  return;
475
482
  }
476
483
  if (!require_helpers.isJsonObject(ollamaReq)) {
@@ -484,10 +491,10 @@ async function handleOllama(req, res, raw, fixtures, journal, defaults, setCorsH
484
491
  fixture: null
485
492
  }
486
493
  });
487
- require_sse_writer.writeErrorResponse(res, 400, JSON.stringify({ error: {
494
+ require_sse_writer.writeErrorResponse(res, 400, require_errors.renderError("ollama", "validation", {
488
495
  message: "Request body must be a JSON object",
489
496
  type: "invalid_request_error"
490
- } }));
497
+ }).body);
491
498
  return;
492
499
  }
493
500
  let chatShapeError = require_helpers.validateChatMessages(ollamaReq.messages) ?? require_helpers.validateToolsField(ollamaReq.tools);
@@ -506,10 +513,10 @@ async function handleOllama(req, res, raw, fixtures, journal, defaults, setCorsH
506
513
  fixture: null
507
514
  }
508
515
  });
509
- require_sse_writer.writeErrorResponse(res, 400, JSON.stringify({ error: {
516
+ require_sse_writer.writeErrorResponse(res, 400, require_errors.renderError("ollama", "validation", {
510
517
  message: `Invalid request: ${chatShapeError}`,
511
518
  type: "invalid_request_error"
512
- } }));
519
+ }).body);
513
520
  return;
514
521
  }
515
522
  const completionReq = ollamaToCompletionRequest(ollamaReq);
@@ -528,7 +535,7 @@ async function handleOllama(req, res, raw, fixtures, journal, defaults, setCorsH
528
535
  body: completionReq
529
536
  }, fixture ? "fixture" : "proxy", defaults.registry, defaults.logger)) return;
530
537
  if (!fixture) {
531
- if (require_helpers.resolveStrictMode(defaults.strict, req.headers)) {
538
+ if (require_policy.resolveRequestDecisions(defaults.strict, req.headers).fixtureMiss) {
532
539
  const strictStatus = 503;
533
540
  const strictMessage = require_helpers.strictNoMatchMessage(skippedBySequenceOrTurn);
534
541
  logger.error(require_helpers.strictNoMatchLogLine(req.method ?? "POST", urlPath, skippedBySequenceOrTurn));
@@ -540,13 +547,13 @@ async function handleOllama(req, res, raw, fixtures, journal, defaults, setCorsH
540
547
  response: {
541
548
  status: strictStatus,
542
549
  fixture: null,
543
- ...require_helpers.strictOverrideField(defaults.strict, req.headers)
550
+ ...require_policy.strictOverrideField(defaults.strict, req.headers)
544
551
  }
545
552
  });
546
- require_sse_writer.writeErrorResponse(res, strictStatus, JSON.stringify({ error: {
553
+ require_sse_writer.writeErrorResponse(res, strictStatus, require_errors.renderError("ollama", "strict-miss", {
547
554
  message: strictMessage,
548
555
  type: "invalid_request_error"
549
- } }));
556
+ }).body);
550
557
  return;
551
558
  }
552
559
  if (defaults.record) {
@@ -575,13 +582,13 @@ async function handleOllama(req, res, raw, fixtures, journal, defaults, setCorsH
575
582
  response: {
576
583
  status: 404,
577
584
  fixture: null,
578
- ...require_helpers.strictOverrideField(defaults.strict, req.headers)
585
+ ...require_policy.strictOverrideField(defaults.strict, req.headers)
579
586
  }
580
587
  });
581
- require_sse_writer.writeErrorResponse(res, 404, JSON.stringify({ error: {
588
+ require_sse_writer.writeErrorResponse(res, 404, require_errors.renderError("ollama", "fixture-miss", {
582
589
  message: "No fixture matched",
583
590
  type: "invalid_request_error"
584
- } }));
591
+ }).body);
585
592
  return;
586
593
  }
587
594
  const response = await require_helpers.resolveResponse(fixture, completionReq);
@@ -613,14 +620,17 @@ async function handleOllama(req, res, raw, fixtures, journal, defaults, setCorsH
613
620
  });
614
621
  const message = `${misbehavior.code}: ${misbehavior.message}`;
615
622
  if (!misbehavior.summary?.evaluations.length) defaults.logger.error(message);
616
- require_sse_writer.writeErrorResponse(res, misbehavior.status, JSON.stringify({ error: message }));
623
+ require_sse_writer.writeErrorResponse(res, misbehavior.status, require_errors.renderError("ollama", "misbehavior", {
624
+ message: misbehavior.message,
625
+ code: misbehavior.code
626
+ }).body);
617
627
  return;
618
628
  }
619
629
  const latency = fixture.latency ?? defaults.latency;
620
630
  const chunkSize = Math.max(1, fixture.chunkSize ?? defaults.chunkSize);
621
631
  const streaming = ollamaReq.stream !== false;
622
632
  if (misbehavior.kind === "applied") {
623
- const prepared = prepareOllamaMisbehavior(misbehavior, completionReq, streaming, chunkSize, require_helpers.resolveStrictMode(defaults.strict, req.headers), logger);
633
+ const prepared = prepareOllamaMisbehavior(misbehavior, completionReq, streaming, chunkSize, require_policy.resolveRequestDecisions(defaults.strict, req.headers).reasoningSuppression, logger);
624
634
  const journalEntry = journal.add({
625
635
  method: req.method ?? "POST",
626
636
  path: urlPath,
@@ -675,7 +685,7 @@ async function handleOllama(req, res, raw, fixtures, journal, defaults, setCorsH
675
685
  defaults,
676
686
  testId
677
687
  });
678
- require_sse_writer.writeErrorResponse(res, status, require_helpers.serializeErrorResponse(response), { retryAfter: response.retryAfter });
688
+ require_sse_writer.writeErrorResponse(res, status, require_errors.renderError("openai", "fixture", response.error).body, { retryAfter: response.retryAfter });
679
689
  return;
680
690
  }
681
691
  if (require_helpers.isCombinedFixtureResponse(response)) {
@@ -697,7 +707,7 @@ async function handleOllama(req, res, raw, fixtures, journal, defaults, setCorsH
697
707
  testId
698
708
  });
699
709
  const functionToolCalls = require_helpers.requireEmittedFunctionToolCalls(response, "Ollama");
700
- const effectiveStrict = require_helpers.resolveStrictMode(defaults.strict, req.headers);
710
+ const effectiveStrict = require_policy.resolveRequestDecisions(defaults.strict, req.headers).reasoningSuppression;
701
711
  const effReasoning = require_helpers.resolveReasoningForModel(response.reasoning, completionReq.model, effectiveStrict, logger);
702
712
  if (!streaming) {
703
713
  const body = buildOllamaChatContentWithToolCallsResponse(response.content ?? "", functionToolCalls, completionReq.model, effReasoning, response.blocks);
@@ -740,7 +750,7 @@ async function handleOllama(req, res, raw, fixtures, journal, defaults, setCorsH
740
750
  defaults,
741
751
  testId
742
752
  });
743
- const effectiveStrict = require_helpers.resolveStrictMode(defaults.strict, req.headers);
753
+ const effectiveStrict = require_policy.resolveRequestDecisions(defaults.strict, req.headers).reasoningSuppression;
744
754
  const effReasoning = require_helpers.resolveReasoningForModel(response.reasoning, completionReq.model, effectiveStrict, logger);
745
755
  if (!streaming) {
746
756
  const body = buildOllamaChatTextResponse(response.content, completionReq.model, effReasoning);
@@ -784,7 +794,7 @@ async function handleOllama(req, res, raw, fixtures, journal, defaults, setCorsH
784
794
  testId
785
795
  });
786
796
  const functionToolCalls = require_helpers.requireEmittedFunctionToolCalls(response, "Ollama");
787
- const effectiveStrict = require_helpers.resolveStrictMode(defaults.strict, req.headers);
797
+ const effectiveStrict = require_policy.resolveRequestDecisions(defaults.strict, req.headers).reasoningSuppression;
788
798
  const effReasoning = require_helpers.resolveReasoningForModel(response.reasoning, completionReq.model, effectiveStrict, logger);
789
799
  if (!streaming) {
790
800
  const body = buildOllamaChatToolCallResponse(functionToolCalls, completionReq.model, effReasoning);
@@ -824,10 +834,10 @@ async function handleOllama(req, res, raw, fixtures, journal, defaults, setCorsH
824
834
  defaults,
825
835
  testId
826
836
  });
827
- require_sse_writer.writeErrorResponse(res, 500, JSON.stringify({ error: {
837
+ require_sse_writer.writeErrorResponse(res, 500, require_errors.renderError("ollama", "unknown-response", {
828
838
  message: "Fixture response did not match any known type",
829
839
  type: "server_error"
830
- } }));
840
+ }).body);
831
841
  }
832
842
  async function handleOllamaGenerate(req, res, raw, fixtures, journal, defaults, setCorsHeaders) {
833
843
  setCorsHeaders(res);
@@ -847,10 +857,10 @@ async function handleOllamaGenerate(req, res, raw, fixtures, journal, defaults,
847
857
  fixture: null
848
858
  }
849
859
  });
850
- require_sse_writer.writeErrorResponse(res, 400, JSON.stringify({ error: {
860
+ require_sse_writer.writeErrorResponse(res, 400, require_errors.renderError("ollama", "validation", {
851
861
  message: `Malformed JSON body: ${detail}`,
852
862
  type: "invalid_request_error"
853
- } }));
863
+ }).body);
854
864
  return;
855
865
  }
856
866
  if (!require_helpers.isJsonObject(generateReq)) {
@@ -864,10 +874,10 @@ async function handleOllamaGenerate(req, res, raw, fixtures, journal, defaults,
864
874
  fixture: null
865
875
  }
866
876
  });
867
- require_sse_writer.writeErrorResponse(res, 400, JSON.stringify({ error: {
877
+ require_sse_writer.writeErrorResponse(res, 400, require_errors.renderError("ollama", "validation", {
868
878
  message: "Request body must be a JSON object",
869
879
  type: "invalid_request_error"
870
- } }));
880
+ }).body);
871
881
  return;
872
882
  }
873
883
  if (!generateReq.prompt || typeof generateReq.prompt !== "string") {
@@ -881,10 +891,10 @@ async function handleOllamaGenerate(req, res, raw, fixtures, journal, defaults,
881
891
  fixture: null
882
892
  }
883
893
  });
884
- require_sse_writer.writeErrorResponse(res, 400, JSON.stringify({ error: {
894
+ require_sse_writer.writeErrorResponse(res, 400, require_errors.renderError("ollama", "validation", {
885
895
  message: "Invalid request: prompt field is required",
886
896
  type: "invalid_request_error"
887
- } }));
897
+ }).body);
888
898
  return;
889
899
  }
890
900
  const completionReq = ollamaGenerateToCompletionRequest(generateReq);
@@ -903,7 +913,7 @@ async function handleOllamaGenerate(req, res, raw, fixtures, journal, defaults,
903
913
  body: completionReq
904
914
  }, fixture ? "fixture" : "proxy", defaults.registry, defaults.logger)) return;
905
915
  if (!fixture) {
906
- if (require_helpers.resolveStrictMode(defaults.strict, req.headers)) {
916
+ if (require_policy.resolveRequestDecisions(defaults.strict, req.headers).fixtureMiss) {
907
917
  const strictStatus = 503;
908
918
  const strictMessage = require_helpers.strictNoMatchMessage(skippedBySequenceOrTurn);
909
919
  defaults.logger.error(require_helpers.strictNoMatchLogLine(req.method ?? "POST", urlPath, skippedBySequenceOrTurn));
@@ -915,13 +925,13 @@ async function handleOllamaGenerate(req, res, raw, fixtures, journal, defaults,
915
925
  response: {
916
926
  status: strictStatus,
917
927
  fixture: null,
918
- ...require_helpers.strictOverrideField(defaults.strict, req.headers)
928
+ ...require_policy.strictOverrideField(defaults.strict, req.headers)
919
929
  }
920
930
  });
921
- require_sse_writer.writeErrorResponse(res, strictStatus, JSON.stringify({ error: {
931
+ require_sse_writer.writeErrorResponse(res, strictStatus, require_errors.renderError("ollama", "strict-miss", {
922
932
  message: strictMessage,
923
933
  type: "invalid_request_error"
924
- } }));
934
+ }).body);
925
935
  return;
926
936
  }
927
937
  if (defaults.record) {
@@ -950,13 +960,13 @@ async function handleOllamaGenerate(req, res, raw, fixtures, journal, defaults,
950
960
  response: {
951
961
  status: 404,
952
962
  fixture: null,
953
- ...require_helpers.strictOverrideField(defaults.strict, req.headers)
963
+ ...require_policy.strictOverrideField(defaults.strict, req.headers)
954
964
  }
955
965
  });
956
- require_sse_writer.writeErrorResponse(res, 404, JSON.stringify({ error: {
966
+ require_sse_writer.writeErrorResponse(res, 404, require_errors.renderError("ollama", "fixture-miss", {
957
967
  message: "No fixture matched",
958
968
  type: "invalid_request_error"
959
- } }));
969
+ }).body);
960
970
  return;
961
971
  }
962
972
  const response = await require_helpers.resolveResponse(fixture, completionReq);
@@ -989,7 +999,10 @@ async function handleOllamaGenerate(req, res, raw, fixtures, journal, defaults,
989
999
  });
990
1000
  const message = `${misbehavior.code}: ${misbehavior.message}`;
991
1001
  if (!misbehavior.summary?.evaluations.length) defaults.logger.error(message);
992
- require_sse_writer.writeErrorResponse(res, misbehavior.status, JSON.stringify({ error: message }));
1002
+ require_sse_writer.writeErrorResponse(res, misbehavior.status, require_errors.renderError("ollama", "misbehavior", {
1003
+ message: misbehavior.message,
1004
+ code: misbehavior.code
1005
+ }).body);
993
1006
  return;
994
1007
  }
995
1008
  const latency = fixture.latency ?? defaults.latency;
@@ -1012,7 +1025,7 @@ async function handleOllamaGenerate(req, res, raw, fixtures, journal, defaults,
1012
1025
  defaults,
1013
1026
  testId
1014
1027
  });
1015
- require_sse_writer.writeErrorResponse(res, status, require_helpers.serializeErrorResponse(response), { retryAfter: response.retryAfter });
1028
+ require_sse_writer.writeErrorResponse(res, status, require_errors.renderError("openai", "fixture", response.error).body, { retryAfter: response.retryAfter });
1016
1029
  return;
1017
1030
  }
1018
1031
  if (require_helpers.isTextResponse(response)) {
@@ -1032,7 +1045,7 @@ async function handleOllamaGenerate(req, res, raw, fixtures, journal, defaults,
1032
1045
  defaults,
1033
1046
  testId
1034
1047
  });
1035
- const effectiveStrict = require_helpers.resolveStrictMode(defaults.strict, req.headers);
1048
+ const effectiveStrict = require_policy.resolveRequestDecisions(defaults.strict, req.headers).reasoningSuppression;
1036
1049
  const effReasoning = require_helpers.resolveReasoningForModel(response.reasoning, completionReq.model, effectiveStrict, defaults.logger);
1037
1050
  if (!streaming) {
1038
1051
  const body = buildOllamaGenerateTextResponse(response.content, completionReq.model, effReasoning);
@@ -1073,10 +1086,10 @@ async function handleOllamaGenerate(req, res, raw, fixtures, journal, defaults,
1073
1086
  defaults,
1074
1087
  testId
1075
1088
  });
1076
- require_sse_writer.writeErrorResponse(res, 400, JSON.stringify({ error: {
1089
+ require_sse_writer.writeErrorResponse(res, 400, require_errors.renderError("ollama", "validation", {
1077
1090
  message: "Tool call fixtures are not supported on /api/generate — use /api/chat instead",
1078
1091
  type: "invalid_request_error"
1079
- } }));
1092
+ }).body);
1080
1093
  return;
1081
1094
  }
1082
1095
  require_misbehavior.recordMisbehaviorOutcome({
@@ -1094,15 +1107,17 @@ async function handleOllamaGenerate(req, res, raw, fixtures, journal, defaults,
1094
1107
  defaults,
1095
1108
  testId
1096
1109
  });
1097
- require_sse_writer.writeErrorResponse(res, 500, JSON.stringify({ error: {
1110
+ require_sse_writer.writeErrorResponse(res, 500, require_errors.renderError("ollama", "unknown-response", {
1098
1111
  message: "Fixture response did not match any known type",
1099
1112
  type: "server_error"
1100
- } }));
1113
+ }).body);
1101
1114
  }
1102
1115
  async function handleOllamaEmbeddings(req, res, raw, fixtures, journal, defaults, setCorsHeaders) {
1103
1116
  const { logger } = defaults;
1104
1117
  setCorsHeaders(res);
1105
1118
  const urlPath = req.url ?? "/api/embeddings";
1119
+ const currentEndpoint = urlPath.split("?")[0] === "/api/embed";
1120
+ const errorWire = currentEndpoint ? "ollama-embed" : "ollama";
1106
1121
  let embReq;
1107
1122
  try {
1108
1123
  embReq = JSON.parse(raw);
@@ -1118,10 +1133,10 @@ async function handleOllamaEmbeddings(req, res, raw, fixtures, journal, defaults
1118
1133
  fixture: null
1119
1134
  }
1120
1135
  });
1121
- require_sse_writer.writeErrorResponse(res, 400, JSON.stringify({ error: {
1136
+ require_sse_writer.writeErrorResponse(res, 400, require_errors.renderError(errorWire, "validation", {
1122
1137
  message: `Malformed JSON body: ${detail}`,
1123
1138
  type: "invalid_request_error"
1124
- } }));
1139
+ }).body);
1125
1140
  return;
1126
1141
  }
1127
1142
  if (!require_helpers.isJsonObject(embReq)) {
@@ -1135,10 +1150,10 @@ async function handleOllamaEmbeddings(req, res, raw, fixtures, journal, defaults
1135
1150
  fixture: null
1136
1151
  }
1137
1152
  });
1138
- require_sse_writer.writeErrorResponse(res, 400, JSON.stringify({ error: {
1153
+ require_sse_writer.writeErrorResponse(res, 400, require_errors.renderError(errorWire, "validation", {
1139
1154
  message: "Request body must be a JSON object",
1140
1155
  type: "invalid_request_error"
1141
- } }));
1156
+ }).body);
1142
1157
  return;
1143
1158
  }
1144
1159
  const promptShapeError = embReq.prompt !== void 0 && embReq.prompt !== null && typeof embReq.prompt !== "string" ? "prompt field must be a string" : embReq.input !== void 0 && embReq.input !== null && require_helpers.normalizeEmbeddingInput(embReq.input) === null ? "input field must be a string or an array of strings" : null;
@@ -1153,14 +1168,15 @@ async function handleOllamaEmbeddings(req, res, raw, fixtures, journal, defaults
1153
1168
  fixture: null
1154
1169
  }
1155
1170
  });
1156
- require_sse_writer.writeErrorResponse(res, 400, JSON.stringify({ error: {
1171
+ require_sse_writer.writeErrorResponse(res, 400, require_errors.renderError(errorWire, "validation", {
1157
1172
  message: `Invalid request: ${promptShapeError}`,
1158
1173
  type: "invalid_request_error"
1159
- } }));
1174
+ }).body);
1160
1175
  return;
1161
1176
  }
1162
- const inputText = embReq.prompt ?? (typeof embReq.input === "string" ? embReq.input : void 0) ?? (Array.isArray(embReq.input) ? embReq.input.join(" ") : void 0);
1163
- if (!embReq.model) {
1177
+ const inputs = require_helpers.normalizeEmbeddingInput(currentEndpoint ? embReq.input ?? embReq.prompt : embReq.prompt ?? embReq.input);
1178
+ const inputText = currentEndpoint ? inputs?.join(" ") : embReq.prompt ?? (typeof embReq.input === "string" ? embReq.input : void 0) ?? (Array.isArray(embReq.input) ? embReq.input.join(" ") : void 0);
1179
+ if (!embReq.model || currentEndpoint && typeof embReq.model !== "string") {
1164
1180
  journal.add({
1165
1181
  method: req.method ?? "POST",
1166
1182
  path: urlPath,
@@ -1171,10 +1187,10 @@ async function handleOllamaEmbeddings(req, res, raw, fixtures, journal, defaults
1171
1187
  fixture: null
1172
1188
  }
1173
1189
  });
1174
- require_sse_writer.writeErrorResponse(res, 400, JSON.stringify({ error: {
1190
+ require_sse_writer.writeErrorResponse(res, 400, require_errors.renderError(errorWire, "validation", {
1175
1191
  message: "Invalid request: model field is required",
1176
1192
  type: "invalid_request_error"
1177
- } }));
1193
+ }).body);
1178
1194
  return;
1179
1195
  }
1180
1196
  if (!inputText) {
@@ -1188,10 +1204,10 @@ async function handleOllamaEmbeddings(req, res, raw, fixtures, journal, defaults
1188
1204
  fixture: null
1189
1205
  }
1190
1206
  });
1191
- require_sse_writer.writeErrorResponse(res, 400, JSON.stringify({ error: {
1207
+ require_sse_writer.writeErrorResponse(res, 400, require_errors.renderError(errorWire, "validation", {
1192
1208
  message: "Invalid request: prompt or input field is required",
1193
1209
  type: "invalid_request_error"
1194
- } }));
1210
+ }).body);
1195
1211
  return;
1196
1212
  }
1197
1213
  const syntheticReq = {
@@ -1201,6 +1217,11 @@ async function handleOllamaEmbeddings(req, res, raw, fixtures, journal, defaults
1201
1217
  _endpointType: "embedding",
1202
1218
  _context: require_helpers.getContext(req)
1203
1219
  };
1220
+ require_embedding_request.setEmbeddingRequest(syntheticReq, {
1221
+ operation: currentEndpoint ? "/api/embed" : "/api/embeddings",
1222
+ input: currentEndpoint ? embReq.input ?? embReq.prompt ?? "" : embReq.prompt ?? embReq.input ?? "",
1223
+ ...embReq.dimensions !== void 0 && { dimensions: embReq.dimensions }
1224
+ });
1204
1225
  const testId = require_helpers.getTestId(req);
1205
1226
  const { fixture, skippedBySequenceOrTurn } = require_router.matchFixtureDiagnostic(fixtures, syntheticReq, journal.getFixtureMatchCountsForTest(testId), defaults.requestTransform, require_router.recordMatchOptions(!!defaults.record, defaults.logger));
1206
1227
  if (fixture) {
@@ -1227,7 +1248,23 @@ async function handleOllamaEmbeddings(req, res, raw, fixtures, journal, defaults
1227
1248
  fixture
1228
1249
  }
1229
1250
  });
1230
- require_sse_writer.writeErrorResponse(res, status, require_helpers.serializeErrorResponse(response), { retryAfter: response.retryAfter });
1251
+ require_sse_writer.writeErrorResponse(res, status, require_errors.renderError(currentEndpoint ? "ollama-embed" : "openai", "fixture", response.error).body, { retryAfter: response.retryAfter });
1252
+ return;
1253
+ }
1254
+ if (currentEndpoint && require_helpers.isJSONResponse(response)) {
1255
+ const status = response.status ?? 200;
1256
+ journal.add({
1257
+ method: req.method ?? "POST",
1258
+ path: urlPath,
1259
+ headers: require_helpers.flattenHeaders(req.headers),
1260
+ body: syntheticReq,
1261
+ response: {
1262
+ status,
1263
+ fixture
1264
+ }
1265
+ });
1266
+ res.writeHead(status, { "Content-Type": "application/json" });
1267
+ res.end(JSON.stringify(response.json));
1231
1268
  return;
1232
1269
  }
1233
1270
  if (require_helpers.isEmbeddingResponse(response)) {
@@ -1241,7 +1278,10 @@ async function handleOllamaEmbeddings(req, res, raw, fixtures, journal, defaults
1241
1278
  fixture
1242
1279
  }
1243
1280
  });
1244
- const body = {
1281
+ const body = currentEndpoint ? {
1282
+ model: embReq.model,
1283
+ embeddings: (inputs ?? []).map(() => [...response.embedding])
1284
+ } : {
1245
1285
  model: embReq.model,
1246
1286
  embedding: [...response.embedding]
1247
1287
  };
@@ -1259,13 +1299,13 @@ async function handleOllamaEmbeddings(req, res, raw, fixtures, journal, defaults
1259
1299
  fixture
1260
1300
  }
1261
1301
  });
1262
- require_sse_writer.writeErrorResponse(res, 500, JSON.stringify({ error: {
1302
+ require_sse_writer.writeErrorResponse(res, 500, require_errors.renderError(errorWire, "unknown-response", {
1263
1303
  message: "Fixture response did not match any known embedding type (must have embedding or error)",
1264
1304
  type: "server_error"
1265
- } }));
1305
+ }).body);
1266
1306
  return;
1267
1307
  }
1268
- if (require_helpers.resolveStrictMode(defaults.strict, req.headers)) {
1308
+ if (require_policy.resolveRequestDecisions(defaults.strict, req.headers).fixtureMiss) {
1269
1309
  const strictMessage = require_helpers.strictNoMatchMessage(skippedBySequenceOrTurn);
1270
1310
  logger.error(require_helpers.strictNoMatchLogLine(req.method ?? "POST", urlPath, skippedBySequenceOrTurn));
1271
1311
  journal.add({
@@ -1276,13 +1316,13 @@ async function handleOllamaEmbeddings(req, res, raw, fixtures, journal, defaults
1276
1316
  response: {
1277
1317
  status: 503,
1278
1318
  fixture: null,
1279
- ...require_helpers.strictOverrideField(defaults.strict, req.headers)
1319
+ ...require_policy.strictOverrideField(defaults.strict, req.headers)
1280
1320
  }
1281
1321
  });
1282
- require_sse_writer.writeErrorResponse(res, 503, JSON.stringify({ error: {
1322
+ require_sse_writer.writeErrorResponse(res, 503, require_errors.renderError(errorWire, "strict-miss", {
1283
1323
  message: strictMessage,
1284
1324
  type: "invalid_request_error"
1285
- } }));
1325
+ }).body);
1286
1326
  return;
1287
1327
  }
1288
1328
  if (defaults.record) {
@@ -1303,8 +1343,25 @@ async function handleOllamaEmbeddings(req, res, raw, fixtures, journal, defaults
1303
1343
  return;
1304
1344
  }
1305
1345
  }
1346
+ const dimensions = currentEndpoint ? require_helpers.validateEmbeddingDimensions(embReq.dimensions) : 1536;
1347
+ if (dimensions === null) {
1348
+ journal.add({
1349
+ method: req.method ?? "POST",
1350
+ path: urlPath,
1351
+ headers: require_helpers.flattenHeaders(req.headers),
1352
+ body: syntheticReq,
1353
+ response: {
1354
+ status: 400,
1355
+ fixture: null
1356
+ }
1357
+ });
1358
+ require_sse_writer.writeErrorResponse(res, 400, require_errors.renderError(errorWire, "validation", {
1359
+ message: `Invalid request: dimensions must be an integer between 1 and ${require_helpers.MAX_EMBEDDING_DIMENSIONS}`,
1360
+ type: "invalid_request_error"
1361
+ }).body);
1362
+ return;
1363
+ }
1306
1364
  logger.warn(`No embedding fixture matched for "${inputText.slice(0, 80)}" — returning deterministic fallback`);
1307
- const embedding = require_helpers.generateDeterministicEmbedding(inputText);
1308
1365
  journal.add({
1309
1366
  method: req.method ?? "POST",
1310
1367
  path: urlPath,
@@ -1315,9 +1372,12 @@ async function handleOllamaEmbeddings(req, res, raw, fixtures, journal, defaults
1315
1372
  fixture: null
1316
1373
  }
1317
1374
  });
1318
- const body = {
1375
+ const body = currentEndpoint ? {
1376
+ model: embReq.model,
1377
+ embeddings: (inputs ?? []).map((input) => require_helpers.generateDeterministicEmbedding(input, dimensions))
1378
+ } : {
1319
1379
  model: embReq.model,
1320
- embedding
1380
+ embedding: require_helpers.generateDeterministicEmbedding(inputText)
1321
1381
  };
1322
1382
  res.writeHead(200, { "Content-Type": "application/json" });
1323
1383
  res.end(JSON.stringify(body));