diff --git a/docs/zh-CN/help/testing.md b/docs/zh-CN/help/testing.md
index 4e673159b..2d0a52035 100644
--- a/docs/zh-CN/help/testing.md
+++ b/docs/zh-CN/help/testing.md
@@ -3,32 +3,33 @@ read_when:
- 在本地或 CI 中运行测试
- 为模型/提供商缺陷添加回归测试
- 调试 Gateway 网关 + 智能体行为
-summary: 测试工具包:单元/e2e/实时套件、Docker 运行器,以及每项测试涵盖的内容
+summary: 测试工具包:unit/e2e/live 测试套件、Docker 运行器,以及每项测试涵盖的内容
title: 测试
x-i18n:
- generated_at: "2026-05-04T21:06:49Z"
+ generated_at: "2026-05-04T21:15:13Z"
model: gpt-5.5
provider: openai
- source_hash: f2c4210847ca14db8aebd17e3a5cf84cf09190ead1d34e8c3068eab20557dbf6
+ source_hash: 9fec86c0e3843a3ad0dcc686f2b942c202af7dd23c33cf55ba384a9643702030
source_path: help/testing.md
workflow: 16
---
-OpenClaw 有三个 Vitest 套件(单元/集成、e2e、实时)以及一小组 Docker 运行器。本文档是一份“我们如何测试”指南:
+OpenClaw 有三套 Vitest 测试套件(单元/集成、e2e、真实环境)和少量
+Docker runner。本文档是一份“我们如何测试”指南:
-- 每个套件覆盖什么(以及它有意_不_覆盖什么)。
+- 每个套件覆盖什么(以及它刻意_不_覆盖什么)。
- 常见工作流(本地、推送前、调试)应运行哪些命令。
-- 实时测试如何发现凭证并选择模型/提供商。
-- 如何为真实世界的模型/提供商问题添加回归测试。
+- 真实环境测试如何发现凭证并选择模型/提供商。
+- 如何为真实世界中的模型/提供商问题添加回归测试。
-**QA 栈(qa-lab、qa-channel、实时传输通道)**在单独文档中说明:
+**QA 栈(qa-lab、qa-channel、真实传输通道)**另有单独文档:
-- [QA overview](/zh-CN/concepts/qa-e2e-automation) — 架构、命令表面、场景编写。
+- [QA overview](/zh-CN/concepts/qa-e2e-automation) — 架构、命令面、场景编写。
- [Matrix QA](/zh-CN/concepts/qa-matrix) — `pnpm openclaw qa matrix` 的参考。
-- [QA channel](/zh-CN/channels/qa-channel) — 仓库支持场景使用的合成传输插件。
+- [QA channel](/zh-CN/channels/qa-channel) — 由仓库支持的场景使用的合成传输插件。
-本页介绍如何运行常规测试套件以及 Docker/Parallels 运行器。下面的 QA 专用运行器部分([QA 专用运行器](#qa-specific-runners))列出了具体的 `qa` 调用,并指向上面的参考资料。
+本页涵盖常规测试套件和 Docker/Parallels runner 的运行方式。下面的 QA 专用 runner 小节([QA 专用 runner](#qa-specific-runners))列出具体的 `qa` 调用,并指回上面的参考文档。
## 快速开始
@@ -37,86 +38,136 @@ OpenClaw 有三个 Vitest 套件(单元/集成、e2e、实时)以及一小
- 完整门禁(推送前预期运行):`pnpm build && pnpm check && pnpm check:test-types && pnpm test`
- 在资源充足的机器上更快运行本地完整套件:`pnpm test:max`
-- 直接的 Vitest 监视循环:`pnpm test:watch`
-- 直接文件定位现在也会路由扩展/渠道路径:`pnpm test extensions/discord/src/monitor/message-handler.preflight.test.ts`
-- 当你在迭代单个失败时,优先运行定向测试。
+- 直接 Vitest 监听循环:`pnpm test:watch`
+- 直接按文件定位现在也会路由扩展/渠道路径:`pnpm test extensions/discord/src/monitor/message-handler.preflight.test.ts`
+- 当你正在迭代单个失败时,优先使用定向运行。
- Docker 支持的 QA 站点:`pnpm qa:lab:up`
- Linux VM 支持的 QA 通道:`pnpm openclaw qa suite --runner multipass --scenario channel-chat-baseline`
-当你改动测试或想获得额外信心时:
+当你触碰测试或想要额外信心时:
- 覆盖率门禁:`pnpm test:coverage`
- E2E 套件:`pnpm test:e2e`
调试真实提供商/模型时(需要真实凭证):
-- 实时套件(模型 + Gateway 网关工具/图像探测):`pnpm test:live`
-- 安静地定位一个实时文件:`pnpm test:live -- src/agents/models.profiles.live.test.ts`
-- 运行时性能报告:调度 `OpenClaw Performance`,使用 `live_gpt54=true` 运行一次真实的 `openai/gpt-5.4` 智能体回合,或使用 `deep_profile=true` 生成 Kova CPU/堆/跟踪工件。当配置了 `CLAWGRIT_REPORTS_TOKEN` 时,每日定时运行会将模拟提供商、深度剖析和 GPT 5.4 通道工件发布到 `openclaw/clawgrit-reports`。模拟提供商报告还包含源代码级 Gateway 网关启动、内存、插件压力、重复假模型 hello-loop 和 CLI 启动数据。
-- Docker 实时模型扫描:`pnpm test:docker:live-models`
- - 现在每个选中的模型都会运行一个文本回合以及一个小型类文件读取探测。元数据声明支持 `image` 输入的模型还会运行一个微型图像回合。隔离提供商失败时,可使用 `OPENCLAW_LIVE_MODEL_FILE_PROBE=0` 或 `OPENCLAW_LIVE_MODEL_IMAGE_PROBE=0` 禁用额外探测。
- - CI 覆盖:每日 `OpenClaw Scheduled Live And E2E Checks` 和手动 `OpenClaw Release Checks` 都会以 `include_live_suites: true` 调用可复用的实时/E2E 工作流,其中包含按提供商分片的独立 Docker 实时模型矩阵任务。
- - 对于聚焦的 CI 重跑,调度 `OpenClaw Live And E2E Checks (Reusable)`,并设置 `include_live_suites: true` 和 `live_models_only: true`。
- - 将新的高信号提供商密钥添加到 `scripts/ci-hydrate-live-auth.sh`,以及 `.github/workflows/openclaw-live-and-e2e-checks-reusable.yml` 及其定时/发布调用方。
+- 真实环境套件(模型 + Gateway 网关工具/图片探测):`pnpm test:live`
+- 静默定位一个真实环境文件:`pnpm test:live -- src/agents/models.profiles.live.test.ts`
+- 运行时性能报告:调度 `OpenClaw Performance`,并设置
+ `live_gpt54=true` 以进行一次真实的 `openai/gpt-5.4` 智能体轮次,或设置
+ `deep_profile=true` 以生成 Kova CPU/堆/跟踪工件。每日定时运行会在配置
+ `CLAWGRIT_REPORTS_TOKEN` 时,将 mock-provider、deep-profile 和 GPT 5.4 通道工件发布到
+ `openclaw/clawgrit-reports`。mock-provider 报告还包括源码级 Gateway 网关启动、内存、
+ 插件压力、重复 fake-model hello-loop,以及 CLI 启动数据。
+- Docker 真实模型扫描:`pnpm test:docker:live-models`
+ - 每个选中的模型现在会运行一个文本轮次和一个小型文件读取风格探测。
+ 元数据声明支持 `image` 输入的模型还会运行一次小型图片轮次。
+ 在隔离提供商失败时,可用 `OPENCLAW_LIVE_MODEL_FILE_PROBE=0` 或
+ `OPENCLAW_LIVE_MODEL_IMAGE_PROBE=0` 禁用额外探测。
+ - CI 覆盖范围:每日 `OpenClaw Scheduled Live And E2E Checks` 和手动
+ `OpenClaw Release Checks` 都会调用可复用的真实环境/E2E 工作流,并设置
+ `include_live_suites: true`,其中包括按提供商分片的独立 Docker 真实模型
+ 矩阵任务。
+ - 对于定向 CI 重跑,调度 `OpenClaw Live And E2E Checks (Reusable)`,
+ 并设置 `include_live_suites: true` 和 `live_models_only: true`。
+ - 将新的高信号提供商密钥添加到 `scripts/ci-hydrate-live-auth.sh`,
+ 以及 `.github/workflows/openclaw-live-and-e2e-checks-reusable.yml` 和它的
+ 定时/发布调用方。
- 原生 Codex 绑定聊天冒烟测试:`pnpm test:docker:live-codex-bind`
- - 针对 Codex 应用服务器路径运行一个 Docker 实时通道,使用 `/codex bind` 绑定一个合成 Slack 私信,执行 `/codex fast` 和 `/codex permissions`,然后验证普通回复和图像附件通过原生插件绑定路由,而不是通过 ACP。
-- Codex 应用服务器 harness 冒烟测试:`pnpm test:docker:live-codex-harness`
- - 通过插件拥有的 Codex 应用服务器 harness 运行 Gateway 网关智能体回合,验证 `/codex status` 和 `/codex models`,默认还会执行图像、cron MCP、子智能体和 Guardian 探测。隔离其他 Codex 应用服务器失败时,可使用 `OPENCLAW_LIVE_CODEX_HARNESS_SUBAGENT_PROBE=0` 禁用子智能体探测。若要进行聚焦的子智能体检查,请禁用其他探测:`OPENCLAW_LIVE_CODEX_HARNESS_IMAGE_PROBE=0 OPENCLAW_LIVE_CODEX_HARNESS_MCP_PROBE=0 OPENCLAW_LIVE_CODEX_HARNESS_GUARDIAN_PROBE=0 OPENCLAW_LIVE_CODEX_HARNESS_SUBAGENT_PROBE=1 pnpm test:docker:live-codex-harness`。
- 除非设置了 `OPENCLAW_LIVE_CODEX_HARNESS_SUBAGENT_ONLY=0`,否则这会在子智能体探测后退出。
+ - 针对 Codex app-server 路径运行 Docker 真实环境通道,使用 `/codex bind` 绑定一个合成
+ Slack 私信,执行 `/codex fast` 和
+ `/codex permissions`,然后验证普通回复和图片附件通过原生插件绑定而不是 ACP 路由。
+- Codex app-server harness 冒烟测试:`pnpm test:docker:live-codex-harness`
+ - 通过插件拥有的 Codex app-server harness 运行 Gateway 网关智能体轮次,
+ 验证 `/codex status` 和 `/codex models`,并默认执行图片、
+ cron MCP、子智能体和 Guardian 探测。在隔离其他 Codex
+ app-server 失败时,可用
+ `OPENCLAW_LIVE_CODEX_HARNESS_SUBAGENT_PROBE=0` 禁用子智能体探测。若要定向检查子智能体,请禁用其他探测:
+ `OPENCLAW_LIVE_CODEX_HARNESS_IMAGE_PROBE=0 OPENCLAW_LIVE_CODEX_HARNESS_MCP_PROBE=0 OPENCLAW_LIVE_CODEX_HARNESS_GUARDIAN_PROBE=0 OPENCLAW_LIVE_CODEX_HARNESS_SUBAGENT_PROBE=1 pnpm test:docker:live-codex-harness`。
+ 除非设置
+ `OPENCLAW_LIVE_CODEX_HARNESS_SUBAGENT_ONLY=0`,否则它会在子智能体探测后退出。
- Crestodian 救援命令冒烟测试:`pnpm test:live:crestodian-rescue-channel`
- - 针对消息渠道救援命令表面的选择加入式双保险检查。它会执行 `/crestodian status`,排队一个持久模型变更,回复 `/crestodian yes`,并验证审计/配置写入路径。
-- Crestodian 规划器 Docker 冒烟测试:`pnpm test:docker:crestodian-planner`
- - 在没有配置的容器中运行 Crestodian,`PATH` 上放置一个假的 Claude CLI,并验证模糊规划器回退会转换为带审计的类型化配置写入。
+ - 针对消息渠道救援命令面的选择性双保险检查。
+ 它会执行 `/crestodian status`,排队一个持久模型
+ 变更,回复 `/crestodian yes`,并验证审计/配置写入路径。
+- Crestodian planner Docker 冒烟测试:`pnpm test:docker:crestodian-planner`
+ - 在无配置容器中运行 Crestodian,并在 `PATH` 上放置一个假 Claude CLI,
+ 验证模糊 planner 回退会转换为经过审计的类型化配置写入。
- Crestodian 首次运行 Docker 冒烟测试:`pnpm test:docker:crestodian-first-run`
- - 从空的 OpenClaw 状态目录开始,将裸 `openclaw` 路由到 Crestodian,应用设置/模型/智能体/Discord 插件 + SecretRef 写入,验证配置,并验证审计条目。同一个 Ring 0 设置路径也在 QA Lab 中由 `pnpm openclaw qa suite --scenario crestodian-ring-zero-setup` 覆盖。
-- Moonshot/Kimi 成本冒烟测试:设置 `MOONSHOT_API_KEY` 后,运行 `openclaw models list --provider moonshot --json`,然后针对 `moonshot/kimi-k2.6` 运行一个隔离的 `openclaw agent --local --session-id live-kimi-cost --message 'Reply exactly: KIMI_LIVE_OK' --thinking off --json`。验证 JSON 报告 Moonshot/K2.6,并且助手转录记录存储了规范化的 `usage.cost`。
+ - 从空的 OpenClaw 状态目录开始,将裸 `openclaw` 路由到
+ Crestodian,应用设置/模型/智能体/Discord 插件 + SecretRef 写入,
+ 验证配置,并验证审计条目。同一条 Ring 0 设置路径也在 QA Lab 中通过
+ `pnpm openclaw qa suite --scenario crestodian-ring-zero-setup` 覆盖。
+- Moonshot/Kimi 成本冒烟测试:设置 `MOONSHOT_API_KEY` 后,运行
+ `openclaw models list --provider moonshot --json`,然后针对
+ `moonshot/kimi-k2.6` 运行一个隔离的
+ `openclaw agent --local --session-id live-kimi-cost --message 'Reply exactly: KIMI_LIVE_OK' --thinking off --json`。
+ 验证 JSON 报告 Moonshot/K2.6,并且助手转录存储了规范化的 `usage.cost`。
-当你只需要一个失败用例时,优先通过下面描述的 allowlist 环境变量缩小实时测试范围。
+当你只需要一个失败用例时,优先通过下面介绍的 allowlist 环境变量缩小真实环境测试范围。
-## QA 专用运行器
+## QA 专用 runner
-当你需要 QA Lab 的真实感时,这些命令位于主测试套件旁边:
+当你需要 QA-lab 的真实感时,这些命令与主测试套件并列使用:
-CI 在专用工作流中运行 QA Lab。Agentic parity 嵌套在 `QA-Lab - All Lanes` 和发布验证下,不是独立的 PR 工作流。广泛验证应使用 `Full Release Validation`,并设置 `rerun_group=qa-parity`,或使用 release-checks QA 组。`QA-Lab - All Lanes` 每晚在 `main` 上运行,也可通过手动调度运行,并将模拟 parity 通道、实时 Matrix 通道、Convex 管理的实时 Telegram 通道和 Convex 管理的实时 Discord 通道作为并行任务。定时 QA 和发布检查会显式传入 Matrix `--profile fast`,而 Matrix CLI 和手动工作流输入的默认值仍为 `all`;手动调度可将 `all` 分片为 `transport`、`media`、`e2ee-smoke`、`e2ee-deep` 和 `e2ee-cli` 任务。`OpenClaw Release Checks` 在发布批准前运行 parity 以及快速 Matrix 和 Telegram 通道,发布传输检查使用 `mock-openai/gpt-5.5`,以保持确定性并避免正常提供商插件启动。这些实时传输 Gateway 网关会禁用记忆搜索;记忆行为仍由 QA parity 套件覆盖。
+CI 会在专用工作流中运行 QA Lab。Agentic parity 嵌套在
+`QA-Lab - All Lanes` 和发布验证下,不是独立的 PR 工作流。
+广泛验证应使用 `Full Release Validation`,并设置
+`rerun_group=qa-parity`,或使用 release-checks QA 组。`QA-Lab - All Lanes`
+每晚在 `main` 上运行,也可手动调度,并将 mock parity 通道、真实
+Matrix 通道、Convex 托管的真实 Telegram 通道,以及 Convex 托管的真实 Discord
+通道作为并行任务运行。定时 QA 和发布检查会显式传入 Matrix
+`--profile fast`,而 Matrix CLI 和手动工作流输入的默认值仍为
+`all`;手动调度可以将 `all` 分片为 `transport`、
+`media`、`e2ee-smoke`、`e2ee-deep` 和 `e2ee-cli` 任务。`OpenClaw Release
+Checks` 会在发布批准前运行 parity,以及快速 Matrix 和 Telegram 通道,
+发布传输检查使用 `mock-openai/gpt-5.5`,以保持确定性并避免正常的提供商插件启动。这些真实传输
+Gateway 网关会禁用记忆搜索;记忆行为仍由 QA parity
+套件覆盖。
-完整发布实时媒体分片使用 `ghcr.io/openclaw/openclaw-live-media-runner:ubuntu-24.04`,其中已经包含 `ffmpeg` 和 `ffprobe`。Docker 实时模型/后端分片使用共享的 `ghcr.io/openclaw/openclaw-live-test:` 镜像,该镜像针对每个选中的提交只构建一次,然后用 `OPENCLAW_SKIP_DOCKER_BUILD=1` 拉取,而不是在每个分片内重新构建。
+完整发布的真实媒体分片使用
+`ghcr.io/openclaw/openclaw-live-media-runner:ubuntu-24.04`,其中已经包含
+`ffmpeg` 和 `ffprobe`。Docker 真实模型/后端分片使用共享的
+`ghcr.io/openclaw/openclaw-live-test:` 镜像,该镜像会为每个选中的
+提交构建一次,然后通过 `OPENCLAW_SKIP_DOCKER_BUILD=1` 拉取它,而不是在
+每个分片内重新构建。
- `pnpm openclaw qa suite`
- 直接在主机上运行由仓库支持的 QA 场景。
- - 默认使用隔离的 Gateway 网关 worker 并行运行多个选定场景。`qa-channel` 默认并发数为 4(受选定场景数量限制)。使用 `--concurrency ` 调整 worker 数量,或使用 `--concurrency 1` 运行较旧的串行通道。
- - 当任一场景失败时以非零状态退出。当你想要产物但不想要失败退出码时,使用 `--allow-failures`。
- - 支持提供商模式 `live-frontier`、`mock-openai` 和 `aimock`。`aimock` 会启动一个由本地 AIMock 支持的提供商服务器,用于实验性的 fixture 和协议模拟覆盖,同时不会取代具备场景感知能力的 `mock-openai` 通道。
+ - 默认使用隔离的 Gateway 网关 worker 并行运行多个已选场景。`qa-channel` 默认并发数为 4(受已选场景数量限制)。使用 `--concurrency ` 调整 worker 数量,或使用 `--concurrency 1` 运行旧的串行通道。
+ - 任一场景失败时以非零状态退出。当你想生成产物但不想返回失败退出码时,使用 `--allow-failures`。
+ - 支持提供商模式 `live-frontier`、`mock-openai` 和 `aimock`。`aimock` 会启动一个由本地 AIMock 支撑的提供商服务器,用于实验性的 fixture 和协议 mock 覆盖,同时不会替代具备场景感知能力的 `mock-openai` 通道。
- `pnpm test:plugins:kitchen-sink-live`
- - 通过 QA Lab 运行实时 OpenAI Kitchen Sink 插件全套测试。它会安装外部 Kitchen Sink 包,验证插件 SDK 表面清单,探测 `/healthz` 和 `/readyz`,记录 Gateway 网关 CPU/RSS 证据,运行一次实时 OpenAI 回合,并检查对抗性诊断。需要实时 OpenAI 凭证,例如 `OPENAI_API_KEY`。
+ - 通过 QA Lab 运行实时 OpenAI Kitchen Sink 插件压力测试。它会安装外部 Kitchen Sink 包、验证插件 SDK 表面清单、探测 `/healthz` 和 `/readyz`、记录 Gateway 网关 CPU/RSS 证据、运行一次实时 OpenAI 回合,并检查对抗性诊断。需要实时 OpenAI 凭证,例如 `OPENAI_API_KEY`。在已注入凭证的 Testbox 会话中,如果存在 `openclaw-testbox-env` helper,它会自动加载 Testbox 实时凭证配置。
- `pnpm test:gateway:cpu-scenarios`
- - 运行 Gateway 网关启动基准测试和一个小型模拟 QA Lab 场景包(`channel-chat-baseline`、`memory-failure-fallback`、`gateway-restart-inflight-run`),并在 `.artifacts/gateway-cpu-scenarios/` 下写入合并后的 CPU 观测摘要。
- - 默认只标记持续的高 CPU 观测(`--cpu-core-warn` 加 `--hot-wall-warn-ms`),因此短暂的启动突增会作为指标记录,而不会看起来像持续数分钟的 Gateway 网关占满回归。
- - 使用已构建的 `dist` 产物;当检出目录中还没有新鲜的运行时输出时,请先运行构建。
+ - 运行 Gateway 网关启动基准测试,以及一小组 mock QA Lab 场景包(`channel-chat-baseline`、`memory-failure-fallback`、`gateway-restart-inflight-run`),并在 `.artifacts/gateway-cpu-scenarios/` 下写入合并后的 CPU 观测摘要。
+ - 默认只标记持续高热 CPU 观测(`--cpu-core-warn` 加 `--hot-wall-warn-ms`),因此短暂的启动突增会作为指标记录,而不会看起来像持续数分钟的 Gateway 网关占满回归。
+ - 使用已构建的 `dist` 产物;当 checkout 中还没有新的运行时输出时,请先运行构建。
- `pnpm openclaw qa suite --runner multipass`
- - 在一次性 Multipass Linux VM 内运行同一套 QA 套件。
+ - 在一次性 Multipass Linux VM 中运行同一套 QA 套件。
- 保持与主机上的 `qa suite` 相同的场景选择行为。
- 复用与 `qa suite` 相同的提供商/模型选择标志。
- - 实时运行会转发适合 guest 的受支持 QA 凭证输入:基于环境变量的提供商密钥、QA 实时提供商配置路径,以及存在时的 `CODEX_HOME`。
- - 输出目录必须保留在仓库根目录下,以便 guest 可以通过挂载的工作区写回。
+ - 实时运行会转发对 guest 实用的受支持 QA 凭证输入:基于环境的提供商密钥、QA 实时提供商配置路径,以及存在时的 `CODEX_HOME`。
+ - 输出目录必须保持在仓库根目录下,以便 guest 能通过挂载的工作区写回。
- 在 `.artifacts/qa-e2e/...` 下写入常规 QA 报告和摘要,以及 Multipass 日志。
- `pnpm qa:lab:up`
- - 启动由 Docker 支持的 QA 站点,用于操作员风格的 QA 工作。
+ - 启动由 Docker 支撑的 QA 站点,用于操作员式 QA 工作。
- `pnpm test:docker:npm-onboard-channel-agent`
- - 从当前检出构建一个 npm tarball,在 Docker 中全局安装它,运行非交互式 OpenAI API 密钥新手引导,默认配置 Telegram,验证打包的插件运行时无需启动依赖修复即可加载,运行 Doctor,并针对模拟的 OpenAI 端点运行一个本地智能体回合。
- - 使用 `OPENCLAW_NPM_ONBOARD_CHANNEL=discord` 通过 Discord 运行同一条打包安装通道。
+ - 从当前 checkout 构建 npm tarball,在 Docker 中全局安装它,运行非交互式 OpenAI API key 新手引导,默认配置 Telegram,验证打包后的插件运行时无需启动时依赖修复即可加载,运行 Doctor,并针对 mock OpenAI 端点运行一次本地 agent 回合。
+ - 使用 `OPENCLAW_NPM_ONBOARD_CHANNEL=discord` 可用 Discord 运行同一条打包安装通道。
- `pnpm test:docker:session-runtime-context`
- - 为嵌入式运行时上下文 transcript 运行确定性的已构建应用 Docker smoke。它会验证隐藏的 OpenClaw 运行时上下文会作为非显示自定义消息持久化,而不是泄漏到可见的用户回合中,然后植入一个受影响的损坏会话 JSONL,并验证 `openclaw doctor --fix` 会将其重写到活动分支并创建备份。
+ - 为嵌入式运行时上下文转录运行确定性的已构建应用 Docker 冒烟测试。它验证隐藏的 OpenClaw 运行时上下文会作为非显示自定义消息持久化,而不是泄漏到可见的用户回合中;随后种下一个受影响的损坏会话 JSONL,并验证 `openclaw doctor --fix` 会将其重写到活动分支并创建备份。
- `pnpm test:docker:npm-telegram-live`
- - 在 Docker 中安装一个 OpenClaw 包候选版本,运行已安装包的新手引导,通过已安装的 CLI 配置 Telegram,然后复用实时 Telegram QA 通道,并将该已安装包作为被测系统 Gateway 网关。
- - 默认使用 `OPENCLAW_NPM_TELEGRAM_PACKAGE_SPEC=openclaw@beta`;设置 `OPENCLAW_NPM_TELEGRAM_PACKAGE_TGZ=/path/to/openclaw-current.tgz` 或 `OPENCLAW_CURRENT_PACKAGE_TGZ`,即可测试已解析的本地 tarball,而不是从注册表安装。
- - 使用与 `pnpm openclaw qa telegram` 相同的 Telegram 环境凭据或 Convex 凭据来源。对于 CI/发布自动化,设置 `OPENCLAW_NPM_TELEGRAM_CREDENTIAL_SOURCE=convex`,以及 `OPENCLAW_QA_CONVEX_SITE_URL` 和角色密钥。如果 CI 中存在 `OPENCLAW_QA_CONVEX_SITE_URL` 和 Convex 角色密钥,Docker wrapper 会自动选择 Convex。
- - wrapper 会在 Docker 构建/安装工作之前验证主机上的 Telegram 或 Convex 凭据环境变量。仅在有意调试凭据前置设置时,才设置 `OPENCLAW_NPM_TELEGRAM_SKIP_CREDENTIAL_PREFLIGHT=1`。
- - `OPENCLAW_NPM_TELEGRAM_CREDENTIAL_ROLE=ci|maintainer` 仅为此通道覆盖共享的 `OPENCLAW_QA_CREDENTIAL_ROLE`。
- - GitHub Actions 将此通道作为手动维护者工作流 `NPM Telegram Beta E2E` 暴露。它不会在合并时运行。该工作流使用 `qa-live-shared` 环境和 Convex CI 凭据租约。
-- GitHub Actions 还暴露 `Package Acceptance`,用于针对一个候选包进行旁路产品证明。它接受受信任的 ref、已发布的 npm spec、HTTPS tarball URL 加 SHA-256,或来自另一次运行的 tarball artifact,将规范化的 `openclaw-current.tgz` 作为 `package-under-test` 上传,然后使用 smoke、package、product、full 或自定义通道 profile 运行现有 Docker E2E 调度器。设置 `telegram_mode=mock-openai` 或 `live-frontier`,即可针对同一个 `package-under-test` artifact 运行 Telegram QA 工作流。
- - 最新 beta 产品证明:
+ - 在 Docker 中安装一个 OpenClaw 包候选版本,运行已安装包的新手引导,通过已安装的 CLI 配置 Telegram,然后复用实时 Telegram QA 通道,并将该已安装包作为 SUT Gateway 网关。
+ - 默认值为 `OPENCLAW_NPM_TELEGRAM_PACKAGE_SPEC=openclaw@beta`;设置 `OPENCLAW_NPM_TELEGRAM_PACKAGE_TGZ=/path/to/openclaw-current.tgz` 或 `OPENCLAW_CURRENT_PACKAGE_TGZ`,可测试已解析的本地 tarball,而不是从注册表安装。
+ - 使用与 `pnpm openclaw qa telegram` 相同的 Telegram 环境凭证或 Convex 凭证来源。对于 CI/发布自动化,设置 `OPENCLAW_NPM_TELEGRAM_CREDENTIAL_SOURCE=convex`,并同时设置 `OPENCLAW_QA_CONVEX_SITE_URL` 和角色密钥。如果 CI 中存在 `OPENCLAW_QA_CONVEX_SITE_URL` 和 Convex 角色密钥,Docker wrapper 会自动选择 Convex。
+ - wrapper 会在 Docker 构建/安装工作之前,在主机上验证 Telegram 或 Convex 凭证环境。只有在刻意调试凭证前置设置时,才设置 `OPENCLAW_NPM_TELEGRAM_SKIP_CREDENTIAL_PREFLIGHT=1`。
+ - `OPENCLAW_NPM_TELEGRAM_CREDENTIAL_ROLE=ci|maintainer` 仅为这条通道覆盖共享的 `OPENCLAW_QA_CREDENTIAL_ROLE`。
+ - GitHub Actions 将这条通道公开为手动维护者工作流 `NPM Telegram Beta E2E`。它不会在合并时运行。该工作流使用 `qa-live-shared` 环境和 Convex CI 凭证租约。
+- GitHub Actions 还公开了 `Package Acceptance`,用于针对单个候选包进行旁路产品验证。它接受受信任的 ref、已发布 npm 规格、HTTPS tarball URL 加 SHA-256,或来自另一次运行的 tarball 产物,将规范化后的 `openclaw-current.tgz` 作为 `package-under-test` 上传,然后用 smoke、package、product、full 或自定义通道配置运行现有 Docker E2E 调度器。设置 `telegram_mode=mock-openai` 或 `live-frontier`,可针对同一个 `package-under-test` 产物运行 Telegram QA 工作流。
+ - 最新 beta 产品验证:
```bash
gh workflow run package-acceptance.yml --ref main \
@@ -126,7 +177,7 @@ gh workflow run package-acceptance.yml --ref main \
-f telegram_mode=mock-openai
```
-- 精确 tarball URL 证明需要摘要:
+- 精确 tarball URL 验证需要摘要:
```bash
gh workflow run package-acceptance.yml --ref main \
@@ -136,7 +187,7 @@ gh workflow run package-acceptance.yml --ref main \
-f suite_profile=package
```
-- Artifact 证明会从另一个 Actions 运行下载 tarball artifact:
+- 产物验证会从另一次 Actions 运行下载 tarball 产物:
```bash
gh workflow run package-acceptance.yml --ref main \
@@ -148,57 +199,57 @@ gh workflow run package-acceptance.yml --ref main \
- `pnpm test:docker:plugins`
- 在 Docker 中打包并安装当前 OpenClaw 构建,启动配置了 OpenAI 的 Gateway 网关,然后通过配置编辑启用内置渠道/插件。
- - 验证设置发现会让未配置的可下载插件保持缺席,第一次配置后的 Doctor 修复会显式安装每个缺失的可下载插件,并且第二次重启不会运行隐藏依赖修复。
- - 还会安装一个已知的较旧 npm baseline,在运行 `openclaw update --tag ` 前启用 Telegram,并验证候选版本的更新后 Doctor 会清理旧版插件依赖残留,而无需 harness 侧 postinstall 修复。
+ - 验证设置发现会让未配置的可下载插件保持缺席,第一次配置后的 Doctor 修复会显式安装每个缺失的可下载插件,并且第二次重启不会运行隐藏的依赖修复。
+ - 还会安装一个已知的旧版 npm 基线,在运行 `openclaw update --tag ` 之前启用 Telegram,并验证候选版本的更新后 Doctor 会清理旧版插件依赖残留,而无需 harness 侧 postinstall 修复。
- `pnpm test:parallels:npm-update`
- - 跨 Parallels guest 运行原生打包安装更新 smoke。每个选定平台会先安装请求的 baseline 包,然后在同一 guest 中运行已安装的 `openclaw update` 命令,并验证已安装版本、更新状态、Gateway 网关就绪状态和一个本地智能体回合。
- - 在针对一个 guest 迭代时使用 `--platform macos`、`--platform windows` 或 `--platform linux`。使用 `--json` 获取摘要 artifact 路径和各通道状态。
- - OpenAI 通道默认使用 `openai/gpt-5.5` 进行实时智能体回合证明。当有意验证另一个 OpenAI 模型时,传入 `--model ` 或设置 `OPENCLAW_PARALLELS_OPENAI_MODEL`。
- - 用主机超时包装长时间本地运行,以免 Parallels 传输卡顿耗尽剩余测试窗口:
+ - 跨 Parallels guest 运行原生打包安装更新冒烟测试。每个已选平台会先安装请求的基线包,然后在同一个 guest 中运行已安装的 `openclaw update` 命令,并验证已安装版本、更新 Status、Gateway 网关就绪性,以及一次本地 agent 回合。
+ - 迭代单个 guest 时使用 `--platform macos`、`--platform windows` 或 `--platform linux`。使用 `--json` 获取摘要产物路径和每条通道的 Status。
+ - OpenAI 通道默认使用 `openai/gpt-5.5` 进行实时 agent 回合验证。当刻意验证另一个 OpenAI 模型时,传入 `--model ` 或设置 `OPENCLAW_PARALLELS_OPENAI_MODEL`。
+ - 用主机超时包裹长时间本地运行,避免 Parallels 传输卡住耗尽剩余测试窗口:
```bash
timeout --foreground 150m pnpm test:parallels:npm-update -- --json
timeout --foreground 90m pnpm test:parallels:npm-update -- --platform windows --json
```
- - 脚本会在 `/tmp/openclaw-parallels-npm-update.*` 下写入嵌套通道日志。在假定外层 wrapper 挂起之前,先检查 `windows-update.log`、`macos-update.log` 或 `linux-update.log`。
- - Windows 更新在冷 guest 上可能会在更新后 Doctor 和包更新工作中花费 10 到 15 分钟;只要嵌套 npm debug 日志仍在推进,这仍然是健康状态。
- - 不要将这个聚合 wrapper 与单独的 Parallels macOS、Windows 或 Linux smoke 通道并行运行。它们共享 VM 状态,可能在快照恢复、包服务或 guest Gateway 网关状态上发生冲突。
- - 更新后证明会运行常规内置插件表面,因为语音、图像生成和媒体理解等能力 facade 是通过内置运行时 API 加载的,即使智能体回合本身只检查简单文本响应。
+ - 脚本会在 `/tmp/openclaw-parallels-npm-update.*` 下写入嵌套通道日志。在假定外层 wrapper 卡住之前,先检查 `windows-update.log`、`macos-update.log` 或 `linux-update.log`。
+ - Windows 更新在冷 guest 上可能会花 10 到 15 分钟执行更新后 Doctor 和包更新工作;只要嵌套 npm 调试日志还在推进,这仍然是健康状态。
+ - 不要将这个聚合 wrapper 与单独的 Parallels macOS、Windows 或 Linux 冒烟通道并行运行。它们共享 VM 状态,可能在快照恢复、包服务或 guest Gateway 网关状态上发生冲突。
+ - 更新后验证会运行常规内置插件表面,因为语音、图像生成和媒体理解等能力 facade 会通过内置运行时 API 加载,即使 agent 回合本身只检查简单文本响应。
- `pnpm openclaw qa aimock`
- - 只启动本地 AIMock 提供商服务器,用于直接协议 smoke 测试。
+ - 仅启动本地 AIMock 提供商服务器,用于直接协议冒烟测试。
- `pnpm openclaw qa matrix`
- - 针对由一次性 Docker 支持的 Tuwunel homeserver 运行 Matrix 实时 QA 通道。仅限源码检出,打包安装不会附带 `qa-lab`。
- - 完整 CLI、profile/场景目录、环境变量和 artifact 布局:[Matrix QA](/zh-CN/concepts/qa-matrix)。
+ - 针对一次性 Docker 支撑的 Tuwunel homeserver 运行 Matrix 实时 QA 通道。仅限源码 checkout,打包安装不会随附 `qa-lab`。
+ - 完整 CLI、配置文件/场景目录、环境变量和产物布局:[Matrix QA](/zh-CN/concepts/qa-matrix)。
- `pnpm openclaw qa telegram`
- - 使用来自环境变量的 driver 和 SUT bot token,针对真实私有群组运行 Telegram 实时 QA 通道。
- - 需要 `OPENCLAW_QA_TELEGRAM_GROUP_ID`、`OPENCLAW_QA_TELEGRAM_DRIVER_BOT_TOKEN` 和 `OPENCLAW_QA_TELEGRAM_SUT_BOT_TOKEN`。群组 ID 必须是数字 Telegram 聊天 ID。
- - 支持 `--credential-source convex` 以使用共享池化凭据。默认使用环境变量模式,或设置 `OPENCLAW_QA_CREDENTIAL_SOURCE=convex` 以选择池化租约。
- - 当任一场景失败时以非零状态退出。当你想要产物但不想要失败退出码时,使用 `--allow-failures`。
- - 需要同一个私有群组中的两个不同 bot,且 SUT bot 暴露 Telegram 用户名。
- - 为了稳定观测 bot 到 bot 通信,请在 `@BotFather` 中为两个 bot 启用 Bot-to-Bot Communication Mode,并确保 driver bot 可以观测群组 bot 流量。
- - 在 `.artifacts/qa-e2e/...` 下写入 Telegram QA 报告、摘要和 observed-messages artifact。回复场景包含从 driver 发送请求到观测到 SUT 回复的 RTT。
+ - 使用来自环境的 driver 和 SUT bot token,针对真实私有群组运行 Telegram 实时 QA 通道。
+ - 需要 `OPENCLAW_QA_TELEGRAM_GROUP_ID`、`OPENCLAW_QA_TELEGRAM_DRIVER_BOT_TOKEN` 和 `OPENCLAW_QA_TELEGRAM_SUT_BOT_TOKEN`。群组 id 必须是数字 Telegram chat id。
+ - 支持 `--credential-source convex` 以使用共享池化凭证。默认使用环境模式,或设置 `OPENCLAW_QA_CREDENTIAL_SOURCE=convex` 选择使用池化租约。
+ - 任一场景失败时以非零状态退出。当你想生成产物但不想返回失败退出码时,使用 `--allow-failures`。
+ - 需要同一私有群组中的两个不同 bot,且 SUT bot 需要公开 Telegram username。
+ - 为了稳定观察 bot 对 bot 通信,请在 `@BotFather` 中为两个 bot 启用 Bot-to-Bot Communication Mode,并确保 driver bot 能观察群组 bot 流量。
+ - 在 `.artifacts/qa-e2e/...` 下写入 Telegram QA 报告、摘要和已观测消息产物。回复场景包含从 driver 发送请求到观测到 SUT 回复的 RTT。
-实时传输通道共享一个标准契约,因此新的传输不会漂移;各通道覆盖矩阵位于 [QA overview → 实时传输覆盖](/zh-CN/concepts/qa-e2e-automation#live-transport-coverage)。`qa-channel` 是广泛的合成套件,不属于该矩阵。
+实时传输通道共享一个标准契约,避免新传输发生漂移;每条通道的覆盖矩阵位于 [QA overview → 实时传输覆盖](/zh-CN/concepts/qa-e2e-automation#live-transport-coverage)。`qa-channel` 是广泛的合成套件,不属于该矩阵。
-### 通过 Convex 共享 Telegram 凭据(v1)
+### 通过 Convex 共享 Telegram 凭证(v1)
-当为 `openclaw qa telegram` 启用 `--credential-source convex`(或 `OPENCLAW_QA_CREDENTIAL_SOURCE=convex`)时,QA Lab 会从由 Convex 支持的池中获取独占租约,在通道运行期间对该租约发送 heartbeat,并在关闭时释放租约。
+当为 `openclaw qa telegram` 启用 `--credential-source convex`(或 `OPENCLAW_QA_CREDENTIAL_SOURCE=convex`)时,QA lab 会从 Convex 支撑的池中获取一个独占租约,在通道运行期间对该租约发送 Heartbeat,并在关闭时释放该租约。
-参考 Convex 项目 scaffold:
+参考 Convex 项目脚手架:
- `qa/convex-credential-broker/`
-必需的环境变量:
+必需环境变量:
- `OPENCLAW_QA_CONVEX_SITE_URL`(例如 `https://your-deployment.convex.site`)
- 所选角色的一个密钥:
- `OPENCLAW_QA_CONVEX_SECRET_MAINTAINER` 用于 `maintainer`
- `OPENCLAW_QA_CONVEX_SECRET_CI` 用于 `ci`
-- 凭据角色选择:
+- 凭证角色选择:
- CLI:`--credential-role maintainer|ci`
- - 环境变量默认值:`OPENCLAW_QA_CREDENTIAL_ROLE`(在 CI 中默认为 `ci`,其他情况下默认为 `maintainer`)
+ - 环境默认值:`OPENCLAW_QA_CREDENTIAL_ROLE`(CI 中默认 `ci`,否则默认 `maintainer`)
可选环境变量:
@@ -208,7 +259,7 @@ gh workflow run package-acceptance.yml --ref main \
- `OPENCLAW_QA_CREDENTIAL_HTTP_TIMEOUT_MS`(默认 `15000`)
- `OPENCLAW_QA_CONVEX_ENDPOINT_PREFIX`(默认 `/qa-credentials/v1`)
- `OPENCLAW_QA_CREDENTIAL_OWNER_ID`(可选 trace id)
-- `OPENCLAW_QA_ALLOW_INSECURE_HTTP=1` 允许 local-only 开发使用 loopback `http://` Convex URL。
+- `OPENCLAW_QA_ALLOW_INSECURE_HTTP=1` 允许仅本地开发使用 loopback `http://` Convex URL。
`OPENCLAW_QA_CONVEX_SITE_URL` 在正常运行时应使用 `https://`。
@@ -224,7 +275,7 @@ pnpm openclaw qa credentials list --kind telegram
pnpm openclaw qa credentials remove --credential-id
```
-在 live 运行前使用 `doctor` 检查 Convex 站点 URL、broker secrets、endpoint prefix、HTTP timeout,以及 admin/list 可达性,且不会打印密钥值。在脚本和 CI 工具中使用 `--json` 获取机器可读输出。
+在实时运行前使用 `doctor` 检查 Convex 站点 URL、broker 密钥、端点前缀、HTTP 超时,以及 admin/list 可达性,且不会打印密钥值。在脚本和 CI 工具中使用 `--json` 获取机器可读输出。
默认端点契约(`OPENCLAW_QA_CONVEX_SITE_URL` + `/qa-credentials/v1`):
@@ -234,80 +285,79 @@ pnpm openclaw qa credentials remove --credential-id
- 耗尽/可重试:`{ status: "error", code: "POOL_EXHAUSTED" | "NO_CREDENTIAL_AVAILABLE", ... }`
- `POST /heartbeat`
- 请求:`{ kind, ownerId, actorRole, credentialId, leaseToken, leaseTtlMs }`
- - 成功:`{ status: "ok" }`(或空的 `2xx`)
+ - 成功:`{ status: "ok" }`(或空 `2xx`)
- `POST /release`
- 请求:`{ kind, ownerId, actorRole, credentialId, leaseToken }`
- - 成功:`{ status: "ok" }`(或空的 `2xx`)
-- `POST /admin/add`(仅限维护者密钥)
+ - 成功:`{ status: "ok" }`(或空 `2xx`)
+- `POST /admin/add`(仅维护者密钥)
- 请求:`{ kind, actorId, payload, note?, status? }`
- 成功:`{ status: "ok", credential }`
-- `POST /admin/remove`(仅限维护者密钥)
+- `POST /admin/remove`(仅维护者密钥)
- 请求:`{ credentialId, actorId }`
- 成功:`{ status: "ok", changed, credential }`
- - 活跃租约保护:`{ status: "error", code: "LEASE_ACTIVE", ... }`
-- `POST /admin/list`(仅限维护者密钥)
+ - 活跃 lease 保护:`{ status: "error", code: "LEASE_ACTIVE", ... }`
+- `POST /admin/list`(仅维护者密钥)
- 请求:`{ kind?, status?, includePayload?, limit? }`
- 成功:`{ status: "ok", credentials, count }`
Telegram kind 的 payload 形状:
- `{ groupId: string, driverToken: string, sutToken: string }`
-- `groupId` 必须是数字形式的 Telegram chat id 字符串。
-- `admin/add` 会为 `kind: "telegram"` 验证这个形状,并拒绝格式错误的 payload。
+- `groupId` 必须是数字形式的 Telegram 聊天 ID 字符串。
+- `admin/add` 会针对 `kind: "telegram"` 验证此形状,并拒绝格式错误的 payload。
### 向 QA 添加渠道
-新渠道适配器的架构和场景辅助器名称见 [QA overview → 添加渠道](/zh-CN/concepts/qa-e2e-automation#adding-a-channel)。最低要求:在共享的 `qa-lab` host seam 上实现 transport runner,在插件清单中声明 `qaRunners`,挂载为 `openclaw qa `,并在 `qa/scenarios/` 下编写场景。
+新渠道适配器的架构和场景辅助工具名称位于 [QA overview → 添加渠道](/zh-CN/concepts/qa-e2e-automation#adding-a-channel)。最低要求:在共享的 `qa-lab` host seam 上实现传输 runner,在插件清单中声明 `qaRunners`,挂载为 `openclaw qa `,并在 `qa/scenarios/` 下编写场景。
-## 测试套件(哪里运行什么)
+## 测试套件(在哪里运行什么)
-可以把这些套件理解为“真实程度递增”(同时 flakiness/成本也递增):
+可以把这些套件理解为“真实度递增”(同时不稳定性/成本也递增):
### 单元 / 集成(默认)
- 命令:`pnpm test`
-- 配置:非定向运行使用 `vitest.full-*.config.ts` 分片集,并且可能会把多项目分片展开为每项目配置以便并行调度
+- 配置:未定向运行使用 `vitest.full-*.config.ts` 分片集合,并可能将多项目分片展开为按项目配置,以便并行调度
- 文件:`src/**/*.test.ts`、`packages/**/*.test.ts` 和 `test/**/*.test.ts` 下的核心/单元清单;UI 单元测试在专用的 `unit-ui` 分片中运行
- 范围:
- 纯单元测试
- - 进程内集成测试(Gateway 网关认证、路由、工具、解析、配置)
+ - 进程内集成测试(Gateway 网关鉴权、路由、工具链、解析、配置)
- 已知 bug 的确定性回归测试
- 期望:
- 在 CI 中运行
- 不需要真实密钥
- 应该快速且稳定
- - 解析器和公共表面加载器测试必须用生成的微型插件 fixture 证明广泛的 `api.js` 和
- `runtime-api.js` 回退行为,而不是使用真实内置插件源码 API。真实插件 API 加载属于
+ - 解析器和公共表面加载器测试必须用生成的小型插件 fixture 证明宽泛的 `api.js` 和
+ `runtime-api.js` 回退行为,而不是使用真实内置插件源 API。真实插件 API 加载属于
插件自有的契约/集成套件。
- - 非定向 `pnpm test` 会运行十二个更小的分片配置(`core-unit-fast`、`core-unit-src`、`core-unit-security`、`core-unit-ui`、`core-unit-support`、`core-support-boundary`、`core-contracts`、`core-bundled`、`core-runtime`、`agentic`、`auto-reply`、`extensions`),而不是一个巨大的原生根项目进程。这样可以降低繁忙机器上的峰值 RSS,并避免 auto-reply/extension 工作饿死无关套件。
- - `pnpm test --watch` 仍然使用原生根 `vitest.config.ts` 项目图,因为多分片 watch 循环并不实用。
- - `pnpm test`、`pnpm test:watch` 和 `pnpm test:perf:imports` 会先通过作用域 lane 路由显式文件/目录目标,因此 `pnpm test extensions/discord/src/monitor/message-handler.preflight.test.ts` 不需要付出完整根项目启动成本。
- - `pnpm test:changed` 默认会把已变更的 git 路径展开为低成本的作用域 lane:直接测试编辑、同级 `*.test.ts` 文件、显式源码映射,以及本地导入图依赖项。配置/设置/包编辑不会 broad-run 测试,除非你明确使用 `OPENCLAW_TEST_CHANGED_BROAD=1 pnpm test:changed`。
- - `pnpm check:changed` 是窄范围工作的常规智能本地检查 gate。它会把 diff 分类为 core、core tests、extensions、extension tests、apps、docs、release metadata、live Docker tooling 和 tooling,然后运行匹配的 typecheck、lint 和 guard 命令。它不会运行 Vitest 测试;如需测试证明,请调用 `pnpm test:changed` 或显式 `pnpm test `。仅 release metadata 的版本 bump 会运行定向版本/配置/根依赖检查,并带有一个 guard,用来拒绝顶层版本字段之外的 package 变更。
- - live Docker ACP harness 编辑会运行聚焦检查:live Docker auth 脚本的 shell 语法检查和 live Docker scheduler dry-run。只有当 diff 限于 `scripts["test:docker:live-*"]` 时才会包含 `package.json` 变更;依赖、export、版本和其他 package 表面编辑仍使用更宽的 guard。
- - 来自 agents、commands、plugins、auto-reply helpers、`plugin-sdk` 和类似纯工具区域的轻导入单元测试会路由到 `unit-fast` lane,该 lane 会跳过 `test/setup-openclaw-runtime.ts`;有状态/运行时较重的文件仍留在现有 lane 上。
- - 选定的 `plugin-sdk` 和 `commands` 辅助源码文件也会把 changed-mode 运行映射到这些轻量 lane 中的显式同级测试,因此辅助器编辑可以避免重新运行该目录的完整重型套件。
- - `auto-reply` 为顶层核心辅助器、顶层 `reply.*` 集成测试,以及 `src/auto-reply/reply/**` 子树提供专用桶。CI 进一步把 reply 子树拆分为 agent-runner、dispatch 和 commands/state-routing 分片,避免某个导入较重的桶占据完整 Node 尾部时间。
- - 常规 PR/main CI 会有意跳过 extension 批量扫测和仅 release 使用的 `agentic-plugins` 分片。Full Release Validation 会为 release candidate 调度单独的 `Plugin Prerelease` 子 workflow,用于这些插件/extension 较重的套件。
+ - 未定向的 `pnpm test` 会运行十二个更小的分片配置(`core-unit-fast`、`core-unit-src`、`core-unit-security`、`core-unit-ui`、`core-unit-support`、`core-support-boundary`、`core-contracts`、`core-bundled`、`core-runtime`、`agentic`、`auto-reply`、`extensions`),而不是一个庞大的原生根项目进程。这会降低高负载机器上的峰值 RSS,并避免 auto-reply/extension 工作拖慢无关套件。
+ - `pnpm test --watch` 仍使用原生根 `vitest.config.ts` 项目图,因为多分片 watch 循环并不实用。
+ - `pnpm test`、`pnpm test:watch` 和 `pnpm test:perf:imports` 会先通过带作用域的 lane 路由显式文件/目录目标,因此 `pnpm test extensions/discord/src/monitor/message-handler.preflight.test.ts` 不必承担完整根项目启动开销。
+ - `pnpm test:changed` 默认会把变更的 git 路径展开到低成本的带作用域 lane:直接测试编辑、同级 `*.test.ts` 文件、显式源码映射,以及本地导入图依赖项。配置/设置/package 编辑不会广泛运行测试,除非你显式使用 `OPENCLAW_TEST_CHANGED_BROAD=1 pnpm test:changed`。
+ - `pnpm check:changed` 是窄范围工作的常规智能本地检查门禁。它会把 diff 分类为 core、core tests、extensions、extension tests、apps、docs、release metadata、live Docker tooling 和 tooling,然后运行匹配的 typecheck、lint 和 guard 命令。它不会运行 Vitest 测试;需要测试证明时,调用 `pnpm test:changed` 或显式的 `pnpm test `。仅发布元数据的版本号提升会运行定向版本/config/root-dependency 检查,并带有一个 guard,拒绝顶层 version 字段之外的 package 变更。
+ - Live Docker ACP harness 编辑会运行聚焦检查:live Docker 鉴权脚本的 shell 语法和 live Docker 调度器 dry-run。仅当 diff 限定在 `scripts["test:docker:live-*"]` 时才包含 `package.json` 变更;依赖、导出、版本和其他 package 表面编辑仍使用更宽泛的 guard。
+ - 来自 agents、commands、plugins、auto-reply helpers、`plugin-sdk` 以及类似纯工具区域的轻量导入单元测试,会路由到 `unit-fast` lane,该 lane 会跳过 `test/setup-openclaw-runtime.ts`;有状态/运行时较重的文件仍留在现有 lane 上。
+ - 选定的 `plugin-sdk` 和 `commands` 辅助源码文件也会把 changed-mode 运行映射到这些轻量 lane 中的显式同级测试,因此辅助工具编辑可以避免重新运行该目录的完整重型套件。
+ - `auto-reply` 为顶层 core helpers、顶层 `reply.*` 集成测试,以及 `src/auto-reply/reply/**` 子树设有专用 bucket。CI 会进一步把 reply 子树拆分为 agent-runner、dispatch 和 commands/state-routing 分片,避免一个导入很重的 bucket 占用完整 Node 尾部时间。
+ - 常规 PR/main CI 会有意跳过 extension 批量扫描和仅发布使用的 `agentic-plugins` 分片。完整发布验证会为发布候选触发单独的 `Plugin Prerelease` 子 workflow,用于这些插件/extension 较重的套件。
- - 修改 message-tool 发现输入或 compaction 运行时
- 上下文时,请保留两层覆盖率。
- - 为纯路由和归一化
- 边界添加聚焦辅助器回归测试。
+ - 当你更改消息工具发现输入或压缩运行时
+ 上下文时,请保留两个层级的覆盖率。
+ - 为纯路由和规范化边界添加聚焦的辅助工具回归测试。
- 保持嵌入式 runner 集成套件健康:
`src/agents/pi-embedded-runner/compact.hooks.test.ts`、
`src/agents/pi-embedded-runner/run.overflow-compaction.test.ts` 和
`src/agents/pi-embedded-runner/run.overflow-compaction.loop.test.ts`。
- - 这些套件会验证作用域 id 和 compaction 行为仍然流经真实的
- `run.ts` / `compact.ts` 路径;仅辅助器测试不足以替代这些集成路径。
+ - 这些套件会验证带作用域的 id 和压缩行为仍然通过真实的
+ `run.ts` / `compact.ts` 路径流动;仅辅助工具测试不足以替代这些集成路径。
@@ -316,64 +366,63 @@ Telegram kind 的 payload 形状:
- 基础 Vitest 配置默认使用 `threads`。
- 共享 Vitest 配置固定 `isolate: false`,并在根项目、e2e 和 live 配置中使用
非隔离 runner。
- - 根 UI lane 保留其 `jsdom` 设置和优化器,但也运行在
+ - 根 UI lane 保留其 `jsdom` 设置和 optimizer,但同样运行在
共享非隔离 runner 上。
- 每个 `pnpm test` 分片都会从共享 Vitest 配置继承相同的 `threads` + `isolate: false`
默认值。
- `scripts/run-vitest.mjs` 默认会为 Vitest 子 Node
- 进程添加 `--no-maglev`,以减少大型本地运行中的 V8 编译抖动。
- 设置 `OPENCLAW_VITEST_ENABLE_MAGLEV=1` 可与原生 V8
+ 进程添加 `--no-maglev`,以减少大型本地运行期间的 V8 编译抖动。
+ 设置 `OPENCLAW_VITEST_ENABLE_MAGLEV=1` 可与原始 V8
行为对比。
- - `pnpm changed:lanes` 显示一个 diff 会触发哪些架构 lane。
- - pre-commit hook 仅做格式化。它会重新暂存已格式化的文件,
+ - `pnpm changed:lanes` 会显示一个 diff 触发哪些架构 lane。
+ - pre-commit hook 仅做格式化。它会重新暂存格式化后的文件,
不运行 lint、typecheck 或测试。
- - 当你需要智能本地检查 gate 时,在 handoff 或 push 前显式运行
+ - 当你需要智能本地检查门禁时,请在交接或 push 前显式运行
`pnpm check:changed`。
- - `pnpm test:changed` 默认通过低成本作用域 lane 路由。仅当 agent
- 判断 harness、配置、包或契约编辑确实需要更广泛
- Vitest 覆盖时,才使用
- `OPENCLAW_TEST_CHANGED_BROAD=1 pnpm test:changed`。
+ - `pnpm test:changed` 默认通过低成本的带作用域 lane 路由。只有当智能体
+ 判断 harness、配置、package 或契约编辑确实需要更宽泛的
+ Vitest 覆盖率时,才使用 `OPENCLAW_TEST_CHANGED_BROAD=1 pnpm test:changed`。
- `pnpm test:max` 和 `pnpm test:changed:max` 保持相同路由
- 行为,只是使用更高的 worker 上限。
- - 本地 worker 自动缩放有意保守,并会在主机负载平均值已经较高时退让,
- 因此默认情况下多个并发
- Vitest 运行的影响更小。
- - 基础 Vitest 配置把 projects/config 文件标记为
- `forceRerunTriggers`,因此测试
- wiring 变更时 changed-mode 重跑仍保持正确。
- - 配置会在受支持主机上保持启用 `OPENCLAW_VITEST_FS_MODULE_CACHE`;
- 如果你想为直接性能分析指定一个显式缓存位置,请设置 `OPENCLAW_VITEST_FS_MODULE_CACHE_PATH=/abs/path`。
+ 行为,只是 worker 上限更高。
+ - 本地 worker 自动缩放有意保持保守,并会在主机 load average 已经很高时退避,
+ 因此多个并发
+ Vitest 运行默认造成的影响更小。
+ - 基础 Vitest 配置将项目/配置文件标记为
+ `forceRerunTriggers`,因此在测试
+ 接线变更时 changed-mode 重新运行仍保持正确。
+ - 配置在受支持的
+ 主机上保持启用 `OPENCLAW_VITEST_FS_MODULE_CACHE`;如果你想为直接 profiling 指定
+ 一个显式缓存位置,请设置 `OPENCLAW_VITEST_FS_MODULE_CACHE_PATH=/abs/path`。
- - `pnpm test:perf:imports` 启用 Vitest 导入耗时报告和
+ - `pnpm test:perf:imports` 会启用 Vitest 导入耗时报告以及
import-breakdown 输出。
- - `pnpm test:perf:imports:changed` 将同一性能分析视图限定到
- 自 `origin/main` 起变更的文件。
+ - `pnpm test:perf:imports:changed` 将相同的 profiling 视图限定到
+ 自 `origin/main` 以来变更的文件。
- 分片计时数据会写入 `.artifacts/vitest-shard-timings.json`。
- 整配置运行使用配置路径作为键;include-pattern CI
- 分片会附加分片名称,因此可单独追踪过滤后的分片。
- - 当某个热点测试仍然把大部分时间花在启动导入上时,
- 请把重型依赖放在窄的本地 `*.runtime.ts` seam 后面,并
- 直接 mock 该 seam,而不是为了把运行时辅助器传给 `vi.mock(...)`
- 而 deep-import 它们。
- - `pnpm test:perf:changed:bench -- --ref ` 会把针对该已提交
- diff 路由后的 `test:changed` 与原生根项目路径进行比较,
- 并打印 wall time 和 macOS max RSS。
- - `pnpm test:perf:changed:bench -- --worktree` 会通过把已变更文件列表路由给
- `scripts/test-projects.mjs` 和根 Vitest 配置来基准测试当前
- 脏树。
+ 整体配置运行使用配置路径作为 key;include-pattern CI
+ 分片会附加分片名称,以便单独跟踪过滤后的分片。
+ - 当某个热点测试仍把大部分时间花在启动导入上时,
+ 将重型依赖放在窄的本地 `*.runtime.ts` seam 后面,并
+ 直接 mock 该 seam,而不是为了传递给 `vi.mock(...)` 而深度导入运行时辅助工具。
+ - `pnpm test:perf:changed:bench -- --ref ` 会将路由后的
+ `test:changed` 与该已提交 diff 的原生根项目路径进行比较,
+ 并打印 wall time 与 macOS max RSS。
+ - `pnpm test:perf:changed:bench -- --worktree` 会通过
+ `scripts/test-projects.mjs` 和根 Vitest 配置路由变更文件列表,
+ 对当前 dirty tree 做基准测试。
- `pnpm test:perf:profile:main` 会为
- Vitest/Vite 启动和转换开销写入主线程 CPU profile。
- - `pnpm test:perf:profile:runner` 会在禁用文件并行的情况下,为
- 单元套件写入 runner CPU+heap profile。
+ Vitest/Vite 启动和 transform 开销写入主线程 CPU profile。
+ - `pnpm test:perf:profile:runner` 会为
+ 禁用文件并行的单元套件写入 runner CPU+heap profile。
@@ -384,13 +433,13 @@ Telegram kind 的 payload 形状:
- 配置:`vitest.gateway.config.ts`,强制使用一个 worker
- 范围:
- 启动一个真实的 loopback Gateway 网关,默认启用诊断
- - 通过诊断事件路径驱动合成的 Gateway 网关消息、memory 和 large-payload churn
+ - 通过诊断事件路径驱动合成的 Gateway 网关消息、memory 和大 payload churn
- 通过 Gateway 网关 WS RPC 查询 `diagnostics.stability`
- - 覆盖诊断稳定性 bundle 持久化辅助器
- - 断言 recorder 保持有界,合成 RSS sample 低于压力预算,并且每会话队列深度会排空回到零
+ - 覆盖诊断稳定性 bundle 持久化辅助工具
+ - 断言 recorder 保持有界、合成 RSS 样本保持低于压力预算,并且每个会话的队列深度回落到零
- 期望:
- CI 安全且不需要密钥
- - 用于稳定性回归跟进的窄 lane,而不是完整 Gateway 网关套件的替代品
+ - 稳定性回归跟进的窄 lane,而不是完整 Gateway 网关套件的替代品
### E2E(Gateway 网关 smoke)
@@ -398,34 +447,34 @@ Telegram kind 的 payload 形状:
- 配置:`vitest.e2e.config.ts`
- 文件:`src/**/*.e2e.test.ts`、`test/**/*.e2e.test.ts`,以及 `extensions/` 下的内置插件 E2E 测试
- 运行时默认值:
- - 使用 Vitest `threads`,并设置 `isolate: false`,与仓库其余部分保持一致。
+ - 使用 Vitest `threads` 并设置 `isolate: false`,与仓库其余部分保持一致。
- 使用自适应 worker(CI:最多 2 个,本地:默认 1 个)。
- 默认以静默模式运行,以减少控制台 I/O 开销。
-- 实用覆盖项:
- - `OPENCLAW_E2E_WORKERS=` 用于强制设置 worker 数量(上限为 16)。
+- 有用的覆盖项:
+ - `OPENCLAW_E2E_WORKERS=` 用于强制指定 worker 数量(上限为 16)。
- `OPENCLAW_E2E_VERBOSE=1` 用于重新启用详细控制台输出。
- 范围:
- 多实例 Gateway 网关端到端行为
- - WebSocket/HTTP 表面、节点配对,以及更重的网络功能
+ - WebSocket/HTTP 表面、节点配对,以及更重的网络相关内容
- 预期:
- 在 CI 中运行(当流水线中启用时)
- - 不需要真实密钥
+ - 无需真实密钥
- 比单元测试有更多移动部件(可能更慢)
-### E2E:OpenShell 后端 smoke
+### E2E:OpenShell 后端冒烟测试
- 命令:`pnpm test:e2e:openshell`
- 文件:`extensions/openshell/src/backend.e2e.test.ts`
- 范围:
- - 通过 Docker 在主机上启动隔离的 OpenShell Gateway 网关
+ - 通过 Docker 在主机上启动一个隔离的 OpenShell Gateway 网关
- 从临时本地 Dockerfile 创建沙箱
- - 通过真实的 `sandbox ssh-config` + SSH exec 运行 OpenClaw 的 OpenShell 后端
- - 通过沙箱 fs bridge 验证远程规范文件系统行为
+ - 通过真实的 `sandbox ssh-config` + SSH exec 演练 OpenClaw 的 OpenShell 后端
+ - 通过沙箱 fs 桥验证远程规范文件系统行为
- 预期:
- 仅按需启用;不属于默认 `pnpm test:e2e` 运行的一部分
- - 需要本地 `openshell` CLI,以及可用的 Docker 守护进程
+ - 需要本地 `openshell` CLI 以及可用的 Docker 守护进程
- 使用隔离的 `HOME` / `XDG_CONFIG_HOME`,然后销毁测试 Gateway 网关和沙箱
-- 实用覆盖项:
+- 有用的覆盖项:
- `OPENCLAW_E2E_OPENSHELL=1` 用于在手动运行更广泛的 e2e 套件时启用该测试
- `OPENCLAW_E2E_OPENSHELL_COMMAND=/path/to/openshell` 用于指向非默认 CLI 二进制文件或包装脚本
@@ -436,37 +485,37 @@ Telegram kind 的 payload 形状:
- 文件:`src/**/*.live.test.ts`、`test/**/*.live.test.ts`,以及 `extensions/` 下的内置插件 live 测试
- 默认值:由 `pnpm test:live` **启用**(设置 `OPENCLAW_LIVE_TEST=1`)
- 范围:
- - “这个提供商/模型在_今天_使用真实凭证是否确实可用?”
- - 捕获提供商格式变化、工具调用细节、凭证问题,以及速率限制行为
+ - “这个提供商/模型在 _今天_ 使用真实凭证时是否真的可用?”
+ - 捕获提供商格式变更、工具调用差异、凭证问题和速率限制行为
- 预期:
- - 按设计并非 CI 稳定(真实网络、真实提供商策略、配额、中断)
- - 会产生成本 / 使用速率限制
- - 优先运行缩小范围的子集,而不是“所有内容”
-- Live 运行会 source `~/.profile`,以获取缺失的 API key。
-- 默认情况下,live 运行仍会隔离 `HOME`,并将配置/凭证材料复制到临时测试 home 中,因此单元测试 fixture 不能改变你的真实 `~/.openclaw`。
+ - 设计上不保证 CI 稳定(真实网络、真实提供商策略、配额、故障)
+ - 会花钱 / 使用速率限制额度
+ - 优先运行收窄后的子集,而不是“全部”
+- Live 运行会 source `~/.profile` 以获取缺失的 API key。
+- 默认情况下,live 运行仍会隔离 `HOME`,并将配置/凭证材料复制到临时测试 home,这样单元测试 fixture 就不能修改你的真实 `~/.openclaw`。
- 仅当你有意需要 live 测试使用你的真实 home 目录时,才设置 `OPENCLAW_LIVE_USE_REAL_HOME=1`。
-- `pnpm test:live` 现在默认使用更安静的模式:它保留 `[live] ...` 进度输出,但会抑制额外的 `~/.profile` 通知,并静音 Gateway 网关启动日志/Bonjour 噪声。如果你想恢复完整启动日志,请设置 `OPENCLAW_LIVE_TEST_QUIET=0`。
-- API key 轮换(提供商特定):设置 `*_API_KEYS`,使用逗号/分号格式,或设置 `*_API_KEY_1`、`*_API_KEY_2`(例如 `OPENAI_API_KEYS`、`ANTHROPIC_API_KEYS`、`GEMINI_API_KEYS`),也可以通过 `OPENCLAW_LIVE_*_KEY` 对每个 live 运行覆盖;测试会在收到速率限制响应时重试。
-- 进度/heartbeat 输出:
- - Live 套件现在会向 stderr 发出进度行,因此即使 Vitest 控制台捕获处于安静状态,长时间的提供商调用也会显示为活跃。
- - `vitest.live.config.ts` 会禁用 Vitest 控制台拦截,因此提供商/Gateway 网关进度行会在 live 运行期间立即流式输出。
- - 使用 `OPENCLAW_LIVE_HEARTBEAT_MS` 调整直接模型 heartbeat。
- - 使用 `OPENCLAW_LIVE_GATEWAY_HEARTBEAT_MS` 调整 Gateway 网关/probe heartbeat。
+- `pnpm test:live` 现在默认使用更安静的模式:它保留 `[live] ...` 进度输出,但会抑制额外的 `~/.profile` 提示,并静音 Gateway 网关启动日志/Bonjour 杂音。如果你想恢复完整启动日志,请设置 `OPENCLAW_LIVE_TEST_QUIET=0`。
+- API key 轮换(按提供商):设置逗号/分号格式的 `*_API_KEYS`,或设置 `*_API_KEY_1`、`*_API_KEY_2`(例如 `OPENAI_API_KEYS`、`ANTHROPIC_API_KEYS`、`GEMINI_API_KEYS`),也可以通过 `OPENCLAW_LIVE_*_KEY` 按 live 运行覆盖;测试会在收到速率限制响应时重试。
+- 进度/Heartbeat 输出:
+ - Live 套件现在会向 stderr 发出进度行,因此即使 Vitest 控制台捕获处于安静状态,长时间的提供商调用也会清晰显示为活跃。
+ - `vitest.live.config.ts` 禁用 Vitest 控制台拦截,因此提供商/Gateway 网关进度行会在 live 运行期间立即流式输出。
+ - 用 `OPENCLAW_LIVE_HEARTBEAT_MS` 调整直接模型 Heartbeat。
+ - 用 `OPENCLAW_LIVE_GATEWAY_HEARTBEAT_MS` 调整 Gateway 网关/探测 Heartbeat。
## 我应该运行哪个套件?
-使用这个决策表:
+使用这张决策表:
- 编辑逻辑/测试:运行 `pnpm test`(如果你改动很多,也运行 `pnpm test:coverage`)
-- 触及 Gateway 网关网络 / WS 协议 / 配对:添加 `pnpm test:e2e`
-- 调试“我的 bot 挂了” / 提供商特定失败 / 工具调用:运行缩小范围的 `pnpm test:live`
+- 涉及 Gateway 网关网络 / WS 协议 / 配对:添加 `pnpm test:e2e`
+- 调试“我的 bot 掉线了”/提供商特定故障/工具调用:运行收窄后的 `pnpm test:live`
-## Live(触网)测试
+## Live(触及网络的)测试
-对于 live 模型矩阵、CLI 后端 smoke、ACP smoke、Codex app-server
-harness,以及所有媒体提供商 live 测试(Deepgram、BytePlus、ComfyUI、image、
-music、video、media harness)——再加上 live 运行的凭证处理——请参见
-[Testing live suites](/zh-CN/help/testing-live)。有关专用的更新和
+对于 live 模型矩阵、CLI 后端冒烟测试、ACP 冒烟测试、Codex app-server
+harness,以及所有媒体提供商 live 测试(Deepgram、BytePlus、ComfyUI、图像、
+音乐、视频、媒体 harness)以及 live 运行的凭证处理,请参见
+[测试 live 套件](/zh-CN/help/testing-live)。关于专用的更新和
插件验证清单,请参见
[更新和插件测试](/zh-CN/help/testing-updates-plugins)。
@@ -474,164 +523,131 @@ music、video、media harness)——再加上 live 运行的凭证处理——
这些 Docker 运行器分为两类:
-- Live 模型运行器:`test:docker:live-models` 和 `test:docker:live-gateway` 仅在仓库 Docker 镜像内运行匹配的 profile-key live 文件(`src/agents/models.profiles.live.test.ts` 和 `src/gateway/gateway-models.profiles.live.test.ts`),挂载你的本地配置目录和工作区(如果已挂载,也会 source `~/.profile`)。匹配的本地入口点是 `test:live:models-profiles` 和 `test:live:gateway-profiles`。
-- Docker live 运行器默认使用较小的 smoke 上限,让完整 Docker sweep 保持实用:
- `test:docker:live-models` 默认使用 `OPENCLAW_LIVE_MAX_MODELS=12`,并且
- `test:docker:live-gateway` 默认使用 `OPENCLAW_LIVE_GATEWAY_SMOKE=1`、
+- Live 模型运行器:`test:docker:live-models` 和 `test:docker:live-gateway` 只会在仓库 Docker 镜像内运行各自匹配的 profile-key live 文件(`src/agents/models.profiles.live.test.ts` 和 `src/gateway/gateway-models.profiles.live.test.ts`),挂载你的本地配置目录和工作区(如果挂载,也会 source `~/.profile`)。匹配的本地入口点是 `test:live:models-profiles` 和 `test:live:gateway-profiles`。
+- Docker live 运行器默认使用较小的冒烟上限,以便完整 Docker 扫描保持实用:
+ `test:docker:live-models` 默认设置为 `OPENCLAW_LIVE_MAX_MODELS=12`,并且
+ `test:docker:live-gateway` 默认设置为 `OPENCLAW_LIVE_GATEWAY_SMOKE=1`、
`OPENCLAW_LIVE_GATEWAY_MAX_MODELS=8`、
- `OPENCLAW_LIVE_GATEWAY_STEP_TIMEOUT_MS=45000`,以及
- `OPENCLAW_LIVE_GATEWAY_MODEL_TIMEOUT_MS=90000`。当你明确想要更大的穷举扫描时,覆盖这些环境变量。
-- `test:docker:all` 先通过 `test:docker:live-build` 构建一次 live Docker 镜像,通过 `scripts/package-openclaw-for-docker.mjs` 将 OpenClaw 打包一次为 npm tarball,然后构建/复用两个 `scripts/e2e/Dockerfile` 镜像。bare 镜像只是用于安装/更新/插件依赖 lane 的 Node/Git 运行器;这些 lane 会挂载预构建的 tarball。functional 镜像会把同一个 tarball 安装到 `/app`,用于已构建应用功能 lane。Docker lane 定义位于 `scripts/lib/docker-e2e-scenarios.mjs`;planner 逻辑位于 `scripts/lib/docker-e2e-plan.mjs`;`scripts/test-docker-all.mjs` 执行所选计划。聚合器使用加权本地调度器:`OPENCLAW_DOCKER_ALL_PARALLELISM` 控制进程槽位,而资源上限会避免重型 live、npm-install 和多服务 lane 同时全部启动。如果单个 lane 比当前上限更重,调度器仍可在池为空时启动它,然后让它独占运行,直到再次有容量可用。默认值为 10 个槽位、`OPENCLAW_DOCKER_ALL_LIVE_LIMIT=9`、`OPENCLAW_DOCKER_ALL_NPM_LIMIT=10` 和 `OPENCLAW_DOCKER_ALL_SERVICE_LIMIT=7`;仅当 Docker 主机有更多余量时,才调整 `OPENCLAW_DOCKER_ALL_WEIGHT_LIMIT` 或 `OPENCLAW_DOCKER_ALL_DOCKER_LIMIT`。运行器默认执行 Docker preflight,移除陈旧的 OpenClaw E2E 容器,每 30 秒打印状态,将成功 lane 的耗时存储在 `.artifacts/docker-tests/lane-timings.json`,并在后续运行中使用这些耗时优先启动更长的 lane。使用 `OPENCLAW_DOCKER_ALL_DRY_RUN=1` 打印加权 lane 清单,而不构建或运行 Docker;或者使用 `node scripts/test-docker-all.mjs --plan-json` 打印所选 lane、package/image 需求和凭证的 CI 计划。
-- `Package Acceptance` 是 GitHub 原生的包门禁,用于验证“这个可安装 tarball 作为产品是否可用?”它会从 `source=npm`、`source=ref`、`source=url` 或 `source=artifact` 解析一个候选包,将其上传为 `package-under-test`,然后针对这个确切 tarball 运行可复用的 Docker E2E lane,而不是重新打包所选 ref。profile 按覆盖广度排序:`smoke`、`package`、`product` 和 `full`。有关包/更新/插件合同、已发布升级 survivor 矩阵、发布默认值和失败 triage,请参见[更新和插件测试](/zh-CN/help/testing-updates-plugins)。
-- 构建和发布检查会在 tsdown 后运行 `scripts/check-cli-bootstrap-imports.mjs`。该 guard 会从 `dist/entry.js` 和 `dist/cli/run-main.js` 遍历静态构建图,如果命令分派前的启动导入了 Commander、prompt UI、undici 或 logging 等包依赖,则会失败;它还会让内置 Gateway 网关 run chunk 保持在预算内,并拒绝静态导入已知冷 Gateway 网关路径。打包后的 CLI smoke 还覆盖 root help、onboard help、doctor help、Status、配置 schema,以及模型列表命令。
-- Package Acceptance 旧版兼容性截止到 `2026.4.25`(包括 `2026.4.25-beta.*`)。在该截止日期之前,harness 只容忍已发布包的元数据缺口:省略的私有 QA inventory 条目、缺失的 `gateway install --wrapper`、tarball 派生 git fixture 中缺失的 patch 文件、缺失的持久化 `update.channel`、旧版插件安装记录位置、缺失的 marketplace 安装记录持久化,以及 `plugins update` 期间的配置元数据迁移。对于 `2026.4.25` 之后的包,这些路径都是严格失败。
-- 容器 smoke 运行器:`test:docker:openwebui`、`test:docker:onboard`、`test:docker:npm-onboard-channel-agent`、`test:docker:update-channel-switch`、`test:docker:upgrade-survivor`、`test:docker:published-upgrade-survivor`、`test:docker:session-runtime-context`、`test:docker:agents-delete-shared-workspace`、`test:docker:gateway-network`、`test:docker:browser-cdp-snapshot`、`test:docker:mcp-channels`、`test:docker:pi-bundle-mcp-tools`、`test:docker:cron-mcp-cleanup`、`test:docker:plugins`、`test:docker:plugin-update`、`test:docker:plugin-lifecycle-matrix` 和 `test:docker:config-reload` 会启动一个或多个真实容器,并验证更高层的集成路径。
+ `OPENCLAW_LIVE_GATEWAY_STEP_TIMEOUT_MS=45000` 和
+ `OPENCLAW_LIVE_GATEWAY_MODEL_TIMEOUT_MS=90000`。当你明确想要更大的穷尽式扫描时,可以覆盖这些环境变量。
+- `test:docker:all` 先通过 `test:docker:live-build` 构建一次 live Docker 镜像,再通过 `scripts/package-openclaw-for-docker.mjs` 将 OpenClaw 打包一次为 npm tarball,然后构建/复用两个 `scripts/e2e/Dockerfile` 镜像。裸镜像只是用于安装/更新/插件依赖 lane 的 Node/Git 运行器;这些 lane 会挂载预构建的 tarball。功能镜像会将同一个 tarball 安装到 `/app`,用于已构建应用功能 lane。Docker lane 定义位于 `scripts/lib/docker-e2e-scenarios.mjs`;规划器逻辑位于 `scripts/lib/docker-e2e-plan.mjs`;`scripts/test-docker-all.mjs` 会执行所选计划。聚合运行使用加权本地调度器:`OPENCLAW_DOCKER_ALL_PARALLELISM` 控制进程 slot,而资源上限会阻止重型 live、npm-install 和多服务 lane 同时全部启动。如果单个 lane 比当前上限更重,调度器仍可在池为空时启动它,然后让它单独运行,直到再次有可用容量。默认值为 10 个 slot、`OPENCLAW_DOCKER_ALL_LIVE_LIMIT=9`、`OPENCLAW_DOCKER_ALL_NPM_LIMIT=10` 和 `OPENCLAW_DOCKER_ALL_SERVICE_LIMIT=7`;仅当 Docker 主机有更多余量时,才调整 `OPENCLAW_DOCKER_ALL_WEIGHT_LIMIT` 或 `OPENCLAW_DOCKER_ALL_DOCKER_LIMIT`。运行器默认执行 Docker 预检,移除陈旧的 OpenClaw E2E 容器,每 30 秒打印一次 Status,将成功 lane 的耗时存储在 `.artifacts/docker-tests/lane-timings.json`,并在后续运行中使用这些耗时来优先启动更长的 lane。使用 `OPENCLAW_DOCKER_ALL_DRY_RUN=1` 可以在不构建或运行 Docker 的情况下打印加权 lane 清单,或使用 `node scripts/test-docker-all.mjs --plan-json` 打印所选 lane、package/image 需求和凭证的 CI 计划。
+- `Package Acceptance` 是 GitHub 原生的 package gate,用于回答“这个可安装的 tarball 是否能作为产品运行?”它会从 `source=npm`、`source=ref`、`source=url` 或 `source=artifact` 解析一个候选 package,将其上传为 `package-under-test`,然后针对该确切 tarball 运行可复用的 Docker E2E lane,而不是重新打包所选 ref。Profile 按覆盖范围排序:`smoke`、`package`、`product` 和 `full`。关于 package/update/插件契约、已发布升级保留矩阵、发布默认值和故障分诊,请参见[更新和插件测试](/zh-CN/help/testing-updates-plugins)。
+- 构建和发布检查会在 tsdown 后运行 `scripts/check-cli-bootstrap-imports.mjs`。该 guard 会从 `dist/entry.js` 和 `dist/cli/run-main.js` 遍历静态构建图,如果命令分发前的启动流程导入了 Commander、prompt UI、undici 或 logging 等 package 依赖,则失败;它还会让内置 Gateway 网关运行 chunk 保持在预算以内,并拒绝静态导入已知冷启动 Gateway 网关路径。打包后的 CLI 冒烟测试还覆盖根帮助、onboard 帮助、doctor 帮助、Status、配置 schema 和 model-list 命令。
+- Package Acceptance 旧版兼容性上限为 `2026.4.25`(包含 `2026.4.25-beta.*`)。在该截止点之前,harness 仅容忍已发布 package 的元数据缺口:省略私有 QA inventory 条目、缺少 `gateway install --wrapper`、tarball 派生的 git fixture 中缺少 patch 文件、缺少持久化的 `update.channel`、旧版插件 install-record 位置、缺少 marketplace install-record 持久化,以及 `plugins update` 期间的配置元数据迁移。对于 `2026.4.25` 之后的 package,这些路径都是严格失败。
+- 容器冒烟运行器:`test:docker:openwebui`、`test:docker:onboard`、`test:docker:npm-onboard-channel-agent`、`test:docker:update-channel-switch`、`test:docker:upgrade-survivor`、`test:docker:published-upgrade-survivor`、`test:docker:session-runtime-context`、`test:docker:agents-delete-shared-workspace`、`test:docker:gateway-network`、`test:docker:browser-cdp-snapshot`、`test:docker:mcp-channels`、`test:docker:pi-bundle-mcp-tools`、`test:docker:cron-mcp-cleanup`、`test:docker:plugins`、`test:docker:plugin-update`、`test:docker:plugin-lifecycle-matrix` 和 `test:docker:config-reload` 会启动一个或多个真实容器,并验证更高层级的集成路径。
-Live 模型 Docker 运行器还只会 bind-mount 所需的 CLI auth home(或者在运行未缩小时挂载所有支持的 home),然后在运行前将它们复制到容器 home 中,这样外部 CLI OAuth 就可以刷新 token,而不会改变主机 auth 存储:
+Live 模型 Docker 运行器还只会 bind-mount 所需的 CLI 凭证 home(如果运行未收窄,则挂载所有受支持的 home),然后在运行前将它们复制到容器 home 中,这样外部 CLI OAuth 就能刷新 token,而不会修改主机凭证存储:
-- 直接模型:`pnpm test:docker:live-models`(脚本:`scripts/test-live-models-docker.sh`)
-- ACP 绑定冒烟测试:`pnpm test:docker:live-acp-bind`(脚本:`scripts/test-live-acp-bind-docker.sh`;默认覆盖 Claude、Codex 和 Gemini,并通过 `pnpm test:docker:live-acp-bind:droid` 和 `pnpm test:docker:live-acp-bind:opencode` 提供严格的 Droid/OpenCode 覆盖)
+- 直连模型:`pnpm test:docker:live-models`(脚本:`scripts/test-live-models-docker.sh`)
+- ACP 绑定冒烟测试:`pnpm test:docker:live-acp-bind`(脚本:`scripts/test-live-acp-bind-docker.sh`;默认覆盖 Claude、Codex 和 Gemini,并通过 `pnpm test:docker:live-acp-bind:droid` 与 `pnpm test:docker:live-acp-bind:opencode` 严格覆盖 Droid/OpenCode)
- CLI 后端冒烟测试:`pnpm test:docker:live-cli-backend`(脚本:`scripts/test-live-cli-backend-docker.sh`)
- Codex app-server harness 冒烟测试:`pnpm test:docker:live-codex-harness`(脚本:`scripts/test-live-codex-harness-docker.sh`)
- Gateway 网关 + 开发智能体:`pnpm test:docker:live-gateway`(脚本:`scripts/test-live-gateway-models-docker.sh`)
-- 可观测性冒烟测试:`pnpm qa:otel:smoke` 是私有 QA 源码检出通道。它有意不属于 package Docker 发布通道,因为 npm tarball 会省略 QA Lab。
-- Open WebUI 实时冒烟测试:`pnpm test:docker:openwebui`(脚本:`scripts/e2e/openwebui-docker.sh`)
-- 新手引导向导(TTY,完整脚手架):`pnpm test:docker:onboard`(脚本:`scripts/e2e/onboard-docker.sh`)
-- Npm tarball 新手引导/渠道/智能体冒烟测试:`pnpm test:docker:npm-onboard-channel-agent` 会在 Docker 中全局安装打包后的 OpenClaw tarball,默认通过 env-ref 新手引导配置 OpenAI 并配置 Telegram,运行 Doctor,然后运行一次模拟的 OpenAI 智能体回合。可用 `OPENCLAW_CURRENT_PACKAGE_TGZ=/path/to/openclaw-*.tgz` 复用预构建 tarball,用 `OPENCLAW_NPM_ONBOARD_HOST_BUILD=0` 跳过主机重建,或用 `OPENCLAW_NPM_ONBOARD_CHANNEL=discord` 切换渠道。
+- 可观测性冒烟测试:`pnpm qa:otel:smoke` 是一个私有 QA 源码检出通道。它有意不属于软件包 Docker 发布通道,因为 npm tarball 省略了 QA Lab。
+- Open WebUI 真实环境冒烟测试:`pnpm test:docker:openwebui`(脚本:`scripts/e2e/openwebui-docker.sh`)
+- 新手引导向导(TTY,全量脚手架):`pnpm test:docker:onboard`(脚本:`scripts/e2e/onboard-docker.sh`)
+- npm tarball 新手引导/渠道/智能体冒烟测试:`pnpm test:docker:npm-onboard-channel-agent` 会在 Docker 中全局安装打包后的 OpenClaw tarball,通过 env-ref 新手引导配置 OpenAI,并默认配置 Telegram,运行 Doctor,然后运行一次模拟的 OpenAI 智能体轮次。可用 `OPENCLAW_CURRENT_PACKAGE_TGZ=/path/to/openclaw-*.tgz` 复用预构建 tarball,用 `OPENCLAW_NPM_ONBOARD_HOST_BUILD=0` 跳过主机构建,或用 `OPENCLAW_NPM_ONBOARD_CHANNEL=discord` 切换渠道。
- 更新渠道切换冒烟测试:`pnpm test:docker:update-channel-switch` 会在 Docker 中全局安装打包后的 OpenClaw tarball,从 package `stable` 切换到 git `dev`,验证持久化的渠道和插件更新后工作正常,然后切回 package `stable` 并检查更新状态。
-- 升级幸存者冒烟测试:`pnpm test:docker:upgrade-survivor` 会将打包后的 OpenClaw tarball 安装到一个带有智能体、渠道配置、插件 allowlist、过期插件依赖状态以及现有工作区/会话文件的脏旧用户夹具上。它会在没有实时提供商或渠道密钥的情况下运行 package update 加非交互式 Doctor,然后启动一个 loopback Gateway 网关,并检查配置/状态保留以及启动/状态预算。
-- 已发布升级幸存者冒烟测试:`pnpm test:docker:published-upgrade-survivor` 默认安装 `openclaw@latest`,播种真实的现有用户文件,用内置命令配方配置该基线,验证生成的配置,将该已发布安装更新到候选 tarball,运行非交互式 Doctor,写入 `.artifacts/upgrade-survivor/summary.json`,然后启动一个 loopback Gateway 网关,并检查已配置意图、状态保留、启动、`/healthz`、`/readyz` 和 RPC 状态预算。可用 `OPENCLAW_UPGRADE_SURVIVOR_BASELINE_SPEC` 覆盖一个基线,用 `OPENCLAW_UPGRADE_SURVIVOR_BASELINE_SPECS` 要求聚合调度器展开精确基线(例如 `all-since-2026.4.23`),并用 `OPENCLAW_UPGRADE_SURVIVOR_SCENARIOS` 展开 issue 形态夹具(例如 `reported-issues`);reported-issues 集包含 `configured-plugin-installs`,用于自动修复外部 OpenClaw 插件安装。Package Acceptance 将这些公开为 `published_upgrade_survivor_baseline`、`published_upgrade_survivor_baselines` 和 `published_upgrade_survivor_scenarios`。
-- 会话运行时上下文冒烟测试:`pnpm test:docker:session-runtime-context` 会验证隐藏运行时上下文 transcript 持久化,以及 Doctor 对受影响的重复 prompt-rewrite 分支的修复。
-- Bun 全局安装冒烟测试:`bash scripts/e2e/bun-global-install-smoke.sh` 会打包当前树,在隔离 home 中用 `bun install -g` 安装,并验证 `openclaw infer image providers --json` 返回内置图片提供商而不是挂起。可用 `OPENCLAW_BUN_GLOBAL_SMOKE_PACKAGE_TGZ=/path/to/openclaw-*.tgz` 复用预构建 tarball,用 `OPENCLAW_BUN_GLOBAL_SMOKE_HOST_BUILD=0` 跳过主机构建,或用 `OPENCLAW_BUN_GLOBAL_SMOKE_DIST_IMAGE=openclaw-dockerfile-smoke:local` 从已构建 Docker 镜像复制 `dist/`。
-- 安装器 Docker 冒烟测试:`bash scripts/test-install-sh-docker.sh` 会在它的 root、update 和 direct-npm 容器之间共享一个 npm 缓存。更新冒烟测试默认以 npm `latest` 作为 stable 基线,然后升级到候选 tarball。本地可用 `OPENCLAW_INSTALL_SMOKE_UPDATE_BASELINE=2026.4.22` 覆盖,或在 GitHub 上用 Install Smoke workflow 的 `update_baseline_version` 输入覆盖。非 root 安装器检查会保留隔离 npm 缓存,避免 root 拥有的缓存条目掩盖用户本地安装行为。设置 `OPENCLAW_INSTALL_SMOKE_NPM_CACHE_DIR=/path/to/cache` 可在本地重跑时复用 root/update/direct-npm 缓存。
-- Install Smoke CI 会用 `OPENCLAW_INSTALL_SMOKE_SKIP_NPM_GLOBAL=1` 跳过重复的 direct-npm 全局更新;需要直接 `npm install -g` 覆盖时,在本地运行脚本且不要设置该环境变量。
-- 智能体删除共享工作区 CLI 冒烟测试:`pnpm test:docker:agents-delete-shared-workspace`(脚本:`scripts/e2e/agents-delete-shared-workspace-docker.sh`)默认构建根 Dockerfile 镜像,在隔离容器 home 中播种两个智能体和一个工作区,运行 `agents delete --json`,并验证有效 JSON 以及保留工作区行为。可用 `OPENCLAW_AGENTS_DELETE_SHARED_WORKSPACE_E2E_IMAGE=openclaw-dockerfile-smoke:local OPENCLAW_AGENTS_DELETE_SHARED_WORKSPACE_E2E_SKIP_BUILD=1` 复用 install-smoke 镜像。
-- Gateway 网关网络(两个容器,WS 认证 + 健康检查):`pnpm test:docker:gateway-network`(脚本:`scripts/e2e/gateway-network-docker.sh`)
-- 浏览器 CDP 快照冒烟测试:`pnpm test:docker:browser-cdp-snapshot`(脚本:`scripts/e2e/browser-cdp-snapshot-docker.sh`)会构建源码 E2E 镜像加一个 Chromium 层,用原始 CDP 启动 Chromium,运行 `browser doctor --deep`,并验证 CDP 角色快照覆盖链接 URL、由光标提升的可点击项、iframe 引用和 frame 元数据。
-- OpenAI Responses web_search 最小推理回归:`pnpm test:docker:openai-web-search-minimal`(脚本:`scripts/e2e/openai-web-search-minimal-docker.sh`)会通过 Gateway 网关运行一个模拟 OpenAI 服务器,验证 `web_search` 将 `reasoning.effort` 从 `minimal` 提升到 `low`,然后强制提供商 schema 拒绝并检查原始详情出现在 Gateway 网关日志中。
-- MCP 渠道桥接(播种的 Gateway 网关 + stdio bridge + 原始 Claude notification-frame 冒烟测试):`pnpm test:docker:mcp-channels`(脚本:`scripts/e2e/mcp-channels-docker.sh`)
-- Pi bundle MCP 工具(真实 stdio MCP 服务器 + 嵌入式 Pi profile 允许/拒绝冒烟测试):`pnpm test:docker:pi-bundle-mcp-tools`(脚本:`scripts/e2e/pi-bundle-mcp-tools-docker.sh`)
-- Cron/subagent MCP 清理(真实 Gateway 网关 + 在隔离 cron 和一次性 subagent 运行后拆除 stdio MCP 子进程):`pnpm test:docker:cron-mcp-cleanup`(脚本:`scripts/e2e/cron-mcp-cleanup-docker.sh`)
-- 插件(local path、`file:`、带 hoisted dependencies 的 npm registry、git moving refs、ClawHub kitchen-sink、marketplace updates,以及 Claude-bundle 启用/检查的安装/更新冒烟测试):`pnpm test:docker:plugins`(脚本:`scripts/e2e/plugins-docker.sh`)
- 设置 `OPENCLAW_PLUGINS_E2E_CLAWHUB=0` 可跳过 ClawHub 区块,或用 `OPENCLAW_PLUGINS_E2E_CLAWHUB_SPEC` 和 `OPENCLAW_PLUGINS_E2E_CLAWHUB_ID` 覆盖默认 kitchen-sink package/runtime 组合。没有 `OPENCLAW_CLAWHUB_URL`/`CLAWHUB_URL` 时,测试会使用 hermetic 本地 ClawHub 夹具服务器。
-- 插件更新未变更冒烟测试:`pnpm test:docker:plugin-update`(脚本:`scripts/e2e/plugin-update-unchanged-docker.sh`)
-- 插件生命周期矩阵冒烟测试:`pnpm test:docker:plugin-lifecycle-matrix` 会在裸容器中安装打包后的 OpenClaw tarball,安装一个 npm 插件,切换启用/禁用,通过本地 npm registry 升级和降级该插件,删除已安装代码,然后验证卸载仍会移除过期状态,同时记录每个生命周期阶段的 RSS/CPU 指标。
-- 配置重新加载元数据冒烟测试:`pnpm test:docker:config-reload`(脚本:`scripts/e2e/config-reload-source-docker.sh`)
-- 插件:`pnpm test:docker:plugins` 覆盖 local path、`file:`、带 hoisted dependencies 的 npm registry、git moving refs、ClawHub fixtures、marketplace updates,以及 Claude-bundle 启用/检查的安装/更新冒烟测试。`pnpm test:docker:plugin-update` 覆盖已安装插件的未变更更新行为。`pnpm test:docker:plugin-lifecycle-matrix` 覆盖带资源跟踪的 npm 插件安装、启用、禁用、升级、降级和缺失代码卸载。
+- 升级幸存者冒烟测试:`pnpm test:docker:upgrade-survivor` 会把打包后的 OpenClaw tarball 安装到一个脏的旧用户 fixture 上,其中包含智能体、渠道配置、插件 allowlist、过期的插件依赖状态,以及现有工作区/会话文件。它会在没有真实提供商或渠道密钥的情况下运行软件包更新和非交互式 Doctor,然后启动一个 loopback Gateway 网关,并检查配置/状态保留以及启动/Status 预算。
+- 已发布版本升级幸存者冒烟测试:`pnpm test:docker:published-upgrade-survivor` 默认安装 `openclaw@latest`,植入真实感的现有用户文件,用内置命令配方配置该基线,验证生成的配置,将该已发布安装更新到候选 tarball,运行非交互式 Doctor,写入 `.artifacts/upgrade-survivor/summary.json`,然后启动一个 loopback Gateway 网关,并检查已配置 intent、状态保留、启动、`/healthz`、`/readyz` 和 RPC Status 预算。用 `OPENCLAW_UPGRADE_SURVIVOR_BASELINE_SPEC` 覆盖单个基线,让聚合调度器用 `OPENCLAW_UPGRADE_SURVIVOR_BASELINE_SPECS` 展开精确基线,例如 `all-since-2026.4.23`,并用 `OPENCLAW_UPGRADE_SURVIVOR_SCENARIOS` 展开问题形态的 fixture,例如 `reported-issues`;reported-issues 集合包含 `configured-plugin-installs`,用于自动修复外部 OpenClaw 插件安装。Package Acceptance 将这些暴露为 `published_upgrade_survivor_baseline`、`published_upgrade_survivor_baselines` 和 `published_upgrade_survivor_scenarios`。
+- 会话运行时上下文冒烟测试:`pnpm test:docker:session-runtime-context` 验证隐藏运行时上下文 transcript 持久化,以及 Doctor 对受影响的重复 prompt-rewrite 分支的修复。
+- Bun 全局安装冒烟测试:`bash scripts/e2e/bun-global-install-smoke.sh` 会打包当前树,在隔离 home 中用 `bun install -g` 安装,并验证 `openclaw infer image providers --json` 返回内置图像提供商而不是挂起。可用 `OPENCLAW_BUN_GLOBAL_SMOKE_PACKAGE_TGZ=/path/to/openclaw-*.tgz` 复用预构建 tarball,用 `OPENCLAW_BUN_GLOBAL_SMOKE_HOST_BUILD=0` 跳过主机构建,或用 `OPENCLAW_BUN_GLOBAL_SMOKE_DIST_IMAGE=openclaw-dockerfile-smoke:local` 从已构建的 Docker 镜像复制 `dist/`。
+- 安装器 Docker 冒烟测试:`bash scripts/test-install-sh-docker.sh` 会在其 root、update 和 direct-npm 容器之间共享一个 npm 缓存。更新冒烟测试默认使用 npm `latest` 作为 stable 基线,然后升级到候选 tarball。可在本地用 `OPENCLAW_INSTALL_SMOKE_UPDATE_BASELINE=2026.4.22` 覆盖,或在 GitHub 上用 Install Smoke 工作流的 `update_baseline_version` 输入覆盖。非 root 安装器检查会保留隔离的 npm 缓存,避免 root 拥有的缓存条目掩盖用户本地安装行为。设置 `OPENCLAW_INSTALL_SMOKE_NPM_CACHE_DIR=/path/to/cache` 可在本地重复运行之间复用 root/update/direct-npm 缓存。
+- Install Smoke CI 会用 `OPENCLAW_INSTALL_SMOKE_SKIP_NPM_GLOBAL=1` 跳过重复的 direct-npm 全局更新;需要覆盖直接 `npm install -g` 时,在本地运行脚本且不要设置该环境变量。
+- 智能体删除共享工作区 CLI 冒烟测试:`pnpm test:docker:agents-delete-shared-workspace`(脚本:`scripts/e2e/agents-delete-shared-workspace-docker.sh`)默认构建根 Dockerfile 镜像,在隔离容器 home 中植入两个智能体和一个工作区,运行 `agents delete --json`,并验证有效 JSON 以及保留工作区行为。可用 `OPENCLAW_AGENTS_DELETE_SHARED_WORKSPACE_E2E_IMAGE=openclaw-dockerfile-smoke:local OPENCLAW_AGENTS_DELETE_SHARED_WORKSPACE_E2E_SKIP_BUILD=1` 复用 install-smoke 镜像。
+- Gateway 网关网络(两个容器,WS 身份验证 + 健康检查):`pnpm test:docker:gateway-network`(脚本:`scripts/e2e/gateway-network-docker.sh`)
+- 浏览器 CDP 快照冒烟测试:`pnpm test:docker:browser-cdp-snapshot`(脚本:`scripts/e2e/browser-cdp-snapshot-docker.sh`)会构建源码 E2E 镜像和 Chromium 层,用原始 CDP 启动 Chromium,运行 `browser doctor --deep`,并验证 CDP role 快照覆盖链接 URL、cursor-promoted 可点击项、iframe ref 和 frame metadata。
+- OpenAI Responses `web_search` 最小 reasoning 回归:`pnpm test:docker:openai-web-search-minimal`(脚本:`scripts/e2e/openai-web-search-minimal-docker.sh`)通过 Gateway 网关运行模拟的 OpenAI 服务器,验证 `web_search` 将 `reasoning.effort` 从 `minimal` 提升到 `low`,然后强制提供商 schema 拒绝,并检查原始 detail 出现在 Gateway 网关日志中。
+- MCP 渠道桥接(已植入 Gateway 网关 + stdio bridge + 原始 Claude notification-frame 冒烟测试):`pnpm test:docker:mcp-channels`(脚本:`scripts/e2e/mcp-channels-docker.sh`)
+- Pi bundle MCP 工具(真实 stdio MCP server + 嵌入式 Pi profile allow/deny 冒烟测试):`pnpm test:docker:pi-bundle-mcp-tools`(脚本:`scripts/e2e/pi-bundle-mcp-tools-docker.sh`)
+- Cron/子智能体 MCP 清理(真实 Gateway 网关 + 隔离 cron 和一次性子智能体运行后的 stdio MCP child teardown):`pnpm test:docker:cron-mcp-cleanup`(脚本:`scripts/e2e/cron-mcp-cleanup-docker.sh`)
+- 插件(覆盖本地路径、`file:`、带提升依赖的 npm registry、git moving refs、ClawHub kitchen-sink、marketplace updates 和 Claude-bundle enable/inspect 的安装/更新冒烟测试):`pnpm test:docker:plugins`(脚本:`scripts/e2e/plugins-docker.sh`)
+ 设置 `OPENCLAW_PLUGINS_E2E_CLAWHUB=0` 可跳过 ClawHub 块,或用 `OPENCLAW_PLUGINS_E2E_CLAWHUB_SPEC` 和 `OPENCLAW_PLUGINS_E2E_CLAWHUB_ID` 覆盖默认 kitchen-sink package/runtime 对。如果没有 `OPENCLAW_CLAWHUB_URL`/`CLAWHUB_URL`,测试会使用一个 hermetic 本地 ClawHub fixture 服务器。
+- 插件更新无变更冒烟测试:`pnpm test:docker:plugin-update`(脚本:`scripts/e2e/plugin-update-unchanged-docker.sh`)
+- 插件生命周期矩阵冒烟测试:`pnpm test:docker:plugin-lifecycle-matrix` 会在裸容器中安装打包后的 OpenClaw tarball,安装一个 npm 插件,切换启用/停用,通过本地 npm registry 升级和降级它,删除已安装代码,然后验证卸载仍会移除陈旧状态,同时为每个生命周期阶段记录 RSS/CPU 指标。
+- 配置 reload metadata 冒烟测试:`pnpm test:docker:config-reload`(脚本:`scripts/e2e/config-reload-source-docker.sh`)
+- 插件:`pnpm test:docker:plugins` 覆盖本地路径、`file:`、带提升依赖的 npm registry、git moving refs、ClawHub fixture、marketplace updates 和 Claude-bundle enable/inspect 的安装/更新冒烟测试。`pnpm test:docker:plugin-update` 覆盖已安装插件的无变更更新行为。`pnpm test:docker:plugin-lifecycle-matrix` 覆盖带资源跟踪的 npm 插件安装、启用、停用、升级、降级和缺失代码卸载。
-要手动预构建并复用共享 functional 镜像:
+要手动预构建并复用共享功能镜像:
```bash
OPENCLAW_DOCKER_E2E_IMAGE=openclaw-docker-e2e-functional:local pnpm test:docker:e2e-build
OPENCLAW_DOCKER_E2E_IMAGE=openclaw-docker-e2e-functional:local OPENCLAW_SKIP_DOCKER_BUILD=1 pnpm test:docker:mcp-channels
```
-设置后,`OPENCLAW_GATEWAY_NETWORK_E2E_IMAGE` 等套件专用镜像覆盖项仍会优先生效。当 `OPENCLAW_SKIP_DOCKER_BUILD=1` 指向远程共享镜像时,如果该镜像尚不在本地,脚本会拉取它。QR 和安装器 Docker 测试保留自己的 Dockerfile,因为它们验证的是 package/install 行为,而不是共享的已构建应用运行时。
+设置后,像 `OPENCLAW_GATEWAY_NETWORK_E2E_IMAGE` 这样的套件专用镜像覆盖项仍然优先生效。当 `OPENCLAW_SKIP_DOCKER_BUILD=1` 指向远程共享镜像时,如果脚本发现本地尚不存在,会拉取该镜像。QR 和安装器 Docker 测试保留自己的 Dockerfile,因为它们验证的是 package/install 行为,而不是共享的已构建应用运行时。
-实时模型 Docker 运行器还会以只读方式 bind-mount 当前 checkout,并
-将其暂存到容器内的临时工作目录。这让运行时镜像保持精简,同时仍然针对你确切的本地 source/config 运行 Vitest。
-暂存步骤会跳过大型本地专用缓存和应用构建输出,例如
-`.pnpm-store`、`.worktrees`、`__openclaw_vitest__`,以及应用本地的 `.build` 或
-Gradle 输出目录,这样 Docker 实时运行就不会花费数分钟复制
-机器专用的构件。
-它们还会设置 `OPENCLAW_SKIP_CHANNELS=1`,让 Gateway 网关实时探测不会在容器内启动
-真实的 Telegram/Discord 等渠道 worker。
-`test:docker:live-models` 仍会运行 `pnpm test:live`,因此当你需要从该 Docker lane 中缩小或排除 Gateway 网关
-实时覆盖范围时,也要传入
-`OPENCLAW_LIVE_GATEWAY_*`。
-`test:docker:openwebui` 是更高层级的兼容性 smoke:它会启动一个启用了
-OpenAI 兼容 HTTP 端点的
-OpenClaw Gateway 网关容器,
-再启动一个固定版本的 Open WebUI 容器连接到该 Gateway 网关,通过
-Open WebUI 登录,验证 `/api/models` 暴露 `openclaw/default`,然后通过 Open WebUI 的
-`/api/chat/completions` 代理发送一次
-真实聊天请求。
-首次运行可能明显更慢,因为 Docker 可能需要拉取
-Open WebUI 镜像,而 Open WebUI 可能也需要完成自身的冷启动设置。
-这个 lane 需要可用的实时模型 key,`OPENCLAW_PROFILE_FILE`
-(默认 `~/.profile`)是在 Docker 化运行中提供它的主要方式。
-成功运行会打印一个小型 JSON payload,例如 `{ "ok": true, "model":
+实时模型 Docker 运行器还会以只读方式绑定挂载当前 checkout,并将其暂存到容器内的临时工作目录中。这样既能保持运行时镜像精简,又能针对你的确切本地源代码/配置运行 Vitest。暂存步骤会跳过大型的仅本地缓存和应用构建输出,例如 `.pnpm-store`、`.worktrees`、`__openclaw_vitest__`,以及应用本地的 `.build` 或 Gradle 输出目录,这样 Docker live 运行就不会花费数分钟复制机器特定的构件。
+它们还会设置 `OPENCLAW_SKIP_CHANNELS=1`,这样 Gateway 网关 live 探针就不会在容器内启动真实的 Telegram/Discord 等渠道 worker。
+`test:docker:live-models` 仍会运行 `pnpm test:live`,因此当你需要缩小或排除该 Docker lane 中的 Gateway 网关 live 覆盖范围时,也要透传 `OPENCLAW_LIVE_GATEWAY_*`。
+`test:docker:openwebui` 是更高层级的兼容性冒烟测试:它会启动一个启用了 OpenAI 兼容 HTTP 端点的 OpenClaw Gateway 网关容器,启动一个固定版本的 Open WebUI 容器连接到该 Gateway 网关,通过 Open WebUI 登录,验证 `/api/models` 暴露 `openclaw/default`,然后通过 Open WebUI 的 `/api/chat/completions` 代理发送真实聊天请求。
+首次运行可能明显更慢,因为 Docker 可能需要拉取 Open WebUI 镜像,且 Open WebUI 可能需要完成自己的冷启动设置。
+该 lane 需要可用的 live 模型密钥,而 `OPENCLAW_PROFILE_FILE`(默认 `~/.profile`)是在 Docker 化运行中提供它的主要方式。
+成功运行会打印一个小型 JSON 负载,例如 `{ "ok": true, "model":
"openclaw/default", ... }`。
-`test:docker:mcp-channels` 是刻意确定性的,不需要
-真实的 Telegram、Discord 或 iMessage 账号。它会启动一个带种子的 Gateway 网关
-容器,启动第二个会 spawn `openclaw mcp serve` 的容器,然后
-验证路由后的对话发现、transcript 读取、附件元数据、
-实时事件队列行为、出站发送路由,以及通过真实 stdio MCP bridge 发出的 Claude 风格渠道 +
-权限通知。通知检查会直接检查原始 stdio MCP frame,因此该 smoke 验证的是
-bridge 实际发出的内容,而不仅仅是某个特定客户端 SDK 恰好暴露的内容。
-`test:docker:pi-bundle-mcp-tools` 是确定性的,不需要实时
-模型 key。它会构建 repo Docker 镜像,在容器内启动真实的 stdio MCP probe server,
-通过内嵌 Pi bundle
-MCP 运行时物化该 server,执行工具,然后验证 `coding` 和 `messaging` 会保留
-`bundle-mcp` 工具,而 `minimal` 和 `tools.deny: ["bundle-mcp"]` 会过滤它们。
-`test:docker:cron-mcp-cleanup` 是确定性的,不需要实时模型
-key。它会启动一个带种子的 Gateway 网关和真实 stdio MCP probe server,运行一次
-隔离的 cron turn 和一次 `/subagents spawn` 一次性 child turn,然后验证
-MCP child 进程会在每次运行后退出。
+`test:docker:mcp-channels` 是有意保持确定性的,不需要真实的 Telegram、Discord 或 iMessage 账户。它会启动一个已种子化的 Gateway 网关容器,启动第二个容器来派生 `openclaw mcp serve`,然后验证路由后的会话发现、转录读取、附件元数据、live 事件队列行为、出站发送路由,以及通过真实 stdio MCP bridge 传递的 Claude 风格渠道 + 权限通知。通知检查会直接检查原始 stdio MCP 帧,因此该冒烟测试验证的是 bridge 实际发出的内容,而不只是某个特定客户端 SDK 恰好暴露的内容。
+`test:docker:pi-bundle-mcp-tools` 是确定性的,不需要 live 模型密钥。它会构建仓库 Docker 镜像,在容器内启动真实的 stdio MCP 探针服务器,通过嵌入式 Pi bundle MCP 运行时物化该服务器,执行工具,然后验证 `coding` 和 `messaging` 会保留 `bundle-mcp` 工具,而 `minimal` 和 `tools.deny: ["bundle-mcp"]` 会过滤它们。
+`test:docker:cron-mcp-cleanup` 是确定性的,不需要 live 模型密钥。它会启动一个带有真实 stdio MCP 探针服务器的种子化 Gateway 网关,运行一个隔离的 cron turn 和一个 `/subagents spawn` 一次性子 turn,然后验证 MCP 子进程会在每次运行后退出。
-手动 ACP 自然语言 thread smoke(非 CI):
+手动 ACP 自然语言线程冒烟测试(非 CI):
- `bun scripts/dev/discord-acp-plain-language-smoke.ts --channel ...`
-- 保留此脚本用于回归/调试工作流。ACP thread 路由验证以后可能还会再次需要它,因此不要删除。
+- 保留此脚本用于回归/调试工作流。ACP 线程路由验证以后可能还会需要它,因此不要删除。
有用的环境变量:
- `OPENCLAW_CONFIG_DIR=...`(默认:`~/.openclaw`)挂载到 `/home/node/.openclaw`
- `OPENCLAW_WORKSPACE_DIR=...`(默认:`~/.openclaw/workspace`)挂载到 `/home/node/.openclaw/workspace`
- `OPENCLAW_PROFILE_FILE=...`(默认:`~/.profile`)挂载到 `/home/node/.profile`,并在运行测试前 source
-- `OPENCLAW_DOCKER_PROFILE_ENV_ONLY=1` 仅验证从 `OPENCLAW_PROFILE_FILE` source 的环境变量,使用临时 config/workspace 目录且不挂载外部 CLI auth
+- `OPENCLAW_DOCKER_PROFILE_ENV_ONLY=1` 用于只验证从 `OPENCLAW_PROFILE_FILE` source 的环境变量,使用临时配置/工作区目录,且不挂载外部 CLI auth
- `OPENCLAW_DOCKER_CLI_TOOLS_DIR=...`(默认:`~/.cache/openclaw/docker-cli-tools`)挂载到 `/home/node/.npm-global`,用于 Docker 内缓存 CLI 安装
- `$HOME` 下的外部 CLI auth 目录/文件会以只读方式挂载到 `/host-auth...` 下,然后在测试开始前复制到 `/home/node/...`
- 默认目录:`.minimax`
- 默认文件:`~/.codex/auth.json`、`~/.codex/config.toml`、`.claude.json`、`~/.claude/.credentials.json`、`~/.claude/settings.json`、`~/.claude/settings.local.json`
- - 收窄后的提供商运行只挂载从 `OPENCLAW_LIVE_PROVIDERS` / `OPENCLAW_LIVE_GATEWAY_PROVIDERS` 推断出的所需目录/文件
- - 可用 `OPENCLAW_DOCKER_AUTH_DIRS=all`、`OPENCLAW_DOCKER_AUTH_DIRS=none`,或类似 `OPENCLAW_DOCKER_AUTH_DIRS=.claude,.codex` 的逗号列表手动覆盖
-- `OPENCLAW_LIVE_GATEWAY_MODELS=...` / `OPENCLAW_LIVE_MODELS=...` 用于收窄运行范围
+ - 缩小范围的提供商运行只会挂载从 `OPENCLAW_LIVE_PROVIDERS` / `OPENCLAW_LIVE_GATEWAY_PROVIDERS` 推断出的所需目录/文件
+ - 可用 `OPENCLAW_DOCKER_AUTH_DIRS=all`、`OPENCLAW_DOCKER_AUTH_DIRS=none` 或逗号列表(例如 `OPENCLAW_DOCKER_AUTH_DIRS=.claude,.codex`)手动覆盖
+- `OPENCLAW_LIVE_GATEWAY_MODELS=...` / `OPENCLAW_LIVE_MODELS=...` 用于缩小运行范围
- `OPENCLAW_LIVE_GATEWAY_PROVIDERS=...` / `OPENCLAW_LIVE_PROVIDERS=...` 用于在容器内过滤提供商
-- `OPENCLAW_SKIP_DOCKER_BUILD=1` 用于在不需要重建的重新运行中复用已有的 `openclaw:local-live` 镜像
-- `OPENCLAW_LIVE_REQUIRE_PROFILE_KEYS=1` 用于确保凭据来自 profile store(而不是环境变量)
-- `OPENCLAW_OPENWEBUI_MODEL=...` 用于选择 Gateway 网关为 Open WebUI smoke 暴露的模型
-- `OPENCLAW_OPENWEBUI_PROMPT=...` 用于覆盖 Open WebUI smoke 使用的 nonce-check prompt
-- `OPENWEBUI_IMAGE=...` 用于覆盖固定的 Open WebUI 镜像 tag
+- `OPENCLAW_SKIP_DOCKER_BUILD=1` 用于在不需要重新构建的重跑中复用现有 `openclaw:local-live` 镜像
+- `OPENCLAW_LIVE_REQUIRE_PROFILE_KEYS=1` 用于确保凭证来自 profile 存储(而不是环境变量)
+- `OPENCLAW_OPENWEBUI_MODEL=...` 用于选择 Gateway 网关为 Open WebUI 冒烟测试暴露的模型
+- `OPENCLAW_OPENWEBUI_PROMPT=...` 用于覆盖 Open WebUI 冒烟测试使用的 nonce 检查提示
+- `OPENWEBUI_IMAGE=...` 用于覆盖固定的 Open WebUI 镜像标签
## 文档完整性检查
文档编辑后运行文档检查:`pnpm check:docs`。
-当你还需要页内标题检查时,运行完整 Mintlify anchor 验证:`pnpm docs:check-links:anchors`。
+当你也需要页内标题检查时,运行完整的 Mintlify anchor 验证:`pnpm docs:check-links:anchors`。
## 离线回归(CI 安全)
这些是不使用真实提供商的“真实 pipeline”回归:
-- Gateway 网关工具调用(mock OpenAI,真实 Gateway 网关 + Agent loop):`src/gateway/gateway.test.ts`(case: “通过 Gateway 网关 Agent loop 端到端运行 mock OpenAI 工具调用”)
-- Gateway 网关向导(WS `wizard.start`/`wizard.next`,写入配置 + 强制 auth):`src/gateway/gateway.test.ts`(case: “通过 ws 运行向导并写入 auth token 配置”)
+- Gateway 网关工具调用(mock OpenAI,真实 Gateway 网关 + 智能体循环):`src/gateway/gateway.test.ts`(用例:"runs a mock OpenAI tool call end-to-end via gateway agent loop")
+- Gateway 网关向导(WS `wizard.start`/`wizard.next`,写入配置 + 强制 auth):`src/gateway/gateway.test.ts`(用例:"runs wizard over ws and writes auth token config")
## 智能体可靠性评估(Skills)
-我们已经有几个 CI 安全测试,其行为类似于“智能体可靠性评估”:
+我们已经有一些 CI 安全测试,行为类似“智能体可靠性评估”:
-- 通过真实 Gateway 网关 + Agent loop 进行 mock 工具调用(`src/gateway/gateway.test.ts`)。
-- 验证会话 wiring 和配置效果的端到端向导流程(`src/gateway/gateway.test.ts`)。
+- 通过真实 Gateway 网关 + 智能体循环进行 mock 工具调用(`src/gateway/gateway.test.ts`)。
+- 验证会话接线和配置效果的端到端向导流程(`src/gateway/gateway.test.ts`)。
-Skills 仍然缺少的内容(见 [Skills](/zh-CN/tools/skills)):
+Skills 仍缺少的内容(见 [Skills](/zh-CN/tools/skills)):
-- **决策:** 当 prompt 中列出 Skills 时,智能体是否会选择正确的 skill(或避开无关的 skill)?
-- **合规性:** 智能体是否会在使用前读取 `SKILL.md`,并遵循要求的步骤/args?
-- **工作流契约:** 断言工具顺序、会话历史 carryover 和沙箱边界的多轮场景。
+- **决策:**当提示中列出 Skills 时,智能体是否选择正确的 Skills(或避开不相关的 Skills)?
+- **合规:**智能体是否在使用前读取 `SKILL.md` 并遵循必需步骤/参数?
+- **工作流契约:**断言工具顺序、会话历史延续和沙箱边界的多轮场景。
-未来评估应首先保持确定性:
+未来评估应优先保持确定性:
-- 使用 mock 提供商的场景运行器,用于断言工具调用 + 顺序、skill 文件读取和会话 wiring。
-- 一小组以 skill 为重点的场景(使用与避免、gate、prompt injection)。
-- 可选实时评估(opt-in、由环境变量 gate)仅在 CI 安全套件就位后再添加。
+- 使用 mock 提供商的场景 runner,用于断言工具调用 + 顺序、Skills 文件读取和会话接线。
+- 一小组聚焦 Skills 的场景(使用与避开、门禁、提示注入)。
+- 可选 live 评估(选择加入、由环境变量控制)仅在 CI 安全套件到位后再添加。
## 契约测试(插件和渠道形状)
-契约测试验证每个已注册插件和渠道都符合其
-接口契约。它们会遍历所有发现的插件,并运行一组
-形状和行为断言。默认的 `pnpm test` unit lane 会刻意
-跳过这些共享边界和 smoke 文件;当你触碰共享渠道或提供商 surface 时,
-请显式运行契约命令。
+契约测试会验证每个已注册插件和渠道是否符合其接口契约。它们会遍历所有已发现插件,并运行一组形状和行为断言。默认的 `pnpm test` unit lane 会有意跳过这些共享 seam 和冒烟文件;当你触及共享渠道或提供商 surface 时,请显式运行契约命令。
### 命令
@@ -643,21 +659,21 @@ Skills 仍然缺少的内容(见 [Skills](/zh-CN/tools/skills)):
位于 `src/channels/plugins/contracts/*.contract.test.ts`:
-- **plugin** - 基础插件形状(id、名称、能力)
+- **plugin** - 基本插件形状(id、名称、capabilities)
- **setup** - 设置向导契约
- **session-binding** - 会话绑定行为
-- **outbound-payload** - 消息 payload 结构
+- **outbound-payload** - 消息负载结构
- **inbound** - 入站消息处理
-- **actions** - 渠道 action handler
-- **threading** - Thread ID 处理
-- **directory** - Directory/roster API
-- **group-policy** - 群组策略执行
+- **actions** - 渠道 action 处理器
+- **threading** - 线程 ID 处理
+- **directory** - 目录/花名册 API
+- **group-policy** - 群组策略强制执行
### 提供商 Status 契约
位于 `src/plugins/contracts/*.contract.test.ts`。
-- **status** - 渠道 Status probe
+- **status** - 渠道状态探针
- **registry** - 插件 registry 形状
### 提供商契约
@@ -665,7 +681,7 @@ Skills 仍然缺少的内容(见 [Skills](/zh-CN/tools/skills)):
位于 `src/plugins/contracts/*.contract.test.ts`:
- **auth** - Auth flow 契约
-- **auth-choice** - Auth choice/selection
+- **auth-choice** - Auth 选择/选取
- **catalog** - 模型 catalog API
- **discovery** - 插件发现
- **loader** - 插件加载
@@ -675,27 +691,27 @@ Skills 仍然缺少的内容(见 [Skills](/zh-CN/tools/skills)):
### 何时运行
-- 更改 plugin-sdk exports 或 subpath 后
+- 更改 plugin-sdk 导出或 subpath 后
- 添加或修改渠道或提供商插件后
- 重构插件注册或发现后
-契约测试在 CI 中运行,不需要真实 API key。
+契约测试会在 CI 中运行,不需要真实 API key。
## 添加回归(指导)
-当你修复在实时中发现的提供商/模型问题时:
+当你修复在 live 中发现的提供商/模型问题时:
-- 尽可能添加 CI 安全回归(mock/stub 提供商,或捕获确切的 request-shape 转换)
-- 如果它本质上只能实时验证(rate limit、auth policy),请保持实时测试收窄,并通过环境变量 opt-in
-- 优先定位到能捕获 bug 的最小层级:
+- 如果可能,添加 CI 安全回归(mock/stub 提供商,或捕获确切的请求形状转换)
+- 如果它本质上只能 live 验证(速率限制、auth 策略),请保持 live 测试范围较窄,并通过环境变量选择加入
+- 优先瞄准能捕获该 bug 的最小层级:
- 提供商请求转换/replay bug → 直接模型测试
- - Gateway 网关会话/history/工具 pipeline bug → Gateway 网关实时 smoke 或 CI 安全 Gateway 网关 mock 测试
-- SecretRef 遍历护栏:
- - `src/secrets/exec-secret-ref-id-parity.test.ts` 会从 registry metadata(`listSecretTargetRegistryEntries()`)为每个 SecretRef class 派生一个采样 target,然后断言 traversal-segment exec id 会被拒绝。
- - 如果你在 `src/secrets/target-registry-data.ts` 中添加新的 `includeInPlan` SecretRef target family,请更新该测试中的 `classifyTargetClass`。该测试会有意在未分类 target id 上失败,这样新 class 就不会被静默跳过。
+ - Gateway 网关会话/历史/工具 pipeline bug → Gateway 网关 live 冒烟测试或 CI 安全 Gateway 网关 mock 测试
+- SecretRef 遍历 guardrail:
+ - `src/secrets/exec-secret-ref-id-parity.test.ts` 会从 registry 元数据(`listSecretTargetRegistryEntries()`)为每个 SecretRef class 派生一个采样目标,然后断言 traversal-segment exec id 会被拒绝。
+ - 如果你在 `src/secrets/target-registry-data.ts` 中添加新的 `includeInPlan` SecretRef 目标系列,请更新该测试中的 `classifyTargetClass`。该测试会对未分类的目标 id 有意失败,确保新 class 不能被静默跳过。
## 相关
-- [实时测试](/zh-CN/help/testing-live)
+- [Testing live](/zh-CN/help/testing-live)
- [更新和插件测试](/zh-CN/help/testing-updates-plugins)
- [CI](/zh-CN/ci)
diff --git a/docs/zh-CN/providers/openrouter.md b/docs/zh-CN/providers/openrouter.md
index 859de6fef..024f8ab20 100644
--- a/docs/zh-CN/providers/openrouter.md
+++ b/docs/zh-CN/providers/openrouter.md
@@ -1,21 +1,21 @@
---
read_when:
- 你想用一个 API 密钥访问多个大语言模型
- - 你想在 OpenClaw 中通过 OpenRouter 运行模型
+ - 你想通过 OpenRouter 在 OpenClaw 中运行模型
- 你想使用 OpenRouter 进行图像生成
- 你想使用 OpenRouter 进行视频生成
-summary: 在 OpenClaw 中使用 OpenRouter 的统一 API 访问多种模型
+summary: 使用 OpenRouter 的统一 API 在 OpenClaw 中访问多种模型
title: OpenRouter
x-i18n:
- generated_at: "2026-05-04T00:13:57Z"
+ generated_at: "2026-05-04T21:15:16Z"
model: gpt-5.5
provider: openai
- source_hash: f6b7299408aa0de7530e2248c7fa5dae8c09095e2d20a0e9d12a64cab83966fc
+ source_hash: b2876669c6fcc958ac13c19930cd23977b8ec27ae57069d9231932cc13c75244
source_path: providers/openrouter.md
workflow: 16
---
-OpenRouter 提供一个**统一 API**,可通过单个端点和 API key 将请求路由到许多模型。它兼容 OpenAI,因此大多数 OpenAI SDK 只需切换基础 URL 即可使用。
+OpenRouter 提供一个**统一 API**,可以通过单一端点和 API key 将请求路由到多个模型。它与 OpenAI 兼容,因此大多数 OpenAI SDK 只需切换 base URL 即可使用。
## 入门指南
@@ -54,7 +54,7 @@ OpenRouter 提供一个**统一 API**,可通过单个端点和 API key 将请
## 模型引用
-模型引用遵循 `openrouter//` 模式。可用提供商和模型的完整列表见 [/concepts/model-providers](/zh-CN/concepts/model-providers)。
+模型引用遵循 `openrouter//` 模式。如需查看可用提供商和模型的完整列表,请参阅 [/concepts/model-providers](/zh-CN/concepts/model-providers)。
内置回退示例:
@@ -66,7 +66,7 @@ OpenRouter 提供一个**统一 API**,可通过单个端点和 API key 将请
## 图像生成
-OpenRouter 也可以支持 `image_generate` 工具。在 `agents.defaults.imageGenerationModel` 下使用 OpenRouter 图像模型:
+OpenRouter 也可以作为 `image_generate` 工具的后端。在 `agents.defaults.imageGenerationModel` 下使用 OpenRouter 图像模型:
```json5
{
@@ -82,11 +82,11 @@ OpenRouter 也可以支持 `image_generate` 工具。在 `agents.defaults.imageG
}
```
-OpenClaw 会使用 `modalities: ["image", "text"]` 将图像请求发送到 OpenRouter 的聊天补全图像 API。Gemini 图像模型会通过 OpenRouter 的 `image_config` 接收受支持的 `aspectRatio` 和 `resolution` 提示。对于较慢的 OpenRouter 图像模型,请使用 `agents.defaults.imageGenerationModel.timeoutMs`;`image_generate` 工具每次调用的 `timeoutMs` 参数仍会优先。
+OpenClaw 会将图像请求发送到 OpenRouter 的聊天补全图像 API,并带上 `modalities: ["image", "text"]`。Gemini 图像模型会通过 OpenRouter 的 `image_config` 接收受支持的 `aspectRatio` 和 `resolution` 提示。对于较慢的 OpenRouter 图像模型,请使用 `agents.defaults.imageGenerationModel.timeoutMs`;`image_generate` 工具的单次调用 `timeoutMs` 参数仍然优先。
## 视频生成
-OpenRouter 也可以通过其异步 `/videos` API 支持 `video_generate` 工具。在 `agents.defaults.videoGenerationModel` 下使用 OpenRouter 视频模型:
+OpenRouter 也可以通过其异步 `/videos` API 作为 `video_generate` 工具的后端。在 `agents.defaults.videoGenerationModel` 下使用 OpenRouter 视频模型:
```json5
{
@@ -101,11 +101,11 @@ OpenRouter 也可以通过其异步 `/videos` API 支持 `video_generate` 工具
}
```
-OpenClaw 会将文生视频和图生视频任务提交到 OpenRouter,轮询返回的 `polling_url`,并从 OpenRouter 的 `unsigned_urls` 或已记录的任务内容端点下载完成的视频。默认情况下,参考图像会作为首帧/末帧图像发送;标记为 `reference_image` 的图像会作为 OpenRouter 输入参考发送。内置的 `google/veo-3.1-fast` 默认值声明当前支持 4/6/8 秒时长、`720P`/`1080P` 分辨率,以及 `16:9`/`9:16` 宽高比。OpenRouter 未注册视频到视频,因为上游视频生成 API 目前接受文本和图像参考。
+OpenClaw 会向 OpenRouter 提交文生视频和图生视频任务,轮询返回的 `polling_url`,并从 OpenRouter 的 `unsigned_urls` 或已记录的任务内容端点下载已完成的视频。参考图像默认会作为首帧/末帧图像发送;标记为 `reference_image` 的图像会作为 OpenRouter 输入引用发送。内置的 `google/veo-3.1-fast` 默认值声明当前支持 4/6/8 秒时长、`720P`/`1080P` 分辨率,以及 `16:9`/`9:16` 宽高比。OpenRouter 未注册视频到视频,因为上游视频生成 API 目前接受文本和图像引用。
## 文本转语音
-OpenRouter 也可以通过其兼容 OpenAI 的 `/audio/speech` 端点用作 TTS 提供商。
+OpenRouter 也可以通过其与 OpenAI 兼容的 `/audio/speech` 端点用作 TTS 提供商。
```json5
{
@@ -125,29 +125,29 @@ OpenRouter 也可以通过其兼容 OpenAI 的 `/audio/speech` 端点用作 TTS
}
```
-如果省略 `messages.tts.providers.openrouter.apiKey`,TTS 会复用 `models.providers.openrouter.apiKey`,然后再使用 `OPENROUTER_API_KEY`。
+如果省略 `messages.tts.providers.openrouter.apiKey`,TTS 会复用 `models.providers.openrouter.apiKey`,然后使用 `OPENROUTER_API_KEY`。
-## 身份验证和请求头
+## 身份验证和标头
-OpenRouter 底层使用带有你的 API key 的 Bearer 令牌。
+OpenRouter 底层使用带有你的 API key 的 Bearer token。
-在真实的 OpenRouter 请求(`https://openrouter.ai/api/v1`)中,OpenClaw 还会添加 OpenRouter 文档中的应用归因请求头:
+在真实的 OpenRouter 请求(`https://openrouter.ai/api/v1`)中,OpenClaw 还会添加 OpenRouter 文档中记录的应用归因标头:
-| 请求头 | 值 |
+| 标头 | 值 |
| ------------------------- | ------------------------------------------------------------------------------------------------------ |
| `HTTP-Referer` | `https://openclaw.ai` |
| `X-OpenRouter-Title` | `OpenClaw` |
| `X-OpenRouter-Categories` | `cli-agent,cloud-agent,programming-app,creative-writing,writing-assistant,general-chat,personal-agent` |
-如果你将 OpenRouter provider 指向其他代理或基础 URL,OpenClaw **不会**注入这些 OpenRouter 专用请求头或 Anthropic 缓存标记。
+如果你将 OpenRouter provider 指向其他代理或 base URL,OpenClaw **不会**注入这些 OpenRouter 特定标头或 Anthropic 缓存标记。
## 高级配置
- OpenRouter 响应缓存是选择启用的。使用模型参数为每个 OpenRouter 模型启用:
+ OpenRouter 响应缓存需要显式启用。使用模型参数为每个 OpenRouter 模型启用:
```json5
{
@@ -166,38 +166,38 @@ OpenRouter 底层使用带有你的 API key 的 Bearer 令牌。
}
```
- OpenClaw 会发送 `X-OpenRouter-Cache: true`,并在配置后发送 `X-OpenRouter-Cache-TTL`。`responseCacheClear: true` 会强制刷新当前请求并存储替换响应。也接受 snake_case 别名(`response_cache`、`response_cache_ttl_seconds` 和 `response_cache_clear`)。
+ OpenClaw 会发送 `X-OpenRouter-Cache: true`,并在配置后发送 `X-OpenRouter-Cache-TTL`。`responseCacheClear: true` 会强制刷新当前请求并存储替换后的响应。也接受 snake_case 别名(`response_cache`、`response_cache_ttl_seconds` 和 `response_cache_clear`)。
- 这与提供商提示词缓存以及 OpenRouter 的 Anthropic `cache_control` 标记相互独立。它只会应用于已验证的 `openrouter.ai` 路由,而不会应用于自定义代理基础 URL。
+ 这独立于提供商提示词缓存,也独立于 OpenRouter 的 Anthropic `cache_control` 标记。它只会应用于已验证的 `openrouter.ai` 路由,而不会应用于自定义代理 base URL。
- 在已验证的 OpenRouter 路由上,Anthropic 模型引用会保留 OpenRouter 专用的 Anthropic `cache_control` 标记,OpenClaw 使用这些标记在系统/开发者提示词块上更好地复用提示词缓存。
+ 在已验证的 OpenRouter 路由上,Anthropic 模型引用会保留 OpenClaw 用于在系统/开发者提示词块上更好复用提示词缓存的 OpenRouter 特定 Anthropic `cache_control` 标记。
-
- 在已验证的 OpenRouter 路由上,启用推理的 Anthropic 模型引用会在请求到达 OpenRouter 之前删除末尾的 assistant 预填充轮次,以匹配 Anthropic 要求推理对话以用户轮次结束的规则。
+
+ 在已验证的 OpenRouter 路由上,启用 reasoning 的 Anthropic 模型引用会在请求到达 OpenRouter 之前丢弃末尾的 assistant 预填充轮次,以符合 Anthropic 要求 reasoning 对话以 user 轮次结束的规则。
-
- 在受支持的非 `auto` 路由上,OpenClaw 会将所选思考级别映射到 OpenRouter 代理推理载荷。不受支持的模型提示和 `openrouter/auto` 会跳过该推理注入。Hunter Alpha 也会对过时配置的模型引用跳过代理推理,因为 OpenRouter 可能会在该已退役路由的推理字段中返回最终答案文本。
+
+ 在受支持的非 `auto` 路由上,OpenClaw 会将选定的 thinking 级别映射到 OpenRouter 代理 reasoning 载荷。不受支持的模型提示和 `openrouter/auto` 会跳过该 reasoning 注入。Hunter Alpha 也会对过时配置的模型引用跳过代理 reasoning,因为 OpenRouter 可能会在该已退役路由的 reasoning 字段中返回最终答案文本。
-
- 在已验证的 OpenRouter 路由上,`openrouter/deepseek/deepseek-v4-flash` 和 `openrouter/deepseek/deepseek-v4-pro` 会为重放的 assistant 轮次填补缺失的 `reasoning_content`,以便思考/工具对话保持 DeepSeek V4 要求的后续形态。
+
+ 在已验证的 OpenRouter 路由上,`openrouter/deepseek/deepseek-v4-flash` 和 `openrouter/deepseek/deepseek-v4-pro` 会在重放的 assistant 轮次上填充缺失的 `reasoning_content`,让 thinking/tool 对话保持 DeepSeek V4 所需的后续形态。OpenClaw 会为这些路由发送 OpenRouter 支持的 `reasoning_effort` 值;`xhigh` 是声明的最高级别,过时的 `max` 覆盖值会映射到 `xhigh`。
- OpenRouter 仍通过代理风格的 OpenAI 兼容路径运行,因此不会转发原生仅限 OpenAI 的请求塑形,例如 `serviceTier`、Responses `store`、OpenAI 推理兼容载荷和提示词缓存提示。
+ OpenRouter 仍然通过代理式的 OpenAI 兼容路径运行,因此不会转发原生仅限 OpenAI 的请求塑形,例如 `serviceTier`、Responses `store`、OpenAI reasoning 兼容载荷和提示词缓存提示。
-
- Gemini 支持的 OpenRouter 引用会保留在代理 Gemini 路径上:OpenClaw 会在那里保留 Gemini 思维签名清理,但不会启用原生 Gemini 重放验证或引导重写。
+
+ Gemini 后端的 OpenRouter 引用会保留在代理 Gemini 路径上:OpenClaw 会在那里保留 Gemini 思维签名清理,但不会启用原生 Gemini 重放验证或 bootstrap 重写。
- 如果你在模型参数下传入 OpenRouter 提供商路由,OpenClaw 会在共享流包装器运行之前将其作为 OpenRouter 路由元数据转发。
+ 如果你在模型参数下传入 OpenRouter 提供商路由,OpenClaw 会在共享流包装器运行前将其作为 OpenRouter 路由元数据转发。
diff --git a/docs/zh-CN/tools/thinking.md b/docs/zh-CN/tools/thinking.md
index 8aae9bad1..f44510b31 100644
--- a/docs/zh-CN/tools/thinking.md
+++ b/docs/zh-CN/tools/thinking.md
@@ -1,61 +1,62 @@
---
read_when:
- 调整 thinking、fast-mode 或 verbose 指令的解析或默认值
-summary: /think、/fast、/verbose 和 /trace 的指令语法,以及推理可见性
+summary: /think、/fast、/verbose、/trace 的指令语法和推理可见性
title: 思考级别
x-i18n:
- generated_at: "2026-05-04T18:18:30Z"
+ generated_at: "2026-05-04T21:15:09Z"
model: gpt-5.5
provider: openai
- source_hash: fcd1cd76ca5d0b08656e0629df656ad8aa037201d8de68093b3e46eb0708f811
+ source_hash: d2282c9eccda4693680bbfbfc42de508021f4472b00d40a1a8c1bc19a4516012
source_path: tools/thinking.md
workflow: 16
---
-## 功能说明
+## 它的作用
- 任意入站正文中的内联指令:`/t `、`/think:` 或 `/thinking `。
- 级别(别名):`off | minimal | low | medium | high | xhigh | adaptive | max`
- - minimal → “think”
- - low → “think hard”
- - medium → “think harder”
- - high → “ultrathink”(最大预算)
- - xhigh → “ultrathink+”(GPT-5.2+ 和 Codex 模型,以及 Anthropic Claude Opus 4.7 effort)
- - adaptive → 由提供商管理的自适应思考(支持 Claude 4.6 在 Anthropic/Bedrock 上使用、Anthropic Claude Opus 4.7,以及 Google Gemini 动态思考)
- - max → 提供商最大推理(Anthropic Claude Opus 4.7;Ollama 会将其映射到最高原生 `think` effort)
+ - minimal → “思考”
+ - low → “认真思考”
+ - medium → “更认真地思考”
+ - high → “超深度思考”(最大预算)
+ - xhigh → “超深度思考+”(GPT-5.2+ 和 Codex 模型,以及 Anthropic Claude Opus 4.7 effort)
+ - adaptive → 由提供商管理的自适应思考(Anthropic/Bedrock 上的 Claude 4.6、Anthropic Claude Opus 4.7 和 Google Gemini 动态思考支持)
+ - max → 提供商最大推理(Anthropic Claude Opus 4.7;Ollama 会将其映射到其最高原生 `think` effort)
- `x-high`、`x_high`、`extra-high`、`extra high` 和 `extra_high` 映射到 `xhigh`。
- `highest` 映射到 `high`。
- 提供商说明:
- - 思考菜单和选择器由提供商配置档案驱动。提供商插件会声明所选模型的精确级别集合,包括二进制 `on` 等标签。
- - 只有支持 `adaptive`、`xhigh` 和 `max` 的提供商/模型配置档案才会显示这些级别。对于不支持的级别,类型化指令会被拒绝,并返回该模型的有效选项。
- - 现有已存储的不受支持级别会按提供商配置档案等级重新映射。`adaptive` 在非自适应模型上回退到 `medium`,而 `xhigh` 和 `max` 会回退到所选模型支持的最大非 `off` 级别。
- - Anthropic Claude 4.6 模型在未显式设置思考级别时默认使用 `adaptive`。
- - Anthropic Claude Opus 4.7 不默认使用自适应思考。除非你显式设置思考级别,否则其 API effort 默认值仍由提供商所有。
- - Anthropic Claude Opus 4.7 会将 `/think xhigh` 映射为自适应思考加上 `output_config.effort: "xhigh"`,因为 `/think` 是思考指令,而 `xhigh` 是 Opus 4.7 的 effort 设置。
- - Anthropic Claude Opus 4.7 也公开 `/think max`;它会映射到相同的提供商所有最大 effort 路径。
- - DeepSeek V4 模型公开 `/think xhigh|max`;两者都映射到 DeepSeek `reasoning_effort: "max"`,而较低的非 `off` 级别会映射到 `high`。
- - 支持思考的 Ollama 模型公开 `/think low|medium|high|max`;`max` 映射到原生 `think: "high"`,因为 Ollama 的原生 API 接受 `low`、`medium` 和 `high` effort 字符串。
- - OpenAI GPT 模型会通过特定模型支持的 Responses API effort 映射 `/think`。仅当目标模型支持时,`/think off` 才会发送 `reasoning.effort: "none"`;否则 OpenClaw 会省略已禁用的推理载荷,而不是发送不支持的值。
- - 自定义 OpenAI 兼容目录条目可以通过将 `models.providers..models[].compat.supportedReasoningEfforts` 设置为包含 `"xhigh"` 来选择支持 `/think xhigh`。这会使用映射出站 OpenAI 推理 effort 载荷的同一份兼容元数据,因此菜单、会话验证、智能体 CLI 和 `llm-task` 会与传输行为保持一致。
- - 过期配置的 OpenRouter Hunter Alpha 引用会跳过代理推理注入,因为这个已停用路由可能通过推理字段返回最终答案文本。
- - Google Gemini 会将 `/think adaptive` 映射到 Gemini 的提供商所有动态思考。Gemini 3 请求会省略固定的 `thinkingLevel`,而 Gemini 2.5 请求会发送 `thinkingBudget: -1`;固定级别仍会映射到该模型系列最接近的 Gemini `thinkingLevel` 或预算。
- - Anthropic 兼容流式路径上的 MiniMax(`minimax/*`)默认使用 `thinking: { type: "disabled" }`,除非你在模型参数或请求参数中显式设置 thinking。这可以避免 MiniMax 的非原生 Anthropic 流格式泄漏 `reasoning_content` 增量。
- - Z.AI(`zai/*`)仅支持二进制思考(`on`/`off`)。任何非 `off` 级别都会被视为 `on`(映射到 `low`)。
- - Moonshot(`moonshot/*`)会将 `/think off` 映射到 `thinking: { type: "disabled" }`,并将任何非 `off` 级别映射到 `thinking: { type: "enabled" }`。启用 thinking 时,Moonshot 只接受 `tool_choice` `auto|none`;OpenClaw 会将不兼容的值规范化为 `auto`。
+ - 思考菜单和选择器由提供商配置文件驱动。提供商插件会声明所选模型的确切级别集合,包括诸如二元 `on` 这样的标签。
+ - `adaptive`、`xhigh` 和 `max` 只会针对支持它们的提供商/模型配置文件展示。对不支持级别输入的指令会被拒绝,并返回该模型的有效选项。
+ - 现有已存储的不支持级别会按提供商配置文件排名重新映射。在非自适应模型上,`adaptive` 会回退到 `medium`,而 `xhigh` 和 `max` 会回退到所选模型支持的最大非 `off` 级别。
+ - Anthropic Claude 4.6 模型在未设置显式思考级别时默认使用 `adaptive`。
+ - Anthropic Claude Opus 4.7 不默认使用自适应思考。除非你显式设置思考级别,否则其 API effort 默认值仍由提供商拥有。
+ - Anthropic Claude Opus 4.7 会将 `/think xhigh` 映射到自适应思考加 `output_config.effort: "xhigh"`,因为 `/think` 是思考指令,而 `xhigh` 是 Opus 4.7 的 effort 设置。
+ - Anthropic Claude Opus 4.7 也公开 `/think max`;它映射到同一条提供商拥有的最大 effort 路径。
+ - 直连 DeepSeek V4 模型公开 `/think xhigh|max`;两者都会映射到 DeepSeek `reasoning_effort: "max"`,而较低的非 off 级别会映射到 `high`。
+ - 通过 OpenRouter 路由的 DeepSeek V4 模型公开 `/think xhigh` 并发送 OpenRouter 支持的 `reasoning_effort` 值。已存储的 `max` 覆盖会回退到 `xhigh`。
+ - 支持思考的 Ollama 模型公开 `/think low|medium|high|max`;`max` 会映射到原生 `think: "high"`,因为 Ollama 的原生 API 接受 `low`、`medium` 和 `high` effort 字符串。
+ - OpenAI GPT 模型会通过模型特定的 Responses API effort 支持来映射 `/think`。只有目标模型支持时,`/think off` 才会发送 `reasoning.effort: "none"`;否则 OpenClaw 会省略已禁用的推理载荷,而不是发送不支持的值。
+ - 自定义 OpenAI 兼容目录条目可以通过设置 `models.providers..models[].compat.supportedReasoningEfforts` 使其包含 `"xhigh"` 来选择加入 `/think xhigh`。这会使用同一套用于映射出站 OpenAI 推理 effort 载荷的兼容元数据,因此菜单、会话校验、智能体 CLI 和 `llm-task` 都会与传输行为保持一致。
+ - 过期配置的 OpenRouter Hunter Alpha 引用会跳过代理推理注入,因为该已退役路由可能通过推理字段返回最终答案文本。
+ - Google Gemini 会将 `/think adaptive` 映射到 Gemini 由提供商拥有的动态思考。Gemini 3 请求会省略固定的 `thinkingLevel`,而 Gemini 2.5 请求会发送 `thinkingBudget: -1`;固定级别仍会映射到该模型家族最接近的 Gemini `thinkingLevel` 或预算。
+ - Anthropic 兼容流式路径上的 MiniMax (`minimax/*`) 默认使用 `thinking: { type: "disabled" }`,除非你在模型参数或请求参数中显式设置思考。这可避免 MiniMax 非原生 Anthropic 流格式泄漏 `reasoning_content` 增量。
+ - Z.AI (`zai/*`) 只支持二元思考(`on`/`off`)。任何非 `off` 级别都会被视为 `on`(映射到 `low`)。
+ - Moonshot (`moonshot/*`) 会将 `/think off` 映射到 `thinking: { type: "disabled" }`,并将任何非 `off` 级别映射到 `thinking: { type: "enabled" }`。启用思考时,Moonshot 只接受 `tool_choice` `auto|none`;OpenClaw 会将不兼容的值规范化为 `auto`。
## 解析顺序
-1. 消息上的内联指令(仅适用于该消息)。
+1. 消息上的内联指令(仅应用于该消息)。
2. 会话覆盖(通过发送仅包含指令的消息设置)。
3. 每个智能体默认值(配置中的 `agents.list[].thinkingDefault`)。
4. 全局默认值(配置中的 `agents.defaults.thinkingDefault`)。
-5. 回退:可用时使用提供商声明的默认值;否则,支持推理的模型会解析为 `medium` 或该模型最近的受支持非 `off` 级别,不支持推理的模型保持 `off`。
+5. 回退:有可用的提供商声明默认值时使用该默认值;否则,支持推理的模型会解析为 `medium`,或该模型最接近的受支持非 `off` 级别,而非推理模型保持 `off`。
## 设置会话默认值
-- 发送一条**仅**包含该指令的消息(允许空白),例如 `/think:medium` 或 `/t high`。
-- 该设置会保留在当前会话中(默认按发送者区分);可通过 `/think:off` 或会话空闲重置清除。
-- 会发送确认回复(`Thinking level set to high.` / `Thinking disabled.`)。如果级别无效(例如 `/thinking big`),命令会被拒绝并给出提示,会话状态保持不变。
+- 发送一条**仅包含**该指令的消息(允许空白),例如 `/think:medium` 或 `/t high`。
+- 这会对当前会话生效(默认按发送者区分);由 `/think:off` 或会话空闲重置清除。
+- 会发送确认回复(`Thinking level set to high.` / `Thinking disabled.`)。如果级别无效(例如 `/thinking big`),该命令会被拒绝并附带提示,会话状态保持不变。
- 发送不带参数的 `/think`(或 `/think:`)可查看当前思考级别。
## 按智能体应用
@@ -67,78 +68,78 @@ x-i18n:
- 级别:`on|off`。
- 仅包含指令的消息会切换会话快速模式覆盖,并回复 `Fast mode enabled.` / `Fast mode disabled.`。
-- 发送不带模式的 `/fast`(或 `/fast status`)可查看当前有效快速模式状态。
+- 发送不带模式的 `/fast`(或 `/fast status`)可查看当前有效的快速模式状态。
- OpenClaw 按以下顺序解析快速模式:
1. 内联/仅指令 `/fast on|off`
2. 会话覆盖
3. 每个智能体默认值(`agents.list[].fastModeDefault`)
4. 每个模型配置:`agents.defaults.models["/"].params.fastMode`
5. 回退:`off`
-- 对于 `openai/*`,快速模式会通过在受支持的 Responses 请求中发送 `service_tier=priority` 映射到 OpenAI 优先处理。
-- 对于 `openai-codex/*`,快速模式会在 Codex Responses 上发送相同的 `service_tier=priority` 标志。OpenClaw 在两种认证路径之间保留一个共享的 `/fast` 开关。
-- 对于直接公开的 `anthropic/*` 请求,包括发送到 `api.anthropic.com` 的 OAuth 认证流量,快速模式会映射到 Anthropic 服务层级:`/fast on` 设置 `service_tier=auto`,`/fast off` 设置 `service_tier=standard_only`。
-- 对于 Anthropic 兼容路径上的 `minimax/*`,`/fast on`(或 `params.fastMode: true`)会将 `MiniMax-M2.7` 改写为 `MiniMax-M2.7-highspeed`。
-- 当显式 Anthropic `serviceTier` / `service_tier` 模型参数与快速模式默认值同时设置时,显式参数会覆盖快速模式默认值。OpenClaw 仍会对非 Anthropic 代理基础 URL 跳过 Anthropic 服务层级注入。
+- 对于 `openai/*`,快速模式会通过在受支持的 Responses 请求上发送 `service_tier=priority` 映射到 OpenAI 优先处理。
+- 对于 `openai-codex/*`,快速模式会在 Codex Responses 上发送相同的 `service_tier=priority` 标志。OpenClaw 会在两个认证路径之间保留一个共享的 `/fast` 开关。
+- 对于直连公共 `anthropic/*` 请求,包括发送到 `api.anthropic.com` 的 OAuth 认证流量,快速模式会映射到 Anthropic 服务层级:`/fast on` 设置 `service_tier=auto`,`/fast off` 设置 `service_tier=standard_only`。
+- 对于 Anthropic 兼容路径上的 `minimax/*`,`/fast on`(或 `params.fastMode: true`)会将 `MiniMax-M2.7` 重写为 `MiniMax-M2.7-highspeed`。
+- 同时设置时,显式 Anthropic `serviceTier` / `service_tier` 模型参数会覆盖快速模式默认值。OpenClaw 仍会对非 Anthropic 代理基础 URL 跳过 Anthropic 服务层级注入。
- `/status` 仅在快速模式启用时显示 `Fast`。
## 详细指令(/verbose 或 /v)
-- 级别:`on`(最小)| `full` | `off`(默认)。
-- 仅包含指令的消息会切换会话详细模式,并回复 `Verbose logging enabled.` / `Verbose logging disabled.`;无效级别会返回提示且不改变状态。
-- `/verbose off` 会存储显式会话覆盖;可在会话 UI 中选择 `inherit` 将其清除。
+- 级别:`on`(最少)| `full` | `off`(默认)。
+- 仅包含指令的消息会切换会话详细模式,并回复 `Verbose logging enabled.` / `Verbose logging disabled.`;无效级别会返回提示且不更改状态。
+- `/verbose off` 会存储显式会话覆盖;可在会话 UI 中选择 `inherit` 来清除它。
- 内联指令仅影响该消息;否则应用会话/全局默认值。
- 发送不带参数的 `/verbose`(或 `/verbose:`)可查看当前详细级别。
-- 启用详细模式时,发出结构化工具结果的智能体(Pi、其他 JSON 智能体)会将每次工具调用作为单独的仅元数据消息发回,可用时前缀为 ` : `。这些工具摘要会在每个工具启动后立即发送(独立气泡),而不是作为流式增量发送。
-- 工具失败摘要在普通模式下仍可见,但原始错误详情后缀会隐藏,除非详细模式为 `on` 或 `full`。
-- 当详细模式为 `full` 时,工具输出也会在完成后转发(独立气泡,截断到安全长度)。如果你在运行进行中切换 `/verbose on|full|off`,后续工具气泡会遵循新设置。
-- `agents.defaults.toolProgressDetail` 控制 `/verbose` 工具摘要和进度草稿工具行的形式。使用 `"explain"`(默认)可获得紧凑的人类标签,例如 `🛠️ Exec: checking JS syntax`;如果还想附加原始命令/详情以便调试,请使用 `"raw"`。每个智能体的 `agents.list[].toolProgressDetail` 会覆盖默认值。
+- 启用详细模式时,发出结构化工具结果的智能体(Pi、其他 JSON 智能体)会将每个工具调用作为自己的仅元数据消息发回,在可用时以前缀 ` : ` 标注。这些工具摘要会在每个工具启动后立即发送(单独气泡),而不是作为流式增量发送。
+- 工具失败摘要在普通模式下仍可见,但原始错误详细信息后缀会隐藏,除非详细模式为 `on` 或 `full`。
+- 当详细模式为 `full` 时,工具输出也会在完成后转发(单独气泡,截断到安全长度)。如果你在运行进行中切换 `/verbose on|full|off`,后续工具气泡会遵循新设置。
+- `agents.defaults.toolProgressDetail` 控制 `/verbose` 工具摘要和进度草稿工具行的形状。使用 `"explain"`(默认)可获得紧凑的人类可读标签,例如 `🛠️ Exec: checking JS syntax`;当你还想附加原始命令/详细信息用于调试时,使用 `"raw"`。每个智能体的 `agents.list[].toolProgressDetail` 会覆盖默认值。
- `explain`: `🛠️ Exec: check JS syntax for /tmp/app.js`
- `raw`: `🛠️ Exec: check JS syntax for /tmp/app.js, node --check /tmp/app.js`
-## 插件追踪指令(/trace)
+## 插件跟踪指令(/trace)
- 级别:`on` | `off`(默认)。
-- 仅包含指令的消息会切换会话插件追踪输出,并回复 `Plugin trace enabled.` / `Plugin trace disabled.`。
+- 仅包含指令的消息会切换会话插件跟踪输出,并回复 `Plugin trace enabled.` / `Plugin trace disabled.`。
- 内联指令仅影响该消息;否则应用会话/全局默认值。
-- 发送不带参数的 `/trace`(或 `/trace:`)可查看当前追踪级别。
-- `/trace` 比 `/verbose` 更窄:它只公开插件拥有的追踪/调试行,例如主动记忆调试摘要。
-- 追踪行可能出现在 `/status` 中,也可能在正常助手回复之后作为后续诊断消息出现。
+- 发送不带参数的 `/trace`(或 `/trace:`)可查看当前跟踪级别。
+- `/trace` 比 `/verbose` 范围更窄:它只公开插件拥有的跟踪/调试行,例如 Active Memory 调试摘要。
+- 跟踪行可以出现在 `/status` 中,也可以在常规助手回复之后作为后续诊断消息出现。
## 推理可见性(/reasoning)
- 级别:`on|off|stream`。
-- 仅包含指令的消息会切换是否在回复中显示思考块。
+- 仅包含指令的消息会切换回复中是否显示思考块。
- 启用后,推理会作为前缀为 `Reasoning:` 的**单独消息**发送。
- `stream`(仅 Telegram):在回复生成时将推理流式传输到 Telegram 草稿气泡中,然后发送不含推理的最终答案。
- 别名:`/reason`。
- 发送不带参数的 `/reasoning`(或 `/reasoning:`)可查看当前推理级别。
-- 解析顺序:内联指令,然后是会话覆盖,然后是每个智能体默认值(`agents.list[].reasoningDefault`),最后是回退(`off`)。
+- 解析顺序:内联指令,然后是会话覆盖,然后是每个智能体默认值(`agents.list[].reasoningDefault`),最后回退(`off`)。
-格式错误的本地模型推理标签会被保守处理。闭合的 `...` 块在普通回复中保持隐藏,已显示文本之后未闭合的推理也会隐藏。如果回复完全包裹在单个未闭合的开始标签中,且否则会作为空文本交付,OpenClaw 会移除格式错误的开始标签并交付剩余文本。
+格式错误的本地模型推理标签会被保守处理。闭合的 `...` 块在普通回复中保持隐藏,已可见文本之后未闭合的推理也会被隐藏。如果回复完全包裹在单个未闭合的开始标签中,并且否则会作为空文本交付,OpenClaw 会移除格式错误的开始标签并交付剩余文本。
-## 相关内容
+## 相关
-- 提权模式文档位于[提权模式](/zh-CN/tools/elevated)。
+- 提权模式文档位于 [提权模式](/zh-CN/tools/elevated)。
## Heartbeat
-- Heartbeat 探测正文是配置的 Heartbeat 提示(默认:`Read HEARTBEAT.md if it exists (workspace context). Follow it strictly. Do not infer or repeat old tasks from prior chats. If nothing needs attention, reply HEARTBEAT_OK.`)。Heartbeat 消息中的内联指令照常应用(但避免从 Heartbeat 更改会话默认值)。
-- Heartbeat 交付默认只发送最终载荷。若还要发送单独的 `Reasoning:` 消息(可用时),请设置 `agents.defaults.heartbeat.includeReasoning: true` 或每个智能体的 `agents.list[].heartbeat.includeReasoning: true`。
+- Heartbeat 探测正文是已配置的 Heartbeat 提示(默认:`Read HEARTBEAT.md if it exists (workspace context). Follow it strictly. Do not infer or repeat old tasks from prior chats. If nothing needs attention, reply HEARTBEAT_OK.`)。Heartbeat 消息中的内联指令会照常应用(但应避免从 Heartbeat 更改会话默认值)。
+- Heartbeat 交付默认只发送最终载荷。若也要发送单独的 `Reasoning:` 消息(可用时),请设置 `agents.defaults.heartbeat.includeReasoning: true` 或每个智能体的 `agents.list[].heartbeat.includeReasoning: true`。
## Web 聊天 UI
-- 页面加载时,Web 聊天思考选择器会从入站会话存储/配置中镜像会话已存储级别。
-- 选择另一个级别会立即通过 `sessions.patch` 写入会话覆盖;它不会等待下一次发送,也不是一次性的 `thinkingOnce` 覆盖。
-- 第一个选项始终是 `Default ()`,其中解析后的默认值来自活动会话模型的提供商思考配置档案,以及 `/status` 和 `session_status` 使用的相同回退逻辑。
-- 选择器使用 Gateway 网关会话行/默认值返回的 `thinkingLevels`,并将 `thinkingOptions` 保留为旧版标签列表。浏览器 UI 不保留自己的提供商正则表达式列表;插件拥有特定模型的级别集合。
-- `/think:` 仍然有效,并会更新同一个已存储会话级别,因此聊天指令和选择器会保持同步。
+- Web 聊天思考选择器会在页面加载时,从入站会话存储/配置中镜像该会话已存储的级别。
+- 选择另一个级别会通过 `sessions.patch` 立即写入会话覆盖;它不会等待下一次发送,也不是一次性的 `thinkingOnce` 覆盖。
+- 第一个选项始终是 `Default ()`,其中解析后的默认值来自活跃会话模型的提供商思考配置文件,以及 `/status` 和 `session_status` 使用的同一套回退逻辑。
+- 选择器使用 Gateway 网关会话行/默认值返回的 `thinkingLevels`,并将 `thinkingOptions` 保留为旧版标签列表。浏览器 UI 不保留自己的提供商正则列表;插件拥有特定于模型的级别集合。
+- `/think:` 仍然有效,并更新同一个已存储会话级别,因此聊天指令和选择器会保持同步。
-## 提供商配置档案
+## 提供商配置文件
-- 提供商插件可以公开 `resolveThinkingProfile(ctx)`,用于定义模型支持的级别和默认值。
-- 代理 Claude 模型的提供商插件应复用 `openclaw/plugin-sdk/provider-model-shared` 中的 `resolveClaudeThinkingProfile(modelId)`,以保持直接 Anthropic 和代理目录一致。
-- 每个配置档级别都有一个已存储的规范 `id`(`off`、`minimal`、`low`、`medium`、`high`、`xhigh`、`adaptive` 或 `max`),并且可以包含一个显示用 `label`。二元提供商使用 `{ id: "low", label: "on" }`。
-- 需要验证显式 thinking 覆盖值的工具插件应使用 `api.runtime.agent.resolveThinkingPolicy({ provider, model })` 加上 `api.runtime.agent.normalizeThinkingLevel(...)`;它们不应维护自己的提供商/模型级别列表。
-- 可访问已配置自定义模型元数据的工具插件可以将 `catalog` 传入 `resolveThinkingPolicy`,这样 `compat.supportedReasoningEfforts` 的选择启用会反映在插件侧验证中。
-- 已发布的旧版钩子(`supportsXHighThinking`、`isBinaryThinking` 和 `resolveDefaultThinkingLevel`)会保留为兼容性适配器,但新的自定义级别集应使用 `resolveThinkingProfile`。
-- Gateway 网关行/默认值会公开 `thinkingLevels`、`thinkingOptions` 和 `thinkingDefault`,以便 ACP/chat 客户端渲染与运行时验证使用的相同配置档 id 和标签。
+- 提供商插件可以暴露 `resolveThinkingProfile(ctx)`,用于定义模型支持的级别和默认值。
+- 代理 Claude 模型的提供商插件应复用来自 `openclaw/plugin-sdk/provider-model-shared` 的 `resolveClaudeThinkingProfile(modelId)`,这样直接 Anthropic 目录和代理目录会保持一致。
+- 每个配置档级别都有一个存储的规范 `id`(`off`、`minimal`、`low`、`medium`、`high`、`xhigh`、`adaptive` 或 `max`),并且可以包含显示用的 `label`。二值提供商使用 `{ id: "low", label: "on" }`。
+- 需要验证显式思考覆盖设置的工具插件应使用 `api.runtime.agent.resolveThinkingPolicy({ provider, model })` 加上 `api.runtime.agent.normalizeThinkingLevel(...)`;它们不应维护自己的提供商/模型级别列表。
+- 能访问已配置自定义模型元数据的工具插件可以将 `catalog` 传入 `resolveThinkingPolicy`,这样 `compat.supportedReasoningEfforts` 的选择加入会反映在插件侧验证中。
+- 已发布的旧版钩子(`supportsXHighThinking`、`isBinaryThinking` 和 `resolveDefaultThinkingLevel`)仍作为兼容适配器保留,但新的自定义级别集合应使用 `resolveThinkingProfile`。
+- Gateway 网关行/默认值会暴露 `thinkingLevels`、`thinkingOptions` 和 `thinkingDefault`,以便 ACP/chat 客户端渲染与运行时验证使用的相同配置档 ID 和标签。