OpenManus 开发实战图文教程
将自然语言转化为可执行工作流的 AI 智能体框架

文章目录
- [OpenManus 开发实战图文教程](#OpenManus 开发实战图文教程)
-
- [1. 什么是 OpenManus](#1. 什么是 OpenManus)
-
- [1.1 简介](#1.1 简介)
- [1.2 核心能力](#1.2 核心能力)
- [1.3 应用场景](#1.3 应用场景)
- [1.4 为什么选择 OpenManus?](#1.4 为什么选择 OpenManus?)
- [2. 核心架构](#2. 核心架构)
-
- [2.1 六层架构设计](#2.1 六层架构设计)
- [2.2 智能体继承体系](#2.2 智能体继承体系)
- [2.3 工具系统架构](#2.3 工具系统架构)
- [3. 快速开始](#3. 快速开始)
-
- [3.1 环境准备](#3.1 环境准备)
- [3.2 第一个示例](#3.2 第一个示例)
- [3.3 浏览器自动化示例](#3.3 浏览器自动化示例)
- [4. 核心概念](#4. 核心概念)
-
- [4.1 Think-Act 循环](#4.1 Think-Act 循环)
- [4.2 浏览器自动化原理](#4.2 浏览器自动化原理)
- [4.3 内存系统](#4.3 内存系统)
- [4.4 沙箱环境(Daytona)](#4.4 沙箱环境(Daytona))
- [5. 实战案例](#5. 实战案例)
-
- [5.1 案例 1:网站 SEO 审查](#5.1 案例 1:网站 SEO 审查)
- [5.2 案例 2:竞品分析报告](#5.2 案例 2:竞品分析报告)
- [5.3 案例 3:数据采集与可视化](#5.3 案例 3:数据采集与可视化)
- [6. 进阶技巧](#6. 进阶技巧)
-
- [6.1 提高任务成功率](#6.1 提高任务成功率)
-
- [技巧 1:提供清晰的任务描述](#技巧 1:提供清晰的任务描述)
- [技巧 2:合理设置步数限制](#技巧 2:合理设置步数限制)
- [技巧 3:分步骤处理复杂任务](#技巧 3:分步骤处理复杂任务)
- [6.2 错误处理与调试](#6.2 错误处理与调试)
- [6.3 自定义工具](#6.3 自定义工具)
- [6.4 性能优化建议](#6.4 性能优化建议)
-
- [建议 1:使用缓存避免重复查询](#建议 1:使用缓存避免重复查询)
- [建议 2:并行执行多个任务](#建议 2:并行执行多个任务)
- [建议 3:选择合适的 LLM 模型](#建议 3:选择合适的 LLM 模型)
- [7. 常见问题](#7. 常见问题)
-
- [Q1: 为什么 Agent 一直点击错误的元素?](#Q1: 为什么 Agent 一直点击错误的元素?)
- [Q2: 日期选择器无法正确操作怎么办?](#Q2: 日期选择器无法正确操作怎么办?)
- [Q3: 如何降低 API 调用成本?](#Q3: 如何降低 API 调用成本?)
- [Q4: 本地浏览器和沙箱浏览器有什么区别?](#Q4: 本地浏览器和沙箱浏览器有什么区别?)
- [Q5: 如何提高执行速度?](#Q5: 如何提高执行速度?)
- [Q6: 如何处理超时错误?](#Q6: 如何处理超时错误?)
- 总结
-
- [🎯 核心优势](#🎯 核心优势)
- [📈 学习路径](#📈 学习路径)
- [🚀 下一步行动](#🚀 下一步行动)
- [📚 参考资源](#📚 参考资源)
- 附录
-
- [A. 常用工具速查表](#A. 常用工具速查表)
- [B. 配置参数说明](#B. 配置参数说明)
- [C. 常见错误码](#C. 常见错误码)
1. 什么是 OpenManus
1.1 简介
OpenManus 是由 MetaGPT 团队在 2025 年 7 月推出的开源通用 AI 智能体框架。它的核心理念是**"无堡垒、纯开放"**,能够将自然语言需求直接转化为可执行的工作流。
1.2 核心能力
🌐 浏览器自动化 → 自动访问网站、填写表单、提取信息
💻 代码执行 → 生成并运行 Python 代码
📊 数据分析 → 处理数据、生成可视化图表
📝 文件操作 → 读写文件、整理文档
1.3 应用场景
场景一:数据采集与可视化
"收集最近一周的比特币价格,生成走势图并导出为 HTML"
场景二:电商运营
"给三款新品写多平台文案,分析竞品价格,检测合规性"
场景三:市场研究
"分析比亚迪和小鹏汽车在欧洲市场的竞争情况,生成报告"
1.4 为什么选择 OpenManus?
- 开箱即用:丰富的工具库,支持浏览器、搜索、代码执行等
- 安全可靠:通过沙箱环境隔离执行,保护系统安全
- 高效低成本:使用文本描述而非视觉模型,降低 API 成本
- 灵活扩展:支持自定义工具和多智能体协作
- 易于使用:简洁的 API 设计,快速上手
2. 核心架构
2.1 六层架构设计

OpenManus 采用清晰的分层架构,每层负责特定的功能:
| 层级 | 名称 | 功能 |
|---|---|---|
| 第 1 层 | 用户交互层 | CLI、Web API、可视化界面 |
| 第 2 层 | 应用入口层 | 单智能体、多智能体协作、远程工具接入 |
| 第 3 层 | 智能体层 | BaseAgent → ReActAgent → Manus 四级继承 |
| 第 4 层 | 工具层 | 浏览器、搜索、代码执行、文件操作等工具 |
| 第 5 层 | 流程控制层 | PlanningFlow 自动任务拆分和执行 |
| 第 6 层 | 基础设施层 | Docker、Redis、FAISS、LLM 适配器 |
2.2 智能体继承体系
# 四级继承设计,逐步增强能力
BaseAgent # 基础智能体
- 提供:状态管理、内存管理、执行循环
↓
ReActAgent # 推理-行动智能体
- 实现:Think-Act 推理模式
↓
ToolCallAgent # 工具调用智能体
- 支持:工具调用决策和执行
↓
Manus # 主要通用智能体
- 集成:浏览器能力和完整工具集
2.3 工具系统架构
┌──────────────────────────────────────┐
│ 基础工具 │
│ • WebSearch: 多引擎搜索(Baidu→DuckDuckGo→Google→Bing)│
│ • BrowserUseTool: 浏览器自动化 │
│ • PythonExecute: 代码执行 │
│ • StrReplaceEditor: 文件编辑 │
└──────────────────────────────────────┘
┌──────────────────────────────────────┐
│ 沙箱工具 (Daytona) │
│ • SandboxBrowserTool: 沙箱浏览器 │
│ • SandboxFilesTool: 沙箱文件操作 │
│ • SandboxShellTool: 沙箱命令执行 │
│ • SandboxVisionTool: 沙箱视觉识别 │
└──────────────────────────────────────┘
┌──────────────────────────────────────┐
│ 数据分析工具 │
│ • 数据可视化: 图表生成 │
│ • 爬虫工具: 网页内容提取 │
└──────────────────────────────────────┘
3. 快速开始
3.1 环境准备
# 安装 OpenManus
pip install openmanus
# (可选)安装 Daytona 沙箱环境
pip install daytona
3.2 第一个示例
import asyncio
from openmanus import Manus
async def main():
"""
你的第一个 OpenManus 程序
"""
# 创建 Agent 实例
agent = await Manus.create()
# 执行任务
result = await agent.run("搜索 OpenManus 的最新进展")
print(result)
# 运行
asyncio.run(main())
输出示例:
OpenManus 最新进展:
1. MetaGPT 团队在 2025 年 7 月发布了 OpenManus 2.0 版本
2. 新增了多智能体协作功能
3. 优化了浏览器自动化性能
4. 支持 10+ 种 LLM 模型
...
3.3 浏览器自动化示例
import asyncio
from openmanus import Manus
async def search_flight():
"""
查询机票 - 完整示例
"""
agent = await Manus.create()
# 执行任务
result = await agent.run("""
查询 2025年1月30日从上海到北京的机票。
具体要求:
1. 选择单程
2. 找出价格最低的三个航班
3. 包括航班号、起飞时间、到达时间、价格
4. 按价格从低到高排序
""")
print(result)
# 运行
asyncio.run(search_flight())
4. 核心概念
4.1 Think-Act 循环

OpenManus 的核心执行流程是 Think-Act 循环:
┌─────────────────────────────────────┐
│ 用户输入任务 │
└──────────────┬──────────────────────┘
│
↓
┌─────────────────────────────────────┐
│ 【Think 阶段】 │
│ • LLM 分析当前状态 │
│ • 查看内存中的历史消息 │
│ • 决定下一步使用哪个工具 │
└──────────────┬──────────────────────┘
│
↓
┌─────────────────────────────────────┐
│ 【Act 阶段】 │
│ • 执行选定的工具 │
│ • 获取执行结果 │
│ • 将结果添加到内存 │
└──────────────┬──────────────────────┘
│
↓
┌─────┴─────┐
│ 回到Think │◄────┐
└─────┬─────┘ │
│ │
↓ │
┌─────────────────┐ │
│ 任务完成或 │ │
│ 达到步数上限 │───┘
└─────────────────┘
4.2 浏览器自动化原理

OpenManus 使用文本描述而非视觉模型来识别页面元素,这样可以大幅降低成本:
页面元素示例:
URL: https://flights.ctrip.com
Title: 携程机票预订
交互元素列表:
[0]<button>酒店</button>
[1]<button>机票</button>
[2]<button>火车票</button>
[37]<input>出发地</input>
[39]<input>目的地</input>
[40]<input>出发日期</input>
[43]<button>搜索</button>
元素格式说明:
[index]<type>text</type>
- index: 元素的唯一标识符(从 0 开始)
- type: HTML 元素类型(button, input, a 等)
- text: 元素的描述性文本
LLM 根据这些文本描述选择要操作的元素
工作流程:
- 访问网页:浏览器自动加载页面
- 元素识别:遍历 DOM 树,识别所有可交互元素
- 生成描述:为每个元素生成文本描述和索引
- LLM 决策:根据描述选择要操作的元素索引
- 执行操作:通过索引精确点击或输入
4.3 内存系统
OpenManus 使用内存系统记录完整的对话历史和工具执行结果:
# 内存结构
Memory:
- messages: List[Message]
Message:
- role: "user" | "assistant" | "tool" | "system"
- content: 消息内容
- tool_calls: 工具调用列表(assistant)
- base64_image: 页面截图(tool)
# 示例
messages = [
Message(
role="user",
content="查询机票"
),
Message(
role="assistant",
content="我需要先访问携程网站",
tool_calls=[{"name": "browser_use", "arguments": "..."}]
),
Message(
role="tool",
content="已成功访问网站",
base64_image="..."
)
]
4.4 沙箱环境(Daytona)

当你让 AI 执行代码时,可能会带来安全风险。Daytona 沙箱的作用是:
核心特性:
- 🔒 隔离执行:代码在远程容器中运行,不影响宿主机
- 🛡️ 安全防护:即使代码有恶意行为,也无法访问本地系统
- 🎯 资源管理:自动清理临时文件和资源
- 👁️ 实时监控:通过 VNC 可以实时查看执行过程
工作原理:
用户请求 → OpenManus → 代码生成 → Daytona 容器 → 安全执行 → 返回结果
↓
隔离环境
- 独立的文件系统
- 受限的网络访问
- 资源限制
- 自动清理
使用示例:
from openmanus import SandboxManus
async def use_sandbox():
"""使用沙箱 Agent 执行任务"""
# 创建 SandboxManus
agent = await SandboxManus.create()
# 在沙箱中执行任务
result = await agent.run("""
1. 访问 http://example.com
2. 提取页面内容
3. 将结果保存到 /workspace/result.md
""")
# 获取 VNC URL(可以实时查看沙箱桌面)
print(f"VNC URL: {agent.vnc_url}")
# 清理资源
await agent.cleanup()
return result
5. 实战案例
5.1 案例 1:网站 SEO 审查
import asyncio
from openmanus import Manus
async def seo_audit():
"""
对网站进行 SEO 审查
"""
agent = await Manus.create()
result = await agent.run("""
对 http://class.wucai.com 进行 SEO 审查,提供详细的优化报告。
检查内容包括:
1. 页面标题和描述
2. 关键词使用情况
3. 图片 alt 属性
4. 链接结构
5. 页面加载速度(如果可以检测)
6. 移动端适配情况
最后提供可操作的优化建议。
""")
return result
# 执行
result = asyncio.run(seo_audit())
print(result)
输出示例:
SEO 审查报告
网站:http://class.wucai.com
✅ 优点:
- 页面标题清晰
- 关键词使用合理
⚠️ 需要改进:
- 缺少 meta description
- 部分图片缺少 alt 属性
- 内部链接结构可以优化
📋 优化建议:
1. 添加 meta description 标签
2. 为所有图片添加 alt 属性
3. 优化内部链接结构
...
5.2 案例 2:竞品分析报告
import asyncio
from openmanus import Manus
async def competitive_analysis():
"""
生成竞品分析报告
"""
agent = await Manus.create()
result = await agent.run("""
写一份关于 2025 年中国新能源汽车出海欧洲的竞品分析报告。
重点分析比亚迪和小鹏汽车:
1. 在欧洲的市场份额和销量数据
2. 主要车型和定价策略
3. 市场推广策略
4. 用户评价和品牌认知度
5. 面临的挑战和机遇
最后给出 SWOT 分析和战略建议。
""")
return result
# 执行
result = asyncio.run(competitive_analysis())
print(result)
执行流程分解:
Step 1: 搜索 "比亚迪 欧洲市场 销量"
→ 工具: web_search
→ 结果: 获得销量数据
Step 2: 访问相关网页获取详细信息
→ 工具: browser_use (go_to_url)
→ 结果: 访问官方数据页面
Step 3: 提取具体数据
→ 工具: browser_use (extract_content)
→ 结果: 提取销量数字
Step 4: 搜索 "小鹏汽车 欧洲市场"
→ 工具: web_search
→ 结果: 获得小鹏汽车信息
Step 5-20: 持续收集信息
→ 多次搜索和访问网页
→ 收集定价、车型、评价等信息
Step 21: 生成分析报告
→ 工具: python_execute
→ 结果: 使用 Python 生成可视化图表
Step 22-25: 完善报告
→ 整合所有信息
→ 生成最终报告
5.3 案例 3:数据采集与可视化

import asyncio
from openmanus import Manus
async def data_visualization():
"""
采集数据并生成可视化
"""
agent = await Manus.create()
result = await agent.run("""
1. 访问 https://api.coinmarketcap.com/v1/ticker/bitcoin/
2. 提取比特币价格数据
3. 使用 Python 生成价格走势图
4. 保存为 HTML 文件
""")
return result
# 执行
result = asyncio.run(data_visualization())
print(result)
Agent 会自动生成类似下面的 Python 代码:
import requests
import pandas as pd
import matplotlib.pyplot as plt
# 获取数据
response = requests.get('https://api.coinmarketcap.com/v1/ticker/bitcoin/')
data = response.json()
# 提取价格
prices = [float(coin['price_usd']) for coin in data]
dates = [coin['last_updated'] for coin in data]
# 创建 DataFrame
df = pd.DataFrame({
'日期': dates,
'价格': prices
})
# 创建图表
plt.figure(figsize=(12, 6))
plt.plot(df['日期'], df['价格'], linewidth=2)
plt.title('比特币价格走势', fontsize=16)
plt.xlabel('时间', fontsize=12)
plt.ylabel('价格 (USD)', fontsize=12)
plt.grid(True, alpha=0.3)
plt.xticks(rotation=45)
plt.tight_layout()
plt.savefig('bitcoin_price.png', dpi=300)
# 生成 HTML 报告
html = f"""
<!DOCTYPE html>
<html>
<head>
<title>比特币价格走势</title>
<style>
body {{
font-family: Arial, sans-serif;
max-width: 1200px;
margin: 0 auto;
padding: 20px;
}}
h1 {{
color: #333;
text-align: center;
}}
.chart {{
text-align: center;
margin: 30px 0;
}}
img {{
max-width: 100%;
border: 1px solid #ddd;
border-radius: 8px;
}}
</style>
</head>
<body>
<h1>比特币价格走势分析</h1>
<div class="chart">
<img src="bitcoin_price.png" alt="比特币价格走势图" />
</div>
</body>
</html>
"""
with open('bitcoin_price.html', 'w', encoding='utf-8') as f:
f.write(html)
print("✅ 数据采集和可视化完成!")
print("📊 图表已保存为: bitcoin_price.png")
print("📄 HTML 报告已保存为: bitcoin_price.html")
6. 进阶技巧
6.1 提高任务成功率
技巧 1:提供清晰的任务描述
# ❌ 模糊的描述
"帮我查一下机票"
# ✅ 清晰的描述
result = await agent.run("""
查询 2025 年 1 月 30 日从上海到北京的机票。
具体要求:
1. 选择单程
2. 找出价格最低的 3 个航班
3. 包括航班号、起飞时间、到达时间、价格
4. 按价格从低到高排序
""")
技巧 2:合理设置步数限制
from openmanus import Manus
agent = await Manus.create()
agent.max_steps = 25 # 增加步数限制(默认为 20)
技巧 3:分步骤处理复杂任务
async def complex_task():
agent = await Manus.create()
# 步骤 1:收集数据
data = await agent.run("搜索并收集比亚迪在欧洲市场的销量数据")
# 步骤 2:分析数据
analysis = await agent.run(f"""
基于以下数据进行分析:
{data}
分析内容包括:
1. 销量趋势
2. 主要竞争对手
3. 市场机会
""")
# 步骤 3:生成报告
report = await agent.run(f"""
根据分析结果生成一份完整的报告:
{analysis}
报告格式:
1. 执行摘要
2. 数据分析
3. 结论和建议
""")
return report
6.2 错误处理与调试
启用详细日志
import logging
# 启用详细日志
logging.basicConfig(
level=logging.INFO,
format='%(asctime)s - %(name)s - %(levelname)s - %(message)s'
)
agent = await Manus.create()
# 执行任务时,会输出详细的日志
result = await agent.run("查询机票")
# 日志示例:
# 2025-01-30 10:00:00 - Manus - INFO - Manus's thoughts: 我需要先访问携程网站
# 2025-01-30 10:00:01 - Manus - INFO - Manus selected 1 tools to use
# 2025-01-30 10:00:02 - Manus - INFO - Activating tool: 'browser_use'
# 2025-01-30 10:00:05 - Manus - INFO - Tool 'browser_use' completed
保存截图用于调试
# 工具返回结果中包含 base64 编码的截图
result = await agent.browser_tool.execute(
action="go_to_url",
url="https://www.example.com"
)
if hasattr(result, "base64_image"):
# 保存截图
import base64
with open("screenshot.png", "wb") as f:
f.write(base64.b64decode(result.base64_image))
print("✅ 截图已保存为: screenshot.png")
查看内存状态
# 查看当前内存中的所有消息
print("\n=== 内存状态 ===\n")
for i, msg in enumerate(agent.memory.messages):
print(f"[{i}] {msg.role}: {msg.content[:100]}...")
if msg.tool_calls:
print(f" 工具调用: {len(msg.tool_calls)} 个")
6.3 自定义工具
你可以创建自定义工具来扩展 OpenManus 的能力:
from openmanus.tools import BaseTool, ToolResult
class CustomSearchTool(BaseTool):
"""自定义搜索工具"""
def __init__(self):
super().__init__(
name="custom_search",
description="使用自定义搜索引擎进行搜索"
)
async def execute(self, **kwargs) -> ToolResult:
query = kwargs.get("query")
# 调用自定义搜索 API
results = self._call_custom_api(query)
return ToolResult(content=str(results))
def _call_custom_api(self, query: str):
"""实现你的自定义搜索逻辑"""
# 这里可以调用你的自定义搜索 API
return [
{
"title": f"搜索结果: {query}",
"url": "https://example.com",
"snippet": f"这是关于 {query} 的搜索结果"
}
]
# 使用自定义工具
from openmanus import Manus
async def use_custom_tool():
agent = await Manus.create()
# 添加自定义工具
agent.available_tools.add(CustomSearchTool())
# 现在可以使用自定义工具了
result = await agent.run("使用 custom_search 搜索相关信息")
return result
6.4 性能优化建议
建议 1:使用缓存避免重复查询
from functools import lru_cache
@lru_cache(maxsize=100)
async def cached_search(query: str):
"""带缓存的搜索函数"""
agent = await Manus.create()
return await agent.run(f"搜索:{query}")
# 第一次查询会执行完整的搜索
result1 = await cached_search("OpenManus")
# 第二次查询会使用缓存,更快
result2 = await cached_search("OpenManus")
建议 2:并行执行多个任务
import asyncio
from openmanus import Manus
async def parallel_tasks():
"""并行执行多个任务"""
# 创建多个 Agent 实例
agent1 = await Manus.create()
agent2 = await Manus.create()
agent3 = await Manus.create()
# 并行执行多个搜索
tasks = [
agent1.run("搜索比亚迪信息"),
agent2.run("搜索小鹏信息"),
agent3.run("搜索特斯拉信息")
]
results = await asyncio.gather(*tasks)
return results
# 执行
results = asyncio.run(parallel_tasks())
for i, result in enumerate(results):
print(f"\n=== 任务 {i+1} 结果 ===\n{result}\n")
建议 3:选择合适的 LLM 模型
# 简单任务使用快速模型
agent_fast = await Manus.create(model="qwen-turbo")
# 复杂任务使用强大模型
agent_powerful = await Manus.create(model="qwen-max")
# 平衡性能和成本
agent_balanced = await Manus.create(model="qwen-plus")
7. 常见问题
Q1: 为什么 Agent 一直点击错误的元素?
现象: Agent 反复点击同一个按钮,无法完成任务。
原因:
- 页面元素识别不准确
- 任务描述不够清晰
- 动态加载的元素没有被正确识别
解决方案:
# 方法 1:提供更详细的任务描述
result = await agent.run("""
访问携程网站,找到航班查询页面。
注意:
- 不要点击酒店或火车票标签
- 只点击机票标签(通常是第二个按钮)
- 在出发地输入框中输入"上海"
- 点击搜索按钮
""")
# 方法 2:增加步数限制
agent = await Manus.create()
agent.max_steps = 25 # 从 20 增加到 25
# 方法 3:分步骤执行
step1 = await agent.run("访问携程网站,点击机票标签")
step2 = await agent.run("在出发地输入框中输入'上海'")
step3 = await agent.run("点击搜索按钮")
Q2: 日期选择器无法正确操作怎么办?
现象: 点击日期输入框后,无法正确选择日期。
原因: 日期选择器是动态生成的 DOM 元素,可能没有被正确识别。
解决方案:
# 方法 1:使用具体的日期格式
result = await agent.run("""
在出发日期输入框中输入"2025-01-30"
使用 send_keys 而不是 click 操作
""")
# 方法 2:尝试使用坐标点击
result = await agent.run("""
点击出发日期输入框
等待日历弹出
使用坐标点击日历中的日期
""")
# 方法 3:使用浏览器的日期输入功能
result = await agent.run("""
找到出发日期输入框
直接输入日期"20250130"
""")
# 方法 4:如果以上方法都不行,可以尝试
result = await agent.run("""
保存当前页面截图
分析截图中的日期选择器
使用坐标点击具体的日期
""")
Q3: 如何降低 API 调用成本?
OpenManus 已经通过以下方式优化成本:
- 使用文本描述而非视觉模型:大幅降低成本
- 智能工具选择:避免不必要的工具调用
- 结果缓存:避免重复查询
用户可以进一步优化:
# 优化 1:减少不必要的工具调用
# ❌ 不好的做法
result = await agent.run("""
1. 访问网站
2. 等待 10 秒
3. 再次访问网站
4. 等待 10 秒
5. 提取内容
""")
# ✅ 好的做法
result = await agent.run("""
访问网站,等待加载完成后提取内容。
""")
# 优化 2:使用缓存
from functools import lru_cache
@lru_cache(maxsize=100)
async def cached_search(query: str):
agent = await Manus.create()
return await agent.run(f"搜索:{query}")
# 优化 3:选择合适的模型
# 简单任务使用快速模型
agent = await Manus.create(model="qwen-turbo")
# 优化 4:提供清晰的任务描述
# 避免 Agent 进行不必要的尝试
result = await agent.run("""
访问 https://www.example.com
提取页面中所有的链接和标题
""")
Q4: 本地浏览器和沙箱浏览器有什么区别?
| 特性 | 本地浏览器 (BrowserUseTool) | 沙箱浏览器 (SandboxBrowserTool) |
|---|---|---|
| 运行位置 | 本地电脑 | Daytona 云端 |
| 使用的 Agent | Manus | SandboxManus |
| 可视化方式 | 直接看到浏览器窗口 | 通过 VNC URL 查看 |
| 资源占用 | 占用本地资源 | 不占用本地资源 |
| 安全性 | 较低 | 高(完全隔离) |
| 适用场景 | 简单任务、快速测试 | 复杂任务、需要安全性 |
选择建议:
- ✅ 使用本地浏览器 :
- 简单的任务
- 需要快速测试
- 不涉及敏感数据
- 需要实时查看操作
- ✅ 使用沙箱浏览器 :
- 执行未知代码
- 处理敏感数据
- 需要隔离环境
- 长时间运行的任务
Q5: 如何提高执行速度?
# 方法 1:并行执行多个任务
import asyncio
async def parallel_tasks():
agent = await Manus.create()
tasks = [
agent.run("搜索比亚迪信息"),
agent.run("搜索小鹏信息"),
agent.run("搜索特斯拉信息")
]
results = await asyncio.gather(*tasks)
return results
# 方法 2:使用更快的模型
agent = await Manus.create(model="qwen-turbo")
# 方法 3:减少不必要的步骤
# 提供清晰的任务描述,避免重复操作
result = await agent.run("""
访问网站,直接提取所有产品信息,不要多次刷新。
""")
# 方法 4:使用缓存
from functools import lru_cache
@lru_cache(maxsize=100)
async def cached_operation(query: str):
agent = await Manus.create()
return await agent.run(f"操作:{query}")
Q6: 如何处理超时错误?
# 方法 1:增加超时时间
agent = await Manus.create()
agent.timeout = 600 # 设置为 600 秒
# 方法 2:分步骤执行
# 将长任务拆分为多个短任务
step1 = await agent.run("访问网站并等待加载")
step2 = await agent.run("提取第一页内容")
step3 = await agent.run("提取第二页内容")
# 方法 3:使用异步重试
import asyncio
async def retry_operation(max_retries=3):
for i in range(max_retries):
try:
agent = await Manus.create()
result = await agent.run("你的任务")
return result
except Exception as e:
print(f"第 {i+1} 次尝试失败: {e}")
if i < max_retries - 1:
await asyncio.sleep(5) # 等待 5 秒后重试
return None
总结
OpenManus 是一个功能强大的 AI 智能体框架,通过以下核心特性实现了"手脑并用"的能力:
🎯 核心优势
- 开箱即用:丰富的工具库,支持浏览器、搜索、代码执行等
- 安全可靠:通过沙箱环境隔离执行,保护系统安全
- 高效低成本:使用文本描述替代视觉模型,降低 API 成本
- 灵活扩展:支持自定义工具和多智能体协作
- 易于使用:简洁的 API 设计,快速上手
📈 学习路径
初学者:
1. 理解 Think-Act 循环
2. 学会使用基本工具
3. 完成简单的任务(如网页浏览)
进阶者:
1. 深入理解浏览器自动化
2. 学习使用沙箱环境
3. 处理复杂任务和错误
高级用户:
1. 开发自定义工具
2. 实现多智能体协作
3. 优化性能和成本
🚀 下一步行动
- 实践项目:选择一个实际需求,用 OpenManus 实现
- 深入源码:阅读 OpenManus 的源代码,理解实现细节
- 贡献社区:分享你的经验和工具,帮助他人学习
📚 参考资源
附录
A. 常用工具速查表
| 工具名称 | 功能 | 参数示例 |
|---|---|---|
web_search |
网络搜索 | query="OpenManus 教程", num_results=5 |
browser_use |
浏览器操作 | action="click_element", index=0 |
python_execute |
执行 Python 代码 | code="print('Hello')" |
str_replace_editor |
文件编辑 | file="test.txt", old_text="...", new_text="..." |
ask_human |
询问用户 | question="请确认" |
terminate |
终止任务 | 无参数 |
B. 配置参数说明
# 配置示例 (config.toml)
[llm]
model = "qwen-max"
api_key = "your-api-key"
temperature = 0.7
[agent]
max_steps = 20
timeout = 300
[daytona]
api_key = "dtn-xxx"
[browser]
headless = false
timeout = 30000
C. 常见错误码
| 错误码 | 说明 | 解决方案 |
|---|---|---|
E001 |
元素未找到 | 检查元素索引,增加等待时间 |
E002 |
超时 | 增加 timeout 参数 |
E003 |
API 调用失败 | 检查 API key 和网络连接 |
E004 |
步数超限 | 增加 max_steps |
祝你学习愉快!如果有任何问题,欢迎随时提问。 🚀
转载声明:本文原创,转载请注明出处。