from pydantic import BaseModel, Field from typing import Optional from datetime import datetime class QueryRequest(BaseModel): query: str = Field(..., min_length=1, max_length=2000) collection: Optional[str] = Field(default="all") top_k: Optional[int] = Field(default=5, ge=1, le=20) use_reranking: Optional[bool] = Field(default=True) filters: Optional[dict] = Field(default=None) class SourceResult(BaseModel): text: str score: float doc_id: str parent_id: str filename: str collection: str metadata: Optional[dict] = None class QueryResponse(BaseModel): success: bool query: str context: str sources: list[SourceResult] processing_time_ms: float cached: bool engine: str = "nexus" class UploadResponse(BaseModel): success: bool doc_id: str filename: str file_size_mb: float parents_created: int children_created: int processing_time_ms: float collection: str class HealthResponse(BaseModel): status: str timestamp: str uptime_seconds: float qdrant_connection: str cache_entries: int version: str = "1.0.0" class StatsResponse(BaseModel): storage: dict documents: dict queries: dict top_queries: list[dict] rate_limits: dict class DeleteResponse(BaseModel): success: bool doc_id: str parents_deleted: int children_deleted: int class CollectionsResponse(BaseModel): success: bool collections: list[str] total: int class ErrorResponse(BaseModel): success: bool = False error: str detail: Optional[str] = None