Source code for tooluniverse.zenodo_tool

import requests
from typing import Any, Dict
from .base_tool import BaseTool
from .base_rest_tool import BaseRESTTool
from .tool_registry import register_tool


[docs] @register_tool("ZenodoRESTTool") class ZenodoRESTTool(BaseRESTTool): """Generic REST tool for Zenodo API endpoints."""
[docs] def _get_param_mapping(self) -> Dict[str, str]: """Map Zenodo-specific parameter names.""" return { "query": "q", # query -> q "limit": "size", # limit -> size "community": "communities", # community -> communities }
[docs] def _process_response( self, response: requests.Response, url: str ) -> Dict[str, Any]: """Process Zenodo API response with search result handling.""" data = response.json() # Handle extract_path for nested data (e.g., files from record) extract_path = self.tool_config.get("fields", {}).get("extract_path") if extract_path and isinstance(data, dict): data = data.get(extract_path, data) # Build result result = { "status": "success", "data": data, "url": url, } # Add count - handle both list and search results if isinstance(data, list): result["count"] = len(data) elif isinstance(data, dict) and "hits" in data: # For search results result["count"] = len(data.get("hits", {}).get("hits", [])) return result