No data available
", "", "", "", "", "", 0, 0 item = DATA[conv_idx] conversations = item.get("conversations", {}) if variant not in conversations: return f"Variant '{variant}' not available
", "", "", "", "", "", 0, 0 turns = conversations[variant].get("turns", []) max_turns = len(turns) if max_turns == 0: return "No turns in this conversation
", "", "", "", "", "", 0, 0 # Clamp turn_idx turn_idx = max(0, min(turn_idx, max_turns - 1)) # Get EHR data for reference lookup ehr_dict = item.get("ehr_dict", {}) # Collect all refs up to current turn all_refs = {"history": {}, "findings": {}, "treatment": {}, "plan": {}, "order": {}} # Build conversation HTML conv_html = '{clean_content}
Select a conversation
", "", "", "", "", "", 0, 0 # Extract index from selection (format: "1. scenario...") try: conv_idx = int(conv_selection.split(".")[0]) - 1 except: conv_idx = 0 # Start at first turn return render_conversation(conv_idx, variant, 0) def on_variant_change(conv_selection: str, variant: str, current_turn: int): """Handle variant dropdown change.""" if not conv_selection: return "Select a conversation
", "", "", "", "", "", 0, 0 try: conv_idx = int(conv_selection.split(".")[0]) - 1 except: conv_idx = 0 # Reset to first turn when variant changes return render_conversation(conv_idx, variant, 0) def on_next(conv_selection: str, variant: str, current_turn: int, max_turns: int): """Go to next turn.""" if not conv_selection: return "Select a conversation
", "", "", "", "", "", 0, 0 try: conv_idx = int(conv_selection.split(".")[0]) - 1 except: conv_idx = 0 new_turn = min(current_turn + 1, max_turns - 1) return render_conversation(conv_idx, variant, new_turn) def on_back(conv_selection: str, variant: str, current_turn: int, max_turns: int): """Go to previous turn.""" if not conv_selection: return "Select a conversation
", "", "", "", "", "", 0, 0 try: conv_idx = int(conv_selection.split(".")[0]) - 1 except: conv_idx = 0 new_turn = max(current_turn - 1, 0) return render_conversation(conv_idx, variant, new_turn) def on_reset(conv_selection: str, variant: str): """Reset to first turn.""" if not conv_selection: return "Select a conversation
", "", "", "", "", "", 0, 0 try: conv_idx = int(conv_selection.split(".")[0]) - 1 except: conv_idx = 0 return render_conversation(conv_idx, variant, 0) def on_end(conv_selection: str, variant: str, max_turns: int): """Go to last turn.""" if not conv_selection: return "Select a conversation
", "", "", "", "", "", 0, 0 try: conv_idx = int(conv_selection.split(".")[0]) - 1 except: conv_idx = 0 return render_conversation(conv_idx, variant, max_turns - 1) # Build Gradio interface with gr.Blocks(title="Medical Conversation Viewer") as demo: gr.Markdown(""" # Medical Conversation Dataset Viewer View synthetic German doctor-patient conversations with EHR (Electronic Health Record) reference tracking. **Instructions:** 1. Select a conversation from the dropdown 2. Choose a conversation variant (natural, inline_dictation, post_dictation) 3. Use the navigation buttons to step through the conversation 4. Watch the EHR buckets populate as references appear in the dialogue """) # State variables max_turns_state = gr.State(0) current_turn_state = gr.State(0) # Top controls with gr.Row(): conv_dropdown = gr.Dropdown( choices=get_conversation_options(), label="Select Conversation", value=get_conversation_options()[0] if get_conversation_options() else None, scale=3 ) variant_dropdown = gr.Dropdown( choices=VARIANTS, label="Variant", value="natural", scale=1 ) # Navigation controls with gr.Row(): reset_btn = gr.Button("⏮ Start", size="sm") back_btn = gr.Button("◀ Back", size="sm") turn_display = gr.Markdown("Turn: 1 / 1") next_btn = gr.Button("Next ▶", size="sm") end_btn = gr.Button("End ⏭", size="sm") # Main content area with gr.Row(): # Left: Conversation with gr.Column(scale=1): gr.Markdown("### Conversation") conversation_html = gr.HTML("Select a conversation to begin
") # Right: EHR Buckets with gr.Column(scale=1): gr.Markdown("### EHR Summary") with gr.Accordion("History (Anamnese)", open=True): history_html = gr.HTML("Keine Einträge") with gr.Accordion("Findings (Befunde)", open=True): findings_html = gr.HTML("Keine Einträge") with gr.Accordion("Treatment (Therapie)", open=True): treatment_html = gr.HTML("Keine Einträge") with gr.Accordion("Plan (Prozedere)", open=True): plan_html = gr.HTML("Keine Einträge") with gr.Accordion("Orders (Anordnungen)", open=True): orders_html = gr.HTML("Keine Einträge") # Output components list for convenience outputs = [ conversation_html, history_html, findings_html, treatment_html, plan_html, orders_html, max_turns_state, current_turn_state ] # Update turn display def update_turn_display(current_turn, max_turns): return f"**Turn: {current_turn + 1} / {max_turns}**" # Event handlers def handle_conversation_change(conv, var): result = on_conversation_change(conv, var) turn_text = update_turn_display(result[7], result[6]) return result + (turn_text,) def handle_variant_change(conv, var, curr): result = on_variant_change(conv, var, curr) turn_text = update_turn_display(result[7], result[6]) return result + (turn_text,) def handle_next(conv, var, curr, max_t): result = on_next(conv, var, curr, max_t) turn_text = update_turn_display(result[7], result[6]) return result + (turn_text,) def handle_back(conv, var, curr, max_t): result = on_back(conv, var, curr, max_t) turn_text = update_turn_display(result[7], result[6]) return result + (turn_text,) def handle_reset(conv, var): result = on_reset(conv, var) turn_text = update_turn_display(result[7], result[6]) return result + (turn_text,) def handle_end(conv, var, max_t): result = on_end(conv, var, max_t) turn_text = update_turn_display(result[7], result[6]) return result + (turn_text,) # Wire up events conv_dropdown.change( fn=handle_conversation_change, inputs=[conv_dropdown, variant_dropdown], outputs=outputs + [turn_display] ) variant_dropdown.change( fn=handle_variant_change, inputs=[conv_dropdown, variant_dropdown, current_turn_state], outputs=outputs + [turn_display] ) next_btn.click( fn=handle_next, inputs=[conv_dropdown, variant_dropdown, current_turn_state, max_turns_state], outputs=outputs + [turn_display] ) back_btn.click( fn=handle_back, inputs=[conv_dropdown, variant_dropdown, current_turn_state, max_turns_state], outputs=outputs + [turn_display] ) reset_btn.click( fn=handle_reset, inputs=[conv_dropdown, variant_dropdown], outputs=outputs + [turn_display] ) end_btn.click( fn=handle_end, inputs=[conv_dropdown, variant_dropdown, max_turns_state], outputs=outputs + [turn_display] ) # Load initial conversation demo.load( fn=handle_conversation_change, inputs=[conv_dropdown, variant_dropdown], outputs=outputs + [turn_display] ) if __name__ == "__main__": demo.launch()