From 655e2fa59c308075ae734b821f1429fe1e8aa49f Mon Sep 17 00:00:00 2001 From: Monesh Ram <31161039+WhoisMonesh@users.noreply.github.com> Date: Sat, 21 Feb 2026 14:51:08 +0530 Subject: [PATCH] fix: handle errors embedded in OpenRouter non-streaming responses --- .../llms/openrouter/chat/transformation.py | 24 +++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/litellm/llms/openrouter/chat/transformation.py b/litellm/llms/openrouter/chat/transformation.py index e3770dbbf49..05d03ce248a 100644 --- a/litellm/llms/openrouter/chat/transformation.py +++ b/litellm/llms/openrouter/chat/transformation.py @@ -211,6 +211,30 @@ class OpenrouterConfig(OpenAIGPTConfig): json_mode=json_mode, ) + # Check for error embedded in response body (OpenRouter-specific behavior) + # OpenRouter can return errors in a 200 response when a downstream provider fails + try: + response_json = raw_response.json() + if "error" in response_json: + error_chunk = response_json["error"] + error_msg = OpenRouterErrorMessage( + message="Message: {}, Metadata: {}".format( + error_chunk.get("message", "Unknown error"), + error_chunk.get("metadata", {}), + ), + code=error_chunk.get("code", 500), + metadata=error_chunk.get("metadata", {}), + ) + raise OpenRouterException( + message=error_msg["message"], + status_code=error_msg["code"], + headers=error_msg["metadata"].get("headers", {}), + ) + except OpenRouterException: + raise + except Exception: + pass + # Extract cost from OpenRouter response body # OpenRouter returns cost information in the usage object when usage.include=true try: