"""Adapter exceptions and OpenAI-shaped error responses.""" from fastapi import FastAPI, Request from fastapi.responses import JSONResponse class AdapterError(Exception): """Base class; renders as an OpenAI error body.""" def __init__(self, status: int, message: str, err_type: str, code: str | None = None): self.status = status self.message = message self.err_type = err_type self.code = code super().__init__(message) class InvalidRequest(AdapterError): def __init__(self, message: str, code: str | None = None): super().__init__(400, message, "invalid_request_error", code) class Unauthorized(AdapterError): def __init__(self, message: str = "Invalid API key provided"): super().__init__(401, message, "invalid_request_error", "invalid_api_key") class ComfyUIError(AdapterError): """ComfyUI rejected validation, failed execution, or timed out.""" def __init__(self, message: str, code: str = "comfyui_error"): super().__init__(502, message, "server_error", code) class ConfigError(AdapterError): """Invalid model registry configuration; blocks startup.""" def __init__(self, message: str): super().__init__(500, message, "server_error", "config_error") def error_body(message: str, err_type: str, code: str | None = None) -> dict: return {"error": {"message": message, "type": err_type, "param": None, "code": code}} def install_error_handlers(app: FastAPI) -> None: @app.exception_handler(AdapterError) async def adapter_error_handler(request: Request, exc: AdapterError) -> JSONResponse: return JSONResponse(status_code=exc.status, content=error_body(exc.message, exc.err_type, exc.code))