Mpavan45's picture
Update app.py
951dccc verified
raw
history blame
4.74 kB
import streamlit as st
import sqlite3
import uuid
from langchain_google_genai import GoogleGenerativeAI
from langchain_core.prompts import ChatPromptTemplate, MessagesPlaceholder
from langchain_core.output_parsers import StrOutputParser
from langchain_community.chat_message_histories import SQLChatMessageHistory
from langchain_core.runnables.history import RunnableWithMessageHistory
import time
# Set page config
st.set_page_config(page_title="Gemini Code Reviewer", layout="wide")
# Animated text function
def animated_text(text, speed=0.05):
placeholder = st.empty()
displayed_text = ""
for letter in text:
displayed_text += letter
placeholder.markdown(f"""
<h1 style="text-align:center; color: #FF4500;">{displayed_text} πŸš€</h1>
""", unsafe_allow_html=True) # Corrected f-string formatting
time.sleep(speed)
# Display animated text
animated_text("Conversational AI Data Science Tutor", speed=0.1)
# Streamlit Ui
st.write("Ask me anything about Data Science!")
# Load API key
GOOGLE_API_KEY = st.secrets.get("GOOGLE_API_KEY")
# Set up the Gemini 1.5 Pro model
llm = GoogleGenerativeAI(api_key=GOOGLE_API_KEY, model="gemini-1.5-pro")
# Initialize SQLite database
conn = sqlite3.connect("chat_history.db", check_same_thread=False)
cursor = conn.cursor()
cursor.execute("""
CREATE TABLE IF NOT EXISTS chat (
id INTEGER PRIMARY KEY AUTOINCREMENT,
session_id TEXT,
role TEXT,
content TEXT
)
""")
conn.commit()
# Function to save messages
def save_message(session_id, role, content):
cursor.execute("INSERT INTO chat (session_id, role, content) VALUES (?, ?, ?)", (session_id, role, content))
conn.commit()
# Function to load chat history
def load_chat_history(session_id):
cursor.execute("SELECT role, content FROM chat WHERE session_id = ?", (session_id,))
return cursor.fetchall()
# Chat history instance
def chat_history(session_id):
return SQLChatMessageHistory(
session_id=session_id,
connection="sqlite:///chat_history.db"
)
# Generate unique session ID
if "session_id" not in st.session_state:
st.session_state.session_id = str(uuid.uuid4())
# "New Chat" button
if st.button("πŸ†• New Chat"):
st.session_state.session_id = str(uuid.uuid4()) # Generate new session ID
st.session_state.messages = [] # Clear chat history
st.rerun() # Refresh the app
session_id = st.session_state.session_id
chat_history_instance = chat_history(session_id)
# Define Chat Prompt Template
chat_prompt = ChatPromptTemplate(
messages=[
('system', """You are an AI assistant specialized in Data Science tutoring.
You will only answer questions related to Data Science.
If asked anything outside this topic, politely decline and request a Data Science-related question.
"""),
MessagesPlaceholder(variable_name="history", optional=True),
('human', '{prompt}')
]
)
# Define output parser
out_parser = StrOutputParser()
# Create a chain
chain = chat_prompt | llm | out_parser
# Define Runnable with message history
chat = RunnableWithMessageHistory(
chain,
lambda session: SQLChatMessageHistory(session, "sqlite:///chat_history.db"),
input_messages_key="prompt",
history_messages_key="history"
)
# πŸ”Ή Chat history container
chat_container = st.container()
# πŸ”Ή Always keep input box at the bottom
input_container = st.empty()
# Load chat history and keep it sticky
if "messages" not in st.session_state:
st.session_state.messages = load_chat_history(session_id)
# Display chat messages in order
with chat_container:
for role, content in st.session_state.messages:
with st.chat_message(role):
st.markdown(content)
# Display chat history
for role, content in st.session_state.messages:
with st.chat_message(role):
st.markdown(content)
with input_container:
# User input at the bottom
user_input = st.text_input("Type your message here:", key="user_message")
if user_input:
# Save user message
save_message(session_id, "user", user_input)
st.session_state.messages.append(("user", user_input))
# Invoke AI model
config = {'configurable': {'session_id': session_id}}
response = chat.invoke({'prompt': user_input}, config)
# Save AI response
save_message(session_id, "assistant", response)
st.session_state.messages.append(("assistant", response))
# Display AI response
with st.chat_message("assistant"):
st.markdown(response)
# βœ… Clear input field
st.session_state.pop("user_message")
st.session_state["user_message"] = ""
st.rerun() # Refresh the app