"""This example demonstrates MagenticOne performing a task given by the user and returning a final answer.""" import asyncio import logging import os from autogen_core.application import SingleThreadedAgentRuntime from autogen_core.application.logging import EVENT_LOGGER_NAME from autogen_core.base import AgentId, AgentProxy from autogen_core.components.code_executor import CodeBlock from autogen_ext.code_executor.docker_executor import DockerCommandLineCodeExecutor from autogen_magentic_one.agents.coder import Coder, Executor from autogen_magentic_one.agents.file_surfer import FileSurfer from autogen_magentic_one.agents.multimodal_web_surfer import MultimodalWebSurfer from autogen_magentic_one.agents.orchestrator import LedgerOrchestrator from autogen_magentic_one.agents.user_proxy import UserProxy from autogen_magentic_one.messages import RequestReplyMessage from autogen_magentic_one.utils import LogHandler, create_completion_client_from_env # NOTE: Don't forget to 'playwright install --with-deps chromium' async def confirm_code(code: CodeBlock) -> bool: response = await asyncio.to_thread( input, f"Executor is about to execute code (lang: {code.language}):\n{code.code}\n\nDo you want to proceed? (yes/no): ", ) return response.lower() == "yes" async def main() -> None: # Create the runtime. runtime = SingleThreadedAgentRuntime() # Create an appropriate client client = create_completion_client_from_env(model="gpt-4o") async with DockerCommandLineCodeExecutor() as code_executor: # Register agents. await Coder.register(runtime, "Coder", lambda: Coder(model_client=client)) coder = AgentProxy(AgentId("Coder", "default"), runtime) await Executor.register( runtime, "Executor", lambda: Executor("A agent for executing code", executor=code_executor, confirm_execution=confirm_code), ) executor = AgentProxy(AgentId("Executor", "default"), runtime) # Register agents. await MultimodalWebSurfer.register(runtime, "WebSurfer", MultimodalWebSurfer) web_surfer = AgentProxy(AgentId("WebSurfer", "default"), runtime) await FileSurfer.register(runtime, "file_surfer", lambda: FileSurfer(model_client=client)) file_surfer = AgentProxy(AgentId("file_surfer", "default"), runtime) await UserProxy.register( runtime, "UserProxy", lambda: UserProxy(description="The current user interacting with you."), ) user_proxy = AgentProxy(AgentId("UserProxy", "default"), runtime) await LedgerOrchestrator.register( runtime, "Orchestrator", lambda: LedgerOrchestrator( agents=[web_surfer, user_proxy, coder, executor, file_surfer], model_client=client, max_rounds=30, max_time=25 * 60, return_final_answer=True, ), ) # orchestrator = AgentProxy(AgentId("Orchestrator", "default"), runtime) runtime.start() actual_surfer = await runtime.try_get_underlying_agent_instance(web_surfer.id, type=MultimodalWebSurfer) await actual_surfer.init( model_client=client, downloads_folder=os.getcwd(), start_page="https://www.bing.com", browser_channel="chromium", headless=True, ) await runtime.send_message(RequestReplyMessage(), user_proxy.id) await runtime.stop_when_idle() if __name__ == "__main__": logger = logging.getLogger(EVENT_LOGGER_NAME) logger.setLevel(logging.INFO) log_handler = LogHandler() logger.handlers = [log_handler] asyncio.run(main())