import gradio as gr import os import shutil import json import logging import utils from transformers import pipeline # Setup logging logging.basicConfig(level=logging.INFO) logger = logging.getLogger(__name__) FILE_DIR = os.path.dirname(os.path.abspath(__file__)) EXAMPLES_PATH = os.path.join(FILE_DIR, 'examples.json') OUTPUT_DIR = os.path.join(os.path.dirname(FILE_DIR), "auto_gpt_workspace") # Create output directory if it doesn't exist if not os.path.exists(OUTPUT_DIR): os.makedirs(OUTPUT_DIR) # Custom CSS for styling CSS = """ #chatbot {font-family: monospace;} #files .generating {display: none;} #files .min {min-height: 0px;} """ # UI Components def get_api_key(): """Get Hugging Face API key input.""" return gr.Textbox(label="Hugging Face API Key", type="password") def get_ai_name(): """Get AI name input.""" return gr.Textbox(label="AI Name", placeholder="e.g. Entrepreneur-GPT") def get_ai_role(): """Get AI role input.""" return 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.") def get_description(): """Get project description input.""" return gr.Textbox(label="Description", placeholder="Enter a brief description of the project.") def get_top_5_goals(): """Get top 5 goals input.""" return gr.Dataframe(row_count=(5, "fixed"), col_count=(1, "fixed"), headers=["AI Goals - Enter up to 5"], type="array") def get_example_values(): """Load example values from JSON file.""" try: with open(EXAMPLES_PATH, 'r', encoding='utf-8') as f: return json.load(f) except Exception as e: logger.error(f"Error loading examples: {e}") return [] def get_chatbot(): """Get chatbot UI element.""" return gr.Chatbot(elem_id="chatbot", type='messages') def get_yes_btn(): """Get Yes button.""" return gr.Button("Yes", variant="primary", interactive=False) def get_consecutive_yes(): """Get slider for consecutive yes count.""" return gr.Slider(1, 10, 1, step=1, label="Consecutive Yes", interactive=False) def get_custom_response(): """Get custom response input.""" return gr.Textbox(label="Custom Response", placeholder="Press 'Enter' to Submit.", interactive=False) def get_progress(): """Get progress bar.""" return gr.Progress() def get_generated_files(): """Get HTML element to display generated files.""" return gr.HTML(lambda: f"Generated Files
{utils.format_directory(OUTPUT_DIR)}
", every=3, elem_id="files")
def get_download_btn():
"""Get download all files button."""
return gr.Button("Download All Files")
def get_inferred_tasks():
"""Get inferred tasks textbox."""
return gr.Textbox(label="Inferred Tasks", interactive=False)
class AutoAPI:
def __init__(self, huggingface_key, ai_name, ai_role, top_5_goals):
self.huggingface_key = huggingface_key
self.ai_name = ai_name
self.ai_role = ai_role
self.top_5_goals = top_5_goals
def infer_tasks(self, description):
# Placeholder for actual task inference logic
# Simulate task inference based on the description
tasks = []
# Define keywords and corresponding tasks
keyword_tasks = {
"business": ["Analyze market trends", "Create business plan"],
"technology": ["Research latest technology", "Prototype development"],
"startup": ["Identify target audience", "Develop marketing strategy"],
"product": ["Design product", "Test product"],
"finance": ["Budget planning", "Financial forecasting"],
"team": ["Recruit team members", "Team building activities"],
"strategy": ["Develop strategic plan", "Set milestones"]
}
# Split the description into words and check for keywords
words = description.lower().split()
for keyword, task_list in keyword_tasks.items():
if any(keyword in word for word in words):
tasks.extend(task_list)
# Ensure the list always has 5 tasks
while len(tasks) < 5:
tasks.append(f"Generic Task {len(tasks) + 1}")
return tasks
def start(huggingface_key, ai_name, ai_role, top_5_goals, description):
"""Start AutoAPI and infer tasks."""
try:
from api import AutoAPI
auto_api = AutoAPI(huggingface_key, ai_name, ai_role, top_5_goals)
logger.info("AutoAPI started with AI Name: %s, AI Role: %s", ai_name, ai_role)
# Infer tasks based on the role and description
tasks = auto_api.infer_tasks(description)
logger.info("Inferred tasks: %s", tasks)
return gr.Column.update(visible=False), gr.Column.update(visible=True), auto_api, gr.update(value=tasks)
except Exception as e:
logger.error("Failed to start AutoAPI: %s", str(e))
return gr.Column.update(visible=True), gr.Column.update(visible=False), None, gr.update(value=[])
# Main Gradio Interface
with gr.Blocks(css=CSS) as demo:
gr.Markdown("# AutoGPT Task Inference")
with gr.Row():
api_key = get_api_key()
ai_name = get_ai_name()
ai_role = get_ai_role()
description = get_description()
top_5_goals = get_top_5_goals()
start_btn = gr.Button("Start")
main_pane = gr.Column(visible=False)
setup_pane = gr.Column(visible=True)
inferred_tasks = get_inferred_tasks()
start_btn.click(
start,
inputs=[api_key, ai_name, ai_role, top_5_goals, description],
outputs=[setup_pane, main_pane, inferred_tasks]
)
with main_pane:
get_generated_files()
get_download_btn()
# Launch the Gradio app
if __name__ == "__main__":
demo.launch()