diff --git a/litellm/router.py b/litellm/router.py index 99adc6c5fa6..198de5a70c8 100644 --- a/litellm/router.py +++ b/litellm/router.py @@ -1448,7 +1448,7 @@ class Router: self.validate_fallbacks(fallback_param=_fallbacks) ### set fallbacks - self.fallbacks = _fallbacks + self.fallbacks = _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/unit/test_router/test_router_helper_utils.py b/tests/unit/test_router/test_router_helper_utils.py index 4ac917d706d..876b1ab5b87 100644 --- a/tests/unit/test_router/test_router_helper_utils.py +++ b/tests/unit/test_router/test_router_helper_utils.py @@ -1646,6 +1646,26 @@ 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() -> None: + fallbacks: Final[list[dict[str, list[str]]]] = [{"primary": ["secondary"]}] + first_router: Final = Router(model_list=[], fallbacks=fallbacks, default_fallbacks=["first-default"]) + second_router: Final = Router(model_list=[], fallbacks=fallbacks, default_fallbacks=["second-default"]) + + try: + assert fallbacks == [{"primary": ["secondary"]}] + assert first_router.fallbacks == [ + {"primary": ["secondary"]}, + {"*": ["first-default"]}, + ] + assert second_router.fallbacks == [ + {"primary": ["secondary"]}, + {"*": ["second-default"]}, + ] + finally: + first_router.discard() + second_router.discard() + + def test_add_optional_pre_call_checks(model_list): router = Router(model_list=model_list)