73 lines
1.4 KiB
Python
73 lines
1.4 KiB
Python
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]
|
|
|