Spaces:
Running
Running
File size: 2,575 Bytes
807b1cf adca139 807b1cf adca139 807b1cf 07f734b adca139 807b1cf adca139 807b1cf adca139 807b1cf adca139 807b1cf adca139 807b1cf adca139 807b1cf adca139 807b1cf adca139 807b1cf adca139 807b1cf adca139 807b1cf adca139 807b1cf adca139 07f734b | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 | # app.py
import gradio as gr
import pandas as pd
import duckdb
import requests
import re
import io
import os
# Load Together API Key from environment variable or fallback
TOGETHER_API_KEY = os.getenv("TOGETHER_API_KEY", "tgp_v1_QxHjcs582Y4kSGPd5a2VyrKDD6S81ctp-M-rT_ioDNE") # Replace with HF Secret
# Function to generate SQL from a prompt
def generate_sql_from_prompt(prompt, df):
schema = ", ".join([f"{col} ({str(dtype)})" for col, dtype in df.dtypes.items()])
full_prompt = f"""
You are a SQL expert. Here is a table called 'df' with the following schema:
{schema}
User question: "{prompt}"
Write a valid SQL query using the 'df' table. Return only the SQL code.
"""
url = "https://api.together.xyz/v1/chat/completions"
headers = {
"Authorization": f"Bearer {TOGETHER_API_KEY}",
"Content-Type": "application/json"
}
payload = {
"model": "mistralai/Mixtral-8x7B-Instruct-v0.1",
"messages": [{"role": "user", "content": full_prompt}],
"temperature": 0.2,
"max_tokens": 200
}
response = requests.post(url, headers=headers, json=payload)
response.raise_for_status()
result = response.json()
return result['choices'][0]['message']['content'].strip("```sql").strip("```").strip()
# Function to clean SQL for DuckDB
def clean_sql_for_duckdb(sql, df_columns):
sql = sql.replace("`", '"')
for col in df_columns:
if " " in col and f'"{col}"' not in sql:
pattern = r'\b' + re.escape(col) + r'\b'
sql = re.sub(pattern, f'"{col}"', sql)
return sql
# Combined Gradio function
def chatbot_interface(file, question):
try:
df = pd.read_excel(file)
sql = generate_sql_from_prompt(question, df)
cleaned_sql = clean_sql_for_duckdb(sql, df.columns)
result = duckdb.query(cleaned_sql).to_df()
return f"π SQL Query:\n```sql\n{sql}\n```", result
except Exception as e:
return f"β Error: {str(e)}", pd.DataFrame()
# Gradio UI
with gr.Blocks() as demo:
gr.Markdown("## π Excel SQL Chatbot with Together API")
file_input = gr.File(label="π Upload Excel File (.xlsx)")
question = gr.Textbox(label="π§ Ask a question about your data", placeholder="e.g., Show me the average sales by region")
submit = gr.Button("π Generate & Query")
sql_output = gr.Markdown()
result_table = gr.Dataframe()
submit.click(fn=chatbot_interface, inputs=[file_input, question], outputs=[sql_output, result_table])
# Launch app
if __name__ == "__main__":
demo.launch()
|