Spaces:
Sleeping
Sleeping
| # File: orchestrator/dispatcher.py | |
| import uuid | |
| import yaml | |
| from orchestrator.client import MCPClient | |
| class Dispatcher: | |
| """ | |
| Coordinates calls to various MCP servers for searching, code execution, and graph retrieval. | |
| """ | |
| def __init__(self, config_path="config.yaml"): | |
| cfg = yaml.safe_load(open(config_path)) | |
| servers = cfg.get("mcp_servers", {}) | |
| self.web = MCPClient(servers.get("web_search")) | |
| self.pubmed = MCPClient(servers.get("pubmed")) | |
| self.chroma = MCPClient(servers.get("chroma")) | |
| self.runner = MCPClient(servers.get("python_run")) | |
| def search_papers(self, query: str, limit: int = 5): | |
| """ | |
| Fan out search requests to web and PubMed MCP servers, aggregate and limit. | |
| """ | |
| results = [] | |
| try: | |
| results += self.web.call("web_search.search", {"q": query}) | |
| except Exception: | |
| pass | |
| try: | |
| results += self.pubmed.call("metatool.query", {"source": "PubMed", "q": query}) | |
| except Exception: | |
| pass | |
| # Deduplicate by id | |
| unique = {paper["id"]: paper for paper in results} | |
| return list(unique.values())[:limit] | |
| def get_notebook_cells(self, paper_id: str): | |
| """ | |
| Retrieve code cells for reproducible example from the Python-run MCP server. | |
| """ | |
| try: | |
| resp = self.runner.call("mcp-run-python.execute", {"paper_id": paper_id}) | |
| return resp.get("cells", []) | |
| except Exception: | |
| return [] | |
| def get_graph(self, paper_id: str): | |
| """ | |
| Retrieve a knowledge graph representation for a paper from the Chroma MCP server. | |
| """ | |
| try: | |
| return self.chroma.call("chroma.query_graph", {"id": paper_id}) | |
| except Exception: | |
| return {"nodes": [], "edges": []} |