@draht/ai 2026.7.30 → 2026.10.4-2

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 (604) hide show
  1. package/dist/api/anthropic-messages.d.ts.map +1 -1
  2. package/dist/api/anthropic-messages.js +404 -142
  3. package/dist/api/anthropic-messages.js.map +1 -1
  4. package/dist/api/azure-openai-responses.d.ts +2 -0
  5. package/dist/api/azure-openai-responses.d.ts.map +1 -1
  6. package/dist/api/azure-openai-responses.js +34 -10
  7. package/dist/api/azure-openai-responses.js.map +1 -1
  8. package/dist/api/bedrock-converse-stream.d.ts.map +1 -1
  9. package/dist/api/bedrock-converse-stream.js +210 -24
  10. package/dist/api/bedrock-converse-stream.js.map +1 -1
  11. package/dist/api/cloudflare-ai-binding.d.ts +77 -0
  12. package/dist/api/cloudflare-ai-binding.d.ts.map +1 -0
  13. package/dist/api/cloudflare-ai-binding.js +72 -0
  14. package/dist/api/cloudflare-ai-binding.js.map +1 -0
  15. package/dist/api/cloudflare-workers-ai-system-one.d.ts +4 -0
  16. package/dist/api/cloudflare-workers-ai-system-one.d.ts.map +1 -0
  17. package/dist/api/cloudflare-workers-ai-system-one.js +43 -0
  18. package/dist/api/cloudflare-workers-ai-system-one.js.map +1 -0
  19. package/dist/api/cloudflare-workers-ai-system-one.lazy.d.ts +3 -0
  20. package/dist/api/cloudflare-workers-ai-system-one.lazy.d.ts.map +1 -0
  21. package/dist/api/cloudflare-workers-ai-system-one.lazy.js +4 -0
  22. package/dist/api/cloudflare-workers-ai-system-one.lazy.js.map +1 -0
  23. package/dist/api/cloudflare.d.ts +2 -0
  24. package/dist/api/cloudflare.d.ts.map +1 -1
  25. package/dist/api/cloudflare.js +2 -0
  26. package/dist/api/cloudflare.js.map +1 -1
  27. package/dist/api/constrained-sampling.d.ts +10 -1
  28. package/dist/api/constrained-sampling.d.ts.map +1 -1
  29. package/dist/api/constrained-sampling.js +137 -4
  30. package/dist/api/constrained-sampling.js.map +1 -1
  31. package/dist/api/google-generative-ai.d.ts +2 -2
  32. package/dist/api/google-generative-ai.d.ts.map +1 -1
  33. package/dist/api/google-generative-ai.js +39 -82
  34. package/dist/api/google-generative-ai.js.map +1 -1
  35. package/dist/api/google-shared.d.ts +27 -5
  36. package/dist/api/google-shared.d.ts.map +1 -1
  37. package/dist/api/google-shared.js +126 -18
  38. package/dist/api/google-shared.js.map +1 -1
  39. package/dist/api/google-vertex.d.ts +2 -2
  40. package/dist/api/google-vertex.d.ts.map +1 -1
  41. package/dist/api/google-vertex.js +42 -73
  42. package/dist/api/google-vertex.js.map +1 -1
  43. package/dist/api/lazy.d.ts +5 -1
  44. package/dist/api/lazy.d.ts.map +1 -1
  45. package/dist/api/lazy.js +19 -7
  46. package/dist/api/lazy.js.map +1 -1
  47. package/dist/api/llama-cpp-classify.d.ts +33 -0
  48. package/dist/api/llama-cpp-classify.d.ts.map +1 -0
  49. package/dist/api/llama-cpp-classify.js +365 -0
  50. package/dist/api/llama-cpp-classify.js.map +1 -0
  51. package/dist/api/llama-cpp-classify.lazy.d.ts +3 -0
  52. package/dist/api/llama-cpp-classify.lazy.d.ts.map +1 -0
  53. package/dist/api/llama-cpp-classify.lazy.js +4 -0
  54. package/dist/api/llama-cpp-classify.lazy.js.map +1 -0
  55. package/dist/api/mistral-conversations.d.ts +2 -2
  56. package/dist/api/mistral-conversations.d.ts.map +1 -1
  57. package/dist/api/mistral-conversations.js +250 -69
  58. package/dist/api/mistral-conversations.js.map +1 -1
  59. package/dist/api/openai-codex-responses.d.ts.map +1 -1
  60. package/dist/api/openai-codex-responses.js +107 -55
  61. package/dist/api/openai-codex-responses.js.map +1 -1
  62. package/dist/api/openai-completions.d.ts +11 -4
  63. package/dist/api/openai-completions.d.ts.map +1 -1
  64. package/dist/api/openai-completions.js +241 -129
  65. package/dist/api/openai-completions.js.map +1 -1
  66. package/dist/api/openai-responses-shared.d.ts +8 -4
  67. package/dist/api/openai-responses-shared.d.ts.map +1 -1
  68. package/dist/api/openai-responses-shared.js +109 -58
  69. package/dist/api/openai-responses-shared.js.map +1 -1
  70. package/dist/api/openai-responses.d.ts.map +1 -1
  71. package/dist/api/openai-responses.js +62 -24
  72. package/dist/api/openai-responses.js.map +1 -1
  73. package/dist/api/openrouter-images.d.ts +2 -1
  74. package/dist/api/openrouter-images.d.ts.map +1 -1
  75. package/dist/api/openrouter-images.js +1 -0
  76. package/dist/api/openrouter-images.js.map +1 -1
  77. package/dist/api/openrouter-images.lazy.d.ts.map +1 -1
  78. package/dist/api/openrouter-images.lazy.js.map +1 -1
  79. package/dist/api/pi-messages.d.ts +5 -3
  80. package/dist/api/pi-messages.d.ts.map +1 -1
  81. package/dist/api/pi-messages.js +13 -4
  82. package/dist/api/pi-messages.js.map +1 -1
  83. package/dist/api/simple-options.d.ts +9 -3
  84. package/dist/api/simple-options.d.ts.map +1 -1
  85. package/dist/api/simple-options.js +22 -11
  86. package/dist/api/simple-options.js.map +1 -1
  87. package/dist/api/system-one-shared.d.ts +23 -0
  88. package/dist/api/system-one-shared.d.ts.map +1 -0
  89. package/dist/api/system-one-shared.js +183 -0
  90. package/dist/api/system-one-shared.js.map +1 -0
  91. package/dist/api/transform-messages.d.ts.map +1 -1
  92. package/dist/api/transform-messages.js +21 -7
  93. package/dist/api/transform-messages.js.map +1 -1
  94. package/dist/api/typesafe-system-one.d.ts +4 -0
  95. package/dist/api/typesafe-system-one.d.ts.map +1 -0
  96. package/dist/api/typesafe-system-one.js +19 -0
  97. package/dist/api/typesafe-system-one.js.map +1 -0
  98. package/dist/api/typesafe-system-one.lazy.d.ts +3 -0
  99. package/dist/api/typesafe-system-one.lazy.d.ts.map +1 -0
  100. package/dist/api/typesafe-system-one.lazy.js +4 -0
  101. package/dist/api/typesafe-system-one.lazy.js.map +1 -0
  102. package/dist/auth/credential-store.d.ts +6 -6
  103. package/dist/auth/credential-store.d.ts.map +1 -1
  104. package/dist/auth/credential-store.js +24 -15
  105. package/dist/auth/credential-store.js.map +1 -1
  106. package/dist/auth/helpers.d.ts +1 -0
  107. package/dist/auth/helpers.d.ts.map +1 -1
  108. package/dist/auth/helpers.js +8 -3
  109. package/dist/auth/helpers.js.map +1 -1
  110. package/dist/auth/oauth/anthropic.d.ts.map +1 -1
  111. package/dist/auth/oauth/anthropic.js +28 -131
  112. package/dist/auth/oauth/anthropic.js.map +1 -1
  113. package/dist/auth/oauth/callback-server.d.ts +55 -0
  114. package/dist/auth/oauth/callback-server.d.ts.map +1 -0
  115. package/dist/auth/oauth/callback-server.js +146 -0
  116. package/dist/auth/oauth/callback-server.js.map +1 -0
  117. package/dist/auth/oauth/device-code.d.ts +2 -1
  118. package/dist/auth/oauth/device-code.d.ts.map +1 -1
  119. package/dist/auth/oauth/device-code.js +5 -5
  120. package/dist/auth/oauth/device-code.js.map +1 -1
  121. package/dist/auth/oauth/github-copilot.d.ts.map +1 -1
  122. package/dist/auth/oauth/github-copilot.js +121 -41
  123. package/dist/auth/oauth/github-copilot.js.map +1 -1
  124. package/dist/auth/oauth/google-antigravity.d.ts +3 -3
  125. package/dist/auth/oauth/google-antigravity.d.ts.map +1 -1
  126. package/dist/auth/oauth/google-antigravity.js +17 -9
  127. package/dist/auth/oauth/google-antigravity.js.map +1 -1
  128. package/dist/auth/oauth/google-gemini-cli.d.ts +3 -3
  129. package/dist/auth/oauth/google-gemini-cli.d.ts.map +1 -1
  130. package/dist/auth/oauth/google-gemini-cli.js +18 -10
  131. package/dist/auth/oauth/google-gemini-cli.js.map +1 -1
  132. package/dist/auth/oauth/kimi-coding.d.ts.map +1 -1
  133. package/dist/auth/oauth/kimi-coding.js +5 -6
  134. package/dist/auth/oauth/kimi-coding.js.map +1 -1
  135. package/dist/auth/oauth/load.d.ts +4 -0
  136. package/dist/auth/oauth/load.d.ts.map +1 -1
  137. package/dist/auth/oauth/load.js +10 -0
  138. package/dist/auth/oauth/load.js.map +1 -1
  139. package/dist/auth/oauth/meta.d.ts +17 -0
  140. package/dist/auth/oauth/meta.d.ts.map +1 -0
  141. package/dist/auth/oauth/meta.js +190 -0
  142. package/dist/auth/oauth/meta.js.map +1 -0
  143. package/dist/auth/oauth/openai-chatgpt.d.ts +9 -0
  144. package/dist/auth/oauth/openai-chatgpt.d.ts.map +1 -0
  145. package/dist/auth/oauth/openai-chatgpt.js +266 -0
  146. package/dist/auth/oauth/openai-chatgpt.js.map +1 -0
  147. package/dist/auth/oauth/openai-codex.d.ts +1 -1
  148. package/dist/auth/oauth/openai-codex.d.ts.map +1 -1
  149. package/dist/auth/oauth/openai-codex.js +33 -130
  150. package/dist/auth/oauth/openai-codex.js.map +1 -1
  151. package/dist/auth/oauth/openrouter.d.ts +1 -1
  152. package/dist/auth/oauth/openrouter.d.ts.map +1 -1
  153. package/dist/auth/oauth/openrouter.js +26 -145
  154. package/dist/auth/oauth/openrouter.js.map +1 -1
  155. package/dist/auth/oauth/radius.d.ts +1 -1
  156. package/dist/auth/oauth/radius.d.ts.map +1 -1
  157. package/dist/auth/oauth/radius.js +28 -93
  158. package/dist/auth/oauth/radius.js.map +1 -1
  159. package/dist/auth/oauth/xai.d.ts.map +1 -1
  160. package/dist/auth/oauth/xai.js +13 -12
  161. package/dist/auth/oauth/xai.js.map +1 -1
  162. package/dist/auth/resolve.d.ts +3 -8
  163. package/dist/auth/resolve.d.ts.map +1 -1
  164. package/dist/auth/resolve.js +27 -31
  165. package/dist/auth/resolve.js.map +1 -1
  166. package/dist/auth/types.d.ts +29 -8
  167. package/dist/auth/types.d.ts.map +1 -1
  168. package/dist/auth/types.js.map +1 -1
  169. package/dist/bun-oauth.d.ts.map +1 -1
  170. package/dist/bun-oauth.js +4 -0
  171. package/dist/bun-oauth.js.map +1 -1
  172. package/dist/cli.js +4 -1
  173. package/dist/cli.js.map +1 -1
  174. package/dist/compat.d.ts +3 -3
  175. package/dist/compat.d.ts.map +1 -1
  176. package/dist/compat.js +9 -6
  177. package/dist/compat.js.map +1 -1
  178. package/dist/env-api-keys.d.ts +5 -0
  179. package/dist/env-api-keys.d.ts.map +1 -1
  180. package/dist/env-api-keys.js +9 -1
  181. package/dist/env-api-keys.js.map +1 -1
  182. package/dist/image-models.d.ts +19 -8
  183. package/dist/image-models.d.ts.map +1 -1
  184. package/dist/image-models.js +14 -13
  185. package/dist/image-models.js.map +1 -1
  186. package/dist/images-api-registry.d.ts +7 -7
  187. package/dist/images-api-registry.d.ts.map +1 -1
  188. package/dist/images-api-registry.js.map +1 -1
  189. package/dist/images.d.ts +7 -2
  190. package/dist/images.d.ts.map +1 -1
  191. package/dist/images.js +5 -0
  192. package/dist/images.js.map +1 -1
  193. package/dist/index.d.ts +4 -3
  194. package/dist/index.d.ts.map +1 -1
  195. package/dist/index.js +3 -2
  196. package/dist/index.js.map +1 -1
  197. package/dist/model-catalog.d.ts +25 -9
  198. package/dist/model-catalog.d.ts.map +1 -1
  199. package/dist/model-catalog.js +14 -2
  200. package/dist/model-catalog.js.map +1 -1
  201. package/dist/models-store.d.ts +12 -14
  202. package/dist/models-store.d.ts.map +1 -1
  203. package/dist/models-store.js +7 -6
  204. package/dist/models-store.js.map +1 -1
  205. package/dist/models.d.ts +138 -47
  206. package/dist/models.d.ts.map +1 -1
  207. package/dist/models.generated.d.ts +135 -37
  208. package/dist/models.generated.d.ts.map +1 -1
  209. package/dist/models.generated.js +135 -37
  210. package/dist/models.generated.js.map +1 -1
  211. package/dist/models.js +391 -99
  212. package/dist/models.js.map +1 -1
  213. package/dist/providers/all.d.ts +19 -13
  214. package/dist/providers/all.d.ts.map +1 -1
  215. package/dist/providers/all.js +31 -21
  216. package/dist/providers/all.js.map +1 -1
  217. package/dist/providers/amazon-bedrock.d.ts.map +1 -1
  218. package/dist/providers/amazon-bedrock.js +15 -7
  219. package/dist/providers/amazon-bedrock.js.map +1 -1
  220. package/dist/providers/amazon-bedrock.models.d.ts +4 -2
  221. package/dist/providers/amazon-bedrock.models.d.ts.map +1 -1
  222. package/dist/providers/amazon-bedrock.models.js +4 -2
  223. package/dist/providers/amazon-bedrock.models.js.map +1 -1
  224. package/dist/providers/ant-ling.models.d.ts +4 -2
  225. package/dist/providers/ant-ling.models.d.ts.map +1 -1
  226. package/dist/providers/ant-ling.models.js +4 -2
  227. package/dist/providers/ant-ling.models.js.map +1 -1
  228. package/dist/providers/anthropic.d.ts.map +1 -1
  229. package/dist/providers/anthropic.js +39 -8
  230. package/dist/providers/anthropic.js.map +1 -1
  231. package/dist/providers/anthropic.models.d.ts +4 -2
  232. package/dist/providers/anthropic.models.d.ts.map +1 -1
  233. package/dist/providers/anthropic.models.js +4 -2
  234. package/dist/providers/anthropic.models.js.map +1 -1
  235. package/dist/providers/azure-openai-responses.models.d.ts +4 -2
  236. package/dist/providers/azure-openai-responses.models.d.ts.map +1 -1
  237. package/dist/providers/azure-openai-responses.models.js +4 -2
  238. package/dist/providers/azure-openai-responses.models.js.map +1 -1
  239. package/dist/providers/baseten.d.ts +3 -0
  240. package/dist/providers/baseten.d.ts.map +1 -0
  241. package/dist/providers/baseten.js +15 -0
  242. package/dist/providers/baseten.js.map +1 -0
  243. package/dist/providers/baseten.models.d.ts +6 -0
  244. package/dist/providers/baseten.models.d.ts.map +1 -0
  245. package/dist/providers/baseten.models.js +8 -0
  246. package/dist/providers/baseten.models.js.map +1 -0
  247. package/dist/providers/cerebras.models.d.ts +4 -2
  248. package/dist/providers/cerebras.models.d.ts.map +1 -1
  249. package/dist/providers/cerebras.models.js +4 -2
  250. package/dist/providers/cerebras.models.js.map +1 -1
  251. package/dist/providers/cloudflare-ai-gateway.d.ts +3 -1
  252. package/dist/providers/cloudflare-ai-gateway.d.ts.map +1 -1
  253. package/dist/providers/cloudflare-ai-gateway.js +4 -0
  254. package/dist/providers/cloudflare-ai-gateway.js.map +1 -1
  255. package/dist/providers/cloudflare-ai-gateway.models.d.ts +4 -2
  256. package/dist/providers/cloudflare-ai-gateway.models.d.ts.map +1 -1
  257. package/dist/providers/cloudflare-ai-gateway.models.js +4 -2
  258. package/dist/providers/cloudflare-ai-gateway.models.js.map +1 -1
  259. package/dist/providers/cloudflare-auth.d.ts.map +1 -1
  260. package/dist/providers/cloudflare-auth.js +15 -10
  261. package/dist/providers/cloudflare-auth.js.map +1 -1
  262. package/dist/providers/cloudflare-stream.d.ts +6 -2
  263. package/dist/providers/cloudflare-stream.d.ts.map +1 -1
  264. package/dist/providers/cloudflare-stream.js +6 -0
  265. package/dist/providers/cloudflare-stream.js.map +1 -1
  266. package/dist/providers/cloudflare-workers-ai.d.ts.map +1 -1
  267. package/dist/providers/cloudflare-workers-ai.js +10 -3
  268. package/dist/providers/cloudflare-workers-ai.js.map +1 -1
  269. package/dist/providers/cloudflare-workers-ai.models.d.ts +4 -2
  270. package/dist/providers/cloudflare-workers-ai.models.d.ts.map +1 -1
  271. package/dist/providers/cloudflare-workers-ai.models.js +4 -2
  272. package/dist/providers/cloudflare-workers-ai.models.js.map +1 -1
  273. package/dist/providers/data/.manifest.json +1 -1
  274. package/dist/providers/data/amazon-bedrock.json +1 -1
  275. package/dist/providers/data/ant-ling.json +1 -1
  276. package/dist/providers/data/anthropic.json +1 -1
  277. package/dist/providers/data/azure-openai-responses.json +1 -1
  278. package/dist/providers/data/baseten.json +1 -0
  279. package/dist/providers/data/cerebras.json +1 -1
  280. package/dist/providers/data/cloudflare-ai-gateway.json +1 -1
  281. package/dist/providers/data/cloudflare-workers-ai.json +1 -1
  282. package/dist/providers/data/deepseek.json +1 -1
  283. package/dist/providers/data/fireworks.json +1 -1
  284. package/dist/providers/data/github-copilot.json +1 -1
  285. package/dist/providers/data/google-vertex.json +1 -1
  286. package/dist/providers/data/google.json +1 -1
  287. package/dist/providers/data/groq.json +1 -1
  288. package/dist/providers/data/huggingface.json +1 -1
  289. package/dist/providers/data/kimi-coding.json +1 -1
  290. package/dist/providers/data/meta.json +1 -0
  291. package/dist/providers/data/minimax-cn.json +1 -1
  292. package/dist/providers/data/minimax.json +1 -1
  293. package/dist/providers/data/mistral.json +1 -1
  294. package/dist/providers/data/moonshotai-cn.json +1 -1
  295. package/dist/providers/data/moonshotai.json +1 -1
  296. package/dist/providers/data/nvidia.json +1 -1
  297. package/dist/providers/data/openai-codex.json +1 -1
  298. package/dist/providers/data/openai.json +1 -1
  299. package/dist/providers/data/opencode-go.json +1 -1
  300. package/dist/providers/data/opencode.json +1 -1
  301. package/dist/providers/data/openrouter.json +1 -1
  302. package/dist/providers/data/qwen-token-plan-cn.json +1 -1
  303. package/dist/providers/data/qwen-token-plan-individual.json +1 -0
  304. package/dist/providers/data/qwen-token-plan.json +1 -1
  305. package/dist/providers/data/radius.json +1 -0
  306. package/dist/providers/data/together.json +1 -1
  307. package/dist/providers/data/typesafe.json +1 -0
  308. package/dist/providers/data/vercel-ai-gateway.json +1 -1
  309. package/dist/providers/data/xai.json +1 -1
  310. package/dist/providers/data/xiaomi-token-plan-ams.json +1 -1
  311. package/dist/providers/data/xiaomi-token-plan-cn.json +1 -1
  312. package/dist/providers/data/xiaomi-token-plan-sgp.json +1 -1
  313. package/dist/providers/data/xiaomi.json +1 -1
  314. package/dist/providers/data/zai-coding-cn.json +1 -1
  315. package/dist/providers/data/zai.json +1 -1
  316. package/dist/providers/deepseek.models.d.ts +4 -2
  317. package/dist/providers/deepseek.models.d.ts.map +1 -1
  318. package/dist/providers/deepseek.models.js +4 -2
  319. package/dist/providers/deepseek.models.js.map +1 -1
  320. package/dist/providers/faux.d.ts +19 -13
  321. package/dist/providers/faux.d.ts.map +1 -1
  322. package/dist/providers/faux.js +109 -18
  323. package/dist/providers/faux.js.map +1 -1
  324. package/dist/providers/fireworks.models.d.ts +4 -2
  325. package/dist/providers/fireworks.models.d.ts.map +1 -1
  326. package/dist/providers/fireworks.models.js +4 -2
  327. package/dist/providers/fireworks.models.js.map +1 -1
  328. package/dist/providers/github-copilot.js +1 -1
  329. package/dist/providers/github-copilot.js.map +1 -1
  330. package/dist/providers/github-copilot.models.d.ts +4 -2
  331. package/dist/providers/github-copilot.models.d.ts.map +1 -1
  332. package/dist/providers/github-copilot.models.js +4 -2
  333. package/dist/providers/github-copilot.models.js.map +1 -1
  334. package/dist/providers/google-vertex.d.ts.map +1 -1
  335. package/dist/providers/google-vertex.js +15 -7
  336. package/dist/providers/google-vertex.js.map +1 -1
  337. package/dist/providers/google-vertex.models.d.ts +4 -2
  338. package/dist/providers/google-vertex.models.d.ts.map +1 -1
  339. package/dist/providers/google-vertex.models.js +4 -2
  340. package/dist/providers/google-vertex.models.js.map +1 -1
  341. package/dist/providers/google.models.d.ts +4 -2
  342. package/dist/providers/google.models.d.ts.map +1 -1
  343. package/dist/providers/google.models.js +4 -2
  344. package/dist/providers/google.models.js.map +1 -1
  345. package/dist/providers/groq.models.d.ts +4 -2
  346. package/dist/providers/groq.models.d.ts.map +1 -1
  347. package/dist/providers/groq.models.js +4 -2
  348. package/dist/providers/groq.models.js.map +1 -1
  349. package/dist/providers/huggingface.models.d.ts +4 -2
  350. package/dist/providers/huggingface.models.d.ts.map +1 -1
  351. package/dist/providers/huggingface.models.js +4 -2
  352. package/dist/providers/huggingface.models.js.map +1 -1
  353. package/dist/providers/images/register-builtins.d.ts +1 -1
  354. package/dist/providers/images/register-builtins.d.ts.map +1 -1
  355. package/dist/providers/images/register-builtins.js.map +1 -1
  356. package/dist/providers/kimi-coding.d.ts.map +1 -1
  357. package/dist/providers/kimi-coding.js +1 -0
  358. package/dist/providers/kimi-coding.js.map +1 -1
  359. package/dist/providers/kimi-coding.models.d.ts +4 -2
  360. package/dist/providers/kimi-coding.models.d.ts.map +1 -1
  361. package/dist/providers/kimi-coding.models.js +4 -2
  362. package/dist/providers/kimi-coding.models.js.map +1 -1
  363. package/dist/providers/meta.d.ts +3 -0
  364. package/dist/providers/meta.d.ts.map +1 -0
  365. package/dist/providers/meta.js +24 -0
  366. package/dist/providers/meta.js.map +1 -0
  367. package/dist/providers/meta.models.d.ts +6 -0
  368. package/dist/providers/meta.models.d.ts.map +1 -0
  369. package/dist/providers/meta.models.js +8 -0
  370. package/dist/providers/meta.models.js.map +1 -0
  371. package/dist/providers/minimax-cn.models.d.ts +4 -2
  372. package/dist/providers/minimax-cn.models.d.ts.map +1 -1
  373. package/dist/providers/minimax-cn.models.js +4 -2
  374. package/dist/providers/minimax-cn.models.js.map +1 -1
  375. package/dist/providers/minimax.models.d.ts +4 -2
  376. package/dist/providers/minimax.models.d.ts.map +1 -1
  377. package/dist/providers/minimax.models.js +4 -2
  378. package/dist/providers/minimax.models.js.map +1 -1
  379. package/dist/providers/mistral.models.d.ts +4 -2
  380. package/dist/providers/mistral.models.d.ts.map +1 -1
  381. package/dist/providers/mistral.models.js +4 -2
  382. package/dist/providers/mistral.models.js.map +1 -1
  383. package/dist/providers/moonshotai-cn.models.d.ts +4 -2
  384. package/dist/providers/moonshotai-cn.models.d.ts.map +1 -1
  385. package/dist/providers/moonshotai-cn.models.js +4 -2
  386. package/dist/providers/moonshotai-cn.models.js.map +1 -1
  387. package/dist/providers/moonshotai.models.d.ts +4 -2
  388. package/dist/providers/moonshotai.models.d.ts.map +1 -1
  389. package/dist/providers/moonshotai.models.js +4 -2
  390. package/dist/providers/moonshotai.models.js.map +1 -1
  391. package/dist/providers/nvidia.models.d.ts +4 -2
  392. package/dist/providers/nvidia.models.d.ts.map +1 -1
  393. package/dist/providers/nvidia.models.js +4 -2
  394. package/dist/providers/nvidia.models.js.map +1 -1
  395. package/dist/providers/openai-codex.d.ts.map +1 -1
  396. package/dist/providers/openai-codex.js +6 -2
  397. package/dist/providers/openai-codex.js.map +1 -1
  398. package/dist/providers/openai-codex.models.d.ts +4 -2
  399. package/dist/providers/openai-codex.models.d.ts.map +1 -1
  400. package/dist/providers/openai-codex.models.js +4 -2
  401. package/dist/providers/openai-codex.models.js.map +1 -1
  402. package/dist/providers/openai.d.ts.map +1 -1
  403. package/dist/providers/openai.js +11 -2
  404. package/dist/providers/openai.js.map +1 -1
  405. package/dist/providers/openai.models.d.ts +4 -2
  406. package/dist/providers/openai.models.d.ts.map +1 -1
  407. package/dist/providers/openai.models.js +4 -2
  408. package/dist/providers/openai.models.js.map +1 -1
  409. package/dist/providers/opencode-go.d.ts.map +1 -1
  410. package/dist/providers/opencode-go.js +4 -3
  411. package/dist/providers/opencode-go.js.map +1 -1
  412. package/dist/providers/opencode-go.models.d.ts +4 -2
  413. package/dist/providers/opencode-go.models.d.ts.map +1 -1
  414. package/dist/providers/opencode-go.models.js +4 -2
  415. package/dist/providers/opencode-go.models.js.map +1 -1
  416. package/dist/providers/opencode-headers.d.ts +4 -0
  417. package/dist/providers/opencode-headers.d.ts.map +1 -0
  418. package/dist/providers/opencode-headers.js +22 -0
  419. package/dist/providers/opencode-headers.js.map +1 -0
  420. package/dist/providers/opencode.d.ts +3 -1
  421. package/dist/providers/opencode.d.ts.map +1 -1
  422. package/dist/providers/opencode.js +10 -6
  423. package/dist/providers/opencode.js.map +1 -1
  424. package/dist/providers/opencode.models.d.ts +4 -2
  425. package/dist/providers/opencode.models.d.ts.map +1 -1
  426. package/dist/providers/opencode.models.js +4 -2
  427. package/dist/providers/opencode.models.js.map +1 -1
  428. package/dist/providers/openrouter.d.ts +1 -1
  429. package/dist/providers/openrouter.d.ts.map +1 -1
  430. package/dist/providers/openrouter.js +16 -3
  431. package/dist/providers/openrouter.js.map +1 -1
  432. package/dist/providers/openrouter.models.d.ts +4 -2
  433. package/dist/providers/openrouter.models.d.ts.map +1 -1
  434. package/dist/providers/openrouter.models.js +4 -2
  435. package/dist/providers/openrouter.models.js.map +1 -1
  436. package/dist/providers/qwen-token-plan-cn.models.d.ts +4 -2
  437. package/dist/providers/qwen-token-plan-cn.models.d.ts.map +1 -1
  438. package/dist/providers/qwen-token-plan-cn.models.js +4 -2
  439. package/dist/providers/qwen-token-plan-cn.models.js.map +1 -1
  440. package/dist/providers/qwen-token-plan-individual.d.ts +3 -0
  441. package/dist/providers/qwen-token-plan-individual.d.ts.map +1 -0
  442. package/dist/providers/qwen-token-plan-individual.js +15 -0
  443. package/dist/providers/qwen-token-plan-individual.js.map +1 -0
  444. package/dist/providers/qwen-token-plan-individual.models.d.ts +6 -0
  445. package/dist/providers/qwen-token-plan-individual.models.d.ts.map +1 -0
  446. package/dist/providers/qwen-token-plan-individual.models.js +8 -0
  447. package/dist/providers/qwen-token-plan-individual.models.js.map +1 -0
  448. package/dist/providers/qwen-token-plan.models.d.ts +4 -2
  449. package/dist/providers/qwen-token-plan.models.d.ts.map +1 -1
  450. package/dist/providers/qwen-token-plan.models.js +4 -2
  451. package/dist/providers/qwen-token-plan.models.js.map +1 -1
  452. package/dist/providers/radius.d.ts.map +1 -1
  453. package/dist/providers/radius.js +53 -29
  454. package/dist/providers/radius.js.map +1 -1
  455. package/dist/providers/radius.models.d.ts +6 -0
  456. package/dist/providers/radius.models.d.ts.map +1 -0
  457. package/dist/providers/radius.models.js +8 -0
  458. package/dist/providers/radius.models.js.map +1 -0
  459. package/dist/providers/together.models.d.ts +4 -2
  460. package/dist/providers/together.models.d.ts.map +1 -1
  461. package/dist/providers/together.models.js +4 -2
  462. package/dist/providers/together.models.js.map +1 -1
  463. package/dist/providers/typesafe.d.ts +3 -0
  464. package/dist/providers/typesafe.d.ts.map +1 -0
  465. package/dist/providers/typesafe.js +18 -0
  466. package/dist/providers/typesafe.js.map +1 -0
  467. package/dist/providers/typesafe.models.d.ts +6 -0
  468. package/dist/providers/typesafe.models.d.ts.map +1 -0
  469. package/dist/providers/typesafe.models.js +8 -0
  470. package/dist/providers/typesafe.models.js.map +1 -0
  471. package/dist/providers/vercel-ai-gateway.d.ts.map +1 -1
  472. package/dist/providers/vercel-ai-gateway.js +5 -2
  473. package/dist/providers/vercel-ai-gateway.js.map +1 -1
  474. package/dist/providers/vercel-ai-gateway.models.d.ts +4 -2
  475. package/dist/providers/vercel-ai-gateway.models.d.ts.map +1 -1
  476. package/dist/providers/vercel-ai-gateway.models.js +4 -2
  477. package/dist/providers/vercel-ai-gateway.models.js.map +1 -1
  478. package/dist/providers/xai.d.ts +1 -1
  479. package/dist/providers/xai.d.ts.map +1 -1
  480. package/dist/providers/xai.js +2 -5
  481. package/dist/providers/xai.js.map +1 -1
  482. package/dist/providers/xai.models.d.ts +4 -2
  483. package/dist/providers/xai.models.d.ts.map +1 -1
  484. package/dist/providers/xai.models.js +4 -2
  485. package/dist/providers/xai.models.js.map +1 -1
  486. package/dist/providers/xiaomi-token-plan-ams.models.d.ts +4 -2
  487. package/dist/providers/xiaomi-token-plan-ams.models.d.ts.map +1 -1
  488. package/dist/providers/xiaomi-token-plan-ams.models.js +4 -2
  489. package/dist/providers/xiaomi-token-plan-ams.models.js.map +1 -1
  490. package/dist/providers/xiaomi-token-plan-cn.models.d.ts +4 -2
  491. package/dist/providers/xiaomi-token-plan-cn.models.d.ts.map +1 -1
  492. package/dist/providers/xiaomi-token-plan-cn.models.js +4 -2
  493. package/dist/providers/xiaomi-token-plan-cn.models.js.map +1 -1
  494. package/dist/providers/xiaomi-token-plan-sgp.models.d.ts +4 -2
  495. package/dist/providers/xiaomi-token-plan-sgp.models.d.ts.map +1 -1
  496. package/dist/providers/xiaomi-token-plan-sgp.models.js +4 -2
  497. package/dist/providers/xiaomi-token-plan-sgp.models.js.map +1 -1
  498. package/dist/providers/xiaomi.models.d.ts +4 -2
  499. package/dist/providers/xiaomi.models.d.ts.map +1 -1
  500. package/dist/providers/xiaomi.models.js +4 -2
  501. package/dist/providers/xiaomi.models.js.map +1 -1
  502. package/dist/providers/zai-coding-cn.models.d.ts +4 -2
  503. package/dist/providers/zai-coding-cn.models.d.ts.map +1 -1
  504. package/dist/providers/zai-coding-cn.models.js +4 -2
  505. package/dist/providers/zai-coding-cn.models.js.map +1 -1
  506. package/dist/providers/zai.models.d.ts +4 -2
  507. package/dist/providers/zai.models.d.ts.map +1 -1
  508. package/dist/providers/zai.models.js +4 -2
  509. package/dist/providers/zai.models.js.map +1 -1
  510. package/dist/types.d.ts +411 -127
  511. package/dist/types.d.ts.map +1 -1
  512. package/dist/types.js.map +1 -1
  513. package/dist/utils/abort.d.ts +8 -0
  514. package/dist/utils/abort.d.ts.map +1 -0
  515. package/dist/utils/abort.js +49 -0
  516. package/dist/utils/abort.js.map +1 -0
  517. package/dist/utils/assistant-message-frame.d.ts +77 -0
  518. package/dist/utils/assistant-message-frame.d.ts.map +1 -0
  519. package/dist/utils/assistant-message-frame.js +425 -0
  520. package/dist/utils/assistant-message-frame.js.map +1 -0
  521. package/dist/utils/diagnostics.d.ts +3 -2
  522. package/dist/utils/diagnostics.d.ts.map +1 -1
  523. package/dist/utils/diagnostics.js.map +1 -1
  524. package/dist/utils/draht-user-agent.d.ts +2 -0
  525. package/dist/utils/draht-user-agent.d.ts.map +1 -0
  526. package/dist/utils/draht-user-agent.js +12 -0
  527. package/dist/utils/draht-user-agent.js.map +1 -0
  528. package/dist/utils/error-body.d.ts.map +1 -1
  529. package/dist/utils/error-body.js +23 -4
  530. package/dist/utils/error-body.js.map +1 -1
  531. package/dist/utils/estimate.d.ts +2 -2
  532. package/dist/utils/estimate.d.ts.map +1 -1
  533. package/dist/utils/estimate.js +8 -29
  534. package/dist/utils/estimate.js.map +1 -1
  535. package/dist/utils/event-stream.d.ts.map +1 -1
  536. package/dist/utils/event-stream.js +30 -8
  537. package/dist/utils/event-stream.js.map +1 -1
  538. package/dist/utils/headers.d.ts +1 -1
  539. package/dist/utils/headers.d.ts.map +1 -1
  540. package/dist/utils/headers.js +10 -8
  541. package/dist/utils/headers.js.map +1 -1
  542. package/dist/utils/model-operations.d.ts +11 -0
  543. package/dist/utils/model-operations.d.ts.map +1 -0
  544. package/dist/utils/model-operations.js +47 -0
  545. package/dist/utils/model-operations.js.map +1 -0
  546. package/dist/utils/models-error.d.ts +8 -0
  547. package/dist/utils/models-error.d.ts.map +1 -0
  548. package/dist/utils/models-error.js +19 -0
  549. package/dist/utils/models-error.js.map +1 -0
  550. package/dist/utils/node-http-proxy.d.ts.map +1 -1
  551. package/dist/utils/node-http-proxy.js +53 -12
  552. package/dist/utils/node-http-proxy.js.map +1 -1
  553. package/dist/utils/oauth-page.d.ts.map +1 -0
  554. package/dist/utils/oauth-page.js.map +1 -0
  555. package/dist/utils/overflow.d.ts +11 -1
  556. package/dist/utils/overflow.d.ts.map +1 -1
  557. package/dist/utils/overflow.js +24 -6
  558. package/dist/utils/overflow.js.map +1 -1
  559. package/dist/utils/provider-retry.js +3 -2
  560. package/dist/utils/provider-retry.js.map +1 -1
  561. package/dist/utils/retry.d.ts +6 -1
  562. package/dist/utils/retry.d.ts.map +1 -1
  563. package/dist/utils/retry.js +19 -2
  564. package/dist/utils/retry.js.map +1 -1
  565. package/dist/utils/sleep.d.ts +2 -0
  566. package/dist/utils/sleep.d.ts.map +1 -0
  567. package/dist/utils/sleep.js +15 -0
  568. package/dist/utils/sleep.js.map +1 -0
  569. package/dist/utils/text.d.ts +9 -1
  570. package/dist/utils/text.d.ts.map +1 -1
  571. package/dist/utils/text.js +26 -0
  572. package/dist/utils/text.js.map +1 -1
  573. package/dist/utils/transcript.d.ts +84 -0
  574. package/dist/utils/transcript.d.ts.map +1 -0
  575. package/dist/utils/transcript.js +204 -0
  576. package/dist/utils/transcript.js.map +1 -0
  577. package/dist/utils/uuid.d.ts +2 -2
  578. package/dist/utils/uuid.d.ts.map +1 -1
  579. package/dist/utils/uuid.js +35 -40
  580. package/dist/utils/uuid.js.map +1 -1
  581. package/dist/utils/validation.d.ts.map +1 -1
  582. package/dist/utils/validation.js +40 -0
  583. package/dist/utils/validation.js.map +1 -1
  584. package/package.json +19 -13
  585. package/dist/auth/oauth/oauth-page.d.ts.map +0 -1
  586. package/dist/auth/oauth/oauth-page.js.map +0 -1
  587. package/dist/image-models.generated.d.ts +0 -605
  588. package/dist/image-models.generated.d.ts.map +0 -1
  589. package/dist/image-models.generated.js +0 -607
  590. package/dist/image-models.generated.js.map +0 -1
  591. package/dist/images-models.d.ts +0 -95
  592. package/dist/images-models.d.ts.map +0 -1
  593. package/dist/images-models.js +0 -140
  594. package/dist/images-models.js.map +0 -1
  595. package/dist/providers/openrouter-images.d.ts +0 -3
  596. package/dist/providers/openrouter-images.d.ts.map +0 -1
  597. package/dist/providers/openrouter-images.js +0 -22
  598. package/dist/providers/openrouter-images.js.map +0 -1
  599. package/dist/utils/deferred-tools.d.ts +0 -9
  600. package/dist/utils/deferred-tools.d.ts.map +0 -1
  601. package/dist/utils/deferred-tools.js +0 -36
  602. package/dist/utils/deferred-tools.js.map +0 -1
  603. /package/dist/{auth/oauth → utils}/oauth-page.d.ts +0 -0
  604. /package/dist/{auth/oauth → utils}/oauth-page.js +0 -0
@@ -1,19 +1,23 @@
1
- import { HTTPClient, Mistral } from "@mistralai/mistralai";
2
1
  import { calculateCost, clampThinkingLevel } from "../models.js";
2
+ import { getDrahtUserAgent } from "../utils/draht-user-agent.js";
3
3
  import { AssistantMessageEventStream } from "../utils/event-stream.js";
4
4
  import { shortHash } from "../utils/hash.js";
5
+ import { headersToRecord } from "../utils/headers.js";
5
6
  import { parseStreamingJson } from "../utils/json-parse.js";
6
7
  import { sanitizeSurrogates } from "../utils/sanitize-unicode.js";
7
- import { resolveJsonSchemaStrictSampling } from "./constrained-sampling.js";
8
+ import { getSystemMessageText, renderSystemMessageUpdate } from "../utils/text.js";
9
+ import { getCurrentTools, resolveTranscript } from "../utils/transcript.js";
10
+ import { getJsonSchemaToolParameters, resolveJsonSchemaStrictSampling } from "./constrained-sampling.js";
8
11
  import { buildBaseOptions } from "./simple-options.js";
9
12
  import { transformMessages } from "./transform-messages.js";
10
13
  const MISTRAL_TOOL_CALL_ID_LENGTH = 9;
11
14
  const MAX_MISTRAL_ERROR_BODY_CHARS = 4000;
12
15
  /**
13
- * Stream responses from Mistral using `chat.stream`.
16
+ * Stream responses from the native Mistral Chat Completions endpoint.
14
17
  */
15
18
  export const stream = (model, context, options) => {
16
19
  const stream = new AssistantMessageEventStream();
20
+ const normalizedContext = resolveTranscript(context, model.compat?.supportsMidConvoSystemMessages);
17
21
  (async () => {
18
22
  const output = createOutput(model);
19
23
  try {
@@ -21,22 +25,16 @@ export const stream = (model, context, options) => {
21
25
  if (!apiKey) {
22
26
  throw new Error(`No API key for provider: ${model.provider}`);
23
27
  }
24
- // Intentionally per-request: avoids shared SDK mutable state across concurrent consumers.
25
- const mistral = new Mistral({
26
- apiKey,
27
- serverURL: model.baseUrl,
28
- ...(options?.fetch ? { httpClient: new HTTPClient({ fetcher: options.fetch }) } : {}),
29
- });
30
28
  const normalizeMistralToolCallId = createMistralToolCallIdNormalizer();
31
- const transformedMessages = transformMessages(context.messages, model, (id) => normalizeMistralToolCallId(id));
32
- let payload = buildChatPayload(model, context, transformedMessages, options);
29
+ const transformedMessages = transformMessages(normalizedContext.messages, model, (id) => normalizeMistralToolCallId(id));
30
+ let payload = buildChatPayload(model, normalizedContext, transformedMessages, options);
33
31
  const nextPayload = await options?.onPayload?.(payload, model);
34
32
  if (nextPayload !== undefined) {
35
33
  payload = nextPayload;
36
34
  }
37
- const mistralStream = await mistral.chat.stream(payload, buildRequestOptions(model, options));
35
+ const mistralStream = await requestMistralStream(model, payload, apiKey, options);
38
36
  stream.push({ type: "start", partial: output });
39
- await consumeChatStream(model, output, stream, mistralStream);
37
+ await consumeChatStream(model, output, stream, mistralStream, options?.onProviderStreamEvent);
40
38
  if (options?.signal?.aborted) {
41
39
  throw new Error("Request was aborted");
42
40
  }
@@ -70,14 +68,23 @@ export const streamSimple = (model, context, options) => {
70
68
  if (!apiKey) {
71
69
  throw new Error(`No API key for provider: ${model.provider}`);
72
70
  }
73
- const base = buildBaseOptions(model, context, options, apiKey);
71
+ const base = {
72
+ ...buildBaseOptions(model, context, options, apiKey),
73
+ toolChoice: options?.toolChoice,
74
+ };
74
75
  const clampedReasoning = options?.reasoning ? clampThinkingLevel(model, options.reasoning) : undefined;
75
76
  const reasoning = clampedReasoning === "off" ? undefined : clampedReasoning;
76
- const shouldUseReasoning = model.reasoning && reasoning !== undefined;
77
+ // Models with a thinking level map use `reasoning_effort`; other reasoning models use `prompt_mode`.
78
+ const effortMap = model.reasoning ? model.thinkingLevelMap : undefined;
79
+ const reasoningEffort = effortMap
80
+ ? reasoning
81
+ ? (effortMap[reasoning] ?? "high")
82
+ : (effortMap.off ?? undefined)
83
+ : undefined;
77
84
  return stream(model, context, {
78
85
  ...base,
79
- promptMode: shouldUseReasoning && usesPromptModeReasoning(model) ? "reasoning" : undefined,
80
- reasoningEffort: shouldUseReasoning && usesReasoningEffort(model) ? mapReasoningEffort(model, reasoning) : undefined,
86
+ promptMode: model.reasoning && !effortMap && reasoning ? "reasoning" : undefined,
87
+ reasoningEffort: reasoningEffort,
81
88
  });
82
89
  };
83
90
  function createOutput(model) {
@@ -131,9 +138,9 @@ function deriveMistralToolCallId(id, attempt) {
131
138
  }
132
139
  function formatMistralError(error) {
133
140
  if (error instanceof Error) {
134
- const sdkError = error;
135
- const statusCode = typeof sdkError.statusCode === "number" ? sdkError.statusCode : undefined;
136
- const bodyText = typeof sdkError.body === "string" ? sdkError.body.trim() : undefined;
141
+ const httpError = error;
142
+ const statusCode = typeof httpError.statusCode === "number" ? httpError.statusCode : undefined;
143
+ const bodyText = typeof httpError.body === "string" ? httpError.body.trim() : undefined;
137
144
  if (statusCode !== undefined && bodyText) {
138
145
  return `Mistral API error (${statusCode}): ${truncateErrorText(bodyText, MAX_MISTRAL_ERROR_BODY_CHARS)}`;
139
146
  }
@@ -157,26 +164,200 @@ function safeJsonStringify(value) {
157
164
  return String(value);
158
165
  }
159
166
  }
160
- function buildRequestOptions(model, options) {
161
- const requestOptions = {
162
- retries: { strategy: "none" },
167
+ async function requestMistralStream(model, payload, apiKey, options) {
168
+ const baseUrl = new URL(model.baseUrl);
169
+ baseUrl.pathname = `${baseUrl.pathname.replace(/\/+$/u, "")}/`;
170
+ const url = new URL("v1/chat/completions", baseUrl);
171
+ const headers = buildMistralHeaders(model, apiKey, options);
172
+ const timeoutSignal = AbortSignal.timeout(options?.timeoutMs ?? 60_000);
173
+ const signal = options?.signal ? AbortSignal.any([options.signal, timeoutSignal]) : timeoutSignal;
174
+ const response = await (options?.fetch ?? globalThis.fetch)(url, {
175
+ method: "POST",
176
+ headers,
177
+ body: JSON.stringify(toMistralWirePayload(payload)),
178
+ signal,
179
+ });
180
+ await options?.onResponse?.({ status: response.status, headers: headersToRecord(response.headers) }, model);
181
+ if (!response.ok) {
182
+ const body = await response.text();
183
+ throw new MistralHttpError(response.status, body, response.statusText);
184
+ }
185
+ if (!response.body) {
186
+ throw new Error("Mistral response has no body");
187
+ }
188
+ return readMistralEvents(response.body, signal);
189
+ }
190
+ class MistralHttpError extends Error {
191
+ statusCode;
192
+ body;
193
+ constructor(statusCode, body, statusText) {
194
+ super(statusText || `Request failed with status ${statusCode}`);
195
+ this.name = "MistralHttpError";
196
+ this.statusCode = statusCode;
197
+ this.body = body;
198
+ }
199
+ }
200
+ function buildMistralHeaders(model, apiKey, options) {
201
+ const headers = new Headers({
202
+ "User-Agent": getDrahtUserAgent(),
203
+ accept: "text/event-stream",
204
+ authorization: `Bearer ${apiKey}`,
205
+ "content-type": "application/json",
206
+ });
207
+ applyMistralHeaderOverrides(headers, model.headers);
208
+ applyMistralHeaderOverrides(headers, options?.headers);
209
+ const hasExplicitAffinity = hasMistralHeaderOverride(model.headers, "x-affinity") || hasMistralHeaderOverride(options?.headers, "x-affinity");
210
+ if (shouldUsePromptCaching(options) && !hasExplicitAffinity) {
211
+ headers.set("x-affinity", options.sessionId);
212
+ }
213
+ return headers;
214
+ }
215
+ function applyMistralHeaderOverrides(headers, overrides) {
216
+ if (!overrides)
217
+ return;
218
+ for (const [name, value] of Object.entries(overrides)) {
219
+ if (value === null)
220
+ headers.delete(name);
221
+ else
222
+ headers.set(name, value);
223
+ }
224
+ }
225
+ function hasMistralHeaderOverride(overrides, target) {
226
+ return !!overrides && Object.keys(overrides).some((name) => name.toLowerCase() === target);
227
+ }
228
+ function toMistralWirePayload(payload) {
229
+ const wirePayload = { ...payload };
230
+ for (const [source, target] of [
231
+ ["topP", "top_p"],
232
+ ["maxTokens", "max_tokens"],
233
+ ["randomSeed", "random_seed"],
234
+ ["responseFormat", "response_format"],
235
+ ["toolChoice", "tool_choice"],
236
+ ["presencePenalty", "presence_penalty"],
237
+ ["frequencyPenalty", "frequency_penalty"],
238
+ ["parallelToolCalls", "parallel_tool_calls"],
239
+ ["reasoningEffort", "reasoning_effort"],
240
+ ["promptMode", "prompt_mode"],
241
+ ["promptCacheKey", "prompt_cache_key"],
242
+ ["safePrompt", "safe_prompt"],
243
+ ]) {
244
+ remapMistralProperty(wirePayload, source, target);
245
+ }
246
+ wirePayload.messages = payload.messages.map((message) => toMistralWireMessage(message));
247
+ const responseFormat = wirePayload.response_format;
248
+ if (isMistralRecord(responseFormat)) {
249
+ const wireResponseFormat = { ...responseFormat };
250
+ remapMistralProperty(wireResponseFormat, "jsonSchema", "json_schema");
251
+ const jsonSchema = wireResponseFormat.json_schema;
252
+ if (isMistralRecord(jsonSchema)) {
253
+ const wireJsonSchema = { ...jsonSchema };
254
+ remapMistralProperty(wireJsonSchema, "schemaDefinition", "schema");
255
+ wireResponseFormat.json_schema = wireJsonSchema;
256
+ }
257
+ wirePayload.response_format = wireResponseFormat;
258
+ }
259
+ return wirePayload;
260
+ }
261
+ function toMistralWireMessage(message) {
262
+ const wireMessage = { ...message };
263
+ remapMistralProperty(wireMessage, "toolCalls", "tool_calls");
264
+ remapMistralProperty(wireMessage, "toolCallId", "tool_call_id");
265
+ if (Array.isArray(message.content)) {
266
+ wireMessage.content = message.content.map((chunk) => toMistralWireContentChunk(chunk));
267
+ }
268
+ return wireMessage;
269
+ }
270
+ function toMistralWireContentChunk(chunk) {
271
+ const wireChunk = { ...chunk };
272
+ for (const [source, target] of [
273
+ ["imageUrl", "image_url"],
274
+ ["documentUrl", "document_url"],
275
+ ["documentName", "document_name"],
276
+ ["fileId", "file_id"],
277
+ ["referenceIds", "reference_ids"],
278
+ ["inputAudio", "input_audio"],
279
+ ]) {
280
+ remapMistralProperty(wireChunk, source, target);
281
+ }
282
+ return wireChunk;
283
+ }
284
+ function remapMistralProperty(record, source, target) {
285
+ if (!(source in record))
286
+ return;
287
+ record[target] = record[source];
288
+ delete record[source];
289
+ }
290
+ function isMistralRecord(value) {
291
+ return typeof value === "object" && value !== null && !Array.isArray(value);
292
+ }
293
+ const MISTRAL_STREAM_DONE = Symbol("mistral-stream-done");
294
+ async function* readMistralEvents(body, signal) {
295
+ const reader = body.getReader();
296
+ const decoder = new TextDecoder();
297
+ let buffer = "";
298
+ const onAbort = () => {
299
+ void reader.cancel().catch(() => { });
163
300
  };
164
- if (options?.signal)
165
- requestOptions.signal = options.signal;
166
- const headers = {};
167
- if (model.headers)
168
- Object.assign(headers, model.headers);
169
- if (options?.headers)
170
- Object.assign(headers, options.headers);
171
- // Mistral infrastructure uses `x-affinity` for KV-cache reuse (prefix caching).
172
- // Respect explicit caller-provided header values.
173
- if (shouldUsePromptCaching(options) && !headers["x-affinity"]) {
174
- headers["x-affinity"] = options.sessionId;
301
+ signal.addEventListener("abort", onAbort, { once: true });
302
+ try {
303
+ while (true) {
304
+ if (signal.aborted)
305
+ throw signal.reason;
306
+ const { done, value } = await reader.read();
307
+ if (signal.aborted)
308
+ throw signal.reason;
309
+ buffer += done ? decoder.decode() : decoder.decode(value, { stream: true });
310
+ let boundary = findMistralEventBoundary(buffer);
311
+ while (boundary) {
312
+ const event = parseMistralEvent(buffer.slice(0, boundary.index));
313
+ buffer = buffer.slice(boundary.index + boundary.length);
314
+ if (event === MISTRAL_STREAM_DONE)
315
+ return;
316
+ if (event)
317
+ yield event;
318
+ boundary = findMistralEventBoundary(buffer);
319
+ }
320
+ if (done)
321
+ break;
322
+ }
323
+ if (buffer.trim()) {
324
+ const event = parseMistralEvent(buffer);
325
+ if (event !== MISTRAL_STREAM_DONE && event)
326
+ yield event;
327
+ }
175
328
  }
176
- if (Object.keys(headers).length > 0) {
177
- requestOptions.headers = headers;
329
+ finally {
330
+ signal.removeEventListener("abort", onAbort);
331
+ try {
332
+ await reader.cancel();
333
+ }
334
+ catch { }
335
+ try {
336
+ reader.releaseLock();
337
+ }
338
+ catch { }
178
339
  }
179
- return requestOptions;
340
+ }
341
+ function findMistralEventBoundary(buffer) {
342
+ const match = /\r\n\r\n|\r\n\r|\r\n\n|\r\r\n|\n\r\n|\r\r|\n\r|\n\n/u.exec(buffer);
343
+ return match?.index === undefined ? undefined : { index: match.index, length: match[0].length };
344
+ }
345
+ function parseMistralEvent(raw) {
346
+ const data = raw
347
+ .split(/\r\n|\r|\n/u)
348
+ .filter((line) => line.startsWith("data:"))
349
+ .map((line) => line.slice(5).trimStart())
350
+ .join("\n")
351
+ .trim();
352
+ if (!data)
353
+ return undefined;
354
+ if (data === "[DONE]")
355
+ return MISTRAL_STREAM_DONE;
356
+ const parsed = JSON.parse(data);
357
+ if (!isMistralRecord(parsed) || !Array.isArray(parsed.choices)) {
358
+ throw new Error("Invalid Mistral streaming event");
359
+ }
360
+ return { data: parsed };
180
361
  }
181
362
  function buildChatPayload(model, context, messages, options) {
182
363
  const payload = {
@@ -184,8 +365,9 @@ function buildChatPayload(model, context, messages, options) {
184
365
  stream: true,
185
366
  messages: toChatMessages(messages, model.input.includes("image")),
186
367
  };
187
- if (context.tools?.length)
188
- payload.tools = toFunctionTools(context.tools);
368
+ const currentTools = getCurrentTools(context.messages);
369
+ if (currentTools.length > 0)
370
+ payload.tools = toFunctionTools(currentTools);
189
371
  if (options?.temperature !== undefined)
190
372
  payload.temperature = options.temperature;
191
373
  if (options?.maxTokens !== undefined)
@@ -198,12 +380,6 @@ function buildChatPayload(model, context, messages, options) {
198
380
  payload.reasoningEffort = options.reasoningEffort;
199
381
  if (shouldUsePromptCaching(options))
200
382
  payload.promptCacheKey = options.sessionId;
201
- if (context.systemPrompt) {
202
- payload.messages.unshift({
203
- role: "system",
204
- content: sanitizeSurrogates(context.systemPrompt),
205
- });
206
- }
207
383
  return payload;
208
384
  }
209
385
  function shouldUsePromptCaching(options) {
@@ -221,7 +397,7 @@ function getMistralCachedPromptTokens(usage, promptTokens) {
221
397
  const cachedTokens = typeof rawCachedTokens === "number" && Number.isFinite(rawCachedTokens) ? rawCachedTokens : 0;
222
398
  return Math.min(promptTokens, Math.max(0, cachedTokens));
223
399
  }
224
- async function consumeChatStream(model, output, stream, mistralStream) {
400
+ async function consumeChatStream(model, output, stream, mistralStream, onProviderStreamEvent) {
225
401
  let currentBlock = null;
226
402
  const blocks = output.content;
227
403
  const blockIndex = () => blocks.length - 1;
@@ -249,27 +425,28 @@ async function consumeChatStream(model, output, stream, mistralStream) {
249
425
  };
250
426
  for await (const event of mistralStream) {
251
427
  const chunk = event.data;
428
+ await onProviderStreamEvent?.(chunk, model);
252
429
  // Mistral's streamed CompletionChunk carries an id field. Keep the first non-empty one,
253
430
  // mirroring how OpenAI-style streaming exposes a stable response identifier per stream.
254
431
  output.responseId ||= chunk.id;
255
432
  if (chunk.usage) {
256
- const promptTokens = chunk.usage.promptTokens || 0;
433
+ const promptTokens = chunk.usage.prompt_tokens || 0;
257
434
  const cachedPromptTokens = getMistralCachedPromptTokens(chunk.usage, promptTokens);
258
435
  output.usage.input = Math.max(0, promptTokens - cachedPromptTokens);
259
- output.usage.output = chunk.usage.completionTokens || 0;
436
+ output.usage.output = chunk.usage.completion_tokens || 0;
260
437
  output.usage.cacheRead = cachedPromptTokens;
261
438
  output.usage.cacheWrite = 0;
262
439
  output.usage.totalTokens =
263
- chunk.usage.totalTokens ||
440
+ chunk.usage.total_tokens ||
264
441
  output.usage.input + output.usage.output + output.usage.cacheRead + output.usage.cacheWrite;
265
442
  calculateCost(model, output.usage);
266
443
  }
267
444
  const choice = chunk.choices[0];
268
445
  if (!choice)
269
446
  continue;
270
- if (choice.finishReason) {
271
- output.rawStopReason = choice.finishReason;
272
- const stopReasonResult = mapChatStopReason(choice.finishReason);
447
+ if (choice.finish_reason) {
448
+ output.rawStopReason = choice.finish_reason;
449
+ const stopReasonResult = mapChatStopReason(choice.finish_reason);
273
450
  output.stopReason = stopReasonResult.stopReason;
274
451
  if (stopReasonResult.errorMessage) {
275
452
  output.errorMessage = stopReasonResult.errorMessage;
@@ -281,6 +458,10 @@ async function consumeChatStream(model, output, stream, mistralStream) {
281
458
  for (const item of contentItems) {
282
459
  if (typeof item === "string") {
283
460
  const textDelta = sanitizeSurrogates(item);
461
+ // GLM models on Mistral send empty content deltas around thinking and tool calls.
462
+ // Opening a block for them splits thinking into multiple blocks, which Mistral rejects on replay.
463
+ if (!textDelta)
464
+ continue;
284
465
  if (!currentBlock || currentBlock.type !== "text") {
285
466
  finishCurrentBlock(currentBlock);
286
467
  currentBlock = { type: "text", text: "" };
@@ -297,8 +478,8 @@ async function consumeChatStream(model, output, stream, mistralStream) {
297
478
  continue;
298
479
  }
299
480
  if (item.type === "thinking") {
300
- const deltaText = item.thinking
301
- .map((part) => ("text" in part ? part.text : ""))
481
+ const deltaText = (item.thinking ?? [])
482
+ .map((part) => part.text ?? "")
302
483
  .filter((text) => text.length > 0)
303
484
  .join("");
304
485
  const thinkingDelta = sanitizeSurrogates(deltaText);
@@ -320,7 +501,9 @@ async function consumeChatStream(model, output, stream, mistralStream) {
320
501
  continue;
321
502
  }
322
503
  if (item.type === "text") {
323
- const textDelta = sanitizeSurrogates(item.text);
504
+ const textDelta = sanitizeSurrogates(item.text ?? "");
505
+ if (!textDelta)
506
+ continue;
324
507
  if (!currentBlock || currentBlock.type !== "text") {
325
508
  finishCurrentBlock(currentBlock);
326
509
  currentBlock = { type: "text", text: "" };
@@ -337,7 +520,7 @@ async function consumeChatStream(model, output, stream, mistralStream) {
337
520
  }
338
521
  }
339
522
  }
340
- const toolCalls = delta.toolCalls || [];
523
+ const toolCalls = delta.tool_calls || [];
341
524
  for (const toolCall of toolCalls) {
342
525
  if (currentBlock) {
343
526
  finishCurrentBlock(currentBlock);
@@ -346,7 +529,7 @@ async function consumeChatStream(model, output, stream, mistralStream) {
346
529
  const callId = toolCall.id && toolCall.id !== "null"
347
530
  ? toolCall.id
348
531
  : deriveMistralToolCallId(`toolcall:${toolCall.index ?? 0}`, 0);
349
- const key = `${callId}:${toolCall.index || 0}`;
532
+ const key = toolCall.index ?? callId;
350
533
  const existingIndex = toolBlocksByKey.get(key);
351
534
  let block;
352
535
  if (existingIndex !== undefined) {
@@ -406,7 +589,7 @@ function toFunctionTools(tools) {
406
589
  function: {
407
590
  name: tool.name,
408
591
  description: tool.description,
409
- parameters: stripSymbolKeys(tool.parameters),
592
+ parameters: stripSymbolKeys(getJsonSchemaToolParameters(tool, strict)),
410
593
  strict: strict ?? false,
411
594
  },
412
595
  };
@@ -427,7 +610,13 @@ function stripSymbolKeys(value) {
427
610
  }
428
611
  function toChatMessages(messages, supportsImages) {
429
612
  const result = [];
430
- for (const msg of messages) {
613
+ for (const [index, msg] of messages.entries()) {
614
+ if (msg.role === "system") {
615
+ const text = index === 0 ? getSystemMessageText(msg) : renderSystemMessageUpdate(msg);
616
+ if (text.length > 0)
617
+ result.push({ role: "system", content: sanitizeSurrogates(text) });
618
+ continue;
619
+ }
431
620
  if (msg.role === "user") {
432
621
  if (typeof msg.content === "string") {
433
622
  result.push({ role: "user", content: sanitizeSurrogates(msg.content) });
@@ -473,9 +662,10 @@ function toChatMessages(messages, supportsImages) {
473
662
  id: block.id,
474
663
  type: "function",
475
664
  function: { name: block.name, arguments: JSON.stringify(block.arguments || {}) },
665
+ index: 0,
476
666
  });
477
667
  }
478
- const assistantMessage = { role: "assistant" };
668
+ const assistantMessage = { role: "assistant", prefix: false };
479
669
  if (contentParts.length > 0)
480
670
  assistantMessage.content = contentParts;
481
671
  if (toolCalls.length > 0)
@@ -528,15 +718,6 @@ function buildToolResultText(text, hasImages, supportsImages, isError) {
528
718
  }
529
719
  return isError ? "[tool error] (no tool output)" : "(no tool output)";
530
720
  }
531
- function usesReasoningEffort(model) {
532
- return model.id === "mistral-small-2603" || model.id === "mistral-small-latest" || model.id === "mistral-medium-3.5";
533
- }
534
- function usesPromptModeReasoning(model) {
535
- return model.reasoning && !usesReasoningEffort(model);
536
- }
537
- function mapReasoningEffort(model, level) {
538
- return (model.thinkingLevelMap?.[level] ?? "high");
539
- }
540
721
  function mapToolChoice(choice) {
541
722
  if (!choice)
542
723
  return undefined;