diff --git a/api/config.py b/api/config.py index 8057b32bf..bf9e11aae 100644 --- a/api/config.py +++ b/api/config.py @@ -1349,7 +1349,17 @@ def resolve_model_provider(model_id: str) -> tuple: entry_model = (entry.get("model") or "").strip() entry_name = (entry.get("name") or "").strip() entry_base_url = (entry.get("base_url") or "").strip() - if entry_model and entry_name and model_id == entry_model: + entry_model_ids = set() + if entry_model: + entry_model_ids.add(entry_model) + entry_models = entry.get("models") + if isinstance(entry_models, dict): + entry_model_ids.update( + key.strip() + for key in entry_models.keys() + if isinstance(key, str) and key.strip() + ) + if entry_name and model_id in entry_model_ids: provider_hint = "custom:" + entry_name.lower().replace(" ", "-") return model_id, provider_hint, entry_base_url or None diff --git a/tests/test_model_resolver.py b/tests/test_model_resolver.py index a492936fd..410e77f68 100644 --- a/tests/test_model_resolver.py +++ b/tests/test_model_resolver.py @@ -159,6 +159,26 @@ def test_custom_provider_model_with_slash_routes_to_named_custom_provider(): assert base_url == 'http://lmstudio.local:1234/v1' +def test_custom_provider_models_dict_routes_to_named_custom_provider(): + """Models listed only under custom_providers[].models still route to that endpoint.""" + model, provider, base_url = _resolve_with_config( + 'sensenova-6.7-flash-lite', + provider='xiaomi', + custom_providers=[{ + 'name': 'LiteLLM Proxy', + 'base_url': 'http://127.0.0.1:8080/v1', + 'model': 'deepseek-v4-flash', + 'models': { + 'deepseek-v4-flash': {}, + 'sensenova-6.7-flash-lite': {}, + }, + }], + ) + assert model == 'sensenova-6.7-flash-lite' + assert provider == 'custom:litellm-proxy' + assert base_url == 'http://127.0.0.1:8080/v1' + + # ── get_available_models() @provider: hint behaviour ──────────────────────