From 714dbda283914a32e9f586f83ebe2addb8d5ad9a Mon Sep 17 00:00:00 2001 From: songjianglin <270247441+2017955725@users.noreply.github.com> Date: Thu, 8 Oct 2026 00:41:30 +0800 Subject: [PATCH] fix(router): preserve caller fallback configuration --- litellm/router.py | 2 +- .../test_router_helper_utils.py | 17 +++++++++++++++++ 2 files changed, 18 insertions(+), 1 deletion(-) 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)