From 05dd104ce6bb711b4500fe70e7e77a6243fd4be0 Mon Sep 17 00:00:00 2001 From: Alexsander Hamir Date: Tue, 30 Sep 2025 13:36:42 -0700 Subject: [PATCH] perf(router): Cache nested dict lookups in hot path (#15084) Cache deployment["litellm_params"] and deployment["model_info"] at loop start to avoid repeated dict hash lookups. - _pre_call_checks: 3 fewer lookups per deployment per request - deployment_callback_on_failure: 1 fewer lookup per failure - _set_model_group_info: 4 fewer lookups per model Saves CPU cycles on every routing decision and failure callback. --- litellm/router.py | 41 +++++++++++++++++++++++------------------ 1 file changed, 23 insertions(+), 18 deletions(-) diff --git a/litellm/router.py b/litellm/router.py index 31f1e0b4789..59c3235c039 100644 --- a/litellm/router.py +++ b/litellm/router.py @@ -4497,16 +4497,17 @@ class Router: try: exception = kwargs.get("exception", None) exception_status = getattr(exception, "status_code", "") - _model_info = kwargs.get("litellm_params", {}).get("model_info", {}) + + # Cache litellm_params to avoid repeated dict lookups + litellm_params = kwargs.get("litellm_params", {}) + _model_info = litellm_params.get("model_info", {}) exception_headers = litellm.litellm_core_utils.exception_mapping_utils._get_response_headers( original_exception=exception ) # Determine cooldown time with priority: deployment config > response header > router default - deployment_cooldown = kwargs.get("litellm_params", {}).get( - "cooldown_time", None - ) + deployment_cooldown = litellm_params.get("cooldown_time", None) header_cooldown = None if exception_headers is not None: @@ -5707,27 +5708,32 @@ class Router: configurable_clientside_auth_params = ( litellm_params.configurable_clientside_auth_params ) + + # Cache nested dict access to avoid repeated temporary dict allocations + model_litellm_params = model.get("litellm_params", {}) + model_info_dict = model.get("model_info", {}) + # get model tpm _deployment_tpm: Optional[int] = None if _deployment_tpm is None: _deployment_tpm = model.get("tpm", None) # type: ignore if _deployment_tpm is None: - _deployment_tpm = model.get("litellm_params", {}).get("tpm", None) # type: ignore + _deployment_tpm = model_litellm_params.get("tpm", None) # type: ignore if _deployment_tpm is None: - _deployment_tpm = model.get("model_info", {}).get("tpm", None) # type: ignore + _deployment_tpm = model_info_dict.get("tpm", None) # type: ignore # get model rpm _deployment_rpm: Optional[int] = None if _deployment_rpm is None: _deployment_rpm = model.get("rpm", None) # type: ignore if _deployment_rpm is None: - _deployment_rpm = model.get("litellm_params", {}).get("rpm", None) # type: ignore + _deployment_rpm = model_litellm_params.get("rpm", None) # type: ignore if _deployment_rpm is None: - _deployment_rpm = model.get("model_info", {}).get("rpm", None) # type: ignore + _deployment_rpm = model_info_dict.get("rpm", None) # type: ignore # get model info try: - model_id = model.get("model_info", {}).get("id", None) + model_id = model_info_dict.get("id", None) if model_id is not None: model_info = self.get_deployment_model_info( model_id=model_id, model_name=litellm_params.model @@ -6574,19 +6580,19 @@ class Router: or {} ) # check the in-memory cache used by lowest_latency and usage-based routing. Only check the local cache. for idx, deployment in enumerate(_returned_deployments): + # Cache nested dict access to avoid repeated temporary dict allocations + _litellm_params = deployment.get("litellm_params", {}) + _model_info = deployment.get("model_info", {}) + # see if we have the info for this model try: - base_model = deployment.get("model_info", {}).get("base_model", None) + base_model = _model_info.get("base_model", None) if base_model is None: - base_model = deployment.get("litellm_params", {}).get( - "base_model", None - ) + base_model = _litellm_params.get("base_model", None) model_info = self.get_router_model_info( deployment=deployment, received_model_name=model ) - model = base_model or deployment.get("litellm_params", {}).get( - "model", None - ) + model = base_model or _litellm_params.get("model", None) if ( isinstance(model_info, dict) @@ -6607,8 +6613,7 @@ class Router: except Exception as e: verbose_router_logger.exception("An error occurs - {}".format(str(e))) - _litellm_params = deployment.get("litellm_params", {}) - model_id = deployment.get("model_info", {}).get("id", "") + model_id = _model_info.get("id", "") ## RPM CHECK ## ### get local router cache ### current_request_cache_local = (