49 lines
1.7 KiB
Python
49 lines
1.7 KiB
Python
"""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))
|