CSVAgent / app.py
Quazim0t0's picture
Update app.py
6d10b4f verified
raw
history blame
5.66 kB
import os
import gradio as gr
from sqlalchemy import text
from smolagents import tool, CodeAgent, HfApiModel
import spaces
import pandas as pd
from database import (
engine,
create_dynamic_table,
clear_database,
insert_rows_into_table,
get_table_schema
)
def process_sql_file(file_path):
"""
Process an SQL file and execute its contents.
"""
try:
# Read the SQL file
with open(file_path, 'r') as file:
sql_content = file.read()
# Replace AUTO_INCREMENT with AUTOINCREMENT for SQLite compatibility
sql_content = sql_content.replace('AUTO_INCREMENT', 'AUTOINCREMENT')
# Split into individual statements
statements = [stmt.strip() for stmt in sql_content.split(';') if stmt.strip()]
# Clear existing database
clear_database()
# Execute each statement
with engine.begin() as conn:
for statement in statements:
if statement.strip():
conn.execute(text(statement))
return True, "SQL file successfully executed! Click 'Continue' to proceed to query interface..."
except Exception as e:
return False, f"Error processing SQL file: {str(e)}"
# ... (other functions remain the same) ...
# Create the Gradio interface
with gr.Blocks() as demo:
# Upload Interface Components
with gr.Group() as upload_group:
gr.Markdown("""
# Data Query Interface
Upload your data file to begin.
### Supported File Types:
- SQL (.sql): SQL file containing CREATE TABLE and INSERT statements
- CSV (.csv): CSV file with headers that will be automatically converted to a table
### CSV Requirements:
- Must include headers
- First column will be used as the primary key
- Column types will be automatically detected
### SQL Requirements:
- Must contain valid SQL statements
- Statements must be separated by semicolons
- Should include CREATE TABLE and data insertion statements
""")
file_input = gr.File(
label="Upload Data File",
file_types=[".csv", ".sql"],
type="filepath"
)
upload_status = gr.Textbox(label="Status", interactive=False)
continue_btn = gr.Button("Continue", visible=False)
# Query Interface Components
with gr.Group(visible=False) as query_group:
gr.Markdown("## Data Query Interface")
# Data Display Section
gr.Markdown("### Current Data")
data_table = gr.Dataframe(
value=get_data_table(),
label="Data Table",
interactive=False
)
schema_display = gr.Markdown(value="Loading schema...")
# Query Section
with gr.Row():
with gr.Column():
user_input = gr.Textbox(
label="Ask a question about the data",
placeholder="Enter your question here..."
)
query_output = gr.Textbox(
label="Result",
interactive=False
)
with gr.Row():
refresh_table_btn = gr.Button("Refresh Table")
refresh_schema_btn = gr.Button("Refresh Schema")
back_btn = gr.Button("Upload New File")
def handle_upload(file):
success, message = process_uploaded_file(file)
if success:
df = get_data_table()
schema = get_table_schema()
return {
upload_status: message,
continue_btn: gr.update(visible=True),
data_table: df,
schema_display: f"### Current Schema:\n```\n{schema}\n```" if schema else "No schema available"
}
return {
upload_status: message,
continue_btn: gr.update(visible=False)
}
def switch_to_query():
df = get_data_table()
schema = get_table_schema()
return {
upload_group: gr.update(visible=False),
query_group: gr.update(visible=True),
data_table: df,
schema_display: f"### Current Schema:\n```\n{schema}\n```" if schema else "No schema available"
}
def switch_to_upload():
return {
upload_group: gr.update(visible=True),
query_group: gr.update(visible=False),
continue_btn: gr.update(visible=False),
upload_status: gr.update(value="")
}
# Event handlers
file_input.upload(
fn=handle_upload,
outputs=[
upload_status,
continue_btn,
data_table,
schema_display
]
)
continue_btn.click(
fn=switch_to_query,
outputs=[
upload_group,
query_group,
data_table,
schema_display
]
)
back_btn.click(
fn=switch_to_upload,
outputs=[
upload_group,
query_group,
continue_btn,
upload_status
]
)
user_input.change(
fn=query_sql,
inputs=[user_input],
outputs=[query_output]
)
refresh_table_btn.click(
fn=get_data_table,
outputs=[data_table]
)
refresh_schema_btn.click(
fn=update_schema,
outputs=[schema_display]
)
if __name__ == "__main__":
demo.launch(server_name="0.0.0.0", server_port=7860)