Subagents通信机制:SendMessage详解

子代理间的消息通信机制

一、SendMessage的基本用法

SendMessage 是 Claude Code 子代理(subagent)系统中用于消息传递的核心机制。它允许主代理(parent agent)向指定的子代理发送消息,也支持子代理之间进行通信。理解 SendMessage 是掌握子代理协作模式的基础。

to 参数:指定接收消息的子代理名称

to 参数用于指定消息的接收者。它可以是一个具体的子代理名称(如 "code_reviewer"),也可以是一个特殊标识符。当主代理需要向特定子代理分配任务时,通过 to 参数精确指定目标。如果 to 参数指向一个不存在的子代理,系统会返回投递失败的错误信息。在实际应用中,子代理名称通常在系统架构中预先定义,主代理根据任务类型选择对应的子代理进行通信。

summary 参数:消息预览(显示在UI中)

summary 参数提供消息的简短预览,主要用于用户界面显示。当主代理向子代理发送消息时,summary 内容会展示在 UI 的消息列表中,让用户可以快速了解消息的主题和用途,而无需查看完整的消息内容。summary 应该保持简洁明了,通常不超过一句话,准确概括消息的核心意图。例如 "请求代码审查:处理 login 模块" 或 "通知:数据采集任务已完成"。

message 参数:消息内容(文本或JSON)

message 参数是消息的实际内容,可以包含文本字符串或者结构化的 JSON 数据。文本消息适合传递简单的指令或信息;JSON 消息则适用于需要结构化数据的场景,协议消息通常使用 JSON 格式,其中 type 字段标识消息类型。消息内容的大小在实际系统中有一定限制,过大的消息需要分片发送或通过引用传递。

主代理向子代理发送消息的流程

主代理调用 SendMessage 方法,传入 to(目标子代理名称)、summary(消息预览)和 message(消息内容)。消息进入投递队列,系统根据 to 参数查找目标子代理。消息在目标子代理的下一个处理轮次中被投递。子代理处理消息并可选地通过 SendMessage 回复。主代理收到回复后继续进行后续流程。整个过程是异步进行的,主代理和子代理各自独立运行在自己的执行上下文中。

// SendMessage 调用示例(伪代码) SendMessage( to: "code_reviewer", // 目标子代理名称 summary: "请求审查 auth 模块", // UI 预览文本 message: "请审查 auth 模块的代码变更" // 消息内容 )

二、消息类型详解

SendMessage 支持多种消息类型,不同类型的消息适用于不同的通信场景。理解消息类型的分类和用途,有助于设计合理的子代理通信架构。

文本消息:直接传递指令和内容

文本消息是最基础的消息类型,message 参数直接包含文本字符串。文本消息适用于传递简单的指令、问题或信息。接收方子代理需要对文本进行解析,理解其中的含义并做出响应。文本消息的优势在于简单直观,易于调试;缺点是没有固定的结构,解析依赖于双方约定的格式。在简单的协作场景中,文本消息足够满足需求。

// 文本消息示例 SendMessage( to: "data_fetcher", summary: "获取用户数据", message: "请从 API 获取 ID 为 12345 的用户数据 返回格式要求:JSON,包含 name、email、role 字段" )

JSON协议消息:结构化消息

JSON 协议消息使用结构化的 JSON 格式作为消息内容。相比文本消息,JSON 消息具有明确的数据结构,便于程序解析和处理。JSON 消息通常包含 type 字段用于标识消息类型,以及其他字段携带具体数据。协议消息要求双方严格遵守约定的数据格式,这种约束虽然增加了定义成本,但大幅提高了通信的可靠性和可维护性。

// JSON 协议消息示例 SendMessage( to: "task_runner", summary: "执行数据分析任务", message: JSON.stringify({ type: "task_execution", task_id: "TASK-2026-001", action: "analyze", parameters: { dataset: "sales_q1", metrics: ["revenue", "growth_rate"] }, priority: "high" }) )

shutdown_request:关闭子代理请求

shutdown_request 是一种特殊的协议消息,主代理通过它请求子代理进行关闭。当系统需要回收资源、任务完成或者出现异常时,主代理发送 shutdown_request 消息给指定的子代理。消息中可以包含关闭原因和清理指示。子代理收到 shutdown_request 后,会执行相应的清理操作(如释放资源、保存状态、关闭连接等),然后回复 shutdown_response 确认关闭。

shutdown_response:关闭子代理响应

shutdown_response 是子代理对 shutdown_request 的回复消息。子代理在完成清理工作后,发送 shutdown_response 告知主代理关闭操作已完成。shutdown_response 可以包含清理结果的状态信息(成功或失败)以及任何需要汇报的清理细节。主代理收到 shutdown_response 后,确认子代理已经安全关闭,然后进行后续的资源回收操作。

plan_approval_response:计划审批响应

plan_approval_response 是子代理请求主代理审批计划时使用的协议消息。当子代理需要执行重要操作或需要主代理确认决策时,它先发送一个 plan_approval_request 给主代理。主代理审阅计划后,通过 plan_approval_response 回复批准(approved)或拒绝(rejected)的决定。这种机制确保了关键决策始终由上级代理控制,避免子代理越权执行重要操作。

消息类型发送者接收者用途
文本消息主代理/子代理子代理/主代理传递简单指令和信息
JSON协议消息主代理/子代理子代理/主代理结构化数据传输
shutdown_request主代理子代理请求子代理关闭
shutdown_response子代理主代理确认子代理已关闭
plan_approval_response主代理子代理审批子代理的计划请求

三、一对一通信模式

一对一通信是子代理系统中最常见的通信模式,涵盖主代理与子代理之间以及子代理与子代理之间的直接通信。这种模式保证了消息的精确投递和信息的定向传递。

主代理到特定子代理:指定子代理名称发送任务

主代理通过 to 参数指定特定的子代理名称,将任务直接发送给该子代理。这是最基本的工作分配方式。主代理维护着一个子代理注册表,其中包含每个子代理的名称、能力和状态信息。当主代理需要执行某个任务时,它根据任务类型选择合适的子代理,并通过 SendMessage 将任务委托出去。子代理独立完成任务后,将结果返回给主代理。这种模式实现了任务的解耦和并行处理。

子代理到主代理:完成任务后汇报结果

子代理在完成任务后,通过 SendMessage 向主代理汇报结果。汇报内容通常包括任务执行状态(成功/失败)、输出数据、遇到的错误以及后续建议。主代理收到子代理的汇报后,根据结果决定下一步行动:如果任务成功则继续后续流程;如果失败则可能重新分配任务或采取补救措施。子代理汇报结果时,to 参数通常设置为父代理的标识或直接使用预设的通信渠道。

子代理到子代理:同级之间协作通信

子代理之间也可以进行直接通信,实现同级协作。例如,一个数据采集子代理完成数据抓取后,可以直接将数据发送给数据分析子代理进行处理,而无需经过主代理中转。这种同级通信方式可以减少主代理的通信负担,提高系统效率。同级通信同样遵循消息队列和投递的规则,发送方子代理和接收方子代理必须存在于同一个子代理系统中,并且名称可被路由解析。

消息的投递保证机制

消息投递保证机制确保 SendMessage 发送的消息能够可靠地到达目标。系统采用至少一次投递(at-least-once delivery)策略,即消息会被反复尝试直到成功投递或被明确标记为失败。投递失败时,发送方会收到错误通知,可以根据错误类型决定重试策略。对于关键消息,系统还支持消息确认(acknowledgment)机制,接收方处理完消息后发送确认,发送方只有在收到确认后才认为消息处理完毕。

四、消息路由和投递

消息路由是 SendMessage 机制中的核心环节,负责将消息从发送方准确地传递到目标子代理。路由系统基于子代理的名称和注册信息进行消息转发。

消息根据 to 参数路由到目标子代理

当 SendMessage 被调用时,消息路由系统首先解析 to 参数,在子代理注册表中查找匹配的子代理。如果找到唯一的匹配项,消息被放入该子代理的消息队列中。如果找不到匹配项或存在多个匹配项,系统会返回路由错误。路由解析支持通配符和模式匹配,在某些实现中可以匹配一组符合特定命名规则的子代理。

消息在目标子代理的下一个轮次自动投递

每个子代理都有一个消息队列,进入队列的消息将在子代理的下一个处理轮次中被自动投递。子代理的运行循环(event loop)会检查消息队列,按顺序取出消息进行处理。这种机制保证了子代理在处理完当前任务后能够及时收到新的消息,同时也避免了消息处理的中断和竞争条件。

消息队列和顺序保证

消息队列为每个子代理维护一个 FIFO(先进先出)的消息列表。同一发送方发往同一接收方的消息按照发送顺序被处理,这保证了消息的有序性。但不同发送方发往同一接收方的消息,其顺序取决于消息到达队列的时间。对于需要严格顺序保证的场景,发送方可以使用序列号或依赖关系标记来控制消息的执行顺序。

消息发送失败的错误处理

当消息发送失败时,系统会生成包含错误信息的响应。常见错误场景包括:目标子代理不存在或已关闭、消息队列已满、网络通信故障等。发送方可以根据错误类型采取不同的应对策略:对于临时性错误(如队列满),可以等待后重试;对于永久性错误(如目标不存在),则需要向用户报告或调整发送逻辑。系统通常内置自动重试机制,对于可恢复的错误会在一定时间间隔内自动重试数次。

设计建议:在实际的 subagent 系统设计中,建议为所有消息包含一个唯一的消息 ID 和时间戳,便于追踪和调试消息流。同时,应当为关键消息设置超时机制,防止消息丢失导致系统永久等待。

五、协议消息处理流程

协议消息是子代理通信中用于系统控制和管理的一类特殊消息,它们遵循固定的处理流程,确保系统的稳定运行和状态一致性。

shutdown_request 完整流程

shutdown_request 的处理流程包含以下步骤:主代理检测到需要关闭子代理(任务完成、系统关机或异常情况)。主代理构造 shutdown_request 消息(包含关闭原因和清理指示),并通过 SendMessage 发送给目标子代理。子代理接收 shutdown_request,解析关闭原因。子代理执行清理操作:保存当前状态、关闭打开的资源(文件句柄、网络连接等)、中止正在进行的任务。子代理构造 shutdown_response 消息(包含清理状态和结果详情),发送给主代理。子代理进入终止状态。主代理收到 shutdown_response,确认子代理已安全关闭。主代理回收子代理占用的系统资源。整个流程确保了子代理的优雅关闭,避免了资源泄漏和数据丢失。

// shutdown_request 处理流程(概念示例) 1. 主代理 → SendMessage(to: "worker_1", message: { type: "shutdown_request", reason: "任务完成", cleanup: ["save_state", "close_connections"] }) 2. 子代理收到消息,执行清理... 3. 子代理 → SendMessage(to: "parent", message: { type: "shutdown_response", status: "success", saved_state: "state_snapshot_2026.json", cleaned_resources: ["db_conn", "file_handle_3"] }) 4. 主代理确认关闭完成

plan_approval_response 完整流程

plan_approval_response 的处理流程涉及子代理和主代理之间的双向协商。子代理在执行过程中遇到需要主代理决策的关键节点。子代理构造 plan_approval_request 消息,包含计划详情、备选方案和推荐意见,发送给主代理。主代理收到请求后,审阅计划内容,评估风险和收益。主代理构造 plan_approval_response 消息,包含审批决定(approved/rejected)和审批意见,发送回子代理。如果计划被批准,子代理按照计划继续执行。如果计划被拒绝,子代理根据审批意见调整计划或上报更高级别的处理者。这种机制实现了对子代理行为的分级控制,既保留了子代理的自主执行能力,又确保了关键决策始终在可控范围内。

// plan_approval 流程(概念示例) 1. 子代理 → SendMessage(to: "parent", message: { type: "plan_approval_request", task: "外部API调用", plan: "调用第三方支付网关处理交易 #9987", risk_level: "high", alternatives: ["使用备用支付通道"] }) 2. 主代理审阅计划... 3. 主代理 → SendMessage(to: "payment_agent", message: { type: "plan_approval_response", decision: "approved", comments: "同意计划,请确保交易超时设置为30秒" }) 4. 子代理根据审批结果继续执行

核心要点总结:SendMessage 是子代理通信的基础设施,支持文本和 JSON 两种消息格式,覆盖一对一和一对多通信模式。通过 to 参数实现精确路由,借助消息队列保证投递可靠性和顺序性。协议消息(shutdown_request/shutdown_response/plan_approval_response)为系统提供了优雅的关闭和分级审批机制,是构建安全可靠的子代理系统的关键组件。理解 SendMessage 的工作原理对于设计复杂的子代理协作架构至关重要。