Source code for tooluniverse.clinical_trials_tool

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


[docs] @register_tool("ClinicalTrialsGovTool") class ClinicalTrialsGovTool(BaseTool): """ Tool for searching clinical trials using ClinicalTrials.gov API v2. """ BASE_URL = "https://clinicaltrials.gov/api/v2/studies"
[docs] def run(self, arguments: Dict[str, Any]) -> Dict[str, Any]: """ Executes the ClinicalTrials tool action. Args: arguments (Dict[str, Any]): Dictionary containing the action and its parameters. Expected keys: - action (str): "search_studies" or "get_study_details" - condition (str, optional): Condition to search for. - intervention (str, optional): Intervention/Drug to search for. - nct_id (str, optional): NCT ID for details. - limit (int, optional): Max results (default 10). Returns: Dict[str, Any]: The results. """ action = arguments.get("action") if action == "search_studies": return self.search_studies( condition=arguments.get("condition"), intervention=arguments.get("intervention"), limit=arguments.get("limit", 10), ) elif action == "get_study_details": nct_id = arguments.get("nct_id") if not nct_id: raise ValueError("nct_id is required for get_study_details") return self.get_study_details(nct_id) else: raise ValueError(f"Unknown action: {action}")
[docs] def search_studies( self, condition: Optional[str] = None, intervention: Optional[str] = None, limit: int = 10, ) -> Dict[str, Any]: """ Search for clinical trials. """ params = {"pageSize": limit, "format": "json"} if condition: params["query.cond"] = condition if intervention: params["query.intr"] = intervention try: response = requests.get(self.BASE_URL, params=params, timeout=30) response.raise_for_status() data = response.json() studies = [] for study in data.get("studies", []): proto = study.get("protocolSection", {}) ident = proto.get("identificationModule", {}) status = proto.get("statusModule", {}) studies.append( { "nctId": ident.get("nctId"), "title": ident.get("officialTitle") or ident.get("briefTitle"), "status": status.get("overallStatus"), "conditions": proto.get("conditionsModule", {}).get( "conditions", [] ), } ) return {"total_count": data.get("totalCount"), "studies": studies} except Exception as e: return {"error": str(e)}
[docs] def get_study_details(self, nct_id: str) -> Dict[str, Any]: """ Get full details for a study. """ url = f"{self.BASE_URL}/{nct_id}" try: response = requests.get(url, timeout=30) response.raise_for_status() data = response.json() proto = data.get("protocolSection", {}) return { "nctId": nct_id, "title": proto.get("identificationModule", {}).get("officialTitle"), "summary": proto.get("descriptionModule", {}).get("briefSummary"), "eligibility": proto.get("eligibilityModule", {}), "contacts": proto.get("contactsLocationsModule", {}), "full_data_link": url, } except Exception as e: return {"error": str(e)}