From 212d5d333061e525ab679ae624dcf4267f478863 Mon Sep 17 00:00:00 2001 From: Dantuluri Surya Narayana Raju Date: Sun, 17 May 2026 20:14:24 +0530 Subject: [PATCH] fix(router): handle None values in update_settings integer settings Router.update_settings() raised an unhandled TypeError when None was passed for any integer setting (timeout, num_retries, retry_after, allowed_fails, cooldown_time): _casted_value = int(kwargs[var]) # int(None) -> TypeError This is a real production path: the proxy server calls update_settings(**combined_router_settings) on every startup, where settings are merged from config.yaml and a JSON database. JSON null maps to Python None, so clearing a timeout via the admin UI causes a proxy startup crash. Fix: guard with an explicit None check before casting. Adds regression test covering all five int settings with None input and confirms valid int values still work after a None reset. --- litellm/router.py | 6 +++-- .../test_router_helper_utils.py | 23 +++++++++++++++++++ 2 files changed, 27 insertions(+), 2 deletions(-) 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)