Uploading application file

#1
Files changed (1) hide show
  1. docpdf-qa.py +123 -0
docpdf-qa.py ADDED
@@ -0,0 +1,123 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import gradio as gr
2
+ from langchain.embeddings.openai import OpenAIEmbeddings
3
+ from langchain.text_splitter import CharacterTextSplitter
4
+ from langchain.vectorstores import Chroma
5
+
6
+ from langchain.chains import ConversationalRetrievalChain
7
+ from langchain.chat_models import ChatOpenAI
8
+
9
+ from langchain.document_loaders import PyPDFLoader
10
+ import os
11
+
12
+ import fitz
13
+ from PIL import Image
14
+
15
+ COUNT,N = 0,0
16
+ chat_history = []
17
+ chain = ''
18
+ enable_box = gr.Textbox.update(value=None,placeholder= 'Upload your OpenAI API key',interactive=True)
19
+ disable_box = gr.Textbox.update(value = 'OpenAI API key is Set',interactive=False)
20
+ #os.environ['OPENAI_API_KEY'] = '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'
21
+
22
+ def set_apikey(api_key):
23
+ os.environ['OPENAI_API_KEY'] = api_key
24
+ return disable_box
25
+ def enable_api_box():
26
+ return enable_box
27
+
28
+ def add_text(history, text):
29
+ if not text:
30
+ raise gr.Error('enter text')
31
+ history = history + [(text,'')]
32
+ return history
33
+
34
+ def process_file(file):
35
+ if 'OPENAI_API_KEY' not in os.environ:
36
+ raise gr.Error('Upload your OpenAI API key')
37
+
38
+ loader = PyPDFLoader(file.name)
39
+ documents = loader.load()
40
+
41
+ embeddings = OpenAIEmbeddings()
42
+
43
+ pdfsearch = Chroma.from_documents(documents, embeddings, metadatas=[{"source": f"{i}-pl"} for i in range(len(documents))])
44
+
45
+ chain = ConversationalRetrievalChain.from_llm(ChatOpenAI(temperature=0.3),
46
+ retriever=pdfsearch.as_retriever(search_kwargs={"k": 1}),
47
+ return_source_documents=True,)
48
+ return chain
49
+
50
+ def generate_response(history, query, btn):
51
+ global COUNT, N, chat_history, chain
52
+
53
+ if not btn:
54
+ raise gr.Error(message='Upload a PDF')
55
+ if COUNT == 0:
56
+ chain = process_file(btn)
57
+ COUNT += 1
58
+
59
+ result = chain({"question": query, 'chat_history':chat_history},return_only_outputs=True)
60
+ chat_history += [(query, result["answer"])]
61
+ N = list(result['source_documents'][0])[1][1]['page']
62
+
63
+ for char in result['answer']:
64
+ history[-1][-1] += char
65
+ yield history,''
66
+
67
+
68
+ def render_first(btn):
69
+
70
+ doc = fitz.open(btn.name)
71
+ page = doc[0]
72
+
73
+ #Render the page as a PNG image with a resolution of 300 DPI
74
+ pix = page.get_pixmap(matrix=fitz.Matrix(300/72, 300/72))
75
+ image = Image.frombytes('RGB', [pix.width, pix.height], pix.samples)
76
+ return image
77
+
78
+ def render_file(file):
79
+ global N
80
+ doc = fitz.open(file.name)
81
+ page = doc[N]
82
+ #Render the page as a PNG image with a resolution of 300 DPI
83
+ pix = page.get_pixmap(matrix=fitz.Matrix(300/72, 300/72))
84
+ image = Image.frombytes('RGB', [pix.width, pix.height], pix.samples)
85
+ return image
86
+
87
+
88
+ with gr.Blocks() as demo:
89
+
90
+ with gr.Column():
91
+ with gr.Row():
92
+ with gr.Column(scale=0.8):
93
+ api_key = gr.Textbox(placeholder='Enter OpenAI API key', show_label=False, interactive=True).style(container=False)
94
+ with gr.Column(scale=0.2):
95
+ change_api_key = gr.Button('Change Key')
96
+ with gr.Row():
97
+ chatbot = gr.Chatbot(value=[], elem_id='chatbot').style(height=650)
98
+ show_img = gr.Image(label='Upload PDF', tool='select' ).style(height=680)
99
+ with gr.Row():
100
+ with gr.Column(scale=0.70):
101
+ txt = gr.Textbox(
102
+ show_label=False,
103
+ placeholder="Enter text and press enter",
104
+ ).style(container=False)
105
+ with gr.Column(scale=0.15):
106
+ submit_btn = gr.Button('submit')
107
+ with gr.Column(scale=0.15):
108
+ btn = gr.UploadButton("📁 upload a PDF", file_types=[".pdf"]).style()
109
+
110
+ api_key.submit(fn=set_apikey, inputs=[api_key], outputs=[api_key])
111
+ change_api_key.click(fn= enable_api_box,outputs=[api_key])
112
+ btn.upload(fn=render_file, inputs=[btn], outputs=[show_img],)
113
+
114
+ submit_btn.click(fn=add_text, inputs=[chatbot,txt], outputs=[chatbot, ], queue=False).success(fn=generate_response,inputs = [chatbot, txt, btn],
115
+ outputs = [chatbot,txt]).success(fn=render_file,inputs = [btn], outputs=[show_img])
116
+
117
+ txt.submit(fn=add_text, inputs=[chatbot,txt], outputs=[chatbot, ], queue=False).success(fn=generate_response,inputs = [chatbot, txt, btn],
118
+ outputs = [chatbot,txt]).success(fn=render_file,inputs = [btn], outputs=[show_img])
119
+
120
+
121
+ demo.queue()
122
+ if __name__ == "__main__":
123
+ demo.launch()