import gradio as gr import os from interface_utils import * maxim = 'transparency' submaxims = ["The response recognizes the speaker’s knowledge boundaries, making clear any limitations in expertise, evidence, experience, or context.", "The response recognizes the speaker’s operational capabilities, highlighting the nature of actions that can or cannot be performed.", "The response is forthright about the speaker’s willingness to engage with specific subjects or heed relevant advice."] checkbox_choices = [ ["Yes", "No", "NA"], ["Yes", "No", "NA"], ["Yes", "No", "NA"] ] conversation_data_sliced = load_from_jsonl('./data/conversations_unlabeled_sliced.jsonl') max_conversation_length = max([len(conversation['transcript']) for conversation in conversation_data_sliced]) conversation = get_conversation(conversation_data_sliced) def save_labels(conv_id, slice_idx, skipped, submaxim_0=None, submaxim_1=None, submaxim_2=None): data = { 'conv_id': conv_id, 'slice_idx': int(slice_idx), 'maxim': maxim, 'skipped': skipped, 'submaxim_0': submaxim_0, 'submaxim_1': submaxim_1, 'submaxim_2': submaxim_2, } os.makedirs("./labels", exist_ok=True) with open(f"./labels/{maxim}_human_labels_{conv_id}_{slice_idx}.json", 'w') as f: json.dump(data, f, indent=4) def update_interface(new_conversation): new_conv_id = new_conversation['conv_id'] new_slice_idx = new_conversation['slice_idx'] new_transcript = new_conversation['transcript'] is_contextual_turn = True if new_slice_idx > 0 else False markdown_blocks = [None] * max_conversation_length for i in range(max_conversation_length): if i < len(new_transcript) and new_transcript[i]['speaker'] != '': markdown_blocks[i] = gr.Markdown( f"""  **{new_transcript[i]['speaker']}**:      {new_transcript[i]['response']}""", visible=True) else: markdown_blocks[i] = gr.Markdown("", visible=False) new_last_response = gr.Text(value=get_last_response(new_transcript), label="", lines=1, container=False, interactive=False, autoscroll=True, visible=True) new_radio_0_base = gr.Radio(label=submaxims[0], choices=checkbox_choices[0], value=None, visible=True) new_radio_1_base = gr.Radio(label=submaxims[1], choices=checkbox_choices[1], value=None, visible=True) new_radio_2_base = gr.Radio(label=submaxims[2], choices=checkbox_choices[2], value=None, visible=is_contextual_turn) conv_len = gr.Number(value=len(new_transcript), visible=False) return [new_conv_id] + [new_slice_idx] + list(markdown_blocks) + [new_last_response] + [new_radio_0_base] + [new_radio_1_base] + [new_radio_2_base] + [conv_len] def submit(*args): conv_id = args[0] slice_idx = args[1] submaxim_0 = args[-4] submaxim_1 = args[-3] submaxim_2 = args[-2] save_labels(conv_id, slice_idx, skipped=False, submaxim_0=submaxim_0, submaxim_1=submaxim_1, submaxim_2=submaxim_2) new_conversation = get_conversation(conversation_data_sliced) return update_interface(new_conversation) def skip(*args): conv_id = args[0] slice_idx = args[1] save_labels(conv_id, slice_idx, skipped=True) new_conversation = get_conversation(conversation_data_sliced) return update_interface(new_conversation, slice_idx) with gr.Blocks(theme=gr.themes.Default()) as interface: conv_id = conversation['conv_id'] slice_idx = conversation['slice_idx'] transcript = conversation['transcript'] conv_len = gr.Number(value=len(transcript), visible=False) is_contextual_turn = True if slice_idx > 0 else False markdown_blocks = [None] * max_conversation_length with gr.Column(scale=1, min_width=600): with gr.Group(): gr.Markdown("""    **Conversational context** """, visible=True) for i in range(max_conversation_length): if i < len(transcript): markdown_blocks[i] = gr.Markdown( f"""  **{transcript[i]['speaker']}**:      {transcript[i]['response']}""") else: markdown_blocks[i] = gr.Markdown("") if i >= conv_len.value: markdown_blocks[i].visible = False with gr.Row(): with gr.Group(elem_classes="bottom-aligned-group"): speaker_adapted = gr.Markdown( f"""    **Response to label** """, visible=True) last_response = gr.Textbox(value=get_last_response(transcript), label="", lines=1, container=False, interactive=False, autoscroll=True, visible=True) radio_submaxim_0_base = gr.Radio(label=submaxims[0], choices=checkbox_choices[0], value=None, visible=True) radio_submaxim_1_base = gr.Radio(label=submaxims[1], choices=checkbox_choices[1], value=None, visible=is_contextual_turn) radio_submaxim_2_base = gr.Radio(label=submaxims[2], choices=checkbox_choices[2], value=None, visible=is_contextual_turn) submit_button = gr.Button("Submit") skip_button = gr.Button("Skip") conv_id_element = gr.Text(value=conv_id, visible=False) slice_idx_element = gr.Text(value=slice_idx, visible=False) input_list = [conv_id_element] + \ [slice_idx_element] + \ markdown_blocks + \ [last_response] + \ [radio_submaxim_0_base] + \ [radio_submaxim_1_base] + \ [radio_submaxim_2_base] + \ [conv_len] submit_button.click( fn=submit, inputs=input_list, outputs=[conv_id_element, slice_idx_element, *markdown_blocks, last_response, radio_submaxim_0_base, radio_submaxim_1_base, radio_submaxim_2_base, conv_len] ) skip_button.click( fn=skip, inputs=input_list, outputs=[conv_id_element, slice_idx_element, *markdown_blocks, last_response, radio_submaxim_0_base, radio_submaxim_1_base, radio_submaxim_2_base, conv_len] ) css = """ #textbox_id textarea { background-color: white; } .bottom-aligned-group { display: flex; flex-direction: column; justify-content: flex-end; height: 100%; } """ interface.css = css interface.launch()