子代理是主会话为一件有边界的工作拉起的子 agent。它拿到全新的模型选择、全新的权限姿态和独立的“写前先读”状态;同时它绕不过父级 —— 只有宿主能重建的核心工具才会被继承。
典型用法:对一个 diff 做只读评审、只带两个工具的窄口径修复、允许抓取但绝不写盘的调研子代理,或者在工作能干净切分时并行开几个。
工作怎么派下去
agent 通过 subagent 工具拉起子代理。彼此独立的子代理可以作为一波并行执行,耗时的可以放后台跑,父会话继续干活。父与子之间随时可以提问:子代理需要决策时会问,答案会回到同一个会话里。
每个子代理的记录在父会话生命周期内驻留内存,所以续接的对话能把它接回来,而不是从头再来。
Kind:可复用的预设
一个 kind 就是一份子代理预设 —— 名字、描述、工具白名单、模型、推理档位、权限模式,外加一段提示模板。定义它有两个地方。
文件放在 .cetas/agents/<name>.md,可以按用户放,也可以按项目放:
---
name: reviewer
description: 只读的 diff 评审员
tools: read, grep, glob
effort: low
mode: readonly
---
你在不动工作区的前提下评审改动。
来自调用方的指令:
<fillin>
{{instructions}}
</fillin>frontmatter 里的 name 必须和文件名一致。未知 key 会被忽略;缺 name / description、列表项非字符串、块没有闭合、mode 不认识,都是解析错误 —— 坏 frontmatter 会被拒绝,不会被修。列表可以写成逗号分隔的字符串,也可以写成短横线列表。
settings 里的条目更轻,写在 settings.json 的 subagent.kinds 下,字段名一致,只是换成 JSON 语法。body 可以省略,省略时会用 name 和 description 生成一段通用模板。
按 kind 名的优先级:项目 .md → 用户 .md → settings 条目 → 内置。
工具白名单
三种状态:
tools |
含义 |
|---|---|
| 不写 | 继承宿主默认的核心工具集 |
[] |
一个工具都没有 |
| 一个列表 | 就是这些工具 |
默认模型与限额
子代理的默认模型、推理档位和全部限额走 settings 的 subagent 段,每个字段的默认值见 Settings 参考;不配就是默认值。模型选择的优先级链:显式传参 → kind 绑定 → default_model → 父级当前选择。
注意事项
- 子代理不继承宿主动态工具和装饰器。需要某个工具的 kind 要显式写出来,并且宿主能重建它。
- 子代理的权限姿态是自己的。父级是
yolo时,一个readonly子代理依然写不了。 spawn_budget是防止跑偏的计划变成一百个 agent 的护栏;要抬就明确地抬。