复杂任务处理机制分析

概述

Claude Code 通过 多层编排体系 处理复杂任务,核心机制包括:

层级机制核心职责
基础层QueryEngine + queryLoop多轮对话、工具调用循环、上下文压缩
规划层Plan Mode(进入/退出规划模式)先设计方案,再执行编码
任务层Task System V2(创建/更新/列表/认领)任务拆分、状态追踪、依赖管理
Agent 层AgentTool(同步/异步子 Agent 派生)并行执行子任务、隔离上下文
协作层Coordinator Mode / Agent Swarms多 Agent 协作编排、团队通信

一、基础层:QueryEngine 多轮对话引擎

1.1 架构概览

用户输入
  ↓
QueryEngine.submitMessage() [src/QueryEngine.ts:217]
  ↓ 处理用户输入、记录 session、更新 mutableMessages
queryLoop() [src/query.ts:392]
  ↓ while(true) 循环
  ├── 构建 API 请求(system prompt + messages + tools)
  ├── 调用模型 API (callModel)
  ├── 收到响应 → 如果包含 tool_use → 执行工具 → 追加结果 → continue
  └── 如果没有 tool_use → 返回 Terminal(reason: 'completed')

1.2 关键文件

文件行数职责
src/QueryEngine.ts1366会话级编排器:消息管理、压缩触发、文件快照、属性追踪
src/query.ts2043核心 API 交互循环:请求构建、流式处理、工具调用分发

1.3 多轮对话管理

  • mutableMessages(QueryEngine.ts:194):跨轮次共享的消息数组
  • submitMessage() 方法每次处理一个用户轮次,将新消息追加到 mutableMessages
  • Turn 计数:QueryEngine 内部 turnCount(line 769)和 queryLoop 内部 state.turnCount(query.ts:428)双重追踪

1.4 上下文压缩(Compaction)

当上下文接近模型窗口限制时,系统自动触发多层压缩:

queryLoop 每次迭代
  ├── Snip Compact(HISTORY_SNIP feature flag)
  │   └── 移除/摘要个别工具结果块,无需 LLM 调用
  ├── Micro Compact
  │   └── 轻量级压缩,在 autoCompact 之前执行
  └── Auto Compact(核心)
      ├── 检查 token 数是否超过阈值(context window - output reserve - buffer)
      ├── 调用 compactConversation() → LLM 摘要整个对话
      └── 生成压缩边界消息 → 旧消息可被 GC 释放

关键文件

  • src/services/compact/autoCompact.ts — 自动压缩触发器
  • src/services/compact/compact.ts — 压缩核心实现
  • src/services/compact/microCompact.ts — 微压缩
  • src/services/compact/prompt.ts — 压缩 prompt 构建
  • src/services/compact/sessionMemoryCompact.ts — 会话记忆压缩

预测性压缩(query.ts:837-873):在实际超过窗口之前,预估本轮增长量,提前触发压缩。


二、规划层:Plan Mode(规划模式)

2.1 核心流程

用户提出复杂需求
  ↓
模型自主判断 → 调用 EnterPlanModeTool
  ↓ 进入只读探索阶段
  ├── 探索代码库结构
  ├── 识别关键模式
  ├── 设计实现方案
  └── 制定分步计划
  ↓
调用 ExitPlanModeV2Tool → 呈现计划给用户批准
  ↓ 用户批准后
进入实施阶段 → 使用 AgentTool/TaskCreateTool 分配工作
  ↓
调用 VerifyPlanExecutionTool → 自检所有步骤是否完成

2.2 关键工具

工具文件职责
EnterPlanModeToolpackages/builtin-tools/src/tools/EnterPlanModeTool/进入规划模式,模型变为只读探索
ExitPlanModeV2Toolpackages/builtin-tools/src/tools/ExitPlanModeV2Tool/呈现计划、请求批准、退出规划模式
VerifyPlanExecutionToolpackages/builtin-tools/src/tools/VerifyPlanExecutionTool/执行后自检:确认所有步骤已完成

2.3 设计要点

  • 只读约束:规划模式下模型不能写文件、不能执行命令
  • 用户批准门控:ExitPlanModeV2Tool 需要用户确认计划后才能进入编码阶段
  • Agent 限制:EnterPlanModeTool 明确禁止在子 Agent 上下文中调用(if (context.agentId) throw ...
  • Swarm 集成:当 Agent Swarms 启用时,ExitPlanModeV2Tool 会在输出中提示模型使用 TeamCreate 并行化工作
  • 队友审批流:当 Teammate 处于 plan_mode_required 模式时,ExitPlanModeV2Tool 通过 Mailbox 向 Team Lead 发送审批请求

三、任务层:Task System V2

3.1 核心机制

Task System 是所有多 Agent 协作的底层基础设施,提供共享任务列表 + 状态管理 + 依赖追踪

TaskCreateTool → 创建任务(pending 状态)
  ↓
Agent/Teammate 认领 → TaskUpdateTool(status: "in_progress")
  ↓
执行工作...
  ↓
完成 → TaskUpdateTool(status: "completed") → 触发 TaskCompleted Hook
  ↓ 依赖此任务的其他任务自动解锁

3.2 任务工具集

工具文件职责
TaskCreateToolpackages/builtin-tools/src/tools/TaskCreateTool/创建新任务到共享任务列表
TaskUpdateToolpackages/builtin-tools/src/tools/TaskUpdateTool/更新状态/负责人/阻塞关系
TaskListToolpackages/builtin-tools/src/tools/TaskListTool/列出所有任务(含状态、负责人、阻塞信息)
TaskGetToolpackages/builtin-tools/src/tools/TaskGetTool/获取单个任务详情
TaskStopToolpackages/builtin-tools/src/tools/TaskStopTool/停止运行中的后台任务
TaskOutputToolpackages/builtin-tools/src/tools/TaskOutputTool/读取后台任务的输出

3.3 任务类型

7 种任务类型定义在 src/tasks/types.ts

类型运行位置适用场景
LocalAgentTask本地子进程标准子 Agent 任务
LocalShellTask本地 shell后台 shell 命令
InProcessTeammateTask同进程内轻量级进程内队友
RemoteAgentTask远程服务器分布式 Agent(CCR)
DreamTask后台静默后台自主整理记忆
LocalWorkflowTask本地工作流编排
MonitorMcpTask本地MCP 监控任务

3.4 核心特性

  • 任务依赖(Blocking):通过 addBlocks/addBlockedBy 参数建立任务间依赖,被阻塞的任务在依赖完成前无法开始
  • Hook 系统
    • TaskCreated — 新任务创建时触发(可用于自动分配)
    • TaskCompleted — 任务完成时触发(结果通知、依赖解锁)
    • TeammateIdle — Teammate 空闲时触发(Lead 重新分配)
  • 验证提醒(TaskUpdateTool:326-349):当主 Agent 完成了 3+ 个任务中的最后一个,且无任务提及 "verif" 时,自动提醒派生验证 Agent
  • 持久化:任务状态通过文件系统存储(~/.claude/tasks/{team-name}/),进程重启可恢复

四、Agent 层:AgentTool 子 Agent 派生

4.1 核心流程

AgentTool(packages/builtin-tools/src/tools/AgentTool/AgentTool.tsx,1609 行)是子 Agent 派生的统一入口。

派生路径路由
AgentTool.call()
  ├── 有 teamName + name → spawnTeammate()(Swarm 多 Agent)
  ├── 无 subagent_type + forkGate → FORK_AGENT(共享父级 system prompt)
  └── 有 subagent_type → 查找 agent definition → 标准子 Agent
同步 vs 异步执行
AgentTool 执行决策(line 709-716)
  ├── 同步(默认):阻塞等待子 Agent 完成
  │   └── 支持自动后台化:太长时自动转入后台
  └── 异步(满足以下任一条件):
      ├── run_in_background === true
      ├── agent definition 强制 background
      ├── Coordinator Mode
      ├── Fork 子 Agent
      └── Proactive Mode 激活

4.2 同步执行细节

  1. 创建 AbortController 和 SubagentContext
  2. 调用 runAgent() → 返回异步迭代器
  3. 逐条处理消息:追踪进度、转发 bash 进度到父 SDK
  4. 支持 自动后台化backgroundPromise 竞态,执行太长时自动转后台
  5. 完成后 finalizeAgentTool() + 清理 worktree

4.3 异步执行细节

  1. 通过 registerAsyncAgent() 在 AppState 中注册任务
  2. 注册名称到 agentNameRegistry(用于 SendMessage 路由)
  3. 包装在 runWithAgentContext() 中执行
  4. Fire-and-forget:父 Agent 立即返回 { status: 'async_launched' }
  5. 异步 Agent 完成后通过 <task-notification> XML 通知父 Agent

4.4 关键约束

  • 工具过滤:子 Agent 的工具集根据类型过滤(例如 Coordinator Worker 只能使用 Bash + Read + Edit)
  • 递归防护:子 Agent 不能递归创建新的子 Agent(Fork 子 Agent 有显式守卫)
  • 上下文隔离:每个子 Agent 有独立的上下文窗口,不共享父 Agent 的对话历史
  • 权限委托:子 Agent 的权限由父 Agent 预设,Swarm 模式下通过 Mailbox 路由到 Team Lead

五、协作层:Coordinator Mode 与 Agent Swarms

5.1 两种模式的架构对比

维度Coordinator ModeAgent Swarms
门控feature('COORDINATOR_MODE') + 环境变量CLAUDE_CODE_EXPERIMENTAL_AGENT_TEAMS=1
拓扑星型:Coordinator 居中,Worker 外围星型+P2P 混合:Team Lead 协调 + Teammate 间直接通信
角色明确分工:Coordinator 编排、Worker 执行Team Lead 协调 + Teammate 自主认领任务
通信<task-notification> 定向通知Mailbox 消息系统(message/broadcast)
任务分配Coordinator 显式分配给指定 Worker共享任务列表 + 竞争认领

5.2 Coordinator Mode(协调者模式)

核心设计
  • Coordinator 的工具集被精简为 4 个:Agent(启动 Worker)、SendMessage(向已有 Worker 发指令)、TaskStop(停止 Worker)、subscribe_pr_activity
  • Coordinator 不能写代码、读文件、执行命令 — 只负责理解需求、分配任务、综合结果
  • Worker 的工具通过 getCoordinatorUserContext() 动态注入到 System Prompt
核心约束:先理解,再分配
反模式(禁止):
  "Based on your findings, fix the auth bug"
  → 把理解的责任推给 Worker

正确做法:
  "Fix the null pointer in src/auth/validate.ts:42.
   The user field on Session (src/auth/types.ts:15) is undefined
   when sessions expire. Add a null check before user.id access."
  → Coordinator 自己理解问题,给出精确指令
通信协议

Worker 完成后,Coordinator 收到 XML 格式通知:

<task-notification>
  <task-id>agent-a1b</task-id>
  <status>completed|failed|killed</status>
  <summary>Agent "Investigate auth bug" completed</summary>
  <result>Found null pointer in src/auth/validate.ts:42...</result>
  <usage>
    <total_tokens>N</total_tokens>
    <tool_uses>N</tool_uses>
    <duration_ms>N</duration_ms>
  </usage>
</task-notification>
Scratchpad 共享知识库
  • Worker 可以自由读写 Scratchpad 目录(无需权限审批)
  • Worker A 的研究结果写入 Scratchpad → Worker B 直接读取
  • 实现跨 Worker 知识传递,无需经过 Coordinator 中转

5.3 Agent Swarms(蜂群模式)

架构组件
┌─────────────┐     ┌──────────────────┐
│  Team Lead  │────▶│  Shared Task List │
│  (主会话)    │     │  (文件锁保护)      │
└─────────────┘     └──────────────────┘
       │                      │
       │              ┌───────┴───────┐
       │              │       │       │
       ▼              ▼       ▼       ▼
┌──────────┐   ┌──────────┐   ┌──────────┐
│Teammate A│   │Teammate B│   │Teammate C│
│独立上下文  │◀──│ Mailbox  │──▶│独立上下文  │
└──────────┘   └──────────┘   └──────────┘
  • Team Lead:创建团队、分配任务、综合结果
  • Teammate:独立 Claude Code 实例,各自拥有独立的上下文窗口
  • Task List:共享任务列表,Teammate 竞争认领和完成
  • Mailbox:消息系统,支持 Teammate 间直接通信
任务认领与竞争
Teammate A 发现 task #3 是 pending
Teammate B 同时发现 task #3 是 pending
  ↓ 两者同时尝试 TaskUpdate(task #3, {status: "in_progress"})
文件锁保证原子性:
  - 第一个写入者获得 owner 锁定
  - 第二个写入者收到 already_claimed 错误
  ↓
获得任务的 teammate 执行工作
  ↓
完成后 TaskUpdate(task #3, {status: "completed"})
  → 依赖此任务的其他任务自动解锁
  → tool_result 提示 "Call TaskList to find your next task"
Mailbox 消息系统
模式作用场景
message定向发送给指定 Teammate传递具体指令、请求协作
broadcast广播给所有 Teammate全局通知、状态同步

关键特性:

  • 自动投递到目标 Teammate 的对话上下文
  • TeammateIdle Hook:Teammate 空闲时自动通知 Team Lead
  • 直接通信:Teammate 间可直接通信,无需经过 Lead 中转
生命周期管理
Teammate 异常退出
  ↓
unassignTeammateTasks()
  → 扫描任务列表,找到 owner === teammateName 的未完成任务
  → 重置为 pending + owner=undefined
  ↓
Team Lead 感知:
  1. 任务状态变化(pending 重置)
  2. Mailbox 空闲通知(TeammateIdle hook)
  ↓
Team Lead 重新分配任务或创建新 Teammate
限制
  • 不支持嵌套团队(Teammate 不能再创建子团队)
  • 每 session 一个团队
  • Team Lead 创建后不可更换
  • in-process Teammate 进程重启后状态丢失

详细可见往期文章。

5.4 Hook 事件系统

Agent Teams 提供三个关键 Hook 事件:

Hook触发时机典型用途
TaskCreated新任务添加到任务列表时自动分配、优先级排序
TaskCompleted任务标记为完成时结果通知、依赖解锁
TeammateIdleTeammate 完成所有任务进入空闲时Lead 重新分配、动态扩缩容

5.5 场景选择指南

场景推荐模式原因
"重构认证系统,需要多模块协调"Coordinator需要集中决策,Worker 间有依赖
"修复 10 个独立的 lint 警告"Agent Teams任务独立,Teammate 可完全并行
"研究方案 A 和方案 B,然后选一个实现"Coordinator先并行研究,再集中决策
"在大仓库中搜索所有 TODO 并分类"Agent Teams无依赖,各自领任务即可

六、完整工作流示例

6.1 典型复杂任务处理流程

用户: "重构用户认证模块"
  ↓
【规划层】模型判断任务复杂 → 调用 EnterPlanModeTool
  ↓ 只读探索阶段
  1. 分析 src/auth/ 目录结构
  2. 识别依赖模块和接口
  3. 制定重构计划(5 个子任务)
  ↓
【规划层】调用 ExitPlanModeV2Tool → 呈现计划给用户
  ↓ 用户批准
【基础层】QueryEngine 开始执行
  ↓
【协作层 - Agent Swarms】
  ├── TeamCreate → 创建团队
  ├── TaskCreate × 5 → 拆分为 5 个独立任务
  ├── AgentTool × 3 → 派生 3 个 Teammate
  │   ├── Teammate A 认领 task #1、#3
  │   ├── Teammate B 认领 task #2、#4
  │   └── Teammate C 认领 task #5
  │   ↓ 各项并行执行
  │   ↓ Teammate 间通过 Mailbox 协调接口变更
  └── Team Lead 监控进度、综合结果
  ↓
【基础层】VerifyPlanExecutionTool → 自检
  ↓
所有任务完成 → 返回用户最终结果

6.2 上下文压缩介入时机

任务执行过程中
  ↓ token 消耗持续增长
Micro Compact → 移除冗余工具输出
  ↓
预测性检测 → 预估本回合增长会超过窗口
  ↓
Auto Compact → LLM 摘要对话 → 释放旧消息
  ↓
继续执行后续任务(使用压缩后的上下文)

七、关键文件索引

核心引擎

文件说明
src/QueryEngine.ts会话级编排器
src/query.tsAPI 交互核心循环
src/query/transitions.ts查询状态转换
src/query/loopHelpers.ts循环辅助函数

上下文压缩

文件说明
src/services/compact/autoCompact.ts自动压缩触发
src/services/compact/compact.ts压缩核心实现
src/services/compact/microCompact.ts微压缩
src/services/compact/prompt.ts压缩 prompt
src/services/compact/sessionMemoryCompact.ts会话记忆压缩

规划模式

文件说明
packages/builtin-tools/src/tools/EnterPlanModeTool/进入规划模式
packages/builtin-tools/src/tools/ExitPlanModeV2Tool/退出规划模式
packages/builtin-tools/src/tools/VerifyPlanExecutionTool/验证计划执行

任务系统

文件说明
packages/builtin-tools/src/tools/TaskCreateTool/创建任务
packages/builtin-tools/src/tools/TaskUpdateTool/更新任务
packages/builtin-tools/src/tools/TaskListTool/列出任务
packages/builtin-tools/src/tools/TaskGetTool/获取任务
packages/builtin-tools/src/tools/TaskStopTool/停止任务
packages/builtin-tools/src/tools/TaskOutputTool/读取任务输出
src/utils/tasks.js任务 CRUD 核心
src/tasks/types.ts任务类型定义

Agent 系统

文件说明
packages/builtin-tools/src/tools/AgentTool/AgentTool.tsxAgent 派生核心
src/utils/forkedAgent.tsFork Agent 实现
packages/builtin-tools/src/tools/TeamCreateTool/创建团队
packages/builtin-tools/src/tools/TeamDeleteTool/删除团队
packages/builtin-tools/src/tools/SendMessageTool/Agent 间消息

协作模式

文件说明
src/coordinator/coordinatorMode.tsCoordinator Mode 核心
src/utils/agentSwarmsEnabled.tsSwarm 模式开关
packages/swarm/Swarm 解耦模块
docs/agent/coordinator-and-swarm.mdx协作模式文档

八、总结

Claude Code 的复杂任务处理是一个分层递进的体系:

  1. 基础层(QueryEngine)提供了稳定可靠的多轮对话引擎和智能上下文压缩,是所有复杂任务的执行基础
  2. 规划层(Plan Mode)在编码前引入"先想后做"的设计阶段,降低大型任务的返工率
  3. 任务层(Task System V2)提供细粒度的任务拆分、状态追踪和依赖管理,是并行化的前提
  4. Agent 层(AgentTool)实现子 Agent 派生与上下文隔离,使并行执行成为可能
  5. 协作层(Coordinator/Swarms)提供两种互补的多 Agent 编排模式,分别适用于集中决策和自主协作场景

五层设计相互配合,形成从"单 Agent 顺序执行"到"多 Agent 蜂群协作"的完整能力谱系。

更多推荐