本文通过详细的案例分析,展示 OpenManus 如何通过工具抽象 (Tool Abstraction) 机制,将复杂的底层实现(如沙箱、网络请求、多智能体协作)封装为 LLM 可理解的简单函数调用。

建议先看这篇,了解该项目的核心思想和核心工具 OpenManus项目架构分析报告


案例 1: 虚拟环境 GUI 控制 (The Truman Show)

本案例展示 LLM 如何在不知晓底层架构(Daytona/Docker)的情况下,控制远程沙箱中的 GUI。

1. 场景描述

用户指令:“点击屏幕中心”

2. LLM 看到的界面 (The Illusion)

OpenManus 向 LLM 暴露的 computer_use 工具定义:

{
  "name": "computer_use",
  "description": "A comprehensive computer automation tool...",
  "parameters": {
    "type": "object",
    "properties": {
      "action": {
        "type": "string",
        "enum": ["move_to", "click", "scroll"] // 纯粹的语义动作
      },
      "x": { "type": "integer" },
      "y": { "type": "integer" }
    },
    "required": ["action"]
  }
}

关键点: Schema 中没有任何关于 IP 地址、API 端口或容器 ID 的信息。

3. 执行流程 (The Execution Flow)

Phase A: LLM 决策

LLM 内部推理:

Thought: 用户想点击屏幕中心。假设分辨率 1920x1080,中心是 (960, 540)。
Action: 调用 computer_use(action='move_to', x=960, y=540)

生成 Tool Call:

{
  "function": {
    "name": "computer_use",
    "arguments": "{\"action\": \"move_to\", \"x\": 960, \"y\": 540}"
  }
}
Phase B: 系统接管 (Hidden Layer)

OpenManus 的 Python 代码捕获该调用,并执行以下不可见操作:

  1. 参数解析: 提取 x=960, y=540
  2. 环境路由: 检查当前 Agent 模式(Sandbox Mode)。
  3. API 转发:
    # app/tool/computer_use_tool.py
    await self._api_request("POST", "/automation/mouse/move", {"x": 960, "y": 540})
    
    请求被发送至 Daytona 容器内部的 http://localhost:8003/api/automation/mouse/move
  4. 物理执行: 容器内的服务调用 Linux X11 接口移动虚拟鼠标。
Phase C: 反馈 (The Result)

LLM 收到简单的文本反馈:

Moved to (960, 540)

LLM 认为任务完成,继续下一步。


案例 2: 智能网页数据抓取 (Smart Crawling)

本案例展示 LLM 如何通过 crawl4ai 工具获取清洗后的网页知识,而无需处理 HTML 噪音。

1. 场景描述

用户指令:“总结 https://example.com/news 的头条新闻”

2. LLM 看到的界面

crawl4ai 工具定义:

{
  "name": "crawl4ai",
  "description": "Extract clean markdown content from web pages...",
  "parameters": {
    "type": "object",
    "properties": {
      "urls": { "type": "array", "items": { "type": "string" } }
    }
  }
}

3. 执行流程

Phase A: LLM 决策

LLM 直接调用:

{
  "function": { "name": "crawl4ai", "arguments": "{\"urls\": [\"https://example.com/news\"]}" }
}
Phase B: 系统接管
  1. 启动 Headless Browser: OpenManus 启动一个无头 Chromium 实例。
  2. 动态渲染: 加载页面,执行 JavaScript(处理 React/Vue 等动态内容)。
  3. 智能清洗:
    • 移除广告 (<div class="ad">)
    • 移除导航栏、页脚
    • HTML -> Markdown 转换: 将复杂的 DOM 树转换为 LLM 易读的 Markdown。
Phase C: 反馈

LLM 收到的不是几万行的 HTML 源码,而是:

# Weekly News Summary
## Tech Giants Release New AI Models
...
[Link: Read More](...)

这极大地节省了 Token,并提高了 LLM 的理解准确率。


案例 3: 多智能体协作 (Shared Plan)

本案例展示 PlanningFlow 如何协调多个 Agent 共同完成任务。

1. 场景描述

任务:“写一个 Python 贪吃蛇游戏并保存”

2. 协作流程

Phase A: Planner (规划者)

Planning Agent 使用 planning 工具创建计划:

{
  "command": "create",
  "plan_id": "snake_game_v1",
  "steps": ["编写游戏逻辑", "编写 GUI 界面", "保存文件"]
}
Phase B: Coder (执行者)

Coder Agent 看不到 Planner 的对话历史,它只收到:

CURRENT PLAN STATUS:
1. [→] 编写游戏逻辑 (In Progress)
2. [ ] 编写 GUI 界面
3. [ ] 保存文件

YOUR TASK: Complete step 1.

Coder Agent 使用 python_execute 工具编写核心逻辑类 SnakeGame。完成后,它不需要汇报所有代码细节,只需更新状态。

Phase C: Reviewer/Saver

流程流转到下一个步骤。系统自动将 Plan 更新为:

CURRENT PLAN STATUS:
1. [✓] 编写游戏逻辑
2. [✓] 编写 GUI 界面
3. [→] 保存文件 (In Progress)

这个 Agent 只需要关注“保存”动作,调用 file_write 工具即可。


案例 4: 安全代码执行 (Secure Execution)

本案例展示 PythonExecute 如何在沙箱中运行非受信代码。

1. 场景描述

用户指令:“计算斐波那契数列第 100 项”

2. 执行流程

Phase A: LLM 决策

LLM 编写代码并调用:

{
  "function": {
    "name": "python_execute",
    "arguments": "{\"code\": \"def fib(n): ... print(fib(100))\"}"
  }
}
Phase B: 系统接管
  1. 文件写入: OpenManus 将代码保存为临时文件 script.py
  2. 容器传输: 将 script.py 复制到 Daytona 容器的 /workspace 目录。
  3. 隔离运行: 在容器内执行 python script.py
    • 即使代码包含 os.system('rm -rf /'),也只会破坏临时容器,宿主机毫发无损。
  4. 结果捕获: 捕获 stdout 输出。
Phase C: 反馈

LLM 收到:

354224848179261915075

总结

通过这些案例可以看出,OpenManus 的核心设计哲学是 “复杂留给自己,简单留给 LLM”

  1. 协议统一: 无论底层是本地 Shell 还是远程 Docker,对 LLM 来说都是统一的函数接口。
  2. 上下文净化: 通过 crawl4aiShared Plan,只给 LLM 看最有用的信息(Markdown、Plan Status),而不是原始噪音。
  3. 安全隔离: 所有具有副作用的操作(代码执行、文件读写)都被限制在沙箱中,但这对 LLM 是透明的。

项目架构分析 请参考这篇 OpenManus项目架构分析报告

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐