from rest_framework.exceptions import APIException from rest_framework.response import Response from rest_framework.views import exception_handler class ApiError(APIException): def __init__(self, code, message, status_code=400, details=None): self.code = code self.detail = message self.status_code = status_code self.details = details or {} class NotFoundError(ApiError): def __init__(self, message, details=None): super().__init__("NOT_FOUND", message, status_code=404, details=details) class InvalidRequestError(ApiError): def __init__(self, message, details=None): super().__init__("INVALID_REQUEST", message, status_code=400, details=details) class InferenceError(ApiError): def __init__(self, message, details=None): super().__init__("INFERENCE_ERROR", message, status_code=422, details=details) class InferenceBusy(ApiError): def __init__(self, message="Another inference is in progress.", details=None): super().__init__("INFERENCE_BUSY", message, status_code=429, details=details) class ModelUnavailable(ApiError): def __init__(self, message, details=None): super().__init__("MODEL_UNAVAILABLE", message, status_code=503, details=details) def api_exception_handler(exc, context): if isinstance(exc, ApiError): return Response( {"error": {"code": exc.code, "message": str(exc.detail), "details": exc.details}}, status=exc.status_code, ) response = exception_handler(exc, context) if response is not None: code = "UNKNOWN_ERROR" if response.status_code == 404: code = "NOT_FOUND" elif response.status_code == 400: code = "INVALID_REQUEST" response.data = {"error": {"code": code, "message": str(response.data), "details": {}}} return response