import streamlit as st from openai import OpenAI from langchain_community.utilities import SQLDatabase from langchain_google_cloud_sql_mysql import MySQLEngine from langchain_openai import ChatOpenAI from langchain_community.agent_toolkits import create_sql_agent from dotenv import load_dotenv load_dotenv() import streamlit as st import random import time import os # Create a SQL chatbot instance username = "root" host = "35.204.50.120" password = os.getenv("password") port = "3306" mydatabase = "Chinook" pg_uri = f"mysql+pymysql://{username}:{password}@{host}:{port}/{mydatabase}" db = SQLDatabase.from_uri(pg_uri) llm = ChatOpenAI(model="gpt-3.5-turbo-0125", temperature=0) agent_executor = create_sql_agent(llm, db=db, agent_type="openai-tools", verbose=False) #sidebar st.sidebar.title("SQL Chatbot") st.sidebar.write("This is a simple chatbot that can answer your SQL queries.") #list of the tables in database tables = db.get_table_names() st.sidebar.write("Tables in the database:") st.sidebar.write(tables) yes_list = ["yes","Yes", "yes", "YES", "Y", "y","yues", "yeah", "sure", "yea", "ok", "okay", "fine", "cool", "alright", "yup", "yep", "ya", "ye"] def add_spaces_before_newline(input_string): modified_chars = [] for char in input_string: if char == '\n': modified_chars.append(' \n') else: modified_chars.append(char) return ''.join(modified_chars) def run_query(query): if query: if query in yes_list: query = "Give a list of all the tables and their column in bullet points" answer = agent_executor.invoke(query) else: answer = agent_executor.invoke(query) return answer["output"] else: return """Welcome, I am a SQL chatbot. Please type a query in the chatbox to get started. To get started do you want me to provide you will the tables and their respective columns? Simply answer yes.""" st.title("SQL Chatbot") if "messages" not in st.session_state: st.session_state.messages = [] for message in st.session_state.messages: with st.chat_message(message["role"]): st.markdown(message["content"]) if prompt := st.chat_input("Type a query..."): with st.chat_message("user"): st.markdown(prompt) st.session_state.messages.append({"role": "user", "content": prompt}) def response_generator(): response = run_query(prompt) print(response) for word in response.splitlines(keepends=True): yield word + " " time.sleep(0.05) with st.chat_message("assistant"): response = st.write_stream(response_generator()) st.session_state.messages.append({"role": "assistant", "content": response})