med-copilot / src /gradio_utils.py
omri374's picture
Upload 5 files
8f78c8f verified
import pandas as pd
from src.llm_calls import llm_extract_table
from src.parse_response import extract_and_return_data_table
import gradio as gr
def __update_df_state(df_before, df_state, updated_df):
new_df = pd.DataFrame(updated_df)
if df_before is not None:
new_df_before = df_before + [df_state]
else:
new_df_before = [df_state]
new_df_after = [] # Clear redo history
new_df_state = new_df.copy()
return new_df_before, new_df_state, new_df_after
def extract_table_from_chat(
chat_output, df_before, df_state, df_after, llm_type, api_key, key="Medications"
):
try:
updated_df = extract_and_return_data_table(chat_output=chat_output, key=key)
except ValueError:
try:
json_str = llm_extract_table(chat_output, llm_type, api_key)
updated_df = extract_and_return_data_table(chat_output=json_str, key=key)
except KeyError:
gr.Error(
"Cannot extract table information from chat. "
"Please ask the LLM to provide the dataset in JSON format.",
duration=None,
)
updated_df = df_before
except ValueError:
gr.Error(
"Cannot extract table information from chat. "
"Please ask the LLM to provide the dataset in JSON format.",
duration=None,
)
updated_df = df_before
new_df_before, new_df_state, new_df_after = __update_df_state(
df_before, df_state, updated_df
)
return (
new_df_state,
new_df_before,
new_df_state,
new_df_after,
gr.update(interactive=True),
gr.update(interactive=False),
)
def update_llm_selection(selected_llm):
if selected_llm == "OpenAI":
return gr.update(label="OpenAI API Key", placeholder="Enter OpenAI API Key")
elif selected_llm == "Perplexity":
return gr.update(
label="Perplexity API Key", placeholder="Enter Perplexity API Key"
)
else:
raise ValueError("Invalid LLM type selected.")
def edit_or_save_changes(updated_df, df_before, df_state, df_after, current_edit_mode):
"""Save user changes, update undo history."""
new_df = pd.DataFrame(updated_df)
new_df_before = df_before + [df_state.copy()]
new_df_after = [] # Clear redo history
new_df_state = new_df.copy()
if current_edit_mode == "Save":
# User wants to move from save to edit
return (
new_df,
new_df_before,
new_df_state,
new_df_after,
gr.update(
interactive=True
), # prev button is now enabled as there was a change
gr.update(interactive=False), # next button
gr.update(interactive=True), # df display
gr.update(value="Edit"), # edit button
"Edit",
)
elif current_edit_mode == "Edit":
return (
new_df_state,
new_df_before,
new_df_state,
new_df_after,
gr.update(interactive=False), # prev button
gr.update(interactive=False), # next button
gr.update(interactive=True), # df display
gr.update(value="Save"), # edit button
"Save",
)
else:
raise ValueError(f"Wrong edit mode selected: {current_edit_mode}. ")
def undo(df_before, df_state, df_after):
"""Undo user change without enabling Save button."""
if not df_before:
return (
df_state,
df_before,
df_state,
df_after,
gr.update(interactive=False),
gr.update(interactive=(len(df_after) > 0)),
)
new_df_after = df_after + [df_state.copy()]
new_df_state = df_before[-1]
new_df_before = df_before[:-1]
return (
new_df_state,
new_df_before,
new_df_state,
new_df_after,
gr.update(interactive=(len(new_df_before) > 0)), # prev button
gr.update(interactive=(len(new_df_after) > 0)), # next button
)
def redo(df_before, df_state, df_after):
"""Redo user change without enabling Save button."""
if not df_after:
return (
df_state,
df_before,
df_state,
df_after,
gr.update(interactive=(len(df_before) > 0)),
gr.update(interactive=False),
)
if df_state is None:
df_state = df_after
new_df_before = df_before + [df_state.copy()]
new_df_state = df_after[-1]
new_df_after = df_after[:-1]
return (
new_df_state,
new_df_before,
new_df_state,
new_df_after,
gr.update(interactive=(len(new_df_before) > 0)),
gr.update(interactive=(len(new_df_after) > 0)),
)
# def toggle_save_edit(button_state, dataframe_display):
# if button_state == "Edit":
# return "Save", gr.update(interactive=True), gr.update(interactive=True) # Enable DataFrame editing
# else:
# return "Edit", gr.update(interactive=True), gr.update(interactive=False) # Disable DataFrame editing
#
def upload_file(file, df_before, df_state, df_after):
if file is None:
return gr.update()
df = pd.read_excel(file.name, engine="openpyxl")
new_df_before, new_df_state, new_df_after = __update_df_state(
df_before, df_state, df
)
# print("Uploaded DataFrame:\n", df) # Print DataFrame to console
return (
df,
new_df_before,
df,
new_df_after,
gr.update(interactive=False),
gr.update(interactive=False),
)