Source code for tooluniverse.biogrid_tool
"""
BioGRID Database REST API Tool
This tool provides access to protein and genetic interaction data from the BioGRID database.
BioGRID is a comprehensive database of physical and genetic interactions.
"""
import requests
from typing import Dict, Any, List
from .base_tool import BaseTool
from .tool_registry import register_tool
BIOGRID_BASE_URL = "https://webservice.thebiogrid.org"
[docs]
@register_tool("BioGRIDRESTTool")
class BioGRIDRESTTool(BaseTool):
"""
BioGRID Database REST API tool.
Generic wrapper for BioGRID API endpoints defined in ppi_tools.json.
"""
[docs]
def __init__(self, tool_config):
super().__init__(tool_config)
fields = tool_config.get("fields", {})
parameter = tool_config.get("parameter", {})
self.endpoint_template: str = fields.get("endpoint", "/interactions/")
self.required: List[str] = parameter.get("required", [])
self.output_format: str = fields.get("return_format", "JSON")
def _build_url(self, arguments: Dict[str, Any]) -> str | Dict[str, Any]:
"""Build URL for BioGRID API request."""
url_path = self.endpoint_template
return BIOGRID_BASE_URL + url_path
def _build_params(self, arguments: Dict[str, Any]) -> Dict[str, Any]:
"""Build parameters for BioGRID API request."""
params = {"format": "json", "interSpeciesExcluded": "false"}
# Check for API key
api_key = arguments.get("api_key") or arguments.get("accesskey")
if not api_key:
# Try to get from environment variable
import os
api_key = os.getenv("BIOGRID_API_KEY")
if not api_key:
raise ValueError(
"BioGRID API key is required. Please provide 'api_key' parameter "
"or set BIOGRID_API_KEY environment variable. "
"Register at: https://webservice.thebiogrid.org/"
)
params["accesskey"] = api_key
# Map gene names to BioGRID format
if "gene_names" in arguments:
gene_names = arguments["gene_names"]
if isinstance(gene_names, list):
params["geneList"] = "|".join(gene_names)
else:
params["geneList"] = str(gene_names)
# Add other parameters
if "organism" in arguments:
# Convert organism name to taxonomy ID
organism = arguments["organism"]
if organism.lower() == "homo sapiens":
params["organism"] = 9606
elif organism.lower() == "mus musculus":
params["organism"] = 10090
else:
params["organism"] = organism
if "interaction_type" in arguments:
interaction_type = arguments["interaction_type"]
if interaction_type == "physical":
params["evidenceList"] = "physical"
elif interaction_type == "genetic":
params["evidenceList"] = "genetic"
# "both" means no evidence filter
if "limit" in arguments:
params["max"] = arguments["limit"]
return params
def _make_request(self, url: str, params: Dict[str, Any]) -> Dict[str, Any]:
"""Perform a GET request and handle common errors."""
try:
response = requests.get(url, params=params, timeout=30)
response.raise_for_status()
if self.output_format == "JSON":
return response.json()
else:
return {"data": response.text}
except requests.exceptions.RequestException as e:
return {"error": f"Request failed: {str(e)}"}
except Exception as e:
return {"error": f"Unexpected error: {str(e)}"}
[docs]
def run(self, arguments: Dict[str, Any]) -> Dict[str, Any]:
"""Execute the tool with given arguments."""
# Validate required parameters
for param in self.required:
if param not in arguments:
return {"error": f"Missing required parameter: {param}"}
url = self._build_url(arguments)
if isinstance(url, dict) and "error" in url:
return url
params = self._build_params(arguments)
return self._make_request(url, params)