@bastani/pi-ai 0.9.20-alpha.8 → 0.9.20
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/CHANGELOG.md +68 -0
- package/README.md +172 -24
- package/dist/api/anthropic-messages.d.ts.map +1 -1
- package/dist/api/anthropic-messages.js +9 -3
- package/dist/api/anthropic-messages.js.map +1 -1
- package/dist/api/azure-openai-responses.d.ts.map +1 -1
- package/dist/api/azure-openai-responses.js +4 -1
- 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 +5 -3
- package/dist/api/bedrock-converse-stream.js.map +1 -1
- 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 +8 -3
- package/dist/api/constrained-sampling.d.ts.map +1 -1
- package/dist/api/constrained-sampling.js +29 -11
- 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 +1 -0
- package/dist/api/google-generative-ai.js.map +1 -1
- package/dist/api/google-vertex.d.ts.map +1 -1
- package/dist/api/google-vertex.js +1 -0
- package/dist/api/google-vertex.js.map +1 -1
- package/dist/api/mistral-conversations.d.ts.map +1 -1
- package/dist/api/mistral-conversations.js +3 -2
- 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 +20 -4
- package/dist/api/openai-codex-responses.js.map +1 -1
- package/dist/api/openai-completions.d.ts.map +1 -1
- package/dist/api/openai-completions.js +1 -0
- package/dist/api/openai-completions.js.map +1 -1
- package/dist/api/openai-responses-shared.d.ts +2 -1
- package/dist/api/openai-responses-shared.d.ts.map +1 -1
- package/dist/api/openai-responses-shared.js +1 -0
- 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 +1 -0
- 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.map +1 -1
- package/dist/api/pi-messages.js +1 -0
- package/dist/api/pi-messages.js.map +1 -1
- package/dist/api/simple-options.d.ts.map +1 -1
- package/dist/api/simple-options.js +1 -0
- 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 +170 -0
- package/dist/api/system-one-shared.js.map +1 -0
- 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/resolve.d.ts +2 -8
- package/dist/auth/resolve.d.ts.map +1 -1
- package/dist/auth/resolve.js +3 -19
- package/dist/auth/resolve.js.map +1 -1
- package/dist/env-api-keys.d.ts.map +1 -1
- package/dist/env-api-keys.js +1 -0
- 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 +0 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +0 -1
- 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 +3 -2
- package/dist/models-store.d.ts.map +1 -1
- package/dist/models-store.js.map +1 -1
- package/dist/models.d.ts +95 -28
- package/dist/models.d.ts.map +1 -1
- package/dist/models.generated.d.ts +131 -41
- package/dist/models.generated.d.ts.map +1 -1
- package/dist/models.generated.js +131 -41
- package/dist/models.generated.js.map +1 -1
- package/dist/models.js +155 -28
- 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 +25 -21
- package/dist/providers/all.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.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.models.d.ts +4 -2
- package/dist/providers/baseten.models.d.ts.map +1 -1
- package/dist/providers/baseten.models.js +4 -2
- package/dist/providers/baseten.models.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.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-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 -1
- 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 -1
- 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 -1
- package/dist/providers/data/qwen-token-plan.json +1 -1
- package/dist/providers/data/radius.json +1 -1
- 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/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.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.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.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.models.d.ts +4 -2
- package/dist/providers/meta.models.d.ts.map +1 -1
- package/dist/providers/meta.models.js +4 -2
- package/dist/providers/meta.models.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.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.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.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.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.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.map +1 -1
- package/dist/providers/openrouter.js +11 -2
- 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.models.d.ts +4 -2
- package/dist/providers/qwen-token-plan-individual.models.d.ts.map +1 -1
- package/dist/providers/qwen-token-plan-individual.models.js +4 -2
- package/dist/providers/qwen-token-plan-individual.models.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.models.d.ts +4 -2
- package/dist/providers/radius.models.d.ts.map +1 -1
- package/dist/providers/radius.models.js +4 -2
- package/dist/providers/radius.models.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 +5 -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.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.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 +109 -26
- package/dist/types.d.ts.map +1 -1
- package/dist/types.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/package.json +1 -2
- package/dist/image-models.generated.d.ts +0 -830
- package/dist/image-models.generated.d.ts.map +0 -1
- package/dist/image-models.generated.js +0 -832
- 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 -143
- 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/models.js
CHANGED
|
@@ -4,8 +4,19 @@ import { InMemoryCredentialStore } from "./auth/credential-store.js";
|
|
|
4
4
|
import { ModelsError, resolveProviderAuth } from "./auth/resolve.js";
|
|
5
5
|
import { InMemoryModelsStore } from "./models-store.js";
|
|
6
6
|
import { operationSignal, raceWithAbortSignal } from "./utils/abort.js";
|
|
7
|
+
import { assertChatModel, assertClassifierModel, assertImageModel, classifierErrorResult, getModelType, imageErrorResult, isModelType, } from "./utils/model-operations.js";
|
|
7
8
|
import { normalizeContext } from "./utils/transcript.js";
|
|
8
9
|
export { ModelsError, REQUEST_AUTH_PREPARATION_TIMEOUT_MS, requestAuthTimeoutMessage, } from "./auth/resolve.js";
|
|
10
|
+
export { assertChatModel, classifierErrorResult, getModelType, imageErrorResult, 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
|
+
}
|
|
9
20
|
function mergeHeaders(base, override) {
|
|
10
21
|
if (!base && !override)
|
|
11
22
|
return undefined;
|
|
@@ -76,9 +87,38 @@ class ModelsImpl {
|
|
|
76
87
|
}
|
|
77
88
|
return models;
|
|
78
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
|
+
}
|
|
79
116
|
getModel(provider, id) {
|
|
80
117
|
return this.getModels(provider).find((model) => model.id === id);
|
|
81
118
|
}
|
|
119
|
+
getModelOfType(type, provider, id) {
|
|
120
|
+
return this.getModelsOfType(type, provider).find((model) => model.id === id);
|
|
121
|
+
}
|
|
82
122
|
supersedeProviderRefresh(providerId) {
|
|
83
123
|
const generation = (this.refreshGenerations.get(providerId) ?? 0) + 1;
|
|
84
124
|
this.refreshGenerations.set(providerId, generation);
|
|
@@ -124,7 +164,7 @@ class ModelsImpl {
|
|
|
124
164
|
const stored = await this.modelsStore.read(provider.id, { signal });
|
|
125
165
|
await provider.refreshModels({
|
|
126
166
|
credential,
|
|
127
|
-
stored: stored ? structuredClone(stored) : undefined,
|
|
167
|
+
stored: stored ? withKnownModelTypes(structuredClone(stored)) : undefined,
|
|
128
168
|
publish: (publication) => this.publishProviderModels(provider.id, generation, signal, publication),
|
|
129
169
|
allowNetwork,
|
|
130
170
|
force: allowNetwork ? force : undefined,
|
|
@@ -253,26 +293,47 @@ class ModelsImpl {
|
|
|
253
293
|
})();
|
|
254
294
|
return raceWithAbortSignal(check, signal);
|
|
255
295
|
}
|
|
296
|
+
async getAuthenticatedProviders(providerId, signal) {
|
|
297
|
+
signal.throwIfAborted();
|
|
298
|
+
const providers = providerId
|
|
299
|
+
? [this.providers.get(providerId)].filter((entry) => entry !== undefined)
|
|
300
|
+
: this.getProviders();
|
|
301
|
+
const checks = await Promise.all(providers.map(async (provider) => {
|
|
302
|
+
const credential = await this.readCredential(provider.id, signal);
|
|
303
|
+
return { provider, credential, auth: await this.checkProviderAuth(provider, credential, signal) };
|
|
304
|
+
}));
|
|
305
|
+
return checks.filter((entry) => entry.auth !== undefined);
|
|
306
|
+
}
|
|
256
307
|
getAvailable(providerId, options) {
|
|
257
308
|
const signal = operationSignal(options?.signal);
|
|
258
309
|
const available = (async () => {
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
? [this.providers.get(providerId)].filter((entry) => entry !== undefined)
|
|
262
|
-
: this.getProviders();
|
|
263
|
-
const checks = await Promise.all(providers.map(async (provider) => {
|
|
264
|
-
const credential = await this.readCredential(provider.id, signal);
|
|
265
|
-
return { provider, credential, auth: await this.checkProviderAuth(provider, credential, signal) };
|
|
266
|
-
}));
|
|
267
|
-
return checks.flatMap(({ provider, credential, auth }) => {
|
|
268
|
-
if (!auth)
|
|
269
|
-
return [];
|
|
310
|
+
const providers = await this.getAuthenticatedProviders(providerId, signal);
|
|
311
|
+
return providers.flatMap(({ provider, credential }) => {
|
|
270
312
|
const models = provider.getModels();
|
|
271
313
|
return provider.filterModels?.(models, credential) ?? models;
|
|
272
314
|
});
|
|
273
315
|
})();
|
|
274
316
|
return raceWithAbortSignal(available, signal);
|
|
275
317
|
}
|
|
318
|
+
async getAvailableOfType(type, providerId, options) {
|
|
319
|
+
return (await this.getAllAvailable(providerId, options)).filter((model) => isModelType(model, type));
|
|
320
|
+
}
|
|
321
|
+
getAllAvailable(providerId, options) {
|
|
322
|
+
const signal = operationSignal(options?.signal);
|
|
323
|
+
const available = (async () => {
|
|
324
|
+
const providers = await this.getAuthenticatedProviders(providerId, signal);
|
|
325
|
+
return providers.flatMap(({ provider, credential }) => {
|
|
326
|
+
const models = provider.getAllModels?.() ?? provider.getModels();
|
|
327
|
+
if (provider.filterAllModels)
|
|
328
|
+
return provider.filterAllModels(models, credential);
|
|
329
|
+
if (!provider.filterModels)
|
|
330
|
+
return models;
|
|
331
|
+
const availableChatIds = new Set(provider.filterModels(provider.getModels(), credential).map((model) => model.id));
|
|
332
|
+
return models.filter((model) => !isModelType(model, "chat") || availableChatIds.has(model.id));
|
|
333
|
+
});
|
|
334
|
+
})();
|
|
335
|
+
return raceWithAbortSignal(available, signal);
|
|
336
|
+
}
|
|
276
337
|
async getAuth(providerOrModel, overrides) {
|
|
277
338
|
const signal = operationSignal(overrides?.signal);
|
|
278
339
|
const providerId = typeof providerOrModel === "string" ? providerOrModel : providerOrModel.provider;
|
|
@@ -356,6 +417,10 @@ class ModelsImpl {
|
|
|
356
417
|
}
|
|
357
418
|
return provider;
|
|
358
419
|
}
|
|
420
|
+
requireChatProvider(model) {
|
|
421
|
+
assertChatModel(model);
|
|
422
|
+
return this.requireProvider(model);
|
|
423
|
+
}
|
|
359
424
|
async applyAuth(model, options) {
|
|
360
425
|
this.requireProvider(model);
|
|
361
426
|
const resolution = await this.getAuth(model, {
|
|
@@ -381,7 +446,7 @@ class ModelsImpl {
|
|
|
381
446
|
stream(model, context, options) {
|
|
382
447
|
const transcript = normalizeContext(context);
|
|
383
448
|
return lazyStream(model, async () => {
|
|
384
|
-
const provider = this.
|
|
449
|
+
const provider = this.requireChatProvider(model);
|
|
385
450
|
const { requestModel, requestOptions } = await this.applyAuth(model, options);
|
|
386
451
|
return provider.stream(requestModel, transcript, requestOptions);
|
|
387
452
|
});
|
|
@@ -392,7 +457,7 @@ class ModelsImpl {
|
|
|
392
457
|
streamSimple(model, context, options) {
|
|
393
458
|
const transcript = normalizeContext(context);
|
|
394
459
|
return lazyStream(model, async () => {
|
|
395
|
-
const provider = this.
|
|
460
|
+
const provider = this.requireChatProvider(model);
|
|
396
461
|
const { requestModel, requestOptions } = await this.applyAuth(model, options);
|
|
397
462
|
return provider.streamSimple(requestModel, transcript, requestOptions);
|
|
398
463
|
});
|
|
@@ -402,7 +467,7 @@ class ModelsImpl {
|
|
|
402
467
|
}
|
|
403
468
|
async fetchDeferred(model, handle, options) {
|
|
404
469
|
return lazyStream(model, async () => {
|
|
405
|
-
const provider = this.
|
|
470
|
+
const provider = this.requireChatProvider(model);
|
|
406
471
|
if (!provider.fetchDeferred) {
|
|
407
472
|
throw new ModelsError("provider", `Provider ${model.provider} does not support deferred responses`);
|
|
408
473
|
}
|
|
@@ -411,31 +476,73 @@ class ModelsImpl {
|
|
|
411
476
|
}).result();
|
|
412
477
|
}
|
|
413
478
|
async cancelDeferred(model, handle, options) {
|
|
414
|
-
const provider = this.
|
|
479
|
+
const provider = this.requireChatProvider(model);
|
|
415
480
|
if (!provider.cancelDeferred) {
|
|
416
481
|
throw new ModelsError("provider", `Provider ${model.provider} does not support deferred responses`);
|
|
417
482
|
}
|
|
418
483
|
const { requestModel, requestOptions } = await this.applyAuth(model, options);
|
|
419
484
|
await provider.cancelDeferred(requestModel, handle, requestOptions);
|
|
420
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
|
+
}
|
|
421
514
|
}
|
|
422
515
|
export function createModels(options) {
|
|
423
516
|
return new ModelsImpl(options);
|
|
424
517
|
}
|
|
425
518
|
/**
|
|
426
519
|
* Builds a provider from parts. Built-in provider factories and models.json
|
|
427
|
-
* custom providers both go through this. A single `api` streams all
|
|
428
|
-
* an `api` map dispatches on `model.api`, and a model whose api has
|
|
429
|
-
* 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.
|
|
430
525
|
*/
|
|
431
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
|
+
}
|
|
432
539
|
const baselineModels = input.models;
|
|
433
540
|
let dynamicModels = [];
|
|
434
541
|
const fetchModels = input.fetchModels;
|
|
435
542
|
const currentModels = () => {
|
|
436
543
|
const merged = [...baselineModels];
|
|
437
544
|
for (const model of dynamicModels) {
|
|
438
|
-
const index = merged.findIndex((entry) => entry.id === model.id);
|
|
545
|
+
const index = merged.findIndex((entry) => getModelType(entry) === getModelType(model) && entry.id === model.id);
|
|
439
546
|
if (index >= 0)
|
|
440
547
|
merged[index] = model;
|
|
441
548
|
else
|
|
@@ -443,8 +550,6 @@ export function createProvider(input) {
|
|
|
443
550
|
}
|
|
444
551
|
return merged;
|
|
445
552
|
};
|
|
446
|
-
const single = typeof input.api.stream === "function" ? input.api : undefined;
|
|
447
|
-
const byApi = single ? undefined : input.api;
|
|
448
553
|
const apiFor = (model) => single ?? byApi?.[model.api];
|
|
449
554
|
const dispatch = (model, run) => {
|
|
450
555
|
const streams = apiFor(model);
|
|
@@ -461,7 +566,8 @@ export function createProvider(input) {
|
|
|
461
566
|
baseUrl: input.baseUrl,
|
|
462
567
|
headers: input.headers,
|
|
463
568
|
auth: input.auth,
|
|
464
|
-
getModels: currentModels,
|
|
569
|
+
getModels: () => currentModels().filter((model) => isModelType(model, "chat")),
|
|
570
|
+
getAllModels: currentModels,
|
|
465
571
|
refreshModels: fetchModels
|
|
466
572
|
? async (context) => {
|
|
467
573
|
if (context.stored) {
|
|
@@ -478,9 +584,10 @@ export function createProvider(input) {
|
|
|
478
584
|
}
|
|
479
585
|
if (!context.allowNetwork || context.signal.aborted)
|
|
480
586
|
return;
|
|
481
|
-
const
|
|
587
|
+
const fetched = await fetchModels(context);
|
|
482
588
|
if (context.signal.aborted)
|
|
483
589
|
return;
|
|
590
|
+
const refreshed = fetched.filter(hasKnownModelType);
|
|
484
591
|
await context.publish({
|
|
485
592
|
persist: { models: refreshed, checkedAt: Date.now() },
|
|
486
593
|
update: () => {
|
|
@@ -490,10 +597,10 @@ export function createProvider(input) {
|
|
|
490
597
|
}
|
|
491
598
|
: undefined,
|
|
492
599
|
filterModels: input.filterModels,
|
|
600
|
+
filterAllModels: input.filterAllModels,
|
|
493
601
|
stream: (model, context, options) => dispatch(model, (streams) => streams.stream(model, context, options)),
|
|
494
602
|
streamSimple: (model, context, options) => dispatch(model, (streams) => streams.streamSimple(model, context, options)),
|
|
495
603
|
};
|
|
496
|
-
const streams = single ? [single] : Object.values(byApi ?? {}).filter((entry) => entry !== undefined);
|
|
497
604
|
if (streams.some((entry) => entry.fetchDeferred !== undefined)) {
|
|
498
605
|
provider.fetchDeferred = (model, handle, options) => lazyStream(model, async () => {
|
|
499
606
|
const implementation = apiFor(model);
|
|
@@ -512,6 +619,24 @@ export function createProvider(input) {
|
|
|
512
619
|
await implementation.cancelDeferred(model, handle, options);
|
|
513
620
|
};
|
|
514
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
|
+
}
|
|
515
640
|
return provider;
|
|
516
641
|
}
|
|
517
642
|
/**
|
|
@@ -523,9 +648,11 @@ export function createProvider(input) {
|
|
|
523
648
|
* // model: Model<"anthropic-messages">, stream options fully typed
|
|
524
649
|
* }
|
|
525
650
|
* ```
|
|
651
|
+
*
|
|
652
|
+
* Non-chat models never match, even when their api id equals `api`.
|
|
526
653
|
*/
|
|
527
654
|
export function hasApi(model, api) {
|
|
528
|
-
return model.api === api;
|
|
655
|
+
return isModelType(model, "chat") && model.api === api;
|
|
529
656
|
}
|
|
530
657
|
export function calculateCost(model, usage) {
|
|
531
658
|
const inputTokens = usage.input + usage.cacheRead + usage.cacheWrite;
|
|
@@ -580,12 +707,12 @@ export function clampThinkingLevel(model, level) {
|
|
|
580
707
|
return availableLevels[0] ?? "off";
|
|
581
708
|
}
|
|
582
709
|
/**
|
|
583
|
-
* Check if two models are equal by comparing
|
|
710
|
+
* Check if two models are equal by comparing their type, id, and provider.
|
|
584
711
|
* Returns false if either model is null or undefined.
|
|
585
712
|
*/
|
|
586
713
|
export function modelsAreEqual(a, b) {
|
|
587
714
|
if (!a || !b)
|
|
588
715
|
return false;
|
|
589
|
-
return a.id === b.id && a.provider === b.provider;
|
|
716
|
+
return getModelType(a) === getModelType(b) && a.id === b.id && a.provider === b.provider;
|
|
590
717
|
}
|
|
591
718
|
//# sourceMappingURL=models.js.map
|