From cd0a141115deb34108a7c6776cbde4a8acaf7199 Mon Sep 17 00:00:00 2001 From: Sameer Kankute Date: Thu, 26 Mar 2026 12:04:48 +0530 Subject: [PATCH] fix(router): address Greptile P0/P1 review comments on order fallback - P0: Skip order-based fallback for ContextWindowExceededError and ContentPolicyViolationError so their dedicated fallback handlers run - P1: Read _target_order from kwargs to skip already-tried order levels, preventing wasteful retries and exponential retry storms Co-Authored-By: Claude Opus 4.6 --- litellm/router.py | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/litellm/router.py b/litellm/router.py index 8ca17997698..f63d08598a6 100644 --- a/litellm/router.py +++ b/litellm/router.py @@ -5289,6 +5289,11 @@ class Router: input_kwargs["fallback_depth"] = 0 # ORDER-BASED FALLBACKS: prepend higher order levels to the fallback list + # Skip for error types that have their own dedicated fallback handlers + _skip_order_fallback = isinstance( + e, + (litellm.ContextWindowExceededError, litellm.ContentPolicyViolationError), + ) all_deployments = self._get_all_deployments(model_name=original_model_group) _order_set: set = { d.get("litellm_params", {}).get("order") @@ -5296,11 +5301,17 @@ class Router: if d.get("litellm_params", {}).get("order") is not None } order_values: list = sorted(_order_set) - if len(order_values) > 1: - # Build order-based fallback entries (skip min order, already tried) + if len(order_values) > 1 and not _skip_order_fallback: + # Determine which order levels have already been tried + current_target = kwargs.get("_target_order") + skip_up_to = ( + current_target if current_target is not None else order_values[0] + ) + # Build order-based fallback entries (skip already-tried levels) order_fallback_entries: List = [ {"model": original_model_group, "_target_order": o} - for o in order_values[1:] + for o in order_values + if o > skip_up_to ] # Get external fallbacks external_fallback_group: Optional[List] = None