"""Bibliographic search and summary context for the WaterScope HF Space.""" from __future__ import annotations import json import os from pathlib import Path _ROOT = Path(__file__).resolve().parent def _configure_paths() -> None: os.environ.setdefault("PAPER_CSV", str(_ROOT / "metadata_search" / "data" / "papers.csv")) os.environ.setdefault("METADATA_QDRANT_PATH", str(_ROOT / "metadata_search_data" / "qdrant")) os.environ.setdefault("LOCAL_RAG_DATA_DIR", str(_ROOT / "local_rag_data")) os.environ.setdefault("PAPER_SUMMARIES_DIR", str(_ROOT / "paper_summaries")) os.environ.setdefault("METADATA_SEMANTIC_SEARCH", os.getenv("METADATA_SEMANTIC_SEARCH", "1")) os.environ.setdefault("METADATA_AUTO_REBUILD", "0") _configure_paths() from mcp_tools.local_rag_tools import build_paper_context_tool from mcp_tools.metadata_tools import search_metadata_tool, select_papers_from_search_tool def search_papers( query: str, top_k: int = 10, year_from: int | None = None, year_to: int | None = None, ) -> dict: return json.loads( search_metadata_tool( query, top_k=top_k, year_from=year_from, year_to=year_to, ) ) def select_papers( query: str, ranks: list[int], top_k: int = 10, year_from: int | None = None, year_to: int | None = None, ) -> dict: return json.loads( select_papers_from_search_tool( query, ranks, top_k=top_k, year_from=year_from, year_to=year_to, ) ) def build_context(document_ids: list[str], question: str = "") -> dict: return json.loads(build_paper_context_tool(document_ids, question=question)) def format_search_results(payload: dict) -> str: lines: list[str] = [] for row in payload.get("results", []): authors = (row.get("authors_display") or row.get("authors") or "").strip() lines.append(f"{row.get('rank')}. {row.get('title')} ({row.get('year', 'n.d.')})") if authors: lines.append(f" {authors}") abstract = (row.get("abstract") or "").strip() if abstract: lines.append(f" {abstract[:220]}{'…' if len(abstract) > 220 else ''}") lines.append("") if not lines: return "No papers matched that query." mode = payload.get("score_mode", "rrf") return f"Score mode: {mode}\n\n" + "\n".join(lines).strip()