fix(router): keep weighted routing when a deployment id equals a model_name

Co-Authored-By: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com>
This commit is contained in:
yassin 2026-09-15 00:42:18 +00:00
parent b67137b67f
commit bdc63d590e
2 changed files with 27 additions and 1 deletions

View file

@ -12502,7 +12502,7 @@ class Router:
# check if aliases set on litellm model alias map
if specific_deployment is True:
return model, self._get_deployment_by_litellm_model(model=model)
elif self.has_model_id(model):
elif model not in self.model_names and self.has_model_id(model):
deployment: Final = self.get_deployment(model_id=model)
if deployment is not None:
deployment_model: Final = deployment.litellm_params.model

View file

@ -15806,3 +15806,29 @@ async def test_an_open_circuit_breaker_skips_the_session_binding_without_a_warni
assert binding is None
assert [record.getMessage() for record in caplog.records if record.levelno >= logging.WARNING] == []
assert any("circuit breaker is open" in record.getMessage() for record in caplog.records)
@pytest.mark.asyncio
async def test_model_name_colliding_with_a_deployment_id_still_load_balances_the_group():
router = litellm.Router(
model_list=[
{
"model_name": "gpt-5-nano",
"litellm_params": {"model": "openai/gpt-5-nano", "api_key": "k", "weight": 0, "mock_response": "A"},
"model_info": {"id": "gpt-5-nano"},
},
{
"model_name": "gpt-5-nano",
"litellm_params": {"model": "openai/gpt-5-mini", "api_key": "k", "weight": 1, "mock_response": "B"},
"model_info": {"id": "gpt-5-mini-dep"},
},
],
routing_strategy="simple-shuffle",
)
by_group = await router.acompletion(model="gpt-5-nano", messages=[{"role": "user", "content": "hi"}])
by_id = await router.acompletion(model="gpt-5-mini-dep", messages=[{"role": "user", "content": "hi"}])
assert by_group._hidden_params["model_id"] == "gpt-5-mini-dep"
assert by_group.choices[0].message.content == "B"
assert by_id._hidden_params["model_id"] == "gpt-5-mini-dep"