diff --git a/litellm/proxy/proxy_server.py b/litellm/proxy/proxy_server.py index 180bd0222..b30fced3d 100644 --- a/litellm/proxy/proxy_server.py +++ b/litellm/proxy/proxy_server.py @@ -171,6 +171,15 @@ class ProxyException(Exception): self.param = param self.code = code + # rules for proxyExceptions + # Litellm router.py returns "No healthy deployment available" when there are no deployments available + # Should map to 429 errors https://github.com/BerriAI/litellm/issues/2487 + if ( + "No healthy deployment available" in self.message + or "No deployments available" in self.message + ): + self.code = 429 + def to_dict(self) -> dict: """Converts the ProxyException instance to a dictionary.""" return { @@ -2919,10 +2928,7 @@ async def chat_completion( param=getattr(e, "param", "None"), code=getattr(e, "status_code", status.HTTP_400_BAD_REQUEST), ) - else: - error_traceback = traceback.format_exc() - error_msg = f"{str(e)}\n\n{error_traceback}" - + error_msg = f"{str(e)}" raise ProxyException( message=getattr(e, "message", error_msg), type=getattr(e, "type", "None"), @@ -3105,8 +3111,7 @@ async def embeddings( code=getattr(e, "status_code", status.HTTP_400_BAD_REQUEST), ) else: - error_traceback = traceback.format_exc() - error_msg = f"{str(e)}\n\n{error_traceback}" + error_msg = f"{str(e)}" raise ProxyException( message=getattr(e, "message", error_msg), type=getattr(e, "type", "None"), @@ -3256,8 +3261,7 @@ async def image_generation( code=getattr(e, "status_code", status.HTTP_400_BAD_REQUEST), ) else: - error_traceback = traceback.format_exc() - error_msg = f"{str(e)}\n\n{error_traceback}" + error_msg = f"{str(e)}" raise ProxyException( message=getattr(e, "message", error_msg), type=getattr(e, "type", "None"), @@ -3420,7 +3424,7 @@ async def audio_transcriptions( ) else: error_traceback = traceback.format_exc() - error_msg = f"{str(e)}\n\n{error_traceback}" + error_msg = f"{str(e)}" raise ProxyException( message=getattr(e, "message", error_msg), type=getattr(e, "type", "None"), @@ -3573,7 +3577,7 @@ async def moderations( ) else: error_traceback = traceback.format_exc() - error_msg = f"{str(e)}\n\n{error_traceback}" + error_msg = f"{str(e)}" raise ProxyException( message=getattr(e, "message", error_msg), type=getattr(e, "type", "None"), diff --git a/litellm/router.py b/litellm/router.py index c6a2bc8fe..45d34f2cd 100644 --- a/litellm/router.py +++ b/litellm/router.py @@ -2204,7 +2204,7 @@ class Router: f"healthy deployments: length {len(healthy_deployments)} {healthy_deployments}" ) if len(healthy_deployments) == 0: - raise ValueError("No models available") + raise ValueError(f"No healthy deployment available, passed model={model}") if litellm.model_alias_map and model in litellm.model_alias_map: model = litellm.model_alias_map[ model @@ -2275,7 +2275,9 @@ class Router: verbose_router_logger.info( f"get_available_deployment for model: {model}, No deployment available" ) - raise ValueError("No models available.") + raise ValueError( + f"No deployments available for selected model, passed model={model}" + ) verbose_router_logger.info( f"get_available_deployment for model: {model}, Selected deployment: {self.print_deployment(deployment)} for model: {model}" )