| 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") | |
| 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> | |
| 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().launch(file_directories=[OUTPUT_DIR]) | |