深扒OpenManus源码:从Base到Planning,你的第一个AI Agent该这么造
OpenManus 深度技术解读,文章6000+字,欢迎关注【AI办公日记】,收藏后细读。
一、项目背景:三小时复刻神话
OpenManus诞生于2025年3月,是MetaGPT社区对爆火的Manus AI的极速开源复现

二、系统架构:分层模块化设计
OpenManus采用清晰的分层架构,代码组织高度模块化:
OpenManus├── app/│ ├── agent/ # Agent层(核心)│ │ ├── base.py # BaseAgent:状态管理、执行循环│ │ ├── react.py # ReActAgent:思考-行动模式│ │ ├── toolcall.py # ToolCallAgent:工具调用能力│ │ ├── planning.py # PlanningAgent:任务规划能力│ │ ├── swe_agent.py # SWEAgent:软件工程专用│ │ └── manus.py # Manus:通用全能Agent│ ││ ├── flow/ # 工作流层(多Agent编排)│ │ ├── base.py # BaseFlow:流程抽象基类│ │ ├── planning.py # PlanningFlow:规划执行流程│ │ └── flow_factory.py # 流程工厂│ ││ ├── tool/ # 工具层(外部交互)│ │ ├── base.py # BaseTool:工具基类│ │ ├── planning_tool.py # 规划工具(创建/更新计划)│ │ ├── python_execute.py # Python代码执行│ │ ├── google_search.py # 谷歌搜索│ │ ├── browser_use_tool.py # 浏览器自动化│ │ ├── file_saver.py # 文件保存│ │ └── terminate.py # 终止执行│ ││ ├── llm/ # LLM层(模型交互)│ │ └── llm.py # 支持OpenAI/Claude/Azure等│ ││ ├── memory/ # 记忆层(上下文管理)│ │ └── ...│ ││ └── prompt/ # 提示词层│ ├── planning.py # Planning Agent专用Prompt│ └── manus.py # Manus Agent Prompt│├── config/ # 配置目录│ └── config.toml # LLM API配置│├── main.py # 入口:基础Manus Agent└── run_flow.py # 入口:高级Planning Flow
三、核心组件源码深度解析
3.1 Agent继承体系(四层抽象)
OpenManus的Agent设计遵循渐进式能力增强原则:
# 1. BaseAgent:最基础抽象class BaseAgent(ABC):"""提供Agent基本生命周期管理:- 状态机(IDLE/RUNNING/FINISHED/ERROR)- 记忆管理(Message历史)- 执行循环(Run Loop)- 最大步数限制(max_steps)"""name: str = "base"description: str = "Base Agent"state: AgentState = AgentState.IDLEmemory: Memory = Field(default_factory=Memory)max_steps: int = 10async def run(self, request: str) -> str:"""主入口:初始化 → 执行循环 → 返回结果"""self._initialize(request)return await self._run_loop()async def _run_loop(self) -> str:"""核心循环:直到完成或达到max_steps"""while self.state == AgentState.RUNNING and self.current_step < self.max_steps:self.current_step += 1step_result = await self.step()return self._get_result()# 2. ReActAgent:引入思考-行动模式class ReActAgent(BaseAgent, ABC):"""ReAct (Reasoning + Acting) 模式实现:- Think:分析当前状态,决定下一步行动- Act:执行具体行动"""@abstractmethodasync def think(self) -> bool:"""思考阶段:返回True表示需要执行行动"""pass@abstractmethodasync def act(self) -> str:"""行动阶段:执行决策并返回结果"""passasync def step(self) -> str:"""单步执行:Think → Act"""should_act = await self.think()if not should_act:return "思考完成 - 无需行动"return await self.act()# 3. ToolCallAgent:添加工具调用能力class ToolCallAgent(ReActAgent):"""工具调用增强:- 可用工具集合(ToolCollection)- 工具选择逻辑(LLM决定调用哪个工具)- 参数解析与执行"""available_tools: ToolCollection = Field(default_factory=ToolCollection)tool_calls: List[ToolCall] = Field(default_factory=list)async def think(self) -> bool:"""调用LLM生成工具调用决策"""# 构造Prompt包含工具描述prompt = self._build_system_prompt()# 调用LLM获取工具调用请求response = await self.llm.ask_tool(messages=self.memory.messages,tools=self.available_tools.to_params(),system_msgs=[Message.system_message(prompt)])# 解析工具调用self.tool_calls = self._parse_tool_calls(response)return len(self.tool_calls) > 0async def act(self) -> str:"""执行工具调用"""results = []for tool_call in self.tool_calls:result = await self.execute_tool(tool_call)results.append(result)self.memory.add_message(Message.tool_message(result, tool_call.id))return "\n".join(results)# 4. Manus:具体业务实现class Manus(ToolCallAgent):"""全能通用Agent:- 集成所有基础工具- 定义系统角色Prompt- 支持Python执行、搜索、浏览器、文件操作"""name: str = "Manus"description: str = "A versatile agent that can solve various tasks"system_prompt: str = SYSTEM_PROMPT # "You are OpenManus, an all-capable AI assistant..."next_step_prompt: str = NEXT_STEP_PROMPT# 绑定具体工具实例available_tools: ToolCollection = Field(default_factory=lambda: ToolCollection(PythonExecute(), # Python代码执行GoogleSearch(), # 谷歌搜索BrowserUseTool(), # 浏览器控制FileSaver(), # 文件保存Terminate() # 终止执行))max_steps: int = 20 # 最大20步
关键设计:通过组合而非继承添加能力,每个Agent层级只关注单一职责,符合SRP原则。
3.2 Planning机制:复杂任务拆解
OpenManus的核心差异化能力在于PlanningAgent,实现真正的任务规划而非简单工具链:
class PlanningAgent(ToolCallAgent):"""规划型Agent:1. 使用PlanningTool创建结构化计划2. 跟踪每步执行状态3. 根据执行反馈动态调整计划"""available_tools: ToolCollection = Field(default_factory=lambda: ToolCollection(PlanningTool(), # 计划管理工具Terminate()))step_execution_tracker: Dict[str, Dict] = Field(default_factory=dict)current_step_index: Optional[int] = Noneactive_plan_id: Optional[str] = Noneasync def think(self) -> bool:"""基于计划状态的思考"""# 获取当前计划状态文本plan_status = await self.get_plan()# 构造上下文丰富的Promptprompt = f"""CURRENT PLAN STATUS:{plan_status}YOUR CURRENT TASK:You are now working on step {self.current_step_index}: "{step_text}"Please execute this step using the appropriate tools."""self.memory.add_message(Message.user_message(prompt))# 调用父类思考逻辑return await super().think()async def create_initial_plan(self, request: str) -> str:"""创建初始执行计划"""# 调用PlanningTool的create命令result = await self.available_tools.execute("planning",command="create",plan_id=self.active_plan_id,title="Task Plan",steps=self._decompose_task(request))return result
PlanningTool 是专门的工具类,管理计划的CRUD操作:
class PlanningTool(BaseTool):"""计划管理工具:- create: 创建新计划- update: 更新计划内容- mark_step: 标记步骤状态(in_progress/completed/blocked)- get: 获取计划详情"""name: str = "planning"description: str = "Create and manage structured plans"async def execute(self, command: str, **kwargs) -> ToolResult:if command == "create":return self._create_plan(**kwargs)elif command == "mark_step":return self._update_step_status(**kwargs)# ...def _create_plan(self, plan_id: str, title: str, steps: List[str]) -> ToolResult:plan = {"plan_id": plan_id,"title": title,"steps": [{"index": i, "text": step, "status": "pending"}for i, step in enumerate(steps)],"created_at": time.time()}self.plans[plan_id] = planreturn ToolResult(output=f"Plan created with {len(steps)} steps")
3.3 Flow层:多Agent协作编排
Flow层解决多Agent协作问题,目前主要实现是PlanningFlow:
class PlanningFlow(BaseFlow):"""规划流程:1. 使用PlanningTool分解任务为步骤2. 按顺序执行每步3. 可动态选择执行Agent(目前仅支持单Agent)"""agents: Dict[str, BaseAgent] # 注册的Agent池planning_tool: PlanningToolexecutor_keys: List[str] # 执行者ID列表current_step_index: int = 0async def execute(self, input_text: str) -> str:"""主执行流程"""try:# 阶段1:创建初始计划if input_text:await self._create_initial_plan(input_text)# 阶段2:按步骤执行while await self._has_next_step():step_info = await self._get_current_step()# 选择执行者(目前固定使用Manus,可扩展为动态选择)executor = self.get_executor(step_info.get("type"))# 生成步骤专用Promptstep_prompt = f"""CURRENT PLAN STATUS:{plan_status}YOUR CURRENT TASK:You are now working on step {self.current_step_index}: "{step_text}""""# 执行步骤result = await executor.run(step_prompt)# 更新步骤状态await self._update_step_status(step_info["index"], "completed")# 阶段3:完成计划return await self._finalize_plan()except Exception as e:return f"Error executing flow: {str(e)}"
执行流程对比:

3.4 工具系统:标准接口与自动发现
工具层采用统一接口+自动注册机制:
class BaseTool(BaseModel, ABC):"""工具基类:所有工具必须实现"""name: strdescription: strparameters: dict = Field(default_factory=dict)@abstractmethodasync def execute(self, **kwargs) -> ToolResult:"""执行工具逻辑"""passclass ToolCollection:"""工具集合:管理多个工具"""def __init__(self, *tools: BaseTool):self.tools = {tool.name: tool for tool in tools}def to_params(self) -> List[dict]:"""转换为LLM可用的函数描述格式(OpenAI Function Calling)"""return [{"type": "function","function": {"name": tool.name,"description": tool.description,"parameters": tool.parameters}} for tool in self.tools.values()]async def execute(self, name: str, **params) -> ToolResult:"""根据名称执行指定工具"""if name not in self.tools:return ToolResult(error=f"Tool {name} not found")return await self.tools[name].execute(**params)
内置工具清单:

3.5 LLM抽象层:多提供商支持
class LLM(BaseModel):"""LLM封装:- 支持OpenAI、Claude、Azure等- 实现重试机制、错误处理- 支持流式响应"""model: str = "gpt-4o"base_url: str = "https://api.openai.com/v1"api_key: str = ""max_tokens: int = 4096temperature: float = 0.0async def ask_tool(self, messages: List[Message], tools: List[dict], **kwargs) -> dict:"""支持Function Calling的对话返回LLM决策,可能包含tool_calls"""response = await self.client.chat.completions.create(model=self.model,messages=messages,tools=tools,tool_choice="auto",**kwargs)return response.choices[0].messageasync def ask(self, messages: List[Message], **kwargs) -> str:"""普通对话,返回文本"""# ...
四、执行流程深度剖析
4.1 基础执行流程(Manus Agent)
用户输入: "分析这个网站的SEO并提供报告"↓Manus.run(prompt)↓初始化记忆: 添加System Prompt + User Prompt↓进入Run Loop(最多20步)│├─→ Step 1:│ ├─ think(): 调用LLM,返回需要GoogleSearch│ ├─ act(): 执行GoogleSearch,获取网站信息│ └─ 保存结果到Memory│├─→ Step 2:│ ├─ think(): 分析结果,决定使用BrowserUseTool访问网站│ ├─ act(): 浏览器抓取网站内容│ └─ 保存结果│├─→ Step 3:│ ├─ think(): 分析内容,决定用PythonExecute分析SEO指标│ ├─ act(): 执行Python代码计算SEO分数│ └─ 保存结果│├─→ Step 4:│ ├─ think(): 决定使用FileSaver保存报告│ ├─ act(): 保存SEO报告到本地文件│ └─ 调用Terminate结束│↓返回结果摘要
4.2 规划执行流程(PlanningFlow)
用户输入: "帮我规划一次日本7日游,预算1万元"↓PlanningFlow.execute()│├─→ 阶段1:创建计划│ └─ PlanningTool.create → 生成步骤:│ 1. 搜索日本7日游攻略│ 2. 查询机票价格(出发地-东京/大阪)│ 3. 查询酒店价格(东京/京都/大阪)│ 4. 规划每日行程│ 5. 计算总预算│ 6. 生成详细旅行计划文档│├─→ 阶段2:按步执行│ ││ ├─→ Step 1: 搜索攻略│ │ └─ Manus.run("CURRENT PLAN STATUS: ... YOUR CURRENT TASK: 搜索日本7日游攻略")│ │ └─ 使用GoogleSearch + BrowserUseTool收集信息│ ││ ├─→ Step 2: 查询机票│ │ └─ Manus.run("... YOUR CURRENT TASK: 查询机票价格...")│ │ └─ 浏览器访问携程/去哪儿查询价格│ ││ ├─→ Step 3-6: 类似执行...│ ││ └─→ 每步完成后更新计划状态(mark_step completed)│└─→ 阶段3:汇总结果└─ 整合所有步骤输出,生成最终旅行计划
五、二次开发指南
5.1 开发环境搭建
# 方法1:使用Conda(传统方式)conda create -n open_manus python=3.12conda activate open_manusgit clone https://github.com/mannaandpoem/OpenManus.gitcd OpenManuspip install -r requirements.txt# 方法2:使用uv(推荐,更快)curl -LsSf https://astral.sh/uv/install.sh | shgit clone https://github.com/mannaandpoem/OpenManus.gitcd OpenManusuv venv --python 3.12source .venv/bin/activate # Windows: .venv\Scripts\activateuv pip install -r requirements.txt# 安装浏览器自动化(可选)playwright install
配置LLM API
# config/config.toml[llm]model = "gpt-4o"base_url = "https://api.openai.com/v1"api_key = "sk-..." # 替换为你的API Keymax_tokens = 4096temperature = 0.0# 可选:Vision模型配置(用于图像理解)[llm.vision]model = "gpt-4o"base_url = "https://api.openai.com/v1"api_key = "sk-..."
5.2 开发新工具(Tool)
创建自定义工具的步骤
# app/tool/my_custom_tool.pyfrom app.tool.base import BaseTool, ToolResultclass DatabaseQueryTool(BaseTool):"""自定义数据库查询工具示例"""name: str = "database_query"description: str = "Execute SQL queries on a database"# 定义JSON Schema参数格式(供LLM理解)parameters: dict = {"type": "object","properties": {"query": {"type": "string","description": "SQL query to execute"},"connection_string": {"type": "string","description": "Database connection string"}},"required": ["query"]}async def execute(self, query: str, connection_string: str = "default", **kwargs) -> ToolResult:"""执行工具逻辑"""try:# 这里实现具体逻辑import sqlite3conn = sqlite3.connect(connection_string)cursor = conn.cursor()cursor.execute(query)result = cursor.fetchall()conn.close()return ToolResult(output=str(result))except Exception as e:return ToolResult(error=f"Database error: {str(e)}")# 注册到Manus Agent# app/agent/manus.pyfrom app.tool.my_custom_tool import DatabaseQueryToolavailable_tools: ToolCollection = Field(default_factory=lambda: ToolCollection(PythonExecute(),GoogleSearch(),BrowserUseTool(),FileSaver(),DatabaseQueryTool(), # 添加新工具Terminate()))
5.3 开发专用Agent
继承现有Agent类创建专用Agent
# app/agent/data_analysis_agent.pyfrom app.agent.toolcall import ToolCallAgentfrom app.tool import ToolCollectionfrom app.tool.python_execute import PythonExecutefrom app.tool.file_saver import FileSaverfrom pydantic import Fieldclass DataAnalysisAgent(ToolCallAgent):"""数据分析专用Agent:- 强化Python数据处理能力- 集成matplotlib/seaborn可视化- 自动保存分析图表"""name: str = "data_analyst"description: str = "Specialized agent for data analysis and visualization"system_prompt: str = """You are a Data Analysis Expert.Your capabilities:1. Load and clean data using Python (pandas)2. Perform statistical analysis3. Create visualizations (matplotlib/seaborn/plotly)4. Generate comprehensive analysis reportsAlways save your visualizations and final report using FileSaver."""# 仅保留必要工具available_tools: ToolCollection = Field(default_factory=lambda: ToolCollection(PythonExecute(), # 核心:Python执行FileSaver(), # 保存结果Terminate()))max_steps: int = 30 # 数据分析允许更多步骤# 在PlanningFlow中使用专用Agent# run_custom_flow.pyfrom app.agent.data_analysis_agent import DataAnalysisAgentfrom app.agent.manus import Manusfrom app.flow.planning import PlanningFlowasync def run_data_analysis_task():agents = {"manus": Manus(), # 通用任务"analyst": DataAnalysisAgent(), # 数据分析专用}flow = PlanningFlow(agents=agents,executor_keys=["analyst"] # 指定使用DataAnalysisAgent)result = await flow.execute("分析sales.csv的销售趋势并生成图表")
5.4 自定义Flow(工作流)
创建自定义业务流程
# app/tool/custom_flow.pyfrom app.flow.base import BaseFlowfrom typing import Dictclass ApprovalFlow(BaseFlow):"""带人工审批的自定义流程:1. Agent生成方案2. 等待人类审批3. 根据审批结果执行或修改"""async def execute(self, input_text: str) -> str:# 步骤1:规划Agent生成方案planner = self.agents["planner"]plan = await planner.run(f"Create a plan for: {input_text}")# 步骤2:等待人工确认(伪代码)human_approval = await self.wait_for_human_input(f"请审阅以下方案:\n{plan}\n[确认/修改/取消]")if human_approval == "确认":# 步骤3:执行Agent实施方案executor = self.agents["executor"]result = await executor.run(f"Execute plan: {plan}")return resultelif human_approval == "修改":# 重新规划return await self.execute(input_text + " (需要修改)")else:return "任务已取消"
5.5 扩展记忆系统
当前OpenManus使用简单内存记忆,可扩展为持久化向量数据库:
# app/memory/vector_memory.pyfrom app.memory.base import Memoryimport sqlite_vec # 向量SQLiteclass VectorMemory(Memory):"""增强记忆:使用向量数据库存储和检索支持语义搜索历史对话"""def __init__(self, db_path: str = "memory.db"):super().__init__()self.db = sqlite_vec.connect(db_path)self._init_tables()async def add_message(self, message: Message):# 存储原始消息super().add_message(message)# 向量化并存储(用于语义检索)embedding = await self.get_embedding(message.content)self.db.execute("INSERT INTO vec_memory(content, embedding, timestamp) VALUES (?, ?, ?)",(message.content, embedding, time.time()))async def retrieve_relevant(self, query: str, top_k: int = 3) -> List[str]:"""语义检索相关历史记忆"""query_vec = await self.get_embedding(query)results = self.db.execute("SELECT content FROM vec_memory ORDER BY vec_distance(embedding, ?) LIMIT ?",(query_vec, top_k))return [r[0] for r in results]
六、OpenManus vs OpenClaw:架构对比

架构哲学差异:
-
OpenManus:“Framework First”(框架优先),提供构建Agent的基础设施,强调规划(Planning)和模块化
-
OpenClaw:“Product First”(产品优先),提供开箱即用的个人助理,强调集成(Integration)和易用性
七、路线图与演进方向
OpenManus团队公布的未来计划
-
更好的规划(Better Planning):强化PlanningAgent的推理能力
-
实时演示(Live Demos):支持实时可视化Agent执行过程
-
Replay(重放):支持任务执行历史回放与分析
-
RL Fine-tuned Models(强化学习微调):OpenManus-RL项目,使用GRPO等RL方法训练专用Agent模型
-
Comprehensive Benchmarks(全面基准测试):GAIA等 benchmark 的系统性评测
八、总结:如何选择与二次开发
选择OpenManus如果你:
-
需要复杂的任务规划和多步骤执行能力
-
希望深度定制Agent行为(自定义Agent类、Flow编排)
-
需要集成到现有Python系统或作为后端服务
-
关注多Agent协作和研究原型开发
-
希望使用开源模型(支持本地LLM部署)
选择OpenClaw如果你:
-
需要即时通讯集成(WhatsApp/Slack等)
-
需要7×24小时常驻的助理体验
-
重视数据隐私(完全本地运行,无云端依赖)
-
需要丰富的现成Skills(ClawHub生态)
-
是非开发者或希望快速上手
二次开发建议:
OpenManus扩展路径:
-
纵向扩展:继承
ToolCallAgent开发领域专用Agent(如数据分析Agent、代码审查Agent) -
横向扩展:实现更多
BaseTool(对接内部API、数据库、企业系统) -
流程优化:自定义
BaseFlow实现复杂业务流程(审批流、协作流) -
模型适配:扩展
LLM类支持本地模型(Ollama、vLLM)
代码贡献点:
-
增强PlanningFlow的人机协作(Human-in-the-loop)
-
添加记忆压缩和长期记忆持久化
-
实现多Agent并行执行(当前为串行)
-
完善错误恢复和重试机制
欢迎关注【AI办公日记】,或者你有工作中的痛点问题,也可以留言,AI日记君为你寻找更高效的解决方案。
夜雨聆风
