File size: 5,630 Bytes
d9a8c9e |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 |
import gradio as gr
import utils
from api import AutoAPI, get_openai_api_key
import os, shutil
import json
FILE_DIR = os.path.dirname(os.path.abspath(__file__))
OUTPUT_DIR = os.path.join(os.path.dirname(FILE_DIR), "auto_gpt_workspace")
if not os.path.exists(OUTPUT_DIR):
os.mkdir(OUTPUT_DIR)
CSS = """
#chatbot {font-family: monospace;}
#files .generating {display: none;}
#files .min {min-height: 0px;}
"""
with gr.Blocks(css=CSS) as app:
with gr.Column() as setup_pane:
gr.Markdown(f"""# Auto-GPT
1. Duplicate this Space: <a href="https://huggingface.co/spaces/{os.getenv('SPACE_ID')}?duplicate=true"><img style="display: inline; margin-top: 0em; margin-bottom: 0em" src="https://bit.ly/3gLdBN6" alt="Duplicate Space" /></a> This will **NOT** work without duplication!
2. Enter your <a href="https://platform.openai.com/account/api-keys">OpenAI API Key</a> below.
""")
with gr.Row():
open_ai_key = gr.Textbox(
value=get_openai_api_key(),
label="OpenAI API Key",
type="password",
)
gr.Markdown(
"3. Fill the values below, then click 'Start'. There are example values you can load at the bottom of this page."
)
with gr.Row():
ai_name = gr.Textbox(label="AI Name", placeholder="e.g. Entrepreneur-GPT")
ai_role = gr.Textbox(
label="AI Role",
placeholder="e.g. an AI designed to autonomously develop and run businesses with the sole goal of increasing your net worth.",
)
top_5_goals = gr.Dataframe(
row_count=(5, "fixed"),
col_count=(1, "fixed"),
headers=["AI Goals - Enter up to 5"],
type="array"
)
start_btn = gr.Button("Start", variant="primary")
with open(os.path.join(FILE_DIR, "examples.json"), "r") as f:
example_values = json.load(f)
gr.Examples(
example_values,
[ai_name, ai_role, top_5_goals],
)
with gr.Column(visible=False) as main_pane:
with gr.Row():
with gr.Column(scale=2):
chatbot = gr.Chatbot(elem_id="chatbot")
with gr.Row():
yes_btn = gr.Button("Yes", variant="primary", interactive=False)
consecutive_yes = gr.Slider(
1, 10, 1, step=1, label="Consecutive Yes", interactive=False
)
custom_response = gr.Textbox(
label="Custom Response",
placeholder="Press 'Enter' to Submit.",
interactive=False,
)
with gr.Column(scale=1):
gr.HTML(
lambda: f"""
Generated Files
<pre><code style='overflow-x: auto'>{utils.format_directory(OUTPUT_DIR)}</pre></code>
""", every=3, elem_id="files"
)
download_btn = gr.Button("Download All Files")
chat_history = gr.State([[None, None]])
api = gr.State(None)
def start(open_ai_key, ai_name, ai_role, top_5_goals):
auto_api = AutoAPI(open_ai_key, ai_name, ai_role, top_5_goals)
return gr.Column.update(visible=False), gr.Column.update(visible=True), auto_api
def bot_response(chat, api):
messages = []
for message in api.get_chatbot_response():
messages.append(message)
chat[-1][1] = "\n".join(messages) + "..."
yield chat
chat[-1][1] = "\n".join(messages)
yield chat
def send_message(count, chat, api, message="Y"):
if message != "Y":
count = 1
for i in range(count):
chat.append([message, None])
yield chat, count - i
api.send_message(message)
for updated_chat in bot_response(chat, api):
yield updated_chat, count - i
def activate_inputs():
return {
yes_btn: gr.Button.update(interactive=True),
consecutive_yes: gr.Slider.update(interactive=True),
custom_response: gr.Textbox.update(interactive=True),
}
def deactivate_inputs():
return {
yes_btn: gr.Button.update(interactive=False),
consecutive_yes: gr.Slider.update(interactive=False),
custom_response: gr.Textbox.update(interactive=False),
}
start_btn.click(
start,
[open_ai_key, ai_name, ai_role, top_5_goals],
[setup_pane, main_pane, api],
).then(bot_response, [chat_history, api], chatbot).then(
activate_inputs, None, [yes_btn, consecutive_yes, custom_response]
)
yes_btn.click(
deactivate_inputs, None, [yes_btn, consecutive_yes, custom_response]
).then(
send_message, [consecutive_yes, chat_history, api], [chatbot, consecutive_yes]
).then(
activate_inputs, None, [yes_btn, consecutive_yes, custom_response]
)
custom_response.submit(
deactivate_inputs, None, [yes_btn, consecutive_yes, custom_response]
).then(
send_message,
[consecutive_yes, chat_history, api, custom_response],
[chatbot, consecutive_yes],
).then(
activate_inputs, None, [yes_btn, consecutive_yes, custom_response]
)
def download_all_files():
shutil.make_archive("outputs", "zip", OUTPUT_DIR)
download_btn.click(download_all_files).then(None, _js=utils.DOWNLOAD_OUTPUTS_JS)
app.queue(concurrency_count=20).launch(file_directories=[OUTPUT_DIR])
|