TrialPath / trialpath /agent /guidelines.py
yakilee's picture
style: apply ruff format to entire codebase
e46883d
"""Parlant guideline configuration for the TrialPath agent."""
from parlant.sdk import Agent, Guideline
from trialpath.agent.tools import (
analyze_gaps,
evaluate_trial_eligibility,
extract_patient_profile,
generate_search_anchors,
refine_search_query,
relax_search_query,
search_clinical_trials,
)
GUIDELINE_SPECS: list[dict] = [
# INGEST guidelines
{
"condition": "the patient uploads medical documents",
"action": (
"Extract a structured patient profile from the uploaded documents "
"using the extract_patient_profile tool"
),
"tools": [extract_patient_profile],
"phase": "INGEST",
},
{
"condition": "the extracted patient profile is missing critical data like stage or ECOG",
"action": (
"Ask the patient to provide the missing critical information "
"or upload additional documents"
),
"tools": [],
"phase": "INGEST",
},
# PRESCREEN guidelines
{
"condition": "the patient profile is confirmed and complete",
"action": (
"Generate search anchors from the patient profile and search "
"for matching clinical trials using generate_search_anchors "
"then search_clinical_trials"
),
"tools": [generate_search_anchors, search_clinical_trials],
"phase": "PRESCREEN",
},
{
"condition": "the trial search returns more than 50 results",
"action": (
"Refine the search query to reduce the result set using the refine_search_query tool"
),
"tools": [refine_search_query],
"phase": "PRESCREEN",
},
{
"condition": "the trial search returns 0 results",
"action": (
"Relax the search query to broaden the result set using the relax_search_query tool"
),
"tools": [relax_search_query],
"phase": "PRESCREEN",
},
# VALIDATE_TRIALS guideline
{
"condition": "there are trial candidates to evaluate",
"action": (
"Evaluate each trial candidate's eligibility using the "
"evaluate_trial_eligibility tool with dual-model approach"
),
"tools": [evaluate_trial_eligibility],
"phase": "VALIDATE_TRIALS",
},
# GAP_FOLLOWUP guideline
{
"condition": "eligibility evaluation reveals unknown criteria or gaps",
"action": (
"Analyze gaps across all evaluated trials and present actionable "
"next steps using the analyze_gaps tool"
),
"tools": [analyze_gaps],
"phase": "GAP_FOLLOWUP",
},
# SUMMARY guideline
{
"condition": "all trials have been evaluated and gaps analyzed",
"action": (
"Generate a comprehensive summary report with eligible, uncertain, "
"and ineligible trial counts plus a doctor packet for export"
),
"tools": [],
"phase": "SUMMARY",
},
# Global guidelines
{
"condition": "the patient asks about a specific NCT trial by ID",
"action": (
"Look up the specific trial using the search_clinical_trials tool "
"with the provided NCT ID"
),
"tools": [search_clinical_trials],
"phase": "GLOBAL",
},
{
"condition": "the patient seems confused or asks for help",
"action": (
"Explain the current step in the journey, what data is needed, "
"and what will happen next in simple, empathetic language"
),
"tools": [],
"phase": "GLOBAL",
},
{
"condition": "the conversation involves medical information or clinical decisions",
"action": (
"Include a disclaimer that this tool is for informational purposes only "
"and does not constitute medical advice. Recommend consulting with "
"their healthcare provider"
),
"tools": [],
"phase": "GLOBAL",
},
]
async def configure_guidelines(agent: Agent) -> list[Guideline]:
"""Configure all guidelines on the given agent.
Returns the list of created Guideline objects.
"""
guidelines = []
for spec in GUIDELINE_SPECS:
guideline = await agent.create_guideline(
condition=spec["condition"],
action=spec["action"],
tools=spec["tools"],
)
guidelines.append(guideline)
return guidelines