|
import gradio as gr |
|
from functions import example_question_generator, chatbot_func |
|
from data_sources import process_data_upload |
|
from utils import message_dict |
|
import ast |
|
|
|
def run_example(input): |
|
return input |
|
|
|
def example_display(input): |
|
if input == None: |
|
display = True |
|
else: |
|
display = False |
|
return [gr.update(visible=display),gr.update(visible=display),gr.update(visible=display),gr.update(visible=display)] |
|
|
|
with gr.Blocks() as demo: |
|
description = gr.HTML(""" |
|
<!-- Header --> |
|
<div class="max-w-4xl mx-auto mb-12 text-center"> |
|
<div class="bg-blue-50 border border-blue-200 rounded-lg max-w-2xl mx-auto"> |
|
<h2 class="font-semibold text-blue-800 "> |
|
<i class="fas fa-info-circle mr-2"></i>Supported Files |
|
</h2> |
|
<div class="flex flex-wrap justify-center gap-3 pb-4 text-blue-700"> |
|
<span class="tooltip"> |
|
<i class="fas fa-file-csv mr-1"></i>CSV |
|
<span class="tooltip-text">Comma-separated values</span> |
|
</span> |
|
<span class="tooltip"> |
|
<i class="fas fa-file-alt mr-1"></i>TSV |
|
<span class="tooltip-text">Tab-separated values</span> |
|
</span> |
|
<span class="tooltip"> |
|
<i class="fas fa-file-alt mr-1"></i>TXT |
|
<span class="tooltip-text">Text files</span> |
|
</span> |
|
<span class="tooltip"> |
|
<i class="fas fa-file-excel mr-1"></i>XLS/XLSX |
|
<span class="tooltip-text">Excel spreadsheets</span> |
|
</span> |
|
<span class="tooltip"> |
|
<i class="fas fa-file-code mr-1"></i>XML |
|
<span class="tooltip-text">XML documents</span> |
|
</span> |
|
<span class="tooltip"> |
|
<i class="fas fa-file-code mr-1"></i>JSON |
|
<span class="tooltip-text">JSON data files</span> |
|
</span> |
|
</div> |
|
</div> |
|
</div> |
|
""", elem_classes="description_component") |
|
example_file_1 = gr.File(visible=False, value="samples/bank_marketing_campaign.csv") |
|
example_file_2 = gr.File(visible=False, value="samples/online_retail_data.csv") |
|
example_file_3 = gr.File(visible=False, value="samples/tb_illness_data.csv") |
|
with gr.Row(): |
|
example_btn_1 = gr.Button(value="Try Me: bank_marketing_campaign.csv", elem_classes="sample-btn bg-gradient-to-r from-purple-500 to-indigo-600 text-white p-6 rounded-lg text-left hover:shadow-lg", size="md", variant="primary") |
|
example_btn_2 = gr.Button(value="Try Me: online_retail_data.csv", elem_classes="sample-btn bg-gradient-to-r from-purple-500 to-indigo-600 text-white p-6 rounded-lg text-left hover:shadow-lg", size="md", variant="primary") |
|
example_btn_3 = gr.Button(value="Try Me: tb_illness_data.csv", elem_classes="sample-btn bg-gradient-to-r from-purple-500 to-indigo-600 text-white p-6 rounded-lg text-left hover:shadow-lg", size="md", variant="primary") |
|
|
|
file_output = gr.File(label="Data File (CSV, TSV, TXT, XLS, XLSX, XML, JSON)", show_label=True, elem_classes="file_marker drop-zone border-2 border-dashed border-gray-300 rounded-lg hover:border-primary cursor-pointer bg-gray-50 hover:bg-blue-50 transition-colors duration-300", file_types=['.csv','.xlsx','.txt','.json','.ndjson','.xml','.xls','.tsv']) |
|
example_btn_1.click(fn=run_example, inputs=example_file_1, outputs=file_output) |
|
example_btn_2.click(fn=run_example, inputs=example_file_2, outputs=file_output) |
|
example_btn_3.click(fn=run_example, inputs=example_file_3, outputs=file_output) |
|
file_output.change(fn=example_display, inputs=file_output, outputs=[example_btn_1, example_btn_2, example_btn_3, description]) |
|
|
|
@gr.render(inputs=file_output) |
|
def data_options(filename, request: gr.Request): |
|
print(filename) |
|
if request.session_hash not in message_dict: |
|
message_dict[request.session_hash] = {} |
|
message_dict[request.session_hash]['file_upload'] = None |
|
if filename: |
|
process_message = process_upload(filename, request.session_hash) |
|
gr.HTML(value=process_message[1], padding=False) |
|
if process_message[0] == "success": |
|
if "bank_marketing_campaign" in filename: |
|
example_questions = [ |
|
["Describe the dataset"], |
|
["What levels of education have the highest and lowest average balance?"], |
|
["What job is most and least common for a yes response from the individuals, not counting 'unknown'?"], |
|
["Can you generate a bar chart of education vs. average balance?"], |
|
["Can you generate a table of levels of education versus average balance, percent married, percent with a loan, and percent in default?"], |
|
["Can we predict the relationship between the number of contacts performed before this campaign and the average balance?"], |
|
["Can you plot the number of contacts performed before this campaign versus the duration and use balance as the size in a bubble chart?"] |
|
] |
|
elif "online_retail_data" in filename: |
|
example_questions = [ |
|
["Describe the dataset"], |
|
["What month had the highest revenue?"], |
|
["Is revenue higher in the morning or afternoon?"], |
|
["Can you generate a line graph of revenue per month?"], |
|
["Can you generate a table of revenue per month?"], |
|
["Can we predict how time of day affects transaction value in this data set?"], |
|
["Can you plot revenue per month with size being the number of units sold that month in a bubble chart?"] |
|
] |
|
else: |
|
try: |
|
generated_examples = ast.literal_eval(example_question_generator(request.session_hash, 'file_upload', '', process_message[1], '')) |
|
example_questions = [ |
|
["Describe the dataset"] |
|
] |
|
for example in generated_examples: |
|
example_questions.append([example]) |
|
except Exception as e: |
|
print("DATA FILE QUESTION GENERATION ERROR") |
|
print(e) |
|
example_questions = [ |
|
["Describe the dataset"], |
|
["List the columns in the dataset"], |
|
["What could this data be used for?"], |
|
] |
|
session_hash = gr.Textbox(visible=False, value=request.session_hash) |
|
data_source = gr.Textbox(visible=False, value='file_upload') |
|
schema = gr.Textbox(visible=False, value='') |
|
titles = gr.Textbox(value=process_message[2], interactive=False, visible=False) |
|
bot = gr.Chatbot(type='messages', label="CSV Chat Window", render_markdown=True, sanitize_html=False, show_label=True, render=False, visible=True, elem_classes="chatbot") |
|
chat = gr.ChatInterface( |
|
fn=chatbot_func, |
|
type='messages', |
|
chatbot=bot, |
|
title="Chat with your data file", |
|
concurrency_limit=None, |
|
examples=example_questions, |
|
additional_inputs=[session_hash, data_source, titles, schema] |
|
) |
|
|
|
def process_upload(upload_value, session_hash): |
|
if upload_value: |
|
process_message = process_data_upload(upload_value, session_hash) |
|
return process_message |
|
|
|
|
|
if __name__ == "__main__": |
|
demo.launch() |