Spaces:
Sleeping
Sleeping
import gradio as gr | |
import os | |
from llm.gptPlotCreator import PlotCreator | |
def add_text(history, text, plot_creator): | |
history = history + [(text, None)] | |
return history, plot_creator, "" | |
def add_file(history, file, plot_creator): | |
print(file.name) | |
history = history + [((file.name,), None)] | |
plot_creator.set_logfile_name(file.name) | |
return history, plot_creator | |
def format_history(history): | |
return "\n".join([f"Human: {entry[0]}\nAI: {entry[1]}" for entry in history ]) | |
def bot(history, plot_creator): | |
# Get the last input from the user | |
user_input = history[-1][0] if history and history[-1][0] else None | |
print(user_input) | |
print(type(plot_creator)) | |
# Check if it is a string | |
if isinstance(user_input, str) and plot_creator.logfile_name != "": | |
history[-1][1] = "I am figuring out what data types are relevant for the plot...\n" | |
yield history, plot_creator | |
data_types_str = plot_creator.find_relevant_data_types(user_input) | |
history[-1][1] += "I am now generating a script to plot the data...\n" | |
yield history, plot_creator | |
plot_creator.create_plot(user_input, data_types_str) | |
history[-1][1] += "I am now running the script I just Generated...\n" | |
yield history, plot_creator | |
response = plot_creator.run_script() | |
history = history + [(None, f"Here is the code used to generate the plot:")] | |
history = history + [(None, f"{response[1]}")] | |
history = history + response[0] | |
yield history, plot_creator | |
elif not plot_creator.logfile_name: | |
yield history + [(None, "Please upload a log file before attempting to create a plot.")], plot_creator | |
else: | |
plot_creator = PlotCreator() # access the state variable through `.value` | |
file_path = user_input[0] | |
plot_creator.set_logfile_name(file_path) | |
# get only base name | |
filename, extension = os.path.splitext(os.path.basename(file_path)) | |
history[-1][0] = f"user uploaded file: {filename}{extension}" | |
history[-1][1] = "processing file..." | |
yield history, plot_creator | |
data_types = plot_creator.parse_mavlink_log() | |
history = history + [(None, f"I am done processing the file. Now you can ask me to generate a plot.")] | |
yield history, plot_creator | |
return history, plot_creator | |
initial_message = (None, "Hello! I am a chat bot designed to plot logs from drones. To get started, please upload a log file. Then ask me to generate a plot! If you need an example log you can download one from here: https://drive.google.com/file/d/1BKv-NbSvYQz9XqqmyOyOhe3o4PAFDyZa/view?usp=sharing") | |
with gr.Blocks() as demo: | |
gr.Markdown("# GPT MAVPlot\n\nThis web-based tool allows users to upload mavlink tlogs in which the chat bot will use to generate plots from. It does this by creating a python script using pymavlink and matplotlib. The output includes the plot and the code used to generate it. ") | |
plot_creator = gr.State(PlotCreator()) | |
chatbot = gr.Chatbot([initial_message], elem_id="chatbot").style(height=750) | |
with gr.Row(): | |
with gr.Column(scale=0.85): | |
txt = gr.Textbox( | |
show_label=False, | |
placeholder="Enter text and press enter, or upload an image", | |
).style(container=False) | |
with gr.Column(scale=0.15, min_width=0): | |
btn = gr.UploadButton("π", file_types=["file"]) | |
txt.submit(add_text, [chatbot, txt, plot_creator], [chatbot, plot_creator, txt]).then( | |
bot, [chatbot, plot_creator], [chatbot, plot_creator] | |
) | |
btn.upload(add_file, [chatbot, btn, plot_creator], [chatbot, plot_creator]).then( | |
bot, [chatbot, plot_creator], [chatbot, plot_creator] | |
) | |
if __name__ == "__main__": | |
demo.queue() | |
demo.launch() | |