File size: 7,762 Bytes
6dc9d46
 
 
 
 
 
 
696f787
6dc9d46
 
 
696f787
 
6dc9d46
 
 
 
 
 
9659593
6dc9d46
 
 
 
 
696f787
6dc9d46
 
 
9659593
 
6dc9d46
9659593
6dc9d46
9659593
 
 
 
6dc9d46
9659593
 
6dc9d46
9659593
 
6dc9d46
9659593
 
 
 
 
 
 
 
6dc9d46
9659593
 
 
6dc9d46
9659593
 
 
6dc9d46
696f787
6dc9d46
 
 
 
 
 
 
 
 
9659593
 
6dc9d46
696f787
6dc9d46
9659593
696f787
6dc9d46
696f787
9659593
6dc9d46
 
 
 
696f787
9659593
6dc9d46
9659593
6dc9d46
 
 
 
9659593
696f787
6dc9d46
 
696f787
6dc9d46
 
 
696f787
6dc9d46
 
 
696f787
6dc9d46
9659593
6dc9d46
9659593
696f787
6dc9d46
 
 
 
 
 
696f787
6dc9d46
 
 
 
 
 
9659593
 
6dc9d46
 
 
 
696f787
6dc9d46
 
 
9659593
6dc9d46
 
9659593
6dc9d46
696f787
6dc9d46
 
 
 
 
 
696f787
6dc9d46
 
9659593
 
 
aefac4f
9659593
aefac4f
 
9659593
 
 
6dc9d46
 
 
696f787
9659593
6dc9d46
9659593
6dc9d46
 
 
696f787
aefac4f
 
 
9659593
aefac4f
 
 
 
 
 
 
6dc9d46
9659593
aefac4f
696f787
6dc9d46
9659593
6dc9d46
9659593
6dc9d46
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
"""
MediGuard AI RAG-Helper
Sample Patient Test Case - Type 2 Diabetes
"""

import sys
from pathlib import Path

sys.path.insert(0, str(Path(__file__).parent.parent))

import json

from src.state import PatientInput
from src.workflow import create_guild


def create_sample_diabetes_patient() -> PatientInput:
    """
    Create a realistic test case for Type 2 Diabetes patient.

    Clinical Profile:
    - 52-year-old male with elevated glucose and HbA1c
    - Multiple diabetes-related biomarker abnormalities
    - Some cardiovascular risk factors present
    """

    # Biomarker values showing Type 2 Diabetes pattern
    biomarkers = {
        # CRITICAL DIABETES INDICATORS
        "Glucose": 185.0,  # HIGH (normal: 70-100 mg/dL fasting)
        "HbA1c": 8.2,  # HIGH (normal: <5.7%, prediabetes: 5.7-6.4%, diabetes: >=6.5%)
        # INSULIN RESISTANCE MARKERS
        "Insulin": 22.5,  # HIGH (normal: 2.6-24.9 μIU/mL, but elevated for glucose level)
        # LIPID PANEL (Cardiovascular Risk)
        "Cholesterol": 235.0,  # HIGH (normal: <200 mg/dL)
        "Triglycerides": 210.0,  # HIGH (normal: <150 mg/dL)
        "HDL": 38.0,  # LOW (normal for male: >40 mg/dL)
        "LDL": 145.0,  # HIGH (normal: <100 mg/dL)
        # KIDNEY FUNCTION (Diabetes Complication Risk)
        "Creatinine": 1.3,  # Slightly HIGH (normal male: 0.7-1.3 mg/dL, borderline)
        "Urea": 45.0,  # Slightly HIGH (normal: 7-20 mg/dL)
        # LIVER FUNCTION
        "ALT": 42.0,  # Slightly HIGH (normal: 7-56 U/L, upper range)
        "AST": 38.0,  # NORMAL (normal: 10-40 U/L)
        # BLOOD CELLS (Generally Normal)
        "WBC": 7.5,  # NORMAL (4.5-11.0 x10^9/L)
        "RBC": 5.1,  # NORMAL (male: 4.7-6.1 x10^12/L)
        "Hemoglobin": 15.2,  # NORMAL (male: 13.8-17.2 g/dL)
        "Hematocrit": 45.5,  # NORMAL (male: 40.7-50.3%)
        "MCV": 89.0,  # NORMAL (80-96 fL)
        "MCH": 29.8,  # NORMAL (27-31 pg)
        "MCHC": 33.4,  # NORMAL (32-36 g/dL)
        "Platelets": 245.0,  # NORMAL (150-400 x10^9/L)
        # THYROID (Normal)
        "TSH": 2.1,  # NORMAL (0.4-4.0 mIU/L)
        "T3": 115.0,  # NORMAL (80-200 ng/dL)
        "T4": 8.5,  # NORMAL (5-12 μg/dL)
        # ELECTROLYTES (Normal)
        "Sodium": 140.0,  # NORMAL (136-145 mmol/L)
        "Potassium": 4.2,  # NORMAL (3.5-5.0 mmol/L)
        "Calcium": 9.5,  # NORMAL (8.5-10.2 mg/dL)
    }

    # ML model prediction (simulated)
    model_prediction = {
        "disease": "Type 2 Diabetes",
        "confidence": 0.87,  # High confidence
        "probabilities": {
            "Type 2 Diabetes": 0.87,
            "Heart Disease": 0.08,  # Some cardiovascular markers
            "Anemia": 0.02,
            "Thrombocytopenia": 0.02,
            "Thalassemia": 0.01,
        },
    }

    # Patient demographics
    patient_context = {"age": 52, "gender": "male", "bmi": 31.2, "patient_id": "TEST_DM_001", "test_date": "2024-01-15"}

    # Use baseline SOP

    return PatientInput(biomarkers=biomarkers, model_prediction=model_prediction, patient_context=patient_context)


def run_test():
    """Run the complete workflow with sample patient"""

    print("\n" + "=" * 70)
    print("MEDIGUARD AI RAG-HELPER - SYSTEM TEST")
    print("=" * 70)
    print("\nTest Case: Type 2 Diabetes Patient")
    print("Patient ID: TEST_DM_001")
    print("Age: 52 | Gender: Male")
    print("Key Findings: Elevated Glucose (185), HbA1c (8.2%), High Cholesterol")
    print("=" * 70 + "\n")

    # Create patient input
    patient = create_sample_diabetes_patient()

    # Initialize guild
    print("Initializing Clinical Insight Guild...")
    guild = create_guild()

    # Run workflow
    print("\nExecuting workflow...\n")
    response = guild.run(patient)

    # Display results
    print("\n" + "=" * 70)
    print("FINAL RESPONSE")
    print("=" * 70 + "\n")

    print("PATIENT SUMMARY")
    print("-" * 70)
    print(f"Narrative: {response['patient_summary']['narrative']}")
    print(f"Total Biomarkers: {response['patient_summary']['total_biomarkers_tested']}")
    print(f"Out of Range: {response['patient_summary']['biomarkers_out_of_range']}")
    print(f"Critical Values: {response['patient_summary']['critical_values']}")

    print("\n\nPREDICTION EXPLANATION")
    print("-" * 70)
    print(f"Disease: {response['prediction_explanation']['primary_disease']}")
    print(f"Confidence: {response['prediction_explanation']['confidence']:.1%}")
    print(f"\nMechanism: {response['prediction_explanation']['mechanism_summary'][:300]}...")
    print(f"\nKey Drivers ({len(response['prediction_explanation']['key_drivers'])}):")
    for i, driver in enumerate(response["prediction_explanation"]["key_drivers"][:3], 1):
        contribution = driver.get("contribution", 0)
        if isinstance(contribution, str):
            print(f"  {i}. {driver['biomarker']}: {driver['value']} ({contribution} contribution)")
        else:
            print(f"  {i}. {driver['biomarker']}: {driver['value']} ({contribution:.0f}% contribution)")

    print("\n\nCLINICAL RECOMMENDATIONS")
    print("-" * 70)
    print(f"Immediate Actions ({len(response['clinical_recommendations']['immediate_actions'])}):")
    for action in response["clinical_recommendations"]["immediate_actions"][:3]:
        print(f"  - {action}")
    print(f"\nLifestyle Changes ({len(response['clinical_recommendations']['lifestyle_changes'])}):")
    for change in response["clinical_recommendations"]["lifestyle_changes"][:3]:
        print(f"  - {change}")

    print("\n\nCONFIDENCE ASSESSMENT")
    print("-" * 70)
    print(f"Prediction Reliability: {response['confidence_assessment']['prediction_reliability']}")
    print(f"Evidence Strength: {response['confidence_assessment']['evidence_strength']}")
    print(f"Limitations: {len(response['confidence_assessment']['limitations'])} identified")
    print(f"Recommendation: {response['confidence_assessment']['recommendation']}")

    print("\n\nSAFETY ALERTS")
    print("-" * 70)
    if response["safety_alerts"]:
        for alert in response["safety_alerts"]:
            if hasattr(alert, "severity"):
                severity = alert.severity
                biomarker = alert.biomarker or "General"
                message = alert.message
            else:
                severity = alert.get("severity", alert.get("priority", "UNKNOWN"))
                biomarker = alert.get("biomarker", "General")
                message = alert.get("message", str(alert))
            print(f"  [{severity}] {biomarker}: {message}")
    else:
        print("  No safety alerts")

    print("\n\n" + "=" * 70)
    print("METADATA")
    print("=" * 70)
    print(f"Timestamp: {response['metadata']['timestamp']}")
    print(f"System: {response['metadata']['system_version']}")
    print(f"Agents: {', '.join(response['metadata']['agents_executed'])}")

    # Save response to file (convert Pydantic objects to dicts for serialization)
    def _to_serializable(obj):
        """Recursively convert Pydantic models and non-serializable objects to dicts."""
        if hasattr(obj, "model_dump"):
            return obj.model_dump()
        elif isinstance(obj, dict):
            return {k: _to_serializable(v) for k, v in obj.items()}
        elif isinstance(obj, list):
            return [_to_serializable(item) for item in obj]
        return obj

    output_file = Path(__file__).parent / "test_output_diabetes.json"
    with open(output_file, "w", encoding="utf-8") as f:
        json.dump(_to_serializable(response), f, indent=2, ensure_ascii=False, default=str)

    print(f"\n✓ Full response saved to: {output_file}")
    print("\n" + "=" * 70)
    print("TEST COMPLETE")
    print("=" * 70 + "\n")


if __name__ == "__main__":
    run_test()