from dataclasses import dataclass @dataclass class ExInfo: name: str retry: bool description: str EXCEPTIONS = [ ExInfo("APIConnectionError", True, None), ExInfo("APIError", True, None), ExInfo("APIResponseValidationError", True, None), ExInfo( "AuthenticationError", False, "The API provider is not able to authenticate you. Check your API key.", ), ExInfo("AzureOpenAIError", True, None), ExInfo("BadRequestError", False, None), ExInfo("BudgetExceededError", True, None), ExInfo( "ContentPolicyViolationError", True, "The API provider has refused the request due to a safety policy about the content.", ), ExInfo("ContextWindowExceededError", False, None), # special case handled in base_coder ExInfo("InternalServerError", True, "The API provider's servers are down or overloaded."), ExInfo("InvalidRequestError", True, None), ExInfo("JSONSchemaValidationError", True, None), ExInfo("NotFoundError", False, None), ExInfo("OpenAIError", True, None), ExInfo( "RateLimitError", True, "The API provider has rate limited you. Try again later or check your quotas.", ), ExInfo("RouterRateLimitError", True, None), ExInfo("ServiceUnavailableError", True, "The API provider's servers are down or overloaded."), ExInfo("UnprocessableEntityError", True, None), ExInfo("UnsupportedParamsError", True, None), ExInfo( "Timeout", True, "The API provider timed out without returning a response. They may be down or overloaded.", ), ] class LiteLLMExceptions: exceptions = dict() def __init__(self): self._load() def _load(self, strict=False): import litellm for var in dir(litellm): if not var.endswith("Error"): continue ex_info = None for exi in EXCEPTIONS: if var == exi.name: ex_info = exi break if strict and not ex_info: raise ValueError(f"{var} is in litellm but not in aider's exceptions list") ex = getattr(litellm, var) self.exceptions[ex] = ex_info def exceptions_tuple(self): return tuple(self.exceptions) def get_ex_info(self, ex): """Return the ExInfo for a given exception instance""" import litellm if ex.__class__ is litellm.APIConnectionError: if "google.auth" in str(ex): return ExInfo( "APIConnectionError", False, "You need to: pip install google-generativeai" ) if "boto3" in str(ex): return ExInfo("APIConnectionError", False, "You need to: pip install boto3") return self.exceptions.get(ex.__class__, ExInfo(None, None, None))