---
summary: "子代理如何报告其结果、公告上下文块以及为什么首选 sessions_history"
title: "分代理公告"
read_when:
- "您正在调试缺失或重复的完成"
- "您需要公告上下文块中的字段"
- "您正在从代理轮流中读取子记录"
---
## 通知
子代理通过完成交付进行报告:
- 将完成的孩子成绩交给请求者;交付不会要求孩子生成单独的公告。
- Runs 与 `expectsCompletionMessage: false` 一起生成,完全跳过完成交付;运行注册表将其交付记录为不需要的。
- 子代理必须返回有意义的结果或具体的阻止程序。精确的子 `NO_REPLY` 响应或无输出无法满足丢失子结果并触发正常的丢失答案恢复。没有可见结果的保留完成将作为 `(no output)` 传递给请求者,包括当多个子结果收集在一起时。
- 通过记录完成和源消息传递事实来抑制重复传递。子代理和内部父级审核轮次不使用静默令牌进行重复数据删除。
默认情况下,交付取决于请求者深度:
- 顶级请求者会话使用后续 `agent` 调用。外部对话使用`deliver=true`; WebChat 对话与 `deliver=false` 保持会话状态。
- 嵌套的请求者子代理会话接收内部后续注入(`deliver=false`),这样编排器就可以在会话内综合子级结果。
- 如果嵌套的请求者子代理会话已消失,OpenClaw 会在可用时回退到该会话的请求者。
请求者回合的捕获源拥有完成路由,包括 `sessions_yield` 之后和子暂停通知。 WebChat 源不会从会话继承先前的外部目标。如果没有捕获的来源,则存储的交付路线仍然是后备;显式外部路由仍受支持,而无需清除该历史记录。
对于顶级请求者会话,完成模式直接传递首先解析任何绑定的 conversation/thread 路由和挂钩覆盖,然后从请求者的来源和兼容的存储路由中填充缺失的通道目标字段。即使完成源仅标识通道,这也会使完成保持在正确的 chat/topic 上。当覆盖选择不同的聊天或主题时,它不会继承先前路由的线程。保留来自绑定或钩子的显式线程。
在构建嵌套完成结果时,子完成聚合的范围仅限于当前请求者运行,从而防止过时的先前运行的子输出泄漏到当前公告中。当通道适配器上可用时,公告回复会保留 thread/topic 路由。
在 `sessions_yield` 之后,冻结批次等待其自己的子代及其后代定居。来自较早请求者轮流的仍在运行的子进程不会延迟该批次的结果;较早的批次保留其自己的完成唤醒。
完成输入在压缩和运行时上下文消息中保留自己的回合标识。如果转录持久性拒绝完成,因为其键入的输入属于封闭回合,则传递会记录永久失败并出现错误。它不会重试其他模型或继续安排相同的完成。
直接子结果传送会在请求者会话上排队的工作之后记录其副本镜像。发送无需等待该附加即可完成,因此等待其子级的请求者可以恢复。这些标记的镜子记录历史,而无需关闭打开的键控输入;普通的最后回复仍然结束了。成功发送后,镜像仍会尽力记录。
阻止完成警告会识别子运行并在重试时保留具体的交付错误。即使其接收回调失败,已确认的移交仍保持已交付状态;清理不得重播已消耗的结果。报告传送结果之前的失败遵循与直接发送相同的重试性策略。
重新启动检查点调节会在清除主动恢复索赔之前保留已确认的交付证据。已发送的回复、故意抑制的发送以及已处理的静默检查点仍然是不同的。单独运行 ID 的终端并不能证明请求者已收到其结果。
当未确认发送时,抄本作者声明更改仍可重试。如果本地重试已用尽,则完成仍符合有限请求者恢复的条件。永久投递拒绝仍然会停止恢复,包括当它们被作者声明错误包裹时。
如果直接消息文本回退中的块失败或在发送较早的块后中止,则 OpenClaw 会记录不完整的传送。它会停止自动重试,以避免重复接收者已收到的块。成功孩子的成绩仍然可以恢复。
### 私人父完成
在 `sessions_spawn` 上设置 `completionTarget: "parent"` 以在原始请求者会话的私有回合中返回结果。家长审查结果,继续未完成的工作,并解决审查后的输入。输入所有者标记为可选的私有处理可以静默完成;它本身并不能满足出色的用户回复。 OpenClaw 不会自动将子结果、父最终结果或生成的媒体发送到通道。家长仍然可以选择通过其允许的工具发送消息。
如果父进程在等待私有子进程时调用 `sessions_yield`,则收益会将对话交还给它。当这些孩子安定下来后,父母会根据正常回复规则恢复并回答原始对话:通过自动回复,传递最终文本;对于 `visibleReplies: "message_tool"`,它必须使用 `message` 工具发送答案,并且纯最终文本保留在内部。子结果保留内部输入,并且不会代表子结果自动发送任何内容。恢复的轮次保持绑定到生成子级的父会话:如果在父级恢复之前重置该会话(例如使用 `/new`)或替换该会话,则结果将被丢弃并且不会发送任何内容。
此选项仅支持隐藏、本机、一次性运行。它不能与 ACP、`collect: true`、`visible: true`、`thread: true`、`mode: "session"` 或 `expectsCompletionMessage: false` 组合使用。它不会更改默认完成模式。
完成的私有结果保留在注册表中,直到产卵父轮稳定下来。正常的家长完成会发布每个准备好的结果以供私人审查; `sessions_yield` 将结果交给其现有的子批次。重置或删除的父进程不会将结果传输到另一个会话。当已解决的批次包含私有结果时,子结果将保留为父级审查的私有输入或产生的延续;普通兄弟姐妹保留各自的完成交付。
在产生之前检查已完成子级的状态不会消耗或使其私有结果无效。
等待生成父轮次不会消耗私有结果的传递重试窗口。正常的父完成在释放结果时启动该窗口。 `sessions_yield`后,该批次已交割;单个子清理不能过期或暂停该批次的结果。
会话控制仍然需要当前调用者的权限。完成报告不会转让原始人员的权限。与原始请求者轮次保持授权清理,并在适当时使用轮次后自存档,而不是请求仅通知轮次来获取所有者权限。将 `sessions_send` 与 `mode: "notify"` 结合使用以进行仅上下文更新;正常的对等后续仍然遵循目标对话的回复要求。
使用在整个运行过程中支持此选项的构建。较旧的版本无法恢复私人完成交接,并且可能会在降级后丢弃它们;现有的会话记录保持独立。
### 通知上下文
announce 上下文会被规范化为稳定的内部事件块:
| 字段 | 来源 |
| -------------- | -------------------------------------------------------------------------------------------------------- |
| 来源 | `subagent` 或 `cron` |
| 会话 ID | 子会话 key/id |
| 类型 | announce 类型 + 任务标签 |
| 状态 | 根据运行时结果推导(`ok`、`error`、`timeout` 或 `unknown`)——**不是**根据模型文本推断 |
| 结果内容 | 子代理最新的可见 assistant 文本 |
| 后续操作 | 指示审查结果、继续未完成的工作并报告结果 |
结果是孩子对于已完成的运行的完整可见的最终答案,包括 ACP- 支持的运行和 CLI 后备成绩单。同一子会话中的后续轮次不会取代该运行的答案。一旦清理和请求者义务得到解决,内存中的注册表就会保留简短的任务预览和生命周期元数据。完整的任务和结果文本保留在 SQLite 中,并为选定的读取或以后的突变加载。待交付、暂停交付、取消和已放弃的工作将保留其有效负载,直到这些义务得到解决。
如果同一运行的完成收据未按顺序到达,则具有较新生产者结束时间的收据拥有回复。相同的结束时间保留第一个接受的回复;具有较新结束时间的更正可以取代它。
OpenClaw 在同时传递多个结果时保留了及时的数据转义和稳定的顺序。完成结果有严格的共享 160,000 个字符上限,包括转义和框架。小答案保持不变;较大的答案保留其开头和一个明确的截断标记,该标记指向带有子会话密钥的 `sessions_history`。 `sessions_history` 将文本字段截断为 4,000 个字符;该指针不提供对省略的尾部的无损检索。每个显示的孩子都保留其任务和状态,结果头共享小地板上方的剩余空间。如果甚至地板大小的块超过上限,则剩余的子项将成为一条有界摘要行,其中包含其计数、前几个会话密钥以及使用会话工具检查它们的指导。排序保持确定性。有界生命周期快照和保留的完整记录与这些提示限制无关。
最终回复为空的成功子级将保留在批次中,并包含其任务标识、`ok` 状态和 `(no output)` 结果。其成功执行状态不满足要求的结果。
对于嵌套工作,后代的发现可以帮助孩子形成答案。孩子自己的最终答案会传给父母。通过消息工具传递的最终答案通过其记录的源传递仍然具有权威性,即使后来的终端响应是空的或无声的。
当子级清理在父级恢复之前完成时,完成传递可以读取现有的注册存档。 Control UI 的 **Tasks** 检查器还会在清理删除其实时会话后读取已完成运行的保留转录本。即使重复使用会话密钥,分页仍会绑定到该运行的存档。删除后,特定于儿童的共享元数据不再可用。因此,存档预览需要不依赖于该元数据的现有会话访问权限,例如网关管理员访问权限。配置文件范围的读者无法恢复已删除的子任务对其父任务的访问权限。保留子会话会保留其正常的共享检查。超大文本记录使用正常历史记录大小通知。超过 8 MiB 的单个存档记录会使任务历史记录在读取器解码之前不可用,以绑定每条记录的解码内存。此限制也适用于具有相同会话密钥的其他保留代:运行成员资格存储在转录记录内,因此不可读的候选者会阻止读者建立唯一的匹配,即使所请求的运行自己的存档很小。读者报告不可用,而不是跳过未分类的一代。此读取限制不会更改保留的存档或完成交付的最终答案扫描仪。任务将此报告为不可重试的预览限制;刷新无法解决。
终端运行失败会报告失败状态,而不重播捕获的回复文本。当从子级存储的会话中恢复完成时,将为父级保留其记录的故障或超时诊断。 Tool/toolResult 输出不会提升为子结果文本。
### 统计行
默认公告有效负载在末尾包含一个统计行(即使在包装时)。私有父完成忽略可变的使用统计信息,因此重试的切换保持相同的输入:
- 运行时(e.g. `runtime 5m12s`)。
- 代币使用情况(input/output/total)。
- 当已配置模型定价时的估算成本(`models.providers.*.models[].cost`)。
- `sessionKey`、`sessionId` 和转录路径,以便主代理可通过 `sessions_history` 获取历史或在磁盘上检查文件。
内部元数据仅用于编排;面向用户的回复应改写为正常的 assistant 语气。
孩子安定下来后,阅读一次用法。如果尚未记录使用情况,则统计行显示 `tokens unknown`;完成交付不等待它。
### 为什么优先使用 `sessions_history`
`sessions_history` 是在 agent 回合中从子级读取转录内容时更安全的编排路径:
- 保留文本(包括凭据),无需秘密屏蔽。
- 会截断长文本块(每块 4000 字符),并丢弃思考签名、推理回放载荷以及行内图片数据。
- Caps 在 80 KB 返回消息;可以删除较旧的行或将过大的行替换为 `[sessions_history omitted: message too large]`。
- 当存在 `nextOffset` 时,使用它向后分页读取更早的转录窗口。
- 返回结构化历史记录,而不是 `/subagents log` 的简单聊天行。推理标签、`` / `` 包装器和工具调用 XML 可以保留在消息文本中:`sessions_history` 不应用日志命令的辅助散文清理程序。有关召回保证,请参阅 [ 会话工具](/concepts/session-tool#listing-and-reading-sessions)。
- 当你需要逐字节的完整转录时,原始磁盘上的转录检查是后备方案。