"""Public retrieval API — thin wrapper around RetrievalRouter.""" from typing import Any from sqlalchemy.ext.asyncio import AsyncSession from src.middlewares.logging import get_logger from src.rag.retrievers.document import document_retriever from src.rag.retrievers.schema import schema_retriever from src.rag.router import RetrievalRouter, SourceHint logger = get_logger("retriever") class RetrieverService: """Public retrieval service used by chat.py and search tools. Delegates to RetrievalRouter which dispatches based on source_hint. Returns List[Dict] to preserve backward compatibility with chat.py. """ def __init__(self): self._router = RetrievalRouter( schema_retriever=schema_retriever, document_retriever=document_retriever, ) async def retrieve( self, query: str, user_id: str, db: AsyncSession, k: int = 5, source_hint: SourceHint = "both", ) -> list[dict[str, Any]]: try: results = await self._router.retrieve(query, user_id, source_hint, k) return [{"content": r.content, "metadata": r.metadata} for r in results] except Exception as e: logger.error("retrieval failed", error=str(e)) return [] retriever = RetrieverService()