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