Spaces:
Sleeping
Sleeping
File size: 1,850 Bytes
69e9d44 d779a9b 69e9d44 | 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 | import pandas as pd
from sqlalchemy import text
from app.db.db_connector import get_db_engine
from langchain_openai import ChatOpenAI
from config.settings import settings
def execute_sql_query(sql_query: str):
"""Run a SQL query and return results as list of dicts."""
engine = get_db_engine()
with engine.connect() as conn:
result = conn.execute(text(sql_query))
rows = [dict(row) for row in result.mappings()]
return rows
def run_and_handle_sql_query(sql_query: str, user_question: str):
"""
Executes the SQL query, and if no results, uses LLM to generate a friendly message.
Returns either a list of dicts (rows) or {"chat_message": ...}.
"""
try:
rows = execute_sql_query(sql_query)
if not rows:
llm = ChatOpenAI(
model="gpt-4o-mini",
temperature=0,
api_key=settings.OPENAI_API_KEY,
request_timeout=None # No timeout for API requests
)
no_result_prompt = (
f"The following SQL query was generated for the user's question, but it returned no results. "
f"User question: {user_question}\nSQL query: {sql_query}\n"
"Please explain to the user in a friendly way that no matching records were found for their request."
)
no_result_response = llm.invoke([{"role": "user", "content": no_result_prompt}]).content.strip()
return {"chat_message": no_result_response}
return rows
except Exception as e:
return {"error": str(e), "sql_query": sql_query}
# def run_query(sql: str):
# engine = get_db_engine()
# with engine.connect() as conn:
# result = conn.execute(text(sql))
# df = pd.DataFrame(result.fetchall(), columns=result.keys())
# return df
|