Spaces:
Build error
Build error
# Import necessary libraries | |
import os | |
import time | |
import openai | |
from dotenv import load_dotenv | |
import wandb | |
WANDB_API_KEY = "97a45c27a4ead60eb8eff145c37ec8c39cf2fe63" | |
wandb.login(key="97a45c27a4ead60eb8eff145c37ec8c39cf2fe63") | |
wandb.init(project="Joe 0.1", job_type= "generation", name='Finn') | |
# Load environment variables from .env file | |
load_dotenv() | |
# Set OpenAI API key from environment variable | |
openai.api_key = os.getenv("OPENAI_API_KEY") | |
import gradio as gr | |
with open('initial_instructions.txt', 'r') as f: | |
initial_instructions_text = f.read() | |
initial_instructions = { | |
"role": "system", | |
"content": initial_instructions_text | |
} | |
# Create an empty list to store chat messages | |
messages = [initial_instructions] | |
# Function to add user's text to chat history | |
def add_user_text(chat_history, user_text): | |
# Print the user's text from typing | |
print('user_text_from_typing: ', user_text) | |
global messages | |
# Add user's text to the messages list with 'user' role | |
messages += [{"role":'user', 'content': user_text}] | |
# Add user's text to the chat history | |
chat_history = chat_history + [(user_text, None)] | |
# Return updated chat history and update the display without interaction | |
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 the bot's response | |
print("bot_text: ", bot_text) | |
# Add bot's response to the messages list with 'assistant' role | |
messages = messages + [{"role":'assistant', 'content': bot_text}] | |
# Clear the last entry in the 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 | |
def save_chat_history(): | |
global messages | |
# Reset messages after saving the history | |
formatted_chat = "\n".join([f"{message['role']}: {message['content']}" for message in messages]) | |
# Use a timestamp for a unique filename for each conversation | |
timestamp = time.strftime("%Y%m%d-%H%M%S") | |
with open(f'chat_history_{timestamp}.txt', 'w') as f: | |
f.write(formatted_chat) | |
# Clear the messages list for a new conversation | |
messages = [] | |
# Create a Gradio interface | |
with gr.Blocks() as demo: | |
# Textbox for OpenAI GPT API Key | |
openai_gpt_key = gr.Textbox(label="OpenAI GPT API Key", value="", placeholder="sk..") | |
# Dropdown menu for selecting the model | |
model_choice = gr.Dropdown(label="Model Options", choices=['gpt-3.5-turbo', 'gpt-4']) | |
# Button to clear the chat history and restart | |
clear_btn = gr.Button("Clear for Restart") | |
# Chat history display | |
chat_history = gr.Chatbot([], elem_id="chat_history").style(height=500) | |
with gr.Box(): | |
# Textbox for user input | |
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 button click event | |
clear_btn.click( | |
lambda: clear_and_restart(), | |
None, | |
chat_history, | |
queue=False | |
) | |
def clear_and_restart(): | |
global messages | |
save_chat_history() # Save the chat history as before | |
messages = [initial_instructions] # Reset messages to just the initial instructions | |
if __name__ == "__main__": | |
# Queue the Gradio interface | |
demo.queue() | |
# Launch the Gradio interface | |
demo.launch() | |