尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

OpenManus 开发实战图文教程

OpenManus 开发实战图文教程 OpenManus 开发实战图文教程将自然语言转化为可执行工作流的 AI 智能体框架文章目录OpenManus 开发实战图文教程1. 什么是 OpenManus1.1 简介1.2 核心能力1.3 应用场景1.4 为什么选择 OpenManus2. 核心架构2.1 六层架构设计2.2 智能体继承体系2.3 工具系统架构3. 快速开始3.1 环境准备3.2 第一个示例3.3 浏览器自动化示例4. 核心概念4.1 Think-Act 循环4.2 浏览器自动化原理4.3 内存系统4.4 沙箱环境Daytona5. 实战案例5.1 案例 1网站 SEO 审查5.2 案例 2竞品分析报告5.3 案例 3数据采集与可视化6. 进阶技巧6.1 提高任务成功率技巧 1提供清晰的任务描述技巧 2合理设置步数限制技巧 3分步骤处理复杂任务6.2 错误处理与调试启用详细日志保存截图用于调试查看内存状态6.3 自定义工具6.4 性能优化建议建议 1使用缓存避免重复查询建议 2并行执行多个任务建议 3选择合适的 LLM 模型7. 常见问题Q1: 为什么 Agent 一直点击错误的元素Q2: 日期选择器无法正确操作怎么办Q3: 如何降低 API 调用成本Q4: 本地浏览器和沙箱浏览器有什么区别Q5: 如何提高执行速度Q6: 如何处理超时错误总结 核心优势 学习路径 下一步行动 参考资源附录A. 常用工具速查表B. 配置参数说明C. 常见错误码1. 什么是 OpenManus1.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 daytona3.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]typetext/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( roleuser, content查询机票 ), Message( roleassistant, content我需要先访问携程网站, tool_calls[{name: browser_use, arguments: ...}] ), Message( roletool, 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(fVNC URL: {agent.vnc_url}) # 清理资源 await agent.cleanup() return result5. 实战案例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[价格], linewidth2) plt.title(比特币价格走势, fontsize16) plt.xlabel(时间, fontsize12) plt.ylabel(价格 (USD), fontsize12) plt.grid(True, alpha0.3) plt.xticks(rotation45) plt.tight_layout() plt.savefig(bitcoin_price.png, dpi300) # 生成 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 classchart img srcbitcoin_price.png alt比特币价格走势图 / /div /body /html with open(bitcoin_price.html, w, encodingutf-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 report6.2 错误处理与调试启用详细日志import logging # 启用详细日志 logging.basicConfig( levellogging.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 - Manuss 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( actiongo_to_url, urlhttps://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__( namecustom_search, description使用自定义搜索引擎进行搜索 ) async def execute(self, **kwargs) - ToolResult: query kwargs.get(query) # 调用自定义搜索 API results self._call_custom_api(query) return ToolResult(contentstr(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 result6.4 性能优化建议建议 1使用缓存避免重复查询from functools import lru_cache lru_cache(maxsize100) 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 任务 {i1} 结果 \n{result}\n)建议 3选择合适的 LLM 模型# 简单任务使用快速模型 agent_fast await Manus.create(modelqwen-turbo) # 复杂任务使用强大模型 agent_powerful await Manus.create(modelqwen-max) # 平衡性能和成本 agent_balanced await Manus.create(modelqwen-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(maxsize100) async def cached_search(query: str): agent await Manus.create() return await agent.run(f搜索{query}) # 优化 3选择合适的模型 # 简单任务使用快速模型 agent await Manus.create(modelqwen-turbo) # 优化 4提供清晰的任务描述 # 避免 Agent 进行不必要的尝试 result await agent.run( 访问 https://www.example.com 提取页面中所有的链接和标题 )Q4: 本地浏览器和沙箱浏览器有什么区别特性本地浏览器 (BrowserUseTool)沙箱浏览器 (SandboxBrowserTool)运行位置本地电脑Daytona 云端使用的 AgentManusSandboxManus可视化方式直接看到浏览器窗口通过 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(modelqwen-turbo) # 方法 3减少不必要的步骤 # 提供清晰的任务描述避免重复操作 result await agent.run( 访问网站直接提取所有产品信息不要多次刷新。 ) # 方法 4使用缓存 from functools import lru_cache lru_cache(maxsize100) 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_retries3): for i in range(max_retries): try: agent await Manus.create() result await agent.run(你的任务) return result except Exception as e: print(f第 {i1} 次尝试失败: {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 的源代码理解实现细节贡献社区分享你的经验和工具帮助他人学习 参考资源资源链接GitHub 仓库https://github.com/FoundationAgents/OpenManus官方文档https://openmanus.readthedocs.io社区论坛https://discuss.openmanus.dev示例代码https://github.com/FoundationAgents/OpenManus/tree/main/examples附录A. 常用工具速查表工具名称功能参数示例web_search网络搜索queryOpenManus 教程, num_results5browser_use浏览器操作actionclick_element, index0python_execute执行 Python 代码codeprint(Hello)str_replace_editor文件编辑filetest.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 30000C. 常见错误码错误码说明解决方案E001元素未找到检查元素索引增加等待时间E002超时增加 timeout 参数E003API 调用失败检查 API key 和网络连接E004步数超限增加 max_steps祝你学习愉快如果有任何问题欢迎随时提问。转载声明本文原创转载请注明出处。
返回列表