@draht/ai 2026.7.30 → 2026.10.4-2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/api/anthropic-messages.d.ts.map +1 -1
- package/dist/api/anthropic-messages.js +404 -142
- package/dist/api/anthropic-messages.js.map +1 -1
- package/dist/api/azure-openai-responses.d.ts +2 -0
- package/dist/api/azure-openai-responses.d.ts.map +1 -1
- package/dist/api/azure-openai-responses.js +34 -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 +210 -24
- package/dist/api/bedrock-converse-stream.js.map +1 -1
- package/dist/api/cloudflare-ai-binding.d.ts +77 -0
- package/dist/api/cloudflare-ai-binding.d.ts.map +1 -0
- package/dist/api/cloudflare-ai-binding.js +72 -0
- package/dist/api/cloudflare-ai-binding.js.map +1 -0
- package/dist/api/cloudflare-workers-ai-system-one.d.ts +4 -0
- package/dist/api/cloudflare-workers-ai-system-one.d.ts.map +1 -0
- package/dist/api/cloudflare-workers-ai-system-one.js +43 -0
- package/dist/api/cloudflare-workers-ai-system-one.js.map +1 -0
- package/dist/api/cloudflare-workers-ai-system-one.lazy.d.ts +3 -0
- package/dist/api/cloudflare-workers-ai-system-one.lazy.d.ts.map +1 -0
- package/dist/api/cloudflare-workers-ai-system-one.lazy.js +4 -0
- package/dist/api/cloudflare-workers-ai-system-one.lazy.js.map +1 -0
- package/dist/api/cloudflare.d.ts +2 -0
- package/dist/api/cloudflare.d.ts.map +1 -1
- package/dist/api/cloudflare.js +2 -0
- package/dist/api/cloudflare.js.map +1 -1
- package/dist/api/constrained-sampling.d.ts +10 -1
- package/dist/api/constrained-sampling.d.ts.map +1 -1
- package/dist/api/constrained-sampling.js +137 -4
- package/dist/api/constrained-sampling.js.map +1 -1
- 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 +39 -82
- package/dist/api/google-generative-ai.js.map +1 -1
- package/dist/api/google-shared.d.ts +27 -5
- package/dist/api/google-shared.d.ts.map +1 -1
- package/dist/api/google-shared.js +126 -18
- 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 +42 -73
- package/dist/api/google-vertex.js.map +1 -1
- package/dist/api/lazy.d.ts +5 -1
- package/dist/api/lazy.d.ts.map +1 -1
- package/dist/api/lazy.js +19 -7
- package/dist/api/lazy.js.map +1 -1
- package/dist/api/llama-cpp-classify.d.ts +33 -0
- package/dist/api/llama-cpp-classify.d.ts.map +1 -0
- package/dist/api/llama-cpp-classify.js +365 -0
- package/dist/api/llama-cpp-classify.js.map +1 -0
- package/dist/api/llama-cpp-classify.lazy.d.ts +3 -0
- package/dist/api/llama-cpp-classify.lazy.d.ts.map +1 -0
- package/dist/api/llama-cpp-classify.lazy.js +4 -0
- package/dist/api/llama-cpp-classify.lazy.js.map +1 -0
- package/dist/api/mistral-conversations.d.ts +2 -2
- package/dist/api/mistral-conversations.d.ts.map +1 -1
- package/dist/api/mistral-conversations.js +250 -69
- package/dist/api/mistral-conversations.js.map +1 -1
- package/dist/api/openai-codex-responses.d.ts.map +1 -1
- package/dist/api/openai-codex-responses.js +107 -55
- package/dist/api/openai-codex-responses.js.map +1 -1
- package/dist/api/openai-completions.d.ts +11 -4
- package/dist/api/openai-completions.d.ts.map +1 -1
- package/dist/api/openai-completions.js +241 -129
- package/dist/api/openai-completions.js.map +1 -1
- package/dist/api/openai-responses-shared.d.ts +8 -4
- package/dist/api/openai-responses-shared.d.ts.map +1 -1
- package/dist/api/openai-responses-shared.js +109 -58
- package/dist/api/openai-responses-shared.js.map +1 -1
- package/dist/api/openai-responses.d.ts.map +1 -1
- package/dist/api/openai-responses.js +62 -24
- package/dist/api/openai-responses.js.map +1 -1
- package/dist/api/openrouter-images.d.ts +2 -1
- package/dist/api/openrouter-images.d.ts.map +1 -1
- package/dist/api/openrouter-images.js +1 -0
- package/dist/api/openrouter-images.js.map +1 -1
- package/dist/api/openrouter-images.lazy.d.ts.map +1 -1
- package/dist/api/openrouter-images.lazy.js.map +1 -1
- package/dist/api/pi-messages.d.ts +5 -3
- package/dist/api/pi-messages.d.ts.map +1 -1
- package/dist/api/pi-messages.js +13 -4
- package/dist/api/pi-messages.js.map +1 -1
- package/dist/api/simple-options.d.ts +9 -3
- package/dist/api/simple-options.d.ts.map +1 -1
- package/dist/api/simple-options.js +22 -11
- package/dist/api/simple-options.js.map +1 -1
- package/dist/api/system-one-shared.d.ts +23 -0
- package/dist/api/system-one-shared.d.ts.map +1 -0
- package/dist/api/system-one-shared.js +183 -0
- package/dist/api/system-one-shared.js.map +1 -0
- package/dist/api/transform-messages.d.ts.map +1 -1
- package/dist/api/transform-messages.js +21 -7
- package/dist/api/transform-messages.js.map +1 -1
- package/dist/api/typesafe-system-one.d.ts +4 -0
- package/dist/api/typesafe-system-one.d.ts.map +1 -0
- package/dist/api/typesafe-system-one.js +19 -0
- package/dist/api/typesafe-system-one.js.map +1 -0
- package/dist/api/typesafe-system-one.lazy.d.ts +3 -0
- package/dist/api/typesafe-system-one.lazy.d.ts.map +1 -0
- package/dist/api/typesafe-system-one.lazy.js +4 -0
- package/dist/api/typesafe-system-one.lazy.js.map +1 -0
- package/dist/auth/credential-store.d.ts +6 -6
- package/dist/auth/credential-store.d.ts.map +1 -1
- package/dist/auth/credential-store.js +24 -15
- 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 +8 -3
- package/dist/auth/helpers.js.map +1 -1
- package/dist/auth/oauth/anthropic.d.ts.map +1 -1
- package/dist/auth/oauth/anthropic.js +28 -131
- package/dist/auth/oauth/anthropic.js.map +1 -1
- package/dist/auth/oauth/callback-server.d.ts +55 -0
- package/dist/auth/oauth/callback-server.d.ts.map +1 -0
- package/dist/auth/oauth/callback-server.js +146 -0
- package/dist/auth/oauth/callback-server.js.map +1 -0
- package/dist/auth/oauth/device-code.d.ts +2 -1
- package/dist/auth/oauth/device-code.d.ts.map +1 -1
- package/dist/auth/oauth/device-code.js +5 -5
- package/dist/auth/oauth/device-code.js.map +1 -1
- package/dist/auth/oauth/github-copilot.d.ts.map +1 -1
- package/dist/auth/oauth/github-copilot.js +121 -41
- package/dist/auth/oauth/github-copilot.js.map +1 -1
- package/dist/auth/oauth/google-antigravity.d.ts +3 -3
- package/dist/auth/oauth/google-antigravity.d.ts.map +1 -1
- package/dist/auth/oauth/google-antigravity.js +17 -9
- package/dist/auth/oauth/google-antigravity.js.map +1 -1
- package/dist/auth/oauth/google-gemini-cli.d.ts +3 -3
- package/dist/auth/oauth/google-gemini-cli.d.ts.map +1 -1
- package/dist/auth/oauth/google-gemini-cli.js +18 -10
- package/dist/auth/oauth/google-gemini-cli.js.map +1 -1
- package/dist/auth/oauth/kimi-coding.d.ts.map +1 -1
- package/dist/auth/oauth/kimi-coding.js +5 -6
- package/dist/auth/oauth/kimi-coding.js.map +1 -1
- package/dist/auth/oauth/load.d.ts +4 -0
- package/dist/auth/oauth/load.d.ts.map +1 -1
- package/dist/auth/oauth/load.js +10 -0
- package/dist/auth/oauth/load.js.map +1 -1
- package/dist/auth/oauth/meta.d.ts +17 -0
- package/dist/auth/oauth/meta.d.ts.map +1 -0
- package/dist/auth/oauth/meta.js +190 -0
- package/dist/auth/oauth/meta.js.map +1 -0
- package/dist/auth/oauth/openai-chatgpt.d.ts +9 -0
- package/dist/auth/oauth/openai-chatgpt.d.ts.map +1 -0
- package/dist/auth/oauth/openai-chatgpt.js +266 -0
- package/dist/auth/oauth/openai-chatgpt.js.map +1 -0
- package/dist/auth/oauth/openai-codex.d.ts +1 -1
- package/dist/auth/oauth/openai-codex.d.ts.map +1 -1
- package/dist/auth/oauth/openai-codex.js +33 -130
- package/dist/auth/oauth/openai-codex.js.map +1 -1
- package/dist/auth/oauth/openrouter.d.ts +1 -1
- package/dist/auth/oauth/openrouter.d.ts.map +1 -1
- package/dist/auth/oauth/openrouter.js +26 -145
- package/dist/auth/oauth/openrouter.js.map +1 -1
- package/dist/auth/oauth/radius.d.ts +1 -1
- package/dist/auth/oauth/radius.d.ts.map +1 -1
- package/dist/auth/oauth/radius.js +28 -93
- package/dist/auth/oauth/radius.js.map +1 -1
- package/dist/auth/oauth/xai.d.ts.map +1 -1
- package/dist/auth/oauth/xai.js +13 -12
- package/dist/auth/oauth/xai.js.map +1 -1
- package/dist/auth/resolve.d.ts +3 -8
- package/dist/auth/resolve.d.ts.map +1 -1
- package/dist/auth/resolve.js +27 -31
- package/dist/auth/resolve.js.map +1 -1
- package/dist/auth/types.d.ts +29 -8
- package/dist/auth/types.d.ts.map +1 -1
- package/dist/auth/types.js.map +1 -1
- package/dist/bun-oauth.d.ts.map +1 -1
- package/dist/bun-oauth.js +4 -0
- package/dist/bun-oauth.js.map +1 -1
- package/dist/cli.js +4 -1
- package/dist/cli.js.map +1 -1
- package/dist/compat.d.ts +3 -3
- package/dist/compat.d.ts.map +1 -1
- package/dist/compat.js +9 -6
- package/dist/compat.js.map +1 -1
- package/dist/env-api-keys.d.ts +5 -0
- package/dist/env-api-keys.d.ts.map +1 -1
- package/dist/env-api-keys.js +9 -1
- package/dist/env-api-keys.js.map +1 -1
- package/dist/image-models.d.ts +19 -8
- package/dist/image-models.d.ts.map +1 -1
- package/dist/image-models.js +14 -13
- package/dist/image-models.js.map +1 -1
- package/dist/images-api-registry.d.ts +7 -7
- package/dist/images-api-registry.d.ts.map +1 -1
- package/dist/images-api-registry.js.map +1 -1
- package/dist/images.d.ts +7 -2
- package/dist/images.d.ts.map +1 -1
- package/dist/images.js +5 -0
- package/dist/images.js.map +1 -1
- package/dist/index.d.ts +4 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -2
- package/dist/index.js.map +1 -1
- package/dist/model-catalog.d.ts +25 -9
- package/dist/model-catalog.d.ts.map +1 -1
- package/dist/model-catalog.js +14 -2
- package/dist/model-catalog.js.map +1 -1
- package/dist/models-store.d.ts +12 -14
- package/dist/models-store.d.ts.map +1 -1
- package/dist/models-store.js +7 -6
- package/dist/models-store.js.map +1 -1
- package/dist/models.d.ts +138 -47
- package/dist/models.d.ts.map +1 -1
- package/dist/models.generated.d.ts +135 -37
- package/dist/models.generated.d.ts.map +1 -1
- package/dist/models.generated.js +135 -37
- package/dist/models.generated.js.map +1 -1
- package/dist/models.js +391 -99
- package/dist/models.js.map +1 -1
- package/dist/providers/all.d.ts +19 -13
- package/dist/providers/all.d.ts.map +1 -1
- package/dist/providers/all.js +31 -21
- package/dist/providers/all.js.map +1 -1
- package/dist/providers/amazon-bedrock.d.ts.map +1 -1
- package/dist/providers/amazon-bedrock.js +15 -7
- package/dist/providers/amazon-bedrock.js.map +1 -1
- package/dist/providers/amazon-bedrock.models.d.ts +4 -2
- package/dist/providers/amazon-bedrock.models.d.ts.map +1 -1
- package/dist/providers/amazon-bedrock.models.js +4 -2
- package/dist/providers/amazon-bedrock.models.js.map +1 -1
- package/dist/providers/ant-ling.models.d.ts +4 -2
- package/dist/providers/ant-ling.models.d.ts.map +1 -1
- package/dist/providers/ant-ling.models.js +4 -2
- package/dist/providers/ant-ling.models.js.map +1 -1
- package/dist/providers/anthropic.d.ts.map +1 -1
- package/dist/providers/anthropic.js +39 -8
- package/dist/providers/anthropic.js.map +1 -1
- package/dist/providers/anthropic.models.d.ts +4 -2
- package/dist/providers/anthropic.models.d.ts.map +1 -1
- package/dist/providers/anthropic.models.js +4 -2
- package/dist/providers/anthropic.models.js.map +1 -1
- package/dist/providers/azure-openai-responses.models.d.ts +4 -2
- package/dist/providers/azure-openai-responses.models.d.ts.map +1 -1
- package/dist/providers/azure-openai-responses.models.js +4 -2
- package/dist/providers/azure-openai-responses.models.js.map +1 -1
- package/dist/providers/baseten.d.ts +3 -0
- package/dist/providers/baseten.d.ts.map +1 -0
- package/dist/providers/baseten.js +15 -0
- package/dist/providers/baseten.js.map +1 -0
- package/dist/providers/baseten.models.d.ts +6 -0
- package/dist/providers/baseten.models.d.ts.map +1 -0
- package/dist/providers/baseten.models.js +8 -0
- package/dist/providers/baseten.models.js.map +1 -0
- package/dist/providers/cerebras.models.d.ts +4 -2
- package/dist/providers/cerebras.models.d.ts.map +1 -1
- package/dist/providers/cerebras.models.js +4 -2
- package/dist/providers/cerebras.models.js.map +1 -1
- package/dist/providers/cloudflare-ai-gateway.d.ts +3 -1
- package/dist/providers/cloudflare-ai-gateway.d.ts.map +1 -1
- package/dist/providers/cloudflare-ai-gateway.js +4 -0
- package/dist/providers/cloudflare-ai-gateway.js.map +1 -1
- package/dist/providers/cloudflare-ai-gateway.models.d.ts +4 -2
- package/dist/providers/cloudflare-ai-gateway.models.d.ts.map +1 -1
- package/dist/providers/cloudflare-ai-gateway.models.js +4 -2
- 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 +15 -10
- package/dist/providers/cloudflare-auth.js.map +1 -1
- package/dist/providers/cloudflare-stream.d.ts +6 -2
- package/dist/providers/cloudflare-stream.d.ts.map +1 -1
- package/dist/providers/cloudflare-stream.js +6 -0
- package/dist/providers/cloudflare-stream.js.map +1 -1
- package/dist/providers/cloudflare-workers-ai.d.ts.map +1 -1
- package/dist/providers/cloudflare-workers-ai.js +10 -3
- package/dist/providers/cloudflare-workers-ai.js.map +1 -1
- package/dist/providers/cloudflare-workers-ai.models.d.ts +4 -2
- package/dist/providers/cloudflare-workers-ai.models.d.ts.map +1 -1
- package/dist/providers/cloudflare-workers-ai.models.js +4 -2
- package/dist/providers/cloudflare-workers-ai.models.js.map +1 -1
- package/dist/providers/data/.manifest.json +1 -1
- package/dist/providers/data/amazon-bedrock.json +1 -1
- package/dist/providers/data/ant-ling.json +1 -1
- package/dist/providers/data/anthropic.json +1 -1
- package/dist/providers/data/azure-openai-responses.json +1 -1
- package/dist/providers/data/baseten.json +1 -0
- package/dist/providers/data/cerebras.json +1 -1
- package/dist/providers/data/cloudflare-ai-gateway.json +1 -1
- package/dist/providers/data/cloudflare-workers-ai.json +1 -1
- package/dist/providers/data/deepseek.json +1 -1
- package/dist/providers/data/fireworks.json +1 -1
- package/dist/providers/data/github-copilot.json +1 -1
- package/dist/providers/data/google-vertex.json +1 -1
- package/dist/providers/data/google.json +1 -1
- package/dist/providers/data/groq.json +1 -1
- package/dist/providers/data/huggingface.json +1 -1
- package/dist/providers/data/kimi-coding.json +1 -1
- package/dist/providers/data/meta.json +1 -0
- package/dist/providers/data/minimax-cn.json +1 -1
- package/dist/providers/data/minimax.json +1 -1
- package/dist/providers/data/mistral.json +1 -1
- package/dist/providers/data/moonshotai-cn.json +1 -1
- package/dist/providers/data/moonshotai.json +1 -1
- package/dist/providers/data/nvidia.json +1 -1
- package/dist/providers/data/openai-codex.json +1 -1
- package/dist/providers/data/openai.json +1 -1
- package/dist/providers/data/opencode-go.json +1 -1
- package/dist/providers/data/opencode.json +1 -1
- package/dist/providers/data/openrouter.json +1 -1
- package/dist/providers/data/qwen-token-plan-cn.json +1 -1
- package/dist/providers/data/qwen-token-plan-individual.json +1 -0
- package/dist/providers/data/qwen-token-plan.json +1 -1
- package/dist/providers/data/radius.json +1 -0
- package/dist/providers/data/together.json +1 -1
- package/dist/providers/data/typesafe.json +1 -0
- package/dist/providers/data/vercel-ai-gateway.json +1 -1
- package/dist/providers/data/xai.json +1 -1
- package/dist/providers/data/xiaomi-token-plan-ams.json +1 -1
- package/dist/providers/data/xiaomi-token-plan-cn.json +1 -1
- package/dist/providers/data/xiaomi-token-plan-sgp.json +1 -1
- package/dist/providers/data/xiaomi.json +1 -1
- package/dist/providers/data/zai-coding-cn.json +1 -1
- package/dist/providers/data/zai.json +1 -1
- package/dist/providers/deepseek.models.d.ts +4 -2
- package/dist/providers/deepseek.models.d.ts.map +1 -1
- package/dist/providers/deepseek.models.js +4 -2
- package/dist/providers/deepseek.models.js.map +1 -1
- package/dist/providers/faux.d.ts +19 -13
- package/dist/providers/faux.d.ts.map +1 -1
- package/dist/providers/faux.js +109 -18
- package/dist/providers/faux.js.map +1 -1
- package/dist/providers/fireworks.models.d.ts +4 -2
- package/dist/providers/fireworks.models.d.ts.map +1 -1
- package/dist/providers/fireworks.models.js +4 -2
- package/dist/providers/fireworks.models.js.map +1 -1
- package/dist/providers/github-copilot.js +1 -1
- package/dist/providers/github-copilot.js.map +1 -1
- package/dist/providers/github-copilot.models.d.ts +4 -2
- package/dist/providers/github-copilot.models.d.ts.map +1 -1
- package/dist/providers/github-copilot.models.js +4 -2
- 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 +15 -7
- package/dist/providers/google-vertex.js.map +1 -1
- package/dist/providers/google-vertex.models.d.ts +4 -2
- package/dist/providers/google-vertex.models.d.ts.map +1 -1
- package/dist/providers/google-vertex.models.js +4 -2
- package/dist/providers/google-vertex.models.js.map +1 -1
- package/dist/providers/google.models.d.ts +4 -2
- package/dist/providers/google.models.d.ts.map +1 -1
- package/dist/providers/google.models.js +4 -2
- package/dist/providers/google.models.js.map +1 -1
- package/dist/providers/groq.models.d.ts +4 -2
- package/dist/providers/groq.models.d.ts.map +1 -1
- package/dist/providers/groq.models.js +4 -2
- package/dist/providers/groq.models.js.map +1 -1
- package/dist/providers/huggingface.models.d.ts +4 -2
- package/dist/providers/huggingface.models.d.ts.map +1 -1
- package/dist/providers/huggingface.models.js +4 -2
- package/dist/providers/huggingface.models.js.map +1 -1
- package/dist/providers/images/register-builtins.d.ts +1 -1
- package/dist/providers/images/register-builtins.d.ts.map +1 -1
- package/dist/providers/images/register-builtins.js.map +1 -1
- package/dist/providers/kimi-coding.d.ts.map +1 -1
- package/dist/providers/kimi-coding.js +1 -0
- package/dist/providers/kimi-coding.js.map +1 -1
- package/dist/providers/kimi-coding.models.d.ts +4 -2
- package/dist/providers/kimi-coding.models.d.ts.map +1 -1
- package/dist/providers/kimi-coding.models.js +4 -2
- package/dist/providers/kimi-coding.models.js.map +1 -1
- package/dist/providers/meta.d.ts +3 -0
- package/dist/providers/meta.d.ts.map +1 -0
- package/dist/providers/meta.js +24 -0
- package/dist/providers/meta.js.map +1 -0
- package/dist/providers/meta.models.d.ts +6 -0
- package/dist/providers/meta.models.d.ts.map +1 -0
- package/dist/providers/meta.models.js +8 -0
- package/dist/providers/meta.models.js.map +1 -0
- package/dist/providers/minimax-cn.models.d.ts +4 -2
- package/dist/providers/minimax-cn.models.d.ts.map +1 -1
- package/dist/providers/minimax-cn.models.js +4 -2
- package/dist/providers/minimax-cn.models.js.map +1 -1
- package/dist/providers/minimax.models.d.ts +4 -2
- package/dist/providers/minimax.models.d.ts.map +1 -1
- package/dist/providers/minimax.models.js +4 -2
- package/dist/providers/minimax.models.js.map +1 -1
- package/dist/providers/mistral.models.d.ts +4 -2
- package/dist/providers/mistral.models.d.ts.map +1 -1
- package/dist/providers/mistral.models.js +4 -2
- package/dist/providers/mistral.models.js.map +1 -1
- package/dist/providers/moonshotai-cn.models.d.ts +4 -2
- package/dist/providers/moonshotai-cn.models.d.ts.map +1 -1
- package/dist/providers/moonshotai-cn.models.js +4 -2
- package/dist/providers/moonshotai-cn.models.js.map +1 -1
- package/dist/providers/moonshotai.models.d.ts +4 -2
- package/dist/providers/moonshotai.models.d.ts.map +1 -1
- package/dist/providers/moonshotai.models.js +4 -2
- package/dist/providers/moonshotai.models.js.map +1 -1
- package/dist/providers/nvidia.models.d.ts +4 -2
- package/dist/providers/nvidia.models.d.ts.map +1 -1
- package/dist/providers/nvidia.models.js +4 -2
- 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 +6 -2
- package/dist/providers/openai-codex.js.map +1 -1
- package/dist/providers/openai-codex.models.d.ts +4 -2
- package/dist/providers/openai-codex.models.d.ts.map +1 -1
- package/dist/providers/openai-codex.models.js +4 -2
- package/dist/providers/openai-codex.models.js.map +1 -1
- package/dist/providers/openai.d.ts.map +1 -1
- package/dist/providers/openai.js +11 -2
- package/dist/providers/openai.js.map +1 -1
- package/dist/providers/openai.models.d.ts +4 -2
- package/dist/providers/openai.models.d.ts.map +1 -1
- package/dist/providers/openai.models.js +4 -2
- package/dist/providers/openai.models.js.map +1 -1
- package/dist/providers/opencode-go.d.ts.map +1 -1
- package/dist/providers/opencode-go.js +4 -3
- package/dist/providers/opencode-go.js.map +1 -1
- package/dist/providers/opencode-go.models.d.ts +4 -2
- package/dist/providers/opencode-go.models.d.ts.map +1 -1
- package/dist/providers/opencode-go.models.js +4 -2
- package/dist/providers/opencode-go.models.js.map +1 -1
- package/dist/providers/opencode-headers.d.ts +4 -0
- package/dist/providers/opencode-headers.d.ts.map +1 -0
- package/dist/providers/opencode-headers.js +22 -0
- package/dist/providers/opencode-headers.js.map +1 -0
- package/dist/providers/opencode.d.ts +3 -1
- package/dist/providers/opencode.d.ts.map +1 -1
- package/dist/providers/opencode.js +10 -6
- package/dist/providers/opencode.js.map +1 -1
- package/dist/providers/opencode.models.d.ts +4 -2
- package/dist/providers/opencode.models.d.ts.map +1 -1
- package/dist/providers/opencode.models.js +4 -2
- package/dist/providers/opencode.models.js.map +1 -1
- package/dist/providers/openrouter.d.ts +1 -1
- package/dist/providers/openrouter.d.ts.map +1 -1
- package/dist/providers/openrouter.js +16 -3
- package/dist/providers/openrouter.js.map +1 -1
- package/dist/providers/openrouter.models.d.ts +4 -2
- package/dist/providers/openrouter.models.d.ts.map +1 -1
- package/dist/providers/openrouter.models.js +4 -2
- package/dist/providers/openrouter.models.js.map +1 -1
- package/dist/providers/qwen-token-plan-cn.models.d.ts +4 -2
- package/dist/providers/qwen-token-plan-cn.models.d.ts.map +1 -1
- package/dist/providers/qwen-token-plan-cn.models.js +4 -2
- package/dist/providers/qwen-token-plan-cn.models.js.map +1 -1
- package/dist/providers/qwen-token-plan-individual.d.ts +3 -0
- package/dist/providers/qwen-token-plan-individual.d.ts.map +1 -0
- package/dist/providers/qwen-token-plan-individual.js +15 -0
- package/dist/providers/qwen-token-plan-individual.js.map +1 -0
- package/dist/providers/qwen-token-plan-individual.models.d.ts +6 -0
- package/dist/providers/qwen-token-plan-individual.models.d.ts.map +1 -0
- package/dist/providers/qwen-token-plan-individual.models.js +8 -0
- package/dist/providers/qwen-token-plan-individual.models.js.map +1 -0
- package/dist/providers/qwen-token-plan.models.d.ts +4 -2
- package/dist/providers/qwen-token-plan.models.d.ts.map +1 -1
- package/dist/providers/qwen-token-plan.models.js +4 -2
- package/dist/providers/qwen-token-plan.models.js.map +1 -1
- package/dist/providers/radius.d.ts.map +1 -1
- package/dist/providers/radius.js +53 -29
- package/dist/providers/radius.js.map +1 -1
- package/dist/providers/radius.models.d.ts +6 -0
- package/dist/providers/radius.models.d.ts.map +1 -0
- package/dist/providers/radius.models.js +8 -0
- package/dist/providers/radius.models.js.map +1 -0
- package/dist/providers/together.models.d.ts +4 -2
- package/dist/providers/together.models.d.ts.map +1 -1
- package/dist/providers/together.models.js +4 -2
- package/dist/providers/together.models.js.map +1 -1
- package/dist/providers/typesafe.d.ts +3 -0
- package/dist/providers/typesafe.d.ts.map +1 -0
- package/dist/providers/typesafe.js +18 -0
- package/dist/providers/typesafe.js.map +1 -0
- package/dist/providers/typesafe.models.d.ts +6 -0
- package/dist/providers/typesafe.models.d.ts.map +1 -0
- package/dist/providers/typesafe.models.js +8 -0
- package/dist/providers/typesafe.models.js.map +1 -0
- package/dist/providers/vercel-ai-gateway.d.ts.map +1 -1
- package/dist/providers/vercel-ai-gateway.js +5 -2
- package/dist/providers/vercel-ai-gateway.js.map +1 -1
- package/dist/providers/vercel-ai-gateway.models.d.ts +4 -2
- package/dist/providers/vercel-ai-gateway.models.d.ts.map +1 -1
- package/dist/providers/vercel-ai-gateway.models.js +4 -2
- 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 +2 -5
- package/dist/providers/xai.js.map +1 -1
- package/dist/providers/xai.models.d.ts +4 -2
- package/dist/providers/xai.models.d.ts.map +1 -1
- package/dist/providers/xai.models.js +4 -2
- package/dist/providers/xai.models.js.map +1 -1
- package/dist/providers/xiaomi-token-plan-ams.models.d.ts +4 -2
- package/dist/providers/xiaomi-token-plan-ams.models.d.ts.map +1 -1
- package/dist/providers/xiaomi-token-plan-ams.models.js +4 -2
- package/dist/providers/xiaomi-token-plan-ams.models.js.map +1 -1
- package/dist/providers/xiaomi-token-plan-cn.models.d.ts +4 -2
- package/dist/providers/xiaomi-token-plan-cn.models.d.ts.map +1 -1
- package/dist/providers/xiaomi-token-plan-cn.models.js +4 -2
- package/dist/providers/xiaomi-token-plan-cn.models.js.map +1 -1
- package/dist/providers/xiaomi-token-plan-sgp.models.d.ts +4 -2
- package/dist/providers/xiaomi-token-plan-sgp.models.d.ts.map +1 -1
- package/dist/providers/xiaomi-token-plan-sgp.models.js +4 -2
- package/dist/providers/xiaomi-token-plan-sgp.models.js.map +1 -1
- package/dist/providers/xiaomi.models.d.ts +4 -2
- package/dist/providers/xiaomi.models.d.ts.map +1 -1
- package/dist/providers/xiaomi.models.js +4 -2
- package/dist/providers/xiaomi.models.js.map +1 -1
- package/dist/providers/zai-coding-cn.models.d.ts +4 -2
- package/dist/providers/zai-coding-cn.models.d.ts.map +1 -1
- package/dist/providers/zai-coding-cn.models.js +4 -2
- package/dist/providers/zai-coding-cn.models.js.map +1 -1
- package/dist/providers/zai.models.d.ts +4 -2
- package/dist/providers/zai.models.d.ts.map +1 -1
- package/dist/providers/zai.models.js +4 -2
- package/dist/providers/zai.models.js.map +1 -1
- package/dist/types.d.ts +411 -127
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js.map +1 -1
- package/dist/utils/abort.d.ts +8 -0
- package/dist/utils/abort.d.ts.map +1 -0
- package/dist/utils/abort.js +49 -0
- package/dist/utils/abort.js.map +1 -0
- package/dist/utils/assistant-message-frame.d.ts +77 -0
- package/dist/utils/assistant-message-frame.d.ts.map +1 -0
- package/dist/utils/assistant-message-frame.js +425 -0
- package/dist/utils/assistant-message-frame.js.map +1 -0
- package/dist/utils/diagnostics.d.ts +3 -2
- package/dist/utils/diagnostics.d.ts.map +1 -1
- package/dist/utils/diagnostics.js.map +1 -1
- package/dist/utils/draht-user-agent.d.ts +2 -0
- package/dist/utils/draht-user-agent.d.ts.map +1 -0
- package/dist/utils/draht-user-agent.js +12 -0
- package/dist/utils/draht-user-agent.js.map +1 -0
- package/dist/utils/error-body.d.ts.map +1 -1
- package/dist/utils/error-body.js +23 -4
- package/dist/utils/error-body.js.map +1 -1
- package/dist/utils/estimate.d.ts +2 -2
- package/dist/utils/estimate.d.ts.map +1 -1
- package/dist/utils/estimate.js +8 -29
- package/dist/utils/estimate.js.map +1 -1
- package/dist/utils/event-stream.d.ts.map +1 -1
- package/dist/utils/event-stream.js +30 -8
- package/dist/utils/event-stream.js.map +1 -1
- package/dist/utils/headers.d.ts +1 -1
- package/dist/utils/headers.d.ts.map +1 -1
- package/dist/utils/headers.js +10 -8
- package/dist/utils/headers.js.map +1 -1
- package/dist/utils/model-operations.d.ts +11 -0
- package/dist/utils/model-operations.d.ts.map +1 -0
- package/dist/utils/model-operations.js +47 -0
- package/dist/utils/model-operations.js.map +1 -0
- package/dist/utils/models-error.d.ts +8 -0
- package/dist/utils/models-error.d.ts.map +1 -0
- package/dist/utils/models-error.js +19 -0
- package/dist/utils/models-error.js.map +1 -0
- 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/oauth-page.d.ts.map +1 -0
- package/dist/utils/oauth-page.js.map +1 -0
- package/dist/utils/overflow.d.ts +11 -1
- package/dist/utils/overflow.d.ts.map +1 -1
- package/dist/utils/overflow.js +24 -6
- package/dist/utils/overflow.js.map +1 -1
- package/dist/utils/provider-retry.js +3 -2
- package/dist/utils/provider-retry.js.map +1 -1
- package/dist/utils/retry.d.ts +6 -1
- package/dist/utils/retry.d.ts.map +1 -1
- package/dist/utils/retry.js +19 -2
- 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 +9 -1
- package/dist/utils/text.d.ts.map +1 -1
- package/dist/utils/text.js +26 -0
- package/dist/utils/text.js.map +1 -1
- package/dist/utils/transcript.d.ts +84 -0
- package/dist/utils/transcript.d.ts.map +1 -0
- package/dist/utils/transcript.js +204 -0
- package/dist/utils/transcript.js.map +1 -0
- package/dist/utils/uuid.d.ts +2 -2
- package/dist/utils/uuid.d.ts.map +1 -1
- package/dist/utils/uuid.js +35 -40
- package/dist/utils/uuid.js.map +1 -1
- package/dist/utils/validation.d.ts.map +1 -1
- package/dist/utils/validation.js +40 -0
- package/dist/utils/validation.js.map +1 -1
- package/package.json +19 -13
- package/dist/auth/oauth/oauth-page.d.ts.map +0 -1
- package/dist/auth/oauth/oauth-page.js.map +0 -1
- package/dist/image-models.generated.d.ts +0 -605
- package/dist/image-models.generated.d.ts.map +0 -1
- package/dist/image-models.generated.js +0 -607
- package/dist/image-models.generated.js.map +0 -1
- package/dist/images-models.d.ts +0 -95
- package/dist/images-models.d.ts.map +0 -1
- package/dist/images-models.js +0 -140
- package/dist/images-models.js.map +0 -1
- package/dist/providers/openrouter-images.d.ts +0 -3
- package/dist/providers/openrouter-images.d.ts.map +0 -1
- package/dist/providers/openrouter-images.js +0 -22
- package/dist/providers/openrouter-images.js.map +0 -1
- package/dist/utils/deferred-tools.d.ts +0 -9
- package/dist/utils/deferred-tools.d.ts.map +0 -1
- package/dist/utils/deferred-tools.js +0 -36
- package/dist/utils/deferred-tools.js.map +0 -1
- /package/dist/{auth/oauth → utils}/oauth-page.d.ts +0 -0
- /package/dist/{auth/oauth → utils}/oauth-page.js +0 -0
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import OpenAI from "openai";
|
|
2
2
|
import { calculateCost, clampThinkingLevel } from "../models.js";
|
|
3
|
+
import { getDrahtUserAgent } from "../utils/draht-user-agent.js";
|
|
3
4
|
import { formatProviderError, normalizeProviderError } from "../utils/error-body.js";
|
|
4
5
|
import { AssistantMessageEventStream } from "../utils/event-stream.js";
|
|
5
6
|
import { shortHash } from "../utils/hash.js";
|
|
@@ -8,10 +9,12 @@ import { parseStreamingJson } from "../utils/json-parse.js";
|
|
|
8
9
|
import { getProviderEnvValue } from "../utils/provider-env.js";
|
|
9
10
|
import { retryProviderRequest } from "../utils/provider-retry.js";
|
|
10
11
|
import { sanitizeSurrogates } from "../utils/sanitize-unicode.js";
|
|
11
|
-
import {
|
|
12
|
+
import { getSystemMessageText, renderSystemMessageUpdate } from "../utils/text.js";
|
|
13
|
+
import { getDeclaredTools, resolveTranscript, resolveTranscriptTools, } from "../utils/transcript.js";
|
|
14
|
+
import { appendGrammarToolInputJsonDelta, createGrammarToolInputProperties, getGrammarToolInput, getJsonSchemaToolParameters, resolveGrammarConstrainedSampling, resolveJsonSchemaStrictSampling, } from "./constrained-sampling.js";
|
|
12
15
|
import { buildCopilotDynamicHeaders, hasCopilotVisionInput } from "./github-copilot-headers.js";
|
|
13
16
|
import { clampOpenAIPromptCacheKey } from "./openai-prompt-cache.js";
|
|
14
|
-
import { buildBaseOptions } from "./simple-options.js";
|
|
17
|
+
import { buildBaseOptions, clampThinkingBudgetToAnswerRoom, thinkingBudgetForLevel } from "./simple-options.js";
|
|
15
18
|
import { transformMessages } from "./transform-messages.js";
|
|
16
19
|
/**
|
|
17
20
|
* Check if conversation messages contain tool calls or tool results.
|
|
@@ -48,25 +51,6 @@ function hasToolHistory(messages) {
|
|
|
48
51
|
}
|
|
49
52
|
return false;
|
|
50
53
|
}
|
|
51
|
-
function getDeferredToolNames(messages) {
|
|
52
|
-
const names = new Set();
|
|
53
|
-
for (const message of messages) {
|
|
54
|
-
if (message.role === "toolResult") {
|
|
55
|
-
for (const name of message.addedToolNames ?? []) {
|
|
56
|
-
names.add(name);
|
|
57
|
-
}
|
|
58
|
-
}
|
|
59
|
-
}
|
|
60
|
-
return names;
|
|
61
|
-
}
|
|
62
|
-
function getToolsByName(tools, names) {
|
|
63
|
-
if (!tools)
|
|
64
|
-
return [];
|
|
65
|
-
const toolsByName = new Map(tools.map((tool) => [tool.name, tool]));
|
|
66
|
-
return Array.from(names)
|
|
67
|
-
.map((name) => toolsByName.get(name))
|
|
68
|
-
.filter((tool) => tool !== undefined);
|
|
69
|
-
}
|
|
70
54
|
function isTextContentBlock(block) {
|
|
71
55
|
return block.type === "text";
|
|
72
56
|
}
|
|
@@ -79,28 +63,94 @@ function isToolCallBlock(block) {
|
|
|
79
63
|
function isImageContentBlock(block) {
|
|
80
64
|
return block.type === "image";
|
|
81
65
|
}
|
|
82
|
-
function
|
|
83
|
-
|
|
66
|
+
function isReasoningDetailObject(detail) {
|
|
67
|
+
return typeof detail === "object" && detail !== null && !Array.isArray(detail);
|
|
68
|
+
}
|
|
69
|
+
function hasValidCommonReasoningDetailFields(candidate) {
|
|
70
|
+
return ((candidate.id === undefined || candidate.id === null || typeof candidate.id === "string") &&
|
|
71
|
+
(candidate.format === undefined || typeof candidate.format === "string") &&
|
|
72
|
+
(candidate.index === undefined || typeof candidate.index === "number"));
|
|
73
|
+
}
|
|
74
|
+
function isOpenAIReasoningDetail(detail) {
|
|
75
|
+
if (!isReasoningDetailObject(detail) || !hasValidCommonReasoningDetailFields(detail)) {
|
|
84
76
|
return false;
|
|
85
77
|
}
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
78
|
+
switch (detail.type) {
|
|
79
|
+
case "reasoning.summary":
|
|
80
|
+
return typeof detail.summary === "string";
|
|
81
|
+
case "reasoning.encrypted":
|
|
82
|
+
return typeof detail.data === "string";
|
|
83
|
+
case "reasoning.text":
|
|
84
|
+
return (typeof detail.text === "string" &&
|
|
85
|
+
(detail.signature === undefined || detail.signature === null || typeof detail.signature === "string"));
|
|
86
|
+
default:
|
|
87
|
+
return false;
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
function parseOpenAIReasoningDetails(signature) {
|
|
91
|
+
if (!signature)
|
|
92
|
+
return undefined;
|
|
93
|
+
try {
|
|
94
|
+
const parsed = JSON.parse(signature);
|
|
95
|
+
return Array.isArray(parsed) && parsed.length > 0 && parsed.every(isOpenAIReasoningDetail) ? parsed : undefined;
|
|
96
|
+
}
|
|
97
|
+
catch {
|
|
98
|
+
return undefined;
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
function parseLegacyEncryptedReasoningDetail(signature) {
|
|
102
|
+
if (!signature)
|
|
103
|
+
return undefined;
|
|
104
|
+
try {
|
|
105
|
+
const parsed = JSON.parse(signature);
|
|
106
|
+
return isOpenAIReasoningDetail(parsed) &&
|
|
107
|
+
parsed.type === "reasoning.encrypted" &&
|
|
108
|
+
typeof parsed.id === "string" &&
|
|
109
|
+
parsed.id.length > 0 &&
|
|
110
|
+
parsed.data.length > 0
|
|
111
|
+
? parsed
|
|
112
|
+
: undefined;
|
|
113
|
+
}
|
|
114
|
+
catch {
|
|
115
|
+
return undefined;
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
function fillMissingCommonReasoningDetailFields(target, source) {
|
|
119
|
+
target.id ??= source.id;
|
|
120
|
+
target.format ||= source.format;
|
|
121
|
+
target.index ??= source.index;
|
|
122
|
+
}
|
|
123
|
+
function appendOpenAIReasoningDetail(details, detail) {
|
|
124
|
+
const lastDetail = details[details.length - 1];
|
|
125
|
+
if (detail.type === "reasoning.text" && lastDetail?.type === "reasoning.text") {
|
|
126
|
+
lastDetail.text += detail.text;
|
|
127
|
+
lastDetail.signature ||= detail.signature;
|
|
128
|
+
fillMissingCommonReasoningDetailFields(lastDetail, detail);
|
|
129
|
+
return;
|
|
130
|
+
}
|
|
131
|
+
if (detail.type === "reasoning.summary" && lastDetail?.type === "reasoning.summary") {
|
|
132
|
+
lastDetail.summary += detail.summary;
|
|
133
|
+
fillMissingCommonReasoningDetailFields(lastDetail, detail);
|
|
134
|
+
return;
|
|
135
|
+
}
|
|
136
|
+
details.push({ ...detail });
|
|
137
|
+
}
|
|
138
|
+
const OPENAI_COMPLETIONS_REASONING_FIELDS = ["reasoning", "reasoning_content", "reasoning_text"];
|
|
139
|
+
function isOpenAICompletionsReasoningField(field) {
|
|
140
|
+
return OPENAI_COMPLETIONS_REASONING_FIELDS.includes(field);
|
|
92
141
|
}
|
|
93
142
|
function resolveCacheRetention(cacheRetention, env) {
|
|
94
143
|
if (cacheRetention) {
|
|
95
144
|
return cacheRetention;
|
|
96
145
|
}
|
|
97
|
-
if (getProviderEnvValue("
|
|
146
|
+
if (getProviderEnvValue("DRAHT_CACHE_RETENTION", env) === "long") {
|
|
98
147
|
return "long";
|
|
99
148
|
}
|
|
100
149
|
return "short";
|
|
101
150
|
}
|
|
102
151
|
export const stream = (model, context, options) => {
|
|
103
152
|
const stream = new AssistantMessageEventStream();
|
|
153
|
+
const normalizedContext = resolveTranscript(context, getCompat(model).supportsMidConvoSystemMessages);
|
|
104
154
|
(async () => {
|
|
105
155
|
const output = {
|
|
106
156
|
role: "assistant",
|
|
@@ -119,14 +169,22 @@ export const stream = (model, context, options) => {
|
|
|
119
169
|
stopReason: "pending",
|
|
120
170
|
timestamp: Date.now(),
|
|
121
171
|
};
|
|
172
|
+
// `reasoning_details` are replay metadata, not user-visible stream deltas.
|
|
173
|
+
// Keep them in memory during streaming and serialize once when the block is finalized.
|
|
174
|
+
let streamedReasoningDetails;
|
|
175
|
+
const applyStreamedReasoningDetails = (block) => {
|
|
176
|
+
if (streamedReasoningDetails !== undefined) {
|
|
177
|
+
block.thinkingSignature = JSON.stringify(streamedReasoningDetails);
|
|
178
|
+
}
|
|
179
|
+
};
|
|
122
180
|
try {
|
|
123
181
|
const apiKey = getClientApiKey(model.provider, options?.apiKey, options?.headers);
|
|
124
182
|
const compat = getCompat(model);
|
|
125
|
-
const grammarToolInputProperties = createGrammarToolInputProperties(
|
|
183
|
+
const grammarToolInputProperties = createGrammarToolInputProperties(getDeclaredTools(normalizedContext.messages), compat.supportsOpenAIGrammarTools);
|
|
126
184
|
const cacheRetention = resolveCacheRetention(options?.cacheRetention, options?.env);
|
|
127
185
|
const cacheSessionId = cacheRetention === "none" ? undefined : options?.sessionId;
|
|
128
|
-
const client = createClient(model,
|
|
129
|
-
let params = buildParams(model,
|
|
186
|
+
const client = createClient(model, normalizedContext, apiKey, options?.headers, options?.fetch, cacheSessionId, compat);
|
|
187
|
+
let params = buildParams(model, normalizedContext, options, compat, cacheRetention, grammarToolInputProperties);
|
|
130
188
|
const nextParams = await options?.onPayload?.(params, model);
|
|
131
189
|
if (nextParams !== undefined) {
|
|
132
190
|
params = nextParams;
|
|
@@ -148,7 +206,6 @@ export const stream = (model, context, options) => {
|
|
|
148
206
|
let hasFinishReason = false;
|
|
149
207
|
const toolCallBlocksByIndex = new Map();
|
|
150
208
|
const toolCallBlocksById = new Map();
|
|
151
|
-
const pendingReasoningDetailsByToolCallId = new Map();
|
|
152
209
|
const blocks = output.content;
|
|
153
210
|
const getContentIndex = (block) => blocks.indexOf(block);
|
|
154
211
|
const getCustomToolCallInput = (block) => {
|
|
@@ -180,6 +237,7 @@ export const stream = (model, context, options) => {
|
|
|
180
237
|
});
|
|
181
238
|
}
|
|
182
239
|
else if (block.type === "thinking") {
|
|
240
|
+
applyStreamedReasoningDetails(block);
|
|
183
241
|
stream.push({
|
|
184
242
|
type: "thinking_end",
|
|
185
243
|
contentIndex,
|
|
@@ -235,16 +293,6 @@ export const stream = (model, context, options) => {
|
|
|
235
293
|
}
|
|
236
294
|
return thinkingBlock;
|
|
237
295
|
};
|
|
238
|
-
const applyPendingReasoningDetail = (block) => {
|
|
239
|
-
if (!block.id) {
|
|
240
|
-
return;
|
|
241
|
-
}
|
|
242
|
-
const pendingReasoningDetail = pendingReasoningDetailsByToolCallId.get(block.id);
|
|
243
|
-
if (pendingReasoningDetail) {
|
|
244
|
-
block.thoughtSignature = pendingReasoningDetail;
|
|
245
|
-
pendingReasoningDetailsByToolCallId.delete(block.id);
|
|
246
|
-
}
|
|
247
|
-
};
|
|
248
296
|
const ensureToolCallBlock = (toolCall) => {
|
|
249
297
|
const streamIndex = typeof toolCall.index === "number" ? toolCall.index : undefined;
|
|
250
298
|
const name = toolCall.function?.name ?? toolCall.custom?.name ?? "";
|
|
@@ -300,10 +348,10 @@ export const stream = (model, context, options) => {
|
|
|
300
348
|
};
|
|
301
349
|
delete block.partialArgs;
|
|
302
350
|
}
|
|
303
|
-
applyPendingReasoningDetail(block);
|
|
304
351
|
return block;
|
|
305
352
|
};
|
|
306
353
|
for await (const chunk of openaiStream) {
|
|
354
|
+
await options?.onProviderStreamEvent?.(chunk, model);
|
|
307
355
|
if (!chunk || typeof chunk !== "object")
|
|
308
356
|
continue;
|
|
309
357
|
// OpenAI documents ChatCompletionChunk.id as the unique chat completion identifier,
|
|
@@ -407,16 +455,14 @@ export const stream = (model, context, options) => {
|
|
|
407
455
|
const reasoningDetails = choice.delta.reasoning_details;
|
|
408
456
|
if (Array.isArray(reasoningDetails)) {
|
|
409
457
|
for (const detail of reasoningDetails) {
|
|
410
|
-
if (
|
|
411
|
-
|
|
412
|
-
|
|
413
|
-
|
|
414
|
-
|
|
415
|
-
|
|
416
|
-
|
|
417
|
-
|
|
418
|
-
}
|
|
419
|
-
}
|
|
458
|
+
if (!isOpenAIReasoningDetail(detail))
|
|
459
|
+
continue;
|
|
460
|
+
ensureThinkingBlock("");
|
|
461
|
+
streamedReasoningDetails ??= [];
|
|
462
|
+
// Keep provider replay data in the existing signature slot. OpenRouter streams
|
|
463
|
+
// reasoning_details as deltas: consecutive text/summary deltas are merged into
|
|
464
|
+
// logical entries, while encrypted entries remain opaque and discrete.
|
|
465
|
+
appendOpenAIReasoningDetail(streamedReasoningDetails, detail);
|
|
420
466
|
}
|
|
421
467
|
}
|
|
422
468
|
}
|
|
@@ -430,10 +476,13 @@ export const stream = (model, context, options) => {
|
|
|
430
476
|
if (output.stopReason === "aborted") {
|
|
431
477
|
throw new Error("Request was aborted");
|
|
432
478
|
}
|
|
479
|
+
if (!hasFinishReason && !compat.supportsFinishReason) {
|
|
480
|
+
output.stopReason = output.content.some((block) => block.type === "toolCall") ? "toolUse" : "stop";
|
|
481
|
+
}
|
|
433
482
|
if (output.stopReason === "error") {
|
|
434
483
|
throw new Error(output.errorMessage || "Provider returned an error stop reason");
|
|
435
484
|
}
|
|
436
|
-
if (!hasFinishReason || output.stopReason === "pending") {
|
|
485
|
+
if ((compat.supportsFinishReason && !hasFinishReason) || output.stopReason === "pending") {
|
|
437
486
|
throw new Error("Stream ended without finish_reason");
|
|
438
487
|
}
|
|
439
488
|
stream.push({ type: "done", reason: output.stopReason, message: output });
|
|
@@ -441,6 +490,9 @@ export const stream = (model, context, options) => {
|
|
|
441
490
|
}
|
|
442
491
|
catch (error) {
|
|
443
492
|
for (const block of output.content) {
|
|
493
|
+
if (block.type === "thinking") {
|
|
494
|
+
applyStreamedReasoningDetails(block);
|
|
495
|
+
}
|
|
444
496
|
delete block.index;
|
|
445
497
|
// Streaming scratch buffers are only used during parsing; never persist them.
|
|
446
498
|
delete block.partialArgs;
|
|
@@ -465,18 +517,20 @@ export const stream = (model, context, options) => {
|
|
|
465
517
|
};
|
|
466
518
|
export const streamSimple = (model, context, options) => {
|
|
467
519
|
getClientApiKey(model.provider, options?.apiKey, options?.headers);
|
|
468
|
-
const base =
|
|
520
|
+
const base = {
|
|
521
|
+
...buildBaseOptions(model, context, options, options?.apiKey),
|
|
522
|
+
toolChoice: options?.toolChoice,
|
|
523
|
+
};
|
|
469
524
|
const clampedReasoning = options?.reasoning ? clampThinkingLevel(model, options.reasoning) : undefined;
|
|
470
525
|
const reasoningEffort = clampedReasoning === "off" ? undefined : clampedReasoning;
|
|
471
|
-
const toolChoice = options?.toolChoice;
|
|
472
526
|
return stream(model, context, {
|
|
473
527
|
...base,
|
|
474
528
|
reasoningEffort,
|
|
475
|
-
|
|
529
|
+
thinkingBudgets: options?.thinkingBudgets,
|
|
476
530
|
});
|
|
477
531
|
};
|
|
478
532
|
function createClient(model, context, apiKey, optionsHeaders, fetch, sessionId, compat = getCompat(model)) {
|
|
479
|
-
const headers = { ...model.headers };
|
|
533
|
+
const headers = { "User-Agent": getDrahtUserAgent(), ...model.headers };
|
|
480
534
|
if (model.provider === "github-copilot") {
|
|
481
535
|
const hasImages = hasCopilotVisionInput(context.messages);
|
|
482
536
|
const copilotHeaders = buildCopilotDynamicHeaders({
|
|
@@ -509,8 +563,11 @@ function createClient(model, context, apiKey, optionsHeaders, fetch, sessionId,
|
|
|
509
563
|
defaultHeaders: headers,
|
|
510
564
|
});
|
|
511
565
|
}
|
|
512
|
-
function buildParams(model, context, options, compat = getCompat(model), cacheRetention = resolveCacheRetention(options?.cacheRetention, options?.env), grammarToolInputProperties = createGrammarToolInputProperties(context.
|
|
513
|
-
const
|
|
566
|
+
function buildParams(model, context, options, compat = getCompat(model), cacheRetention = resolveCacheRetention(options?.cacheRetention, options?.env), grammarToolInputProperties = createGrammarToolInputProperties(getDeclaredTools(context.messages), compat.supportsOpenAIGrammarTools)) {
|
|
567
|
+
const transcriptTools = resolveTranscriptTools(context.messages, compat.supportsMidConvoSystemMessages === true && compat.supportsMidConvoToolAdditions === true);
|
|
568
|
+
const messages = convertMessages(model, context, compat, {
|
|
569
|
+
grammarToolInputProperties,
|
|
570
|
+
});
|
|
514
571
|
const cacheControl = getCompatCacheControl(compat, cacheRetention);
|
|
515
572
|
const params = {
|
|
516
573
|
model: model.id,
|
|
@@ -530,6 +587,7 @@ function buildParams(model, context, options, compat = getCompat(model), cacheRe
|
|
|
530
587
|
}
|
|
531
588
|
if (options?.maxTokens) {
|
|
532
589
|
if (compat.maxTokensField === "max_tokens") {
|
|
590
|
+
// Deprecated by OpenAI, but some OpenAI-compatible providers only accept max_tokens.
|
|
533
591
|
params.max_tokens = options.maxTokens;
|
|
534
592
|
}
|
|
535
593
|
else {
|
|
@@ -539,10 +597,8 @@ function buildParams(model, context, options, compat = getCompat(model), cacheRe
|
|
|
539
597
|
if (options?.temperature !== undefined) {
|
|
540
598
|
params.temperature = options.temperature;
|
|
541
599
|
}
|
|
542
|
-
|
|
543
|
-
|
|
544
|
-
if (activeTools && activeTools.length > 0) {
|
|
545
|
-
params.tools = convertTools(activeTools, compat);
|
|
600
|
+
if (transcriptTools.requestTools.length > 0) {
|
|
601
|
+
params.tools = convertTools(transcriptTools.requestTools, compat);
|
|
546
602
|
if (compat.zaiToolStream) {
|
|
547
603
|
params.tool_stream = true;
|
|
548
604
|
}
|
|
@@ -557,6 +613,11 @@ function buildParams(model, context, options, compat = getCompat(model), cacheRe
|
|
|
557
613
|
if (options?.toolChoice) {
|
|
558
614
|
params.tool_choice = options.toolChoice;
|
|
559
615
|
}
|
|
616
|
+
if (compat.vllmPriority !== undefined) {
|
|
617
|
+
params.priority = compat.vllmPriority;
|
|
618
|
+
}
|
|
619
|
+
const thinkingTokenBudgetField = resolveThinkingTokenBudgetField(compat);
|
|
620
|
+
const thinkingBudget = resolveClampedThinkingBudget(model, options, params);
|
|
560
621
|
if (compat.thinkingFormat === "zai" && model.reasoning) {
|
|
561
622
|
const zaiParams = params;
|
|
562
623
|
zaiParams.thinking = options?.reasoningEffort ? { type: "enabled", clear_thinking: false } : { type: "disabled" };
|
|
@@ -584,11 +645,26 @@ function buildParams(model, context, options, compat = getCompat(model), cacheRe
|
|
|
584
645
|
};
|
|
585
646
|
}
|
|
586
647
|
else if (compat.thinkingFormat === "chat-template" && model.reasoning) {
|
|
587
|
-
const chatTemplateKwargs =
|
|
648
|
+
const chatTemplateKwargs = buildChatTemplateValues(model, options, compat.chatTemplateKwargs, thinkingBudget);
|
|
588
649
|
if (chatTemplateKwargs) {
|
|
589
650
|
params.chat_template_kwargs = chatTemplateKwargs;
|
|
590
651
|
}
|
|
591
652
|
}
|
|
653
|
+
else if (compat.thinkingFormat === "baseten" && model.reasoning) {
|
|
654
|
+
const basetenParams = params;
|
|
655
|
+
const chatTemplateArgs = buildChatTemplateValues(model, options, compat.chatTemplateArgs, thinkingBudget);
|
|
656
|
+
if (chatTemplateArgs) {
|
|
657
|
+
basetenParams.chat_template_args = chatTemplateArgs;
|
|
658
|
+
}
|
|
659
|
+
if (compat.supportsReasoningEffort) {
|
|
660
|
+
const requestedEffort = options?.reasoningEffort;
|
|
661
|
+
const mappedEffort = requestedEffort ? model.thinkingLevelMap?.[requestedEffort] : model.thinkingLevelMap?.off;
|
|
662
|
+
const effort = mappedEffort === undefined ? requestedEffort : mappedEffort;
|
|
663
|
+
if (typeof effort === "string") {
|
|
664
|
+
basetenParams.reasoning_effort = effort;
|
|
665
|
+
}
|
|
666
|
+
}
|
|
667
|
+
}
|
|
592
668
|
else if (compat.thinkingFormat === "deepseek" && model.reasoning) {
|
|
593
669
|
if (options?.reasoningEffort) {
|
|
594
670
|
params.thinking = { type: "enabled" };
|
|
@@ -645,6 +721,13 @@ function buildParams(model, context, options, compat = getCompat(model), cacheRe
|
|
|
645
721
|
params.reasoning_effort = offValue;
|
|
646
722
|
}
|
|
647
723
|
}
|
|
724
|
+
// Cap reasoning with a top-level budget field. Independent of thinkingFormat: the
|
|
725
|
+
// same server can serve zai, qwen or chat-template models. Reasoning and the answer
|
|
726
|
+
// share max_tokens here, so an uncapped reasoning phase can consume the whole
|
|
727
|
+
// response and leave no answer and no tool call.
|
|
728
|
+
if (thinkingTokenBudgetField && thinkingBudget !== undefined) {
|
|
729
|
+
Object.assign(params, { [thinkingTokenBudgetField]: thinkingBudget });
|
|
730
|
+
}
|
|
648
731
|
// OpenRouter provider routing preferences
|
|
649
732
|
if (model.compat?.openRouterRouting) {
|
|
650
733
|
params.provider = model.compat.openRouterRouting;
|
|
@@ -661,19 +744,35 @@ function buildParams(model, context, options, compat = getCompat(model), cacheRe
|
|
|
661
744
|
params.providerOptions = { gateway: gatewayOptions };
|
|
662
745
|
}
|
|
663
746
|
}
|
|
747
|
+
// Last so custom keys override the named request fields. Per-request keys override model defaults.
|
|
748
|
+
Object.assign(params, model.samplingParams, options?.samplingParams);
|
|
664
749
|
return params;
|
|
665
750
|
}
|
|
666
|
-
function
|
|
667
|
-
|
|
668
|
-
|
|
669
|
-
|
|
751
|
+
function resolveThinkingTokenBudgetField(compat) {
|
|
752
|
+
if (compat.thinkingTokenBudgetField)
|
|
753
|
+
return compat.thinkingTokenBudgetField;
|
|
754
|
+
if (compat.supportsThinkingTokenBudget)
|
|
755
|
+
return "thinking_token_budget";
|
|
756
|
+
return undefined;
|
|
757
|
+
}
|
|
758
|
+
function resolveClampedThinkingBudget(model, options, params) {
|
|
759
|
+
if (!options?.reasoningEffort || !model.reasoning)
|
|
760
|
+
return undefined;
|
|
761
|
+
const ceiling = params.max_tokens ?? params.max_completion_tokens ?? model.maxTokens;
|
|
762
|
+
const budget = clampThinkingBudgetToAnswerRoom(thinkingBudgetForLevel(options.reasoningEffort, options.thinkingBudgets), ceiling);
|
|
763
|
+
return budget > 0 ? budget : undefined;
|
|
764
|
+
}
|
|
765
|
+
function buildChatTemplateValues(model, options, values, thinkingBudget) {
|
|
766
|
+
const resolvedValues = {};
|
|
767
|
+
for (const [key, value] of Object.entries(values)) {
|
|
768
|
+
const resolved = resolveChatTemplateKwargValue(model, options, value, thinkingBudget);
|
|
670
769
|
if (resolved !== undefined) {
|
|
671
|
-
|
|
770
|
+
resolvedValues[key] = resolved;
|
|
672
771
|
}
|
|
673
772
|
}
|
|
674
|
-
return Object.keys(
|
|
773
|
+
return Object.keys(resolvedValues).length > 0 ? resolvedValues : undefined;
|
|
675
774
|
}
|
|
676
|
-
function resolveChatTemplateKwargValue(model, options, value) {
|
|
775
|
+
function resolveChatTemplateKwargValue(model, options, value, thinkingBudget) {
|
|
677
776
|
if (typeof value !== "object" || value === null) {
|
|
678
777
|
return value;
|
|
679
778
|
}
|
|
@@ -684,6 +783,9 @@ function resolveChatTemplateKwargValue(model, options, value) {
|
|
|
684
783
|
if (value.$var === "thinking.enabled") {
|
|
685
784
|
return !!reasoningEffort;
|
|
686
785
|
}
|
|
786
|
+
if (value.$var === "thinking.budget") {
|
|
787
|
+
return thinkingBudget;
|
|
788
|
+
}
|
|
687
789
|
const mappedValue = reasoningEffort ? model.thinkingLevelMap?.[reasoningEffort] : model.thinkingLevelMap?.off;
|
|
688
790
|
return mappedValue === undefined ? reasoningEffort : typeof mappedValue === "string" ? mappedValue : undefined;
|
|
689
791
|
}
|
|
@@ -762,6 +864,7 @@ function addCacheControlToTextContent(message, cacheControl) {
|
|
|
762
864
|
return false;
|
|
763
865
|
}
|
|
764
866
|
export function convertMessages(model, context, compat, options) {
|
|
867
|
+
const normalizedContext = resolveTranscript(context, compat.supportsMidConvoSystemMessages);
|
|
765
868
|
const params = [];
|
|
766
869
|
const normalizeToolCallId = (id) => {
|
|
767
870
|
// Handle pipe-separated IDs from OpenAI Responses API
|
|
@@ -788,12 +891,9 @@ export function convertMessages(model, context, compat, options) {
|
|
|
788
891
|
return id.length > 40 ? id.slice(0, 40) : id;
|
|
789
892
|
return id;
|
|
790
893
|
};
|
|
791
|
-
const transformedMessages = transformMessages(
|
|
792
|
-
|
|
793
|
-
|
|
794
|
-
const role = useDeveloperRole ? "developer" : "system";
|
|
795
|
-
params.push({ role: role, content: sanitizeSurrogates(context.systemPrompt) });
|
|
796
|
-
}
|
|
894
|
+
const transformedMessages = transformMessages(normalizedContext.messages, model, (id) => normalizeToolCallId(id));
|
|
895
|
+
const transcriptTools = resolveTranscriptTools(normalizedContext.messages, compat.supportsMidConvoSystemMessages === true && compat.supportsMidConvoToolAdditions === true);
|
|
896
|
+
const instructionRole = model.reasoning && compat.supportsDeveloperRole ? "developer" : "system";
|
|
797
897
|
let lastRole = null;
|
|
798
898
|
for (let i = 0; i < transformedMessages.length; i++) {
|
|
799
899
|
const msg = transformedMessages[i];
|
|
@@ -805,7 +905,21 @@ export function convertMessages(model, context, compat, options) {
|
|
|
805
905
|
content: "I have processed the tool results.",
|
|
806
906
|
});
|
|
807
907
|
}
|
|
808
|
-
if (msg.role === "
|
|
908
|
+
if (msg.role === "system") {
|
|
909
|
+
const addedTools = i > 0 && transcriptTools.anchorsAdditions ? (msg.toolsAdded ?? []) : [];
|
|
910
|
+
if (addedTools.length > 0) {
|
|
911
|
+
const kimiToolMessage = {
|
|
912
|
+
role: "system",
|
|
913
|
+
tools: convertTools(addedTools, compat),
|
|
914
|
+
};
|
|
915
|
+
params.push(kimiToolMessage);
|
|
916
|
+
}
|
|
917
|
+
const text = i === 0 ? getSystemMessageText(msg) : renderSystemMessageUpdate(msg);
|
|
918
|
+
if (text.length > 0) {
|
|
919
|
+
params.push({ role: instructionRole, content: sanitizeSurrogates(text) });
|
|
920
|
+
}
|
|
921
|
+
}
|
|
922
|
+
else if (msg.role === "user") {
|
|
809
923
|
if (typeof msg.content === "string") {
|
|
810
924
|
params.push({
|
|
811
925
|
role: "user",
|
|
@@ -813,7 +927,9 @@ export function convertMessages(model, context, compat, options) {
|
|
|
813
927
|
});
|
|
814
928
|
}
|
|
815
929
|
else {
|
|
816
|
-
const content = msg.content
|
|
930
|
+
const content = msg.content
|
|
931
|
+
.filter((item) => item.type !== "text" || item.text.length > 0)
|
|
932
|
+
.map((item) => {
|
|
817
933
|
if (item.type === "text") {
|
|
818
934
|
return {
|
|
819
935
|
type: "text",
|
|
@@ -852,6 +968,14 @@ export function convertMessages(model, context, compat, options) {
|
|
|
852
968
|
}));
|
|
853
969
|
const assistantText = assistantTextParts.map((part) => part.text).join("");
|
|
854
970
|
const allThinkingBlocks = msg.content.filter(isThinkingContentBlock);
|
|
971
|
+
const toolCalls = msg.content.filter(isToolCallBlock);
|
|
972
|
+
const signedReasoningDetails = allThinkingBlocks
|
|
973
|
+
.map((block) => parseOpenAIReasoningDetails(block.thinkingSignature))
|
|
974
|
+
.find((details) => details !== undefined);
|
|
975
|
+
const legacyReasoningDetails = toolCalls
|
|
976
|
+
.map((toolCall) => parseLegacyEncryptedReasoningDetail(toolCall.thoughtSignature))
|
|
977
|
+
.filter((detail) => detail !== undefined);
|
|
978
|
+
const preservedReasoningDetails = signedReasoningDetails ?? (legacyReasoningDetails.length > 0 ? legacyReasoningDetails : undefined);
|
|
855
979
|
const nonEmptyThinkingBlocks = allThinkingBlocks.filter((block) => block.thinking.trim().length > 0);
|
|
856
980
|
if (nonEmptyThinkingBlocks.length > 0 && compat.requiresThinkingAsText) {
|
|
857
981
|
// Convert thinking blocks to plain text (no tags to avoid model mimicking them)
|
|
@@ -867,7 +991,8 @@ export function convertMessages(model, context, compat, options) {
|
|
|
867
991
|
if (assistantText.length > 0) {
|
|
868
992
|
assistantMsg.content = assistantText;
|
|
869
993
|
}
|
|
870
|
-
|
|
994
|
+
// reasoning_details is the structured alternative to a raw reasoning field.
|
|
995
|
+
if (!compat.requiresThinkingAsText && !preservedReasoningDetails) {
|
|
871
996
|
// Replay the captured reasoning field (e.g. "reasoning_content" for llama.cpp
|
|
872
997
|
// server, gpt-oss, and DeepSeek reasoner) under its captured signature. DeepSeek
|
|
873
998
|
// requires this on every thinking-mode assistant turn — even when the captured
|
|
@@ -880,13 +1005,12 @@ export function convertMessages(model, context, compat, options) {
|
|
|
880
1005
|
if (model.provider === "opencode-go" && signature === "reasoning") {
|
|
881
1006
|
signature = "reasoning_content";
|
|
882
1007
|
}
|
|
883
|
-
|
|
884
|
-
.map((block) => block.thinking || "")
|
|
885
|
-
|
|
1008
|
+
if (isOpenAICompletionsReasoningField(signature)) {
|
|
1009
|
+
assistantMsg[signature] = signedThinkingBlocks.map((block) => block.thinking || "").join("\n");
|
|
1010
|
+
}
|
|
886
1011
|
}
|
|
887
1012
|
}
|
|
888
1013
|
}
|
|
889
|
-
const toolCalls = msg.content.filter(isToolCallBlock);
|
|
890
1014
|
if (toolCalls.length > 0) {
|
|
891
1015
|
assistantMsg.tool_calls = toolCalls.map((tc) => {
|
|
892
1016
|
const customInputProperty = options?.grammarToolInputProperties?.get(tc.name);
|
|
@@ -909,20 +1033,9 @@ export function convertMessages(model, context, compat, options) {
|
|
|
909
1033
|
},
|
|
910
1034
|
};
|
|
911
1035
|
});
|
|
912
|
-
|
|
913
|
-
|
|
914
|
-
|
|
915
|
-
try {
|
|
916
|
-
return JSON.parse(tc.thoughtSignature);
|
|
917
|
-
}
|
|
918
|
-
catch {
|
|
919
|
-
return null;
|
|
920
|
-
}
|
|
921
|
-
})
|
|
922
|
-
.filter(Boolean);
|
|
923
|
-
if (reasoningDetails.length > 0) {
|
|
924
|
-
assistantMsg.reasoning_details = reasoningDetails;
|
|
925
|
-
}
|
|
1036
|
+
}
|
|
1037
|
+
if (preservedReasoningDetails) {
|
|
1038
|
+
assistantMsg.reasoning_details = preservedReasoningDetails;
|
|
926
1039
|
}
|
|
927
1040
|
if (compat.requiresReasoningContentOnAssistantMessages &&
|
|
928
1041
|
model.reasoning &&
|
|
@@ -948,7 +1061,6 @@ export function convertMessages(model, context, compat, options) {
|
|
|
948
1061
|
}
|
|
949
1062
|
else if (msg.role === "toolResult") {
|
|
950
1063
|
const imageBlocks = [];
|
|
951
|
-
const deferredToolNames = new Set();
|
|
952
1064
|
let j = i;
|
|
953
1065
|
for (; j < transformedMessages.length && transformedMessages[j].role === "toolResult"; j++) {
|
|
954
1066
|
const toolMsg = transformedMessages[j];
|
|
@@ -971,11 +1083,6 @@ export function convertMessages(model, context, compat, options) {
|
|
|
971
1083
|
toolResultMsg.name = toolMsg.toolName;
|
|
972
1084
|
}
|
|
973
1085
|
params.push(toolResultMsg);
|
|
974
|
-
if (compat.deferredToolsMode === "kimi") {
|
|
975
|
-
for (const name of toolMsg.addedToolNames ?? []) {
|
|
976
|
-
deferredToolNames.add(name);
|
|
977
|
-
}
|
|
978
|
-
}
|
|
979
1086
|
if (hasImages && model.input.includes("image")) {
|
|
980
1087
|
for (const block of toolMsg.content) {
|
|
981
1088
|
if (isImageContentBlock(block)) {
|
|
@@ -1012,17 +1119,6 @@ export function convertMessages(model, context, compat, options) {
|
|
|
1012
1119
|
else {
|
|
1013
1120
|
lastRole = "toolResult";
|
|
1014
1121
|
}
|
|
1015
|
-
if (deferredToolNames.size > 0) {
|
|
1016
|
-
const deferredTools = getToolsByName(context.tools, deferredToolNames);
|
|
1017
|
-
if (deferredTools.length > 0) {
|
|
1018
|
-
const kimiToolMessage = {
|
|
1019
|
-
role: "system",
|
|
1020
|
-
tools: convertTools(deferredTools, compat),
|
|
1021
|
-
};
|
|
1022
|
-
// Kimi accepts a system message with tools but omits the standard content field.
|
|
1023
|
-
params.push(kimiToolMessage);
|
|
1024
|
-
}
|
|
1025
|
-
}
|
|
1026
1122
|
continue;
|
|
1027
1123
|
}
|
|
1028
1124
|
lastRole = msg.role;
|
|
@@ -1054,7 +1150,7 @@ function convertTools(tools, compat) {
|
|
|
1054
1150
|
function: {
|
|
1055
1151
|
name: tool.name,
|
|
1056
1152
|
description: tool.description,
|
|
1057
|
-
parameters: tool
|
|
1153
|
+
parameters: getJsonSchemaToolParameters(tool, strict),
|
|
1058
1154
|
// Only include strict if provider supports it. Some reject unknown fields.
|
|
1059
1155
|
...(compat.supportsStrictMode !== false && { strict: strict ?? false }),
|
|
1060
1156
|
},
|
|
@@ -1063,10 +1159,13 @@ function convertTools(tools, compat) {
|
|
|
1063
1159
|
}
|
|
1064
1160
|
function parseChunkUsage(rawUsage, model) {
|
|
1065
1161
|
const promptTokens = rawUsage.prompt_tokens || 0;
|
|
1066
|
-
const cacheReadTokens = rawUsage.prompt_tokens_details?.cached_tokens ?? rawUsage.prompt_cache_hit_tokens ?? 0;
|
|
1162
|
+
const cacheReadTokens = rawUsage.prompt_tokens_details?.cached_tokens ?? rawUsage.prompt_cache_hit_tokens ?? rawUsage.cached_tokens ?? 0;
|
|
1067
1163
|
const cacheWriteTokens = rawUsage.prompt_tokens_details?.cache_write_tokens || 0;
|
|
1068
1164
|
// Follow documented OpenAI/OpenRouter semantics: cached_tokens is cache-read
|
|
1069
|
-
// tokens (hits).
|
|
1165
|
+
// tokens (hits). Providers disagree on placement: OpenAI/OpenRouter use
|
|
1166
|
+
// prompt_tokens_details.cached_tokens, DeepSeek uses prompt_cache_hit_tokens,
|
|
1167
|
+
// and Kimi documents top-level usage.cached_tokens on the final usage chunk.
|
|
1168
|
+
// OpenAI does not document or emit cache_write_tokens, but
|
|
1070
1169
|
// OpenRouter-compatible providers can include it as a separate write count.
|
|
1071
1170
|
// OpenRouter's own provider/tests affirm the separate mapping:
|
|
1072
1171
|
// https://github.com/OpenRouterTeam/ai-sdk-provider/pull/409
|
|
@@ -1130,14 +1229,15 @@ function detectCompat(model) {
|
|
|
1130
1229
|
const isCloudflareAiGateway = provider === "cloudflare-ai-gateway" || baseUrl.includes("gateway.ai.cloudflare.com");
|
|
1131
1230
|
const isNvidia = provider === "nvidia" || baseUrl.includes("integrate.api.nvidia.com");
|
|
1132
1231
|
const isAntLing = provider === "ant-ling" || baseUrl.includes("api.ant-ling.com");
|
|
1232
|
+
const isCerebras = provider === "cerebras" || baseUrl.includes("cerebras.ai");
|
|
1233
|
+
const isDeepSeek = provider === "deepseek" || baseUrl.toLowerCase().includes("deepseek.com");
|
|
1133
1234
|
const isNonStandard = isNvidia ||
|
|
1134
|
-
|
|
1135
|
-
baseUrl.includes("cerebras.ai") ||
|
|
1235
|
+
isCerebras ||
|
|
1136
1236
|
provider === "xai" ||
|
|
1137
1237
|
baseUrl.includes("api.x.ai") ||
|
|
1138
1238
|
isTogether ||
|
|
1139
1239
|
baseUrl.includes("chutes.ai") ||
|
|
1140
|
-
|
|
1240
|
+
isDeepSeek ||
|
|
1141
1241
|
isZai ||
|
|
1142
1242
|
isMoonshot ||
|
|
1143
1243
|
provider === "opencode" ||
|
|
@@ -1146,6 +1246,7 @@ function detectCompat(model) {
|
|
|
1146
1246
|
isCloudflareAiGateway ||
|
|
1147
1247
|
isAntLing;
|
|
1148
1248
|
const useMaxTokens = baseUrl.includes("chutes.ai") ||
|
|
1249
|
+
isDeepSeek ||
|
|
1149
1250
|
isMoonshot ||
|
|
1150
1251
|
isCloudflareAiGateway ||
|
|
1151
1252
|
isTogether ||
|
|
@@ -1153,7 +1254,6 @@ function detectCompat(model) {
|
|
|
1153
1254
|
isAntLing ||
|
|
1154
1255
|
isZai;
|
|
1155
1256
|
const isGrok = provider === "xai" || baseUrl.includes("api.x.ai");
|
|
1156
|
-
const isDeepSeek = provider === "deepseek" || baseUrl.includes("deepseek.com");
|
|
1157
1257
|
const isOpenRouterDeveloperRoleModel = isOpenRouter && (model.id.startsWith("anthropic/") || model.id.startsWith("openai/"));
|
|
1158
1258
|
const cacheControlFormat = provider === "openrouter" && model.id.startsWith("anthropic/") ? "anthropic" : undefined;
|
|
1159
1259
|
return {
|
|
@@ -1161,6 +1261,7 @@ function detectCompat(model) {
|
|
|
1161
1261
|
supportsDeveloperRole: isOpenRouterDeveloperRoleModel || (!isNonStandard && !isOpenRouter),
|
|
1162
1262
|
supportsReasoningEffort: !isGrok && !isZai && !isMoonshot && !isTogether && !isCloudflareAiGateway && !isNvidia && !isAntLing,
|
|
1163
1263
|
supportsUsageInStreaming: true,
|
|
1264
|
+
supportsFinishReason: true,
|
|
1164
1265
|
maxTokensField: useMaxTokens ? "max_tokens" : "max_completion_tokens",
|
|
1165
1266
|
requiresToolResultName: false,
|
|
1166
1267
|
requiresAssistantAfterToolResult: false,
|
|
@@ -1180,12 +1281,17 @@ function detectCompat(model) {
|
|
|
1180
1281
|
openRouterRouting: {},
|
|
1181
1282
|
vercelGatewayRouting: {},
|
|
1182
1283
|
chatTemplateKwargs: {},
|
|
1284
|
+
chatTemplateArgs: {},
|
|
1183
1285
|
zaiToolStream: false,
|
|
1184
|
-
|
|
1286
|
+
supportsThinkingTokenBudget: false,
|
|
1287
|
+
thinkingTokenBudgetField: undefined,
|
|
1288
|
+
// OpenAI compatibility alone does not imply strict JSON-schema tool support.
|
|
1289
|
+
supportsStrictMode: false,
|
|
1185
1290
|
supportsOpenAIGrammarTools: false,
|
|
1291
|
+
supportsMidConvoSystemMessages: false,
|
|
1292
|
+
supportsMidConvoToolAdditions: false,
|
|
1186
1293
|
cacheControlFormat,
|
|
1187
|
-
sendSessionAffinityHeaders:
|
|
1188
|
-
deferredToolsMode: undefined,
|
|
1294
|
+
sendSessionAffinityHeaders: isOpenRouter,
|
|
1189
1295
|
sessionAffinityFormat: isOpenRouter ? "openrouter" : "openai",
|
|
1190
1296
|
supportsLongCacheRetention: !(isTogether ||
|
|
1191
1297
|
isCloudflareWorkersAI ||
|
|
@@ -1207,6 +1313,7 @@ function getCompat(model) {
|
|
|
1207
1313
|
supportsDeveloperRole: model.compat.supportsDeveloperRole ?? detected.supportsDeveloperRole,
|
|
1208
1314
|
supportsReasoningEffort: model.compat.supportsReasoningEffort ?? detected.supportsReasoningEffort,
|
|
1209
1315
|
supportsUsageInStreaming: model.compat.supportsUsageInStreaming ?? detected.supportsUsageInStreaming,
|
|
1316
|
+
supportsFinishReason: model.compat.supportsFinishReason ?? detected.supportsFinishReason,
|
|
1210
1317
|
maxTokensField: model.compat.maxTokensField ?? detected.maxTokensField,
|
|
1211
1318
|
requiresToolResultName: model.compat.requiresToolResultName ?? detected.requiresToolResultName,
|
|
1212
1319
|
requiresAssistantAfterToolResult: model.compat.requiresAssistantAfterToolResult ?? detected.requiresAssistantAfterToolResult,
|
|
@@ -1217,14 +1324,19 @@ function getCompat(model) {
|
|
|
1217
1324
|
openRouterRouting: model.compat.openRouterRouting ?? {},
|
|
1218
1325
|
vercelGatewayRouting: model.compat.vercelGatewayRouting ?? detected.vercelGatewayRouting,
|
|
1219
1326
|
chatTemplateKwargs: model.compat.chatTemplateKwargs ?? detected.chatTemplateKwargs,
|
|
1327
|
+
chatTemplateArgs: model.compat.chatTemplateArgs ?? detected.chatTemplateArgs,
|
|
1220
1328
|
zaiToolStream: model.compat.zaiToolStream ?? detected.zaiToolStream,
|
|
1329
|
+
supportsThinkingTokenBudget: model.compat.supportsThinkingTokenBudget ?? detected.supportsThinkingTokenBudget,
|
|
1330
|
+
thinkingTokenBudgetField: model.compat.thinkingTokenBudgetField ?? detected.thinkingTokenBudgetField,
|
|
1221
1331
|
supportsStrictMode: model.compat.supportsStrictMode ?? detected.supportsStrictMode,
|
|
1222
1332
|
supportsOpenAIGrammarTools: model.compat.supportsOpenAIGrammarTools ?? detected.supportsOpenAIGrammarTools,
|
|
1333
|
+
supportsMidConvoSystemMessages: model.compat.supportsMidConvoSystemMessages ?? detected.supportsMidConvoSystemMessages,
|
|
1334
|
+
supportsMidConvoToolAdditions: model.compat.supportsMidConvoToolAdditions ?? detected.supportsMidConvoToolAdditions,
|
|
1223
1335
|
cacheControlFormat: model.compat.cacheControlFormat ?? detected.cacheControlFormat,
|
|
1224
1336
|
sendSessionAffinityHeaders: model.compat.sendSessionAffinityHeaders ?? detected.sendSessionAffinityHeaders,
|
|
1225
|
-
deferredToolsMode: model.compat.deferredToolsMode ?? detected.deferredToolsMode,
|
|
1226
1337
|
sessionAffinityFormat: model.compat.sessionAffinityFormat ?? detected.sessionAffinityFormat,
|
|
1227
1338
|
supportsLongCacheRetention: model.compat.supportsLongCacheRetention ?? detected.supportsLongCacheRetention,
|
|
1339
|
+
vllmPriority: model.compat.vllmPriority,
|
|
1228
1340
|
};
|
|
1229
1341
|
}
|
|
1230
1342
|
//# sourceMappingURL=openai-completions.js.map
|