@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,5 +1,6 @@
1
1
  import OpenAI from "openai";
2
2
  import { calculateCost, clampThinkingLevel } from "../models.js";
3
+ import { getDrahtUserAgent } from "../utils/draht-user-agent.js";
3
4
  import { formatProviderError, normalizeProviderError } from "../utils/error-body.js";
4
5
  import { AssistantMessageEventStream } from "../utils/event-stream.js";
5
6
  import { shortHash } from "../utils/hash.js";
@@ -8,10 +9,12 @@ import { parseStreamingJson } from "../utils/json-parse.js";
8
9
  import { getProviderEnvValue } from "../utils/provider-env.js";
9
10
  import { retryProviderRequest } from "../utils/provider-retry.js";
10
11
  import { sanitizeSurrogates } from "../utils/sanitize-unicode.js";
11
- import { appendGrammarToolInputJsonDelta, createGrammarToolInputProperties, getGrammarToolInput, resolveGrammarConstrainedSampling, resolveJsonSchemaStrictSampling, } from "./constrained-sampling.js";
12
+ import { getSystemMessageText, renderSystemMessageUpdate } from "../utils/text.js";
13
+ import { getDeclaredTools, resolveTranscript, resolveTranscriptTools, } from "../utils/transcript.js";
14
+ import { appendGrammarToolInputJsonDelta, createGrammarToolInputProperties, getGrammarToolInput, getJsonSchemaToolParameters, resolveGrammarConstrainedSampling, resolveJsonSchemaStrictSampling, } from "./constrained-sampling.js";
12
15
  import { buildCopilotDynamicHeaders, hasCopilotVisionInput } from "./github-copilot-headers.js";
13
16
  import { clampOpenAIPromptCacheKey } from "./openai-prompt-cache.js";
14
- import { buildBaseOptions } from "./simple-options.js";
17
+ import { buildBaseOptions, clampThinkingBudgetToAnswerRoom, thinkingBudgetForLevel } from "./simple-options.js";
15
18
  import { transformMessages } from "./transform-messages.js";
16
19
  /**
17
20
  * Check if conversation messages contain tool calls or tool results.
@@ -48,25 +51,6 @@ function hasToolHistory(messages) {
48
51
  }
49
52
  return false;
50
53
  }
51
- function getDeferredToolNames(messages) {
52
- const names = new Set();
53
- for (const message of messages) {
54
- if (message.role === "toolResult") {
55
- for (const name of message.addedToolNames ?? []) {
56
- names.add(name);
57
- }
58
- }
59
- }
60
- return names;
61
- }
62
- function getToolsByName(tools, names) {
63
- if (!tools)
64
- return [];
65
- const toolsByName = new Map(tools.map((tool) => [tool.name, tool]));
66
- return Array.from(names)
67
- .map((name) => toolsByName.get(name))
68
- .filter((tool) => tool !== undefined);
69
- }
70
54
  function isTextContentBlock(block) {
71
55
  return block.type === "text";
72
56
  }
@@ -79,28 +63,94 @@ function isToolCallBlock(block) {
79
63
  function isImageContentBlock(block) {
80
64
  return block.type === "image";
81
65
  }
82
- function isEncryptedReasoningDetail(detail) {
83
- if (typeof detail !== "object" || detail === null) {
66
+ function isReasoningDetailObject(detail) {
67
+ return typeof detail === "object" && detail !== null && !Array.isArray(detail);
68
+ }
69
+ function hasValidCommonReasoningDetailFields(candidate) {
70
+ return ((candidate.id === undefined || candidate.id === null || typeof candidate.id === "string") &&
71
+ (candidate.format === undefined || typeof candidate.format === "string") &&
72
+ (candidate.index === undefined || typeof candidate.index === "number"));
73
+ }
74
+ function isOpenAIReasoningDetail(detail) {
75
+ if (!isReasoningDetailObject(detail) || !hasValidCommonReasoningDetailFields(detail)) {
84
76
  return false;
85
77
  }
86
- const candidate = detail;
87
- return (candidate.type === "reasoning.encrypted" &&
88
- typeof candidate.id === "string" &&
89
- candidate.id.length > 0 &&
90
- typeof candidate.data === "string" &&
91
- candidate.data.length > 0);
78
+ switch (detail.type) {
79
+ case "reasoning.summary":
80
+ return typeof detail.summary === "string";
81
+ case "reasoning.encrypted":
82
+ return typeof detail.data === "string";
83
+ case "reasoning.text":
84
+ return (typeof detail.text === "string" &&
85
+ (detail.signature === undefined || detail.signature === null || typeof detail.signature === "string"));
86
+ default:
87
+ return false;
88
+ }
89
+ }
90
+ function parseOpenAIReasoningDetails(signature) {
91
+ if (!signature)
92
+ return undefined;
93
+ try {
94
+ const parsed = JSON.parse(signature);
95
+ return Array.isArray(parsed) && parsed.length > 0 && parsed.every(isOpenAIReasoningDetail) ? parsed : undefined;
96
+ }
97
+ catch {
98
+ return undefined;
99
+ }
100
+ }
101
+ function parseLegacyEncryptedReasoningDetail(signature) {
102
+ if (!signature)
103
+ return undefined;
104
+ try {
105
+ const parsed = JSON.parse(signature);
106
+ return isOpenAIReasoningDetail(parsed) &&
107
+ parsed.type === "reasoning.encrypted" &&
108
+ typeof parsed.id === "string" &&
109
+ parsed.id.length > 0 &&
110
+ parsed.data.length > 0
111
+ ? parsed
112
+ : undefined;
113
+ }
114
+ catch {
115
+ return undefined;
116
+ }
117
+ }
118
+ function fillMissingCommonReasoningDetailFields(target, source) {
119
+ target.id ??= source.id;
120
+ target.format ||= source.format;
121
+ target.index ??= source.index;
122
+ }
123
+ function appendOpenAIReasoningDetail(details, detail) {
124
+ const lastDetail = details[details.length - 1];
125
+ if (detail.type === "reasoning.text" && lastDetail?.type === "reasoning.text") {
126
+ lastDetail.text += detail.text;
127
+ lastDetail.signature ||= detail.signature;
128
+ fillMissingCommonReasoningDetailFields(lastDetail, detail);
129
+ return;
130
+ }
131
+ if (detail.type === "reasoning.summary" && lastDetail?.type === "reasoning.summary") {
132
+ lastDetail.summary += detail.summary;
133
+ fillMissingCommonReasoningDetailFields(lastDetail, detail);
134
+ return;
135
+ }
136
+ details.push({ ...detail });
137
+ }
138
+ const OPENAI_COMPLETIONS_REASONING_FIELDS = ["reasoning", "reasoning_content", "reasoning_text"];
139
+ function isOpenAICompletionsReasoningField(field) {
140
+ return OPENAI_COMPLETIONS_REASONING_FIELDS.includes(field);
92
141
  }
93
142
  function resolveCacheRetention(cacheRetention, env) {
94
143
  if (cacheRetention) {
95
144
  return cacheRetention;
96
145
  }
97
- if (getProviderEnvValue("PI_CACHE_RETENTION", env) === "long") {
146
+ if (getProviderEnvValue("DRAHT_CACHE_RETENTION", env) === "long") {
98
147
  return "long";
99
148
  }
100
149
  return "short";
101
150
  }
102
151
  export const stream = (model, context, options) => {
103
152
  const stream = new AssistantMessageEventStream();
153
+ const normalizedContext = resolveTranscript(context, getCompat(model).supportsMidConvoSystemMessages);
104
154
  (async () => {
105
155
  const output = {
106
156
  role: "assistant",
@@ -119,14 +169,22 @@ export const stream = (model, context, options) => {
119
169
  stopReason: "pending",
120
170
  timestamp: Date.now(),
121
171
  };
172
+ // `reasoning_details` are replay metadata, not user-visible stream deltas.
173
+ // Keep them in memory during streaming and serialize once when the block is finalized.
174
+ let streamedReasoningDetails;
175
+ const applyStreamedReasoningDetails = (block) => {
176
+ if (streamedReasoningDetails !== undefined) {
177
+ block.thinkingSignature = JSON.stringify(streamedReasoningDetails);
178
+ }
179
+ };
122
180
  try {
123
181
  const apiKey = getClientApiKey(model.provider, options?.apiKey, options?.headers);
124
182
  const compat = getCompat(model);
125
- const grammarToolInputProperties = createGrammarToolInputProperties(context.tools, compat.supportsOpenAIGrammarTools);
183
+ const grammarToolInputProperties = createGrammarToolInputProperties(getDeclaredTools(normalizedContext.messages), compat.supportsOpenAIGrammarTools);
126
184
  const cacheRetention = resolveCacheRetention(options?.cacheRetention, options?.env);
127
185
  const cacheSessionId = cacheRetention === "none" ? undefined : options?.sessionId;
128
- const client = createClient(model, context, apiKey, options?.headers, options?.fetch, cacheSessionId, compat);
129
- let params = buildParams(model, context, options, compat, cacheRetention, grammarToolInputProperties);
186
+ const client = createClient(model, normalizedContext, apiKey, options?.headers, options?.fetch, cacheSessionId, compat);
187
+ let params = buildParams(model, normalizedContext, options, compat, cacheRetention, grammarToolInputProperties);
130
188
  const nextParams = await options?.onPayload?.(params, model);
131
189
  if (nextParams !== undefined) {
132
190
  params = nextParams;
@@ -148,7 +206,6 @@ export const stream = (model, context, options) => {
148
206
  let hasFinishReason = false;
149
207
  const toolCallBlocksByIndex = new Map();
150
208
  const toolCallBlocksById = new Map();
151
- const pendingReasoningDetailsByToolCallId = new Map();
152
209
  const blocks = output.content;
153
210
  const getContentIndex = (block) => blocks.indexOf(block);
154
211
  const getCustomToolCallInput = (block) => {
@@ -180,6 +237,7 @@ export const stream = (model, context, options) => {
180
237
  });
181
238
  }
182
239
  else if (block.type === "thinking") {
240
+ applyStreamedReasoningDetails(block);
183
241
  stream.push({
184
242
  type: "thinking_end",
185
243
  contentIndex,
@@ -235,16 +293,6 @@ export const stream = (model, context, options) => {
235
293
  }
236
294
  return thinkingBlock;
237
295
  };
238
- const applyPendingReasoningDetail = (block) => {
239
- if (!block.id) {
240
- return;
241
- }
242
- const pendingReasoningDetail = pendingReasoningDetailsByToolCallId.get(block.id);
243
- if (pendingReasoningDetail) {
244
- block.thoughtSignature = pendingReasoningDetail;
245
- pendingReasoningDetailsByToolCallId.delete(block.id);
246
- }
247
- };
248
296
  const ensureToolCallBlock = (toolCall) => {
249
297
  const streamIndex = typeof toolCall.index === "number" ? toolCall.index : undefined;
250
298
  const name = toolCall.function?.name ?? toolCall.custom?.name ?? "";
@@ -300,10 +348,10 @@ export const stream = (model, context, options) => {
300
348
  };
301
349
  delete block.partialArgs;
302
350
  }
303
- applyPendingReasoningDetail(block);
304
351
  return block;
305
352
  };
306
353
  for await (const chunk of openaiStream) {
354
+ await options?.onProviderStreamEvent?.(chunk, model);
307
355
  if (!chunk || typeof chunk !== "object")
308
356
  continue;
309
357
  // OpenAI documents ChatCompletionChunk.id as the unique chat completion identifier,
@@ -407,16 +455,14 @@ export const stream = (model, context, options) => {
407
455
  const reasoningDetails = choice.delta.reasoning_details;
408
456
  if (Array.isArray(reasoningDetails)) {
409
457
  for (const detail of reasoningDetails) {
410
- if (isEncryptedReasoningDetail(detail)) {
411
- const serializedDetail = JSON.stringify(detail);
412
- const matchingToolCall = toolCallBlocksById.get(detail.id);
413
- if (matchingToolCall) {
414
- matchingToolCall.thoughtSignature = serializedDetail;
415
- }
416
- else {
417
- pendingReasoningDetailsByToolCallId.set(detail.id, serializedDetail);
418
- }
419
- }
458
+ if (!isOpenAIReasoningDetail(detail))
459
+ continue;
460
+ ensureThinkingBlock("");
461
+ streamedReasoningDetails ??= [];
462
+ // Keep provider replay data in the existing signature slot. OpenRouter streams
463
+ // reasoning_details as deltas: consecutive text/summary deltas are merged into
464
+ // logical entries, while encrypted entries remain opaque and discrete.
465
+ appendOpenAIReasoningDetail(streamedReasoningDetails, detail);
420
466
  }
421
467
  }
422
468
  }
@@ -430,10 +476,13 @@ export const stream = (model, context, options) => {
430
476
  if (output.stopReason === "aborted") {
431
477
  throw new Error("Request was aborted");
432
478
  }
479
+ if (!hasFinishReason && !compat.supportsFinishReason) {
480
+ output.stopReason = output.content.some((block) => block.type === "toolCall") ? "toolUse" : "stop";
481
+ }
433
482
  if (output.stopReason === "error") {
434
483
  throw new Error(output.errorMessage || "Provider returned an error stop reason");
435
484
  }
436
- if (!hasFinishReason || output.stopReason === "pending") {
485
+ if ((compat.supportsFinishReason && !hasFinishReason) || output.stopReason === "pending") {
437
486
  throw new Error("Stream ended without finish_reason");
438
487
  }
439
488
  stream.push({ type: "done", reason: output.stopReason, message: output });
@@ -441,6 +490,9 @@ export const stream = (model, context, options) => {
441
490
  }
442
491
  catch (error) {
443
492
  for (const block of output.content) {
493
+ if (block.type === "thinking") {
494
+ applyStreamedReasoningDetails(block);
495
+ }
444
496
  delete block.index;
445
497
  // Streaming scratch buffers are only used during parsing; never persist them.
446
498
  delete block.partialArgs;
@@ -465,18 +517,20 @@ export const stream = (model, context, options) => {
465
517
  };
466
518
  export const streamSimple = (model, context, options) => {
467
519
  getClientApiKey(model.provider, options?.apiKey, options?.headers);
468
- const base = buildBaseOptions(model, context, options, options?.apiKey);
520
+ const base = {
521
+ ...buildBaseOptions(model, context, options, options?.apiKey),
522
+ toolChoice: options?.toolChoice,
523
+ };
469
524
  const clampedReasoning = options?.reasoning ? clampThinkingLevel(model, options.reasoning) : undefined;
470
525
  const reasoningEffort = clampedReasoning === "off" ? undefined : clampedReasoning;
471
- const toolChoice = options?.toolChoice;
472
526
  return stream(model, context, {
473
527
  ...base,
474
528
  reasoningEffort,
475
- toolChoice,
529
+ thinkingBudgets: options?.thinkingBudgets,
476
530
  });
477
531
  };
478
532
  function createClient(model, context, apiKey, optionsHeaders, fetch, sessionId, compat = getCompat(model)) {
479
- const headers = { ...model.headers };
533
+ const headers = { "User-Agent": getDrahtUserAgent(), ...model.headers };
480
534
  if (model.provider === "github-copilot") {
481
535
  const hasImages = hasCopilotVisionInput(context.messages);
482
536
  const copilotHeaders = buildCopilotDynamicHeaders({
@@ -509,8 +563,11 @@ function createClient(model, context, apiKey, optionsHeaders, fetch, sessionId,
509
563
  defaultHeaders: headers,
510
564
  });
511
565
  }
512
- function buildParams(model, context, options, compat = getCompat(model), cacheRetention = resolveCacheRetention(options?.cacheRetention, options?.env), grammarToolInputProperties = createGrammarToolInputProperties(context.tools, compat.supportsOpenAIGrammarTools)) {
513
- const messages = convertMessages(model, context, compat, { grammarToolInputProperties });
566
+ function buildParams(model, context, options, compat = getCompat(model), cacheRetention = resolveCacheRetention(options?.cacheRetention, options?.env), grammarToolInputProperties = createGrammarToolInputProperties(getDeclaredTools(context.messages), compat.supportsOpenAIGrammarTools)) {
567
+ const transcriptTools = resolveTranscriptTools(context.messages, compat.supportsMidConvoSystemMessages === true && compat.supportsMidConvoToolAdditions === true);
568
+ const messages = convertMessages(model, context, compat, {
569
+ grammarToolInputProperties,
570
+ });
514
571
  const cacheControl = getCompatCacheControl(compat, cacheRetention);
515
572
  const params = {
516
573
  model: model.id,
@@ -530,6 +587,7 @@ function buildParams(model, context, options, compat = getCompat(model), cacheRe
530
587
  }
531
588
  if (options?.maxTokens) {
532
589
  if (compat.maxTokensField === "max_tokens") {
590
+ // Deprecated by OpenAI, but some OpenAI-compatible providers only accept max_tokens.
533
591
  params.max_tokens = options.maxTokens;
534
592
  }
535
593
  else {
@@ -539,10 +597,8 @@ function buildParams(model, context, options, compat = getCompat(model), cacheRe
539
597
  if (options?.temperature !== undefined) {
540
598
  params.temperature = options.temperature;
541
599
  }
542
- const deferredToolNames = compat.deferredToolsMode === "kimi" ? getDeferredToolNames(context.messages) : new Set();
543
- const activeTools = context.tools?.filter((tool) => !deferredToolNames.has(tool.name));
544
- if (activeTools && activeTools.length > 0) {
545
- params.tools = convertTools(activeTools, compat);
600
+ if (transcriptTools.requestTools.length > 0) {
601
+ params.tools = convertTools(transcriptTools.requestTools, compat);
546
602
  if (compat.zaiToolStream) {
547
603
  params.tool_stream = true;
548
604
  }
@@ -557,6 +613,11 @@ function buildParams(model, context, options, compat = getCompat(model), cacheRe
557
613
  if (options?.toolChoice) {
558
614
  params.tool_choice = options.toolChoice;
559
615
  }
616
+ if (compat.vllmPriority !== undefined) {
617
+ params.priority = compat.vllmPriority;
618
+ }
619
+ const thinkingTokenBudgetField = resolveThinkingTokenBudgetField(compat);
620
+ const thinkingBudget = resolveClampedThinkingBudget(model, options, params);
560
621
  if (compat.thinkingFormat === "zai" && model.reasoning) {
561
622
  const zaiParams = params;
562
623
  zaiParams.thinking = options?.reasoningEffort ? { type: "enabled", clear_thinking: false } : { type: "disabled" };
@@ -584,11 +645,26 @@ function buildParams(model, context, options, compat = getCompat(model), cacheRe
584
645
  };
585
646
  }
586
647
  else if (compat.thinkingFormat === "chat-template" && model.reasoning) {
587
- const chatTemplateKwargs = buildChatTemplateKwargs(model, options, compat);
648
+ const chatTemplateKwargs = buildChatTemplateValues(model, options, compat.chatTemplateKwargs, thinkingBudget);
588
649
  if (chatTemplateKwargs) {
589
650
  params.chat_template_kwargs = chatTemplateKwargs;
590
651
  }
591
652
  }
653
+ else if (compat.thinkingFormat === "baseten" && model.reasoning) {
654
+ const basetenParams = params;
655
+ const chatTemplateArgs = buildChatTemplateValues(model, options, compat.chatTemplateArgs, thinkingBudget);
656
+ if (chatTemplateArgs) {
657
+ basetenParams.chat_template_args = chatTemplateArgs;
658
+ }
659
+ if (compat.supportsReasoningEffort) {
660
+ const requestedEffort = options?.reasoningEffort;
661
+ const mappedEffort = requestedEffort ? model.thinkingLevelMap?.[requestedEffort] : model.thinkingLevelMap?.off;
662
+ const effort = mappedEffort === undefined ? requestedEffort : mappedEffort;
663
+ if (typeof effort === "string") {
664
+ basetenParams.reasoning_effort = effort;
665
+ }
666
+ }
667
+ }
592
668
  else if (compat.thinkingFormat === "deepseek" && model.reasoning) {
593
669
  if (options?.reasoningEffort) {
594
670
  params.thinking = { type: "enabled" };
@@ -645,6 +721,13 @@ function buildParams(model, context, options, compat = getCompat(model), cacheRe
645
721
  params.reasoning_effort = offValue;
646
722
  }
647
723
  }
724
+ // Cap reasoning with a top-level budget field. Independent of thinkingFormat: the
725
+ // same server can serve zai, qwen or chat-template models. Reasoning and the answer
726
+ // share max_tokens here, so an uncapped reasoning phase can consume the whole
727
+ // response and leave no answer and no tool call.
728
+ if (thinkingTokenBudgetField && thinkingBudget !== undefined) {
729
+ Object.assign(params, { [thinkingTokenBudgetField]: thinkingBudget });
730
+ }
648
731
  // OpenRouter provider routing preferences
649
732
  if (model.compat?.openRouterRouting) {
650
733
  params.provider = model.compat.openRouterRouting;
@@ -661,19 +744,35 @@ function buildParams(model, context, options, compat = getCompat(model), cacheRe
661
744
  params.providerOptions = { gateway: gatewayOptions };
662
745
  }
663
746
  }
747
+ // Last so custom keys override the named request fields. Per-request keys override model defaults.
748
+ Object.assign(params, model.samplingParams, options?.samplingParams);
664
749
  return params;
665
750
  }
666
- function buildChatTemplateKwargs(model, options, compat) {
667
- const kwargs = {};
668
- for (const [key, value] of Object.entries(compat.chatTemplateKwargs)) {
669
- const resolved = resolveChatTemplateKwargValue(model, options, value);
751
+ function resolveThinkingTokenBudgetField(compat) {
752
+ if (compat.thinkingTokenBudgetField)
753
+ return compat.thinkingTokenBudgetField;
754
+ if (compat.supportsThinkingTokenBudget)
755
+ return "thinking_token_budget";
756
+ return undefined;
757
+ }
758
+ function resolveClampedThinkingBudget(model, options, params) {
759
+ if (!options?.reasoningEffort || !model.reasoning)
760
+ return undefined;
761
+ const ceiling = params.max_tokens ?? params.max_completion_tokens ?? model.maxTokens;
762
+ const budget = clampThinkingBudgetToAnswerRoom(thinkingBudgetForLevel(options.reasoningEffort, options.thinkingBudgets), ceiling);
763
+ return budget > 0 ? budget : undefined;
764
+ }
765
+ function buildChatTemplateValues(model, options, values, thinkingBudget) {
766
+ const resolvedValues = {};
767
+ for (const [key, value] of Object.entries(values)) {
768
+ const resolved = resolveChatTemplateKwargValue(model, options, value, thinkingBudget);
670
769
  if (resolved !== undefined) {
671
- kwargs[key] = resolved;
770
+ resolvedValues[key] = resolved;
672
771
  }
673
772
  }
674
- return Object.keys(kwargs).length > 0 ? kwargs : undefined;
773
+ return Object.keys(resolvedValues).length > 0 ? resolvedValues : undefined;
675
774
  }
676
- function resolveChatTemplateKwargValue(model, options, value) {
775
+ function resolveChatTemplateKwargValue(model, options, value, thinkingBudget) {
677
776
  if (typeof value !== "object" || value === null) {
678
777
  return value;
679
778
  }
@@ -684,6 +783,9 @@ function resolveChatTemplateKwargValue(model, options, value) {
684
783
  if (value.$var === "thinking.enabled") {
685
784
  return !!reasoningEffort;
686
785
  }
786
+ if (value.$var === "thinking.budget") {
787
+ return thinkingBudget;
788
+ }
687
789
  const mappedValue = reasoningEffort ? model.thinkingLevelMap?.[reasoningEffort] : model.thinkingLevelMap?.off;
688
790
  return mappedValue === undefined ? reasoningEffort : typeof mappedValue === "string" ? mappedValue : undefined;
689
791
  }
@@ -762,6 +864,7 @@ function addCacheControlToTextContent(message, cacheControl) {
762
864
  return false;
763
865
  }
764
866
  export function convertMessages(model, context, compat, options) {
867
+ const normalizedContext = resolveTranscript(context, compat.supportsMidConvoSystemMessages);
765
868
  const params = [];
766
869
  const normalizeToolCallId = (id) => {
767
870
  // Handle pipe-separated IDs from OpenAI Responses API
@@ -788,12 +891,9 @@ export function convertMessages(model, context, compat, options) {
788
891
  return id.length > 40 ? id.slice(0, 40) : id;
789
892
  return id;
790
893
  };
791
- const transformedMessages = transformMessages(context.messages, model, (id) => normalizeToolCallId(id));
792
- if (context.systemPrompt) {
793
- const useDeveloperRole = model.reasoning && compat.supportsDeveloperRole;
794
- const role = useDeveloperRole ? "developer" : "system";
795
- params.push({ role: role, content: sanitizeSurrogates(context.systemPrompt) });
796
- }
894
+ const transformedMessages = transformMessages(normalizedContext.messages, model, (id) => normalizeToolCallId(id));
895
+ const transcriptTools = resolveTranscriptTools(normalizedContext.messages, compat.supportsMidConvoSystemMessages === true && compat.supportsMidConvoToolAdditions === true);
896
+ const instructionRole = model.reasoning && compat.supportsDeveloperRole ? "developer" : "system";
797
897
  let lastRole = null;
798
898
  for (let i = 0; i < transformedMessages.length; i++) {
799
899
  const msg = transformedMessages[i];
@@ -805,7 +905,21 @@ export function convertMessages(model, context, compat, options) {
805
905
  content: "I have processed the tool results.",
806
906
  });
807
907
  }
808
- if (msg.role === "user") {
908
+ if (msg.role === "system") {
909
+ const addedTools = i > 0 && transcriptTools.anchorsAdditions ? (msg.toolsAdded ?? []) : [];
910
+ if (addedTools.length > 0) {
911
+ const kimiToolMessage = {
912
+ role: "system",
913
+ tools: convertTools(addedTools, compat),
914
+ };
915
+ params.push(kimiToolMessage);
916
+ }
917
+ const text = i === 0 ? getSystemMessageText(msg) : renderSystemMessageUpdate(msg);
918
+ if (text.length > 0) {
919
+ params.push({ role: instructionRole, content: sanitizeSurrogates(text) });
920
+ }
921
+ }
922
+ else if (msg.role === "user") {
809
923
  if (typeof msg.content === "string") {
810
924
  params.push({
811
925
  role: "user",
@@ -813,7 +927,9 @@ export function convertMessages(model, context, compat, options) {
813
927
  });
814
928
  }
815
929
  else {
816
- const content = msg.content.map((item) => {
930
+ const content = msg.content
931
+ .filter((item) => item.type !== "text" || item.text.length > 0)
932
+ .map((item) => {
817
933
  if (item.type === "text") {
818
934
  return {
819
935
  type: "text",
@@ -852,6 +968,14 @@ export function convertMessages(model, context, compat, options) {
852
968
  }));
853
969
  const assistantText = assistantTextParts.map((part) => part.text).join("");
854
970
  const allThinkingBlocks = msg.content.filter(isThinkingContentBlock);
971
+ const toolCalls = msg.content.filter(isToolCallBlock);
972
+ const signedReasoningDetails = allThinkingBlocks
973
+ .map((block) => parseOpenAIReasoningDetails(block.thinkingSignature))
974
+ .find((details) => details !== undefined);
975
+ const legacyReasoningDetails = toolCalls
976
+ .map((toolCall) => parseLegacyEncryptedReasoningDetail(toolCall.thoughtSignature))
977
+ .filter((detail) => detail !== undefined);
978
+ const preservedReasoningDetails = signedReasoningDetails ?? (legacyReasoningDetails.length > 0 ? legacyReasoningDetails : undefined);
855
979
  const nonEmptyThinkingBlocks = allThinkingBlocks.filter((block) => block.thinking.trim().length > 0);
856
980
  if (nonEmptyThinkingBlocks.length > 0 && compat.requiresThinkingAsText) {
857
981
  // Convert thinking blocks to plain text (no tags to avoid model mimicking them)
@@ -867,7 +991,8 @@ export function convertMessages(model, context, compat, options) {
867
991
  if (assistantText.length > 0) {
868
992
  assistantMsg.content = assistantText;
869
993
  }
870
- if (!compat.requiresThinkingAsText) {
994
+ // reasoning_details is the structured alternative to a raw reasoning field.
995
+ if (!compat.requiresThinkingAsText && !preservedReasoningDetails) {
871
996
  // Replay the captured reasoning field (e.g. "reasoning_content" for llama.cpp
872
997
  // server, gpt-oss, and DeepSeek reasoner) under its captured signature. DeepSeek
873
998
  // requires this on every thinking-mode assistant turn — even when the captured
@@ -880,13 +1005,12 @@ export function convertMessages(model, context, compat, options) {
880
1005
  if (model.provider === "opencode-go" && signature === "reasoning") {
881
1006
  signature = "reasoning_content";
882
1007
  }
883
- assistantMsg[signature] = signedThinkingBlocks
884
- .map((block) => block.thinking || "")
885
- .join("\n");
1008
+ if (isOpenAICompletionsReasoningField(signature)) {
1009
+ assistantMsg[signature] = signedThinkingBlocks.map((block) => block.thinking || "").join("\n");
1010
+ }
886
1011
  }
887
1012
  }
888
1013
  }
889
- const toolCalls = msg.content.filter(isToolCallBlock);
890
1014
  if (toolCalls.length > 0) {
891
1015
  assistantMsg.tool_calls = toolCalls.map((tc) => {
892
1016
  const customInputProperty = options?.grammarToolInputProperties?.get(tc.name);
@@ -909,20 +1033,9 @@ export function convertMessages(model, context, compat, options) {
909
1033
  },
910
1034
  };
911
1035
  });
912
- const reasoningDetails = toolCalls
913
- .filter((tc) => tc.thoughtSignature)
914
- .map((tc) => {
915
- try {
916
- return JSON.parse(tc.thoughtSignature);
917
- }
918
- catch {
919
- return null;
920
- }
921
- })
922
- .filter(Boolean);
923
- if (reasoningDetails.length > 0) {
924
- assistantMsg.reasoning_details = reasoningDetails;
925
- }
1036
+ }
1037
+ if (preservedReasoningDetails) {
1038
+ assistantMsg.reasoning_details = preservedReasoningDetails;
926
1039
  }
927
1040
  if (compat.requiresReasoningContentOnAssistantMessages &&
928
1041
  model.reasoning &&
@@ -948,7 +1061,6 @@ export function convertMessages(model, context, compat, options) {
948
1061
  }
949
1062
  else if (msg.role === "toolResult") {
950
1063
  const imageBlocks = [];
951
- const deferredToolNames = new Set();
952
1064
  let j = i;
953
1065
  for (; j < transformedMessages.length && transformedMessages[j].role === "toolResult"; j++) {
954
1066
  const toolMsg = transformedMessages[j];
@@ -971,11 +1083,6 @@ export function convertMessages(model, context, compat, options) {
971
1083
  toolResultMsg.name = toolMsg.toolName;
972
1084
  }
973
1085
  params.push(toolResultMsg);
974
- if (compat.deferredToolsMode === "kimi") {
975
- for (const name of toolMsg.addedToolNames ?? []) {
976
- deferredToolNames.add(name);
977
- }
978
- }
979
1086
  if (hasImages && model.input.includes("image")) {
980
1087
  for (const block of toolMsg.content) {
981
1088
  if (isImageContentBlock(block)) {
@@ -1012,17 +1119,6 @@ export function convertMessages(model, context, compat, options) {
1012
1119
  else {
1013
1120
  lastRole = "toolResult";
1014
1121
  }
1015
- if (deferredToolNames.size > 0) {
1016
- const deferredTools = getToolsByName(context.tools, deferredToolNames);
1017
- if (deferredTools.length > 0) {
1018
- const kimiToolMessage = {
1019
- role: "system",
1020
- tools: convertTools(deferredTools, compat),
1021
- };
1022
- // Kimi accepts a system message with tools but omits the standard content field.
1023
- params.push(kimiToolMessage);
1024
- }
1025
- }
1026
1122
  continue;
1027
1123
  }
1028
1124
  lastRole = msg.role;
@@ -1054,7 +1150,7 @@ function convertTools(tools, compat) {
1054
1150
  function: {
1055
1151
  name: tool.name,
1056
1152
  description: tool.description,
1057
- parameters: tool.parameters, // TypeBox already generates JSON Schema
1153
+ parameters: getJsonSchemaToolParameters(tool, strict),
1058
1154
  // Only include strict if provider supports it. Some reject unknown fields.
1059
1155
  ...(compat.supportsStrictMode !== false && { strict: strict ?? false }),
1060
1156
  },
@@ -1063,10 +1159,13 @@ function convertTools(tools, compat) {
1063
1159
  }
1064
1160
  function parseChunkUsage(rawUsage, model) {
1065
1161
  const promptTokens = rawUsage.prompt_tokens || 0;
1066
- const cacheReadTokens = rawUsage.prompt_tokens_details?.cached_tokens ?? rawUsage.prompt_cache_hit_tokens ?? 0;
1162
+ const cacheReadTokens = rawUsage.prompt_tokens_details?.cached_tokens ?? rawUsage.prompt_cache_hit_tokens ?? rawUsage.cached_tokens ?? 0;
1067
1163
  const cacheWriteTokens = rawUsage.prompt_tokens_details?.cache_write_tokens || 0;
1068
1164
  // Follow documented OpenAI/OpenRouter semantics: cached_tokens is cache-read
1069
- // tokens (hits). OpenAI does not document or emit cache_write_tokens, but
1165
+ // tokens (hits). Providers disagree on placement: OpenAI/OpenRouter use
1166
+ // prompt_tokens_details.cached_tokens, DeepSeek uses prompt_cache_hit_tokens,
1167
+ // and Kimi documents top-level usage.cached_tokens on the final usage chunk.
1168
+ // OpenAI does not document or emit cache_write_tokens, but
1070
1169
  // OpenRouter-compatible providers can include it as a separate write count.
1071
1170
  // OpenRouter's own provider/tests affirm the separate mapping:
1072
1171
  // https://github.com/OpenRouterTeam/ai-sdk-provider/pull/409
@@ -1130,14 +1229,15 @@ function detectCompat(model) {
1130
1229
  const isCloudflareAiGateway = provider === "cloudflare-ai-gateway" || baseUrl.includes("gateway.ai.cloudflare.com");
1131
1230
  const isNvidia = provider === "nvidia" || baseUrl.includes("integrate.api.nvidia.com");
1132
1231
  const isAntLing = provider === "ant-ling" || baseUrl.includes("api.ant-ling.com");
1232
+ const isCerebras = provider === "cerebras" || baseUrl.includes("cerebras.ai");
1233
+ const isDeepSeek = provider === "deepseek" || baseUrl.toLowerCase().includes("deepseek.com");
1133
1234
  const isNonStandard = isNvidia ||
1134
- provider === "cerebras" ||
1135
- baseUrl.includes("cerebras.ai") ||
1235
+ isCerebras ||
1136
1236
  provider === "xai" ||
1137
1237
  baseUrl.includes("api.x.ai") ||
1138
1238
  isTogether ||
1139
1239
  baseUrl.includes("chutes.ai") ||
1140
- baseUrl.includes("deepseek.com") ||
1240
+ isDeepSeek ||
1141
1241
  isZai ||
1142
1242
  isMoonshot ||
1143
1243
  provider === "opencode" ||
@@ -1146,6 +1246,7 @@ function detectCompat(model) {
1146
1246
  isCloudflareAiGateway ||
1147
1247
  isAntLing;
1148
1248
  const useMaxTokens = baseUrl.includes("chutes.ai") ||
1249
+ isDeepSeek ||
1149
1250
  isMoonshot ||
1150
1251
  isCloudflareAiGateway ||
1151
1252
  isTogether ||
@@ -1153,7 +1254,6 @@ function detectCompat(model) {
1153
1254
  isAntLing ||
1154
1255
  isZai;
1155
1256
  const isGrok = provider === "xai" || baseUrl.includes("api.x.ai");
1156
- const isDeepSeek = provider === "deepseek" || baseUrl.includes("deepseek.com");
1157
1257
  const isOpenRouterDeveloperRoleModel = isOpenRouter && (model.id.startsWith("anthropic/") || model.id.startsWith("openai/"));
1158
1258
  const cacheControlFormat = provider === "openrouter" && model.id.startsWith("anthropic/") ? "anthropic" : undefined;
1159
1259
  return {
@@ -1161,6 +1261,7 @@ function detectCompat(model) {
1161
1261
  supportsDeveloperRole: isOpenRouterDeveloperRoleModel || (!isNonStandard && !isOpenRouter),
1162
1262
  supportsReasoningEffort: !isGrok && !isZai && !isMoonshot && !isTogether && !isCloudflareAiGateway && !isNvidia && !isAntLing,
1163
1263
  supportsUsageInStreaming: true,
1264
+ supportsFinishReason: true,
1164
1265
  maxTokensField: useMaxTokens ? "max_tokens" : "max_completion_tokens",
1165
1266
  requiresToolResultName: false,
1166
1267
  requiresAssistantAfterToolResult: false,
@@ -1180,12 +1281,17 @@ function detectCompat(model) {
1180
1281
  openRouterRouting: {},
1181
1282
  vercelGatewayRouting: {},
1182
1283
  chatTemplateKwargs: {},
1284
+ chatTemplateArgs: {},
1183
1285
  zaiToolStream: false,
1184
- supportsStrictMode: !isMoonshot && !isTogether && !isCloudflareAiGateway && !isNvidia,
1286
+ supportsThinkingTokenBudget: false,
1287
+ thinkingTokenBudgetField: undefined,
1288
+ // OpenAI compatibility alone does not imply strict JSON-schema tool support.
1289
+ supportsStrictMode: false,
1185
1290
  supportsOpenAIGrammarTools: false,
1291
+ supportsMidConvoSystemMessages: false,
1292
+ supportsMidConvoToolAdditions: false,
1186
1293
  cacheControlFormat,
1187
- sendSessionAffinityHeaders: false,
1188
- deferredToolsMode: undefined,
1294
+ sendSessionAffinityHeaders: isOpenRouter,
1189
1295
  sessionAffinityFormat: isOpenRouter ? "openrouter" : "openai",
1190
1296
  supportsLongCacheRetention: !(isTogether ||
1191
1297
  isCloudflareWorkersAI ||
@@ -1207,6 +1313,7 @@ function getCompat(model) {
1207
1313
  supportsDeveloperRole: model.compat.supportsDeveloperRole ?? detected.supportsDeveloperRole,
1208
1314
  supportsReasoningEffort: model.compat.supportsReasoningEffort ?? detected.supportsReasoningEffort,
1209
1315
  supportsUsageInStreaming: model.compat.supportsUsageInStreaming ?? detected.supportsUsageInStreaming,
1316
+ supportsFinishReason: model.compat.supportsFinishReason ?? detected.supportsFinishReason,
1210
1317
  maxTokensField: model.compat.maxTokensField ?? detected.maxTokensField,
1211
1318
  requiresToolResultName: model.compat.requiresToolResultName ?? detected.requiresToolResultName,
1212
1319
  requiresAssistantAfterToolResult: model.compat.requiresAssistantAfterToolResult ?? detected.requiresAssistantAfterToolResult,
@@ -1217,14 +1324,19 @@ function getCompat(model) {
1217
1324
  openRouterRouting: model.compat.openRouterRouting ?? {},
1218
1325
  vercelGatewayRouting: model.compat.vercelGatewayRouting ?? detected.vercelGatewayRouting,
1219
1326
  chatTemplateKwargs: model.compat.chatTemplateKwargs ?? detected.chatTemplateKwargs,
1327
+ chatTemplateArgs: model.compat.chatTemplateArgs ?? detected.chatTemplateArgs,
1220
1328
  zaiToolStream: model.compat.zaiToolStream ?? detected.zaiToolStream,
1329
+ supportsThinkingTokenBudget: model.compat.supportsThinkingTokenBudget ?? detected.supportsThinkingTokenBudget,
1330
+ thinkingTokenBudgetField: model.compat.thinkingTokenBudgetField ?? detected.thinkingTokenBudgetField,
1221
1331
  supportsStrictMode: model.compat.supportsStrictMode ?? detected.supportsStrictMode,
1222
1332
  supportsOpenAIGrammarTools: model.compat.supportsOpenAIGrammarTools ?? detected.supportsOpenAIGrammarTools,
1333
+ supportsMidConvoSystemMessages: model.compat.supportsMidConvoSystemMessages ?? detected.supportsMidConvoSystemMessages,
1334
+ supportsMidConvoToolAdditions: model.compat.supportsMidConvoToolAdditions ?? detected.supportsMidConvoToolAdditions,
1223
1335
  cacheControlFormat: model.compat.cacheControlFormat ?? detected.cacheControlFormat,
1224
1336
  sendSessionAffinityHeaders: model.compat.sendSessionAffinityHeaders ?? detected.sendSessionAffinityHeaders,
1225
- deferredToolsMode: model.compat.deferredToolsMode ?? detected.deferredToolsMode,
1226
1337
  sessionAffinityFormat: model.compat.sessionAffinityFormat ?? detected.sessionAffinityFormat,
1227
1338
  supportsLongCacheRetention: model.compat.supportsLongCacheRetention ?? detected.supportsLongCacheRetention,
1339
+ vllmPriority: model.compat.vllmPriority,
1228
1340
  };
1229
1341
  }
1230
1342
  //# sourceMappingURL=openai-completions.js.map