from pydantic import BaseModel, Field from typing import Optional, List from datetime import datetime class HealthResponse(BaseModel): status: str version: str class CheckResponse(BaseModel): task_id: str status: str message: str class MatchResult(BaseModel): method: str = Field(..., description="exact | fuzzy | semantic") similarity: float = Field(..., ge=0, le=100) source_title: Optional[str] = None source_db: Optional[str] = None url: Optional[str] = None source_id: Optional[str] = None fragment_text: Optional[str] = None fragment_start: Optional[int] = None fragment_end: Optional[int] = None class ReportResponse(BaseModel): task_id: str status: str overall_similarity: Optional[float] = None matches: Optional[List[MatchResult]] = None source_text: Optional[str] = None created_at: Optional[datetime] = None completed_at: Optional[datetime] = None class ReportSummary(BaseModel): task_id: str status: str overall_similarity: Optional[float] = None created_at: Optional[datetime] = None class ReportsListResponse(BaseModel): tasks: List[ReportSummary] class StatsResponse(BaseModel): total_documents_indexed: int faiss_index_size: int elasticsearch_available: bool api_version: str