本文假设你已经了解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 注入:
    • Manus Agent (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.pyPlanningFlow 实现了类似 SOP (Standard Operating Procedure) 的动态编排:

  1. 全局状态维护:

    • 系统维护一个全局的 Plan 对象,包含 steps (步骤列表), step_statuses (执行状态), 和 step_notes (执行结果摘要)。
    • 这个 Plan 充当了 Agent 之间的 “黑板” (Blackboard)。
  2. 上下文传递机制:

    • 不共享完整对话: 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 协议,并提供了 LocalFileOperatorSandboxFileOperator 两种实现。
    • 这种抽象允许同一套 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 自动化。
  • FileOperators (Sandbox Mode):
    • 当配置为沙箱模式时,SandboxFileOperator 会调用 SANDBOX_CLIENT 与 Daytona 通信,对容器内的文件系统进行读写。

这种设计使得 OpenManus 可以安全地执行非受信代码(如生成的 Python 脚本)或进行具有潜在风险的操作(如 Shell 命令),而不会危害宿主机的安全。

3.5 MCP 双向架构

OpenManus 不仅是 MCP Client,也是 MCP Server。

作为 Client (Consumer)
  • Manus Agent (app/agent/manus.py) 初始化时会加载 MCPClients
  • 它可以通过 SSE (Server-Sent Events) 或 Stdio 连接到外部的 MCP Server (如 Claude Desktop 或其他本地服务)。
  • 动态能力扩展: 这意味着 OpenManus 不需要重启代码,就可以通过配置连接到一个新的 MCP Server 从而获得新的工具(如数据库访问、API 集成)。
作为 Server (Provider)
  • run_mcp_server.pyapp/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 协作及安全代码执行等四个典型场景。

这里放另一篇文章,展示场景 带使用场景的案例

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐