import os #line:1 import streamlit as st #line:2 from dotenv import load_dotenv #line:3 from PyPDF2 import PdfReader #line:4 from langchain .text_splitter import RecursiveCharacterTextSplitter #line:5 from langchain .document_loaders import UnstructuredPDFLoader #line:6 from langchain .text_splitter import CharacterTextSplitter #line:7 from langchain .embeddings import HuggingFaceEmbeddings #line:8 from langchain .vectorstores import FAISS #line:9 from langchain .chat_models import ChatOpenAI #line:10 from langchain .memory import ConversationBufferMemory #line:11 from langchain .chains import ConversationalRetrievalChain #line:12 from htmlTemplates import css ,bot_template ,user_template #line:13 from langchain .llms import HuggingFaceHub #line:14 from langchain .vectorstores import Chroma #line:15 from gpt4all import GPT4All #line:16 os .environ ["HUGGINGFACEHUB_API_TOKEN"]=st .secrets ['huggingface_token']#line:20 def add_logo ():#line:23 st .markdown (f""" """,unsafe_allow_html =True ,)#line:37 def get_pdf_text (OOO0OO00OO0OOO0OO :list )->str :#line:43 OO0OOO000000O0OOO =""#line:44 for O0OO000O0OOO00O0O in OOO0OO00OO0OOO0OO :#line:45 O0O00OO0O00O0OOOO =PdfReader (O0OO000O0OOO00O0O )#line:46 for OO0OOO000O0000O00 in O0O00OO0O00O0OOOO .pages :#line:47 OO0OOO000000O0OOO +=OO0OOO000O0000O00 .extract_text ()#line:48 return OO0OOO000000O0OOO #line:49 def get_pdf_pages (OOOO000000OOOO0O0 ):#line:51 ""#line:62 OO0OO0O0OO0OO000O =[]#line:63 import tempfile #line:64 with tempfile .TemporaryDirectory ()as OOO0000O000O00OOO :#line:66 for OO0OOO0O000OO0OO0 in OOOO000000OOOO0O0 :#line:67 OO0OOO00OOOOOOO0O =os .path .join (OOO0000O000O00OOO ,OO0OOO0O000OO0OO0 .name )#line:68 with open (OO0OOO00OOOOOOO0O ,"wb")as O0OOOOO0O0O0OO00O :#line:69 O0OOOOO0O0O0OO00O .write (OO0OOO0O000OO0OO0 .getbuffer ())#line:70 OOO000OO0OO00OOO0 =UnstructuredPDFLoader (OO0OOO00OOOOOOO0O )#line:72 OOOO0OOOOO000OOO0 =OOO000OO0OO00OOO0 .load_and_split ()#line:73 OO0OO0O0OO0OO000O =OO0OO0O0OO0OO000O +OOOO0OOOOO000OOO0 #line:74 return OO0OO0O0OO0OO000O #line:75 def get_text_chunks (OOOO00OOOOO0O00OO ):#line:85 ""#line:96 OO0OOO00O000OO0OO =RecursiveCharacterTextSplitter (chunk_size =1024 ,chunk_overlap =64 )#line:99 O00O0OOOOOOOOO00O =OO0OOO00O000OO0OO .split_documents (OOOO00OOOOO0O00OO )#line:100 print (str (len (O00O0OOOOOOOOO00O )))#line:101 return O00O0OOOOOOOOO00O #line:102 def get_vectorstore (O00000O0O0OOOO0OO ):#line:119 ""#line:130 O000O00OO00O00OO0 ="WhereIsAI/UAE-Large-V1"#line:131 O000O00OO00O00OO0 ="sentence-transformers/all-MiniLM-L6-v2"#line:132 O000O00OO00O00OO0 ="intfloat/e5-mistral-7b-instruct"#line:134 O000O00OO00O00OO0 ="avsolatorio/GIST-Embedding-v0"#line:135 O000O00OO00O00OO0 ="BAAI/bge-large-en-v1.5"#line:138 O0O0OO0O0O00O0O00 =HuggingFaceEmbeddings (model_name =O000O00OO00O00OO0 )#line:139 O00O0OOOO0O0000OO =Chroma .from_documents (O00000O0O0OOOO0OO ,O0O0OO0O0O00O0O00 ,persist_directory ="db")#line:140 return O00O0OOOO0O0000OO #line:141 def get_conversation_chain (OOOOOOO0OOOO0000O :FAISS )->ConversationalRetrievalChain :#line:146 O000OO0O00000O0O0 =HuggingFaceHub (repo_id ="mistralai/Mixtral-8x7B-Instruct-v0.1",model_kwargs ={"temperature":0.5 ,"max_new_tokens":1024 ,"max_length":1048 ,"top_k":3 ,"trust_remote_code":True ,"torch_dtype":"auto"},)#line:157 OO0000OOO00000000 =ConversationBufferMemory (memory_key ="chat_history",return_messages =True )#line:162 OOO0OO0O00OO0O0O0 =ConversationalRetrievalChain .from_llm (llm =O000OO0O00000O0O0 ,retriever =OOOOOOO0OOOO0000O .as_retriever (),memory =OO0000OOO00000000 )#line:165 return OOO0OO0O00OO0O0O0 #line:166 def handle_userinput (OO000OO000O0O0000 ):#line:180 ""#line:187 O0OOO0O0OOO0OO00O =st .session_state .conversation ({"question":OO000OO000O0O0000 })#line:188 st .session_state .chat_history =O0OOO0O0OOO0OO00O ["chat_history"]#line:189 for O0OOOOOOOO0OOOOOO ,O0O00OOOOOOOO0O00 in enumerate (st .session_state .chat_history ):#line:191 if O0OOOOOOOO0OOOOOO %2 ==0 :#line:192 st .write ("//_^ User: "+O0O00OOOOOOOO0O00 .content )#line:193 else :#line:194 st .write ("🤖 ChatBot: "+O0O00OOOOOOOO0O00 .content )#line:195 def main ():#line:200 st .set_page_config (page_title ="Chat with a Bot that tries to answer questions about multiple PDFs",page_icon =":books:",)#line:204 st .markdown ("# Chat with TedCasBot")#line:208 st .markdown ("This Bot is a powerful AI tool designed to simplify the process of extracting information from PDF documents")#line:209 st .write (css ,unsafe_allow_html =True )#line:211 if "conversation"not in st .session_state :#line:214 st .session_state .conversation =None #line:215 if "chat_history"not in st .session_state :#line:216 st .session_state .chat_history =None #line:217 st .header ("Chat with the TedCasBot. He will help you with any doubt you may have with your documents:")#line:221 O00O00O00OO0000OO =st .text_input ("Ask what you need!:")#line:223 if O00O00O00OO0000OO :#line:224 handle_userinput (O00O00O00OO0000OO )#line:225 with st .sidebar :#line:228 add_logo ()#line:229 st .subheader ("Your documents")#line:230 O00O0O0O0O000000O =st .file_uploader ("Upload your documents and ress 'Process'",accept_multiple_files =True )#line:233 if st .button ("Process"):#line:234 with st .spinner ("Processing"):#line:235 O000000OOO00OO0O0 =get_pdf_text (O00O0O0O0O000000O )#line:237 OOOOOO000O000O00O =get_pdf_pages (O00O0O0O0O000000O )#line:238 O0000O00O0OOO0O00 =get_text_chunks (OOOOOO000O000O00O )#line:242 OO0O0OOO0O0000O0O =get_vectorstore (O0000O00O0OOO0O00 )#line:244 st .session_state .conversation =get_conversation_chain (OO0O0OOO0O0000O0O )#line:247 if __name__ =="__main__":#line:250 main ()