@draht/ai 2026.9.5-1 → 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 +392 -137
- 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 -11
- 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 +194 -22
- 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.map +1 -1
- package/dist/api/google-generative-ai.js +26 -73
- package/dist/api/google-generative-ai.js.map +1 -1
- package/dist/api/google-shared.d.ts +14 -5
- package/dist/api/google-shared.d.ts.map +1 -1
- package/dist/api/google-shared.js +68 -13
- package/dist/api/google-shared.js.map +1 -1
- package/dist/api/google-vertex.d.ts.map +1 -1
- package/dist/api/google-vertex.js +30 -65
- 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 +246 -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 +58 -24
- 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 +232 -126
- 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 +58 -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 +12 -3
- 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 +13 -9
- 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 +26 -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 +3 -2
- 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.map +1 -1
- package/dist/providers/xai.js +1 -0
- 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 +409 -128
- 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/{pi-user-agent.js → draht-user-agent.js} +3 -3
- package/dist/utils/draht-user-agent.js.map +1 -0
- 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/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 +18 -2
- package/dist/utils/retry.js.map +1 -1
- package/dist/utils/sleep.d.ts +1 -1
- package/dist/utils/sleep.d.ts.map +1 -1
- package/dist/utils/sleep.js +4 -4
- package/dist/utils/sleep.js.map +1 -1
- 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 +34 -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/utils/pi-user-agent.d.ts +0 -2
- package/dist/utils/pi-user-agent.d.ts.map +0 -1
- package/dist/utils/pi-user-agent.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,18 +1,20 @@
|
|
|
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";
|
|
6
7
|
import { headersToRecord } from "../utils/headers.js";
|
|
7
8
|
import { parseStreamingJson } from "../utils/json-parse.js";
|
|
8
|
-
import { getPiUserAgent } from "../utils/pi-user-agent.js";
|
|
9
9
|
import { getProviderEnvValue } from "../utils/provider-env.js";
|
|
10
10
|
import { retryProviderRequest } from "../utils/provider-retry.js";
|
|
11
11
|
import { sanitizeSurrogates } from "../utils/sanitize-unicode.js";
|
|
12
|
-
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";
|
|
13
15
|
import { buildCopilotDynamicHeaders, hasCopilotVisionInput } from "./github-copilot-headers.js";
|
|
14
16
|
import { clampOpenAIPromptCacheKey } from "./openai-prompt-cache.js";
|
|
15
|
-
import { buildBaseOptions } from "./simple-options.js";
|
|
17
|
+
import { buildBaseOptions, clampThinkingBudgetToAnswerRoom, thinkingBudgetForLevel } from "./simple-options.js";
|
|
16
18
|
import { transformMessages } from "./transform-messages.js";
|
|
17
19
|
/**
|
|
18
20
|
* Check if conversation messages contain tool calls or tool results.
|
|
@@ -49,25 +51,6 @@ function hasToolHistory(messages) {
|
|
|
49
51
|
}
|
|
50
52
|
return false;
|
|
51
53
|
}
|
|
52
|
-
function getDeferredToolNames(messages) {
|
|
53
|
-
const names = new Set();
|
|
54
|
-
for (const message of messages) {
|
|
55
|
-
if (message.role === "toolResult") {
|
|
56
|
-
for (const name of message.addedToolNames ?? []) {
|
|
57
|
-
names.add(name);
|
|
58
|
-
}
|
|
59
|
-
}
|
|
60
|
-
}
|
|
61
|
-
return names;
|
|
62
|
-
}
|
|
63
|
-
function getToolsByName(tools, names) {
|
|
64
|
-
if (!tools)
|
|
65
|
-
return [];
|
|
66
|
-
const toolsByName = new Map(tools.map((tool) => [tool.name, tool]));
|
|
67
|
-
return Array.from(names)
|
|
68
|
-
.map((name) => toolsByName.get(name))
|
|
69
|
-
.filter((tool) => tool !== undefined);
|
|
70
|
-
}
|
|
71
54
|
function isTextContentBlock(block) {
|
|
72
55
|
return block.type === "text";
|
|
73
56
|
}
|
|
@@ -80,28 +63,94 @@ function isToolCallBlock(block) {
|
|
|
80
63
|
function isImageContentBlock(block) {
|
|
81
64
|
return block.type === "image";
|
|
82
65
|
}
|
|
83
|
-
function
|
|
84
|
-
|
|
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)) {
|
|
85
76
|
return false;
|
|
86
77
|
}
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
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);
|
|
93
141
|
}
|
|
94
142
|
function resolveCacheRetention(cacheRetention, env) {
|
|
95
143
|
if (cacheRetention) {
|
|
96
144
|
return cacheRetention;
|
|
97
145
|
}
|
|
98
|
-
if (getProviderEnvValue("
|
|
146
|
+
if (getProviderEnvValue("DRAHT_CACHE_RETENTION", env) === "long") {
|
|
99
147
|
return "long";
|
|
100
148
|
}
|
|
101
149
|
return "short";
|
|
102
150
|
}
|
|
103
151
|
export const stream = (model, context, options) => {
|
|
104
152
|
const stream = new AssistantMessageEventStream();
|
|
153
|
+
const normalizedContext = resolveTranscript(context, getCompat(model).supportsMidConvoSystemMessages);
|
|
105
154
|
(async () => {
|
|
106
155
|
const output = {
|
|
107
156
|
role: "assistant",
|
|
@@ -120,14 +169,22 @@ export const stream = (model, context, options) => {
|
|
|
120
169
|
stopReason: "pending",
|
|
121
170
|
timestamp: Date.now(),
|
|
122
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
|
+
};
|
|
123
180
|
try {
|
|
124
181
|
const apiKey = getClientApiKey(model.provider, options?.apiKey, options?.headers);
|
|
125
182
|
const compat = getCompat(model);
|
|
126
|
-
const grammarToolInputProperties = createGrammarToolInputProperties(
|
|
183
|
+
const grammarToolInputProperties = createGrammarToolInputProperties(getDeclaredTools(normalizedContext.messages), compat.supportsOpenAIGrammarTools);
|
|
127
184
|
const cacheRetention = resolveCacheRetention(options?.cacheRetention, options?.env);
|
|
128
185
|
const cacheSessionId = cacheRetention === "none" ? undefined : options?.sessionId;
|
|
129
|
-
const client = createClient(model,
|
|
130
|
-
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);
|
|
131
188
|
const nextParams = await options?.onPayload?.(params, model);
|
|
132
189
|
if (nextParams !== undefined) {
|
|
133
190
|
params = nextParams;
|
|
@@ -149,7 +206,6 @@ export const stream = (model, context, options) => {
|
|
|
149
206
|
let hasFinishReason = false;
|
|
150
207
|
const toolCallBlocksByIndex = new Map();
|
|
151
208
|
const toolCallBlocksById = new Map();
|
|
152
|
-
const pendingReasoningDetailsByToolCallId = new Map();
|
|
153
209
|
const blocks = output.content;
|
|
154
210
|
const getContentIndex = (block) => blocks.indexOf(block);
|
|
155
211
|
const getCustomToolCallInput = (block) => {
|
|
@@ -181,6 +237,7 @@ export const stream = (model, context, options) => {
|
|
|
181
237
|
});
|
|
182
238
|
}
|
|
183
239
|
else if (block.type === "thinking") {
|
|
240
|
+
applyStreamedReasoningDetails(block);
|
|
184
241
|
stream.push({
|
|
185
242
|
type: "thinking_end",
|
|
186
243
|
contentIndex,
|
|
@@ -236,16 +293,6 @@ export const stream = (model, context, options) => {
|
|
|
236
293
|
}
|
|
237
294
|
return thinkingBlock;
|
|
238
295
|
};
|
|
239
|
-
const applyPendingReasoningDetail = (block) => {
|
|
240
|
-
if (!block.id) {
|
|
241
|
-
return;
|
|
242
|
-
}
|
|
243
|
-
const pendingReasoningDetail = pendingReasoningDetailsByToolCallId.get(block.id);
|
|
244
|
-
if (pendingReasoningDetail) {
|
|
245
|
-
block.thoughtSignature = pendingReasoningDetail;
|
|
246
|
-
pendingReasoningDetailsByToolCallId.delete(block.id);
|
|
247
|
-
}
|
|
248
|
-
};
|
|
249
296
|
const ensureToolCallBlock = (toolCall) => {
|
|
250
297
|
const streamIndex = typeof toolCall.index === "number" ? toolCall.index : undefined;
|
|
251
298
|
const name = toolCall.function?.name ?? toolCall.custom?.name ?? "";
|
|
@@ -301,10 +348,10 @@ export const stream = (model, context, options) => {
|
|
|
301
348
|
};
|
|
302
349
|
delete block.partialArgs;
|
|
303
350
|
}
|
|
304
|
-
applyPendingReasoningDetail(block);
|
|
305
351
|
return block;
|
|
306
352
|
};
|
|
307
353
|
for await (const chunk of openaiStream) {
|
|
354
|
+
await options?.onProviderStreamEvent?.(chunk, model);
|
|
308
355
|
if (!chunk || typeof chunk !== "object")
|
|
309
356
|
continue;
|
|
310
357
|
// OpenAI documents ChatCompletionChunk.id as the unique chat completion identifier,
|
|
@@ -408,16 +455,14 @@ export const stream = (model, context, options) => {
|
|
|
408
455
|
const reasoningDetails = choice.delta.reasoning_details;
|
|
409
456
|
if (Array.isArray(reasoningDetails)) {
|
|
410
457
|
for (const detail of reasoningDetails) {
|
|
411
|
-
if (
|
|
412
|
-
|
|
413
|
-
|
|
414
|
-
|
|
415
|
-
|
|
416
|
-
|
|
417
|
-
|
|
418
|
-
|
|
419
|
-
}
|
|
420
|
-
}
|
|
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);
|
|
421
466
|
}
|
|
422
467
|
}
|
|
423
468
|
}
|
|
@@ -431,10 +476,13 @@ export const stream = (model, context, options) => {
|
|
|
431
476
|
if (output.stopReason === "aborted") {
|
|
432
477
|
throw new Error("Request was aborted");
|
|
433
478
|
}
|
|
479
|
+
if (!hasFinishReason && !compat.supportsFinishReason) {
|
|
480
|
+
output.stopReason = output.content.some((block) => block.type === "toolCall") ? "toolUse" : "stop";
|
|
481
|
+
}
|
|
434
482
|
if (output.stopReason === "error") {
|
|
435
483
|
throw new Error(output.errorMessage || "Provider returned an error stop reason");
|
|
436
484
|
}
|
|
437
|
-
if (!hasFinishReason || output.stopReason === "pending") {
|
|
485
|
+
if ((compat.supportsFinishReason && !hasFinishReason) || output.stopReason === "pending") {
|
|
438
486
|
throw new Error("Stream ended without finish_reason");
|
|
439
487
|
}
|
|
440
488
|
stream.push({ type: "done", reason: output.stopReason, message: output });
|
|
@@ -442,6 +490,9 @@ export const stream = (model, context, options) => {
|
|
|
442
490
|
}
|
|
443
491
|
catch (error) {
|
|
444
492
|
for (const block of output.content) {
|
|
493
|
+
if (block.type === "thinking") {
|
|
494
|
+
applyStreamedReasoningDetails(block);
|
|
495
|
+
}
|
|
445
496
|
delete block.index;
|
|
446
497
|
// Streaming scratch buffers are only used during parsing; never persist them.
|
|
447
498
|
delete block.partialArgs;
|
|
@@ -475,10 +526,11 @@ export const streamSimple = (model, context, options) => {
|
|
|
475
526
|
return stream(model, context, {
|
|
476
527
|
...base,
|
|
477
528
|
reasoningEffort,
|
|
529
|
+
thinkingBudgets: options?.thinkingBudgets,
|
|
478
530
|
});
|
|
479
531
|
};
|
|
480
532
|
function createClient(model, context, apiKey, optionsHeaders, fetch, sessionId, compat = getCompat(model)) {
|
|
481
|
-
const headers = { "User-Agent":
|
|
533
|
+
const headers = { "User-Agent": getDrahtUserAgent(), ...model.headers };
|
|
482
534
|
if (model.provider === "github-copilot") {
|
|
483
535
|
const hasImages = hasCopilotVisionInput(context.messages);
|
|
484
536
|
const copilotHeaders = buildCopilotDynamicHeaders({
|
|
@@ -511,8 +563,11 @@ function createClient(model, context, apiKey, optionsHeaders, fetch, sessionId,
|
|
|
511
563
|
defaultHeaders: headers,
|
|
512
564
|
});
|
|
513
565
|
}
|
|
514
|
-
function buildParams(model, context, options, compat = getCompat(model), cacheRetention = resolveCacheRetention(options?.cacheRetention, options?.env), grammarToolInputProperties = createGrammarToolInputProperties(context.
|
|
515
|
-
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
|
+
});
|
|
516
571
|
const cacheControl = getCompatCacheControl(compat, cacheRetention);
|
|
517
572
|
const params = {
|
|
518
573
|
model: model.id,
|
|
@@ -532,6 +587,7 @@ function buildParams(model, context, options, compat = getCompat(model), cacheRe
|
|
|
532
587
|
}
|
|
533
588
|
if (options?.maxTokens) {
|
|
534
589
|
if (compat.maxTokensField === "max_tokens") {
|
|
590
|
+
// Deprecated by OpenAI, but some OpenAI-compatible providers only accept max_tokens.
|
|
535
591
|
params.max_tokens = options.maxTokens;
|
|
536
592
|
}
|
|
537
593
|
else {
|
|
@@ -541,10 +597,8 @@ function buildParams(model, context, options, compat = getCompat(model), cacheRe
|
|
|
541
597
|
if (options?.temperature !== undefined) {
|
|
542
598
|
params.temperature = options.temperature;
|
|
543
599
|
}
|
|
544
|
-
|
|
545
|
-
|
|
546
|
-
if (activeTools && activeTools.length > 0) {
|
|
547
|
-
params.tools = convertTools(activeTools, compat);
|
|
600
|
+
if (transcriptTools.requestTools.length > 0) {
|
|
601
|
+
params.tools = convertTools(transcriptTools.requestTools, compat);
|
|
548
602
|
if (compat.zaiToolStream) {
|
|
549
603
|
params.tool_stream = true;
|
|
550
604
|
}
|
|
@@ -556,9 +610,14 @@ function buildParams(model, context, options, compat = getCompat(model), cacheRe
|
|
|
556
610
|
if (cacheControl) {
|
|
557
611
|
applyAnthropicCacheControl(messages, params.tools, cacheControl);
|
|
558
612
|
}
|
|
559
|
-
if (options?.toolChoice
|
|
613
|
+
if (options?.toolChoice) {
|
|
560
614
|
params.tool_choice = options.toolChoice;
|
|
561
615
|
}
|
|
616
|
+
if (compat.vllmPriority !== undefined) {
|
|
617
|
+
params.priority = compat.vllmPriority;
|
|
618
|
+
}
|
|
619
|
+
const thinkingTokenBudgetField = resolveThinkingTokenBudgetField(compat);
|
|
620
|
+
const thinkingBudget = resolveClampedThinkingBudget(model, options, params);
|
|
562
621
|
if (compat.thinkingFormat === "zai" && model.reasoning) {
|
|
563
622
|
const zaiParams = params;
|
|
564
623
|
zaiParams.thinking = options?.reasoningEffort ? { type: "enabled", clear_thinking: false } : { type: "disabled" };
|
|
@@ -586,11 +645,26 @@ function buildParams(model, context, options, compat = getCompat(model), cacheRe
|
|
|
586
645
|
};
|
|
587
646
|
}
|
|
588
647
|
else if (compat.thinkingFormat === "chat-template" && model.reasoning) {
|
|
589
|
-
const chatTemplateKwargs =
|
|
648
|
+
const chatTemplateKwargs = buildChatTemplateValues(model, options, compat.chatTemplateKwargs, thinkingBudget);
|
|
590
649
|
if (chatTemplateKwargs) {
|
|
591
650
|
params.chat_template_kwargs = chatTemplateKwargs;
|
|
592
651
|
}
|
|
593
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
|
+
}
|
|
594
668
|
else if (compat.thinkingFormat === "deepseek" && model.reasoning) {
|
|
595
669
|
if (options?.reasoningEffort) {
|
|
596
670
|
params.thinking = { type: "enabled" };
|
|
@@ -647,6 +721,13 @@ function buildParams(model, context, options, compat = getCompat(model), cacheRe
|
|
|
647
721
|
params.reasoning_effort = offValue;
|
|
648
722
|
}
|
|
649
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
|
+
}
|
|
650
731
|
// OpenRouter provider routing preferences
|
|
651
732
|
if (model.compat?.openRouterRouting) {
|
|
652
733
|
params.provider = model.compat.openRouterRouting;
|
|
@@ -663,19 +744,35 @@ function buildParams(model, context, options, compat = getCompat(model), cacheRe
|
|
|
663
744
|
params.providerOptions = { gateway: gatewayOptions };
|
|
664
745
|
}
|
|
665
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);
|
|
666
749
|
return params;
|
|
667
750
|
}
|
|
668
|
-
function
|
|
669
|
-
|
|
670
|
-
|
|
671
|
-
|
|
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);
|
|
672
769
|
if (resolved !== undefined) {
|
|
673
|
-
|
|
770
|
+
resolvedValues[key] = resolved;
|
|
674
771
|
}
|
|
675
772
|
}
|
|
676
|
-
return Object.keys(
|
|
773
|
+
return Object.keys(resolvedValues).length > 0 ? resolvedValues : undefined;
|
|
677
774
|
}
|
|
678
|
-
function resolveChatTemplateKwargValue(model, options, value) {
|
|
775
|
+
function resolveChatTemplateKwargValue(model, options, value, thinkingBudget) {
|
|
679
776
|
if (typeof value !== "object" || value === null) {
|
|
680
777
|
return value;
|
|
681
778
|
}
|
|
@@ -686,6 +783,9 @@ function resolveChatTemplateKwargValue(model, options, value) {
|
|
|
686
783
|
if (value.$var === "thinking.enabled") {
|
|
687
784
|
return !!reasoningEffort;
|
|
688
785
|
}
|
|
786
|
+
if (value.$var === "thinking.budget") {
|
|
787
|
+
return thinkingBudget;
|
|
788
|
+
}
|
|
689
789
|
const mappedValue = reasoningEffort ? model.thinkingLevelMap?.[reasoningEffort] : model.thinkingLevelMap?.off;
|
|
690
790
|
return mappedValue === undefined ? reasoningEffort : typeof mappedValue === "string" ? mappedValue : undefined;
|
|
691
791
|
}
|
|
@@ -764,6 +864,7 @@ function addCacheControlToTextContent(message, cacheControl) {
|
|
|
764
864
|
return false;
|
|
765
865
|
}
|
|
766
866
|
export function convertMessages(model, context, compat, options) {
|
|
867
|
+
const normalizedContext = resolveTranscript(context, compat.supportsMidConvoSystemMessages);
|
|
767
868
|
const params = [];
|
|
768
869
|
const normalizeToolCallId = (id) => {
|
|
769
870
|
// Handle pipe-separated IDs from OpenAI Responses API
|
|
@@ -790,12 +891,9 @@ export function convertMessages(model, context, compat, options) {
|
|
|
790
891
|
return id.length > 40 ? id.slice(0, 40) : id;
|
|
791
892
|
return id;
|
|
792
893
|
};
|
|
793
|
-
const transformedMessages = transformMessages(
|
|
794
|
-
|
|
795
|
-
|
|
796
|
-
const role = useDeveloperRole ? "developer" : "system";
|
|
797
|
-
params.push({ role: role, content: sanitizeSurrogates(context.systemPrompt) });
|
|
798
|
-
}
|
|
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";
|
|
799
897
|
let lastRole = null;
|
|
800
898
|
for (let i = 0; i < transformedMessages.length; i++) {
|
|
801
899
|
const msg = transformedMessages[i];
|
|
@@ -807,7 +905,21 @@ export function convertMessages(model, context, compat, options) {
|
|
|
807
905
|
content: "I have processed the tool results.",
|
|
808
906
|
});
|
|
809
907
|
}
|
|
810
|
-
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") {
|
|
811
923
|
if (typeof msg.content === "string") {
|
|
812
924
|
params.push({
|
|
813
925
|
role: "user",
|
|
@@ -815,7 +927,9 @@ export function convertMessages(model, context, compat, options) {
|
|
|
815
927
|
});
|
|
816
928
|
}
|
|
817
929
|
else {
|
|
818
|
-
const content = msg.content
|
|
930
|
+
const content = msg.content
|
|
931
|
+
.filter((item) => item.type !== "text" || item.text.length > 0)
|
|
932
|
+
.map((item) => {
|
|
819
933
|
if (item.type === "text") {
|
|
820
934
|
return {
|
|
821
935
|
type: "text",
|
|
@@ -854,6 +968,14 @@ export function convertMessages(model, context, compat, options) {
|
|
|
854
968
|
}));
|
|
855
969
|
const assistantText = assistantTextParts.map((part) => part.text).join("");
|
|
856
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);
|
|
857
979
|
const nonEmptyThinkingBlocks = allThinkingBlocks.filter((block) => block.thinking.trim().length > 0);
|
|
858
980
|
if (nonEmptyThinkingBlocks.length > 0 && compat.requiresThinkingAsText) {
|
|
859
981
|
// Convert thinking blocks to plain text (no tags to avoid model mimicking them)
|
|
@@ -869,7 +991,8 @@ export function convertMessages(model, context, compat, options) {
|
|
|
869
991
|
if (assistantText.length > 0) {
|
|
870
992
|
assistantMsg.content = assistantText;
|
|
871
993
|
}
|
|
872
|
-
|
|
994
|
+
// reasoning_details is the structured alternative to a raw reasoning field.
|
|
995
|
+
if (!compat.requiresThinkingAsText && !preservedReasoningDetails) {
|
|
873
996
|
// Replay the captured reasoning field (e.g. "reasoning_content" for llama.cpp
|
|
874
997
|
// server, gpt-oss, and DeepSeek reasoner) under its captured signature. DeepSeek
|
|
875
998
|
// requires this on every thinking-mode assistant turn — even when the captured
|
|
@@ -882,13 +1005,12 @@ export function convertMessages(model, context, compat, options) {
|
|
|
882
1005
|
if (model.provider === "opencode-go" && signature === "reasoning") {
|
|
883
1006
|
signature = "reasoning_content";
|
|
884
1007
|
}
|
|
885
|
-
|
|
886
|
-
.map((block) => block.thinking || "")
|
|
887
|
-
|
|
1008
|
+
if (isOpenAICompletionsReasoningField(signature)) {
|
|
1009
|
+
assistantMsg[signature] = signedThinkingBlocks.map((block) => block.thinking || "").join("\n");
|
|
1010
|
+
}
|
|
888
1011
|
}
|
|
889
1012
|
}
|
|
890
1013
|
}
|
|
891
|
-
const toolCalls = msg.content.filter(isToolCallBlock);
|
|
892
1014
|
if (toolCalls.length > 0) {
|
|
893
1015
|
assistantMsg.tool_calls = toolCalls.map((tc) => {
|
|
894
1016
|
const customInputProperty = options?.grammarToolInputProperties?.get(tc.name);
|
|
@@ -911,20 +1033,9 @@ export function convertMessages(model, context, compat, options) {
|
|
|
911
1033
|
},
|
|
912
1034
|
};
|
|
913
1035
|
});
|
|
914
|
-
|
|
915
|
-
|
|
916
|
-
|
|
917
|
-
try {
|
|
918
|
-
return JSON.parse(tc.thoughtSignature);
|
|
919
|
-
}
|
|
920
|
-
catch {
|
|
921
|
-
return null;
|
|
922
|
-
}
|
|
923
|
-
})
|
|
924
|
-
.filter(Boolean);
|
|
925
|
-
if (reasoningDetails.length > 0) {
|
|
926
|
-
assistantMsg.reasoning_details = reasoningDetails;
|
|
927
|
-
}
|
|
1036
|
+
}
|
|
1037
|
+
if (preservedReasoningDetails) {
|
|
1038
|
+
assistantMsg.reasoning_details = preservedReasoningDetails;
|
|
928
1039
|
}
|
|
929
1040
|
if (compat.requiresReasoningContentOnAssistantMessages &&
|
|
930
1041
|
model.reasoning &&
|
|
@@ -950,7 +1061,6 @@ export function convertMessages(model, context, compat, options) {
|
|
|
950
1061
|
}
|
|
951
1062
|
else if (msg.role === "toolResult") {
|
|
952
1063
|
const imageBlocks = [];
|
|
953
|
-
const deferredToolNames = new Set();
|
|
954
1064
|
let j = i;
|
|
955
1065
|
for (; j < transformedMessages.length && transformedMessages[j].role === "toolResult"; j++) {
|
|
956
1066
|
const toolMsg = transformedMessages[j];
|
|
@@ -973,11 +1083,6 @@ export function convertMessages(model, context, compat, options) {
|
|
|
973
1083
|
toolResultMsg.name = toolMsg.toolName;
|
|
974
1084
|
}
|
|
975
1085
|
params.push(toolResultMsg);
|
|
976
|
-
if (compat.deferredToolsMode === "kimi") {
|
|
977
|
-
for (const name of toolMsg.addedToolNames ?? []) {
|
|
978
|
-
deferredToolNames.add(name);
|
|
979
|
-
}
|
|
980
|
-
}
|
|
981
1086
|
if (hasImages && model.input.includes("image")) {
|
|
982
1087
|
for (const block of toolMsg.content) {
|
|
983
1088
|
if (isImageContentBlock(block)) {
|
|
@@ -1014,17 +1119,6 @@ export function convertMessages(model, context, compat, options) {
|
|
|
1014
1119
|
else {
|
|
1015
1120
|
lastRole = "toolResult";
|
|
1016
1121
|
}
|
|
1017
|
-
if (deferredToolNames.size > 0) {
|
|
1018
|
-
const deferredTools = getToolsByName(context.tools, deferredToolNames);
|
|
1019
|
-
if (deferredTools.length > 0) {
|
|
1020
|
-
const kimiToolMessage = {
|
|
1021
|
-
role: "system",
|
|
1022
|
-
tools: convertTools(deferredTools, compat),
|
|
1023
|
-
};
|
|
1024
|
-
// Kimi accepts a system message with tools but omits the standard content field.
|
|
1025
|
-
params.push(kimiToolMessage);
|
|
1026
|
-
}
|
|
1027
|
-
}
|
|
1028
1122
|
continue;
|
|
1029
1123
|
}
|
|
1030
1124
|
lastRole = msg.role;
|
|
@@ -1056,7 +1150,7 @@ function convertTools(tools, compat) {
|
|
|
1056
1150
|
function: {
|
|
1057
1151
|
name: tool.name,
|
|
1058
1152
|
description: tool.description,
|
|
1059
|
-
parameters: tool
|
|
1153
|
+
parameters: getJsonSchemaToolParameters(tool, strict),
|
|
1060
1154
|
// Only include strict if provider supports it. Some reject unknown fields.
|
|
1061
1155
|
...(compat.supportsStrictMode !== false && { strict: strict ?? false }),
|
|
1062
1156
|
},
|
|
@@ -1135,14 +1229,15 @@ function detectCompat(model) {
|
|
|
1135
1229
|
const isCloudflareAiGateway = provider === "cloudflare-ai-gateway" || baseUrl.includes("gateway.ai.cloudflare.com");
|
|
1136
1230
|
const isNvidia = provider === "nvidia" || baseUrl.includes("integrate.api.nvidia.com");
|
|
1137
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");
|
|
1138
1234
|
const isNonStandard = isNvidia ||
|
|
1139
|
-
|
|
1140
|
-
baseUrl.includes("cerebras.ai") ||
|
|
1235
|
+
isCerebras ||
|
|
1141
1236
|
provider === "xai" ||
|
|
1142
1237
|
baseUrl.includes("api.x.ai") ||
|
|
1143
1238
|
isTogether ||
|
|
1144
1239
|
baseUrl.includes("chutes.ai") ||
|
|
1145
|
-
|
|
1240
|
+
isDeepSeek ||
|
|
1146
1241
|
isZai ||
|
|
1147
1242
|
isMoonshot ||
|
|
1148
1243
|
provider === "opencode" ||
|
|
@@ -1150,7 +1245,6 @@ function detectCompat(model) {
|
|
|
1150
1245
|
isCloudflareWorkersAI ||
|
|
1151
1246
|
isCloudflareAiGateway ||
|
|
1152
1247
|
isAntLing;
|
|
1153
|
-
const isDeepSeek = provider === "deepseek" || baseUrl.includes("deepseek.com");
|
|
1154
1248
|
const useMaxTokens = baseUrl.includes("chutes.ai") ||
|
|
1155
1249
|
isDeepSeek ||
|
|
1156
1250
|
isMoonshot ||
|
|
@@ -1167,6 +1261,7 @@ function detectCompat(model) {
|
|
|
1167
1261
|
supportsDeveloperRole: isOpenRouterDeveloperRoleModel || (!isNonStandard && !isOpenRouter),
|
|
1168
1262
|
supportsReasoningEffort: !isGrok && !isZai && !isMoonshot && !isTogether && !isCloudflareAiGateway && !isNvidia && !isAntLing,
|
|
1169
1263
|
supportsUsageInStreaming: true,
|
|
1264
|
+
supportsFinishReason: true,
|
|
1170
1265
|
maxTokensField: useMaxTokens ? "max_tokens" : "max_completion_tokens",
|
|
1171
1266
|
requiresToolResultName: false,
|
|
1172
1267
|
requiresAssistantAfterToolResult: false,
|
|
@@ -1186,12 +1281,17 @@ function detectCompat(model) {
|
|
|
1186
1281
|
openRouterRouting: {},
|
|
1187
1282
|
vercelGatewayRouting: {},
|
|
1188
1283
|
chatTemplateKwargs: {},
|
|
1284
|
+
chatTemplateArgs: {},
|
|
1189
1285
|
zaiToolStream: false,
|
|
1190
|
-
|
|
1286
|
+
supportsThinkingTokenBudget: false,
|
|
1287
|
+
thinkingTokenBudgetField: undefined,
|
|
1288
|
+
// OpenAI compatibility alone does not imply strict JSON-schema tool support.
|
|
1289
|
+
supportsStrictMode: false,
|
|
1191
1290
|
supportsOpenAIGrammarTools: false,
|
|
1291
|
+
supportsMidConvoSystemMessages: false,
|
|
1292
|
+
supportsMidConvoToolAdditions: false,
|
|
1192
1293
|
cacheControlFormat,
|
|
1193
|
-
sendSessionAffinityHeaders:
|
|
1194
|
-
deferredToolsMode: undefined,
|
|
1294
|
+
sendSessionAffinityHeaders: isOpenRouter,
|
|
1195
1295
|
sessionAffinityFormat: isOpenRouter ? "openrouter" : "openai",
|
|
1196
1296
|
supportsLongCacheRetention: !(isTogether ||
|
|
1197
1297
|
isCloudflareWorkersAI ||
|
|
@@ -1213,6 +1313,7 @@ function getCompat(model) {
|
|
|
1213
1313
|
supportsDeveloperRole: model.compat.supportsDeveloperRole ?? detected.supportsDeveloperRole,
|
|
1214
1314
|
supportsReasoningEffort: model.compat.supportsReasoningEffort ?? detected.supportsReasoningEffort,
|
|
1215
1315
|
supportsUsageInStreaming: model.compat.supportsUsageInStreaming ?? detected.supportsUsageInStreaming,
|
|
1316
|
+
supportsFinishReason: model.compat.supportsFinishReason ?? detected.supportsFinishReason,
|
|
1216
1317
|
maxTokensField: model.compat.maxTokensField ?? detected.maxTokensField,
|
|
1217
1318
|
requiresToolResultName: model.compat.requiresToolResultName ?? detected.requiresToolResultName,
|
|
1218
1319
|
requiresAssistantAfterToolResult: model.compat.requiresAssistantAfterToolResult ?? detected.requiresAssistantAfterToolResult,
|
|
@@ -1223,14 +1324,19 @@ function getCompat(model) {
|
|
|
1223
1324
|
openRouterRouting: model.compat.openRouterRouting ?? {},
|
|
1224
1325
|
vercelGatewayRouting: model.compat.vercelGatewayRouting ?? detected.vercelGatewayRouting,
|
|
1225
1326
|
chatTemplateKwargs: model.compat.chatTemplateKwargs ?? detected.chatTemplateKwargs,
|
|
1327
|
+
chatTemplateArgs: model.compat.chatTemplateArgs ?? detected.chatTemplateArgs,
|
|
1226
1328
|
zaiToolStream: model.compat.zaiToolStream ?? detected.zaiToolStream,
|
|
1329
|
+
supportsThinkingTokenBudget: model.compat.supportsThinkingTokenBudget ?? detected.supportsThinkingTokenBudget,
|
|
1330
|
+
thinkingTokenBudgetField: model.compat.thinkingTokenBudgetField ?? detected.thinkingTokenBudgetField,
|
|
1227
1331
|
supportsStrictMode: model.compat.supportsStrictMode ?? detected.supportsStrictMode,
|
|
1228
1332
|
supportsOpenAIGrammarTools: model.compat.supportsOpenAIGrammarTools ?? detected.supportsOpenAIGrammarTools,
|
|
1333
|
+
supportsMidConvoSystemMessages: model.compat.supportsMidConvoSystemMessages ?? detected.supportsMidConvoSystemMessages,
|
|
1334
|
+
supportsMidConvoToolAdditions: model.compat.supportsMidConvoToolAdditions ?? detected.supportsMidConvoToolAdditions,
|
|
1229
1335
|
cacheControlFormat: model.compat.cacheControlFormat ?? detected.cacheControlFormat,
|
|
1230
1336
|
sendSessionAffinityHeaders: model.compat.sendSessionAffinityHeaders ?? detected.sendSessionAffinityHeaders,
|
|
1231
|
-
deferredToolsMode: model.compat.deferredToolsMode ?? detected.deferredToolsMode,
|
|
1232
1337
|
sessionAffinityFormat: model.compat.sessionAffinityFormat ?? detected.sessionAffinityFormat,
|
|
1233
1338
|
supportsLongCacheRetention: model.compat.supportsLongCacheRetention ?? detected.supportsLongCacheRetention,
|
|
1339
|
+
vllmPriority: model.compat.vllmPriority,
|
|
1234
1340
|
};
|
|
1235
1341
|
}
|
|
1236
1342
|
//# sourceMappingURL=openai-completions.js.map
|