| import gradio as gr |
| import asyncio |
| import os |
| import threading |
| import uvicorn |
| import time |
| from src.forge_agent import ForgeApp |
|
|
| def run_server(app_path: str, port: int): |
| """Helper function to run a uvicorn server.""" |
| uvicorn.run(app_path, host="127.0.0.1", port=port, log_level="info") |
|
|
| async def run_forge_agent(goal: str, hf_token: str, progress=gr.Progress(track_tqdm=True)): |
| """ |
| The main function to be called by the Gradio interface. |
| It instantiates and runs the ForgeApp, yielding updates to the UI. |
| """ |
| if not goal: |
| yield "Please enter a goal.", "" |
| return |
| |
| if not hf_token: |
| yield [("Please provide a Hugging Face API Token to use the planner agent.", None)] |
| return |
|
|
| |
| |
| mcp_server_urls = [ |
| "http://127.0.0.1:8001", |
| "http://127.0.0.1:8002", |
| ] |
|
|
| app = ForgeApp(goal=goal, mcp_server_urls=mcp_server_urls, hf_token=hf_token) |
| |
| |
| chatbot_history = [] |
| full_log = "" |
|
|
| |
| async for update in app.run(): |
| |
| full_log += update + "\n" |
| chatbot_history.append((None, update.strip())) |
| yield chatbot_history |
|
|
|
|
| with gr.Blocks(theme=gr.themes.Soft()) as demo: |
| gr.Markdown("# ๐ Forge - The Autonomous AI Agent") |
| gr.Markdown("Enter a high-level goal, and watch the AI agent create and execute a plan to achieve it.") |
|
|
| chatbot = gr.Chatbot(label="Agent Log", height=500, show_copy_button=True) |
| |
| with gr.Row(): |
| goal_input = gr.Textbox( |
| label="Agent's Goal", |
| placeholder="e.g., Scaffold a new Next.js blog and create a GitHub repo for it.", |
| scale=4, |
| ) |
| run_button = gr.Button("Start", variant="primary", scale=1) |
| |
| with gr.Accordion("Advanced Settings", open=False): |
| hf_token_input = gr.Textbox( |
| label="Hugging Face API Token", |
| placeholder="hf_...", |
| type="password", |
| value=os.environ.get("HF_TOKEN", ""), |
| ) |
|
|
| run_button.click(fn=run_forge_agent, inputs=[goal_input, hf_token_input], outputs=[chatbot]) |
|
|
| if __name__ == "__main__": |
| |
| |
| servers_to_run = { |
| "mock_mcp_servers.github_server:app": 8001, |
| "mock_mcp_servers.sandbox_server:app": 8002, |
| } |
| for app_path, port in servers_to_run.items(): |
| thread = threading.Thread(target=run_server, args=(app_path, port), daemon=True) |
| thread.start() |
| time.sleep(2) |
|
|
| demo.launch() |