From d3c321f7a18ecebe5e322b189ce00db0762d16d9 Mon Sep 17 00:00:00 2001 From: Dirk Brand <51947788+dirkbrnd@users.noreply.github.com> Date: Thu, 27 Feb 2025 11:12:46 +0200 Subject: [PATCH] Better OpenAI invoke error handling (#2244) --- libs/agno/agno/models/openai/chat.py | 64 ++++++++++++++++++++++++---- 1 file changed, 56 insertions(+), 8 deletions(-) diff --git a/libs/agno/agno/models/openai/chat.py b/libs/agno/agno/models/openai/chat.py index 8d3decb263..e0d94d5871 100644 --- a/libs/agno/agno/models/openai/chat.py +++ b/libs/agno/agno/models/openai/chat.py @@ -320,8 +320,14 @@ def invoke(self, messages: List[Message]) -> Union[ChatCompletion, ParsedChatCom ) except RateLimitError as e: logger.error(f"Rate limit error from OpenAI API: {e}") + error_message = e.response.json().get("error", {}) + error_message = ( + error_message.get("message", "Unknown model error") + if isinstance(error_message, dict) + else error_message + ) raise ModelProviderError( - message=e.response.json().get("error", {}).get("message", "Unknown model error"), + message=error_message, status_code=e.response.status_code, model_name=self.name, model_id=self.id, @@ -331,8 +337,14 @@ def invoke(self, messages: List[Message]) -> Union[ChatCompletion, ParsedChatCom raise ModelProviderError(message=str(e), model_name=self.name, model_id=self.id) from e except APIStatusError as e: logger.error(f"API status error from OpenAI API: {e}") + error_message = e.response.json().get("error", {}) + error_message = ( + error_message.get("message", "Unknown model error") + if isinstance(error_message, dict) + else error_message + ) raise ModelProviderError( - message=e.response.json().get("error", {}).get("message", "Unknown model error"), + message=error_message, status_code=e.response.status_code, model_name=self.name, model_id=self.id, @@ -368,8 +380,14 @@ async def ainvoke(self, messages: List[Message]) -> Union[ChatCompletion, Parsed ) except RateLimitError as e: logger.error(f"Rate limit error from OpenAI API: {e}") + error_message = e.response.json().get("error", {}) + error_message = ( + error_message.get("message", "Unknown model error") + if isinstance(error_message, dict) + else error_message + ) raise ModelProviderError( - message=e.response.json().get("error", {}).get("message", "Unknown model error"), + message=error_message, status_code=e.response.status_code, model_name=self.name, model_id=self.id, @@ -379,8 +397,14 @@ async def ainvoke(self, messages: List[Message]) -> Union[ChatCompletion, Parsed raise ModelProviderError(message=str(e), model_name=self.name, model_id=self.id) from e except APIStatusError as e: logger.error(f"API status error from OpenAI API: {e}") + error_message = e.response.json().get("error", {}) + error_message = ( + error_message.get("message", "Unknown model error") + if isinstance(error_message, dict) + else error_message + ) raise ModelProviderError( - message=e.response.json().get("error", {}).get("message", "Unknown model error"), + message=error_message, status_code=e.response.status_code, model_name=self.name, model_id=self.id, @@ -409,8 +433,14 @@ def invoke_stream(self, messages: List[Message]) -> Iterator[ChatCompletionChunk ) # type: ignore except RateLimitError as e: logger.error(f"Rate limit error from OpenAI API: {e}") + error_message = e.response.json().get("error", {}) + error_message = ( + error_message.get("message", "Unknown model error") + if isinstance(error_message, dict) + else error_message + ) raise ModelProviderError( - message=e.response.json().get("error", {}).get("message", "Unknown model error"), + message=error_message, status_code=e.response.status_code, model_name=self.name, model_id=self.id, @@ -420,8 +450,14 @@ def invoke_stream(self, messages: List[Message]) -> Iterator[ChatCompletionChunk raise ModelProviderError(message=str(e), model_name=self.name, model_id=self.id) from e except APIStatusError as e: logger.error(f"API status error from OpenAI API: {e}") + error_message = e.response.json().get("error", {}) + error_message = ( + error_message.get("message", "Unknown model error") + if isinstance(error_message, dict) + else error_message + ) raise ModelProviderError( - message=e.response.json().get("error", {}).get("message", "Unknown model error"), + message=error_message, status_code=e.response.status_code, model_name=self.name, model_id=self.id, @@ -452,8 +488,14 @@ async def ainvoke_stream(self, messages: List[Message]) -> AsyncIterator[ChatCom yield chunk except RateLimitError as e: logger.error(f"Rate limit error from OpenAI API: {e}") + error_message = e.response.json().get("error", {}) + error_message = ( + error_message.get("message", "Unknown model error") + if isinstance(error_message, dict) + else error_message + ) raise ModelProviderError( - message=e.response.json().get("error", {}).get("message", "Unknown model error"), + message=error_message, status_code=e.response.status_code, model_name=self.name, model_id=self.id, @@ -463,8 +505,14 @@ async def ainvoke_stream(self, messages: List[Message]) -> AsyncIterator[ChatCom raise ModelProviderError(message=str(e), model_name=self.name, model_id=self.id) from e except APIStatusError as e: logger.error(f"API status error from OpenAI API: {e}") + error_message = e.response.json().get("error", {}) + error_message = ( + error_message.get("message", "Unknown model error") + if isinstance(error_message, dict) + else error_message + ) raise ModelProviderError( - message=e.response.json().get("error", {}).get("message", "Unknown model error"), + message=error_message, status_code=e.response.status_code, model_name=self.name, model_id=self.id,