Spaces:
Sleeping
Sleeping
File size: 10,919 Bytes
be1b5d2 |
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 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 |
#!/usr/bin/env python3
"""
Error Handling Demo for UI Classification Improvements.
Demonstrates error handling and recovery mechanisms in action.
Requirements: 9.1, 9.2, 9.3, 9.4
"""
import sys
import os
# Add src to path for imports
current_dir = os.path.dirname(os.path.abspath(__file__))
parent_dir = os.path.dirname(current_dir)
if parent_dir not in sys.path:
sys.path.insert(0, parent_dir)
from src.core.ui_error_handler import UIErrorHandler
from src.core.provider_summary_generator import ProviderSummary, ProviderSummaryGenerator
from src.interface.enhanced_results_display_manager import EnhancedResultsDisplayManager
from src.core.improved_classification_prompt_manager import ImprovedClassificationPromptManager
def demo_provider_summary_validation():
"""Demonstrate provider summary validation and error recovery."""
print("=" * 60)
print("PROVIDER SUMMARY VALIDATION DEMO")
print("=" * 60)
error_handler = UIErrorHandler()
# Create invalid summary
print("\n1. Creating invalid provider summary...")
invalid_summary = ProviderSummary(
patient_name="[Patient Name]", # Placeholder
patient_phone="[Phone Number]", # Placeholder
classification="RED",
confidence=1.5, # Invalid confidence
reasoning="", # Empty reasoning
indicators=[], # No indicators
severity_level="INVALID", # Invalid level
urgency_level="INVALID" # Invalid level
)
print(f" Patient Name: {invalid_summary.patient_name}")
print(f" Patient Phone: {invalid_summary.patient_phone}")
print(f" Confidence: {invalid_summary.confidence}")
print(f" Reasoning: '{invalid_summary.reasoning}'")
print(f" Indicators: {invalid_summary.indicators}")
print(f" Severity: {invalid_summary.severity_level}")
print(f" Urgency: {invalid_summary.urgency_level}")
# Validate summary
print("\n2. Validating summary structure...")
validation_result = error_handler.validate_provider_summary_structure(invalid_summary)
print(f" Valid: {validation_result.is_valid}")
print(f" Errors: {len(validation_result.errors)}")
print(f" Warnings: {len(validation_result.warnings)}")
if validation_result.errors:
print("\n Error Details:")
for i, error in enumerate(validation_result.errors[:3], 1): # Show first 3
print(f" {i}. {error.message}")
if error.suggestion:
print(f" Suggestion: {error.suggestion}")
# Apply fallback template
print("\n3. Applying fallback template...")
fixed_summary = error_handler.apply_fallback_template(invalid_summary, "general")
print(f" Patient Name: {fixed_summary.patient_name}")
print(f" Patient Phone: {fixed_summary.patient_phone}")
print(f" Confidence: {fixed_summary.confidence}")
print(f" Reasoning: '{fixed_summary.reasoning[:50]}...'")
print(f" Indicators: {fixed_summary.indicators}")
print(f" Severity: {fixed_summary.severity_level}")
print(f" Urgency: {fixed_summary.urgency_level}")
# Re-validate
print("\n4. Re-validating fixed summary...")
new_validation = error_handler.validate_provider_summary_structure(fixed_summary)
print(f" Valid: {new_validation.is_valid}")
print(f" Errors: {len(new_validation.errors)}")
print(f" Warnings: {len(new_validation.warnings)}")
def demo_display_error_handling():
"""Demonstrate display error handling and degraded mode."""
print("\n" + "=" * 60)
print("DISPLAY ERROR HANDLING DEMO")
print("=" * 60)
display_manager = EnhancedResultsDisplayManager()
# Test with invalid data
print("\n1. Testing display with invalid data...")
try:
result = display_manager.format_ai_analysis_section(
classification="", # Empty classification
indicators=[], # Empty indicators
reasoning="", # Empty reasoning
confidence=None
)
print(" Display result generated successfully")
print(f" Result length: {len(result)} characters")
print(f" Contains 'AI Analysis': {'AI Analysis' in result}")
print(f" Contains error handling: {'Display Error' in result or 'No indicators' in result}")
except Exception as e:
print(f" Error occurred: {e}")
# Test degraded display
print("\n2. Testing degraded display creation...")
error_context = "Simulated formatting error"
original_content = "<div>Original content that failed to format</div>"
degraded_display = display_manager.error_handler.create_degraded_display(
error_context, original_content
)
print(" Degraded display created successfully")
print(f" Contains error message: {'Display Error Detected' in degraded_display}")
print(f" Contains recovery actions: {'Recovery Actions' in degraded_display}")
print(f" Contains original content: {original_content in degraded_display}")
def demo_classification_error_handling():
"""Demonstrate classification error handling."""
print("\n" + "=" * 60)
print("CLASSIFICATION ERROR HANDLING DEMO")
print("=" * 60)
error_handler = UIErrorHandler()
# Simulate classification error
print("\n1. Simulating classification error...")
test_error = Exception("Simulated AI classification failure")
input_data = {
'message': 'I feel hopeless and have lost all meaning in life',
'classification': 'red',
'confidence': 0.8
}
fallback_result = error_handler.handle_classification_error(test_error, input_data)
print(f" Fallback classification: {fallback_result.classification}")
print(f" Fallback confidence: {fallback_result.confidence}")
print(f" Fallback indicators: {fallback_result.indicators}")
print(f" Fallback reasoning: {fallback_result.reasoning[:50]}...")
print(f" Is valid: {fallback_result.is_valid}")
# Test with critical keywords
print("\n2. Testing with critical keywords...")
critical_input = {
'message': 'I want to kill myself and end it all'
}
critical_result = error_handler.handle_classification_error(test_error, critical_input)
print(f" Critical classification: {critical_result.classification}")
print(f" Critical confidence: {critical_result.confidence}")
print(f" Critical indicators: {critical_result.indicators}")
def demo_end_to_end_recovery():
"""Demonstrate end-to-end error recovery."""
print("\n" + "=" * 60)
print("END-TO-END ERROR RECOVERY DEMO")
print("=" * 60)
# Initialize components
summary_generator = ProviderSummaryGenerator()
display_manager = EnhancedResultsDisplayManager()
# Start with problematic data
print("\n1. Starting with problematic data...")
problematic_data = {
'classification': 'INVALID',
'confidence': -0.5,
'indicators': [],
'reasoning': '',
'patient_name': '',
'patient_phone': ''
}
print(f" Classification: {problematic_data['classification']}")
print(f" Confidence: {problematic_data['confidence']}")
print(f" Indicators: {problematic_data['indicators']}")
print(f" Reasoning: '{problematic_data['reasoning']}'")
print(f" Patient Name: '{problematic_data['patient_name']}'")
print(f" Patient Phone: '{problematic_data['patient_phone']}'")
# Generate summary with error recovery
print("\n2. Generating summary with error recovery...")
summary = summary_generator.generate_summary(
indicators=problematic_data['indicators'],
reasoning=problematic_data['reasoning'],
confidence=problematic_data['confidence'],
patient_name=problematic_data['patient_name'],
patient_phone=problematic_data['patient_phone']
)
print(f" Fixed confidence: {summary.confidence}")
print(f" Fixed reasoning length: {len(summary.reasoning)}")
print(f" Fixed patient name: {summary.patient_name}")
print(f" Fixed patient phone: {summary.patient_phone}")
print(f" Recommended actions: {len(summary.recommended_actions)}")
# Display with error handling
print("\n3. Displaying with error handling...")
display_result = display_manager.format_provider_summary_section(summary)
print(f" Display result generated: {len(display_result)} characters")
print(f" Contains provider summary: {'Provider Summary' in display_result}")
print(f" Contains patient info: {summary.patient_name in display_result}")
print("\n4. System successfully recovered from all errors!")
def demo_error_statistics():
"""Demonstrate error statistics collection."""
print("\n" + "=" * 60)
print("ERROR STATISTICS DEMO")
print("=" * 60)
error_handler = UIErrorHandler()
# Create multiple invalid summaries to collect statistics
print("\n1. Creating multiple invalid summaries...")
summaries = [
ProviderSummary(patient_name="", patient_phone="", confidence=1.5, reasoning=""),
ProviderSummary(patient_name="[Patient Name]", patient_phone="invalid", confidence=-0.1, reasoning="short"),
ProviderSummary(patient_name="Valid Name", patient_phone="555-123-4567", confidence=0.8, reasoning="", indicators=[])
]
all_errors = []
for i, summary in enumerate(summaries, 1):
validation_result = error_handler.validate_provider_summary_structure(summary)
all_errors.extend(validation_result.errors)
print(f" Summary {i}: {len(validation_result.errors)} errors, {len(validation_result.warnings)} warnings")
# Get statistics
print(f"\n2. Collecting statistics from {len(all_errors)} total errors...")
stats = error_handler.get_error_statistics(all_errors)
print(f" Total errors: {stats['total']}")
print(f" By category: {stats['by_category']}")
print(f" By severity: {stats['by_severity']}")
print(f" By component: {stats['by_component']}")
def main():
"""Run all error handling demos."""
print("UI ERROR HANDLING AND RECOVERY DEMONSTRATION")
print("Requirements: 9.1, 9.2, 9.3, 9.4")
try:
demo_provider_summary_validation()
demo_display_error_handling()
demo_classification_error_handling()
demo_end_to_end_recovery()
demo_error_statistics()
print("\n" + "=" * 60)
print("ALL DEMOS COMPLETED SUCCESSFULLY!")
print("Error handling and recovery mechanisms are working correctly.")
print("=" * 60)
except Exception as e:
print(f"\nDemo failed with error: {e}")
import traceback
traceback.print_exc()
if __name__ == "__main__":
main() |