textbook / app.py
way2mhemanth's picture
main
1e29e93
import streamlit as st
from pypdf import PdfReader
import io
from gemini_kit import get_llm
from langchain_core.messages import HumanMessage
# Initialize session state for the PDF text and messages
if 'pdf' not in st.session_state:
st.session_state.pdf = ""
if 'messages' not in st.session_state:
st.session_state.messages = []
if 'extract' not in st.session_state:
st.session_state.extract = True
def upload_pdf():
print(st.session_state.extract)
print(st.session_state.pdf[:10])
uploaded_file = st.file_uploader("Choose a PDF file", type="pdf")
if (uploaded_file is not None) & st.session_state.extract:
st.write("Waiting for pdf to be extracted ...")
pdf_reader = PdfReader(io.BytesIO(uploaded_file.read()))
text = ""
for page_num in range(len(pdf_reader.pages)):
page = pdf_reader.pages[page_num]
text += page.extract_text()
# Store the extracted text in session state
st.session_state.pdf = text
st.session_state.extract = False
st.write("PDF Text Extracted. You can chat now!!")
if uploaded_file is None:
st.session_state.extract = True
def chatbot_ui():
user_input = st.text_input("You: ", "")
if user_input:
st.session_state.messages.append({"user": user_input})
if st.session_state.pdf:
response = generate_response(st.session_state.pdf, user_input)
else:
response = "Please upload a PDF to get started."
st.session_state.messages.append({"Assistant": response})
chat = st.button("Clear Chat")
if chat:
st.session_state.messages = []
for message in st.session_state.messages:
if "user" in message:
st.markdown(f"**You:** {message['user']}")
else:
st.markdown(f"**Assistant:** {message['Assistant']}")
def generate_response(pdf, user_input):
message = f"This is the text extracted from the pdf: {pdf}. The user query is {user_input}."
llm = get_llm()
try:
response = llm.invoke(message).content
except Exception as e:
response = "Error occurred. This might be due to exhaustion of LLM quota or your PDF might be much bigger. The exact error: " + str(e)
return response
def main():
st.title("NCERT PDF Based AI Assistant")
st.header("Upload a PDF")
# Call upload_pdf() only when the file uploader is interacted with
upload_pdf()
st.header("Chatbot")
chatbot_ui()
if __name__ == "__main__":
main()