@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,19 +1,23 @@
|
|
|
1
|
-
import { HTTPClient, Mistral } from "@mistralai/mistralai";
|
|
2
1
|
import { calculateCost, clampThinkingLevel } from "../models.js";
|
|
2
|
+
import { getDrahtUserAgent } from "../utils/draht-user-agent.js";
|
|
3
3
|
import { AssistantMessageEventStream } from "../utils/event-stream.js";
|
|
4
4
|
import { shortHash } from "../utils/hash.js";
|
|
5
|
+
import { headersToRecord } from "../utils/headers.js";
|
|
5
6
|
import { parseStreamingJson } from "../utils/json-parse.js";
|
|
6
7
|
import { sanitizeSurrogates } from "../utils/sanitize-unicode.js";
|
|
7
|
-
import {
|
|
8
|
+
import { getSystemMessageText, renderSystemMessageUpdate } from "../utils/text.js";
|
|
9
|
+
import { getCurrentTools, resolveTranscript } from "../utils/transcript.js";
|
|
10
|
+
import { getJsonSchemaToolParameters, resolveJsonSchemaStrictSampling } from "./constrained-sampling.js";
|
|
8
11
|
import { buildBaseOptions } from "./simple-options.js";
|
|
9
12
|
import { transformMessages } from "./transform-messages.js";
|
|
10
13
|
const MISTRAL_TOOL_CALL_ID_LENGTH = 9;
|
|
11
14
|
const MAX_MISTRAL_ERROR_BODY_CHARS = 4000;
|
|
12
15
|
/**
|
|
13
|
-
* Stream responses from Mistral
|
|
16
|
+
* Stream responses from the native Mistral Chat Completions endpoint.
|
|
14
17
|
*/
|
|
15
18
|
export const stream = (model, context, options) => {
|
|
16
19
|
const stream = new AssistantMessageEventStream();
|
|
20
|
+
const normalizedContext = resolveTranscript(context, model.compat?.supportsMidConvoSystemMessages);
|
|
17
21
|
(async () => {
|
|
18
22
|
const output = createOutput(model);
|
|
19
23
|
try {
|
|
@@ -21,22 +25,16 @@ export const stream = (model, context, options) => {
|
|
|
21
25
|
if (!apiKey) {
|
|
22
26
|
throw new Error(`No API key for provider: ${model.provider}`);
|
|
23
27
|
}
|
|
24
|
-
// Intentionally per-request: avoids shared SDK mutable state across concurrent consumers.
|
|
25
|
-
const mistral = new Mistral({
|
|
26
|
-
apiKey,
|
|
27
|
-
serverURL: model.baseUrl,
|
|
28
|
-
...(options?.fetch ? { httpClient: new HTTPClient({ fetcher: options.fetch }) } : {}),
|
|
29
|
-
});
|
|
30
28
|
const normalizeMistralToolCallId = createMistralToolCallIdNormalizer();
|
|
31
|
-
const transformedMessages = transformMessages(
|
|
32
|
-
let payload = buildChatPayload(model,
|
|
29
|
+
const transformedMessages = transformMessages(normalizedContext.messages, model, (id) => normalizeMistralToolCallId(id));
|
|
30
|
+
let payload = buildChatPayload(model, normalizedContext, transformedMessages, options);
|
|
33
31
|
const nextPayload = await options?.onPayload?.(payload, model);
|
|
34
32
|
if (nextPayload !== undefined) {
|
|
35
33
|
payload = nextPayload;
|
|
36
34
|
}
|
|
37
|
-
const mistralStream = await
|
|
35
|
+
const mistralStream = await requestMistralStream(model, payload, apiKey, options);
|
|
38
36
|
stream.push({ type: "start", partial: output });
|
|
39
|
-
await consumeChatStream(model, output, stream, mistralStream);
|
|
37
|
+
await consumeChatStream(model, output, stream, mistralStream, options?.onProviderStreamEvent);
|
|
40
38
|
if (options?.signal?.aborted) {
|
|
41
39
|
throw new Error("Request was aborted");
|
|
42
40
|
}
|
|
@@ -70,14 +68,23 @@ export const streamSimple = (model, context, options) => {
|
|
|
70
68
|
if (!apiKey) {
|
|
71
69
|
throw new Error(`No API key for provider: ${model.provider}`);
|
|
72
70
|
}
|
|
73
|
-
const base =
|
|
71
|
+
const base = {
|
|
72
|
+
...buildBaseOptions(model, context, options, apiKey),
|
|
73
|
+
toolChoice: options?.toolChoice,
|
|
74
|
+
};
|
|
74
75
|
const clampedReasoning = options?.reasoning ? clampThinkingLevel(model, options.reasoning) : undefined;
|
|
75
76
|
const reasoning = clampedReasoning === "off" ? undefined : clampedReasoning;
|
|
76
|
-
|
|
77
|
+
// Models with a thinking level map use `reasoning_effort`; other reasoning models use `prompt_mode`.
|
|
78
|
+
const effortMap = model.reasoning ? model.thinkingLevelMap : undefined;
|
|
79
|
+
const reasoningEffort = effortMap
|
|
80
|
+
? reasoning
|
|
81
|
+
? (effortMap[reasoning] ?? "high")
|
|
82
|
+
: (effortMap.off ?? undefined)
|
|
83
|
+
: undefined;
|
|
77
84
|
return stream(model, context, {
|
|
78
85
|
...base,
|
|
79
|
-
promptMode:
|
|
80
|
-
reasoningEffort:
|
|
86
|
+
promptMode: model.reasoning && !effortMap && reasoning ? "reasoning" : undefined,
|
|
87
|
+
reasoningEffort: reasoningEffort,
|
|
81
88
|
});
|
|
82
89
|
};
|
|
83
90
|
function createOutput(model) {
|
|
@@ -131,9 +138,9 @@ function deriveMistralToolCallId(id, attempt) {
|
|
|
131
138
|
}
|
|
132
139
|
function formatMistralError(error) {
|
|
133
140
|
if (error instanceof Error) {
|
|
134
|
-
const
|
|
135
|
-
const statusCode = typeof
|
|
136
|
-
const bodyText = typeof
|
|
141
|
+
const httpError = error;
|
|
142
|
+
const statusCode = typeof httpError.statusCode === "number" ? httpError.statusCode : undefined;
|
|
143
|
+
const bodyText = typeof httpError.body === "string" ? httpError.body.trim() : undefined;
|
|
137
144
|
if (statusCode !== undefined && bodyText) {
|
|
138
145
|
return `Mistral API error (${statusCode}): ${truncateErrorText(bodyText, MAX_MISTRAL_ERROR_BODY_CHARS)}`;
|
|
139
146
|
}
|
|
@@ -157,26 +164,200 @@ function safeJsonStringify(value) {
|
|
|
157
164
|
return String(value);
|
|
158
165
|
}
|
|
159
166
|
}
|
|
160
|
-
function
|
|
161
|
-
const
|
|
162
|
-
|
|
167
|
+
async function requestMistralStream(model, payload, apiKey, options) {
|
|
168
|
+
const baseUrl = new URL(model.baseUrl);
|
|
169
|
+
baseUrl.pathname = `${baseUrl.pathname.replace(/\/+$/u, "")}/`;
|
|
170
|
+
const url = new URL("v1/chat/completions", baseUrl);
|
|
171
|
+
const headers = buildMistralHeaders(model, apiKey, options);
|
|
172
|
+
const timeoutSignal = AbortSignal.timeout(options?.timeoutMs ?? 60_000);
|
|
173
|
+
const signal = options?.signal ? AbortSignal.any([options.signal, timeoutSignal]) : timeoutSignal;
|
|
174
|
+
const response = await (options?.fetch ?? globalThis.fetch)(url, {
|
|
175
|
+
method: "POST",
|
|
176
|
+
headers,
|
|
177
|
+
body: JSON.stringify(toMistralWirePayload(payload)),
|
|
178
|
+
signal,
|
|
179
|
+
});
|
|
180
|
+
await options?.onResponse?.({ status: response.status, headers: headersToRecord(response.headers) }, model);
|
|
181
|
+
if (!response.ok) {
|
|
182
|
+
const body = await response.text();
|
|
183
|
+
throw new MistralHttpError(response.status, body, response.statusText);
|
|
184
|
+
}
|
|
185
|
+
if (!response.body) {
|
|
186
|
+
throw new Error("Mistral response has no body");
|
|
187
|
+
}
|
|
188
|
+
return readMistralEvents(response.body, signal);
|
|
189
|
+
}
|
|
190
|
+
class MistralHttpError extends Error {
|
|
191
|
+
statusCode;
|
|
192
|
+
body;
|
|
193
|
+
constructor(statusCode, body, statusText) {
|
|
194
|
+
super(statusText || `Request failed with status ${statusCode}`);
|
|
195
|
+
this.name = "MistralHttpError";
|
|
196
|
+
this.statusCode = statusCode;
|
|
197
|
+
this.body = body;
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
function buildMistralHeaders(model, apiKey, options) {
|
|
201
|
+
const headers = new Headers({
|
|
202
|
+
"User-Agent": getDrahtUserAgent(),
|
|
203
|
+
accept: "text/event-stream",
|
|
204
|
+
authorization: `Bearer ${apiKey}`,
|
|
205
|
+
"content-type": "application/json",
|
|
206
|
+
});
|
|
207
|
+
applyMistralHeaderOverrides(headers, model.headers);
|
|
208
|
+
applyMistralHeaderOverrides(headers, options?.headers);
|
|
209
|
+
const hasExplicitAffinity = hasMistralHeaderOverride(model.headers, "x-affinity") || hasMistralHeaderOverride(options?.headers, "x-affinity");
|
|
210
|
+
if (shouldUsePromptCaching(options) && !hasExplicitAffinity) {
|
|
211
|
+
headers.set("x-affinity", options.sessionId);
|
|
212
|
+
}
|
|
213
|
+
return headers;
|
|
214
|
+
}
|
|
215
|
+
function applyMistralHeaderOverrides(headers, overrides) {
|
|
216
|
+
if (!overrides)
|
|
217
|
+
return;
|
|
218
|
+
for (const [name, value] of Object.entries(overrides)) {
|
|
219
|
+
if (value === null)
|
|
220
|
+
headers.delete(name);
|
|
221
|
+
else
|
|
222
|
+
headers.set(name, value);
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
function hasMistralHeaderOverride(overrides, target) {
|
|
226
|
+
return !!overrides && Object.keys(overrides).some((name) => name.toLowerCase() === target);
|
|
227
|
+
}
|
|
228
|
+
function toMistralWirePayload(payload) {
|
|
229
|
+
const wirePayload = { ...payload };
|
|
230
|
+
for (const [source, target] of [
|
|
231
|
+
["topP", "top_p"],
|
|
232
|
+
["maxTokens", "max_tokens"],
|
|
233
|
+
["randomSeed", "random_seed"],
|
|
234
|
+
["responseFormat", "response_format"],
|
|
235
|
+
["toolChoice", "tool_choice"],
|
|
236
|
+
["presencePenalty", "presence_penalty"],
|
|
237
|
+
["frequencyPenalty", "frequency_penalty"],
|
|
238
|
+
["parallelToolCalls", "parallel_tool_calls"],
|
|
239
|
+
["reasoningEffort", "reasoning_effort"],
|
|
240
|
+
["promptMode", "prompt_mode"],
|
|
241
|
+
["promptCacheKey", "prompt_cache_key"],
|
|
242
|
+
["safePrompt", "safe_prompt"],
|
|
243
|
+
]) {
|
|
244
|
+
remapMistralProperty(wirePayload, source, target);
|
|
245
|
+
}
|
|
246
|
+
wirePayload.messages = payload.messages.map((message) => toMistralWireMessage(message));
|
|
247
|
+
const responseFormat = wirePayload.response_format;
|
|
248
|
+
if (isMistralRecord(responseFormat)) {
|
|
249
|
+
const wireResponseFormat = { ...responseFormat };
|
|
250
|
+
remapMistralProperty(wireResponseFormat, "jsonSchema", "json_schema");
|
|
251
|
+
const jsonSchema = wireResponseFormat.json_schema;
|
|
252
|
+
if (isMistralRecord(jsonSchema)) {
|
|
253
|
+
const wireJsonSchema = { ...jsonSchema };
|
|
254
|
+
remapMistralProperty(wireJsonSchema, "schemaDefinition", "schema");
|
|
255
|
+
wireResponseFormat.json_schema = wireJsonSchema;
|
|
256
|
+
}
|
|
257
|
+
wirePayload.response_format = wireResponseFormat;
|
|
258
|
+
}
|
|
259
|
+
return wirePayload;
|
|
260
|
+
}
|
|
261
|
+
function toMistralWireMessage(message) {
|
|
262
|
+
const wireMessage = { ...message };
|
|
263
|
+
remapMistralProperty(wireMessage, "toolCalls", "tool_calls");
|
|
264
|
+
remapMistralProperty(wireMessage, "toolCallId", "tool_call_id");
|
|
265
|
+
if (Array.isArray(message.content)) {
|
|
266
|
+
wireMessage.content = message.content.map((chunk) => toMistralWireContentChunk(chunk));
|
|
267
|
+
}
|
|
268
|
+
return wireMessage;
|
|
269
|
+
}
|
|
270
|
+
function toMistralWireContentChunk(chunk) {
|
|
271
|
+
const wireChunk = { ...chunk };
|
|
272
|
+
for (const [source, target] of [
|
|
273
|
+
["imageUrl", "image_url"],
|
|
274
|
+
["documentUrl", "document_url"],
|
|
275
|
+
["documentName", "document_name"],
|
|
276
|
+
["fileId", "file_id"],
|
|
277
|
+
["referenceIds", "reference_ids"],
|
|
278
|
+
["inputAudio", "input_audio"],
|
|
279
|
+
]) {
|
|
280
|
+
remapMistralProperty(wireChunk, source, target);
|
|
281
|
+
}
|
|
282
|
+
return wireChunk;
|
|
283
|
+
}
|
|
284
|
+
function remapMistralProperty(record, source, target) {
|
|
285
|
+
if (!(source in record))
|
|
286
|
+
return;
|
|
287
|
+
record[target] = record[source];
|
|
288
|
+
delete record[source];
|
|
289
|
+
}
|
|
290
|
+
function isMistralRecord(value) {
|
|
291
|
+
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
292
|
+
}
|
|
293
|
+
const MISTRAL_STREAM_DONE = Symbol("mistral-stream-done");
|
|
294
|
+
async function* readMistralEvents(body, signal) {
|
|
295
|
+
const reader = body.getReader();
|
|
296
|
+
const decoder = new TextDecoder();
|
|
297
|
+
let buffer = "";
|
|
298
|
+
const onAbort = () => {
|
|
299
|
+
void reader.cancel().catch(() => { });
|
|
163
300
|
};
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
301
|
+
signal.addEventListener("abort", onAbort, { once: true });
|
|
302
|
+
try {
|
|
303
|
+
while (true) {
|
|
304
|
+
if (signal.aborted)
|
|
305
|
+
throw signal.reason;
|
|
306
|
+
const { done, value } = await reader.read();
|
|
307
|
+
if (signal.aborted)
|
|
308
|
+
throw signal.reason;
|
|
309
|
+
buffer += done ? decoder.decode() : decoder.decode(value, { stream: true });
|
|
310
|
+
let boundary = findMistralEventBoundary(buffer);
|
|
311
|
+
while (boundary) {
|
|
312
|
+
const event = parseMistralEvent(buffer.slice(0, boundary.index));
|
|
313
|
+
buffer = buffer.slice(boundary.index + boundary.length);
|
|
314
|
+
if (event === MISTRAL_STREAM_DONE)
|
|
315
|
+
return;
|
|
316
|
+
if (event)
|
|
317
|
+
yield event;
|
|
318
|
+
boundary = findMistralEventBoundary(buffer);
|
|
319
|
+
}
|
|
320
|
+
if (done)
|
|
321
|
+
break;
|
|
322
|
+
}
|
|
323
|
+
if (buffer.trim()) {
|
|
324
|
+
const event = parseMistralEvent(buffer);
|
|
325
|
+
if (event !== MISTRAL_STREAM_DONE && event)
|
|
326
|
+
yield event;
|
|
327
|
+
}
|
|
175
328
|
}
|
|
176
|
-
|
|
177
|
-
|
|
329
|
+
finally {
|
|
330
|
+
signal.removeEventListener("abort", onAbort);
|
|
331
|
+
try {
|
|
332
|
+
await reader.cancel();
|
|
333
|
+
}
|
|
334
|
+
catch { }
|
|
335
|
+
try {
|
|
336
|
+
reader.releaseLock();
|
|
337
|
+
}
|
|
338
|
+
catch { }
|
|
178
339
|
}
|
|
179
|
-
|
|
340
|
+
}
|
|
341
|
+
function findMistralEventBoundary(buffer) {
|
|
342
|
+
const match = /\r\n\r\n|\r\n\r|\r\n\n|\r\r\n|\n\r\n|\r\r|\n\r|\n\n/u.exec(buffer);
|
|
343
|
+
return match?.index === undefined ? undefined : { index: match.index, length: match[0].length };
|
|
344
|
+
}
|
|
345
|
+
function parseMistralEvent(raw) {
|
|
346
|
+
const data = raw
|
|
347
|
+
.split(/\r\n|\r|\n/u)
|
|
348
|
+
.filter((line) => line.startsWith("data:"))
|
|
349
|
+
.map((line) => line.slice(5).trimStart())
|
|
350
|
+
.join("\n")
|
|
351
|
+
.trim();
|
|
352
|
+
if (!data)
|
|
353
|
+
return undefined;
|
|
354
|
+
if (data === "[DONE]")
|
|
355
|
+
return MISTRAL_STREAM_DONE;
|
|
356
|
+
const parsed = JSON.parse(data);
|
|
357
|
+
if (!isMistralRecord(parsed) || !Array.isArray(parsed.choices)) {
|
|
358
|
+
throw new Error("Invalid Mistral streaming event");
|
|
359
|
+
}
|
|
360
|
+
return { data: parsed };
|
|
180
361
|
}
|
|
181
362
|
function buildChatPayload(model, context, messages, options) {
|
|
182
363
|
const payload = {
|
|
@@ -184,8 +365,9 @@ function buildChatPayload(model, context, messages, options) {
|
|
|
184
365
|
stream: true,
|
|
185
366
|
messages: toChatMessages(messages, model.input.includes("image")),
|
|
186
367
|
};
|
|
187
|
-
|
|
188
|
-
|
|
368
|
+
const currentTools = getCurrentTools(context.messages);
|
|
369
|
+
if (currentTools.length > 0)
|
|
370
|
+
payload.tools = toFunctionTools(currentTools);
|
|
189
371
|
if (options?.temperature !== undefined)
|
|
190
372
|
payload.temperature = options.temperature;
|
|
191
373
|
if (options?.maxTokens !== undefined)
|
|
@@ -198,12 +380,6 @@ function buildChatPayload(model, context, messages, options) {
|
|
|
198
380
|
payload.reasoningEffort = options.reasoningEffort;
|
|
199
381
|
if (shouldUsePromptCaching(options))
|
|
200
382
|
payload.promptCacheKey = options.sessionId;
|
|
201
|
-
if (context.systemPrompt) {
|
|
202
|
-
payload.messages.unshift({
|
|
203
|
-
role: "system",
|
|
204
|
-
content: sanitizeSurrogates(context.systemPrompt),
|
|
205
|
-
});
|
|
206
|
-
}
|
|
207
383
|
return payload;
|
|
208
384
|
}
|
|
209
385
|
function shouldUsePromptCaching(options) {
|
|
@@ -221,7 +397,7 @@ function getMistralCachedPromptTokens(usage, promptTokens) {
|
|
|
221
397
|
const cachedTokens = typeof rawCachedTokens === "number" && Number.isFinite(rawCachedTokens) ? rawCachedTokens : 0;
|
|
222
398
|
return Math.min(promptTokens, Math.max(0, cachedTokens));
|
|
223
399
|
}
|
|
224
|
-
async function consumeChatStream(model, output, stream, mistralStream) {
|
|
400
|
+
async function consumeChatStream(model, output, stream, mistralStream, onProviderStreamEvent) {
|
|
225
401
|
let currentBlock = null;
|
|
226
402
|
const blocks = output.content;
|
|
227
403
|
const blockIndex = () => blocks.length - 1;
|
|
@@ -249,27 +425,28 @@ async function consumeChatStream(model, output, stream, mistralStream) {
|
|
|
249
425
|
};
|
|
250
426
|
for await (const event of mistralStream) {
|
|
251
427
|
const chunk = event.data;
|
|
428
|
+
await onProviderStreamEvent?.(chunk, model);
|
|
252
429
|
// Mistral's streamed CompletionChunk carries an id field. Keep the first non-empty one,
|
|
253
430
|
// mirroring how OpenAI-style streaming exposes a stable response identifier per stream.
|
|
254
431
|
output.responseId ||= chunk.id;
|
|
255
432
|
if (chunk.usage) {
|
|
256
|
-
const promptTokens = chunk.usage.
|
|
433
|
+
const promptTokens = chunk.usage.prompt_tokens || 0;
|
|
257
434
|
const cachedPromptTokens = getMistralCachedPromptTokens(chunk.usage, promptTokens);
|
|
258
435
|
output.usage.input = Math.max(0, promptTokens - cachedPromptTokens);
|
|
259
|
-
output.usage.output = chunk.usage.
|
|
436
|
+
output.usage.output = chunk.usage.completion_tokens || 0;
|
|
260
437
|
output.usage.cacheRead = cachedPromptTokens;
|
|
261
438
|
output.usage.cacheWrite = 0;
|
|
262
439
|
output.usage.totalTokens =
|
|
263
|
-
chunk.usage.
|
|
440
|
+
chunk.usage.total_tokens ||
|
|
264
441
|
output.usage.input + output.usage.output + output.usage.cacheRead + output.usage.cacheWrite;
|
|
265
442
|
calculateCost(model, output.usage);
|
|
266
443
|
}
|
|
267
444
|
const choice = chunk.choices[0];
|
|
268
445
|
if (!choice)
|
|
269
446
|
continue;
|
|
270
|
-
if (choice.
|
|
271
|
-
output.rawStopReason = choice.
|
|
272
|
-
const stopReasonResult = mapChatStopReason(choice.
|
|
447
|
+
if (choice.finish_reason) {
|
|
448
|
+
output.rawStopReason = choice.finish_reason;
|
|
449
|
+
const stopReasonResult = mapChatStopReason(choice.finish_reason);
|
|
273
450
|
output.stopReason = stopReasonResult.stopReason;
|
|
274
451
|
if (stopReasonResult.errorMessage) {
|
|
275
452
|
output.errorMessage = stopReasonResult.errorMessage;
|
|
@@ -281,6 +458,10 @@ async function consumeChatStream(model, output, stream, mistralStream) {
|
|
|
281
458
|
for (const item of contentItems) {
|
|
282
459
|
if (typeof item === "string") {
|
|
283
460
|
const textDelta = sanitizeSurrogates(item);
|
|
461
|
+
// GLM models on Mistral send empty content deltas around thinking and tool calls.
|
|
462
|
+
// Opening a block for them splits thinking into multiple blocks, which Mistral rejects on replay.
|
|
463
|
+
if (!textDelta)
|
|
464
|
+
continue;
|
|
284
465
|
if (!currentBlock || currentBlock.type !== "text") {
|
|
285
466
|
finishCurrentBlock(currentBlock);
|
|
286
467
|
currentBlock = { type: "text", text: "" };
|
|
@@ -297,8 +478,8 @@ async function consumeChatStream(model, output, stream, mistralStream) {
|
|
|
297
478
|
continue;
|
|
298
479
|
}
|
|
299
480
|
if (item.type === "thinking") {
|
|
300
|
-
const deltaText = item.thinking
|
|
301
|
-
.map((part) =>
|
|
481
|
+
const deltaText = (item.thinking ?? [])
|
|
482
|
+
.map((part) => part.text ?? "")
|
|
302
483
|
.filter((text) => text.length > 0)
|
|
303
484
|
.join("");
|
|
304
485
|
const thinkingDelta = sanitizeSurrogates(deltaText);
|
|
@@ -320,7 +501,9 @@ async function consumeChatStream(model, output, stream, mistralStream) {
|
|
|
320
501
|
continue;
|
|
321
502
|
}
|
|
322
503
|
if (item.type === "text") {
|
|
323
|
-
const textDelta = sanitizeSurrogates(item.text);
|
|
504
|
+
const textDelta = sanitizeSurrogates(item.text ?? "");
|
|
505
|
+
if (!textDelta)
|
|
506
|
+
continue;
|
|
324
507
|
if (!currentBlock || currentBlock.type !== "text") {
|
|
325
508
|
finishCurrentBlock(currentBlock);
|
|
326
509
|
currentBlock = { type: "text", text: "" };
|
|
@@ -337,7 +520,7 @@ async function consumeChatStream(model, output, stream, mistralStream) {
|
|
|
337
520
|
}
|
|
338
521
|
}
|
|
339
522
|
}
|
|
340
|
-
const toolCalls = delta.
|
|
523
|
+
const toolCalls = delta.tool_calls || [];
|
|
341
524
|
for (const toolCall of toolCalls) {
|
|
342
525
|
if (currentBlock) {
|
|
343
526
|
finishCurrentBlock(currentBlock);
|
|
@@ -346,7 +529,7 @@ async function consumeChatStream(model, output, stream, mistralStream) {
|
|
|
346
529
|
const callId = toolCall.id && toolCall.id !== "null"
|
|
347
530
|
? toolCall.id
|
|
348
531
|
: deriveMistralToolCallId(`toolcall:${toolCall.index ?? 0}`, 0);
|
|
349
|
-
const key =
|
|
532
|
+
const key = toolCall.index ?? callId;
|
|
350
533
|
const existingIndex = toolBlocksByKey.get(key);
|
|
351
534
|
let block;
|
|
352
535
|
if (existingIndex !== undefined) {
|
|
@@ -406,7 +589,7 @@ function toFunctionTools(tools) {
|
|
|
406
589
|
function: {
|
|
407
590
|
name: tool.name,
|
|
408
591
|
description: tool.description,
|
|
409
|
-
parameters: stripSymbolKeys(tool
|
|
592
|
+
parameters: stripSymbolKeys(getJsonSchemaToolParameters(tool, strict)),
|
|
410
593
|
strict: strict ?? false,
|
|
411
594
|
},
|
|
412
595
|
};
|
|
@@ -427,7 +610,13 @@ function stripSymbolKeys(value) {
|
|
|
427
610
|
}
|
|
428
611
|
function toChatMessages(messages, supportsImages) {
|
|
429
612
|
const result = [];
|
|
430
|
-
for (const msg of messages) {
|
|
613
|
+
for (const [index, msg] of messages.entries()) {
|
|
614
|
+
if (msg.role === "system") {
|
|
615
|
+
const text = index === 0 ? getSystemMessageText(msg) : renderSystemMessageUpdate(msg);
|
|
616
|
+
if (text.length > 0)
|
|
617
|
+
result.push({ role: "system", content: sanitizeSurrogates(text) });
|
|
618
|
+
continue;
|
|
619
|
+
}
|
|
431
620
|
if (msg.role === "user") {
|
|
432
621
|
if (typeof msg.content === "string") {
|
|
433
622
|
result.push({ role: "user", content: sanitizeSurrogates(msg.content) });
|
|
@@ -473,9 +662,10 @@ function toChatMessages(messages, supportsImages) {
|
|
|
473
662
|
id: block.id,
|
|
474
663
|
type: "function",
|
|
475
664
|
function: { name: block.name, arguments: JSON.stringify(block.arguments || {}) },
|
|
665
|
+
index: 0,
|
|
476
666
|
});
|
|
477
667
|
}
|
|
478
|
-
const assistantMessage = { role: "assistant" };
|
|
668
|
+
const assistantMessage = { role: "assistant", prefix: false };
|
|
479
669
|
if (contentParts.length > 0)
|
|
480
670
|
assistantMessage.content = contentParts;
|
|
481
671
|
if (toolCalls.length > 0)
|
|
@@ -528,15 +718,6 @@ function buildToolResultText(text, hasImages, supportsImages, isError) {
|
|
|
528
718
|
}
|
|
529
719
|
return isError ? "[tool error] (no tool output)" : "(no tool output)";
|
|
530
720
|
}
|
|
531
|
-
function usesReasoningEffort(model) {
|
|
532
|
-
return model.id === "mistral-small-2603" || model.id === "mistral-small-latest" || model.id === "mistral-medium-3.5";
|
|
533
|
-
}
|
|
534
|
-
function usesPromptModeReasoning(model) {
|
|
535
|
-
return model.reasoning && !usesReasoningEffort(model);
|
|
536
|
-
}
|
|
537
|
-
function mapReasoningEffort(model, level) {
|
|
538
|
-
return (model.thinkingLevelMap?.[level] ?? "high");
|
|
539
|
-
}
|
|
540
721
|
function mapToolChoice(choice) {
|
|
541
722
|
if (!choice)
|
|
542
723
|
return undefined;
|