【AI智能体】OpenManus项目架构分析报告
本文深入分析了OpenManus项目在AI智能体领域的三大核心设计:1)采用滑动窗口截断和动态Prompt注入的上下文管理策略,有效防止Token溢出;2)基于"共享计划"的多智能体协作机制,通过全局状态维护实现高效解耦;3)构建了包含Python执行沙箱、浏览器操作等核心工具集的MCP生态,并深度集成Daytona虚拟环境实现安全执行。该项目虽完成度有限,但其在动态上下文构建
本文假设你已经了解Coze、Dify、FastGPT、n8n或对同类AI Ops平台有比较深入的了解,有一定的技术理解能力,那么本篇文章更深一层,挖掘 OpenManus(由MetaGPT创作团队开发),了解其在上下文管理、多智能体协作及配套工具体系方面的设计进行了深入分析。
如果对这个项目不熟悉甚至不知道Manus,那可以先移步了解下该项目:
DeepWiki
GitHub
这个项目的完成度并不是很好,修复完善速度也比较慢,但这并不妨碍我们快速的学习和理解该项目的核心思想、核心工具,还有重点的What LLM sees,有助于快速培养AI 智能体工程师职业素养。
1. 上下文管理 (Context Management)
OpenManus 采取了实用且稳健的上下文管理策略,主要侧重于防止 Token 溢出和保持任务聚焦,而非复杂的向量检索。
1.1 基础上下文控制
- 滑动窗口截断 (Truncation):
Memory类 (app/schema.py) 内置了max_messages(默认 100) 限制。当消息数超过阈值时,自动保留最新的消息,丢弃旧消息。这是一种低成本的上下文维护方式。
- 观察值限制 (Observation Limiting):
ToolCallAgent(app/agent/toolcall.py) 引入了max_observe参数。当工具(如 shell 命令或代码执行)返回大量文本时,Agent 会自动截断输出。这有效防止了类似cat huge_file的操作撑爆 LLM 上下文窗口。
1.2 动态上下文构建 (Dynamic Context Construction)
- 基于状态的 Prompt 注入:
ManusAgent (app/agent/manus.py) 根据当前工具的使用情况动态调整 System Prompt。例如,当检测到BrowserUseTool被使用时,会通过BrowserContextHelper注入浏览器相关的上下文信息,确保模型获得即时且相关的环境感知。
- 异常驱动的流控:
- 在
think循环中捕获TokenLimitExceeded异常,优雅地处理上下文溢出情况,而不是让程序崩溃。
- 在
1.3 思考 (Takeaways)
对于高级平台,可以参考其 Dynamic Prompting 机制,即根据当前活跃的工具或 Agent 状态,实时修改 System Prompt,而不是仅仅依赖静态的 Prompt 模板。
2. 多智能体上下文共享 (Multi-Agent Context Sharing)
OpenManus 展示了一种基于 “共享计划 (Shared Plan)” 而非 “共享记忆 (Shared Memory)” 的协作模式,主要体现在 PlanningFlow 中。
2.1 Planning Flow 架构
位于 app/flow/planning.py 的 PlanningFlow 实现了类似 SOP (Standard Operating Procedure) 的动态编排:
-
全局状态维护:
- 系统维护一个全局的
Plan对象,包含steps(步骤列表),step_statuses(执行状态), 和step_notes(执行结果摘要)。 - 这个 Plan 充当了 Agent 之间的 “黑板” (Blackboard)。
- 系统维护一个全局的
-
上下文传递机制:
- 不共享完整对话: Executor Agent (执行者) 不需要 能够看到 Planning Agent (规划者) 或上一个 Executor Agent 的完整对话历史。
- 只共享关键状态: 在执行每个 Step 时,系统会将
CURRENT PLAN STATUS(格式化后的文本) 作为 Context 注入给 Executor Agent。 - Prompt 模板:
CURRENT PLAN STATUS: [Plan visualization...] YOUR CURRENT TASK: You are now working on step X: "Task description"
2.2 优势分析
- Token 效率极高: 随着任务推进,Context 长度不会线性增长,因为传递的只是 Plan 的当前快照。
- 解耦: Agent 之间不需要互相感知,只需要对 Plan 负责。这使得新增或替换 Agent 变得非常容易。
3. 配套工具与 MCP 生态 (Tools & MCP)
OpenManus 对 Model Context Protocol (MCP) 的双向支持是其最大的技术亮点,使其具有极高的扩展性。
3.1 核心工具集 (Core Tools)
位于 app/tool,实现了几个关键的“生产力工具”:
- PythonExecute: 提供了一个安全的代码执行沙箱(基于 Docker/Daytona),允许 Agent 编写并运行 Python 代码。
- BrowserUseTool: 封装了浏览器操作,使 Agent 能够与现代 Web 页面交互。
- StrReplaceEditor: 提供了文件编辑能力,支持精确的字符串替换。
3.2 扩展工具集 (Extended Toolset)
除了上述基础工具,OpenManus 还实现了以下高级工具,进一步增强了 Agent 的能力边界:
-
PlanningTool (
app/tool/planning.py):- 任务编排的核心,支持 CRUD 操作创建和更新计划。
- 维护每个步骤的状态 (
not_started,in_progress,completed,blocked) 和执行笔记。 - 它是 Agent 之间共享上下文的“黑板”。
-
ComputerUseTool (
app/tool/computer_use_tool.py):- 实现了对 GUI 的直接控制,包括鼠标 (Move, Click, Drag)、键盘 (Type, Hotkey) 和屏幕截图。
- 通过 HTTP API 连接到 Daytona Sandbox 环境,使 Agent 能够像人类一样操作桌面软件。
-
Crawl4AI Tool (
app/tool/crawl4ai.py):- 一个对 LLM 友好的现代爬虫工具。
- 支持 JS 渲染 (Headless Browser),自动将网页内容转换为干净的 Markdown 格式,过滤无关噪音,极大提升了 Agent 阅读网页的效率。
-
FileOperators (
app/tool/file_operators.py):- 环境抽象: 定义了
FileOperator协议,并提供了LocalFileOperator和SandboxFileOperator两种实现。 - 这种抽象允许同一套 Agent 代码既可以运行在本地开发环境,也可以无缝迁移到安全的云端沙箱环境中运行,无需修改任何业务逻辑。
- 环境抽象: 定义了
-
DataVisualization (
app/tool/chart_visualization/data_visualization.py):- 一个基于 Node.js (VMind) 的高级图表生成工具。
- 可以接受 CSV 数据和描述,生成可视化的统计图表 (PNG/HTML) 并添加洞察 (Insights)。
- 跨语言调用: 展示了 Python 如何通过
subprocess调用 Node.js 工具链来弥补生态能力的不足。
3.3 交互与控制工具 (Interaction & Control)
除了上述生产力工具,系统还包含了一组用于流程控制的工具:
- AskHuman (
app/tool/ask_human.py):- 允许 Agent 主动挂起任务,向人类用户提问以获取澄清或帮助。
- Terminate (
app/tool/terminate.py):- Agent 用于主动结束任务并报告最终状态(成功/失败)的标准接口。
- Bash (
app/tool/bash.py):- 提供了比 PythonExecute 更底层的系统访问能力。
- 支持交互式会话(通过
input流入 stdin),这对于需要持续交互的 CLI 工具非常重要。
- WebSearch (
app/tool/web_search.py):- 聚合了 Google, Bing, Baidu, DuckDuckGo 的搜索引擎封装。
- 内置了
WebContentFetcher,不仅返回搜索结果列表,还能直接抓取目标页面的正文内容,减少了 Agent 二次调用的开销。
- CreateChatCompletion (
app/tool/create_chat_completion.py):- 允许 Agent 递归地调用 LLM 生成结构化内容。
3.4 Daytona 虚拟环境集成 (Daytona Integration)
OpenManus 通过深度集成 Daytona (开源开发环境管理工具) 来实现安全的沙箱执行能力。这不仅仅是一个工具,而是作为系统的底层运行时基础设施。
架构体现:
- SandboxManus Agent (
app/agent/sandbox_agent.py):- 这是一个专门为沙箱环境设计的 Agent 变体。
- 生命周期管理: 它在启动时自动初始化 Daytona Sandbox (
initialize_sandbox_tools),并在结束时负责销毁。 - 专用工具链: 它不使用本地工具,而是加载了一组以
sb_(sandbox) 开头的专用工具,如SandboxBrowserTool,SandboxShellTool等。这些工具的执行逻辑不是在本地运行,而是通过 API 转发到 Daytona 容器中执行。
具体工具映射:
- ComputerUseTool (
app/tool/computer_use_tool.py):- 它的底层调用实际上是向 Daytona 容器内的 API 发送指令(如
/automation/mouse/move),而不是控制宿主机的鼠标。这实现了安全的 GUI 自动化。
- 它的底层调用实际上是向 Daytona 容器内的 API 发送指令(如
- FileOperators (Sandbox Mode):
- 当配置为沙箱模式时,
SandboxFileOperator会调用SANDBOX_CLIENT与 Daytona 通信,对容器内的文件系统进行读写。
- 当配置为沙箱模式时,
这种设计使得 OpenManus 可以安全地执行非受信代码(如生成的 Python 脚本)或进行具有潜在风险的操作(如 Shell 命令),而不会危害宿主机的安全。
3.5 MCP 双向架构
OpenManus 不仅是 MCP Client,也是 MCP Server。
作为 Client (Consumer)
ManusAgent (app/agent/manus.py) 初始化时会加载MCPClients。- 它可以通过 SSE (Server-Sent Events) 或 Stdio 连接到外部的 MCP Server (如 Claude Desktop 或其他本地服务)。
- 动态能力扩展: 这意味着 OpenManus 不需要重启代码,就可以通过配置连接到一个新的 MCP Server 从而获得新的工具(如数据库访问、API 集成)。
作为 Server (Provider)
run_mcp_server.py和app/mcp/server.py实现了将 OpenManus 内部的工具(Bash, Browser, Editor)暴露出去的逻辑。- 使用
FastMCP库,自动将 Python 函数签名转换为 MCP Tool Schema。 - 场景: 你可以在 Claude Desktop 中配置 OpenManus 为一个 Server,从而在 Claude 的官方界面中直接调用 OpenManus 的浏览器控制或代码执行能力。
3.6 实例解析:LLM 的“楚门世界” (Example Scenarios)
为了更直观地理解“工具抽象”如何屏蔽底层实现,我们特意编写了独立的案例分析文档,涵盖了 GUI 控制、网页抓取、多 Agent 协作及安全代码执行等四个典型场景。
这里放另一篇文章,展示场景 带使用场景的案例
更多推荐


所有评论(0)