资讯详情

资讯详情

Learning OpenManus:从零搭建多智能体工具链的实践大纲

1. 从零跑通 OpenManus 多智能体工具链先搞清楚它到底解决什么问题OpenManus 是一个开源的多智能体AI agents框架核心目标是把「用户一句话需求」拆成可执行的任务流再调度不同工具和智能体去完成。它适合谁适合已经用过单轮对话模型、但发现「模型只会说不会做」的开发者适合想把浏览器操作、代码执行、文件读写串成一条自动化流水线的人也适合想研究 planning flow、ReAct 循环、MCP 工具接入这些机制的同学。我最初接触它时的困惑很典型单智能体模式main.py能跑但一遇到「先查资料、再写脚本、再生成图表」这种跨领域任务就开始胡言乱语或者卡在某个工具调用上。后来才明白OpenManus 真正的价值不在单个 agent而在于 flow 层——PlanningFlow 会把任务拆成步骤每一步指定一个 agent 去执行agent 再通过 ToolCallAgent 的 think/act 循环调用工具。理解这条链路比背 API 重要得多。这篇大纲式的实践记录会按「环境准备 → 配置 LLM 通道 → 工具注册 → 任务编排 → 端到端验证 → 报错排查」的顺序展开。每一步都给可复制的命令和配置片段你可以边看边敲。需要说明的是LLM 的 Key 和 Base URL 我用 TaoToken 作为统一通道来配置这样切换模型时不用改代码只改一处配置即可。官网入口在 https://taotoken.net/?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content API 地址是 https://taotoken.net/api 。先明确一个认知OpenManus 不是「装完就能用」的成品软件它更像一套骨架。你要自己填 LLM 配置、自己决定启用哪些工具、自己写 flow 的入口。所以下面每个环节我都会解释「为什么这么配」而不是只丢命令。2. 环境准备与 TaoToken 统一 Key 配置uv 虚拟环境 config.toml 接入2.1 用 uv 建一个干净的 Python 3.12 环境OpenManus 官方推荐 uv 管理依赖比 pip 快很多也不容易污染系统环境。先装 uvcurl -LsSf https://astral.sh/uv/install.sh | sudo sh装完确认版本uv --version然后克隆仓库并进入目录git clone https://github.com/FoundationAgents/OpenManus.git cd OpenManus创建虚拟环境并激活。这里指定 Python 3.12因为部分依赖对 3.13 支持还不稳uv venv --python 3.12 source .venv/bin/activate接着切到稳定 tag 再装依赖。直接跟 main 分支有时候会遇到未合并的实验代码git checkout v0.3.0 uv pip install -r requirements.txt这一步如果卡在某个包编译通常是缺少系统级依赖。Ubuntu 下可以先补sudo apt-get install -y build-essential python3-dev2.2 复制配置模板并填入 TaoToken 通道OpenManus 的配置集中在 config/config.toml。先复制模板cp config/config.example.toml config/config.toml然后编辑 config/config.toml。关键是把 [llm] 段的 base_url 和 api_key 指向 TaoToken 的统一通道。这样无论你后面想换 qwen、claude 还是别的模型都只改 model 字段不用动代码# Global LLM configuration [llm] model claude-3-5-sonnet-20241022 base_url https://taotoken.net/api api_key sk-你的TaoToken密钥 max_tokens 4096 temperature 0.0这里有几个点值得展开。base_url 末尾不要带 /v1OpenManus 内部会自己拼路径api_key 建议用环境变量注入而不是硬编码生产环境可以改成读取 os.environ。temperature 设 0.0 是因为 agent 场景需要稳定决策太随机会导致同一任务每次走的工具路径都不一样调试起来很痛苦。如果你要用多模型比如规划用一个、执行用另一个OpenManus 支持在 [llm] 之外定义命名配置然后在 agent 里引用。但初学阶段建议先用单一模型跑通减少变量。配置完成后可以先单独验证 LLM 通道是否通。写一个最小脚本import asyncio from app.llm import LLM async def main(): llm LLM() resp await llm.ask([{role: user, content: 回复两个字通了}]) print(resp) asyncio.run(main())如果这里报 401说明 Key 或 base_url 有问题先别往下走回到配置排查。这一步能省掉后面大量「以为是 agent 逻辑错、其实是 Key 错」的误判。3. 工具注册与多智能体编排从 ToolCollection 到 PlanningFlow 的可复制配置3.1 理解工具是怎么被 agent 拿到的OpenManus 里工具不是全局单例而是通过 ToolCollection 注入到 agent。每个 agent 初始化时会声明自己能用哪些工具。比如 Manus 主 agent 默认挂了 PythonExecute、BrowserUseTool、StrReplaceEditor、WebSearch 等。你可以在 app/agent/manus.py 里看到类似self.available_tools ToolCollection( PythonExecute(), BrowserUseTool(), StrReplaceEditor(), WebSearch(), Terminate(), )想加自定义工具就继承 BaseTool实现 name、description、parameters 和 execute 四个部分然后塞进这个集合。description 特别重要因为 LLM 是靠它来决定调不调这个工具的写得太模糊模型就不会用。3.2 多智能体编排PlanningFlow 怎么把任务分下去多智能体入口是 run_flow.py。它创建一个 PlanningFlow把 agents 字典传进去from app.flow.flow_factory import FlowFactory, FlowType from app.agent.manus import Manus agents {manus: Manus()} flow FlowFactory.create_flow( flow_typeFlowType.PLANNING, agentsagents, ) result await flow.execute(prompt)PlanningFlow 的执行逻辑是先用 LLM 生成一个步骤计划每一步标注由哪个 agent 执行格式是 [agent_name]然后循环取出当前步骤找到对应 executor调用它的 run 方法把结果追加到上下文再进入下一步。这个循环直到计划里所有步骤完成或触发终止条件。如果你想加一个专门做数据分析的 agent就在 agents 字典里加一项并在它的 system prompt 里写清楚职责PlanningFlow 生成计划时会参考 agents_description 来分配步骤。这就是「多智能体协同」的落地方式——不是让 agent 互相聊天而是让 flow 层做调度。3.3 一份可直接用的编排配置片段把下面这段存成 run_flow_custom.py放在项目根目录import asyncio import time from app.agent.manus import Manus from app.agent.data_analysis import DataAnalysis from app.flow.flow_factory import FlowFactory, FlowType async def main(): agents { manus: Manus(), data_analysis: DataAnalysis(), } flow FlowFactory.create_flow( flow_typeFlowType.PLANNING, agentsagents, ) prompt input(Enter your prompt: ) start time.time() result await asyncio.wait_for(flow.execute(prompt), timeout3600) print(f\n耗时 {time.time() - start:.1f}s) print(result) if __name__ __main__: asyncio.run(main())运行python run_flow_custom.py输入一个跨领域任务比如「抓取某公开页面的表格数据用 Python 清洗后生成柱状图并保存到 workspace」。你会看到 PlanningFlow 先输出计划然后逐步执行。这就是工具链协同的直观体现。4. 端到端运行验证一次真实任务从输入到产出的完整过程4.1 单智能体模式先跑通在验证多智能体之前先用 main.py 确认基础链路没问题python main.py启动后会出现 Enter your prompt:输入一个简单任务比如「用 Python 计算 1 到 100 的平方和并打印」。正常的话你会看到 agent 的思考过程、工具调用、以及最终结果。日志里会有 browser_use 的 telemetry 提示这是正常的不影响功能。如果这一步就失败优先看三类报错LLM 连接类401、connection refused、工具依赖类playwright 未安装浏览器、权限类sandbox 无法执行。分别对应配置、playwright install、以及容器权限设置。4.2 多智能体 flow 的完整验证接着跑 run_flow_custom.py输入一个需要多步骤的任务。观察输出结构正常应该包含计划阶段会打印出若干步骤每步带 [agent_name] 标记执行阶段会逐步显示当前执行哪个 agent、调用了什么工具、返回了什么最后是汇总结果。我实测下来一个「读取 workspace 下的 csv做描述性统计输出 markdown 报告」的任务PlanningFlow 会拆成三步读取文件、统计分析、生成报告。前两步由 data_analysis 执行第三步由 manus 汇总。整个过程大约 40 到 90 秒取决于模型响应速度。4.3 验证工具是否真的被调用光看输出不够要确认工具确实执行了。可以在 workspace 目录下检查产物文件是否生成比如图表 png、报告 md。如果 agent 说「已生成」但目录里没有说明工具调用是幻觉通常是 description 写得不清楚或者模型能力不足。这时候换一个更强的模型或者把工具描述改得更具体往往能解决。另外可以在 config.toml 里把日志级别调高观察每次 tool_call 的入参和出参。这是排查「agent 为什么选了错误的工具」最直接的手段。5. 常见报错排查401、local proxy failed、reading choices、OAuth 逐条对照5.1 401 Unauthorized最常见。原因通常是 api_key 没填、填错、或者 base_url 和 key 不匹配。检查 config.toml 里 [llm] 段的 base_url 是否为 https://taotoken.net/api api_key 是否完整。注意不要有多余空格或换行。如果用了环境变量确认 shell 里 echo $你的变量名 有值。5.2 local proxy failed / connection refused这个报错说明请求根本没发出去。可能是 base_url 写成了 localhost 但本地没有服务或者网络层被拦截。先确认 base_url 是可达的公网地址再用 curl 直接测curl -X POST https://taotoken.net/api/v1/chat/completions \ -H Authorization: Bearer sk-你的密钥 \ -H Content-Type: application/json \ -d {model:claude-3-5-sonnet-20241022,messages:[{role:user,content:hi}]}如果 curl 通但 OpenManus 不通就是配置读取路径问题检查是否真的读到了 config/config.toml。5.3 reading choices 相关报错典型信息是 Cannot read properties of undefined (reading choices) 或 Python 侧的 KeyError: choices。这说明返回体结构不符合预期通常是 base_url 少了或多了 /v1导致请求打到了错误端点返回了 HTML 或错误 JSON。确认 base_url 只写到 https://taotoken.net/api 不要自己加 /v1。5.4 OAuth / 认证相关报错如果用的是需要 OAuth 的工具比如某些浏览器自动化或外部服务报错会提示 token 过期或 scope 不足。这类问题跟 LLM 通道无关要单独检查对应工具的凭证配置。OpenManus 的 MCP 工具接入尤其容易在这里踩坑建议先用官方示例的 MCP server 跑通再换自己的。5.5 工具调用死循环agent 反复调用同一个工具、任务不推进。原因通常是 Terminate 工具没被正确识别或者 system prompt 里没写清楚终止条件。检查 NEXT_STEP_PROMPT 是否包含 Terminate 的说明并确认 max_steps 有设置上限。PlanningFlow 里也有 timeout 参数建议保留 3600 秒的兜底。6. 把这条工具链用起来TaoToken 通道下的模型切换与 Coding Plan跑通之后你会发现真正影响体验的是模型选择和调用成本。OpenManus 的 planning 和 tool calling 对模型能力要求不低弱模型会在任务拆解阶段就出错。用 TaoToken 作为统一通道的好处是你可以在 config.toml 里只改 model 字段就切换不同模型对比哪个在 planning 场景更稳。如果你打算长期跑 agent 任务、做自动化编码或者多步骤工具编排可以了解一下 Coding Plan它更适合高频调用场景https://taotoken.net/coding-plan?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content 。需要单独管理密钥、查看用量的话控制台在 https://taotoken.net/console?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content 密钥管理页在 https://taotoken.net/api-keys?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content 。想先直观感受模型对话效果可以从 https://taotoken.net/models?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content 进入。接入细节和参数说明在文档里https://taotoken.net/doc?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content 。最后给一个实用建议把 config.toml 里的 api_key 换成从环境变量读取然后在 shell 启动脚本里 export这样既避免密钥进 git也方便在不同项目间复用同一套 OpenManus 代码。工具链搭好只是开始真正省时间的是把常用任务固化成 flow 入口脚本下次直接python run_xxx.py就行。
觉得有用,分享给同行:

为您的企业打造数字门面

稳重轻奢商务风格,端正雅致视觉,长效耐看不易过时。

立即咨询 →