dvwn's picture
Update UI Frontend version 1.2.2
a51206c
# Path: frontend/components/chat.py
# Chat component for handling user interactions and displaying chat history.
import streamlit as st
import pandas as pd
from utils.api import process_userPrompt
from components.auth import save_chat_history
def render_chat_interface():
st.title(":material/sql: NL2SQL Assistant")
st.divider()
if not st.session_state.messages:
for _ in range(5):
st.write("")
_, center_col, _ = st.columns([1, 2, 1])
with center_col:
st.subheader(":material/calendar_view_month: Ask a question about your data (e.g., 'Which country has the highest revenue? Give country name and amount.')", anchor=False)
for idx, message in enumerate(st.session_state.messages):
role = message.get("role", "assistant")
content = message.get("content", "")
with st.chat_message(role):
st.markdown(content)
if message.get("dataframe") is not None:
raw_data = message["dataframe"]
if isinstance(raw_data, list):
display_df = pd.DataFrame(raw_data)
else:
display_df = raw_data
st.dataframe(display_df, use_container_width=True)
# display_df = message["dataframe"]
# st.dataframe(message["dataframe"], use_container_width=True)
csv_data = display_df.to_csv().encode('utf-8')
if st.download_button(
label=":material/download: Download CSV",
data=csv_data,
file_name=f'query_results_{idx}.csv',
mime='text/csv',
key=f"download_{idx}"
):
st.toast("The file has been downloaded!")
if prompt := st.chat_input("Ask a question about yout data..."):
# Append user message
st.session_state.messages.append({"role": "user", "content": prompt})
st.rerun()
if st.session_state.messages and st.session_state.messages[-1]["role"] == "user":
with st.chat_message("assistant"):
with st.spinner("Analyzing schema metadata and generating execution context..."):
payload = process_userPrompt(
question=st.session_state.messages[-1]["content"],
model_id=st.session_state.current_model
)
if payload["status"] == "error":
st.error(f"Interrupted:\n{payload['error']}")
response_text = f"Failed to compute response due to error: {payload['error']}"
st.session_state.messages.append({"role": "assistant", "content": response_text})
else:
st.markdown(payload["answer"])
st.code(payload["sql"], language="sql")
display_df = payload["data"]
if not display_df.empty:
display_df = display_df.copy()
display_df.index = range(1, len(display_df) + 1)
display_df.index.name = "No."
st.session_state.messages.append({
"role": "assistant",
"content": f"{payload['answer']}\n\n```sql\n{payload['sql']}\n```",
"dataframe": display_df if not display_df.empty else None
})
if st.session_state.auth_stat != 'guest':
save_chat_history(st.session_state.username, st.session_state.messages)
st.rerun()