Source code for tooluniverse.gtopdb_tool

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


[docs] @register_tool("GtoPdbRESTTool") class GtoPdbRESTTool(BaseTool):
[docs] def __init__(self, tool_config: Dict): super().__init__(tool_config) self.base_url = "https://www.guidetopharmacology.org/services" self.session = requests.Session() self.session.headers.update({"Accept": "application/json"}) self.timeout = 30
[docs] def _build_url(self, args: Dict[str, Any]) -> str: """Build URL with path parameters and query parameters.""" url = self.tool_config["fields"]["endpoint"] query_params = {} # Separate path params from query params path_params = {} for k, v in args.items(): if f"{{{k}}}" in url: # This is a path parameter path_params[k] = v else: # This is a query parameter query_params[k] = v # Replace path parameters in URL for k, v in path_params.items(): url = url.replace(f"{{{k}}}", str(v)) # Build query string for remaining parameters if query_params: # Map parameter names to GtoPdb API parameter names param_mapping = { "target_type": "type", "ligand_type": "type", "action_type": "type", "affinity_parameter": "affinityParameter", "min_affinity": "affinity", "approved_only": "approved", } api_params = {} for k, v in query_params.items(): # Skip limit as it's handled separately if k == "limit": continue # Map parameter name api_key = param_mapping.get(k, k) # Convert boolean to lowercase string for API if isinstance(v, bool): v = str(v).lower() api_params[api_key] = v # Build query string if api_params: from urllib.parse import urlencode url = f"{url}?{urlencode(api_params)}" return url
[docs] def run(self, arguments: Dict[str, Any]) -> Dict[str, Any]: url = None try: url = self._build_url(arguments) response = request_with_retry( self.session, "GET", url, timeout=self.timeout, max_attempts=3 ) if response.status_code != 200: return { "status": "error", "error": "GtoPdb API error", "url": url, "status_code": response.status_code, "detail": (response.text or "")[:500], } data = response.json() # Apply limit if specified limit = arguments.get("limit", 20) if isinstance(data, list) and len(data) > limit: data = data[:limit] return { "status": "success", "data": data, "url": url, "count": len(data) if isinstance(data, list) else 1, } except Exception as e: return { "status": "error", "error": f"GtoPdb API error: {str(e)}", "url": url, }