import gradio as gr from pipeline import preprocessing_pipeline, conversational_rag from pipeline import system_message, user_message from haystack.dataclasses import ChatMessage import time import os def process_files_into_docs(files, progress=gr.Progress()): if isinstance(files, dict): files = [files] if not files: return 'No file uploaded!' preprocessing_pipeline.run({'file_type_router': {'sources': files}}) return "Database created🤗🤗" def rag(history, question): if history is None: history = [] # Run Haystack pipeline res = conversational_rag.run( data={ "query_rephrase_prompt_builder": {"query": question}, "prompt_builder": { "template": [system_message, user_message], "query": question, }, "memory_joiner": { "values": [ChatMessage.from_user(question)] } }, include_outputs_from=["llm"] ) bot_message = res["llm"]["replies"][0].content # Add user message history = history + [ {"role": "user", "content": question} ] # Stream assistant message streamed = "" for token in bot_message.split(): streamed += token + " " yield ( history + [{"role": "assistant", "content": streamed.strip()}], "" ) time.sleep(0.05) # Final assistant message history = history + [ {"role": "assistant", "content": bot_message} ] yield history, "" EXAMPLE_FILE = "RAG Survey.pdf" with gr.Blocks(theme=gr.themes.Soft()) as demo: gr.HTML("

TalkToFiles - Query your documents! 📂📄

") gr.Markdown("""##### This AI chatbot🤖 can help you chat with your documents. Can upload Text(.txt), PDF(.pdf) and Markdown(.md) files. Please do not upload confidential documents.""") with gr.Row(): with gr.Column(scale=86): gr.Markdown("""#### ***Step 1 - Upload Documents and Initialize RAG pipeline***
Can upload Multiple documents""") with gr.Row(): file_input = gr.File( label='Upload Files', file_count='multiple', file_types=['.pdf', '.txt', '.md'], interactive=True ) with gr.Row(): process_files = gr.Button('Create Document store') with gr.Row(): result = gr.Textbox(label="Document store", value='Document store not initialized') # Pre-processing Events process_files.click( fn=process_files_into_docs, inputs=file_input, outputs=result, show_progress=True ) # def load_example(): # return [EXAMPLE_FILE] # with gr.Row(): # gr.Examples( # examples=[[EXAMPLE_FILE]], # inputs=file_input, # examples_per_page=1, # label="Click to upload an example" # ).dataset.click(fn=load_example, inputs=[], outputs=file_input) with gr.Column(scale=200): gr.Markdown("""#### ***Step 2 - Chat with your docs*** """) chatbot = gr.Chatbot(label='ChatBot', type="messages") # <-- Added type="messages" to fix deprecation user_input = gr.Textbox(label='Enter your query', placeholder='Type here...') with gr.Row(): submit_button = gr.Button("Submit") clear_btn = gr.ClearButton([user_input, chatbot], value='Clear') submit_button.click( rag, inputs=[chatbot, user_input], outputs=[chatbot, user_input] ) # Use api_name=None to avoid API generation issues demo.launch()