Spaces:
Runtime error
Runtime error
| import streamlit as st | |
| import os | |
| import autogen | |
| import base64 | |
| from langchain.vectorstores import Chroma | |
| from langchain.embeddings import OpenAIEmbeddings | |
| from langchain.text_splitter import RecursiveCharacterTextSplitter | |
| from langchain.document_loaders import PyPDFLoader | |
| from langchain.memory import ConversationBufferMemory | |
| from langchain.llms import OpenAI | |
| from langchain.chains import ConversationalRetrievalChain | |
| import io | |
| import sys | |
| import tempfile | |
| import openai | |
| import multiprocessing | |
| import autogen.agentchat.user_proxy_agent as upa | |
| config_list = [ | |
| { | |
| "model": "gpt-4", | |
| "api_key": st.secrets["OPENAI_API_KEY"] | |
| } | |
| ] | |
| gpt4_api_key = config_list[0]["api_key"] | |
| os.environ['OPENAI_API_KEY'] = st.secrets["OPENAI_API_KEY"] | |
| openai.api_key = st.secrets["OPENAI_API_KEY"] | |
| class OutputCapture: | |
| def __init__(self): | |
| self.contents = [] | |
| def write(self, data): | |
| self.contents.append(data) | |
| def flush(self): | |
| pass | |
| def get_output_as_string(self): | |
| return ''.join(self.contents) | |
| class ExtendedUserProxyAgent(upa.UserProxyAgent): | |
| def __init__(self, *args, log_file="interaction_log.txt", **kwargs): | |
| super().__init__(*args, **kwargs) | |
| self.log_file = log_file | |
| def log_interaction(self, message): | |
| with open(self.log_file, "a") as f: | |
| f.write(message + "\n") | |
| def get_human_input(self, *args, **kwargs): | |
| human_input = super().get_human_input(*args, **kwargs) | |
| self.log_interaction(f"Human input: {human_input}") | |
| return human_input | |
| def build_vector_store(pdf_path, chunk_size=1000): | |
| loaders = [PyPDFLoader(pdf_path)] | |
| docs = [] | |
| for l in loaders: | |
| docs.extend(l.load()) | |
| text_splitter = RecursiveCharacterTextSplitter(chunk_size=chunk_size) | |
| docs = text_splitter.split_documents(docs) | |
| vectorstore = Chroma( | |
| collection_name="full_documents", | |
| embedding_function=OpenAIEmbeddings() | |
| ) | |
| vectorstore.add_documents(docs) | |
| return vectorstore | |
| def setup_qa_chain(vectorstore): | |
| qa = ConversationalRetrievalChain.from_llm( | |
| OpenAI(temperature=0), | |
| vectorstore.as_retriever(), | |
| memory=ConversationBufferMemory(memory_key="chat_history", return_messages=True) | |
| ) | |
| return qa | |
| def get_image_as_base64_string(path): | |
| with open(path, "rb") as image_file: | |
| return base64.b64encode(image_file.read()).decode() | |
| def answer_question(question, qa_chain): | |
| response = qa_chain({"question": question}) | |
| return response["answer"] | |
| def initiate_task(user_proxy, assistant, user_question): | |
| user_proxy.initiate_chat( | |
| assistant, | |
| message= user_question | |
| ) | |
| def initiate_task_process(queue, tmp_path, user_question): | |
| vectorstore = build_vector_store(tmp_path) | |
| qa = setup_qa_chain(vectorstore) | |
| def answer_question(question): | |
| response = qa({"question": question}) | |
| return response["answer"] | |
| llm_config={ | |
| "request_timeout": 600, | |
| "seed": 42, | |
| "config_list": config_list, | |
| "temperature": 0, | |
| "functions": [ | |
| { | |
| "name": "answer_question", | |
| "description": "Answer any questions in relation to the paper", | |
| "parameters": { | |
| "type": "object", | |
| "properties": { | |
| "question": { | |
| "type": "string", | |
| "description": "The question to ask in relation to the paper", | |
| } | |
| }, | |
| "required": ["question"], | |
| }, | |
| } | |
| ], | |
| } | |
| # create an AssistantAgent instance named "assistant" | |
| assistant = autogen.AssistantAgent( | |
| name="assistant", | |
| llm_config=llm_config, | |
| ) | |
| # create a UserProxyAgent instance named "user_proxy" | |
| user_proxy = autogen.UserProxyAgent( | |
| name="user_proxy", | |
| human_input_mode="NEVER", | |
| max_consecutive_auto_reply=10, | |
| code_execution_config={"work_dir": "."}, | |
| llm_config=llm_config, | |
| system_message="""Reply TERMINATE if the task has been solved at full satisfaction. | |
| Otherwise, reply CONTINUE, or the reason why the task is not solved yet.""", | |
| function_map={"answer_question": answer_question} | |
| ) | |
| output_capture = OutputCapture() | |
| sys.stdout = output_capture | |
| initiate_task(user_proxy, assistant, user_question) | |
| queue.put(output_capture.get_output_as_string()) | |
| def app(): | |
| st.title("NexaAgent 0.0.1") | |
| # Sidebar introduction | |
| st.sidebar.header("About NexaAgent 0.0.1") | |
| st.sidebar.markdown(""" | |
| π **Introducing NexaAgent 0.0.1!** | |
| A highly efficient PDF tool for all your needs. | |
| π Upload any PDF, no matter its size or the task type. | |
| β Guaranteed accuracy, significantly reducing any discrepancies. | |
| π§ Empowered by: | |
| - **AutoGen** π οΈ | |
| - **LangChain** π | |
| - **chromadb** ποΈ | |
| """) | |
| image_path = "1.png" | |
| st.sidebar.image(image_path, caption="Your Caption Here", use_column_width=True) | |
| # Create left and right columns | |
| col1, col2 = st.columns(2) | |
| with col1: | |
| # Upload PDF file | |
| uploaded_file = st.file_uploader("Choose a PDF file", type=["pdf"]) | |
| if uploaded_file: | |
| with st.spinner("Processing PDF..."): | |
| with tempfile.NamedTemporaryFile(delete=False, suffix=".pdf") as tmp: | |
| tmp.write(uploaded_file.getvalue()) | |
| tmp_path = tmp.name | |
| # User input for question | |
| user_question = st.text_area("Enter your task:", height=300) | |
| if user_question: | |
| with st.spinner("Fetching the answer..."): | |
| # δ½Ώη¨θΏη¨ζ₯ζ§θ‘ε―θ½εΌειθ――η代η | |
| queue = multiprocessing.Queue() | |
| process = multiprocessing.Process(target=initiate_task_process, args=(queue, tmp_path, user_question)) | |
| process.start() | |
| process.join() | |
| # δ»ιεδΈθ·εη»ζ | |
| captured_output = queue.get() | |
| col2.text_area("", value=captured_output, height=600) | |
| if __name__ == "__main__": | |
| st.set_page_config(layout="wide") | |
| app() |