from pydantic import BaseModel from typing import List, Optional from enum import Enum class Source(str, Enum): email = "email" file = "file" chat = "chat" bigquery = "bigquery" tidbcloud = "tidbcloud" class DocumentMetadata(BaseModel): source: Optional[Source] = None source_id: Optional[str] = None url: Optional[str] = None created_at: Optional[str] = None author: Optional[str] = None class DocumentChunkMetadata(DocumentMetadata): document_id: Optional[str] = None class DocumentChunk(BaseModel): id: Optional[str] = None text: str summary: Optional[str] = None metadata: DocumentChunkMetadata embedding: Optional[List[float]] = None class DocumentChunkWithScore(DocumentChunk): score: float class Document(BaseModel): id: Optional[str] = None text: str summary: Optional[str] = None metadata: Optional[DocumentMetadata] = None class DocumentWithChunks(Document): chunks: List[DocumentChunk] class DocumentMetadataFilter(BaseModel): document_id: Optional[str] = None source: Optional[Source] = None source_id: Optional[str] = None author: Optional[str] = None start_date: Optional[str] = None # any date string format end_date: Optional[str] = None # any date string format class Query(BaseModel): query: str filter: Optional[DocumentMetadataFilter] = None top_k: Optional[int] = 3 class QueryWithEmbedding(Query): embedding: List[float] class QueryResult(BaseModel): query: str results: List[DocumentChunkWithScore]