Spaces:
Running
Running
| """ | |
| Database tool: wraps Neo4j and MongoDB for agent read/write operations. | |
| """ | |
| from typing import Any, Dict, List, Optional | |
| from tools.base_tool import BaseTool, ToolResult | |
| from services.neo4j_service import Neo4jService | |
| from services.mongo_service import MongoService | |
| from utils.logger import get_logger | |
| logger = get_logger("database_tool") | |
| class Neo4jTool(BaseTool): | |
| name = "neo4j_query" | |
| description = "Run Cypher queries against the knowledge graph." | |
| def __init__(self, neo4j: Neo4jService): | |
| self.neo4j = neo4j | |
| async def run(self, query: str, write: bool = False, **params) -> ToolResult: | |
| try: | |
| if write: | |
| results = self.neo4j.run_write(query, **params) | |
| else: | |
| results = self.neo4j.run(query, **params) | |
| return self._ok(results) | |
| except Exception as e: | |
| logger.error(f"Neo4j query failed: {e}") | |
| return self._err(str(e)) | |
| class MongoTool(BaseTool): | |
| name = "mongo_job" | |
| description = "Read/write job state and results in MongoDB." | |
| def __init__(self, mongo: MongoService): | |
| self.mongo = mongo | |
| async def run( | |
| self, | |
| operation: str, | |
| job_id: str, | |
| data: Optional[Dict] = None, | |
| ) -> ToolResult: | |
| try: | |
| if operation == "get_job": | |
| result = await self.mongo.get_job(job_id) | |
| elif operation == "get_result": | |
| result = await self.mongo.get_result(job_id) | |
| elif operation == "save_result": | |
| await self.mongo.save_result(job_id, data or {}) | |
| result = {"saved": True} | |
| elif operation == "upsert_job": | |
| await self.mongo.upsert_job(job_id, data or {}) | |
| result = {"upserted": True} | |
| else: | |
| return self._err(f"Unknown operation: {operation}") | |
| return self._ok(result) | |
| except Exception as e: | |
| logger.error(f"Mongo operation '{operation}' failed: {e}") | |
| return self._err(str(e)) | |