Source code for tooluniverse.biomodels_tool

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


[docs] @register_tool("BioModelsRESTTool") class BioModelsRESTTool(BaseRESTTool): """Generic REST tool for BioModels API endpoints."""
[docs] def _get_param_mapping(self) -> Dict[str, str]: """Map BioModels-specific parameter names.""" return { "limit": "numResults", # limit -> numResults # query and filename use their original names }
[docs] def _handle_special_endpoint( self, url: str, response: requests.Response, arguments: Dict[str, Any] ) -> Optional[Dict[str, Any]]: """Handle download endpoints specially.""" if "download" in url: content_disposition = response.headers.get("Content-Disposition", "") content_type = response.headers.get("Content-Type", "") # Wrap in data field for schema validation return { "status": "success", "data": { "download_url": url, "filename": content_disposition, "content_type": content_type, }, "url": url, } return None
[docs] def _process_response( self, response: requests.Response, url: str ) -> Dict[str, Any]: """Process BioModels API response.""" data = response.json() # Build result result = { "status": "success", "data": data, "url": url, } # Add count for lists or search results if isinstance(data, list): result["count"] = len(data) elif isinstance(data, dict) and "matches" in data: # matches is an integer count, not a list result["count"] = data.get("matches", 0) return result