feat: integrate Paperless documents and volatile cache into Librarian
Build and Push / build (release) Successful in 54s

- Add Paperless document search to HybridRAG pipeline
- Add volatile cache (weather, forecast, news, stocks) to HybridRAG
- Add include_documents and include_volatile params to hybrid_search
- Add 📑 and ⚡ icons for document/volatile sources
- Update Librarian prompt with new data source awareness
- Fix Biographer routing: personal memory queries now route correctly
- Add location keywords to Steward pre-fetch logic

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
2025-12-30 13:31:23 +01:00
co-authored by Claude Opus 4.5
parent ba195e401a
commit 62eac3eb61
7 changed files with 84 additions and 11 deletions
+14 -2
View File
@@ -17,20 +17,26 @@ logger = get_logger(__name__)
async def hybrid_search(
query: str,
include_web: bool = True,
include_documents: bool = True,
include_volatile: bool = True,
) -> str:
"""
Search across all knowledge sources using HybridRAG.
This is the primary research tool, combining:
- Vector search (semantic similarity over documents)
- Vector search (semantic similarity over wiki pages)
- Knowledge graph (entities and relationships)
- Paperless documents (📑 indexed PDFs, scans, invoices)
- Volatile cache (⚡ weather, news, stocks - for user's configured items)
- Web search (current information from SearXNG)
Results are fused and re-ranked by relevance.
Results are fused and re-ranked by relevance. Volatile data gets priority when fresh.
Args:
query: Natural language research query
include_web: Whether to include web results (default: True)
include_documents: Whether to include Paperless documents (default: True)
include_volatile: Whether to include volatile cache data (default: True)
Returns:
Formatted search results with sources and context
@@ -38,12 +44,16 @@ async def hybrid_search(
Examples:
hybrid_search("How does Docker orchestration work with Kubernetes?")
hybrid_search("What projects use Neo4j?", include_web=False)
hybrid_search("Find my electricity invoices", include_web=False, include_volatile=False)
hybrid_search("What's the weather in Rotterdam?") # May hit volatile cache
"""
try:
async with LibraryDeskClient() as client:
response = await client.hybrid_search(
query=query,
web_limit=5 if include_web else 0,
document_limit=5 if include_documents else 0,
volatile_limit=3 if include_volatile else 0,
)
if not response.results:
@@ -70,6 +80,8 @@ async def hybrid_search(
"vector": "📄",
"graph": "🔗",
"web": "🌐",
"document": "📑",
"volatile": "⚡",
}.get(result.source, "•")
output_parts.append(