File size: 5,486 Bytes
bf07f10
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
import json
from typing import Dict, Any, List

# --- Pre-compiled Medical Knowledge Base (Simulated) ---
# In a real application, this would be a large database (e.g., SQL, MongoDB, or specialized API)
MEDICAL_KNOWLEDGE_BASE = {
    "Comminuted": {
        "definition": "A fracture where the bone is broken into three or more pieces.",
        "icd_code": "S52.5",
        "severity": "High",
        "treatment_guidelines": ["Usually requires surgical intervention (ORIF - Open Reduction Internal Fixation).", "Long immobilization time (8-12 weeks).", "Requires physical therapy."],
        "prognosis_notes": "Risk of non-union is higher. Full recovery may take 6+ months."
    },
    "Greenstick": {
        "definition": "A partial fracture where the bone is cracked but not completely broken through. Common in children.",
        "icd_code": "S52.3",
        "severity": "Low-Moderate",
        "treatment_guidelines": ["Immobilization with cast or splint.", "Careful monitoring for progression.", "Minimal surgical intervention usually needed."],
        "prognosis_notes": "Generally good prognosis. Recovery typically within 4-6 weeks."
    },
    "Healthy": {
        "definition": "No evidence of fracture. Bone appears normal.",
        "icd_code": "Z00.0",
        "severity": "None",
        "treatment_guidelines": ["No treatment required.", "Continue normal activities as tolerated.", "Regular follow-up if there is persistent pain."],
        "prognosis_notes": "Normal bone health. No intervention needed."
    },
    "Oblique": {
        "definition": "A diagonal break across the bone at approximately 45 degrees.",
        "icd_code": "S52.2",
        "severity": "Moderate",
        "treatment_guidelines": ["Immobilization with cast or splint.", "Regular X-rays to monitor healing.", "Physical therapy after immobilization period."],
        "prognosis_notes": "Good prognosis with proper immobilization. Recovery typically 6-8 weeks."
    },
    "Oblique Displaced": {
        "definition": "A diagonal break where the bone fragments are not aligned and have shifted out of place.",
        "icd_code": "S52.9",
        "severity": "Medium-High",
        "treatment_guidelines": ["Requires reduction (closed or open).", "Often requires casting or sometimes surgery to stabilize.", "Regular X-rays to ensure proper alignment."],
        "prognosis_notes": "Good prognosis if successfully reduced and stabilized. Recovery 8-12 weeks."
    },
    "Spiral": {
        "definition": "A twisting break that spirals around the bone, typically caused by rotational forces.",
        "icd_code": "S52.4",
        "severity": "Serious",
        "treatment_guidelines": ["Usually requires immobilization in a cast or brace.", "May require surgery if fragments are unstable.", "Requires extensive physical therapy."],
        "prognosis_notes": "Variable recovery time. May take 8-16 weeks depending on severity."
    },
    "Transverse": {
        "definition": "A clean break straight across the bone, perpendicular to the bone's long axis.",
        "icd_code": "S52.1",
        "severity": "Moderate",
        "treatment_guidelines": ["Immobilization with cast or splint.", "Regular X-rays to monitor alignment.", "Physical therapy after healing begins."],
        "prognosis_notes": "Good prognosis. Clean breaks typically heal well. Recovery 6-10 weeks."
    },
    "Transverse Displaced": {
        "definition": "A straight break across the bone with fragments shifted out of place.",
        "icd_code": "S52.8",
        "severity": "Serious",
        "treatment_guidelines": ["Requires reduction (closed or open).", "Often requires surgery to realign fragments.", "Long-term immobilization and rehabilitation."],
        "prognosis_notes": "Good prognosis with treatment. Recovery 10-14 weeks."
    }
}

class KnowledgeAgent:
    def __init__(self, knowledge_base: Dict[str, Any]):
        self.knowledge_base = knowledge_base

    def get_medical_summary(self, diagnosis: str, confidence: float) -> Dict[str, Any]:
        """
        Retrieves and formats external medical knowledge based on the final diagnosis.
        """
        diagnosis = diagnosis.strip()

        if diagnosis not in self.knowledge_base:
            return {"error": "Diagnosis not found in the knowledge base."}
        
        # 1. Retrieve Raw Data
        raw_data = self.knowledge_base[diagnosis]

        # 2. Format Summary for Professional Use (Example output)
        summary = {
            "Diagnosis": diagnosis,
            "Ensemble_Confidence": f"{confidence:.2f}",
            "Type": raw_data.get("definition"),
            "ICD_Code": raw_data.get("icd_code", "N/A"),
            "Severity": raw_data.get("severity"),
            "Guidelines": raw_data.get("treatment_guidelines")
        }
        
        return summary

# --- Example Usage (Integration with Cross-Validation Agent Output) ---
if __name__ == '__main__':
    # Assume this is the output from your cross_validation_agent:
    cross_validation_result = {
        "ensemble_prediction": "Oblique Displaced",
        "ensemble_confidence": 0.85
    }
    
    agent = KnowledgeAgent(MEDICAL_KNOWLEDGE_BASE)
    
    medical_report = agent.get_medical_summary(
        diagnosis=cross_validation_result["ensemble_prediction"],
        confidence=cross_validation_result["ensemble_confidence"]
    )
    
    print("\n--- 🧠 KNOWLEDGE AGENT REPORT ---")
    print(json.dumps(medical_report, indent=4))