Source code for tooluniverse.dgidb_tool

# dgidb_tool.py
"""
DGIdb (Drug Gene Interaction Database) API tool for ToolUniverse.

DGIdb is a comprehensive database of drug-gene interactions and
druggable genes aggregated from multiple sources.

API Documentation: https://www.dgidb.org/api
"""

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

# Base URL for DGIdb GraphQL API
DGIDB_BASE_URL = "https://dgidb.org/api/graphql"


[docs] @register_tool("DGIdbTool") class DGIdbTool(BaseTool): """ Tool for querying DGIdb REST API. DGIdb provides drug-gene interaction data including: - Drug-gene interactions from 30+ sources - Druggability annotations - Gene categories (kinase, ion channel, etc.) No authentication required. Free for academic/research use. """
[docs] def __init__(self, tool_config: Dict[str, Any]): super().__init__(tool_config) self.timeout = tool_config.get("timeout", 30) self.operation = tool_config.get("fields", {}).get("operation", "interactions")
[docs] def run(self, arguments: Dict[str, Any]) -> Dict[str, Any]: """Execute the DGIdb API call.""" operation = self.operation if operation == "interactions": return self._get_interactions(arguments) elif operation == "genes": return self._get_genes(arguments) elif operation == "drugs": return self._get_drugs(arguments) elif operation == "categories": return self._get_gene_categories(arguments) else: return {"error": f"Unknown operation: {operation}"}
[docs] def _get_interactions(self, arguments: Dict[str, Any]) -> Dict[str, Any]: """ Get drug-gene interactions for genes using GraphQL. """ genes = arguments.get("genes", []) if not genes: return {"error": "genes parameter is required (list of gene symbols)"} if isinstance(genes, str): genes = [g.strip() for g in genes.split(",")] # GraphQL query for interactions query = """ query GetInteractions($genes: [String!]!) { genes(names: $genes) { nodes { name longName interactions { drug { name conceptId } interactionTypes { type } sources { fullName } } } } } """ try: response = requests.post( DGIDB_BASE_URL, json={"query": query, "variables": {"genes": genes}}, headers={"Content-Type": "application/json"}, timeout=self.timeout, ) response.raise_for_status() return response.json() except requests.RequestException as e: return {"error": f"DGIdb API request failed: {str(e)}"}
[docs] def _get_genes(self, arguments: Dict[str, Any]) -> Dict[str, Any]: """ Get gene information including druggability using GraphQL. """ genes = arguments.get("genes", []) if not genes: return {"error": "genes parameter is required"} if isinstance(genes, str): genes = [g.strip() for g in genes.split(",")] query = """ query GetGenes($genes: [String!]!) { genes(names: $genes) { nodes { name longName geneCategories { name } } } } """ try: response = requests.post( DGIDB_BASE_URL, json={"query": query, "variables": {"genes": genes}}, headers={"Content-Type": "application/json"}, timeout=self.timeout, ) response.raise_for_status() return response.json() except requests.RequestException as e: return {"error": f"DGIdb API request failed: {str(e)}"}
[docs] def _get_drugs(self, arguments: Dict[str, Any]) -> Dict[str, Any]: """ Get drug information using GraphQL. """ drugs = arguments.get("drugs", []) if not drugs: return {"error": "drugs parameter is required"} if isinstance(drugs, str): drugs = [d.strip() for d in drugs.split(",")] query = """ query GetDrugs($drugs: [String!]!) { drugs(names: $drugs) { nodes { name conceptId approved } } } """ try: response = requests.post( DGIDB_BASE_URL, json={"query": query, "variables": {"drugs": drugs}}, headers={"Content-Type": "application/json"}, timeout=self.timeout, ) response.raise_for_status() return response.json() except requests.RequestException as e: return {"error": f"DGIdb API request failed: {str(e)}"}
[docs] def _get_gene_categories(self, arguments: Dict[str, Any]) -> Dict[str, Any]: """ Get gene categories (druggability annotations) using GraphQL. """ genes = arguments.get("genes", []) if not genes: return {"error": "genes parameter is required"} if isinstance(genes, str): genes = [g.strip() for g in genes.split(",")] query = """ query GetGeneCategories($genes: [String!]!) { genes(names: $genes) { nodes { name longName geneCategories { name } } } } """ try: response = requests.post( DGIDB_BASE_URL, json={"query": query, "variables": {"genes": genes}}, headers={"Content-Type": "application/json"}, timeout=self.timeout, ) response.raise_for_status() return response.json() except requests.RequestException as e: return {"error": f"DGIdb API request failed: {str(e)}"}