@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
package/dist/types.d.ts CHANGED
@@ -1,3 +1,4 @@
1
+ import type { TelemetryContext } from "@draht/telemetry";
1
2
  import type { AnthropicOptions } from "./api/anthropic-messages.ts";
2
3
  import type { AzureOpenAIResponsesOptions } from "./api/azure-openai-responses.ts";
3
4
  import type { BedrockOptions } from "./api/bedrock-converse-stream.ts";
@@ -13,20 +14,22 @@ import type { AssistantMessageEventStream } from "./utils/event-stream.ts";
13
14
  export type { AssistantMessageEventStream } from "./utils/event-stream.ts";
14
15
  export type KnownApi = "openai-completions" | "mistral-conversations" | "openai-responses" | "azure-openai-responses" | "openai-codex-responses" | "anthropic-messages" | "bedrock-converse-stream" | "google-generative-ai" | "google-vertex" | "pi-messages";
15
16
  export type Api = KnownApi | (string & {});
16
- export type KnownImagesApi = "openrouter-images";
17
- export type ImagesApi = KnownImagesApi | (string & {});
18
- export type KnownProvider = "amazon-bedrock" | "ant-ling" | "anthropic" | "google" | "google-vertex" | "openai" | "azure-openai-responses" | "openai-codex" | "radius" | "nvidia" | "deepseek" | "github-copilot" | "xai" | "groq" | "cerebras" | "openrouter" | "vercel-ai-gateway" | "zai" | "zai-coding-cn" | "mistral" | "minimax" | "minimax-cn" | "moonshotai" | "moonshotai-cn" | "huggingface" | "fireworks" | "together" | "opencode" | "opencode-go" | "kimi-coding" | "cloudflare-workers-ai" | "cloudflare-ai-gateway" | "qwen-token-plan" | "qwen-token-plan-cn" | "xiaomi" | "xiaomi-token-plan-cn" | "xiaomi-token-plan-ams" | "xiaomi-token-plan-sgp";
17
+ export type KnownImageApi = "openrouter-images";
18
+ export type ImageApi = KnownImageApi | (string & {});
19
+ export type KnownClassifierApi = "typesafe-system-one" | "cloudflare-workers-ai-system-one" | "llama-cpp-classify";
20
+ export type ClassifierApi = KnownClassifierApi | (string & {});
21
+ export type KnownProvider = "amazon-bedrock" | "ant-ling" | "anthropic" | "google" | "google-vertex" | "openai" | "azure-openai-responses" | "openai-codex" | "radius" | "typesafe" | "nvidia" | "deepseek" | "github-copilot" | "xai" | "groq" | "cerebras" | "openrouter" | "vercel-ai-gateway" | "zai" | "zai-coding-cn" | "mistral" | "minimax" | "minimax-cn" | "moonshotai" | "moonshotai-cn" | "huggingface" | "fireworks" | "together" | "baseten" | "opencode" | "opencode-go" | "kimi-coding" | "meta" | "cloudflare-workers-ai" | "cloudflare-ai-gateway" | "qwen-token-plan" | "qwen-token-plan-cn" | "qwen-token-plan-individual" | "xiaomi" | "xiaomi-token-plan-cn" | "xiaomi-token-plan-ams" | "xiaomi-token-plan-sgp";
19
22
  export type ProviderId = KnownProvider | string;
20
- export type KnownImagesProvider = "openrouter";
21
- export type ImagesProviderId = KnownImagesProvider | string;
22
23
  export type ToolChoice = "auto" | "none";
23
24
  export type ThinkingLevel = "minimal" | "low" | "medium" | "high" | "xhigh" | "max";
24
25
  export type ModelThinkingLevel = "off" | ThinkingLevel;
25
26
  export type ThinkingLevelMap = Partial<Record<ModelThinkingLevel, string | null>>;
26
27
  export type ChatTemplateKwargValue = string | number | boolean | null | {
27
- $var: "thinking.enabled" | "thinking.effort";
28
+ $var: "thinking.enabled" | "thinking.effort" | "thinking.budget";
28
29
  omitWhenOff?: boolean;
29
30
  };
31
+ /** Top-level request field used to cap reasoning tokens on OpenAI-compatible servers. */
32
+ export type ThinkingTokenBudgetField = "thinking_token_budget" | "thinking_budget" | "thinking_budget_tokens";
30
33
  /** Token budgets for each thinking level (token-based providers only) */
31
34
  export interface ThinkingBudgets {
32
35
  minimal?: number;
@@ -35,6 +38,11 @@ export interface ThinkingBudgets {
35
38
  high?: number;
36
39
  }
37
40
  export type CacheRetention = "none" | "short" | "long";
41
+ /**
42
+ * Best-effort prompt cache lifetime in seconds for each retention tier a request can ask for.
43
+ * A missing tier means the lifetime is unknown; draht does not warm such caches.
44
+ */
45
+ export type ModelPromptCache = Partial<Record<Exclude<CacheRetention, "none">, number>>;
38
46
  export type Transport = "sse" | "websocket" | "websocket-cached" | "auto";
39
47
  /** Provider-scoped environment overrides. Values take precedence over process.env. */
40
48
  export type ProviderEnv = Record<string, string>;
@@ -45,10 +53,11 @@ export interface ProviderResponse {
45
53
  status: number;
46
54
  headers: Record<string, string>;
47
55
  }
48
- export interface StreamOptions {
49
- temperature?: number;
50
- maxTokens?: number;
56
+ /** Authentication, HTTP transport, and lifecycle callbacks shared by provider requests. */
57
+ export interface ProviderRequestOptions<TModel = Model<Api>> {
51
58
  signal?: AbortSignal;
59
+ /** Explicit parent context for telemetry produced by this logical request. */
60
+ telemetryContext?: TelemetryContext;
52
61
  apiKey?: string;
53
62
  /**
54
63
  * Optional fetch implementation for provider HTTP requests.
@@ -57,31 +66,20 @@ export interface StreamOptions {
57
66
  */
58
67
  fetch?: FetchFunction;
59
68
  /**
60
- * Preferred transport for providers that support multiple transports.
61
- * Providers that do not support this option ignore it.
62
- */
63
- transport?: Transport;
64
- /**
65
- * Prompt cache retention preference. Providers map this to their supported values.
66
- * Default: "short".
67
- */
68
- cacheRetention?: CacheRetention;
69
- /**
70
- * Optional session identifier for providers that support session-based caching.
71
- * Providers can use this to enable prompt caching, request routing, or other
72
- * session-aware features. Ignored by providers that don't support it.
69
+ * Provider-scoped environment values. These take precedence over process.env for
70
+ * provider configuration such as regional settings, endpoint placeholders, and
71
+ * proxy variables.
73
72
  */
74
- sessionId?: string;
73
+ env?: ProviderEnv;
75
74
  /**
76
75
  * Optional callback for inspecting or replacing provider payloads before sending.
77
76
  * Return undefined to keep the payload unchanged.
78
77
  */
79
- onPayload?: (payload: unknown, model: Model<Api>) => unknown | undefined | Promise<unknown | undefined>;
78
+ onPayload?: (payload: unknown, model: TModel) => unknown | undefined | Promise<unknown | undefined>;
80
79
  /**
81
- * Optional callback invoked after an HTTP response is received and before
82
- * its body stream is consumed.
80
+ * Optional callback invoked after an HTTP response is received.
83
81
  */
84
- onResponse?: (response: ProviderResponse, model: Model<Api>) => void | Promise<void>;
82
+ onResponse?: (response: ProviderResponse, model: TModel) => void | Promise<void>;
85
83
  /**
86
84
  * Optional custom HTTP headers to include in API requests.
87
85
  * Merged with provider defaults; caller values override default headers.
@@ -96,12 +94,6 @@ export interface StreamOptions {
96
94
  * For example, OpenAI and Anthropic SDK clients default to 10 minutes.
97
95
  */
98
96
  timeoutMs?: number;
99
- /**
100
- * WebSocket connect timeout in milliseconds for providers that support
101
- * WebSocket transports. This covers the connection/open handshake only;
102
- * stream idleness after connection uses timeoutMs.
103
- */
104
- websocketConnectTimeoutMs?: number;
105
97
  /**
106
98
  * Maximum retry attempts for providers/SDKs that support client-side retries.
107
99
  * For example, OpenAI and Anthropic SDK clients default to 2.
@@ -115,20 +107,68 @@ export interface StreamOptions {
115
107
  * Default: 60000 (60 seconds). Set to 0 to disable the cap.
116
108
  */
117
109
  maxRetryDelayMs?: number;
110
+ }
111
+ export interface StreamOptions extends ProviderRequestOptions<Model<Api>> {
112
+ /**
113
+ * Optional callback invoked after an HTTP response is received and before
114
+ * its body stream is consumed.
115
+ */
116
+ onResponse?: (response: ProviderResponse, model: Model<Api>) => void | Promise<void>;
117
+ /**
118
+ * Optional observer for each parsed provider stream event before draht normalization.
119
+ * Event data is adapter-owned and must be treated as read-only.
120
+ * Adapter support is explicit; unsupported adapters do not invoke it.
121
+ */
122
+ onProviderStreamEvent?: (data: unknown, model: Model<Api>) => void | Promise<void>;
123
+ temperature?: number;
124
+ /**
125
+ * Arbitrary sampling parameters merged into the request body as-is, after the named request
126
+ * fields, so keys here override them. Lets custom OpenAI-compatible servers (llama.cpp, vLLM,
127
+ * SGLang, ...) receive parameters pi does not model, e.g. `top_p`, `top_k`, `min_p`,
128
+ * `repetition_penalty`. Merged over `Model.samplingParams` per key. Only applied by
129
+ * OpenAI-compatible adapters (completions, responses, Azure responses); other APIs ignore it.
130
+ */
131
+ samplingParams?: Record<string, unknown>;
132
+ maxTokens?: number;
133
+ /**
134
+ * Preferred transport for providers that support multiple transports.
135
+ * Providers that do not support this option ignore it.
136
+ */
137
+ transport?: Transport;
138
+ /**
139
+ * Prompt cache retention preference. Providers map this to their supported values.
140
+ * Default: "short".
141
+ */
142
+ cacheRetention?: CacheRetention;
143
+ /**
144
+ * Optional session identifier for providers that support session-based caching.
145
+ * Providers can use this to enable prompt caching, request routing, or other
146
+ * session-aware features. Ignored by providers that don't support it.
147
+ */
148
+ sessionId?: string;
149
+ /**
150
+ * WebSocket connect timeout in milliseconds for providers that support
151
+ * WebSocket transports. This covers the connection/open handshake only;
152
+ * stream idleness after connection uses timeoutMs.
153
+ */
154
+ websocketConnectTimeoutMs?: number;
118
155
  /**
119
156
  * Optional metadata to include in API requests.
120
157
  * Providers extract the fields they understand and ignore the rest.
121
158
  * For example, Anthropic uses `user_id` for abuse tracking and rate limiting.
122
159
  */
123
160
  metadata?: Record<string, unknown>;
161
+ }
162
+ export type ProviderStreamOptions = StreamOptions & Record<string, unknown>;
163
+ export interface DeferredFetchOptions extends ProviderRequestOptions<Model<Api>> {
124
164
  /**
125
- * Provider-scoped environment values. These take precedence over process.env for
126
- * provider configuration such as regional settings, endpoint placeholders, and
127
- * proxy variables.
165
+ * Maximum provider long-poll duration in milliseconds.
166
+ * Defaults to 0, which performs one status check.
128
167
  */
129
- env?: ProviderEnv;
168
+ wait?: number;
130
169
  }
131
- export type ProviderStreamOptions = StreamOptions & Record<string, unknown>;
170
+ /** Request options for best-effort deferred-response cancellation. */
171
+ export type DeferredCancelOptions = ProviderRequestOptions<Model<Api>>;
132
172
  /**
133
173
  * Maps known APIs to their full provider-specific stream option types.
134
174
  * Type-only imports from API implementation modules are erased at emit, so
@@ -153,66 +193,40 @@ export interface ApiOptionsMap {
153
193
  export type ApiStreamOptions<TApi extends Api> = TApi extends keyof ApiOptionsMap ? ApiOptionsMap[TApi] : StreamOptions & Record<string, unknown>;
154
194
  /**
155
195
  * The uniform stream contract of an API implementation module: every module
156
- * under `src/api/` exports exactly `stream` and `streamSimple`, so the module
157
- * itself satisfies this interface. Lazy wrappers (`lazyApi()`) and provider
196
+ * under `src/api/` exports `stream` and `streamSimple`; capable modules may also
197
+ * export deferred-response methods. Lazy wrappers (`lazyApi()`) and provider
158
198
  * factories pass these around as values. This is the untyped dispatch shape;
159
199
  * per-API option typing lives on the implementation modules themselves and on
160
200
  * `Provider.stream()` via `ApiStreamOptions`.
161
201
  */
162
202
  export interface ProviderStreams {
163
- stream(model: Model<Api>, context: Context, options?: StreamOptions): AssistantMessageEventStream;
164
- streamSimple(model: Model<Api>, context: Context, options?: SimpleStreamOptions): AssistantMessageEventStream;
203
+ stream(model: Model<Api>, context: TranscriptContext, options?: StreamOptions): AssistantMessageEventStream;
204
+ streamSimple(model: Model<Api>, context: TranscriptContext, options?: SimpleStreamOptions): AssistantMessageEventStream;
205
+ fetchDeferred?(model: Model<Api>, handle: DeferredHandle, options?: DeferredFetchOptions): AssistantMessageEventStream;
206
+ cancelDeferred?(model: Model<Api>, handle: DeferredHandle, options?: DeferredCancelOptions): Promise<void>;
165
207
  }
166
208
  /**
167
209
  * The uniform contract of an image-generation API implementation module:
168
210
  * every image API module under `src/api/` exports exactly `generateImages`,
169
- * so the module itself satisfies this interface. Lazy wrappers and image
170
- * provider factories pass these around as values.
211
+ * so the module itself satisfies this interface. Lazy wrappers and
212
+ * `createProvider({ images })` pass these around as values.
171
213
  */
172
214
  export interface ProviderImages {
173
- generateImages(model: ImagesModel<ImagesApi>, context: ImagesContext, options?: ImagesOptions): Promise<AssistantImages>;
215
+ generateImages(model: ImageModel<ImageApi>, context: ImagesContext, options?: ImagesOptions): Promise<AssistantImages>;
174
216
  }
175
- export interface ImagesOptions {
176
- signal?: AbortSignal;
177
- apiKey?: string;
178
- /** Optional fetch implementation for provider HTTP requests. Defaults to `globalThis.fetch`. */
179
- fetch?: FetchFunction;
180
- /**
181
- * Provider-scoped environment values. These take precedence over process.env for
182
- * provider configuration such as endpoint placeholders and proxy variables.
183
- */
184
- env?: ProviderEnv;
185
- /**
186
- * Optional callback for inspecting or replacing provider payloads before sending.
187
- * Return undefined to keep the payload unchanged.
188
- */
189
- onPayload?: (payload: unknown, model: ImagesModel<ImagesApi>) => unknown | undefined | Promise<unknown | undefined>;
190
- /**
191
- * Optional callback invoked after an HTTP response is received.
192
- */
193
- onResponse?: (response: ProviderResponse, model: ImagesModel<ImagesApi>) => void | Promise<void>;
194
- /**
195
- * Optional custom HTTP headers to include in API requests.
196
- * Merged with provider defaults; can override default headers.
197
- * A null value suppresses a provider/API default header with the same name.
198
- */
199
- headers?: ProviderHeaders;
200
- /**
201
- * HTTP request timeout in milliseconds for providers/SDKs that support it.
202
- */
203
- timeoutMs?: number;
204
- /**
205
- * Maximum retry attempts for providers/SDKs that support client-side retries.
206
- */
207
- maxRetries?: number;
217
+ /** The uniform contract implemented by classifier API modules. */
218
+ export interface ProviderClassifier {
219
+ classify(model: ClassifierModel<ClassifierApi>, context: ClassifierContext, options?: ClassifierOptions): Promise<ClassifierResult>;
220
+ }
221
+ export interface ClassifierOptions extends ProviderRequestOptions<ClassifierModel<ClassifierApi>> {
208
222
  /**
209
- * Maximum delay in milliseconds to wait for a retry when the server requests a long wait.
210
- * If the server's requested delay exceeds this value, the request fails immediately
211
- * with an error containing the requested delay, allowing higher-level retry logic
212
- * to handle it with user visibility.
213
- * Default: 60000 (60 seconds). Set to 0 to disable the cap.
223
+ * Divides the answer logits by this value before they are normalized into probabilities.
224
+ * Values above 1 soften the distribution; values below 1 sharpen it. Must be positive.
225
+ * APIs that cannot apply it ignore it.
214
226
  */
215
- maxRetryDelayMs?: number;
227
+ temperature?: number;
228
+ }
229
+ export interface ImagesOptions extends ProviderRequestOptions<ImageModel<ImageApi>> {
216
230
  /**
217
231
  * Optional metadata to include in API requests.
218
232
  * Providers extract the fields they understand and ignore the rest.
@@ -220,15 +234,25 @@ export interface ImagesOptions {
220
234
  metadata?: Record<string, unknown>;
221
235
  }
222
236
  export type ProviderImagesOptions = ImagesOptions & Record<string, unknown>;
237
+ export interface AnthropicAllowedFallbackModel {
238
+ provider: ProviderId;
239
+ model: string;
240
+ cost: ModelCost;
241
+ }
223
242
  export interface SimpleStreamOptions extends StreamOptions {
224
- /** Provider-neutral tool selection for simple requests. Default: "auto". */
243
+ /** Provider-neutral tool selection for simple requests. When omitted, adapters use provider-specific behavior. */
225
244
  toolChoice?: ToolChoice;
226
245
  reasoning?: ThinkingLevel;
246
+ /** Ask a capable provider to return a durable handle and continue the request asynchronously. */
247
+ deferred?: boolean | {
248
+ window?: "15m" | "1h" | "24h";
249
+ };
227
250
  /** Custom token budgets for thinking levels (token-based providers only) */
228
251
  thinkingBudgets?: ThinkingBudgets;
229
252
  }
230
- export type StreamFunction<TApi extends Api = Api, TOptions extends StreamOptions = StreamOptions> = (model: Model<TApi>, context: Context, options?: TOptions) => AssistantMessageEventStream;
231
- export type ImagesFunction<TApi extends ImagesApi = ImagesApi, TOptions extends ImagesOptions = ImagesOptions> = (model: ImagesModel<TApi>, context: ImagesContext, options?: TOptions) => Promise<AssistantImages>;
253
+ export type StreamFunction<TApi extends Api = Api, TOptions extends StreamOptions = StreamOptions> = (model: Model<TApi>, context: TranscriptContext, options?: TOptions) => AssistantMessageEventStream;
254
+ export type ImagesFunction<TOptions extends ImagesOptions = ImagesOptions> = (model: ImageModel<ImageApi>, context: ImagesContext, options?: TOptions) => Promise<AssistantImages>;
255
+ export type ClassifierFunction<TOptions extends ClassifierOptions = ClassifierOptions> = (model: ClassifierModel<ClassifierApi>, context: ClassifierContext, options?: TOptions) => Promise<ClassifierResult>;
232
256
  export interface TextSignatureV1 {
233
257
  v: 1;
234
258
  id: string;
@@ -257,8 +281,10 @@ export interface ToolCall {
257
281
  type: "toolCall";
258
282
  id: string;
259
283
  name: string;
260
- arguments: Record<string, any>;
284
+ arguments: JsonObject;
261
285
  thoughtSignature?: string;
286
+ /** OpenAI Responses namespace for calls to dynamically loaded or namespaced tools. */
287
+ namespace?: string;
262
288
  }
263
289
  export interface Usage {
264
290
  input: number;
@@ -282,7 +308,62 @@ export interface Usage {
282
308
  total: number;
283
309
  };
284
310
  }
285
- export type StopReason = "pending" | "stop" | "length" | "toolUse" | "error" | "aborted";
311
+ export type StopReason = "pending" | "stop" | "length" | "toolUse" | "error" | "aborted" | "deferred";
312
+ export type JsonValue = null | boolean | number | string | readonly JsonValue[] | JsonObject;
313
+ export type JsonObject = {
314
+ [key: string]: JsonValue;
315
+ };
316
+ type IsAny<T> = 0 extends 1 & T ? true : false;
317
+ type IsExactlyJsonValue<T> = [T] extends [JsonValue] ? ([JsonValue] extends [T] ? true : false) : false;
318
+ type IsJsonProperty<T> = IsAny<T> extends true ? false : unknown extends T ? false : [Exclude<T, undefined>] extends [never] ? true : IsJsonCompatible<Exclude<T, undefined>>;
319
+ type InvalidJsonKeys<T extends object> = {
320
+ [TKey in keyof T]-?: TKey extends string | number ? (IsJsonProperty<T[TKey]> extends true ? never : TKey) : TKey;
321
+ }[keyof T];
322
+ type IsJsonCompatible<T> = IsAny<T> extends true ? false : unknown extends T ? false : IsExactlyJsonValue<T> extends true ? true : T extends null | boolean | number | string ? true : T extends undefined ? false : T extends readonly (infer TItem)[] ? IsJsonCompatible<TItem> : T extends (...args: never[]) => unknown ? false : T extends object ? [InvalidJsonKeys<T>] extends [never] ? true : false : false;
323
+ /** The JSON representation of a typed in-memory value. Optional object properties remain optional. */
324
+ export type JsonRepresentation<T> = IsAny<T> extends true ? JsonValue : unknown extends T ? JsonValue : [T] extends [JsonValue] ? T : T extends readonly unknown[] ? {
325
+ [TKey in keyof T]: JsonRepresentation<Exclude<T[TKey], undefined>>;
326
+ } : T extends object ? {
327
+ [TKey in keyof T]: JsonRepresentation<Exclude<T[TKey], undefined>>;
328
+ } : never;
329
+ export interface DeferredHandle {
330
+ provider: string;
331
+ modelId: string;
332
+ api: string;
333
+ /** Provider token, such as a response id or batch id plus row id. */
334
+ id: string;
335
+ expiresAt?: number;
336
+ pollAfterMs?: number;
337
+ /** Provider conversion data required to reconstruct the final assistant message. */
338
+ data?: JsonValue;
339
+ }
340
+ /**
341
+ * System instructions and tool declarations at one point in the transcript.
342
+ *
343
+ * The leading system message is the system prompt. Later system messages change it:
344
+ * `content` adds instructions from that point on, `sections` replace or remove named
345
+ * prompt sections, and `toolsAdded`/`toolsRemoved` change the tool set. Replaying
346
+ * every system message in order yields the current prompt and tools. Providers that
347
+ * accept system messages mid-conversation send each one in place; other providers
348
+ * rebuild the leading system message from the replayed state.
349
+ */
350
+ export interface SystemMessage {
351
+ role: "system";
352
+ /** Instruction text. On the leading message this is the base prompt; later, additional instructions. */
353
+ content: string | TextContent[];
354
+ /**
355
+ * Named, ordered prompt sections rendered verbatim after `content`. The leading message
356
+ * declares them; later messages replace sections by name, and `null` removes one. Keep
357
+ * each section self-delimiting (a tag, a heading) so the model can relate an update to
358
+ * the original. Avoid integer-like names; JSON objects reorder those.
359
+ */
360
+ sections?: Record<string, string | null>;
361
+ /** Complete definitions of tools that become available at this point. */
362
+ toolsAdded?: Tool[];
363
+ /** Tools that stop being available at this point. */
364
+ toolsRemoved?: ToolReference[];
365
+ timestamp: number;
366
+ }
286
367
  export interface UserMessage {
287
368
  role: "user";
288
369
  content: string | (TextContent | ImageContent)[];
@@ -296,31 +377,57 @@ export interface AssistantMessage {
296
377
  model: string;
297
378
  responseModel?: string;
298
379
  responseId?: string;
380
+ /** Exact provider-native effort level used for this response. Absent for legacy or unmanaged responses. */
381
+ providerThinkingLevel?: string;
382
+ /** draht thinking level the agent loop requested for this response. Absent outside the agent loop and for legacy responses. */
383
+ thinkingLevel?: ModelThinkingLevel;
299
384
  diagnostics?: AssistantMessageDiagnostic[];
300
385
  usage: Usage;
301
386
  stopReason: StopReason;
387
+ deferred?: DeferredHandle;
302
388
  errorMessage?: string;
303
389
  rawStopReason?: string;
390
+ /**
391
+ * Provider indication of whether the model explicitly ended its turn.
392
+ * Preserved for debugging and does not currently affect agent control flow.
393
+ */
394
+ endTurn?: boolean;
304
395
  timestamp: number;
305
396
  }
306
- export interface ToolResultMessage<TDetails = any> {
397
+ /** A tool call that another tool made while it ran, for example from a codemode script. */
398
+ export interface NestedToolCallRecord {
399
+ id: string;
400
+ name: string;
401
+ /** Omitted when over the size limits; `argumentsBytes` then gives their size. */
402
+ arguments?: JsonObject;
403
+ /** UTF-8 size of the arguments as JSON, set when `arguments` is omitted. */
404
+ argumentsBytes?: number;
405
+ /** `unfinished`: the call was still running when the calling tool finished. */
406
+ status: "ok" | "error" | "unfinished";
407
+ durationMs?: number;
408
+ /** Error text, truncated. */
409
+ error?: string;
410
+ }
411
+ /** Bounded record of the nested calls a tool made. Results are not recorded. */
412
+ export interface NestedToolCalls {
413
+ calls: NestedToolCallRecord[];
414
+ /** False when calls were dropped, arguments omitted, or calls had not finished. */
415
+ complete: boolean;
416
+ }
417
+ export type ToolResultMessage<TDetails = JsonValue> = IsJsonCompatible<TDetails> extends true ? {
307
418
  role: "toolResult";
308
419
  toolCallId: string;
309
420
  toolName: string;
310
421
  content: (TextContent | ImageContent)[];
311
- details?: TDetails;
422
+ details?: JsonRepresentation<TDetails>;
312
423
  /** Usage from the tool execution itself, if available. Not part of main LLM context accounting. */
313
424
  usage?: Usage;
314
- /**
315
- * Names from `Context.tools` that became available after this result.
316
- * Providers with native deferred tool loading use this as the load point;
317
- * other providers ignore it and use `Context.tools` normally.
318
- */
319
- addedToolNames?: string[];
425
+ /** Calls this tool made to other tools. Kept for the session record; not sent to the model. */
426
+ nestedCalls?: NestedToolCalls;
320
427
  isError: boolean;
321
428
  timestamp: number;
322
- }
323
- export type Message = UserMessage | AssistantMessage | ToolResultMessage;
429
+ } : never;
430
+ export type Message = SystemMessage | UserMessage | AssistantMessage | ToolResultMessage;
324
431
  export type ImagesInputContent = TextContent | ImageContent;
325
432
  export type ImagesOutputContent = TextContent | ImageContent;
326
433
  export interface ImagesContext {
@@ -328,8 +435,8 @@ export interface ImagesContext {
328
435
  }
329
436
  export type ImagesStopReason = "stop" | "error" | "aborted";
330
437
  export interface AssistantImages {
331
- api: ImagesApi;
332
- provider: ImagesProviderId;
438
+ api: ImageApi;
439
+ provider: ProviderId;
333
440
  model: string;
334
441
  output: ImagesOutputContent[];
335
442
  responseId?: string;
@@ -338,6 +445,57 @@ export interface AssistantImages {
338
445
  errorMessage?: string;
339
446
  timestamp: number;
340
447
  }
448
+ export interface ClassifierChoiceQuestion {
449
+ type: "choice";
450
+ instructions: string;
451
+ criteria: Record<string, string>;
452
+ }
453
+ export interface ClassifierScoreQuestion {
454
+ type: "score";
455
+ instructions: string;
456
+ criteria: string[];
457
+ }
458
+ export interface ClassifierBoolQuestion {
459
+ type: "bool";
460
+ instructions: string;
461
+ criteria: {
462
+ true: string;
463
+ false: string;
464
+ };
465
+ }
466
+ export type ClassifierQuestion = ClassifierChoiceQuestion | ClassifierScoreQuestion | ClassifierBoolQuestion;
467
+ export interface ClassifierContext {
468
+ state: JsonObject;
469
+ questions: Record<string, ClassifierQuestion>;
470
+ }
471
+ export interface ClassifierChoiceAnswer {
472
+ type: "choice";
473
+ choice: string;
474
+ probabilities: Record<string, number>;
475
+ confidence: number;
476
+ }
477
+ export interface ClassifierScoreAnswer {
478
+ type: "score";
479
+ score: number;
480
+ confidence: number;
481
+ }
482
+ export interface ClassifierBoolAnswer {
483
+ type: "bool";
484
+ probability: number;
485
+ }
486
+ export type ClassifierAnswer = ClassifierChoiceAnswer | ClassifierScoreAnswer | ClassifierBoolAnswer;
487
+ export type ClassifierStopReason = "stop" | "error" | "aborted";
488
+ export interface ClassifierResult {
489
+ api: ClassifierApi;
490
+ provider: ProviderId;
491
+ model: string;
492
+ answers: Record<string, ClassifierAnswer>;
493
+ /** Token usage and its cost at the model's catalog price, when the service reports token counts. */
494
+ usage?: Usage;
495
+ stopReason: ClassifierStopReason;
496
+ errorMessage?: string;
497
+ timestamp: number;
498
+ }
341
499
  import type { TSchema } from "typebox";
342
500
  /** OpenAI grammar variants for constrained sampling. */
343
501
  export type GrammarFormat = "openai_lark" | "openai_regex";
@@ -362,18 +520,46 @@ export interface Tool<TParameters extends TSchema = TSchema> {
362
520
  parameters: TParameters;
363
521
  constrainedSampling?: false | ConstrainedSamplingConfig;
364
522
  }
523
+ export interface ToolReference {
524
+ name: string;
525
+ }
526
+ /**
527
+ * Request input accepted by the public stream entry points (`Models.stream()`,
528
+ * `streamSimple()`, ...). `systemPrompt` and `tools` are shorthand for a leading
529
+ * system message; `normalizeContext()` folds them into one before the request
530
+ * reaches a provider.
531
+ */
365
532
  export interface Context {
366
533
  systemPrompt?: string;
367
534
  messages: Message[];
368
535
  tools?: Tool[];
369
536
  }
537
+ declare const transcriptContextBrand: unique symbol;
538
+ /**
539
+ * Normalized request context passed to providers and API implementations. The
540
+ * prompt and tool declarations are carried by the transcript's system messages.
541
+ * Only `normalizeContext()` produces this type, so a raw `Context` cannot reach
542
+ * provider code by accident.
543
+ */
544
+ export type TranscriptContext = {
545
+ messages: Message[];
546
+ readonly [transcriptContextBrand]: true;
547
+ };
370
548
  /**
371
549
  * Event protocol for AssistantMessageEventStream.
372
550
  *
373
- * Streams should emit `start` before partial updates, then terminate with either:
374
- * - `done` carrying the final successful AssistantMessage, or
375
- * - `error` carrying the final AssistantMessage with stopReason "error" or "aborted"
376
- * and errorMessage.
551
+ * Successful streams emit `start` before partial updates and terminate with
552
+ * `done`. A stream may terminate directly with `error` when request setup fails
553
+ * before generation starts; after `start`, failures also terminate with `error`.
554
+ * Direct `streamSimple()` calls throw synchronously when request auth is missing.
555
+ * Updates and `done` must never appear before `start`.
556
+ *
557
+ * `partial` is the shared live response-so-far helper, not an event-time
558
+ * snapshot. Text and thinking blocks are empty when their `*_start` event is
559
+ * emitted and grow only through their corresponding `*_delta` events until the
560
+ * authoritative `*_end`. Redacted thinking may be complete at start and emit no
561
+ * deltas. Tool-call arguments at `toolcall_start` are provider-specific;
562
+ * `toolcall_delta` carries subsequent JSON updates.
377
563
  */
378
564
  export type AssistantMessageEvent = {
379
565
  type: "start";
@@ -422,7 +608,7 @@ export type AssistantMessageEvent = {
422
608
  partial: AssistantMessage;
423
609
  } | {
424
610
  type: "done";
425
- reason: Extract<StopReason, "stop" | "length" | "toolUse">;
611
+ reason: Extract<StopReason, "stop" | "length" | "toolUse" | "deferred">;
426
612
  message: AssistantMessage;
427
613
  } | {
428
614
  type: "error";
@@ -442,6 +628,8 @@ export interface OpenAICompletionsCompat {
442
628
  supportsReasoningEffort?: boolean;
443
629
  /** Whether the provider supports `stream_options: { include_usage: true }` for token usage in streaming responses. Default: true. */
444
630
  supportsUsageInStreaming?: boolean;
631
+ /** Whether streamed responses include `finish_reason`. When false, pi infers `stop` or `toolUse` when the stream ends. Default: true. */
632
+ supportsFinishReason?: boolean;
445
633
  /** Which field to use for max tokens. Default: auto-detected from URL. */
446
634
  maxTokensField?: "max_completion_tokens" | "max_tokens";
447
635
  /** Whether tool results require the `name` field. Default: auto-detected from URL. */
@@ -452,47 +640,74 @@ export interface OpenAICompletionsCompat {
452
640
  requiresThinkingAsText?: boolean;
453
641
  /** Whether all replayed assistant messages must include an empty reasoning_content field when reasoning is enabled. Default: auto-detected from URL. */
454
642
  requiresReasoningContentOnAssistantMessages?: boolean;
455
- /** Format for reasoning/thinking parameter. "openai" uses reasoning_effort, "openrouter" uses reasoning: { effort }, "deepseek" uses thinking: { type } plus reasoning_effort when supported, "together" uses reasoning: { enabled } plus reasoning_effort when supported, "zai" uses thinking: { type }, "qwen" uses top-level enable_thinking: boolean, "qwen-chat-template" uses chat_template_kwargs.enable_thinking and preserve_thinking, "chat-template" uses configurable chat_template_kwargs, "string-thinking" uses top-level thinking: string, and "ant-ling" uses reasoning: { effort } only when the mapped effort is non-null. Default: "openai". */
456
- thinkingFormat?: "openai" | "openrouter" | "deepseek" | "together" | "zai" | "qwen" | "chat-template" | "qwen-chat-template" | "string-thinking" | "ant-ling";
457
- /** Kwargs to send as `chat_template_kwargs` when `thinkingFormat` is `chat-template`. Use `{ "$var": "thinking.enabled" }` or `{ "$var": "thinking.effort" }` for pi-controlled thinking values. */
643
+ /** Format for reasoning/thinking parameter. "openai" uses reasoning_effort, "openrouter" uses reasoning: { effort }, "deepseek" uses thinking: { type } plus reasoning_effort when supported, "together" uses reasoning: { enabled } plus reasoning_effort when supported, "baseten" uses configurable chat_template_args plus reasoning_effort when supported, "zai" uses thinking: { type }, "qwen" uses top-level enable_thinking: boolean, "qwen-chat-template" uses chat_template_kwargs.enable_thinking and preserve_thinking, "chat-template" uses configurable chat_template_kwargs, "string-thinking" uses top-level thinking: string, and "ant-ling" uses reasoning: { effort } only when the mapped effort is non-null. Default: "openai". */
644
+ thinkingFormat?: "openai" | "openrouter" | "deepseek" | "together" | "baseten" | "zai" | "qwen" | "chat-template" | "qwen-chat-template" | "string-thinking" | "ant-ling";
645
+ /** Kwargs to send as `chat_template_kwargs` when `thinkingFormat` is `chat-template`. Use `{ "$var": "thinking.enabled" }`, `{ "$var": "thinking.effort" }`, or `{ "$var": "thinking.budget" }` for pi-controlled thinking values. */
458
646
  chatTemplateKwargs?: Record<string, ChatTemplateKwargValue>;
647
+ /** Arguments to send as `chat_template_args` when `thinkingFormat` is `baseten`. Use `{ "$var": "thinking.enabled" }`, `{ "$var": "thinking.effort" }`, or `{ "$var": "thinking.budget" }` for pi-controlled thinking values. */
648
+ chatTemplateArgs?: Record<string, ChatTemplateKwargValue>;
459
649
  /** OpenRouter-compatible routing preferences sent as the `provider` request field. */
460
650
  openRouterRouting?: OpenRouterRouting;
461
651
  /** Vercel AI Gateway routing preferences. Only used when baseUrl points to Vercel AI Gateway. */
462
652
  vercelGatewayRouting?: VercelGatewayRouting;
463
653
  /** Whether z.ai supports top-level `tool_stream: true` for streaming tool call deltas. Default: false. */
464
654
  zaiToolStream?: boolean;
655
+ /**
656
+ * Top-level request field used to cap reasoning tokens from `thinkingBudgets`.
657
+ * Reasoning and the answer share `max_tokens` on these endpoints, so without a budget a
658
+ * reasoning-heavy turn can consume the whole response and emit no answer.
659
+ * `"thinking_token_budget"` is vLLM, `"thinking_budget"` is Qwen/DashScope/SGLang,
660
+ * `"thinking_budget_tokens"` is llama.cpp. Off by default; not set on the generated catalog.
661
+ */
662
+ thinkingTokenBudgetField?: ThinkingTokenBudgetField;
663
+ /** Alias for `thinkingTokenBudgetField: "thinking_token_budget"` (vLLM). Prefer `thinkingTokenBudgetField`. Default: false. */
664
+ supportsThinkingTokenBudget?: boolean;
465
665
  /** Whether the provider supports OpenAI custom tools with Lark/regex grammar formats. When false, grammar-constrained tools fall back to normal function tools. Default: false; the generated model catalog enables it for capable models. */
466
666
  supportsOpenAIGrammarTools?: boolean;
467
- /** Whether the provider supports the `strict` field in tool definitions. Default: true. */
667
+ /** Whether the exact model accepts system or developer messages after the conversation has started. When false, later system messages are folded into the leading system message. Default: false; the generated model catalog enables it for verified models. */
668
+ supportsMidConvoSystemMessages?: boolean;
669
+ /** Whether system messages can introduce additional tools mid-conversation. Requires `supportsMidConvoSystemMessages`. Default: false; the generated model catalog enables it for capable models. */
670
+ supportsMidConvoToolAdditions?: boolean;
671
+ /** Whether the provider supports the `strict` field in tool definitions. Default: false; generated capable models enable it explicitly. */
468
672
  supportsStrictMode?: boolean;
469
673
  /** Cache control convention for prompt caching. "anthropic" applies Anthropic-style `cache_control` markers to the system prompt, last tool definition, and last user, assistant, or tool-result text content. */
470
674
  cacheControlFormat?: "anthropic";
471
- /** Whether to send session-affinity data from `options.sessionId`. Default: false. */
675
+ /** Whether to send session-affinity data from `options.sessionId`. Default: true for OpenRouter endpoints, false otherwise. */
472
676
  sendSessionAffinityHeaders?: boolean;
473
- /** Provider-specific deferred tool serialization mode. */
474
- deferredToolsMode?: "kimi";
475
677
  /** Session-affinity header format: `openai` sends `session_id`, `x-client-request-id`, and `x-session-affinity`; `openai-nosession` sends `x-client-request-id` and `x-session-affinity`; `openrouter` sends `x-session-id`. Does not affect the `prompt_cache_key` body param, which is governed by cache retention. Default: auto-detected. */
476
678
  sessionAffinityFormat?: SessionAffinityFormat;
477
679
  /** Whether the provider supports long prompt cache retention (`prompt_cache_retention: "24h"` or Anthropic-style `cache_control.ttl: "1h"`, depending on format). Default: true. */
478
680
  supportsLongCacheRetention?: boolean;
681
+ /**
682
+ * vLLM scheduler priority sent as the top-level `priority` request field (lower values are
683
+ * handled earlier; server default 0). Only meaningful when vLLM runs with
684
+ * `--scheduling-policy priority`; useful for keeping background/batch work from stalling
685
+ * interactive sessions. Off by default; not set on the generated catalog.
686
+ */
687
+ vllmPriority?: number;
479
688
  }
480
689
  /** Compatibility settings for OpenAI Responses APIs. */
481
690
  export interface OpenAIResponsesCompat {
482
691
  /** Whether the provider supports the `developer` role (vs `system`). Default: true. */
483
692
  supportsDeveloperRole?: boolean;
693
+ /** Whether the exact model accepts developer or system messages after the conversation has started. When false, later system messages are folded into the leading system message. Default: false; the generated model catalog enables it for verified models. */
694
+ supportsMidConvoSystemMessages?: boolean;
484
695
  /** Session-affinity header format: `openai` sends `session_id` and `x-client-request-id`; `openai-nosession` sends `x-client-request-id`; `openrouter` sends `x-session-id`. Does not affect the `prompt_cache_key` body param, which is governed by cache retention. Default: auto-detected. */
485
696
  sessionAffinityFormat?: SessionAffinityFormat;
486
- /** Whether the provider supports `prompt_cache_retention: "24h"`. Default: true. */
697
+ /** Whether the provider supports long prompt cache retention. This uses `prompt_cache_options.ttl: "30m"` on GPT-5.6+ and `prompt_cache_retention: "24h"` on earlier models. Default: true. */
487
698
  supportsLongCacheRetention?: boolean;
488
699
  /** Whether the provider supports strict JSON-schema function tools. Defaults are API-specific; generated OpenAI models enable it explicitly. */
489
700
  supportsStrictMode?: boolean;
490
701
  /** Whether to emit OpenAI custom tools with Lark/regex grammar formats. When false, grammar-constrained tools fall back to normal function tools. Default: false; the generated model catalog enables it for capable models. */
491
702
  supportsOpenAIGrammarTools?: boolean;
492
- /** Whether the model supports client-executed tool search for deferred tools. Default: false. */
703
+ /** Whether the model supports message-anchored `additional_tools` input items. Default: false. */
704
+ supportsAdditionalTools?: boolean;
705
+ /** Whether the model supports client-executed tool search for transcript-anchored additions. Default: false. */
493
706
  supportsToolSearch?: boolean;
494
- /** Whether the model accepts `prompt_cache_options` (OpenAI GPT-5.6+ explicit prompt caching). Older OpenAI models reject the parameter. Default: false. */
707
+ /** Whether the model accepts `prompt_cache_options` (OpenAI GPT-5.6+ prompt caching). Older OpenAI models reject the parameter. Default: false. */
495
708
  supportsExplicitPromptCacheMode?: boolean;
709
+ /** Whether the provider accepts the `max_output_tokens` parameter. Some Codex-protocol gateways reject it. Default: true. */
710
+ supportsMaxOutputTokens?: boolean;
496
711
  }
497
712
  /** Compatibility settings for Anthropic Messages-compatible APIs. */
498
713
  export interface AnthropicMessagesCompat {
@@ -514,6 +729,8 @@ export interface AnthropicMessagesCompat {
514
729
  * Default: false.
515
730
  */
516
731
  sendSessionAffinityHeaders?: boolean;
732
+ /** Session-affinity format. `"openrouter"` sends `x-session-id`; when unset, sends `x-session-affinity`. */
733
+ sessionAffinityFormat?: "openrouter";
517
734
  /**
518
735
  * Whether the provider supports Anthropic-style `cache_control` markers on
519
736
  * tool definitions. When false, `cache_control` is omitted from tool params.
@@ -542,18 +759,30 @@ export interface AnthropicMessagesCompat {
542
759
  allowEmptySignature?: boolean;
543
760
  /** Whether the provider supports Anthropic strict tool schemas. Default: false; generated Anthropic models enable it explicitly. */
544
761
  supportsStrictTools?: boolean;
762
+ /** Whether the exact model transport supports effort-only system messages and thinking binding controls. Default: false. */
763
+ supportsMidConvoEffort?: boolean;
764
+ /** Whether the exact model accepts system-role messages inside the conversation. When false, later system messages are folded into the top-level system prompt. Default: false. */
765
+ supportsMidConvoSystemMessages?: boolean;
766
+ /** Whether the exact model accepts mid-conversation `tool_addition` and `tool_removal` blocks. Requires `supportsMidConvoSystemMessages`. Default: false. */
767
+ supportsMidConvoToolChanges?: boolean;
545
768
  /**
546
- * Whether the provider supports deferred tools loaded by `tool_reference`
547
- * blocks in tool results. Default: true for first-party Anthropic models
548
- * except Haiku and models older than Claude 4.5; false for other providers.
769
+ * Models Anthropic accepts in `fallbacks` for server-side refusal fallback,
770
+ * with local pricing metadata for returned fallback responses. When absent or
771
+ * empty, callers must omit `fallbacks`; Anthropic rejects the field for models
772
+ * with no permitted fallback targets.
549
773
  */
550
- supportsToolReferences?: boolean;
774
+ allowedFallbackModels?: AnthropicAllowedFallbackModel[];
551
775
  }
552
776
  /** Compatibility settings for Amazon Bedrock models. */
553
777
  export interface BedrockCompat {
554
778
  /** Whether the model supports Bedrock strict tool schemas. Default: false. */
555
779
  supportsStrictMode?: boolean;
556
780
  }
781
+ /** Compatibility settings for the Mistral chat API. */
782
+ export interface MistralConversationsCompat {
783
+ /** Whether the exact model accepts system messages after the conversation has started. When false, later system messages are folded into the leading system message. Default: false. */
784
+ supportsMidConvoSystemMessages?: boolean;
785
+ }
557
786
  /**
558
787
  * OpenRouter provider routing preferences.
559
788
  * Controls which upstream providers OpenRouter routes requests to.
@@ -647,29 +876,81 @@ export interface ModelCost extends ModelCostRates {
647
876
  /** Request-wide pricing tiers. The highest matching input threshold applies to the full request. */
648
877
  tiers?: ModelCostTier[];
649
878
  }
650
- export interface Model<TApi extends Api> {
879
+ export interface ModelImageResizeOptions {
880
+ maxWidth?: number;
881
+ maxHeight?: number;
882
+ /** Maximum base64-encoded payload size in bytes. */
883
+ maxBytes?: number;
884
+ jpegQuality?: number;
885
+ }
886
+ export interface ModelImageInputLimits {
887
+ /** Cache-safe resize profile applied before a new image enters conversation history. */
888
+ resize?: ModelImageResizeOptions;
889
+ /** Maximum images accepted in one provider message. */
890
+ maxPerMessage?: number;
891
+ /** Maximum images accepted across one provider request. */
892
+ maxPerRequest?: number;
893
+ }
894
+ export interface ModelInputLimits {
895
+ /** Maximum serialized provider request size in bytes. */
896
+ maxRequestBytes?: number;
897
+ images?: ModelImageInputLimits;
898
+ }
899
+ /** Fields shared by every catalog entry, regardless of what you can do with it. */
900
+ export interface BaseModel<TApi extends string> {
651
901
  id: string;
652
902
  name: string;
653
903
  api: TApi;
654
904
  provider: ProviderId;
655
905
  baseUrl: string;
906
+ input: ("text" | "image")[];
907
+ /** Provider input limits and cache-safe preprocessing metadata. */
908
+ inputLimits?: ModelInputLimits;
909
+ cost: ModelCost;
910
+ headers?: Record<string, string>;
911
+ }
912
+ /** Chat model: usable with `stream()` and friends. */
913
+ export interface Model<TApi extends Api> extends BaseModel<TApi> {
914
+ /**
915
+ * Optional: chat is the default model type, so models without `type` are chat
916
+ * models. Narrow mixed model lists with `isModelType()` instead of comparing
917
+ * `type` directly.
918
+ */
919
+ type?: "chat";
656
920
  reasoning: boolean;
657
921
  /**
658
922
  * Maps pi thinking levels to provider/model-specific values.
659
923
  * Missing keys use provider defaults. null marks a level as unsupported.
660
924
  */
661
925
  thinkingLevelMap?: ThinkingLevelMap;
662
- input: ("text" | "image")[];
663
- cost: ModelCost;
926
+ /** Prompt cache lifetimes per retention tier. Unset when the provider's cache behavior is unknown. */
927
+ promptCache?: ModelPromptCache;
664
928
  contextWindow: number;
665
929
  maxTokens: number;
666
- headers?: Record<string, string>;
930
+ /** Default sampling parameters for this model. See {@link StreamOptions.samplingParams}; per-request keys override these. */
931
+ samplingParams?: Record<string, unknown>;
667
932
  /** Compatibility overrides for OpenAI-compatible APIs. If not set, auto-detected from baseUrl. */
668
- compat?: TApi extends "openai-completions" ? OpenAICompletionsCompat : TApi extends "openai-responses" | "azure-openai-responses" | "openai-codex-responses" ? OpenAIResponsesCompat : TApi extends "anthropic-messages" ? AnthropicMessagesCompat : TApi extends "bedrock-converse-stream" ? BedrockCompat : never;
933
+ compat?: TApi extends "openai-completions" ? OpenAICompletionsCompat : TApi extends "openai-responses" | "azure-openai-responses" | "openai-codex-responses" ? OpenAIResponsesCompat : TApi extends "anthropic-messages" ? AnthropicMessagesCompat : TApi extends "bedrock-converse-stream" ? BedrockCompat : TApi extends "mistral-conversations" ? MistralConversationsCompat : never;
669
934
  }
670
- export interface ImagesModel<TApi extends ImagesApi> extends Omit<Model<Api>, "api" | "provider" | "reasoning" | "contextWindow" | "maxTokens" | "compat"> {
671
- api: TApi;
672
- provider: ImagesProviderId;
935
+ /** Image-generation model: usable with `generateImages()` only. */
936
+ export interface ImageModel<TApi extends ImageApi> extends BaseModel<TApi> {
937
+ type: "image";
938
+ /** Output modalities. Always includes `"image"`; `"text"` means the model can also return text blocks. */
673
939
  output: ("text" | "image")[];
674
940
  }
941
+ /** Structured classifier model: usable with `classify()` only. */
942
+ export interface ClassifierModel<TApi extends ClassifierApi> extends BaseModel<TApi> {
943
+ type: "classifier";
944
+ contextWindow: number;
945
+ }
946
+ /** Model shape for each model type. */
947
+ export interface ModelTypeMap {
948
+ chat: Model<Api>;
949
+ image: ImageModel<ImageApi>;
950
+ classifier: ClassifierModel<ClassifierApi>;
951
+ }
952
+ /** What a catalog entry is for. Decides which `Models` operation accepts it. */
953
+ export type ModelType = keyof ModelTypeMap;
954
+ /** Anything a provider can list. Narrow with `isModelType()`. */
955
+ export type AnyModel = ModelTypeMap[ModelType];
675
956
  //# sourceMappingURL=types.d.ts.map