【AI智能体】OpenManus 工具调用案例集
本文通过详细的案例分析,展示 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 代码捕获该调用,并执行以下不可见操作:
- 参数解析: 提取
x=960, y=540。 - 环境路由: 检查当前 Agent 模式(Sandbox Mode)。
- API 转发:
请求被发送至 Daytona 容器内部的# app/tool/computer_use_tool.py await self._api_request("POST", "/automation/mouse/move", {"x": 960, "y": 540})http://localhost:8003/api/automation/mouse/move。 - 物理执行: 容器内的服务调用 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: 系统接管
- 启动 Headless Browser: OpenManus 启动一个无头 Chromium 实例。
- 动态渲染: 加载页面,执行 JavaScript(处理 React/Vue 等动态内容)。
- 智能清洗:
- 移除广告 (
<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: 系统接管
- 文件写入: OpenManus 将代码保存为临时文件
script.py。 - 容器传输: 将
script.py复制到 Daytona 容器的/workspace目录。 - 隔离运行: 在容器内执行
python script.py。- 即使代码包含
os.system('rm -rf /'),也只会破坏临时容器,宿主机毫发无损。
- 即使代码包含
- 结果捕获: 捕获
stdout输出。
Phase C: 反馈
LLM 收到:
354224848179261915075
总结
通过这些案例可以看出,OpenManus 的核心设计哲学是 “复杂留给自己,简单留给 LLM”。
- 协议统一: 无论底层是本地 Shell 还是远程 Docker,对 LLM 来说都是统一的函数接口。
- 上下文净化: 通过
crawl4ai和Shared Plan,只给 LLM 看最有用的信息(Markdown、Plan Status),而不是原始噪音。 - 安全隔离: 所有具有副作用的操作(代码执行、文件读写)都被限制在沙箱中,但这对 LLM 是透明的。
项目架构分析 请参考这篇 OpenManus项目架构分析报告
更多推荐


所有评论(0)