from typing import Literal from llama_index.schema import NodeWithScore from pydantic import BaseModel, Field from app.server.ingest.schemas import IngestedDoc class Chunk(BaseModel): object: Literal["context.chunk"] score: float = Field(examples=[0.023]) document: IngestedDoc text: str = Field(examples=["Outbound sales increased 20%, driven by new leads."]) previous_texts: list[str] | None = Field( default=None, examples=[["SALES REPORT 2023", "Inbound didn't show major changes."]], ) next_texts: list[str] | None = Field( default=None, examples=[ [ "New leads came from Google Ads campaign.", "The campaign was run by the Marketing Department", ] ], ) @classmethod def from_node(cls: type["Chunk"], node: NodeWithScore) -> "Chunk": doc_id = node.node.ref_doc_id if node.node.ref_doc_id is not None else "-" return cls( object="context.chunk", score=node.score or 0.0, document=IngestedDoc( object="ingest.document", doc_id=doc_id, doc_metadata=node.metadata, ), text=node.get_content(), ) class Completion(BaseModel): response: str sources: list[Chunk] | None = None