from __future__ import annotations from dataclasses import dataclass from enum import Enum from typing import Any, Dict, Optional class ErrorCode(str, Enum): INVALID_REQUEST = "INVALID_REQUEST" INVALID_WORKFLOW_TYPE = "INVALID_WORKFLOW_TYPE" INVALID_RESPONSE_MODE = "INVALID_RESPONSE_MODE" SQL_GENERATION_FAILED = "SQL_GENERATION_FAILED" TABLE_MATCH_FAILED = "TABLE_MATCH_FAILED" SQL_EXECUTION_FAILED = "SQL_EXECUTION_FAILED" RAGFLOW_RETRIEVE_FAILED = "RAGFLOW_RETRIEVE_FAILED" CONVERSATION_NOT_FOUND = "CONVERSATION_NOT_FOUND" CONVERSATION_CREATE_FAILED = "CONVERSATION_CREATE_FAILED" CONVERSATION_UPDATE_FAILED = "CONVERSATION_UPDATE_FAILED" MESSAGE_SAVE_FAILED = "MESSAGE_SAVE_FAILED" CONFIG_INVALID = "CONFIG_INVALID" INTERNAL_ERROR = "INTERNAL_ERROR" @dataclass class AppError(Exception): code: ErrorCode message: str status_code: int = 500 detail: Optional[Dict[str, Any]] = None def to_dict(self) -> Dict[str, Any]: return { "code": self.code.value, "message": self.message, "detail": self.detail or {}, }