@draht/ai 2026.7.30 → 2026.10.4-2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (604) hide show
  1. package/dist/api/anthropic-messages.d.ts.map +1 -1
  2. package/dist/api/anthropic-messages.js +404 -142
  3. package/dist/api/anthropic-messages.js.map +1 -1
  4. package/dist/api/azure-openai-responses.d.ts +2 -0
  5. package/dist/api/azure-openai-responses.d.ts.map +1 -1
  6. package/dist/api/azure-openai-responses.js +34 -10
  7. package/dist/api/azure-openai-responses.js.map +1 -1
  8. package/dist/api/bedrock-converse-stream.d.ts.map +1 -1
  9. package/dist/api/bedrock-converse-stream.js +210 -24
  10. package/dist/api/bedrock-converse-stream.js.map +1 -1
  11. package/dist/api/cloudflare-ai-binding.d.ts +77 -0
  12. package/dist/api/cloudflare-ai-binding.d.ts.map +1 -0
  13. package/dist/api/cloudflare-ai-binding.js +72 -0
  14. package/dist/api/cloudflare-ai-binding.js.map +1 -0
  15. package/dist/api/cloudflare-workers-ai-system-one.d.ts +4 -0
  16. package/dist/api/cloudflare-workers-ai-system-one.d.ts.map +1 -0
  17. package/dist/api/cloudflare-workers-ai-system-one.js +43 -0
  18. package/dist/api/cloudflare-workers-ai-system-one.js.map +1 -0
  19. package/dist/api/cloudflare-workers-ai-system-one.lazy.d.ts +3 -0
  20. package/dist/api/cloudflare-workers-ai-system-one.lazy.d.ts.map +1 -0
  21. package/dist/api/cloudflare-workers-ai-system-one.lazy.js +4 -0
  22. package/dist/api/cloudflare-workers-ai-system-one.lazy.js.map +1 -0
  23. package/dist/api/cloudflare.d.ts +2 -0
  24. package/dist/api/cloudflare.d.ts.map +1 -1
  25. package/dist/api/cloudflare.js +2 -0
  26. package/dist/api/cloudflare.js.map +1 -1
  27. package/dist/api/constrained-sampling.d.ts +10 -1
  28. package/dist/api/constrained-sampling.d.ts.map +1 -1
  29. package/dist/api/constrained-sampling.js +137 -4
  30. package/dist/api/constrained-sampling.js.map +1 -1
  31. package/dist/api/google-generative-ai.d.ts +2 -2
  32. package/dist/api/google-generative-ai.d.ts.map +1 -1
  33. package/dist/api/google-generative-ai.js +39 -82
  34. package/dist/api/google-generative-ai.js.map +1 -1
  35. package/dist/api/google-shared.d.ts +27 -5
  36. package/dist/api/google-shared.d.ts.map +1 -1
  37. package/dist/api/google-shared.js +126 -18
  38. package/dist/api/google-shared.js.map +1 -1
  39. package/dist/api/google-vertex.d.ts +2 -2
  40. package/dist/api/google-vertex.d.ts.map +1 -1
  41. package/dist/api/google-vertex.js +42 -73
  42. package/dist/api/google-vertex.js.map +1 -1
  43. package/dist/api/lazy.d.ts +5 -1
  44. package/dist/api/lazy.d.ts.map +1 -1
  45. package/dist/api/lazy.js +19 -7
  46. package/dist/api/lazy.js.map +1 -1
  47. package/dist/api/llama-cpp-classify.d.ts +33 -0
  48. package/dist/api/llama-cpp-classify.d.ts.map +1 -0
  49. package/dist/api/llama-cpp-classify.js +365 -0
  50. package/dist/api/llama-cpp-classify.js.map +1 -0
  51. package/dist/api/llama-cpp-classify.lazy.d.ts +3 -0
  52. package/dist/api/llama-cpp-classify.lazy.d.ts.map +1 -0
  53. package/dist/api/llama-cpp-classify.lazy.js +4 -0
  54. package/dist/api/llama-cpp-classify.lazy.js.map +1 -0
  55. package/dist/api/mistral-conversations.d.ts +2 -2
  56. package/dist/api/mistral-conversations.d.ts.map +1 -1
  57. package/dist/api/mistral-conversations.js +250 -69
  58. package/dist/api/mistral-conversations.js.map +1 -1
  59. package/dist/api/openai-codex-responses.d.ts.map +1 -1
  60. package/dist/api/openai-codex-responses.js +107 -55
  61. package/dist/api/openai-codex-responses.js.map +1 -1
  62. package/dist/api/openai-completions.d.ts +11 -4
  63. package/dist/api/openai-completions.d.ts.map +1 -1
  64. package/dist/api/openai-completions.js +241 -129
  65. package/dist/api/openai-completions.js.map +1 -1
  66. package/dist/api/openai-responses-shared.d.ts +8 -4
  67. package/dist/api/openai-responses-shared.d.ts.map +1 -1
  68. package/dist/api/openai-responses-shared.js +109 -58
  69. package/dist/api/openai-responses-shared.js.map +1 -1
  70. package/dist/api/openai-responses.d.ts.map +1 -1
  71. package/dist/api/openai-responses.js +62 -24
  72. package/dist/api/openai-responses.js.map +1 -1
  73. package/dist/api/openrouter-images.d.ts +2 -1
  74. package/dist/api/openrouter-images.d.ts.map +1 -1
  75. package/dist/api/openrouter-images.js +1 -0
  76. package/dist/api/openrouter-images.js.map +1 -1
  77. package/dist/api/openrouter-images.lazy.d.ts.map +1 -1
  78. package/dist/api/openrouter-images.lazy.js.map +1 -1
  79. package/dist/api/pi-messages.d.ts +5 -3
  80. package/dist/api/pi-messages.d.ts.map +1 -1
  81. package/dist/api/pi-messages.js +13 -4
  82. package/dist/api/pi-messages.js.map +1 -1
  83. package/dist/api/simple-options.d.ts +9 -3
  84. package/dist/api/simple-options.d.ts.map +1 -1
  85. package/dist/api/simple-options.js +22 -11
  86. package/dist/api/simple-options.js.map +1 -1
  87. package/dist/api/system-one-shared.d.ts +23 -0
  88. package/dist/api/system-one-shared.d.ts.map +1 -0
  89. package/dist/api/system-one-shared.js +183 -0
  90. package/dist/api/system-one-shared.js.map +1 -0
  91. package/dist/api/transform-messages.d.ts.map +1 -1
  92. package/dist/api/transform-messages.js +21 -7
  93. package/dist/api/transform-messages.js.map +1 -1
  94. package/dist/api/typesafe-system-one.d.ts +4 -0
  95. package/dist/api/typesafe-system-one.d.ts.map +1 -0
  96. package/dist/api/typesafe-system-one.js +19 -0
  97. package/dist/api/typesafe-system-one.js.map +1 -0
  98. package/dist/api/typesafe-system-one.lazy.d.ts +3 -0
  99. package/dist/api/typesafe-system-one.lazy.d.ts.map +1 -0
  100. package/dist/api/typesafe-system-one.lazy.js +4 -0
  101. package/dist/api/typesafe-system-one.lazy.js.map +1 -0
  102. package/dist/auth/credential-store.d.ts +6 -6
  103. package/dist/auth/credential-store.d.ts.map +1 -1
  104. package/dist/auth/credential-store.js +24 -15
  105. package/dist/auth/credential-store.js.map +1 -1
  106. package/dist/auth/helpers.d.ts +1 -0
  107. package/dist/auth/helpers.d.ts.map +1 -1
  108. package/dist/auth/helpers.js +8 -3
  109. package/dist/auth/helpers.js.map +1 -1
  110. package/dist/auth/oauth/anthropic.d.ts.map +1 -1
  111. package/dist/auth/oauth/anthropic.js +28 -131
  112. package/dist/auth/oauth/anthropic.js.map +1 -1
  113. package/dist/auth/oauth/callback-server.d.ts +55 -0
  114. package/dist/auth/oauth/callback-server.d.ts.map +1 -0
  115. package/dist/auth/oauth/callback-server.js +146 -0
  116. package/dist/auth/oauth/callback-server.js.map +1 -0
  117. package/dist/auth/oauth/device-code.d.ts +2 -1
  118. package/dist/auth/oauth/device-code.d.ts.map +1 -1
  119. package/dist/auth/oauth/device-code.js +5 -5
  120. package/dist/auth/oauth/device-code.js.map +1 -1
  121. package/dist/auth/oauth/github-copilot.d.ts.map +1 -1
  122. package/dist/auth/oauth/github-copilot.js +121 -41
  123. package/dist/auth/oauth/github-copilot.js.map +1 -1
  124. package/dist/auth/oauth/google-antigravity.d.ts +3 -3
  125. package/dist/auth/oauth/google-antigravity.d.ts.map +1 -1
  126. package/dist/auth/oauth/google-antigravity.js +17 -9
  127. package/dist/auth/oauth/google-antigravity.js.map +1 -1
  128. package/dist/auth/oauth/google-gemini-cli.d.ts +3 -3
  129. package/dist/auth/oauth/google-gemini-cli.d.ts.map +1 -1
  130. package/dist/auth/oauth/google-gemini-cli.js +18 -10
  131. package/dist/auth/oauth/google-gemini-cli.js.map +1 -1
  132. package/dist/auth/oauth/kimi-coding.d.ts.map +1 -1
  133. package/dist/auth/oauth/kimi-coding.js +5 -6
  134. package/dist/auth/oauth/kimi-coding.js.map +1 -1
  135. package/dist/auth/oauth/load.d.ts +4 -0
  136. package/dist/auth/oauth/load.d.ts.map +1 -1
  137. package/dist/auth/oauth/load.js +10 -0
  138. package/dist/auth/oauth/load.js.map +1 -1
  139. package/dist/auth/oauth/meta.d.ts +17 -0
  140. package/dist/auth/oauth/meta.d.ts.map +1 -0
  141. package/dist/auth/oauth/meta.js +190 -0
  142. package/dist/auth/oauth/meta.js.map +1 -0
  143. package/dist/auth/oauth/openai-chatgpt.d.ts +9 -0
  144. package/dist/auth/oauth/openai-chatgpt.d.ts.map +1 -0
  145. package/dist/auth/oauth/openai-chatgpt.js +266 -0
  146. package/dist/auth/oauth/openai-chatgpt.js.map +1 -0
  147. package/dist/auth/oauth/openai-codex.d.ts +1 -1
  148. package/dist/auth/oauth/openai-codex.d.ts.map +1 -1
  149. package/dist/auth/oauth/openai-codex.js +33 -130
  150. package/dist/auth/oauth/openai-codex.js.map +1 -1
  151. package/dist/auth/oauth/openrouter.d.ts +1 -1
  152. package/dist/auth/oauth/openrouter.d.ts.map +1 -1
  153. package/dist/auth/oauth/openrouter.js +26 -145
  154. package/dist/auth/oauth/openrouter.js.map +1 -1
  155. package/dist/auth/oauth/radius.d.ts +1 -1
  156. package/dist/auth/oauth/radius.d.ts.map +1 -1
  157. package/dist/auth/oauth/radius.js +28 -93
  158. package/dist/auth/oauth/radius.js.map +1 -1
  159. package/dist/auth/oauth/xai.d.ts.map +1 -1
  160. package/dist/auth/oauth/xai.js +13 -12
  161. package/dist/auth/oauth/xai.js.map +1 -1
  162. package/dist/auth/resolve.d.ts +3 -8
  163. package/dist/auth/resolve.d.ts.map +1 -1
  164. package/dist/auth/resolve.js +27 -31
  165. package/dist/auth/resolve.js.map +1 -1
  166. package/dist/auth/types.d.ts +29 -8
  167. package/dist/auth/types.d.ts.map +1 -1
  168. package/dist/auth/types.js.map +1 -1
  169. package/dist/bun-oauth.d.ts.map +1 -1
  170. package/dist/bun-oauth.js +4 -0
  171. package/dist/bun-oauth.js.map +1 -1
  172. package/dist/cli.js +4 -1
  173. package/dist/cli.js.map +1 -1
  174. package/dist/compat.d.ts +3 -3
  175. package/dist/compat.d.ts.map +1 -1
  176. package/dist/compat.js +9 -6
  177. package/dist/compat.js.map +1 -1
  178. package/dist/env-api-keys.d.ts +5 -0
  179. package/dist/env-api-keys.d.ts.map +1 -1
  180. package/dist/env-api-keys.js +9 -1
  181. package/dist/env-api-keys.js.map +1 -1
  182. package/dist/image-models.d.ts +19 -8
  183. package/dist/image-models.d.ts.map +1 -1
  184. package/dist/image-models.js +14 -13
  185. package/dist/image-models.js.map +1 -1
  186. package/dist/images-api-registry.d.ts +7 -7
  187. package/dist/images-api-registry.d.ts.map +1 -1
  188. package/dist/images-api-registry.js.map +1 -1
  189. package/dist/images.d.ts +7 -2
  190. package/dist/images.d.ts.map +1 -1
  191. package/dist/images.js +5 -0
  192. package/dist/images.js.map +1 -1
  193. package/dist/index.d.ts +4 -3
  194. package/dist/index.d.ts.map +1 -1
  195. package/dist/index.js +3 -2
  196. package/dist/index.js.map +1 -1
  197. package/dist/model-catalog.d.ts +25 -9
  198. package/dist/model-catalog.d.ts.map +1 -1
  199. package/dist/model-catalog.js +14 -2
  200. package/dist/model-catalog.js.map +1 -1
  201. package/dist/models-store.d.ts +12 -14
  202. package/dist/models-store.d.ts.map +1 -1
  203. package/dist/models-store.js +7 -6
  204. package/dist/models-store.js.map +1 -1
  205. package/dist/models.d.ts +138 -47
  206. package/dist/models.d.ts.map +1 -1
  207. package/dist/models.generated.d.ts +135 -37
  208. package/dist/models.generated.d.ts.map +1 -1
  209. package/dist/models.generated.js +135 -37
  210. package/dist/models.generated.js.map +1 -1
  211. package/dist/models.js +391 -99
  212. package/dist/models.js.map +1 -1
  213. package/dist/providers/all.d.ts +19 -13
  214. package/dist/providers/all.d.ts.map +1 -1
  215. package/dist/providers/all.js +31 -21
  216. package/dist/providers/all.js.map +1 -1
  217. package/dist/providers/amazon-bedrock.d.ts.map +1 -1
  218. package/dist/providers/amazon-bedrock.js +15 -7
  219. package/dist/providers/amazon-bedrock.js.map +1 -1
  220. package/dist/providers/amazon-bedrock.models.d.ts +4 -2
  221. package/dist/providers/amazon-bedrock.models.d.ts.map +1 -1
  222. package/dist/providers/amazon-bedrock.models.js +4 -2
  223. package/dist/providers/amazon-bedrock.models.js.map +1 -1
  224. package/dist/providers/ant-ling.models.d.ts +4 -2
  225. package/dist/providers/ant-ling.models.d.ts.map +1 -1
  226. package/dist/providers/ant-ling.models.js +4 -2
  227. package/dist/providers/ant-ling.models.js.map +1 -1
  228. package/dist/providers/anthropic.d.ts.map +1 -1
  229. package/dist/providers/anthropic.js +39 -8
  230. package/dist/providers/anthropic.js.map +1 -1
  231. package/dist/providers/anthropic.models.d.ts +4 -2
  232. package/dist/providers/anthropic.models.d.ts.map +1 -1
  233. package/dist/providers/anthropic.models.js +4 -2
  234. package/dist/providers/anthropic.models.js.map +1 -1
  235. package/dist/providers/azure-openai-responses.models.d.ts +4 -2
  236. package/dist/providers/azure-openai-responses.models.d.ts.map +1 -1
  237. package/dist/providers/azure-openai-responses.models.js +4 -2
  238. package/dist/providers/azure-openai-responses.models.js.map +1 -1
  239. package/dist/providers/baseten.d.ts +3 -0
  240. package/dist/providers/baseten.d.ts.map +1 -0
  241. package/dist/providers/baseten.js +15 -0
  242. package/dist/providers/baseten.js.map +1 -0
  243. package/dist/providers/baseten.models.d.ts +6 -0
  244. package/dist/providers/baseten.models.d.ts.map +1 -0
  245. package/dist/providers/baseten.models.js +8 -0
  246. package/dist/providers/baseten.models.js.map +1 -0
  247. package/dist/providers/cerebras.models.d.ts +4 -2
  248. package/dist/providers/cerebras.models.d.ts.map +1 -1
  249. package/dist/providers/cerebras.models.js +4 -2
  250. package/dist/providers/cerebras.models.js.map +1 -1
  251. package/dist/providers/cloudflare-ai-gateway.d.ts +3 -1
  252. package/dist/providers/cloudflare-ai-gateway.d.ts.map +1 -1
  253. package/dist/providers/cloudflare-ai-gateway.js +4 -0
  254. package/dist/providers/cloudflare-ai-gateway.js.map +1 -1
  255. package/dist/providers/cloudflare-ai-gateway.models.d.ts +4 -2
  256. package/dist/providers/cloudflare-ai-gateway.models.d.ts.map +1 -1
  257. package/dist/providers/cloudflare-ai-gateway.models.js +4 -2
  258. package/dist/providers/cloudflare-ai-gateway.models.js.map +1 -1
  259. package/dist/providers/cloudflare-auth.d.ts.map +1 -1
  260. package/dist/providers/cloudflare-auth.js +15 -10
  261. package/dist/providers/cloudflare-auth.js.map +1 -1
  262. package/dist/providers/cloudflare-stream.d.ts +6 -2
  263. package/dist/providers/cloudflare-stream.d.ts.map +1 -1
  264. package/dist/providers/cloudflare-stream.js +6 -0
  265. package/dist/providers/cloudflare-stream.js.map +1 -1
  266. package/dist/providers/cloudflare-workers-ai.d.ts.map +1 -1
  267. package/dist/providers/cloudflare-workers-ai.js +10 -3
  268. package/dist/providers/cloudflare-workers-ai.js.map +1 -1
  269. package/dist/providers/cloudflare-workers-ai.models.d.ts +4 -2
  270. package/dist/providers/cloudflare-workers-ai.models.d.ts.map +1 -1
  271. package/dist/providers/cloudflare-workers-ai.models.js +4 -2
  272. package/dist/providers/cloudflare-workers-ai.models.js.map +1 -1
  273. package/dist/providers/data/.manifest.json +1 -1
  274. package/dist/providers/data/amazon-bedrock.json +1 -1
  275. package/dist/providers/data/ant-ling.json +1 -1
  276. package/dist/providers/data/anthropic.json +1 -1
  277. package/dist/providers/data/azure-openai-responses.json +1 -1
  278. package/dist/providers/data/baseten.json +1 -0
  279. package/dist/providers/data/cerebras.json +1 -1
  280. package/dist/providers/data/cloudflare-ai-gateway.json +1 -1
  281. package/dist/providers/data/cloudflare-workers-ai.json +1 -1
  282. package/dist/providers/data/deepseek.json +1 -1
  283. package/dist/providers/data/fireworks.json +1 -1
  284. package/dist/providers/data/github-copilot.json +1 -1
  285. package/dist/providers/data/google-vertex.json +1 -1
  286. package/dist/providers/data/google.json +1 -1
  287. package/dist/providers/data/groq.json +1 -1
  288. package/dist/providers/data/huggingface.json +1 -1
  289. package/dist/providers/data/kimi-coding.json +1 -1
  290. package/dist/providers/data/meta.json +1 -0
  291. package/dist/providers/data/minimax-cn.json +1 -1
  292. package/dist/providers/data/minimax.json +1 -1
  293. package/dist/providers/data/mistral.json +1 -1
  294. package/dist/providers/data/moonshotai-cn.json +1 -1
  295. package/dist/providers/data/moonshotai.json +1 -1
  296. package/dist/providers/data/nvidia.json +1 -1
  297. package/dist/providers/data/openai-codex.json +1 -1
  298. package/dist/providers/data/openai.json +1 -1
  299. package/dist/providers/data/opencode-go.json +1 -1
  300. package/dist/providers/data/opencode.json +1 -1
  301. package/dist/providers/data/openrouter.json +1 -1
  302. package/dist/providers/data/qwen-token-plan-cn.json +1 -1
  303. package/dist/providers/data/qwen-token-plan-individual.json +1 -0
  304. package/dist/providers/data/qwen-token-plan.json +1 -1
  305. package/dist/providers/data/radius.json +1 -0
  306. package/dist/providers/data/together.json +1 -1
  307. package/dist/providers/data/typesafe.json +1 -0
  308. package/dist/providers/data/vercel-ai-gateway.json +1 -1
  309. package/dist/providers/data/xai.json +1 -1
  310. package/dist/providers/data/xiaomi-token-plan-ams.json +1 -1
  311. package/dist/providers/data/xiaomi-token-plan-cn.json +1 -1
  312. package/dist/providers/data/xiaomi-token-plan-sgp.json +1 -1
  313. package/dist/providers/data/xiaomi.json +1 -1
  314. package/dist/providers/data/zai-coding-cn.json +1 -1
  315. package/dist/providers/data/zai.json +1 -1
  316. package/dist/providers/deepseek.models.d.ts +4 -2
  317. package/dist/providers/deepseek.models.d.ts.map +1 -1
  318. package/dist/providers/deepseek.models.js +4 -2
  319. package/dist/providers/deepseek.models.js.map +1 -1
  320. package/dist/providers/faux.d.ts +19 -13
  321. package/dist/providers/faux.d.ts.map +1 -1
  322. package/dist/providers/faux.js +109 -18
  323. package/dist/providers/faux.js.map +1 -1
  324. package/dist/providers/fireworks.models.d.ts +4 -2
  325. package/dist/providers/fireworks.models.d.ts.map +1 -1
  326. package/dist/providers/fireworks.models.js +4 -2
  327. package/dist/providers/fireworks.models.js.map +1 -1
  328. package/dist/providers/github-copilot.js +1 -1
  329. package/dist/providers/github-copilot.js.map +1 -1
  330. package/dist/providers/github-copilot.models.d.ts +4 -2
  331. package/dist/providers/github-copilot.models.d.ts.map +1 -1
  332. package/dist/providers/github-copilot.models.js +4 -2
  333. package/dist/providers/github-copilot.models.js.map +1 -1
  334. package/dist/providers/google-vertex.d.ts.map +1 -1
  335. package/dist/providers/google-vertex.js +15 -7
  336. package/dist/providers/google-vertex.js.map +1 -1
  337. package/dist/providers/google-vertex.models.d.ts +4 -2
  338. package/dist/providers/google-vertex.models.d.ts.map +1 -1
  339. package/dist/providers/google-vertex.models.js +4 -2
  340. package/dist/providers/google-vertex.models.js.map +1 -1
  341. package/dist/providers/google.models.d.ts +4 -2
  342. package/dist/providers/google.models.d.ts.map +1 -1
  343. package/dist/providers/google.models.js +4 -2
  344. package/dist/providers/google.models.js.map +1 -1
  345. package/dist/providers/groq.models.d.ts +4 -2
  346. package/dist/providers/groq.models.d.ts.map +1 -1
  347. package/dist/providers/groq.models.js +4 -2
  348. package/dist/providers/groq.models.js.map +1 -1
  349. package/dist/providers/huggingface.models.d.ts +4 -2
  350. package/dist/providers/huggingface.models.d.ts.map +1 -1
  351. package/dist/providers/huggingface.models.js +4 -2
  352. package/dist/providers/huggingface.models.js.map +1 -1
  353. package/dist/providers/images/register-builtins.d.ts +1 -1
  354. package/dist/providers/images/register-builtins.d.ts.map +1 -1
  355. package/dist/providers/images/register-builtins.js.map +1 -1
  356. package/dist/providers/kimi-coding.d.ts.map +1 -1
  357. package/dist/providers/kimi-coding.js +1 -0
  358. package/dist/providers/kimi-coding.js.map +1 -1
  359. package/dist/providers/kimi-coding.models.d.ts +4 -2
  360. package/dist/providers/kimi-coding.models.d.ts.map +1 -1
  361. package/dist/providers/kimi-coding.models.js +4 -2
  362. package/dist/providers/kimi-coding.models.js.map +1 -1
  363. package/dist/providers/meta.d.ts +3 -0
  364. package/dist/providers/meta.d.ts.map +1 -0
  365. package/dist/providers/meta.js +24 -0
  366. package/dist/providers/meta.js.map +1 -0
  367. package/dist/providers/meta.models.d.ts +6 -0
  368. package/dist/providers/meta.models.d.ts.map +1 -0
  369. package/dist/providers/meta.models.js +8 -0
  370. package/dist/providers/meta.models.js.map +1 -0
  371. package/dist/providers/minimax-cn.models.d.ts +4 -2
  372. package/dist/providers/minimax-cn.models.d.ts.map +1 -1
  373. package/dist/providers/minimax-cn.models.js +4 -2
  374. package/dist/providers/minimax-cn.models.js.map +1 -1
  375. package/dist/providers/minimax.models.d.ts +4 -2
  376. package/dist/providers/minimax.models.d.ts.map +1 -1
  377. package/dist/providers/minimax.models.js +4 -2
  378. package/dist/providers/minimax.models.js.map +1 -1
  379. package/dist/providers/mistral.models.d.ts +4 -2
  380. package/dist/providers/mistral.models.d.ts.map +1 -1
  381. package/dist/providers/mistral.models.js +4 -2
  382. package/dist/providers/mistral.models.js.map +1 -1
  383. package/dist/providers/moonshotai-cn.models.d.ts +4 -2
  384. package/dist/providers/moonshotai-cn.models.d.ts.map +1 -1
  385. package/dist/providers/moonshotai-cn.models.js +4 -2
  386. package/dist/providers/moonshotai-cn.models.js.map +1 -1
  387. package/dist/providers/moonshotai.models.d.ts +4 -2
  388. package/dist/providers/moonshotai.models.d.ts.map +1 -1
  389. package/dist/providers/moonshotai.models.js +4 -2
  390. package/dist/providers/moonshotai.models.js.map +1 -1
  391. package/dist/providers/nvidia.models.d.ts +4 -2
  392. package/dist/providers/nvidia.models.d.ts.map +1 -1
  393. package/dist/providers/nvidia.models.js +4 -2
  394. package/dist/providers/nvidia.models.js.map +1 -1
  395. package/dist/providers/openai-codex.d.ts.map +1 -1
  396. package/dist/providers/openai-codex.js +6 -2
  397. package/dist/providers/openai-codex.js.map +1 -1
  398. package/dist/providers/openai-codex.models.d.ts +4 -2
  399. package/dist/providers/openai-codex.models.d.ts.map +1 -1
  400. package/dist/providers/openai-codex.models.js +4 -2
  401. package/dist/providers/openai-codex.models.js.map +1 -1
  402. package/dist/providers/openai.d.ts.map +1 -1
  403. package/dist/providers/openai.js +11 -2
  404. package/dist/providers/openai.js.map +1 -1
  405. package/dist/providers/openai.models.d.ts +4 -2
  406. package/dist/providers/openai.models.d.ts.map +1 -1
  407. package/dist/providers/openai.models.js +4 -2
  408. package/dist/providers/openai.models.js.map +1 -1
  409. package/dist/providers/opencode-go.d.ts.map +1 -1
  410. package/dist/providers/opencode-go.js +4 -3
  411. package/dist/providers/opencode-go.js.map +1 -1
  412. package/dist/providers/opencode-go.models.d.ts +4 -2
  413. package/dist/providers/opencode-go.models.d.ts.map +1 -1
  414. package/dist/providers/opencode-go.models.js +4 -2
  415. package/dist/providers/opencode-go.models.js.map +1 -1
  416. package/dist/providers/opencode-headers.d.ts +4 -0
  417. package/dist/providers/opencode-headers.d.ts.map +1 -0
  418. package/dist/providers/opencode-headers.js +22 -0
  419. package/dist/providers/opencode-headers.js.map +1 -0
  420. package/dist/providers/opencode.d.ts +3 -1
  421. package/dist/providers/opencode.d.ts.map +1 -1
  422. package/dist/providers/opencode.js +10 -6
  423. package/dist/providers/opencode.js.map +1 -1
  424. package/dist/providers/opencode.models.d.ts +4 -2
  425. package/dist/providers/opencode.models.d.ts.map +1 -1
  426. package/dist/providers/opencode.models.js +4 -2
  427. package/dist/providers/opencode.models.js.map +1 -1
  428. package/dist/providers/openrouter.d.ts +1 -1
  429. package/dist/providers/openrouter.d.ts.map +1 -1
  430. package/dist/providers/openrouter.js +16 -3
  431. package/dist/providers/openrouter.js.map +1 -1
  432. package/dist/providers/openrouter.models.d.ts +4 -2
  433. package/dist/providers/openrouter.models.d.ts.map +1 -1
  434. package/dist/providers/openrouter.models.js +4 -2
  435. package/dist/providers/openrouter.models.js.map +1 -1
  436. package/dist/providers/qwen-token-plan-cn.models.d.ts +4 -2
  437. package/dist/providers/qwen-token-plan-cn.models.d.ts.map +1 -1
  438. package/dist/providers/qwen-token-plan-cn.models.js +4 -2
  439. package/dist/providers/qwen-token-plan-cn.models.js.map +1 -1
  440. package/dist/providers/qwen-token-plan-individual.d.ts +3 -0
  441. package/dist/providers/qwen-token-plan-individual.d.ts.map +1 -0
  442. package/dist/providers/qwen-token-plan-individual.js +15 -0
  443. package/dist/providers/qwen-token-plan-individual.js.map +1 -0
  444. package/dist/providers/qwen-token-plan-individual.models.d.ts +6 -0
  445. package/dist/providers/qwen-token-plan-individual.models.d.ts.map +1 -0
  446. package/dist/providers/qwen-token-plan-individual.models.js +8 -0
  447. package/dist/providers/qwen-token-plan-individual.models.js.map +1 -0
  448. package/dist/providers/qwen-token-plan.models.d.ts +4 -2
  449. package/dist/providers/qwen-token-plan.models.d.ts.map +1 -1
  450. package/dist/providers/qwen-token-plan.models.js +4 -2
  451. package/dist/providers/qwen-token-plan.models.js.map +1 -1
  452. package/dist/providers/radius.d.ts.map +1 -1
  453. package/dist/providers/radius.js +53 -29
  454. package/dist/providers/radius.js.map +1 -1
  455. package/dist/providers/radius.models.d.ts +6 -0
  456. package/dist/providers/radius.models.d.ts.map +1 -0
  457. package/dist/providers/radius.models.js +8 -0
  458. package/dist/providers/radius.models.js.map +1 -0
  459. package/dist/providers/together.models.d.ts +4 -2
  460. package/dist/providers/together.models.d.ts.map +1 -1
  461. package/dist/providers/together.models.js +4 -2
  462. package/dist/providers/together.models.js.map +1 -1
  463. package/dist/providers/typesafe.d.ts +3 -0
  464. package/dist/providers/typesafe.d.ts.map +1 -0
  465. package/dist/providers/typesafe.js +18 -0
  466. package/dist/providers/typesafe.js.map +1 -0
  467. package/dist/providers/typesafe.models.d.ts +6 -0
  468. package/dist/providers/typesafe.models.d.ts.map +1 -0
  469. package/dist/providers/typesafe.models.js +8 -0
  470. package/dist/providers/typesafe.models.js.map +1 -0
  471. package/dist/providers/vercel-ai-gateway.d.ts.map +1 -1
  472. package/dist/providers/vercel-ai-gateway.js +5 -2
  473. package/dist/providers/vercel-ai-gateway.js.map +1 -1
  474. package/dist/providers/vercel-ai-gateway.models.d.ts +4 -2
  475. package/dist/providers/vercel-ai-gateway.models.d.ts.map +1 -1
  476. package/dist/providers/vercel-ai-gateway.models.js +4 -2
  477. package/dist/providers/vercel-ai-gateway.models.js.map +1 -1
  478. package/dist/providers/xai.d.ts +1 -1
  479. package/dist/providers/xai.d.ts.map +1 -1
  480. package/dist/providers/xai.js +2 -5
  481. package/dist/providers/xai.js.map +1 -1
  482. package/dist/providers/xai.models.d.ts +4 -2
  483. package/dist/providers/xai.models.d.ts.map +1 -1
  484. package/dist/providers/xai.models.js +4 -2
  485. package/dist/providers/xai.models.js.map +1 -1
  486. package/dist/providers/xiaomi-token-plan-ams.models.d.ts +4 -2
  487. package/dist/providers/xiaomi-token-plan-ams.models.d.ts.map +1 -1
  488. package/dist/providers/xiaomi-token-plan-ams.models.js +4 -2
  489. package/dist/providers/xiaomi-token-plan-ams.models.js.map +1 -1
  490. package/dist/providers/xiaomi-token-plan-cn.models.d.ts +4 -2
  491. package/dist/providers/xiaomi-token-plan-cn.models.d.ts.map +1 -1
  492. package/dist/providers/xiaomi-token-plan-cn.models.js +4 -2
  493. package/dist/providers/xiaomi-token-plan-cn.models.js.map +1 -1
  494. package/dist/providers/xiaomi-token-plan-sgp.models.d.ts +4 -2
  495. package/dist/providers/xiaomi-token-plan-sgp.models.d.ts.map +1 -1
  496. package/dist/providers/xiaomi-token-plan-sgp.models.js +4 -2
  497. package/dist/providers/xiaomi-token-plan-sgp.models.js.map +1 -1
  498. package/dist/providers/xiaomi.models.d.ts +4 -2
  499. package/dist/providers/xiaomi.models.d.ts.map +1 -1
  500. package/dist/providers/xiaomi.models.js +4 -2
  501. package/dist/providers/xiaomi.models.js.map +1 -1
  502. package/dist/providers/zai-coding-cn.models.d.ts +4 -2
  503. package/dist/providers/zai-coding-cn.models.d.ts.map +1 -1
  504. package/dist/providers/zai-coding-cn.models.js +4 -2
  505. package/dist/providers/zai-coding-cn.models.js.map +1 -1
  506. package/dist/providers/zai.models.d.ts +4 -2
  507. package/dist/providers/zai.models.d.ts.map +1 -1
  508. package/dist/providers/zai.models.js +4 -2
  509. package/dist/providers/zai.models.js.map +1 -1
  510. package/dist/types.d.ts +411 -127
  511. package/dist/types.d.ts.map +1 -1
  512. package/dist/types.js.map +1 -1
  513. package/dist/utils/abort.d.ts +8 -0
  514. package/dist/utils/abort.d.ts.map +1 -0
  515. package/dist/utils/abort.js +49 -0
  516. package/dist/utils/abort.js.map +1 -0
  517. package/dist/utils/assistant-message-frame.d.ts +77 -0
  518. package/dist/utils/assistant-message-frame.d.ts.map +1 -0
  519. package/dist/utils/assistant-message-frame.js +425 -0
  520. package/dist/utils/assistant-message-frame.js.map +1 -0
  521. package/dist/utils/diagnostics.d.ts +3 -2
  522. package/dist/utils/diagnostics.d.ts.map +1 -1
  523. package/dist/utils/diagnostics.js.map +1 -1
  524. package/dist/utils/draht-user-agent.d.ts +2 -0
  525. package/dist/utils/draht-user-agent.d.ts.map +1 -0
  526. package/dist/utils/draht-user-agent.js +12 -0
  527. package/dist/utils/draht-user-agent.js.map +1 -0
  528. package/dist/utils/error-body.d.ts.map +1 -1
  529. package/dist/utils/error-body.js +23 -4
  530. package/dist/utils/error-body.js.map +1 -1
  531. package/dist/utils/estimate.d.ts +2 -2
  532. package/dist/utils/estimate.d.ts.map +1 -1
  533. package/dist/utils/estimate.js +8 -29
  534. package/dist/utils/estimate.js.map +1 -1
  535. package/dist/utils/event-stream.d.ts.map +1 -1
  536. package/dist/utils/event-stream.js +30 -8
  537. package/dist/utils/event-stream.js.map +1 -1
  538. package/dist/utils/headers.d.ts +1 -1
  539. package/dist/utils/headers.d.ts.map +1 -1
  540. package/dist/utils/headers.js +10 -8
  541. package/dist/utils/headers.js.map +1 -1
  542. package/dist/utils/model-operations.d.ts +11 -0
  543. package/dist/utils/model-operations.d.ts.map +1 -0
  544. package/dist/utils/model-operations.js +47 -0
  545. package/dist/utils/model-operations.js.map +1 -0
  546. package/dist/utils/models-error.d.ts +8 -0
  547. package/dist/utils/models-error.d.ts.map +1 -0
  548. package/dist/utils/models-error.js +19 -0
  549. package/dist/utils/models-error.js.map +1 -0
  550. package/dist/utils/node-http-proxy.d.ts.map +1 -1
  551. package/dist/utils/node-http-proxy.js +53 -12
  552. package/dist/utils/node-http-proxy.js.map +1 -1
  553. package/dist/utils/oauth-page.d.ts.map +1 -0
  554. package/dist/utils/oauth-page.js.map +1 -0
  555. package/dist/utils/overflow.d.ts +11 -1
  556. package/dist/utils/overflow.d.ts.map +1 -1
  557. package/dist/utils/overflow.js +24 -6
  558. package/dist/utils/overflow.js.map +1 -1
  559. package/dist/utils/provider-retry.js +3 -2
  560. package/dist/utils/provider-retry.js.map +1 -1
  561. package/dist/utils/retry.d.ts +6 -1
  562. package/dist/utils/retry.d.ts.map +1 -1
  563. package/dist/utils/retry.js +19 -2
  564. package/dist/utils/retry.js.map +1 -1
  565. package/dist/utils/sleep.d.ts +2 -0
  566. package/dist/utils/sleep.d.ts.map +1 -0
  567. package/dist/utils/sleep.js +15 -0
  568. package/dist/utils/sleep.js.map +1 -0
  569. package/dist/utils/text.d.ts +9 -1
  570. package/dist/utils/text.d.ts.map +1 -1
  571. package/dist/utils/text.js +26 -0
  572. package/dist/utils/text.js.map +1 -1
  573. package/dist/utils/transcript.d.ts +84 -0
  574. package/dist/utils/transcript.d.ts.map +1 -0
  575. package/dist/utils/transcript.js +204 -0
  576. package/dist/utils/transcript.js.map +1 -0
  577. package/dist/utils/uuid.d.ts +2 -2
  578. package/dist/utils/uuid.d.ts.map +1 -1
  579. package/dist/utils/uuid.js +35 -40
  580. package/dist/utils/uuid.js.map +1 -1
  581. package/dist/utils/validation.d.ts.map +1 -1
  582. package/dist/utils/validation.js +40 -0
  583. package/dist/utils/validation.js.map +1 -1
  584. package/package.json +19 -13
  585. package/dist/auth/oauth/oauth-page.d.ts.map +0 -1
  586. package/dist/auth/oauth/oauth-page.js.map +0 -1
  587. package/dist/image-models.generated.d.ts +0 -605
  588. package/dist/image-models.generated.d.ts.map +0 -1
  589. package/dist/image-models.generated.js +0 -607
  590. package/dist/image-models.generated.js.map +0 -1
  591. package/dist/images-models.d.ts +0 -95
  592. package/dist/images-models.d.ts.map +0 -1
  593. package/dist/images-models.js +0 -140
  594. package/dist/images-models.js.map +0 -1
  595. package/dist/providers/openrouter-images.d.ts +0 -3
  596. package/dist/providers/openrouter-images.d.ts.map +0 -1
  597. package/dist/providers/openrouter-images.js +0 -22
  598. package/dist/providers/openrouter-images.js.map +0 -1
  599. package/dist/utils/deferred-tools.d.ts +0 -9
  600. package/dist/utils/deferred-tools.d.ts.map +0 -1
  601. package/dist/utils/deferred-tools.js +0 -36
  602. package/dist/utils/deferred-tools.js.map +0 -1
  603. /package/dist/{auth/oauth → utils}/oauth-page.d.ts +0 -0
  604. /package/dist/{auth/oauth → utils}/oauth-page.js +0 -0
@@ -1,20 +1,14 @@
1
- function loadNodeOs() {
2
- if (typeof process === "undefined" || !(process.versions?.node || process.versions?.bun)) {
3
- return null;
4
- }
5
- return process.getBuiltinModule?.("node:os") ?? null;
6
- }
7
- // NEVER convert to top-level runtime imports - breaks browser/Vite builds
8
- const _os = loadNodeOs();
9
1
  import { clampThinkingLevel } from "../models.js";
10
2
  import { registerSessionResourceCleanup } from "../session-resources.js";
11
3
  import { combineAbortSignals } from "../utils/abort-signals.js";
12
- import { splitDeferredTools } from "../utils/deferred-tools.js";
13
4
  import { appendAssistantMessageDiagnostic, createAssistantMessageDiagnostic, formatThrownValue, } from "../utils/diagnostics.js";
5
+ import { getDrahtUserAgent } from "../utils/draht-user-agent.js";
14
6
  import { formatProviderError, normalizeProviderError } from "../utils/error-body.js";
15
7
  import { AssistantMessageEventStream } from "../utils/event-stream.js";
16
8
  import { headersToRecord } from "../utils/headers.js";
17
9
  import { resolveHttpProxyUrlForTarget } from "../utils/node-http-proxy.js";
10
+ import { getSystemMessageText } from "../utils/text.js";
11
+ import { getDeclaredTools, getInitialSystemMessage, normalizeContext, resolveTranscript, resolveTranscriptTools, } from "../utils/transcript.js";
18
12
  import { uuidv7 } from "../utils/uuid.js";
19
13
  import { createGrammarToolInputProperties } from "./constrained-sampling.js";
20
14
  import { clampOpenAIPromptCacheKey } from "./openai-prompt-cache.js";
@@ -152,6 +146,7 @@ function compressRequestBodyZstd(bodyJson) {
152
146
  // ============================================================================
153
147
  export const stream = (model, context, options) => {
154
148
  const stream = new AssistantMessageEventStream();
149
+ const normalizedContext = resolveTranscript(context, model.compat?.supportsMidConvoSystemMessages);
155
150
  (async () => {
156
151
  const output = {
157
152
  role: "assistant",
@@ -176,10 +171,10 @@ export const stream = (model, context, options) => {
176
171
  throw new Error(`No API key for provider: ${model.provider}`);
177
172
  }
178
173
  const accountId = extractAccountId(apiKey);
179
- const grammarToolInputProperties = createGrammarToolInputProperties(context.tools, model.compat?.supportsOpenAIGrammarTools ?? false);
174
+ const grammarToolInputProperties = createGrammarToolInputProperties(getDeclaredTools(normalizedContext.messages), model.compat?.supportsOpenAIGrammarTools ?? false);
180
175
  const cacheSessionId = options?.cacheRetention === "none" ? undefined : options?.sessionId;
181
176
  const codexSessionId = clampOpenAIPromptCacheKey(cacheSessionId);
182
- let body = buildRequestBody(model, context, options, codexSessionId, grammarToolInputProperties);
177
+ let body = buildRequestBody(model, normalizedContext, options, codexSessionId, grammarToolInputProperties);
183
178
  const nextBody = await options?.onPayload?.(body, model);
184
179
  if (nextBody !== undefined) {
185
180
  body = nextBody;
@@ -209,7 +204,7 @@ export const stream = (model, context, options) => {
209
204
  startEmitted = true;
210
205
  stream.push({ type: "start", partial: output });
211
206
  }
212
- }, httpTimeoutMs, websocketConnectTimeoutMs, cacheSessionId, grammarToolInputProperties, options);
207
+ }, httpTimeoutMs, websocketConnectTimeoutMs, cacheSessionId, accountId, grammarToolInputProperties, options);
213
208
  if (options?.signal?.aborted) {
214
209
  throw new Error("Request was aborted");
215
210
  }
@@ -239,7 +234,7 @@ export const stream = (model, context, options) => {
239
234
  }
240
235
  appendAssistantMessageDiagnostic(output, createAssistantMessageDiagnostic("provider_transport_failure", error, {
241
236
  configuredTransport: transport,
242
- fallbackTransport: websocketStarted ? undefined : "sse",
237
+ ...(websocketStarted ? {} : { fallbackTransport: "sse" }),
243
238
  eventsEmitted: websocketStarted,
244
239
  phase: websocketStarted ? "after_message_stream_start" : "before_message_stream_start",
245
240
  requestBytes: new TextEncoder().encode(bodyJson).byteLength,
@@ -365,7 +360,10 @@ export const streamSimple = (model, context, options) => {
365
360
  if (!apiKey) {
366
361
  throw new Error(`No API key for provider: ${model.provider}`);
367
362
  }
368
- const base = buildBaseOptions(model, context, options, apiKey);
363
+ const base = {
364
+ ...buildBaseOptions(model, context, options, apiKey),
365
+ toolChoice: options?.toolChoice,
366
+ };
369
367
  const clampedReasoning = options?.reasoning ? clampThinkingLevel(model, options.reasoning) : undefined;
370
368
  const reasoningEffort = clampedReasoning === "off" ? undefined : clampedReasoning;
371
369
  return stream(model, context, {
@@ -376,25 +374,27 @@ export const streamSimple = (model, context, options) => {
376
374
  // ============================================================================
377
375
  // Request Building
378
376
  // ============================================================================
379
- function buildRequestBody(model, context, options, cacheSessionId, grammarToolInputProperties = createGrammarToolInputProperties(context.tools, model.compat?.supportsOpenAIGrammarTools ?? false)) {
377
+ function buildRequestBody(model, context, options, cacheSessionId, grammarToolInputProperties = createGrammarToolInputProperties(getDeclaredTools(context.messages), model.compat?.supportsOpenAIGrammarTools ?? false)) {
380
378
  const supportsStrictMode = model.compat?.supportsStrictMode ?? true;
381
379
  const supportsOpenAIGrammarTools = model.compat?.supportsOpenAIGrammarTools ?? false;
382
- const toolPlacement = splitDeferredTools(context, model.compat?.supportsToolSearch ?? false);
380
+ const supportsAdditionalTools = model.compat?.supportsAdditionalTools ?? false;
381
+ const supportsToolSearch = model.compat?.supportsToolSearch ?? false;
382
+ const transcriptTools = resolveTranscriptTools(context.messages, supportsAdditionalTools || supportsToolSearch);
383
383
  const messages = convertResponsesMessages(model, context, CODEX_TOOL_CALL_PROVIDERS, {
384
384
  includeSystemPrompt: false,
385
385
  grammarToolInputProperties,
386
- deferredTools: toolPlacement.deferred,
387
- toolOptions: {
388
- strict: null,
389
- supportsStrictMode,
390
- supportsOpenAIGrammarTools,
391
- },
386
+ supportsMidConvoSystemMessages: model.compat?.supportsMidConvoSystemMessages ?? false,
387
+ supportsAdditionalTools,
388
+ supportsToolSearch,
389
+ toolOptions: { strict: null, supportsStrictMode, supportsOpenAIGrammarTools },
392
390
  });
391
+ const initialSystemMessage = getInitialSystemMessage(context.messages);
392
+ const instructions = initialSystemMessage ? getSystemMessageText(initialSystemMessage) : "";
393
393
  const body = {
394
394
  model: model.id,
395
395
  store: false,
396
396
  stream: true,
397
- instructions: context.systemPrompt || "You are a helpful assistant.",
397
+ instructions: instructions || "You are a helpful assistant.",
398
398
  input: messages,
399
399
  text: { verbosity: options?.textVerbosity || "low" },
400
400
  include: ["reasoning.encrypted_content"],
@@ -408,8 +408,8 @@ function buildRequestBody(model, context, options, cacheSessionId, grammarToolIn
408
408
  if (options?.serviceTier !== undefined) {
409
409
  body.service_tier = options.serviceTier;
410
410
  }
411
- if (toolPlacement.immediate.length > 0) {
412
- body.tools = convertResponsesTools(toolPlacement.immediate, {
411
+ if (transcriptTools.requestTools.length > 0) {
412
+ body.tools = convertResponsesTools(transcriptTools.requestTools, {
413
413
  strict: null,
414
414
  supportsStrictMode,
415
415
  supportsOpenAIGrammarTools,
@@ -417,7 +417,9 @@ function buildRequestBody(model, context, options, cacheSessionId, grammarToolIn
417
417
  }
418
418
  if (options?.reasoningEffort !== undefined) {
419
419
  const effort = options.reasoningEffort === "none"
420
- ? (model.thinkingLevelMap?.off ?? "none")
420
+ ? model.thinkingLevelMap?.off === undefined
421
+ ? "none"
422
+ : model.thinkingLevelMap.off
421
423
  : (model.thinkingLevelMap?.[options.reasoningEffort] ?? options.reasoningEffort);
422
424
  if (effort !== null) {
423
425
  body.reasoning = {
@@ -426,6 +428,9 @@ function buildRequestBody(model, context, options, cacheSessionId, grammarToolIn
426
428
  };
427
429
  }
428
430
  }
431
+ else if (model.reasoning && model.thinkingLevelMap?.off !== null) {
432
+ body.reasoning = { effort: model.thinkingLevelMap?.off ?? "none" };
433
+ }
429
434
  return body;
430
435
  }
431
436
  function getServiceTierCostMultiplier(model, serviceTier) {
@@ -475,7 +480,7 @@ function resolveCodexWebSocketUrl(baseUrl) {
475
480
  // Response Processing
476
481
  // ============================================================================
477
482
  async function processStream(response, output, stream, model, grammarToolInputProperties, options) {
478
- await processResponsesStream(mapCodexEvents(parseSSE(response, options?.signal)), output, stream, model, {
483
+ await processResponsesStream(mapCodexEvents(parseSSE(response, options?.signal), output, model, options?.onProviderStreamEvent), output, stream, model, {
479
484
  serviceTier: options?.serviceTier,
480
485
  grammarToolInputProperties,
481
486
  resolveServiceTier: resolveCodexServiceTier,
@@ -483,6 +488,8 @@ async function processStream(response, output, stream, model, grammarToolInputPr
483
488
  });
484
489
  }
485
490
  class CodexApiError extends Error {
491
+ code;
492
+ payload;
486
493
  constructor(message, options) {
487
494
  super(message);
488
495
  this.name = "CodexApiError";
@@ -492,6 +499,7 @@ class CodexApiError extends Error {
492
499
  }
493
500
  }
494
501
  class CodexProtocolError extends Error {
502
+ payload;
495
503
  constructor(message, options) {
496
504
  super(message);
497
505
  this.name = "CodexProtocolError";
@@ -499,8 +507,17 @@ class CodexProtocolError extends Error {
499
507
  this.cause = options?.cause;
500
508
  }
501
509
  }
510
+ class ProviderStreamEventCallbackError extends Error {
511
+ constructor(cause) {
512
+ super(formatThrownValue(cause));
513
+ this.name = "ProviderStreamEventCallbackError";
514
+ this.cause = cause;
515
+ }
516
+ }
502
517
  function isCodexNonTransportError(error) {
503
- return error instanceof CodexApiError || error instanceof CodexProtocolError;
518
+ return (error instanceof CodexApiError ||
519
+ error instanceof CodexProtocolError ||
520
+ error instanceof ProviderStreamEventCallbackError);
504
521
  }
505
522
  function isWebSocketConnectionLimitReachedError(error) {
506
523
  return error instanceof CodexApiError && error.code === WEBSOCKET_CONNECTION_LIMIT_REACHED_CODE;
@@ -519,8 +536,15 @@ function extractCodexEventError(event) {
519
536
  : undefined,
520
537
  };
521
538
  }
522
- async function* mapCodexEvents(events) {
539
+ async function* mapCodexEvents(events, output, model, onProviderStreamEvent) {
523
540
  for await (const event of events) {
541
+ try {
542
+ await onProviderStreamEvent?.(event, model);
543
+ }
544
+ catch (error) {
545
+ // Keep callback failures out of Codex's WebSocket retry and SSE fallback path.
546
+ throw new ProviderStreamEventCallbackError(error);
547
+ }
524
548
  const type = typeof event.type === "string" ? event.type : undefined;
525
549
  if (!type)
526
550
  continue;
@@ -539,6 +563,9 @@ async function* mapCodexEvents(events) {
539
563
  }
540
564
  if (type === "response.done" || type === "response.completed" || type === "response.incomplete") {
541
565
  const response = event.response;
566
+ if (typeof response?.end_turn === "boolean") {
567
+ output.endTurn = response.end_turn;
568
+ }
542
569
  const normalizedResponse = response
543
570
  ? { ...response, status: normalizeCodexStatus(response.status) }
544
571
  : response;
@@ -575,9 +602,10 @@ async function* parseSSE(response, signal) {
575
602
  if (signal?.aborted) {
576
603
  throw new Error("Request was aborted");
577
604
  }
578
- if (done)
579
- break;
580
- buffer += decoder.decode(value, { stream: true });
605
+ buffer += done ? decoder.decode() : decoder.decode(value, { stream: true });
606
+ // Treat EOF as terminating the residual SSE frame.
607
+ if (done && buffer.trim())
608
+ buffer += "\n\n";
581
609
  let idx = buffer.indexOf("\n\n");
582
610
  while (idx !== -1) {
583
611
  const chunk = buffer.slice(0, idx);
@@ -602,6 +630,8 @@ async function* parseSSE(response, signal) {
602
630
  }
603
631
  idx = buffer.indexOf("\n\n");
604
632
  }
633
+ if (done)
634
+ break;
605
635
  }
606
636
  }
607
637
  finally {
@@ -664,14 +694,14 @@ export function closeOpenAICodexWebSocketSessions(sessionId) {
664
694
  closeWebSocketSilently(entry.socket, 1000, "debug_close");
665
695
  };
666
696
  if (sessionId) {
667
- const entry = websocketSessionCache.get(sessionId);
668
- if (entry)
697
+ for (const entry of websocketSessionCache.get(sessionId)?.values() ?? [])
669
698
  closeEntry(entry);
670
699
  websocketSessionCache.delete(sessionId);
671
700
  return;
672
701
  }
673
- for (const entry of websocketSessionCache.values()) {
674
- closeEntry(entry);
702
+ for (const accountEntries of websocketSessionCache.values()) {
703
+ for (const entry of accountEntries.values())
704
+ closeEntry(entry);
675
705
  }
676
706
  websocketSessionCache.clear();
677
707
  }
@@ -726,6 +756,9 @@ async function getWebSocketConstructor(env) {
726
756
  return ctor;
727
757
  }
728
758
  class WebSocketCloseError extends Error {
759
+ code;
760
+ reason;
761
+ wasClean;
729
762
  constructor(message, options) {
730
763
  super(message);
731
764
  this.name = "WebSocketCloseError";
@@ -752,7 +785,7 @@ function closeWebSocketSilently(socket, code = 1000, reason = "done") {
752
785
  }
753
786
  catch { }
754
787
  }
755
- function scheduleSessionWebSocketExpiry(sessionId, entry) {
788
+ function scheduleSessionWebSocketExpiry(sessionId, accountId, entry) {
756
789
  if (entry.idleTimer) {
757
790
  clearTimeout(entry.idleTimer);
758
791
  }
@@ -760,7 +793,11 @@ function scheduleSessionWebSocketExpiry(sessionId, entry) {
760
793
  if (entry.busy)
761
794
  return;
762
795
  closeWebSocketSilently(entry.socket, 1000, "idle_timeout");
763
- websocketSessionCache.delete(sessionId);
796
+ const accountEntries = websocketSessionCache.get(sessionId);
797
+ if (accountEntries?.get(accountId) === entry)
798
+ accountEntries.delete(accountId);
799
+ if (accountEntries?.size === 0)
800
+ websocketSessionCache.delete(sessionId);
764
801
  }, SESSION_WEBSOCKET_CACHE_TTL_MS);
765
802
  }
766
803
  async function connectWebSocket(url, headers, signal, connectTimeoutMs = DEFAULT_WEBSOCKET_CONNECT_TIMEOUT_MS, env) {
@@ -831,7 +868,7 @@ async function connectWebSocket(url, headers, signal, connectTimeoutMs = DEFAULT
831
868
  }
832
869
  });
833
870
  }
834
- async function acquireWebSocket(url, headers, sessionId, signal, connectTimeoutMs, env) {
871
+ async function acquireWebSocket(url, headers, sessionId, accountId, signal, connectTimeoutMs, env) {
835
872
  if (!sessionId) {
836
873
  const socket = await connectWebSocket(url, headers, signal, connectTimeoutMs, env);
837
874
  return {
@@ -840,7 +877,8 @@ async function acquireWebSocket(url, headers, sessionId, signal, connectTimeoutM
840
877
  release: () => closeWebSocketSilently(socket),
841
878
  };
842
879
  }
843
- const cached = websocketSessionCache.get(sessionId);
880
+ let accountEntries = websocketSessionCache.get(sessionId);
881
+ const cached = accountEntries?.get(accountId);
844
882
  if (cached) {
845
883
  if (cached.idleTimer) {
846
884
  clearTimeout(cached.idleTimer);
@@ -848,7 +886,9 @@ async function acquireWebSocket(url, headers, sessionId, signal, connectTimeoutM
848
886
  }
849
887
  if (!cached.busy && isWebSocketSessionExpired(cached)) {
850
888
  closeWebSocketSilently(cached.socket, 1000, "connection_age_limit");
851
- websocketSessionCache.delete(sessionId);
889
+ accountEntries?.delete(accountId);
890
+ if (accountEntries?.size === 0)
891
+ websocketSessionCache.delete(sessionId);
852
892
  }
853
893
  else if (!cached.busy && isWebSocketReusable(cached.socket)) {
854
894
  cached.busy = true;
@@ -859,11 +899,15 @@ async function acquireWebSocket(url, headers, sessionId, signal, connectTimeoutM
859
899
  release: ({ keep } = {}) => {
860
900
  if (!keep || !isWebSocketReusable(cached.socket)) {
861
901
  closeWebSocketSilently(cached.socket);
862
- websocketSessionCache.delete(sessionId);
902
+ const currentEntries = websocketSessionCache.get(sessionId);
903
+ if (currentEntries?.get(accountId) === cached)
904
+ currentEntries.delete(accountId);
905
+ if (currentEntries?.size === 0)
906
+ websocketSessionCache.delete(sessionId);
863
907
  return;
864
908
  }
865
909
  cached.busy = false;
866
- scheduleSessionWebSocketExpiry(sessionId, cached);
910
+ scheduleSessionWebSocketExpiry(sessionId, accountId, cached);
867
911
  },
868
912
  };
869
913
  }
@@ -879,12 +923,19 @@ async function acquireWebSocket(url, headers, sessionId, signal, connectTimeoutM
879
923
  }
880
924
  if (!isWebSocketReusable(cached.socket)) {
881
925
  closeWebSocketSilently(cached.socket);
882
- websocketSessionCache.delete(sessionId);
926
+ accountEntries?.delete(accountId);
927
+ if (accountEntries?.size === 0)
928
+ websocketSessionCache.delete(sessionId);
883
929
  }
884
930
  }
885
931
  const socket = await connectWebSocket(url, headers, signal, connectTimeoutMs, env);
886
932
  const entry = { socket, busy: true, createdAt: Date.now() };
887
- websocketSessionCache.set(sessionId, entry);
933
+ accountEntries = websocketSessionCache.get(sessionId);
934
+ if (!accountEntries) {
935
+ accountEntries = new Map();
936
+ websocketSessionCache.set(sessionId, accountEntries);
937
+ }
938
+ accountEntries.set(accountId, entry);
888
939
  return {
889
940
  socket,
890
941
  entry,
@@ -894,13 +945,15 @@ async function acquireWebSocket(url, headers, sessionId, signal, connectTimeoutM
894
945
  closeWebSocketSilently(entry.socket);
895
946
  if (entry.idleTimer)
896
947
  clearTimeout(entry.idleTimer);
897
- if (websocketSessionCache.get(sessionId) === entry) {
948
+ const currentEntries = websocketSessionCache.get(sessionId);
949
+ if (currentEntries?.get(accountId) === entry)
950
+ currentEntries.delete(accountId);
951
+ if (currentEntries?.size === 0)
898
952
  websocketSessionCache.delete(sessionId);
899
- }
900
953
  return;
901
954
  }
902
955
  entry.busy = false;
903
- scheduleSessionWebSocketExpiry(sessionId, entry);
956
+ scheduleSessionWebSocketExpiry(sessionId, accountId, entry);
904
957
  },
905
958
  };
906
959
  }
@@ -1120,8 +1173,8 @@ async function* startWebSocketOutputOnFirstEvent(events, onStart) {
1120
1173
  yield event;
1121
1174
  }
1122
1175
  }
1123
- async function processWebSocketStream(url, body, headers, output, stream, model, onStart, idleTimeoutMs, websocketConnectTimeoutMs, cacheSessionId, grammarToolInputProperties, options) {
1124
- const { socket, entry, reused, release } = await acquireWebSocket(url, headers, cacheSessionId, options?.signal, websocketConnectTimeoutMs, options?.env);
1176
+ async function processWebSocketStream(url, body, headers, output, stream, model, onStart, idleTimeoutMs, websocketConnectTimeoutMs, cacheSessionId, accountId, grammarToolInputProperties, options) {
1177
+ const { socket, entry, reused, release } = await acquireWebSocket(url, headers, cacheSessionId, accountId, options?.signal, websocketConnectTimeoutMs, options?.env);
1125
1178
  let keepConnection = true;
1126
1179
  const useCachedContext = options?.transport === "websocket-cached" || options?.transport === "auto";
1127
1180
  // ChatGPT Codex Responses rejects `store: true` ("Store must be set to false").
@@ -1153,7 +1206,7 @@ async function processWebSocketStream(url, body, headers, output, stream, model,
1153
1206
  }
1154
1207
  try {
1155
1208
  socket.send(JSON.stringify({ type: "response.create", ...requestBody }));
1156
- await processResponsesStream(startWebSocketOutputOnFirstEvent(mapCodexEvents(parseWebSocket(socket, options?.signal, idleTimeoutMs)), onStart), output, stream, model, {
1209
+ await processResponsesStream(startWebSocketOutputOnFirstEvent(mapCodexEvents(parseWebSocket(socket, options?.signal, idleTimeoutMs), output, model, options?.onProviderStreamEvent), onStart), output, stream, model, {
1157
1210
  serviceTier: options?.serviceTier,
1158
1211
  grammarToolInputProperties,
1159
1212
  resolveServiceTier: resolveCodexServiceTier,
@@ -1163,7 +1216,7 @@ async function processWebSocketStream(url, body, headers, output, stream, model,
1163
1216
  keepConnection = false;
1164
1217
  }
1165
1218
  else if (useCachedContext && entry && output.responseId) {
1166
- const responseItems = convertResponsesMessages(model, { messages: [output] }, CODEX_TOOL_CALL_PROVIDERS, {
1219
+ const responseItems = convertResponsesMessages(model, normalizeContext({ messages: [output] }), CODEX_TOOL_CALL_PROVIDERS, {
1167
1220
  includeSystemPrompt: false,
1168
1221
  grammarToolInputProperties,
1169
1222
  }).filter((item) => item.type !== "function_call_output" && item.type !== "custom_tool_call_output");
@@ -1241,9 +1294,8 @@ function buildBaseCodexHeaders(initHeaders, additionalHeaders, accountId, token)
1241
1294
  }
1242
1295
  headers.set("Authorization", `Bearer ${token}`);
1243
1296
  headers.set("chatgpt-account-id", accountId);
1244
- headers.set("originator", "pi");
1245
- const userAgent = _os ? `pi (${_os.platform()} ${_os.release()}; ${_os.arch()})` : "pi (browser)";
1246
- headers.set("User-Agent", userAgent);
1297
+ headers.set("originator", "draht");
1298
+ headers.set("User-Agent", getDrahtUserAgent());
1247
1299
  return headers;
1248
1300
  }
1249
1301
  function buildSSEHeaders(initHeaders, additionalHeaders, accountId, token, sessionId) {