# gradio_app.py """ Simplified Gradio Interface for Medical Brain with Background Spiritual Monitoring. Single unified medical interface with invisible spiritual monitoring. No mode selector - just medical dialog with automatic spiritual support. Requirements: 1.3, 4.1, 4.2, 12.1, 12.2 """ import os import sys # Ensure project root is in Python path project_root = os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) if project_root not in sys.path: sys.path.insert(0, project_root) from dotenv import load_dotenv # Load environment variables load_dotenv() import gradio as gr # Import modularized components from src.interface.session_manager import SimplifiedSessionData from src.interface import stats_handlers from src.interface import chat_handlers from src.interface import prompt_handlers from src.interface import verification_handlers from src.interface import profile_handlers from src.interface import model_handlers from src.core.simplified_medical_app import SimplifiedMedicalApp from src.core.spiritual_state import SpiritualState from src.interface.enhanced_verification_interface import create_enhanced_verification_tab from src.interface.help_content import HELP_CONTENT try: from app_config import ( GRADIO_CONFIG, ENHANCED_VERIFICATION_CONFIG, FEATURE_FLAGS, is_feature_enabled ) except ImportError: GRADIO_CONFIG = {"theme": "soft", "show_api": False} ENHANCED_VERIFICATION_CONFIG = {"enabled": True} FEATURE_FLAGS = { "enhanced_verification_enabled": True, "standard_verification_enabled": True, "show_mode_navigation_hints": True, } def is_feature_enabled(feature_name: str) -> bool: return FEATURE_FLAGS.get(feature_name, False) def create_simplified_interface(): """ Create simplified Gradio interface. Single medical assistant interface with background spiritual monitoring. No mode selector - spiritual support is automatic and invisible. Requirements: 1.3, 4.1, 12.1 """ debug_mode = os.getenv("LOG_PROMPTS", "false").lower() == "true" # Theme setup theme_name = GRADIO_CONFIG.get("theme", "soft") if theme_name.lower() == "soft": theme = gr.themes.Soft() else: theme = gr.themes.Default() demo = gr.Blocks( title="๐ฅ Medical Assistant with Spiritual Support", analytics_enabled=False ) demo.theme = theme with demo: # Session state session_data = gr.State(value=None) # Header gr.Markdown("# ๐ฅ Medical Assistant with Spiritual Support ๐๏ธ") gr.Markdown("Your personal healthcare companion with integrated wellness support") if debug_mode: gr.Markdown("โ ๏ธ **DEBUG MODE:** Prompts and responses are logged") # Session info session_info = gr.Markdown("๐ **Initializing session...**") # Initialize session def initialize_session(): """Initialize new user session.""" new_session = SimplifiedSessionData() session_info_text = f""" โ **Session Ready** ๐ Session: `{new_session.session_id[:8]}...` ๐ Started: {new_session.created_at[:19]} """ return new_session, session_info_text # Main interface - using Tabs with elem_id for navigation main_tabs = gr.Tabs(elem_id="main_tabs") with main_tabs: # Note: The following tabs are intentionally hidden for now: # - โ๏ธ Edit Enhanced Datasets # - โ Standard Verification # We keep the rest of the interface focused on Chat + Conversation Verification. # Chat tab with gr.TabItem("๐ฌ Chat", id="chat"): with gr.Row(): with gr.Column(scale=2): chatbot = gr.Chatbot( label="๐ฌ Conversation", height=450 ) with gr.Row(): msg = gr.Textbox( label="Your message", placeholder="Type your health question...", scale=4 ) send_btn = gr.Button("๐ค Send", scale=1, variant="primary") with gr.Row(): clear_btn = gr.Button("๐๏ธ Clear Chat", scale=1) # Conversation logging section gr.Markdown("### ๐ Conversation Logs:") with gr.Row(): download_json_btn = gr.DownloadButton("๐ฅ Download JSON", scale=1, size="sm") download_csv_btn = gr.DownloadButton("๐ Download CSV", scale=1, size="sm") # Conversation verification is available in the dedicated # "๐งพ Conversation Verification" tab. # Quick examples gr.Markdown("### โก Quick Start:") with gr.Row(): example_medical = gr.Button("๐ข I am fine", size="sm") example_wellness = gr.Button("๐ก I'm feeling stressed", size="sm") example_help = gr.Button("๐ด Emotional crisis", size="sm") with gr.Column(scale=1): status_box = gr.Markdown( value="๐ Loading...", label="๐ Status" ) refresh_btn = gr.Button("๐ Check Status & Summary", size="sm") # Conversation statistics gr.Markdown("### ๐ Conversation Stats") conversation_stats = gr.Markdown( value="No conversation yet", label="Statistics" ) # Debug info (only in debug mode) if debug_mode: gr.Markdown("### ๐ง Debug Info") debug_info = gr.Markdown(value="") # Provider Summary Panel (for RED flags) - always visible but content controlled with gr.Column(scale=1) as provider_summary_column: with gr.Group(visible=False) as provider_summary_content: gr.Markdown("### ๐ Provider Summary") gr.Markdown("*For Spiritual Care Team*", elem_classes=["provider-subtitle"]) provider_summary_status = gr.Markdown( value="**Provider Summary Generated**\n\nA detailed summary has been generated for the spiritual care team. Use the Download button below to access the full summary." ) # Tabs for different summary views (Medical Brain Summary first by default) with gr.Tabs(): # Coherent Paragraph Tab (FIRST - Requirements 2.1-2.8) - Medical Brain compatibility with gr.TabItem("๐ Medical Brain Summary"): gr.Markdown("*Single paragraph format for Medical Brain compatibility - **Default View***") coherent_summary_display = gr.Textbox( value="", lines=8, label="Medical Brain Compatible Summary", interactive=False ) with gr.Row(): regenerate_coherent_btn = gr.Button( "๐ Regenerate Medical Brain Summary", size="sm", variant="secondary" ) download_coherent_btn = gr.DownloadButton( "๐ฅ Download Medical Brain Summary", size="sm", variant="secondary" ) # Structured Summary Tab (moved to second position) with gr.TabItem("๐ Structured Summary"): provider_summary_display = gr.HTML(value="") with gr.Row(): download_summary_btn = gr.DownloadButton( "๐ฅ Download Full Summary", size="sm", variant="secondary" ) clear_summary_btn = gr.Button( "๐๏ธ Clear", size="sm" ) # Conversation Verification tab (chat-derived) with gr.TabItem("๐งพ Conversation Verification", id="conversation_verification"): gr.Markdown("## ๐งพ Conversation Verification (from Chat)") gr.Markdown( "Click **Generate** to build a verification session from the current chat. " "Review each exchange, mark it correct/incorrect, and download the session JSON." ) conv_verify_state = gr.State(value=None) # holds exported JSON path conv_verify_index = gr.State(value=0) conv_verify_records = gr.State(value=[]) with gr.Row(): generate_conv_verification_btn = gr.Button("๐ Generate from current chat", variant="primary") conv_verify_download_btn = gr.DownloadButton("โฌ๏ธ Download reviewed JSON", variant="secondary") conv_verify_download_csv_btn = gr.DownloadButton("๐ Download CSV", variant="secondary") conv_verify_status = gr.Markdown(value="", visible=True) conv_verify_exchange = gr.HTML(value="", label="Current Exchange") with gr.Row(): conv_correct_btn = gr.Button("โ Correct", variant="primary") conv_incorrect_btn = gr.Button("โ Incorrect") conv_prev_btn = gr.Button("โฌ ๏ธ Previous") conv_next_btn = gr.Button("Next โก๏ธ") # Shown only when marking Incorrect with gr.Row(visible=False) as conv_incorrect_comment_row: with gr.Column(scale=3): gr.Markdown("### Select Correct Classification:") conv_correct_classification = gr.Radio( choices=[ "๐ข Should be GREEN - No distress", "๐ก Should be YELLOW - Needs clarification", "๐ด Should be RED - Spiritual distress" ], label="Correct Classification", interactive=True ) conv_incorrect_comment = gr.Textbox( label="Comment (why incorrect / what to fix)", placeholder="Add a short note for this exchange...", lines=3, ) with gr.Column(scale=1): conv_save_comment_btn = gr.Button("๐พ Save comment", variant="secondary") with gr.Row(): with gr.Column(scale=1): conv_position = gr.Markdown(value="") with gr.Column(scale=1): conv_stats = gr.HTML(value="") # Enhanced Verification Modes tab (hidden sub-tabs; kept but moved after Conversation Verification) if is_feature_enabled("enhanced_verification_enabled"): with gr.TabItem("๐ Enhanced Verification", id="enhanced_verification"): enhanced_verification_interface = create_enhanced_verification_tab() # Model Selection tab (second tab) with gr.TabItem("โ๏ธ Model Settings", id="model_settings"): gr.Markdown("## โ๏ธ AI Model Configuration") gr.Markdown("Select which AI models to use for different tasks. Changes apply to your current session.") with gr.Row(): with gr.Column(): gr.Markdown("### ๐ Spiritual Monitor (Classifier)") spiritual_model = gr.Dropdown( choices=[ "gemini-2.5-flash", "gemini-2.0-flash", "gemini-3-flash-preview", "claude-sonnet-4-5-20250929", "claude-sonnet-4-20250514", "claude-3-7-sonnet-20250219" ], value="gemini-2.5-flash", label="Spiritual Distress Analyzer", interactive=True ) gr.Markdown("### ๐ก Soft Spiritual Triage") soft_spiritual_triage_model = gr.Dropdown( choices=[ "claude-sonnet-4-5-20250929", "claude-sonnet-4-20250514", "claude-3-7-sonnet-20250219", "gemini-2.5-flash", "gemini-2.0-flash", "gemini-3-flash-preview" ], value="claude-sonnet-4-5-20250929", label="Soft Spiritual Triage", interactive=True ) with gr.Column(): gr.Markdown("### ๐ Triage Response Evaluator") triage_evaluate_model = gr.Dropdown( choices=[ "gemini-2.5-flash", "gemini-2.0-flash", "gemini-3-flash-preview", "claude-sonnet-4-5-20250929", "claude-sonnet-4-20250514", "claude-3-7-sonnet-20250219" ], value="gemini-2.5-flash", label="Triage Response Evaluator", interactive=True ) gr.Markdown("### ๐ฅ Medical Assistant") medical_model = gr.Dropdown( choices=[ "claude-sonnet-4-5-20250929", "claude-sonnet-4-20250514", "claude-3-7-sonnet-20250219", "gemini-2.5-flash", "gemini-2.0-flash", "gemini-3-flash-preview" ], value="claude-sonnet-4-5-20250929", label="Medical Assistant", interactive=True ) with gr.Column(): gr.Markdown("### ๐ฉบ Soft Medical Triage") soft_triage_model = gr.Dropdown( choices=[ "claude-sonnet-4-5-20250929", "claude-sonnet-4-20250514", "claude-3-7-sonnet-20250219", "gemini-2.5-flash", "gemini-2.0-flash", "gemini-3-flash-preview" ], value="claude-sonnet-4-5-20250929", label="Soft Medical Triage", interactive=True ) gr.Markdown("### ๐ฌ Medical Brain Summary Generator") spiritual_care_message_model = gr.Dropdown( choices=[ "claude-sonnet-4-5-20250929", "claude-sonnet-4-20250514", "claude-3-7-sonnet-20250219", "gemini-2.5-flash", "gemini-2.0-flash", "gemini-3-flash-preview" ], value="claude-sonnet-4-5-20250929", label="Medical Brain Summary Generator (uses Spiritual Care Message prompt)", interactive=True ) with gr.Row(): apply_models_btn = gr.Button("โ Apply Model Settings", variant="primary", scale=2) reset_models_btn = gr.Button("๐ Reset to Defaults", scale=1) model_status = gr.HTML(value="", visible=True) # Edit Prompts tab with gr.TabItem("๐ง Edit Prompts", id="edit_prompts"): gr.Markdown("## ๐ง Customize AI Prompts") gr.Markdown("โ ๏ธ **Note:** Changes apply only to your current session.") # Prompt selector with gr.Row(): prompt_selector = gr.Dropdown( choices=[ "๐ Spiritual Monitor (Classifier)", "๐ก Soft Spiritual Triage", "๐ Triage Response Evaluator", "๐ฅ Medical Assistant", "๐ฉบ Soft Medical Triage", "๐ฌ Spiritual Care Message" ], value="๐ Spiritual Monitor (Classifier)", label="Select Prompt to Edit", interactive=True ) with gr.Row(): with gr.Column(scale=3): # Prompt editor prompt_editor = gr.Code( label="System Prompt", value="", language="markdown", lines=25, interactive=True ) with gr.Row(): load_prompt_btn = gr.Button("๐ฅ Load Prompt", scale=1) apply_prompt_btn = gr.Button("โ Apply Changes", variant="primary", scale=2) reset_prompt_btn = gr.Button("๐ Reset to Default", variant="secondary", scale=1) with gr.Row(): promote_prompt_btn = gr.Button("๐ค Promote to File", variant="stop", scale=1) validate_prompt_btn = gr.Button("๐ Validate", variant="secondary", scale=1) prompt_status = gr.HTML( value="", visible=True, elem_classes=["prompt-status-container"] ) with gr.Column(scale=1): gr.Markdown("### ๐ Prompt Info") prompt_info_display = gr.HTML(value="""
Select a prompt to edit
Available prompts:
Tips: