|
from dotenv import load_dotenv |
|
import os |
|
import gradio as gr |
|
from groq import Groq |
|
|
|
load_dotenv() |
|
api = os.getenv("groq_api_key") |
|
|
|
def create_prompt(user_query, table_metadata): |
|
system_prompt = """ |
|
You are a SQL query generator specialized in generating SQL queries for a single table at a time. |
|
Your task is to accurately convert natural language queries into SQL statements based on the user's intent and the provided table metadata. |
|
|
|
Rules: |
|
- Single Table Only: Use only the table in the metadata. |
|
- Metadata-Based Validation: Use only columns in the metadata. |
|
- User Intent: Support filters, grouping, sorting, etc. |
|
- SQL Syntax: Use standard SQL (DuckDB compatible). |
|
- Output only valid SQL. No extra commentary. |
|
|
|
Input: |
|
User Query: {user_query} |
|
Table Metadata: {table_metadata} |
|
|
|
Output: |
|
SQL Query (on a single line, nothing else). |
|
""" |
|
return system_prompt.strip(), f"User Query: {user_query}\nTable Metadata: {table_metadata}" |
|
|
|
def generate_output(system_prompt, user_prompt): |
|
client = Groq(api_key=api) |
|
chat_completion = client.chat.completions.create( |
|
messages=[ |
|
{"role": "system", "content": system_prompt}, |
|
{"role": "user", "content": user_prompt} |
|
], |
|
model="llama3-70b-8192" |
|
) |
|
response = chat_completion.choices[0].message.content.strip() |
|
return response if response.lower().startswith("select") else "Can't perform the task at the moment." |
|
|
|
|
|
def response(payload): |
|
user_query = payload.get("question", "") |
|
table_metadata = payload.get("schema", "") |
|
system_prompt, user_prompt = create_prompt(user_query, table_metadata) |
|
return generate_output(system_prompt, user_prompt) |
|
|
|
demo = gr.Interface( |
|
fn=response, |
|
inputs=gr.JSON(label="Input JSON (question, schema)"), |
|
outputs="text", |
|
title="SQL Generator (Groq + LLaMA3)", |
|
description="Input: question & table metadata. Output: SQL using dynamic schema." |
|
) |
|
|
|
demo.launch() |
|
|