import pandas as pd import gradio as gr import numpy as np from pandasai import SmartDataframe from pandasai.llm import OpenAI from PIL import Image import base64 from io import BytesIO def ask(query, file, api_token): data = pd.read_csv(file, index_col=0) llm = OpenAI(api_token=api_token) df = SmartDataframe(data, config={"llm": llm}) result = df.chat(query) if isinstance(result, str) and result.endswith('.png'): # Open the image file img = Image.open('exports/charts/temp_chart.png') # Convert the PIL Image to a base64 encoded string buffered = BytesIO() img.save(buffered, format="PNG") img_str = base64.b64encode(buffered.getvalue()).decode("utf-8") # Construct the HTML string to display the image html = f"Generated Image" return html elif isinstance(result, pd.DataFrame): html_table = result.to_html() return html_table else: return result def on_file_upload(file, api_token): data = pd.read_csv(file, index_col=0) llm = OpenAI(api_token=api_token) df = SmartDataframe(data, config={"llm": llm}) result = df.chat('What are the name of my columns') return result with gr.Blocks() as demo: headers = gr.Markdown("

This is a project from Chasers using Pandas AI

") with gr.Row(): # First column for the first image with gr.Column(): gr.HTML(""" """) # Second column for the clickable image with gr.Column(): gr.HTML(""" """) api_token_input = gr.Textbox(lines=1, label="Enter your API token") file_input = gr.File() upload_button = gr.Button("Process Uploaded File") upload_message = gr.Label("") upload_button.click(on_file_upload, inputs=[file_input, api_token_input], outputs=[upload_message]) query_input = gr.Textbox(lines=2, label="Use exactly the name of the columns in your querys") output_html = gr.HTML() # Button to trigger the ask function submit_button = gr.Button("Submit") submit_button.click(ask, inputs=[query_input, file_input, api_token_input], outputs=[output_html]) demo.launch()