2828import aiofiles
2929import loguru
3030from pydantic_core import to_jsonable_python
31- from tenacity import RetryCallState , _utils
31+ from tenacity import RetryCallState , RetryError , _utils
3232
3333from metagpt .const import MESSAGE_ROUTE_TO_ALL
3434from metagpt .logs import logger
@@ -501,7 +501,7 @@ async def wrapper(self, *args, **kwargs):
501501 self .rc .memory .delete (self .latest_observed_msg )
502502 # raise again to make it captured outside
503503 raise Exception (format_trackback_info (limit = None ))
504- except Exception :
504+ except Exception as e :
505505 if self .latest_observed_msg :
506506 logger .warning (
507507 "There is a exception in role's execution, in order to resume, "
@@ -510,6 +510,12 @@ async def wrapper(self, *args, **kwargs):
510510 # remove role newest observed msg to make it observed again
511511 self .rc .memory .delete (self .latest_observed_msg )
512512 # raise again to make it captured outside
513+ if isinstance (e , RetryError ):
514+ last_error = e .last_attempt ._exception
515+ name = any_to_str (last_error )
516+ if re .match (r"^openai\." , name ) or re .match (r"^httpx\." , name ):
517+ raise last_error
518+
513519 raise Exception (format_trackback_info (limit = None ))
514520
515521 return wrapper
0 commit comments