Spaces:
Sleeping
Sleeping
| #!/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) |