Skip to content

Commit 26ecbd7

Browse files
refactor(webview): move provider model config + docs slugs out of ApiOptions
Lift the inline PROVIDER_MODEL_CONFIG map and the docs-slug lookup out of ApiOptions.tsx into webview-ui/src/components/settings/utils/providerModelConfig.ts behind getProviderModelConfig and getProviderDocsSlug helpers. ApiOptions now reads provider-specific model fields, defaults, and docs slugs through those helpers, leaving the component focused on rendering. Co-authored-by: Cursor <cursoragent@cursor.com>
1 parent 420d35b commit 26ecbd7

2 files changed

Lines changed: 77 additions & 84 deletions

File tree

webview-ui/src/components/settings/ApiOptions.tsx

Lines changed: 6 additions & 84 deletions
Original file line numberDiff line numberDiff line change
@@ -9,37 +9,13 @@ import {
99
type ProviderSettings,
1010
isRetiredProvider,
1111
DEFAULT_CONSECUTIVE_MISTAKE_LIMIT,
12-
openRouterDefaultModelId,
13-
poeDefaultModelId,
14-
requestyDefaultModelId,
15-
litellmDefaultModelId,
16-
openAiNativeDefaultModelId,
17-
openAiCodexDefaultModelId,
18-
anthropicDefaultModelId,
19-
qwenCodeDefaultModelId,
20-
geminiDefaultModelId,
21-
deepSeekDefaultModelId,
22-
moonshotDefaultModelId,
23-
mistralDefaultModelId,
24-
xaiDefaultModelId,
25-
basetenDefaultModelId,
26-
bedrockDefaultModelId,
27-
vertexDefaultModelId,
28-
sambaNovaDefaultModelId,
29-
internationalZAiDefaultModelId,
30-
mainlandZAiDefaultModelId,
31-
fireworksDefaultModelId,
32-
vercelAiGatewayDefaultModelId,
33-
opencodeGoDefaultModelId,
34-
zooGatewayDefaultModelId,
35-
minimaxDefaultModelId,
36-
mimoDefaultModelId,
37-
unboundDefaultModelId,
3812
} from "@roo-code/types"
3913

4014
import {
4115
getProviderServiceConfig,
4216
getDefaultModelIdForProvider,
17+
getProviderDocsSlug,
18+
getProviderModelConfig,
4319
getStaticModelsForProvider,
4420
shouldUseGenericModelPicker,
4521
handleModelChangeSideEffects,
@@ -336,53 +312,7 @@ const ApiOptions = ({
336312
}
337313
}
338314

339-
// Define a mapping object that associates each provider with its model configuration
340-
const PROVIDER_MODEL_CONFIG: Partial<
341-
Record<
342-
ProviderName,
343-
{
344-
field: keyof ProviderSettings
345-
default?: string
346-
}
347-
>
348-
> = {
349-
openrouter: { field: "openRouterModelId", default: openRouterDefaultModelId },
350-
requesty: { field: "requestyModelId", default: requestyDefaultModelId },
351-
unbound: { field: "unboundModelId", default: unboundDefaultModelId },
352-
litellm: { field: "litellmModelId", default: litellmDefaultModelId },
353-
anthropic: { field: "apiModelId", default: anthropicDefaultModelId },
354-
"openai-codex": { field: "apiModelId", default: openAiCodexDefaultModelId },
355-
"qwen-code": { field: "apiModelId", default: qwenCodeDefaultModelId },
356-
"openai-native": { field: "apiModelId", default: openAiNativeDefaultModelId },
357-
gemini: { field: "apiModelId", default: geminiDefaultModelId },
358-
deepseek: { field: "apiModelId", default: deepSeekDefaultModelId },
359-
moonshot: { field: "apiModelId", default: moonshotDefaultModelId },
360-
minimax: { field: "apiModelId", default: minimaxDefaultModelId },
361-
mimo: { field: "apiModelId", default: mimoDefaultModelId },
362-
mistral: { field: "apiModelId", default: mistralDefaultModelId },
363-
xai: { field: "apiModelId", default: xaiDefaultModelId },
364-
baseten: { field: "apiModelId", default: basetenDefaultModelId },
365-
bedrock: { field: "apiModelId", default: bedrockDefaultModelId },
366-
vertex: { field: "apiModelId", default: vertexDefaultModelId },
367-
sambanova: { field: "apiModelId", default: sambaNovaDefaultModelId },
368-
zai: {
369-
field: "apiModelId",
370-
default:
371-
apiConfiguration.zaiApiLine === "china_coding"
372-
? mainlandZAiDefaultModelId
373-
: internationalZAiDefaultModelId,
374-
},
375-
fireworks: { field: "apiModelId", default: fireworksDefaultModelId },
376-
poe: { field: "apiModelId", default: poeDefaultModelId },
377-
"vercel-ai-gateway": { field: "vercelAiGatewayModelId", default: vercelAiGatewayDefaultModelId },
378-
"opencode-go": { field: "opencodeGoModelId", default: opencodeGoDefaultModelId },
379-
"zoo-gateway": { field: "zooGatewayModelId", default: zooGatewayDefaultModelId },
380-
openai: { field: "openAiModelId" },
381-
ollama: { field: "ollamaModelId" },
382-
lmstudio: { field: "lmStudioModelId" },
383-
}
384-
385-
const config = PROVIDER_MODEL_CONFIG[value]
315+
const config = getProviderModelConfig(value, apiConfiguration)
386316
if (config) {
387317
validateAndResetModel(
388318
value,
@@ -401,22 +331,14 @@ const ApiOptions = ({
401331

402332
const docs = useMemo(() => {
403333
const provider = PROVIDERS.find(({ value }) => value === selectedProvider)
404-
const name = provider?.label
405-
406-
if (!name) {
334+
if (!provider) {
407335
return undefined
408336
}
409337

410-
// Get the URL slug - use custom mapping if available, otherwise use the provider key.
411-
const slugs: Record<string, string> = {
412-
"openai-native": "openai",
413-
openai: "openai-compatible",
414-
}
415-
416-
const slug = slugs[selectedProvider] || selectedProvider
338+
const slug = getProviderDocsSlug(provider.value)
417339
return {
418340
url: buildDocLink(`providers/${slug}`, "provider_docs"),
419-
name,
341+
name: provider.label,
420342
}
421343
}, [selectedProvider])
422344

webview-ui/src/components/settings/utils/providerModelConfig.ts

Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,9 @@ import {
66
moonshotDefaultModelId,
77
geminiDefaultModelId,
88
mistralDefaultModelId,
9+
openRouterDefaultModelId,
910
openAiNativeDefaultModelId,
11+
openAiCodexDefaultModelId,
1012
qwenCodeDefaultModelId,
1113
vertexDefaultModelId,
1214
xaiDefaultModelId,
@@ -17,6 +19,13 @@ import {
1719
minimaxDefaultModelId,
1820
basetenDefaultModelId,
1921
mimoDefaultModelId,
22+
poeDefaultModelId,
23+
requestyDefaultModelId,
24+
unboundDefaultModelId,
25+
litellmDefaultModelId,
26+
vercelAiGatewayDefaultModelId,
27+
opencodeGoDefaultModelId,
28+
zooGatewayDefaultModelId,
2029
} from "@roo-code/types"
2130

2231
import { MODELS_BY_PROVIDER } from "../constants"
@@ -85,6 +94,68 @@ export const getDefaultModelIdForProvider = (provider: ProviderName, apiConfigur
8594
return PROVIDER_DEFAULT_MODEL_IDS[provider] ?? ""
8695
}
8796

97+
export type ProviderModelConfig = {
98+
field: keyof ProviderSettings
99+
default?: string
100+
}
101+
102+
// Minimal per-provider config used by ApiOptions for model-id field wiring.
103+
// Kept in this file to keep ApiOptions.tsx from growing a second registry.
104+
const PROVIDER_MODEL_CONFIG: Partial<Record<ProviderName, ProviderModelConfig>> = {
105+
openrouter: { field: "openRouterModelId", default: openRouterDefaultModelId },
106+
requesty: { field: "requestyModelId", default: requestyDefaultModelId },
107+
unbound: { field: "unboundModelId", default: unboundDefaultModelId },
108+
litellm: { field: "litellmModelId", default: litellmDefaultModelId },
109+
anthropic: { field: "apiModelId", default: anthropicDefaultModelId },
110+
"openai-codex": { field: "apiModelId", default: openAiCodexDefaultModelId },
111+
"qwen-code": { field: "apiModelId", default: qwenCodeDefaultModelId },
112+
"openai-native": { field: "apiModelId", default: openAiNativeDefaultModelId },
113+
gemini: { field: "apiModelId", default: geminiDefaultModelId },
114+
deepseek: { field: "apiModelId", default: deepSeekDefaultModelId },
115+
moonshot: { field: "apiModelId", default: moonshotDefaultModelId },
116+
minimax: { field: "apiModelId", default: minimaxDefaultModelId },
117+
mimo: { field: "apiModelId", default: mimoDefaultModelId },
118+
mistral: { field: "apiModelId", default: mistralDefaultModelId },
119+
xai: { field: "apiModelId", default: xaiDefaultModelId },
120+
baseten: { field: "apiModelId", default: basetenDefaultModelId },
121+
bedrock: { field: "apiModelId", default: bedrockDefaultModelId },
122+
vertex: { field: "apiModelId", default: vertexDefaultModelId },
123+
sambanova: { field: "apiModelId", default: sambaNovaDefaultModelId },
124+
zai: { field: "apiModelId" },
125+
fireworks: { field: "apiModelId", default: fireworksDefaultModelId },
126+
poe: { field: "apiModelId", default: poeDefaultModelId },
127+
"vercel-ai-gateway": { field: "vercelAiGatewayModelId", default: vercelAiGatewayDefaultModelId },
128+
"opencode-go": { field: "opencodeGoModelId", default: opencodeGoDefaultModelId },
129+
"zoo-gateway": { field: "zooGatewayModelId", default: zooGatewayDefaultModelId },
130+
openai: { field: "openAiModelId" },
131+
ollama: { field: "ollamaModelId" },
132+
lmstudio: { field: "lmStudioModelId" },
133+
}
134+
135+
export function getProviderModelConfig(provider: string, apiConfiguration?: ProviderSettings) {
136+
const config = PROVIDER_MODEL_CONFIG[provider as ProviderName]
137+
if (!config) return undefined
138+
139+
if (provider === "zai") {
140+
return {
141+
...config,
142+
default: getDefaultModelIdForProvider(provider as ProviderName, apiConfiguration),
143+
}
144+
}
145+
146+
return config
147+
}
148+
149+
// Custom mapping for doc URL slugs. Default is provider key.
150+
const PROVIDER_DOCS_SLUGS: Partial<Record<ProviderName, string>> = {
151+
"openai-native": "openai",
152+
openai: "openai-compatible",
153+
}
154+
155+
export function getProviderDocsSlug(provider: string) {
156+
return PROVIDER_DOCS_SLUGS[provider as ProviderName] ?? provider
157+
}
158+
88159
export const getStaticModelsForProvider = (
89160
provider: ProviderName,
90161
customArnLabel?: string,

0 commit comments

Comments
 (0)