chore(i18n): refresh zh-CN translations

This commit is contained in:
openclaw-docs-i18n[bot] 2026-04-21 19:02:07 +00:00
parent f9de7a7c4e
commit 29dd8c371e
2 changed files with 246 additions and 257 deletions

View File

@ -1,43 +1,43 @@
---
read_when:
- 检查正在进行中或刚刚完成的后台工作
- 调试已分离的智能体运行的交付失败问题
- 检查正在进行中或最近已完成的后台工作
- 调试分离式智能体运行的交付失败问题
- 了解后台运行与会话、cron 和心跳之间的关系
summary: 用于跟踪 ACP 运行、子智能体、隔离的 cron 作业和 CLI 操作的后台任务
summary: ACP 运行、子智能体、隔离的 cron 作业和 CLI 操作的后台任务跟踪
title: 后台任务
x-i18n:
generated_at: "2026-04-20T18:24:53Z"
generated_at: "2026-04-21T19:01:00Z"
model: gpt-5.4
provider: openai
source_hash: ba5511b1c421bdf505fc7d34f09e453ac44e85213fcb0f082078fa957aa91fe7
source_hash: a4cd666b3eaffde8df0b5e1533eb337e44a0824824af6f8a240f18a89f71b402
source_path: automation/tasks.md
workflow: 15
---
# 后台任务
> **在找调度功能?** 请参阅 [Automation & Tasks](/zh-CN/automation) 以选择合适的机制。本页介绍的是如何**跟踪**后台工作,而不是如何调度它。
> **在找调度功能?** 请参阅 [Automation & Tasks](/zh-CN/automation)以选择合适的机制。本页介绍的是如何**跟踪**后台工作,而不是如何调度它。
后台任务用于跟踪**在你的主会话之外**运行的工作:
ACP 运行、子智能体生、隔离的 cron 作业执行,以及由 CLI 发起的操作。
ACP 运行、子智能体生、隔离的 cron 作业执行,以及由 CLI 发起的操作。
任务**不会**替代会话、cron 作业或心跳——它们是记录已分离工作发生了什么、何时发生以及是否成功的**活动账本**。
任务**不会**替代会话、cron 作业或心跳——它们是记录这些分离式工作“发生了什么、何时发生、以及是否成功”的**活动台账**。
<Note>
并非每次智能体运行都会创建任务。心跳轮次和普通交互式聊天不会。所有 cron 执行、ACP 生成、子智能体生成和 CLI 智能体命令都会
并非每次智能体运行都会创建任务。心跳轮次和普通交互式聊天不会。所有 cron 执行、ACP 派生、子智能体派生以及 CLI 智能体命令都会创建任务
</Note>
## TL;DR
- 任务是**记录**不是调度器——cron 和心跳决定工作_何时_运行任务跟踪_发生了什么_
- 任务是**记录**不是调度器——cron 和心跳决定工作**何时**运行,任务跟踪**发生了什么**
- ACP、子智能体、所有 cron 作业和 CLI 操作都会创建任务。心跳轮次不会。
- 每个任务都会经历 `queued → running → terminal`succeeded、failed、timed_out、cancelled 或 lost
- 只要 cron 运行时仍拥有该作业cron 任务就会保持活动状态;基于聊天的 CLI 任务仅在其所属运行上下文仍然活跃时保持活动状态。
- 完成采用推送驱动:已分离工作完成时可以直接通知,或唤醒请求方会话/心跳,因此状态轮询循环通常不是正确方式。
- 隔离的 cron 运行和子智能体完成时,会尽力在最终清理记账前清理其子会话所跟踪的浏览器标签页/进程。
- 隔离的 cron 交付会在后代子智能体工作仍在收尾时抑制过期的中间父级回复,并在后代最终输出先于交付到达时优先使用它
- 完成通知会直接投递到某个渠道,或排队等待下一次心跳。
- `openclaw tasks list` 显示所有任务;`openclaw tasks audit` 会暴露问题。
- 只要 cron 运行时仍拥有该作业cron 任务就会保持活动状态;而由聊天支持的 CLI 任务只有在其所属运行上下文仍处于活动状态时才会保持活动状态。
- 完成采用推送驱动:分离式工作完成后可以直接通知,或唤醒请求方会话/心跳,因此状态轮询循环通常不是合适的模式。
- 隔离的 cron 运行和子智能体完成时,会尽力在最终清理记账前,为其子会话清理已跟踪的浏览器标签页/进程。
- 隔离的 cron 交付会在后代子智能体工作仍在收尾时抑制过时的父级中间回复,并在后代最终输出先于交付到达时优先使用该最终输出
- 完成通知会直接发送到渠道,或排队等待下一次心跳。
- `openclaw tasks list` 显示所有任务;`openclaw tasks audit` 用于发现问题。
- 终态记录会保留 7 天,之后自动清理。
## 快速开始
@ -46,7 +46,7 @@ ACP 运行、子智能体生成、隔离的 cron 作业执行,以及由 CLI
# 列出所有任务(最新的在前)
openclaw tasks list
# 按运行时或状态过滤
# 按运行时或状态筛选
openclaw tasks list --runtime acp
openclaw tasks list --status running
@ -76,23 +76,23 @@ openclaw tasks flow cancel <lookup>
| 来源 | 运行时类型 | 何时创建任务记录 | 默认通知策略 |
| ---------------------- | ------------ | ------------------------------------------------------ | --------------------- |
| ACP 后台运行 | `acp` | 生成子 ACP 会话时 | `done_only` |
| 子智能体编排 | `subagent` | 通过 `sessions_spawn`子智能体时 | `done_only` |
| cron 作业(所有类型) | `cron` | 每次 cron 执行时(主会话和隔离执行均包括) | `silent` |
| ACP 后台运行 | `acp` | 生 ACP 会话时 | `done_only` |
| 子智能体编排 | `subagent` | 通过 `sessions_spawn` 生子智能体时 | `done_only` |
| cron 作业(所有类型) | `cron` | 每次 cron 执行时(主会话和隔离均包括) | `silent` |
| CLI 操作 | `cli` | 通过 Gateway 网关运行的 `openclaw agent` 命令 | `silent` |
| 智能体媒体作业 | `cli` | 基于会话`video_generate` 运行 | `silent` |
| 智能体媒体作业 | `cli` | 由会话支持`video_generate` 运行 | `silent` |
主会话 cron 任务默认使用 `silent` 通知策略——它们会创建用于跟踪的记录,但不会生成通知。隔离的 cron 任务默认也为 `silent`,但由于它们在自己的会话中运行,因此更容易被看到。
主会话 cron 任务默认使用 `silent` 通知策略——它们会创建记录以供跟踪,但不会生成通知。隔离的 cron 任务同样默认使用 `silent`,但由于它们在自己的会话中运行,因此更容易被看到。
基于会话的 `video_generate` 运行同样使用 `silent` 通知策略。它们仍会创建任务记录,但完成结果会作为内部唤醒交还给原始智能体会话,以便智能体自己编写后续消息并附上生成完成的视频。如果你启用了 `tools.media.asyncCompletion.directSend`,异步 `music_generate``video_generate` 完成时会先尝试直接向渠道投递,失败后再回退到唤醒请求方会话的路径。
由会话支持的 `video_generate` 运行也使用 `silent` 通知策略。它们仍会创建任务记录,但完成结果会通过内部唤醒返还给原始智能体会话,以便智能体自行写入后续消息并附加已完成的视频。如果你启用了 `tools.media.asyncCompletion.directSend`,异步 `music_generate``video_generate` 完成时会先尝试直接发送到渠道,失败后再回退到唤醒请求方会话的路径。
当某个基于会话的 `video_generate` 任务仍在活动时,该工具还会充当一道保护措施:在同一会话中重复调用 `video_generate` 会返回活动任务状态,而不是启动第二个并发生成任务。当你希望从智能体侧显式查询进度/状态时,请使用 `action: "status"`
当某个由会话支持的 `video_generate` 任务仍处于活动状态时,该工具也会充当护栏:在同一会话中重复调用 `video_generate` 时,不会启动第二个并发生成,而是返回当前活动任务的状态。当你希望从智能体侧显式查询进度/状态时,请使用 `action: "status"`
**不会创建任务的情况**
**以下情况不会创建任务:**
- 心跳轮次——主会话;请参阅 [Heartbeat](/zh-CN/gateway/heartbeat)
- 普通交互式聊天轮次
- 直接 `/command` 响应
- 直接 `/command` 响应
## 任务生命周期
@ -111,47 +111,47 @@ stateDiagram-v2
| 状态 | 含义 |
| ----------- | -------------------------------------------------------------------------- |
| `queued` | 已创建,等待智能体启动 |
| `running` | 智能体轮次正在积极执行 |
| `running` | 智能体轮次正在执行 |
| `succeeded` | 已成功完成 |
| `failed` | 因错误而结束 |
| `timed_out` | 超配置的超时时间 |
| `cancelled` | 操作员通过 `openclaw tasks cancel` 停止 |
| `lost` | 在 5 分钟宽限期后,运行时丢失了权威的后备状态 |
| `failed` | 以错误结束 |
| `timed_out` | 超配置的超时时间 |
| `cancelled` | 操作员通过 `openclaw tasks cancel` 停止 |
| `lost` | 运行时在 5 分钟宽限期后失去了权威性支撑状态 |
状态转换会自动发生——当关联的智能体运行结束时,任务状态会更新为匹配的结果。
状态转换会自动发生——当关联的智能体运行结束时,任务状态会更新为对应结果。
`lost` 是运行时感知的
`lost` 具备运行时感知能力
- ACP 任务:后备 ACP 子会话元数据消失。
- 子智能体任务:后备子会话从目标智能体存储中消失。
- cron 任务cron 运行时不再将该作业为活动状态。
- CLI 任务:隔离的子会话任务使用子会话;基于聊天的 CLI 任务则改为使用活动运行上下文,因此残留的渠道/群组/直接会话行不会让它们继续保持活动
- ACP 任务:支撑它的 ACP 子会话元数据已消失。
- 子智能体任务:支撑它的子会话已从目标智能体存储中消失。
- cron 任务cron 运行时不再将该作业标记为活动状态。
- CLI 任务:隔离子会话任务使用子会话;由聊天支持的 CLI 任务则改为使用实时运行上下文,因此残留的渠道/群组/私聊会话行不会让它们继续保持活动状态
## 交付与通知
当任务进入终态时OpenClaw 会通知你。两种交付路径:
当任务进入终态时OpenClaw 会通知你。存在两种交付路径:
**直接交付**——如果任务有渠道目标(`requesterOrigin`完成消息会直接发送到该渠道Telegram、Discord、Slack 等。对于子智能体完成OpenClaw 还会在可用时保留已绑定的线程/话题路由,并可在直接交付前尝试从请求方会话的存储路由(`lastChannel` / `lastTo` / `lastAccountId`)中补全缺失的 `to` / account。
**直接交付**——如果任务有渠道目标(`requesterOrigin`完成消息会直接发送到该渠道Telegram、Discord、Slack 等。对于子智能体完成OpenClaw 还会在可用时保留已绑定的线程/话题路由,并可在直接交付前,从请求方会话存储的路由(`lastChannel` / `lastTo` / `lastAccountId`)中补全缺失的 `to` / account。
**会话排队交付**——如果直接交付失败,或未设置来源,则更新会作为系统事件排入请求方会话,并在下一次心跳时呈现。
**会话排队交付**——如果直接交付失败或未设置来源,更新将作为系统事件排入请求方会话,并在下一次心跳时呈现。
<Tip>
任务完成会立即触发一次心跳唤醒,因此你可以快速看到结果——无需等到下一次计划中的心跳 tick
任务完成会立即触发一次心跳唤醒,因此你可以快速看到结果——不必等待下一次计划中的心跳触发
</Tip>
这意味着常见工作流是基于推送的:只需启动一次分离工作,然后让运行时在完成时唤醒或通知你。只有在你需要调试、干预或进行显式审计时,才去轮询任务状态。
这意味着常见工作流是基于推送的:只需启动一次分离工作,然后让运行时在完成时唤醒或通知你。只有在你需要调试、干预或执行显式审计时,才需要轮询任务状态。
### 通知策略
控制你会收到多少关于每个任务的信息:
控制你希望收到每个任务多少信息:
| 策略 | 交付内容 |
| --------------------- | ----------------------------------------------------------------------- |
| `done_only`(默认) | 仅终态succeeded、failed 等)——**这是默认值** |
| `done_only`(默认) | 仅终态succeeded、failed 等)——**这是默认值** |
| `state_changes` | 每次状态转换和进度更新 |
| `silent` | 完全不通知 |
在任务运行期间更改策略:
在任务运行期间更改策略:
```bash
openclaw tasks notify <lookup> state_changes
@ -173,7 +173,7 @@ openclaw tasks list [--runtime <acp|subagent|cron|cli>] [--status <status>] [--j
openclaw tasks show <lookup>
```
查找令牌接受任务 ID、运行 ID 或会话键。显示完整记录,包括时间、交付状态、错误和终态摘要。
查找令牌支持任务 ID、运行 ID 或会话键。会显示完整记录,包括时间信息、交付状态、错误和终态摘要。
### `tasks cancel`
@ -181,7 +181,7 @@ openclaw tasks show <lookup>
openclaw tasks cancel <lookup>
```
对于 ACP 和子智能体任务,这会终止子会话。对于由 CLI 跟踪的任务,取消操作会记录到任务注册表中(不存在单独的子运行时句柄)。状态会转换为 `cancelled`,并在适用时发送交付通知。
对于 ACP 和子智能体任务,这会终止子会话。对于由 CLI 跟踪的任务,取消会记录到任务注册表中(不存在单独的子运行时句柄)。状态会转换为 `cancelled`,并在适用时发送交付通知。
### `tasks notify`
@ -195,16 +195,16 @@ openclaw tasks notify <lookup> <done_only|state_changes|silent>
openclaw tasks audit [--json]
```
暴露运行问题。检测到问题时,结果也会出现在 `openclaw status` 中。
用于发现运维问题。检测到问题时,这些发现也会出现在 `openclaw status` 中。
| 发现项 | 严重级别 | 触发条件 |
| ------------------------- | -------- | ----------------------------------------------------- |
| `stale_queued` | warn | 排队超过 10 分钟 |
| `stale_running` | error | 运行超过 30 分钟 |
| `lost` | error | 运行时支撑的任务归属已消失 |
| `stale_queued` | warn | 处于 queued 超过 10 分钟 |
| `stale_running` | error | 处于 running 超过 30 分钟 |
| `lost` | error | 由运行时支撑的任务所有权已消失 |
| `delivery_failed` | warn | 交付失败且通知策略不是 `silent` |
| `missing_cleanup` | warn | 终态任务没有清理时间戳 |
| `inconsistent_timestamps` | warn | 时间线冲突(例如结束时间早于开始时间) |
| `inconsistent_timestamps` | warn | 时间线违反约束(例如结束时间早于开始时间) |
### `tasks maintenance`
@ -213,20 +213,20 @@ openclaw tasks maintenance [--json]
openclaw tasks maintenance --apply [--json]
```
使用它来预览或应用针对任务和 Task Flow 状态的对账、清理标记和修剪。
用它来预览或应用任务及 Task Flow 状态的对账、清理时间戳补写和清理裁剪。
对账是运行时感知的
对账具备运行时感知能力
- ACP/子智能体任务会检查其后备子会话。
- ACP/子智能体任务会检查其支撑的子会话。
- cron 任务会检查 cron 运行时是否仍拥有该作业。
- 基于聊天的 CLI 任务会检查所属的活动运行上下文,而不只是聊天会话行。
- 由聊天支持的 CLI 任务会检查所属的实时运行上下文,而不只是聊天会话行。
完成清理同样是运行时感知的
完成清理同样具备运行时感知能力
- 子智能体完成时,会尽力在宣布清理继续之前关闭该子会话所跟踪的浏览器标签页/进程
- 隔离的 cron 完成时,会尽力在该运行彻底拆除前关闭该 cron 会话所跟踪的浏览器标签页/进程
- 隔离的 cron 交付会在需要时等待后代子智能体的后续工作完成,并抑制过期的父级确认文本,而不是直接宣布它
- 子智能体完成交付会优先使用最新的可见 assistant 文本;如果为空,则回退到已净化的最新 tool/toolResult 文本,而仅包含超时工具调用的运行可收缩为简短的部分进度摘要
- 子智能体完成时,会尽力先关闭该子会话已跟踪的浏览器标签页/进程,然后再继续公告清理
- 隔离的 cron 完成时,会尽力先关闭该 cron 会话已跟踪的浏览器标签页/进程,然后再让该运行完全结束
- 隔离的 cron 交付会在需要时等待后代子智能体后续处理完成,并抑制过时的父级确认文本,而不是将其作为结果公告
- 子智能体完成交付会优先使用最新的可见助手文本;如果该文本为空,则回退到经清理的最新 tool/toolResult 文本;仅包含超时工具调用的运行可折叠为简短的部分进度摘要。终态失败的运行会公告失败状态,而不会重放已捕获的回复文本
- 清理失败不会掩盖真实的任务结果。
### `tasks flow list|show|cancel`
@ -237,19 +237,20 @@ openclaw tasks flow show <lookup> [--json]
openclaw tasks flow cancel <lookup>
```
当你关心的是编排中的 Task Flow而不是某一条单独的后台任务记录时,请使用这些命令。
当你关心的是编排中的 Task Flow而不是单个后台任务记录时,请使用这些命令。
## 聊天任务板(`/tasks`
## 聊天任务板(`/tasks`
在任何聊天会话中使用 `/tasks` 可查看链接到该会话的后台任务。看板会显示活动中和最近完成的任务,包括运行时、状态、时间,以及进度或错误详情。
在任意聊天会话中使用 `/tasks`,可查看与该会话关联的后台任务。该面板会显示活动中和最近已完成的任务,包括运行时、状态、时间信息,以及进度或错误详情。
当当前会话没有可见的关联任务时,`/tasks` 会回退为显示智能体本地任务计数,这样你仍能获得概览,同时不会泄露其他会话的详细信息。
当当前会话没有可见的关联任务时,`/tasks` 会回退为显示智能体本地任务计数,
这样你仍然可以获得概览,而不会泄露其他会话的详细信息。
如需查看完整的操作员账,请使用 CLI`openclaw tasks list`。
如需查看完整的操作员账,请使用 CLI`openclaw tasks list`。
## 状态集成(任务压力)
`openclaw status` 包含一个可快速浏览的任务摘要:
`openclaw status` 包含一个可快速查看的任务摘要:
```
Tasks: 3 queued · 2 running · 1 issues
@ -257,57 +258,57 @@ Tasks: 3 queued · 2 running · 1 issues
该摘要报告:
- **active**`queued` + `running` 的数量
- **failures**`failed` + `timed_out` + `lost` 的数量
- **byRuntime** — 按 `acp`、`subagent`、`cron`、`cli` 分类
- **active** `queued` + `running` 的数量
- **failures** `failed` + `timed_out` + `lost` 的数量
- **byRuntime**`acp`、`subagent`、`cron`、`cli` 的细分统计
`/status``session_status` 工具都使用具备清理感知能力的任务快照:优先显示活动任务,隐藏陈旧的已完成记录,且仅在没有活动工作残留时才显示最近失败项。这让状态卡片聚焦于当前真正重要的内容。
`/status``session_status` 工具都会使用带清理感知的任务快照:优先显示活动任务,隐藏陈旧的已完成记录,并且仅在没有活动工作剩余时才显示最近失败的任务。这样可以让状态卡聚焦于当前真正重要的内容。
## 存储与维护
### 任务存储位置
任务记录会持久化到 SQLite位置如下
任务记录持久化保存在以下 SQLite 路径中
```
$OPENCLAW_STATE_DIR/tasks/runs.sqlite
```
注册表会在 Gateway 网关启动时加载到内存中,并将写入同步到 SQLite确保重启后仍具备持久性。
注册表会在 Gateway 网关启动时加载到内存中,并将写入同步到 SQLite便在重启后仍能保持持久性。
### 自动维护
理器每 **60 秒** 运行一次,并处理三件事:
扫器每 **60 秒** 运行一次,处理以下三件事:
1. **对账** 检查活动任务是否仍有权威运行时后备状态。ACP/子智能体任务使用子会话状态cron 任务使用活动作业归属状态,基于聊天的 CLI 任务使用其所属运行上下文。如果该后备状态消失超过 5 分钟,任务会被标记为 `lost`
2. **清理标记** — 为终态任务设置 `cleanupAfter` 时间戳(`endedAt + 7 days`)。
3. **修剪** — 删除超过其 `cleanupAfter` 日期的记录。
1. **对账**— 检查活动任务是否仍有权威性的运行时支撑。ACP/子智能体任务使用子会话状态cron 任务使用活动作业所有权,由聊天支持的 CLI 任务使用所属运行上下文。如果该支撑状态消失超过 5 分钟,任务会被标记为 `lost`
2. **清理时间戳补写** —— 为终态任务设置 `cleanupAfter` 时间戳(`endedAt + 7 days`)。
3. **裁剪** —— 删除超过其 `cleanupAfter` 日期的记录。
**保留期**:终态任务记录会保留 **7 天**,之后自动修剪。无需任何配置。
**保留期**:终态任务记录会保留 **7 天**,之后自动清理。无需配置。
## 任务与其他系统的关系
### 任务与 Task Flow
[Task Flow](/zh-CN/automation/taskflow) 是位于后台任务之上的流程编排层。单个 flow 在其生命周期内可能通过管或镜像同步模式协调多个任务。使用 `openclaw tasks` 检查单个任务记录,使用 `openclaw tasks flow` 检查编排 flow。
[Task Flow](/zh-CN/automation/taskflow) 是位于后台任务之上的流程编排层。单个 flow 在其生命周期内可能通过管或镜像同步模式协调多个任务。使用 `openclaw tasks` 检查单个任务记录,使用 `openclaw tasks flow` 检查编排中的 flow。
详情请参阅 [Task Flow](/zh-CN/automation/taskflow)。
### 任务与 cron
cron 作业的**定义**位于 `~/.openclaw/cron/jobs.json`;运行时执行状态则位于同目录旁边的 `~/.openclaw/cron/jobs-state.json`。**每一次** cron 执行都会创建一条任务记录——无论是主会话还是隔离执行。主会话 cron 任务默认使用 `silent` 通知策略,因此它们会被跟踪,但不会生成通知。
cron 作业**定义**保存在 `~/.openclaw/cron/jobs.json`;运行时执行状态保存在其旁边的 `~/.openclaw/cron/jobs-state.json`。**每一次** cron 执行都会创建一条任务记录——无论是主会话还是隔离执行。主会话 cron 任务默认使用 `silent` 通知策略,因此它们会被跟踪,但不会生成通知。
请参阅 [Cron Jobs](/zh-CN/automation/cron-jobs)。
### 任务与心跳
心跳运行属于主会话轮次——它们不会创建任务记录。任务完成时,它可以触发一次心跳唤醒,你及时看到结果。
心跳运行属于主会话轮次——它们不会创建任务记录。任务完成时,它可以触发一次心跳唤醒,以便你及时看到结果。
请参阅 [Heartbeat](/zh-CN/gateway/heartbeat)。
### 任务与会话
任务可能会引用 `childSessionKey`(工作运行的位置)和 `requesterSessionKey`(发起)。会话是对话上下文;任务是在其之上的活动跟踪
一个任务可能会引用 `childSessionKey`(工作运行的位置)和 `requesterSessionKey`(发起它的人)。会话是对话上下文;任务是在其之上的活动跟踪。
### 任务与智能体运行
@ -315,8 +316,8 @@ cron 作业的**定义**位于 `~/.openclaw/cron/jobs.json`;运行时执行状
## 相关内容
- [Automation & Tasks](/zh-CN/automation) — 一览所有自动化机制
- [Task Flow](/zh-CN/automation/taskflow) — 位于任务之上的流程编排
- [Scheduled Tasks](/zh-CN/automation/cron-jobs) — 调度后台工作
- [Heartbeat](/zh-CN/gateway/heartbeat) — 周期性的主会话轮次
- [CLI: Tasks](/cli/index#tasks) — CLI 命令参考
- [Automation & Tasks](/zh-CN/automation) — 所有自动化机制总览
- [Task Flow](/zh-CN/automation/taskflow) — 位于任务之上的流程编排
- [Scheduled Tasks](/zh-CN/automation/cron-jobs) — 调度后台工作
- [Heartbeat](/zh-CN/gateway/heartbeat) — 周期性的主会话轮次
- [CLI: Tasks](/cli/index#tasks) — CLI 命令参考

View File

@ -1,26 +1,26 @@
---
read_when:
- 你想通过智能体进行后台/并行工作时
- 你正在更改 `sessions_spawn` sub-agent 工具策略时
- 你正在实现或排查绑定到线程的 subagent 会话时
summary: Sub-agents生成隔离的智能体运行并将结果回报到请求者聊天
title: Sub-Agents
- 你希望通过智能体进行后台/并行工作
- 你正在更改 `sessions_spawn`子智能体工具策略
- 你正在实现或排查线程绑定的子智能体会话
summary: 子智能体:启动隔离的智能体运行,并将结果回传到请求者聊天中
title: 子智能体
x-i18n:
generated_at: "2026-04-05T10:13:07Z"
generated_at: "2026-04-21T19:01:00Z"
model: gpt-5.4
provider: openai
source_hash: 9df7cc35a3069ce4eb9c92a95df3ce5365a00a3fae92ff73def75461b58fec3f
source_hash: 218913f0db88d40e1b5fdb0201b8d23e7af23df572c86ff4be2637cb62498281
source_path: tools/subagents.md
workflow: 15
---
# Sub-agents
# 子智能体
Sub-agents 是从现有智能体运行中生成的后台智能体运行。它们在自己的会话中运行(`agent:<agentId>:subagent:<uuid>`),并在完成后**将**其结果**回报**到请求者聊天渠道。每个 sub-agent 运行都会作为一个[后台任务](/zh-CN/automation/tasks)进行跟踪。
子智能体是从现有智能体运行中派生出来的后台智能体运行。它们在各自独立的会话中运行(`agent:<agentId>:subagent:<uuid>`),并且在完成后,会将结果**回传**到请求者聊天渠道。每个子智能体运行都会作为一个[后台任务](/zh-CN/automation/tasks)进行跟踪。
## 斜杠命令
使用 `/subagents` 检查或控制**当前会话**的 sub-agent 运行:
使用 `/subagents` 来检查或控制**当前会话**的子智能体运行:
- `/subagents list`
- `/subagents kill <id|#|all>`
@ -40,128 +40,125 @@ Sub-agents 是从现有智能体运行中生成的后台智能体运行。它们
- `/session idle <duration|off>`
- `/session max-age <duration|off>`
`/subagents info` 会显示运行元数据(状态、时间戳、会话 id、转录路径、清理信息
使用 `sessions_history` 获取一个有界、经过安全过滤的回忆视图;当你需要原始完整转录时,
请检查磁盘上的转录路径。
`/subagents info` 会显示运行元数据(状态、时间戳、会话 id、转录路径、清理
使用 `sessions_history` 获取有边界且经过安全过滤的回溯视图;当你需要原始完整转录时,请查看磁盘上的转录路径。
### 生成行为
### 启动行为
`/subagents spawn` 会以用户命令而非内部中继的方式启动一个后台 sub-agent并在运行完成时向请求者聊天发送一条最终完成更新。
`/subagents spawn` 会以用户命令而不是内部中继的方式启动一个后台子智能体,并且在运行完成时,会向请求者聊天发送一条最终完成更新。
- spawn 命令是非阻塞的;它会立即返回一个运行 id。
- 完成时sub-agent 会向请求者聊天渠道回报一条摘要/结果消息。
- 完成通知是基于推送的。生成后,不要只是为了等待其完成而循环轮询 `/subagents list`
`sessions_list``sessions_history`;仅在按需调试或干预时检查状态。
- 完成时OpenClaw 会尽力关闭该 sub-agent 会话所打开并被跟踪的 browser 标签页/进程,然后再继续回报清理流程。
- 对于手动生成,投递具备弹性:
- OpenClaw 会先使用稳定的幂等键尝试直接 `agent` 投递。
- 如果直接投递失败,则回退到队列路由。
- 如果队列路由仍不可用,则会在最终放弃前以短暂的指数退避重试该回报。
- 完成投递会保留解析后的请求者路由:
- 如可用,则优先使用线程绑定或会话绑定的完成路由
- 如果完成来源仅提供渠道OpenClaw 会从请求者会话已解析的路由(`lastChannel` / `lastTo` / `lastAccountId`)中补齐缺失的目标/账号,这样直接投递仍可生效
- 向请求者会话进行的完成交接是运行时生成的内部上下文(不是用户编写的文本),其中包括:
- `Result`(最新可见的 `assistant` 回复文本;否则为经过净化的最新 tool/toolResult 文本)
- 启动命令是非阻塞的;它会立即返回一个运行 id。
- 完成时,子智能体会向请求者聊天渠道回传一条摘要/结果消息。
- 完成通知基于推送。一旦启动,不要为了等待其完成而循环轮询 `/subagents list`、`sessions_list` 或 `sessions_history`;只有在调试或干预时才按需查看状态。
- 完成时OpenClaw 会尽力在回传清理流程继续之前,关闭该子智能体会话所打开并被跟踪的浏览器标签页/进程。
- 对于手动启动,投递具有韧性:
- OpenClaw 会先尝试使用稳定的幂等键直接投递到 `agent`
- 如果直接投递失败,则回退到队列路由
- 如果队列路由仍不可用,则在最终放弃前,使用短时指数退避重试回传
- 完成投递会保留已解析的请求者路由:
- 在线程绑定或会话绑定的完成路由可用时,优先使用它们
- 如果完成来源仅提供一个渠道OpenClaw 会从请求者会话已解析的路由(`lastChannel` / `lastTo` / `lastAccountId`)中补齐缺失的 target/account以便直接投递仍然可用
- 向请求者会话移交完成信息时,会使用运行时生成的内部上下文(不是用户编写的文本),其中包括:
- `Result`(最新可见的 `assistant` 回复文本;否则为已清理的最新 `tool/toolResult` 文本;终态失败运行不会复用已捕获的回复文本)
- `Status``completed successfully` / `failed` / `timed out` / `unknown`
- 精简的运行时/token 统计信息
- 一条投递指令,告诉请求者智能体以正常助手语气改写,而不是转发原始内部元数据
- 精简的运行时/令牌统计
- 一条投递指令,告知请求者智能体用正常的 assistant 语气重写内容(而不是转发原始内部元数据)
- `--model``--thinking` 会覆盖该次运行的默认值。
- 使用 `info`/`log` 可在完成后检查详细信息和输出。
- `/subagents spawn` 是一次性模式(`mode: "run"`)。对于持久的线程绑定会话,请使用带有 `thread: true``mode: "session"` 的 `sessions_spawn`。
- 对于 ACP harness 会话Codex、Claude Code、Gemini CLI请使用带有 `runtime: "acp"``sessions_spawn`,并参见 [ACP Agents](/tools/acp-agents)。
- 完成后,使用 `info`/`log` 查详细信息和输出。
- `/subagents spawn` 是一次性模式(`mode: "run"`)。对于持久线程绑定会话,请使用 `sessions_spawn`,并设置 `thread: true``mode: "session"`。
- 对于 ACP harness 会话Codex、Claude Code、Gemini CLI请使用 `sessions_spawn` 并设置 `runtime: "acp"`,参见 [ACP Agents](/zh-CN/tools/acp-agents)。
主要目标:
- 将“研究 / 长任务 / 慢工具”类工作并行化,而不阻塞主运行。
- 默认保持 sub-agents 隔离(会话隔离 + 可选沙箱隔离)。
- 让工具表面难以被误用默认情况下sub-agents **不会**获得会话工具。
- 支持为编排器模式配置可嵌套深度
- 并行处理“研究 / 长任务 / 慢工具”类工作,而不阻塞主运行。
- 默认保持子智能体隔离(会话隔离 + 可选沙箱隔离)。
- 让工具表面不易被误用:默认情况下,子智能体**不会**获得会话工具。
- 支持可配置的嵌套深度,以实现编排器模式
成本说明:每个 sub-agent 都有其**自己的**上下文和 token 用量。对于繁重或重复性
任务,请为 sub-agents 设置一个更便宜的模型,并让主智能体保留较高质量模型。
你可以通过 `agents.defaults.subagents.model` 或按智能体覆盖来配置。
成本说明:每个子智能体都有其**自己的**上下文和令牌使用量。对于高负载或重复性任务,请为子智能体设置更便宜的模型,同时让你的主智能体保留在更高质量的模型上。
你可以通过 `agents.defaults.subagents.model` 或按智能体覆盖来进行配置。
## 工具
使用 `sessions_spawn`
- 启动一个 sub-agent 运行(`deliver: false`,全局 lane`subagent`
- 然后运行一个回报步骤,并将回报回复发布到请求者聊天渠道
- 默认模型:继承调用,除非你设置了 `agents.defaults.subagents.model`(或按智能体设置 `agents.list[].subagents.model`);显式的 `sessions_spawn.model` 仍然优先生效
- 默认 thinking继承调用,除非你设置了 `agents.defaults.subagents.thinking`(或按智能体设置 `agents.list[].subagents.thinking`);显式的 `sessions_spawn.thinking` 仍然优先生效
- 默认运行超时:如果省略 `sessions_spawn.runTimeoutSeconds`OpenClaw 会在已设置时使用 `agents.defaults.subagents.runTimeoutSeconds`;否则回退`0`(无超时)。
- 启动一个子智能体运行(`deliver: false`,全局 lane`subagent`
- 然后执行回传步骤,并将回传回复发布到请求者聊天渠道
- 默认模型:继承调用,除非你设置了 `agents.defaults.subagents.model`(或按智能体设置 `agents.list[].subagents.model`);显式指定`sessions_spawn.model` 仍然优先。
- 默认 thinking继承调用,除非你设置了 `agents.defaults.subagents.thinking`(或按智能体设置 `agents.list[].subagents.thinking`);显式指定`sessions_spawn.thinking` 仍然优先。
- 默认运行超时:如果省略 `sessions_spawn.runTimeoutSeconds`OpenClaw 会在已设置时使用 `agents.defaults.subagents.runTimeoutSeconds`;否则回退`0`(不超时)。
工具参数:
- `task`(必
- `task`(必
- `label?`(可选)
- `agentId?`(可选;如果允许,则在另一个智能体 id 下生成
- `model?`(可选;覆盖 sub-agent 模型无效值会被跳过sub-agent 会使用默认模型运行,并在工具结果中附带警告)
- `thinking?`(可选;覆盖 sub-agent 运行的 thinking 级别)
- `runTimeoutSeconds?`(设置时默认使用 `agents.defaults.subagents.runTimeoutSeconds`,否则为 `0`;设置后,sub-agent 运行会在 N 秒后中止)
- `thread?`(默认 `false``true` 时,会为该 sub-agent 会话请求渠道线程绑定)
- `agentId?`(可选;如果允许,可在另一个智能体 id 下启动
- `model?`(可选;覆盖子智能体模型;无效值会被跳过,子智能体会使用默认模型运行,并在工具结果中给出警告)
- `thinking?`(可选;覆盖子智能体运行的 thinking 级别)
- `runTimeoutSeconds?`默认在已设置时使用 `agents.defaults.subagents.runTimeoutSeconds`,否则为 `0`;设置后,子智能体运行会在 N 秒后中止)
- `thread?`(默认 `false`当为 `true` 时,请求为该子智能体会话启用渠道线程绑定)
- `mode?``run|session`
- 默认 `run`
- 如果 `thread: true` 且省略 `mode`,默认值会变为 `session`
- 默认 `run`
- 如果 `thread: true` 且省略 `mode`,默认变为 `session`
- `mode: "session"` 要求 `thread: true`
- `cleanup?``delete|keep`,默认 `keep`
- `sandbox?``inherit|require`,默认 `inherit``require` 会在目标子运行时不是沙箱时拒绝生成
- `sessions_spawn` **不**接受渠道投递参数(`target`、`channel`、`to`、`threadId`、`replyTo`、`transport`)。如需投递,请在生成出的运行中使用 `message`/`sessions_send`。
- `sandbox?``inherit|require`,默认 `inherit``require` 会在目标子运行时未启用沙箱时拒绝启动
- `sessions_spawn` **不接受**渠道投递参数(`target`、`channel`、`to`、`threadId`、`replyTo`、`transport`)。对于投递,请从派生出的运行中使用 `message`/`sessions_send`。
## 线程绑定会话
当某个渠道启用了线程绑定时sub-agent 可以保持绑定到某个线程,因此该线程中的后续用户消息会继续路由到同一个 sub-agent 会话。
在线程绑定已为某个渠道启用时,子智能体可以保持绑定到一个线程,因此该线程中的后续用户消息会继续路由到同一个子智能体会话。
### 支持线程的渠道
- Discord当前唯一支持的渠道支持持久的线程绑定 subagent 会话(`sessions_spawn` 配合 `thread: true`)、手动线程控制(`/focus`、`/unfocus`、`/agents`、`/session idle`、`/session max-age`),以及适配器键 `channels.discord.threadBindings.enabled`、`channels.discord.threadBindings.idleHours`、`channels.discord.threadBindings.maxAgeHours` 和 `channels.discord.threadBindings.spawnSubagentSessions`
- Discord当前唯一支持的渠道支持持久线程绑定的子智能体会话(`sessions_spawn` 配合 `thread: true`)、手动线程控制(`/focus`、`/unfocus`、`/agents`、`/session idle`、`/session max-age`),以及适配器键 `channels.discord.threadBindings.enabled`、`channels.discord.threadBindings.idleHours`、`channels.discord.threadBindings.maxAgeHours` 和 `channels.discord.threadBindings.spawnSubagentSessions`
快速流程:
1. 使用 `sessions_spawn` 并设置 `thread: true`(以及可选的 `mode: "session"`)来生成
2. OpenClaw 会在当前活动渠道中为该会话目标创建或绑定一个线程
1. 使用 `sessions_spawn` 启动,并设置 `thread: true`(可选同时设置 `mode: "session"`
2. OpenClaw 会在当前活跃渠道中创建一个线程,或将一个线程绑定到该会话目标
3. 该线程中的回复和后续消息会路由到绑定的会话。
4. 使用 `/session idle` 检查/更新非活动自动取消聚焦设置,使用 `/session max-age` 控制硬上限。
4. 使用 `/session idle` 查看/更新因不活跃而自动取消焦点的设置,使用 `/session max-age` 控制硬上限。
5. 使用 `/unfocus` 手动解除绑定。
手动控制:
- `/focus <target>` 将当前线程(或创建一个线程)绑定到某个 sub-agent/会话目标。
- `/focus <target>` 将当前线程(或新建一个线程)绑定到某个子智能体/会话目标。
- `/unfocus` 移除当前已绑定线程的绑定关系。
- `/agents` 会列出活动运行和绑定状态(`thread:<id>` 或 `unbound`)。
- `/agents` 列出活跃运行和绑定状态(`thread:<id>` 或 `unbound`)。
- `/session idle``/session max-age` 仅适用于已聚焦的绑定线程。
配置开关:
- 全局默认值:`session.threadBindings.enabled`、`session.threadBindings.idleHours`、`session.threadBindings.maxAgeHours`
- 渠道覆盖和 spawn 自动绑定键是适配器特定的。参见上方的**支持线程的渠道**。
- 渠道覆盖和启动时自动绑定的键为适配器专用。参见上方的**支持线程的渠道**。
当前适配器详情参见 [Configuration Reference](/zh-CN/gateway/configuration-reference) 和 [斜杠命令](/zh-CN/tools/slash-commands)。
当前适配器详情参见 [Configuration Reference](/zh-CN/gateway/configuration-reference) 和 [Slash commands](/zh-CN/tools/slash-commands)。
Allowlist
允许列表
- `agents.list[].subagents.allowAgents`:可通过 `agentId`的智能体 id 列表(`["*"]` 表示允许任意)。默认:仅允许请求者智能体。
- `agents.defaults.subagents.allowAgents`:当请求者智能体未设置自己的 `subagents.allowAgents` 时使用的默认目标智能体 allowlist
- 沙箱继承保护:如果请求者会话处于沙箱中,`sessions_spawn` 会拒绝那些会以非沙箱方式运行的目标。
- `agents.defaults.subagents.requireAgentId` / `agents.list[].subagents.requireAgentId`:为 true 时,阻止省略 `agentId``sessions_spawn` 调用(强制显式 profile 选择。默认false。
- `agents.list[].subagents.allowAgents`:可通过 `agentId` 定的智能体 id 列表(`["*"]` 表示允许任意智能体)。默认:仅允许请求者智能体。
- `agents.defaults.subagents.allowAgents`:当请求者智能体未设置自己的 `subagents.allowAgents` 时使用的默认目标智能体允许列表
- 沙箱继承保护:如果请求者会话处于沙箱中,`sessions_spawn` 会拒绝那些将在非沙箱中运行的目标。
- `agents.defaults.subagents.requireAgentId` / `agents.list[].subagents.requireAgentId`为 true 时,阻止省略 `agentId``sessions_spawn` 调用(强制显式选择配置文件)。默认false。
发现:
- 使用 `agents_list` 查看当前哪些智能体 id 允许用于 `sessions_spawn`
- 使用 `agents_list` 查看当前哪些智能体 id 允许用于 `sessions_spawn`
自动归档:
- Sub-agent 会话会在 `agents.defaults.subagents.archiveAfterMinutes` 之后自动归档默认60
- 子智能体会话会在 `agents.defaults.subagents.archiveAfterMinutes` 之后自动归档默认60
- 归档使用 `sessions.delete`,并将转录重命名为 `*.deleted.<timestamp>`(同一文件夹)。
- `cleanup: "delete"` 会在回后立即归档(仍会通过重命名保留转录)。
- 自动归档是尽力而为;如果 gateway 重启,待处理定时器会丢失。
- `runTimeoutSeconds` **不会**自动归档;它只会停止运行。会话会保留直到自动归档。
- 自动归档对 depth-1 和 depth-2 会话同样适用
- Browser 清理与归档清理分离:运行结束时,即使保留转录/会话记录,也会尽力关闭已跟踪的 browser 标签页/进程
- `cleanup: "delete"` 会在回后立即归档(仍会通过重命名保留转录)。
- 自动归档采用尽力而为的方式;如果 Gateway 网关重启,待处理的定时器会丢失。
- `runTimeoutSeconds` **不会**自动归档;它只会停止运行。会话会保留直到自动归档发生
- 自动归档同样适用于 depth-1 和 depth-2 会话
- 浏览器清理与归档清理是分开的:当运行结束时,即使转录/会话记录被保留,被跟踪的浏览器标签页/进程也会尽力关闭
## 嵌套 Sub-Agents
## 嵌套子智能体
默认情况下,sub-agents 不能生成它们自己的 sub-agents`maxSpawnDepth: 1`)。你可以通过设置 `maxSpawnDepth: 2` 来启用一层嵌套,从而允许**编排器模式**:主智能体 → 编排 sub-agent → 工作 sub-sub-agents
默认情况下,子智能体不能再启动自己的子智能体`maxSpawnDepth: 1`)。你可以通过设置 `maxSpawnDepth: 2` 来启用一层嵌套,这样就允许**编排器模式**:主智能体 → 编排器子智能体 → 工作子子智能体
### 如何启用
@ -170,10 +167,10 @@ Allowlist
agents: {
defaults: {
subagents: {
maxSpawnDepth: 2, // 允许 sub-agents 生成子级默认1
maxChildrenPerAgent: 5, // 每个智能体会话的活动子级上限默认5
maxSpawnDepth: 2, // 允许子智能体启动子级默认1
maxChildrenPerAgent: 5, // 每个智能体会话的最大活跃子级数默认5
maxConcurrent: 8, // 全局并发 lane 上限默认8
runTimeoutSeconds: 900, // 省略时 sessions_spawn 的默认超时0 = 无超时)
runTimeoutSeconds: 900, // `sessions_spawn` 省略时的默认超时0 = 不超时)
},
},
},
@ -182,123 +179,114 @@ Allowlist
### 深度级别
| 深度 | 会话键形状 | 角色 | 可以生成? |
| ----- | ------------------------------------------ | --------------------------------------- | --------------------------- |
| 0 | `agent:<id>:main` | 主智能体 | 始终可以 |
| 1 | `agent:<id>:subagent:<uuid>` | Sub-agent在允许 depth 2 时为编排器) | 仅当 `maxSpawnDepth >= 2` |
| 2 | `agent:<id>:subagent:<uuid>:subagent:<uuid>` | Sub-sub-agent叶子工作者 | 永远不可以 |
| 深度 | 会话键形态 | 角色 | 可以启动子级? |
| ----- | ------------------------------------------ | -------------------------------------------- | ---------------------------- |
| 0 | `agent:<id>:main` | 主智能体 | 始终可以 |
| 1 | `agent:<id>:subagent:<uuid>` | 子智能体(在允许 depth 2 时可作为编排器) | 仅当 `maxSpawnDepth >= 2` |
| 2 | `agent:<id>:subagent:<uuid>:subagent:<uuid>` | 子子智能体(叶子工作节点) | 永远不可以 |
### 回
### 回
结果会沿链路向上流动
结果会沿链路逐级返回
1. 深度 2 的 worker 完成 → 向其父级(深度 1 编排器)回报
2. 深度 1 编排器接收回报、综合结果、完成 → 向主级回报
3. 主智能体接收回报并向用户投递
1. depth-2 工作节点完成 → 向其父级depth-1 编排器)回传
2. depth-1 编排器接收回传、综合结果、完成 → 向主智能体回传
3. 主智能体接收回传并将其投递给用户
每一层只能看到其直接子级的回
每一层只能看到其直接子级的回
运维指导
操作指南
- 让子级工作启动一次,然后等待完成事件,而不是围绕 `sessions_list`、`sessions_history`、`/subagents list` 或
`exec` sleep 命令构建轮询循环。
- 如果子级完成事件在你已经发出最终答案之后才到达,
正确的后续处理是精确的静默令牌 `NO_REPLY` / `no_reply`
- 子任务启动一次后就等待完成事件,而不是围绕 `sessions_list`、`sessions_history`、`/subagents list` 或 `exec` sleep 命令构建轮询循环。
- 如果在你已经发送最终答案之后,某个子级完成事件才到达,正确的后续操作是输出精确的静默令牌 `NO_REPLY` / `no_reply`
### 按深度划分的工具策略
- 角色和控制范围会在生成时写入会话元数据。这可以防止扁平化或恢复后的会话键意外重新获得编排器权限。
- **深度 1编排器当 `maxSpawnDepth >= 2` 时)**:获得 `sessions_spawn`、`subagents`、`sessions_list`、`sessions_history`,以便管理其子级。其他会话/系统工具仍被拒绝。
- **深度 1叶子,当 `maxSpawnDepth == 1` 时)**:没有会话工具(当前默认行为)。
- **深度 2叶子工作者**:没有会话工具 —— 在深度 2 时始终拒绝 `sessions_spawn`。不能进一步生成子级。
- 角色和控制范围会在启动时写入会话元数据。这样可以防止扁平化或恢复后的会话键意外重新获得编排器权限。
- **Depth 1编排器当 `maxSpawnDepth >= 2` 时)**:获得 `sessions_spawn`、`subagents`、`sessions_list`、`sessions_history`,以便管理其子级。其他会话/系统工具仍被拒绝。
- **Depth 1叶子节点,当 `maxSpawnDepth == 1` 时)**:没有会话工具(当前默认行为)。
- **Depth 2叶子工作节点**:没有会话工具 —— 在 depth 2 下始终拒绝 `sessions_spawn`。不能继续启动更多子级。
### 每个智能体的生成上限
### 每个智能体的启动上限
每个智能体会话(任何深度)同时最多只能有 `maxChildrenPerAgent`默认5个活动子级。这可以防止单个编排器失控式扇出。
每个智能体会话(任意深度)同一时间最多只能有 `maxChildrenPerAgent`默认5个活跃子级。这可以防止单个编排器发生失控式扇出。
### 级联停止
停止一个深度 1 编排器会自动停止其所有深度 2 子级:
停止一个 depth-1 编排器会自动停止它的所有 depth-2 子级:
- 在主聊天中发送 `/stop` 会停止所有深度 1 智能体,并级联停止它们的深度 2 子级。
- `/subagents kill <id>` 会停止某个特定 sub-agent,并级联停止其子级。
- `/subagents kill all` 会停止该请求者的所有 sub-agents并进行级联
- 在主聊天中执行 `/stop` 会停止所有 depth-1 智能体,并级联停止它们的 depth-2 子级。
- `/subagents kill <id>` 会停止指定的子智能体,并级联停止其子级。
- `/subagents kill all` 会停止该请求者的所有子智能体,并执行级联停止
## 认证
Sub-agent 认证按**智能体 id**解析,而不是按会话类型:
子智能体认证按**智能体 id**解析,而不是按会话类型:
- Sub-agent 会话键是 `agent:<agentId>:subagent:<uuid>`
- 子智能体会话键为 `agent:<agentId>:subagent:<uuid>`
- 认证存储从该智能体的 `agentDir` 加载。
- 主智能体的认证配置文件会作为**回退**合并进来;若发生冲突,智能体配置文件覆盖主配置文件。
- 主智能体的认证配置文件会作为**回退**合并进来;若发生冲突,智能体配置文件覆盖主配置文件。
注意:这种合并是增量式的,因此主配置文件始终可作为回退。当前尚不支持每个智能体完全隔离的认证。
注意:这种合并是增量式的,因此主配置文件始终可作为回退使用。当前尚不支持每个智能体完全隔离的认证。
## 回
## 回
Sub-agents 通过回报步骤进行结果上报:
子智能体通过一个回传步骤进行结果上报:
- 回报步骤在 sub-agent 会话内部运行(而不是在请求者会话中)。
- 如果 sub-agent 精确回复 `ANNOUNCE_SKIP`,则不会发布任何内容。
- 如果最新的助手文本是精确的静默令牌 `NO_REPLY` / `no_reply`
即使之前存在可见的进度,回报输出也会被抑制。
- 否则投递取决于请求者深度:
- 顶层请求者会话使用一个带外部投递的后续 `agent` 调用(`deliver=true`
- 嵌套的请求者 subagent 会话会接收一个内部后续注入(`deliver=false`),以便编排器在会话内综合子级结果
- 如果某个嵌套的请求者 subagent 会话已不存在OpenClaw 会在可能时回退到该会话的请求者
- 对于顶层请求者会话,完成模式的直接投递会首先解析任何绑定的会话/线程路由和 hook 覆盖值,然后从请求者会话已存储的路由中补齐缺失的渠道目标字段。这样即使完成来源仅标识了渠道,也能将完成消息保留在正确的聊天/主题中。
- 在构建嵌套完成发现结果时,子级完成聚合会限定在当前请求者运行范围内,从而防止先前运行中陈旧的子级输出泄露到当前回报中。
- 在渠道适配器可用时,回报回复会保留线程/主题路由。
- 回报上下文会被规范化为稳定的内部事件块:
- source`subagent` 或 `cron`
- 子会话键/id
- 回报类型 + 任务标签
- 从运行时结果推导的状态行(`success`、`error`、`timeout` 或 `unknown`
- 从最新可见助手文本中选取的结果内容;否则为经过净化的最新 tool/toolResult 文本
- 一条后续指令,说明何时回复、何时保持静默
- 回传步骤在子智能体会话内部运行(不是在请求者会话中)。
- 如果子智能体的回复精确等于 `ANNOUNCE_SKIP`,则不会发布任何内容。
- 如果最新的 assistant 文本是精确的静默令牌 `NO_REPLY` / `no_reply`,即使此前存在可见进度,也会抑制回传输出。
- 否则,投递方式取决于请求者深度:
- 顶层请求者会话使用带外部投递的后续 `agent` 调用(`deliver=true`
- 嵌套的请求者子智能体会话接收一次内部后续注入(`deliver=false`),以便编排器在会话内综合子级结果
- 如果某个嵌套的请求者子智能体会话已经不存在OpenClaw 会在可用时回退到该会话的请求者
- 对于顶层请求者会话,完成模式下的直接投递会先解析任何已绑定的会话/线程路由和 hook 覆盖,然后从请求者会话存储的路由中补齐缺失的渠道目标字段。这样即使完成来源只标识了渠道,也能把完成消息发送到正确的聊天/话题中。
- 在构建嵌套完成结果时,子级完成聚合会限定在当前请求者运行范围内,从而防止先前运行中遗留的子级输出泄漏到当前回传中。
- 在渠道适配器可用时,回传回复会保留线程/话题路由。
- 回传上下文会规范化为稳定的内部事件块:
- 来源(`subagent` 或 `cron`
- 子级会话 key/id
- 回传类型 + 任务标签
- 从运行时结果推导出的状态行(`success`、`error`、`timeout` 或 `unknown`
- 从最新可见 assistant 文本中选取的结果内容;否则使用经过清理的最新 `tool/toolResult` 文本;终态失败运行会报告失败状态,而不会重放已捕获的回复文本
- 一条后续指令,说明何时应回复、何时应保持静默
- `Status` 不是从模型输出推断的;它来自运行时结果信号。
- 超时时,如果子级只执行到了工具调用阶段,回报可以将那段历史折叠为简短的部分进度摘要,而不是重放原始工具输出。
- 超时时,如果子级只执行到了工具调用阶段,回传可以将这段历史折叠为简短的部分进展摘要,而不是重放原始工具输出。
报载荷在末尾包含一行统计信息(即使被包装):
传负载在末尾包含一行统计信息(即使被包装也是如此
- 运行时(例如 `runtime 5m12s`
- Token 用量input/output/total
- 当配置了模型定价时的估算成本(`models.providers.*.models[].cost`
- `sessionKey`、`sessionId` 和转录路径(这样主智能体可以通过 `sessions_history` 获取历史,或在磁盘上检查文件)
- 内部元数据仅用于编排;面向用户的回复应以正常助手语气改写
- 运行时(例如 `runtime 5m12s`
- 令牌使用量(输入/输出/总计
- 如果已配置模型定价(`models.providers.*.models[].cost`),则包含估算成本
- `sessionKey`、`sessionId` 和转录路径(这样主智能体可以通过 `sessions_history` 获取历史记录,或直接检查磁盘上的文件)
- 内部元数据仅用于编排;面向用户的回复应使用正常 assistant 语气重新表述
`sessions_history` 是更安全的编排路径:
- 会先对 assistant 回忆进行规范化:
- 移除 thinking 标签
- 移除 `<relevant-memories>` / `<relevant_memories>` 脚手架块
- 移除纯文本工具调用 XML 载荷块,如 `<tool_call>...</tool_call>`
`<function_call>...</function_call>`、`<tool_calls>...</tool_calls>` 和
`<function_calls>...</function_calls>`,包括那些从未正常闭合的截断载荷
- 移除已降级的工具调用/结果脚手架和历史上下文标记
- 移除泄露的模型控制令牌,例如 `<|assistant|>`、其他 ASCII
`<|...|>` 令牌,以及全角 `<...>` 变体
- 移除格式错误的 MiniMax 工具调用 XML
- 类似凭证/token 的文本会被脱敏
- 长块可能会被截断
- 非常大的历史可能会丢弃较早的行,或者用
`[sessions_history omitted: message too large]`
替换一个过大的行
- 当你需要完整逐字节转录时,回退方案是在磁盘上检查原始转录
- assistant 回溯会先进行规范化:
- 去除 thinking 标签
- 去除 `<relevant-memories>` / `<relevant_memories>` 脚手架块
- 去除纯文本工具调用 XML 负载块,例如 `<tool_call>...</tool_call>`、`<function_call>...</function_call>`、`<tool_calls>...</tool_calls>` 和 `<function_calls>...</function_calls>`,包括那些从未正常闭合的截断负载
- 去除降级后的工具调用/结果脚手架和历史上下文标记
- 去除泄漏的模型控制令牌,例如 `<|assistant|>`、其他 ASCII `<|...|>` 令牌,以及全角变体 `<...>`
- 去除格式错误的 MiniMax 工具调用 XML
- 类凭证/令牌的文本会被脱敏
- 长内容块可能会被截断
- 非常大的历史记录可能会丢弃较旧的行,或用 `[sessions_history omitted: message too large]` 替换过大的行
- 当你需要完整逐字节转录时,回退方案是直接检查磁盘上的原始转录文件
## 工具策略(sub-agent 工具)
## 工具策略(子智能体工具)
默认情况下,sub-agents 获得**除会话工具**和系统工具之外的**所有工具**
默认情况下,子智能体获得**除会话工具和系统工具之外的所有工具**
- `sessions_list`
- `sessions_history`
- `sessions_send`
- `sessions_spawn`
这里的 `sessions_history` 仍然是一个有界、经过净化的回忆视图;它
不是原始转录转储。
这里的 `sessions_history` 仍然是一个有边界、经过清理的回溯视图;它不是原始转录转储。
`maxSpawnDepth >= 2` 时,深度 1 的编排型 sub-agents 还会额外获得 `sessions_spawn`、`subagents`、`sessions_list` 和 `sessions_history`,以便管理其子级。
`maxSpawnDepth >= 2` 时,depth-1 编排器子智能体还会额外获得 `sessions_spawn`、`subagents`、`sessions_list` 和 `sessions_history`,以便管理其子级。
可通过配置覆盖:
@ -316,7 +304,7 @@ Sub-agents 通过回报步骤进行结果上报:
tools: {
// deny 优先生效
deny: ["gateway", "cron"],
// 如果设置 allow则变为仅 allow 模式deny 仍然优先生效
// 如果设置了 allow则变为仅允许 allow 中的工具deny 仍然优先
// allow: ["read", "exec", "process"]
},
},
@ -326,21 +314,21 @@ Sub-agents 通过回报步骤进行结果上报:
## 并发
Sub-agents 使用一个专用的进程内队列 lane
子智能体使用专用的进程内队列 lane
- Lane 名称:`subagent`
- lane 名称:`subagent`
- 并发数:`agents.defaults.subagents.maxConcurrent`(默认 `8`
## 停止
- 在请求者聊天中发送 `/stop` 会中止请求者会话,并停止由其生成的任何活动 sub-agent 运行,同时级联到嵌套子级。
- `/subagents kill <id>` 会停止某个特定 sub-agent并级联到其子级。
- 在请求者聊天中发送 `/stop` 会中止请求者会话,并停止所有由其启动的活跃子智能体运行,同时级联停止嵌套子级。
- `/subagents kill <id>` 会停止指定的子智能体,并级联停止其子级。
## 限制
- Sub-agent 回报是**尽力而为**的。如果 gateway 重启,待处理的“回报给上游”工作会丢失。
- Sub-agents 仍共享同一个 gateway 进程资源;请将 `maxConcurrent` 视为一个安全阀。
- 子智能体回传是**尽力而为**的。如果 Gateway 网关重启,待处理的“回传结果”工作会丢失。
- 子智能体仍然共享同一个 Gateway 网关进程资源;请将 `maxConcurrent` 视为安全阀。
- `sessions_spawn` 始终是非阻塞的:它会立即返回 `{ status: "accepted", runId, childSessionKey }`
- Sub-agent 上下文只会注入 `AGENTS.md` + `TOOLS.md`(不包括 `SOUL.md`、`IDENTITY.md`、`USER.md`、`HEARTBEAT.md` 或 `BOOTSTRAP.md`)。
- 最大嵌套深度为 5`maxSpawnDepth` 范围15。大多数使用场景推荐深度 2。
- `maxChildrenPerAgent` 限制每个会话的活子级数量默认5范围120
- 子智能体上下文只会注入 `AGENTS.md` + `TOOLS.md`(不会注入 `SOUL.md`、`IDENTITY.md`、`USER.md`、`HEARTBEAT.md` 或 `BOOTSTRAP.md`)。
- 最大嵌套深度为 5`maxSpawnDepth` 范围15。大多数场景建议使用 depth 2。
- `maxChildrenPerAgent` 限制每个会话的活子级数量默认5范围120