Spaces:
Running
Running
#!/usr/bin/env python3 | |
""" | |
Custom exception classes for the GAIA system. | |
""" | |
from typing import Optional, Any, Dict | |
class GAIAError(Exception): | |
"""Base exception for all GAIA-related errors.""" | |
def __init__(self, message: str, details: Optional[Dict[str, Any]] = None): | |
super().__init__(message) | |
self.message = message | |
self.details = details or {} | |
def __str__(self) -> str: | |
if self.details: | |
return f"{self.message} - Details: {self.details}" | |
return self.message | |
class ModelError(GAIAError): | |
"""Exception raised for model-related errors.""" | |
def __init__(self, message: str, model_name: Optional[str] = None, | |
provider: Optional[str] = None, **kwargs): | |
super().__init__(message, kwargs) | |
self.model_name = model_name | |
self.provider = provider | |
class ModelNotAvailableError(ModelError): | |
"""Exception raised when requested model is not available.""" | |
pass | |
class ModelAuthenticationError(ModelError): | |
"""Exception raised for model authentication failures.""" | |
pass | |
class ModelOverloadedError(ModelError): | |
"""Exception raised when model is overloaded.""" | |
pass | |
class ToolError(GAIAError): | |
"""Exception raised for tool execution errors.""" | |
def __init__(self, message: str, tool_name: Optional[str] = None, | |
input_data: Optional[Dict[str, Any]] = None, **kwargs): | |
super().__init__(message, kwargs) | |
self.tool_name = tool_name | |
self.input_data = input_data | |
class ToolNotFoundError(ToolError): | |
"""Exception raised when requested tool is not found.""" | |
pass | |
class ToolValidationError(ToolError): | |
"""Exception raised for tool input validation errors.""" | |
pass | |
class ToolExecutionError(ToolError): | |
"""Exception raised during tool execution.""" | |
pass | |
class ToolTimeoutError(ToolError): | |
"""Exception raised when tool execution times out.""" | |
pass | |
class ClassificationError(GAIAError): | |
"""Exception raised for question classification errors.""" | |
def __init__(self, message: str, question: Optional[str] = None, **kwargs): | |
super().__init__(message, kwargs) | |
self.question = question | |
class FileProcessingError(GAIAError): | |
"""Exception raised for file processing errors.""" | |
def __init__(self, message: str, file_path: Optional[str] = None, | |
file_type: Optional[str] = None, **kwargs): | |
super().__init__(message, kwargs) | |
self.file_path = file_path | |
self.file_type = file_type | |
class APIError(GAIAError): | |
"""Exception raised for external API errors.""" | |
def __init__(self, message: str, api_name: Optional[str] = None, | |
status_code: Optional[int] = None, **kwargs): | |
super().__init__(message, kwargs) | |
self.api_name = api_name | |
self.status_code = status_code | |
class ConfigurationError(GAIAError): | |
"""Exception raised for configuration errors.""" | |
pass | |
class ValidationError(GAIAError): | |
"""Exception raised for data validation errors.""" | |
def __init__(self, message: str, field: Optional[str] = None, | |
value: Optional[Any] = None, **kwargs): | |
super().__init__(message, kwargs) | |
self.field = field | |
self.value = value | |
# Error code mapping for consistent error handling | |
ERROR_CODES = { | |
"MODEL_NOT_AVAILABLE": ModelNotAvailableError, | |
"MODEL_AUTH_FAILED": ModelAuthenticationError, | |
"MODEL_OVERLOADED": ModelOverloadedError, | |
"TOOL_NOT_FOUND": ToolNotFoundError, | |
"TOOL_VALIDATION_FAILED": ToolValidationError, | |
"TOOL_EXECUTION_FAILED": ToolExecutionError, | |
"TOOL_TIMEOUT": ToolTimeoutError, | |
"CLASSIFICATION_FAILED": ClassificationError, | |
"FILE_PROCESSING_FAILED": FileProcessingError, | |
"API_ERROR": APIError, | |
"CONFIG_ERROR": ConfigurationError, | |
"VALIDATION_ERROR": ValidationError | |
} | |
def create_error(error_code: str, message: str, **kwargs) -> GAIAError: | |
"""Create error instance based on error code.""" | |
error_class = ERROR_CODES.get(error_code, GAIAError) | |
return error_class(message, **kwargs) |