diff --git a/litellm/router.py b/litellm/router.py index fac48b45fb3..5ee57272326 100644 --- a/litellm/router.py +++ b/litellm/router.py @@ -9520,8 +9520,10 @@ class Router: for var in kwargs: if var in _allowed_settings: if var in _int_settings: - _casted_value = int(kwargs[var]) - setattr(self, var, _casted_value) + if kwargs[var] is None: + setattr(self, var, None) + else: + setattr(self, var, int(kwargs[var])) elif var == "routing_groups": self._routing_groups_input = kwargs[var] rebuild_routing_groups = True diff --git a/tests/router_unit_tests/test_router_helper_utils.py b/tests/router_unit_tests/test_router_helper_utils.py index 65d9d6b925d..16ce731ff37 100644 --- a/tests/router_unit_tests/test_router_helper_utils.py +++ b/tests/router_unit_tests/test_router_helper_utils.py @@ -977,6 +977,29 @@ def test_update_settings(model_list): assert router.allowed_fails == 20 +def test_update_settings_none_int_values(model_list): + """Regression test: update_settings must not crash when None is passed for int settings. + Previously raised TypeError: int() argument must be a string... not 'NoneType'""" + router = Router(model_list=model_list, timeout=30, allowed_fails=5) + + # None should reset each int setting without raising TypeError + router.update_settings(timeout=None) + assert router.timeout is None + + router.update_settings(allowed_fails=None) + assert router.allowed_fails is None + + router.update_settings(num_retries=None) + assert router.num_retries is None + + router.update_settings(cooldown_time=None) + assert router.cooldown_time is None + + # Valid int values must still work after None resets + router.update_settings(timeout=60) + assert router.timeout == 60 + + def test_common_checks_available_deployment(model_list): """Test if the 'common_checks_available_deployment' function is working correctly""" router = Router(model_list=model_list)