import gradio as gr from openai import OpenAI import threading pause_event = threading.Event() resume_event = threading.Event() def predict(message, history, character, api_key, progress=gr.Progress()): client = OpenAI(api_key=api_key) history_openai_format = [] for human, assistant in history: history_openai_format.append({"role": "user", "content": human}) history_openai_format.append({"role": "assistant", "content": assistant}) history_openai_format.append({"role": "user", "content": message}) response = client.chat.completions.create( model='gpt-4', messages=history_openai_format, temperature=1.0, stream=True ) partial_message = "" for chunk in progress.tqdm(response, desc="Generating"): while pause_event.is_set(): resume_event.wait() if chunk.choices[0].delta.content: partial_message += chunk.choices[0].delta.content yield partial_message def pause(): pause_event.set() resume_event.clear() return "Paused" def resume(): pause_event.clear() resume_event.set() return "Resumed" def reset(character): return [], [] # Gradio app with gr.Blocks() as demo: gr.Markdown(f"

{'My Chatbot'}

") bot = gr.Chatbot(render=False) dropdown = gr.Dropdown( ["Character 1", "Character 2", "Character 3", "Character 4", "Character 5", "Character 6", "Character 7", "Character 8", "Character 9", "Character 10", "Character 11", "Character 12", "Character 13"], label="Characters", info="Select the character that you'd like to speak to", value="Character 1" ) api_key_input = gr.Textbox(label="API Key") chat = gr.ChatInterface( fn=predict, chatbot=bot, additional_inputs=[dropdown, api_key_input], ) dropdown.change(fn=reset, inputs=dropdown, outputs=[bot, chat.chatbot_state]) pause_button = gr.Button("Pause") resume_button = gr.Button("Resume") status = gr.Textbox(label="Status", interactive=False) pause_button.click(fn=pause, inputs=None, outputs=status) resume_button.click(fn=resume, inputs=None, outputs=status) demo.queue() demo.launch()