diff --git a/litellm/router.py b/litellm/router.py index 684ab6a19bd..bc755ad4374 100644 --- a/litellm/router.py +++ b/litellm/router.py @@ -10019,11 +10019,9 @@ class Router: deployments: Final = self.get_model_list(model_name=model_name, team_id=team_id) or [] if not self._are_all_deployments_blocked(deployments): return False - if reachable_fallbacks is not None and self._has_reachable_fallback( + return reachable_fallbacks is None or not self._has_reachable_fallback( model_name=model_name, fallbacks=reachable_fallbacks, team_id=team_id - ): - return False - return True + ) async def async_get_fully_unhealthy_model_names(self) -> set[str]: """ diff --git a/tests/test_litellm/test_router_block_helpers.py b/tests/test_litellm/test_router_block_helpers.py index 4abfe368654..f210371d2dd 100644 --- a/tests/test_litellm/test_router_block_helpers.py +++ b/tests/test_litellm/test_router_block_helpers.py @@ -145,3 +145,39 @@ class TestHasReachableFallback: ] ) assert router._has_reachable_fallback("primary", fallbacks=["fallback"]) is True + + +class TestIsBlockedWithoutReachableFallback: + def test_blocked_and_no_fallback_returns_true(self): + router = Router(model_list=[_deployment("primary", "p0", blocked=True)]) + assert router._is_blocked_without_reachable_fallback("primary", reachable_fallbacks=None, team_id=None) is True + + def test_not_all_blocked_returns_false(self): + router = Router(model_list=[_deployment("primary", "p0", blocked=False)]) + assert router._is_blocked_without_reachable_fallback("primary", reachable_fallbacks=None, team_id=None) is False + + def test_blocked_with_reachable_fallback_returns_false(self): + router = Router( + model_list=[ + _deployment("primary", "p0", blocked=True), + _deployment("fallback", "f0", blocked=False), + ] + ) + reachable = [{"primary": ["fallback"]}] + assert ( + router._is_blocked_without_reachable_fallback("primary", reachable_fallbacks=reachable, team_id=None) + is False + ) + + def test_blocked_with_fully_blocked_fallback_returns_true(self): + router = Router( + model_list=[ + _deployment("primary", "p0", blocked=True), + _deployment("fallback", "f0", blocked=True), + ] + ) + reachable = [{"primary": ["fallback"]}] + assert ( + router._is_blocked_without_reachable_fallback("primary", reachable_fallbacks=reachable, team_id=None) + is True + )