DocUA's picture
Implement provider summary improvements from Or_3.txt review
61eaa9c
import gradio as gr
import html
from src.interface.session_manager import SimplifiedSessionData
from src.interface.stats_handlers import get_conversation_stats
from src.interface.enhanced_display_integration import create_enhanced_display_integration
from src.core.improved_classification_prompt_manager import ImprovedClassificationPromptManager
def handle_message(message: str, history, session: SimplifiedSessionData):
"""Handle user message with enhanced display formatting."""
if session is None:
session = SimplifiedSessionData()
session.update_activity()
# Apply per-session model overrides (if configured in Model Settings)
custom_models = getattr(session, 'custom_models', None)
if custom_models:
session.app_instance.set_model_overrides(custom_models)
else:
session.app_instance.set_model_overrides({})
# Apply per-session prompt overrides (if configured in Edit Prompts)
custom_prompts = getattr(session, 'custom_prompts', None)
if custom_prompts:
session.app_instance.set_prompt_overrides(custom_prompts)
else:
session.app_instance.set_prompt_overrides({})
# Store previous spiritual state to detect transitions
previous_state = session.app_instance.spiritual_state.spiritual_state
# Initialize enhanced display integration
enhanced_display = create_enhanced_display_integration()
new_history, status = session.app_instance.process_message(message, history)
# Check if we just transitioned to RED state (consent was given)
current_state = session.app_instance.spiritual_state.spiritual_state
consent_just_given = (previous_state.value == "awaiting_consent" and
current_state.value == "red")
# Get updated conversation stats
stats = get_conversation_stats(session)
# Check for provider summary (RED flag case)
provider_summary_text = ""
coherent_summary_text = ""
show_provider_panel = False
last_summary = session.app_instance.get_last_provider_summary()
# Debug logging
print(f"DEBUG: last_summary exists: {last_summary is not None}")
print(f"DEBUG: consent_just_given: {consent_just_given}")
print(f"DEBUG: previous_state: {previous_state.value}, current_state: {current_state.value}")
if last_summary:
print(f"DEBUG: summary patient: {last_summary.patient_name}")
print(f"DEBUG: summary indicators: {last_summary.indicators}")
# Use the same approach as get_status function
provider_summary_text = session.app_instance.provider_summary_generator.format_for_display(last_summary)
# Generate medical brain summary (NEW - Requirements 2.1-2.8)
try:
print(f"DEBUG: About to generate coherent summary...")
coherent_summary_text = session.app_instance.provider_summary_generator.format_coherent_paragraph(last_summary)
print(f"DEBUG: coherent summary generated: {len(coherent_summary_text) if coherent_summary_text else 0} chars")
if coherent_summary_text:
print(f"DEBUG: coherent summary preview: {coherent_summary_text[:200]}...")
else:
print(f"DEBUG: coherent summary is empty or None")
# Fallback: create a simple test summary
coherent_summary_text = f"TEST SUMMARY: {last_summary.patient_name or 'Patient'} is experiencing distress indicators: {', '.join(last_summary.indicators or ['general distress'])}. This is a test to verify the UI is working."
print(f"DEBUG: Using fallback test summary: {coherent_summary_text[:100]}...")
except Exception as e:
print(f"DEBUG: Error generating coherent summary: {e}")
import traceback
traceback.print_exc()
# Fallback: create a simple test summary
coherent_summary_text = f"ERROR FALLBACK: Unable to generate summary. Error: {str(e)}"
show_provider_panel = True
print(f"DEBUG: formatted summary length: {len(provider_summary_text)}")
print(f"DEBUG: show_provider_panel: {show_provider_panel}")
else:
print("DEBUG: No provider summary found")
# Debug: print what we're returning
print(f"DEBUG RETURN: show_panel={show_provider_panel}, text_len={len(provider_summary_text)}")
print(f"DEBUG RETURN: coherent_summary_text length={len(coherent_summary_text) if coherent_summary_text else 0}")
if provider_summary_text:
print(f"DEBUG RETURN: first 100 chars: {provider_summary_text[:100]}")
if coherent_summary_text:
print(f"DEBUG RETURN: coherent first 100 chars: {coherent_summary_text[:100]}")
print(f"DEBUG RETURN: coherent FULL TEXT: {coherent_summary_text}")
# Enhanced display formatting - use same approach as get_status
if provider_summary_text:
import html
escaped_text = html.escape(provider_summary_text)
html_content = f"<pre style='white-space: pre-wrap; font-family: monospace; font-size: 11px; background: #fffbeb; padding: 10px; border-radius: 8px; max-height: 400px; overflow-y: auto;'>{escaped_text}</pre>"
else:
html_content = ""
# Use gr.update for both visibility and value
if not provider_summary_text:
provider_summary_text = ""
html_content = ""
# Generate status message for provider summary with enhanced formatting
if show_provider_panel and provider_summary_text:
# Get the last assessment for enhanced status display
last_assessment = session.app_instance.spiritual_state.last_assessment
if last_assessment:
# Use simple text format instead of HTML badge for Markdown compatibility
classification_text = f"🔴 **{last_assessment.state.value.upper()} FLAG**"
status_msg = f"""**🔴 Provider Summary Generated**
{classification_text}
**Patient:** {session.app_instance.patient_info.get('name', 'Test Patient')}
**Indicators:** {len(session.app_instance.get_last_provider_summary().indicators) if session.app_instance.get_last_provider_summary() else 0} distress indicators detected
**Summary Length:** {len(provider_summary_text)} characters
Use the **Download Summary** button below to access the complete provider summary for the spiritual care team."""
else:
status_msg = f"""**🔴 Provider Summary Generated**
**Patient:** {session.app_instance.patient_info.get('name', 'Test Patient')}
**Classification:** 🔴 **RED FLAG**
**Indicators:** {len(session.app_instance.get_last_provider_summary().indicators) if session.app_instance.get_last_provider_summary() else 0} distress indicators detected
**Summary Length:** {len(provider_summary_text)} characters
Use the **Download Summary** button below to access the complete provider summary for the spiritual care team."""
else:
status_msg = "No provider summary available"
return (
new_history,
status,
session,
"",
stats,
gr.update(visible=show_provider_panel), # provider_summary_content visibility
status_msg, # provider_summary_status content
gr.update(value=html_content, visible=True) if show_provider_panel else gr.update(visible=False), # provider_summary_display content
coherent_summary_text if coherent_summary_text else "" # coherent_summary_display content - try direct value
)
def handle_clear(session: SimplifiedSessionData):
"""
Handle clear chat button.
Resets entire session including:
- Chat history
- Spiritual monitoring state
- Provider summary panel (hides and clears content)
- Conversation statistics
"""
if session is None:
session = SimplifiedSessionData()
session.update_activity()
new_history, status = session.app_instance.reset_session()
# Hide and clear provider summary panel
return (
new_history, # Clear chat history
status, # Reset status
session, # Updated session
gr.update(visible=False), # Hide provider_summary_content group
"No provider summary available", # Clear provider_summary_status
"", # Clear provider_summary_display HTML
"" # Clear coherent_summary_display - direct value
)
def send_example(example_text: str, history, session: SimplifiedSessionData):
"""Send example message."""
return handle_message(example_text, history, session)
def send_example_with_stats(example_text: str, history, session: SimplifiedSessionData):
"""Send example message and return stats."""
# Assuming this was supposed to be similar to send_example but returning different things?
# In the original file, it calls handle_message which returns 9 items.
# We should match the return signature if this is used by a button.
return handle_message(example_text, history, session)