Skip to content

Commit 61b801d

Browse files
feat(settings): implement provider-specific model lists
- Add PROVIDER_MODELS config with Anthropic, OpenRouter, and LiteLLM model mappings - Update _get_available_models() to accept provider parameter - Modal now loads models based on current provider setting - Model dropdowns dynamically update when switching providers 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
1 parent 3b345da commit 61b801d

1 file changed

Lines changed: 67 additions & 29 deletions

File tree

src/claude_code_proxy/api/routes/settings.py

Lines changed: 67 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,6 @@
1414
ModelProvider,
1515
get_model_resolution_settings,
1616
)
17-
from claude_code_proxy.services.model_resolver import get_model_resolver
1817

1918

2019
logger = get_logger(__name__)
@@ -25,6 +24,63 @@
2524
TEMPLATES_DIR = Path(__file__).parent.parent.parent / "ui" / "templates"
2625
jinja_env = Environment(loader=FileSystemLoader(str(TEMPLATES_DIR)), autoescape=True)
2726

27+
# Provider-specific model configurations
28+
PROVIDER_MODELS: dict[str, dict[str, list[str]]] = {
29+
"anthropic": {
30+
"sonnet": [
31+
"claude-sonnet-4-5-20250514",
32+
"claude-sonnet-4-20250514",
33+
"claude-3-5-sonnet-20241022",
34+
"claude-3-5-sonnet-latest",
35+
],
36+
"opus": [
37+
"claude-opus-4-5-20250514",
38+
"claude-opus-4-20250514",
39+
"claude-3-opus-20240229",
40+
"claude-3-opus-latest",
41+
],
42+
"haiku": [
43+
"claude-haiku-4-5-20250514",
44+
"claude-3-5-haiku-20241022",
45+
"claude-3-5-haiku-latest",
46+
],
47+
},
48+
"openrouter": {
49+
"sonnet": [
50+
"anthropic/claude-sonnet-4",
51+
"anthropic/claude-3.5-sonnet",
52+
"anthropic/claude-3.5-sonnet:beta",
53+
],
54+
"opus": [
55+
"anthropic/claude-opus-4",
56+
"anthropic/claude-3-opus",
57+
"anthropic/claude-3-opus:beta",
58+
],
59+
"haiku": [
60+
"anthropic/claude-3.5-haiku",
61+
"anthropic/claude-3.5-haiku:beta",
62+
"anthropic/claude-3-haiku",
63+
],
64+
},
65+
"litellm": {
66+
"sonnet": [
67+
"claude-sonnet-4-5-20250514",
68+
"anthropic/claude-sonnet-4-5-20250514",
69+
"claude-3-5-sonnet-latest",
70+
],
71+
"opus": [
72+
"claude-opus-4-5-20250514",
73+
"anthropic/claude-opus-4-5-20250514",
74+
"claude-3-opus-latest",
75+
],
76+
"haiku": [
77+
"claude-haiku-4-5-20250514",
78+
"anthropic/claude-haiku-4-5-20250514",
79+
"claude-3-5-haiku-latest",
80+
],
81+
},
82+
}
83+
2884

2985
def _get_current_settings() -> dict[str, Any]:
3086
"""Get current model resolution settings."""
@@ -49,26 +105,9 @@ def _get_current_settings() -> dict[str, Any]:
49105
}
50106

51107

52-
def _get_available_models() -> dict[str, list[str]]:
53-
"""Get available models by tier from the resolver."""
54-
resolver = get_model_resolver()
55-
if resolver:
56-
tier_models = resolver.get_models_by_tier()
57-
return {
58-
"sonnet": tier_models.get("sonnet", ["claude-sonnet-4-5"]),
59-
"opus": tier_models.get("opus", ["claude-opus-4-5"]),
60-
"haiku": tier_models.get("haiku", ["claude-haiku-4-5"]),
61-
}
62-
# Fallback defaults
63-
return {
64-
"sonnet": [
65-
"claude-sonnet-4-5",
66-
"claude-sonnet-4",
67-
"claude-3-5-sonnet-20241022",
68-
],
69-
"opus": ["claude-opus-4-5", "claude-opus-4", "claude-3-opus-20240229"],
70-
"haiku": ["claude-haiku-4-5", "claude-3-5-haiku-20241022"],
71-
}
108+
def _get_available_models(provider: str = "anthropic") -> dict[str, list[str]]:
109+
"""Get available models by tier for the specified provider."""
110+
return PROVIDER_MODELS.get(provider, PROVIDER_MODELS["anthropic"])
72111

73112

74113
@router.get("")
@@ -171,10 +210,11 @@ async def update_tier_defaults(
171210
async def settings_modal(request: Request) -> HTMLResponse:
172211
"""Render the settings modal."""
173212
template = jinja_env.get_template("settings_modal.html")
213+
settings = _get_current_settings()
174214

175215
content = template.render(
176-
settings=_get_current_settings(),
177-
available_models=_get_available_models(),
216+
settings=settings,
217+
available_models=_get_available_models(settings["provider"]),
178218
)
179219

180220
return HTMLResponse(content=content)
@@ -185,13 +225,11 @@ async def models_for_provider(
185225
request: Request, provider: str, tier: str
186226
) -> HTMLResponse:
187227
"""Return model options for a specific provider and tier."""
188-
# TODO: Implement provider-specific model fetching
189-
available_models = _get_available_models()
228+
available_models = _get_available_models(provider)
190229
tier_models = available_models.get(tier, [])
191-
current_settings = _get_current_settings()
192-
current_default = current_settings["tier_defaults"].get(
193-
tier, tier_models[0] if tier_models else ""
194-
)
230+
231+
# Use first model as default for new provider
232+
current_default = tier_models[0] if tier_models else ""
195233

196234
template = jinja_env.get_template("partials/model_select.html")
197235
return HTMLResponse(

0 commit comments

Comments
 (0)