首页/Agent/子代理

Agent/子代理

多代理协调与 KAIROS 自主规划

Agent 系统支持 Claude Code 创建子代理来并行处理复杂任务。AgentTool 是核心组件,支持内置代理、自定义代理和异步代理。KAIROS 系统则提供自主多步规划能力。

核心要点

AgentTool — 子代理分叉、内存管理、颜色编码
支持内置代理、自定义代理(.claude/agents/)、异步代理
Swarm 框架 — 多代理协调工作流
KAIROS — 自主多步规划和自我反思
Worktree 隔离 — 每个代理可在独立 git worktree 中工作

设计亮点

子代理继承父亲的记忆而非复印

就像给同事转发一封已经排好版的邮件,而不是让他从头写一封内容一样的邮件

创建子代理时,系统消息直接传递父代理已渲染好的字节(bytes),而不是重新生成。为什么?因为 Anthropic API 有 prompt cache 机制——如果发送的字节序列完全一致,API 可以跳过重复的处理。重新生成即使内容相同,时间戳等细节可能不同,就会导致 cache miss。这个优化让子代理的启动速度大幅提升。

// forkSubagent.ts - 传递已渲染的字节
const systemPrompt = parentContext.renderedSystemPrompt
// ✅ 直接传递已渲染的字节 → prompt cache 命中
// ❌ 不要重新调用 renderSystemPrompt() → cache miss

代理不能无限分裂

就像公司规定'经理可以招人,但新员工不能再招人'——防止组织无限膨胀

Claude Code 如何防止子代理创建子子代理,无限递归下去?答案很巧妙:子代理通过检查自己的历史消息中是否包含特定标记来判断'我是不是子代理'。如果是,就拒绝创建下一级。这不需要额外的计数器或配置——利用已有的消息结构就实现了递归保护。

Buddy 宠物用哈希决定命运

就像用身份证号尾数决定抽奖号码——看起来随机,但同一个人永远得到同一个结果

Buddy 宠物的物种不是随机生成然后存起来的——它是用用户 ID 的哈希值通过确定性伪随机数生成器(mulberry32)计算出来的。同一个用户永远得到同一种宠物,但分布在统计上是均匀的。不需要数据库,不需要网络,离线也能工作。

// mulberry32 确定性 PRNG
function mulberry32(seed: number) {
  return function() {
    seed |= 0; seed = seed + 0x6D2B79F5 | 0
    let t = Math.imul(seed ^ seed >>> 15, 1 | seed)
    t = t + Math.imul(t ^ t >>> 7, 61 | t) ^ t
    return ((t ^ t >>> 14) >>> 0) / 4294967296
  }
}
// 用户ID → 哈希 → 种子 → 固定的物种

模块架构图

加载架构图...
核心文件
tools/AgentTool/AgentTool.ts600 LOC

Agent 工具主实现

tools/AgentTool/forkSubagent.ts400 LOC

子代理分叉逻辑

tools/AgentTool/agentMemory.ts300 LOC

代理内存管理

tools/AgentTool/agentColorManager.ts200 LOC

颜色编码显示

utils/coordinator/1,000 LOC

KAIROS 协调器

utils/swarm/800 LOC

Swarm 多代理框架

commands/agents/500 LOC

Agent 管理命令

数据流程
1
主代理请求
需要并行处理的任务
2
创建子代理
分叉新进程
3
环境隔离
可选 worktree 隔离
4
执行任务
子代理独立工作
5
汇报结果
返回到主代理

关键代码

加载代码...

深入解析

子代理是 Claude Code 处理复杂任务的关键机制——将大任务分解为可并行的小任务,每个子代理独立运行。

Explore 类型代理专门用于快速搜索代码库(只有读取工具),Plan 类型用于设计实现方案(同样只读),general 类型拥有完整工具集。

KAIROS (coordinator) 是高级自主规划系统,支持多步规划和自我反思循环——AI 会评估自己的计划质量并迭代改进。

Swarm 框架支持多个代理之间的消息传递和协调,可以让多个子代理同时处理同一个大型重构任务的不同部分。

子代理创建时,系统消息(system prompt)不是重新生成的,而是直接传递父代理已渲染好的字节。这样做是为了命中 Anthropic API 的 prompt cache——相同的字节序列可以被缓存,避免重复计算。

子代理通过检查历史消息中的标记来判断自己是否是子代理。如果发现自己已经是子代理,就不会再创建下一级子代理——防止无限递归导致资源耗尽。

每个子代理有独立的颜色编码(agentColorManager),在终端 UI 中用不同颜色区分,用户可以直观看到哪个代理在做什么。

Worktree 隔离让每个子代理在独立的 git worktree 中工作,修改互不干扰。任务完成后,变更可以合并回主分支。