Agentic-RagBot / src /agents /biomarker_analyzer.py
T0X1N's picture
chore: codebase audit and fixes (ruff, mypy, pytest)
9659593
"""
MediGuard AI RAG-Helper
Biomarker Analyzer Agent - Validates biomarker values and flags anomalies
"""
from src.biomarker_validator import BiomarkerValidator
from src.llm_config import llm_config
from src.state import AgentOutput, BiomarkerFlag, GuildState
class BiomarkerAnalyzerAgent:
"""Agent that validates biomarker values and generates comprehensive analysis"""
def __init__(self):
self.validator = BiomarkerValidator()
self.llm = llm_config.analyzer
def analyze(self, state: GuildState) -> GuildState:
"""
Main agent function to analyze biomarkers.
Args:
state: Current guild state with patient input
Returns:
Updated state with biomarker analysis
"""
print("\n" + "=" * 70)
print("EXECUTING: Biomarker Analyzer Agent")
print("=" * 70)
biomarkers = state["patient_biomarkers"]
patient_context = state.get("patient_context", {})
gender = patient_context.get("gender") # None if not provided — uses non-gender-specific ranges
predicted_disease = state["model_prediction"]["disease"]
# Validate all biomarkers
print(f"\nValidating {len(biomarkers)} biomarkers...")
flags, alerts = self.validator.validate_all(
biomarkers=biomarkers, gender=gender, threshold_pct=state["sop"].biomarker_analyzer_threshold
)
# Get disease-relevant biomarkers
relevant_biomarkers = self.validator.get_disease_relevant_biomarkers(predicted_disease)
# Generate summary using LLM
summary = self._generate_summary(biomarkers, flags, alerts, relevant_biomarkers, predicted_disease)
findings = {
"biomarker_flags": [flag.model_dump() for flag in flags],
"safety_alerts": [alert.model_dump() for alert in alerts],
"relevant_biomarkers": relevant_biomarkers,
"summary": summary,
"validation_complete": True,
}
# Create agent output
output = AgentOutput(agent_name="Biomarker Analyzer", findings=findings)
# Update state
print("\nAnalysis complete:")
print(f" - {len(flags)} biomarkers validated")
print(f" - {len([f for f in flags if f.status != 'NORMAL'])} out-of-range values")
print(f" - {len(alerts)} safety alerts generated")
print(f" - {len(relevant_biomarkers)} disease-relevant biomarkers identified")
return {
"agent_outputs": [output],
"biomarker_flags": flags,
"safety_alerts": alerts,
"biomarker_analysis": findings,
}
def _generate_summary(
self,
biomarkers: dict[str, float],
flags: list[BiomarkerFlag],
alerts: list,
relevant_biomarkers: list[str],
disease: str,
) -> str:
"""Generate a concise summary of biomarker findings"""
# Count anomalies
critical = [f for f in flags if "CRITICAL" in f.status]
high_low = [f for f in flags if f.status in ["HIGH", "LOW"]]
prompt = f"""You are a medical data analyst. Provide a brief, clinical summary of these biomarker results.
**Patient Context:**
- Predicted Disease: {disease}
- Total Biomarkers Tested: {len(biomarkers)}
- Critical Values: {len(critical)}
- Out-of-Range Values: {len(high_low)}
**Key Findings:**
{self._format_key_findings(critical, high_low, relevant_biomarkers)}
Provide a 2-3 sentence summary highlighting:
1. Overall risk profile
2. Most concerning findings
3. Alignment with predicted disease
Keep it concise and clinical."""
try:
response = self.llm.invoke(prompt)
return response.content.strip()
except Exception as e:
print(f"Warning: LLM summary generation failed: {e}")
return f"Biomarker analysis complete. {len(critical)} critical values, {len(high_low)} out-of-range values detected."
def _format_key_findings(self, critical, high_low, relevant):
"""Format findings for LLM prompt"""
findings = []
if critical:
findings.append("CRITICAL VALUES:")
for f in critical[:3]: # Top 3
findings.append(f" - {f.name}: {f.value} {f.unit} ({f.status})")
if high_low:
findings.append("\nOUT-OF-RANGE VALUES:")
for f in high_low[:5]: # Top 5
findings.append(f" - {f.name}: {f.value} {f.unit} ({f.status})")
if relevant:
findings.append(f"\nDISEASE-RELEVANT BIOMARKERS: {', '.join(relevant[:5])}")
return "\n".join(findings) if findings else "All biomarkers within normal range."
# Create agent instance for import
biomarker_analyzer_agent = BiomarkerAnalyzerAgent()