Skip to content

Commit c1281a5

Browse files
committed
feat: Add reusable validation logic for dynamic provider model selection
- Add getValidatedModelId() helper function to validate configured model IDs - Apply validation to all 10 dynamic providers that use routerModels - Fix issue where switching between dynamic providers would default to sonnet 4 - Ensure configured model ID exists in current provider before using it - Centralize provider default model ID logic in getProviderDefaultModelId() Fixes cross-contamination when switching from OpenRouter → Chutes (second time) where apiModelId would contain OpenRouter's model ID that doesn't exist in Chutes
1 parent 6965e5c commit c1281a5

File tree

2 files changed

+178
-62
lines changed

2 files changed

+178
-62
lines changed

packages/types/src/providers/index.ts

Lines changed: 118 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,3 +31,121 @@ export * from "./vercel-ai-gateway.js"
3131
export * from "./zai.js"
3232
export * from "./deepinfra.js"
3333
export * from "./minimax.js"
34+
35+
import { anthropicDefaultModelId } from "./anthropic.js"
36+
import { bedrockDefaultModelId } from "./bedrock.js"
37+
import { cerebrasDefaultModelId } from "./cerebras.js"
38+
import { chutesDefaultModelId } from "./chutes.js"
39+
import { claudeCodeDefaultModelId } from "./claude-code.js"
40+
import { deepSeekDefaultModelId } from "./deepseek.js"
41+
import { doubaoDefaultModelId } from "./doubao.js"
42+
import { featherlessDefaultModelId } from "./featherless.js"
43+
import { fireworksDefaultModelId } from "./fireworks.js"
44+
import { geminiDefaultModelId } from "./gemini.js"
45+
import { glamaDefaultModelId } from "./glama.js"
46+
import { groqDefaultModelId } from "./groq.js"
47+
import { ioIntelligenceDefaultModelId } from "./io-intelligence.js"
48+
import { litellmDefaultModelId } from "./lite-llm.js"
49+
import { mistralDefaultModelId } from "./mistral.js"
50+
import { moonshotDefaultModelId } from "./moonshot.js"
51+
import { openRouterDefaultModelId } from "./openrouter.js"
52+
import { qwenCodeDefaultModelId } from "./qwen-code.js"
53+
import { requestyDefaultModelId } from "./requesty.js"
54+
import { rooDefaultModelId } from "./roo.js"
55+
import { sambaNovaDefaultModelId } from "./sambanova.js"
56+
import { unboundDefaultModelId } from "./unbound.js"
57+
import { vertexDefaultModelId } from "./vertex.js"
58+
import { vscodeLlmDefaultModelId } from "./vscode-llm.js"
59+
import { xaiDefaultModelId } from "./xai.js"
60+
import { vercelAiGatewayDefaultModelId } from "./vercel-ai-gateway.js"
61+
import { internationalZAiDefaultModelId, mainlandZAiDefaultModelId } from "./zai.js"
62+
import { deepInfraDefaultModelId } from "./deepinfra.js"
63+
import { minimaxDefaultModelId } from "./minimax.js"
64+
65+
// Import the ProviderName type from provider-settings to avoid duplication
66+
import type { ProviderName } from "../provider-settings.js"
67+
68+
/**
69+
* Get the default model ID for a given provider.
70+
* This function returns only the provider's default model ID, without considering user configuration.
71+
* Used as a fallback when provider models are still loading.
72+
*/
73+
export function getProviderDefaultModelId(
74+
provider: ProviderName,
75+
options: { isChina?: boolean } = { isChina: false },
76+
): string {
77+
switch (provider) {
78+
case "openrouter":
79+
return openRouterDefaultModelId
80+
case "requesty":
81+
return requestyDefaultModelId
82+
case "glama":
83+
return glamaDefaultModelId
84+
case "unbound":
85+
return unboundDefaultModelId
86+
case "litellm":
87+
return litellmDefaultModelId
88+
case "xai":
89+
return xaiDefaultModelId
90+
case "groq":
91+
return groqDefaultModelId
92+
case "huggingface":
93+
return "meta-llama/Llama-3.3-70B-Instruct"
94+
case "chutes":
95+
return chutesDefaultModelId
96+
case "bedrock":
97+
return bedrockDefaultModelId
98+
case "vertex":
99+
return vertexDefaultModelId
100+
case "gemini":
101+
return geminiDefaultModelId
102+
case "deepseek":
103+
return deepSeekDefaultModelId
104+
case "doubao":
105+
return doubaoDefaultModelId
106+
case "moonshot":
107+
return moonshotDefaultModelId
108+
case "minimax":
109+
return minimaxDefaultModelId
110+
case "zai":
111+
return options?.isChina ? mainlandZAiDefaultModelId : internationalZAiDefaultModelId
112+
case "openai-native":
113+
return "gpt-4o" // Based on openai-native patterns
114+
case "mistral":
115+
return mistralDefaultModelId
116+
case "openai":
117+
return "" // OpenAI provider uses custom model configuration
118+
case "ollama":
119+
return "" // Ollama uses dynamic model selection
120+
case "lmstudio":
121+
return "" // LMStudio uses dynamic model selection
122+
case "deepinfra":
123+
return deepInfraDefaultModelId
124+
case "vscode-lm":
125+
return vscodeLlmDefaultModelId
126+
case "claude-code":
127+
return claudeCodeDefaultModelId
128+
case "cerebras":
129+
return cerebrasDefaultModelId
130+
case "sambanova":
131+
return sambaNovaDefaultModelId
132+
case "fireworks":
133+
return fireworksDefaultModelId
134+
case "featherless":
135+
return featherlessDefaultModelId
136+
case "io-intelligence":
137+
return ioIntelligenceDefaultModelId
138+
case "roo":
139+
return rooDefaultModelId
140+
case "qwen-code":
141+
return qwenCodeDefaultModelId
142+
case "vercel-ai-gateway":
143+
return vercelAiGatewayDefaultModelId
144+
case "anthropic":
145+
case "gemini-cli":
146+
case "human-relay":
147+
case "fake-ai":
148+
default:
149+
return anthropicDefaultModelId
150+
}
151+
}

0 commit comments

Comments
 (0)