File size: 2,460 Bytes
881aff7
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
4f6fcea
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
881aff7
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
"""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()