diff --git a/litellm/router.py b/litellm/router.py index 24554e61516..fae51504610 100644 --- a/litellm/router.py +++ b/litellm/router.py @@ -1104,7 +1104,7 @@ class Router: self.validate_fallbacks(fallback_param=_fallbacks) ### set fallbacks - self.fallbacks = _fallbacks + self.fallbacks = list(_fallbacks) if _fallbacks is not None else None if default_fallbacks is not None or litellm.default_fallbacks is not None: _fallbacks = default_fallbacks or litellm.default_fallbacks diff --git a/tests/router_unit_tests/test_router_helper_utils.py b/tests/router_unit_tests/test_router_helper_utils.py index d3ad1d989c8..8d847e812b3 100644 --- a/tests/router_unit_tests/test_router_helper_utils.py +++ b/tests/router_unit_tests/test_router_helper_utils.py @@ -1922,6 +1922,23 @@ def test_has_default_fallbacks(model_list, has_default_fallbacks, expected_resul assert router._has_default_fallbacks() is expected_result +def test_default_fallbacks_do_not_mutate_input_fallbacks(model_list): + fallbacks = [{"gpt-5-mini": ["gpt-5.5"]}] + + first_router = Router(model_list=model_list, fallbacks=fallbacks, default_fallbacks=["gpt-5.5"]) + second_router = Router(model_list=model_list, fallbacks=fallbacks, default_fallbacks=["gpt-image-1"]) + + assert fallbacks == [{"gpt-5-mini": ["gpt-5.5"]}] + assert first_router.fallbacks == [ + {"gpt-5-mini": ["gpt-5.5"]}, + {"*": ["gpt-5.5"]}, + ] + assert second_router.fallbacks == [ + {"gpt-5-mini": ["gpt-5.5"]}, + {"*": ["gpt-image-1"]}, + ] + + def test_add_optional_pre_call_checks(model_list): router = Router(model_list=model_list)