diff --git a/api/config.py b/api/config.py index 0839634..55df1af 100644 --- a/api/config.py +++ b/api/config.py @@ -637,7 +637,10 @@ def resolve_model_provider(model_id: str) -> tuple: # just because the model name contains a slash (e.g. google/gemma-4-26b-a4b). # The user has explicitly pointed at a base_url, so trust their routing config. if config_base_url: - return model_id, config_provider, config_base_url + # Strip provider prefix (e.g. 'openai/gpt-5.4' -> 'gpt-5.4') so prefixed + # model IDs from previous sessions don't break custom endpoint routing. + bare_model = model_id.split('/', 1)[-1] + return bare_model, config_provider, config_base_url # If prefix does NOT match config provider, the user picked a cross-provider model # from the OpenRouter dropdown (e.g. config=anthropic but picked openai/gpt-5.4-mini). # In this case always route through openrouter with the full provider/model string. diff --git a/tests/test_model_resolver.py b/tests/test_model_resolver.py index 6176e84..c0a2b4e 100644 --- a/tests/test_model_resolver.py +++ b/tests/test_model_resolver.py @@ -403,8 +403,10 @@ def test_custom_endpoint_slash_model_routes_to_custom_not_openrouter(): assert base_url == 'http://127.0.0.1:1234/v1', ( "Expected base_url 'http://127.0.0.1:1234/v1', got '{}'.".format(base_url) ) - assert model == 'google/gemma-4-26b-a4b', ( - "Model name should be preserved as-is, got '{}'.".format(model) + # Fix #433: provider prefix is now stripped for custom endpoints so stale + # prefixed model IDs from previous sessions do not break custom endpoint routing. + assert model == 'gemma-4-26b-a4b', ( + "Model name prefix should be stripped for custom base_url endpoint, got '{}'.".format(model) ) # --- openrouter with slash model name MUST still route to openrouter -----