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,
}