Setup
Copy
# Create environment
python3 -m venv venv && source venv/bin/activate
# Install packages
pip install praisonaiagents praisonai
# Set API key
export OPENAI_API_KEY="your-key"
Create Sample Data
Copy
# Create patient genetic data
cat > genetics.json << 'EOF'
{
"PAT001": {"CYP2D6": "rapid_metabolizer", "CYP2C19": "normal", "DPYD": "poor_metabolizer", "HLA_B5701": false},
"PAT002": {"CYP2D6": "normal", "CYP2C19": "poor_metabolizer", "DPYD": "normal", "HLA_B5701": true},
"PAT003": {"CYP2D6": "ultra_rapid", "CYP2C19": "normal", "DPYD": "normal", "HLA_B5701": false}
}
EOF
# Create drug database
cat > drugs.json << 'EOF'
{
"metformin": {"class": "biguanide", "cyp_metabolism": false, "contraindications": ["renal_failure"]},
"codeine": {"class": "opioid", "cyp_metabolism": "CYP2D6", "contraindications": ["respiratory_depression"]},
"clopidogrel": {"class": "antiplatelet", "cyp_metabolism": "CYP2C19", "contraindications": ["bleeding_disorder"]},
"abacavir": {"class": "NRTI", "cyp_metabolism": false, "hla_b5701_required": true, "contraindications": []}
}
EOF
Run: Python Code
Copy
from praisonaiagents import Agent, AgentTeam, Task, tool
from pydantic import BaseModel
from typing import List
import json
# Structured output
class TreatmentProtocol(BaseModel):
patient_id: str
recommended_drugs: List[str]
contraindicated_drugs: List[str]
dosage_adjustments: List[str]
monitoring_requirements: List[str]
genetic_warnings: List[str]
# Database persistence is configured via memory={} parameter
# Tools
@tool
def get_genetic_profile(patient_id: str) -> str:
"""Get patient genetic profile."""
with open("genetics.json") as f:
genetics = json.load(f)
return json.dumps(genetics.get(patient_id, {}))
@tool
def get_drug_info(drug_name: str) -> str:
"""Get drug information."""
with open("drugs.json") as f:
drugs = json.load(f)
return json.dumps(drugs.get(drug_name, {}))
@tool
def check_drug_gene_interaction(drug_name: str, cyp2d6: str, cyp2c19: str, hla_b5701: bool) -> str:
"""Check drug-gene interactions."""
with open("drugs.json") as f:
drugs = json.load(f)
drug = drugs.get(drug_name, {})
warnings = []
dosage_adj = "standard"
# CYP2D6 interactions
if drug.get("cyp_metabolism") == "CYP2D6":
if cyp2d6 == "ultra_rapid":
warnings.append(f"{drug_name}: ultra-rapid CYP2D6 - increased toxicity risk")
dosage_adj = "reduce_50%"
elif cyp2d6 == "poor_metabolizer":
warnings.append(f"{drug_name}: poor CYP2D6 - reduced efficacy")
dosage_adj = "increase_or_alternative"
# CYP2C19 interactions
if drug.get("cyp_metabolism") == "CYP2C19":
if cyp2c19 == "poor_metabolizer":
warnings.append(f"{drug_name}: poor CYP2C19 - reduced activation")
dosage_adj = "alternative_required"
# HLA-B*5701 check
if drug.get("hla_b5701_required") and hla_b5701:
warnings.append(f"{drug_name}: CONTRAINDICATED - HLA-B*5701 positive")
dosage_adj = "contraindicated"
return json.dumps({"drug": drug_name, "warnings": warnings, "dosage_adjustment": dosage_adj})
# Agents
geneticist = Agent(
name="Pharmacogeneticist",
instructions="Analyze patient genetics. Use get_genetic_profile tool.",
tools=[get_genetic_profile],
memory={
"db": "sqlite:///medicine.db",
"session_id": "medicine-protocol"
}
)
pharmacist = Agent(
name="ClinicalPharmacist",
instructions="Check drug interactions. Use get_drug_info and check_drug_gene_interaction tools.",
tools=[get_drug_info, check_drug_gene_interaction]
)
physician = Agent(
name="Physician",
instructions="Generate treatment protocol based on genetic and drug analysis."
)
# Tasks
genetic_task = Task(
description="Analyze genetics for patient: {patient_id}",
agent=geneticist,
expected_output="Genetic profile with metabolizer status"
)
interaction_task = Task(
description="Check drug-gene interactions for proposed medications",
agent=pharmacist,
expected_output="Drug interaction analysis"
)
protocol_task = Task(
description="Generate personalized treatment protocol",
agent=physician,
expected_output="Treatment protocol",
output_pydantic=TreatmentProtocol
)
# Run
agents = AgentTeam(agents=[geneticist, pharmacist, physician], tasks=[genetic_task, interaction_task, protocol_task])
result = agents.start(patient_id="PAT002")
print(result)
Run: CLI
Copy
# Analyze single patient
praisonai "Generate treatment protocol for patient with CYP2D6 rapid metabolizer" --verbose
# With persistence
praisonai "Check drug interactions for codeine prescription" --memory --user-id pharmacist1
# Interactive consultation
praisonai chat --memory --user-id clinical_team
Run: agents.yaml
Createagents.yaml:
Copy
framework: praisonai
topic: "personalized medicine protocol"
roles:
geneticist:
role: Pharmacogeneticist
goal: Analyze genetic markers
backstory: Expert in pharmacogenomics
tasks:
analyze:
description: |
Analyze genetics:
- CYP450 enzyme status
- HLA markers
- Drug metabolism genes
expected_output: Genetic profile
pharmacist:
role: Clinical Pharmacist
goal: Check drug interactions
backstory: Expert in drug-gene interactions
tasks:
check:
description: |
Check interactions:
- Drug-gene interactions
- Dosage adjustments
- Contraindications
expected_output: Interaction report
physician:
role: Prescribing Physician
goal: Generate treatment protocol
backstory: Expert in personalized medicine
tasks:
prescribe:
description: |
Generate protocol:
- Recommended drugs
- Dosage adjustments
- Monitoring plan
- Genetic warnings
expected_output: Treatment protocol
Copy
praisonai agents.yaml --verbose
Monitor & Verify
Copy
# View patient history
praisonai --history 10 --user-id pharmacist1
# Check metrics
praisonai --metrics
# Export protocols
praisonai --save treatment_protocols
Serve API
Copy
from praisonaiagents import Agent, tool
import json
@tool
def quick_gene_check(drug: str, cyp2d6: str, cyp2c19: str) -> str:
"""Quick drug-gene compatibility check."""
cyp2d6_drugs = ["codeine", "tramadol", "tamoxifen"]
cyp2c19_drugs = ["clopidogrel", "omeprazole"]
safe = True
warnings = []
if drug in cyp2d6_drugs:
if cyp2d6 in ["ultra_rapid", "poor_metabolizer"]:
safe = False
warnings.append(f"CYP2D6 {cyp2d6}: dosage adjustment needed")
if drug in cyp2c19_drugs:
if cyp2c19 == "poor_metabolizer":
safe = False
warnings.append(f"CYP2C19 poor metabolizer: consider alternative")
return json.dumps({"drug": drug, "safe": safe, "warnings": warnings})
agent = Agent(
name="PharmacogenomicsAPI",
instructions="Check drug-gene compatibility.",
tools=[quick_gene_check]
)
agent.launch(path="/gene-check", port=8000)
Copy
curl -X POST http://localhost:8000/gene-check \
-H "Content-Type: application/json" \
-d '{"message": "Check codeine for CYP2D6 ultra_rapid metabolizer"}'
Cleanup
Copy
rm -f medicine.db genetics.json drugs.json
deactivate
Features Demonstrated
| Feature | Implementation |
|---|---|
| Multi-agent | Geneticist → Pharmacist → Physician |
| Structured Output | Pydantic TreatmentProtocol |
| Pharmacogenomics | CYP450, HLA-B*5701 checks |
| Drug Interactions | Gene-based contraindications |
| DB Persistence | SQLite via db() |
| CLI | praisonai chat for consult |
| YAML Config | 3-agent medical pipeline |
| API Endpoint | agent.launch() |

