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