import time
import os
import json
import random
import streamlit as st
from langchain_huggingface import HuggingFaceEmbeddings
from langchain_chroma import Chroma
from langchain.memory import ConversationBufferMemory
from langchain.chains import ConversationalRetrievalChain
from vectorize_documents import embeddings
from deep_translator import GoogleTranslator
from googlesearch import search
from datetime import datetime
# Set up working directory and API configuration
working_dir = os.path.dirname(os.path.abspath(__file__))
config_data = json.load(open(f"{working_dir}/config.json"))
os.environ["GROQ_API_KEY"] = config_data["GROQ_API_KEY"]
def setup_vectorstore():
persist_directory = f"{working_dir}/vector_db_dir"
vectorstore = Chroma(
persist_directory=persist_directory,
embedding_function=embeddings
)
return vectorstore
def chat_chain(vectorstore):
from langchain_groq import ChatGroq
llm = ChatGroq(
model="llama-3.1-70b-versatile",
temperature=0
)
retriever = vectorstore.as_retriever()
memory = ConversationBufferMemory(
llm=llm,
output_key="answer",
memory_key="chat_history",
return_messages=True
)
chain = ConversationalRetrievalChain.from_llm(
llm=llm,
retriever=retriever,
chain_type="stuff",
memory=memory,
verbose=True,
return_source_documents=True
)
return chain
def fetch_daily_quote():
"""Fetch a daily Bhagavad Gita quote with its URL."""
query = "Bhagavad Gita inspirational quotes"
results = list(search(query, num_results=5)) # Convert generator to list
if results:
chosen_result = random.choice(results)
return chosen_result
return "Explore the Bhagavad Gita and Yoga Sutras for timeless wisdom!"
def get_daily_quote():
"""Get or refresh the daily quote based on the date."""
current_date = datetime.now().date()
if "daily_quote_date" not in st.session_state or st.session_state.daily_quote_date != current_date:
# Fetch new quote and save the current date
st.session_state.daily_quote_date = current_date
st.session_state.daily_quote = fetch_daily_quote()
return st.session_state.daily_quote
# Streamlit UI
st.set_page_config(
page_title="Bhagavad Gita & Yoga Sutras Assistant",
page_icon="🕉️",
layout="wide"
)
st.markdown(
"""
Wisdom Query Assistant
Explore timeless wisdom with the guidance of a knowledgeable assistant.
""",
unsafe_allow_html=True
)
# User name functionality
if "user_name" not in st.session_state:
st.session_state.user_name = ""
if "chat_started" not in st.session_state:
st.session_state.chat_started = False
if not st.session_state.chat_started:
st.markdown("Welcome! Before we begin, please enter your name:
", unsafe_allow_html=True)
user_name = st.text_input("Enter your name:", placeholder="Your Name", key="name_input")
start_button = st.button("Start Chat")
if start_button and user_name.strip():
st.session_state.user_name = user_name.strip()
st.session_state.chat_started = True
st.success(f"Hello {st.session_state.user_name}! How can I assist you today?")
# Display the daily quote
daily_quote = get_daily_quote()
st.markdown(
f"""
""",
unsafe_allow_html=True
)
if st.session_state.chat_started:
# Set up vectorstore and chat chain
vectorstore = setup_vectorstore()
chain = chat_chain(vectorstore)
# Select language
selected_language = st.selectbox("Select your preferred language:", options=[
"English", "Hindi", "Bengali", "Telugu", "Marathi", "Tamil", "Urdu", "Gujarati", "Malayalam", "Kannada",
"Punjabi", "Odia", "Maithili", "Sanskrit", "Santali", "Kashmiri", "Nepali", "Dogri", "Manipuri", "Bodo",
"Sindhi", "Assamese", "Konkani", "Awadhi", "Rajasthani", "Haryanvi", "Bihari", "Chhattisgarhi", "Magahi"
], index=0)
# Display chat history
st.markdown("### 💬 Chat History")
if "chat_history" in st.session_state:
for chat in st.session_state.chat_history:
st.markdown(f"**{st.session_state.user_name}:** {chat['question']}")
st.markdown(f"**Assistant:** {chat['answer']}")
st.markdown("---")
# Input box for new query
st.markdown(f"### Ask a new question, {st.session_state.user_name}:")
with st.form("query_form", clear_on_submit=True):
user_query = st.text_input("Your question:", key="query_input", placeholder="Type your query here...")
submitted = st.form_submit_button("Submit")
if submitted and user_query.strip():
start_time = time.time()
response = chain({"question": user_query.strip()})
end_time = time.time()
answer = response.get("answer", "No answer found.")
source_documents = response.get("source_documents", [])
execution_time = round(end_time - start_time, 2)
# Translate response if needed
if selected_language != "English":
translator = GoogleTranslator(source="en", target=selected_language.lower())
translated_answer = translator.translate(answer)
else:
translated_answer = answer
# Save chat history
if "chat_history" not in st.session_state:
st.session_state.chat_history = []
st.session_state.chat_history.append({
"question": user_query.strip(),
"answer": translated_answer
})
# Display source documents if available
if source_documents:
with st.expander("📜 Source Documents"):
for i, doc in enumerate(source_documents):
st.write(f"**Document {i + 1}:** {doc.page_content}")
st.write(f"**🧙♂️ Assistant:** {translated_answer}")
st.write(f"_Response time: {execution_time} seconds_")
# Sharing options
st.markdown(
"""
""",
unsafe_allow_html=True
)