DocUA's picture
Implement provider summary improvements from Or_3.txt review
61eaa9c
import gradio as gr
import json
import csv
import os
from datetime import datetime
from src.interface.session_manager import SimplifiedSessionData
def get_conversation_stats(session: SimplifiedSessionData):
"""Get conversation statistics."""
if session is None or not hasattr(session.app_instance, 'conversation_logger'):
return "No conversation yet"
try:
summary = session.app_instance.get_conversation_summary()
if not summary or summary.get('total_exchanges', 0) == 0:
return "No conversation yet"
stats_text = f"""**📊 Conversation Statistics**
**Messages:** {summary['total_exchanges']} exchanges
**Duration:** {summary['session_duration_minutes']} minutes
**Classifications:**
🟢 Green: {summary['classification_counts']['green']} ({summary['classification_percentages']['green']}%)
🟡 Yellow: {summary['classification_counts']['yellow']} ({summary['classification_percentages']['yellow']}%)
🔴 Red: {summary['classification_counts']['red']} ({summary['classification_percentages']['red']}%)
**Average Confidence:** {summary['average_confidence']}
**Top Indicators:**"""
for indicator, count in list(summary['top_indicators'].items())[:3]:
stats_text += f"\n• {indicator}: {count}"
return stats_text
except Exception as e:
return f"Error getting stats: {str(e)}"
def download_conversation_json(session: SimplifiedSessionData):
"""Download conversation as JSON."""
if session is None or not hasattr(session.app_instance, 'conversation_logger'):
return None
try:
log_path = session.app_instance.get_conversation_log_path()
return log_path
except Exception as e:
print(f"Error downloading JSON: {e}")
return None
def download_conversation_csv(session: SimplifiedSessionData):
"""Download conversation as CSV."""
if session is None or not hasattr(session.app_instance, 'conversation_logger'):
return None
try:
csv_path = session.app_instance.export_conversation_csv()
return csv_path
except Exception as e:
print(f"Error downloading CSV: {e}")
return None
def get_status(session: SimplifiedSessionData):
"""Get current status and stats."""
if session is None:
return "❌ Session not initialized", "No stats", gr.update(visible=False), "No provider summary available", "", ""
session.update_activity()
status_info = session.app_instance._get_status_info()
# Get stats
stats_text = get_conversation_stats(session)
# Check for provider summary
last_summary = session.app_instance.get_last_provider_summary()
show_provider_panel = last_summary is not None
provider_summary_text = ""
coherent_summary_text = ""
if last_summary:
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:
coherent_summary_text = session.app_instance.provider_summary_generator.format_coherent_paragraph(last_summary)
print(f"DEBUG get_status: coherent summary generated: {len(coherent_summary_text) if coherent_summary_text else 0} chars")
if not coherent_summary_text:
# Fallback for testing
coherent_summary_text = f"FALLBACK: {last_summary.patient_name or 'Patient'} summary for testing"
except Exception as e:
print(f"Error generating coherent summary in get_status: {e}")
coherent_summary_text = f"ERROR: {str(e)}"
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>"
status_msg = f"""**🔴 Provider Summary Generated**
**Patient:** {session.app_instance.patient_info.get('name', 'Test Patient')}
**Classification:** RED FLAG
**Indicators:** {len(last_summary.indicators)} 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:
html_content = ""
status_msg = "No provider summary available"
return (
status_info,
stats_text,
gr.update(visible=show_provider_panel),
status_msg,
html_content,
coherent_summary_text if coherent_summary_text else "" # Direct value instead of gr.update
)
def download_provider_summary(session: SimplifiedSessionData):
"""Download provider summary as text file."""
if session is None:
return None
last_summary = session.app_instance.get_last_provider_summary()
if not last_summary:
return None
try:
# Generate filename
timestamp = datetime.now().strftime("%Y%m%d_%H%M%S")
patient_name = session.app_instance.patient_info.get('name', 'Patient').replace(" ", "_")
filename = f"provider_summary_{patient_name}_{timestamp}.txt"
# Format content
content = session.app_instance.provider_summary_generator.format_for_display(last_summary)
# Save to temp file
path = os.path.join(os.getcwd(), "exports", filename)
os.makedirs(os.path.dirname(path), exist_ok=True)
with open(path, "w", encoding="utf-8") as f:
f.write(content)
return path
except Exception as e:
print(f"Error downloading provider summary: {e}")
return None
def clear_provider_summary():
"""Clear provider summary panel."""
return (
gr.update(visible=False),
"No provider summary available",
"",
"" # Direct empty string
)
def regenerate_coherent_summary(session: SimplifiedSessionData):
"""Regenerate medical brain summary."""
if session is None:
return ""
last_summary = session.app_instance.get_last_provider_summary()
if not last_summary:
return ""
try:
coherent_text = session.app_instance.provider_summary_generator.format_coherent_paragraph(last_summary)
return coherent_text or "Error generating coherent summary"
except Exception as e:
return f"Error: {str(e)}"
def download_coherent_summary(session: SimplifiedSessionData):
"""Download coherent summary as text file."""
if session is None:
return None
last_summary = session.app_instance.get_last_provider_summary()
if not last_summary:
return None
try:
timestamp = datetime.now().strftime("%Y%m%d_%H%M%S")
patient_name = session.app_instance.patient_info.get('name', 'Patient').replace(" ", "_")
filename = f"coherent_summary_{patient_name}_{timestamp}.txt"
# Generate coherent summary
coherent_text = session.app_instance.provider_summary_generator.format_coherent_paragraph(last_summary)
path = os.path.join(os.getcwd(), "exports", filename)
os.makedirs(os.path.dirname(path), exist_ok=True)
with open(path, "w", encoding="utf-8") as f:
f.write(coherent_text)
return path
except Exception as e:
print(f"Error downloading coherent summary: {e}")
return None