dell_ai/exceptions.py (48 lines of code) (raw):
"""Custom exceptions for the Dell AI SDK."""
class DellAIError(Exception):
"""Base exception for all Dell AI SDK exceptions.
This is the parent class for all exceptions raised by the Dell AI SDK.
It provides a common type for catching any SDK-specific error.
"""
def __init__(self, message, original_error=None):
"""Initialize the exception.
Args:
message: A descriptive error message.
original_error: The original exception that caused this error, if any.
"""
self.original_error = original_error
super().__init__(message)
class AuthenticationError(DellAIError):
"""Raised when authentication fails.
This exception is raised in cases such as:
- Invalid token provided
- Token has expired
- User is not authorized to access the requested resource
- Failed login attempt
"""
def __init__(self, message, original_error=None):
"""Initialize the authentication error.
Args:
message: A descriptive error message about the authentication failure.
original_error: The original exception that caused this error, if any.
"""
super().__init__(message, original_error)
class APIError(DellAIError):
"""Raised when the API returns an error.
This exception is raised when there are issues with the API request such as:
- Server errors (5xx)
- Bad requests (4xx, except 404 which uses ResourceNotFoundError)
- Unexpected response format
- Network issues
"""
def __init__(self, message, status_code=None, response=None, original_error=None):
"""Initialize the API error.
Args:
message: A descriptive error message.
status_code: The HTTP status code returned by the API, if applicable.
response: The raw API response, if available.
original_error: The original exception that caused this error, if any.
"""
self.status_code = status_code
self.response = response
super().__init__(message, original_error)
class ResourceNotFoundError(DellAIError):
"""Raised when a requested resource is not found.
This exception is raised when trying to access resources that don't exist, such as:
- Model IDs that don't exist
- Platform SKUs that don't exist
- Any API endpoint that returns a 404 status code
"""
def __init__(self, resource_type, resource_id, original_error=None):
"""Initialize the resource not found error.
Args:
resource_type: The type of resource that was not found (e.g., "model", "platform").
resource_id: The ID of the resource that was not found.
original_error: The original exception that caused this error, if any.
"""
message = f"{resource_type.capitalize()} with ID '{resource_id}' not found"
self.resource_type = resource_type
self.resource_id = resource_id
super().__init__(message, original_error)
class ValidationError(DellAIError):
"""Raised when input validation fails.
This exception is raised when the provided parameters don't meet requirements, such as:
- Invalid model ID format
- Invalid platform SKU format
- Unsupported deployment engine
- Invalid number of GPUs or replicas
- Incompatible model and platform combination
"""
def __init__(
self,
message,
parameter=None,
valid_values=None,
original_error=None,
config_details=None,
):
"""Initialize the validation error.
Args:
message: A descriptive error message.
parameter: The name of the invalid parameter, if applicable.
valid_values: A list of valid values for the parameter, if applicable.
original_error: The original exception that caused this error, if any.
config_details: A dictionary containing configuration details for the model/platform.
"""
self.parameter = parameter
self.valid_values = valid_values
self.config_details = config_details
# Add parameter and valid values to the message if provided
full_message = message
if parameter and valid_values:
full_message = f"{message} Valid values for '{parameter}': {', '.join(str(v) for v in valid_values)}"
elif parameter:
full_message = f"{message} Parameter: '{parameter}'"
# Add configuration details if provided
if config_details and config_details.get("valid_configs"):
full_message += f"\n\nValid configurations for {config_details.get('model_id')} on {config_details.get('platform_id')}:"
for config in config_details.get("valid_configs", []):
full_message += f"\n- GPUs: {config.num_gpus}, Max Input Tokens: {config.max_input_tokens}, Max Total Tokens: {config.max_total_tokens}"
super().__init__(full_message, original_error)
class GatedRepoAccessError(DellAIError):
"""Raised when a user attempts to access a gated repository without permission.
This exception is raised when:
- A model repository is gated (access controlled)
- The user does not have access to the model repository
- The user needs to request access before being able to download or use the model
"""
def __init__(self, model_id, original_error=None):
"""Initialize the gated repository access error.
Args:
model_id: The ID of the gated repository the user tried to access.
original_error: The original exception that caused this error, if any.
"""
message = (
f"Access denied: '{model_id}' is a gated repository that requires permission. "
f"Please request access at https://huggingface.co/{model_id}"
)
self.model_id = model_id
super().__init__(message, original_error)