@fractaal/pi-ai 0.85.3 → 0.86.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +322 -46
- package/dist/api/anthropic-messages.d.ts.map +1 -1
- package/dist/api/anthropic-messages.js +403 -140
- package/dist/api/anthropic-messages.js.map +1 -1
- package/dist/api/anthropic-messages.lazy.d.ts.map +1 -1
- package/dist/api/azure-openai-config.d.ts +15 -0
- package/dist/api/azure-openai-config.d.ts.map +1 -0
- package/dist/api/azure-openai-config.js +76 -0
- package/dist/api/azure-openai-config.js.map +1 -0
- package/dist/api/azure-openai-responses.d.ts +5 -6
- package/dist/api/azure-openai-responses.d.ts.map +1 -1
- package/dist/api/azure-openai-responses.js +42 -86
- package/dist/api/azure-openai-responses.js.map +1 -1
- package/dist/api/azure-openai-responses.lazy.d.ts.map +1 -1
- package/dist/api/bedrock-converse-stream.d.ts.map +1 -1
- package/dist/api/bedrock-converse-stream.js +233 -24
- package/dist/api/bedrock-converse-stream.js.map +1 -1
- package/dist/api/bedrock-converse-stream.lazy.d.ts.map +1 -1
- package/dist/api/bedrock-converse-stream.lazy.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 +48 -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/github-copilot-headers.d.ts.map +1 -1
- package/dist/api/github-copilot-headers.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-generative-ai.lazy.d.ts.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/google-vertex.lazy.d.ts.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/mistral-conversations.lazy.d.ts.map +1 -1
- package/dist/api/openai-codex-compaction-history.d.ts +2 -2
- package/dist/api/openai-codex-compaction-history.d.ts.map +1 -1
- package/dist/api/openai-codex-compaction-history.js +1 -2
- package/dist/api/openai-codex-compaction-history.js.map +1 -1
- package/dist/api/openai-codex-responses.d.ts +1 -1
- package/dist/api/openai-codex-responses.d.ts.map +1 -1
- package/dist/api/openai-codex-responses.js +107 -60
- package/dist/api/openai-codex-responses.js.map +1 -1
- package/dist/api/openai-codex-responses.lazy.d.ts.map +1 -1
- package/dist/api/openai-codex-responses.lazy.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 +250 -134
- package/dist/api/openai-completions.js.map +1 -1
- package/dist/api/openai-completions.lazy.d.ts.map +1 -1
- package/dist/api/openai-prompt-cache.d.ts.map +1 -1
- package/dist/api/openai-prompt-cache.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 +114 -62
- 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 +55 -23
- package/dist/api/openai-responses.js.map +1 -1
- package/dist/api/openai-responses.lazy.d.ts.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 +10 -3
- package/dist/api/pi-messages.js.map +1 -1
- package/dist/api/pi-messages.lazy.d.ts.map +1 -1
- package/dist/api/simple-options.d.ts +10 -3
- package/dist/api/simple-options.d.ts.map +1 -1
- package/dist/api/simple-options.js +31 -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/context.d.ts.map +1 -1
- package/dist/auth/context.js.map +1 -1
- 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 +22 -11
- 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 +78 -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/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 +263 -0
- package/dist/auth/oauth/openai-chatgpt.js.map +1 -0
- package/dist/auth/oauth/openai-codex-errors.d.ts.map +1 -1
- package/dist/auth/oauth/openai-codex-errors.js.map +1 -1
- 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 +23 -152
- 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 +25 -144
- package/dist/auth/oauth/openrouter.js.map +1 -1
- package/dist/auth/oauth/pkce.d.ts.map +1 -1
- package/dist/auth/oauth/pkce.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 +26 -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 +3 -2
- package/dist/auth/oauth/xai.js.map +1 -1
- package/dist/auth/resolve.d.ts +19 -9
- package/dist/auth/resolve.d.ts.map +1 -1
- package/dist/auth/resolve.js +72 -53
- 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/bedrock-provider.d.ts.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.d.ts.map +1 -1
- package/dist/cli.js +4 -1
- package/dist/cli.js.map +1 -1
- package/dist/compat/extension-oauth-types.d.ts.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 +10 -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/legacy-api-aliases.d.ts.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 +14 -14
- package/dist/models-store.d.ts.map +1 -1
- package/dist/models-store.js +6 -3
- 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 +136 -38
- package/dist/models.generated.d.ts.map +1 -1
- package/dist/models.generated.js +136 -38
- package/dist/models.generated.js.map +1 -1
- package/dist/models.js +390 -104
- package/dist/models.js.map +1 -1
- package/dist/oauth.d.ts.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 +33 -23
- 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.d.ts.map +1 -1
- package/dist/providers/ant-ling.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.d.ts +3 -0
- package/dist/providers/azure.d.ts.map +1 -0
- package/dist/providers/azure.js +46 -0
- package/dist/providers/azure.js.map +1 -0
- package/dist/providers/azure.models.d.ts +6 -0
- package/dist/providers/azure.models.d.ts.map +1 -0
- package/dist/providers/azure.models.js +8 -0
- package/dist/providers/azure.models.js.map +1 -0
- 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.d.ts.map +1 -1
- package/dist/providers/cerebras.js.map +1 -1
- 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.json +1 -0
- 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.d.ts.map +1 -1
- package/dist/providers/deepseek.js.map +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.d.ts.map +1 -1
- package/dist/providers/fireworks.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.d.ts.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.d.ts.map +1 -1
- package/dist/providers/google.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.d.ts.map +1 -1
- package/dist/providers/groq.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.d.ts.map +1 -1
- package/dist/providers/huggingface.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.d.ts.map +1 -1
- package/dist/providers/minimax-cn.js.map +1 -1
- 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.d.ts.map +1 -1
- package/dist/providers/minimax.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.d.ts.map +1 -1
- package/dist/providers/mistral.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.d.ts.map +1 -1
- package/dist/providers/moonshotai-cn.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.d.ts.map +1 -1
- package/dist/providers/moonshotai.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.d.ts.map +1 -1
- package/dist/providers/nvidia.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-catalog.d.ts +19 -0
- package/dist/providers/openai-codex-catalog.d.ts.map +1 -0
- package/dist/providers/openai-codex-catalog.js +242 -0
- package/dist/providers/openai-codex-catalog.js.map +1 -0
- package/dist/providers/openai-codex.d.ts +3 -1
- package/dist/providers/openai-codex.d.ts.map +1 -1
- package/dist/providers/openai-codex.js +10 -3
- 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 +5 -4
- 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.d.ts.map +1 -1
- package/dist/providers/qwen-token-plan-cn.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.d.ts.map +1 -1
- package/dist/providers/qwen-token-plan.js.map +1 -1
- 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-config.d.ts.map +1 -1
- package/dist/providers/radius-config.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.d.ts.map +1 -1
- package/dist/providers/together.js.map +1 -1
- 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.d.ts.map +1 -1
- package/dist/providers/xiaomi-token-plan-ams.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.d.ts.map +1 -1
- package/dist/providers/xiaomi-token-plan-cn.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.d.ts.map +1 -1
- package/dist/providers/xiaomi-token-plan-sgp.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.d.ts.map +1 -1
- package/dist/providers/xiaomi.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.d.ts.map +1 -1
- package/dist/providers/zai-coding-cn.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.d.ts.map +1 -1
- package/dist/providers/zai.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/session-resources.d.ts.map +1 -1
- package/dist/session-resources.js.map +1 -1
- package/dist/types.d.ts +417 -126
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js.map +1 -1
- package/dist/utils/abort-signals.d.ts.map +1 -1
- package/dist/utils/abort-signals.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/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 +25 -7
- package/dist/utils/event-stream.js.map +1 -1
- package/dist/utils/hash.d.ts.map +1 -1
- package/dist/utils/hash.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/json-parse.d.ts.map +1 -1
- package/dist/utils/json-parse.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/{auth/oauth → utils}/oauth-page.js +1 -1
- 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/pi-user-agent.d.ts +2 -0
- package/dist/utils/pi-user-agent.d.ts.map +1 -0
- package/dist/utils/pi-user-agent.js +12 -0
- package/dist/utils/pi-user-agent.js.map +1 -0
- package/dist/utils/provider-env.d.ts.map +1 -1
- package/dist/utils/provider-env.js.map +1 -1
- package/dist/utils/provider-retry.d.ts.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 +23 -2
- package/dist/utils/retry.js.map +1 -1
- package/dist/utils/sanitize-unicode.d.ts.map +1 -1
- package/dist/utils/sanitize-unicode.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 +87 -0
- package/dist/utils/transcript.d.ts.map +1 -0
- package/dist/utils/transcript.js +207 -0
- package/dist/utils/transcript.js.map +1 -0
- package/dist/utils/typebox-helpers.d.ts.map +1 -1
- package/dist/utils/typebox-helpers.js.map +1 -1
- package/dist/utils/uuid.d.ts +2 -2
- package/dist/utils/uuid.d.ts.map +1 -1
- package/dist/utils/uuid.js +35 -39
- 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 +21 -15
- 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 -142
- package/dist/images-models.js.map +0 -1
- package/dist/providers/azure-openai-responses.d.ts +0 -3
- package/dist/providers/azure-openai-responses.d.ts.map +0 -1
- package/dist/providers/azure-openai-responses.js +0 -14
- package/dist/providers/azure-openai-responses.js.map +0 -1
- package/dist/providers/azure-openai-responses.models.d.ts +0 -4
- package/dist/providers/azure-openai-responses.models.d.ts.map +0 -1
- package/dist/providers/azure-openai-responses.models.js +0 -6
- package/dist/providers/azure-openai-responses.models.js.map +0 -1
- package/dist/providers/data/azure-openai-responses.json +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/models.js
CHANGED
|
@@ -1,9 +1,22 @@
|
|
|
1
1
|
import { lazyStream } from "./api/lazy.js";
|
|
2
2
|
import { defaultProviderAuthContext as defaultAuthContext } from "./auth/context.js";
|
|
3
3
|
import { InMemoryCredentialStore } from "./auth/credential-store.js";
|
|
4
|
-
import { ModelsError, resolveProviderAuth } from "./auth/resolve.js";
|
|
4
|
+
import { ModelsError, refreshStoredOAuthCredential, resolveProviderAuth, } from "./auth/resolve.js";
|
|
5
5
|
import { InMemoryModelsStore } from "./models-store.js";
|
|
6
|
+
import { operationSignal, raceWithAbortSignal } from "./utils/abort.js";
|
|
7
|
+
import { assertChatModel, assertClassifierModel, assertImageModel, classifierErrorResult, getModelType, imageErrorResult, isModelType, } from "./utils/model-operations.js";
|
|
8
|
+
import { normalizeContext } from "./utils/transcript.js";
|
|
6
9
|
export { ModelsError } from "./auth/resolve.js";
|
|
10
|
+
export { getModelType, isModelType } from "./utils/model-operations.js";
|
|
11
|
+
const KNOWN_MODEL_TYPES = { chat: true, image: true, classifier: true };
|
|
12
|
+
/** Models from stores and remote sources may have types that only newer versions know. */
|
|
13
|
+
function hasKnownModelType(model) {
|
|
14
|
+
return Object.hasOwn(KNOWN_MODEL_TYPES, getModelType(model));
|
|
15
|
+
}
|
|
16
|
+
/** Drops stored models whose type this version does not know. */
|
|
17
|
+
function withKnownModelTypes(entry) {
|
|
18
|
+
return { ...entry, models: entry.models.filter(hasKnownModelType) };
|
|
19
|
+
}
|
|
7
20
|
function mergeHeaders(base, override) {
|
|
8
21
|
if (!base && !override)
|
|
9
22
|
return undefined;
|
|
@@ -23,18 +36,26 @@ class ModelsImpl {
|
|
|
23
36
|
credentials;
|
|
24
37
|
modelsStore;
|
|
25
38
|
authContext;
|
|
39
|
+
refreshGenerations = new Map();
|
|
40
|
+
refreshControllers = new Map();
|
|
41
|
+
publicationChains = new Map();
|
|
26
42
|
constructor(options) {
|
|
27
43
|
this.credentials = options?.credentials ?? new InMemoryCredentialStore();
|
|
28
44
|
this.modelsStore = options?.modelsStore ?? new InMemoryModelsStore();
|
|
29
45
|
this.authContext = options?.authContext ?? defaultAuthContext();
|
|
30
46
|
}
|
|
31
47
|
setProvider(provider) {
|
|
48
|
+
this.supersedeProviderRefresh(provider.id);
|
|
32
49
|
this.providers.set(provider.id, provider);
|
|
33
50
|
}
|
|
34
51
|
deleteProvider(id) {
|
|
52
|
+
this.supersedeProviderRefresh(id);
|
|
35
53
|
this.providers.delete(id);
|
|
36
54
|
}
|
|
37
55
|
clearProviders() {
|
|
56
|
+
for (const id of new Set([...this.providers.keys(), ...this.refreshControllers.keys()])) {
|
|
57
|
+
this.supersedeProviderRefresh(id);
|
|
58
|
+
}
|
|
38
59
|
this.providers.clear();
|
|
39
60
|
}
|
|
40
61
|
getProviders() {
|
|
@@ -66,90 +87,177 @@ class ModelsImpl {
|
|
|
66
87
|
}
|
|
67
88
|
return models;
|
|
68
89
|
}
|
|
90
|
+
getAllModels(provider) {
|
|
91
|
+
if (provider !== undefined) {
|
|
92
|
+
const entry = this.providers.get(provider);
|
|
93
|
+
if (!entry)
|
|
94
|
+
return [];
|
|
95
|
+
try {
|
|
96
|
+
return entry.getAllModels?.() ?? entry.getModels();
|
|
97
|
+
}
|
|
98
|
+
catch {
|
|
99
|
+
return [];
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
const models = [];
|
|
103
|
+
for (const entry of this.providers.values()) {
|
|
104
|
+
try {
|
|
105
|
+
models.push(...(entry.getAllModels?.() ?? entry.getModels()));
|
|
106
|
+
}
|
|
107
|
+
catch {
|
|
108
|
+
// Best-effort: ill-behaved providers yield no models.
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
return models;
|
|
112
|
+
}
|
|
113
|
+
getModelsOfType(type, provider) {
|
|
114
|
+
return this.getAllModels(provider).filter((model) => isModelType(model, type));
|
|
115
|
+
}
|
|
69
116
|
getModel(provider, id) {
|
|
70
117
|
return this.getModels(provider).find((model) => model.id === id);
|
|
71
118
|
}
|
|
119
|
+
getModelOfType(type, provider, id) {
|
|
120
|
+
return this.getModelsOfType(type, provider).find((model) => model.id === id);
|
|
121
|
+
}
|
|
122
|
+
supersedeProviderRefresh(providerId) {
|
|
123
|
+
const generation = (this.refreshGenerations.get(providerId) ?? 0) + 1;
|
|
124
|
+
this.refreshGenerations.set(providerId, generation);
|
|
125
|
+
const previous = this.refreshControllers.get(providerId);
|
|
126
|
+
if (previous) {
|
|
127
|
+
this.refreshControllers.delete(providerId);
|
|
128
|
+
previous.abort();
|
|
129
|
+
}
|
|
130
|
+
return generation;
|
|
131
|
+
}
|
|
132
|
+
beginProviderRefresh(providerId) {
|
|
133
|
+
const generation = this.supersedeProviderRefresh(providerId);
|
|
134
|
+
const controller = new AbortController();
|
|
135
|
+
this.refreshControllers.set(providerId, controller);
|
|
136
|
+
return { generation, controller };
|
|
137
|
+
}
|
|
138
|
+
publishProviderModels(providerId, generation, signal, publication) {
|
|
139
|
+
const previous = this.publicationChains.get(providerId) ?? Promise.resolve();
|
|
140
|
+
const queued = (async () => {
|
|
141
|
+
await previous.catch(() => { });
|
|
142
|
+
if (signal.aborted || this.refreshGenerations.get(providerId) !== generation)
|
|
143
|
+
return false;
|
|
144
|
+
if (publication.persist === null) {
|
|
145
|
+
await this.modelsStore.delete(providerId, { signal });
|
|
146
|
+
}
|
|
147
|
+
else if (publication.persist !== undefined) {
|
|
148
|
+
await this.modelsStore.write(providerId, structuredClone(publication.persist), { signal });
|
|
149
|
+
}
|
|
150
|
+
if (signal.aborted || this.refreshGenerations.get(providerId) !== generation)
|
|
151
|
+
return false;
|
|
152
|
+
publication.update?.();
|
|
153
|
+
return true;
|
|
154
|
+
})();
|
|
155
|
+
const tail = queued.catch(() => { });
|
|
156
|
+
this.publicationChains.set(providerId, tail);
|
|
157
|
+
void tail.then(() => {
|
|
158
|
+
if (this.publicationChains.get(providerId) === tail)
|
|
159
|
+
this.publicationChains.delete(providerId);
|
|
160
|
+
});
|
|
161
|
+
return raceWithAbortSignal(queued, signal);
|
|
162
|
+
}
|
|
163
|
+
async runProviderRefreshPhase(provider, credential, allowNetwork, force, generation, signal) {
|
|
164
|
+
const stored = await this.modelsStore.read(provider.id, { signal });
|
|
165
|
+
await provider.refreshModels({
|
|
166
|
+
credential,
|
|
167
|
+
stored: stored ? withKnownModelTypes(structuredClone(stored)) : undefined,
|
|
168
|
+
publish: (publication) => this.publishProviderModels(provider.id, generation, signal, publication),
|
|
169
|
+
allowNetwork,
|
|
170
|
+
force: allowNetwork ? force : undefined,
|
|
171
|
+
signal,
|
|
172
|
+
});
|
|
173
|
+
}
|
|
72
174
|
async refresh(options = {}) {
|
|
73
175
|
const allowNetwork = options.allowNetwork ?? true;
|
|
176
|
+
const callerSignal = operationSignal(options.signal);
|
|
74
177
|
const errors = new Map();
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
178
|
+
if (callerSignal.aborted)
|
|
179
|
+
return { aborted: true, errors };
|
|
180
|
+
const selected = options.providers ? new Set(options.providers) : undefined;
|
|
181
|
+
const refreshable = Array.from(this.providers.values()).filter((provider) => provider.refreshModels !== undefined && (!selected || selected.has(provider.id)));
|
|
182
|
+
const refresh = Promise.all(refreshable.map(async (provider) => {
|
|
183
|
+
const { generation, controller } = this.beginProviderRefresh(provider.id);
|
|
184
|
+
const signal = AbortSignal.any([callerSignal, controller.signal]);
|
|
185
|
+
const operation = (async () => {
|
|
186
|
+
let storedCredential;
|
|
187
|
+
let credentialError;
|
|
188
|
+
try {
|
|
189
|
+
storedCredential = await this.readCredential(provider.id, signal);
|
|
190
|
+
}
|
|
191
|
+
catch (error) {
|
|
192
|
+
credentialError = error;
|
|
193
|
+
}
|
|
194
|
+
// Restore cached provider state before auth resolution or network access.
|
|
195
|
+
await this.runProviderRefreshPhase(provider, storedCredential, false, undefined, generation, signal);
|
|
196
|
+
if (credentialError !== undefined)
|
|
197
|
+
throw credentialError;
|
|
198
|
+
if (!allowNetwork || signal.aborted)
|
|
199
|
+
return;
|
|
200
|
+
const credential = await this.resolveRefreshCredential(provider, storedCredential, signal);
|
|
88
201
|
if (!credential)
|
|
89
202
|
return;
|
|
90
|
-
await provider.
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
force: options.force,
|
|
95
|
-
signal: options.signal,
|
|
96
|
-
});
|
|
203
|
+
await this.runProviderRefreshPhase(provider, credential, true, options.force, generation, signal);
|
|
204
|
+
})();
|
|
205
|
+
try {
|
|
206
|
+
await raceWithAbortSignal(operation, signal);
|
|
97
207
|
}
|
|
98
208
|
catch (error) {
|
|
99
|
-
if (!
|
|
209
|
+
if (!signal.aborted) {
|
|
100
210
|
errors.set(provider.id, error instanceof Error
|
|
101
211
|
? error
|
|
102
212
|
: new ModelsError("model_source", `Model refresh failed for ${provider.id}`, { cause: error }));
|
|
103
213
|
}
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
allowNetwork: false,
|
|
109
|
-
signal: options.signal,
|
|
110
|
-
});
|
|
111
|
-
}
|
|
112
|
-
catch {
|
|
113
|
-
// Preserve the original auth/network error; cache restoration is best-effort here.
|
|
214
|
+
}
|
|
215
|
+
finally {
|
|
216
|
+
if (this.refreshControllers.get(provider.id) === controller) {
|
|
217
|
+
this.refreshControllers.delete(provider.id);
|
|
114
218
|
}
|
|
115
219
|
}
|
|
116
220
|
}));
|
|
117
|
-
|
|
221
|
+
try {
|
|
222
|
+
await raceWithAbortSignal(refresh, callerSignal);
|
|
223
|
+
}
|
|
224
|
+
catch (error) {
|
|
225
|
+
if (!callerSignal.aborted)
|
|
226
|
+
throw error;
|
|
227
|
+
}
|
|
228
|
+
return { aborted: callerSignal.aborted, errors: new Map(errors) };
|
|
118
229
|
}
|
|
119
|
-
async resolveRefreshCredential(provider, stored,
|
|
230
|
+
async resolveRefreshCredential(provider, stored, signal) {
|
|
120
231
|
if (stored?.type === "oauth") {
|
|
121
232
|
const oauth = provider.auth.oauth;
|
|
122
233
|
if (!oauth)
|
|
123
234
|
return undefined;
|
|
124
|
-
if (
|
|
235
|
+
if (Date.now() < stored.expires)
|
|
125
236
|
return stored;
|
|
126
|
-
if (signal
|
|
237
|
+
if (signal.aborted)
|
|
127
238
|
return undefined;
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
return oauth.refresh(current, signal);
|
|
132
|
-
});
|
|
133
|
-
return post?.type === "oauth" ? post : undefined;
|
|
239
|
+
// A refresh that has started survives cancellation or a superseding model refresh, so a
|
|
240
|
+
// rotated refresh token is always persisted. A newer refresh then sees the fresh credential.
|
|
241
|
+
return refreshStoredOAuthCredential(this.credentials, provider.id, oauth, (current) => Date.now() >= current.expires, signal);
|
|
134
242
|
}
|
|
135
243
|
const apiKey = provider.auth.apiKey;
|
|
136
244
|
if (!apiKey)
|
|
137
245
|
return undefined;
|
|
138
246
|
const credential = stored?.type === "api_key" ? stored : undefined;
|
|
139
|
-
const result = await apiKey.resolve({ ctx: this.authContext, credential });
|
|
247
|
+
const result = await apiKey.resolve({ ctx: this.authContext, credential, signal });
|
|
140
248
|
if (!result)
|
|
141
249
|
return undefined;
|
|
142
250
|
return { type: "api_key", key: result.auth.apiKey, env: result.env };
|
|
143
251
|
}
|
|
144
|
-
async readCredential(providerId) {
|
|
252
|
+
async readCredential(providerId, signal) {
|
|
145
253
|
try {
|
|
146
|
-
return await this.credentials.read(providerId);
|
|
254
|
+
return await this.credentials.read(providerId, { signal });
|
|
147
255
|
}
|
|
148
256
|
catch (error) {
|
|
149
257
|
throw new ModelsError("auth", `Credential store read failed for ${providerId}`, { cause: error });
|
|
150
258
|
}
|
|
151
259
|
}
|
|
152
|
-
async checkProviderAuth(provider, credential) {
|
|
260
|
+
async checkProviderAuth(provider, credential, signal) {
|
|
153
261
|
if (credential?.type === "oauth") {
|
|
154
262
|
return provider.auth.oauth ? { source: "OAuth", type: "oauth" } : undefined;
|
|
155
263
|
}
|
|
@@ -161,42 +269,75 @@ class ModelsImpl {
|
|
|
161
269
|
return await apiKey.check({
|
|
162
270
|
ctx: this.authContext,
|
|
163
271
|
credential: credential?.type === "api_key" ? credential : undefined,
|
|
272
|
+
signal,
|
|
164
273
|
});
|
|
165
274
|
}
|
|
166
275
|
catch (error) {
|
|
167
276
|
throw new ModelsError("auth", `API key auth check failed for provider ${provider.id}`, { cause: error });
|
|
168
277
|
}
|
|
169
278
|
}
|
|
170
|
-
const resolution = await resolveProviderAuth(provider, this.credentials, this.authContext);
|
|
279
|
+
const resolution = await resolveProviderAuth(provider, this.credentials, this.authContext, { signal });
|
|
171
280
|
return resolution ? { source: resolution.source, type: "api_key" } : undefined;
|
|
172
281
|
}
|
|
173
|
-
|
|
174
|
-
const
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
282
|
+
checkAuth(providerId, options) {
|
|
283
|
+
const signal = operationSignal(options?.signal);
|
|
284
|
+
const check = (async () => {
|
|
285
|
+
signal.throwIfAborted();
|
|
286
|
+
const provider = this.providers.get(providerId);
|
|
287
|
+
if (!provider)
|
|
288
|
+
return undefined;
|
|
289
|
+
return this.checkProviderAuth(provider, await this.readCredential(providerId, signal), signal);
|
|
290
|
+
})();
|
|
291
|
+
return raceWithAbortSignal(check, signal);
|
|
178
292
|
}
|
|
179
|
-
async
|
|
293
|
+
async getAuthenticatedProviders(providerId, signal) {
|
|
294
|
+
signal.throwIfAborted();
|
|
180
295
|
const providers = providerId
|
|
181
296
|
? [this.providers.get(providerId)].filter((entry) => entry !== undefined)
|
|
182
297
|
: this.getProviders();
|
|
183
298
|
const checks = await Promise.all(providers.map(async (provider) => {
|
|
184
|
-
const credential = await this.readCredential(provider.id);
|
|
185
|
-
return { provider, credential, auth: await this.checkProviderAuth(provider, credential) };
|
|
299
|
+
const credential = await this.readCredential(provider.id, signal);
|
|
300
|
+
return { provider, credential, auth: await this.checkProviderAuth(provider, credential, signal) };
|
|
186
301
|
}));
|
|
187
|
-
return checks.
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
302
|
+
return checks.filter((entry) => entry.auth !== undefined);
|
|
303
|
+
}
|
|
304
|
+
getAvailable(providerId, options) {
|
|
305
|
+
const signal = operationSignal(options?.signal);
|
|
306
|
+
const available = (async () => {
|
|
307
|
+
const providers = await this.getAuthenticatedProviders(providerId, signal);
|
|
308
|
+
return providers.flatMap(({ provider, credential }) => {
|
|
309
|
+
const models = provider.getModels();
|
|
310
|
+
return provider.filterModels?.(models, credential) ?? models;
|
|
311
|
+
});
|
|
312
|
+
})();
|
|
313
|
+
return raceWithAbortSignal(available, signal);
|
|
314
|
+
}
|
|
315
|
+
async getAvailableOfType(type, providerId, options) {
|
|
316
|
+
return (await this.getAllAvailable(providerId, options)).filter((model) => isModelType(model, type));
|
|
317
|
+
}
|
|
318
|
+
getAllAvailable(providerId, options) {
|
|
319
|
+
const signal = operationSignal(options?.signal);
|
|
320
|
+
const available = (async () => {
|
|
321
|
+
const providers = await this.getAuthenticatedProviders(providerId, signal);
|
|
322
|
+
return providers.flatMap(({ provider, credential }) => {
|
|
323
|
+
const models = provider.getAllModels?.() ?? provider.getModels();
|
|
324
|
+
if (provider.filterAllModels)
|
|
325
|
+
return provider.filterAllModels(models, credential);
|
|
326
|
+
if (!provider.filterModels)
|
|
327
|
+
return models;
|
|
328
|
+
const availableChatIds = new Set(provider.filterModels(provider.getModels(), credential).map((model) => model.id));
|
|
329
|
+
return models.filter((model) => !isModelType(model, "chat") || availableChatIds.has(model.id));
|
|
330
|
+
});
|
|
331
|
+
})();
|
|
332
|
+
return raceWithAbortSignal(available, signal);
|
|
193
333
|
}
|
|
194
334
|
async getAuth(providerOrModel, overrides) {
|
|
335
|
+
const signal = operationSignal(overrides?.signal);
|
|
195
336
|
const providerId = typeof providerOrModel === "string" ? providerOrModel : providerOrModel.provider;
|
|
196
337
|
const provider = this.providers.get(providerId);
|
|
197
338
|
if (!provider)
|
|
198
339
|
return undefined;
|
|
199
|
-
const result = await resolveProviderAuth(provider, this.credentials, this.authContext, overrides);
|
|
340
|
+
const result = await resolveProviderAuth(provider, this.credentials, this.authContext, { ...overrides, signal });
|
|
200
341
|
if (!result || typeof providerOrModel === "string" || !providerOrModel.headers)
|
|
201
342
|
return result;
|
|
202
343
|
return {
|
|
@@ -207,7 +348,9 @@ class ModelsImpl {
|
|
|
207
348
|
},
|
|
208
349
|
};
|
|
209
350
|
}
|
|
210
|
-
async login(providerId, type, interaction) {
|
|
351
|
+
async login(providerId, type, interaction, options) {
|
|
352
|
+
const signal = operationSignal(interaction.signal);
|
|
353
|
+
signal.throwIfAborted();
|
|
211
354
|
const provider = this.providers.get(providerId);
|
|
212
355
|
if (!provider)
|
|
213
356
|
throw new ModelsError("provider", `Unknown provider: ${providerId}`);
|
|
@@ -215,20 +358,52 @@ class ModelsImpl {
|
|
|
215
358
|
if (!method?.login) {
|
|
216
359
|
throw new ModelsError("auth", `${provider.name} does not support ${type} login`);
|
|
217
360
|
}
|
|
218
|
-
const
|
|
361
|
+
const loginOperation = method.login({ ...interaction, signal }, options);
|
|
362
|
+
const credential = await raceWithAbortSignal(loginOperation, signal);
|
|
363
|
+
let mutationStarted = false;
|
|
364
|
+
let markMutationStarted;
|
|
365
|
+
const started = new Promise((resolve) => {
|
|
366
|
+
markMutationStarted = resolve;
|
|
367
|
+
});
|
|
368
|
+
const mutation = this.credentials.modify(providerId, async () => {
|
|
369
|
+
mutationStarted = true;
|
|
370
|
+
markMutationStarted?.();
|
|
371
|
+
return credential;
|
|
372
|
+
}, { signal });
|
|
373
|
+
void mutation.catch(() => { });
|
|
219
374
|
try {
|
|
220
|
-
await
|
|
375
|
+
await new Promise((resolve, reject) => {
|
|
376
|
+
const onAbort = () => {
|
|
377
|
+
if (!mutationStarted)
|
|
378
|
+
reject(signal.reason);
|
|
379
|
+
};
|
|
380
|
+
signal.addEventListener("abort", onAbort, { once: true });
|
|
381
|
+
void Promise.race([started, mutation]).then(() => {
|
|
382
|
+
signal.removeEventListener("abort", onAbort);
|
|
383
|
+
resolve();
|
|
384
|
+
}, (error) => {
|
|
385
|
+
signal.removeEventListener("abort", onAbort);
|
|
386
|
+
reject(error);
|
|
387
|
+
});
|
|
388
|
+
if (signal.aborted)
|
|
389
|
+
onAbort();
|
|
390
|
+
});
|
|
391
|
+
await mutation;
|
|
221
392
|
}
|
|
222
393
|
catch (error) {
|
|
394
|
+
signal.throwIfAborted();
|
|
223
395
|
throw new ModelsError("auth", `Credential store modify failed for ${providerId}`, { cause: error });
|
|
224
396
|
}
|
|
225
397
|
return credential;
|
|
226
398
|
}
|
|
227
|
-
async logout(providerId) {
|
|
399
|
+
async logout(providerId, options) {
|
|
400
|
+
const signal = operationSignal(options?.signal);
|
|
401
|
+
signal.throwIfAborted();
|
|
228
402
|
try {
|
|
229
|
-
await this.credentials.delete(providerId);
|
|
403
|
+
await this.credentials.delete(providerId, { signal });
|
|
230
404
|
}
|
|
231
405
|
catch (error) {
|
|
406
|
+
signal.throwIfAborted();
|
|
232
407
|
throw new ModelsError("auth", `Credential store delete failed for ${providerId}`, { cause: error });
|
|
233
408
|
}
|
|
234
409
|
}
|
|
@@ -239,11 +414,16 @@ class ModelsImpl {
|
|
|
239
414
|
}
|
|
240
415
|
return provider;
|
|
241
416
|
}
|
|
417
|
+
requireChatProvider(model) {
|
|
418
|
+
assertChatModel(model);
|
|
419
|
+
return this.requireProvider(model);
|
|
420
|
+
}
|
|
242
421
|
async applyAuth(model, options) {
|
|
243
422
|
this.requireProvider(model);
|
|
244
423
|
const resolution = await this.getAuth(model, {
|
|
245
424
|
apiKey: options?.apiKey,
|
|
246
425
|
env: options?.env,
|
|
426
|
+
signal: options?.signal,
|
|
247
427
|
});
|
|
248
428
|
if (!resolution) {
|
|
249
429
|
throw new ModelsError("auth", `Provider is not configured: ${model.provider}`);
|
|
@@ -261,44 +441,108 @@ class ModelsImpl {
|
|
|
261
441
|
return { requestModel, requestOptions };
|
|
262
442
|
}
|
|
263
443
|
stream(model, context, options) {
|
|
444
|
+
const transcript = normalizeContext(context);
|
|
264
445
|
return lazyStream(model, async () => {
|
|
265
|
-
const provider = this.
|
|
446
|
+
const provider = this.requireChatProvider(model);
|
|
266
447
|
const { requestModel, requestOptions } = await this.applyAuth(model, options);
|
|
267
|
-
return provider.stream(requestModel,
|
|
448
|
+
return provider.stream(requestModel, transcript, requestOptions);
|
|
268
449
|
});
|
|
269
450
|
}
|
|
270
451
|
async complete(model, context, options) {
|
|
271
452
|
return this.stream(model, context, options).result();
|
|
272
453
|
}
|
|
273
454
|
streamSimple(model, context, options) {
|
|
455
|
+
const transcript = normalizeContext(context);
|
|
274
456
|
return lazyStream(model, async () => {
|
|
275
|
-
const provider = this.
|
|
457
|
+
const provider = this.requireChatProvider(model);
|
|
276
458
|
const { requestModel, requestOptions } = await this.applyAuth(model, options);
|
|
277
|
-
return provider.streamSimple(requestModel,
|
|
459
|
+
return provider.streamSimple(requestModel, transcript, requestOptions);
|
|
278
460
|
});
|
|
279
461
|
}
|
|
280
462
|
async completeSimple(model, context, options) {
|
|
281
463
|
return this.streamSimple(model, context, options).result();
|
|
282
464
|
}
|
|
465
|
+
streamDeferred(model, handle, options) {
|
|
466
|
+
return lazyStream(model, async () => {
|
|
467
|
+
const provider = this.requireChatProvider(model);
|
|
468
|
+
if (!provider.fetchDeferred) {
|
|
469
|
+
throw new ModelsError("provider", `Provider ${model.provider} does not support deferred responses`);
|
|
470
|
+
}
|
|
471
|
+
const { requestModel, requestOptions } = await this.applyAuth(model, options);
|
|
472
|
+
return provider.fetchDeferred(requestModel, handle, requestOptions);
|
|
473
|
+
});
|
|
474
|
+
}
|
|
475
|
+
async fetchDeferred(model, handle, options) {
|
|
476
|
+
return this.streamDeferred(model, handle, options).result();
|
|
477
|
+
}
|
|
478
|
+
async cancelDeferred(model, handle, options) {
|
|
479
|
+
const provider = this.requireChatProvider(model);
|
|
480
|
+
if (!provider.cancelDeferred) {
|
|
481
|
+
throw new ModelsError("provider", `Provider ${model.provider} does not support deferred responses`);
|
|
482
|
+
}
|
|
483
|
+
const { requestModel, requestOptions } = await this.applyAuth(model, options);
|
|
484
|
+
await provider.cancelDeferred(requestModel, handle, requestOptions);
|
|
485
|
+
}
|
|
486
|
+
async generateImages(model, context, options) {
|
|
487
|
+
try {
|
|
488
|
+
assertImageModel(model);
|
|
489
|
+
const provider = this.requireProvider(model);
|
|
490
|
+
if (!provider.generateImages) {
|
|
491
|
+
throw new ModelsError("provider", `Provider ${model.provider} does not support image generation`);
|
|
492
|
+
}
|
|
493
|
+
const { requestModel, requestOptions } = await this.applyAuth(model, options);
|
|
494
|
+
return await provider.generateImages(requestModel, context, requestOptions);
|
|
495
|
+
}
|
|
496
|
+
catch (error) {
|
|
497
|
+
return imageErrorResult(model, error, options?.signal?.aborted);
|
|
498
|
+
}
|
|
499
|
+
}
|
|
500
|
+
async classify(model, context, options) {
|
|
501
|
+
try {
|
|
502
|
+
assertClassifierModel(model);
|
|
503
|
+
const provider = this.requireProvider(model);
|
|
504
|
+
if (!provider.classify) {
|
|
505
|
+
throw new ModelsError("provider", `Provider ${model.provider} does not support classification`);
|
|
506
|
+
}
|
|
507
|
+
const { requestModel, requestOptions } = await this.applyAuth(model, options);
|
|
508
|
+
return await provider.classify(requestModel, context, requestOptions);
|
|
509
|
+
}
|
|
510
|
+
catch (error) {
|
|
511
|
+
return classifierErrorResult(model, error, options?.signal?.aborted);
|
|
512
|
+
}
|
|
513
|
+
}
|
|
283
514
|
}
|
|
284
515
|
export function createModels(options) {
|
|
285
516
|
return new ModelsImpl(options);
|
|
286
517
|
}
|
|
287
518
|
/**
|
|
288
519
|
* Builds a provider from parts. Built-in provider factories and models.json
|
|
289
|
-
* custom providers both go through this. A single `api` streams all
|
|
290
|
-
* an `api` map dispatches on `model.api`, and a model whose api has
|
|
291
|
-
* produces a stream error.
|
|
520
|
+
* custom providers both go through this. A single `api` streams all chat
|
|
521
|
+
* models; an `api` map dispatches on `model.api`, and a model whose api has
|
|
522
|
+
* no entry produces a stream error. One-shot operation maps dispatch on
|
|
523
|
+
* `model.api` the same way. At least one concrete implementation across
|
|
524
|
+
* `api`/`images`/`classifiers` is required; empty maps are rejected.
|
|
292
525
|
*/
|
|
293
526
|
export function createProvider(input) {
|
|
527
|
+
const single = input.api && typeof input.api.stream === "function"
|
|
528
|
+
? input.api
|
|
529
|
+
: undefined;
|
|
530
|
+
const byApi = single || !input.api ? undefined : input.api;
|
|
531
|
+
const images = input.images;
|
|
532
|
+
const classifiers = input.classifiers;
|
|
533
|
+
const streams = single ? [single] : Object.values(byApi ?? {}).filter((entry) => entry !== undefined);
|
|
534
|
+
const imageImplementations = Object.values(images ?? {}).filter((entry) => entry !== undefined);
|
|
535
|
+
const classifierImplementations = Object.values(classifiers ?? {}).filter((entry) => entry !== undefined);
|
|
536
|
+
if (streams.length === 0 && imageImplementations.length === 0 && classifierImplementations.length === 0) {
|
|
537
|
+
throw new Error(`Provider ${input.id}: at least one of "api", "images", or "classifiers" is required.`);
|
|
538
|
+
}
|
|
294
539
|
const baselineModels = input.models;
|
|
295
540
|
let dynamicModels = [];
|
|
296
|
-
let inflightRefresh;
|
|
297
541
|
const fetchModels = input.fetchModels;
|
|
298
542
|
const currentModels = () => {
|
|
299
543
|
const merged = [...baselineModels];
|
|
300
544
|
for (const model of dynamicModels) {
|
|
301
|
-
const index = merged.findIndex((entry) => entry.id === model.id);
|
|
545
|
+
const index = merged.findIndex((entry) => getModelType(entry) === getModelType(model) && entry.id === model.id);
|
|
302
546
|
if (index >= 0)
|
|
303
547
|
merged[index] = model;
|
|
304
548
|
else
|
|
@@ -306,8 +550,6 @@ export function createProvider(input) {
|
|
|
306
550
|
}
|
|
307
551
|
return merged;
|
|
308
552
|
};
|
|
309
|
-
const single = typeof input.api.stream === "function" ? input.api : undefined;
|
|
310
|
-
const byApi = single ? undefined : input.api;
|
|
311
553
|
const apiFor = (model) => single ?? byApi?.[model.api];
|
|
312
554
|
const dispatch = (model, run) => {
|
|
313
555
|
const streams = apiFor(model);
|
|
@@ -318,42 +560,84 @@ export function createProvider(input) {
|
|
|
318
560
|
}
|
|
319
561
|
return run(streams);
|
|
320
562
|
};
|
|
321
|
-
|
|
563
|
+
const provider = {
|
|
322
564
|
id: input.id,
|
|
323
565
|
name: input.name ?? input.id,
|
|
324
566
|
baseUrl: input.baseUrl,
|
|
325
567
|
headers: input.headers,
|
|
326
568
|
auth: input.auth,
|
|
327
|
-
getModels: currentModels,
|
|
569
|
+
getModels: () => currentModels().filter((model) => isModelType(model, "chat")),
|
|
570
|
+
getAllModels: currentModels,
|
|
328
571
|
refreshModels: fetchModels
|
|
329
|
-
? (context) => {
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
}
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
const refreshed = await fetchModels(context);
|
|
341
|
-
if (context.signal?.aborted)
|
|
342
|
-
return;
|
|
343
|
-
dynamicModels = refreshed;
|
|
344
|
-
await context.store.write({ models: refreshed, checkedAt: Date.now() });
|
|
345
|
-
}
|
|
346
|
-
finally {
|
|
347
|
-
inflightRefresh = undefined;
|
|
572
|
+
? async (context) => {
|
|
573
|
+
if (context.stored) {
|
|
574
|
+
const restored = context.stored.models
|
|
575
|
+
.filter((model) => model.provider === input.id)
|
|
576
|
+
.map((model) => model);
|
|
577
|
+
if (!(await context.publish({
|
|
578
|
+
update: () => {
|
|
579
|
+
dynamicModels = restored;
|
|
580
|
+
},
|
|
581
|
+
}))) {
|
|
582
|
+
return;
|
|
348
583
|
}
|
|
349
|
-
}
|
|
350
|
-
|
|
584
|
+
}
|
|
585
|
+
if (!context.allowNetwork || context.signal.aborted)
|
|
586
|
+
return;
|
|
587
|
+
const fetched = await fetchModels(context);
|
|
588
|
+
if (context.signal.aborted)
|
|
589
|
+
return;
|
|
590
|
+
const refreshed = fetched.filter(hasKnownModelType);
|
|
591
|
+
await context.publish({
|
|
592
|
+
persist: { models: refreshed, checkedAt: Date.now() },
|
|
593
|
+
update: () => {
|
|
594
|
+
dynamicModels = refreshed;
|
|
595
|
+
},
|
|
596
|
+
});
|
|
351
597
|
}
|
|
352
598
|
: undefined,
|
|
353
599
|
filterModels: input.filterModels,
|
|
600
|
+
filterAllModels: input.filterAllModels,
|
|
354
601
|
stream: (model, context, options) => dispatch(model, (streams) => streams.stream(model, context, options)),
|
|
355
602
|
streamSimple: (model, context, options) => dispatch(model, (streams) => streams.streamSimple(model, context, options)),
|
|
356
603
|
};
|
|
604
|
+
if (streams.some((entry) => entry.fetchDeferred !== undefined)) {
|
|
605
|
+
provider.fetchDeferred = (model, handle, options) => lazyStream(model, async () => {
|
|
606
|
+
const implementation = apiFor(model);
|
|
607
|
+
if (!implementation?.fetchDeferred) {
|
|
608
|
+
throw new ModelsError("provider", `Provider ${input.id} does not support deferred responses for "${model.api}"`);
|
|
609
|
+
}
|
|
610
|
+
return implementation.fetchDeferred(model, handle, options);
|
|
611
|
+
});
|
|
612
|
+
}
|
|
613
|
+
if (streams.some((entry) => entry.cancelDeferred !== undefined)) {
|
|
614
|
+
provider.cancelDeferred = async (model, handle, options) => {
|
|
615
|
+
const implementation = apiFor(model);
|
|
616
|
+
if (!implementation?.cancelDeferred) {
|
|
617
|
+
throw new ModelsError("provider", `Provider ${input.id} cannot cancel deferred responses for "${model.api}"`);
|
|
618
|
+
}
|
|
619
|
+
await implementation.cancelDeferred(model, handle, options);
|
|
620
|
+
};
|
|
621
|
+
}
|
|
622
|
+
if (images && imageImplementations.length > 0) {
|
|
623
|
+
provider.generateImages = async (model, context, options) => {
|
|
624
|
+
const implementation = images[model.api];
|
|
625
|
+
if (!implementation) {
|
|
626
|
+
return imageErrorResult(model, new ModelsError("provider", `Provider ${input.id} has no image generation implementation for "${model.api}"`));
|
|
627
|
+
}
|
|
628
|
+
return implementation.generateImages(model, context, options);
|
|
629
|
+
};
|
|
630
|
+
}
|
|
631
|
+
if (classifiers && classifierImplementations.length > 0) {
|
|
632
|
+
provider.classify = async (model, context, options) => {
|
|
633
|
+
const implementation = classifiers[model.api];
|
|
634
|
+
if (!implementation) {
|
|
635
|
+
return classifierErrorResult(model, new ModelsError("provider", `Provider ${input.id} has no classifier implementation for "${model.api}"`));
|
|
636
|
+
}
|
|
637
|
+
return implementation.classify(model, context, options);
|
|
638
|
+
};
|
|
639
|
+
}
|
|
640
|
+
return provider;
|
|
357
641
|
}
|
|
358
642
|
/**
|
|
359
643
|
* Runtime-checked narrowing for dynamically looked-up models:
|
|
@@ -364,9 +648,11 @@ export function createProvider(input) {
|
|
|
364
648
|
* // model: Model<"anthropic-messages">, stream options fully typed
|
|
365
649
|
* }
|
|
366
650
|
* ```
|
|
651
|
+
*
|
|
652
|
+
* Non-chat models never match, even when their api id equals `api`.
|
|
367
653
|
*/
|
|
368
654
|
export function hasApi(model, api) {
|
|
369
|
-
return model.api === api;
|
|
655
|
+
return isModelType(model, "chat") && model.api === api;
|
|
370
656
|
}
|
|
371
657
|
export function calculateCost(model, usage) {
|
|
372
658
|
const inputTokens = usage.input + usage.cacheRead + usage.cacheWrite;
|
|
@@ -421,12 +707,12 @@ export function clampThinkingLevel(model, level) {
|
|
|
421
707
|
return availableLevels[0] ?? "off";
|
|
422
708
|
}
|
|
423
709
|
/**
|
|
424
|
-
* Check if two models are equal by comparing
|
|
710
|
+
* Check if two models are equal by comparing their type, id, and provider.
|
|
425
711
|
* Returns false if either model is null or undefined.
|
|
426
712
|
*/
|
|
427
713
|
export function modelsAreEqual(a, b) {
|
|
428
714
|
if (!a || !b)
|
|
429
715
|
return false;
|
|
430
|
-
return a.id === b.id && a.provider === b.provider;
|
|
716
|
+
return getModelType(a) === getModelType(b) && a.id === b.id && a.provider === b.provider;
|
|
431
717
|
}
|
|
432
718
|
//# sourceMappingURL=models.js.map
|