@earendil-works/pi-ai 0.82.1 → 0.84.0
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 +18 -8
- package/dist/api/anthropic-messages.d.ts.map +1 -1
- package/dist/api/anthropic-messages.js +14 -7
- 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 +10 -2
- 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 +64 -4
- package/dist/api/bedrock-converse-stream.js.map +1 -1
- package/dist/api/google-generative-ai.d.ts.map +1 -1
- package/dist/api/google-generative-ai.js +14 -4
- package/dist/api/google-generative-ai.js.map +1 -1
- package/dist/api/google-shared.d.ts +11 -1
- package/dist/api/google-shared.d.ts.map +1 -1
- package/dist/api/google-shared.js +44 -7
- package/dist/api/google-shared.js.map +1 -1
- package/dist/api/google-vertex.d.ts.map +1 -1
- package/dist/api/google-vertex.js +14 -4
- package/dist/api/google-vertex.js.map +1 -1
- package/dist/api/lazy.d.ts +5 -1
- package/dist/api/lazy.d.ts.map +1 -1
- package/dist/api/lazy.js +19 -7
- package/dist/api/lazy.js.map +1 -1
- package/dist/api/mistral-conversations.d.ts.map +1 -1
- package/dist/api/mistral-conversations.js +19 -10
- 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 +51 -21
- package/dist/api/openai-codex-responses.js.map +1 -1
- package/dist/api/openai-completions.d.ts +5 -2
- package/dist/api/openai-completions.d.ts.map +1 -1
- package/dist/api/openai-completions.js +77 -16
- package/dist/api/openai-completions.js.map +1 -1
- package/dist/api/openai-responses-shared.d.ts.map +1 -1
- package/dist/api/openai-responses-shared.js +31 -8
- 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 +12 -4
- package/dist/api/openai-responses.js.map +1 -1
- package/dist/api/openrouter-images.d.ts.map +1 -1
- package/dist/api/openrouter-images.js +3 -2
- package/dist/api/openrouter-images.js.map +1 -1
- package/dist/api/pi-messages.d.ts.map +1 -1
- package/dist/api/pi-messages.js +2 -2
- package/dist/api/pi-messages.js.map +1 -1
- package/dist/api/simple-options.d.ts +2 -0
- package/dist/api/simple-options.d.ts.map +1 -1
- package/dist/api/simple-options.js +9 -2
- package/dist/api/simple-options.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 +7 -2
- package/dist/auth/helpers.js.map +1 -1
- package/dist/auth/oauth/anthropic.d.ts.map +1 -1
- package/dist/auth/oauth/anthropic.js +14 -8
- package/dist/auth/oauth/anthropic.js.map +1 -1
- package/dist/auth/oauth/device-code.d.ts +1 -1
- package/dist/auth/oauth/device-code.d.ts.map +1 -1
- package/dist/auth/oauth/device-code.js +4 -4
- 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 +43 -30
- 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 +17 -5
- package/dist/auth/oauth/kimi-coding.js.map +1 -1
- package/dist/auth/oauth/openai-codex.d.ts.map +1 -1
- package/dist/auth/oauth/openai-codex.js +12 -5
- package/dist/auth/oauth/openai-codex.js.map +1 -1
- package/dist/auth/oauth/openrouter.d.ts +3 -1
- package/dist/auth/oauth/openrouter.d.ts.map +1 -1
- package/dist/auth/oauth/openrouter.js +91 -36
- package/dist/auth/oauth/openrouter.js.map +1 -1
- package/dist/auth/oauth/radius.d.ts.map +1 -1
- package/dist/auth/oauth/radius.js +8 -7
- 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 +3 -0
- package/dist/auth/resolve.d.ts.map +1 -1
- package/dist/auth/resolve.js +38 -19
- package/dist/auth/resolve.js.map +1 -1
- package/dist/auth/types.d.ts +20 -8
- package/dist/auth/types.d.ts.map +1 -1
- package/dist/auth/types.js.map +1 -1
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +1 -0
- package/dist/cli.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.generated.d.ts +30 -0
- package/dist/image-models.generated.d.ts.map +1 -1
- package/dist/image-models.generated.js +32 -2
- package/dist/image-models.generated.js.map +1 -1
- package/dist/images-models.d.ts.map +1 -1
- package/dist/images-models.js +1 -0
- package/dist/images-models.js.map +1 -1
- package/dist/models-store.d.ts +9 -12
- 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 +40 -18
- package/dist/models.d.ts.map +1 -1
- package/dist/models.generated.d.ts +2 -0
- package/dist/models.generated.d.ts.map +1 -1
- package/dist/models.generated.js +2 -0
- package/dist/models.generated.js.map +1 -1
- package/dist/models.js +245 -89
- package/dist/models.js.map +1 -1
- package/dist/providers/all.d.ts.map +1 -1
- package/dist/providers/all.js +2 -0
- 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/anthropic.d.ts.map +1 -1
- package/dist/providers/anthropic.js +15 -6
- package/dist/providers/anthropic.js.map +1 -1
- package/dist/providers/baseten.d.ts +3 -0
- package/dist/providers/baseten.d.ts.map +1 -0
- package/dist/providers/baseten.js +15 -0
- package/dist/providers/baseten.js.map +1 -0
- package/dist/providers/baseten.models.d.ts +4 -0
- package/dist/providers/baseten.models.d.ts.map +1 -0
- package/dist/providers/baseten.models.js +6 -0
- package/dist/providers/baseten.models.js.map +1 -0
- 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/data/.manifest.json +1 -1
- package/dist/providers/data/amazon-bedrock.json +1 -1
- package/dist/providers/data/anthropic.json +1 -1
- package/dist/providers/data/azure-openai-responses.json +1 -1
- package/dist/providers/data/baseten.json +1 -0
- package/dist/providers/data/cloudflare-ai-gateway.json +1 -1
- package/dist/providers/data/fireworks.json +1 -1
- package/dist/providers/data/github-copilot.json +1 -1
- package/dist/providers/data/groq.json +1 -1
- package/dist/providers/data/huggingface.json +1 -1
- package/dist/providers/data/mistral.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.json +1 -1
- package/dist/providers/data/together.json +1 -1
- package/dist/providers/data/vercel-ai-gateway.json +1 -1
- package/dist/providers/data/zai-coding-cn.json +1 -1
- package/dist/providers/data/zai.json +1 -1
- package/dist/providers/faux.d.ts +18 -13
- package/dist/providers/faux.d.ts.map +1 -1
- package/dist/providers/faux.js +99 -6
- package/dist/providers/faux.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/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/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/openai-codex.d.ts.map +1 -1
- package/dist/providers/openai-codex.js +5 -1
- package/dist/providers/openai-codex.js.map +1 -1
- package/dist/providers/opencode-go.d.ts.map +1 -1
- package/dist/providers/opencode-go.js +1 -1
- package/dist/providers/opencode-go.js.map +1 -1
- package/dist/providers/radius.d.ts.map +1 -1
- package/dist/providers/radius.js +36 -26
- package/dist/providers/radius.js.map +1 -1
- package/dist/providers/xai.d.ts.map +1 -1
- package/dist/providers/xai.js +1 -0
- package/dist/providers/xai.js.map +1 -1
- package/dist/types.d.ts +102 -76
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js.map +1 -1
- package/dist/utils/abort.d.ts +8 -0
- package/dist/utils/abort.d.ts.map +1 -0
- package/dist/utils/abort.js +49 -0
- package/dist/utils/abort.js.map +1 -0
- package/dist/utils/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/overflow.d.ts +10 -1
- package/dist/utils/overflow.d.ts.map +1 -1
- package/dist/utils/overflow.js +12 -1
- package/dist/utils/overflow.js.map +1 -1
- package/dist/utils/validation.d.ts.map +1 -1
- package/dist/utils/validation.js +6 -0
- package/dist/utils/validation.js.map +1 -1
- package/package.json +3 -2
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"models.generated.js","sourceRoot":"","sources":["../src/models.generated.ts"],"names":[],"mappings":"AAAA,4DAA4D;AAC5D,iEAAiE;AAEjE,OAAO,EAAE,qBAAqB,EAAE,MAAM,sCAAsC,CAAC;AAC7E,OAAO,EAAE,eAAe,EAAE,MAAM,gCAAgC,CAAC;AACjE,OAAO,EAAE,gBAAgB,EAAE,MAAM,iCAAiC,CAAC;AACnE,OAAO,EAAE,6BAA6B,EAAE,MAAM,8CAA8C,CAAC;AAC7F,OAAO,EAAE,eAAe,EAAE,MAAM,gCAAgC,CAAC;AACjE,OAAO,EAAE,4BAA4B,EAAE,MAAM,6CAA6C,CAAC;AAC3F,OAAO,EAAE,4BAA4B,EAAE,MAAM,6CAA6C,CAAC;AAC3F,OAAO,EAAE,eAAe,EAAE,MAAM,gCAAgC,CAAC;AACjE,OAAO,EAAE,gBAAgB,EAAE,MAAM,iCAAiC,CAAC;AACnE,OAAO,EAAE,qBAAqB,EAAE,MAAM,sCAAsC,CAAC;AAC7E,OAAO,EAAE,aAAa,EAAE,MAAM,8BAA8B,CAAC;AAC7D,OAAO,EAAE,oBAAoB,EAAE,MAAM,qCAAqC,CAAC;AAC3E,OAAO,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAC;AACzD,OAAO,EAAE,kBAAkB,EAAE,MAAM,mCAAmC,CAAC;AACvE,OAAO,EAAE,kBAAkB,EAAE,MAAM,mCAAmC,CAAC;AACvE,OAAO,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAC;AAC/D,OAAO,EAAE,iBAAiB,EAAE,MAAM,kCAAkC,CAAC;AACrE,OAAO,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAC;AAC/D,OAAO,EAAE,iBAAiB,EAAE,MAAM,kCAAkC,CAAC;AACrE,OAAO,EAAE,oBAAoB,EAAE,MAAM,qCAAqC,CAAC;AAC3E,OAAO,EAAE,aAAa,EAAE,MAAM,8BAA8B,CAAC;AAC7D,OAAO,EAAE,aAAa,EAAE,MAAM,8BAA8B,CAAC;AAC7D,OAAO,EAAE,mBAAmB,EAAE,MAAM,oCAAoC,CAAC;AACzE,OAAO,EAAE,eAAe,EAAE,MAAM,gCAAgC,CAAC;AACjE,OAAO,EAAE,kBAAkB,EAAE,MAAM,mCAAmC,CAAC;AACvE,OAAO,EAAE,iBAAiB,EAAE,MAAM,kCAAkC,CAAC;AACrE,OAAO,EAAE,sBAAsB,EAAE,MAAM,uCAAuC,CAAC;AAC/E,OAAO,EAAE,yBAAyB,EAAE,MAAM,0CAA0C,CAAC;AACrF,OAAO,EAAE,eAAe,EAAE,MAAM,gCAAgC,CAAC;AACjE,OAAO,EAAE,wBAAwB,EAAE,MAAM,yCAAyC,CAAC;AACnF,OAAO,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAC;AACvD,OAAO,EAAE,aAAa,EAAE,MAAM,8BAA8B,CAAC;AAC7D,OAAO,EAAE,4BAA4B,EAAE,MAAM,6CAA6C,CAAC;AAC3F,OAAO,EAAE,2BAA2B,EAAE,MAAM,4CAA4C,CAAC;AACzF,OAAO,EAAE,4BAA4B,EAAE,MAAM,6CAA6C,CAAC;AAC3F,OAAO,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAC;AACvD,OAAO,EAAE,oBAAoB,EAAE,MAAM,qCAAqC,CAAC;AAE3E,MAAM,CAAC,MAAM,MAAM,
|
|
1
|
+
{"version":3,"file":"models.generated.js","sourceRoot":"","sources":["../src/models.generated.ts"],"names":[],"mappings":"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","sourcesContent":["// This file is auto-generated by scripts/generate-models.ts\n// Do not edit manually - run 'npm run generate-models' to update\n\nimport { AMAZON_BEDROCK_MODELS } from \"./providers/amazon-bedrock.models.ts\";\nimport { ANT_LING_MODELS } from \"./providers/ant-ling.models.ts\";\nimport { ANTHROPIC_MODELS } from \"./providers/anthropic.models.ts\";\nimport { AZURE_OPENAI_RESPONSES_MODELS } from \"./providers/azure-openai-responses.models.ts\";\nimport { BASETEN_MODELS } from \"./providers/baseten.models.ts\";\nimport { CEREBRAS_MODELS } from \"./providers/cerebras.models.ts\";\nimport { CLOUDFLARE_AI_GATEWAY_MODELS } from \"./providers/cloudflare-ai-gateway.models.ts\";\nimport { CLOUDFLARE_WORKERS_AI_MODELS } from \"./providers/cloudflare-workers-ai.models.ts\";\nimport { DEEPSEEK_MODELS } from \"./providers/deepseek.models.ts\";\nimport { FIREWORKS_MODELS } from \"./providers/fireworks.models.ts\";\nimport { GITHUB_COPILOT_MODELS } from \"./providers/github-copilot.models.ts\";\nimport { GOOGLE_MODELS } from \"./providers/google.models.ts\";\nimport { GOOGLE_VERTEX_MODELS } from \"./providers/google-vertex.models.ts\";\nimport { GROQ_MODELS } from \"./providers/groq.models.ts\";\nimport { HUGGINGFACE_MODELS } from \"./providers/huggingface.models.ts\";\nimport { KIMI_CODING_MODELS } from \"./providers/kimi-coding.models.ts\";\nimport { MINIMAX_MODELS } from \"./providers/minimax.models.ts\";\nimport { MINIMAX_CN_MODELS } from \"./providers/minimax-cn.models.ts\";\nimport { MISTRAL_MODELS } from \"./providers/mistral.models.ts\";\nimport { MOONSHOTAI_MODELS } from \"./providers/moonshotai.models.ts\";\nimport { MOONSHOTAI_CN_MODELS } from \"./providers/moonshotai-cn.models.ts\";\nimport { NVIDIA_MODELS } from \"./providers/nvidia.models.ts\";\nimport { OPENAI_MODELS } from \"./providers/openai.models.ts\";\nimport { OPENAI_CODEX_MODELS } from \"./providers/openai-codex.models.ts\";\nimport { OPENCODE_MODELS } from \"./providers/opencode.models.ts\";\nimport { OPENCODE_GO_MODELS } from \"./providers/opencode-go.models.ts\";\nimport { OPENROUTER_MODELS } from \"./providers/openrouter.models.ts\";\nimport { QWEN_TOKEN_PLAN_MODELS } from \"./providers/qwen-token-plan.models.ts\";\nimport { QWEN_TOKEN_PLAN_CN_MODELS } from \"./providers/qwen-token-plan-cn.models.ts\";\nimport { TOGETHER_MODELS } from \"./providers/together.models.ts\";\nimport { VERCEL_AI_GATEWAY_MODELS } from \"./providers/vercel-ai-gateway.models.ts\";\nimport { XAI_MODELS } from \"./providers/xai.models.ts\";\nimport { XIAOMI_MODELS } from \"./providers/xiaomi.models.ts\";\nimport { XIAOMI_TOKEN_PLAN_AMS_MODELS } from \"./providers/xiaomi-token-plan-ams.models.ts\";\nimport { XIAOMI_TOKEN_PLAN_CN_MODELS } from \"./providers/xiaomi-token-plan-cn.models.ts\";\nimport { XIAOMI_TOKEN_PLAN_SGP_MODELS } from \"./providers/xiaomi-token-plan-sgp.models.ts\";\nimport { ZAI_MODELS } from \"./providers/zai.models.ts\";\nimport { ZAI_CODING_CN_MODELS } from \"./providers/zai-coding-cn.models.ts\";\n\nexport const MODELS: {\n\treadonly \"amazon-bedrock\": typeof AMAZON_BEDROCK_MODELS;\n\treadonly \"ant-ling\": typeof ANT_LING_MODELS;\n\treadonly \"anthropic\": typeof ANTHROPIC_MODELS;\n\treadonly \"azure-openai-responses\": typeof AZURE_OPENAI_RESPONSES_MODELS;\n\treadonly \"baseten\": typeof BASETEN_MODELS;\n\treadonly \"cerebras\": typeof CEREBRAS_MODELS;\n\treadonly \"cloudflare-ai-gateway\": typeof CLOUDFLARE_AI_GATEWAY_MODELS;\n\treadonly \"cloudflare-workers-ai\": typeof CLOUDFLARE_WORKERS_AI_MODELS;\n\treadonly \"deepseek\": typeof DEEPSEEK_MODELS;\n\treadonly \"fireworks\": typeof FIREWORKS_MODELS;\n\treadonly \"github-copilot\": typeof GITHUB_COPILOT_MODELS;\n\treadonly \"google\": typeof GOOGLE_MODELS;\n\treadonly \"google-vertex\": typeof GOOGLE_VERTEX_MODELS;\n\treadonly \"groq\": typeof GROQ_MODELS;\n\treadonly \"huggingface\": typeof HUGGINGFACE_MODELS;\n\treadonly \"kimi-coding\": typeof KIMI_CODING_MODELS;\n\treadonly \"minimax\": typeof MINIMAX_MODELS;\n\treadonly \"minimax-cn\": typeof MINIMAX_CN_MODELS;\n\treadonly \"mistral\": typeof MISTRAL_MODELS;\n\treadonly \"moonshotai\": typeof MOONSHOTAI_MODELS;\n\treadonly \"moonshotai-cn\": typeof MOONSHOTAI_CN_MODELS;\n\treadonly \"nvidia\": typeof NVIDIA_MODELS;\n\treadonly \"openai\": typeof OPENAI_MODELS;\n\treadonly \"openai-codex\": typeof OPENAI_CODEX_MODELS;\n\treadonly \"opencode\": typeof OPENCODE_MODELS;\n\treadonly \"opencode-go\": typeof OPENCODE_GO_MODELS;\n\treadonly \"openrouter\": typeof OPENROUTER_MODELS;\n\treadonly \"qwen-token-plan\": typeof QWEN_TOKEN_PLAN_MODELS;\n\treadonly \"qwen-token-plan-cn\": typeof QWEN_TOKEN_PLAN_CN_MODELS;\n\treadonly \"together\": typeof TOGETHER_MODELS;\n\treadonly \"vercel-ai-gateway\": typeof VERCEL_AI_GATEWAY_MODELS;\n\treadonly \"xai\": typeof XAI_MODELS;\n\treadonly \"xiaomi\": typeof XIAOMI_MODELS;\n\treadonly \"xiaomi-token-plan-ams\": typeof XIAOMI_TOKEN_PLAN_AMS_MODELS;\n\treadonly \"xiaomi-token-plan-cn\": typeof XIAOMI_TOKEN_PLAN_CN_MODELS;\n\treadonly \"xiaomi-token-plan-sgp\": typeof XIAOMI_TOKEN_PLAN_SGP_MODELS;\n\treadonly \"zai\": typeof ZAI_MODELS;\n\treadonly \"zai-coding-cn\": typeof ZAI_CODING_CN_MODELS;\n} = {\n\t\"amazon-bedrock\": AMAZON_BEDROCK_MODELS,\n\t\"ant-ling\": ANT_LING_MODELS,\n\t\"anthropic\": ANTHROPIC_MODELS,\n\t\"azure-openai-responses\": AZURE_OPENAI_RESPONSES_MODELS,\n\t\"baseten\": BASETEN_MODELS,\n\t\"cerebras\": CEREBRAS_MODELS,\n\t\"cloudflare-ai-gateway\": CLOUDFLARE_AI_GATEWAY_MODELS,\n\t\"cloudflare-workers-ai\": CLOUDFLARE_WORKERS_AI_MODELS,\n\t\"deepseek\": DEEPSEEK_MODELS,\n\t\"fireworks\": FIREWORKS_MODELS,\n\t\"github-copilot\": GITHUB_COPILOT_MODELS,\n\t\"google\": GOOGLE_MODELS,\n\t\"google-vertex\": GOOGLE_VERTEX_MODELS,\n\t\"groq\": GROQ_MODELS,\n\t\"huggingface\": HUGGINGFACE_MODELS,\n\t\"kimi-coding\": KIMI_CODING_MODELS,\n\t\"minimax\": MINIMAX_MODELS,\n\t\"minimax-cn\": MINIMAX_CN_MODELS,\n\t\"mistral\": MISTRAL_MODELS,\n\t\"moonshotai\": MOONSHOTAI_MODELS,\n\t\"moonshotai-cn\": MOONSHOTAI_CN_MODELS,\n\t\"nvidia\": NVIDIA_MODELS,\n\t\"openai\": OPENAI_MODELS,\n\t\"openai-codex\": OPENAI_CODEX_MODELS,\n\t\"opencode\": OPENCODE_MODELS,\n\t\"opencode-go\": OPENCODE_GO_MODELS,\n\t\"openrouter\": OPENROUTER_MODELS,\n\t\"qwen-token-plan\": QWEN_TOKEN_PLAN_MODELS,\n\t\"qwen-token-plan-cn\": QWEN_TOKEN_PLAN_CN_MODELS,\n\t\"together\": TOGETHER_MODELS,\n\t\"vercel-ai-gateway\": VERCEL_AI_GATEWAY_MODELS,\n\t\"xai\": XAI_MODELS,\n\t\"xiaomi\": XIAOMI_MODELS,\n\t\"xiaomi-token-plan-ams\": XIAOMI_TOKEN_PLAN_AMS_MODELS,\n\t\"xiaomi-token-plan-cn\": XIAOMI_TOKEN_PLAN_CN_MODELS,\n\t\"xiaomi-token-plan-sgp\": XIAOMI_TOKEN_PLAN_SGP_MODELS,\n\t\"zai\": ZAI_MODELS,\n\t\"zai-coding-cn\": ZAI_CODING_CN_MODELS,\n};\n"]}
|
package/dist/models.js
CHANGED
|
@@ -3,6 +3,7 @@ import { defaultProviderAuthContext as defaultAuthContext } from "./auth/context
|
|
|
3
3
|
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
|
+
import { operationSignal, raceWithAbortSignal } from "./utils/abort.js";
|
|
6
7
|
export { ModelsError } from "./auth/resolve.js";
|
|
7
8
|
function mergeHeaders(base, override) {
|
|
8
9
|
if (!base && !override)
|
|
@@ -23,18 +24,26 @@ class ModelsImpl {
|
|
|
23
24
|
credentials;
|
|
24
25
|
modelsStore;
|
|
25
26
|
authContext;
|
|
27
|
+
refreshGenerations = new Map();
|
|
28
|
+
refreshControllers = new Map();
|
|
29
|
+
publicationChains = new Map();
|
|
26
30
|
constructor(options) {
|
|
27
31
|
this.credentials = options?.credentials ?? new InMemoryCredentialStore();
|
|
28
32
|
this.modelsStore = options?.modelsStore ?? new InMemoryModelsStore();
|
|
29
33
|
this.authContext = options?.authContext ?? defaultAuthContext();
|
|
30
34
|
}
|
|
31
35
|
setProvider(provider) {
|
|
36
|
+
this.supersedeProviderRefresh(provider.id);
|
|
32
37
|
this.providers.set(provider.id, provider);
|
|
33
38
|
}
|
|
34
39
|
deleteProvider(id) {
|
|
40
|
+
this.supersedeProviderRefresh(id);
|
|
35
41
|
this.providers.delete(id);
|
|
36
42
|
}
|
|
37
43
|
clearProviders() {
|
|
44
|
+
for (const id of new Set([...this.providers.keys(), ...this.refreshControllers.keys()])) {
|
|
45
|
+
this.supersedeProviderRefresh(id);
|
|
46
|
+
}
|
|
38
47
|
this.providers.clear();
|
|
39
48
|
}
|
|
40
49
|
getProviders() {
|
|
@@ -69,87 +78,148 @@ class ModelsImpl {
|
|
|
69
78
|
getModel(provider, id) {
|
|
70
79
|
return this.getModels(provider).find((model) => model.id === id);
|
|
71
80
|
}
|
|
81
|
+
supersedeProviderRefresh(providerId) {
|
|
82
|
+
const generation = (this.refreshGenerations.get(providerId) ?? 0) + 1;
|
|
83
|
+
this.refreshGenerations.set(providerId, generation);
|
|
84
|
+
const previous = this.refreshControllers.get(providerId);
|
|
85
|
+
if (previous) {
|
|
86
|
+
this.refreshControllers.delete(providerId);
|
|
87
|
+
previous.abort();
|
|
88
|
+
}
|
|
89
|
+
return generation;
|
|
90
|
+
}
|
|
91
|
+
beginProviderRefresh(providerId) {
|
|
92
|
+
const generation = this.supersedeProviderRefresh(providerId);
|
|
93
|
+
const controller = new AbortController();
|
|
94
|
+
this.refreshControllers.set(providerId, controller);
|
|
95
|
+
return { generation, controller };
|
|
96
|
+
}
|
|
97
|
+
publishProviderModels(providerId, generation, signal, publication) {
|
|
98
|
+
const previous = this.publicationChains.get(providerId) ?? Promise.resolve();
|
|
99
|
+
const queued = (async () => {
|
|
100
|
+
await previous.catch(() => { });
|
|
101
|
+
if (signal.aborted || this.refreshGenerations.get(providerId) !== generation)
|
|
102
|
+
return false;
|
|
103
|
+
if (publication.persist === null) {
|
|
104
|
+
await this.modelsStore.delete(providerId, { signal });
|
|
105
|
+
}
|
|
106
|
+
else if (publication.persist !== undefined) {
|
|
107
|
+
await this.modelsStore.write(providerId, structuredClone(publication.persist), { signal });
|
|
108
|
+
}
|
|
109
|
+
if (signal.aborted || this.refreshGenerations.get(providerId) !== generation)
|
|
110
|
+
return false;
|
|
111
|
+
publication.update?.();
|
|
112
|
+
return true;
|
|
113
|
+
})();
|
|
114
|
+
const tail = queued.catch(() => { });
|
|
115
|
+
this.publicationChains.set(providerId, tail);
|
|
116
|
+
void tail.then(() => {
|
|
117
|
+
if (this.publicationChains.get(providerId) === tail)
|
|
118
|
+
this.publicationChains.delete(providerId);
|
|
119
|
+
});
|
|
120
|
+
return raceWithAbortSignal(queued, signal);
|
|
121
|
+
}
|
|
122
|
+
async runProviderRefreshPhase(provider, credential, allowNetwork, force, generation, signal) {
|
|
123
|
+
const stored = await this.modelsStore.read(provider.id, { signal });
|
|
124
|
+
await provider.refreshModels({
|
|
125
|
+
credential,
|
|
126
|
+
stored: stored ? structuredClone(stored) : undefined,
|
|
127
|
+
publish: (publication) => this.publishProviderModels(provider.id, generation, signal, publication),
|
|
128
|
+
allowNetwork,
|
|
129
|
+
force: allowNetwork ? force : undefined,
|
|
130
|
+
signal,
|
|
131
|
+
});
|
|
132
|
+
}
|
|
72
133
|
async refresh(options = {}) {
|
|
73
134
|
const allowNetwork = options.allowNetwork ?? true;
|
|
135
|
+
const callerSignal = operationSignal(options.signal);
|
|
74
136
|
const errors = new Map();
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
137
|
+
if (callerSignal.aborted)
|
|
138
|
+
return { aborted: true, errors };
|
|
139
|
+
const selected = options.providers ? new Set(options.providers) : undefined;
|
|
140
|
+
const refreshable = Array.from(this.providers.values()).filter((provider) => provider.refreshModels !== undefined && (!selected || selected.has(provider.id)));
|
|
141
|
+
const refresh = Promise.all(refreshable.map(async (provider) => {
|
|
142
|
+
const { generation, controller } = this.beginProviderRefresh(provider.id);
|
|
143
|
+
const signal = AbortSignal.any([callerSignal, controller.signal]);
|
|
144
|
+
const operation = (async () => {
|
|
145
|
+
let storedCredential;
|
|
146
|
+
let credentialError;
|
|
147
|
+
try {
|
|
148
|
+
storedCredential = await this.readCredential(provider.id, signal);
|
|
149
|
+
}
|
|
150
|
+
catch (error) {
|
|
151
|
+
credentialError = error;
|
|
152
|
+
}
|
|
153
|
+
// Restore cached provider state before auth resolution or network access.
|
|
154
|
+
await this.runProviderRefreshPhase(provider, storedCredential, false, undefined, generation, signal);
|
|
155
|
+
if (credentialError !== undefined)
|
|
156
|
+
throw credentialError;
|
|
157
|
+
if (!allowNetwork || signal.aborted)
|
|
158
|
+
return;
|
|
159
|
+
const credential = await this.resolveRefreshCredential(provider, storedCredential, signal);
|
|
88
160
|
if (!credential)
|
|
89
161
|
return;
|
|
90
|
-
await provider.
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
force: options.force,
|
|
95
|
-
signal: options.signal,
|
|
96
|
-
});
|
|
162
|
+
await this.runProviderRefreshPhase(provider, credential, true, options.force, generation, signal);
|
|
163
|
+
})();
|
|
164
|
+
try {
|
|
165
|
+
await raceWithAbortSignal(operation, signal);
|
|
97
166
|
}
|
|
98
167
|
catch (error) {
|
|
99
|
-
if (!
|
|
168
|
+
if (!signal.aborted) {
|
|
100
169
|
errors.set(provider.id, error instanceof Error
|
|
101
170
|
? error
|
|
102
171
|
: new ModelsError("model_source", `Model refresh failed for ${provider.id}`, { cause: error }));
|
|
103
172
|
}
|
|
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.
|
|
173
|
+
}
|
|
174
|
+
finally {
|
|
175
|
+
if (this.refreshControllers.get(provider.id) === controller) {
|
|
176
|
+
this.refreshControllers.delete(provider.id);
|
|
114
177
|
}
|
|
115
178
|
}
|
|
116
179
|
}));
|
|
117
|
-
|
|
180
|
+
try {
|
|
181
|
+
await raceWithAbortSignal(refresh, callerSignal);
|
|
182
|
+
}
|
|
183
|
+
catch (error) {
|
|
184
|
+
if (!callerSignal.aborted)
|
|
185
|
+
throw error;
|
|
186
|
+
}
|
|
187
|
+
return { aborted: callerSignal.aborted, errors: new Map(errors) };
|
|
118
188
|
}
|
|
119
|
-
async resolveRefreshCredential(provider, stored,
|
|
189
|
+
async resolveRefreshCredential(provider, stored, signal) {
|
|
120
190
|
if (stored?.type === "oauth") {
|
|
121
191
|
const oauth = provider.auth.oauth;
|
|
122
192
|
if (!oauth)
|
|
123
193
|
return undefined;
|
|
124
|
-
if (
|
|
194
|
+
if (Date.now() < stored.expires)
|
|
125
195
|
return stored;
|
|
126
|
-
if (signal
|
|
196
|
+
if (signal.aborted)
|
|
127
197
|
return undefined;
|
|
128
198
|
const post = await this.credentials.modify(provider.id, async (current) => {
|
|
129
199
|
if (current?.type !== "oauth" || Date.now() < current.expires)
|
|
130
200
|
return undefined;
|
|
131
201
|
return oauth.refresh(current, signal);
|
|
132
|
-
});
|
|
202
|
+
}, { signal });
|
|
133
203
|
return post?.type === "oauth" ? post : undefined;
|
|
134
204
|
}
|
|
135
205
|
const apiKey = provider.auth.apiKey;
|
|
136
206
|
if (!apiKey)
|
|
137
207
|
return undefined;
|
|
138
208
|
const credential = stored?.type === "api_key" ? stored : undefined;
|
|
139
|
-
const result = await apiKey.resolve({ ctx: this.authContext, credential });
|
|
209
|
+
const result = await apiKey.resolve({ ctx: this.authContext, credential, signal });
|
|
140
210
|
if (!result)
|
|
141
211
|
return undefined;
|
|
142
212
|
return { type: "api_key", key: result.auth.apiKey, env: result.env };
|
|
143
213
|
}
|
|
144
|
-
async readCredential(providerId) {
|
|
214
|
+
async readCredential(providerId, signal) {
|
|
145
215
|
try {
|
|
146
|
-
return await this.credentials.read(providerId);
|
|
216
|
+
return await this.credentials.read(providerId, { signal });
|
|
147
217
|
}
|
|
148
218
|
catch (error) {
|
|
149
219
|
throw new ModelsError("auth", `Credential store read failed for ${providerId}`, { cause: error });
|
|
150
220
|
}
|
|
151
221
|
}
|
|
152
|
-
async checkProviderAuth(provider, credential) {
|
|
222
|
+
async checkProviderAuth(provider, credential, signal) {
|
|
153
223
|
if (credential?.type === "oauth") {
|
|
154
224
|
return provider.auth.oauth ? { source: "OAuth", type: "oauth" } : undefined;
|
|
155
225
|
}
|
|
@@ -161,42 +231,54 @@ class ModelsImpl {
|
|
|
161
231
|
return await apiKey.check({
|
|
162
232
|
ctx: this.authContext,
|
|
163
233
|
credential: credential?.type === "api_key" ? credential : undefined,
|
|
234
|
+
signal,
|
|
164
235
|
});
|
|
165
236
|
}
|
|
166
237
|
catch (error) {
|
|
167
238
|
throw new ModelsError("auth", `API key auth check failed for provider ${provider.id}`, { cause: error });
|
|
168
239
|
}
|
|
169
240
|
}
|
|
170
|
-
const resolution = await resolveProviderAuth(provider, this.credentials, this.authContext);
|
|
241
|
+
const resolution = await resolveProviderAuth(provider, this.credentials, this.authContext, { signal });
|
|
171
242
|
return resolution ? { source: resolution.source, type: "api_key" } : undefined;
|
|
172
243
|
}
|
|
173
|
-
|
|
174
|
-
const
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
244
|
+
checkAuth(providerId, options) {
|
|
245
|
+
const signal = operationSignal(options?.signal);
|
|
246
|
+
const check = (async () => {
|
|
247
|
+
signal.throwIfAborted();
|
|
248
|
+
const provider = this.providers.get(providerId);
|
|
249
|
+
if (!provider)
|
|
250
|
+
return undefined;
|
|
251
|
+
return this.checkProviderAuth(provider, await this.readCredential(providerId, signal), signal);
|
|
252
|
+
})();
|
|
253
|
+
return raceWithAbortSignal(check, signal);
|
|
254
|
+
}
|
|
255
|
+
getAvailable(providerId, options) {
|
|
256
|
+
const signal = operationSignal(options?.signal);
|
|
257
|
+
const available = (async () => {
|
|
258
|
+
signal.throwIfAborted();
|
|
259
|
+
const providers = providerId
|
|
260
|
+
? [this.providers.get(providerId)].filter((entry) => entry !== undefined)
|
|
261
|
+
: this.getProviders();
|
|
262
|
+
const checks = await Promise.all(providers.map(async (provider) => {
|
|
263
|
+
const credential = await this.readCredential(provider.id, signal);
|
|
264
|
+
return { provider, credential, auth: await this.checkProviderAuth(provider, credential, signal) };
|
|
265
|
+
}));
|
|
266
|
+
return checks.flatMap(({ provider, credential, auth }) => {
|
|
267
|
+
if (!auth)
|
|
268
|
+
return [];
|
|
269
|
+
const models = provider.getModels();
|
|
270
|
+
return provider.filterModels?.(models, credential) ?? models;
|
|
271
|
+
});
|
|
272
|
+
})();
|
|
273
|
+
return raceWithAbortSignal(available, signal);
|
|
193
274
|
}
|
|
194
275
|
async getAuth(providerOrModel, overrides) {
|
|
276
|
+
const signal = operationSignal(overrides?.signal);
|
|
195
277
|
const providerId = typeof providerOrModel === "string" ? providerOrModel : providerOrModel.provider;
|
|
196
278
|
const provider = this.providers.get(providerId);
|
|
197
279
|
if (!provider)
|
|
198
280
|
return undefined;
|
|
199
|
-
const result = await resolveProviderAuth(provider, this.credentials, this.authContext, overrides);
|
|
281
|
+
const result = await resolveProviderAuth(provider, this.credentials, this.authContext, { ...overrides, signal });
|
|
200
282
|
if (!result || typeof providerOrModel === "string" || !providerOrModel.headers)
|
|
201
283
|
return result;
|
|
202
284
|
return {
|
|
@@ -208,6 +290,8 @@ class ModelsImpl {
|
|
|
208
290
|
};
|
|
209
291
|
}
|
|
210
292
|
async login(providerId, type, interaction) {
|
|
293
|
+
const signal = operationSignal(interaction.signal);
|
|
294
|
+
signal.throwIfAborted();
|
|
211
295
|
const provider = this.providers.get(providerId);
|
|
212
296
|
if (!provider)
|
|
213
297
|
throw new ModelsError("provider", `Unknown provider: ${providerId}`);
|
|
@@ -215,20 +299,52 @@ class ModelsImpl {
|
|
|
215
299
|
if (!method?.login) {
|
|
216
300
|
throw new ModelsError("auth", `${provider.name} does not support ${type} login`);
|
|
217
301
|
}
|
|
218
|
-
const
|
|
302
|
+
const loginOperation = method.login({ ...interaction, signal });
|
|
303
|
+
const credential = await raceWithAbortSignal(loginOperation, signal);
|
|
304
|
+
let mutationStarted = false;
|
|
305
|
+
let markMutationStarted;
|
|
306
|
+
const started = new Promise((resolve) => {
|
|
307
|
+
markMutationStarted = resolve;
|
|
308
|
+
});
|
|
309
|
+
const mutation = this.credentials.modify(providerId, async () => {
|
|
310
|
+
mutationStarted = true;
|
|
311
|
+
markMutationStarted?.();
|
|
312
|
+
return credential;
|
|
313
|
+
}, { signal });
|
|
314
|
+
void mutation.catch(() => { });
|
|
219
315
|
try {
|
|
220
|
-
await
|
|
316
|
+
await new Promise((resolve, reject) => {
|
|
317
|
+
const onAbort = () => {
|
|
318
|
+
if (!mutationStarted)
|
|
319
|
+
reject(signal.reason);
|
|
320
|
+
};
|
|
321
|
+
signal.addEventListener("abort", onAbort, { once: true });
|
|
322
|
+
void Promise.race([started, mutation]).then(() => {
|
|
323
|
+
signal.removeEventListener("abort", onAbort);
|
|
324
|
+
resolve();
|
|
325
|
+
}, (error) => {
|
|
326
|
+
signal.removeEventListener("abort", onAbort);
|
|
327
|
+
reject(error);
|
|
328
|
+
});
|
|
329
|
+
if (signal.aborted)
|
|
330
|
+
onAbort();
|
|
331
|
+
});
|
|
332
|
+
await mutation;
|
|
221
333
|
}
|
|
222
334
|
catch (error) {
|
|
335
|
+
signal.throwIfAborted();
|
|
223
336
|
throw new ModelsError("auth", `Credential store modify failed for ${providerId}`, { cause: error });
|
|
224
337
|
}
|
|
225
338
|
return credential;
|
|
226
339
|
}
|
|
227
|
-
async logout(providerId) {
|
|
340
|
+
async logout(providerId, options) {
|
|
341
|
+
const signal = operationSignal(options?.signal);
|
|
342
|
+
signal.throwIfAborted();
|
|
228
343
|
try {
|
|
229
|
-
await this.credentials.delete(providerId);
|
|
344
|
+
await this.credentials.delete(providerId, { signal });
|
|
230
345
|
}
|
|
231
346
|
catch (error) {
|
|
347
|
+
signal.throwIfAborted();
|
|
232
348
|
throw new ModelsError("auth", `Credential store delete failed for ${providerId}`, { cause: error });
|
|
233
349
|
}
|
|
234
350
|
}
|
|
@@ -244,6 +360,7 @@ class ModelsImpl {
|
|
|
244
360
|
const resolution = await this.getAuth(model, {
|
|
245
361
|
apiKey: options?.apiKey,
|
|
246
362
|
env: options?.env,
|
|
363
|
+
signal: options?.signal,
|
|
247
364
|
});
|
|
248
365
|
if (!resolution) {
|
|
249
366
|
throw new ModelsError("auth", `Provider is not configured: ${model.provider}`);
|
|
@@ -280,6 +397,24 @@ class ModelsImpl {
|
|
|
280
397
|
async completeSimple(model, context, options) {
|
|
281
398
|
return this.streamSimple(model, context, options).result();
|
|
282
399
|
}
|
|
400
|
+
async fetchDeferred(model, handle, options) {
|
|
401
|
+
return lazyStream(model, async () => {
|
|
402
|
+
const provider = this.requireProvider(model);
|
|
403
|
+
if (!provider.fetchDeferred) {
|
|
404
|
+
throw new ModelsError("provider", `Provider ${model.provider} does not support deferred responses`);
|
|
405
|
+
}
|
|
406
|
+
const { requestModel, requestOptions } = await this.applyAuth(model, options);
|
|
407
|
+
return provider.fetchDeferred(requestModel, handle, requestOptions);
|
|
408
|
+
}).result();
|
|
409
|
+
}
|
|
410
|
+
async cancelDeferred(model, handle, options) {
|
|
411
|
+
const provider = this.requireProvider(model);
|
|
412
|
+
if (!provider.cancelDeferred) {
|
|
413
|
+
throw new ModelsError("provider", `Provider ${model.provider} does not support deferred responses`);
|
|
414
|
+
}
|
|
415
|
+
const { requestModel, requestOptions } = await this.applyAuth(model, options);
|
|
416
|
+
await provider.cancelDeferred(requestModel, handle, requestOptions);
|
|
417
|
+
}
|
|
283
418
|
}
|
|
284
419
|
export function createModels(options) {
|
|
285
420
|
return new ModelsImpl(options);
|
|
@@ -293,7 +428,6 @@ export function createModels(options) {
|
|
|
293
428
|
export function createProvider(input) {
|
|
294
429
|
const baselineModels = input.models;
|
|
295
430
|
let dynamicModels = [];
|
|
296
|
-
let inflightRefresh;
|
|
297
431
|
const fetchModels = input.fetchModels;
|
|
298
432
|
const currentModels = () => {
|
|
299
433
|
const merged = [...baselineModels];
|
|
@@ -318,7 +452,7 @@ export function createProvider(input) {
|
|
|
318
452
|
}
|
|
319
453
|
return run(streams);
|
|
320
454
|
};
|
|
321
|
-
|
|
455
|
+
const provider = {
|
|
322
456
|
id: input.id,
|
|
323
457
|
name: input.name ?? input.id,
|
|
324
458
|
baseUrl: input.baseUrl,
|
|
@@ -326,34 +460,56 @@ export function createProvider(input) {
|
|
|
326
460
|
auth: input.auth,
|
|
327
461
|
getModels: currentModels,
|
|
328
462
|
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() });
|
|
463
|
+
? async (context) => {
|
|
464
|
+
if (context.stored) {
|
|
465
|
+
const restored = context.stored.models
|
|
466
|
+
.filter((model) => model.provider === input.id)
|
|
467
|
+
.map((model) => model);
|
|
468
|
+
if (!(await context.publish({
|
|
469
|
+
update: () => {
|
|
470
|
+
dynamicModels = restored;
|
|
471
|
+
},
|
|
472
|
+
}))) {
|
|
473
|
+
return;
|
|
345
474
|
}
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
475
|
+
}
|
|
476
|
+
if (!context.allowNetwork || context.signal.aborted)
|
|
477
|
+
return;
|
|
478
|
+
const refreshed = await fetchModels(context);
|
|
479
|
+
if (context.signal.aborted)
|
|
480
|
+
return;
|
|
481
|
+
await context.publish({
|
|
482
|
+
persist: { models: refreshed, checkedAt: Date.now() },
|
|
483
|
+
update: () => {
|
|
484
|
+
dynamicModels = refreshed;
|
|
485
|
+
},
|
|
486
|
+
});
|
|
351
487
|
}
|
|
352
488
|
: undefined,
|
|
353
489
|
filterModels: input.filterModels,
|
|
354
490
|
stream: (model, context, options) => dispatch(model, (streams) => streams.stream(model, context, options)),
|
|
355
491
|
streamSimple: (model, context, options) => dispatch(model, (streams) => streams.streamSimple(model, context, options)),
|
|
356
492
|
};
|
|
493
|
+
const streams = single ? [single] : Object.values(byApi ?? {}).filter((entry) => entry !== undefined);
|
|
494
|
+
if (streams.some((entry) => entry.fetchDeferred !== undefined)) {
|
|
495
|
+
provider.fetchDeferred = (model, handle, options) => lazyStream(model, async () => {
|
|
496
|
+
const implementation = apiFor(model);
|
|
497
|
+
if (!implementation?.fetchDeferred) {
|
|
498
|
+
throw new ModelsError("provider", `Provider ${input.id} does not support deferred responses for "${model.api}"`);
|
|
499
|
+
}
|
|
500
|
+
return implementation.fetchDeferred(model, handle, options);
|
|
501
|
+
});
|
|
502
|
+
}
|
|
503
|
+
if (streams.some((entry) => entry.cancelDeferred !== undefined)) {
|
|
504
|
+
provider.cancelDeferred = async (model, handle, options) => {
|
|
505
|
+
const implementation = apiFor(model);
|
|
506
|
+
if (!implementation?.cancelDeferred) {
|
|
507
|
+
throw new ModelsError("provider", `Provider ${input.id} cannot cancel deferred responses for "${model.api}"`);
|
|
508
|
+
}
|
|
509
|
+
await implementation.cancelDeferred(model, handle, options);
|
|
510
|
+
};
|
|
511
|
+
}
|
|
512
|
+
return provider;
|
|
357
513
|
}
|
|
358
514
|
/**
|
|
359
515
|
* Runtime-checked narrowing for dynamically looked-up models:
|