""" API 요청/응답 모델 정의 (Pydantic) """ from pydantic import BaseModel, Field from typing import List, Dict, Optional, Any class QueryRequest(BaseModel): """질문 요청 모델""" question: str = Field(..., description="사용자 질문") top_k: int = Field(default=5, ge=1, le=20, description="검색할 문서 개수") enable_metacognition: bool = Field(default=True, description="메타인지 과정 활성화 여부") filter_metadata: Optional[Dict[str, str]] = Field(default=None, description="메타데이터 필터") class Config: json_schema_extra = { "example": { "question": "금융위기의 주요 원인은 무엇인가요?", "top_k": 5, "enable_metacognition": True } } class SourceDocument(BaseModel): """출처 문서 모델""" text: str = Field(..., description="문서 텍스트") source_filename: str = Field(..., description="출처 파일명") similarity: float = Field(..., description="유사도 점수") metadata: Dict[str, Any] = Field(default_factory=dict, description="문서 메타데이터") class MetaCognitionInfo(BaseModel): """메타인지 정보 모델""" thinking_history: List[Dict[str, Any]] = Field(..., description="사고 과정 히스토리") iterations: int = Field(..., description="개선 반복 횟수") class SearchStats(BaseModel): """검색 통계 모델""" documents_found: int = Field(..., description="발견된 문서 수") top_similarity: float = Field(..., description="최고 유사도 점수") class QueryResponse(BaseModel): """질문 응답 모델""" question: str = Field(..., description="원본 질문") answer: str = Field(..., description="생성된 답변") sources: List[SourceDocument] = Field(..., description="참고한 출처 문서들") metacognition: Optional[MetaCognitionInfo] = Field(default=None, description="메타인지 정보") search_stats: SearchStats = Field(..., description="검색 통계") class Config: json_schema_extra = { "example": { "question": "금융위기의 주요 원인은 무엇인가요?", "answer": "2008년 금융위기의 주요 원인은...", "sources": [ { "text": "논문 내용...", "source_filename": "financial_crisis_2008.pdf", "similarity": 0.89, "metadata": {"author": "John Doe"} } ], "search_stats": { "documents_found": 5, "top_similarity": 0.89 } } } class HealthResponse(BaseModel): """헬스 체크 응답""" status: str = Field(..., description="서버 상태") vector_store: Dict[str, Any] = Field(..., description="벡터 스토어 정보") embedding_model: Dict[str, Any] = Field(..., description="임베딩 모델 정보") class ErrorResponse(BaseModel): """에러 응답""" error: str = Field(..., description="에러 메시지") detail: Optional[str] = Field(default=None, description="상세 정보")