复杂任务处理机制分析

概述

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.ts 1366 会话级编排器:消息管理、压缩触发、文件快照、属性追踪
src/query.ts 2043 核心 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 关键工具

工具 文件 职责
EnterPlanModeTool packages/builtin-tools/src/tools/EnterPlanModeTool/ 进入规划模式,模型变为只读探索
ExitPlanModeV2Tool packages/builtin-tools/src/tools/ExitPlanModeV2Tool/ 呈现计划、请求批准、退出规划模式
VerifyPlanExecutionTool packages/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 任务工具集

工具 文件 职责
TaskCreateTool packages/builtin-tools/src/tools/TaskCreateTool/ 创建新任务到共享任务列表
TaskUpdateTool packages/builtin-tools/src/tools/TaskUpdateTool/ 更新状态/负责人/阻塞关系
TaskListTool packages/builtin-tools/src/tools/TaskListTool/ 列出所有任务(含状态、负责人、阻塞信息)
TaskGetTool packages/builtin-tools/src/tools/TaskGetTool/ 获取单个任务详情
TaskStopTool packages/builtin-tools/src/tools/TaskStopTool/ 停止运行中的后台任务
TaskOutputTool packages/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 Mode Agent 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 任务标记为完成时 结果通知、依赖解锁
TeammateIdle Teammate 完成所有任务进入空闲时 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.ts API 交互核心循环
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.tsx Agent 派生核心
src/utils/forkedAgent.ts Fork Agent 实现
packages/builtin-tools/src/tools/TeamCreateTool/ 创建团队
packages/builtin-tools/src/tools/TeamDeleteTool/ 删除团队
packages/builtin-tools/src/tools/SendMessageTool/ Agent 间消息

协作模式

文件 说明
src/coordinator/coordinatorMode.ts Coordinator Mode 核心
src/utils/agentSwarmsEnabled.ts Swarm 模式开关
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 蜂群协作"的完整能力谱系。

更多推荐