Spaces:
Build error
Build error
import streamlit as st | |
from langchain_openai import ChatOpenAI | |
from langchain_utils import invoke_chain | |
from langchain_community.callbacks import get_openai_callback | |
def init_session_state(): | |
if "messages" not in st.session_state: | |
st.session_state.messages = [] | |
if "connected" not in st.session_state: | |
st.session_state.connected = False | |
def create_sidebar(): | |
with st.sidebar: | |
st.title("Postgres Credentials") | |
st.subheader("Enter your Credentials & Connect") | |
# Database credentials | |
host = st.text_input("Host", value="localhost") | |
port = st.text_input("Port", value="5432") | |
user = st.text_input("User", value="postgres") | |
password = st.text_input("Password", type="password") | |
database = st.text_input("Database") | |
# OpenAI API key | |
api_key = st.text_input("OpenAI API Key", type="password") | |
# Connect button | |
if st.button("Connect", use_container_width=True): | |
try: | |
# Store credentials in session state | |
st.session_state.db_credentials = { | |
"host": host, | |
"port": port, | |
"user": user, | |
"password": password, | |
"database": database | |
} | |
st.session_state.api_key = api_key | |
st.session_state.connected = True | |
st.success("Successfully connected!") | |
except Exception as e: | |
st.error(f"Connection failed: {str(e)}") | |
st.session_state.connected = False | |
def main(): | |
init_session_state() | |
create_sidebar() | |
st.title("Chat with Postgres DB") | |
if not st.session_state.connected: | |
st.info("Please enter your credentials in the sidebar and connect first.") | |
return | |
# Display the welcome message with the database icon using markdown | |
st.markdown(""" | |
<div style='display: flex; align-items: center; gap: 10px;'> | |
<span style='font-size: 24px;'>ποΈ</span> | |
<span>Hello! I'm a QualityKiosk's SQL assistant. Ask me anything about your database.</span> | |
</div> | |
""", unsafe_allow_html=True) | |
# Display chat messages | |
for message in st.session_state.messages: | |
with st.chat_message(message["role"]): | |
st.markdown(message["content"]) | |
# Chat input | |
if prompt := st.chat_input("Type a message..."): | |
st.session_state.messages.append({"role": "user", "content": prompt}) | |
with st.chat_message("user"): | |
st.markdown(prompt) | |
with st.chat_message("assistant"): | |
with st.spinner("Thinking..."): | |
with get_openai_callback() as cb: | |
response = invoke_chain( | |
prompt, | |
st.session_state.messages, | |
st.session_state.db_credentials, | |
st.session_state.api_key | |
) | |
print(f"OpenAI Stats: {cb}") | |
st.markdown(response) | |
st.session_state.messages.append({"role": "assistant", "content": response}) | |
if __name__ == "__main__": | |
# Set dark theme and wide layout | |
st.set_page_config( | |
page_title="Chat with Postgres DB", | |
layout="wide", | |
initial_sidebar_state="expanded", | |
# Optional: Add a custom theme | |
menu_items={ | |
'Get Help': 'https://www.qualitykiosk.com', | |
'About': "# Chat with Postgres DB\nA QualityKiosk's SQL Assistant" | |
} | |
) | |
# Add custom CSS for dark theme and styling | |
st.markdown(""" | |
<style> | |
.stApp { | |
background-color: #1E1E1E; | |
color: #FFFFFF; | |
} | |
.stSidebar { | |
background-color: #262626; | |
} | |
.stButton>button { | |
background-color: #0E86D4; | |
color: white; | |
} | |
.stTextInput>div>div>input { | |
background-color: #333333; | |
color: white; | |
} | |
.stMarkdown { | |
color: white; | |
} | |
</style> | |
""", unsafe_allow_html=True) | |
main() |