chore(i18n): refresh zh-CN translations

This commit is contained in:
openclaw-docs-i18n[bot] 2026-04-06 00:48:50 +00:00
parent 4016d9fd61
commit 0f14bbdc23
12 changed files with 954 additions and 671 deletions

View File

@ -2,40 +2,37 @@
read_when:
- 你想将 QMD 设置为你的记忆后端
- 你想使用重排序或额外索引路径等高级记忆功能
summary: 本地优先的搜索 sidecar支持 BM25、向量、重排序和查询扩展
summary: 采用本地优先的搜索 sidecar支持 BM25、向量搜索、重排序和查询扩展
title: QMD 记忆引擎
x-i18n:
generated_at: "2026-04-05T08:21:25Z"
generated_at: "2026-04-06T00:47:17Z"
model: gpt-5.4
provider: openai
source_hash: fa8a31ec1a6cc83b6ab413b7dbed6a88055629251664119bfd84308ed166c58e
source_hash: 36642c7df94b88f562745dd2270334379f2aeeef4b363a8c13ef6be42dadbe5c
source_path: concepts/memory-qmd.md
workflow: 15
---
# QMD 记忆引擎
[QMD](https://github.com/tobi/qmd) 是一个本地优先的搜索 sidecar
OpenClaw 一起运行。它将 BM25、向量搜索和重排序组合到单个
二进制文件中,并且可以为工作区记忆文件之外的内容建立索引。
[QMD](https://github.com/tobi/qmd) 是一个本地优先的搜索 sidecar与 OpenClaw 一同运行。它将 BM25、向量搜索和重排序整合到单个二进制文件中并且可以索引超出你的工作区记忆文件范围的内容。
## 相比内置引擎新增的能力
## 相比内置功能增加了什么
- **重排序和查询扩展**,带来更好的召回效果。
- **为额外目录建立索引** —— 项目文档、团队笔记、磁盘上的任何内容。
- **为会话转录建立索引** —— 回忆更早的对话。
- **完全本地** —— 通过 Bun + node-llama-cpp 运行,自动下载 GGUF 模型。
- **自动回退** —— 如果 QMD 不可用OpenClaw 会无缝回退到
内置引擎。
- **重排序和查询扩展**,以获得更好的召回效果。
- **索引额外目录** —— 项目文档、团队笔记、磁盘上的任何内容。
- **索引会话转录** —— 回忆更早的对话。
- **完全本地运行** —— 通过 Bun + node-llama-cpp 运行,自动下载 GGUF 模型。
- **自动回退** —— 如果 QMD 不可用OpenClaw 会无缝回退到内置引擎。
## 入门指南
### 前条件
### 前条件
- 安装 QMD`bun install -g @tobilu/qmd`
- 允许扩展的 SQLite 构建版本macOS 上可使用 `brew install sqlite`)。
- QMD 必须 Gateway 网关的 `PATH` 中。
- macOS 和 Linux 开箱即用。Windows 最佳支持方式是通过 WSL2。
- 安装 QMD`npm install -g @tobilu/qmd` 或 `bun install -g @tobilu/qmd`
- 支持扩展的 SQLite 构建版本(在 macOS 上使用 `brew install sqlite`)。
- QMD 必须位于 Gateway 网关的 `PATH` 中。
- macOS 和 Linux 开箱即用。Windows 最佳支持方式是通过 WSL2。
### 启用
@ -47,28 +44,34 @@ OpenClaw 一起运行。它将 BM25、向量搜索和重排序组合到单个
}
```
OpenClaw 会在
`~/.openclaw/agents/<agentId>/qmd/` 下创建一个自包含的 QMD 主目录,并自动管理 sidecar 生命周期
—— collection、更新和嵌入运行都由系统替你处理。
OpenClaw 会在 `~/.openclaw/agents/<agentId>/qmd/` 下创建一个自包含的 QMD 主目录,并自动管理 sidecar 的生命周期 —— collection、更新和 embedding 运行都会由它为你处理。它会优先使用当前的 QMD collection 和 MCP 查询形态,但在需要时仍会回退到旧版的 `--mask` collection 标志和更早的 MCP 工具名称。
## sidecar 的工作方式
- OpenClaw 会根据你的工作区记忆文件和所有已配置的
`memory.qmd.paths` 创建 collection然后在启动时运行 `qmd update` + `qmd embed`
并定期运行(默认每 5 分钟一次)。
- 启动刷新会在后台运行,因此不会阻塞聊天启动。
- 搜索会使用已配置的 `searchMode`(默认:`search`;也支持
`vsearch``query`。如果某个模式失败OpenClaw 会使用 `qmd query` 重试。
- 如果 QMD 完全失败OpenClaw 会回退到内置 SQLite 引擎。
- OpenClaw 会根据你的工作区记忆文件和任何已配置的 `memory.qmd.paths` 创建 collection然后在启动时和定期默认每 5 分钟)运行 `qmd update` + `qmd embed`
- 启动时刷新会在后台运行,因此不会阻塞聊天启动。
- 搜索会使用已配置的 `searchMode`(默认:`search`;也支持 `vsearch``query`。如果某种模式失败OpenClaw 会使用 `qmd query` 重试。
- 如果 QMD 完全失败OpenClaw 会回退到内置的 SQLite 引擎。
<Info>
首次搜索可能较慢 —— QMD 会在第一次运行 `qmd query` 时自动下载用于
重排序和查询扩展的 GGUF 模型(约 2 GB
首次搜索可能较慢 —— QMD 会在第一次运行 `qmd query` 时自动下载用于重排序和查询扩展的 GGUF 模型(约 2 GB
</Info>
## 模型覆盖
QMD 的模型环境变量会从 Gateway 网关进程原样透传,因此你可以全局调整 QMD而无需添加新的 OpenClaw 配置:
```bash
export QMD_EMBED_MODEL="hf:Qwen/Qwen3-Embedding-0.6B-GGUF/Qwen3-Embedding-0.6B-Q8_0.gguf"
export QMD_RERANK_MODEL="/absolute/path/to/reranker.gguf"
export QMD_GENERATE_MODEL="/absolute/path/to/generator.gguf"
```
更改 embedding 模型后,请重新运行 embeddings以确保索引与新的向量空间匹配。
## 为额外路径建立索引
将 QMD 指向其他目录,使其可搜索:
将 QMD 指向其他目录,使其内容搜索:
```json5
{
@ -81,9 +84,7 @@ OpenClaw 会在
}
```
来自额外路径的片段会在
搜索结果中显示为 `qmd/<collection>/<relative-path>`。`memory_get` 能识别此前缀,并从正确的
collection 根目录读取。
来自额外路径的片段会在搜索结果中显示为 `qmd/<collection>/<relative-path>`。`memory_get` 能识别此前缀,并从正确的 collection 根目录读取内容。
## 为会话转录建立索引
@ -100,13 +101,11 @@ collection 根目录读取。
}
```
转录会以净化后的 User/Assistant 轮次形式导出到专用的 QMD
collection 中,路径位于 `~/.openclaw/agents/<id>/qmd/sessions/`
转录内容会被导出为经过清理的用户/助手轮次,并存入 `~/.openclaw/agents/<id>/qmd/sessions/` 下的专用 QMD collection。
## 搜索范围
默认情况下QMD 搜索结果只会在私信会话中显示(不会在群组或
渠道中显示)。可通过配置 `memory.qmd.scope` 进行更改:
默认情况下QMD 搜索结果只会在私信会话中显示(不包括群组或渠道)。配置 `memory.qmd.scope` 可更改此行为:
```json5
{
@ -121,50 +120,38 @@ collection 中,路径位于 `~/.openclaw/agents/<id>/qmd/sessions/`。
}
```
当范围规则拒绝搜索时OpenClaw 会记录一条警告日志,其中包含推导出的渠道和
聊天类型,这样更容易调试空结果问题。
当范围规则拒绝某次搜索时OpenClaw 会记录一条警告日志,其中包含推导出的渠道和聊天类型,以便更容易调试空结果问题。
## 引用
`memory.citations``auto``on` 时,搜索片段会包含
`Source: <path#line>` 页脚。将 `memory.citations = "off"` 设为关闭后,
仍会在内部将路径传递给智能体,只是不再显示页脚。
`memory.citations``auto``on` 时,搜索片段会包含一个 `Source: <path#line>` 页脚。将 `memory.citations = "off"` 可省略该页脚,同时仍会在内部将路径传递给智能体。
## 何时使用
当你需要以下能力时,请选择 QMD
- 使用重排序以获得更高质量的结果。
- 通过重排序获得更高质量的结果。
- 搜索工作区之外的项目文档或笔记。
- 回忆过去的会话对话。
- 无需 API 密钥的完全本地搜索
- 完全本地搜索且无需 API 密钥。
对于更简单的设置,[内置引擎](/concepts/memory-builtin) 也能很好地工作,
且无需额外依赖。
对于更简单的设置,[内置引擎](/zh-CN/concepts/memory-builtin) 也能很好地工作,并且无需额外依赖。
## 故障排除
**找不到 QMD** 请确保该二进制文件位于 Gateway 网关的 `PATH` 中。如果 OpenClaw
作为服务运行,请创建一个符号链接:
**找不到 QMD** 请确保该二进制文件位于 Gateway 网关的 `PATH` 中。如果 OpenClaw 作为服务运行,请创建一个符号链接:
`sudo ln -s ~/.bun/bin/qmd /usr/local/bin/qmd`
**首次搜索很慢?** QMD 会在首次使用时下载 GGUF 模型。可以使用与 OpenClaw 相同的 XDG 目录运行
`qmd query "test"` 进行预热。
**首次搜索非常慢?** QMD 会在首次使用时下载 GGUF 模型。你可以使用与 OpenClaw 相同的 XDG 目录运行 `qmd query "test"` 来预热。
**搜索超时?** 请增加 `memory.qmd.limits.timeoutMs`默认4000ms
对于较慢的硬件,可设置为 `120000`
**搜索超时?** 增加 `memory.qmd.limits.timeoutMs`默认4000ms。对于较慢的硬件可设置为 `120000`
**群聊中结果为空?** 请检查 `memory.qmd.scope` —— 默认只
允许私信会话。
**群聊中结果为空?** 检查 `memory.qmd.scope` —— 默认仅允许私信会话。
**工作区可见的临时仓库导致 `ENAMETOOLONG` 或索引损坏?**
QMD 遍历当前遵循底层 QMD 扫描器的行为,而不是
OpenClaw 内置的符号链接规则。请将临时 monorepo 检出保存在
`.tmp/` 这类隐藏目录下,或放在已建立索引的 QMD 根目录之外,直到 QMD 提供
循环安全遍历或显式排除控制。
QMD 遍历当前遵循底层 QMD 扫描器的行为,而不是 OpenClaw 内置的符号链接规则。在 QMD 提供具备循环安全的遍历或显式排除控制之前,请将临时 monorepo 检出保存在 `.tmp/` 之类的隐藏目录中,或放在已索引 QMD 根目录之外。
## 配置
有关完整配置项(`memory.qmd.*`)、搜索模式、更新间隔、
范围规则和其他所有调节项,请参见
[记忆配置参考](/reference/memory-config)。
要查看完整的配置范围(`memory.qmd.*`)、搜索模式、更新间隔、范围规则及其他所有可调项,请参阅
[记忆配置参考](/zh-CN/reference/memory-config)。

View File

@ -1,97 +1,96 @@
---
read_when:
- 在本地或 CI 中运行测试
- 为模型/提供商缺陷添加回归测试
- 为模型 / 提供商缺陷添加回归测试
- 调试 Gateway 网关 + 智能体行为
summary: 测试工具包:单元/e2e/实时测试套件、Docker 运行器,以及各项测试覆盖的内容
summary: 测试工具包:单元 / e2e / 实时测试套件、Docker 运行器,以及各项测试覆盖的内容
title: 测试
x-i18n:
generated_at: "2026-04-05T21:04:03Z"
generated_at: "2026-04-06T00:48:50Z"
model: gpt-5.4
provider: openai
source_hash: f524700478e6f06f6afd3bdf4e88b482bb9615dcdf888cc22663cb3ef3cf8db9
source_hash: ef02b860d1a76c5da2bcd2479bb2a51223a30aa2c4a10a5dd3efa91225d41787
source_path: help/testing.md
workflow: 15
---
# 测试
OpenClaw 有三个 Vitest 测试套件(单元/集成、e2e、实时以及一小组 Docker 运行器。
OpenClaw 有三个 Vitest 测试套件(单元 / 集成、e2e、实时以及一小组 Docker 运行器。
本文档是一份“我们如何测试”的指南:
- 每个测试套件覆盖什么内容(以及它刻意 _不_ 覆盖什么)
- 每个测试套件覆盖什么内容(以及它**刻意不**覆盖什么)
- 常见工作流应运行哪些命令(本地、推送前、调试)
- 实时测试如何发现凭证并选择模型/提供商
- 如何为真实世界中的模型/提供商问题添加回归测试
- 实时测试如何发现凭证并选择模型 / 提供商
- 如何为真实世界中的模型 / 提供商问题添加回归测试
## 快速开始
大多数时候
大多数情况下
- 完整门禁(预期在推送前运行):`pnpm build && pnpm check && pnpm test`
- 在资源充足的机器上更快地运行本地全套测试`pnpm test:max`
- 直接使用 Vitest 监视循环(现代项目配置):`pnpm test:watch`
- 现在也支持直接按文件定位扩展/渠道路径:`pnpm test extensions/discord/src/monitor/message-handler.preflight.test.ts`
- 在配置宽裕的机器上更快地运行本地完整测试套件`pnpm test:max`
- 直接使用 Vitest 观察循环(现代 projects 配置):`pnpm test:watch`
- 直接按文件定位现在也支持扩展 / 渠道路径:`pnpm test extensions/discord/src/monitor/message-handler.preflight.test.ts`
当你修改了测试或想要更高把握时:
当你修改了测试或希望获得更多信心时:
- 覆盖率门禁:`pnpm test:coverage`
- E2E 测试套件:`pnpm test:e2e`
- E2E 套件:`pnpm test:e2e`
当你调试真实提供商/模型时(需要真实凭证):
当你调试真实提供商 / 模型时(需要真实凭证):
- 实时测试套件(模型 + Gateway 网关工具/图像探测):`pnpm test:live`
- 安静地只跑一个实时测试文件:`pnpm test:live -- src/agents/models.profiles.live.test.ts`
- 实时套件(模型 + Gateway 网关工具 / 图像探测):`pnpm test:live`
- 安静地只运行一个实时文件:`pnpm test:live -- src/agents/models.profiles.live.test.ts`
提示:当你只需要一个失败用例时,优先使用下文介绍的 allowlist 环境变量来缩小实时测试范围。
提示:如果你只需要一个失败用例,优先使用下文描述的 allowlist 环境变量来缩小实时测试范围。
## 测试套件(各自在哪里运行)
## 测试套件(各自运行位置
可以把这些测试套件理解为“真实程度逐步增加”(同时不稳定性/成本也逐步增加):
可以把这些测试套件理解为“真实性逐步增加”(同时不稳定性 / 成本也增加):
### 单元 / 集成(默认)
- 命令:`pnpm test`
- 配置:通过 `vitest.config.ts` 使用原生 Vitest `projects`
- 文件:`src/**/*.test.ts`、`packages/**/*.test.ts`、`test/**/*.test.ts` 下的核心/单元测试清单,以及 `vitest.unit.config.ts` 覆盖的白名单 `ui` Node 测试
- 文件:位于 `src/**/*.test.ts`、`packages/**/*.test.ts`、`test/**/*.test.ts` 下的核心 / 单元测试清单,以及 `vitest.unit.config.ts` 覆盖的白名单 `ui` Node 测试
- 范围:
- 纯单元测试
- 进程内集成测试Gateway 网关认证、路由、工具、解析、配置)
- 针对已知缺陷的确定性回归测试
- 已知缺陷的确定性回归测试
- 预期:
- 在 CI 中运行
- 不需要真实密钥
- 应该快速且稳定
- 项目说明:
- `pnpm test`、`pnpm test:watch` 和 `pnpm test:changed` 现在都使用相同的原生 Vitest 根 `projects` 配置。
- 直接文件过滤现在会通过根项目图原生路由,因此 `pnpm test extensions/discord/src/monitor/message-handler.preflight.test.ts` 无需自定义包装器即可运行
- Projects 说明:
- `pnpm test`、`pnpm test:watch` 和 `pnpm test:changed` 现在都使用同一个原生 Vitest 根 `projects` 配置。
- 直接文件过滤现在会通过根项目图原生路由,因此 `pnpm test extensions/discord/src/monitor/message-handler.preflight.test.ts` 无需自定义包装器即可工作
- 嵌入式运行器说明:
- 当你修改消息工具发现输入或压缩运行时上下文时,
需要同时保留两个层级的覆盖。
- 为纯路由/归一化边界添加聚焦的辅助函数回归测试。
- 同时也要保持嵌入式运行器集成测试套件健康:
请保持这两个层级的覆盖。
- 为纯路由 / 规范化边界添加聚焦的辅助回归测试。
- 同时也要保持嵌入式运行器集成套件健康:
`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 和压缩行为仍然会通过真实的 `run.ts` / `compact.ts` 路径流转;仅有辅助函数级别的测试
不能充分替代这些集成路径。
- 进程池说明:
- 这些套件验证带作用域的 id 和压缩行为仍会通过真实的 `run.ts` / `compact.ts` 路径流动;仅有辅助函数测试不足以替代这些集成路径。
- 线程池说明:
- 基础 Vitest 配置现在默认使用 `threads`
- 共享 Vitest 配置还固定`isolate: false`,并在根项目、e2e 和实时配置中使用非隔离运行器。
- 根 UI 通道仍保留其 `jsdom` 设置和优化器,但现在也运行在共享的非隔离运行器上。
- `pnpm test` 会从根 `vitest.config.ts`项目配置继承相同的 `threads` + `isolate: false` 默认值。
- 共享的 `scripts/run-vitest.mjs` 启动器现在会默认为 Vitest 子 Node 进程添加 `--no-maglev`,以减少大型本地运行期间的 V8 编译抖动。如果你需要与原生 V8 行为进行比较,请设置 `OPENCLAW_VITEST_ENABLE_MAGLEV=1`
- 快速本地迭代说明:
- `pnpm test:changed` 现在使用原生项目配置并带上 `--changed origin/main`
- `pnpm test:max``pnpm test:changed:max` 保持相同的原生项目配置,只是提高了 worker 上限。
- 本地 worker 自动缩放现在刻意更保守,并且当主机平均负载已经较高时也会回退,因此默认情况下多个并发 Vitest 运行对系统的影响会更小。
- 基础 Vitest 配置会将项目/配置文件标记为 `forceRerunTriggers`这样在测试接线变更时changed 模式的重跑仍然是正确的
- 配置会在受支持的主机上保持启用 `OPENCLAW_VITEST_FS_MODULE_CACHE`;如果你想为直接性能分析指定一个显式缓存位置,请设置 `OPENCLAW_VITEST_FS_MODULE_CACHE_PATH=/abs/path`
- 共享 Vitest 配置还固定设置了 `isolate: false`,并在根 projects、e2e 和实时配置中使用非隔离运行器。
- 根 UI 通道仍保留其 `jsdom` 设置和优化器,但现在也在共享的非隔离运行器上运行
- `pnpm test` 会从根 `vitest.config.ts` projects 配置中继承相同的 `threads` + `isolate: false` 默认值。
- 共享的 `scripts/run-vitest.mjs` 启动器现在会默认为 Vitest 子 Node 进程添加 `--no-maglev`,以减少大型本地运行期间的 V8 编译抖动。如果你需要与原生 V8 行为比较,请设置 `OPENCLAW_VITEST_ENABLE_MAGLEV=1`
- 本地快速迭代说明:
- `pnpm test:changed` 使用原生 projects 配置配合 `--changed origin/main` 运行
- `pnpm test:max``pnpm test:changed:max` 保持相同的原生 projects 配置,只是使用更高的 worker 上限。
- 本地 worker 自动扩缩现在故意更保守,并且在主机平均负载已经较高时也会退让,因此默认情况下多个并发 Vitest 运行造成的影响更小。
- 基础 Vitest 配置将 projects / config 文件标记为 `forceRerunTriggers`,因此在测试接线变更时 changed 模式重新运行仍然正确
- 配置会在受支持的主机上保持启用 `OPENCLAW_VITEST_FS_MODULE_CACHE`;如果你希望为直接性能分析指定一个明确的缓存位置,请设置 `OPENCLAW_VITEST_FS_MODULE_CACHE_PATH=/abs/path`
- 性能调试说明:
- `pnpm test:perf:imports` 会启用 Vitest 导入耗时报告和导入拆分输出。
- `pnpm test:perf:imports:changed` 会将相同的分析视图限定到相对 `origin/main` 发生变化的文件。
- `pnpm test:perf:profile:main` 会为 Vitest/Vite 启动和 transform 开销写出主线程 CPU profile。
- `pnpm test:perf:imports` 会启用 Vitest 导入时长报告以及导入拆解输出。
- `pnpm test:perf:imports:changed` 会将相同的性能分析视图限定到自 `origin/main` 以来变更的文件。
- `pnpm test:perf:profile:main` 会为 Vitest / Vite 启动和转换开销写出主线程 CPU profile。
- `pnpm test:perf:profile:runner` 会在禁用文件并行的情况下,为单元测试套件写出运行器 CPU + 堆 profile。
### E2EGateway 网关冒烟)
@ -100,19 +99,19 @@ OpenClaw 有三个 Vitest 测试套件(单元/集成、e2e、实时以及
- 配置:`vitest.e2e.config.ts`
- 文件:`src/**/*.e2e.test.ts`、`test/**/*.e2e.test.ts`
- 运行时默认值:
- 使用`isolate: false` Vitest `threads`,与仓库其余部分保持一致。
- 使用 Vitest `threads` 配合 `isolate: false`,与仓库其余部分保持一致。
- 使用自适应 workerCI最多 2 个,本地:默认 1 个)。
- 默认以静默模式运行,以减少控制台 I/O 开销。
- 常用覆盖
- `OPENCLAW_E2E_WORKERS=<n>`强制指定 worker 数量(上限为 16
- `OPENCLAW_E2E_VERBOSE=1`重新启用详细控制台输出。
- 常用覆盖:
- `OPENCLAW_E2E_WORKERS=<n>` 强制指定 worker 数量(上限为 16
- `OPENCLAW_E2E_VERBOSE=1` 重新启用详细控制台输出。
- 范围:
- 多实例 Gateway 网关端到端行为
- WebSocket/HTTP 接口、节点配对以及更重的网络交互
- WebSocket / HTTP 接口、节点配对以及更重的网络场景
- 预期:
- 在 CI 中运行(当流水线启用时)
- 不需要真实密钥
- 比单元测试包含更多活动部件(可能更慢)
- 比单元测试涉及更多活动部件(可能更慢)
### E2EOpenShell 后端冒烟
@ -121,15 +120,15 @@ OpenClaw 有三个 Vitest 测试套件(单元/集成、e2e、实时以及
- 范围:
- 通过 Docker 在主机上启动一个隔离的 OpenShell Gateway 网关
- 从临时本地 Dockerfile 创建一个沙箱
- 通过真实的 `sandbox ssh-config` + SSH exec 运行 OpenClaw 的 OpenShell 后端
- 通过沙箱 fs bridge 验证远程规范化文件系统行为
- 通过真实的 `sandbox ssh-config` + SSH exec 练习 OpenClaw 的 OpenShell 后端
- 通过沙箱 fs bridge 验证远端规范文件系统行为
- 预期:
- 仅按需启用;不属于默认的 `pnpm test:e2e` 运行
- 仅限显式启用;不属于默认 `pnpm test:e2e` 运行的一部分
- 需要本地 `openshell` CLI 和可用的 Docker 守护进程
- 使用隔离的 `HOME` / `XDG_CONFIG_HOME`后销毁测试 Gateway 网关和沙箱
- 常用覆盖
- `OPENCLAW_E2E_OPENSHELL=1`:在手动运行更广泛的 e2e 测试套件时启用此测试
- `OPENCLAW_E2E_OPENSHELL_COMMAND=/path/to/openshell`:指向非默认的 CLI 二进制或包装脚本
- 使用隔离的 `HOME` / `XDG_CONFIG_HOME`后销毁测试 Gateway 网关和沙箱
- 常用覆盖:
- `OPENCLAW_E2E_OPENSHELL=1`,在手动运行更广泛的 e2e 套件时启用此测试
- `OPENCLAW_E2E_OPENSHELL_COMMAND=/path/to/openshell`,指向非默认 CLI 二进制或包装脚本
### 实时(真实提供商 + 真实模型)
@ -138,102 +137,102 @@ OpenClaw 有三个 Vitest 测试套件(单元/集成、e2e、实时以及
- 文件:`src/**/*.live.test.ts`
- 默认:由 `pnpm test:live` **启用**(设置 `OPENCLAW_LIVE_TEST=1`
- 范围:
- “这个提供商/模型今天是否真的能用真实凭证正常工作?”
- 捕获提供商格式变更、工具调用怪癖、认证问题和速率限制行为
- “这个提供商 / 模型今天在真实凭证下是否真的可用?”
- 捕获提供商格式变化、工具调用怪异行为、认证问题和速率限制行为
- 预期:
- 按设计并不具备 CI 稳定性(真实网络、真实提供商策略、配额、故障)
- 从设计上就不是 CI 稳定的(真实网络、真实提供商策略、配额、故障)
- 会花钱 / 消耗速率限制
- 优先运行缩小的子集,而不是“全部”
- 实时运行会读取 `~/.profile` 以补齐缺失的 API 密钥。
- 默认情况下,实时运行仍会隔离 `HOME`,并将配置/认证材料复制到临时测试 home 中,这样单元测试夹具就不会修改你真实的 `~/.openclaw`
- 只有当你明确需要实时测试使用真实 home 目录时,才设置 `OPENCLAW_LIVE_USE_REAL_HOME=1`
- `pnpm test:live` 现在默认使用更安静的模式:保留 `[live] ...` 进度输出,但会抑制额外的 `~/.profile` 提示,并静默 Gateway 网关引导日志/Bonjour 噪声。如果你想恢复完整启动日志,请设置 `OPENCLAW_LIVE_TEST_QUIET=0`
- API 密钥轮换(提供商特定):设置 `*_API_KEYS`,使用逗号/分号格式,或设置 `*_API_KEY_1`、`*_API_KEY_2`(例如 `OPENAI_API_KEYS`、`ANTHROPIC_API_KEYS`、`GEMINI_API_KEYS`),也可通过 `OPENCLAW_LIVE_*_KEY` 为单次实时运行覆盖;测试在遇到速率限制响应时重试。
- 进度/心跳输出:
- 实时测试套件现在会将进度行输出到 stderr因此即使 Vitest 控制台捕获较安静,长时间的提供商调用也能明显显示仍在运行
- `vitest.live.config.ts` 禁用 Vitest 控制台拦截,因此提供商/Gateway 网关进度行会在实时运行期间立即流式输出。
- 优先运行缩小范围的子集,而不是“全部”
- 实时运行会 source `~/.profile` 以获取缺失的 API 密钥。
- 默认情况下,实时运行仍会隔离 `HOME` 并将配置 / 认证材料复制到临时测试主目录,因此单元测试夹具不会修改你真实的 `~/.openclaw`
- 只有在你明确需要让实时测试使用真实主目录时,才设置 `OPENCLAW_LIVE_USE_REAL_HOME=1`
- `pnpm test:live` 现在默认使用更安静的模式:保留 `[live] ...` 进度输出,但会抑制额外的 `~/.profile` 提示,并静默 Gateway 网关引导日志 / Bonjour 噪声。如果你想恢复完整启动日志,请设置 `OPENCLAW_LIVE_TEST_QUIET=0`
- API 密钥轮换(按提供商):设置 `*_API_KEYS` 为逗号 / 分号格式,或设置 `*_API_KEY_1`、`*_API_KEY_2`(例如 `OPENAI_API_KEYS`、`ANTHROPIC_API_KEYS`、`GEMINI_API_KEYS`),也可通过 `OPENCLAW_LIVE_*_KEY` 为单次实时运行覆盖;测试在遇到速率限制响应时重试。
- 进度 / 心跳输出:
- 实时套件现在会向 stderr 输出进度行,因此即使 Vitest 控制台捕获较安静,长时间的提供商调用也能明显看出仍在活动
- `vitest.live.config.ts` 禁用 Vitest 控制台拦截,因此提供商 / Gateway 网关进度行会在实时运行期间立即流出。
- 使用 `OPENCLAW_LIVE_HEARTBEAT_MS` 调整直接模型心跳。
- 使用 `OPENCLAW_LIVE_GATEWAY_HEARTBEAT_MS` 调整 Gateway 网关/探测心跳。
- 使用 `OPENCLAW_LIVE_GATEWAY_HEARTBEAT_MS` 调整 Gateway 网关 / 探测心跳。
## 我应该运行哪个测试套件?
使用这个决策表:
使用这个决策表:
- 编辑逻辑/测试:运行 `pnpm test`(如果改动较多,也运行 `pnpm test:coverage`
- 修改 Gateway 网关网络 / WS 协议 / 配对:再加上 `pnpm test:e2e`
- 调试“我的 bot 挂了”/ 提供商特定故障 / 工具调用:运行缩小范围的 `pnpm test:live`
- 编辑逻辑 / 测试:运行 `pnpm test`(如果改动很多,再运行 `pnpm test:coverage`
- 涉及 Gateway 网关网络 / WS 协议 / 配对:额外运行 `pnpm test:e2e`
- 调试“我的 bot 挂了” / 提供商特定故障 / 工具调用:运行缩小范围的 `pnpm test:live`
## 实时Android 节点能力扫描
- 测试:`src/gateway/android-node.capabilities.live.test.ts`
- 脚本:`pnpm android:test:integration`
- 目标:调用已连接 Android 节点当前宣告的**每一条命令**,并断言命令契约行为。
- 目标:调用已连接 Android 节点当前**宣告的每一个命令**,并断言命令契约行为。
- 范围:
- 预先满足条件/手动设置(测试套件不会安装/运行/配对应用)。
- 针对所选 Android 节点逐条验证 Gateway 网关 `node.invoke`
- 必需的预
- 有前置条件 / 手动设置(该套件不会安装 / 运行 / 配对应用)。
- 针对选定 Android 节点逐命令验证 Gateway 网关 `node.invoke`
- 必需的预设:
- Android 应用已连接并与 Gateway 网关配对。
- 应用保持前台。
- 已授予你预期会通过的能力所需权限/采集同意
- 应用保持前台运行
- 你预期能通过的能力所需权限 / 捕获授权已授予
- 可选目标覆盖:
- `OPENCLAW_ANDROID_NODE_ID``OPENCLAW_ANDROID_NODE_NAME`
- `OPENCLAW_ANDROID_GATEWAY_URL` / `OPENCLAW_ANDROID_GATEWAY_TOKEN` / `OPENCLAW_ANDROID_GATEWAY_PASSWORD`
- 完整 Android 设置详情:[Android App](/zh-CN/platforms/android)
- 完整 Android 设置详情: [Android App](/zh-CN/platforms/android)
## 实时模型冒烟profile keys
实时测试分成两层,以便我们隔离故障:
实时测试分成两层,以便我们隔离故障:
- “直接模型”告诉我们,提供商/模型使用给定密钥是否至少能回答。
- “Gateway 网关冒烟”告诉我们,针对该模型,完整的 Gateway 网关 + 智能体流水线是否可工作(会话、历史、工具、沙箱策略等)。
- “直接模型”告诉我们:给定密钥下,提供商 / 模型是否至少能返回回答。
- “Gateway 冒烟”告诉我们:该模型的完整 Gateway 网关 + 智能体管线是否工作(会话、历史、工具、沙箱策略等)。
### 第 1 层:直接模型补全(无 Gateway 网关)
- 测试:`src/agents/models.profiles.live.test.ts`
- 目标:
- 枚举已发现的模型
- 使用 `getApiKeyForModel` 选择你有凭证的模型
- 对每个模型运行一个小型补全(以及需要时的定向回归)
- 使用 `getApiKeyForModel` 选择你有凭证的模型
- 为每个模型运行一个小型补全(并在需要时运行定向回归)
- 启用方式:
- `pnpm test:live`(或者如果直接调用 Vitest则设 `OPENCLAW_LIVE_TEST=1`
- 设置 `OPENCLAW_LIVE_MODELS=modern`(或 `all`是 modern 的别名)才会实际运行此套件;否则它会跳过,以便让 `pnpm test:live` 保持聚焦于 Gateway 网关冒烟
- 如何选择模型:
- `OPENCLAW_LIVE_MODELS=modern` 以运行现代 allowlistOpus/Sonnet 4.6+、GPT-5.x + Codex、Gemini 3、GLM 4.7、MiniMax M2.7、Grok 4
- `pnpm test:live`(或在直接调用 Vitest 时设置 `OPENCLAW_LIVE_TEST=1`
- 设置 `OPENCLAW_LIVE_MODELS=modern`(或 `all`即 modern 的别名)才会真正运行此套件;否则它会跳过,以便让 `pnpm test:live` 聚焦于 Gateway 冒烟
- 选择模型的方法
- `OPENCLAW_LIVE_MODELS=modern` 以运行现代 allowlistOpus / Sonnet 4.6+、GPT-5.x + Codex、Gemini 3、GLM 4.7、MiniMax M2.7、Grok 4
- `OPENCLAW_LIVE_MODELS=all` 是现代 allowlist 的别名
- 或 `OPENCLAW_LIVE_MODELS="openai/gpt-5.4,anthropic/claude-opus-4-6,..."`(逗号分隔 allowlist
- 如何选择提供商:
- `OPENCLAW_LIVE_PROVIDERS="google,google-antigravity"`(逗号分隔 allowlist
- 或 `OPENCLAW_LIVE_MODELS="openai/gpt-5.4,anthropic/claude-opus-4-6,..."`(逗号 allowlist
- 选择提供商的方法
- `OPENCLAW_LIVE_PROVIDERS="google,google-antigravity"`(逗号 allowlist
- 密钥来源:
- 默认profile 存储和环境变量回退
- 设置 `OPENCLAW_LIVE_REQUIRE_PROFILE_KEYS=1` 可强制只使用 **profile 存储**
- 设立此层的原因:
- 将“提供商 API 坏了 / 密钥无效”和“Gateway 网关智能体流水线坏了”分离开
- 容纳小型、隔离的回归测试例如OpenAI Responses/Codex Responses 推理回放 + 工具调用流程)
- 设置 `OPENCLAW_LIVE_REQUIRE_PROFILE_KEYS=1` 可强制仅使用 **profile store**
- 该层存在的原因:
- 将“提供商 API 坏了 / 密钥无效”与“Gateway 网关智能体管线坏了”分离
- 容纳小型、隔离的回归测试例如OpenAI Responses / Codex Responses 推理回放 + 工具调用流程)
### 第 2 层Gateway 网关 + dev 智能体冒烟(即 “@openclaw” 实际做的事)
### 第 2 层Gateway 网关 + 开发智能体冒烟(也就是 “@openclaw” 实际做的事)
- 测试:`src/gateway/gateway-models.profiles.live.test.ts`
- 目标:
- 启动一个进程内 Gateway 网关
- 创建/修补一个 `agent:dev:*` 会话(每次运行按模型覆盖)
- 创建 / 修补一个 `agent:dev:*` 会话(每次运行按模型覆盖)
- 遍历带密钥的模型并断言:
- “有意义的响应(无工具)
- 真实工具调用可工作read 探测)
- 可选额外工具探测exec+read 探测)
- OpenAI 回归路径(仅工具调用 → 后续跟进)持续可用
- 探测细节(便于你快速解释失败原因):
- `read` 探测:测试会在工作区写入一个 nonce 文件,并要求智能体 `read` 该文件并将 nonce 回显回来。
- `exec+read` 探测:测试会要求智能体通过 `exec` 将 nonce 写入临时文件,然后再 `read` 读取回来。
- “有意义的响应(无工具)
- 真实的工具调用可用read 探测)
- 可选额外工具探测可用exec+read 探测)
- OpenAI 回归路径(仅工具调用 → 后续跟进)仍然工作
- 探测细节(这样你可以快速解释失败原因):
- `read` 探测:测试会在工作区写入一个 nonce 文件,并要求智能体 `read` 它,然后把 nonce 回显出来。
- `exec+read` 探测:测试会要求智能体 `exec` 将 nonce 写入临时文件,然后再 `read` 回来。
- 图像探测:测试会附加一个生成的 PNG猫 + 随机代码),并期望模型返回 `cat <CODE>`
- 实现参考:`src/gateway/gateway-models.profiles.live.test.ts` 和 `src/gateway/live-image-probe.ts`
- 启用方式:
- `pnpm test:live`(或者如果直接调用 Vitest则设 `OPENCLAW_LIVE_TEST=1`
- 如何选择模型:
- 默认:现代 allowlistOpus/Sonnet 4.6+、GPT-5.x + Codex、Gemini 3、GLM 4.7、MiniMax M2.7、Grok 4
- `pnpm test:live`(或在直接调用 Vitest 时设置 `OPENCLAW_LIVE_TEST=1`
- 选择模型的方法
- 默认:现代 allowlistOpus / Sonnet 4.6+、GPT-5.x + Codex、Gemini 3、GLM 4.7、MiniMax M2.7、Grok 4
- `OPENCLAW_LIVE_GATEWAY_MODELS=all` 是现代 allowlist 的别名
- 或设置 `OPENCLAW_LIVE_GATEWAY_MODELS="provider/model"`(或逗号列表)来缩小范围
- 如何选择提供商避免“OpenRouter 全部都测”):
- `OPENCLAW_LIVE_GATEWAY_PROVIDERS="google,google-antigravity,openai,anthropic,zai,minimax"`(逗号分隔 allowlist
- 选择提供商的方法避免“OpenRouter 全部都测”):
- `OPENCLAW_LIVE_GATEWAY_PROVIDERS="google,google-antigravity,openai,anthropic,zai,minimax"`(逗号 allowlist
- 工具 + 图像探测在这个实时测试中始终开启:
- `read` 探测 + `exec+read` 探测(工具压力测试)
- 当模型宣告支持图像输入时,会运行图像探测
@ -241,10 +240,10 @@ OpenClaw 有三个 Vitest 测试套件(单元/集成、e2e、实时以及
- 测试生成一个带有 “CAT” + 随机代码的小型 PNG`src/gateway/live-image-probe.ts`
- 通过 `agent` `attachments: [{ mimeType: "image/png", content: "<base64>" }]` 发送
- Gateway 网关将附件解析为 `images[]``src/gateway/server-methods/agent.ts` + `src/gateway/chat-attachments.ts`
- 嵌入式智能体向模型转发一条多模态用户消息
- 嵌入式智能体将多模态用户消息转发给模型
- 断言:回复包含 `cat` + 该代码OCR 容忍:允许轻微错误)
提示:若想查看你机器上可以测试什么(以及准确的 `provider/model` id请运行
提示:如果你想查看自己机器上可以测试什么(以及准确的 `provider/model` id请运行
```bash
openclaw models list
@ -256,9 +255,9 @@ openclaw models list --json
- 测试:`src/gateway/gateway-acp-bind.live.test.ts`
- 目标:使用实时 ACP 智能体验证真实 ACP 会话绑定流程:
- 发送 `/acp spawn <agent> --bind here`
- 地绑定一个合成的消息渠道会话
- 在同一会话上发送一条普通后续消息
- 验证后续消息落入已绑定的 ACP 会话转录中
- 地绑定一个合成的消息渠道会话
- 在同一会话上发送普通后续消息
- 验证后续消息确实落入已绑定的 ACP 会话转录中
- 启用:
- `pnpm test:live src/gateway/gateway-acp-bind.live.test.ts`
- `OPENCLAW_LIVE_ACP_BIND=1`
@ -266,13 +265,13 @@ openclaw models list --json
- ACP 智能体:`claude`
- 合成渠道Slack 私信风格会话上下文
- ACP 后端:`acpx`
- 覆盖
- 覆盖:
- `OPENCLAW_LIVE_ACP_BIND_AGENT=claude`
- `OPENCLAW_LIVE_ACP_BIND_AGENT=codex`
- `OPENCLAW_LIVE_ACP_BIND_AGENT_COMMAND='npx -y @agentclientprotocol/claude-agent-acp@<version>'`
- 说明:
- 这一通道使用 Gateway 网关 `chat.send` 接口,并带有仅管理员可用的合成 originating-route 字段,这样测试就能附加消息渠道上下文,而无需假装对外发送
- 当未设置 `OPENCLAW_LIVE_ACP_BIND_AGENT_COMMAND` 时,测试会使用内置 `acpx` 插件的内建智能体注册表来选择 ACP 测试智能体。
- 该通道使用 Gateway 网关 `chat.send` 接口,并带有仅管理员可用的合成来源路由字段,因此测试可以附加消息渠道上下文,而无需假装实际外发
- 当未设置 `OPENCLAW_LIVE_ACP_BIND_AGENT_COMMAND` 时,测试会使用内置 `acpx` 插件的内建智能体注册表来选择所选 ACP harness 智能体。
示例:
@ -282,7 +281,7 @@ OPENCLAW_LIVE_ACP_BIND=1 \
pnpm test:live src/gateway/gateway-acp-bind.live.test.ts
```
Docker 用法
Docker 配方
```bash
pnpm test:docker:live-acp-bind
@ -291,17 +290,17 @@ pnpm test:docker:live-acp-bind
Docker 说明:
- Docker 运行器位于 `scripts/test-live-acp-bind-docker.sh`
- 它会读取 `~/.profile`,将匹配的 CLI 认证材料暂存到容器中,把 `acpx` 安装到可写的 npm 前缀中,然后在缺失时安装所请求的实时 CLI`@anthropic-ai/claude-code` 或 `@openai/codex`)。
- 在 Docker 内,运行器会设置 `OPENCLAW_LIVE_ACP_BIND_ACPX_COMMAND=$HOME/.npm-global/bin/acpx`,这样 `acpx` 就能保留来自已读取 profile 的提供商环境变量,并将其传递给子 harness CLI
- 它会 source `~/.profile`,将匹配的 CLI 认证材料暂存进容器,在可写 npm prefix 中安装 `acpx`,然后在缺失时安装所请求的实时 CLI`@anthropic-ai/claude-code` 或 `@openai/codex`)。
- 在 Docker 内,运行器会设置 `OPENCLAW_LIVE_ACP_BIND_ACPX_COMMAND=$HOME/.npm-global/bin/acpx`,这样 acpx 就能让从 profile 中 source 的提供商环境变量继续对其子 harness CLI 可用
### 推荐的实时测试配方
### 推荐的实时配方
缩小范围、显式的 allowlist 最快,也最不易出问题:
范围窄、明确的 allowlist 最快,也最不容易出问题:
- 单个模型,直接测试(无 Gateway 网关):
- 单模型,直接模式(无 Gateway 网关):
- `OPENCLAW_LIVE_MODELS="openai/gpt-5.4" pnpm test:live src/agents/models.profiles.live.test.ts`
- 单模型Gateway 网关冒烟:
- 单模型Gateway 冒烟:
- `OPENCLAW_LIVE_GATEWAY_MODELS="openai/gpt-5.4" pnpm test:live src/gateway/gateway-models.profiles.live.test.ts`
- 跨多个提供商的工具调用:
@ -316,23 +315,23 @@ Docker 说明:
- `google/...` 使用 Gemini APIAPI 密钥)。
- `google-antigravity/...` 使用 Antigravity OAuth bridgeCloud Code Assist 风格智能体端点)。
## 实时:模型矩阵(我们的覆盖范围
## 实时:模型矩阵(我们覆盖什么
没有固定的“CI 模型列表”(实时测试是按需启用的),但以下是在有密钥的开发机器上建议定期覆盖的模型。
没有固定的“CI 模型列表”(实时测试是按需启用的),但以下是**推荐**在开发机器上定期覆盖的模型,只要你有相应密钥即可
### 现代冒烟集(工具调用 + 图像)
这是我们期望持续保持可用的“常见模型”运行集
这是我们期望持续保持可用的“常见模型”运行集:
- OpenAI非 Codex`openai/gpt-5.4`(可选:`openai/gpt-5.4-mini`
- OpenAI Codex`openai-codex/gpt-5.4`
- Anthropic`anthropic/claude-opus-4-6`(或 `anthropic/claude-sonnet-4-6`
- GoogleGemini API`google/gemini-3.1-pro-preview` 和 `google/gemini-3-flash-preview`(避免旧的 Gemini 2.x 模型)
- GoogleGemini API`google/gemini-3.1-pro-preview` 和 `google/gemini-3-flash-preview`(避免旧的 Gemini 2.x 模型)
- GoogleAntigravity`google-antigravity/claude-opus-4-6-thinking` 和 `google-antigravity/gemini-3-flash`
- Z.AIGLM`zai/glm-4.7`
- MiniMax`minimax/MiniMax-M2.7`
运行带工具 + 图像的 Gateway 网关冒烟:
运行带工具 + 图像的 Gateway 冒烟:
`OPENCLAW_LIVE_GATEWAY_MODELS="openai/gpt-5.4,openai-codex/gpt-5.4,anthropic/claude-opus-4-6,google/gemini-3.1-pro-preview,google/gemini-3-flash-preview,google-antigravity/claude-opus-4-6-thinking,google-antigravity/gemini-3-flash,zai/glm-4.7,minimax/MiniMax-M2.7" pnpm test:live src/gateway/gateway-models.profiles.live.test.ts`
### 基线工具调用Read + 可选 Exec
@ -348,43 +347,43 @@ Docker 说明:
可选的额外覆盖(有更好,没有也可以):
- xAI`xai/grok-4`(或最新可用版本)
- Mistral`mistral/`…(选一个你已启用的支持 “tools” 的模型)
- Cerebras`cerebras/`…(如果你有权限)
- Mistral`mistral/`…(选择一个你已启用、支持工具的模型)
- Cerebras`cerebras/`…(如果你有访问权限)
- LM Studio`lmstudio/`…(本地;工具调用取决于 API 模式)
### 视觉:图像发送(附件 → 多模态消息)
`OPENCLAW_LIVE_GATEWAY_MODELS` 中至少包含一个支持图像的模型Claude/Gemini/OpenAI 的视觉变体等),以触发图像探测。
`OPENCLAW_LIVE_GATEWAY_MODELS` 中至少包含一个支持图像的模型Claude / Gemini / OpenAI 的视觉变体等),以便运行图像探测。
### 聚合器 / 替代 Gateway 网关
如果你启用相应密钥,我们也支持通过以下方式测试:
如果你启用相应密钥,我们也支持通过以下方式测试:
- OpenRouter`openrouter/...`(数百个模型;使用 `openclaw models scan` 查找支持工具 + 图像的候选模型
- OpenCode`opencode/...` 用于 Zen`opencode-go/...` 用于 Go通过 `OPENCODE_API_KEY` / `OPENCODE_ZEN_API_KEY` 认证
- OpenRouter`openrouter/...`(数百个模型;使用 `openclaw models scan` 查找支持工具 + 图像的候选)
- OpenCodeZen 使用 `opencode/...`Go 使用 `opencode-go/...`(认证通过 `OPENCODE_API_KEY` / `OPENCODE_ZEN_API_KEY`
如果你有凭证/配置,还可以在实时矩阵中加入更多提供商
如果你有凭证 / 配置,也可以把更多提供商纳入实时矩阵
- 内置:`openai`、`openai-codex`、`anthropic`、`google`、`google-vertex`、`google-antigravity`、`zai`、`openrouter`、`opencode`、`opencode-go`、`xai`、`groq`、`cerebras`、`mistral`、`github-copilot`
- 通过 `models.providers`(自定义端点):`minimax`(云/API以及任何兼容 OpenAI/Anthropic 的代理LM Studio、vLLM、LiteLLM 等)
- 通过 `models.providers`(自定义端点):`minimax`(云端 / API以及任意兼容 OpenAI / Anthropic 的代理LM Studio、vLLM、LiteLLM 等)
提示:不要试图在文档中硬编码“所有模型”。权威列表应始终以你机器上的 `discoverModels(...)` 返回结果以及可用密钥为准
提示:不要试图在文档中硬编码“所有模型”。权威列表始终是你机器上 `discoverModels(...)` 的返回结果 + 当前可用的密钥
## 凭证(绝不要提交)
实时测试发现凭证的方式与 CLI 相同。实际含义如下:
- 如果 CLI 能正常工作,实时测试应能找到相同的密钥。
- 如果实时测试提示“没有凭证”,就像排查 `openclaw models list` / 模型选择那样去调试。
- 如果 CLI 可用,实时测试应该能找到相同的密钥。
- 如果实时测试提示“没有凭证”,请像调试 `openclaw models list` / 模型选择那样去调试。
- 每个智能体的认证 profile`~/.openclaw/agents/<agentId>/agent/auth-profiles.json`(这就是实时测试中 “profile keys” 的含义)
- 配置:`~/.openclaw/openclaw.json`(或 `OPENCLAW_CONFIG_PATH`
- 旧版状态目录:`~/.openclaw/credentials/`存在时会复制到暂存的实时 home 中,但它不是主要的 profile-key 存储)
- 本地实时运行默认会将当前配置、每个智能体的 `auth-profiles.json` 文件、旧版 `credentials/` 以及受支持的外部 CLI 认证目录复制到临时测试 home 中;在该暂存配置里,会移除 `agents.*.workspace` / `agentDir` 路径覆盖项,以便探测不会落到你的真实主机工作区上
- 旧版状态目录:`~/.openclaw/credentials/`如果存在,会复制到暂存的实时主目录中,但它不是主要的 profile-key 存储)
- 本地实时运行默认会把活动配置、每个智能体的 `auth-profiles.json` 文件、旧版 `credentials/` 以及受支持的外部 CLI 认证目录复制到临时测试主目录中;该暂存配置中的 `agents.*.workspace` / `agentDir` 路径覆盖会被移除,以确保探测不会落到你的真实主机工作区
如果你想依赖环境变量密钥(例如导出在你的 `~/.profile` 中),请在 `source ~/.profile` 之后再运行本地测试,或者使用下文的 Docker 运行器(它们可以将 `~/.profile` 挂载到容器中)。
如果你想依赖环境变量密钥(例如`~/.profile` 中导出),请在本地测试前运行 `source ~/.profile`,或使用下面的 Docker 运行器(它们可以把 `~/.profile` 挂载到容器中)。
## Deepgram 实时测试(音频转录)
## Deepgram 实时(音频转录)
- 测试:`src/media-understanding/providers/deepgram/audio.live.test.ts`
- 启用:`DEEPGRAM_API_KEY=... DEEPGRAM_LIVE_TEST=1 pnpm test:live src/media-understanding/providers/deepgram/audio.live.test.ts`
@ -395,6 +394,15 @@ Docker 说明:
- 启用:`BYTEPLUS_API_KEY=... BYTEPLUS_LIVE_TEST=1 pnpm test:live src/agents/byteplus.live.test.ts`
- 可选模型覆盖:`BYTEPLUS_CODING_MODEL=ark-code-latest`
## ComfyUI 工作流媒体实时测试
- 测试:`extensions/comfy/comfy.live.test.ts`
- 启用:`OPENCLAW_LIVE_TEST=1 COMFY_LIVE_TEST=1 pnpm test:live -- extensions/comfy/comfy.live.test.ts`
- 范围:
- 练习内置 comfy 图像、视频和 `music_generate` 路径
- 除非配置了 `models.providers.comfy.<capability>`,否则会跳过各项能力
- 适合在修改 comfy 工作流提交、轮询、下载或插件注册后运行
## 图像生成实时测试
- 测试:`src/image-generation/runtime.live.test.ts`
@ -402,8 +410,8 @@ Docker 说明:
- 范围:
- 枚举每个已注册的图像生成提供商插件
- 在探测前从你的登录 shell`~/.profile`)加载缺失的提供商环境变量
- 默认优先使用实时/环境变量 API 密钥,而不是已存储的认证 profile这样 `auth-profiles.json` 中过期的测试密钥不会掩盖真实 shell 凭证
- 跳过没有可用认证/profile/模型的提供商
- 默认优先使用实时 / 环境变量 API 密钥而不是已存储的认证 profile因此 `auth-profiles.json` 中过期的测试密钥不会掩盖真实 shell 凭证
- 跳过没有可用认证 / profile / 模型的提供商
- 通过共享运行时能力运行标准图像生成变体:
- `google:flash-generate`
- `google:pro-generate`
@ -417,127 +425,124 @@ Docker 说明:
- `OPENCLAW_LIVE_IMAGE_GENERATION_MODELS="openai/gpt-image-1,google/gemini-3.1-flash-image-preview"`
- `OPENCLAW_LIVE_IMAGE_GENERATION_CASES="google:flash-generate,google:pro-edit"`
- 可选认证行为:
- `OPENCLAW_LIVE_REQUIRE_PROFILE_KEYS=1` 可强制使用 profile 存储认证并忽略仅环境变量的覆盖
- `OPENCLAW_LIVE_REQUIRE_PROFILE_KEYS=1`,强制使用 profile store 认证并忽略仅环境变量覆盖
## Docker 运行器(可选的“在 Linux 可用”检查)
## Docker 运行器(可选的“在 Linux 可用”检查)
这些 Docker 运行器分为两类:
- 实时模型运行器:`test:docker:live-models` 和 `test:docker:live-gateway` 仅在仓库 Docker 镜像内运行各自匹配的 profile-key 实时测试文件(`src/agents/models.profiles.live.test.ts` 和 `src/gateway/gateway-models.profiles.live.test.ts`并挂载你的本地配置目录和工作区(如果挂载了 `~/.profile` 也会读取它)。对应的本地入口点是 `test:live:models-profiles``test:live:gateway-profiles`
- Docker 实时运行器默认带有更小的冒烟上限,以便完整的 Docker 扫描仍然可行:
`test:docker:live-models` 默认使用 `OPENCLAW_LIVE_MAX_MODELS=12`,而
`test:docker:live-gateway` 默认使用 `OPENCLAW_LIVE_GATEWAY_SMOKE=1`
- 实时模型运行器:`test:docker:live-models` 和 `test:docker:live-gateway` 只会在仓库 Docker 镜像中运行各自匹配的 profile-key 实时文件(`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 实时运行器默认使用更小的冒烟上限,以便完整 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` 构建一次实时 Docker 镜像,然后在两个实时 Docker 通道中复用它。
- 容器冒烟运行器:`test:docker:openwebui`、`test:docker:onboard`、`test:docker:gateway-network`、`test:docker:mcp-channels` 和 `test:docker:plugins` 会启动一个或多个真实容器,并验证更高层级的集成路径。
实时模型 Docker 运行器还会只绑定挂载所需的 CLI 认证 home如果运行未缩小范围则挂载所有受支持的认证 home然后在运行前将它们复制到容器 home 中,这样外部 CLI OAuth 就可以刷新 token而不会修改主机上的认证存储:
实时模型 Docker 运行器还会只 bind-mount 所需的 CLI 认证主目录(如果运行未缩小范围,则挂载所有受支持的主目录),然后在运行前将其复制到容器主目录中,这样外部 CLI OAuth 就能刷新令牌,而不会修改主机认证存储:
- 直接模型:`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`
- Gateway 网关 + dev 智能体:`pnpm test:docker:live-gateway`(脚本:`scripts/test-live-gateway-models-docker.sh`
- Gateway 网关 + 开发智能体:`pnpm test:docker:live-gateway`(脚本:`scripts/test-live-gateway-models-docker.sh`
- Open WebUI 实时冒烟:`pnpm test:docker:openwebui`(脚本:`scripts/e2e/openwebui-docker.sh`
- 新手引导向导TTY完整脚手架`pnpm test:docker:onboard`(脚本:`scripts/e2e/onboard-docker.sh`
- Gateway 网关网络两个容器WS 认证 + 健康检查):`pnpm test:docker:gateway-network`(脚本:`scripts/e2e/gateway-network-docker.sh`
- MCP 渠道桥接(带种子数据的 Gateway 网关 + stdio bridge + 原始 Claude 通知帧冒烟):`pnpm test:docker:mcp-channels`(脚本:`scripts/e2e/mcp-channels-docker.sh`
- MCP 渠道桥接(带种子 Gateway 网关 + stdio bridge + 原始 Claude 通知帧冒烟):`pnpm test:docker:mcp-channels`(脚本:`scripts/e2e/mcp-channels-docker.sh`
- 插件(安装冒烟 + `/plugin` 别名 + Claude bundle 重启语义):`pnpm test:docker:plugins`(脚本:`scripts/e2e/plugins-docker.sh`
实时模型 Docker 运行器还会将当前 checkout 以只读方式绑定挂载,
并将其暂存到容器内的临时工作目录中。这样既能保持运行时
镜像精简,又能让 Vitest 针对你本地精确的源码/配置运行。
暂存步骤会跳过大型本地专用缓存和应用构建产物,例如
`.pnpm-store`、`.worktrees`、`__openclaw_vitest__`,以及应用本地 `.build`
Gradle 输出目录,因此 Docker 实时运行不会花几分钟去复制
机器特定工件。
它们还会设置 `OPENCLAW_SKIP_CHANNELS=1`,这样 Gateway 网关实时探测就不会在容器内
启动真实的 Telegram/Discord 等渠道 worker。
`test:docker:live-models` 仍然运行 `pnpm test:live`,因此当你需要缩小范围或排除 Gateway 网关
实时覆盖时,也请同时透传
`OPENCLAW_LIVE_GATEWAY_*`
`test:docker:openwebui` 是一个更高层级的兼容性冒烟测试:它会启动一个
启用了 OpenAI 兼容 HTTP 端点的 OpenClaw Gateway 网关容器,
再针对该 Gateway 网关启动一个固定版本的 Open WebUI 容器,通过
Open WebUI 完成登录,验证 `/api/models` 暴露 `openclaw/default`,然后通过
实时模型 Docker 运行器还会将当前 checkout 以只读方式 bind-mount并在容器内暂存到临时工作目录。这样既能保持运行时镜像精简又能让 Vitest 对你当前本地源代码 / 配置精确运行。
暂存步骤会跳过大型本地专用缓存和应用构建输出,例如
`.pnpm-store`、`.worktrees`、`__openclaw_vitest__`,以及应用本地的 `.build`
Gradle 输出目录,因此 Docker 实时运行不会花上几分钟去复制
机器特定的制品。
它们还会设置 `OPENCLAW_SKIP_CHANNELS=1`,因此 Gateway 网关实时探测不会在容器内启动
真实的 Telegram / Discord / 等渠道 worker。
`test:docker:live-models` 仍然会运行 `pnpm test:live`,因此当你需要缩小范围或排除 Gateway 网关
实时覆盖时,也请一并传入 `OPENCLAW_LIVE_GATEWAY_*`
`test:docker:openwebui` 是更高层级的兼容性冒烟:它会启动一个启用了
OpenAI 兼容 HTTP 端点的 OpenClaw Gateway 网关容器,
再以该 Gateway 网关为后端启动一个固定版本的 Open WebUI 容器,通过
Open WebUI 登录,验证 `/api/models` 暴露 `openclaw/default`,然后通过
Open WebUI 的 `/api/chat/completions` 代理发送一条真实聊天请求。
首次运行可能明显更慢,因为 Docker 可能需要拉取
Open WebUI 镜像,而且 Open WebUI 也可能需要完成自己的冷启动设置。
这个通道需要一个可用的实时模型密钥,而 `OPENCLAW_PROFILE_FILE`
(默认 `~/.profile`)是在 Docker 化运行中提供该密钥的主要方式。
Open WebUI 镜像,而 Open WebUI 也可能需要完成自身冷启动设置。
该通道要求可用的实时模型密钥,而 `OPENCLAW_PROFILE_FILE`
(默认 `~/.profile`)是在 Docker 化运行中提供该密钥的主要方式。
成功运行会打印一小段 JSON 载荷,例如 `{ "ok": true, "model":
"openclaw/default", ... }`。
`test:docker:mcp-channels` 是刻意设计确定性的,不需要
真实的 Telegram、Discord 或 iMessage 账号。它会启动一个带种子数据的 Gateway 网关
`test:docker:mcp-channels` 是刻意设计确定性的,不需要
真实的 Telegram、Discord 或 iMessage 账户。它会启动一个带种子的 Gateway 网关
容器,再启动第二个容器来运行 `openclaw mcp serve`,然后
验证路由后的会话发现、转录读取、附件元数据、
验证路由会话发现、转录读取、附件元数据、
实时事件队列行为、出站发送路由,以及 Claude 风格的渠道 +
权限通知是否通过真实的 stdio MCP bridge 正常工作。通知检查会
直接检查原始 stdio MCP 帧,因此该冒烟测试验证的是 bridge
实际发出的内容,而不仅仅是某个特定客户端 SDK 恰好暴露出来的内容。
权限通知,这些都通过真实的 stdio MCP bridge 完成。通知检查
直接检查原始 stdio MCP 帧,因此该冒烟验证的是 bridge
实际发出的内容,而不仅仅是某个特定客户端 SDK 恰好呈现的内容。
手动 ACP 自然语言线程冒烟(非 CI
- `bun scripts/dev/discord-acp-plain-language-smoke.ts --channel <discord-channel-id> ...`
- 保留此脚本用于回归/调试工作流。它未来可能还会再次用于 ACP 线程路由验证,因此不要删除。
- 请保留这个脚本用于回归 / 调试工作流。它之后可能仍需要用于 ACP 线程路由验证,因此不要删除。
有用的环境变量:
常用环境变量:
- `OPENCLAW_CONFIG_DIR=...`(默认:`~/.openclaw`)挂载到 `/home/node/.openclaw`
- `OPENCLAW_WORKSPACE_DIR=...`(默认:`~/.openclaw/workspace`)挂载到 `/home/node/.openclaw/workspace`
- `OPENCLAW_PROFILE_FILE=...`(默认:`~/.profile`)挂载到 `/home/node/.profile`,并在运行测试前读取
- `OPENCLAW_DOCKER_CLI_TOOLS_DIR=...`(默认:`~/.cache/openclaw/docker-cli-tools`)挂载到 `/home/node/.npm-global`,用于 Docker 内部缓存 CLI 安装
- `$HOME` 下的外部 CLI 认证目录/文件会以只读方式挂载到 `/host-auth...`,然后在测试启动前复制到 `/home/node/...`
- `OPENCLAW_PROFILE_FILE=...`(默认:`~/.profile`)挂载到 `/home/node/.profile`,并在运行测试前 source
- `OPENCLAW_DOCKER_CLI_TOOLS_DIR=...`(默认:`~/.cache/openclaw/docker-cli-tools`)挂载到 `/home/node/.npm-global`,用于缓存 Docker 内部的 CLI 安装
- `$HOME` 下的外部 CLI 认证目录 / 文件会以只读方式挂载到 `/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_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_LIVE_REQUIRE_PROFILE_KEYS=1` 以确保凭证来自 profile 存储(而非环境变量)
- `OPENCLAW_OPENWEBUI_MODEL=...` 用于选择 Gateway 网关向 Open WebUI 冒烟测试暴露的模型
- `OPENCLAW_OPENWEBUI_PROMPT=...` 用于覆盖 Open WebUI 冒烟测试使用的 nonce 检查提示词
- `OPENWEBUI_IMAGE=...` 用于覆盖固定的 Open WebUI 镜像标签
- `OPENCLAW_LIVE_GATEWAY_PROVIDERS=...` / `OPENCLAW_LIVE_PROVIDERS=...` 用于在容器内过滤提供商
- `OPENCLAW_LIVE_REQUIRE_PROFILE_KEYS=1` 确保凭证来自 profile store而不是环境变量)
- `OPENCLAW_OPENWEBUI_MODEL=...` 选择暴露给 Open WebUI 冒烟的模型
- `OPENCLAW_OPENWEBUI_PROMPT=...` 覆盖 Open WebUI 冒烟中使用的 nonce 检查提示词
- `OPENWEBUI_IMAGE=...` 覆盖固定的 Open WebUI 镜像标签
## 文档完整性检查
编辑文档后运行文档检查:`pnpm check:docs`。
如果你还需要检查页内标题锚点,请运行完整的 Mintlify 锚点验证:`pnpm docs:check-links:anchors`。
编辑文档后运行文档检查:`pnpm check:docs`。
当你还需要页面内标题检查时,运行完整的 Mintlify 锚点验证:`pnpm docs:check-links:anchors`。
## 离线回归CI 安全)
这些是在不使用真实提供商的情况下,针对“真实流水线”的回归测试:
这些是在没有真实提供商的情况下,对“真实管线”进行的回归测试:
- Gateway 网关工具调用(模拟 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`,强制写入配置 + 认证):`src/gateway/gateway.test.ts`用例“runs wizard over ws and writes auth token config”
- Gateway 网关向导WS `wizard.start` / `wizard.next`,强制写入配置 + 认证):`src/gateway/gateway.test.ts`用例“runs wizard over ws and writes auth token config”
## 智能体可靠性评估Skills
我们已经有一些 CI 安全的测试,它们的行为类似“智能体可靠性评估”:
我们已经有一些 CI 安全的测试,行为类似“智能体可靠性评估”:
- 通过真实 Gateway 网关 + 智能体循环进行模拟工具调用(`src/gateway/gateway.test.ts`)。
- 通过真实 Gateway 网关 + 智能体循环模拟工具调用(`src/gateway/gateway.test.ts`)。
- 验证会话接线和配置效果的端到端向导流程(`src/gateway/gateway.test.ts`)。
对于 Skills我们仍然缺少的内容(参见 [Skills](/zh-CN/tools/skills)
对于 Skills当前仍缺少的部分(参见 [Skills](/zh-CN/tools/skills)
- **决策能力:** 当 Skills 列在提示中时,智能体是否会选择正确的 skill或避免选择无关的 skill
- **合规性:** 智能体是否会在使用前读取 `SKILL.md`,并遵循所需步骤/参数?
- **决策能力:**prompt 中列出 Skills 时,智能体是否会选择正确的 skill或避免选择无关的 skill
- **合规性:** 智能体是否会在使用前读取 `SKILL.md` 并遵循所需步骤 / 参数?
- **工作流契约:** 断言工具顺序、会话历史延续和沙箱边界的多轮场景。
未来的评估应首先保持确定性:
- 一个使用模拟提供商的场景运行器,用于断言工具调用 + 顺序、skill 文件读取以及会话接线。
- 一小套以 skill 为中心的场景(该用还是不该用、门控、提示注入)。
- 仅在 CI 安全套件完善之后,再添加可选的实时评估(按需启用、受环境变量控制)。
- 使用模拟提供商的场景运行器,用于断言工具调用 + 顺序、skill 文件读取会话接线。
- 一小组以 skill 为中心的场景(使用 vs 避免、门控、prompt 注入)。
- 只有在 CI 安全套件到位之后,才添加可选的实时评估(按需启用、受环境变量控制)。
## 契约测试(插件和渠道形状)
契约测试用于验证每个已注册的插件和渠道都符合其
契约测试会验证每个已注册插件和渠道都符合其
接口契约。它们会遍历所有已发现的插件,并运行一组
针对形状和行为的断言。默认的 `pnpm test` 单元通道会刻意
跳过这些共享接缝和冒烟文件;当你修改共享渠道或提供商表面时,
请显式运行契约命令。
关于形状和行为的断言。默认的 `pnpm test` 单元通道会刻意
跳过这些共享边界和冒烟文件;当你修改共享渠道或提供商表面时,
请显式运行这些契约命令。
### 命令
@ -549,15 +554,15 @@ Open WebUI 镜像,而且 Open WebUI 也可能需要完成自己的冷启动设
位于 `src/channels/plugins/contracts/*.contract.test.ts`
- **plugin** - 基本插件形状id、name、capabilities
- **plugin** - 基本插件形状id、名称、能力
- **setup** - 设置向导契约
- **session-binding** - 会话绑定行为
- **outbound-payload** - 消息载荷结构
- **inbound** - 入站消息处理
- **actions** - 渠道动作处理器
- **threading** - 线程 ID 处理
- **directory** - 目录/成员列表 API
- **group-policy** - 群组策略执行
- **directory** - 目录 / 成员列表 API
- **group-policy** - 群组策略强制执行
### 提供商状态契约
@ -571,31 +576,31 @@ Open WebUI 镜像,而且 Open WebUI 也可能需要完成自己的冷启动设
位于 `src/plugins/contracts/*.contract.test.ts`
- **auth** - 认证流程契约
- **auth-choice** - 认证选项/选择
- **auth-choice** - 认证选择 / 选取
- **catalog** - 模型目录 API
- **discovery** - 插件发现
- **loader** - 插件加载
- **runtime** - 提供商运行时
- **shape** - 插件形状/接口
- **shape** - 插件形状 / 接口
- **wizard** - 设置向导
### 何时运行
- 修改 plugin-sdk 导出或子路径后
- 添加或修改渠道或提供商插件后
- 添加或修改渠道插件或提供商插件后
- 重构插件注册或发现逻辑后
契约测试会在 CI 中运行,不需要真实 API 密钥。
契约测试会在 CI 中运行,并且不需要真实 API 密钥。
## 添加回归测试(指南)
当你修复一个在实时环境中发现的提供商/模型问题时:
当你修复在实时环境中发现的提供商 / 模型问题时:
- 如果可能,添加一个 CI 安全的回归测试(模拟/存根提供商,或捕获准确的请求形状转换)
- 如果它本质上只能在实时环境中复现(速率限制、认证策略),就保持该实时测试范围狭窄,并通过环境变量按需启用
- 优先瞄准能捕获该缺陷的最小层级:
- 提供商请求转换/回放缺陷 → 直接模型测试
- Gateway 网关会话/历史/工具流水线缺陷 → Gateway 网关实时冒烟测试或 CI 安全的 Gateway 网关模拟测试
- SecretRef 遍历护栏:
- 如果可能,添加一个 CI 安全的回归测试(模拟 / 存根提供商,或捕获准确的请求形状转换)
- 如果它天然只能在实时环境中复现(速率限制、认证策略),那就让实时测试保持范围小,并通过环境变量按需启用
- 优先瞄准能捕获该缺陷的最小层级:
- 提供商请求转换 / 回放缺陷 → 直接模型测试
- Gateway 网关会话 / 历史 / 工具管线缺陷 → Gateway 实时冒烟或 CI 安全的 Gateway 模拟测试
- SecretRef 遍历护栏:
- `src/secrets/exec-secret-ref-id-parity.test.ts` 会从注册表元数据(`listSecretTargetRegistryEntries()`)中为每个 SecretRef 类派生一个采样目标,然后断言遍历段 exec id 会被拒绝。
- 如果你在 `src/secrets/target-registry-data.ts` 中添加了新的 `includeInPlan` SecretRef 目标家族,请更新该测试中的 `classifyTargetClass`。该测试会刻意在未分类目标 id 上失败,这样新类别就不能被悄悄跳过。
- 如果你在 `src/secrets/target-registry-data.ts` 中添加了新的 `includeInPlan` SecretRef 目标家族,请更新该测试中的 `classifyTargetClass`。该测试会在未分类目标 id 上故意失败,这样新类别就不会被静默跳过。

View File

@ -1,14 +1,14 @@
---
read_when:
- 更新 OpenClaw
- 更新后出现故障
- 更新 OpenClaw
- 更新后出现问题
summary: 安全更新 OpenClaw全局安装或源码安装以及回滚策略
title: 更新
x-i18n:
generated_at: "2026-04-05T08:28:28Z"
generated_at: "2026-04-06T00:47:09Z"
model: gpt-5.4
provider: openai
source_hash: b40429d38ca851be4fdf8063ed425faf4610a4b5772703e0481c5f1fb588ba58
source_hash: ca9fff0776b9f5977988b649e58a5d169e5fa3539261cb02779d724d4ca92877
source_path: install/updating.md
workflow: 15
---
@ -25,26 +25,25 @@ x-i18n:
openclaw update
```
果要切换通道或指定特定版本:
需切换渠道或指定特定版本:
```bash
openclaw update --channel beta
openclaw update --tag main
openclaw update --dry-run # preview without applying
openclaw update --dry-run # 预览但不实际应用
```
`--channel beta` 会优先使用 beta但当
beta 标签缺失或版本比最新稳定版更旧时,运行时会回退到 stable/latest。若你想针对一次性的包更新使用原始 npm beta dist-tag请使用 `--tag beta`
`--channel beta` 会优先选择 beta但当 beta 标签不存在或版本比最新稳定版更旧时,运行时会回退到 stable/latest。如果你想为一次性的软件包更新使用原始 npm beta dist-tag请使用 `--tag beta`
通道语义请参见 [开发通道](/install/development-channels)。
有关渠道语义,请参阅[开发渠道](/zh-CN/install/development-channels)。
## 另一种方式:重新运行安装脚本
## 另一种方式:重新运行安装程序
```bash
curl -fsSL https://openclaw.ai/install.sh | bash
```
添加 `--no-onboard` 可跳过新手引导。对于源码安装,请传 `--install-method git --no-onboard`
添加 `--no-onboard` 可跳过新手引导。对于源码安装,请传 `--install-method git --no-onboard`
## 另一种方式:手动使用 npm、pnpm 或 bun
@ -62,7 +61,7 @@ bun add -g openclaw@latest
## 自动更新器
自动更新器默认关闭。在 `~/.openclaw/openclaw.json` 中启用
自动更新器默认关闭。`~/.openclaw/openclaw.json` 中启用:
```json5
{
@ -78,11 +77,11 @@ bun add -g openclaw@latest
}
```
| Channel | Behavior |
| -------- | -------- |
| `stable` | 等待 `stableDelayHours`,然后在 `stableJitterHours` 范围内通过确定性抖动执行应用(分散发布)。 |
| 渠道 | 行为 |
| -------- | ------------------------------------------------------------------------------------------------------------- |
| `stable` | 等待 `stableDelayHours` 后,在 `stableJitterHours` 范围内以确定性抖动方式应用(分散发布)。 |
| `beta` | 每隔 `betaCheckIntervalHours` 检查一次(默认:每小时),并立即应用。 |
| `dev` | 不自动应用。请手动使用 `openclaw update`。 |
| `dev` | 不自动应用。请手动使用 `openclaw update`。 |
Gateway 网关也会在启动时记录更新提示(可通过 `update.checkOnStart: false` 禁用)。
@ -96,7 +95,7 @@ Gateway 网关也会在启动时记录更新提示(可通过 `update.checkOnSt
openclaw doctor
```
迁移配置、审计私信策略,并检查 Gateway 网关健康状况。详情参见:[Doctor](/gateway/doctor)
迁移配置、审计私信策略,并检查 Gateway 网关健康状态。详情请参阅:[Doctor](/zh-CN/gateway/doctor)
### 重启 Gateway 网关
@ -122,7 +121,7 @@ openclaw doctor
openclaw gateway restart
```
提示:`npm view openclaw version` 会显示当前已发布版本。
提示:`npm view openclaw version` 会显示当前已发布版本。
### 固定提交(源码)
@ -133,16 +132,17 @@ pnpm install && pnpm build
openclaw gateway restart
```
如需恢复到最新版本:`git checkout main && git pull`。
返回最新版本:`git checkout main && git pull`。
## 如果你卡住了
- 再次运行 `openclaw doctor`,并仔细阅读输出。
- 查看:[故障排除](/gateway/troubleshooting)
- 再次运行 `openclaw doctor`,并仔细阅读输出内容。
- 对于源码检出的 `openclaw update --channel dev`,更新器会在需要时自动引导安装 `pnpm`。如果你看到 pnpm/corepack 引导错误,请手动安装 `pnpm`(或重新启用 `corepack`),然后重新运行更新。
- 查看:[故障排除](/zh-CN/gateway/troubleshooting)
- 在 Discord 中提问:[https://discord.gg/clawd](https://discord.gg/clawd)
## 相关内容
- [安装总览](/install) — 所有安装方式
- [Doctor](/gateway/doctor) — 更新后的健康检查
- [迁移](/install/migrating) — 主版本迁移指南
- [安装概览](/zh-CN/install) — 所有安装方式
- [Doctor](/zh-CN/gateway/doctor) — 更新后的健康检查
- [迁移](/zh-CN/install/migrating) — 主版本迁移指南

View File

@ -1,52 +1,62 @@
---
read_when:
- 你想将 Bedrock Mantle 托管的 OSS 模型与 OpenClaw 一起使用
- 你需要用于 GPT-OSS、Qwen、Kimi 或 GLM 的 Mantle OpenAI 兼容端点
summary: 使用 Amazon Bedrock Mantle兼容 OpenAI模型与 OpenClaw
- 你想在 OpenClaw 中使用由 Bedrock Mantle 托管的 OSS 模型
- 你需要用于 GPT-OSS、Qwen、Kimi 或 GLM 的 Mantle OpenAI 兼容端点
summary: 使用 Amazon Bedrock Mantle兼容 OpenAI模型与 OpenClaw 配合
title: Amazon Bedrock Mantle
x-i18n:
generated_at: "2026-04-05T12:34:00Z"
generated_at: "2026-04-06T00:47:10Z"
model: gpt-5.4
provider: openai
source_hash: 2efe61261fbb430f63be9f5025c0654c44b191dbe96b3eb081d7ccbe78458907
source_hash: 4e5b33ede4067fb7de02a046f3e375cbd2af4bf68e7751c8dd687447f1a78c86
source_path: providers/bedrock-mantle.md
workflow: 15
---
# Amazon Bedrock Mantle
OpenClaw 内置了一个 **Amazon Bedrock Mantle** 提供商,可连接到 Mantle 的 OpenAI 兼容端点。Mantle 通过由 Bedrock 基础设施支持的标准 `/v1/chat/completions` 接口托管开源和第三方模型GPT-OSS、Qwen、Kimi、GLM 等类似模型)。
OpenClaw 内置了一个 **Amazon Bedrock Mantle** 提供商,可连接到 Mantle 的 OpenAI 兼容端点。Mantle 通过由 Bedrock 基础设施支持的标准 `/v1/chat/completions` 接口提供开源和第三方模型GPT-OSS、Qwen、Kimi、GLM 及类似模型)。
## OpenClaw 支持的内容
- 提供商:`amazon-bedrock-mantle`
- API`openai-completions`(兼容 OpenAI
- 认证:通过 `AWS_BEARER_TOKEN_BEDROCK` 提供 bearer token
- 认证:显式 `AWS_BEARER_TOKEN_BEDROCK` 或通过 IAM 凭证链生成 bearer token
- 区域:`AWS_REGION` 或 `AWS_DEFAULT_REGION`(默认:`us-east-1`
## 自动模型发现
设置 `AWS_BEARER_TOKEN_BEDROCK`OpenClaw 会通过查询该区域的 `/v1/models` 端点自动发现可用的 Mantle 模型。发现结果会缓存 1 小时。
设置 `AWS_BEARER_TOKEN_BEDROCK`OpenClaw 会直接使用它。否则OpenClaw 会尝试通过 AWS 默认凭证链生成 Mantle bearer token其中包括共享凭证 / 配置 profile、SSO、web identity以及实例或任务角色。然后它会通过查询该区域的 `/v1/models` 端点发现可用的 Mantle 模型。发现结果会缓存 1 小时,而基于 IAM 派生的 bearer token 会每小时刷新一次
支持的区域:`us-east-1`、`us-east-2`、`us-west-2`、`ap-northeast-1`、`ap-south-1`、`ap-southeast-3`、`eu-central-1`、`eu-west-1`、`eu-west-2`、`eu-south-1`、`eu-north-1`、`sa-east-1`。
## 新手引导
1. 在 **gateway host** 上设置 bearer token
1. 在 **gateway host** 上选择一种认证方式:
显式 bearer token
```bash
export AWS_BEARER_TOKEN_BEDROCK="..."
# 可选(默认使用 us-east-1
# 可选(默认 us-east-1
export AWS_REGION="us-west-2"
```
2. 验证是否已发现模型:
IAM 凭证:
```bash
# 这里可使用任何兼容 AWS SDK 的认证来源,例如:
export AWS_PROFILE="default"
export AWS_REGION="us-west-2"
```
2. 验证模型已被发现:
```bash
openclaw models list
```
发现的模型会显示在 `amazon-bedrock-mantle` 提供商下。除非你想覆盖默认值,否则不需要额外配置。
发现的模型会显示在 `amazon-bedrock-mantle` 提供商下。除非你想覆盖默认值,否则不需要额外配置。
## 手动配置
@ -78,9 +88,9 @@ openclaw models list
}
```
## 说明
## 注意事项
- Mantle 目前需要 bearer token。仅使用普通 IAM 凭证实例角色、SSO、访问密钥而不提供 token 是不够的。
- 当未设置 `AWS_BEARER_TOKEN_BEDROCK`OpenClaw 可以根据兼容 AWS SDK 的 IAM 凭证为你签发 Mantle bearer token。
- 这个 bearer token 与标准 [Amazon Bedrock](/zh-CN/providers/bedrock) 提供商使用的 `AWS_BEARER_TOKEN_BEDROCK` 相同。
- 是否支持推理会根据模型 ID 中是否包含诸如 `thinking`、`reasoner` 或 `gpt-oss-120b` 之类的模式来推断。
- 如果 Mantle 端点不可用或未返回任何模型,该提供商会被静默跳过
- 对 reasoning 的支持会根据模型 ID 中是否包含 `thinking`、`reasoner` 或 `gpt-oss-120b`模式来推断。
- 如果 Mantle 端点不可用或未返回任何模型,则会静默跳过该提供商

View File

@ -0,0 +1,206 @@
---
read_when:
- 你想在 OpenClaw 中使用本地 ComfyUI 工作流
- 你想使用 Comfy Cloud 进行图像、视频或音乐工作流
- 你需要内置 comfy 插件的配置键名
summary: OpenClaw 中 ComfyUI 工作流的图像、视频和音乐生成设置
title: ComfyUI
x-i18n:
generated_at: "2026-04-06T00:47:14Z"
model: gpt-5.4
provider: openai
source_hash: b15d826622787bfc5fec057007495145366c88e36100e7b4923ef581d801e2a3
source_path: providers/comfy.md
workflow: 15
---
# ComfyUI
OpenClaw 内置了 `comfy` 插件,用于运行由工作流驱动的 ComfyUI。
- 提供商:`comfy`
- 模型:`comfy/workflow`
- 共享接口:`image_generate`、`video_generate`
- 插件工具:`music_generate`
- 凭证:本地 ComfyUI 不需要Comfy Cloud 使用 `COMFY_API_KEY``COMFY_CLOUD_API_KEY`
- APIComfyUI `/prompt` / `/history` / `/view` 和 Comfy Cloud `/api/*`
## 支持内容
- 通过工作流 JSON 生成图像
- 使用 1 张上传的参考图像编辑图像
- 通过工作流 JSON 生成视频
- 使用 1 张上传的参考图像生成视频
- 通过内置的 `music_generate` 工具生成音乐或音频
- 从已配置的节点或所有匹配的输出节点下载输出内容
该内置插件由工作流驱动,因此 OpenClaw 不会尝试将通用的
`size`、`aspectRatio`、`resolution`、`durationSeconds` 或 TTS 风格的控制项
映射到你的工作流图中。
## 配置布局
Comfy 支持共享的顶层连接设置,以及按能力划分的工作流配置段:
```json5
{
models: {
providers: {
comfy: {
mode: "local",
baseUrl: "http://127.0.0.1:8188",
image: {
workflowPath: "./workflows/flux-api.json",
promptNodeId: "6",
outputNodeId: "9",
},
video: {
workflowPath: "./workflows/video-api.json",
promptNodeId: "12",
outputNodeId: "21",
},
music: {
workflowPath: "./workflows/music-api.json",
promptNodeId: "3",
outputNodeId: "18",
},
},
},
},
}
```
共享键名:
- `mode``local` 或 `cloud`
- `baseUrl`:本地模式默认是 `http://127.0.0.1:8188`,云模式默认是 `https://cloud.comfy.org`
- `apiKey`:可选的内联密钥,可替代环境变量
- `allowPrivateNetwork`:在云模式下允许使用私有网络 / 局域网 `baseUrl`
位于 `image`、`video` 或 `music` 下的各能力键名:
- `workflow``workflowPath`:必填
- `promptNodeId`:必填
- `promptInputName`:默认值为 `text`
- `outputNodeId`:可选
- `pollIntervalMs`:可选
- `timeoutMs`:可选
图像和视频配置段还支持:
- `inputImageNodeId`:当你传入参考图像时必填
- `inputImageInputName`:默认值为 `image`
## 向后兼容性
现有的顶层图像配置仍然可用:
```json5
{
models: {
providers: {
comfy: {
workflowPath: "./workflows/flux-api.json",
promptNodeId: "6",
outputNodeId: "9",
},
},
},
}
```
OpenClaw 会将这种旧版结构视为图像工作流配置。
## 图像工作流
设置默认图像模型:
```json5
{
agents: {
defaults: {
imageGenerationModel: {
primary: "comfy/workflow",
},
},
},
}
```
参考图像编辑示例:
```json5
{
models: {
providers: {
comfy: {
image: {
workflowPath: "./workflows/edit-api.json",
promptNodeId: "6",
inputImageNodeId: "7",
inputImageInputName: "image",
outputNodeId: "9",
},
},
},
},
}
```
## 视频工作流
设置默认视频模型:
```json5
{
agents: {
defaults: {
videoGenerationModel: {
primary: "comfy/workflow",
},
},
},
}
```
Comfy 视频工作流目前支持通过已配置的工作流图进行文生视频和图生视频。
OpenClaw 不会将输入视频传入 Comfy 工作流。
## 音乐工作流
该内置插件注册了一个 `music_generate` 工具,用于生成由工作流定义的音频
或音乐输出:
```text
/tool music_generate prompt="Warm ambient synth loop with soft tape texture"
```
使用 `music` 配置段指向你的音频工作流 JSON 和输出节点。
## Comfy Cloud
使用 `mode: "cloud"`,再配合以下任意一种方式:
- `COMFY_API_KEY`
- `COMFY_CLOUD_API_KEY`
- `models.providers.comfy.apiKey`
云模式仍然使用相同的 `image`、`video` 和 `music` 工作流配置段。
## 实时测试
该内置插件提供了可选启用的实时覆盖测试:
```bash
OPENCLAW_LIVE_TEST=1 COMFY_LIVE_TEST=1 pnpm test:live -- extensions/comfy/comfy.live.test.ts
```
如果未配置对应的 Comfy 工作流配置段,实时测试会跳过单独的图像、视频或音乐用例。
## 相关内容
- [图像生成](/zh-CN/tools/image-generation)
- [视频生成](/zh-CN/tools/video-generation)
- [音乐生成](/tools/music-generation)
- [提供商目录](/zh-CN/providers/index)
- [配置参考](/zh-CN/gateway/configuration-reference#agent-defaults)

View File

@ -1,14 +1,14 @@
---
read_when:
- 你想选择一个模型提供商
- 你需要快速了解支持的 LLM 后端
- 你需要快速了解支持的 LLM 后端
summary: OpenClaw 支持的模型提供商LLM
title: 提供商目录
x-i18n:
generated_at: "2026-04-05T23:52:13Z"
generated_at: "2026-04-06T00:47:08Z"
model: gpt-5.4
provider: openai
source_hash: 93aa6ecf3c6f34e01654e45140eaf57b76b371bc4a215c643418da543bb769f5
source_hash: 24b3f2b6edee49fbce7762a22ee03308ef9cd62c61de114b0ab5d61fb3919c26
source_path: providers/index.md
workflow: 15
---
@ -17,7 +17,7 @@ x-i18n:
OpenClaw 可以使用许多 LLM 提供商。选择一个提供商,完成身份验证,然后将默认模型设置为 `provider/model`
在找聊天渠道文档WhatsApp/Telegram/Discord/Slack/Mattermost插件/ 等)?请参阅 [渠道](/zh-CN/channels)。
在找聊天渠道文档WhatsApp/Telegram/Discord/Slack/Mattermost插件等)?请参阅 [Channels](/zh-CN/channels)。
## 快速开始
@ -32,11 +32,12 @@ OpenClaw 可以使用许多 LLM 提供商。选择一个提供商,完成身份
## 提供商文档
- [阿里巴巴 Model Studio](/zh-CN/providers/alibaba)
- [Alibaba Model Studio](/zh-CN/providers/alibaba)
- [Amazon Bedrock](/zh-CN/providers/bedrock)
- [AnthropicAPI + Claude CLI](/zh-CN/providers/anthropic)
- [BytePlus国际版](/zh-CN/concepts/model-providers#byteplus-international)
- [Chutes](/zh-CN/providers/chutes)
- [ComfyUI](/providers/comfy)
- [Cloudflare AI Gateway](/zh-CN/providers/cloudflare-ai-gateway)
- [DeepSeek](/zh-CN/providers/deepseek)
- [fal](/zh-CN/providers/fal)
@ -45,7 +46,7 @@ OpenClaw 可以使用许多 LLM 提供商。选择一个提供商,完成身份
- [GLM 模型](/zh-CN/providers/glm)
- [GoogleGemini](/zh-CN/providers/google)
- [GroqLPU 推理)](/zh-CN/providers/groq)
- [Hugging FaceInference](/zh-CN/providers/huggingface)
- [Hugging Face推理](/zh-CN/providers/huggingface)
- [Kilocode](/zh-CN/providers/kilocode)
- [LiteLLM统一 Gateway 网关)](/zh-CN/providers/litellm)
- [MiniMax](/zh-CN/providers/minimax)
@ -57,10 +58,10 @@ OpenClaw 可以使用许多 LLM 提供商。选择一个提供商,完成身份
- [OpenCode](/zh-CN/providers/opencode)
- [OpenCode Go](/zh-CN/providers/opencode-go)
- [OpenRouter](/zh-CN/providers/openrouter)
- [Perplexity搜索)](/zh-CN/providers/perplexity-provider)
- [Perplexity搜索)](/zh-CN/providers/perplexity-provider)
- [Qianfan](/zh-CN/providers/qianfan)
- [Qwen Cloud](/zh-CN/providers/qwen)
- [Runway](/providers/runway)
- [Runway](/zh-CN/providers/runway)
- [SGLang本地模型](/zh-CN/providers/sglang)
- [StepFun](/zh-CN/providers/stepfun)
- [Synthetic](/zh-CN/providers/synthetic)
@ -77,6 +78,7 @@ OpenClaw 可以使用许多 LLM 提供商。选择一个提供商,完成身份
- [其他内置变体](/zh-CN/providers/models#additional-bundled-provider-variants) - Anthropic Vertex、Copilot Proxy 和 Gemini CLI OAuth
- [图像生成](/zh-CN/tools/image-generation) - 共享的 `image_generate` 工具、提供商选择和故障切换
- [音乐生成](/tools/music-generation) - 插件提供的 `music_generate` 工具界面
- [视频生成](/zh-CN/tools/video-generation) - 共享的 `video_generate` 工具、提供商选择和故障切换
## 转录提供商
@ -85,6 +87,6 @@ OpenClaw 可以使用许多 LLM 提供商。选择一个提供商,完成身份
## 社区工具
- [Claude Max API Proxy](/zh-CN/providers/claude-max-api-proxy) - 用于 Claude 订阅凭证的社区代理(使用前请确认 Anthropic 的政策/条款)
- [Claude Max API Proxy](/zh-CN/providers/claude-max-api-proxy) - 用于 Claude 订阅凭证的社区代理(使用前请核实 Anthropic 的政策/条款)
如需查看完整的提供商目录xAI、Groq、Mistral 等)和高级配置,请参阅 [模型提供商](/zh-CN/concepts/model-providers)。
有关完整的提供商目录xAI、Groq、Mistral 等)和高级配置,请参阅 [模型提供商](/zh-CN/concepts/model-providers)。

View File

@ -1,14 +1,14 @@
---
read_when:
- 你想选择一个模型提供商
- 你想查看用于 LLM 身份验证和模型选择的快速设置示例
- 你想查看用于 LLM 证和模型选择的快速设置示例
summary: OpenClaw 支持的模型提供商LLM
title: 模型提供商快速开始
x-i18n:
generated_at: "2026-04-06T00:19:36Z"
generated_at: "2026-04-06T00:47:10Z"
model: gpt-5.4
provider: openai
source_hash: 4836c7baa0a5af6b01c1369ebe2fdc6032d50d306dd10e2dbb778c6fce1384c4
source_hash: c0314fb1c754171e5fc252d30f7ba9bb6acdbb978d97e9249264d90351bac2e7
source_path: providers/models.md
workflow: 15
---
@ -30,11 +30,12 @@ OpenClaw 可以使用许多 LLM 提供商。选择一个,完成身份验证,
## 支持的提供商(入门集合)
- [Alibaba Model Studio](/zh-CN/providers/alibaba)
- [阿里巴巴 Model Studio](/zh-CN/providers/alibaba)
- [AnthropicAPI + Claude CLI](/zh-CN/providers/anthropic)
- [Amazon Bedrock](/zh-CN/providers/bedrock)
- [BytePlus国际版](/zh-CN/concepts/model-providers#byteplus-international)
- [Chutes](/zh-CN/providers/chutes)
- [ComfyUI](/providers/comfy)
- [Cloudflare AI Gateway](/zh-CN/providers/cloudflare-ai-gateway)
- [fal](/zh-CN/providers/fal)
- [Fireworks](/zh-CN/providers/fireworks)
@ -57,7 +58,7 @@ OpenClaw 可以使用许多 LLM 提供商。选择一个,完成身份验证,
## 其他内置提供商变体
- `anthropic-vertex` - 当 Vertex 凭证可用时,隐式支持 Google Vertex 上的 Anthropic无需单独的新手引导身份验证选项
- `anthropic-vertex` - 当 Vertex 凭证可用时,隐式支持 Google Vertex 上的 Anthropic没有单独的新手引导身份验证选项
- `copilot-proxy` - 本地 VS Code Copilot Proxy 桥接;使用 `openclaw onboard --auth-choice copilot-proxy`
查看完整的提供商目录xAI、Groq、Mistral 等)和高级配置,请参阅 [模型提供商](/zh-CN/concepts/model-providers)。
如需查看完整的提供商目录xAI、Groq、Mistral 等)和高级配置,请参阅 [模型提供商](/zh-CN/concepts/model-providers)。

View File

@ -1,53 +1,53 @@
---
read_when:
- 你想配置 memory 搜索提供商或嵌入模型
- 你想配置内存搜索提供商或嵌入模型
- 你想设置 QMD 后端
- 你想调整混合搜索、MMR 或时间衰减
- 你想启用多模态 memory 索引
summary: memory 搜索、嵌入提供商、QMD、混合搜索和多模态索引的所有配置项
title: memory 配置参考
- 你想启用多模态内存索引
summary: 内存搜索、嵌入提供商、QMD、混合搜索和多模态索引的所有配置项
title: 内存配置参考
x-i18n:
generated_at: "2026-04-06T00:34:05Z"
generated_at: "2026-04-06T00:47:57Z"
model: gpt-5.4
provider: openai
source_hash: d2be752f3b08441807224b4c33f4b63aea2de6deb43ac42db7e34f8e837b0240
source_hash: 0de0b85125443584f4e575cf673ca8d9bd12ecd849d73c537f4a17545afa93fd
source_path: reference/memory-config.md
workflow: 15
---
# memory 配置参考
# 内存配置参考
本页列出了 OpenClaw memory 搜索的所有配置项。有关概念性概览,请参见:
本页列出了 OpenClaw 内存搜索的所有配置项。概念性概览请参见:
- [Memory Overview](/zh-CN/concepts/memory) -- memory 的工作方式
- [Builtin Engine](/zh-CN/concepts/memory-builtin) -- 默认 SQLite 后端
- [QMD Engine](/zh-CN/concepts/memory-qmd) -- 本地优先 sidecar
- [Memory Search](/zh-CN/concepts/memory-search) -- 搜索流水线与调优
- [内存概览](/zh-CN/concepts/memory) -- 内存的工作方式
- [内置引擎](/zh-CN/concepts/memory-builtin) -- 默认 SQLite 后端
- [QMD 引擎](/zh-CN/concepts/memory-qmd) -- 本地优先 sidecar
- [内存搜索](/zh-CN/concepts/memory-search) -- 搜索流水线与调优
除非另有说明,所有 memory 搜索设置都位于 `openclaw.json` 中的
除非另有说明,所有内存搜索设置都位于 `openclaw.json` 中的
`agents.defaults.memorySearch` 下。
---
## 提供商选择
| 键名 | 类型 | 默认值 | 描述 |
| ---------- | --------- | ---------------- | ------------------------------------------------------------------------------------------- |
| `provider` | `string` | 自动检测 | 嵌入适配器 ID`openai`、`gemini`、`voyage`、`mistral`、`bedrock`、`ollama`、`local` |
| `model` | `string` | 提供商默认值 | 嵌入模型名称 |
| `fallback` | `string` | `"none"` | 当主提供商失败时使用的回退适配器 ID |
| `enabled` | `boolean` | `true` | 启用或禁用 memory 搜索 |
| 键 | 类型 | 默认值 | 说明 |
| ---------- | --------- | ---------------- | -------------------------------------------------------------------------------------- |
| `provider` | `string` | 自动检测 | 嵌入适配器 ID`openai`、`gemini`、`voyage`、`mistral`、`bedrock`、`ollama`、`local` |
| `model` | `string` | 提供商默认值 | 嵌入模型名称 |
| `fallback` | `string` | `"none"` | 主适配器失败时使用的回退适配器 ID |
| `enabled` | `boolean` | `true` | 启用或禁用内存搜索 |
### 自动检测顺序
当未设置 `provider`OpenClaw 会选择第一个可用项:
1. `local` -- 如果已配置 `memorySearch.local.modelPath` 且文件存在。
2. `openai` -- 如果可以解析 OpenAI 密钥。
3. `gemini` -- 如果可以解析 Gemini 密钥。
4. `voyage` -- 如果可以解析 Voyage 密钥。
5. `mistral` -- 如果可以解析 Mistral 密钥。
6. `bedrock` -- 如果 AWS SDK 凭证链可解析实例角色、访问密钥、profile、SSO、Web 身份或共享配置)。
2. `openai` -- 如果可以解析 OpenAI 密钥。
3. `gemini` -- 如果可以解析 Gemini 密钥。
4. `voyage` -- 如果可以解析 Voyage 密钥。
5. `mistral` -- 如果可以解析 Mistral 密钥。
6. `bedrock` -- 如果 AWS SDK 凭证链可以解析成功实例角色、访问密钥、profile、SSO、web identity 或共享配置)。
支持 `ollama`,但不会自动检测(请显式设置)。
@ -56,14 +56,14 @@ x-i18n:
远程嵌入需要 API 密钥。Bedrock 则改用 AWS SDK 默认凭证链
实例角色、SSO、访问密钥
| 提供商 | 环境变量 | 配置键 |
| -------- | ------------------------------ | --------------------------------- |
| OpenAI | `OPENAI_API_KEY` | `models.providers.openai.apiKey` |
| Gemini | `GEMINI_API_KEY` | `models.providers.google.apiKey` |
| Voyage | `VOYAGE_API_KEY` | `models.providers.voyage.apiKey` |
| Mistral | `MISTRAL_API_KEY` | `models.providers.mistral.apiKey` |
| Bedrock | AWS 凭证链 | 无需 API 密钥 |
| Ollama | `OLLAMA_API_KEY`(占位符) | -- |
| 提供商 | 环境变量 | 配置键 |
| ------ | ------------------------------ | --------------------------------- |
| OpenAI | `OPENAI_API_KEY` | `models.providers.openai.apiKey` |
| Gemini | `GEMINI_API_KEY` | `models.providers.google.apiKey` |
| Voyage | `VOYAGE_API_KEY` | `models.providers.voyage.apiKey` |
| Mistral | `MISTRAL_API_KEY` | `models.providers.mistral.apiKey` |
| Bedrock | AWS 凭证链 | 不需要 API 密钥 |
| Ollama | `OLLAMA_API_KEY`(占位符) | -- |
Codex OAuth 仅覆盖 chat/completions不满足嵌入请求。
@ -73,10 +73,10 @@ Codex OAuth 仅覆盖 chat/completions不满足嵌入请求。
用于自定义兼容 OpenAI 的端点或覆盖提供商默认值:
| 键名 | 类型 | 描述 |
| ---------------- | -------- | -------------------------------------------------- |
| `remote.baseUrl` | `string` | 自定义 API 基础 URL |
| `remote.apiKey` | `string` | 覆盖 API 密钥 |
| 键 | 类型 | 说明 |
| ---------------- | -------- | ------------------------------------ |
| `remote.baseUrl` | `string` | 自定义 API 基础 URL |
| `remote.apiKey` | `string` | 覆盖 API 密钥 |
| `remote.headers` | `object` | 额外的 HTTP 标头(与提供商默认值合并) |
```json5
@ -98,23 +98,23 @@ Codex OAuth 仅覆盖 chat/completions不满足嵌入请求。
---
## Gemini 专配置
## Gemini 专配置
| 键名 | 类型 | 默认值 | 描述 |
| 键 | 类型 | 默认值 | 说明 |
| ---------------------- | -------- | ---------------------- | ------------------------------------------ |
| `model` | `string` | `gemini-embedding-001` | 也支持 `gemini-embedding-2-preview` |
| `outputDimensionality` | `number` | `3072` | 对于 Embedding 2768、1536 或 3072 |
| `model` | `string` | `gemini-embedding-001` | 也支持 `gemini-embedding-2-preview` |
| `outputDimensionality` | `number` | `3072` | 对于 Embedding 2可为 768、1536 或 3072 |
<Warning>
更改模型或 `outputDimensionality` 会触发自动全量重索引。
更改模型或 `outputDimensionality` 会触发自动全量重索引。
</Warning>
---
## Bedrock 嵌入配置
Bedrock 使用 AWS SDK 默认凭证链 -- 无需 API 密钥。
如果 OpenClaw 运行在具有 Bedrock 启用实例角色的 EC2 上,只需设置
Bedrock 使用 AWS SDK 默认凭证链 -- 不需要 API 密钥。
如果 OpenClaw 运行在启用了 Bedrock 实例角色的 EC2 上,只需设置
提供商和模型:
```json5
@ -130,43 +130,43 @@ Bedrock 使用 AWS SDK 默认凭证链 -- 无需 API 密钥。
}
```
| 键名 | 类型 | 默认值 | 描述 |
| ---------------------- | -------- | ------------------------------ | ------------------------------- |
| `model` | `string` | `amazon.titan-embed-text-v2:0` | 任意 Bedrock 嵌入模型 ID |
| `outputDimensionality` | `number` | 模型默认值 | 对于 Titan V2256、512 或 1024 |
| 键 | 类型 | 默认值 | 说明 |
| ---------------------- | -------- | ------------------------------ | --------------------------- |
| `model` | `string` | `amazon.titan-embed-text-v2:0` | 任意 Bedrock 嵌入模型 ID |
| `outputDimensionality` | `number` | 模型默认值 | 对于 Titan V2256、512 或 1024 |
### 支持的模型
支持以下模型(带系列检测和维度默认值
支持以下模型(带系列检测和默认维度):
| 模型 ID | 提供商 | 默认维度 | 可配置维度 |
| ------------------------------------------ | ---------- | ------------ | -------------------- |
| `amazon.titan-embed-text-v2:0` | Amazon | 1024 | 256、512、1024 |
| `amazon.titan-embed-text-v1` | Amazon | 1536 | -- |
| `amazon.titan-embed-g1-text-02` | Amazon | 1536 | -- |
| `amazon.titan-embed-image-v1` | Amazon | 1024 | -- |
| `amazon.nova-2-multimodal-embeddings-v1:0` | Amazon | 1024 | 256、384、1024、3072 |
| `cohere.embed-english-v3` | Cohere | 1024 | -- |
| `cohere.embed-multilingual-v3` | Cohere | 1024 | -- |
| `cohere.embed-v4:0` | Cohere | 1536 | 256-1536 |
| `twelvelabs.marengo-embed-3-0-v1:0` | TwelveLabs | 512 | -- |
| `twelvelabs.marengo-embed-2-7-v1:0` | TwelveLabs | 1024 | -- |
| 模型 ID | 提供商 | 默认维度 | 可配置维度 |
| ------------------------------------------ | ---------- | -------- | -------------------- |
| `amazon.titan-embed-text-v2:0` | Amazon | 1024 | 256、512、1024 |
| `amazon.titan-embed-text-v1` | Amazon | 1536 | -- |
| `amazon.titan-embed-g1-text-02` | Amazon | 1536 | -- |
| `amazon.titan-embed-image-v1` | Amazon | 1024 | -- |
| `amazon.nova-2-multimodal-embeddings-v1:0` | Amazon | 1024 | 256、384、1024、3072 |
| `cohere.embed-english-v3` | Cohere | 1024 | -- |
| `cohere.embed-multilingual-v3` | Cohere | 1024 | -- |
| `cohere.embed-v4:0` | Cohere | 1536 | 256-1536 |
| `twelvelabs.marengo-embed-3-0-v1:0` | TwelveLabs | 512 | -- |
| `twelvelabs.marengo-embed-2-7-v1:0` | TwelveLabs | 1024 | -- |
带吞吐后缀的变体(例如 `amazon.titan-embed-text-v1:2:8k`)会继承
带吞吐后缀的变体(例如 `amazon.titan-embed-text-v1:2:8k`)会继承
基础模型的配置。
### 身份验证
Bedrock 证使用标准 AWS SDK 凭证解析顺序:
Bedrock 身份验证使用标准 AWS SDK 凭证解析顺序:
1. 环境变量(`AWS_ACCESS_KEY_ID` + `AWS_SECRET_ACCESS_KEY`
2. SSO 令牌缓存
3. Web 身份令牌凭证
3. Web identity 令牌凭证
4. 共享凭证和配置文件
5. ECS 或 EC2 元数据凭证
区域从 `AWS_REGION`、`AWS_DEFAULT_REGION`、
`amazon-bedrock` 提供商的 `baseUrl` 中解析,或默认使用 `us-east-1`
区域从 `AWS_REGION`、`AWS_DEFAULT_REGION`、`amazon-bedrock`
提供商的 `baseUrl` 中解析,或默认使用 `us-east-1`
### IAM 权限
@ -190,10 +190,10 @@ arn:aws:bedrock:*::foundation-model/amazon.titan-embed-text-v2:0
## 本地嵌入配置
| 键名 | 类型 | 默认值 | 描述 |
| --------------------- | -------- | ---------------------- | ------------------------------- |
| `local.modelPath` | `string` | 自动下载 | GGUF 模型文件路径 |
| `local.modelCacheDir` | `string` | node-llama-cpp 默认值 | 已下载模型的缓存目录 |
| 键 | 类型 | 默认值 | 说明 |
| --------------------- | -------- | ---------------------- | ------------------------ |
| `local.modelPath` | `string` | 自动下载 | GGUF 模型文件路径 |
| `local.modelCacheDir` | `string` | node-llama-cpp 默认值 | 已下载模型的缓存目录 |
默认模型:`embeddinggemma-300m-qat-Q8_0.gguf`(约 0.6 GB自动下载
需要原生构建:`pnpm approve-builds`,然后执行 `pnpm rebuild node-llama-cpp`
@ -202,28 +202,28 @@ arn:aws:bedrock:*::foundation-model/amazon.titan-embed-text-v2:0
## 混合搜索配置
位于 `memorySearch.query.hybrid` 下:
全部位于 `memorySearch.query.hybrid` 下:
| 键名 | 类型 | 默认值 | 描述 |
| 键 | 类型 | 默认值 | 说明 |
| --------------------- | --------- | ------- | ---------------------------------- |
| `enabled` | `boolean` | `true` | 启用混合 BM25 + 向量搜索 |
| `vectorWeight` | `number` | `0.7` | 向量分数权重0-1 |
| `textWeight` | `number` | `0.3` | BM25 分数权重0-1 |
| `candidateMultiplier` | `number` | `4` | 候选池大小乘数 |
| `enabled` | `boolean` | `true` | 启用 BM25 + 向量混合搜索 |
| `vectorWeight` | `number` | `0.7` | 向量分数权重0-1 |
| `textWeight` | `number` | `0.3` | BM25 分数权重0-1 |
| `candidateMultiplier` | `number` | `4` | 候选池大小乘数 |
### MMR多样性
| 键名 | 类型 | 默认值 | 描述 |
| 键 | 类型 | 默认值 | 说明 |
| ------------- | --------- | ------- | ------------------------------------ |
| `mmr.enabled` | `boolean` | `false` | 启用 MMR 重排序 |
| `mmr.lambda` | `number` | `0.7` | 0 = 最大多样性1 = 最大相关性 |
| `mmr.enabled` | `boolean` | `false` | 启用 MMR 重排序 |
| `mmr.lambda` | `number` | `0.7` | 0 = 最大多样性1 = 最大相关性 |
### 时间衰减(时效性)
### 时间衰减(新近性)
| 键名 | 类型 | 默认值 | 描述 |
| 键 | 类型 | 默认值 | 说明 |
| ---------------------------- | --------- | ------- | ------------------------- |
| `temporalDecay.enabled` | `boolean` | `false` | 启用时效性加权 |
| `temporalDecay.halfLifeDays` | `number` | `30` | 分数每 N 天减半 |
| `temporalDecay.enabled` | `boolean` | `false` | 启用新近性加权 |
| `temporalDecay.halfLifeDays` | `number` | `30` | 分数每 N 天减半 |
常青文件(`MEMORY.md`、`memory/` 中无日期的文件)永不衰减。
@ -250,11 +250,11 @@ arn:aws:bedrock:*::foundation-model/amazon.titan-embed-text-v2:0
---
## 其他 memory 路径
## 额外内存路径
| 键名 | 类型 | 描述 |
| ------------ | ---------- | ---------------------------------------- |
| `extraPaths` | `string[]` | 要索引的其他目录或文件 |
| 键 | 类型 | 说明 |
| ------------ | ---------- | -------------------------------------- |
| `extraPaths` | `string[]` | 要建立索引的额外目录或文件 |
```json5
{
@ -269,31 +269,31 @@ arn:aws:bedrock:*::foundation-model/amazon.titan-embed-text-v2:0
```
路径可以是绝对路径或相对于工作区的路径。目录会被递归扫描,
查找 `.md` 文件。符号链接处理取决于当前后端:
查找 `.md` 文件。符号链接处理取决于当前后端:
内置引擎会忽略符号链接,而 QMD 会遵循底层 QMD
扫描器的行为。
对于按智能体作用域划分的跨智能体 transcript 搜索,请使用
对于按智能体作用域进行的跨智能体转录搜索,请使用
`agents.list[].memorySearch.qmd.extraCollections`,而不是 `memory.qmd.paths`
这些额外 collection 使用相同的 `{ path, name, pattern? }` 结构,但
会按智能体进行合并,并且当路径指向当前工作区之外时,可以保留显式共享名称。
如果同一个解析路径同时出现在 `memory.qmd.paths`
`memorySearch.qmd.extraCollections`QMD 会保留第一并跳过
这些额外集合遵循相同的 `{ path, name, pattern? }` 结构,但会按智能体合并,
并且当路径指向当前工作区之外时,可以保留显式共享名称。
如果同一个解析后的路径同时出现在 `memory.qmd.paths`
`memorySearch.qmd.extraCollections`QMD 会保留第一条条目并跳过
重复项。
---
## 多模态 memoryGemini
## 多模态内存Gemini
使用 Gemini Embedding 2 将图像和音频与 Markdown 一起建立索引:
| 键名 | 类型 | 默认值 | 描述 |
| 键 | 类型 | 默认值 | 说明 |
| ------------------------- | ---------- | ---------- | -------------------------------------- |
| `multimodal.enabled` | `boolean` | `false` | 启用多模态索引 |
| `multimodal.modalities` | `string[]` | -- | `["image"]`、`["audio"]` 或 `["all"]` |
| `multimodal.maxFileBytes` | `number` | `10000000` | 用于索引的最大文件大小 |
| `multimodal.enabled` | `boolean` | `false` | 启用多模态索引 |
| `multimodal.modalities` | `string[]` | -- | `["image"]`、`["audio"]` 或 `["all"]` |
| `multimodal.maxFileBytes` | `number` | `10000000` | 建立索引的最大文件大小 |
仅适用于 `extraPaths` 中的文件。默认 memory 根目录仍仅支持 Markdown。
仅适用于 `extraPaths` 中的文件。默认内存根目录仍然只处理 Markdown。
需要 `gemini-embedding-2-preview`。`fallback` 必须为 `"none"`
支持的格式:`.jpg`、`.jpeg`、`.png`、`.webp`、`.gif`、`.heic`、`.heif`
@ -303,65 +303,63 @@ arn:aws:bedrock:*::foundation-model/amazon.titan-embed-text-v2:0
## 嵌入缓存
| 键名 | 类型 | 默认值 | 描述 |
| ------------------ | --------- | ------- | -------------------------------- |
| `cache.enabled` | `boolean` | `false` | 在 SQLite 中缓存 chunk 嵌入 |
| `cache.maxEntries` | `number` | `50000` | 最大缓存嵌入数量 |
| 键 | 类型 | 默认值 | 说明 |
| ------------------ | --------- | ------- | --------------------------------- |
| `cache.enabled` | `boolean` | `false` | 在 SQLite 中缓存分块嵌入 |
| `cache.maxEntries` | `number` | `50000` | 最大缓存嵌入条目数 |
可防止在重新索引或 transcript 更新期间对未更改文本重复嵌入。
可防止在重建索引或转录更新期间,对未更改文本重复生成嵌入。
---
## 批量索引
| 键名 | 类型 | 默认值 | 描述 |
| ----------------------------- | --------- | ------- | -------------------------- |
| `remote.batch.enabled` | `boolean` | `false` | 启用批量嵌入 API |
| `remote.batch.concurrency` | `number` | `2` | 并行批处理作业数 |
| `remote.batch.wait` | `boolean` | `true` | 等待批处理完成 |
| `remote.batch.pollIntervalMs` | `number` | -- | 轮询间隔 |
| `remote.batch.timeoutMinutes` | `number` | -- | 批处理超时 |
| 键 | 类型 | 默认值 | 说明 |
| ----------------------------- | --------- | ------- | ------------------------ |
| `remote.batch.enabled` | `boolean` | `false` | 启用批量嵌入 API |
| `remote.batch.concurrency` | `number` | `2` | 并行批处理任务数 |
| `remote.batch.wait` | `boolean` | `true` | 等待批处理完成 |
| `remote.batch.pollIntervalMs` | `number` | -- | 轮询间隔 |
| `remote.batch.timeoutMinutes` | `number` | -- | 批处理超时时间 |
适用于 `openai`、`gemini` 和 `voyage`。对于大型回填任务,OpenAI 批处理通常
最快且最便宜
适用于 `openai`、`gemini` 和 `voyage`。对于大型回填任务,
OpenAI 批处理通常最快且成本最低
---
## 会话 memory 搜索(实验性)
## 会话内存搜索(实验性)
索引会话 transcript,并通过 `memory_search` 提供结果:
为会话转录建立索引,并通过 `memory_search` 提供结果:
| 键名 | 类型 | 默认值 | 描述 |
| ----------------------------- | ---------- | ------------ | --------------------------------------- |
| `experimental.sessionMemory` | `boolean` | `false` | 启用会话索引 |
| `sources` | `string[]` | `["memory"]` | 添加 `"sessions"` 以包含 transcript |
| `sync.sessions.deltaBytes` | `number` | `100000` | 重新索引的字节阈值 |
| `sync.sessions.deltaMessages` | `number` | `50` | 重新索引的消息阈值 |
| 键 | 类型 | 默认值 | 说明 |
| ----------------------------- | ---------- | ------------- | -------------------------------------- |
| `experimental.sessionMemory` | `boolean` | `false` | 启用会话索引 |
| `sources` | `string[]` | `["memory"]` | 添加 `"sessions"` 以包含转录内容 |
| `sync.sessions.deltaBytes` | `number` | `100000` | 触发重建索引的字节阈值 |
| `sync.sessions.deltaMessages` | `number` | `50` | 触发重建索引的消息阈值 |
会话索引为选择启用,并且异步运行。结果可能会略有
滞后。会话日志存储在磁盘上,因此请将文件系统访问视为信任
边界。
会话索引采用选择加入方式,并异步运行。结果可能略有滞后。
会话日志存储在磁盘上,因此请将文件系统访问视为信任边界。
---
## SQLite 向量加速sqlite-vec
| 键名 | 类型 | 默认值 | 描述 |
| 键 | 类型 | 默认值 | 说明 |
| ---------------------------- | --------- | ------- | --------------------------------- |
| `store.vector.enabled` | `boolean` | `true` | 使用 sqlite-vec 执行向量查询 |
| `store.vector.extensionPath` | `string` | 内置 | 覆盖 sqlite-vec 路径 |
| `store.vector.enabled` | `boolean` | `true` | 使用 sqlite-vec 进行向量查询 |
| `store.vector.extensionPath` | `string` | 内置 | 覆盖 sqlite-vec 路径 |
当 sqlite-vec 不可用时OpenClaw 会自动回退到进程内余弦
相似度计算。
当 sqlite-vec 不可用时OpenClaw 会自动回退到进程内余弦相似度。
---
## 索引存储
| 键名 | 类型 | 默认值 | 描述 |
| --------------------- | -------- | ------------------------------------- | ------------------------------------------- |
| `store.path` | `string` | `~/.openclaw/memory/{agentId}.sqlite` | 索引位置(支持 `{agentId}` 令牌) |
| `store.fts.tokenizer` | `string` | `unicode61` | FTS5 分词器(`unicode61` 或 `trigram` |
| 键 | 类型 | 默认值 | 说明 |
| --------------------- | -------- | ------------------------------------- | ----------------------------------------- |
| `store.path` | `string` | `~/.openclaw/memory/{agentId}.sqlite` | 索引位置(支持 `{agentId}` 令牌) |
| `store.fts.tokenizer` | `string` | `unicode61` | FTS5 分词器(`unicode61` 或 `trigram` |
---
@ -370,42 +368,49 @@ arn:aws:bedrock:*::foundation-model/amazon.titan-embed-text-v2:0
设置 `memory.backend = "qmd"` 以启用。所有 QMD 设置都位于
`memory.qmd` 下:
| 键名 | 类型 | 默认值 | 描述 |
| 键 | 类型 | 默认值 | 说明 |
| ------------------------ | --------- | -------- | -------------------------------------------- |
| `command` | `string` | `qmd` | QMD 可执行文件路径 |
| `searchMode` | `string` | `search` | 搜索命令:`search`、`vsearch`、`query` |
| `includeDefaultMemory` | `boolean` | `true` | 自动索引 `MEMORY.md` + `memory/**/*.md` |
| `paths[]` | `array` | -- | 额外路径:`{ name, path, pattern? }` |
| `sessions.enabled` | `boolean` | `false` | 索引会话 transcript |
| `sessions.retentionDays` | `number` | -- | transcript 保留期 |
| `sessions.exportDir` | `string` | -- | 导出目录 |
| `command` | `string` | `qmd` | QMD 可执行文件路径 |
| `searchMode` | `string` | `search` | 搜索命令:`search`、`vsearch`、`query` |
| `includeDefaultMemory` | `boolean` | `true` | 自动索引 `MEMORY.md` + `memory/**/*.md` |
| `paths[]` | `array` | -- | 额外路径:`{ name, path, pattern? }` |
| `sessions.enabled` | `boolean` | `false` | 为会话转录建立索引 |
| `sessions.retentionDays` | `number` | -- | 转录保留时间 |
| `sessions.exportDir` | `string` | -- | 导出目录 |
OpenClaw 优先使用当前的 QMD 集合和 MCP 查询结构,但也会在需要时回退到旧版
QMD 发布版本支持的旧 `--mask` 集合标志和旧 MCP 工具名称,以保持兼容。
QMD 模型覆盖保留在 QMD 侧,而不是 OpenClaw 配置中。如果你需要全局覆盖
QMD 的模型,请在 Gateway 网关运行时环境中设置环境变量,例如
`QMD_EMBED_MODEL`、`QMD_RERANK_MODEL` 和 `QMD_GENERATE_MODEL`
### 更新计划
| 键名 | 类型 | 默认值 | 描述 |
| ------------------------- | --------- | ------- | ------------------------------------- |
| `update.interval` | `string` | `5m` | 刷新间隔 |
| `update.debounceMs` | `number` | `15000` | 文件变更防抖 |
| `update.onBoot` | `boolean` | `true` | 启动时刷新 |
| `update.waitForBootSync` | `boolean` | `false` | 在刷新完成前阻塞启动 |
| `update.embedInterval` | `string` | -- | 单独的嵌入执行周期 |
| `update.commandTimeoutMs` | `number` | -- | QMD 命令超时 |
| `update.updateTimeoutMs` | `number` | -- | QMD 更新操作超时 |
| `update.embedTimeoutMs` | `number` | -- | QMD 嵌入操作超时 |
| 键 | 类型 | 默认值 | 说明 |
| ------------------------- | --------- | -------- | ------------------------------------ |
| `update.interval` | `string` | `5m` | 刷新间隔 |
| `update.debounceMs` | `number` | `15000` | 文件变更防抖 |
| `update.onBoot` | `boolean` | `true` | 启动时刷新 |
| `update.waitForBootSync` | `boolean` | `false` | 阻止启动直到刷新完成 |
| `update.embedInterval` | `string` | -- | 单独的嵌入执行周期 |
| `update.commandTimeoutMs` | `number` | -- | QMD 命令超时时间 |
| `update.updateTimeoutMs` | `number` | -- | QMD 更新操作超时时间 |
| `update.embedTimeoutMs` | `number` | -- | QMD 嵌入操作超时时间 |
### 限制
| 键名 | 类型 | 默认值 | 描述 |
| ------------------------- | -------- | ------- | -------------------------- |
| `limits.maxResults` | `number` | `6` | 最大搜索结果数 |
| `limits.maxSnippetChars` | `number` | -- | 限制 snippet 长度 |
| `limits.maxInjectedChars` | `number` | -- | 限制注入的总字符数 |
| `limits.timeoutMs` | `number` | `4000` | 搜索超时 |
| 键 | 类型 | 默认值 | 说明 |
| ------------------------- | -------- | ------- | ------------------------ |
| `limits.maxResults` | `number` | `6` | 最大搜索结果数 |
| `limits.maxSnippetChars` | `number` | -- | 限制摘要长度 |
| `limits.maxInjectedChars` | `number` | -- | 限制注入的总字符数 |
| `limits.timeoutMs` | `number` | `4000` | 搜索超时时间 |
### 范围
控制哪些会话可以接收 QMD 搜索结果。使用
[`session.sendPolicy`](/zh-CN/gateway/configuration-reference#session) 相同的 schema
控制哪些会话可以接收 QMD 搜索结果。与
[`session.sendPolicy`](/zh-CN/gateway/configuration-reference#session) 使用相同的 schema
```json5
{
@ -427,11 +432,11 @@ arn:aws:bedrock:*::foundation-model/amazon.titan-embed-text-v2:0
`memory.citations` 适用于所有后端:
| 值 | 行为 |
| ---------------- | --------------------------------------------------- |
| `auto`(默认) | 在 snippet 中包含 `Source: <path#line>` 页脚 |
| `on` | 始终包含页脚 |
| `off` | 省略页脚(路径仍会在内部传递给智能体) |
| 值 | 行为 |
| ---------------- | ---------------------------------------------------- |
| `auto`(默认) | 在摘要中包含 `Source: <path#line>` 页脚 |
| `on` | 始终包含页脚 |
| `off` | 省略页脚(路径仍会在内部传递给智能体) |
### 完整 QMD 示例
@ -461,17 +466,17 @@ arn:aws:bedrock:*::foundation-model/amazon.titan-embed-text-v2:0
Dreaming 配置位于 `plugins.entries.memory-core.config.dreaming` 下,
而不在 `agents.defaults.memorySearch` 下。
Dreaming 以一次计划扫描的形式运行,并将内部的 light/deep/REM 阶段作为
实现细节。
Dreaming 作为一次计划任务扫描运行,并将内部的 light/deep/REM 阶段
作为实现细节使用
有关概念行为和斜杠命令,请参见 [Dreaming](/zh-CN/concepts/dreaming)。
### 用户设置
| 键名 | 类型 | 默认值 | 描述 |
| ----------- | --------- | ----------- | ------------------------------------------------- |
| `enabled` | `boolean` | `false` | 完全启用或禁用 Dreaming |
| `frequency` | `string` | `0 3 * * *` | 完整 Dreaming 扫描的可选 cron 周期 |
| 键 | 类型 | 默认值 | 说明 |
| ----------- | --------- | ----------- | ---------------------------------------------- |
| `enabled` | `boolean` | `false` | 完全启用或禁用 Dreaming |
| `frequency` | `string` | `0 3 * * *` | 整个 Dreaming 扫描的可选 cron 执行频率 |
### 示例
@ -492,8 +497,8 @@ Dreaming 以一次计划扫描的形式运行,并将内部的 light/deep/REM
}
```
说明
注意
- Dreaming 将机器状态写入 `memory/.dreams/`
- Dreaming 将人类可读的叙述输出写入 `DREAMS.md`(或现有的 `dreams.md`)。
- Dreaming 将机器状态写入 `memory/.dreams/`
- Dreaming 会将人类可读的叙事输出写入 `DREAMS.md`(或现有的 `dreams.md`)。
- light/deep/REM 阶段策略和阈值属于内部行为,不是面向用户的配置。

View File

@ -3,23 +3,23 @@ read_when:
- 通过智能体生成图像
- 配置图像生成提供商和模型
- 了解 `image_generate` 工具参数
summary: 使用已配置的提供商OpenAI、Google Gemini、fal、MiniMax生成和编辑图像
summary: 使用已配置的提供商OpenAI、Google Gemini、fal、MiniMax、ComfyUI)生成和编辑图像
title: 图像生成
x-i18n:
generated_at: "2026-04-05T23:19:12Z"
generated_at: "2026-04-06T00:47:29Z"
model: gpt-5.4
provider: openai
source_hash: 46afbcbfebe0b798422208d39dc4c97584985fe8c3f08b0ed9002a0a77c5eea5
source_hash: ab69a02eea97b1d77ddb2127f3db01c660401974c53fad79a7f4a5649b0efc1b
source_path: tools/image-generation.md
workflow: 15
---
# 图像生成
`image_generate` 工具让智能体能够使用你已配置的提供商创建和编辑图像。生成的图像会自动作为媒体附件包含在智能体的回复中
`image_generate` 工具允许智能体使用你已配置的提供商来创建和编辑图像。生成的图像会作为媒体附件自动随智能体的回复一并发送
<Note>
只有当至少有一个图像生成提供商可用时,该工具才会显示。如果你在智能体工具中看不到 `image_generate`,请配置 `agents.defaults.imageGenerationModel` 或设置提供商 API 密钥。
只有在至少有一个图像生成提供商可用时,此工具才会显示。如果你在智能体的工具中看不到 `image_generate`,请配置 `agents.defaults.imageGenerationModel` 或设置提供商 API 密钥。
</Note>
## 快速开始
@ -41,16 +41,17 @@ x-i18n:
3. 向智能体提问_“生成一张友好的龙虾吉祥物图像。”_
智能体会自动调用 `image_generate`无需配置工具允许列表——当提供商可用时,它默认启用。
智能体会自动调用 `image_generate`不需要工具白名单——只要有可用提供商,它默认启用。
## 支持的提供商
| 提供商 | 默认模型 | 编辑支持 | API 密钥 |
| ------ | -------------------------------- | ----------------------- | --------------------------------------------------------- |
| OpenAI | `gpt-image-1` | 是(最多 5 张图像) | `OPENAI_API_KEY` |
| Google | `gemini-3.1-flash-image-preview` | 是 | `GEMINI_API_KEY``GOOGLE_API_KEY` |
| fal | `fal-ai/flux/dev` | 是 | `FAL_KEY` |
| MiniMax| `image-01` | 是(主体参考) | `MINIMAX_API_KEY` 或 MiniMax OAuth`minimax-portal` |
| 提供商 | 默认模型 | 编辑支持 | API 密钥 |
| -------- | -------------------------------- | ---------------------------------- | ----------------------------------------------------- |
| OpenAI | `gpt-image-1` | 是(最多 5 张图像) | `OPENAI_API_KEY` |
| Google | `gemini-3.1-flash-image-preview` | 是 | `GEMINI_API_KEY``GOOGLE_API_KEY` |
| fal | `fal-ai/flux/dev` | 是 | `FAL_KEY` |
| MiniMax | `image-01` | 是(主体参考) | `MINIMAX_API_KEY` 或 MiniMax OAuth (`minimax-portal`) |
| ComfyUI | `workflow` | 是1 张图像,由工作流配置) | 云端使用 `COMFY_API_KEY``COMFY_CLOUD_API_KEY` |
使用 `action: "list"` 可在运行时查看可用的提供商和模型:
@ -60,20 +61,20 @@ x-i18n:
## 工具参数
| 参数 | 类型 | 说明 |
| 参数 | 类型 | 说明 |
| ------------- | -------- | ------------------------------------------------------------------------------------- |
| `prompt` | string | 图像生成提示词(`action: "generate"` 时必 |
| `prompt` | string | 图像生成提示词(`action: "generate"` 时必 |
| `action` | string | `"generate"`(默认)或 `"list"`,用于查看提供商 |
| `model` | string | 提供商/模型覆盖,例如 `openai/gpt-image-1` |
| `image` | string | 用于编辑模式的单张参考图像路径或 URL |
| `images` | string[] | 用于编辑模式的多张参考图像(最多 5 张) |
| `model` | string | 提供商/模型覆盖,例如 `openai/gpt-image-1` |
| `image` | string | 编辑模式下的单个参考图像路径或 URL |
| `images` | string[] | 编辑模式下的多个参考图像(最多 5 张) |
| `size` | string | 尺寸提示:`1024x1024`、`1536x1024`、`1024x1536`、`1024x1792`、`1792x1024` |
| `aspectRatio` | string | 宽高比:`1:1`、`2:3`、`3:2`、`3:4`、`4:3`、`4:5`、`5:4`、`9:16`、`16:9`、`21:9` |
| `aspectRatio` | string | 宽高比:`1:1`、`2:3`、`3:2`、`3:4`、`4:3`、`4:5`、`5:4`、`9:16`、`16:9`、`21:9` |
| `resolution` | string | 分辨率提示:`1K`、`2K` 或 `4K` |
| `count` | number | 要生成的图像数量14 |
| `filename` | string | 输出文件名提示 |
并非所有提供商都支持所有参数。工具会传递各提供商支持的参数,忽略其余参数,并在工具结果中报告被丢弃的覆盖项。
并非所有提供商都支持所有参数。工具会传递各提供商支持的参数,忽略其余参数,并在工具结果中报告被丢弃的覆盖项。
## 配置
@ -96,51 +97,52 @@ x-i18n:
生成图像时OpenClaw 会按以下顺序尝试提供商:
1. 工具调用中的 **`model` 参数**(如果智能体指定了
1. 工具调用中的 **`model` 参数**(如果智能体指定了该参数
2. 配置中的 **`imageGenerationModel.primary`**
3. 按顺序使用 **`imageGenerationModel.fallbacks`**
4. **自动检测** —— 仅使用有凭证支持的提供商默认值:
4. **自动检测** —— 仅使用基于认证的提供商默认值:
- 先使用当前默认提供商
- 再按 provider-id 顺序使用其余已注册的图像生成提供商
如果某个提供商失败(凭证错误、速率限制等),系统会自动尝试下一个候选项。如果全部失败,错误信息将包含每次尝试的详细信息。
如果某个提供商失败(凭证错误、速率限制等),系统会自动尝试下一个候选项。如果全部失败,错误中会包含每次尝试的详细信息。
注意:
- 自动检测会感知认证状态。只有当 OpenClaw 实际上能够认证某个提供商时,该提供商默认值才会进入候选列表。
- 自动检测会识别认证状态。只有当 OpenClaw 实际能够验证该提供商身份时,提供商默认值才会进入候选列表。
- 使用 `action: "list"` 可查看当前已注册的提供商、它们的默认模型以及认证环境变量提示。
### 图像编辑
OpenAI、Google、fal 和 MiniMax 支持编辑参考图像。传入参考图像路径或 URL
OpenAI、Google、fal、MiniMax 和 ComfyUI 支持编辑参考图像。传入参考图像路径或 URL
```
"Generate a watercolor version of this photo" + image: "/path/to/photo.jpg"
```
OpenAI 和 Google 通过 `images` 参数最多支持 5 张参考图像。fal 和 MiniMax 支持 1 张。
OpenAI 和 Google 通过 `images` 参数最多支持 5 张参考图像。fal、MiniMax 和 ComfyUI 支持 1 张。
MiniMax 图像生成功能可通过两种内置 MiniMax 认证路径使用:
MiniMax 图像生成可通过两种内置 MiniMax 认证路径使用:
- `minimax/image-01` 用于 API 密钥配置
- `minimax-portal/image-01` 用于 OAuth 配置
## 提供商能力
| 能力 | OpenAI | Google | fal | MiniMax |
| --------------------- | -------------------- | -------------------- | ------------------- | -------------------------- |
| 生成 | 是(最多 4 张) | 是(最多 4 张) | 是(最多 4 张) | 是(最多 9 张) |
| 编辑/参考 | 是(最多 5 张图像) | 是(最多 5 张图像) | 是1 张图像) | 是1 张图像,主体参考) |
| 尺寸控制 | 是 | 是 | 是 | 否 |
| 宽高比 | 否 | 是 | 是(仅生成) | 是 |
| 分辨率1K/2K/4K | 否 | 是 | 是 | 否 |
| 能力 | OpenAI | Google | fal | MiniMax | ComfyUI |
| --------------------- | -------------------- | -------------------- | ------------------- | -------------------------- | ---------------------------------- |
| 生成 | 是(最多 4 张) | 是(最多 4 张) | 是(最多 4 张) | 是(最多 9 张) | 是(由工作流定义输出) |
| 编辑/参考 | 是(最多 5 张图像) | 是(最多 5 张图像) | 是1 张图像) | 是1 张图像,主体参考) | 1 张图像,由工作流配置) |
| 尺寸控制 | 是 | 是 | 是 | 否 | 否 |
| 宽高比 | 否 | 是 | 是(仅生成) | 是 | 否 |
| 分辨率1K/2K/4K | 否 | 是 | 是 | 否 | 否 |
## 相关内容
- [工具概览](/zh-CN/tools) — 所有可用的智能体工具
- [fal](/zh-CN/providers/fal) — fal 图像和视频提供商设置
- [ComfyUI](/providers/comfy) — 本地 ComfyUI 和 Comfy Cloud 工作流设置
- [GoogleGemini](/zh-CN/providers/google) — Gemini 图像提供商设置
- [MiniMax](/zh-CN/providers/minimax) — MiniMax 图像提供商设置
- [OpenAI](/zh-CN/providers/openai) — OpenAI Images 提供商设置
- [配置参考](/zh-CN/gateway/configuration-reference#agent-defaults) — `imageGenerationModel` 配置
- [模型](/zh-CN/concepts/models) — 模型配置和故障切换
- [Models](/zh-CN/concepts/models) — 模型配置和故障切换

View File

@ -2,21 +2,21 @@
read_when:
- 你想了解 OpenClaw 提供了哪些工具
- 你需要配置、允许或拒绝工具
- 你正在决定应使用内置工具、Skills 还是插件
summary: OpenClaw 工具插件概览:智能体能做什么,以及如何扩展它
- 你正在内置工具、Skills 和插件之间做选择
summary: OpenClaw 工具插件概览:智能体能做什么,以及如何扩展它
title: 工具和插件
x-i18n:
generated_at: "2026-04-05T17:50:02Z"
generated_at: "2026-04-06T00:47:35Z"
model: gpt-5.4
provider: openai
source_hash: 0063994ccd7ab7c73590fe78eec2daf0eed0e73f8e63902e670c3cb7ce9eb9c7
source_hash: 28f287e3a137f10e8d78ad1124f1f234e32d3a079f5c8271f475f4a911d81ad7
source_path: tools/index.md
workflow: 15
---
# 工具和插件
智能体在生成文本之外所做的一切,都是通过**工具**完成的。
智能体执行的所有超出生成文本范围的操作,都是通过**工具**完成的。
工具让智能体能够读取文件、运行命令、浏览网页、发送消息,并与设备交互。
## 工具、Skills 和插件
@ -24,31 +24,28 @@ x-i18n:
OpenClaw 有三个协同工作的层级:
<Steps>
<Step title="工具是智能体实际调用的内容">
<Step title="工具是智能体调用的内容">
工具是智能体可以调用的类型化函数(例如 `exec`、`browser`、
`web_search`、`message`。OpenClaw 内置了一组**内置工具**
插件还可以注册额外工具。
`web_search`、`message`。OpenClaw 内置了一组**内置工具**,插件也可以注册额外工具。
对智能体而言,工具表现为发送给模型 API 的结构化函数定义。
对智能体来说,工具是发送到模型 API 的结构化函数定义。
</Step>
<Step title="Skills 教会智能体何时以及如何使用">
Skill 是注入系统提示词中的 markdown 文件(`SKILL.md`)。
Skills 为智能体提供上下文、约束和逐步指导,
帮助其高效使用工具。Skills 可以位于你的工作区、共享文件夹中,
或随插件一起提供。
Skills 是注入系统提示词中的 Markdown 文件(`SKILL.md`)。
Skills 为智能体提供上下文、约束以及高效使用工具的分步指导。Skills 可以位于你的工作区、共享文件夹中,或随插件一起提供。
[Skills 参考](/zh-CN/tools/skills) | [创建 Skills](/zh-CN/tools/creating-skills)
</Step>
<Step title="插件将一切打包在一起">
插件是一个包,可以注册任意组合的能力
插件是一种可注册任意能力组合的软件包
渠道、模型提供商、工具、Skills、语音、实时转录、
实时语音、媒体理解、图像生成、视频生成、
web fetch、web 搜索等等。一些插件是**核心插件**(随
OpenClaw 一起提供),另一些是**外部插件**(由社区发布到 npm
网页抓取、网页搜索等。有些插件是**核心**插件(随
OpenClaw 一起提供),另一些是**外部**插件(由社区发布到 npm
[安装和配置插件](/zh-CN/tools/plugin) | [构建你自己的插件](/zh-CN/plugins/building-plugins)
@ -59,61 +56,64 @@ OpenClaw 有三个协同工作的层级:
这些工具随 OpenClaw 一起提供,无需安装任何插件即可使用:
| 工具 | 作用 | 页面 |
| 工具 | 功能 | 页面 |
| ------------------------------------------ | --------------------------------------------------------------------- | ------------------------------------------- |
| `exec` / `process` | 运行 shell 命令,管理后台进程 | [Exec](/zh-CN/tools/exec) |
| `code_execution` | 运行沙箱隔离的远程 Python 分析 | [Code Execution](/zh-CN/tools/code-execution) |
| `browser` | 控制 Chromium 浏览器(导航、点击、截图) | [Browser](/zh-CN/tools/browser) |
| `web_search` / `x_search` / `web_fetch` | 搜索网页、搜索 X 帖子、抓取页面内容 | [Web](/zh-CN/tools/web) |
| `read` / `write` / `edit` | 在工作区中进行文件 I/O | |
| `apply_patch` | 多块文件补丁 | [Apply Patch](/zh-CN/tools/apply-patch) |
| `message` | 跨所有渠道发送消息 | [Agent Send](/zh-CN/tools/agent-send) |
| `canvas` | 驱动节点 Canvaspresent、eval、snapshot | |
| `nodes` | 发现并定位已配对设备 | |
| `cron` / `gateway` | 管理计划任务;检查、修补、重启或更新 Gateway 网关 | |
| `image` / `image_generate` | 分析或生成图像 | [Image Generation](/zh-CN/tools/image-generation) |
| `video_generate` | 生成视频 | [Video Generation](/tools/video-generation) |
| `tts` | 一次性文本转语音转换 | [TTS](/zh-CN/tools/tts) |
| `sessions_*` / `subagents` / `agents_list` | 会话管理、状态和子智能体编排 | [Sub-agents](/zh-CN/tools/subagents) |
| `session_status` | 轻量级 `/status` 风格回读和会话模型覆盖 | [Session Tools](/zh-CN/concepts/session-tool) |
| `exec` / `process` | 运行 shell 命令,管理后台进程 | [Exec](/zh-CN/tools/exec) |
| `code_execution` | 运行沙箱隔离的远程 Python 分析 | [Code Execution](/zh-CN/tools/code-execution) |
| `browser` | 控制 Chromium 浏览器(导航、点击、截图) | [Browser](/zh-CN/tools/browser) |
| `web_search` / `x_search` / `web_fetch` | 搜索网页、搜索 X 帖子、抓取页面内容 | [Web](/zh-CN/tools/web) |
| `read` / `write` / `edit` | 在工作区中执行文件 I/O | |
| `apply_patch` | 多段文件补丁 | [Apply Patch](/zh-CN/tools/apply-patch) |
| `message` | 跨所有渠道发送消息 | [Agent Send](/zh-CN/tools/agent-send) |
| `canvas` | 驱动节点 Canvaspresent、eval、snapshot | |
| `nodes` | 发现并定位已配对设备 | |
| `cron` / `gateway` | 管理定时任务;检查、修补、重启或更新 Gateway 网关 | |
| `image` / `image_generate` | 分析或生成图像 | [Image Generation](/zh-CN/tools/image-generation) |
| `video_generate` | 生成视频 | [Video Generation](/zh-CN/tools/video-generation) |
| `tts` | 一次性文本转语音转换 | [TTS](/zh-CN/tools/tts) |
| `sessions_*` / `subagents` / `agents_list` | 会话管理、状态和子智能体编排 | [Sub-agents](/zh-CN/tools/subagents) |
| `session_status` | 轻量级 `/status` 风格回读和会话模型覆盖 | [Session Tools](/zh-CN/concepts/session-tool) |
对于图像工作,使用 `image` 进行分析,使用 `image_generate` 进行生成或编辑。如果你要使用 `openai/*`、`google/*`、`fal/*` 或其他非默认图像提供商,请先配置该提供商的认证 / API 密钥。
对于图像任务,使用 `image` 进行分析,使用 `image_generate` 进行生成或编辑。如果你要使用 `openai/*`、`google/*`、`fal/*` 或其他非默认图像提供商,请先配置该提供商的身份验证/API 密钥。
对于视频工作,请使用 `video_generate`。如果你要使用 `qwen/*` 或其他非默认视频提供商,请先配置该提供商的认证 / API 密钥。
对于视频任务,使用 `video_generate`。如果你要使用 `qwen/*` 或其他非默认视频提供商,请先配置该提供商的身份验证/API 密钥。
`session_status` 是 sessions 分组中的轻量级状态 / 回读工具。
它可回答关于当前会话的 `/status` 风格问题,并且可以
可选地设置按会话生效的模型覆盖;`model=default` 会清除此覆盖。
`/status` 一样,它可以从最新转录用量条目中回填稀疏的 token / cache 计数以及当前活动的运行时模型标签。
对于由工作流驱动的音频生成,当 ComfyUI 之类的插件注册了 `music_generate` 时,请使用它。
这与 `tts` 不同,后者是文本转语音。
`session_status` 是 sessions 组中的轻量级状态/回读工具。
它用于回答当前会话的 `/status` 风格问题,并且
可以选择设置按会话生效的模型覆盖;`model=default` 会清除该
覆盖。和 `/status` 一样,它可以从最新的转录使用记录中
回填稀疏的 token/缓存计数器,以及当前运行时模型标签。
`gateway` 是仅限所有者使用的 Gateway 网关运行时工具,用于执行 Gateway 网关操作:
- `config.schema.lookup` 用于在编辑前查看单一路径范围内的配置子树
- `config.get` 用于获取当前配置快照 + hash
- `config.patch` 用于执行带重启的部分配置更新
- `config.apply` 仅用于完整配置替换
- `update.run` 用于显式自更新 + 重启
- `config.schema.lookup`:在编辑前查找一个按路径限定范围的配置子树
- `config.get`:获取当前配置快照 + 哈希
- `config.patch`执行带重启的部分配置更新
- `config.apply`:仅用于完整替换整个配置
- `update.run`:显式执行自更新 + 重启
对于部分更改,优先使用 `config.schema.lookup` 然后 `config.patch`。只有在你有意替换整个配置时才使用
`config.apply`
对于部分更改,优先使用 `config.schema.lookup` 然后使用 `config.patch`。只有在你有意替换整个配置时,才使用 `config.apply`
该工具还会拒绝更改 `tools.exec.ask``tools.exec.security`
旧版 `tools.bash.*` 别名会被标准化为相同的受保护 exec 路径。
旧版 `tools.bash.*` 别名会规范化到同样受保护的 exec 路径。
### 插件提供的工具
插件可以注册额外工具。一些示例:
- [Lobster](/zh-CN/tools/lobster) — 带可恢复审批的类型化工作流运行时
- [LLM Task](/zh-CN/tools/llm-task) — 仅 JSON 的 LLM 步骤,用于结构化输出
- [Diffs](/zh-CN/tools/diffs) — diff 查看器和渲染器
- [OpenProse](/zh-CN/prose) — markdown 优先的工作流编排
- [LLM Task](/zh-CN/tools/llm-task) — 仅输出 JSON 的 LLM 步骤,用于结构化输出
- [Music Generation](/tools/music-generation) — 插件提供的 `music_generate` 工具接口
- [Diffs](/zh-CN/tools/diffs) — 差异查看器和渲染器
- [OpenProse](/zh-CN/prose) — 以 Markdown 为优先的工作流编排
## 工具配置
### 允许列表和拒绝列表
通过配置中的 `tools.allow` / `tools.deny` 控制智能体可调用哪些工具。
拒绝始终优先于允许。
通过配置中的 `tools.allow` / `tools.deny` 控制智能体可以调用哪些工具。拒绝规则始终优先于允许规则。
```json5
{
@ -126,47 +126,46 @@ OpenClaw 有三个协同工作的层级:
### 工具配置文件
`tools.profile` 会在应用 `allow` / `deny` 之前设置基础允许列表。
每个智能体的覆盖字段为`agents.list[].tools.profile`。
`tools.profile` 会在应用 `allow`/`deny` 之前设置基础允许列表。
按智能体覆盖`agents.list[].tools.profile`。
| 配置文件 | 包含内容 |
| ----------- | ------------------------------------------------------------------------------------------------------------------------------- |
| `full` | 无限制(等同于未设置) |
| `coding` | `group:fs`, `group:runtime`, `group:web`, `group:sessions`, `group:memory`, `cron`, `image`, `image_generate`, `video_generate` |
| `full` | 不做限制(等同于未设置) |
| `coding` | `group:fs`, `group:runtime`, `group:web`, `group:sessions`, `group:memory`, `cron`, `image`, `image_generate`, `video_generate` |
| `messaging` | `group:messaging`, `sessions_list`, `sessions_history`, `sessions_send`, `session_status` |
| `minimal` | 仅 `session_status` |
| `minimal` | 仅 `session_status` |
### 工具分组
在允许 / 拒绝列表中使用 `group:*` 简写:
在允许/拒绝列表中使用 `group:*` 简写:
| 分组 | 工具 |
| ------------------ | --------------------------------------------------------------------------------------------------------- |
| `group:runtime` | exec、process、code_execution`bash` 可作为 `exec` 的别名使用) |
| `group:fs` | read、write、edit、apply_patch |
| `group:sessions` | sessions_list、sessions_history、sessions_send、sessions_spawn、sessions_yield、subagents、session_status |
| `group:memory` | memory_search、memory_get |
| `group:web` | web_search、x_search、web_fetch |
| `group:ui` | browser、canvas |
| `group:runtime` | exec、process、code_execution`bash` 可作为 `exec` 的别名使用) |
| `group:fs` | read、write、edit、apply_patch |
| `group:sessions` | sessions_list、sessions_history、sessions_send、sessions_spawn、sessions_yield、subagents、session_status |
| `group:memory` | memory_search、memory_get |
| `group:web` | web_search、x_search、web_fetch |
| `group:ui` | browser、canvas |
| `group:automation` | cron、gateway |
| `group:messaging` | message |
| `group:nodes` | nodes |
| `group:agents` | agents_list |
| `group:media` | image、image_generate、video_generate、tts |
| `group:openclaw` | 所有 OpenClaw 内置工具(不包括插件工具) |
| `group:messaging` | message |
| `group:nodes` | nodes |
| `group:agents` | agents_list |
| `group:media` | image、image_generate、video_generate、tts |
| `group:openclaw` | 所有 OpenClaw 内置工具(不包括插件工具) |
`sessions_history` 返回的是一个有界、经过安全过滤的回忆视图。它会从助手文本中剥离
thinking 标签、`<relevant-memories>` 脚手架、纯文本工具调用 XML
负载(包括 `<tool_call>...</tool_call>`
`sessions_history` 返回一个有边界、经过安全过滤的回忆视图。它会从 assistant 文本中剥离思维标签、`<relevant-memories>` 脚手架、纯文本工具调用 XML 载荷(包括 `<tool_call>...</tool_call>`
`<function_call>...</function_call>`、`<tool_calls>...</tool_calls>`、
`<function_calls>...</function_calls>` 以及被截断的工具调用块)、
降级的工具调用脚手架、泄露的 ASCII / 全角模型控制
token以及格式错误的 MiniMax 工具调用 XML然后再应用
脱敏 / 截断,并在必要时使用超大行占位符,而不是将其作为原始转录转储返回。
降级后的工具调用脚手架、泄露的 ASCII/全角模型控制 token
以及格式错误的 MiniMax 工具调用 XML然后再应用
脱敏/截断,并在需要时使用超大行占位符,而不是
直接充当原始转录转储。
### 提供商特定限制
### 提供商专属限制
使用 `tools.byProvider` 可针对特定提供商限制工具,而无需
使用 `tools.byProvider` 特定提供商限制工具,而无需
更改全局默认值:
```json5

View File

@ -0,0 +1,63 @@
---
read_when:
- 通过智能体生成音乐或音频
- 配置插件提供的音乐生成工具
- 了解 `music_generate` 工具参数
summary: 使用插件提供的工具(例如 ComfyUI 工作流)生成音乐或音频
title: 音乐生成
x-i18n:
generated_at: "2026-04-06T00:47:16Z"
model: gpt-5.4
provider: openai
source_hash: 625fe7cd03f88541104d21da12dc318344e8d82fd2ec0bf1f7c0fb817dd14c62
source_path: tools/music-generation.md
workflow: 15
---
# 音乐生成
当某个插件注册了音乐生成功能时,`music_generate` 工具允许智能体创建音频文件。
内置的 `comfy` 插件当前通过工作流配置的 ComfyUI 图提供 `music_generate`
## 快速开始
1. 使用工作流 JSON 以及提示词/输出节点配置 `models.providers.comfy.music`
2. 如果你使用 Comfy Cloud请设置 `COMFY_API_KEY``COMFY_CLOUD_API_KEY`
3. 让智能体生成音乐,或直接调用该工具。
示例:
```text
/tool music_generate prompt="Warm ambient synth loop with soft tape texture"
```
## 工具参数
| 参数 | 类型 | 描述 |
| ---------- | ------ | --------------------------------------------------- |
| `prompt` | string | 音乐或音频生成提示词 |
| `action` | string | `"generate"`(默认)或 `"list"` |
| `model` | string | 提供商/模型覆盖。当前为 `comfy/workflow` |
| `filename` | string | 已保存音频文件的输出文件名提示 |
## 当前提供商支持
| 提供商 | 模型 | 说明 |
| -------- | ---------- | ------------------------------- |
| ComfyUI | `workflow` | 由工作流定义的音乐或音频 |
## 实时测试
内置 ComfyUI 音乐路径的选择启用式实时覆盖:
```bash
OPENCLAW_LIVE_TEST=1 COMFY_LIVE_TEST=1 pnpm test:live -- extensions/comfy/comfy.live.test.ts
```
如果这些部分已完成配置,该实时文件还涵盖 comfy 图像和视频工作流。
## 相关内容
- [ComfyUI](/providers/comfy)
- [工具概览](/zh-CN/tools)

View File

@ -3,28 +3,28 @@ read_when:
- 通过智能体生成视频
- 配置视频生成提供商和模型
- 了解 `video_generate` 工具参数
summary: 使用 10 个提供商后端,从文本、图像或现有视频生成视频
summary: 通过 11 个提供商后端,使用文本、图像或现有视频生成视频
title: 视频生成
x-i18n:
generated_at: "2026-04-06T00:33:47Z"
generated_at: "2026-04-06T00:47:37Z"
model: gpt-5.4
provider: openai
source_hash: 62ed5a9d246f17507c5a6f3db07ecc2f86d1c4cf32f82796c287d298181c7931
source_hash: 4e47e867b30f7df1bab79d89f566fc17480aecfb58b8dbf95ae96aedd2bccddb
source_path: tools/video-generation.md
workflow: 15
---
# 视频生成
OpenClaw 智能体可以根据文本提示、参考图像或现有视频生成视频。支持 10 个提供商后端,每个后端都有不同的模型选项、输入模式和功能集。智能体会根据你的配置和可用的 API 密钥自动选择合适的提供商。
OpenClaw 智能体可以根据文本提示、参考图像或现有视频生成视频。支持 11 个提供商后端,每个后端都有不同的模型选项、输入模式和功能集。智能体会根据你的配置和可用的 API 密钥自动选择合适的提供商。
<Note>
仅当至少有一个视频生成提供商可用时,`video_generate` 工具才会出现。如果你没有在智能体工具中看到它,请设置提供商 API 密钥或配置 `agents.defaults.videoGenerationModel`
仅当至少有一个视频生成提供商可用时,`video_generate` 工具才会显示。如果你在智能体工具中看不到它,请设置提供商 API 密钥或配置 `agents.defaults.videoGenerationModel`
</Note>
## 快速开始
1. 为任意受支持的提供商设置 API 密钥:
1. 为任意受支持的提供商设置一个 API 密钥:
```bash
export GEMINI_API_KEY="your-key"
@ -38,39 +38,40 @@ openclaw config set agents.defaults.videoGenerationModel.primary "google/veo-3.1
3. 向智能体发出请求:
> 生成一个 5 秒钟的电影感视频,内容是一只友好的龙虾在日落时分冲浪
> 生成一段 5 秒钟、在日落时分一只友好龙虾冲浪的电影感视频
智能体会自动调用 `video_generate`。无需配置工具 allowlist。
智能体会自动调用 `video_generate`。无需将工具加入 allowlist。
## 生成视频时会发生什么
视频生成是异步的。当智能体在一个会话中调用 `video_generate` 时:
1. OpenClaw 将请求提交给提供商,并立即返回一个任务 ID。
2. 提供商在后台处理该任务(通常需要 30 秒到 5 分钟,具体取决于提供商和分辨率)。
3. 当视频准备就绪后OpenClaw 会通过内部完成事件唤醒同一个会话。
4. 智能体会将生成完成的视频发回原始对话中。
1. OpenClaw 将请求提交给提供商,并立即返回一个任务 ID。
2. 提供商在后台处理该任务(通常需要 30 秒到 5 分钟,具体取决于提供商和分辨率)。
3. 当视频准备完成后OpenClaw 会通过一个内部完成事件唤醒同一个会话。
4. 智能体会将生成完成的视频发回原始对话中。
当某个任务正在处理中时,在同一会话中重复调用 `video_generate` 会返回当前任务状态,而不会再次启动生成。使用 `openclaw tasks list``openclaw tasks show <taskId>` 可通过 CLI 查进度。
当某个任务正在进行中时,同一会话中的重复 `video_generate` 调用不会启动新的生成,而是返回当前任务状态。使用 `openclaw tasks list``openclaw tasks show <taskId>` 可通过 CLI 查进度。
非基于会话的智能体运行之外(例如直接调用工具),该工具会回退为内联生成,并在同一轮返回最终媒体路径。
不依赖会话的智能体运行之外(例如直接调用工具),该工具会回退为内联生成,并在同一轮返回最终媒体路径。
## 支持的提供商
| 提供商 | 默认模型 | 文本 | 图像参考 | 视频参考 | API 密钥 |
| -------- | ------------------------------- | ---- | ---------------- | ---------------- | --------------------- |
| Alibaba | `wan2.6-t2v` | 是 | 是(远程 URL | 是(远程 URL | `MODELSTUDIO_API_KEY` |
| BytePlus国际版 | `seedance-1-0-lite-t2v-250428` | 是 | 1 张图像 | 否 | `BYTEPLUS_API_KEY` |
| fal | `fal-ai/minimax/video-01-live` | 是 | 1 张图像 | 否 | `FAL_KEY` |
| Google | `veo-3.1-fast-generate-preview` | 是 | 1 张图像 | 1 个视频 | `GEMINI_API_KEY` |
| MiniMax | `MiniMax-Hailuo-2.3` | 是 | 1 张图像 | 否 | `MINIMAX_API_KEY` |
| OpenAI | `sora-2` | 是 | 1 张图像 | 1 个视频 | `OPENAI_API_KEY` |
| Qwen | `wan2.6-t2v` | 是 | 是(远程 URL | 是(远程 URL | `QWEN_API_KEY` |
| Runway | `gen4.5` | 是 | 1 张图像 | 1 个视频 | `RUNWAYML_API_SECRET` |
| Together | `Wan-AI/Wan2.2-T2V-A14B` | 是 | 1 张图像 | 否 | `TOGETHER_API_KEY` |
| xAI | `grok-imagine-video` | 是 | 1 张图像 | 1 个视频 | `XAI_API_KEY` |
| 提供商 | 默认模型 | 文本 | 图像参考 | 视频参考 | API 密钥 |
| -------- | ------------------------------- | ---- | ---------------- | ---------------- | ---------------------------------------- |
| Alibaba | `wan2.6-t2v` | 是 | 是(远程 URL | 是(远程 URL | `MODELSTUDIO_API_KEY` |
| BytePlus国际版 | `seedance-1-0-lite-t2v-250428` | 是 | 1 张图像 | 否 | `BYTEPLUS_API_KEY` |
| ComfyUI | `workflow` | 是 | 1 张图像 | 否 | `COMFY_API_KEY``COMFY_CLOUD_API_KEY` |
| fal | `fal-ai/minimax/video-01-live` | 是 | 1 张图像 | 否 | `FAL_KEY` |
| Google | `veo-3.1-fast-generate-preview` | 是 | 1 张图像 | 1 个视频 | `GEMINI_API_KEY` |
| MiniMax | `MiniMax-Hailuo-2.3` | 是 | 1 张图像 | 否 | `MINIMAX_API_KEY` |
| OpenAI | `sora-2` | 是 | 1 张图像 | 1 个视频 | `OPENAI_API_KEY` |
| Qwen | `wan2.6-t2v` | 是 | 是(远程 URL | 是(远程 URL | `QWEN_API_KEY` |
| Runway | `gen4.5` | 是 | 1 张图像 | 1 个视频 | `RUNWAYML_API_SECRET` |
| Together | `Wan-AI/Wan2.2-T2V-A14B` | 是 | 1 张图像 | 否 | `TOGETHER_API_KEY` |
| xAI | `grok-imagine-video` | 是 | 1 张图像 | 1 个视频 | `XAI_API_KEY` |
某些提供商接受额外或替代的 API 密钥环境变量。详情请参阅各自的[提供商页面](#related)。
某些提供商接受额外或替代的 API 密钥环境变量。详情请参阅各[提供商页面](#related)。
运行 `video_generate action=list` 可在运行时查看可用的提供商和模型。
@ -78,13 +79,13 @@ openclaw config set agents.defaults.videoGenerationModel.primary "google/veo-3.1
### 必填
| 参数 | 类型 | 描述 |
| 参数 | 类型 | 说明 |
| --------- | ------ | ----------------------------------------------------------------------------- |
| `prompt` | string | 要生成的视频的文本描述(`action: "generate"` 时必填) |
| `prompt` | string | 要生成的视频的文本描述(对于 `action: "generate"`必填) |
### 内容输入
| 参数 | 类型 | 描述 |
| 参数 | 类型 | 说明 |
| --------- | -------- | ------------------------------------ |
| `image` | string | 单个参考图像(路径或 URL |
| `images` | string[] | 多个参考图像(最多 5 个) |
@ -93,39 +94,39 @@ openclaw config set agents.defaults.videoGenerationModel.primary "google/veo-3.1
### 风格控制
| 参数 | 类型 | 描述 |
| 参数 | 类型 | 说明 |
| ----------------- | ------- | ------------------------------------------------------------------------ |
| `aspectRatio` | string | `1:1`、`2:3`、`3:2`、`3:4`、`4:3`、`4:5`、`5:4`、`9:16`、`16:9`、`21:9` |
| `resolution` | string | `480P`、`720P` 或 `1080P` |
| `durationSeconds` | number | 目标时长(秒)(会四舍五入到最接近的提供商支持值) |
| `durationSeconds` | number | 目标时长(秒四舍五入到最接近的提供商支持值) |
| `size` | string | 当提供商支持时使用的尺寸提示 |
| `audio` | boolean | 在支持时启用生成音频 |
| `watermark` | boolean | 在支持时切换提供商水印 |
### 高级参数
### 高级
| 参数 | 类型 | 描述 |
| 参数 | 类型 | 说明 |
| ---------- | ------ | ----------------------------------------------- |
| `action` | string | `"generate"`(默认)、`"status"` 或 `"list"` |
| `model` | string | 提供商/模型覆盖(例如 `runway/gen4.5` |
| `model` | string | 提供商 / 模型覆盖(例如 `runway/gen4.5` |
| `filename` | string | 输出文件名提示 |
并非所有提供商都支持所有参数。不受支持的覆盖项会尽力忽略,并在工具结果中报告为警告。硬性能力限制(例如参考输入过多)会在提交前直接失败。
并非所有提供商都支持全部参数。不受支持的覆盖参数会尽力忽略,并在工具结果中报告为警告。硬性能力限制(例如参考输入过多)会在提交前直接失败。
## 操作
- **generate**(默认)-- 根据给定提示和可选参考输入创建视频。
- **status** -- 检查当前会话中正在进行的视频任务状态,而不启动新任务。
- **status** -- 检查当前会话中正在进行的视频任务状态,而不启动新任务。
- **list** -- 显示可用的提供商、模型及其能力。
## 模型选择
生成视频时OpenClaw 会按以下顺序解析模型:
1. **`model` 工具参数** -- 如果智能体在调用中指定了该参数
1. **`model` 工具参数** -- 如果智能体在调用中指定了
2. **`videoGenerationModel.primary`** -- 来自配置。
3. **`videoGenerationModel.fallbacks`** -- 按顺序尝试。
4. **自动检测** -- 使用具有有效身份验证的提供商,先从当前默认提供商开始,然后按字母顺序尝试其余提供商。
4. **自动检测** -- 使用具有有效认证的提供商,从当前默认提供商开始,然后按字母顺序尝试其余提供商。
如果某个提供商失败,会自动尝试下一个候选项。如果所有候选项都失败,错误中会包含每次尝试的详细信息。
@ -146,16 +147,17 @@ openclaw config set agents.defaults.videoGenerationModel.primary "google/veo-3.1
| 提供商 | 说明 |
| -------- | ---------------------------------------------------------------------------------------------------------------------------------------- |
| Alibaba | 使用 DashScope/Model Studio 异步端点。参考图像和视频必须是远程 `http(s)` URL。 |
| Alibaba | 使用 DashScope / Model Studio 异步端点。参考图像和视频必须是远程 `http(s)` URL。 |
| BytePlus国际版 | 仅支持单张参考图像。 |
| ComfyUI | 由工作流驱动的本地或云端执行。通过已配置的图形支持 text-to-video 和 image-to-video。 |
| fal | 对长时间运行的任务使用基于队列的流程。仅支持单张参考图像。 |
| Google | 使用 Gemini/Veo。支持一张图像或一个视频参考。 |
| Google | 使用 Gemini / Veo。支持一张参考图像或一个参考视频。 |
| MiniMax | 仅支持单张参考图像。 |
| OpenAI | 仅转发 `size` 覆盖项。其他风格覆盖项(`aspectRatio`、`resolution`、`audio`、`watermark`)会被忽略并附带警告。 |
| Qwen | 与 Alibaba 使用相同的 DashScope 后端。参考输入必须是远程 `http(s)` URL本地文件会在一开始就被拒绝。 |
| Runway | 通过 data URI 支持本地文件。视频到视频需要 `runway/gen4_aleph`。纯文本运行提供 `16:9``9:16` 宽高比。 |
| OpenAI | 仅转发 `size` 覆盖值。其他风格覆盖值(`aspectRatio`、`resolution`、`audio`、`watermark`)会被忽略,并给出警告。 |
| Qwen | 与 Alibaba 使用相同的 DashScope 后端。参考输入必须是远程 `http(s)` URL本地文件会在前置校验时被拒绝。 |
| Runway | 通过 data URI 支持本地文件。video-to-video 需要 `runway/gen4_aleph`。纯文本运行会暴露 `16:9``9:16` 纵横比。 |
| Together | 仅支持单张参考图像。 |
| xAI | 支持文生视频、图生视频,以及远程视频编辑/扩展流程。 |
| xAI | 支持 text-to-video、image-to-video以及远程视频编辑 / 扩展流程。 |
## 配置
@ -186,6 +188,7 @@ openclaw config set agents.defaults.videoGenerationModel.primary "qwen/wan2.6-t2
- [后台任务](/zh-CN/automation/tasks) -- 用于异步视频生成的任务跟踪
- [Alibaba Model Studio](/zh-CN/providers/alibaba)
- [BytePlus国际版](/providers/byteplus)
- [ComfyUI](/providers/comfy)
- [fal](/zh-CN/providers/fal)
- [GoogleGemini](/zh-CN/providers/google)
- [MiniMax](/zh-CN/providers/minimax)