"""Schemas Pydantic de entrada e saída da API.""" from __future__ import annotations from typing import Literal from pydantic import BaseModel, Field class ChatMessage(BaseModel): role: Literal["user", "assistant"] content: str = Field(min_length=1, max_length=8000) class ChatRequest(BaseModel): message: str = Field(min_length=1, max_length=4000) history: list[ChatMessage] = Field(default_factory=list) class Source(BaseModel): """Trecho bíblico recuperado, exibido no accordion de fontes.""" reference: str text: str book: str chapter: int verse: int file: str score: float = 0.0 class StatusResponse(BaseModel): state: Literal["ready", "indexing", "error"] sources_total: int = 0 sources_indexed: int = 0 chunks: int = 0 model: str = "" last_indexed_at: str | None = None errors: list[str] = Field(default_factory=list) verses_indexed: int = 0 verses_total: int = 0 current_file: str | None = None class HealthResponse(BaseModel): status: Literal["ok"] = "ok" llm_provider: str indexing: Literal["ready", "indexing", "error"] # A URL realmente em uso. Uma `OLLAMA_BASE_URL` herdada do shell pode # sobrescrever o `.env` silenciosamente; sem este campo o operador não tem # como perceber que o backend está apontando para outro lugar. llm_endpoint: str | None = None version: str = "1.0.0" class ReindexResponse(BaseModel): state: Literal["indexing"] = "indexing" class SourcesResponse(BaseModel): sources: list[Source] = Field(default_factory=list)