chatdemo / app.py
simpx's picture
add tab 'pdf' to parse pdf
2ebd226
raw
history blame
5.37 kB
from PyPDF2 import PdfReader
import gradio as gr
import openai
import os
# The first line contains the OpenAI key, while the second line provides the OpenAI URL, which is useful when the OpenAI server is hidden behind a proxy server.
# eg. first line "sk-xxxxxxxxxx", second line "http://PROXY-URL"
if os.path.isfile('config'):
config = open("config").readlines()
else:
config = ""
api_key_from_config = ""
if len(config) > 0 and len(config[0].strip()) > 0:
api_key_from_config = config[0].strip()
if len(config) > 1 and len(config[1].strip()) > 0:
openai.api_base = config[1].strip()
# config
DEBUG = True
'''
gradio: [['first question', 'No'], ['second question', 'Yes']]
openai: [{"role": "user", "content": "first question"}, {"role": "assistant", "content": "No"}
{"role": "user", "content": "second question"}, {"role": "assistant", "content": "Yes"}]
'''
def gradio_messages_to_openai_messages(g):
result = []
for pair in g:
result.append({"role": "user", "content": pair[0]})
result.append({"role": "assistant", "content": pair[1]})
return result
def respond(chat_history, message, system_message, key_txt, url_txt, model, temperature):
messages = [
{"role": "system", "content": system_message},
*gradio_messages_to_openai_messages(chat_history),
{"role": "user", "content": message}
]
openai.api_key = key_txt if key_txt else api_key_from_config
if url_txt:
openai.api_base = url_txt
if DEBUG:
print("messages:", messages)
print("model:", model)
print("temperature:", temperature)
completion = openai.ChatCompletion.create(
model=model,
messages=messages,
temperature=temperature,
)
if DEBUG:
print("completion:", completion)
response = completion['choices'][0]['message']['content']
result = chat_history + [[message, response]]
return result
def parse_pdf(prompt, pdfs, system_message, key_txt, url_txt, model, temperature):
result = ""
full_text = ""
for pdf in pdfs:
print("parse: ", pdf)
text = ""
reader = PdfReader(pdf.name)
for page in reader.pages:
text = text + page.extract_text()
full_text = text + "\n----------\n"
messages = [
{"role": "system", "content": system_message},
{"role": "user", "content": prompt + "\n\n###\n\n + full_text}
]
openai.api_key = key_txt if key_txt else api_key_from_config
if url_txt:
openai.api_base = url_txt
if DEBUG:
print("messages:", messages)
print("model:", model)
print("temperature:", temperature)
completion = openai.ChatCompletion.create(
model=model,
messages=messages,
temperature=temperature,
)
if DEBUG:
print("completion:", completion)
response = completion['choices'][0]['message']['content']
return response
with gr.Blocks() as demo:
with gr.Tab("Config"):
with gr.Row():
key_txt = gr.Textbox(label = "Openai Key", placeholder="Enter openai key 'sk-xxxx'%s" %
(", Leave empty to use value from config file" if api_key_from_config else ""))
url_txt = gr.Textbox(label = "Openai API Base URL", placeholder="Enter openai base url 'https://xxx', Leave empty to use value '%s'" % openai.api_base)
system_message = gr.Textbox(label = "System Message:", value = "You are an assistant who gives brief and concise answers.")
model = gr.Dropdown(label="Model", choices=["gpt-3.5-turbo", "gpt-3.5-turbo-0301", "gpt-4"], multiselect=False, value="gpt-3.5-turbo", type="value")
temperature = gr.Slider(0, 2, value=1, label="Temperature", step=0.1, info="What sampling temperature to use, between 0 and 2. Higher values like 0.8 will make the output more random, while lower values like 0.2 will make it more focused and deterministic.")
with gr.Tab("Chat"):
gr.Markdown("## Chat with GPT")
chatbot = gr.Chatbot()
message = gr.Textbox(label = "Message:", placeholder="Enter text and press 'Send'")
message.submit(
respond,
[chatbot, message, system_message, key_txt, url_txt, model, temperature],
chatbot,
)
with gr.Row():
clear = gr.Button("Clear")
clear.click(lambda: None, None, chatbot)
send = gr.Button("Send")
send.click(
respond,
[chatbot, message, system_message, key_txt, url_txt, model, temperature],
chatbot,
)
with gr.Tab("PDF"):
gr.Markdown("## Parse PDF with GPT")
prompt = gr.Text(label="Prompt")
pdfs = gr.File(label="Upload PDF", file_count="multiple", file_types=[".pdf"])
markdown = gr.Markdown(label="Output")
with gr.Row():
clear = gr.Button("Clear")
clear.click(lambda: None, None, markdown)
submit = gr.Button("Upload")
submit.click(
parse_pdf,
[prompt, pdfs, system_message, key_txt, url_txt, model, temperature],
markdown
)
if __name__ == "__main__":
demo.launch()
else:
# run with "gradio app.py"
demo.launch(server_name="0.0.0.0")