子代理
子代理是一个特殊的会话:由主会话的 AI 创建,相当于替你向一个新会话发了条消息,它会像普通会话一样自动开始工作。子代理有独立的上下文和完整的工具能力,可以和主会话并行干活;你也能随时点进去看进度、自己发消息或暂停它。
子代理分两种:默认通用子代理(继承父会话的模型和全部工具)和自定义子代理(你自己定义提示词、模型、工具集)。
怎么用
在对话里让 AI 派子代理,例如:
- 「派个子代理去审查
app/build.gradle.kts,把问题列出来」 - 「创建两个子代理,一个研究数据库迁移方案,一个调研 UI 组件库选型」
- 「派个只读调研 agent 去搞清登录流程」
AI 会先征求你同意(权限弹窗),创建后立刻返回,不阻塞主对话,子代理在后台自动开始工作。
内置的 Explore
首次启动会自动释放一个内置的 Explore 子代理到 ~/.aicode/agents/explore.md,开箱可用。
它用来做只读的代码库探索:搞清某个功能怎么实现的、某处逻辑在哪、某个改动要碰哪些文件。工具只给了 readFile、list、search、websearch、webfetch、loadSkill——没有写文件和执行命令的工具,所以它不会改动任何东西,也不会触发权限弹窗。模型默认继承父会话,想给它换个便宜的模型,在 explore.md 里加 provider 和 model 即可。
这个文件只在不存在时释放,所以你改过的内容不会被 App 升级覆盖;删掉后下次启动会重新释放一份默认的。
自定义子代理
一个 .md 文件定义一个子代理,放在两处之一:
- 全局:
~/.aicode/agents/<name>.md,跨项目共享,升级保留。 - 项目级:
<项目根>/.aicode/agents/<name>.md,随工作区走,可以提交到 git。
同名定义项目级优先。文件格式是 YAML frontmatter 加正文,正文就是这个 agent 的系统提示词:
---
name: researcher
description: 只读调研:大范围搜代码、查资料、汇总结论,不改文件
provider: DeepSeek
model: deepseek-reasoner
reasoningEffort: high
tools: [readFile, list, search, websearch, webfetch]
disallowedTools: [Bash, terminal]
inject: [base, projectRules]
---
你是代码库调研专家。先用 search 定位入口,再用 readFile 逐层确认,
结论里必须给出 `文件路径:行号` 引用,不确定的地方明说未核实。frontmatter 字段
| 字段 | 必填 | 说明 |
|---|---|---|
name | 否 | agent 名,派发时用它。省略则取文件名 |
description | 建议填 | 什么时候该派这个 agent。这段会注入主代理的提示词,主代理靠它判断该不该派 |
provider | 否 | 提供商,写设置里看到的名称即可。省略则继承父会话 |
model | 否 | 模型名。省略则继承父会话 |
reasoningEffort | 否 | 思考强度:none / minimal / low / medium / high / xhigh / max |
tools | 否 | 工具白名单。省略等于给全部工具,不是"没有工具" |
disallowedTools | 否 | 工具黑名单,优先于白名单。支持 mcp__server__* 通配 |
inject | 否 | 要注入的提示词片段,见下表 |
工具名就写「设置 → 工具授权」里看到的那些(readFile、writeFile、editFile、Bash、terminal、list、search、websearch、webfetch、todo、memory、loadSkill、askUserQuestion、sendFile、viewImage、manageMcp 等)。派子代理的工具永远会被剔除——子代理不能再派子代理。
inject 可选值
| 取值 | 含义 |
|---|---|
base | 子代理专用的精简基线:工具用法、路径约定、安全边界。不含模式切换、结尾总结这些主代理专属规则 |
mainRules | 主代理的完整规则基线。需要子代理行为和主代理完全一致时用,比 base 费 token |
skills | 可用技能清单,让子代理能加载技能 |
memory | 全局与项目记忆的摘要清单 |
projectRules | 项目规则(AGENTS.md / CLAUDE.md) |
省略 inject 等于 [base, skills, memory, projectRules]。写 inject: [none] 则只用 agent 自己的提示词,不注入任何额外内容。
MCP 工具不需要单独注入说明,工具集里包含 mcp__* 工具就能直接调用;不想给就用 disallowedTools: [mcp__*] 全禁掉。
派发时必须给足上下文
子代理看不到主会话的历史
你们聊过什么、主代理读过哪些文件、已经得出什么结论,子代理一概不知道。派发时给它的那段话就是它拥有的全部信息。
主代理的提示词已经要求它在派发时写清四件事:目标与完成标准、已知上下文(文件路径、已核实的结论、已排除的方向、你定下的选型)、边界(不该动哪些文件、不要提交)、期望的产出形式。
反方向也一样:主代理只能读到子代理的最后一条回复,中间过程和工具结果它拿不到。你自己点进子会话能看到完整过程,但主代理看不到。
在设置里查看
「设置 → 子代理」按「当前项目 / 全局」分组列出已定义的 agent。点行进详情可以看模型、工具集、注入项、定义文件路径和提示词正文;左滑可删除定义文件。
详情页是只读的,要改就直接编辑那个 .md 文件(可以让 AI 帮你写)。
主代理怎么知道该派哪个
已定义的 agent 会以清单形式注入主代理的系统提示词(只含名称和 description,不含提示词正文)。任务和某个 agent 对口时,AI 会按名字派发;名字写错会报错并列出可用的名字,不会悄悄退回成通用子代理。你也可以直接说「用 researcher 子代理去查 X」来指定。
和普通会话的区别
| 能力 | 普通会话 | 子代理会话 |
|---|---|---|
| 你查看 / 发消息 / 暂停 | 支持 | 支持,界面完全一样 |
| AI 替你发消息 | 不支持,只有你能发 | 支持,创建它的 AI 可以替你发 |
| 独立上下文与完整工具 | 支持 | 支持 |
| 与主会话并行运行 | — | 支持,可同时派多个 |
侧边栏里在哪找
侧边栏顶部有「会话」和「文件」两个标签页。子代理不单占一页,而是挂在它所属的会话下面:
- 派生过子代理的会话,行尾会显示子代理数量和一个展开箭头。
- 点箭头展开,子代理缩进列在下方(运行中的有绿色状态点),再点收起。
- 点子代理项就切换过去,界面和普通会话一样,长按同样可以置顶、重命名、导出、删除。
- 回主会话就在「会话」页点父会话。
没有子代理的会话不会出现展开箭头。
完成后会怎样
子代理跑完后,主会话会收到一条后台通知,主代理据此知道它结束了,然后可以读取它的最后输出。除了读取,AI 还能主动停止某个子代理(已产出的内容保留)、删除子代理会话,或者列出当前会话的全部子代理及状态。
限制
- 最多同时运行 5 个。超限时创建会报错,需要等某个跑完或者先停掉一个。实际用起来通常 1 到 2 个就够,5 是硬上限而不是推荐值。
- 子代理不能再派子代理。
- 子代理和主会话共用同一套权限体系,需要授权的操作仍然会弹确认。权限弹窗是全局串行的,多个子代理同时请求授权会排队。想让某个 agent 完全不碰需授权的操作,用
tools白名单只给只读工具。 - 删除父会话时,它下面的所有子代理会话会一并删除。
- 自定义子代理的定义在创建子会话时读取。改了
.md文件对正在跑的子代理不生效,对之后新派的生效。