from __future__ import annotations from datetime import datetime from typing import Any from pydantic import BaseModel, Field class ChatMessage(BaseModel): role: str content: str class ChatRequest(BaseModel): message: str history: list[ChatMessage] = Field(default_factory=list) class SourceDocument(BaseModel): source_id: str source_type: str title: str source_url: str snippet: str published_at: datetime | None = None score: float | None = None class ChatResponse(BaseModel): answer: str model: str sources: list[SourceDocument] tool_results: list[dict[str, Any]] = Field(default_factory=list) class IndexResponse(BaseModel): indexed_knowledge_documents: int indexed_menu_documents: int menu_items_loaded: int class KnowledgeDocument(BaseModel): doc_id: str title: str text: str source_type: str source_url: str published_at: datetime | None = None metadata: dict[str, Any] = Field(default_factory=dict) class MenuItem(BaseModel): item_id: str name: str category: str description: str ingredients: list[str] price: int | None = None price_label: str size: str | None = None photo_url: str source_url: str scraped_at: datetime metadata: dict[str, Any] = Field(default_factory=dict) class MenuSnapshot(BaseModel): source_url: str scraped_at: datetime total_items: int items: list[MenuItem]