@draht/ai 2026.7.13 → 2026.9.5-1

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 (524) hide show
  1. package/dist/api/anthropic-messages.d.ts.map +1 -1
  2. package/dist/api/anthropic-messages.js +144 -65
  3. package/dist/api/anthropic-messages.js.map +1 -1
  4. package/dist/api/azure-openai-responses.d.ts.map +1 -1
  5. package/dist/api/azure-openai-responses.js +28 -10
  6. package/dist/api/azure-openai-responses.js.map +1 -1
  7. package/dist/api/bedrock-converse-stream.d.ts.map +1 -1
  8. package/dist/api/bedrock-converse-stream.js +70 -25
  9. package/dist/api/bedrock-converse-stream.js.map +1 -1
  10. package/dist/api/constrained-sampling.d.ts +17 -0
  11. package/dist/api/constrained-sampling.d.ts.map +1 -0
  12. package/dist/api/constrained-sampling.js +100 -0
  13. package/dist/api/constrained-sampling.js.map +1 -0
  14. package/dist/api/google-generative-ai.d.ts +2 -2
  15. package/dist/api/google-generative-ai.d.ts.map +1 -1
  16. package/dist/api/google-generative-ai.js +37 -27
  17. package/dist/api/google-generative-ai.js.map +1 -1
  18. package/dist/api/google-shared.d.ts +19 -5
  19. package/dist/api/google-shared.d.ts.map +1 -1
  20. package/dist/api/google-shared.js +77 -10
  21. package/dist/api/google-shared.js.map +1 -1
  22. package/dist/api/google-vertex.d.ts +2 -2
  23. package/dist/api/google-vertex.d.ts.map +1 -1
  24. package/dist/api/google-vertex.js +35 -25
  25. package/dist/api/google-vertex.js.map +1 -1
  26. package/dist/api/lazy.d.ts.map +1 -1
  27. package/dist/api/lazy.js +9 -10
  28. package/dist/api/lazy.js.map +1 -1
  29. package/dist/api/mistral-conversations.d.ts.map +1 -1
  30. package/dist/api/mistral-conversations.js +38 -21
  31. package/dist/api/mistral-conversations.js.map +1 -1
  32. package/dist/api/openai-codex-responses.d.ts +1 -0
  33. package/dist/api/openai-codex-responses.d.ts.map +1 -1
  34. package/dist/api/openai-codex-responses.js +136 -68
  35. package/dist/api/openai-codex-responses.js.map +1 -1
  36. package/dist/api/openai-completions.d.ts +8 -8
  37. package/dist/api/openai-completions.d.ts.map +1 -1
  38. package/dist/api/openai-completions.js +230 -54
  39. package/dist/api/openai-completions.js.map +1 -1
  40. package/dist/api/openai-responses-shared.d.ts +8 -1
  41. package/dist/api/openai-responses-shared.d.ts.map +1 -1
  42. package/dist/api/openai-responses-shared.js +233 -67
  43. package/dist/api/openai-responses-shared.js.map +1 -1
  44. package/dist/api/openai-responses.d.ts +1 -0
  45. package/dist/api/openai-responses.d.ts.map +1 -1
  46. package/dist/api/openai-responses.js +66 -18
  47. package/dist/api/openai-responses.js.map +1 -1
  48. package/dist/api/openrouter-images.d.ts.map +1 -1
  49. package/dist/api/openrouter-images.js +11 -5
  50. package/dist/api/openrouter-images.js.map +1 -1
  51. package/dist/api/pi-messages.d.ts +97 -0
  52. package/dist/api/pi-messages.d.ts.map +1 -0
  53. package/dist/api/pi-messages.js +305 -0
  54. package/dist/api/pi-messages.js.map +1 -0
  55. package/dist/api/pi-messages.lazy.d.ts +3 -0
  56. package/dist/api/pi-messages.lazy.d.ts.map +1 -0
  57. package/dist/api/pi-messages.lazy.js +3 -0
  58. package/dist/api/pi-messages.lazy.js.map +1 -0
  59. package/dist/api/simple-options.d.ts.map +1 -1
  60. package/dist/api/simple-options.js +1 -0
  61. package/dist/api/simple-options.js.map +1 -1
  62. package/dist/auth/credential-store.d.ts +2 -1
  63. package/dist/auth/credential-store.d.ts.map +1 -1
  64. package/dist/auth/credential-store.js +3 -0
  65. package/dist/auth/credential-store.js.map +1 -1
  66. package/dist/auth/helpers.d.ts +1 -0
  67. package/dist/auth/helpers.d.ts.map +1 -1
  68. package/dist/auth/helpers.js +7 -5
  69. package/dist/auth/helpers.js.map +1 -1
  70. package/dist/auth/oauth/anthropic.d.ts +9 -0
  71. package/dist/auth/oauth/anthropic.d.ts.map +1 -0
  72. package/dist/{utils → auth}/oauth/anthropic.js +51 -116
  73. package/dist/auth/oauth/anthropic.js.map +1 -0
  74. package/dist/auth/oauth/device-code.d.ts.map +1 -0
  75. package/dist/auth/oauth/device-code.js.map +1 -0
  76. package/dist/auth/oauth/github-copilot.d.ts +6 -0
  77. package/dist/auth/oauth/github-copilot.d.ts.map +1 -0
  78. package/dist/{utils → auth}/oauth/github-copilot.js +124 -107
  79. package/dist/auth/oauth/github-copilot.js.map +1 -0
  80. package/dist/auth/oauth/google-antigravity.d.ts +21 -0
  81. package/dist/auth/oauth/google-antigravity.d.ts.map +1 -0
  82. package/dist/{utils → auth}/oauth/google-antigravity.js +79 -79
  83. package/dist/auth/oauth/google-antigravity.js.map +1 -0
  84. package/dist/auth/oauth/google-gemini-cli.d.ts +21 -0
  85. package/dist/auth/oauth/google-gemini-cli.d.ts.map +1 -0
  86. package/dist/{utils → auth}/oauth/google-gemini-cli.js +79 -79
  87. package/dist/auth/oauth/google-gemini-cli.js.map +1 -0
  88. package/dist/auth/oauth/kimi-coding.d.ts +10 -0
  89. package/dist/auth/oauth/kimi-coding.d.ts.map +1 -0
  90. package/dist/auth/oauth/kimi-coding.js +249 -0
  91. package/dist/auth/oauth/kimi-coding.js.map +1 -0
  92. package/dist/auth/oauth/load.d.ts +33 -0
  93. package/dist/auth/oauth/load.d.ts.map +1 -0
  94. package/dist/auth/oauth/load.js +74 -0
  95. package/dist/auth/oauth/load.js.map +1 -0
  96. package/dist/auth/oauth/oauth-page.d.ts.map +1 -0
  97. package/dist/auth/oauth/oauth-page.js.map +1 -0
  98. package/dist/auth/oauth/openai-codex.d.ts +9 -0
  99. package/dist/auth/oauth/openai-codex.d.ts.map +1 -0
  100. package/dist/{utils → auth}/oauth/openai-codex.js +61 -155
  101. package/dist/auth/oauth/openai-codex.js.map +1 -0
  102. package/dist/auth/oauth/opencode-go.d.ts +14 -0
  103. package/dist/auth/oauth/opencode-go.d.ts.map +1 -0
  104. package/dist/auth/oauth/opencode-go.js +41 -0
  105. package/dist/auth/oauth/opencode-go.js.map +1 -0
  106. package/dist/auth/oauth/openrouter.d.ts +15 -0
  107. package/dist/auth/oauth/openrouter.d.ts.map +1 -0
  108. package/dist/auth/oauth/openrouter.js +277 -0
  109. package/dist/auth/oauth/openrouter.js.map +1 -0
  110. package/dist/auth/oauth/pkce.d.ts.map +1 -0
  111. package/dist/auth/oauth/pkce.js.map +1 -0
  112. package/dist/auth/oauth/radius.d.ts +17 -0
  113. package/dist/auth/oauth/radius.d.ts.map +1 -0
  114. package/dist/auth/oauth/radius.js +318 -0
  115. package/dist/auth/oauth/radius.js.map +1 -0
  116. package/dist/auth/oauth/xai.d.ts +17 -0
  117. package/dist/auth/oauth/xai.d.ts.map +1 -0
  118. package/dist/{utils → auth}/oauth/xai.js +54 -89
  119. package/dist/auth/oauth/xai.js.map +1 -0
  120. package/dist/auth/resolve.d.ts +4 -4
  121. package/dist/auth/resolve.d.ts.map +1 -1
  122. package/dist/auth/resolve.js +38 -17
  123. package/dist/auth/resolve.js.map +1 -1
  124. package/dist/auth/types.d.ts +49 -10
  125. package/dist/auth/types.d.ts.map +1 -1
  126. package/dist/auth/types.js.map +1 -1
  127. package/dist/bun-oauth.d.ts +3 -0
  128. package/dist/bun-oauth.d.ts.map +1 -0
  129. package/dist/bun-oauth.js +27 -0
  130. package/dist/bun-oauth.js.map +1 -0
  131. package/dist/cli.js +58 -76
  132. package/dist/cli.js.map +1 -1
  133. package/dist/compat/extension-oauth-types.d.ts +39 -0
  134. package/dist/compat/extension-oauth-types.d.ts.map +1 -0
  135. package/dist/compat/extension-oauth-types.js +2 -0
  136. package/dist/compat/extension-oauth-types.js.map +1 -0
  137. package/dist/compat.d.ts +2 -0
  138. package/dist/compat.d.ts.map +1 -1
  139. package/dist/compat.js +25 -8
  140. package/dist/compat.js.map +1 -1
  141. package/dist/env-api-keys.d.ts +3 -0
  142. package/dist/env-api-keys.d.ts.map +1 -1
  143. package/dist/env-api-keys.js +12 -3
  144. package/dist/env-api-keys.js.map +1 -1
  145. package/dist/image-models.generated.d.ts +75 -0
  146. package/dist/image-models.generated.d.ts.map +1 -1
  147. package/dist/image-models.generated.js +251 -176
  148. package/dist/image-models.generated.js.map +1 -1
  149. package/dist/images-models.d.ts +4 -2
  150. package/dist/images-models.d.ts.map +1 -1
  151. package/dist/images-models.js +5 -4
  152. package/dist/images-models.js.map +1 -1
  153. package/dist/index.d.ts +6 -2
  154. package/dist/index.d.ts.map +1 -1
  155. package/dist/index.js +3 -0
  156. package/dist/index.js.map +1 -1
  157. package/dist/model-catalog.d.ts +17 -0
  158. package/dist/model-catalog.d.ts.map +1 -0
  159. package/dist/model-catalog.js +4 -0
  160. package/dist/model-catalog.js.map +1 -0
  161. package/dist/models-store.d.ts +32 -0
  162. package/dist/models-store.d.ts.map +1 -0
  163. package/dist/models-store.js +16 -0
  164. package/dist/models-store.js.map +1 -0
  165. package/dist/models.d.ts +66 -30
  166. package/dist/models.d.ts.map +1 -1
  167. package/dist/models.generated.d.ts +74 -22035
  168. package/dist/models.generated.d.ts.map +1 -1
  169. package/dist/models.generated.js +4 -0
  170. package/dist/models.generated.js.map +1 -1
  171. package/dist/models.js +213 -29
  172. package/dist/models.js.map +1 -1
  173. package/dist/oauth.d.ts +2 -1
  174. package/dist/oauth.d.ts.map +1 -1
  175. package/dist/oauth.js +1 -1
  176. package/dist/oauth.js.map +1 -1
  177. package/dist/providers/all.d.ts +13 -6
  178. package/dist/providers/all.d.ts.map +1 -1
  179. package/dist/providers/all.js +13 -0
  180. package/dist/providers/all.js.map +1 -1
  181. package/dist/providers/amazon-bedrock.d.ts.map +1 -1
  182. package/dist/providers/amazon-bedrock.js +54 -8
  183. package/dist/providers/amazon-bedrock.js.map +1 -1
  184. package/dist/providers/amazon-bedrock.models.d.ts +3 -1931
  185. package/dist/providers/amazon-bedrock.models.d.ts.map +1 -1
  186. package/dist/providers/amazon-bedrock.models.js +3 -1838
  187. package/dist/providers/amazon-bedrock.models.js.map +1 -1
  188. package/dist/providers/ant-ling.models.d.ts +3 -85
  189. package/dist/providers/ant-ling.models.d.ts.map +1 -1
  190. package/dist/providers/ant-ling.models.js +3 -57
  191. package/dist/providers/ant-ling.models.js.map +1 -1
  192. package/dist/providers/anthropic.d.ts.map +1 -1
  193. package/dist/providers/anthropic.js +31 -4
  194. package/dist/providers/anthropic.js.map +1 -1
  195. package/dist/providers/anthropic.models.d.ts +3 -283
  196. package/dist/providers/anthropic.models.d.ts.map +1 -1
  197. package/dist/providers/anthropic.models.js +3 -252
  198. package/dist/providers/anthropic.models.js.map +1 -1
  199. package/dist/providers/azure-openai-responses.models.d.ts +3 -886
  200. package/dist/providers/azure-openai-responses.models.d.ts.map +1 -1
  201. package/dist/providers/azure-openai-responses.models.js +3 -811
  202. package/dist/providers/azure-openai-responses.models.js.map +1 -1
  203. package/dist/providers/cerebras.models.d.ts +3 -65
  204. package/dist/providers/cerebras.models.d.ts.map +1 -1
  205. package/dist/providers/cerebras.models.js +3 -56
  206. package/dist/providers/cerebras.models.js.map +1 -1
  207. package/dist/providers/cloudflare-ai-gateway.d.ts.map +1 -1
  208. package/dist/providers/cloudflare-ai-gateway.js +4 -3
  209. package/dist/providers/cloudflare-ai-gateway.js.map +1 -1
  210. package/dist/providers/cloudflare-ai-gateway.models.d.ts +3 -795
  211. package/dist/providers/cloudflare-ai-gateway.models.d.ts.map +1 -1
  212. package/dist/providers/cloudflare-ai-gateway.models.js +3 -683
  213. package/dist/providers/cloudflare-ai-gateway.models.js.map +1 -1
  214. package/dist/providers/cloudflare-auth.d.ts.map +1 -1
  215. package/dist/providers/cloudflare-auth.js +22 -26
  216. package/dist/providers/cloudflare-auth.js.map +1 -1
  217. package/dist/providers/cloudflare-stream.d.ts +8 -0
  218. package/dist/providers/cloudflare-stream.d.ts.map +1 -0
  219. package/dist/providers/cloudflare-stream.js +21 -0
  220. package/dist/providers/cloudflare-stream.js.map +1 -0
  221. package/dist/providers/cloudflare-workers-ai.d.ts.map +1 -1
  222. package/dist/providers/cloudflare-workers-ai.js +2 -1
  223. package/dist/providers/cloudflare-workers-ai.js.map +1 -1
  224. package/dist/providers/cloudflare-workers-ai.models.d.ts +3 -301
  225. package/dist/providers/cloudflare-workers-ai.models.d.ts.map +1 -1
  226. package/dist/providers/cloudflare-workers-ai.models.js +3 -236
  227. package/dist/providers/cloudflare-workers-ai.models.js.map +1 -1
  228. package/dist/providers/data/.manifest.json +1 -0
  229. package/dist/providers/data/amazon-bedrock.json +1 -0
  230. package/dist/providers/data/ant-ling.json +1 -0
  231. package/dist/providers/data/anthropic.json +1 -0
  232. package/dist/providers/data/azure-openai-responses.json +1 -0
  233. package/dist/providers/data/cerebras.json +1 -0
  234. package/dist/providers/data/cloudflare-ai-gateway.json +1 -0
  235. package/dist/providers/data/cloudflare-workers-ai.json +1 -0
  236. package/dist/providers/data/deepseek.json +1 -0
  237. package/dist/providers/data/fireworks.json +1 -0
  238. package/dist/providers/data/github-copilot.json +1 -0
  239. package/dist/providers/data/google-vertex.json +1 -0
  240. package/dist/providers/data/google.json +1 -0
  241. package/dist/providers/data/groq.json +1 -0
  242. package/dist/providers/data/huggingface.json +1 -0
  243. package/dist/providers/data/kimi-coding.json +1 -0
  244. package/dist/providers/data/minimax-cn.json +1 -0
  245. package/dist/providers/data/minimax.json +1 -0
  246. package/dist/providers/data/mistral.json +1 -0
  247. package/dist/providers/data/moonshotai-cn.json +1 -0
  248. package/dist/providers/data/moonshotai.json +1 -0
  249. package/dist/providers/data/nvidia.json +1 -0
  250. package/dist/providers/data/openai-codex.json +1 -0
  251. package/dist/providers/data/openai.json +1 -0
  252. package/dist/providers/data/opencode-go.json +1 -0
  253. package/dist/providers/data/opencode.json +1 -0
  254. package/dist/providers/data/openrouter.json +1 -0
  255. package/dist/providers/data/qwen-token-plan-cn.json +1 -0
  256. package/dist/providers/data/qwen-token-plan.json +1 -0
  257. package/dist/providers/data/together.json +1 -0
  258. package/dist/providers/data/vercel-ai-gateway.json +1 -0
  259. package/dist/providers/data/xai.json +1 -0
  260. package/dist/providers/data/xiaomi-token-plan-ams.json +1 -0
  261. package/dist/providers/data/xiaomi-token-plan-cn.json +1 -0
  262. package/dist/providers/data/xiaomi-token-plan-sgp.json +1 -0
  263. package/dist/providers/data/xiaomi.json +1 -0
  264. package/dist/providers/data/zai-coding-cn.json +1 -0
  265. package/dist/providers/data/zai.json +1 -0
  266. package/dist/providers/deepseek.models.d.ts +3 -62
  267. package/dist/providers/deepseek.models.d.ts.map +1 -1
  268. package/dist/providers/deepseek.models.js +3 -40
  269. package/dist/providers/deepseek.models.js.map +1 -1
  270. package/dist/providers/faux.d.ts.map +1 -1
  271. package/dist/providers/faux.js +4 -1
  272. package/dist/providers/faux.js.map +1 -1
  273. package/dist/providers/fireworks.models.d.ts +3 -380
  274. package/dist/providers/fireworks.models.d.ts.map +1 -1
  275. package/dist/providers/fireworks.models.js +3 -292
  276. package/dist/providers/fireworks.models.js.map +1 -1
  277. package/dist/providers/github-copilot.d.ts.map +1 -1
  278. package/dist/providers/github-copilot.js +11 -1
  279. package/dist/providers/github-copilot.js.map +1 -1
  280. package/dist/providers/github-copilot.models.d.ts +3 -790
  281. package/dist/providers/github-copilot.models.d.ts.map +1 -1
  282. package/dist/providers/github-copilot.models.js +3 -538
  283. package/dist/providers/github-copilot.models.js.map +1 -1
  284. package/dist/providers/google-vertex.d.ts.map +1 -1
  285. package/dist/providers/google-vertex.js +56 -5
  286. package/dist/providers/google-vertex.js.map +1 -1
  287. package/dist/providers/google-vertex.models.d.ts +3 -201
  288. package/dist/providers/google-vertex.models.d.ts.map +1 -1
  289. package/dist/providers/google-vertex.models.js +3 -179
  290. package/dist/providers/google-vertex.models.js.map +1 -1
  291. package/dist/providers/google.models.d.ts +3 -327
  292. package/dist/providers/google.models.d.ts.map +1 -1
  293. package/dist/providers/google.models.js +3 -285
  294. package/dist/providers/google.models.js.map +1 -1
  295. package/dist/providers/groq.models.d.ts +3 -127
  296. package/dist/providers/groq.models.d.ts.map +1 -1
  297. package/dist/providers/groq.models.js +3 -122
  298. package/dist/providers/groq.models.js.map +1 -1
  299. package/dist/providers/huggingface.models.d.ts +3 -982
  300. package/dist/providers/huggingface.models.d.ts.map +1 -1
  301. package/dist/providers/huggingface.models.js +3 -884
  302. package/dist/providers/huggingface.models.js.map +1 -1
  303. package/dist/providers/kimi-coding.d.ts.map +1 -1
  304. package/dist/providers/kimi-coding.js +10 -2
  305. package/dist/providers/kimi-coding.js.map +1 -1
  306. package/dist/providers/kimi-coding.models.d.ts +3 -62
  307. package/dist/providers/kimi-coding.models.d.ts.map +1 -1
  308. package/dist/providers/kimi-coding.models.js +3 -56
  309. package/dist/providers/kimi-coding.models.js.map +1 -1
  310. package/dist/providers/minimax-cn.models.d.ts +3 -53
  311. package/dist/providers/minimax-cn.models.d.ts.map +1 -1
  312. package/dist/providers/minimax-cn.models.js +3 -53
  313. package/dist/providers/minimax-cn.models.js.map +1 -1
  314. package/dist/providers/minimax.models.d.ts +3 -53
  315. package/dist/providers/minimax.models.d.ts.map +1 -1
  316. package/dist/providers/minimax.models.js +3 -53
  317. package/dist/providers/minimax.models.js.map +1 -1
  318. package/dist/providers/mistral.models.d.ts +3 -512
  319. package/dist/providers/mistral.models.d.ts.map +1 -1
  320. package/dist/providers/mistral.models.js +3 -512
  321. package/dist/providers/mistral.models.js.map +1 -1
  322. package/dist/providers/moonshotai-cn.models.d.ts +3 -233
  323. package/dist/providers/moonshotai-cn.models.d.ts.map +1 -1
  324. package/dist/providers/moonshotai-cn.models.js +3 -166
  325. package/dist/providers/moonshotai-cn.models.js.map +1 -1
  326. package/dist/providers/moonshotai.models.d.ts +3 -233
  327. package/dist/providers/moonshotai.models.d.ts.map +1 -1
  328. package/dist/providers/moonshotai.models.js +3 -166
  329. package/dist/providers/moonshotai.models.js.map +1 -1
  330. package/dist/providers/nvidia.models.d.ts +3 -562
  331. package/dist/providers/nvidia.models.d.ts.map +1 -1
  332. package/dist/providers/nvidia.models.js +3 -382
  333. package/dist/providers/nvidia.models.js.map +1 -1
  334. package/dist/providers/openai-codex.d.ts.map +1 -1
  335. package/dist/providers/openai-codex.js +1 -1
  336. package/dist/providers/openai-codex.js.map +1 -1
  337. package/dist/providers/openai-codex.models.d.ts +3 -187
  338. package/dist/providers/openai-codex.models.d.ts.map +1 -1
  339. package/dist/providers/openai-codex.models.js +3 -133
  340. package/dist/providers/openai-codex.models.js.map +1 -1
  341. package/dist/providers/openai.models.d.ts +3 -936
  342. package/dist/providers/openai.models.d.ts.map +1 -1
  343. package/dist/providers/openai.models.js +3 -818
  344. package/dist/providers/openai.models.js.map +1 -1
  345. package/dist/providers/opencode-go.d.ts +1 -1
  346. package/dist/providers/opencode-go.d.ts.map +1 -1
  347. package/dist/providers/opencode-go.js +15 -3
  348. package/dist/providers/opencode-go.js.map +1 -1
  349. package/dist/providers/opencode-go.models.d.ts +3 -308
  350. package/dist/providers/opencode-go.models.d.ts.map +1 -1
  351. package/dist/providers/opencode-go.models.js +3 -237
  352. package/dist/providers/opencode-go.models.js.map +1 -1
  353. package/dist/providers/opencode.models.d.ts +3 -1183
  354. package/dist/providers/opencode.models.d.ts.map +1 -1
  355. package/dist/providers/opencode.models.js +3 -977
  356. package/dist/providers/opencode.models.js.map +1 -1
  357. package/dist/providers/openrouter-images.d.ts.map +1 -1
  358. package/dist/providers/openrouter-images.js +10 -2
  359. package/dist/providers/openrouter-images.js.map +1 -1
  360. package/dist/providers/openrouter.d.ts.map +1 -1
  361. package/dist/providers/openrouter.js +10 -2
  362. package/dist/providers/openrouter.js.map +1 -1
  363. package/dist/providers/openrouter.models.d.ts +3 -5705
  364. package/dist/providers/openrouter.models.d.ts.map +1 -1
  365. package/dist/providers/openrouter.models.js +3 -4873
  366. package/dist/providers/openrouter.models.js.map +1 -1
  367. package/dist/providers/qwen-token-plan-cn.d.ts +3 -0
  368. package/dist/providers/qwen-token-plan-cn.d.ts.map +1 -0
  369. package/dist/providers/qwen-token-plan-cn.js +15 -0
  370. package/dist/providers/qwen-token-plan-cn.js.map +1 -0
  371. package/dist/providers/qwen-token-plan-cn.models.d.ts +4 -0
  372. package/dist/providers/qwen-token-plan-cn.models.d.ts.map +1 -0
  373. package/dist/providers/qwen-token-plan-cn.models.js +6 -0
  374. package/dist/providers/qwen-token-plan-cn.models.js.map +1 -0
  375. package/dist/providers/qwen-token-plan.d.ts +3 -0
  376. package/dist/providers/qwen-token-plan.d.ts.map +1 -0
  377. package/dist/providers/qwen-token-plan.js +15 -0
  378. package/dist/providers/qwen-token-plan.js.map +1 -0
  379. package/dist/providers/qwen-token-plan.models.d.ts +4 -0
  380. package/dist/providers/qwen-token-plan.models.d.ts.map +1 -0
  381. package/dist/providers/qwen-token-plan.models.js +6 -0
  382. package/dist/providers/qwen-token-plan.models.js.map +1 -0
  383. package/dist/providers/radius-config.d.ts +26 -0
  384. package/dist/providers/radius-config.d.ts.map +1 -0
  385. package/dist/providers/radius-config.js +63 -0
  386. package/dist/providers/radius-config.js.map +1 -0
  387. package/dist/providers/radius.d.ts +9 -0
  388. package/dist/providers/radius.d.ts.map +1 -0
  389. package/dist/providers/radius.js +54 -0
  390. package/dist/providers/radius.js.map +1 -0
  391. package/dist/providers/together.models.d.ts +3 -597
  392. package/dist/providers/together.models.d.ts.map +1 -1
  393. package/dist/providers/together.models.js +3 -377
  394. package/dist/providers/together.models.js.map +1 -1
  395. package/dist/providers/vercel-ai-gateway.models.d.ts +3 -3391
  396. package/dist/providers/vercel-ai-gateway.models.d.ts.map +1 -1
  397. package/dist/providers/vercel-ai-gateway.models.js +3 -3327
  398. package/dist/providers/vercel-ai-gateway.models.js.map +1 -1
  399. package/dist/providers/xai.d.ts +1 -1
  400. package/dist/providers/xai.d.ts.map +1 -1
  401. package/dist/providers/xai.js +8 -4
  402. package/dist/providers/xai.js.map +1 -1
  403. package/dist/providers/xai.models.d.ts +3 -178
  404. package/dist/providers/xai.models.d.ts.map +1 -1
  405. package/dist/providers/xai.models.js +3 -146
  406. package/dist/providers/xai.models.js.map +1 -1
  407. package/dist/providers/xiaomi-token-plan-ams.models.d.ts +3 -65
  408. package/dist/providers/xiaomi-token-plan-ams.models.d.ts.map +1 -1
  409. package/dist/providers/xiaomi-token-plan-ams.models.js +3 -56
  410. package/dist/providers/xiaomi-token-plan-ams.models.js.map +1 -1
  411. package/dist/providers/xiaomi-token-plan-cn.models.d.ts +3 -65
  412. package/dist/providers/xiaomi-token-plan-cn.models.d.ts.map +1 -1
  413. package/dist/providers/xiaomi-token-plan-cn.models.js +3 -56
  414. package/dist/providers/xiaomi-token-plan-cn.models.js.map +1 -1
  415. package/dist/providers/xiaomi-token-plan-sgp.models.d.ts +3 -65
  416. package/dist/providers/xiaomi-token-plan-sgp.models.d.ts.map +1 -1
  417. package/dist/providers/xiaomi-token-plan-sgp.models.js +3 -56
  418. package/dist/providers/xiaomi-token-plan-sgp.models.js.map +1 -1
  419. package/dist/providers/xiaomi.models.d.ts +3 -128
  420. package/dist/providers/xiaomi.models.d.ts.map +1 -1
  421. package/dist/providers/xiaomi.models.js +3 -110
  422. package/dist/providers/xiaomi.models.js.map +1 -1
  423. package/dist/providers/zai-coding-cn.models.d.ts +3 -152
  424. package/dist/providers/zai-coding-cn.models.d.ts.map +1 -1
  425. package/dist/providers/zai-coding-cn.models.js +3 -111
  426. package/dist/providers/zai-coding-cn.models.js.map +1 -1
  427. package/dist/providers/zai.models.d.ts +3 -152
  428. package/dist/providers/zai.models.d.ts.map +1 -1
  429. package/dist/providers/zai.models.js +3 -111
  430. package/dist/providers/zai.models.js.map +1 -1
  431. package/dist/types.d.ts +77 -8
  432. package/dist/types.d.ts.map +1 -1
  433. package/dist/types.js.map +1 -1
  434. package/dist/utils/deferred-tools.d.ts +9 -0
  435. package/dist/utils/deferred-tools.d.ts.map +1 -0
  436. package/dist/utils/deferred-tools.js +36 -0
  437. package/dist/utils/deferred-tools.js.map +1 -0
  438. package/dist/utils/error-body.d.ts.map +1 -1
  439. package/dist/utils/error-body.js +31 -7
  440. package/dist/utils/error-body.js.map +1 -1
  441. package/dist/utils/estimate.d.ts.map +1 -1
  442. package/dist/utils/estimate.js +18 -5
  443. package/dist/utils/estimate.js.map +1 -1
  444. package/dist/utils/node-http-proxy.d.ts.map +1 -1
  445. package/dist/utils/node-http-proxy.js +53 -12
  446. package/dist/utils/node-http-proxy.js.map +1 -1
  447. package/dist/utils/overflow.d.ts +1 -0
  448. package/dist/utils/overflow.d.ts.map +1 -1
  449. package/dist/utils/overflow.js +3 -0
  450. package/dist/utils/overflow.js.map +1 -1
  451. package/dist/utils/pi-user-agent.d.ts +2 -0
  452. package/dist/utils/pi-user-agent.d.ts.map +1 -0
  453. package/dist/utils/pi-user-agent.js +12 -0
  454. package/dist/utils/pi-user-agent.js.map +1 -0
  455. package/dist/utils/provider-retry.d.ts +16 -0
  456. package/dist/utils/provider-retry.d.ts.map +1 -0
  457. package/dist/utils/provider-retry.js +94 -0
  458. package/dist/utils/provider-retry.js.map +1 -0
  459. package/dist/utils/retry.d.ts +41 -0
  460. package/dist/utils/retry.d.ts.map +1 -1
  461. package/dist/utils/retry.js +84 -0
  462. package/dist/utils/retry.js.map +1 -1
  463. package/dist/utils/sleep.d.ts +2 -0
  464. package/dist/utils/sleep.d.ts.map +1 -0
  465. package/dist/utils/sleep.js +15 -0
  466. package/dist/utils/sleep.js.map +1 -0
  467. package/dist/utils/text.d.ts +6 -0
  468. package/dist/utils/text.d.ts.map +1 -0
  469. package/dist/utils/text.js +10 -0
  470. package/dist/utils/text.js.map +1 -0
  471. package/dist/utils/uuid.d.ts +3 -0
  472. package/dist/utils/uuid.d.ts.map +1 -0
  473. package/dist/utils/uuid.js +47 -0
  474. package/dist/utils/uuid.js.map +1 -0
  475. package/dist/utils/validation.d.ts.map +1 -1
  476. package/dist/utils/validation.js +6 -0
  477. package/dist/utils/validation.js.map +1 -1
  478. package/package.json +12 -6
  479. package/dist/utils/oauth/anthropic.d.ts +0 -27
  480. package/dist/utils/oauth/anthropic.d.ts.map +0 -1
  481. package/dist/utils/oauth/anthropic.js.map +0 -1
  482. package/dist/utils/oauth/device-code.d.ts.map +0 -1
  483. package/dist/utils/oauth/device-code.js.map +0 -1
  484. package/dist/utils/oauth/github-copilot.d.ts +0 -32
  485. package/dist/utils/oauth/github-copilot.d.ts.map +0 -1
  486. package/dist/utils/oauth/github-copilot.js.map +0 -1
  487. package/dist/utils/oauth/google-antigravity.d.ts +0 -26
  488. package/dist/utils/oauth/google-antigravity.d.ts.map +0 -1
  489. package/dist/utils/oauth/google-antigravity.js.map +0 -1
  490. package/dist/utils/oauth/google-gemini-cli.d.ts +0 -26
  491. package/dist/utils/oauth/google-gemini-cli.d.ts.map +0 -1
  492. package/dist/utils/oauth/google-gemini-cli.js.map +0 -1
  493. package/dist/utils/oauth/index.d.ts +0 -60
  494. package/dist/utils/oauth/index.d.ts.map +0 -1
  495. package/dist/utils/oauth/index.js +0 -130
  496. package/dist/utils/oauth/index.js.map +0 -1
  497. package/dist/utils/oauth/load.d.ts +0 -6
  498. package/dist/utils/oauth/load.d.ts.map +0 -1
  499. package/dist/utils/oauth/load.js +0 -23
  500. package/dist/utils/oauth/load.js.map +0 -1
  501. package/dist/utils/oauth/oauth-page.d.ts.map +0 -1
  502. package/dist/utils/oauth/oauth-page.js.map +0 -1
  503. package/dist/utils/oauth/openai-codex.d.ts +0 -45
  504. package/dist/utils/oauth/openai-codex.d.ts.map +0 -1
  505. package/dist/utils/oauth/openai-codex.js.map +0 -1
  506. package/dist/utils/oauth/opencode-go.d.ts +0 -23
  507. package/dist/utils/oauth/opencode-go.d.ts.map +0 -1
  508. package/dist/utils/oauth/opencode-go.js +0 -46
  509. package/dist/utils/oauth/opencode-go.js.map +0 -1
  510. package/dist/utils/oauth/pkce.d.ts.map +0 -1
  511. package/dist/utils/oauth/pkce.js.map +0 -1
  512. package/dist/utils/oauth/types.d.ts +0 -64
  513. package/dist/utils/oauth/types.d.ts.map +0 -1
  514. package/dist/utils/oauth/types.js +0 -2
  515. package/dist/utils/oauth/types.js.map +0 -1
  516. package/dist/utils/oauth/xai.d.ts +0 -34
  517. package/dist/utils/oauth/xai.d.ts.map +0 -1
  518. package/dist/utils/oauth/xai.js.map +0 -1
  519. /package/dist/{utils → auth}/oauth/device-code.d.ts +0 -0
  520. /package/dist/{utils → auth}/oauth/device-code.js +0 -0
  521. /package/dist/{utils → auth}/oauth/oauth-page.d.ts +0 -0
  522. /package/dist/{utils → auth}/oauth/oauth-page.js +0 -0
  523. /package/dist/{utils → auth}/oauth/pkce.d.ts +0 -0
  524. /package/dist/{utils → auth}/oauth/pkce.js +0 -0
@@ -1,19 +1,15 @@
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";
4
+ import { splitDeferredTools } from "../utils/deferred-tools.js";
12
5
  import { appendAssistantMessageDiagnostic, createAssistantMessageDiagnostic, formatThrownValue, } from "../utils/diagnostics.js";
13
6
  import { formatProviderError, normalizeProviderError } from "../utils/error-body.js";
14
7
  import { AssistantMessageEventStream } from "../utils/event-stream.js";
15
8
  import { headersToRecord } from "../utils/headers.js";
16
9
  import { resolveHttpProxyUrlForTarget } from "../utils/node-http-proxy.js";
10
+ import { getPiUserAgent } from "../utils/pi-user-agent.js";
11
+ import { uuidv7 } from "../utils/uuid.js";
12
+ import { createGrammarToolInputProperties } from "./constrained-sampling.js";
17
13
  import { clampOpenAIPromptCacheKey } from "./openai-prompt-cache.js";
18
14
  import { convertResponsesMessages, convertResponsesTools, processResponsesStream } from "./openai-responses-shared.js";
19
15
  import { buildBaseOptions } from "./simple-options.js";
@@ -32,6 +28,7 @@ const REQUEST_COMPRESSION_ZSTD_LEVEL = 3;
32
28
  const CODEX_TOOL_CALL_PROVIDERS = new Set(["openai", "openai-codex", "opencode"]);
33
29
  const WEBSOCKET_MESSAGE_TOO_BIG_CLOSE_CODE = 1009;
34
30
  const WEBSOCKET_CONNECTION_LIMIT_REACHED_CODE = "websocket_connection_limit_reached";
31
+ const PREVIOUS_RESPONSE_NOT_FOUND_CODE = "previous_response_not_found";
35
32
  const CODEX_RESPONSE_STATUSES = new Set([
36
33
  "completed",
37
34
  "incomplete",
@@ -40,6 +37,14 @@ const CODEX_RESPONSE_STATUSES = new Set([
40
37
  "queued",
41
38
  "in_progress",
42
39
  ]);
40
+ function assertSuccessfulOutput(output) {
41
+ if (output.stopReason === "pending") {
42
+ throw new Error("Codex stream ended without a stop reason");
43
+ }
44
+ if (output.stopReason === "error" || output.stopReason === "aborted") {
45
+ throw new Error(output.errorMessage || "An unknown error occurred");
46
+ }
47
+ }
43
48
  // ============================================================================
44
49
  // Retry Helpers
45
50
  // ============================================================================
@@ -77,9 +82,14 @@ function getRetryAfterDelayMs(headers) {
77
82
  }
78
83
  return undefined;
79
84
  }
80
- function capRetryDelayMs(delayMs, options) {
85
+ class RetryDelayExceededError extends Error {
86
+ }
87
+ function validateRetryDelayMs(delayMs, options) {
81
88
  const maxRetryDelayMs = options?.maxRetryDelayMs ?? DEFAULT_MAX_RETRY_DELAY_MS;
82
- return maxRetryDelayMs > 0 ? Math.min(delayMs, maxRetryDelayMs) : delayMs;
89
+ if (maxRetryDelayMs > 0 && delayMs > maxRetryDelayMs) {
90
+ throw new RetryDelayExceededError(`Server requested ${Math.ceil(delayMs / 1000)}s retry delay (max: ${Math.ceil(maxRetryDelayMs / 1000)}s)`);
91
+ }
92
+ return delayMs;
83
93
  }
84
94
  function sleep(ms, signal) {
85
95
  return new Promise((resolve, reject) => {
@@ -150,7 +160,7 @@ export const stream = (model, context, options) => {
150
160
  totalTokens: 0,
151
161
  cost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0, total: 0 },
152
162
  },
153
- stopReason: "stop",
163
+ stopReason: "pending",
154
164
  timestamp: Date.now(),
155
165
  };
156
166
  try {
@@ -159,34 +169,44 @@ export const stream = (model, context, options) => {
159
169
  throw new Error(`No API key for provider: ${model.provider}`);
160
170
  }
161
171
  const accountId = extractAccountId(apiKey);
162
- let body = buildRequestBody(model, context, options);
172
+ const grammarToolInputProperties = createGrammarToolInputProperties(context.tools, model.compat?.supportsOpenAIGrammarTools ?? false);
173
+ const cacheSessionId = options?.cacheRetention === "none" ? undefined : options?.sessionId;
174
+ const codexSessionId = clampOpenAIPromptCacheKey(cacheSessionId);
175
+ let body = buildRequestBody(model, context, options, codexSessionId, grammarToolInputProperties);
163
176
  const nextBody = await options?.onPayload?.(body, model);
164
177
  if (nextBody !== undefined) {
165
178
  body = nextBody;
166
179
  }
167
- const websocketRequestId = options?.sessionId || createCodexRequestId();
168
- const sseHeaders = buildSSEHeaders(model.headers, options?.headers, accountId, apiKey, options?.sessionId);
180
+ const websocketRequestId = codexSessionId || uuidv7();
181
+ const sseHeaders = buildSSEHeaders(model.headers, options?.headers, accountId, apiKey, codexSessionId);
169
182
  const websocketHeaders = buildWebSocketHeaders(model.headers, options?.headers, accountId, apiKey, websocketRequestId);
170
183
  const bodyJson = JSON.stringify(body);
171
184
  const httpTimeoutMs = normalizeTimeoutMs(options?.timeoutMs);
172
185
  const websocketConnectTimeoutMs = normalizeTimeoutMs(options?.websocketConnectTimeoutMs);
173
186
  const transport = options?.transport || "auto";
174
- const websocketDisabledForSession = transport !== "sse" && isWebSocketSseFallbackActive(options?.sessionId);
187
+ let startEmitted = false;
188
+ const websocketDisabledForSession = transport !== "sse" && isWebSocketSseFallbackActive(cacheSessionId);
175
189
  if (websocketDisabledForSession) {
176
- recordWebSocketSseFallback(options?.sessionId);
190
+ recordWebSocketSseFallback(cacheSessionId);
177
191
  }
178
192
  if (transport !== "sse" && !websocketDisabledForSession) {
179
193
  let websocketStarted = false;
180
194
  let retriedWebSocketConnectionLimit = false;
195
+ let retriedMissingWebSocketContinuation = false;
181
196
  while (true) {
182
197
  websocketStarted = false;
183
198
  try {
184
199
  await processWebSocketStream(resolveCodexWebSocketUrl(model.baseUrl), body, websocketHeaders, output, stream, model, () => {
185
200
  websocketStarted = true;
186
- }, httpTimeoutMs, websocketConnectTimeoutMs, options);
201
+ if (!startEmitted) {
202
+ startEmitted = true;
203
+ stream.push({ type: "start", partial: output });
204
+ }
205
+ }, httpTimeoutMs, websocketConnectTimeoutMs, cacheSessionId, accountId, grammarToolInputProperties, options);
187
206
  if (options?.signal?.aborted) {
188
207
  throw new Error("Request was aborted");
189
208
  }
209
+ assertSuccessfulOutput(output);
190
210
  stream.push({
191
211
  type: "done",
192
212
  reason: output.stopReason,
@@ -198,6 +218,11 @@ export const stream = (model, context, options) => {
198
218
  catch (error) {
199
219
  const aborted = options?.signal?.aborted;
200
220
  const connectionLimitBeforeStart = !websocketStarted && isWebSocketConnectionLimitReachedError(error);
221
+ const previousResponseNotFound = isPreviousResponseNotFoundError(error);
222
+ if (!aborted && previousResponseNotFound && !retriedMissingWebSocketContinuation) {
223
+ retriedMissingWebSocketContinuation = true;
224
+ continue;
225
+ }
201
226
  if (!aborted && connectionLimitBeforeStart && !retriedWebSocketConnectionLimit) {
202
227
  retriedWebSocketConnectionLimit = true;
203
228
  continue;
@@ -212,11 +237,11 @@ export const stream = (model, context, options) => {
212
237
  phase: websocketStarted ? "after_message_stream_start" : "before_message_stream_start",
213
238
  requestBytes: new TextEncoder().encode(bodyJson).byteLength,
214
239
  }));
215
- recordWebSocketFailure(options?.sessionId, error);
240
+ recordWebSocketFailure(cacheSessionId, error);
216
241
  if (websocketStarted) {
217
242
  throw error;
218
243
  }
219
- recordWebSocketSseFallback(options?.sessionId);
244
+ recordWebSocketSseFallback(cacheSessionId);
220
245
  break;
221
246
  }
222
247
  }
@@ -241,7 +266,7 @@ export const stream = (model, context, options) => {
241
266
  const headerTimeoutSignal = httpTimeoutMs !== undefined && httpTimeoutMs > 0 ? AbortSignal.timeout(httpTimeoutMs) : undefined;
242
267
  const combinedSignal = combineAbortSignals([options?.signal, headerTimeoutSignal]);
243
268
  try {
244
- response = await fetch(resolveCodexUrl(model.baseUrl), {
269
+ response = await (options?.fetch ?? globalThis.fetch)(resolveCodexUrl(model.baseUrl), {
245
270
  method: "POST",
246
271
  headers: sseHeaders,
247
272
  body: sseBody,
@@ -266,9 +291,7 @@ export const stream = (model, context, options) => {
266
291
  const retryAfterDelayMs = getRetryAfterDelayMs(response.headers);
267
292
  const delayMs = retryAfterDelayMs === undefined
268
293
  ? BASE_DELAY_MS * 2 ** attempt
269
- : response.status === 429
270
- ? capRetryDelayMs(retryAfterDelayMs, options)
271
- : retryAfterDelayMs;
294
+ : validateRetryDelayMs(retryAfterDelayMs, options);
272
295
  await sleep(delayMs, options?.signal);
273
296
  continue;
274
297
  }
@@ -288,7 +311,9 @@ export const stream = (model, context, options) => {
288
311
  }
289
312
  lastError = error instanceof Error ? error : new Error(String(error));
290
313
  // Network errors are retryable
291
- if (attempt < maxRetries && !lastError.message.includes("usage limit")) {
314
+ if (attempt < maxRetries &&
315
+ !(lastError instanceof RetryDelayExceededError) &&
316
+ !lastError.message.includes("usage limit")) {
292
317
  const delayMs = BASE_DELAY_MS * 2 ** attempt;
293
318
  await sleep(delayMs, options?.signal);
294
319
  continue;
@@ -302,18 +327,23 @@ export const stream = (model, context, options) => {
302
327
  if (!response.body) {
303
328
  throw new Error("No response body");
304
329
  }
305
- stream.push({ type: "start", partial: output });
306
- await processStream(response, output, stream, model, options);
330
+ if (!startEmitted) {
331
+ startEmitted = true;
332
+ stream.push({ type: "start", partial: output });
333
+ }
334
+ await processStream(response, output, stream, model, grammarToolInputProperties, options);
307
335
  if (options?.signal?.aborted) {
308
336
  throw new Error("Request was aborted");
309
337
  }
338
+ assertSuccessfulOutput(output);
310
339
  stream.push({ type: "done", reason: output.stopReason, message: output });
311
340
  stream.end();
312
341
  }
313
342
  catch (error) {
314
343
  for (const block of output.content) {
315
- // partialJson is only a streaming scratch buffer; never persist it.
344
+ // Streaming scratch buffers are only used during parsing; never persist them.
316
345
  delete block.partialJson;
346
+ delete block.customInput;
317
347
  }
318
348
  output.stopReason = options?.signal?.aborted ? "aborted" : "error";
319
349
  output.errorMessage = formatProviderError(normalizeProviderError(error));
@@ -328,7 +358,10 @@ export const streamSimple = (model, context, options) => {
328
358
  if (!apiKey) {
329
359
  throw new Error(`No API key for provider: ${model.provider}`);
330
360
  }
331
- const base = buildBaseOptions(model, context, options, apiKey);
361
+ const base = {
362
+ ...buildBaseOptions(model, context, options, apiKey),
363
+ toolChoice: options?.toolChoice,
364
+ };
332
365
  const clampedReasoning = options?.reasoning ? clampThinkingLevel(model, options.reasoning) : undefined;
333
366
  const reasoningEffort = clampedReasoning === "off" ? undefined : clampedReasoning;
334
367
  return stream(model, context, {
@@ -339,9 +372,19 @@ export const streamSimple = (model, context, options) => {
339
372
  // ============================================================================
340
373
  // Request Building
341
374
  // ============================================================================
342
- function buildRequestBody(model, context, options) {
375
+ function buildRequestBody(model, context, options, cacheSessionId, grammarToolInputProperties = createGrammarToolInputProperties(context.tools, model.compat?.supportsOpenAIGrammarTools ?? false)) {
376
+ const supportsStrictMode = model.compat?.supportsStrictMode ?? true;
377
+ const supportsOpenAIGrammarTools = model.compat?.supportsOpenAIGrammarTools ?? false;
378
+ const toolPlacement = splitDeferredTools(context, model.compat?.supportsToolSearch ?? false);
343
379
  const messages = convertResponsesMessages(model, context, CODEX_TOOL_CALL_PROVIDERS, {
344
380
  includeSystemPrompt: false,
381
+ grammarToolInputProperties,
382
+ deferredTools: toolPlacement.deferred,
383
+ toolOptions: {
384
+ strict: null,
385
+ supportsStrictMode,
386
+ supportsOpenAIGrammarTools,
387
+ },
345
388
  });
346
389
  const body = {
347
390
  model: model.id,
@@ -351,8 +394,8 @@ function buildRequestBody(model, context, options) {
351
394
  input: messages,
352
395
  text: { verbosity: options?.textVerbosity || "low" },
353
396
  include: ["reasoning.encrypted_content"],
354
- prompt_cache_key: clampOpenAIPromptCacheKey(options?.sessionId),
355
- tool_choice: "auto",
397
+ prompt_cache_key: cacheSessionId,
398
+ tool_choice: options?.toolChoice ?? "auto",
356
399
  parallel_tool_calls: true,
357
400
  };
358
401
  if (options?.temperature !== undefined) {
@@ -361,8 +404,12 @@ function buildRequestBody(model, context, options) {
361
404
  if (options?.serviceTier !== undefined) {
362
405
  body.service_tier = options.serviceTier;
363
406
  }
364
- if (context.tools && context.tools.length > 0) {
365
- body.tools = convertResponsesTools(context.tools, { strict: null });
407
+ if (toolPlacement.immediate.length > 0) {
408
+ body.tools = convertResponsesTools(toolPlacement.immediate, {
409
+ strict: null,
410
+ supportsStrictMode,
411
+ supportsOpenAIGrammarTools,
412
+ });
366
413
  }
367
414
  if (options?.reasoningEffort !== undefined) {
368
415
  const effort = options.reasoningEffort === "none"
@@ -423,9 +470,10 @@ function resolveCodexWebSocketUrl(baseUrl) {
423
470
  // ============================================================================
424
471
  // Response Processing
425
472
  // ============================================================================
426
- async function processStream(response, output, stream, model, options) {
473
+ async function processStream(response, output, stream, model, grammarToolInputProperties, options) {
427
474
  await processResponsesStream(mapCodexEvents(parseSSE(response, options?.signal)), output, stream, model, {
428
475
  serviceTier: options?.serviceTier,
476
+ grammarToolInputProperties,
429
477
  resolveServiceTier: resolveCodexServiceTier,
430
478
  applyServiceTierPricing: (usage, serviceTier) => applyServiceTierPricing(usage, serviceTier, model),
431
479
  });
@@ -453,6 +501,9 @@ function isCodexNonTransportError(error) {
453
501
  function isWebSocketConnectionLimitReachedError(error) {
454
502
  return error instanceof CodexApiError && error.code === WEBSOCKET_CONNECTION_LIMIT_REACHED_CODE;
455
503
  }
504
+ function isPreviousResponseNotFoundError(error) {
505
+ return error instanceof CodexApiError && error.code === PREVIOUS_RESPONSE_NOT_FOUND_CODE;
506
+ }
456
507
  function extractCodexEventError(event) {
457
508
  const nested = event.error && typeof event.error === "object" ? event.error : undefined;
458
509
  return {
@@ -520,9 +571,10 @@ async function* parseSSE(response, signal) {
520
571
  if (signal?.aborted) {
521
572
  throw new Error("Request was aborted");
522
573
  }
523
- if (done)
524
- break;
525
- buffer += decoder.decode(value, { stream: true });
574
+ buffer += done ? decoder.decode() : decoder.decode(value, { stream: true });
575
+ // Treat EOF as terminating the residual SSE frame.
576
+ if (done && buffer.trim())
577
+ buffer += "\n\n";
526
578
  let idx = buffer.indexOf("\n\n");
527
579
  while (idx !== -1) {
528
580
  const chunk = buffer.slice(0, idx);
@@ -547,6 +599,8 @@ async function* parseSSE(response, signal) {
547
599
  }
548
600
  idx = buffer.indexOf("\n\n");
549
601
  }
602
+ if (done)
603
+ break;
550
604
  }
551
605
  }
552
606
  finally {
@@ -609,14 +663,14 @@ export function closeOpenAICodexWebSocketSessions(sessionId) {
609
663
  closeWebSocketSilently(entry.socket, 1000, "debug_close");
610
664
  };
611
665
  if (sessionId) {
612
- const entry = websocketSessionCache.get(sessionId);
613
- if (entry)
666
+ for (const entry of websocketSessionCache.get(sessionId)?.values() ?? [])
614
667
  closeEntry(entry);
615
668
  websocketSessionCache.delete(sessionId);
616
669
  return;
617
670
  }
618
- for (const entry of websocketSessionCache.values()) {
619
- closeEntry(entry);
671
+ for (const accountEntries of websocketSessionCache.values()) {
672
+ for (const entry of accountEntries.values())
673
+ closeEntry(entry);
620
674
  }
621
675
  websocketSessionCache.clear();
622
676
  }
@@ -697,7 +751,7 @@ function closeWebSocketSilently(socket, code = 1000, reason = "done") {
697
751
  }
698
752
  catch { }
699
753
  }
700
- function scheduleSessionWebSocketExpiry(sessionId, entry) {
754
+ function scheduleSessionWebSocketExpiry(sessionId, accountId, entry) {
701
755
  if (entry.idleTimer) {
702
756
  clearTimeout(entry.idleTimer);
703
757
  }
@@ -705,7 +759,11 @@ function scheduleSessionWebSocketExpiry(sessionId, entry) {
705
759
  if (entry.busy)
706
760
  return;
707
761
  closeWebSocketSilently(entry.socket, 1000, "idle_timeout");
708
- websocketSessionCache.delete(sessionId);
762
+ const accountEntries = websocketSessionCache.get(sessionId);
763
+ if (accountEntries?.get(accountId) === entry)
764
+ accountEntries.delete(accountId);
765
+ if (accountEntries?.size === 0)
766
+ websocketSessionCache.delete(sessionId);
709
767
  }, SESSION_WEBSOCKET_CACHE_TTL_MS);
710
768
  }
711
769
  async function connectWebSocket(url, headers, signal, connectTimeoutMs = DEFAULT_WEBSOCKET_CONNECT_TIMEOUT_MS, env) {
@@ -776,7 +834,7 @@ async function connectWebSocket(url, headers, signal, connectTimeoutMs = DEFAULT
776
834
  }
777
835
  });
778
836
  }
779
- async function acquireWebSocket(url, headers, sessionId, signal, connectTimeoutMs, env) {
837
+ async function acquireWebSocket(url, headers, sessionId, accountId, signal, connectTimeoutMs, env) {
780
838
  if (!sessionId) {
781
839
  const socket = await connectWebSocket(url, headers, signal, connectTimeoutMs, env);
782
840
  return {
@@ -785,7 +843,8 @@ async function acquireWebSocket(url, headers, sessionId, signal, connectTimeoutM
785
843
  release: () => closeWebSocketSilently(socket),
786
844
  };
787
845
  }
788
- const cached = websocketSessionCache.get(sessionId);
846
+ let accountEntries = websocketSessionCache.get(sessionId);
847
+ const cached = accountEntries?.get(accountId);
789
848
  if (cached) {
790
849
  if (cached.idleTimer) {
791
850
  clearTimeout(cached.idleTimer);
@@ -793,7 +852,9 @@ async function acquireWebSocket(url, headers, sessionId, signal, connectTimeoutM
793
852
  }
794
853
  if (!cached.busy && isWebSocketSessionExpired(cached)) {
795
854
  closeWebSocketSilently(cached.socket, 1000, "connection_age_limit");
796
- websocketSessionCache.delete(sessionId);
855
+ accountEntries?.delete(accountId);
856
+ if (accountEntries?.size === 0)
857
+ websocketSessionCache.delete(sessionId);
797
858
  }
798
859
  else if (!cached.busy && isWebSocketReusable(cached.socket)) {
799
860
  cached.busy = true;
@@ -804,11 +865,15 @@ async function acquireWebSocket(url, headers, sessionId, signal, connectTimeoutM
804
865
  release: ({ keep } = {}) => {
805
866
  if (!keep || !isWebSocketReusable(cached.socket)) {
806
867
  closeWebSocketSilently(cached.socket);
807
- websocketSessionCache.delete(sessionId);
868
+ const currentEntries = websocketSessionCache.get(sessionId);
869
+ if (currentEntries?.get(accountId) === cached)
870
+ currentEntries.delete(accountId);
871
+ if (currentEntries?.size === 0)
872
+ websocketSessionCache.delete(sessionId);
808
873
  return;
809
874
  }
810
875
  cached.busy = false;
811
- scheduleSessionWebSocketExpiry(sessionId, cached);
876
+ scheduleSessionWebSocketExpiry(sessionId, accountId, cached);
812
877
  },
813
878
  };
814
879
  }
@@ -824,12 +889,19 @@ async function acquireWebSocket(url, headers, sessionId, signal, connectTimeoutM
824
889
  }
825
890
  if (!isWebSocketReusable(cached.socket)) {
826
891
  closeWebSocketSilently(cached.socket);
827
- websocketSessionCache.delete(sessionId);
892
+ accountEntries?.delete(accountId);
893
+ if (accountEntries?.size === 0)
894
+ websocketSessionCache.delete(sessionId);
828
895
  }
829
896
  }
830
897
  const socket = await connectWebSocket(url, headers, signal, connectTimeoutMs, env);
831
898
  const entry = { socket, busy: true, createdAt: Date.now() };
832
- websocketSessionCache.set(sessionId, entry);
899
+ accountEntries = websocketSessionCache.get(sessionId);
900
+ if (!accountEntries) {
901
+ accountEntries = new Map();
902
+ websocketSessionCache.set(sessionId, accountEntries);
903
+ }
904
+ accountEntries.set(accountId, entry);
833
905
  return {
834
906
  socket,
835
907
  entry,
@@ -839,13 +911,15 @@ async function acquireWebSocket(url, headers, sessionId, signal, connectTimeoutM
839
911
  closeWebSocketSilently(entry.socket);
840
912
  if (entry.idleTimer)
841
913
  clearTimeout(entry.idleTimer);
842
- if (websocketSessionCache.get(sessionId) === entry) {
914
+ const currentEntries = websocketSessionCache.get(sessionId);
915
+ if (currentEntries?.get(accountId) === entry)
916
+ currentEntries.delete(accountId);
917
+ if (currentEntries?.size === 0)
843
918
  websocketSessionCache.delete(sessionId);
844
- }
845
919
  return;
846
920
  }
847
921
  entry.busy = false;
848
- scheduleSessionWebSocketExpiry(sessionId, entry);
922
+ scheduleSessionWebSocketExpiry(sessionId, accountId, entry);
849
923
  },
850
924
  };
851
925
  }
@@ -1055,26 +1129,25 @@ function buildCachedWebSocketRequestBody(entry, body) {
1055
1129
  input: delta,
1056
1130
  };
1057
1131
  }
1058
- async function* startWebSocketOutputOnFirstEvent(events, output, stream, onStart) {
1132
+ async function* startWebSocketOutputOnFirstEvent(events, onStart) {
1059
1133
  let started = false;
1060
1134
  for await (const event of events) {
1061
1135
  if (!started) {
1062
1136
  started = true;
1063
1137
  onStart();
1064
- stream.push({ type: "start", partial: output });
1065
1138
  }
1066
1139
  yield event;
1067
1140
  }
1068
1141
  }
1069
- async function processWebSocketStream(url, body, headers, output, stream, model, onStart, idleTimeoutMs, websocketConnectTimeoutMs, options) {
1070
- const { socket, entry, reused, release } = await acquireWebSocket(url, headers, options?.sessionId, options?.signal, websocketConnectTimeoutMs, options?.env);
1142
+ async function processWebSocketStream(url, body, headers, output, stream, model, onStart, idleTimeoutMs, websocketConnectTimeoutMs, cacheSessionId, accountId, grammarToolInputProperties, options) {
1143
+ const { socket, entry, reused, release } = await acquireWebSocket(url, headers, cacheSessionId, accountId, options?.signal, websocketConnectTimeoutMs, options?.env);
1071
1144
  let keepConnection = true;
1072
1145
  const useCachedContext = options?.transport === "websocket-cached" || options?.transport === "auto";
1073
1146
  // ChatGPT Codex Responses rejects `store: true` ("Store must be set to false").
1074
1147
  // WebSocket continuation still works via connection-scoped previous_response_id state.
1075
1148
  const fullBody = body;
1076
1149
  const requestBody = useCachedContext && entry ? buildCachedWebSocketRequestBody(entry, fullBody) : fullBody;
1077
- const stats = options?.sessionId ? getOrCreateWebSocketDebugStats(options.sessionId) : undefined;
1150
+ const stats = cacheSessionId ? getOrCreateWebSocketDebugStats(cacheSessionId) : undefined;
1078
1151
  if (stats) {
1079
1152
  stats.requests++;
1080
1153
  if (reused)
@@ -1099,8 +1172,9 @@ async function processWebSocketStream(url, body, headers, output, stream, model,
1099
1172
  }
1100
1173
  try {
1101
1174
  socket.send(JSON.stringify({ type: "response.create", ...requestBody }));
1102
- await processResponsesStream(startWebSocketOutputOnFirstEvent(mapCodexEvents(parseWebSocket(socket, options?.signal, idleTimeoutMs)), output, stream, onStart), output, stream, model, {
1175
+ await processResponsesStream(startWebSocketOutputOnFirstEvent(mapCodexEvents(parseWebSocket(socket, options?.signal, idleTimeoutMs)), onStart), output, stream, model, {
1103
1176
  serviceTier: options?.serviceTier,
1177
+ grammarToolInputProperties,
1104
1178
  resolveServiceTier: resolveCodexServiceTier,
1105
1179
  applyServiceTierPricing: (usage, serviceTier) => applyServiceTierPricing(usage, serviceTier, model),
1106
1180
  });
@@ -1110,7 +1184,8 @@ async function processWebSocketStream(url, body, headers, output, stream, model,
1110
1184
  else if (useCachedContext && entry && output.responseId) {
1111
1185
  const responseItems = convertResponsesMessages(model, { messages: [output] }, CODEX_TOOL_CALL_PROVIDERS, {
1112
1186
  includeSystemPrompt: false,
1113
- }).filter((item) => item.type !== "function_call_output");
1187
+ grammarToolInputProperties,
1188
+ }).filter((item) => item.type !== "function_call_output" && item.type !== "custom_tool_call_output");
1114
1189
  entry.continuation = {
1115
1190
  lastRequestBody: fullBody,
1116
1191
  lastResponseId: output.responseId,
@@ -1173,12 +1248,6 @@ function extractAccountId(token) {
1173
1248
  throw new Error("Failed to extract accountId from token");
1174
1249
  }
1175
1250
  }
1176
- function createCodexRequestId() {
1177
- if (typeof globalThis.crypto?.randomUUID === "function") {
1178
- return globalThis.crypto.randomUUID();
1179
- }
1180
- return `codex_${Date.now()}_${Math.random().toString(36).slice(2, 10)}`;
1181
- }
1182
1251
  function buildBaseCodexHeaders(initHeaders, additionalHeaders, accountId, token) {
1183
1252
  const headers = new Headers(initHeaders);
1184
1253
  for (const [key, value] of Object.entries(additionalHeaders || {})) {
@@ -1192,8 +1261,7 @@ function buildBaseCodexHeaders(initHeaders, additionalHeaders, accountId, token)
1192
1261
  headers.set("Authorization", `Bearer ${token}`);
1193
1262
  headers.set("chatgpt-account-id", accountId);
1194
1263
  headers.set("originator", "pi");
1195
- const userAgent = _os ? `pi (${_os.platform()} ${_os.release()}; ${_os.arch()})` : "pi (browser)";
1196
- headers.set("User-Agent", userAgent);
1264
+ headers.set("User-Agent", getPiUserAgent());
1197
1265
  return headers;
1198
1266
  }
1199
1267
  function buildSSEHeaders(initHeaders, additionalHeaders, accountId, token, sessionId) {