什么是 OpenManus?它的实现原理是什么?
OpenManus 是 FoundationAgents/OpenManus 开源的通用 AI Agent 框架——受商业产品 Manus 启发,目标是「无需邀请码也能跑通用 Agent」。团队来自 MetaGPT 社区,核心思路是用 ReAct + Function Calling + 可插拔工具 实现 Think-Act 闭环。本篇讲面试答法;同类概念见 Agent 核心概念与架构;MCP 见 MCP 概览与实践。
它是什么
| 维度 | 说明 |
|---|---|
| 定位 | 开源通用 Agent 框架,非单一 SaaS 产品 |
| 与 Manus 关系 | 受 Manus 能力启发;OpenManus 是可自部署、可改源码的实现 |
| 语言 / 栈 | Python 3.12、async/await、Pydantic 模型 |
| 入口 | main.py(单 Agent)、run_flow.py(多 Agent 计划流)、run_mcp.py(MCP 工具版) |
| 典型能力 | 跑 Python、改文件、浏览器自动化、接 MCP 远程工具、人机协作(AskHuman) |
面试一句话:OpenManus = 分层 Agent 继承体系 + ReAct 工具调用循环 + 可选 PlanningFlow 多步编排 + 原生 MCP 插件化。
整体架构
用户请求
↓
┌─ Agent 模式(main.py)──────────────────────┐
│ Manus.run() → while step: think → act │
└─────────────────────────────────────────────┘
或
┌─ Flow 模式(run_flow.py)────────────────────┐
│ PlanningFlow:先 plan → 逐步选 Agent 执行 │
└─────────────────────────────────────────────┘
↓
LLM(ask / ask_tool)+ Memory + ToolCollection
↓
内置工具 / MCP Server(Browser Use、自定义 SSE/stdio)
Agent 四层继承(核心原理)
OpenManus 用继承分层把「状态机、ReAct、工具调用、业务 Agent」拆开:
BaseAgent
└─ ReActAgent think() + act() 抽象
└─ ToolCallAgent LLM function calling + 工具执行
└─ Manus 通用 Agent:内置工具 + MCP 客户端
| 层级 | 职责 |
|---|---|
| BaseAgent | 状态机(IDLE / RUNNING / FINISHED / ERROR)、Memory、主循环 run()、步数上限、死循环检测 |
| ReActAgent | 实现 step() = think() → act(),定义 ReAct 节拍 |
| ToolCallAgent | think() 调 llm.ask_tool() 选工具;act() 执行 tool_calls 并写回 memory |
| Manus | 注册 PythonExecute、StrReplaceEditor、AskHuman、Terminate;启动时连 MCP(默认 Browser Use CLI) |
主循环(BaseAgent.run)
- 用户请求写入
Memory - 状态切到
RUNNING,循环调用step(),直到FINISHED或max_steps - 每步后检查
is_stuck():若 assistant 重复相同内容 ≥ 阈值,往next_step_prompt注入「换策略」提示 - 结束清理 Sandbox / MCP 连接
这和 Agent 核心概念与架构 里的 感知-规划-行动 一致:think 是规划,act 是行动,工具结果是观察。
Think-Act 细节(ToolCallAgent)
Think 阶段:
- 把
system_prompt、memory.messages、可选next_step_prompt交给 LLM - 调用
llm.ask_tool(tools=available_tools.to_params()) - LLM 返回文本和/或
tool_calls;assistant / tool 消息追加进 Memory
Act 阶段:
- 遍历
tool_calls,经ToolCollection.execute()执行 - 结果以
toolrole 消息回灌;支持max_observe截断过长输出 - 特殊工具
Terminate触发AgentState.FINISHED
工具体系
| 组件 | 作用 |
|---|---|
| BaseTool | 工具抽象:name、description、parameters schema、execute() |
| ToolCollection | 注册表 + 统一 execute(name, tool_input) |
| 内置工具 | PythonExecute(沙箱跑代码)、StrReplaceEditor(改文件)、AskHuman、Terminate |
| MCPClients | 连 MCP Server(stdio / SSE),远程 tool 映射为本地 MCPClientTool 加入 ToolCollection |
Manus 启动时会默认尝试连 Browser Use CLI 3.0(MCP),提供 browser_exec、browser_screenshot 等浏览器能力;也可在 config.toml 里配更多 MCP Server。
和 MCP 概览与实践 的关系:MCP 是工具交付层;OpenManus 的 function calling 是模型选型机制——二者组合,本地工具与远程 MCP 工具对 Agent 是统一列表。
两种执行模式
| 维度 | Agent 模式 | Flow 模式 |
|---|---|---|
| 入口 | python main.py | python run_flow.py |
| 核心 | Manus.run() 单循环 | PlanningFlow |
| 规划 | 隐式(模型逐步 ReAct) | 显式:先 PlanningTool 生成计划,再逐步执行 |
| 适用 | 目标相对单一、路径开放 | 复杂多步、需分 Agent(如 DataAnalysis Agent) |
| 执行器 | 单个 Manus | get_executor(step_type) 按步骤标签选 Agent |
PlanningFlow 原理简述:
- LLM +
PlanningTool创建 plan(steps + step_statuses) - 循环取第一个未完成 step,标记
in_progress - 把「当前计划进度 + 本步任务」作为 prompt 交给对应 Agent 的
run() - 完成后
mark_step→completed,直到无剩余 step,LLM 做总结
这是 Plan-and-Execute:计划与执行分离,比纯 ReAct 更可控,适合面试里对比「单 Agent 循环 vs 显式规划流」。
Memory 与配置
- Memory:存
Message列表(user / assistant / system / tool),即短期工作记忆;工具观察也在这里 - LLM:
config.toml配 model、base_url、api_key;支持多 profile(如 vision) - Sandbox:Python 执行等走隔离客户端,任务结束
cleanup()
长期跨会话记忆不是 OpenManus 主打能力——面试可主动说:框架偏单任务轨迹 memory,跨会话要自接业务库 / Store(见 大模型长短期记忆机制)。
与同类框架怎么比
| 对比 | OpenManus | LangGraph / 自研 loop |
|---|---|---|
| 抽象 | 类继承 + ReAct | 图 / 状态机 / 手写 while |
| 工具 | ToolCollection + MCP 一等公民 | 各自注册 |
| 多 Agent | PlanningFlow + 多 executor | 图分支 / 子图 |
| 定位 | 开箱跑通用 Agent Demo | 生产编排更灵活 |
OpenManus 价值在教学与 PoC:结构清晰、代码量适中,适合讲清 Agent 最小闭环;上生产还要补权限、评测、多租户等(见 Agent 系统高频题)。
常见坑(面试加分)
| 坑 | 说明 |
|---|---|
| 与商业 Manus 混淆 | OpenManus 是开源框架,不是同一产品 |
| 以为有长期记忆 | 默认 Memory 是会话内 messages,不持久跨用户 |
| 忽略死循环 | 靠 is_stuck + prompt 注入,不是硬中断 |
| MCP 工具面过大 | 连多个 Server 后 tool 暴涨,需裁剪或分场景 |
| Flow 模式稳定性 | 官方标注 multi-agent 版本仍 unstable |
面试参考答法(60~90 秒)
OpenManus 是 MetaGPT 社区开源的通用 Agent 框架,用 Python 实现 ReAct 式的 Think-Act 循环。
架构上四层继承:BaseAgent 管状态机和主循环;ReActAgent 拆 think/act;ToolCallAgent 用 LLM function calling 选工具并执行;Manus 是面向用户的通用 Agent,内置 Python 执行、文件编辑、AskHuman、Terminate,并通过 MCP 接 Browser Use 等远程工具。
原理就是:每步 think 把 memory 和 tool schema 给 LLM,LLM 返回 tool_calls;act 执行工具,结果写回 memory,循环直到 Terminate 或达到 max_steps。另有 PlanningFlow 模式,先用 PlanningTool 生成多步计划,再按步选不同 Agent 执行,适合复杂任务。
和 LangChain/LangGraph 比,它更偏「可读的最小 Agent 参考实现」,MCP 集成和双模式入口是特色。
延伸阅读
| 篇 | 关系 |
|---|---|
| Agent 核心概念与架构 | ReAct、工具/记忆/规划三角 |
| Agent 最小可运行项目 | 手写同类 loop 的对照 |
| MCP 概览与实践 | OpenManus 工具扩展方式 |
| [LangGraph 编排实践](/docs/ai/Agent/LangGraph 编排实践) | Flow 模式的图编排替代 |
面试速记
- 是什么: 开源通用 Agent 框架(FoundationAgents),ReAct + function calling + MCP。
- 继承链: BaseAgent → ReActAgent → ToolCallAgent → Manus。
- 单步原理: think(ask_tool 选工具)→ act(execute 回灌 memory)→ 循环至 FINISHED。
- 双模式: main.py 单 Agent 循环;run_flow.py 的 PlanningFlow 先 plan 再分步执行。
- 特色: ToolCollection 插件化、MCP 远程工具、死循环检测、Sandbox 执行 Python。