""" Presentation Layer - Pydantic Schemas for API """ from datetime import datetime from typing import List, Optional from pydantic import BaseModel, Field class QueryRequest(BaseModel): """Query request schema""" query_text: str = Field(..., min_length=1, max_length=5000, description="User question") department: str = Field(..., description="Department context") user_id: Optional[str] = Field(None, description="User identifier") session_id: Optional[str] = Field(None, description="Session identifier") top_k: int = Field(10, ge=1, le=50, description="Number of results to return") temperature: float = Field(0.7, ge=0.0, le=1.0, description="LLM temperature") max_tokens: int = Field(2048, ge=100, le=4096, description="Max tokens in response") filters: dict = Field(default_factory=dict, description="Additional filters") class SourceSchema(BaseModel): """Source citation schema""" title: str content: str relevance_score: float document_id: str chunk_index: int metadata: dict = Field(default_factory=dict) class QueryResponse(BaseModel): """Query response schema""" query_id: str answer: str sources: List[SourceSchema] confidence: float processing_time_ms: int tokens_used: int model: str class DocumentUploadRequest(BaseModel): """Document upload request schema""" department: str = Field(..., description="Department for the document") metadata: dict = Field(default_factory=dict, description="Additional metadata") class DocumentResponse(BaseModel): """Document response schema""" id: str title: str filename: str file_type: str file_size: int department: str status: str uploaded_at: datetime indexed_at: Optional[datetime] = None metadata: dict = Field(default_factory=dict) class HealthResponse(BaseModel): """Health check response""" status: str version: str timestamp: datetime services: dict = Field(default_factory=dict) class ErrorResponse(BaseModel): """Error response schema""" error: str detail: Optional[str] = None request_id: Optional[str] = None