OpenManus 技术解析:开源智能体框架的架构与实现
OpenManus 是一个开源的智能体框架,旨在提供类似 Manus 的功能但无需邀请码,让开发者和用户能够轻松构建并使用功能强大的 AI 智能体。本文将从架构设计、核心组件、使用方法和技术特点等方面对 OpenManus 进行全面分析。
1. 项目概述
OpenManus 由来自 MetaGPT 社区的开发者团队@mannaandpoem、@XiangJinyu、@MoshiQAQ等共同开发,是一个专注于构建智能体的开源项目。该项目的主要目标是创建一个通用智能体框架,让用户能够通过简单的指令完成复杂任务,包括但不限于编程、信息检索、文件处理和网页浏览等。
2. 架构设计
OpenManus 采用了模块化的架构设计,主要由以下几个核心模块组成:
2.1 代理(Agent)层
Agent 层是 OpenManus 的核心,负责协调各个组件并执行用户指令。主要包括以下几种代理类型:
- ToolCallAgent: 基础代理类,负责处理工具/函数调用的抽象实现
- PlanningAgent: 计划型代理,负责创建和管理任务执行计划
- ReActAgent: 反应型代理,实现了思考-行动-观察的循环模式
- Manus: 主要代理实现,继承自 ToolCallAgent,是用户直接交互的入口
代理层遵循层级继承关系,每种代理类型都具有特定的职责和扩展能力:
ReActAgent --> ToolCallAgent --> PlanningAgent --> Manus
2.2 工具(Tool)层
工具层提供了丰富的工具集,使智能体能够与外部系统交互。主要工具包括:
- PythonExecute: 执行 Python 代码
- BrowserUseTool: 浏览器操作工具,支持网页导航、元素交互等
- GoogleSearch: 谷歌搜索工具
- FileSaver: 文件保存工具
- PlanningTool: 计划管理工具
- CreateChatCompletion: 创建聊天完成工具
- Terminate: 终止执行工具
这些工具通过统一的接口(BaseTool)进行定义,确保代理能够一致地调用和使用它们。
2.3 提示词(Prompt)层
提示词层定义了与 LLM 交互的系统提示和指令模板,包括:
- 系统提示: 定义智能体的角色和能力范围
- 步骤提示: 指导智能体如何使用可用工具执行任务
- 规划提示: 用于任务分解和计划创建
2.4 LLM 交互层
负责与大型语言模型进行通信,支持不同的 LLM 提供商和模型配置。核心功能包括:
- 模型配置管理
- 工具/函数调用接口
- 响应解析和处理
3. 核心流程分析
OpenManus 的工作流程可以概括为以下几个关键步骤:
3.1 任务规划过程
- 用户输入任务请求
- 创建初始计划(create_initial_plan)
- 分解任务为可执行步骤
- 生成结构化计划(包含目标、步骤和状态追踪)
3.2 任务执行过程
- 获取当前活跃步骤(_get_current_step_index)
- 思考阶段(think):评估当前状态,决定下一步行动
- 行动阶段(act):执行所选工具,记录结果
- 更新计划状态(update_plan_status)
- 重复以上步骤直到计划完成或达到最大步骤数
3.3 工具调用机制
- 解析工具调用参数
- 执行工具并获取结果
- 将结果添加到智能体记忆中
- 处理特殊工具(如终止执行)的状态变更
4. 关键组件详解
4.1 PlanningAgent
PlanningAgent 是 OpenManus 中的核心代理类型,专门负责任务规划和执行。其主要功能包括:
- 计划创建与管理: 根据用户输入创建结构化计划
- 步骤追踪: 记录每个步骤的执行状态
- 进度管理: 自动标记当前活跃步骤,更新完成状态
特点是能够维护任务执行的上下文,确保复杂任务能够按顺序完成,同时提供清晰的执行状态反馈。
4.2 ToolCallAgent
ToolCallAgent 实现了工具调用的基础机制,主要职责包括:
- 工具选择: 决定使用哪些工具来完成任务
- 参数解析: 处理 JSON 格式的工具参数
- 结果处理: 格式化工具执行结果
- 错误处理: 提供健壮的错误捕获和报告机制
ToolCallAgent 的设计使 OpenManus 能够灵活地扩展新工具,同时保持统一的调用接口。
4.3 BrowserUseTool
BrowserUseTool 是一个功能强大的工具,允许智能体与网页浏览器交互。主要功能包括:
- 网页导航: 访问指定 URL
- 元素交互: 点击、输入文本
- 内容提取: 获取 HTML、文本和链接
- JavaScript 执行: 在页面中执行 JS 代码
- 标签管理: 创建、切换和关闭标签页
这个工具基于 browser-use 库实现,为智能体提供了丰富的网页交互能力。
4.4 PythonExecute
PythonExecute 工具允许智能体执行 Python 代码,使其能够:
- 执行数据处理任务
- 进行系统操作
- 创建和修改文件
- 调用其他 Python 库和 API
这使得 OpenManus 能够执行编程任务,是其通用能力的关键组件。
5. 使用指南
5.1 安装配置
OpenManus 提供两种安装方式:
使用 conda:
bashconda create -n open_manus python=3.12 conda activate open_manus git clone https://github.com/mannaandpoem/OpenManus.git cd OpenManus pip install -r requirements.txt
使用 uv(推荐):
bashcurl -LsSf https://astral.sh/uv/install.sh | sh git clone https://github.com/mannaandpoem/OpenManus.git cd OpenManus uv venv source .venv/bin/activate uv pip install -r requirements.txt
5.2 配置 LLM
OpenManus 需要配置 LLM API 才能正常工作:
创建配置文件:
bashcp config/config.example.toml config/config.toml
编辑
config.toml
添加 API 密钥:toml[llm] model = "gpt-4o" base_url = "https://api.openai.com/v1" api_key = "sk-..." # 替换为实际API密钥 max_tokens = 4096 temperature = 0.0
5.3 基本使用
启动 OpenManus 只需一行命令:
python main.py
然后通过终端输入你的请求,例如:
- "创建一个简单的网站计算器"
- "查找关于气候变化的最新研究"
- "帮我优化这段 Python 代码"
OpenManus 会自动规划任务并调用相应工具来完成请求。
6. 代码解析
6.1 主入口(main.py)
async def main():
agent = Manus()
while True:
try:
prompt = input("Enter your prompt (or 'exit'/'quit' to quit): ")
prompt_lower = prompt.lower()
if prompt_lower in ["exit", "quit"]:
logger.info("Goodbye!")
break
if not prompt.strip():
logger.warning("Skipping empty prompt.")
continue
logger.warning("Processing your request...")
await agent.run(prompt)
except KeyboardInterrupt:
logger.warning("Goodbye!")
break
主入口非常简洁,创建 Manus 代理实例,然后循环接收用户输入并交给代理处理。
6.2 Manus 代理实现
class Manus(ToolCallAgent):
name: str = "Manus"
description: str = "A versatile agent that can solve various tasks using multiple tools"
system_prompt: str = SYSTEM_PROMPT
next_step_prompt: str = NEXT_STEP_PROMPT
available_tools: ToolCollection = Field(
default_factory=lambda: ToolCollection(
PythonExecute(), GoogleSearch(), BrowserUseTool(), FileSaver(), Terminate()
)
)
Manus 代理继承自 ToolCallAgent,配置了系统提示和可用工具集。
6.3 执行工具方法(execute_tool)
async def execute_tool(self, command: ToolCall) -> str:
if not command or not command.function or not command.function.name:
return "Error: Invalid command format"
name = command.function.name
if name not in self.available_tools.tool_map:
return f"Error: Unknown tool '{name}'"
try:
# 解析参数
args = json.loads(command.function.arguments or "{}")
# 执行工具
logger.info(f"🔧 Activating tool: '{name}'...")
result = await self.available_tools.execute(name=name, tool_input=args)
# 格式化结果
observation = (
f"Observed output of cmd `{name}` executed:\n{str(result)}"
if result
else f"Cmd `{name}` completed with no output"
)
# 处理特殊工具
await self._handle_special_tool(name=name, result=result)
return observation
except Exception as e:
# 错误处理
error_msg = f"⚠️ Tool '{name}' encountered a problem: {str(e)}"
logger.error(error_msg)
return f"Error: {error_msg}"
这个方法展示了 OpenManus 如何执行工具调用,包括参数解析、错误处理和结果格式化。
7. 项目展望
根据项目的路线图,OpenManus 计划在未来实现以下功能:
- 增强 Planning 能力,优化任务分解和执行逻辑
- 引入标准化评测指标(基于 GAIA 和 TAU-Bench)
- 拓展模型适配,优化低成本应用场景
- 实现容器化部署,简化安装和使用流程
- 丰富示例库,增加更多实用案例
- 前后端开发,提升用户体验
8. 总结
OpenManus 是一个设计精良的开源智能体框架,通过模块化架构和灵活的工具集成机制,实现了强大的任务规划和执行能力。其核心优势在于:
- 灵活的代理体系:从基础的工具调用代理到复杂的规划代理,提供了不同层次的智能体实现
- 丰富的工具集:内置 Python 执行、浏览器交互、搜索等多种工具,满足多样化的任务需求
- 结构化的任务规划:能够自动分解复杂任务并追踪执行进度
- 开源开放:允许社区贡献和扩展,持续进化
OpenManus 为开发者提供了一个强大的平台,让构建复杂 AI 智能体变得简单直观,是 AI 应用开发的理想选择。无论是研究人员、开发者还是普通用户,都能从 OpenManus 中受益,创建自己的智能助手来解决各种问题。
对于希望深入了解或贡献项目的开发者,建议查看官方 GitHub 仓库和加入社区讨论组,共同推动 OpenManus 的发展。