from pydantic import BaseModel, Field from typing import Optional, List from datetime import datetime import uuid class MessageRequest(BaseModel): question: str = Field(..., min_length=1, max_length=2000, description="User question") conversation_id: Optional[str] = Field(None, description="Conversation ID for context") class SourceDocument(BaseModel): content: str source: str page: Optional[int] = None chunk_id: Optional[str] = None class MessageResponse(BaseModel): answer: str conversation_id: str sources: List[SourceDocument] = [] timestamp: str = Field(default_factory=lambda: datetime.utcnow().isoformat() + "Z") class IngestRequest(BaseModel): metadata: Optional[dict] = None class IngestResponse(BaseModel): message: str documents_processed: int chunks_created: int filename: str class ConversationMessage(BaseModel): role: str # "user" or "assistant" content: str sources: List[SourceDocument] = [] timestamp: str = Field(default_factory=lambda: datetime.utcnow().isoformat() + "Z") class Conversation(BaseModel): id: str = Field(default_factory=lambda: str(uuid.uuid4())) title: str = "New Conversation" messages: List[ConversationMessage] = [] created_at: str = Field(default_factory=lambda: datetime.utcnow().isoformat() + "Z") updated_at: str = Field(default_factory=lambda: datetime.utcnow().isoformat() + "Z") class ConversationListItem(BaseModel): id: str title: str message_count: int created_at: str updated_at: str class HealthResponse(BaseModel): status: str = "healthy" version: str = "1.0.0" environment: str = "development" class VectorStatsResponse(BaseModel): total_vectors: int = 0 total_documents: int = 0 index_name: str = "" dimension: int = 384 error: Optional[str] = None class DocumentInfo(BaseModel): name: str size: int # bytes type: str # PDF, Markdown, etc. uploaded_at: str