# Import necessary libraries import os import time import openai from dotenv import load_dotenv load_dotenv() openai.api_key = os.getenv("OPENAI_API_KEY") import gradio as gr # Create an empty list to store chat messages messages = [] # Function to add user's text to chat history def add_user_text(chat_history, user_text): print('user_text_from_typing: ', user_text) global messages messages += [{"role":'user', 'content': user_text}] chat_history = chat_history + [(user_text, None)] return chat_history, gr.update(value="", interactive=False) # Function for the bot to respond def bot_respond(chat_history, openai_gpt_key, model_choice): global messages if openai_gpt_key is not "": openai.api_key = openai_gpt_key # Generate response from OpenAI Chat API using the selected model bot_response = openai.ChatCompletion.create( model=model_choice, messages=messages, ) bot_text = bot_response["choices"][0]["message"]["content"] print("bot_text: ", bot_text) messages = messages + [{"role":'assistant', 'content': bot_text}] print(chat_history) chat_history[-1][1] = "" # Yield the chat history with the bot's response character by character for character in bot_text: chat_history[-1][1] += character time.sleep(0.02) yield chat_history # Create a Gradio interface with gr.Blocks() as demo: openai_gpt_key = gr.Textbox(label="OpenAI GPT API Key", value="", placeholder="sk..") model_choice = gr.Dropdown(label="Model Options", choices=['gpt-3.5-turbo', 'gpt-4']) clear_btn = gr.Button("Clear for Restart") chat_history = gr.Chatbot([], elem_id="chat_history").style(height=500) with gr.Box(): user_text = gr.Textbox( show_label=False, placeholder="Enter text and press enter", ).style(container=False) # Handle user input and bot response user_text.submit( add_user_text, [chat_history, user_text], [chat_history, user_text], queue=False).then( bot_respond, [chat_history, openai_gpt_key, model_choice], chat_history).then( lambda: gr.update(interactive=True), None, [user_text], queue=False) clear_btn.click(lambda: None, None, chat_history, queue=False) if __name__ == "__main__": demo.queue() demo.launch()