@draht/ai 2026.7.13 → 2026.7.30

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 (508) hide show
  1. package/dist/api/anthropic-messages.d.ts.map +1 -1
  2. package/dist/api/anthropic-messages.js +129 -57
  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 +26 -9
  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 +54 -23
  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.map +1 -1
  15. package/dist/api/google-generative-ai.js +19 -13
  16. package/dist/api/google-generative-ai.js.map +1 -1
  17. package/dist/api/google-shared.d.ts +4 -3
  18. package/dist/api/google-shared.d.ts.map +1 -1
  19. package/dist/api/google-shared.js +17 -3
  20. package/dist/api/google-shared.js.map +1 -1
  21. package/dist/api/google-vertex.d.ts.map +1 -1
  22. package/dist/api/google-vertex.js +19 -13
  23. package/dist/api/google-vertex.js.map +1 -1
  24. package/dist/api/lazy.d.ts.map +1 -1
  25. package/dist/api/lazy.js +9 -10
  26. package/dist/api/lazy.js.map +1 -1
  27. package/dist/api/mistral-conversations.d.ts.map +1 -1
  28. package/dist/api/mistral-conversations.js +32 -19
  29. package/dist/api/mistral-conversations.js.map +1 -1
  30. package/dist/api/openai-codex-responses.d.ts +1 -0
  31. package/dist/api/openai-codex-responses.d.ts.map +1 -1
  32. package/dist/api/openai-codex-responses.js +88 -38
  33. package/dist/api/openai-codex-responses.js.map +1 -1
  34. package/dist/api/openai-completions.d.ts +8 -8
  35. package/dist/api/openai-completions.d.ts.map +1 -1
  36. package/dist/api/openai-completions.js +216 -46
  37. package/dist/api/openai-completions.js.map +1 -1
  38. package/dist/api/openai-responses-shared.d.ts +8 -1
  39. package/dist/api/openai-responses-shared.d.ts.map +1 -1
  40. package/dist/api/openai-responses-shared.js +233 -67
  41. package/dist/api/openai-responses-shared.js.map +1 -1
  42. package/dist/api/openai-responses.d.ts +1 -0
  43. package/dist/api/openai-responses.d.ts.map +1 -1
  44. package/dist/api/openai-responses.js +60 -16
  45. package/dist/api/openai-responses.js.map +1 -1
  46. package/dist/api/openrouter-images.d.ts.map +1 -1
  47. package/dist/api/openrouter-images.js +11 -5
  48. package/dist/api/openrouter-images.js.map +1 -1
  49. package/dist/api/pi-messages.d.ts +97 -0
  50. package/dist/api/pi-messages.d.ts.map +1 -0
  51. package/dist/api/pi-messages.js +305 -0
  52. package/dist/api/pi-messages.js.map +1 -0
  53. package/dist/api/pi-messages.lazy.d.ts +3 -0
  54. package/dist/api/pi-messages.lazy.d.ts.map +1 -0
  55. package/dist/api/pi-messages.lazy.js +3 -0
  56. package/dist/api/pi-messages.lazy.js.map +1 -0
  57. package/dist/api/simple-options.d.ts.map +1 -1
  58. package/dist/api/simple-options.js +1 -0
  59. package/dist/api/simple-options.js.map +1 -1
  60. package/dist/auth/credential-store.d.ts +2 -1
  61. package/dist/auth/credential-store.d.ts.map +1 -1
  62. package/dist/auth/credential-store.js +3 -0
  63. package/dist/auth/credential-store.js.map +1 -1
  64. package/dist/auth/helpers.d.ts +1 -0
  65. package/dist/auth/helpers.d.ts.map +1 -1
  66. package/dist/auth/helpers.js +7 -5
  67. package/dist/auth/helpers.js.map +1 -1
  68. package/dist/auth/oauth/anthropic.d.ts +9 -0
  69. package/dist/auth/oauth/anthropic.d.ts.map +1 -0
  70. package/dist/{utils → auth}/oauth/anthropic.js +51 -116
  71. package/dist/auth/oauth/anthropic.js.map +1 -0
  72. package/dist/auth/oauth/device-code.d.ts.map +1 -0
  73. package/dist/auth/oauth/device-code.js.map +1 -0
  74. package/dist/auth/oauth/github-copilot.d.ts +6 -0
  75. package/dist/auth/oauth/github-copilot.d.ts.map +1 -0
  76. package/dist/{utils → auth}/oauth/github-copilot.js +18 -77
  77. package/dist/auth/oauth/github-copilot.js.map +1 -0
  78. package/dist/auth/oauth/google-antigravity.d.ts +21 -0
  79. package/dist/auth/oauth/google-antigravity.d.ts.map +1 -0
  80. package/dist/{utils → auth}/oauth/google-antigravity.js +79 -79
  81. package/dist/auth/oauth/google-antigravity.js.map +1 -0
  82. package/dist/auth/oauth/google-gemini-cli.d.ts +21 -0
  83. package/dist/auth/oauth/google-gemini-cli.d.ts.map +1 -0
  84. package/dist/{utils → auth}/oauth/google-gemini-cli.js +79 -79
  85. package/dist/auth/oauth/google-gemini-cli.js.map +1 -0
  86. package/dist/auth/oauth/kimi-coding.d.ts +10 -0
  87. package/dist/auth/oauth/kimi-coding.d.ts.map +1 -0
  88. package/dist/auth/oauth/kimi-coding.js +249 -0
  89. package/dist/auth/oauth/kimi-coding.js.map +1 -0
  90. package/dist/auth/oauth/load.d.ts +33 -0
  91. package/dist/auth/oauth/load.d.ts.map +1 -0
  92. package/dist/auth/oauth/load.js +74 -0
  93. package/dist/auth/oauth/load.js.map +1 -0
  94. package/dist/auth/oauth/oauth-page.d.ts.map +1 -0
  95. package/dist/auth/oauth/oauth-page.js.map +1 -0
  96. package/dist/auth/oauth/openai-codex.d.ts +9 -0
  97. package/dist/auth/oauth/openai-codex.d.ts.map +1 -0
  98. package/dist/{utils → auth}/oauth/openai-codex.js +61 -155
  99. package/dist/auth/oauth/openai-codex.js.map +1 -0
  100. package/dist/auth/oauth/opencode-go.d.ts +14 -0
  101. package/dist/auth/oauth/opencode-go.d.ts.map +1 -0
  102. package/dist/auth/oauth/opencode-go.js +41 -0
  103. package/dist/auth/oauth/opencode-go.js.map +1 -0
  104. package/dist/auth/oauth/openrouter.d.ts +15 -0
  105. package/dist/auth/oauth/openrouter.d.ts.map +1 -0
  106. package/dist/auth/oauth/openrouter.js +277 -0
  107. package/dist/auth/oauth/openrouter.js.map +1 -0
  108. package/dist/auth/oauth/pkce.d.ts.map +1 -0
  109. package/dist/auth/oauth/pkce.js.map +1 -0
  110. package/dist/auth/oauth/radius.d.ts +17 -0
  111. package/dist/auth/oauth/radius.d.ts.map +1 -0
  112. package/dist/auth/oauth/radius.js +318 -0
  113. package/dist/auth/oauth/radius.js.map +1 -0
  114. package/dist/auth/oauth/xai.d.ts +17 -0
  115. package/dist/auth/oauth/xai.d.ts.map +1 -0
  116. package/dist/{utils → auth}/oauth/xai.js +54 -89
  117. package/dist/auth/oauth/xai.js.map +1 -0
  118. package/dist/auth/resolve.d.ts +4 -4
  119. package/dist/auth/resolve.d.ts.map +1 -1
  120. package/dist/auth/resolve.js +36 -16
  121. package/dist/auth/resolve.js.map +1 -1
  122. package/dist/auth/types.d.ts +49 -10
  123. package/dist/auth/types.d.ts.map +1 -1
  124. package/dist/auth/types.js.map +1 -1
  125. package/dist/bun-oauth.d.ts +3 -0
  126. package/dist/bun-oauth.d.ts.map +1 -0
  127. package/dist/bun-oauth.js +27 -0
  128. package/dist/bun-oauth.js.map +1 -0
  129. package/dist/cli.js +58 -76
  130. package/dist/cli.js.map +1 -1
  131. package/dist/compat/extension-oauth-types.d.ts +39 -0
  132. package/dist/compat/extension-oauth-types.d.ts.map +1 -0
  133. package/dist/compat/extension-oauth-types.js +2 -0
  134. package/dist/compat/extension-oauth-types.js.map +1 -0
  135. package/dist/compat.d.ts +2 -0
  136. package/dist/compat.d.ts.map +1 -1
  137. package/dist/compat.js +25 -8
  138. package/dist/compat.js.map +1 -1
  139. package/dist/env-api-keys.d.ts +3 -0
  140. package/dist/env-api-keys.d.ts.map +1 -1
  141. package/dist/env-api-keys.js +12 -3
  142. package/dist/env-api-keys.js.map +1 -1
  143. package/dist/image-models.generated.d.ts +75 -0
  144. package/dist/image-models.generated.d.ts.map +1 -1
  145. package/dist/image-models.generated.js +251 -176
  146. package/dist/image-models.generated.js.map +1 -1
  147. package/dist/images-models.d.ts +4 -2
  148. package/dist/images-models.d.ts.map +1 -1
  149. package/dist/images-models.js +5 -4
  150. package/dist/images-models.js.map +1 -1
  151. package/dist/index.d.ts +5 -1
  152. package/dist/index.d.ts.map +1 -1
  153. package/dist/index.js +3 -0
  154. package/dist/index.js.map +1 -1
  155. package/dist/model-catalog.d.ts +17 -0
  156. package/dist/model-catalog.d.ts.map +1 -0
  157. package/dist/model-catalog.js +4 -0
  158. package/dist/model-catalog.js.map +1 -0
  159. package/dist/models-store.d.ts +32 -0
  160. package/dist/models-store.d.ts.map +1 -0
  161. package/dist/models-store.js +16 -0
  162. package/dist/models-store.js.map +1 -0
  163. package/dist/models.d.ts +66 -30
  164. package/dist/models.d.ts.map +1 -1
  165. package/dist/models.generated.d.ts +74 -22035
  166. package/dist/models.generated.d.ts.map +1 -1
  167. package/dist/models.generated.js +4 -0
  168. package/dist/models.generated.js.map +1 -1
  169. package/dist/models.js +213 -29
  170. package/dist/models.js.map +1 -1
  171. package/dist/oauth.d.ts +2 -1
  172. package/dist/oauth.d.ts.map +1 -1
  173. package/dist/oauth.js +1 -1
  174. package/dist/oauth.js.map +1 -1
  175. package/dist/providers/all.d.ts +13 -6
  176. package/dist/providers/all.d.ts.map +1 -1
  177. package/dist/providers/all.js +13 -0
  178. package/dist/providers/all.js.map +1 -1
  179. package/dist/providers/amazon-bedrock.d.ts.map +1 -1
  180. package/dist/providers/amazon-bedrock.js +54 -8
  181. package/dist/providers/amazon-bedrock.js.map +1 -1
  182. package/dist/providers/amazon-bedrock.models.d.ts +3 -1931
  183. package/dist/providers/amazon-bedrock.models.d.ts.map +1 -1
  184. package/dist/providers/amazon-bedrock.models.js +3 -1838
  185. package/dist/providers/amazon-bedrock.models.js.map +1 -1
  186. package/dist/providers/ant-ling.models.d.ts +3 -85
  187. package/dist/providers/ant-ling.models.d.ts.map +1 -1
  188. package/dist/providers/ant-ling.models.js +3 -57
  189. package/dist/providers/ant-ling.models.js.map +1 -1
  190. package/dist/providers/anthropic.d.ts.map +1 -1
  191. package/dist/providers/anthropic.js +31 -4
  192. package/dist/providers/anthropic.js.map +1 -1
  193. package/dist/providers/anthropic.models.d.ts +3 -283
  194. package/dist/providers/anthropic.models.d.ts.map +1 -1
  195. package/dist/providers/anthropic.models.js +3 -252
  196. package/dist/providers/anthropic.models.js.map +1 -1
  197. package/dist/providers/azure-openai-responses.models.d.ts +3 -886
  198. package/dist/providers/azure-openai-responses.models.d.ts.map +1 -1
  199. package/dist/providers/azure-openai-responses.models.js +3 -811
  200. package/dist/providers/azure-openai-responses.models.js.map +1 -1
  201. package/dist/providers/cerebras.models.d.ts +3 -65
  202. package/dist/providers/cerebras.models.d.ts.map +1 -1
  203. package/dist/providers/cerebras.models.js +3 -56
  204. package/dist/providers/cerebras.models.js.map +1 -1
  205. package/dist/providers/cloudflare-ai-gateway.d.ts.map +1 -1
  206. package/dist/providers/cloudflare-ai-gateway.js +4 -3
  207. package/dist/providers/cloudflare-ai-gateway.js.map +1 -1
  208. package/dist/providers/cloudflare-ai-gateway.models.d.ts +3 -795
  209. package/dist/providers/cloudflare-ai-gateway.models.d.ts.map +1 -1
  210. package/dist/providers/cloudflare-ai-gateway.models.js +3 -683
  211. package/dist/providers/cloudflare-ai-gateway.models.js.map +1 -1
  212. package/dist/providers/cloudflare-auth.d.ts.map +1 -1
  213. package/dist/providers/cloudflare-auth.js +22 -26
  214. package/dist/providers/cloudflare-auth.js.map +1 -1
  215. package/dist/providers/cloudflare-stream.d.ts +8 -0
  216. package/dist/providers/cloudflare-stream.d.ts.map +1 -0
  217. package/dist/providers/cloudflare-stream.js +21 -0
  218. package/dist/providers/cloudflare-stream.js.map +1 -0
  219. package/dist/providers/cloudflare-workers-ai.d.ts.map +1 -1
  220. package/dist/providers/cloudflare-workers-ai.js +2 -1
  221. package/dist/providers/cloudflare-workers-ai.js.map +1 -1
  222. package/dist/providers/cloudflare-workers-ai.models.d.ts +3 -301
  223. package/dist/providers/cloudflare-workers-ai.models.d.ts.map +1 -1
  224. package/dist/providers/cloudflare-workers-ai.models.js +3 -236
  225. package/dist/providers/cloudflare-workers-ai.models.js.map +1 -1
  226. package/dist/providers/data/.manifest.json +1 -0
  227. package/dist/providers/data/amazon-bedrock.json +1 -0
  228. package/dist/providers/data/ant-ling.json +1 -0
  229. package/dist/providers/data/anthropic.json +1 -0
  230. package/dist/providers/data/azure-openai-responses.json +1 -0
  231. package/dist/providers/data/cerebras.json +1 -0
  232. package/dist/providers/data/cloudflare-ai-gateway.json +1 -0
  233. package/dist/providers/data/cloudflare-workers-ai.json +1 -0
  234. package/dist/providers/data/deepseek.json +1 -0
  235. package/dist/providers/data/fireworks.json +1 -0
  236. package/dist/providers/data/github-copilot.json +1 -0
  237. package/dist/providers/data/google-vertex.json +1 -0
  238. package/dist/providers/data/google.json +1 -0
  239. package/dist/providers/data/groq.json +1 -0
  240. package/dist/providers/data/huggingface.json +1 -0
  241. package/dist/providers/data/kimi-coding.json +1 -0
  242. package/dist/providers/data/minimax-cn.json +1 -0
  243. package/dist/providers/data/minimax.json +1 -0
  244. package/dist/providers/data/mistral.json +1 -0
  245. package/dist/providers/data/moonshotai-cn.json +1 -0
  246. package/dist/providers/data/moonshotai.json +1 -0
  247. package/dist/providers/data/nvidia.json +1 -0
  248. package/dist/providers/data/openai-codex.json +1 -0
  249. package/dist/providers/data/openai.json +1 -0
  250. package/dist/providers/data/opencode-go.json +1 -0
  251. package/dist/providers/data/opencode.json +1 -0
  252. package/dist/providers/data/openrouter.json +1 -0
  253. package/dist/providers/data/qwen-token-plan-cn.json +1 -0
  254. package/dist/providers/data/qwen-token-plan.json +1 -0
  255. package/dist/providers/data/together.json +1 -0
  256. package/dist/providers/data/vercel-ai-gateway.json +1 -0
  257. package/dist/providers/data/xai.json +1 -0
  258. package/dist/providers/data/xiaomi-token-plan-ams.json +1 -0
  259. package/dist/providers/data/xiaomi-token-plan-cn.json +1 -0
  260. package/dist/providers/data/xiaomi-token-plan-sgp.json +1 -0
  261. package/dist/providers/data/xiaomi.json +1 -0
  262. package/dist/providers/data/zai-coding-cn.json +1 -0
  263. package/dist/providers/data/zai.json +1 -0
  264. package/dist/providers/deepseek.models.d.ts +3 -62
  265. package/dist/providers/deepseek.models.d.ts.map +1 -1
  266. package/dist/providers/deepseek.models.js +3 -40
  267. package/dist/providers/deepseek.models.js.map +1 -1
  268. package/dist/providers/faux.d.ts.map +1 -1
  269. package/dist/providers/faux.js +4 -1
  270. package/dist/providers/faux.js.map +1 -1
  271. package/dist/providers/fireworks.models.d.ts +3 -380
  272. package/dist/providers/fireworks.models.d.ts.map +1 -1
  273. package/dist/providers/fireworks.models.js +3 -292
  274. package/dist/providers/fireworks.models.js.map +1 -1
  275. package/dist/providers/github-copilot.d.ts.map +1 -1
  276. package/dist/providers/github-copilot.js +11 -1
  277. package/dist/providers/github-copilot.js.map +1 -1
  278. package/dist/providers/github-copilot.models.d.ts +3 -790
  279. package/dist/providers/github-copilot.models.d.ts.map +1 -1
  280. package/dist/providers/github-copilot.models.js +3 -538
  281. package/dist/providers/github-copilot.models.js.map +1 -1
  282. package/dist/providers/google-vertex.d.ts.map +1 -1
  283. package/dist/providers/google-vertex.js +56 -5
  284. package/dist/providers/google-vertex.js.map +1 -1
  285. package/dist/providers/google-vertex.models.d.ts +3 -201
  286. package/dist/providers/google-vertex.models.d.ts.map +1 -1
  287. package/dist/providers/google-vertex.models.js +3 -179
  288. package/dist/providers/google-vertex.models.js.map +1 -1
  289. package/dist/providers/google.models.d.ts +3 -327
  290. package/dist/providers/google.models.d.ts.map +1 -1
  291. package/dist/providers/google.models.js +3 -285
  292. package/dist/providers/google.models.js.map +1 -1
  293. package/dist/providers/groq.models.d.ts +3 -127
  294. package/dist/providers/groq.models.d.ts.map +1 -1
  295. package/dist/providers/groq.models.js +3 -122
  296. package/dist/providers/groq.models.js.map +1 -1
  297. package/dist/providers/huggingface.models.d.ts +3 -982
  298. package/dist/providers/huggingface.models.d.ts.map +1 -1
  299. package/dist/providers/huggingface.models.js +3 -884
  300. package/dist/providers/huggingface.models.js.map +1 -1
  301. package/dist/providers/kimi-coding.d.ts.map +1 -1
  302. package/dist/providers/kimi-coding.js +10 -2
  303. package/dist/providers/kimi-coding.js.map +1 -1
  304. package/dist/providers/kimi-coding.models.d.ts +3 -62
  305. package/dist/providers/kimi-coding.models.d.ts.map +1 -1
  306. package/dist/providers/kimi-coding.models.js +3 -56
  307. package/dist/providers/kimi-coding.models.js.map +1 -1
  308. package/dist/providers/minimax-cn.models.d.ts +3 -53
  309. package/dist/providers/minimax-cn.models.d.ts.map +1 -1
  310. package/dist/providers/minimax-cn.models.js +3 -53
  311. package/dist/providers/minimax-cn.models.js.map +1 -1
  312. package/dist/providers/minimax.models.d.ts +3 -53
  313. package/dist/providers/minimax.models.d.ts.map +1 -1
  314. package/dist/providers/minimax.models.js +3 -53
  315. package/dist/providers/minimax.models.js.map +1 -1
  316. package/dist/providers/mistral.models.d.ts +3 -512
  317. package/dist/providers/mistral.models.d.ts.map +1 -1
  318. package/dist/providers/mistral.models.js +3 -512
  319. package/dist/providers/mistral.models.js.map +1 -1
  320. package/dist/providers/moonshotai-cn.models.d.ts +3 -233
  321. package/dist/providers/moonshotai-cn.models.d.ts.map +1 -1
  322. package/dist/providers/moonshotai-cn.models.js +3 -166
  323. package/dist/providers/moonshotai-cn.models.js.map +1 -1
  324. package/dist/providers/moonshotai.models.d.ts +3 -233
  325. package/dist/providers/moonshotai.models.d.ts.map +1 -1
  326. package/dist/providers/moonshotai.models.js +3 -166
  327. package/dist/providers/moonshotai.models.js.map +1 -1
  328. package/dist/providers/nvidia.models.d.ts +3 -562
  329. package/dist/providers/nvidia.models.d.ts.map +1 -1
  330. package/dist/providers/nvidia.models.js +3 -382
  331. package/dist/providers/nvidia.models.js.map +1 -1
  332. package/dist/providers/openai-codex.d.ts.map +1 -1
  333. package/dist/providers/openai-codex.js +1 -1
  334. package/dist/providers/openai-codex.js.map +1 -1
  335. package/dist/providers/openai-codex.models.d.ts +3 -187
  336. package/dist/providers/openai-codex.models.d.ts.map +1 -1
  337. package/dist/providers/openai-codex.models.js +3 -133
  338. package/dist/providers/openai-codex.models.js.map +1 -1
  339. package/dist/providers/openai.models.d.ts +3 -936
  340. package/dist/providers/openai.models.d.ts.map +1 -1
  341. package/dist/providers/openai.models.js +3 -818
  342. package/dist/providers/openai.models.js.map +1 -1
  343. package/dist/providers/opencode-go.d.ts +1 -1
  344. package/dist/providers/opencode-go.d.ts.map +1 -1
  345. package/dist/providers/opencode-go.js +15 -3
  346. package/dist/providers/opencode-go.js.map +1 -1
  347. package/dist/providers/opencode-go.models.d.ts +3 -308
  348. package/dist/providers/opencode-go.models.d.ts.map +1 -1
  349. package/dist/providers/opencode-go.models.js +3 -237
  350. package/dist/providers/opencode-go.models.js.map +1 -1
  351. package/dist/providers/opencode.models.d.ts +3 -1183
  352. package/dist/providers/opencode.models.d.ts.map +1 -1
  353. package/dist/providers/opencode.models.js +3 -977
  354. package/dist/providers/opencode.models.js.map +1 -1
  355. package/dist/providers/openrouter-images.d.ts.map +1 -1
  356. package/dist/providers/openrouter-images.js +10 -2
  357. package/dist/providers/openrouter-images.js.map +1 -1
  358. package/dist/providers/openrouter.d.ts.map +1 -1
  359. package/dist/providers/openrouter.js +10 -2
  360. package/dist/providers/openrouter.js.map +1 -1
  361. package/dist/providers/openrouter.models.d.ts +3 -5705
  362. package/dist/providers/openrouter.models.d.ts.map +1 -1
  363. package/dist/providers/openrouter.models.js +3 -4873
  364. package/dist/providers/openrouter.models.js.map +1 -1
  365. package/dist/providers/qwen-token-plan-cn.d.ts +3 -0
  366. package/dist/providers/qwen-token-plan-cn.d.ts.map +1 -0
  367. package/dist/providers/qwen-token-plan-cn.js +15 -0
  368. package/dist/providers/qwen-token-plan-cn.js.map +1 -0
  369. package/dist/providers/qwen-token-plan-cn.models.d.ts +4 -0
  370. package/dist/providers/qwen-token-plan-cn.models.d.ts.map +1 -0
  371. package/dist/providers/qwen-token-plan-cn.models.js +6 -0
  372. package/dist/providers/qwen-token-plan-cn.models.js.map +1 -0
  373. package/dist/providers/qwen-token-plan.d.ts +3 -0
  374. package/dist/providers/qwen-token-plan.d.ts.map +1 -0
  375. package/dist/providers/qwen-token-plan.js +15 -0
  376. package/dist/providers/qwen-token-plan.js.map +1 -0
  377. package/dist/providers/qwen-token-plan.models.d.ts +4 -0
  378. package/dist/providers/qwen-token-plan.models.d.ts.map +1 -0
  379. package/dist/providers/qwen-token-plan.models.js +6 -0
  380. package/dist/providers/qwen-token-plan.models.js.map +1 -0
  381. package/dist/providers/radius-config.d.ts +26 -0
  382. package/dist/providers/radius-config.d.ts.map +1 -0
  383. package/dist/providers/radius-config.js +63 -0
  384. package/dist/providers/radius-config.js.map +1 -0
  385. package/dist/providers/radius.d.ts +9 -0
  386. package/dist/providers/radius.d.ts.map +1 -0
  387. package/dist/providers/radius.js +54 -0
  388. package/dist/providers/radius.js.map +1 -0
  389. package/dist/providers/together.models.d.ts +3 -597
  390. package/dist/providers/together.models.d.ts.map +1 -1
  391. package/dist/providers/together.models.js +3 -377
  392. package/dist/providers/together.models.js.map +1 -1
  393. package/dist/providers/vercel-ai-gateway.models.d.ts +3 -3391
  394. package/dist/providers/vercel-ai-gateway.models.d.ts.map +1 -1
  395. package/dist/providers/vercel-ai-gateway.models.js +3 -3327
  396. package/dist/providers/vercel-ai-gateway.models.js.map +1 -1
  397. package/dist/providers/xai.d.ts +1 -1
  398. package/dist/providers/xai.d.ts.map +1 -1
  399. package/dist/providers/xai.js +11 -3
  400. package/dist/providers/xai.js.map +1 -1
  401. package/dist/providers/xai.models.d.ts +3 -178
  402. package/dist/providers/xai.models.d.ts.map +1 -1
  403. package/dist/providers/xai.models.js +3 -146
  404. package/dist/providers/xai.models.js.map +1 -1
  405. package/dist/providers/xiaomi-token-plan-ams.models.d.ts +3 -65
  406. package/dist/providers/xiaomi-token-plan-ams.models.d.ts.map +1 -1
  407. package/dist/providers/xiaomi-token-plan-ams.models.js +3 -56
  408. package/dist/providers/xiaomi-token-plan-ams.models.js.map +1 -1
  409. package/dist/providers/xiaomi-token-plan-cn.models.d.ts +3 -65
  410. package/dist/providers/xiaomi-token-plan-cn.models.d.ts.map +1 -1
  411. package/dist/providers/xiaomi-token-plan-cn.models.js +3 -56
  412. package/dist/providers/xiaomi-token-plan-cn.models.js.map +1 -1
  413. package/dist/providers/xiaomi-token-plan-sgp.models.d.ts +3 -65
  414. package/dist/providers/xiaomi-token-plan-sgp.models.d.ts.map +1 -1
  415. package/dist/providers/xiaomi-token-plan-sgp.models.js +3 -56
  416. package/dist/providers/xiaomi-token-plan-sgp.models.js.map +1 -1
  417. package/dist/providers/xiaomi.models.d.ts +3 -128
  418. package/dist/providers/xiaomi.models.d.ts.map +1 -1
  419. package/dist/providers/xiaomi.models.js +3 -110
  420. package/dist/providers/xiaomi.models.js.map +1 -1
  421. package/dist/providers/zai-coding-cn.models.d.ts +3 -152
  422. package/dist/providers/zai-coding-cn.models.d.ts.map +1 -1
  423. package/dist/providers/zai-coding-cn.models.js +3 -111
  424. package/dist/providers/zai-coding-cn.models.js.map +1 -1
  425. package/dist/providers/zai.models.d.ts +3 -152
  426. package/dist/providers/zai.models.d.ts.map +1 -1
  427. package/dist/providers/zai.models.js +3 -111
  428. package/dist/providers/zai.models.js.map +1 -1
  429. package/dist/types.d.ts +74 -8
  430. package/dist/types.d.ts.map +1 -1
  431. package/dist/types.js.map +1 -1
  432. package/dist/utils/deferred-tools.d.ts +9 -0
  433. package/dist/utils/deferred-tools.d.ts.map +1 -0
  434. package/dist/utils/deferred-tools.js +36 -0
  435. package/dist/utils/deferred-tools.js.map +1 -0
  436. package/dist/utils/error-body.d.ts.map +1 -1
  437. package/dist/utils/error-body.js +8 -3
  438. package/dist/utils/error-body.js.map +1 -1
  439. package/dist/utils/estimate.d.ts.map +1 -1
  440. package/dist/utils/estimate.js +18 -5
  441. package/dist/utils/estimate.js.map +1 -1
  442. package/dist/utils/overflow.d.ts +1 -0
  443. package/dist/utils/overflow.d.ts.map +1 -1
  444. package/dist/utils/overflow.js +3 -0
  445. package/dist/utils/overflow.js.map +1 -1
  446. package/dist/utils/provider-retry.d.ts +16 -0
  447. package/dist/utils/provider-retry.d.ts.map +1 -0
  448. package/dist/utils/provider-retry.js +94 -0
  449. package/dist/utils/provider-retry.js.map +1 -0
  450. package/dist/utils/retry.d.ts +41 -0
  451. package/dist/utils/retry.d.ts.map +1 -1
  452. package/dist/utils/retry.js +83 -0
  453. package/dist/utils/retry.js.map +1 -1
  454. package/dist/utils/text.d.ts +6 -0
  455. package/dist/utils/text.d.ts.map +1 -0
  456. package/dist/utils/text.js +10 -0
  457. package/dist/utils/text.js.map +1 -0
  458. package/dist/utils/uuid.d.ts +3 -0
  459. package/dist/utils/uuid.d.ts.map +1 -0
  460. package/dist/utils/uuid.js +47 -0
  461. package/dist/utils/uuid.js.map +1 -0
  462. package/package.json +12 -6
  463. package/dist/utils/oauth/anthropic.d.ts +0 -27
  464. package/dist/utils/oauth/anthropic.d.ts.map +0 -1
  465. package/dist/utils/oauth/anthropic.js.map +0 -1
  466. package/dist/utils/oauth/device-code.d.ts.map +0 -1
  467. package/dist/utils/oauth/device-code.js.map +0 -1
  468. package/dist/utils/oauth/github-copilot.d.ts +0 -32
  469. package/dist/utils/oauth/github-copilot.d.ts.map +0 -1
  470. package/dist/utils/oauth/github-copilot.js.map +0 -1
  471. package/dist/utils/oauth/google-antigravity.d.ts +0 -26
  472. package/dist/utils/oauth/google-antigravity.d.ts.map +0 -1
  473. package/dist/utils/oauth/google-antigravity.js.map +0 -1
  474. package/dist/utils/oauth/google-gemini-cli.d.ts +0 -26
  475. package/dist/utils/oauth/google-gemini-cli.d.ts.map +0 -1
  476. package/dist/utils/oauth/google-gemini-cli.js.map +0 -1
  477. package/dist/utils/oauth/index.d.ts +0 -60
  478. package/dist/utils/oauth/index.d.ts.map +0 -1
  479. package/dist/utils/oauth/index.js +0 -130
  480. package/dist/utils/oauth/index.js.map +0 -1
  481. package/dist/utils/oauth/load.d.ts +0 -6
  482. package/dist/utils/oauth/load.d.ts.map +0 -1
  483. package/dist/utils/oauth/load.js +0 -23
  484. package/dist/utils/oauth/load.js.map +0 -1
  485. package/dist/utils/oauth/oauth-page.d.ts.map +0 -1
  486. package/dist/utils/oauth/oauth-page.js.map +0 -1
  487. package/dist/utils/oauth/openai-codex.d.ts +0 -45
  488. package/dist/utils/oauth/openai-codex.d.ts.map +0 -1
  489. package/dist/utils/oauth/openai-codex.js.map +0 -1
  490. package/dist/utils/oauth/opencode-go.d.ts +0 -23
  491. package/dist/utils/oauth/opencode-go.d.ts.map +0 -1
  492. package/dist/utils/oauth/opencode-go.js +0 -46
  493. package/dist/utils/oauth/opencode-go.js.map +0 -1
  494. package/dist/utils/oauth/pkce.d.ts.map +0 -1
  495. package/dist/utils/oauth/pkce.js.map +0 -1
  496. package/dist/utils/oauth/types.d.ts +0 -64
  497. package/dist/utils/oauth/types.d.ts.map +0 -1
  498. package/dist/utils/oauth/types.js +0 -2
  499. package/dist/utils/oauth/types.js.map +0 -1
  500. package/dist/utils/oauth/xai.d.ts +0 -34
  501. package/dist/utils/oauth/xai.d.ts.map +0 -1
  502. package/dist/utils/oauth/xai.js.map +0 -1
  503. /package/dist/{utils → auth}/oauth/device-code.d.ts +0 -0
  504. /package/dist/{utils → auth}/oauth/device-code.js +0 -0
  505. /package/dist/{utils → auth}/oauth/oauth-page.d.ts +0 -0
  506. /package/dist/{utils → auth}/oauth/oauth-page.js +0 -0
  507. /package/dist/{utils → auth}/oauth/pkce.d.ts +0 -0
  508. /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