| 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 |
|
|