@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,20 +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
|
-
import { getPiUserAgent } from "../utils/pi-user-agent.js";
|
|
7
7
|
import { sanitizeSurrogates } from "../utils/sanitize-unicode.js";
|
|
8
|
-
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";
|
|
9
11
|
import { buildBaseOptions } from "./simple-options.js";
|
|
10
12
|
import { transformMessages } from "./transform-messages.js";
|
|
11
13
|
const MISTRAL_TOOL_CALL_ID_LENGTH = 9;
|
|
12
14
|
const MAX_MISTRAL_ERROR_BODY_CHARS = 4000;
|
|
13
15
|
/**
|
|
14
|
-
* Stream responses from Mistral
|
|
16
|
+
* Stream responses from the native Mistral Chat Completions endpoint.
|
|
15
17
|
*/
|
|
16
18
|
export const stream = (model, context, options) => {
|
|
17
19
|
const stream = new AssistantMessageEventStream();
|
|
20
|
+
const normalizedContext = resolveTranscript(context, model.compat?.supportsMidConvoSystemMessages);
|
|
18
21
|
(async () => {
|
|
19
22
|
const output = createOutput(model);
|
|
20
23
|
try {
|
|
@@ -22,22 +25,16 @@ export const stream = (model, context, options) => {
|
|
|
22
25
|
if (!apiKey) {
|
|
23
26
|
throw new Error(`No API key for provider: ${model.provider}`);
|
|
24
27
|
}
|
|
25
|
-
// Intentionally per-request: avoids shared SDK mutable state across concurrent consumers.
|
|
26
|
-
const mistral = new Mistral({
|
|
27
|
-
apiKey,
|
|
28
|
-
serverURL: model.baseUrl,
|
|
29
|
-
...(options?.fetch ? { httpClient: new HTTPClient({ fetcher: options.fetch }) } : {}),
|
|
30
|
-
});
|
|
31
28
|
const normalizeMistralToolCallId = createMistralToolCallIdNormalizer();
|
|
32
|
-
const transformedMessages = transformMessages(
|
|
33
|
-
let payload = buildChatPayload(model,
|
|
29
|
+
const transformedMessages = transformMessages(normalizedContext.messages, model, (id) => normalizeMistralToolCallId(id));
|
|
30
|
+
let payload = buildChatPayload(model, normalizedContext, transformedMessages, options);
|
|
34
31
|
const nextPayload = await options?.onPayload?.(payload, model);
|
|
35
32
|
if (nextPayload !== undefined) {
|
|
36
33
|
payload = nextPayload;
|
|
37
34
|
}
|
|
38
|
-
const mistralStream = await
|
|
35
|
+
const mistralStream = await requestMistralStream(model, payload, apiKey, options);
|
|
39
36
|
stream.push({ type: "start", partial: output });
|
|
40
|
-
await consumeChatStream(model, output, stream, mistralStream);
|
|
37
|
+
await consumeChatStream(model, output, stream, mistralStream, options?.onProviderStreamEvent);
|
|
41
38
|
if (options?.signal?.aborted) {
|
|
42
39
|
throw new Error("Request was aborted");
|
|
43
40
|
}
|
|
@@ -77,11 +74,17 @@ export const streamSimple = (model, context, options) => {
|
|
|
77
74
|
};
|
|
78
75
|
const clampedReasoning = options?.reasoning ? clampThinkingLevel(model, options.reasoning) : undefined;
|
|
79
76
|
const reasoning = clampedReasoning === "off" ? undefined : clampedReasoning;
|
|
80
|
-
|
|
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;
|
|
81
84
|
return stream(model, context, {
|
|
82
85
|
...base,
|
|
83
|
-
promptMode:
|
|
84
|
-
reasoningEffort:
|
|
86
|
+
promptMode: model.reasoning && !effortMap && reasoning ? "reasoning" : undefined,
|
|
87
|
+
reasoningEffort: reasoningEffort,
|
|
85
88
|
});
|
|
86
89
|
};
|
|
87
90
|
function createOutput(model) {
|
|
@@ -135,9 +138,9 @@ function deriveMistralToolCallId(id, attempt) {
|
|
|
135
138
|
}
|
|
136
139
|
function formatMistralError(error) {
|
|
137
140
|
if (error instanceof Error) {
|
|
138
|
-
const
|
|
139
|
-
const statusCode = typeof
|
|
140
|
-
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;
|
|
141
144
|
if (statusCode !== undefined && bodyText) {
|
|
142
145
|
return `Mistral API error (${statusCode}): ${truncateErrorText(bodyText, MAX_MISTRAL_ERROR_BODY_CHARS)}`;
|
|
143
146
|
}
|
|
@@ -161,26 +164,200 @@ function safeJsonStringify(value) {
|
|
|
161
164
|
return String(value);
|
|
162
165
|
}
|
|
163
166
|
}
|
|
164
|
-
function
|
|
165
|
-
const
|
|
166
|
-
|
|
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(() => { });
|
|
167
300
|
};
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
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
|
+
}
|
|
179
328
|
}
|
|
180
|
-
|
|
181
|
-
|
|
329
|
+
finally {
|
|
330
|
+
signal.removeEventListener("abort", onAbort);
|
|
331
|
+
try {
|
|
332
|
+
await reader.cancel();
|
|
333
|
+
}
|
|
334
|
+
catch { }
|
|
335
|
+
try {
|
|
336
|
+
reader.releaseLock();
|
|
337
|
+
}
|
|
338
|
+
catch { }
|
|
339
|
+
}
|
|
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");
|
|
182
359
|
}
|
|
183
|
-
return
|
|
360
|
+
return { data: parsed };
|
|
184
361
|
}
|
|
185
362
|
function buildChatPayload(model, context, messages, options) {
|
|
186
363
|
const payload = {
|
|
@@ -188,8 +365,9 @@ function buildChatPayload(model, context, messages, options) {
|
|
|
188
365
|
stream: true,
|
|
189
366
|
messages: toChatMessages(messages, model.input.includes("image")),
|
|
190
367
|
};
|
|
191
|
-
|
|
192
|
-
|
|
368
|
+
const currentTools = getCurrentTools(context.messages);
|
|
369
|
+
if (currentTools.length > 0)
|
|
370
|
+
payload.tools = toFunctionTools(currentTools);
|
|
193
371
|
if (options?.temperature !== undefined)
|
|
194
372
|
payload.temperature = options.temperature;
|
|
195
373
|
if (options?.maxTokens !== undefined)
|
|
@@ -202,12 +380,6 @@ function buildChatPayload(model, context, messages, options) {
|
|
|
202
380
|
payload.reasoningEffort = options.reasoningEffort;
|
|
203
381
|
if (shouldUsePromptCaching(options))
|
|
204
382
|
payload.promptCacheKey = options.sessionId;
|
|
205
|
-
if (context.systemPrompt) {
|
|
206
|
-
payload.messages.unshift({
|
|
207
|
-
role: "system",
|
|
208
|
-
content: sanitizeSurrogates(context.systemPrompt),
|
|
209
|
-
});
|
|
210
|
-
}
|
|
211
383
|
return payload;
|
|
212
384
|
}
|
|
213
385
|
function shouldUsePromptCaching(options) {
|
|
@@ -225,7 +397,7 @@ function getMistralCachedPromptTokens(usage, promptTokens) {
|
|
|
225
397
|
const cachedTokens = typeof rawCachedTokens === "number" && Number.isFinite(rawCachedTokens) ? rawCachedTokens : 0;
|
|
226
398
|
return Math.min(promptTokens, Math.max(0, cachedTokens));
|
|
227
399
|
}
|
|
228
|
-
async function consumeChatStream(model, output, stream, mistralStream) {
|
|
400
|
+
async function consumeChatStream(model, output, stream, mistralStream, onProviderStreamEvent) {
|
|
229
401
|
let currentBlock = null;
|
|
230
402
|
const blocks = output.content;
|
|
231
403
|
const blockIndex = () => blocks.length - 1;
|
|
@@ -253,27 +425,28 @@ async function consumeChatStream(model, output, stream, mistralStream) {
|
|
|
253
425
|
};
|
|
254
426
|
for await (const event of mistralStream) {
|
|
255
427
|
const chunk = event.data;
|
|
428
|
+
await onProviderStreamEvent?.(chunk, model);
|
|
256
429
|
// Mistral's streamed CompletionChunk carries an id field. Keep the first non-empty one,
|
|
257
430
|
// mirroring how OpenAI-style streaming exposes a stable response identifier per stream.
|
|
258
431
|
output.responseId ||= chunk.id;
|
|
259
432
|
if (chunk.usage) {
|
|
260
|
-
const promptTokens = chunk.usage.
|
|
433
|
+
const promptTokens = chunk.usage.prompt_tokens || 0;
|
|
261
434
|
const cachedPromptTokens = getMistralCachedPromptTokens(chunk.usage, promptTokens);
|
|
262
435
|
output.usage.input = Math.max(0, promptTokens - cachedPromptTokens);
|
|
263
|
-
output.usage.output = chunk.usage.
|
|
436
|
+
output.usage.output = chunk.usage.completion_tokens || 0;
|
|
264
437
|
output.usage.cacheRead = cachedPromptTokens;
|
|
265
438
|
output.usage.cacheWrite = 0;
|
|
266
439
|
output.usage.totalTokens =
|
|
267
|
-
chunk.usage.
|
|
440
|
+
chunk.usage.total_tokens ||
|
|
268
441
|
output.usage.input + output.usage.output + output.usage.cacheRead + output.usage.cacheWrite;
|
|
269
442
|
calculateCost(model, output.usage);
|
|
270
443
|
}
|
|
271
444
|
const choice = chunk.choices[0];
|
|
272
445
|
if (!choice)
|
|
273
446
|
continue;
|
|
274
|
-
if (choice.
|
|
275
|
-
output.rawStopReason = choice.
|
|
276
|
-
const stopReasonResult = mapChatStopReason(choice.
|
|
447
|
+
if (choice.finish_reason) {
|
|
448
|
+
output.rawStopReason = choice.finish_reason;
|
|
449
|
+
const stopReasonResult = mapChatStopReason(choice.finish_reason);
|
|
277
450
|
output.stopReason = stopReasonResult.stopReason;
|
|
278
451
|
if (stopReasonResult.errorMessage) {
|
|
279
452
|
output.errorMessage = stopReasonResult.errorMessage;
|
|
@@ -285,6 +458,10 @@ async function consumeChatStream(model, output, stream, mistralStream) {
|
|
|
285
458
|
for (const item of contentItems) {
|
|
286
459
|
if (typeof item === "string") {
|
|
287
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;
|
|
288
465
|
if (!currentBlock || currentBlock.type !== "text") {
|
|
289
466
|
finishCurrentBlock(currentBlock);
|
|
290
467
|
currentBlock = { type: "text", text: "" };
|
|
@@ -301,8 +478,8 @@ async function consumeChatStream(model, output, stream, mistralStream) {
|
|
|
301
478
|
continue;
|
|
302
479
|
}
|
|
303
480
|
if (item.type === "thinking") {
|
|
304
|
-
const deltaText = item.thinking
|
|
305
|
-
.map((part) =>
|
|
481
|
+
const deltaText = (item.thinking ?? [])
|
|
482
|
+
.map((part) => part.text ?? "")
|
|
306
483
|
.filter((text) => text.length > 0)
|
|
307
484
|
.join("");
|
|
308
485
|
const thinkingDelta = sanitizeSurrogates(deltaText);
|
|
@@ -324,7 +501,9 @@ async function consumeChatStream(model, output, stream, mistralStream) {
|
|
|
324
501
|
continue;
|
|
325
502
|
}
|
|
326
503
|
if (item.type === "text") {
|
|
327
|
-
const textDelta = sanitizeSurrogates(item.text);
|
|
504
|
+
const textDelta = sanitizeSurrogates(item.text ?? "");
|
|
505
|
+
if (!textDelta)
|
|
506
|
+
continue;
|
|
328
507
|
if (!currentBlock || currentBlock.type !== "text") {
|
|
329
508
|
finishCurrentBlock(currentBlock);
|
|
330
509
|
currentBlock = { type: "text", text: "" };
|
|
@@ -341,7 +520,7 @@ async function consumeChatStream(model, output, stream, mistralStream) {
|
|
|
341
520
|
}
|
|
342
521
|
}
|
|
343
522
|
}
|
|
344
|
-
const toolCalls = delta.
|
|
523
|
+
const toolCalls = delta.tool_calls || [];
|
|
345
524
|
for (const toolCall of toolCalls) {
|
|
346
525
|
if (currentBlock) {
|
|
347
526
|
finishCurrentBlock(currentBlock);
|
|
@@ -350,7 +529,7 @@ async function consumeChatStream(model, output, stream, mistralStream) {
|
|
|
350
529
|
const callId = toolCall.id && toolCall.id !== "null"
|
|
351
530
|
? toolCall.id
|
|
352
531
|
: deriveMistralToolCallId(`toolcall:${toolCall.index ?? 0}`, 0);
|
|
353
|
-
const key =
|
|
532
|
+
const key = toolCall.index ?? callId;
|
|
354
533
|
const existingIndex = toolBlocksByKey.get(key);
|
|
355
534
|
let block;
|
|
356
535
|
if (existingIndex !== undefined) {
|
|
@@ -410,7 +589,7 @@ function toFunctionTools(tools) {
|
|
|
410
589
|
function: {
|
|
411
590
|
name: tool.name,
|
|
412
591
|
description: tool.description,
|
|
413
|
-
parameters: stripSymbolKeys(tool
|
|
592
|
+
parameters: stripSymbolKeys(getJsonSchemaToolParameters(tool, strict)),
|
|
414
593
|
strict: strict ?? false,
|
|
415
594
|
},
|
|
416
595
|
};
|
|
@@ -431,7 +610,13 @@ function stripSymbolKeys(value) {
|
|
|
431
610
|
}
|
|
432
611
|
function toChatMessages(messages, supportsImages) {
|
|
433
612
|
const result = [];
|
|
434
|
-
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
|
+
}
|
|
435
620
|
if (msg.role === "user") {
|
|
436
621
|
if (typeof msg.content === "string") {
|
|
437
622
|
result.push({ role: "user", content: sanitizeSurrogates(msg.content) });
|
|
@@ -477,9 +662,10 @@ function toChatMessages(messages, supportsImages) {
|
|
|
477
662
|
id: block.id,
|
|
478
663
|
type: "function",
|
|
479
664
|
function: { name: block.name, arguments: JSON.stringify(block.arguments || {}) },
|
|
665
|
+
index: 0,
|
|
480
666
|
});
|
|
481
667
|
}
|
|
482
|
-
const assistantMessage = { role: "assistant" };
|
|
668
|
+
const assistantMessage = { role: "assistant", prefix: false };
|
|
483
669
|
if (contentParts.length > 0)
|
|
484
670
|
assistantMessage.content = contentParts;
|
|
485
671
|
if (toolCalls.length > 0)
|
|
@@ -532,15 +718,6 @@ function buildToolResultText(text, hasImages, supportsImages, isError) {
|
|
|
532
718
|
}
|
|
533
719
|
return isError ? "[tool error] (no tool output)" : "(no tool output)";
|
|
534
720
|
}
|
|
535
|
-
function usesReasoningEffort(model) {
|
|
536
|
-
return model.id === "mistral-small-2603" || model.id === "mistral-small-latest" || model.id === "mistral-medium-3.5";
|
|
537
|
-
}
|
|
538
|
-
function usesPromptModeReasoning(model) {
|
|
539
|
-
return model.reasoning && !usesReasoningEffort(model);
|
|
540
|
-
}
|
|
541
|
-
function mapReasoningEffort(model, level) {
|
|
542
|
-
return (model.thinkingLevelMap?.[level] ?? "high");
|
|
543
|
-
}
|
|
544
721
|
function mapToolChoice(choice) {
|
|
545
722
|
if (!choice)
|
|
546
723
|
return undefined;
|