from pydantic import Field from app.agent.browser import BrowserAgent from app.config import config from app.prompt.browser import NEXT_STEP_PROMPT as BROWSER_NEXT_STEP_PROMPT from app.prompt.manus import NEXT_STEP_PROMPT, SYSTEM_PROMPT from app.tool import Terminate, ToolCollection from app.tool.browser_use_tool import BrowserUseTool from app.tool.python_execute import PythonExecute from app.tool.str_replace_editor import StrReplaceEditor class Manus(BrowserAgent): """ A versatile general-purpose agent that uses planning to solve various tasks. This agent extends BrowserAgent with a comprehensive set of tools and capabilities, including Python execution, web browsing, file operations, and information retrieval to handle a wide range of user requests. """ name: str = "Manus" description: str = ( "A versatile agent that can solve various tasks using multiple tools" ) system_prompt: str = SYSTEM_PROMPT.format(directory=config.workspace_root) next_step_prompt: str = NEXT_STEP_PROMPT max_observe: int = 10000 max_steps: int = 20 # Add general-purpose tools to the tool collection available_tools: ToolCollection = Field( default_factory=lambda: ToolCollection( PythonExecute(), BrowserUseTool(), StrReplaceEditor(), Terminate() ) ) async def think(self) -> bool: """Process current state and decide next actions with appropriate context.""" # Store original prompt original_prompt = self.next_step_prompt # Only check recent messages (last 3) for browser activity recent_messages = self.memory.messages[-3:] if self.memory.messages else [] browser_in_use = any( "browser_use" in msg.content.lower() for msg in recent_messages if hasattr(msg, "content") and isinstance(msg.content, str) ) if browser_in_use: # Override with browser-specific prompt temporarily to get browser context self.next_step_prompt = BROWSER_NEXT_STEP_PROMPT # Call parent's think method result = await super().think() # Restore original prompt self.next_step_prompt = original_prompt return result