Spaces:
Sleeping
Sleeping
| """ | |
| 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() | |