|
| 1 | +"""AI 모듈 커스텀 예외 및 에러 코드. |
| 2 | +
|
| 3 | +backend 의존성(FastAPI 등) 없이 독립 동작한다. |
| 4 | +""" |
| 5 | + |
| 6 | +from enum import Enum |
| 7 | + |
| 8 | + |
| 9 | +class AIErrorCode(str, Enum): |
| 10 | + """AI 모듈 에러 코드.""" |
| 11 | + |
| 12 | + AI_GENERATION_FAILED = "AI_GENERATION_FAILED" |
| 13 | + SCHEMA_VALIDATION_ERROR = "SCHEMA_VALIDATION_ERROR" |
| 14 | + RAG_SEARCH_FAILED = "RAG_SEARCH_FAILED" |
| 15 | + PROMPT_TEMPLATE_NOT_FOUND = "PROMPT_TEMPLATE_NOT_FOUND" |
| 16 | + BEDROCK_API_ERROR = "BEDROCK_API_ERROR" |
| 17 | + |
| 18 | + |
| 19 | +class AIError(Exception): |
| 20 | + """AI 모듈 기반 예외 클래스.""" |
| 21 | + |
| 22 | + def __init__(self, code: AIErrorCode, message: str, details: dict | None = None): |
| 23 | + self.code = code |
| 24 | + self.message = message |
| 25 | + self.details = details or {} |
| 26 | + super().__init__(f"[{code.value}] {message}") |
| 27 | + |
| 28 | + |
| 29 | +class AIGenerationFailedError(AIError): |
| 30 | + """Claude 호출 실패 또는 재시도 초과.""" |
| 31 | + |
| 32 | + def __init__(self, message: str = "AI 생성에 실패했습니다.", details: dict | None = None): |
| 33 | + super().__init__(AIErrorCode.AI_GENERATION_FAILED, message, details) |
| 34 | + |
| 35 | + |
| 36 | +class SchemaValidationError(AIError): |
| 37 | + """출력 스키마 불일치.""" |
| 38 | + |
| 39 | + def __init__(self, message: str = "응답 스키마 검증에 실패했습니다.", details: dict | None = None): |
| 40 | + super().__init__(AIErrorCode.SCHEMA_VALIDATION_ERROR, message, details) |
| 41 | + |
| 42 | + |
| 43 | +class RAGSearchFailedError(AIError): |
| 44 | + """KB 검색 실패 (비치명적).""" |
| 45 | + |
| 46 | + def __init__(self, message: str = "RAG 검색에 실패했습니다.", details: dict | None = None): |
| 47 | + super().__init__(AIErrorCode.RAG_SEARCH_FAILED, message, details) |
| 48 | + |
| 49 | + |
| 50 | +class PromptTemplateNotFoundError(AIError): |
| 51 | + """프롬프트 파일 미존재.""" |
| 52 | + |
| 53 | + def __init__(self, message: str = "프롬프트 템플릿을 찾을 수 없습니다.", details: dict | None = None): |
| 54 | + super().__init__(AIErrorCode.PROMPT_TEMPLATE_NOT_FOUND, message, details) |
| 55 | + |
| 56 | + |
| 57 | +class BedrockAPIError(AIError): |
| 58 | + """Bedrock API 레벨 에러 (throttling, timeout 등).""" |
| 59 | + |
| 60 | + def __init__(self, message: str = "Bedrock API 호출에 실패했습니다.", details: dict | None = None): |
| 61 | + super().__init__(AIErrorCode.BEDROCK_API_ERROR, message, details) |
0 commit comments