子智能体通知
通告¶
子代理通过通告步骤汇报:
- 通告步骤在子代理会话内运行(不在请求方会话中)。
- 以
expectsCompletionMessage: false生成的运行会完全跳过通告步骤;运行注册表将其投递记录为不需要。 - 精确的
ANNOUNCE_SKIP响应会抑制通告输出。 - 对于需要完成的运行,子代理精确的
NO_REPLY响应或无输出均视为缺失交付物,并交由请求方/父级进行可见表示或重试;它不会被计为静默投递。 - 可选、重复、已可见或其他非必需路径可使用精确的
NO_REPLY表示有意保持沉默。
默认情况下,投递取决于请求方深度:
- 顶层请求方会话使用后续
agent调用进行外部投递(deliver=true)。 - 嵌套请求方子代理会话会收到内部后续注入(
deliver=false),以便编排器能在会话内综合子项结果。 - 如果嵌套请求方子代理会话已消失,OpenClaw 会在可用时回退到该会话的请求方。
对于顶层请求方会话,完成模式的直接投递首先解析任何已绑定的会话/线程路由和钩子覆盖,然后从请求方会话的已存储路由中填充缺失的频道目标字段。即使完成来源仅标识了频道,这也能确保完成消息停留在正确的聊天/主题中。当覆盖选择另一个聊天或主题时,它不会继承先前路由的线程。来自绑定或钩子的显式线程会被保留。
在构建嵌套完成发现时,子项完成聚合的范围限定为当前请求方运行,防止先前运行的过期子项输出泄漏到当前通告中。当频道适配器可用时,通告回复会保留线程/主题路由。
在 sessions_yield 之后,冻结批次会等待其自身子项及其后代稳定。来自先前请求方轮次且仍在运行的子项不会延迟该批次的结果;先前批次保留其自身的完成唤醒。
完成输入在压缩和运行时上下文消息中保留其自身的轮次身份。如果转录持久化因某个带键输入属于已关闭轮次而拒绝完成,投递会记录带有该错误的永久失败。它不会重试其他模型,也不会继续调度同一完成。
如果直接消息文本回退中的某个分块在先前分块已发送后失败或被中止,OpenClaw 会记录不完整投递。它会停止自动重试,以避免重复接收方已收到的分块。成功子项的结果仍可用于恢复。
私有父级完成¶
在 sessions_spawn 上设置 completionTarget: "parent",可将结果返回到原始请求方会话的私有轮次中。父级可以检查结果、启动另一个子项,或回复 NO_REPLY。OpenClaw 不会自动将子项结果、父级最终结果或生成的媒体发送到频道。父级仍可选择通过其允许的工具发送消息。
此选项仅支持隐藏、原生、一次性运行。它不能与 ACP、collect: true、visible: true、thread: true、mode: "session" 或 expectsCompletionMessage: false 组合使用。它不会更改默认完成模式。
已完成的私有结果会保留在注册表中,直到生成父级轮次稳定。父级正常完成会释放每个就绪结果以供私有审查;sessions_yield 则会将结果交给其现有子项批次。重置或移除父级不会将结果转移到另一个会话。当已稳定批次包含私有结果时,其合并审查保持私有;普通兄弟项保留各自的完成投递。
等待生成父级轮次不会消耗私有结果的投递重试窗口。父级正常完成在释放结果时启动该窗口。在 sessions_yield 之后,已让渡批次拥有投递;单个子项清理不能使该批次的结果过期或挂起。
在整个运行过程中使用支持此选项的构建版本。旧版构建无法恢复私有完成交接,并可能在降级后丢弃它们;现有会话转录仍保持独立。
通告上下文¶
通告上下文会被规范化为稳定的内部事件块:
| 字段 | 来源 |
|---|---|
| 来源 | subagent 或 cron |
| 会话 ID | 子会话 key/id |
| 类型 | 通告类型 + 任务标签 |
| 状态 | 由运行时结果推导(ok、error、timeout 或 unknown)——不从模型文本推断 |
| 结果内容 | 子代理最新的可见助手文本 |
| 后续操作 | 描述何时回复、何时保持沉默的指令 |
结果是子代理针对已完成运行的完整可见最终答案。当 OpenClaw 一起投递多个结果时,它会保留 prompt-data 转义和稳定顺序。它不会缩短答案以适应先前的通告投影限制。有界生命周期快照与发送给父级的完整答案保持分离。
对于嵌套工作,后代发现有助于子代理形成其答案。子代理自身的最终答案才是继续传递到其父级的内容。如果子代理通过消息工具发送其最终答案,然后返回 NO_REPLY,该最终答案仍然具有权威性。
完成投递可以在子清理先于父级恢复完成时,读取一个已存在的已注册归档。Control UI 的 Tasks 检查器也会在清理移除其实时会话后,读取已完成运行的保留转录。分页始终绑定到该运行的归档,即使会话密钥被复用。 删除后,子级专属的共享元数据不再可用。因此,归档预览需要不依赖于该元数据的现有会话访问权限,例如 Gateway 管理员访问权限。配置范围读取器无法通过访问其父任务来恢复已删除子级的权限。保留子会话可维持其正常的共享检查。 超大文本记录使用常规历史大小提示。单条超过 8 MiB 的归档记录会在读取器解码之前使 Tasks 历史不可用,以限制每条记录的解码内存。此限制也适用于具有相同会话密钥的其他保留代:运行成员关系存储在转录记录内,因此无法读取的候选项会阻止读取器建立唯一匹配,即使所请求运行自身的归档很小。读取器会报告不可用,而不是跳过未分类的代。此读取限制不会更改保留归档或完成投递的最终答案扫描器。 Tasks 将此报告为不可重试的预览限制;刷新无法解决它。
终端失败运行会报告失败状态,而不会重放已捕获的回复文本。Tool/toolResult 输出不会被提升为子结果文本。
统计行¶
默认 announce 负载在末尾包含一行统计信息(即使被换行)。 私有父级完成会省略可变的用量统计,以便重试交接保持相同的输入:
- 运行时间(例如
runtime 5m12s)。 - Token 用量(输入/输出/总计)。
- 当配置了模型定价时的估算成本(
models.providers.*.models[].cost)。 sessionKey、sessionId和转录路径,以便主代理通过sessions_history获取历史,或检查磁盘上的文件。
内部元数据仅用于编排;面向用户的回复应以正常助手口吻重写。
为什么优先使用 sessions_history¶
sessions_history 是在代理回合内读取子级转录时更安全的编排路径:
- 即使通用日志脱敏被禁用,也会脱敏凭据/Token 样式的文本。
- 截断长文本块(每块 4000 个字符),并丢弃思考签名、推理重放负载和内联图像数据。
- 返回消息上限为 80 KB;较旧的行可被丢弃,或超大行被替换为
[sessions_history omitted: message too large]。 - 当存在
nextOffset时,使用它向前分页浏览较早的转录窗口。 - 返回结构化历史,而不是
/subagents log的纯聊天行。推理标签、<relevant-memories>/<relevant_memories>脚手架以及工具调用 XML 可能仍保留在消息文本中:sessions_history不会应用日志命令的助手文本净化器。有关召回保证,请参阅 会话工具。 - 当需要完整的逐字节转录时,直接检查磁盘上的原始转录是回退方案。
本页原文 Markdown:在 AtomGit 查看·内容源自开源项目 cl/openclaw