尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
Agent 工具深入解析:子代理类型选择、触发时机与 Explore、Plan、general-purpose 的适用场景
1. 为什么你的 Agent 总在子代理里打转如果你最近在用 Claude Code 或者类似的 Agent 工具跑复杂任务大概率见过终端里刷屏的[Sub-agent: Plan]、[Sub-agent: Explore]日志。很多人第一次看到这些标签的反应是“哦它在思考”然后继续等。等到上下文窗口被撑爆、任务卡死、或者生成了一个明显跑偏的方案才回头翻日志发现子代理之间在互相调用像俄罗斯套娃一样层层嵌套。这篇要解决的就是这个问题Explore、Plan、general-purpose 三类子代理到底怎么选、什么时候触发、边界在哪。不是概念科普而是给你一套可复制的配置骨架加上一次真实的任务分发验证——同一个请求分别命中三类子代理把输出差异摆出来看让你建立自己的选型判断依据。适合谁看已经在用 Agent 写代码、做重构、跑自动化脚本但经常遇到“任务不收敛”“token 烧得莫名其妙”“方案看起来对但执行就崩”的开发者。如果你还没开始用子代理这篇也能帮你少走我踩过的弯路。先说结论子代理不是粒度大小的问题是三种完全不同的执行哲学。Explore 只读不写负责回答“有什么”Plan 不执行只出方案负责回答“先做什么后做什么”general-purpose 是默认的瑞士军刀自己判断什么时候探索、什么时候规划、什么时候动手。选错了轻则浪费 token重则死循环。2. 接入前的准备把 TaoToken 配成你的模型入口在讲子代理配置之前得先把模型通道打通。我用的是 TaoToken 作为统一入口官网在 https://taotoken.net/?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content API 地址是 https://taotoken.net/api 。它的好处是一个 Key 能覆盖多个模型切换模型不用改代码对做子代理对比实验特别方便——因为不同子代理背后可能走不同模型统一入口能省掉一堆环境变量。第一步去控制台拿 Key。地址是 https://taotoken.net/console?utm_sourcetaotoken_aicg_blog_endutm_contentconsoleutm_campaignrewrite 登录后在 API Keys 页面创建一个新 Key复制出来。注意别把 Key 提交到 Git我一般放在.env里然后.gitignore加一行。第二步配置环境变量。以 Claude Code 为例它读的是ANTHROPIC_BASE_URL和ANTHROPIC_API_KEY这两个变量。在~/.zshrc或~/.bashrc里加export ANTHROPIC_BASE_URLhttps://taotoken.net/api export ANTHROPIC_API_KEYsk-你的Key改完执行source ~/.zshrc生效。如果你用的是其他 Agent 框架把 base_url 指向https://taotoken.net/apiKey 用刚才创建的那个就行。第三步验证通道。跑一个最简单的请求curl https://taotoken.net/api/v1/messages \ -H x-api-key: $ANTHROPIC_API_KEY \ -H anthropic-version: 2023-06-01 \ -H content-type: application/json \ -d { model: claude-sonnet-4-20250514, max_tokens: 64, messages: [{role: user, content: 回复 OK 两个字母}] }返回里能看到text: OK就说明通道通了。这一步别跳过后面子代理实验如果出问题先回来确认通道是好的能省掉一半排查时间。3. 子代理配置骨架触发条件与路由规则现在进入正题。子代理的选型不是靠--agent参数硬指定就完事实际工程里更可靠的做法是在任务描述里写清楚触发条件让调度器自己路由。下面这套骨架是我实测下来比较稳的写法你可以直接抄。3.1 三类子代理的职责边界先用一张表把边界钉死后面配置都围绕这张表展开子代理类型核心职责是否读写文件典型触发词输出形态Explore收集信息、摸清现状只读分析、看看、梳理、依赖关系现状描述 结构图Plan生成多步方案、理清依赖不读写规划、设计步骤、拆解任务有序步骤列表 依赖标注general-purpose执行具体改动读写修改、实现、重构、修复代码 diff 执行结果关键点Explore 和 Plan 都不碰文件。Explore 只读Plan 连读都不一定做它基于已有上下文出方案。只有 general-purpose 会真正改代码。这个边界一旦模糊就会出现“Plan 子代理试图执行代码”或者“Explore 子代理被要求改文件”的错配。3.2 触发条件写法在任务描述里用明确的动词和句式来引导路由。我总结了几组高命中率的写法# 触发 Explore 先分析一下 src/ 目录下各模块的依赖关系不要修改任何文件 梳理这个项目的启动流程列出涉及的配置文件和入口类 # 触发 Plan 请先生成一个详细的重构步骤计划标注每步依赖的文件先不要执行 把这个任务拆解成有序步骤说明先改哪个模块再改哪个 # 触发 general-purpose 按照上面的计划修改 UserService 的接口签名并更新调用方 实现这个函数跑通测试注意 Plan 的写法里一定要加“先不要执行”。不加的话调度器可能直接跳到 general-purpose 去动手你就拿不到方案了。3.3 路由规则配置如果你用的是支持配置文件的自定义 Agent 框架可以写一个路由规则。下面是一个 YAML 骨架逻辑是“按任务描述里的关键词匹配子代理类型匹配不到就走 general-purpose”sub_agent_routing: rules: - name: explore_route match_keywords: [分析, 梳理, 看看, 依赖关系, 现状] agent: Explore read_only: true - name: plan_route match_keywords: [规划, 拆解, 步骤计划, 先不要执行] agent: Plan read_only: true forbid_nested: true # 禁止 Plan 再调用 Plan - name: execute_route match_keywords: [修改, 实现, 重构, 修复, 跑通] agent: general-purpose read_only: false default_agent: general-purpose max_nesting_depth: 1 # 子代理最多嵌套一层forbid_nested: true和max_nesting_depth: 1这两条是防死循环的关键。我那次凌晨三点的递归事故就是因为没设嵌套深度Plan 生 Plan 无限套娃。加上这两条之后同类子代理不会再互相调用。4. 任务分发验证同一请求命中三类子代理光看配置不够得跑一次真实分发把三类子代理的输出摆在一起对比。我用的测试任务是“分析这个项目的用户模块规划一次接口重构然后实现它。”这句话里同时包含了 Explore、Plan、general-purpose 的触发词正好用来观察调度器怎么切分。4.1 实验设置准备一个简单的 Node.js 项目目录结构如下demo-project/ ├── src/ │ ├── user/ │ │ ├── userService.js │ │ └── userController.js │ └── order/ │ └── orderService.js └── package.jsonuserService.js里有一个getUser(id)方法userController.js直接调它。重构目标是给getUser加一个options参数并更新调用方。4.2 第一轮Explore 命中先只发探索部分claude 分析 src/user 目录下 userService 和 userController 的依赖关系不要修改任何文件实测输出节选[Sub-agent: Explore] 读取 src/user/userService.js 读取 src/user/userController.js 读取 src/order/orderService.js 依赖关系 - userController.js 第 12 行调用 userService.getUser(id) - orderService.js 未直接依赖 user 模块 - userService.js 导出 getUser、updateUser 两个方法 - 未发现循环依赖注意它只读不写输出是现状描述。这一步花了大概 8 秒token 消耗很小。如果你跳过这步直接让 general-purpose 去改它得自己先摸一遍反而更慢。4.3 第二轮Plan 命中接着发规划部分claude 基于上面的依赖关系规划一次 getUser 接口重构加 options 参数先不要执行实测输出节选[Sub-agent: Plan] 重构步骤 1. 修改 src/user/userService.js 的 getUser 签名增加 options 参数默认值 {} 2. 修改 src/user/userController.js 第 12 行调用传入 options 3. 检查 src/order/orderService.js 是否有间接调用结论无 4. 更新单元测试如存在 依赖标注步骤 2 依赖步骤 1 完成步骤 3 可与步骤 1 并行Plan 输出的是有序步骤加依赖标注它没有碰文件。这里如果配置里没加forbid_nestedPlan 有可能再生成一个 Plan 去“规划怎么规划”那就是死循环的开始。4.4 第三轮general-purpose 命中最后发执行部分claude 按照上面的计划修改 userService 的 getUser 签名并更新 userController 的调用实测输出节选[Sub-agent: general-purpose] 修改 src/user/userService.js: - getUser(id) → getUser(id, options {}) 修改 src/user/userController.js: - userService.getUser(id) → userService.getUser(id, {}) 执行 node -e require(./src/user/userController) 验证加载无报错 结果通过这一步才真正写文件输出是 diff 加执行结果。4.5 三类输出差异对比把三轮结果放一起看差异非常清晰维度ExplorePlangeneral-purpose是否改文件否否是输出内容现状 依赖图步骤 依赖顺序diff 执行结果耗时实测约 8s约 12s约 20stoken 消耗低中高失败模式读太多无关文件步骤过粗或嵌套改错文件、漏调用方这个对比就是你的选型依据不知道有什么先 Explore知道有什么但不知道怎么下手用 Plan方案清楚了才交给 general-purpose 动手。三步串行看起来慢但实测比直接让 general-purpose 从头跑到尾快 30% 左右因为省掉了它自己摸索和犹豫的开销。5. 本篇常见错排查跑子代理实验时下面这几个错我基本都踩过按出现频率排错误一Plan 子代理递归调用上下文爆掉。日志里出现连续的[Sub-agent: Plan]嵌套任务卡死。原因是配置里没限制嵌套深度。解决在路由规则里加forbid_nested: true和max_nesting_depth: 1并且任务描述里不要写“让 Plan 再规划一次”。错误二Explore 子代理被要求改文件输出一堆“我无法修改”。这是触发词写错了任务里出现了“修改”但你想先探索。解决探索阶段的任务描述里明确写“不要修改任何文件”把动词换成“分析”“梳理”“看看”。错误三general-purpose 跳过了 Plan直接改代码导致漏调用方。任务描述里同时有“规划”和“修改”调度器可能直接走 general-purpose。解决把规划和执行拆成两次独立调用别塞在一个请求里。错误四通道 401 或超时。先确认ANTHROPIC_BASE_URL指向https://taotoken.net/apiKey 没有多余空格。如果还不行去 https://taotoken.net/api-keys?utm_sourcetaotoken_aicg_blog_endutm_contentapi-keysutm_campaignrewrite 重新生成一个 Key 试试。接入细节可以参考 https://taotoken.net/doc?utm_sourcetaotoken_aicg_blog_endutm_contentdocutm_campaignrewrite 。错误五子代理输出和预期类型不符。比如你想要 Plan 却拿到了 Explore 的现状描述。这是触发词命中错了回去检查任务描述里的动词Plan 的触发词是“规划”“拆解”“步骤”Explore 是“分析”“梳理”。6. 选型判断与后续接入把上面的实验收束成一句可操作的判断面对一个任务先问自己“我知不知道有什么”不知道就 Explore知道了但“不知道怎么排顺序”就 Plan顺序清楚了才 general-purpose 动手。这三步不是必须全走简单任务直接 general-purpose 就行但复杂重构、跨模块改动、陌生代码库走一遍三步能显著降低返工率。如果你主要做长期编码和 Agent 自动化建议把子代理路由规则固化到项目配置里配合 Coding Plan 使用地址是 https://taotoken.net/coding-plan?utm_sourcetaotoken_aicg_blog_endutm_contentcoding-planutm_campaignrewrite 它适合需要持续跑 Agent 任务的场景。想先手动验证模型输出差异可以用模型对话页面 https://taotoken.net/chat?utm_sourcetaotoken_aicg_blog_endutm_contentmodel-chatutm_campaignrewrite 快速试。Claude Code 相关的接入配置在 https://taotoken.net/claude-code?utm_sourcetaotoken_aicg_blog_endutm_contentclaudecodeutm_campaignrewrite 有更细的说明。最后留一个我自己的习惯每次跑复杂任务前先在任务描述里把“探索—规划—执行”三段用空行隔开明确标注每段要哪个子代理。调度器读起来清晰你事后翻日志也能一眼看出哪段出了问题。子代理是工具路由规则是你写的别把决策权全交出去。
RELATED

相关推荐

VSCode 中使用 PlantUML 插件生成 UML:TaoToken 统一 Key 配置与预览验证

VSCode 中使用 PlantUML 插件生成 UML:TaoToken 统一 Key 配置与预览验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

📅 2026/9/29 6:49:31
水泵站远程监控实战:NB-IoT物联网平台设计与部署全解析

水泵站远程监控实战:NB-IoT物联网平台设计与部署全解析

在做水泵站远程监控的同行应该都有体会:设备分布散、现场环境差、故障发现永远靠人跑,最关键的几个数据(运行电流、出口压力、流量)基本靠人工抄表和感觉判断。我几年前开始折腾一套物联网水泵应用平台,代号就叫 YIBAB…

📅 2026/9/29 6:49:31
DataGrip 2026.1 查询文件重构实战:用 TaoToken 统一 Key 打通 AI 代理与 PostgreSQL 数据源模板

DataGrip 2026.1 查询文件重构实战:用 TaoToken 统一 Key 打通 AI 代理与 PostgreSQL 数据源模板

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

📅 2026/9/29 6:44:31
MORE NEWS

更多资讯

📰

STM32CubeMX下载、固件包安装与离线导入排错指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

📰

SM2258XT固态开卡量产实战:工具选型、参数配置与掉盘修复

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

📰

Apache Beam Go 实战:用 ParDo 实现 One-to-Many 一对多映射

【免费下载链接】beam Apache Beam is a unified programming model for Batch and Streaming data processing. 项目地址: https://gitcode.com/gh_mirrors/beam18/beam 点击查看 免费下载 导读 本文围绕 Apache Beam Go SDK 的 ParDo 一对多(One-to-…

📰

C++学习的三层能量模型:语法、内存与范型

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

📰

BLE DTM by HCI:射频层直通测试原理与实战

1. 项目概述:这不是“蓝牙调试”,而是射频层的硬核对话“BLE DTM by HCI”这八个字符,乍看像一串技术缩写堆砌,实则藏着嵌入式无线开发中最常被误解、也最容易踩坑的核心能力——它不是在APP里点几下配对,也不是用手机…

📰

Jenkins从安装到自动化部署:踩坑实录与实战指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬