Source code for acp_sdk.server.errors

from fastapi import Request, status
from fastapi.exceptions import RequestValidationError
from fastapi.responses import JSONResponse
from starlette.exceptions import HTTPException as StarletteHTTPException

from acp_sdk.models import Error, ErrorCode
from acp_sdk.models.errors import ACPError
from acp_sdk.server.logging import logger


[docs] def error_code_to_status_code(error_code: ErrorCode) -> int: match error_code: case ErrorCode.NOT_FOUND: return status.HTTP_404_NOT_FOUND case ErrorCode.INVALID_INPUT: return status.HTTP_422_UNPROCESSABLE_ENTITY case _: return status.HTTP_500_INTERNAL_SERVER_ERROR
[docs] def status_code_to_error_code(status_code: int) -> ErrorCode: match status_code: case status.HTTP_400_BAD_REQUEST: return ErrorCode.INVALID_INPUT case status.HTTP_404_NOT_FOUND: return ErrorCode.NOT_FOUND case status.HTTP_422_UNPROCESSABLE_ENTITY: return ErrorCode.INVALID_INPUT case _: return ErrorCode.SERVER_ERROR
[docs] async def acp_error_handler(request: Request, exc: ACPError, *, status_code: int | None = None) -> JSONResponse: error = exc.error return JSONResponse( status_code=status_code or error_code_to_status_code(error.code), content=error.model_dump(mode="json") )
[docs] async def http_exception_handler(request: Request, exc: StarletteHTTPException) -> JSONResponse: return await acp_error_handler( request, ACPError(Error(code=status_code_to_error_code(exc.status_code), message=exc.detail)), status_code=exc.status_code, )
[docs] async def validation_exception_handler(request: Request, exc: RequestValidationError) -> JSONResponse: return await acp_error_handler(request, ACPError(Error(code=ErrorCode.INVALID_INPUT, message=str(exc))))
[docs] async def catch_all_exception_handler(request: Request, exc: Exception) -> JSONResponse: logger.error(exc) return await acp_error_handler( request, ACPError(Error(code=ErrorCode.SERVER_ERROR, message="An unexpected error occurred")) )