1. 多 Agent 协作到底解决什么问题如果你已经用 Open Agent SDK 跑通过单 Agent大概率会遇到一个瓶颈一个 Agent 既要探索代码库、又要写实现方案、还要改代码上下文越堆越长工具调用越来越乱最后它自己都忘了最初的任务是什么。这不是模型不行而是职责没有拆开。多 Agent 协作的核心思路很朴素让一个主 Agent 当协调者把探索、规划、编码这些活分给不同的子 Agent每个子 Agent 只带自己需要的工具和提示词干完把结果交回来。主 Agent 负责汇总和决策。这样每个子 Agent 的上下文都是干净的工具集也是收敛的出错时更容易定位是哪一环的问题。Open Agent SDK 把这套机制拆成了三层子 AgentSubAgentSpawner AgentTool解决“谁干活”Task 系统解决“活干了多少”Team Mailbox 解决“谁跟谁一组、怎么通信”。这篇就按这三层往下走给出可复制的配置骨架和验证步骤让你在本地把多 Agent 协作跑起来。适合谁看已经能跑通单 Agent、想进一步拆分职责的开发者正在设计 Agent 工作流、纠结要不要上多 Agent 的架构同学以及被“Agent 套 Agent 递归失控”坑过的人。2. 前置准备TaoToken 接入与 SDK 环境多 Agent 协作会频繁调用模型子 Agent 每次 spawn 都是一次独立的模型请求token 消耗比单 Agent 高不少。所以先把接入层配好避免后面调试时被额度或鉴权问题打断。TaoToken 的接入方式兼容 OpenAI 风格的 base_urlSDK 里只需要改 baseURL 和 apiKey 两个字段。先去控制台创建一个 API Key建议单独建一个用于多 Agent 场景的 Key方便按项目统计消耗。创建 Key 的入口在控制台的 API Keys 页面生成后复制保存页面关闭后不再显示完整值。接入文档里有各语言的最小示例Swift 项目直接看 baseURL 配置那一段即可。注意多 Agent 场景下子 Agent 会继承父 Agent 的 apiKey 和 baseURL所以只需要在创建主 Agent 时配置一次不用给每个子 Agent 单独传。这一点在 DefaultSubAgentSpawner 的实现里已经处理好了。环境上确认三件事SDK 版本支持 AgentTool 和 TaskStore较新的版本才有本地能正常访问 API 端点项目里已经有一个能跑通的最小 Agent 示例作为基线。如果基线还没跑通先回到单 Agent 那篇把基础流程走完否则多 Agent 出问题时你分不清是协作配置错了还是基础接入就没通。3. 可复制配置settings.json 与 config.toml 关键字段SDK 的配置分两层一层是项目级的 settings.json管模型、权限、工具白名单一层是运行时的 AgentOptions管单次会话的参数。多 Agent 协作主要动的是 AgentOptions但 settings.json 里的工具权限会直接影响子 Agent 能拿到哪些工具。先看 settings.json 里和多 Agent 相关的字段{ model: claude-sonnet-4-6, permissions: { allow: [Read, Glob, Grep, Bash, Agent, TaskCreate, TaskUpdate, TaskList], deny: [Write, Edit] }, agent: { maxTurns: 20, subagentMaxTurns: 10, allowSubagentSpawn: true } }这里有几个点值得说。allow里必须显式包含Agent否则主 Agent 拿不到 AgentTool就没法委派子 Agent。subagentMaxTurns控制子 Agent 的轮次上限默认 10探索类任务够用编码类任务可能要调到 15 到 20。allowSubagentSpawn是个总开关关掉后即使工具列表里有 Agent 也不会真正 spawn。如果你用 config.toml 管理配置对应的字段是这样[model] default claude-sonnet-4-6 subagent claude-sonnet-4-6 [agent] max_turns 20 subagent_max_turns 10 allow_subagent_spawn true [tools] base_tier core extra [Agent, TaskCreate, TaskUpdate, TaskList, TeamCreate, SendMessage] [team] default_leader self mailbox_enabled true[tools].extra里列的是在核心工具集之外额外注册的工具。多 Agent 协作至少需要 Agent、TaskCreate、TaskUpdate、TaskList 这四个如果要上团队协作再加 TeamCreate 和 SendMessage。运行时创建主 Agent 的代码骨架let taskStore TaskStore() let mailboxStore MailboxStore() let teamStore TeamStore() let agent createAgent(options: AgentOptions( apiKey: apiKey, baseURL: https://taotoken.net/api, model: claude-sonnet-4-6, agentName: coordinator, systemPrompt: You are a coordinator. Break complex tasks into subtasks, \ delegate each to a sub-agent via the Agent tool, then synthesize results. , maxTurns: 20, tools: getAllBaseTools(tier: .core) [ createAgentTool(), createTaskCreateTool(), createTaskUpdateTool(), createTaskListTool() ], taskStore: taskStore, mailboxStore: mailboxStore, teamStore: teamStore ))注意taskStore、mailboxStore、teamStore这三个是共享实例主 Agent 和子 Agent 用的是同一份。子 Agent 通过 ToolContext 拿到这些 store 的引用所以任务和消息是全局可见的。4. 子代理注册与任务分发流程子 Agent 的生成不是 AgentTool 直接 new 一个 Agent中间隔了一层 SubAgentSpawner 协议。这个协议定义在 Types 层具体实现在 Core 层通过 ToolContext.agentSpawner 注入。这样 Tools 层不需要导入 Core 层是典型的依赖倒置。DefaultSubAgentSpawner 在 spawn 时做了四件事过滤掉 AgentTool 防止无限递归按 allowedTools 过滤工具按 disallowedTools 再过一遍优先级更高创建子 Agent 并 await 执行。关键点是子 Agent 默认继承父 Agent 的所有工具但永远拿不到 AgentTool所以不会出现 Agent 套 Agent 套 Agent 的情况。AgentTool 内置了两种预定义子 Agent 类型。Explore 用于代码库探索工具集是 Read、Glob、Grep、BashmaxTurns 为 10。Plan 用于软件架构设计工具集相同但系统提示词是架构师角色。LLM 调用时通过 subagent_type 字段指定{ prompt: Explore the project structure and find all Swift source files, description: Explore codebase, subagent_type: Explore }任务分发的完整链路是这样的用户发 prompt主 Agent 判断需要探索代码库调用 AgentToolAgentTool 通过 spawner 生成 Explore 子 Agent子 Agent 用 Glob/Grep/Read 执行探索结果返回给主 Agent主 Agent 汇总后回复用户。如果你想注册自定义子 Agent 类型可以在 AgentTool 的 BUILTIN_AGENTS 之外扩展。自定义类型的核心是定义 name、description、systemPrompt、tools、maxTurns 五个字段。description 很重要LLM 是根据它来决定什么时候用哪个子 Agent 的写得太模糊会导致委派错误。任务分发时主 Agent 通常会配合 Task 系统一起用。典型流程是TaskCreate 创建任务Agent 委派子 Agent 执行TaskUpdate 标记完成并写入 output。这样每个子任务的执行结果都有记录主 Agent 汇总时不用靠记忆。5. 验证请求与成功结果配置写完后怎么确认多 Agent 协作真的生效了光看最终输出不够因为主 Agent 可能自己把活干了。要看中间过程。最直接的方式是监听 stream 消息打印 toolUse 和 toolResultfor await message in agent.stream( Explore the current project directory. Find all Swift source files, \ examine the project structure, and provide a summary. \ Use the Agent tool to delegate this task to an Explore sub-agent. ) { switch message { case .toolUse(let data): if data.toolName Agent { print([Sub-agent Delegation: \(data.toolName)]) } case .toolResult(let data): print([Result: \(data.content.prefix(200))]) case .result(let data): print(Turns: \(data.numTurns), Cost: $\(data.totalCostUsd)) default: break } }成功的标志是看到[Sub-agent Delegation: Agent]这行输出。如果只看到 Read、Glob 这些工具调用没有 Agent说明主 Agent 自己干了要么是系统提示词没写清楚要么是 AgentTool 没注册进去。另一个验证点是 Task 状态。跑完后调 TaskList 看任务列表let tasks await taskStore.list(status: nil, owner: nil) for task in tasks { print(\(task.id) - \(task.status.rawValue) - \(task.subject)) }正常应该看到任务从 pending 流转到 completedowner 字段是子 Agent 的名字。如果任务一直是 pending说明子 Agent 没被正确 spawn或者 spawn 后没调 TaskUpdate。日志层面SDK 会输出子 Agent 的 spawn 记录包含 subagent_type、model、maxTurns 这些参数。如果日志里没有 spawn 记录但最终结果是对的那基本可以确定是主 Agent 自己完成的。6. 本篇常见错排查错误一AgentTool 未注册主 Agent 无法委派。症状是主 Agent 一直自己调 Read/Grep从不调 Agent。检查 tools 列表里有没有 createAgentTool()以及 settings.json 的 allow 里有没有 Agent。两者缺一不可。错误二子 Agent 递归失控。症状是 token 消耗异常高日志里出现多层 spawn。正常情况下 DefaultSubAgentSpawner 会过滤掉 AgentTool子 Agent 拿不到 Agent 工具。如果你自定义了 spawner 实现确认过滤逻辑还在。另外检查 allowSubagentSpawn 是不是被误开了递归。错误三TaskUpdate 报 invalidStatusTransition。症状是 LLM 收到错误提示任务状态没更新。原因是试图把 completed/failed/cancelled 这些终态改成其他状态。终态不可逆转是设计约束LLM 需要先 TaskList 看当前状态再决定操作。如果频繁出现在系统提示词里加一句“更新任务前先查询当前状态”。错误四SendMessage 校验失败。症状是消息发不出去返回错误。SendMessageTool 有三层校验必须有 MailboxStore、必须有 TeamStore、发送者必须在某个 Team 里、收件人必须是同 Team 成员。任何一层不满足都会失败。排查时先确认 TeamCreate 是否成功再看发送者和收件人是否都在 members 列表里。广播用 * 作为收件人不需要校验成员关系。错误五子 Agent 拿不到父 Agent 的工具。症状是子 Agent 执行时报“工具不存在”。子 Agent 默认继承父 Agent 的工具集除了 AgentTool但如果你在 spawn 时传了 allowedTools就只会保留白名单里的工具。检查 spawn 参数里的 allowedTools 和 disallowedToolsdisallowedTools 优先级更高会覆盖 allowedTools。错误六Mailbox 读取后消息丢失。MailboxStore.read() 是破坏性读取读一次邮箱就清空了。如果 Agent 读了消息但没处理完就崩溃消息就没了。这是拉取模式的固有代价设计上假设 Agent 读取后会立即处理。如果需要消息持久化得自己在 read 之后做备份。7. 下一步从跑通到用好跑通最小协作场景后下一步是把它用到实际工作流里。三个方向可以按需选。如果你主要做代码探索和重构重点打磨 Explore 和 Plan 两种子 Agent 的提示词让它们输出的结果格式统一主 Agent 汇总时更省 token。如果你要做长期运行的编码任务考虑上 Coding Plan它把多轮编码的上下文管理和任务编排做了封装比手写 Task 流转省事。如果你还在验证模型选型和协作效果先用模型对话把不同模型的委派决策质量对比一下再决定生产环境用哪个。接入相关的 Key 管理和文档入口API Keys 在控制台创建接入文档有各语言的最小示例。多 Agent 场景建议单独建 Key方便按项目统计消耗。最后说一个实测下来的经验多 Agent 协作的收益不是线性的。两个 Agent 协作可能比单 Agent 快 30%但四个 Agent 可能因为协调开销反而变慢。先从两个角色拆起一个探索、一个执行确认协作链路稳定后再加角色。任务编排的复杂度要匹配任务本身的复杂度别为了多 Agent 而多 Agent。
企业数字化 ERP 产品动态
相关推荐
不联网也能在手机上跑大模型?聊聊这个 NPU 优先的开源 AI 运行时 先说个场景:你想在手机上做个本地助手,结果要么得把数据传到云端、要么模型根本跑不动。我最近翻到一个叫 NexaSDK 的项目(GitHub),它想解决的正是这个——让前沿的大模型直接"住"在设备里,手机、… · 2026/9/26 16:22:15
智能工厂顶层设计:从业务痛点到IT/OT融合的落地路径 这些年我接触过不少准备上智能工厂的项目,有做汽车零部件的,有做3C电子的,也有做化工和食品的。说句实话,真正跑通的不到三成。大部分项目卡在同一道坎上——从第一天起就没想清楚智能工厂要解决谁的问题、创造什么价值࿰… · 2026/9/26 17:25:56
HART转Modbus RTU网关在污水流量采集中的实战选型与部署 1. 为什么污水厂现场非得用HART转Modbus RTU网关?——从仪表“哑巴”到数据活起来的真实困境我在某市第三污水处理厂做自动化改造时,第一次站在二沉池边的仪表柜前,盯着那台标着“HART输出”的电磁流量计发了十分钟呆。它明明在实时测量瞬时流… · 2026/9/26 17:25:56
PostgreSQL numeric类型全解析:存储格式、内存表示与精度实践 先说明一下,这篇文章不是给你讲“numeric怎么存进内存”这种教科书定义,而是把我在实际项目里和 PostgreSQL 的 numeric 搏斗过几轮之后,积累下来的完整链路梳理。从数据库磁盘上的存储格式,到进程内存里的表示,再到客… · 2026/9/26 17:25:49
Python机器学习入门与Scikit-learn 机器学习入门与-learn一、正式踏上学习机器知识的道路, 开始接触由这一个专门库带来的初步体验。关于第一章的小节, 也就是第一小节所提到的内容, 它是为了梳理清楚这门技术在过往岁月和当前阶段的演变历史, 这其实是一场因为数据运用而引发的巨大变革过程。在计算机科学这片范… · 2026/9/26 17:25:49
18个最热深度学习Github项目逐一介绍 摘要: 在前几天, 我们列举出了一百个是关于深度学习的源代码项目, 不过, 这些项目之中的大部分, 目前都不怎么活跃了, 所以呢, 我们在这里特别挑出来了一十八个最为活跃的此类项目, 并为每一个项目都制作了一张专门的信息卡片, 这样一来, 就可以让人感到一目了然了, 这就比较方… · 2026/9/26 17:25:49
SQL约束实战指南:从数据完整性到防重防脏的完整设计 作为常年跟SQL打交道的人,我翻看自己的笔记时发现“约束”这一章被画满了记号。很多初学者觉得约束不过是建表时顺手写的几个单词,实际上一旦数据量上来、业务逻辑变复杂,约束设计得好不好,直接决定你是优雅地维护数据,… · 2026/9/26 17:25:43
数据库课后习题答案别硬背:当测试用例集刷,效率翻倍 简介:万常选版《数据库原理与设计》课后习题答案资源,覆盖第2至6章及第9章,适合正在学习关系模型、数据库建模、关系数据理论与模式求精的本科生、自学者作为复习与自测材料。压缩包共7个文件,含3个doc参考答案、2个sql示例脚本、… · 2026/9/26 0:00:21
OpenClaw 替代品?Hermes Agent 踩坑实录:macOS 飞书接入 TaoToken 配置 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/26 0:00:40
向下兼容与向上兼容:接口设计中的兼容性策略与工程实践 一次版本升级事故,是很多团队绕不过去的坎。线上环境里,服务端明明已经上线了新版接口,老的移动端还在照着旧文档传参数。请求一到网关,校验直接拒绝,用户操作失败,客服群炸了锅,开发群里开始互… · 2026/9/26 0:00:46