From b8dcacd8bbf2a8ff4c7e678396f818328d848c94 Mon Sep 17 00:00:00 2001 From: Hieu Vu Date: Mon, 26 Oct 2026 14:12:34 +0700 Subject: [PATCH] fix(router): type the request retry budget view --- litellm/router.py | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/litellm/router.py b/litellm/router.py index 026d07378a5..8655efa6541 100644 --- a/litellm/router.py +++ b/litellm/router.py @@ -8921,7 +8921,12 @@ class Router: ## ADD RETRY TRACKING TO METADATA - used for spend logs retry tracking _metadata["attempted_retries"] = 0 _metadata["max_retries"] = num_retries # Updated after overrides in exception handler - initial_budget_exhausted: Final = max_retries_per_request_hit(kwargs, litellm.num_retries_per_request) + budget_request_kwargs: Final[Mapping[str, object]] = cast( # cast-ok: kwargs keys are request parameter names + Mapping[str, object], kwargs + ) + initial_budget_exhausted: Final = max_retries_per_request_hit( + budget_request_kwargs, litellm.num_retries_per_request + ) try: self._handle_mock_testing_rate_limit_error(model_group=model_group, kwargs=kwargs) # if the function call is successful, no exception will be raised and we'll break out of the loop @@ -9014,12 +9019,12 @@ class Router: all_deployments=_all_deployments, ) - if not max_retries_per_request_hit(kwargs, litellm.num_retries_per_request): + if not max_retries_per_request_hit(budget_request_kwargs, litellm.num_retries_per_request): await asyncio.sleep(retry_after) for current_attempt in range(num_retries): budget_exhausted_before_call: bool = max_retries_per_request_hit( - kwargs, litellm.num_retries_per_request + budget_request_kwargs, litellm.num_retries_per_request ) try: # Update retry tracking metadata before each retry attempt @@ -9085,7 +9090,7 @@ class Router: if skipped_ids: kwargs["_retry_skipped_deployment_ids"] = skipped_ids # rebind-ok: the next attempt reads it if budget_exhausted_before_call: - raise e + raise _timeout = self._time_to_sleep_before_retry( e=e, remaining_retries=remaining_retries, @@ -9093,7 +9098,7 @@ class Router: healthy_deployments=_healthy_deployments, all_deployments=_all_deployments, ) - if not max_retries_per_request_hit(kwargs, litellm.num_retries_per_request): + if not max_retries_per_request_hit(budget_request_kwargs, litellm.num_retries_per_request): await asyncio.sleep(_timeout) if type(original_exception) in litellm.LITELLM_EXCEPTION_TYPES: