Spaces:
Runtime error
Runtime error
File size: 5,974 Bytes
f4e447d 01d1928 f4e447d 01d1928 f4e447d 01d1928 f4e447d 01d1928 f4e447d 01d1928 f4e447d 01d1928 f4e447d 01d1928 f4e447d 01d1928 f4e447d 01d1928 f4e447d 01d1928 f4e447d c3d5622 f4e447d 165a6d7 c3d5622 f4e447d c3d5622 165a6d7 c3d5622 165a6d7 c3d5622 165a6d7 c3d5622 f83c24c c3d5622 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 |
import gradio as gr
from langchain.embeddings.openai import OpenAIEmbeddings
from langchain.text_splitter import CharacterTextSplitter
from langchain.vectorstores import Chroma
from langchain.chains import ConversationalRetrievalChain
from langchain.chat_models import ChatOpenAI
from langchain.document_loaders import PyPDFLoader
import os
import fitz
from PIL import Image
# Global variables
COUNT, N = 0, 0
chat_history = []
chain = None # Initialize chain as None
# Function to set the OpenAI API key
def set_apikey(api_key):
os.environ['OPENAI_API_KEY'] = api_key
return disable_box # Update the disable_box
# Function to enable the API key input box
def enable_api_box():
return enable_box # Update the enable_box
# Function to add text to the chat history
def add_text(history, text):
if not text:
raise gr.Error('Enter text')
history = history + [(text, '')]
return history
# Function to process the PDF file and create a conversation chain
def process_file(file):
global chain # Access the global 'chain' variable
if 'OPENAI_API_KEY' not in os.environ:
raise gr.Error('Upload your OpenAI API key')
loader = PyPDFLoader(file.name)
documents = loader.load()
embeddings = OpenAIEmbeddings()
pdfsearch = Chroma.from_documents(documents, embeddings)
chain = ConversationalRetrievalChain.from_llm(ChatOpenAI(temperature=0.3),
retriever=pdfsearch.as_retriever(search_kwargs={"k": 1}),
return_source_documents=True)
return chain
# Function to generate a response based on the chat history and query
def generate_response(history, query, btn):
global COUNT, N, chat_history, chain
if not btn:
raise gr.Error(message='Upload a PDF')
if COUNT == 0:
chain = process_file(btn)
COUNT += 1
result = chain({"question": query, 'chat_history': chat_history}, return_only_outputs=True)
chat_history += [(query, result["answer"])]
N = list(result['source_documents'][0])[1][1]['page']
for char in result['answer']:
history[-1][-1] += char # Update the last response
yield history, ''
# Function to render a specific page of a PDF file as an image
def render_file(file):
global N
doc = fitz.open(file.name)
page = doc[N]
pix = page.get_pixmap(matrix=fitz.Matrix(300/72, 300/72))
image = Image.frombytes('RGB', [pix.width, pix.height], pix.samples)
return image
# Gradio application setup
# with gr.Blocks() as demo:
# with gr.Column():
# gr.Markdown("""
# <style>
# .image-container { height: 680px; }
# </style>
# """)
# with gr.Row():
# enable_box = gr.Textbox(placeholder='Enter OpenAI API key',
# show_label=False, interactive=True)
# disable_box = gr.Textbox(value='OpenAI API key is Set', interactive=False)
# change_api_key = gr.Button('Change Key')
# with gr.Row():
# chatbot = gr.Chatbot(value=[], elem_id='chatbot')
# show_img = gr.Image(label='Upload PDF')
# # Set up event handlers
# # Event handler for submitting the OpenAI API key
# enable_box.submit(fn=set_apikey, inputs=[enable_box], outputs=[disable_box])
# # Event handler for changing the API key
# change_api_key.click(fn=enable_api_box, outputs=[enable_box])
# def render_first(pdf_file):
# # ... Logic to process the PDF
# # ... Generate the first image
# return image
# with gr.Blocks() as demo:
# # ... your UI setup ...
# pdf_upload = gr.UploadButton("π Upload a PDF", file_types=[".pdf"])
# # ... other event handlers ...
# pdf_upload.upload(fn=render_first, inputs=[pdf_upload], outputs=[show_img])
# # Event handler for submitting text and generating response
# submit_btn.click(
# fn=add_text,
# inputs=[chatbot, txt],
# outputs=[chatbot],
# queue=False
# ).success(
# fn=generate_response,
# inputs=[chatbot, txt, btn],
# outputs=[chatbot, txt]
# ).success(
# fn=render_file,
# inputs=[btn],
# outputs=[show_img]
# )
# demo.queue()
# if __name__ == "__main__":
# demo.launch()
with gr.Blocks() as demo:
with gr.Column():
gr.Markdown("""
<style>
.image-container { height: 680px; }
</style>
""")
with gr.Row():
enable_box = gr.Textbox(placeholder='Enter OpenAI API key',
show_label=False, interactive=True)
disable_box = gr.Textbox(value='OpenAI API key is Set', interactive=False)
change_api_key = gr.Button('Change Key')
with gr.Row():
chatbot = gr.Chatbot(value=[], elem_id='chatbot')
show_img = gr.Image(label='Upload PDF')
pdf_upload = gr.UploadButton("π Upload a PDF", file_types=[".pdf"]) # Added
# Event handlers
enable_box.submit(fn=set_apikey, inputs=[enable_box], outputs=[disable_box])
change_api_key.click(fn=enable_api_box, outputs=[enable_box])
pdf_upload.upload(fn=render_first, inputs=[pdf_upload], outputs=[show_img]) # Corrected
submit_btn = gr.Button('Submit') # Added the Submit button
submit_btn.click(
fn=add_text,
inputs=[chatbot, txt], # Assuming 'txt' is your textbox for query input
outputs=[chatbot],
queue=False
).success(
fn=generate_response,
inputs=[chatbot, txt, pdf_upload], # Changed from 'btn'
outputs=[chatbot, txt]
).success(
fn=render_file,
inputs=[pdf_upload], # Changed from 'btn'
outputs=[show_img]
)
demo.launch() |