@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
@@ -2,6 +2,7 @@ import { calculateCost } from "../models.js";
2
2
  import { shortHash } from "../utils/hash.js";
3
3
  import { parseStreamingJson } from "../utils/json-parse.js";
4
4
  import { sanitizeSurrogates } from "../utils/sanitize-unicode.js";
5
+ import { appendGrammarToolInputJsonDelta, getGrammarToolInput, resolveGrammarConstrainedSampling, resolveJsonSchemaStrictSampling, } from "./constrained-sampling.js";
5
6
  import { transformMessages } from "./transform-messages.js";
6
7
  // =============================================================================
7
8
  // Utilities
@@ -31,11 +32,35 @@ function parseTextSignature(signature) {
31
32
  }
32
33
  return { id: signature };
33
34
  }
35
+ function convertToolResultOutput(model, content) {
36
+ const textResult = content
37
+ .filter((c) => c.type === "text")
38
+ .map((c) => c.text)
39
+ .join("\n");
40
+ const images = content.filter((c) => c.type === "image");
41
+ const hasText = textResult.length > 0;
42
+ if (images.length === 0 || !model.input.includes("image")) {
43
+ return sanitizeSurrogates(hasText ? textResult : images.length > 0 ? "(see attached image)" : "(no tool output)");
44
+ }
45
+ const output = [];
46
+ if (hasText) {
47
+ output.push({ type: "input_text", text: sanitizeSurrogates(textResult) });
48
+ }
49
+ for (const image of images) {
50
+ output.push({
51
+ type: "input_image",
52
+ detail: "auto",
53
+ image_url: `data:${image.mimeType};base64,${image.data}`,
54
+ });
55
+ }
56
+ return output;
57
+ }
34
58
  // =============================================================================
35
59
  // Message conversion
36
60
  // =============================================================================
37
61
  export function convertResponsesMessages(model, context, allowedToolCallProviders, options) {
38
62
  const messages = [];
63
+ const loadedToolNames = new Set();
39
64
  const normalizeIdPart = (part) => {
40
65
  const sanitized = part.replace(/[^a-zA-Z0-9_-]/g, "_");
41
66
  const normalized = sanitized.length > 64 ? sanitized.slice(0, 64) : sanitized;
@@ -110,8 +135,6 @@ export function convertResponsesMessages(model, context, allowedToolCallProvider
110
135
  let textBlockIndex = 0;
111
136
  for (const block of msg.content) {
112
137
  if (block.type === "thinking") {
113
- if (block.thinking.trim().length === 0)
114
- continue;
115
138
  if (block.thinkingSignature) {
116
139
  const reasoningItem = JSON.parse(block.thinkingSignature);
117
140
  output.push(reasoningItem);
@@ -142,20 +165,35 @@ export function convertResponsesMessages(model, context, allowedToolCallProvider
142
165
  else if (block.type === "toolCall") {
143
166
  const toolCall = block;
144
167
  const [callId, itemIdRaw] = toolCall.id.split("|");
168
+ const customInputProperty = options?.grammarToolInputProperties?.get(toolCall.name);
145
169
  let itemId = itemIdRaw;
146
170
  // For different-model messages, set id to undefined to avoid pairing validation.
147
171
  // OpenAI tracks which fc_xxx IDs were paired with rs_xxx reasoning items.
148
172
  // By omitting the id, we avoid triggering that validation (like cross-provider does).
149
- if (isDifferentModel && itemId?.startsWith("fc_")) {
173
+ // When replaying custom-tool calls as a function_call, also drop non-fc_* ids such as
174
+ // ctc_* custom-tool ids because function_call item ids must be fc_*.
175
+ if ((isDifferentModel && itemId?.startsWith("fc_")) ||
176
+ (customInputProperty === undefined && !itemId?.startsWith("fc_"))) {
150
177
  itemId = undefined;
151
178
  }
152
- output.push({
153
- type: "function_call",
154
- id: itemId,
155
- call_id: callId,
156
- name: toolCall.name,
157
- arguments: JSON.stringify(toolCall.arguments),
158
- });
179
+ if (customInputProperty !== undefined) {
180
+ output.push({
181
+ type: "custom_tool_call",
182
+ id: itemId,
183
+ call_id: callId,
184
+ name: toolCall.name,
185
+ input: sanitizeSurrogates(getGrammarToolInput(toolCall.name, toolCall.arguments, customInputProperty)),
186
+ });
187
+ }
188
+ else {
189
+ output.push({
190
+ type: "function_call",
191
+ id: itemId,
192
+ call_id: callId,
193
+ name: toolCall.name,
194
+ arguments: JSON.stringify(toolCall.arguments),
195
+ });
196
+ }
159
197
  }
160
198
  }
161
199
  if (output.length === 0)
@@ -163,41 +201,51 @@ export function convertResponsesMessages(model, context, allowedToolCallProvider
163
201
  messages.push(...output);
164
202
  }
165
203
  else if (msg.role === "toolResult") {
166
- const textResult = msg.content
167
- .filter((c) => c.type === "text")
168
- .map((c) => c.text)
169
- .join("\n");
170
- const hasImages = msg.content.some((c) => c.type === "image");
171
- const hasText = textResult.length > 0;
172
204
  const [callId] = msg.toolCallId.split("|");
173
- let output;
174
- if (hasImages && model.input.includes("image")) {
175
- const contentParts = [];
176
- if (hasText) {
177
- contentParts.push({
178
- type: "input_text",
179
- text: sanitizeSurrogates(textResult),
180
- });
181
- }
182
- for (const block of msg.content) {
183
- if (block.type === "image") {
184
- contentParts.push({
185
- type: "input_image",
186
- detail: "auto",
187
- image_url: `data:${block.mimeType};base64,${block.data}`,
188
- });
189
- }
190
- }
191
- output = contentParts;
205
+ const output = convertToolResultOutput(model, msg.content);
206
+ if (options?.grammarToolInputProperties?.has(msg.toolName)) {
207
+ messages.push({
208
+ type: "custom_tool_call_output",
209
+ call_id: callId,
210
+ output,
211
+ });
192
212
  }
193
213
  else {
194
- output = sanitizeSurrogates(hasText ? textResult : hasImages ? "(see attached image)" : "(no tool output)");
214
+ messages.push({
215
+ type: "function_call_output",
216
+ call_id: callId,
217
+ output,
218
+ });
219
+ }
220
+ const deferredTools = [];
221
+ for (const name of msg.addedToolNames ?? []) {
222
+ const tool = options?.deferredTools?.get(name);
223
+ if (!tool || loadedToolNames.has(name))
224
+ continue;
225
+ loadedToolNames.add(name);
226
+ deferredTools.push(tool);
227
+ }
228
+ if (deferredTools.length > 0) {
229
+ const names = deferredTools.map((tool) => tool.name);
230
+ const searchCallId = `pi_tool_load_${shortHash(`${msg.toolCallId}:${names.join(",")}`)}`;
231
+ messages.push({
232
+ type: "tool_search_call",
233
+ call_id: searchCallId,
234
+ execution: "client",
235
+ status: "completed",
236
+ arguments: { query: names.join(" "), limit: names.length },
237
+ });
238
+ messages.push({
239
+ type: "tool_search_output",
240
+ call_id: searchCallId,
241
+ execution: "client",
242
+ status: "completed",
243
+ tools: convertResponsesTools(deferredTools, {
244
+ ...options?.toolOptions,
245
+ deferLoading: true,
246
+ }),
247
+ });
195
248
  }
196
- messages.push({
197
- type: "function_call_output",
198
- call_id: callId,
199
- output,
200
- });
201
249
  }
202
250
  msgIndex++;
203
251
  }
@@ -207,22 +255,76 @@ export function convertResponsesMessages(model, context, allowedToolCallProvider
207
255
  // Tool conversion
208
256
  // =============================================================================
209
257
  export function convertResponsesTools(tools, options) {
210
- const strict = options?.strict === undefined ? false : options.strict;
211
- return tools.map((tool) => ({
212
- type: "function",
213
- name: tool.name,
214
- description: tool.description,
215
- parameters: tool.parameters, // TypeBox already generates JSON Schema
216
- strict,
217
- }));
258
+ const defaultStrict = options?.strict === undefined ? false : options.strict;
259
+ const supportsStrictMode = options?.supportsStrictMode ?? true;
260
+ const supportsOpenAIGrammarTools = options?.supportsOpenAIGrammarTools ?? false;
261
+ return tools.map((tool) => {
262
+ const grammar = resolveGrammarConstrainedSampling(tool, supportsOpenAIGrammarTools);
263
+ if (grammar) {
264
+ return {
265
+ type: "custom",
266
+ name: tool.name,
267
+ description: tool.description,
268
+ format: {
269
+ type: "grammar",
270
+ syntax: grammar.format,
271
+ definition: grammar.definition,
272
+ },
273
+ ...(options?.deferLoading ? { defer_loading: true } : {}),
274
+ };
275
+ }
276
+ const constrainedStrict = resolveJsonSchemaStrictSampling(tool, supportsStrictMode);
277
+ const functionTool = {
278
+ type: "function",
279
+ name: tool.name,
280
+ description: tool.description,
281
+ parameters: tool.parameters, // TypeBox already generates JSON Schema
282
+ ...(options?.deferLoading ? { defer_loading: true } : {}),
283
+ };
284
+ if (supportsStrictMode) {
285
+ functionTool.strict = constrainedStrict ?? defaultStrict;
286
+ }
287
+ return functionTool;
288
+ });
289
+ }
290
+ function getCustomToolCallInput(block) {
291
+ const property = block.customInput?.property;
292
+ if (property === undefined)
293
+ return "";
294
+ const value = block.arguments[property];
295
+ return typeof value === "string" ? value : "";
296
+ }
297
+ function appendCustomToolCallInput(block, nextInput, close) {
298
+ const customInput = block.customInput;
299
+ if (!customInput)
300
+ return undefined;
301
+ const delta = appendGrammarToolInputJsonDelta(customInput.jsonBuffer, customInput.property, nextInput, close);
302
+ block.arguments = { [customInput.property]: nextInput };
303
+ return delta;
218
304
  }
219
305
  export async function processResponsesStream(openaiStream, output, stream, model, options) {
220
306
  let sawTerminalResponseEvent = false;
221
307
  const outputSlots = new Map();
308
+ const reasoningBlocksById = new Map();
309
+ const applyMessagePhaseStopReason = (item) => {
310
+ if (item.type === "message" && item.phase === "final_answer") {
311
+ output.stopReason = "stop";
312
+ }
313
+ };
222
314
  const getSlot = (outputIndex, type) => {
223
315
  const slot = outputSlots.get(outputIndex);
224
316
  return slot?.type === type ? slot : undefined;
225
317
  };
318
+ const pushToolCallDelta = (slot, delta) => {
319
+ if (delta === undefined)
320
+ return;
321
+ stream.push({
322
+ type: "toolcall_delta",
323
+ contentIndex: slot.contentIndex,
324
+ delta,
325
+ partial: output,
326
+ });
327
+ };
226
328
  const createSlot = (outputIndex, item) => {
227
329
  if (item.type === "reasoning") {
228
330
  const block = { type: "thinking", thinking: "" };
@@ -237,6 +339,7 @@ export async function processResponsesStream(openaiStream, output, stream, model
237
339
  return slot;
238
340
  }
239
341
  if (item.type === "message") {
342
+ applyMessagePhaseStopReason(item);
240
343
  const block = { type: "text", text: "" };
241
344
  output.content.push(block);
242
345
  const slot = { type: "text", block, contentIndex: output.content.length - 1 };
@@ -262,13 +365,57 @@ export async function processResponsesStream(openaiStream, output, stream, model
262
365
  stream.push({ type: "toolcall_start", contentIndex: slot.contentIndex, partial: output });
263
366
  return slot;
264
367
  }
368
+ if (item.type === "custom_tool_call") {
369
+ const inputProperty = options?.grammarToolInputProperties?.get(item.name) ?? "input";
370
+ const input = item.input || "";
371
+ const block = {
372
+ type: "toolCall",
373
+ id: `${item.call_id}|${item.id}`,
374
+ name: item.name,
375
+ arguments: { [inputProperty]: input },
376
+ customInput: {
377
+ property: inputProperty,
378
+ jsonBuffer: { input: "", started: false, closed: false },
379
+ },
380
+ };
381
+ output.content.push(block);
382
+ const slot = {
383
+ type: "toolCall",
384
+ block,
385
+ contentIndex: output.content.length - 1,
386
+ };
387
+ outputSlots.set(outputIndex, slot);
388
+ stream.push({ type: "toolcall_start", contentIndex: slot.contentIndex, partial: output });
389
+ return slot;
390
+ }
265
391
  return undefined;
266
392
  };
267
393
  const getOrCreateSlot = (outputIndex, item) => {
268
394
  return outputSlots.get(outputIndex) ?? createSlot(outputIndex, item);
269
395
  };
396
+ // Azure OpenAI can omit reasoning.encrypted_content from response.output_item.done
397
+ // and provide it only in response.completed.response.output. Backfill the
398
+ // persisted reasoning signature from the terminal response to keep store:false
399
+ // multi-turn replay stateless. See https://github.com/earendil-works/pi/issues/6409.
400
+ const backfillReasoningSignatures = (responseOutput) => {
401
+ for (const item of responseOutput) {
402
+ if (item.type !== "reasoning" || !item.encrypted_content)
403
+ continue;
404
+ const block = reasoningBlocksById.get(item.id);
405
+ if (!block?.thinkingSignature)
406
+ continue;
407
+ const storedItem = JSON.parse(block.thinkingSignature);
408
+ if (storedItem.encrypted_content)
409
+ continue;
410
+ block.thinkingSignature = JSON.stringify({
411
+ ...storedItem,
412
+ encrypted_content: item.encrypted_content,
413
+ });
414
+ }
415
+ };
270
416
  const finalizeResponse = (response) => {
271
417
  sawTerminalResponseEvent = true;
418
+ backfillReasoningSignatures(response.output ?? []);
272
419
  if (response?.id) {
273
420
  output.responseId = response.id;
274
421
  }
@@ -295,7 +442,9 @@ export async function processResponsesStream(openaiStream, output, stream, model
295
442
  options.applyServiceTierPricing(output.usage, serviceTier);
296
443
  }
297
444
  // Map status to stop reason
298
- output.stopReason = mapStopReason(response?.status);
445
+ const status = response?.status;
446
+ output.rawStopReason = status;
447
+ output.stopReason = mapStopReason(status);
299
448
  if (output.content.some((b) => b.type === "toolCall") && output.stopReason === "stop") {
300
449
  output.stopReason = "toolUse";
301
450
  }
@@ -369,44 +518,47 @@ export async function processResponsesStream(openaiStream, output, stream, model
369
518
  }
370
519
  else if (event.type === "response.function_call_arguments.delta") {
371
520
  const slot = getSlot(event.output_index, "toolCall");
372
- if (!slot)
521
+ if (!slot || slot.block.partialJson === undefined)
373
522
  continue;
374
523
  slot.block.partialJson += event.delta;
375
524
  slot.block.arguments = parseStreamingJson(slot.block.partialJson);
376
- stream.push({
377
- type: "toolcall_delta",
378
- contentIndex: slot.contentIndex,
379
- delta: event.delta,
380
- partial: output,
381
- });
525
+ pushToolCallDelta(slot, event.delta);
382
526
  }
383
527
  else if (event.type === "response.function_call_arguments.done") {
384
528
  const slot = getSlot(event.output_index, "toolCall");
385
- if (!slot)
529
+ if (!slot || slot.block.partialJson === undefined)
386
530
  continue;
387
531
  const previousPartialJson = slot.block.partialJson;
388
532
  slot.block.partialJson = event.arguments;
389
533
  slot.block.arguments = parseStreamingJson(slot.block.partialJson);
390
534
  if (event.arguments.startsWith(previousPartialJson)) {
391
535
  const delta = event.arguments.slice(previousPartialJson.length);
392
- if (delta.length > 0) {
393
- stream.push({
394
- type: "toolcall_delta",
395
- contentIndex: slot.contentIndex,
396
- delta,
397
- partial: output,
398
- });
399
- }
536
+ if (delta.length > 0)
537
+ pushToolCallDelta(slot, delta);
400
538
  }
401
539
  }
540
+ else if (event.type === "response.custom_tool_call_input.delta") {
541
+ const slot = getSlot(event.output_index, "toolCall");
542
+ if (!slot || !slot.block.customInput)
543
+ continue;
544
+ pushToolCallDelta(slot, appendCustomToolCallInput(slot.block, getCustomToolCallInput(slot.block) + event.delta, false));
545
+ }
546
+ else if (event.type === "response.custom_tool_call_input.done") {
547
+ const slot = getSlot(event.output_index, "toolCall");
548
+ if (!slot || !slot.block.customInput)
549
+ continue;
550
+ pushToolCallDelta(slot, appendCustomToolCallInput(slot.block, event.input, true));
551
+ }
402
552
  else if (event.type === "response.output_item.done") {
403
553
  const item = event.item;
554
+ applyMessagePhaseStopReason(item);
404
555
  const slot = getOrCreateSlot(event.output_index, item);
405
556
  if (item.type === "reasoning" && slot?.type === "thinking") {
406
557
  const summaryText = item.summary?.map((s) => s.text).join("\n\n") || "";
407
558
  const contentText = item.content?.map((c) => c.text).join("\n\n") || "";
408
559
  slot.block.thinking = summaryText || contentText || slot.block.thinking;
409
560
  slot.block.thinkingSignature = JSON.stringify(item);
561
+ reasoningBlocksById.set(item.id, slot.block);
410
562
  stream.push({
411
563
  type: "thinking_end",
412
564
  contentIndex: slot.contentIndex,
@@ -426,7 +578,9 @@ export async function processResponsesStream(openaiStream, output, stream, model
426
578
  });
427
579
  outputSlots.delete(event.output_index);
428
580
  }
429
- else if (item.type === "function_call" && slot?.type === "toolCall") {
581
+ else if (item.type === "function_call" &&
582
+ slot?.type === "toolCall" &&
583
+ slot.block.partialJson !== undefined) {
430
584
  slot.block.arguments = parseStreamingJson(item.arguments || slot.block.partialJson || "{}");
431
585
  // Finalize in-place and strip the scratch buffer so replay only
432
586
  // carries parsed arguments.
@@ -439,6 +593,17 @@ export async function processResponsesStream(openaiStream, output, stream, model
439
593
  });
440
594
  outputSlots.delete(event.output_index);
441
595
  }
596
+ else if (item.type === "custom_tool_call" && slot?.type === "toolCall" && slot.block.customInput) {
597
+ pushToolCallDelta(slot, appendCustomToolCallInput(slot.block, item.input ?? getCustomToolCallInput(slot.block), true));
598
+ delete slot.block.customInput;
599
+ stream.push({
600
+ type: "toolcall_end",
601
+ contentIndex: slot.contentIndex,
602
+ toolCall: slot.block,
603
+ partial: output,
604
+ });
605
+ outputSlots.delete(event.output_index);
606
+ }
442
607
  }
443
608
  else if (event.type === "response.completed" || event.type === "response.incomplete") {
444
609
  finalizeResponse(event.response);
@@ -448,6 +613,7 @@ export async function processResponsesStream(openaiStream, output, stream, model
448
613
  }
449
614
  else if (event.type === "response.failed") {
450
615
  sawTerminalResponseEvent = true;
616
+ output.rawStopReason = event.response?.status;
451
617
  const error = event.response?.error;
452
618
  const details = event.response?.incomplete_details;
453
619
  const msg = error