import gradio as gr from openai import OpenAI import threading pause_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"): if pause_event.is_set(): break if chunk.choices[0].delta.content: partial_message += chunk.choices[0].delta.content yield partial_message def pause(): pause_event.set() def resume(): pause_event.clear() 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" ) chat = gr.ChatInterface( fn=predict, chatbot=bot, additional_inputs=[dropdown, gr.Textbox(label="API Key")], ) dropdown.change(fn=reset, inputs=dropdown, outputs=[bot, chat.chatbot_state]) pause_button = gr.Button("Pause") resume_button = gr.Button("Resume") pause_button.click(fn=pause, inputs=None, outputs=None) resume_button.click(fn=resume, inputs=None, outputs=None) demo.queue() demo.launch()