Spaces:
Paused
Paused
import copy | |
import json | |
import os | |
import gradio as gr | |
import openai | |
from dotenv import load_dotenv | |
from gradio_pdf import PDF | |
from create_assistant import INSTRUCTIONS, MODEL | |
from thread import create_assistant_then_thread, render_markdown | |
load_dotenv() | |
OUTPUT_PATH = "data" | |
IMAGES_PATH = "images" | |
def fix_image_paths_in_thread(thread, base_path): | |
for tweet in thread: | |
for media in tweet.get("media"): | |
media["path"] = os.path.join( | |
"file", OUTPUT_PATH, os.path.basename(base_path), media["path"] | |
) | |
return thread | |
def run_create_thread( | |
url_or_path, openai_api_key, assistant_instructions, assistant_model | |
): | |
if not openai_api_key: | |
raise gr.Error("No OpenAI API Key provided.") | |
client = openai.OpenAI(api_key=openai_api_key) | |
try: | |
saved_path = create_assistant_then_thread( | |
url_or_path, | |
OUTPUT_PATH, | |
client, | |
assistant_kwargs={ | |
"instructions": assistant_instructions, | |
"model": assistant_model, | |
}, | |
) | |
except Exception as e: | |
raise gr.Error(e) | |
with open(os.path.join(saved_path, "processed_thread.json"), "r") as f: | |
thread = json.load(f) | |
fixed_thread = fix_image_paths_in_thread(copy.deepcopy(thread), saved_path) | |
thread_md = render_markdown(fixed_thread) | |
return ( | |
thread_md, | |
json.dumps(thread, indent=2), | |
) | |
with gr.Blocks() as demo: | |
banner = gr.Markdown( | |
"""<div style="display: flex; align-items: center; justify-content: center; margin-top: 20px;"> | |
<img src="file/images/logo.png" alt="ThreadGPT Logo" style="height: 60px; margin-right: 12px; margin-top: -12px;"> | |
<h1 style="font-size: 48px">ThreadGPT</h1> | |
</div> | |
<p align="center" style="font-size: 12px;">π¨ Please be aware that usage of GPT-4 with the assistant API can incur high costs. Make sure to monitor your usage and understand the pricing details provided by OpenAI before proceeding. π¨ | |
<br> | |
β There currently seems to be a bug with the Assistant API where a completed run returns no new messages from the assistant. If you encounter this, please click "Retry π". β</p>""" | |
) | |
with gr.Accordion("Configuration"): | |
with gr.Row(): | |
api_key = gr.Textbox( | |
value=os.getenv("OPENAI_API_KEY"), | |
placeholder="sk-**************", | |
label="OpenAI API Key", | |
type="password", | |
interactive=True, | |
) | |
with gr.Column(): | |
assistant_instr = gr.Textbox( | |
value=INSTRUCTIONS, | |
placeholder="Enter system instructions", | |
label="System Instructions", | |
interactive=True, | |
) | |
assistant_model = gr.Textbox( | |
value=MODEL, | |
placeholder="Enter model", | |
label="Model", | |
interactive=True, | |
) | |
with gr.Row(): | |
url_or_path_state = gr.State("") | |
txt = gr.Textbox( | |
scale=6, | |
show_label=False, | |
placeholder="https://arxiv.org/pdf/1706.03762.pdf", | |
container=False, | |
) | |
upload_btn = gr.UploadButton("Upload PDF π", file_types=[".pdf"]) | |
retry_btn = gr.Button("Retry π") | |
with gr.Row(visible=False) as output_row: | |
with gr.Column(): | |
pdf = PDF(height=900) | |
with gr.Column(): | |
with gr.Tab("Markdown"): | |
md_viewer = gr.Markdown() | |
with gr.Tab("JSON"): | |
json_viewer = gr.Textbox(lines=44) | |
txt.submit( | |
lambda url_or_path: ("", url_or_path, gr.Row(visible=True), "", ""), | |
[txt], | |
[txt, url_or_path_state, output_row, md_viewer, json_viewer], | |
).then( | |
lambda url_or_path: url_or_path, | |
[url_or_path_state], | |
[pdf], | |
).then( | |
run_create_thread, | |
[url_or_path_state, api_key, assistant_instr, assistant_model], | |
[md_viewer, json_viewer], | |
) | |
upload_btn.upload( | |
lambda path: (path, gr.Row(visible=True), "", ""), | |
[upload_btn], | |
[url_or_path_state, output_row, md_viewer, json_viewer], | |
).then( | |
lambda url_or_path: url_or_path, | |
[url_or_path_state], | |
[pdf], | |
).then( | |
run_create_thread, | |
[url_or_path_state, api_key, assistant_instr, assistant_model], | |
[md_viewer, json_viewer], | |
) | |
retry_btn.click( | |
lambda url_or_path: url_or_path, | |
[url_or_path_state], | |
[pdf], | |
).then( | |
run_create_thread, | |
[url_or_path_state, api_key, assistant_instr, assistant_model], | |
[md_viewer, json_viewer], | |
) | |
if __name__ == "__main__": | |
demo.launch(allowed_paths=[OUTPUT_PATH, IMAGES_PATH]) | |