Spaces:
Runtime error
Runtime error
File size: 6,873 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 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 |
import json
from typing import Dict, Any
class EducationalAgent:
"""
Translates technical diagnosis and explanation into simple, patient-friendly terms.
"""
def __init__(self, doctor_name: str = "your treating doctor"):
self.doctor_name = doctor_name
def translate_to_layman_terms(self, diagnosis_result: Dict[str, Any], explanation_text: str) -> Dict[str, str]:
"""
Generates simple summaries and next steps for the patient.
Args:
diagnosis_result: The dictionary output from DiagnosticAgent.
explanation_text: The string output from ExplainabilityAgent.
Returns:
A dictionary containing patient-friendly summary, severity, and next steps.
"""
# 1. Extract Key Findings
fracture_detected = diagnosis_result.get("fracture_detected", False)
predicted_class = diagnosis_result.get("predicted_class", "a specific type of injury")
confidence = diagnosis_result.get("confidence_score", 0.0)
# 2. Determine Severity in Layman Terms
severity_map = {
"Healthy": "None",
"Greenstick": "Mild (The bone is cracked but not completely broken through.)",
"Transverse": "Moderate (A clean break straight across the bone.)",
"Oblique": "Moderate (A clean break at an angle.)",
"Spiral": "Serious (A twisting break that spirals around the bone.)",
"Comminuted": "Severe (The bone has broken into three or more pieces.)",
"Oblique Displaced": "Serious (The bone is broken at an angle, and the pieces are shifted out of place.)",
"Transverse Displaced": "Serious (The bone is broken straight across, and the pieces are shifted out of place.)",
}
layman_severity = severity_map.get(predicted_class, "We need more information on this type of break.")
# 3. Simplify the Explanation
# Clean up the technical explanation to remove technical jargon like 'centroid' or 'activation'
simple_explanation = explanation_text.replace("consistent with a", "which looks like a")
simple_explanation = simple_explanation.replace("Confidence:", "Our computer model is highly sure (")
simple_explanation = simple_explanation.replace("The model's focus is", "The computer saw a clear sign of this")
simple_explanation = simple_explanation.replace("distal end", "end of the bone near the hand/foot")
simple_explanation = simple_explanation.replace("proximal end", "end of the bone near the shoulder/hip")
simple_explanation = simple_explanation.replace("humerus", "upper arm bone")
simple_explanation = simple_explanation.replace("radius", "lower arm bone")
simple_explanation = simple_explanation.replace("tibia", "shin bone")
simple_explanation = simple_explanation.replace("mild", "small")
simple_explanation = simple_explanation.replace("strong", "very clear")
# 4. Generate Final Summary and Next Steps
if not fracture_detected or predicted_class == "Healthy":
patient_summary = (
f"**Great news!** Our analysis suggests your bone is **healthy** "
f"with high confidence ({confidence:.2f}). There are no signs of a fracture."
)
next_steps = (
"You can discuss your pain symptoms with your doctor, but based on this image, "
"a fracture is highly unlikely. No immediate orthopedic action is needed."
)
else:
patient_summary = (
f"Our computer analysis strongly indicates a **break in the bone** (a fracture). "
f"The specific type appears to be a **{predicted_class}** fracture."
)
# Combine simple explanation and confidence
patient_summary += f"\n\n**What the computer saw:** {simple_explanation}"
patient_summary += f".\n\n**Severity Level:** {layman_severity}"
next_steps = (
"This finding requires immediate medical follow-up. Please do the following:\n"
f"* **Do not move** the affected area.\n"
f"* **Immediately share these findings** with {self.doctor_name}.\n"
f"* Your doctor will confirm the diagnosis and determine the best treatment, "
"which may involve a cast, splint, or surgery."
)
return {
"patient_summary": patient_summary,
"patient_severity_assessment": layman_severity,
"next_steps_action_plan": next_steps,
}
# --- EXAMPLE USAGE ---
if __name__ == '__main__':
# --- SIMULATED INPUT from Diagnostic & Explainability Agents ---
# Example 1: Serious Fracture
SIMULATED_DIAGNOSIS_1 = {
"image_path": "fracture_image.jpg",
"fracture_detected": True,
"predicted_class": "Spiral",
"severity_type": "Spiral",
"confidence_score": 0.96,
"uncertainty_score": 0.04,
"all_probabilities": [0.01, 0.01, 0.01, 0.01, 0.01, 0.96, 0.01, 0.01]
}
SIMULATED_EXPLANATION_1 = (
"A fracture pattern consistent with a **Spiral** type is detected (Confidence: 0.96). "
"The model's focus is clear near the **middle region** of the humerus in the center. "
"This is based on a distinct linear focus."
)
# Example 2: Healthy Bone
SIMULATED_DIAGNOSIS_2 = {
"image_path": "healthy_image.jpg",
"fracture_detected": False,
"predicted_class": "Healthy",
"severity_type": "Healthy",
"confidence_score": 0.99,
"uncertainty_score": 0.01,
"all_probabilities": [0.00, 0.00, 0.99, 0.00, 0.00, 0.00, 0.00, 0.01]
}
SIMULATED_EXPLANATION_2 = (
"The bone appears **healthy** with high confidence (0.99). No fracture pattern was detected."
)
# --- Run Agent ---
agent = EducationalAgent(doctor_name="Dr. Smith")
# Run Example 1
results_1 = agent.translate_to_layman_terms(SIMULATED_DIAGNOSIS_1, SIMULATED_EXPLANATION_1)
print("\n--- PATIENT REPORT (FRACTURE DETECTED) ---")
print(f"**SUMMARY:** {results_1['patient_summary']}")
print("\n**ACTION PLAN:**")
print(results_1['next_steps_action_plan'])
print("-------------------------------------------\n")
# Run Example 2
results_2 = agent.translate_to_layman_terms(SIMULATED_DIAGNOSIS_2, SIMULATED_EXPLANATION_2)
print("\n--- PATIENT REPORT (HEALTHY BONE) ---")
print(f"**SUMMARY:** {results_2['patient_summary']}")
print("\n**ACTION PLAN:**")
print(results_2['next_steps_action_plan'])
print("-------------------------------------\n") |