@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,18 +1,20 @@
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";
6
7
  import { headersToRecord } from "../utils/headers.js";
7
8
  import { parseStreamingJson } from "../utils/json-parse.js";
8
- import { getPiUserAgent } from "../utils/pi-user-agent.js";
9
9
  import { getProviderEnvValue } from "../utils/provider-env.js";
10
10
  import { retryProviderRequest } from "../utils/provider-retry.js";
11
11
  import { sanitizeSurrogates } from "../utils/sanitize-unicode.js";
12
- 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";
13
15
  import { buildCopilotDynamicHeaders, hasCopilotVisionInput } from "./github-copilot-headers.js";
14
16
  import { clampOpenAIPromptCacheKey } from "./openai-prompt-cache.js";
15
- import { buildBaseOptions } from "./simple-options.js";
17
+ import { buildBaseOptions, clampThinkingBudgetToAnswerRoom, thinkingBudgetForLevel } from "./simple-options.js";
16
18
  import { transformMessages } from "./transform-messages.js";
17
19
  /**
18
20
  * Check if conversation messages contain tool calls or tool results.
@@ -49,25 +51,6 @@ function hasToolHistory(messages) {
49
51
  }
50
52
  return false;
51
53
  }
52
- function getDeferredToolNames(messages) {
53
- const names = new Set();
54
- for (const message of messages) {
55
- if (message.role === "toolResult") {
56
- for (const name of message.addedToolNames ?? []) {
57
- names.add(name);
58
- }
59
- }
60
- }
61
- return names;
62
- }
63
- function getToolsByName(tools, names) {
64
- if (!tools)
65
- return [];
66
- const toolsByName = new Map(tools.map((tool) => [tool.name, tool]));
67
- return Array.from(names)
68
- .map((name) => toolsByName.get(name))
69
- .filter((tool) => tool !== undefined);
70
- }
71
54
  function isTextContentBlock(block) {
72
55
  return block.type === "text";
73
56
  }
@@ -80,28 +63,94 @@ function isToolCallBlock(block) {
80
63
  function isImageContentBlock(block) {
81
64
  return block.type === "image";
82
65
  }
83
- function isEncryptedReasoningDetail(detail) {
84
- 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)) {
85
76
  return false;
86
77
  }
87
- const candidate = detail;
88
- return (candidate.type === "reasoning.encrypted" &&
89
- typeof candidate.id === "string" &&
90
- candidate.id.length > 0 &&
91
- typeof candidate.data === "string" &&
92
- 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);
93
141
  }
94
142
  function resolveCacheRetention(cacheRetention, env) {
95
143
  if (cacheRetention) {
96
144
  return cacheRetention;
97
145
  }
98
- if (getProviderEnvValue("PI_CACHE_RETENTION", env) === "long") {
146
+ if (getProviderEnvValue("DRAHT_CACHE_RETENTION", env) === "long") {
99
147
  return "long";
100
148
  }
101
149
  return "short";
102
150
  }
103
151
  export const stream = (model, context, options) => {
104
152
  const stream = new AssistantMessageEventStream();
153
+ const normalizedContext = resolveTranscript(context, getCompat(model).supportsMidConvoSystemMessages);
105
154
  (async () => {
106
155
  const output = {
107
156
  role: "assistant",
@@ -120,14 +169,22 @@ export const stream = (model, context, options) => {
120
169
  stopReason: "pending",
121
170
  timestamp: Date.now(),
122
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
+ };
123
180
  try {
124
181
  const apiKey = getClientApiKey(model.provider, options?.apiKey, options?.headers);
125
182
  const compat = getCompat(model);
126
- const grammarToolInputProperties = createGrammarToolInputProperties(context.tools, compat.supportsOpenAIGrammarTools);
183
+ const grammarToolInputProperties = createGrammarToolInputProperties(getDeclaredTools(normalizedContext.messages), compat.supportsOpenAIGrammarTools);
127
184
  const cacheRetention = resolveCacheRetention(options?.cacheRetention, options?.env);
128
185
  const cacheSessionId = cacheRetention === "none" ? undefined : options?.sessionId;
129
- const client = createClient(model, context, apiKey, options?.headers, options?.fetch, cacheSessionId, compat);
130
- 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);
131
188
  const nextParams = await options?.onPayload?.(params, model);
132
189
  if (nextParams !== undefined) {
133
190
  params = nextParams;
@@ -149,7 +206,6 @@ export const stream = (model, context, options) => {
149
206
  let hasFinishReason = false;
150
207
  const toolCallBlocksByIndex = new Map();
151
208
  const toolCallBlocksById = new Map();
152
- const pendingReasoningDetailsByToolCallId = new Map();
153
209
  const blocks = output.content;
154
210
  const getContentIndex = (block) => blocks.indexOf(block);
155
211
  const getCustomToolCallInput = (block) => {
@@ -181,6 +237,7 @@ export const stream = (model, context, options) => {
181
237
  });
182
238
  }
183
239
  else if (block.type === "thinking") {
240
+ applyStreamedReasoningDetails(block);
184
241
  stream.push({
185
242
  type: "thinking_end",
186
243
  contentIndex,
@@ -236,16 +293,6 @@ export const stream = (model, context, options) => {
236
293
  }
237
294
  return thinkingBlock;
238
295
  };
239
- const applyPendingReasoningDetail = (block) => {
240
- if (!block.id) {
241
- return;
242
- }
243
- const pendingReasoningDetail = pendingReasoningDetailsByToolCallId.get(block.id);
244
- if (pendingReasoningDetail) {
245
- block.thoughtSignature = pendingReasoningDetail;
246
- pendingReasoningDetailsByToolCallId.delete(block.id);
247
- }
248
- };
249
296
  const ensureToolCallBlock = (toolCall) => {
250
297
  const streamIndex = typeof toolCall.index === "number" ? toolCall.index : undefined;
251
298
  const name = toolCall.function?.name ?? toolCall.custom?.name ?? "";
@@ -301,10 +348,10 @@ export const stream = (model, context, options) => {
301
348
  };
302
349
  delete block.partialArgs;
303
350
  }
304
- applyPendingReasoningDetail(block);
305
351
  return block;
306
352
  };
307
353
  for await (const chunk of openaiStream) {
354
+ await options?.onProviderStreamEvent?.(chunk, model);
308
355
  if (!chunk || typeof chunk !== "object")
309
356
  continue;
310
357
  // OpenAI documents ChatCompletionChunk.id as the unique chat completion identifier,
@@ -408,16 +455,14 @@ export const stream = (model, context, options) => {
408
455
  const reasoningDetails = choice.delta.reasoning_details;
409
456
  if (Array.isArray(reasoningDetails)) {
410
457
  for (const detail of reasoningDetails) {
411
- if (isEncryptedReasoningDetail(detail)) {
412
- const serializedDetail = JSON.stringify(detail);
413
- const matchingToolCall = toolCallBlocksById.get(detail.id);
414
- if (matchingToolCall) {
415
- matchingToolCall.thoughtSignature = serializedDetail;
416
- }
417
- else {
418
- pendingReasoningDetailsByToolCallId.set(detail.id, serializedDetail);
419
- }
420
- }
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);
421
466
  }
422
467
  }
423
468
  }
@@ -431,10 +476,13 @@ export const stream = (model, context, options) => {
431
476
  if (output.stopReason === "aborted") {
432
477
  throw new Error("Request was aborted");
433
478
  }
479
+ if (!hasFinishReason && !compat.supportsFinishReason) {
480
+ output.stopReason = output.content.some((block) => block.type === "toolCall") ? "toolUse" : "stop";
481
+ }
434
482
  if (output.stopReason === "error") {
435
483
  throw new Error(output.errorMessage || "Provider returned an error stop reason");
436
484
  }
437
- if (!hasFinishReason || output.stopReason === "pending") {
485
+ if ((compat.supportsFinishReason && !hasFinishReason) || output.stopReason === "pending") {
438
486
  throw new Error("Stream ended without finish_reason");
439
487
  }
440
488
  stream.push({ type: "done", reason: output.stopReason, message: output });
@@ -442,6 +490,9 @@ export const stream = (model, context, options) => {
442
490
  }
443
491
  catch (error) {
444
492
  for (const block of output.content) {
493
+ if (block.type === "thinking") {
494
+ applyStreamedReasoningDetails(block);
495
+ }
445
496
  delete block.index;
446
497
  // Streaming scratch buffers are only used during parsing; never persist them.
447
498
  delete block.partialArgs;
@@ -475,10 +526,11 @@ export const streamSimple = (model, context, options) => {
475
526
  return stream(model, context, {
476
527
  ...base,
477
528
  reasoningEffort,
529
+ thinkingBudgets: options?.thinkingBudgets,
478
530
  });
479
531
  };
480
532
  function createClient(model, context, apiKey, optionsHeaders, fetch, sessionId, compat = getCompat(model)) {
481
- const headers = { "User-Agent": getPiUserAgent(), ...model.headers };
533
+ const headers = { "User-Agent": getDrahtUserAgent(), ...model.headers };
482
534
  if (model.provider === "github-copilot") {
483
535
  const hasImages = hasCopilotVisionInput(context.messages);
484
536
  const copilotHeaders = buildCopilotDynamicHeaders({
@@ -511,8 +563,11 @@ function createClient(model, context, apiKey, optionsHeaders, fetch, sessionId,
511
563
  defaultHeaders: headers,
512
564
  });
513
565
  }
514
- function buildParams(model, context, options, compat = getCompat(model), cacheRetention = resolveCacheRetention(options?.cacheRetention, options?.env), grammarToolInputProperties = createGrammarToolInputProperties(context.tools, compat.supportsOpenAIGrammarTools)) {
515
- 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
+ });
516
571
  const cacheControl = getCompatCacheControl(compat, cacheRetention);
517
572
  const params = {
518
573
  model: model.id,
@@ -532,6 +587,7 @@ function buildParams(model, context, options, compat = getCompat(model), cacheRe
532
587
  }
533
588
  if (options?.maxTokens) {
534
589
  if (compat.maxTokensField === "max_tokens") {
590
+ // Deprecated by OpenAI, but some OpenAI-compatible providers only accept max_tokens.
535
591
  params.max_tokens = options.maxTokens;
536
592
  }
537
593
  else {
@@ -541,10 +597,8 @@ function buildParams(model, context, options, compat = getCompat(model), cacheRe
541
597
  if (options?.temperature !== undefined) {
542
598
  params.temperature = options.temperature;
543
599
  }
544
- const deferredToolNames = compat.deferredToolsMode === "kimi" ? getDeferredToolNames(context.messages) : new Set();
545
- const activeTools = context.tools?.filter((tool) => !deferredToolNames.has(tool.name));
546
- if (activeTools && activeTools.length > 0) {
547
- params.tools = convertTools(activeTools, compat);
600
+ if (transcriptTools.requestTools.length > 0) {
601
+ params.tools = convertTools(transcriptTools.requestTools, compat);
548
602
  if (compat.zaiToolStream) {
549
603
  params.tool_stream = true;
550
604
  }
@@ -556,9 +610,14 @@ function buildParams(model, context, options, compat = getCompat(model), cacheRe
556
610
  if (cacheControl) {
557
611
  applyAnthropicCacheControl(messages, params.tools, cacheControl);
558
612
  }
559
- if (options?.toolChoice && params.tools?.length) {
613
+ if (options?.toolChoice) {
560
614
  params.tool_choice = options.toolChoice;
561
615
  }
616
+ if (compat.vllmPriority !== undefined) {
617
+ params.priority = compat.vllmPriority;
618
+ }
619
+ const thinkingTokenBudgetField = resolveThinkingTokenBudgetField(compat);
620
+ const thinkingBudget = resolveClampedThinkingBudget(model, options, params);
562
621
  if (compat.thinkingFormat === "zai" && model.reasoning) {
563
622
  const zaiParams = params;
564
623
  zaiParams.thinking = options?.reasoningEffort ? { type: "enabled", clear_thinking: false } : { type: "disabled" };
@@ -586,11 +645,26 @@ function buildParams(model, context, options, compat = getCompat(model), cacheRe
586
645
  };
587
646
  }
588
647
  else if (compat.thinkingFormat === "chat-template" && model.reasoning) {
589
- const chatTemplateKwargs = buildChatTemplateKwargs(model, options, compat);
648
+ const chatTemplateKwargs = buildChatTemplateValues(model, options, compat.chatTemplateKwargs, thinkingBudget);
590
649
  if (chatTemplateKwargs) {
591
650
  params.chat_template_kwargs = chatTemplateKwargs;
592
651
  }
593
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
+ }
594
668
  else if (compat.thinkingFormat === "deepseek" && model.reasoning) {
595
669
  if (options?.reasoningEffort) {
596
670
  params.thinking = { type: "enabled" };
@@ -647,6 +721,13 @@ function buildParams(model, context, options, compat = getCompat(model), cacheRe
647
721
  params.reasoning_effort = offValue;
648
722
  }
649
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
+ }
650
731
  // OpenRouter provider routing preferences
651
732
  if (model.compat?.openRouterRouting) {
652
733
  params.provider = model.compat.openRouterRouting;
@@ -663,19 +744,35 @@ function buildParams(model, context, options, compat = getCompat(model), cacheRe
663
744
  params.providerOptions = { gateway: gatewayOptions };
664
745
  }
665
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);
666
749
  return params;
667
750
  }
668
- function buildChatTemplateKwargs(model, options, compat) {
669
- const kwargs = {};
670
- for (const [key, value] of Object.entries(compat.chatTemplateKwargs)) {
671
- 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);
672
769
  if (resolved !== undefined) {
673
- kwargs[key] = resolved;
770
+ resolvedValues[key] = resolved;
674
771
  }
675
772
  }
676
- return Object.keys(kwargs).length > 0 ? kwargs : undefined;
773
+ return Object.keys(resolvedValues).length > 0 ? resolvedValues : undefined;
677
774
  }
678
- function resolveChatTemplateKwargValue(model, options, value) {
775
+ function resolveChatTemplateKwargValue(model, options, value, thinkingBudget) {
679
776
  if (typeof value !== "object" || value === null) {
680
777
  return value;
681
778
  }
@@ -686,6 +783,9 @@ function resolveChatTemplateKwargValue(model, options, value) {
686
783
  if (value.$var === "thinking.enabled") {
687
784
  return !!reasoningEffort;
688
785
  }
786
+ if (value.$var === "thinking.budget") {
787
+ return thinkingBudget;
788
+ }
689
789
  const mappedValue = reasoningEffort ? model.thinkingLevelMap?.[reasoningEffort] : model.thinkingLevelMap?.off;
690
790
  return mappedValue === undefined ? reasoningEffort : typeof mappedValue === "string" ? mappedValue : undefined;
691
791
  }
@@ -764,6 +864,7 @@ function addCacheControlToTextContent(message, cacheControl) {
764
864
  return false;
765
865
  }
766
866
  export function convertMessages(model, context, compat, options) {
867
+ const normalizedContext = resolveTranscript(context, compat.supportsMidConvoSystemMessages);
767
868
  const params = [];
768
869
  const normalizeToolCallId = (id) => {
769
870
  // Handle pipe-separated IDs from OpenAI Responses API
@@ -790,12 +891,9 @@ export function convertMessages(model, context, compat, options) {
790
891
  return id.length > 40 ? id.slice(0, 40) : id;
791
892
  return id;
792
893
  };
793
- const transformedMessages = transformMessages(context.messages, model, (id) => normalizeToolCallId(id));
794
- if (context.systemPrompt) {
795
- const useDeveloperRole = model.reasoning && compat.supportsDeveloperRole;
796
- const role = useDeveloperRole ? "developer" : "system";
797
- params.push({ role: role, content: sanitizeSurrogates(context.systemPrompt) });
798
- }
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";
799
897
  let lastRole = null;
800
898
  for (let i = 0; i < transformedMessages.length; i++) {
801
899
  const msg = transformedMessages[i];
@@ -807,7 +905,21 @@ export function convertMessages(model, context, compat, options) {
807
905
  content: "I have processed the tool results.",
808
906
  });
809
907
  }
810
- 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") {
811
923
  if (typeof msg.content === "string") {
812
924
  params.push({
813
925
  role: "user",
@@ -815,7 +927,9 @@ export function convertMessages(model, context, compat, options) {
815
927
  });
816
928
  }
817
929
  else {
818
- const content = msg.content.map((item) => {
930
+ const content = msg.content
931
+ .filter((item) => item.type !== "text" || item.text.length > 0)
932
+ .map((item) => {
819
933
  if (item.type === "text") {
820
934
  return {
821
935
  type: "text",
@@ -854,6 +968,14 @@ export function convertMessages(model, context, compat, options) {
854
968
  }));
855
969
  const assistantText = assistantTextParts.map((part) => part.text).join("");
856
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);
857
979
  const nonEmptyThinkingBlocks = allThinkingBlocks.filter((block) => block.thinking.trim().length > 0);
858
980
  if (nonEmptyThinkingBlocks.length > 0 && compat.requiresThinkingAsText) {
859
981
  // Convert thinking blocks to plain text (no tags to avoid model mimicking them)
@@ -869,7 +991,8 @@ export function convertMessages(model, context, compat, options) {
869
991
  if (assistantText.length > 0) {
870
992
  assistantMsg.content = assistantText;
871
993
  }
872
- if (!compat.requiresThinkingAsText) {
994
+ // reasoning_details is the structured alternative to a raw reasoning field.
995
+ if (!compat.requiresThinkingAsText && !preservedReasoningDetails) {
873
996
  // Replay the captured reasoning field (e.g. "reasoning_content" for llama.cpp
874
997
  // server, gpt-oss, and DeepSeek reasoner) under its captured signature. DeepSeek
875
998
  // requires this on every thinking-mode assistant turn — even when the captured
@@ -882,13 +1005,12 @@ export function convertMessages(model, context, compat, options) {
882
1005
  if (model.provider === "opencode-go" && signature === "reasoning") {
883
1006
  signature = "reasoning_content";
884
1007
  }
885
- assistantMsg[signature] = signedThinkingBlocks
886
- .map((block) => block.thinking || "")
887
- .join("\n");
1008
+ if (isOpenAICompletionsReasoningField(signature)) {
1009
+ assistantMsg[signature] = signedThinkingBlocks.map((block) => block.thinking || "").join("\n");
1010
+ }
888
1011
  }
889
1012
  }
890
1013
  }
891
- const toolCalls = msg.content.filter(isToolCallBlock);
892
1014
  if (toolCalls.length > 0) {
893
1015
  assistantMsg.tool_calls = toolCalls.map((tc) => {
894
1016
  const customInputProperty = options?.grammarToolInputProperties?.get(tc.name);
@@ -911,20 +1033,9 @@ export function convertMessages(model, context, compat, options) {
911
1033
  },
912
1034
  };
913
1035
  });
914
- const reasoningDetails = toolCalls
915
- .filter((tc) => tc.thoughtSignature)
916
- .map((tc) => {
917
- try {
918
- return JSON.parse(tc.thoughtSignature);
919
- }
920
- catch {
921
- return null;
922
- }
923
- })
924
- .filter(Boolean);
925
- if (reasoningDetails.length > 0) {
926
- assistantMsg.reasoning_details = reasoningDetails;
927
- }
1036
+ }
1037
+ if (preservedReasoningDetails) {
1038
+ assistantMsg.reasoning_details = preservedReasoningDetails;
928
1039
  }
929
1040
  if (compat.requiresReasoningContentOnAssistantMessages &&
930
1041
  model.reasoning &&
@@ -950,7 +1061,6 @@ export function convertMessages(model, context, compat, options) {
950
1061
  }
951
1062
  else if (msg.role === "toolResult") {
952
1063
  const imageBlocks = [];
953
- const deferredToolNames = new Set();
954
1064
  let j = i;
955
1065
  for (; j < transformedMessages.length && transformedMessages[j].role === "toolResult"; j++) {
956
1066
  const toolMsg = transformedMessages[j];
@@ -973,11 +1083,6 @@ export function convertMessages(model, context, compat, options) {
973
1083
  toolResultMsg.name = toolMsg.toolName;
974
1084
  }
975
1085
  params.push(toolResultMsg);
976
- if (compat.deferredToolsMode === "kimi") {
977
- for (const name of toolMsg.addedToolNames ?? []) {
978
- deferredToolNames.add(name);
979
- }
980
- }
981
1086
  if (hasImages && model.input.includes("image")) {
982
1087
  for (const block of toolMsg.content) {
983
1088
  if (isImageContentBlock(block)) {
@@ -1014,17 +1119,6 @@ export function convertMessages(model, context, compat, options) {
1014
1119
  else {
1015
1120
  lastRole = "toolResult";
1016
1121
  }
1017
- if (deferredToolNames.size > 0) {
1018
- const deferredTools = getToolsByName(context.tools, deferredToolNames);
1019
- if (deferredTools.length > 0) {
1020
- const kimiToolMessage = {
1021
- role: "system",
1022
- tools: convertTools(deferredTools, compat),
1023
- };
1024
- // Kimi accepts a system message with tools but omits the standard content field.
1025
- params.push(kimiToolMessage);
1026
- }
1027
- }
1028
1122
  continue;
1029
1123
  }
1030
1124
  lastRole = msg.role;
@@ -1056,7 +1150,7 @@ function convertTools(tools, compat) {
1056
1150
  function: {
1057
1151
  name: tool.name,
1058
1152
  description: tool.description,
1059
- parameters: tool.parameters, // TypeBox already generates JSON Schema
1153
+ parameters: getJsonSchemaToolParameters(tool, strict),
1060
1154
  // Only include strict if provider supports it. Some reject unknown fields.
1061
1155
  ...(compat.supportsStrictMode !== false && { strict: strict ?? false }),
1062
1156
  },
@@ -1135,14 +1229,15 @@ function detectCompat(model) {
1135
1229
  const isCloudflareAiGateway = provider === "cloudflare-ai-gateway" || baseUrl.includes("gateway.ai.cloudflare.com");
1136
1230
  const isNvidia = provider === "nvidia" || baseUrl.includes("integrate.api.nvidia.com");
1137
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");
1138
1234
  const isNonStandard = isNvidia ||
1139
- provider === "cerebras" ||
1140
- baseUrl.includes("cerebras.ai") ||
1235
+ isCerebras ||
1141
1236
  provider === "xai" ||
1142
1237
  baseUrl.includes("api.x.ai") ||
1143
1238
  isTogether ||
1144
1239
  baseUrl.includes("chutes.ai") ||
1145
- baseUrl.includes("deepseek.com") ||
1240
+ isDeepSeek ||
1146
1241
  isZai ||
1147
1242
  isMoonshot ||
1148
1243
  provider === "opencode" ||
@@ -1150,7 +1245,6 @@ function detectCompat(model) {
1150
1245
  isCloudflareWorkersAI ||
1151
1246
  isCloudflareAiGateway ||
1152
1247
  isAntLing;
1153
- const isDeepSeek = provider === "deepseek" || baseUrl.includes("deepseek.com");
1154
1248
  const useMaxTokens = baseUrl.includes("chutes.ai") ||
1155
1249
  isDeepSeek ||
1156
1250
  isMoonshot ||
@@ -1167,6 +1261,7 @@ function detectCompat(model) {
1167
1261
  supportsDeveloperRole: isOpenRouterDeveloperRoleModel || (!isNonStandard && !isOpenRouter),
1168
1262
  supportsReasoningEffort: !isGrok && !isZai && !isMoonshot && !isTogether && !isCloudflareAiGateway && !isNvidia && !isAntLing,
1169
1263
  supportsUsageInStreaming: true,
1264
+ supportsFinishReason: true,
1170
1265
  maxTokensField: useMaxTokens ? "max_tokens" : "max_completion_tokens",
1171
1266
  requiresToolResultName: false,
1172
1267
  requiresAssistantAfterToolResult: false,
@@ -1186,12 +1281,17 @@ function detectCompat(model) {
1186
1281
  openRouterRouting: {},
1187
1282
  vercelGatewayRouting: {},
1188
1283
  chatTemplateKwargs: {},
1284
+ chatTemplateArgs: {},
1189
1285
  zaiToolStream: false,
1190
- 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,
1191
1290
  supportsOpenAIGrammarTools: false,
1291
+ supportsMidConvoSystemMessages: false,
1292
+ supportsMidConvoToolAdditions: false,
1192
1293
  cacheControlFormat,
1193
- sendSessionAffinityHeaders: false,
1194
- deferredToolsMode: undefined,
1294
+ sendSessionAffinityHeaders: isOpenRouter,
1195
1295
  sessionAffinityFormat: isOpenRouter ? "openrouter" : "openai",
1196
1296
  supportsLongCacheRetention: !(isTogether ||
1197
1297
  isCloudflareWorkersAI ||
@@ -1213,6 +1313,7 @@ function getCompat(model) {
1213
1313
  supportsDeveloperRole: model.compat.supportsDeveloperRole ?? detected.supportsDeveloperRole,
1214
1314
  supportsReasoningEffort: model.compat.supportsReasoningEffort ?? detected.supportsReasoningEffort,
1215
1315
  supportsUsageInStreaming: model.compat.supportsUsageInStreaming ?? detected.supportsUsageInStreaming,
1316
+ supportsFinishReason: model.compat.supportsFinishReason ?? detected.supportsFinishReason,
1216
1317
  maxTokensField: model.compat.maxTokensField ?? detected.maxTokensField,
1217
1318
  requiresToolResultName: model.compat.requiresToolResultName ?? detected.requiresToolResultName,
1218
1319
  requiresAssistantAfterToolResult: model.compat.requiresAssistantAfterToolResult ?? detected.requiresAssistantAfterToolResult,
@@ -1223,14 +1324,19 @@ function getCompat(model) {
1223
1324
  openRouterRouting: model.compat.openRouterRouting ?? {},
1224
1325
  vercelGatewayRouting: model.compat.vercelGatewayRouting ?? detected.vercelGatewayRouting,
1225
1326
  chatTemplateKwargs: model.compat.chatTemplateKwargs ?? detected.chatTemplateKwargs,
1327
+ chatTemplateArgs: model.compat.chatTemplateArgs ?? detected.chatTemplateArgs,
1226
1328
  zaiToolStream: model.compat.zaiToolStream ?? detected.zaiToolStream,
1329
+ supportsThinkingTokenBudget: model.compat.supportsThinkingTokenBudget ?? detected.supportsThinkingTokenBudget,
1330
+ thinkingTokenBudgetField: model.compat.thinkingTokenBudgetField ?? detected.thinkingTokenBudgetField,
1227
1331
  supportsStrictMode: model.compat.supportsStrictMode ?? detected.supportsStrictMode,
1228
1332
  supportsOpenAIGrammarTools: model.compat.supportsOpenAIGrammarTools ?? detected.supportsOpenAIGrammarTools,
1333
+ supportsMidConvoSystemMessages: model.compat.supportsMidConvoSystemMessages ?? detected.supportsMidConvoSystemMessages,
1334
+ supportsMidConvoToolAdditions: model.compat.supportsMidConvoToolAdditions ?? detected.supportsMidConvoToolAdditions,
1229
1335
  cacheControlFormat: model.compat.cacheControlFormat ?? detected.cacheControlFormat,
1230
1336
  sendSessionAffinityHeaders: model.compat.sendSessionAffinityHeaders ?? detected.sendSessionAffinityHeaders,
1231
- deferredToolsMode: model.compat.deferredToolsMode ?? detected.deferredToolsMode,
1232
1337
  sessionAffinityFormat: model.compat.sessionAffinityFormat ?? detected.sessionAffinityFormat,
1233
1338
  supportsLongCacheRetention: model.compat.supportsLongCacheRetention ?? detected.supportsLongCacheRetention,
1339
+ vllmPriority: model.compat.vllmPriority,
1234
1340
  };
1235
1341
  }
1236
1342
  //# sourceMappingURL=openai-completions.js.map