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()