12 KiB
12 KiB
title, task, lineage_type, upstream_source, upstream_sha, imported_at, prompt_class, upstream_changes, author, validated
| title | task | lineage_type | upstream_source | upstream_sha | imported_at | prompt_class | upstream_changes | author | validated |
|---|---|---|---|---|---|---|---|---|---|
| Trial Search Patterns & Execution Strategy | import | https://github.com/mims-harvard/ToolUniverse/blob/e2520a96/skills/tooluniverse-clinical-trial-matching/TRIAL_SEARCH_PATTERNS.md | e2520a96 | 2026-06-26 | prompt | accepted | upstream | false |
Trial Search Patterns & Execution Strategy
Trial Search Functions
Disease-Based Search
def search_trials_by_disease(tu, disease_name, status_filter=None, phase_filter=None, page_size=20):
"""Search ClinicalTrials.gov by disease/condition."""
query_parts = []
if status_filter:
query_parts.append(f'AREA[OverallStatus]{status_filter}')
if phase_filter:
query_parts.append(phase_filter)
query_term = ' AND '.join(query_parts) if query_parts else disease_name
result = tu.tools.search_clinical_trials(
condition=disease_name,
query_term=query_term if query_parts else disease_name,
pageSize=page_size
)
if isinstance(result, str):
return []
return result.get('studies', [])
Biomarker-Specific Search
def search_trials_by_biomarker(tu, gene_symbol, alteration, disease_name=None, page_size=15):
"""Search trials mentioning specific biomarkers."""
biomarker_query = f'{gene_symbol} {alteration}' if alteration else gene_symbol
result = tu.tools.search_clinical_trials(
condition=disease_name if disease_name else '',
query_term=biomarker_query,
pageSize=page_size
)
if isinstance(result, str):
return []
return result.get('studies', [])
Intervention-Based Search
def search_trials_by_intervention(tu, drug_name, disease_name=None, page_size=10):
"""Search trials by intervention/drug name."""
result = tu.tools.search_clinical_trials(
condition=disease_name if disease_name else '',
intervention=drug_name,
query_term=drug_name,
pageSize=page_size
)
if isinstance(result, str):
return []
return result.get('studies', [])
Alternative Search (ClinicalTrials_search_studies)
def search_trials_alternative(tu, condition, intervention=None, limit=10):
"""Alternative trial search with different API endpoint."""
params = {
'action': 'search_studies',
'condition': condition,
'limit': limit
}
if intervention:
params['intervention'] = intervention
result = tu.tools.ClinicalTrials_search_studies(**params)
return result.get('studies', [])
Deduplication
def deduplicate_trials(trial_lists):
"""Merge and deduplicate trials from multiple searches."""
seen_ncts = set()
unique_trials = []
for trials in trial_lists:
for trial in trials:
nct = trial.get('NCT ID') or trial.get('nctId', '')
if nct and nct not in seen_ncts:
seen_ncts.add(nct)
unique_trials.append(trial)
return unique_trials
Batch Trial Detail Retrieval (Phase 3)
All batch functions process NCT IDs in groups of 10:
def get_trial_eligibility(tu, nct_ids):
all_criteria = []
for i in range(0, len(nct_ids), 10):
batch = nct_ids[i:i+10]
result = tu.tools.get_clinical_trial_eligibility_criteria(nct_ids=batch, eligibility_criteria='all')
if isinstance(result, list):
all_criteria.extend(result)
return all_criteria
def get_trial_interventions(tu, nct_ids):
all_interventions = []
for i in range(0, len(nct_ids), 10):
batch = nct_ids[i:i+10]
result = tu.tools.get_clinical_trial_conditions_and_interventions(nct_ids=batch, condition_and_intervention='all')
if isinstance(result, list):
all_interventions.extend(result)
return all_interventions
def get_trial_locations(tu, nct_ids):
all_locations = []
for i in range(0, len(nct_ids), 10):
batch = nct_ids[i:i+10]
result = tu.tools.get_clinical_trial_locations(nct_ids=batch, location='all')
if isinstance(result, list):
all_locations.extend(result)
return all_locations
def get_trial_status(tu, nct_ids):
all_status = []
for i in range(0, len(nct_ids), 10):
batch = nct_ids[i:i+10]
result = tu.tools.get_clinical_trial_status_and_dates(nct_ids=batch, status_and_date='all')
if isinstance(result, list):
all_status.extend(result)
return all_status
def get_trial_descriptions(tu, nct_ids):
all_descriptions = []
for i in range(0, len(nct_ids), 10):
batch = nct_ids[i:i+10]
result = tu.tools.get_clinical_trial_descriptions(nct_ids=batch, description_type='full')
if isinstance(result, list):
all_descriptions.extend(result)
return all_descriptions
Geographic & Feasibility Analysis (Phase 7)
def analyze_trial_locations(locations_data, patient_location=None):
"""Analyze trial site locations and proximity."""
if not locations_data:
return {'total_sites': 0, 'countries': [], 'us_states': [], 'nearest': None}
locations = locations_data.get('locations', [])
countries = list(set(loc.get('country', '') for loc in locations if loc.get('country')))
us_states = list(set(loc.get('state', '') for loc in locations if loc.get('country') == 'United States' and loc.get('state')))
return {
'total_sites': len(locations),
'countries': countries,
'us_states': us_states,
'has_us_sites': 'United States' in countries,
'locations': locations[:10]
}
Alternative Options (Phase 8)
Basket Trial Search
IMPORTANT: ClinicalTrials.gov search is sensitive to query complexity. Overly specific queries like "NTRK fusion tumor agnostic" may return zero results. Use simpler queries and combine results.
def search_basket_trials(tu, biomarker, page_size=10):
query_terms = [
f'{biomarker} solid tumor',
f'{biomarker}',
f'{biomarker} basket',
]
all_trials = []
for query in query_terms:
result = tu.tools.search_clinical_trials(query_term=query, pageSize=page_size)
if not isinstance(result, str):
all_trials.extend(result.get('studies', []))
return deduplicate_trials([all_trials])
Expanded Access Search
def search_expanded_access(tu, drug_name):
result = tu.tools.search_clinical_trials(query_term=f'{drug_name} expanded access', pageSize=5)
if isinstance(result, str):
return []
return result.get('studies', [])
Parallelization Opportunities
Parallel Group 1 (Phase 1 - all simultaneous):
MyGene_query_genesfor each geneOpenTargets_get_disease_id_description_by_namefor diseaseols_search_efo_termsfor diseasefda_pharmacogenomic_biomarkers(no params)
Parallel Group 2 (Phase 2 - all simultaneous):
search_clinical_trialswith disease conditionsearch_clinical_trialswith biomarker querysearch_clinical_trialswith intervention queryClinicalTrials_search_studiesas alternative
Parallel Group 3 (Phase 3 - all simultaneous):
get_clinical_trial_eligibility_criteriafor all NCT IDsget_clinical_trial_conditions_and_interventionsfor all NCT IDsget_clinical_trial_locationsfor all NCT IDsget_clinical_trial_status_and_datesfor all NCT IDsget_clinical_trial_descriptionsfor all NCT IDs
Parallel Group 4 (Phases 5-6 - for each drug):
OpenTargets_get_drug_id_description_by_namefor drugOpenTargets_get_drug_mechanisms_of_action_by_chemblIdfor drugFDA_get_indications_by_drug_namefor drugPubMed_search_articlesfor evidence
Performance Optimization
- Batch NCT IDs in groups of 10 for detail tools
- Limit initial search to 20-30 trials per search strategy
- Focus detailed analysis on top 15-20 candidates after initial filtering
- Cache gene/disease resolution results for reuse across phases
Error Handling
For each tool call:
- Wrap in try/except
- Check for empty results
- Use fallback tools when primary fails
- Document what failed in completeness checklist
- Never let one failure block the entire analysis
Common Use Patterns
Pattern 1: Targeted Therapy Matching (Most Common)
Input: "NSCLC patient with EGFR L858R, failed platinum chemotherapy"
- Resolve: NSCLC -> EFO_0003060, EGFR -> ENSG00000146648
- Search: "non-small cell lung cancer" + "EGFR mutation" + "EGFR L858R"
- Filter: Recruiting trials with EGFR molecular requirements
- Match: Score trials by EGFR L858R specificity
- Drugs: Identify TKIs (osimertinib, erlotinib, etc.) in trial arms
- Evidence: Check FDA approval of EGFR TKIs for NSCLC
- Report: Prioritize targeted therapy trials, include immunotherapy options
Pattern 2: Immunotherapy Selection
Input: "Melanoma, TMB-high, PD-L1 positive, failed ipilimumab"
- Resolve: Melanoma -> EFO_0000756
- Search: "melanoma" + "TMB" + "PD-L1" + "immunotherapy"
- Filter: Trials requiring PD-L1 or TMB testing
- Match: Score by TMB/PD-L1 requirements
- Drugs: Identify checkpoint inhibitors (pembrolizumab, nivolumab)
- Evidence: Check FDA approval for TMB-high indications
- Report: Focus on anti-PD-1/PD-L1 trials, combination immunotherapy
Pattern 3: Basket Trial Identification
Input: "Any solid tumor with NTRK fusion"
- Resolve: NTRK genes (NTRK1, NTRK2, NTRK3)
- Search: "NTRK fusion" + "tumor agnostic" + "basket"
- Filter: Biomarker-agnostic trials
- Match: Score by NTRK-specific inclusion criteria
- Drugs: Identify larotrectinib, entrectinib
- Evidence: FDA tissue-agnostic approval for larotrectinib
- Report: Highlight tumor-agnostic approval, broad eligibility
Pattern 4: Post-Progression Options
Input: "Breast cancer, failed CDK4/6 inhibitors, ESR1 mutation"
- Resolve: Breast cancer -> EFO_0000305, ESR1 -> ENSG00000091831
- Search: "breast cancer" + "ESR1" + "CDK4/6 resistance"
- Filter: Trials for post-CDK4/6 setting
- Match: Score by ESR1 mutation and prior treatment requirements
- Drugs: Identify novel endocrine agents, SERDs, ESR1-targeting drugs
- Evidence: Check clinical data for post-CDK4/6 options
- Report: Focus on resistance-overcoming strategies
Pattern 5: Geographic Search
Input: "Lung cancer trials within 100 miles of Boston"
- Search: "lung cancer" (broad)
- Get locations for all candidate trials
- Filter: Sites in Massachusetts and nearby states
- Score: High geographic feasibility for Boston-area sites
- Report: Prioritize by proximity, include contact info
Edge Case Handling
No Matching Trials Found
- Broaden search to gene-level (remove specific variant)
- Search for pathway-level trials
- Search basket trials
- Suggest additional biomarker testing
- Report alternative options (off-label, compassionate use)
Rare Biomarkers
- Search gene-level trials (any EGFR mutation)
- Search mechanism-level trials (TKI trials)
- Check CIViC for any evidence on this specific variant
- Note variant rarity in report
- Suggest discussion with molecular tumor board
Multiple Biomarkers
- Search for each biomarker independently
- Search for combination biomarker trials
- Identify trials that require multiple biomarkers
- Score based on most actionable biomarker
- Flag potential synergistic drug targets
Conflicting Eligibility
- Score partial match transparently
- Highlight which criteria are met/unmet
- Note if unmet criteria are waivable
- Suggest contacting PI for edge cases
- Provide alternative trials without conflicting criteria