# Root exception from typing import Tuple class EDAException(Exception): def __init__(self, message, status_code): self.message = message self.status_code = status_code def __str__(self): return self.message class BadRequestException(EDAException): def __init__(self, message): super().__init__(message, 400) class UnauthorizedException(EDAException): def __init__(self, message): super().__init__(message, 401) class PermissionDeniedException(EDAException): def __init__(self, message): super().__init__(message, 403) class NotFoundException(EDAException): def __init__(self, message): super().__init__(message, 404) class TooManyRequestsException(EDAException): def __init__(self, message): super().__init__(message, 429) class InternalServerException(EDAException): def __init__(self, message): super().__init__(message, 500) # OpenAI Exceptions class OpenAIException(InternalServerException): pass class OpenAITimeoutException(OpenAIException): pass class OpenAIRateLimitException(OpenAIException): pass class OpenAIServiceUnavailableException(OpenAIException): pass class OpenAITokenLimitException(OpenAIException): pass class OpenAIJSONDecodeException(OpenAIException): pass class SystemException(InternalServerException): pass # Algorithms Exceptions class AlgorithmException(InternalServerException): pass class BadRequestCausedAlgorithmException(BadRequestException): pass # Job Exceptions class JobException(InternalServerException): pass def parse_exception(e: Exception) -> Tuple[str, int]: if isinstance(e, EDAException): return e.message, e.status_code elif isinstance(e, ValueError): return str(e), 400 else: return str(e), 500