Agentic-Support-Copilot / app /engine /context_builder.py
Vineetiitg
feat: add cited answers and configurable retrieval
aaa6ad5
Raw
History Blame Contribute Delete
1.98 kB
from langchain_core.documents import Document
from app.core.config import settings
def build_context(documents: list[Document]) -> str:
parts: list[str] = []
total_chars = 0
for document in dedupe_documents(documents):
source = document.metadata.get("source", "unknown")
page = document.metadata.get("page")
label = f"{source}, page {page}" if page else source
content = document.page_content.strip()
block = f"Source: {label}\n{content}"
if total_chars + len(block) > settings.MAX_CONTEXT_CHARS:
break
parts.append(block)
total_chars += len(block)
return "\n\n".join(parts)
def dedupe_documents(documents: list[Document]) -> list[Document]:
seen: set[str] = set()
unique: list[Document] = []
for document in documents:
key = document.metadata.get("chunk_id") or document.page_content[:120]
if key in seen:
continue
seen.add(key)
unique.append(document)
return unique
def source_citations(documents: list[Document]) -> list[dict]:
citations: list[dict] = []
for document in dedupe_documents(documents):
snippet = " ".join(document.page_content.split())[:240]
citations.append(
{
"source": document.metadata.get("source", "unknown"),
"page": document.metadata.get("page"),
"chunk_id": document.metadata.get("chunk_id"),
"doc_id": document.metadata.get("doc_id"),
"snippet": snippet,
}
)
return citations
def format_sources(documents: list[Document]) -> str:
citations = source_citations(documents)
if not citations:
return ""
lines = ["", "Sources:"]
for citation in citations:
page = f", page {citation['page']}" if citation.get("page") else ""
lines.append(f"- {citation['source']}{page}: {citation['snippet']}")
return "\n".join(lines)