From a7d9939741acc73a3d334e2696f887e18d8b0d03 Mon Sep 17 00:00:00 2001 From: "openclaw-docs-i18n[bot]" Date: Sun, 12 Apr 2026 18:29:36 +0000 Subject: [PATCH] chore(i18n): refresh zh-CN translations --- docs/zh-CN/channels/group-messages.md | 56 +- docs/zh-CN/concepts/active-memory.md | 290 +-- docs/zh-CN/concepts/agent-loop.md | 130 +- docs/zh-CN/concepts/context.md | 104 +- docs/zh-CN/gateway/security/index.md | 1122 ++++++------ docs/zh-CN/help/debugging.md | 77 +- docs/zh-CN/help/faq.md | 2393 ++++++++++++++++--------- docs/zh-CN/tools/slash-commands.md | 231 +-- docs/zh-CN/tools/thinking.md | 121 +- 9 files changed, 2657 insertions(+), 1867 deletions(-) diff --git a/docs/zh-CN/channels/group-messages.md b/docs/zh-CN/channels/group-messages.md index 216952a13..04533555a 100644 --- a/docs/zh-CN/channels/group-messages.md +++ b/docs/zh-CN/channels/group-messages.md @@ -1,36 +1,36 @@ --- read_when: - - 更改群组消息规则或提及方式 -summary: WhatsApp 群组消息处理的行为与配置(mentionPatterns 在各个界面间共享) + - 更改群组消息规则或提及设置 +summary: WhatsApp 群组消息处理的行为和配置(`mentionPatterns` 在各个界面中共享) title: 群组消息 x-i18n: - generated_at: "2026-04-05T08:14:41Z" + generated_at: "2026-04-12T18:22:02Z" model: gpt-5.4 provider: openai - source_hash: 2543be5bc4c6f188f955df580a6fef585ecbfc1be36ade5d34b1a9157e021bc5 + source_hash: 5d9484dd1de74d42f8dce4c3ac80d60c24864df30a7802e64893ef55506230fe source_path: channels/group-messages.md workflow: 15 --- # 群组消息(WhatsApp web 渠道) -目标:让 Clawd 能待在 WhatsApp 群组中,仅在被提及时唤醒,并将该线程与个人私信会话分开。 +目标:让 Clawd 待在 WhatsApp 群组中,只在被点名时唤醒,并将该线程与个人私信会话分开。 -注意:`agents.list[].groupChat.mentionPatterns` 现在也用于 Telegram/Discord/Slack/iMessage;本文档重点介绍 WhatsApp 特有的行为。对于多智能体设置,请为每个智能体设置 `agents.list[].groupChat.mentionPatterns`(或使用 `messages.groupChat.mentionPatterns` 作为全局回退)。 +注意:`agents.list[].groupChat.mentionPatterns` 现在也被 Telegram/Discord/Slack/iMessage 使用;本文档侧重于 WhatsApp 特有的行为。对于多智能体设置,请为每个智能体设置 `agents.list[].groupChat.mentionPatterns`(或使用 `messages.groupChat.mentionPatterns` 作为全局回退)。 ## 当前实现(2025-12-03) -- 激活模式:`mention`(默认)或 `always`。`mention` 需要一次提及(真实的 WhatsApp @ 提及,通过 `mentionedJids`、安全的正则模式,或文本中任意位置出现的机器人的 E.164 号码)。`always` 会在每条消息上唤醒智能体,但它应仅在能提供有意义价值时回复;否则返回精确的静默令牌 `NO_REPLY` / `no_reply`。默认值可在配置中通过 `channels.whatsapp.groups` 设置,并可通过 `/activation` 按群组覆盖。当设置了 `channels.whatsapp.groups` 时,它也会充当群组 allowlist(包含 `"*"` 可允许所有群组)。 -- 群组策略:`channels.whatsapp.groupPolicy` 控制是否接受群组消息(`open|disabled|allowlist`)。`allowlist` 使用 `channels.whatsapp.groupAllowFrom`(回退:显式的 `channels.whatsapp.allowFrom`)。默认值为 `allowlist`(在你添加发送者前会被阻止)。 -- 按群组划分的会话:会话键类似 `agent::whatsapp:group:`,因此像 `/verbose on` 或 `/think high` 这样的命令(作为独立消息发送)会限定在该群组内;个人私信状态不会受到影响。Heartbeat 会跳过群组线程。 -- 上下文注入:**仅待处理**的群组消息(默认 50 条)中,_未_触发运行的消息会以 `[Chat messages since your last reply - for context]` 为前缀注入,而触发消息会放在 `[Current message - respond to this]` 下。已经在会话中的消息不会再次注入。 -- 发送者显示:每个群组批次现在都会以 `[from: Sender Name (+E164)]` 结束,以便 Pi 知道是谁在发言。 -- 阅后即焚 / 查看一次:我们会先解包这些消息,再提取文本/提及,因此其中的提及仍可触发。 -- 群组系统提示词:在群组会话的第一轮(以及每次 `/activation` 更改模式时),我们会向系统提示词注入一段简短说明,例如 `You are replying inside the WhatsApp group "". Group members: Alice (+44...), Bob (+43...), … Activation: trigger-only … Address the specific sender noted in the message context.`。如果元数据不可用,我们仍会告诉智能体这是一个群聊。 +- 激活模式:`mention`(默认)或 `always`。`mention` 需要一次点名(真实的 WhatsApp @ 提及,通过 `mentionedJids`、安全的正则模式,或文本中任意位置出现的机器人的 E.164 号码)。`always` 会在每条消息时唤醒智能体,但它应该只在能够提供有意义价值时回复;否则返回精确的静默令牌 `NO_REPLY` / `no_reply`。默认值可在配置中设置(`channels.whatsapp.groups`),并可通过 `/activation` 按群组覆盖。当设置了 `channels.whatsapp.groups` 时,它还会充当群组允许列表(包含 `"*"` 可允许全部)。 +- 群组策略:`channels.whatsapp.groupPolicy` 控制是否接受群组消息(`open|disabled|allowlist`)。`allowlist` 使用 `channels.whatsapp.groupAllowFrom`(回退:显式的 `channels.whatsapp.allowFrom`)。默认值为 `allowlist`(在你添加发送者之前会被阻止)。 +- 按群组划分的会话:会话键看起来像 `agent::whatsapp:group:`,因此诸如 `/verbose on`、`/trace on` 或 `/think high` 之类的命令(作为独立消息发送)仅作用于该群组;个人私信状态不会受影响。群组线程会跳过心跳消息。 +- 上下注入:**仅待处理的** 群组消息(默认 50 条)中,_未_ 触发运行的消息会被加前缀放在 `[Chat messages since your last reply - for context]` 下,而触发的那一行会放在 `[Current message - respond to this]` 下。已经在会话中的消息不会被重复注入。 +- 发送者呈现:每个群组批次现在都会以 `[from: Sender Name (+E164)]` 结尾,以便 Pi 知道是谁在说话。 +- 阅后即焚 / view-once:我们会在提取文本 / 提及之前先解包这些消息,因此其中的点名仍然会触发。 +- 群组系统提示:在群组会话的第一轮(以及每当 `/activation` 更改模式时),我们会向系统提示中注入一段简短说明,例如 `You are replying inside the WhatsApp group "". Group members: Alice (+44...), Bob (+43...), … Activation: trigger-only … Address the specific sender noted in the message context.`。如果元数据不可用,我们仍会告诉智能体这是一个群聊。 ## 配置示例(WhatsApp) -向 `~/.openclaw/openclaw.json` 添加一个 `groupChat` 代码块,这样即使 WhatsApp 从文本正文中去掉了可见的 `@`,显示名提及仍然能生效: +向 `~/.openclaw/openclaw.json` 添加一个 `groupChat` 块,这样即使 WhatsApp 在文本正文中去掉可见的 `@`,显示名称点名也能生效: ```json5 { @@ -57,8 +57,8 @@ x-i18n: 说明: -- 这些正则表达式不区分大小写,并使用与其他配置正则界面相同的安全正则防护规则;无效模式和不安全的嵌套重复会被忽略。 -- 当有人点按联系人时,WhatsApp 仍会通过 `mentionedJids` 发送规范提及,因此号码回退很少需要,但作为安全兜底仍然很有用。 +- 这些正则表达式不区分大小写,并使用与其他配置正则表达式界面相同的安全正则保护规则;无效模式和不安全的嵌套重复会被忽略。 +- 当有人点按联系人时,WhatsApp 仍会通过 `mentionedJids` 发送规范提及,因此号码回退很少需要,但它是一个有用的安全兜底。 ### 激活命令(仅限所有者) @@ -67,25 +67,25 @@ x-i18n: - `/activation mention` - `/activation always` -只有所有者号码(来自 `channels.whatsapp.allowFrom`,或在未设置时为机器人自己的 E.164 号码)可以更改此设置。在群组中以独立消息发送 `/status` 可查看当前激活模式。 +只有所有者号码(来自 `channels.whatsapp.allowFrom`,如果未设置则为机器人自己的 E.164)可以更改此项。在群组中以独立消息发送 `/status` 以查看当前激活模式。 ## 使用方法 -1. 将你的 WhatsApp 账户(运行 OpenClaw 的那个)添加到群组中。 -2. 说 `@openclaw …`(或包含该号码)。除非你将 `groupPolicy` 设为 `"open"`,否则只有在 allowlist 中的发送者才能触发它。 -3. 智能体提示词将包含最近的群组上下文以及尾部的 `[from: …]` 标记,以便它能回应正确的人。 -4. 会话级指令(`/verbose on`、`/think high`、`/new` 或 `/reset`、`/compact`)仅适用于该群组的会话;请将它们作为独立消息发送,以便正确注册。你的个人私信会话保持独立。 +1. 将你的 WhatsApp 账号(运行 OpenClaw 的那个)添加到群组中。 +2. 发送 `@openclaw …`(或包含该号码)。除非你设置 `groupPolicy: "open"`,否则只有允许列表中的发送者才能触发它。 +3. 智能体提示将包含最近的群组上下文以及末尾的 `[from: …]` 标记,以便它能回应正确的人。 +4. 会话级指令(`/verbose on`、`/trace on`、`/think high`、`/new` 或 `/reset`、`/compact`)仅适用于该群组的会话;请将它们作为独立消息发送,以便能够注册。你的个人私信会话保持独立。 ## 测试 / 验证 - 手动冒烟测试: - - 在群组中发送一个 `@openclaw` 提及,并确认回复中引用了发送者姓名。 - - 发送第二次提及,并验证历史记录代码块已包含,然后会在下一轮被清除。 -- 检查 Gateway 网关日志(使用 `--verbose` 运行),查看显示 `from: ` 和 `[from: …]` 后缀的 `inbound web message` 条目。 + - 在群组中发送一次 `@openclaw` 点名,并确认收到的回复引用了发送者姓名。 + - 发送第二次点名,并验证历史块已被包含,然后在下一轮被清除。 +- 检查 Gateway 网关日志(使用 `--verbose` 运行),查看 `inbound web message` 条目,其中显示 `from: ` 和 `[from: …]` 后缀。 ## 已知注意事项 -- 为避免噪声广播,Heartbeat 会有意跳过群组。 -- 回显抑制使用组合后的批次字符串;如果你连续两次发送相同文本且不带提及,只有第一次会收到回复。 -- 会话存储条目会在会话存储中显示为 `agent::whatsapp:group:`(默认位于 `~/.openclaw/agents//sessions/sessions.json`);如果缺少该条目,只表示该群组尚未触发运行。 -- 群组中的输入状态指示器遵循 `agents.defaults.typingMode`(默认值:未被提及时为 `message`)。 +- 群组会有意跳过心跳消息,以避免产生嘈杂的广播。 +- 回显抑制使用合并后的整批字符串;如果你连续两次发送相同文本且没有提及,只有第一次会得到响应。 +- 会话存储条目会在会话存储中显示为 `agent::whatsapp:group:`(默认位于 `~/.openclaw/agents//sessions/sessions.json`);缺少某个条目仅表示该群组尚未触发过一次运行。 +- 群组中的输入指示器遵循 `agents.defaults.typingMode`(默认:未被提及时为 `message`)。 diff --git a/docs/zh-CN/concepts/active-memory.md b/docs/zh-CN/concepts/active-memory.md index 504792f05..dce0b2ffe 100644 --- a/docs/zh-CN/concepts/active-memory.md +++ b/docs/zh-CN/concepts/active-memory.md @@ -1,30 +1,30 @@ --- read_when: - 你想了解活动记忆的用途 - - 你想为一个对话式智能体开启活动记忆 + - 你想为一个对话式智能体启用活动记忆 - 你想调整活动记忆的行为,而不在所有地方都启用它 -summary: 一个由插件拥有的阻塞式 Memory 子智能体,会将相关记忆注入到交互式聊天会话中 +summary: 一个由插件拥有的阻塞型 Memory 子智能体,会将相关记忆注入到交互式聊天会话中 title: 活动记忆 x-i18n: - generated_at: "2026-04-12T04:23:32Z" + generated_at: "2026-04-12T18:22:05Z" model: gpt-5.4 provider: openai - source_hash: 59456805c28daaab394ba2a7f87e1104a1334a5cf32dbb961d5d232d9c471d84 + source_hash: dc15b2139618d9dbb0ba4d9951fb82a4d86076f7b8dc1a6bf2013bcce61878c4 source_path: concepts/active-memory.md workflow: 15 --- # 活动记忆 -活动记忆是一个可选的、由插件拥有的阻塞式 Memory 子智能体,会在符合条件的对话式会话中于主回复之前运行。 +活动记忆是一个可选的、由插件拥有的阻塞型 Memory 子智能体,会在符合条件的对话式会话中于主回复之前运行。 -它之所以存在,是因为大多数记忆系统虽然能力强,但都偏被动。它们依赖主智能体来决定何时搜索记忆,或者依赖用户说出诸如“记住这个”或“搜索记忆”这样的话。等到那时,记忆本可以让回复显得自然的那个时机其实已经过去了。 +之所以存在它,是因为大多数记忆系统虽然能力很强,但都偏向被动。它们依赖主智能体来决定何时搜索记忆,或者依赖用户说出类似“记住这个”或“搜索记忆”这样的话。等到那时,记忆原本可以让回复显得自然的那个时刻其实已经过去了。 -活动记忆会在生成主回复之前,为系统提供一次有边界的机会来提取相关记忆。 +活动记忆为系统提供了一次有边界的机会,在生成主回复之前呈现相关记忆。 -## 将此内容粘贴到你的智能体中 +## 粘贴到你的智能体中 -如果你想让你的智能体以一个自包含、默认安全的配置启用活动记忆,请将以下内容粘贴到你的智能体中: +如果你想为你的智能体启用活动记忆,并使用一个自包含、默认安全的设置,请将以下内容粘贴到你的智能体中: ```json5 { @@ -50,7 +50,7 @@ x-i18n: } ``` -这会为 `main` 智能体启用该插件,默认将其限制为仅用于私信风格的会话,优先让它继承当前会话的模型,并且仅在没有可用的显式模型或继承模型时才使用已配置的回退模型。 +这会为 `main` 智能体开启该插件,默认将其限制为仅在私信风格的会话中运行,优先让它继承当前会话模型,并且只有在没有显式模型或继承模型可用时,才使用已配置的回退模型。 之后,重启 Gateway 网关: @@ -58,13 +58,14 @@ x-i18n: openclaw gateway ``` -若要在对话中实时查看它: +要在对话中实时检查它: ```text /verbose on +/trace on ``` -## 开启活动记忆 +## 启用活动记忆 最安全的设置方式是: @@ -72,7 +73,7 @@ openclaw gateway 2. 指定一个对话式智能体 3. 仅在调优期间保持日志开启 -先在 `openclaw.json` 中加入以下内容: +先在 `openclaw.json` 中添加以下内容: ```json5 { @@ -106,10 +107,10 @@ openclaw gateway 这意味着: - `plugins.entries.active-memory.enabled: true` 会启用该插件 -- `config.agents: ["main"]` 仅让 `main` 智能体加入活动记忆 -- `config.allowedChatTypes: ["direct"]` 默认仅在私信风格的会话中启用活动记忆 -- 如果未设置 `config.model`,活动记忆会优先继承当前会话模型 -- `config.modelFallback` 可选地提供你自己的回退提供商/模型以用于回忆 +- `config.agents: ["main"]` 只让 `main` 智能体加入活动记忆 +- `config.allowedChatTypes: ["direct"]` 默认只在私信风格的会话中启用活动记忆 +- 如果 `config.model` 未设置,活动记忆会优先继承当前会话模型 +- `config.modelFallback` 可选,用于为召回提供你自己的回退提供商/模型 - `config.promptStyle: "balanced"` 会为 `recent` 模式使用默认的通用提示风格 - 活动记忆仍然只会在符合条件的交互式持久聊天会话中运行 @@ -117,9 +118,9 @@ openclaw gateway 活动记忆会为模型注入隐藏的系统上下文。它不会向客户端暴露原始的 `...` 标签。 -## 会话开关 +## 会话切换 -当你想在不修改配置的情况下,为当前聊天会话暂停或恢复活动记忆时,请使用插件命令: +当你想在不编辑配置的情况下,为当前聊天会话暂停或恢复活动记忆时,请使用插件命令: ```text /active-memory status @@ -127,8 +128,8 @@ openclaw gateway /active-memory on ``` -这是会话级别的。它不会更改 -`plugins.entries.active-memory.enabled`、智能体目标设置或其他全局配置。 +这是会话级作用域。它不会更改 +`plugins.entries.active-memory.enabled`、智能体目标设定或其他全局配置。 如果你希望该命令写入配置,并为所有会话暂停或恢复活动记忆,请使用显式的全局形式: @@ -138,32 +139,34 @@ openclaw gateway /active-memory on --global ``` -全局形式会写入 `plugins.entries.active-memory.config.enabled`。它会保持 -`plugins.entries.active-memory.enabled` 为开启状态,以便之后仍可使用该命令重新启用活动记忆。 +全局形式会写入 `plugins.entries.active-memory.config.enabled`。它会保留 +`plugins.entries.active-memory.enabled` 为开启状态,以便该命令之后仍可用于重新开启活动记忆。 -如果你想查看活动记忆在实时会话中具体做了什么,请为该会话开启详细模式: +如果你想查看活动记忆在实时会话中的行为,请开启与你想看到的输出相匹配的会话开关: ```text /verbose on +/trace on ``` -开启详细模式后,OpenClaw 可以显示: +启用后,OpenClaw 可以显示: -- 一行活动记忆状态,例如 `Active Memory: ok 842ms recent 34 chars` -- 一条可读的调试摘要,例如 `Active Memory Debug: Lemon pepper wings with blue cheese.` +- 当 `/verbose on` 时,显示活动记忆状态行,例如 `Active Memory: ok 842ms recent 34 chars` +- 当 `/trace on` 时,显示可读的调试摘要,例如 `Active Memory Debug: Lemon pepper wings with blue cheese.` -这些行来源于同一次为隐藏系统上下文提供内容的活动记忆过程,但它们是为人类阅读而格式化的,而不是暴露原始提示标记。 +这些行源自同一次活动记忆流程,也正是它为隐藏系统上下文提供内容的那次流程,但它们是为人类阅读而格式化的,而不是暴露原始提示标记。它们会在正常的助手回复之后作为一条后续诊断消息发送,因此像 Telegram 这样的渠道客户端不会在回复前闪出一个单独的诊断气泡。 -默认情况下,这个阻塞式 Memory 子智能体的转录记录是临时的,会在运行完成后删除。 +默认情况下,这个阻塞型 Memory 子智能体的转录是临时的,并会在运行完成后删除。 示例流程: ```text /verbose on +/trace on what wings should i order? ``` -预期可见回复形式: +预期的可见回复形态: ```text ...normal assistant reply... @@ -174,13 +177,13 @@ what wings should i order? ## 何时运行 -活动记忆使用两个门槛条件: +活动记忆使用两个门控条件: 1. **配置选择加入** 必须启用该插件,并且当前智能体 id 必须出现在 `plugins.entries.active-memory.config.agents` 中。 -2. **严格的运行时资格** - 即使已启用且已被指定,活动记忆也只会在符合条件的交互式持久聊天会话中运行。 +2. **严格的运行时资格条件** + 即使已启用并已设定目标,活动记忆也只会在符合条件的交互式持久聊天会话中运行。 实际规则是: @@ -208,7 +211,7 @@ active memory runs allowedChatTypes: ["direct"] ``` -这意味着活动记忆默认会在私信风格的会话中运行,但不会在群组或渠道会话中运行,除非你明确为它们开启。 +这意味着,默认情况下活动记忆会在私信风格的会话中运行,但不会在群组或渠道会话中运行,除非你显式将它们加入。 示例: @@ -224,39 +227,39 @@ allowedChatTypes: ["direct", "group"] allowedChatTypes: ["direct", "group", "channel"] ``` -## 在哪里运行 +## 运行位置 -活动记忆是一项对话增强功能,而不是平台范围的推理功能。 +活动记忆是一项对话增强功能,而不是一项平台范围内的推理功能。 -| Surface | 运行活动记忆? | -| --- | --- | -| Control UI / web chat 持久会话 | 是,如果插件已启用且智能体已被指定 | -| 走同一持久聊天路径的其他交互式渠道会话 | 是,如果插件已启用且智能体已被指定 | -| 无头单次运行 | 否 | -| 心跳/后台运行 | 否 | -| 通用内部 `agent-command` 路径 | 否 | -| 子智能体/内部辅助执行 | 否 | +| Surface | 是否运行活动记忆? | +| ------------------------------------------------------------------- | ------------------ | +| Control UI / web chat 持久会话 | 是,如果插件已启用且该智能体已被设为目标 | +| 同一持久聊天路径上的其他交互式渠道会话 | 是,如果插件已启用且该智能体已被设为目标 | +| 无头一次性运行 | 否 | +| 心跳/后台运行 | 否 | +| 通用内部 `agent-command` 路径 | 否 | +| 子智能体/内部辅助执行 | 否 | ## 为什么使用它 在以下情况下使用活动记忆: -- 会话是持久的并且面向用户 -- 智能体拥有有意义的长期记忆可供搜索 -- 连续性和个性化比原始提示的确定性更重要 +- 会话是持久的且面向用户 +- 智能体拥有可供搜索的有意义长期记忆 +- 连续性和个性化比原始提示确定性更重要 -它特别适用于: +它尤其适用于: - 稳定偏好 - 重复习惯 -- 应该自然浮现的长期用户上下文 +- 应该自然浮现出来的长期用户上下文 它不适合用于: - 自动化 -- 内部工作器 -- 单次 API 任务 -- 那些隐藏的个性化会让人意外的场景 +- 内部工作进程 +- 一次性 API 任务 +- 那些隐藏个性化会让人意外的场景 ## 它如何工作 @@ -271,7 +274,7 @@ flowchart LR I --> M["Main Reply"] ``` -这个阻塞式 Memory 子智能体只能使用: +这个阻塞型 Memory 子智能体只能使用: - `memory_search` - `memory_get` @@ -280,22 +283,22 @@ flowchart LR ## 查询模式 -`config.queryMode` 控制这个阻塞式 Memory 子智能体能看到多少对话内容。 +`config.queryMode` 控制这个阻塞型 Memory 子智能体能看到多少对话内容。 ## 提示风格 -`config.promptStyle` 控制这个阻塞式 Memory 子智能体在决定是否返回记忆时有多积极或多严格。 +`config.promptStyle` 控制这个阻塞型 Memory 子智能体在决定是否返回记忆时有多积极或多严格。 可用风格: -- `balanced`:`recent` 模式的通用默认选项 -- `strict`:最不积极;最适合你希望附近上下文几乎不产生串扰时使用 -- `contextual`:最利于连续性;最适合对话历史应更重要时使用 -- `recall-heavy`:即使匹配较弱但仍然合理,也更愿意提取记忆 -- `precision-heavy`:除非匹配非常明显,否则会强烈倾向于返回 `NONE` -- `preference-only`:针对最爱、习惯、日常、口味和反复出现的个人事实进行了优化 +- `balanced`:`recent` 模式的通用默认值 +- `strict`:最不积极;最适合你希望尽量减少附近上下文渗入的情况 +- `contextual`:最有利于连续性;最适合对话历史应更重要的情况 +- `recall-heavy`:更愿意在较弱但仍合理的匹配下呈现记忆 +- `precision-heavy`:除非匹配非常明显,否则会强烈倾向返回 `NONE` +- `preference-only`:针对收藏、习惯、日常规律、口味和重复出现的个人事实进行了优化 -当未设置 `config.promptStyle` 时,默认映射为: +当 `config.promptStyle` 未设置时,默认映射为: ```text message -> strict @@ -303,7 +306,7 @@ recent -> balanced full -> contextual ``` -如果你显式设置了 `config.promptStyle`,则以该覆盖值为准。 +如果你显式设置了 `config.promptStyle`,则以该覆盖设置为准。 示例: @@ -313,7 +316,7 @@ promptStyle: "preference-only" ## 模型回退策略 -如果未设置 `config.model`,活动记忆会按以下顺序尝试解析模型: +如果 `config.model` 未设置,活动记忆会按以下顺序尝试解析模型: ```text explicit plugin model @@ -330,15 +333,16 @@ explicit plugin model modelFallback: "google/gemini-3-flash" ``` -如果无法解析出显式模型、继承模型或已配置的回退模型,活动记忆会跳过该轮回忆。 +如果没有解析出显式模型、继承模型或已配置回退模型,活动记忆会跳过该轮的召回。 -`config.modelFallbackPolicy` 仅作为已弃用的兼容字段保留,以支持旧配置。它不再改变运行时行为。 +`config.modelFallbackPolicy` 仅作为已弃用的兼容字段保留,用于旧配置。 +它不再改变运行时行为。 -## 高级逃生舱选项 +## 高级逃生舱 -这些选项有意不属于推荐设置的一部分。 +这些选项有意不包含在推荐设置中。 -`config.thinking` 可以覆盖这个阻塞式 Memory 子智能体的 thinking 级别: +`config.thinking` 可以覆盖这个阻塞型 Memory 子智能体的 thinking 级别: ```json5 thinking: "medium" @@ -350,21 +354,22 @@ thinking: "medium" thinking: "off" ``` -不要默认启用它。活动记忆运行在回复路径中,因此额外的思考时间会直接增加用户可感知的延迟。 +默认不要启用它。活动记忆运行在回复路径中,因此额外的思考时间会直接增加用户可见的延迟。 -`config.promptAppend` 会在默认活动记忆提示之后、对话上下文之前,附加额外的操作员指令: +`config.promptAppend` 会在默认活动记忆提示之后、对话上下文之前追加额外的操作员指令: ```json5 promptAppend: "Prefer stable long-term preferences over one-off events." ``` -`config.promptOverride` 会替换默认的活动记忆提示。OpenClaw 之后仍会附加对话上下文: +`config.promptOverride` 会替换默认的活动记忆提示。OpenClaw +仍会在其后追加对话上下文: ```json5 promptOverride: "You are a memory search agent. Return NONE or one compact user fact." ``` -除非你是在有意测试不同的回忆契约,否则不建议自定义提示。默认提示已针对“返回 `NONE` 或为主模型返回紧凑的用户事实上下文”这一目标进行了调优。 +除非你是在有意测试不同的召回契约,否则不建议进行提示自定义。默认提示已针对“返回 `NONE` 或返回适用于主模型的紧凑用户事实上下文”进行了优化。 ### `message` @@ -376,8 +381,8 @@ Latest user message only 适用场景: -- 你想获得最快的行为 -- 你希望最强地偏向稳定偏好的回忆 +- 你希望获得最快的行为 +- 你希望对稳定偏好召回有最强偏向 - 后续轮次不需要对话上下文 建议超时时间: @@ -386,7 +391,7 @@ Latest user message only ### `recent` -发送最新的用户消息以及一小段最近的对话尾部内容。 +发送最新的用户消息以及最近的一小段对话尾部。 ```text Recent conversation tail: @@ -400,8 +405,8 @@ Latest user message: 适用场景: -- 你希望在速度与对话语境之间取得更好的平衡 -- 追问通常依赖最近几轮对话 +- 你希望在速度和对话上下文之间取得更好的平衡 +- 后续问题通常依赖最近几轮对话 建议超时时间: @@ -409,7 +414,7 @@ Latest user message: ### `full` -将完整对话发送给这个阻塞式 Memory 子智能体。 +将完整对话发送给这个阻塞型 Memory 子智能体。 ```text Full conversation context: @@ -421,15 +426,15 @@ user: ... 适用场景: -- 最强的回忆质量比延迟更重要 -- 对话中在线程较早位置包含重要的前置内容 +- 最强的召回质量比延迟更重要 +- 对话中包含位于线程较早位置的重要铺垫内容 建议超时时间: -- 相比 `message` 或 `recent` 明显提高 +- 相较于 `message` 或 `recent` 明显增加 - 根据线程大小,从 `15000` ms 或更高开始 -总体来说,超时时间应随着上下文大小增加而增加: +一般来说,超时时间应随上下文大小增加: ```text message < recent < full @@ -437,15 +442,15 @@ message < recent < full ## 转录持久化 -活动记忆阻塞式 Memory 子智能体运行会在阻塞式 Memory 子智能体调用期间创建一个真实的 `session.jsonl` 转录文件。 +活动记忆阻塞型 Memory 子智能体运行会在阻塞型 Memory 子智能体调用期间创建一个真实的 `session.jsonl` 转录文件。 默认情况下,该转录是临时的: - 它会写入临时目录 -- 它仅用于该阻塞式 Memory 子智能体运行 -- 运行结束后会立即删除 +- 它仅用于该次阻塞型 Memory 子智能体运行 +- 它会在运行结束后立即删除 -如果你想出于调试或检查目的,将这些阻塞式 Memory 子智能体转录保留在磁盘上,请显式开启持久化: +如果你想将这些阻塞型 Memory 子智能体转录保留在磁盘上以便调试或检查,请显式开启持久化: ```json5 { @@ -464,21 +469,21 @@ message < recent < full } ``` -启用后,活动记忆会将转录存储在目标智能体会话文件夹下的一个单独目录中,而不是主用户对话转录路径中。 +启用后,活动记忆会将转录存储在目标智能体会话文件夹下的单独目录中,而不是主用户对话转录路径中。 -默认布局在概念上为: +默认布局在概念上是: ```text agents//sessions/active-memory/.jsonl ``` -你可以通过 `config.transcriptDir` 更改这个相对子目录。 +你可以通过 `config.transcriptDir` 更改这个相对的子目录。 请谨慎使用: -- 在繁忙会话中,阻塞式 Memory 子智能体转录可能会很快累积 -- `full` 查询模式可能会复制大量对话上下文 -- 这些转录包含隐藏提示上下文和已回忆出的记忆 +- 在繁忙会话中,阻塞型 Memory 子智能体转录可能会快速累积 +- `full` 查询模式可能会重复大量对话上下文 +- 这些转录包含隐藏的提示上下文和召回的记忆 ## 配置 @@ -490,32 +495,32 @@ plugins.entries.active-memory 最重要的字段有: -| Key | Type | 含义 | +| 键 | 类型 | 含义 | | --------------------------- | ---------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------ | | `enabled` | `boolean` | 启用插件本身 | -| `config.agents` | `string[]` | 可使用活动记忆的智能体 id | -| `config.model` | `string` | 可选的阻塞式 Memory 子智能体模型引用;未设置时,活动记忆会使用当前会话模型 | -| `config.queryMode` | `"message" \| "recent" \| "full"` | 控制阻塞式 Memory 子智能体能看到多少对话内容 | -| `config.promptStyle` | `"balanced" \| "strict" \| "contextual" \| "recall-heavy" \| "precision-heavy" \| "preference-only"` | 控制阻塞式 Memory 子智能体在决定是否返回记忆时有多积极或多严格 | -| `config.thinking` | `"off" \| "minimal" \| "low" \| "medium" \| "high" \| "xhigh" \| "adaptive"` | 阻塞式 Memory 子智能体的高级 thinking 覆盖;默认值为 `off` 以保证速度 | -| `config.promptOverride` | `string` | 高级完整提示替换;不建议正常使用 | -| `config.promptAppend` | `string` | 追加到默认或覆盖提示之后的高级额外指令 | -| `config.timeoutMs` | `number` | 阻塞式 Memory 子智能体的硬超时时间 | +| `config.agents` | `string[]` | 允许使用活动记忆的智能体 id | +| `config.model` | `string` | 可选的阻塞型 Memory 子智能体模型引用;未设置时,活动记忆会使用当前会话模型 | +| `config.queryMode` | `"message" \| "recent" \| "full"` | 控制阻塞型 Memory 子智能体能看到多少对话内容 | +| `config.promptStyle` | `"balanced" \| "strict" \| "contextual" \| "recall-heavy" \| "precision-heavy" \| "preference-only"` | 控制阻塞型 Memory 子智能体在决定是否返回记忆时有多积极或多严格 | +| `config.thinking` | `"off" \| "minimal" \| "low" \| "medium" \| "high" \| "xhigh" \| "adaptive"` | 阻塞型 Memory 子智能体的高级 thinking 覆盖项;默认为 `off` 以保证速度 | +| `config.promptOverride` | `string` | 高级完整提示替换;不建议日常使用 | +| `config.promptAppend` | `string` | 追加到默认或覆盖提示后的高级额外说明 | +| `config.timeoutMs` | `number` | 阻塞型 Memory 子智能体的硬超时时间 | | `config.maxSummaryChars` | `number` | active-memory 摘要允许的最大总字符数 | -| `config.logging` | `boolean` | 在调优时输出活动记忆日志 | -| `config.persistTranscripts` | `boolean` | 将阻塞式 Memory 子智能体转录保留在磁盘上,而不是删除临时文件 | -| `config.transcriptDir` | `string` | 智能体会话文件夹下阻塞式 Memory 子智能体转录的相对目录 | +| `config.logging` | `boolean` | 在调优期间输出活动记忆日志 | +| `config.persistTranscripts` | `boolean` | 将阻塞型 Memory 子智能体转录保留在磁盘上,而不是删除临时文件 | +| `config.transcriptDir` | `string` | 智能体会话文件夹下阻塞型 Memory 子智能体转录的相对子目录 | 有用的调优字段: -| Key | Type | 含义 | +| 键 | 类型 | 含义 | | ----------------------------- | -------- | ------------------------------------------------------------- | | `config.maxSummaryChars` | `number` | active-memory 摘要允许的最大总字符数 | -| `config.recentUserTurns` | `number` | 当 `queryMode` 为 `recent` 时要包含的先前用户轮次数 | -| `config.recentAssistantTurns` | `number` | 当 `queryMode` 为 `recent` 时要包含的先前助手轮次数 | +| `config.recentUserTurns` | `number` | 当 `queryMode` 为 `recent` 时要包含的先前用户轮次 | +| `config.recentAssistantTurns` | `number` | 当 `queryMode` 为 `recent` 时要包含的先前助手轮次 | | `config.recentUserChars` | `number` | 每个最近用户轮次的最大字符数 | | `config.recentAssistantChars` | `number` | 每个最近助手轮次的最大字符数 | -| `config.cacheTtlMs` | `number` | 对重复的相同查询进行缓存复用 | +| `config.cacheTtlMs` | `number` | 对重复的相同查询复用缓存 | ## 推荐设置 @@ -541,34 +546,79 @@ plugins.entries.active-memory } ``` -如果你想在调优时检查实时行为,请在会话中使用 `/verbose on`,而不是寻找单独的 active-memory 调试命令。 +如果你想在调优时检查实时行为,请使用 `/verbose on` 查看正常状态行,使用 `/trace on` 查看 active-memory 调试摘要,而不是去寻找单独的 active-memory 调试命令。在聊天渠道中,这些诊断行会在主助手回复之后发送,而不是之前。 -然后再根据需要调整为: +然后再调整为: -- 如果你想降低延迟,改用 `message` -- 如果你认为更多上下文值得接受更慢的阻塞式 Memory 子智能体,则改用 `full` +- 如果你想降低延迟,则使用 `message` +- 如果你认为更多上下文值得接受更慢的阻塞型 Memory 子智能体,则使用 `full` ## 调试 -如果活动记忆没有按预期显示: +如果活动记忆没有如你预期那样显示: -1. 确认插件已在 `plugins.entries.active-memory.enabled` 下启用。 +1. 确认已在 `plugins.entries.active-memory.enabled` 下启用插件。 2. 确认当前智能体 id 已列在 `config.agents` 中。 -3. 确认你正在通过交互式持久聊天会话进行测试。 -4. 打开 `config.logging: true` 并查看 Gateway 网关日志。 -5. 使用 `openclaw memory status --deep` 验证记忆搜索本身是否正常工作。 +3. 确认你是通过交互式持久聊天会话进行测试。 +4. 开启 `config.logging: true` 并查看 Gateway 网关日志。 +5. 使用 `openclaw memory status --deep` 验证记忆搜索本身是否正常。 如果记忆命中过于嘈杂,请收紧: - `maxSummaryChars` -如果活动记忆过慢,请尝试: +如果活动记忆过慢: - 降低 `queryMode` - 降低 `timeoutMs` -- 减少最近轮次数 +- 减少最近轮次数量 - 降低每轮字符上限 +## 常见问题 + +### 嵌入提供商意外更改 + +活动记忆依赖于 `agents.defaults.memorySearch` 下正常的记忆搜索嵌入提供商。如果你没有显式设置该提供商,OpenClaw 会自动检测第一个可用的嵌入提供商。 + +这在真实部署中可能会令人困惑: + +- 新增可用的 API 密钥可能会改变记忆搜索所使用的提供商 +- 某个命令或诊断界面可能会让选中的提供商看起来与实时记忆同步或搜索引导期间实际命中的路径不同 +- 托管提供商可能因配额或速率限制而失败,而这些错误只有在活动记忆开始于每次回复前发起召回搜索后才会显现 + +如果你在意可预测行为,请显式固定记忆嵌入提供商,而不要依赖自动检测。 + +示例: + +```json5 +{ + agents: { + defaults: { + memorySearch: { + provider: "ollama", + model: "nomic-embed-text", + }, + }, + }, +} +``` + +或者,如果你想使用 Gemini 嵌入: + +```json5 +{ + agents: { + defaults: { + memorySearch: { + provider: "gemini", + }, + }, + }, +} +``` + +更改提供商后,重启 Gateway 网关,并在开启 `/trace on` 的情况下重新测试,这样活动记忆调试行就会反映新的嵌入路径。 + ## 相关页面 - [记忆搜索](/zh-CN/concepts/memory-search) diff --git a/docs/zh-CN/concepts/agent-loop.md b/docs/zh-CN/concepts/agent-loop.md index eac940474..a6d791eb7 100644 --- a/docs/zh-CN/concepts/agent-loop.md +++ b/docs/zh-CN/concepts/agent-loop.md @@ -4,40 +4,40 @@ read_when: summary: 智能体循环生命周期、流和等待语义 title: 智能体循环 x-i18n: - generated_at: "2026-04-10T07:10:49Z" + generated_at: "2026-04-12T18:22:03Z" model: gpt-5.4 provider: openai - source_hash: b6831a5b11e9100e49f650feca51ab44a2bef242ce1b5db2766d0b3b5c5ba729 + source_hash: 3c2986708b444055340e0c91b8fce7d32225fcccf3d197b797665fd36b1991a5 source_path: concepts/agent-loop.md workflow: 15 --- # 智能体循环(OpenClaw) -智能体循环是智能体一次完整且“真实”的运行过程:输入接收 → 上下文组装 → 模型推理 → -工具执行 → 流式回复 → 持久化。它是将一条消息转化为动作和最终回复的权威路径,同时保持会话状态一致。 +智能体循环是一次智能体完整的“真实”运行:接收输入 → 组装上下文 → 模型推理 → +工具执行 → 流式回复 → 持久化。它是将一条消息转化为操作和最终回复的权威路径,同时保持会话状态一致。 -在 OpenClaw 中,一个循环是每个会话一次单独的串行运行;当模型进行思考、调用工具并流式输出时,它会发出生命周期事件和流事件。本文档说明这个真实循环是如何端到端连接起来的。 +在 OpenClaw 中,循环是每个会话一次单独的串行运行;当模型进行思考、调用工具并流式输出时,它会发出生命周期事件和流事件。本文档解释了这个真实循环是如何端到端连接起来的。 ## 入口点 -- Gateway RPC:`agent` 和 `agent.wait`。 +- Gateway 网关 RPC:`agent` 和 `agent.wait`。 - CLI:`agent` 命令。 ## 工作原理(高级概览) 1. `agent` RPC 校验参数,解析会话(`sessionKey`/`sessionId`),持久化会话元数据,并立即返回 `{ runId, acceptedAt }`。 2. `agentCommand` 运行智能体: - - 解析模型以及 `thinking`/`verbose` 默认值 + - 解析模型以及 `thinking`/`verbose`/`trace` 默认值 - 加载 Skills 快照 - 调用 `runEmbeddedPiAgent`(`pi-agent-core` 运行时) - - 如果嵌入式循环没有发出事件,则发出 **lifecycle end/error** + - 如果嵌入循环未发出结束事件,则发出 **lifecycle end/error** 3. `runEmbeddedPiAgent`: - - 通过按会话划分的队列和全局队列将运行串行化 - - 解析模型和认证配置文件,并构建 Pi 会话 + - 通过按会话划分的队列和全局队列实现串行运行 + - 解析模型和认证配置,并构建 Pi 会话 - 订阅 Pi 事件并流式传输 assistant/tool 增量 - - 强制执行超时,超出后中止运行 - - 返回负载和 usage 元数据 + - 强制执行超时;超出后中止运行 + - 返回负载和用量元数据 4. `subscribeEmbeddedPiSession` 将 `pi-agent-core` 事件桥接到 OpenClaw `agent` 流: - 工具事件 => `stream: "tool"` - assistant 增量 => `stream: "assistant"` @@ -46,122 +46,122 @@ x-i18n: - 等待 `runId` 对应的 **lifecycle end/error** - 返回 `{ status: ok|error|timeout, startedAt, endedAt, error? }` -## 排队 + 并发 +## 队列 + 并发 -- 运行会按会话键(会话通道)串行化,并可选地再经过一个全局通道。 +- 运行会按会话键(会话通道)串行化,并且可选地经过全局通道。 - 这可以防止工具/会话竞争,并保持会话历史一致。 -- 消息渠道可以选择排队模式(`collect`/`steer`/`followup`)并接入这个通道系统。 +- 消息渠道可以选择队列模式(collect/steer/followup),这些模式会接入该通道系统。 参见 [命令队列](/zh-CN/concepts/queue)。 ## 会话 + 工作区准备 -- 工作区会被解析并创建;沙箱隔离运行可能会重定向到一个沙箱工作区根目录。 -- Skills 会被加载(或从快照复用),并注入到环境和提示词中。 -- 引导文件/上下文文件会被解析,并注入到系统提示报告中。 -- 会获取会话写锁;`SessionManager` 会在流式传输开始前打开并完成准备。 +- 工作区会被解析并创建;沙箱隔离运行可能会重定向到沙箱工作区根目录。 +- Skills 会被加载(或从快照复用),并注入到环境变量和提示词中。 +- 启动文件/上下文文件会被解析,并注入系统提示词报告中。 +- 会获取会话写锁;在开始流式传输之前,`SessionManager` 会被打开并完成准备。 ## 提示词组装 + 系统提示词 -- 系统提示词由 OpenClaw 的基础提示词、Skills 提示词、引导上下文和每次运行的覆盖项共同构建。 -- 会强制执行模型特定的限制和压缩保留 token。 -- 关于模型实际看到的内容,参见 [系统提示词](/zh-CN/concepts/system-prompt)。 +- 系统提示词由 OpenClaw 的基础提示词、Skills 提示词、启动上下文以及每次运行的覆盖项构建而成。 +- 会强制执行模型特定的限制和压缩预留 token。 +- 有关模型实际看到的内容,请参见 [系统提示词](/zh-CN/concepts/system-prompt)。 -## Hook 点(你可以在哪里拦截) +## Hook 点(你可以在哪些地方拦截) OpenClaw 有两套 Hook 系统: -- **内部 Hook**(Gateway Hook):用于命令和生命周期事件的事件驱动脚本。 -- **插件 Hook**:位于智能体/工具生命周期和 Gateway 管道内部的扩展点。 +- **内部 Hook**(Gateway 网关 Hooks):针对命令和生命周期事件的事件驱动脚本。 +- **插件 Hook**:位于智能体/工具生命周期和 Gateway 网关流水线内部的扩展点。 -### 内部 Hook(Gateway Hook) +### 内部 Hook(Gateway 网关 Hooks) -- **`agent:bootstrap`**:在系统提示词最终确定之前、构建引导文件时运行。 - 你可以用它添加/删除引导上下文文件。 -- **命令 Hook**:`/new`、`/reset`、`/stop` 以及其他命令事件(参见 Hooks 文档)。 +- **`agent:bootstrap`**:在系统提示词最终确定之前、构建启动文件时运行。 + 用它来添加或删除启动上下文文件。 +- **命令 Hooks**:`/new`、`/reset`、`/stop` 和其他命令事件(参见 Hooks 文档)。 -参见 [Hooks](/zh-CN/automation/hooks) 获取设置方式和示例。 +设置和示例请参见 [Hooks](/zh-CN/automation/hooks)。 -### 插件 Hook(智能体 + Gateway 生命周期) +### 插件 Hook(智能体 + Gateway 网关生命周期) -这些 Hook 在智能体循环或 Gateway 管道内部运行: +这些 Hook 会在智能体循环或 Gateway 网关流水线内部运行: -- **`before_model_resolve`**:在会话开始前运行(无 `messages`),用于在模型解析前以确定性方式覆盖 provider/model。 -- **`before_prompt_build`**:在会话加载后运行(带 `messages`),可在提交提示词前注入 `prependContext`、`systemPrompt`、`prependSystemContext` 或 `appendSystemContext`。对每轮动态文本使用 `prependContext`;对应该位于系统提示空间中的稳定指导,使用 system-context 字段。 -- **`before_agent_start`**:遗留兼容 Hook,可能在任一阶段运行;优先使用上面这些明确的 Hook。 -- **`before_agent_reply`**:在内联动作之后、LLM 调用之前运行,允许插件接管当前轮次并返回合成回复,或完全静默该轮次。 +- **`before_model_resolve`**:在会话前运行(无 `messages`),用于在模型解析前以确定性方式覆盖提供商/模型。 +- **`before_prompt_build`**:在会话加载后运行(带有 `messages`),在提交提示词前注入 `prependContext`、`systemPrompt`、`prependSystemContext` 或 `appendSystemContext`。对每轮动态文本使用 `prependContext`,对应该位于系统提示词空间中的稳定指导使用系统上下文字段。 +- **`before_agent_start`**:用于兼容旧行为的 Hook,可能会在任一阶段运行;优先使用上面更明确的 Hook。 +- **`before_agent_reply`**:在内联操作之后、LLM 调用之前运行,使插件可以接管这一轮并返回合成回复,或完全静默这一轮。 - **`agent_end`**:在完成后检查最终消息列表和运行元数据。 -- **`before_compaction` / `after_compaction`**:观察或标注压缩周期。 +- **`before_compaction` / `after_compaction`**:观察或注释压缩周期。 - **`before_tool_call` / `after_tool_call`**:拦截工具参数/结果。 - **`before_install`**:检查内置扫描结果,并可选择阻止 Skills 或插件安装。 -- **`tool_result_persist`**:在工具结果写入会话记录前同步转换结果。 -- **`message_received` / `message_sending` / `message_sent`**:入站 + 出站消息 Hook。 +- **`tool_result_persist`**:在工具结果写入会话记录前,同步转换工具结果。 +- **`message_received` / `message_sending` / `message_sent`**:入站和出站消息 Hook。 - **`session_start` / `session_end`**:会话生命周期边界。 -- **`gateway_start` / `gateway_stop`**:Gateway 生命周期事件。 +- **`gateway_start` / `gateway_stop`**:Gateway 网关生命周期事件。 -用于出站/工具保护的 Hook 决策规则: +出站/工具防护的 Hook 决策规则: -- `before_tool_call`:`{ block: true }` 是终局决定,会阻止更低优先级的处理程序继续执行。 +- `before_tool_call`:`{ block: true }` 是终止性结果,并会阻止更低优先级的处理器继续执行。 - `before_tool_call`:`{ block: false }` 是无操作,不会清除先前的阻止状态。 -- `before_install`:`{ block: true }` 是终局决定,会阻止更低优先级的处理程序继续执行。 +- `before_install`:`{ block: true }` 是终止性结果,并会阻止更低优先级的处理器继续执行。 - `before_install`:`{ block: false }` 是无操作,不会清除先前的阻止状态。 -- `message_sending`:`{ cancel: true }` 是终局决定,会阻止更低优先级的处理程序继续执行。 +- `message_sending`:`{ cancel: true }` 是终止性结果,并会阻止更低优先级的处理器继续执行。 - `message_sending`:`{ cancel: false }` 是无操作,不会清除先前的取消状态。 -参见 [插件 Hook](/zh-CN/plugins/architecture#provider-runtime-hooks) 获取 Hook API 和注册细节。 +有关 Hook API 和注册细节,请参见 [插件 Hooks](/zh-CN/plugins/architecture#provider-runtime-hooks)。 ## 流式传输 + 部分回复 - assistant 增量会从 `pi-agent-core` 流式传出,并作为 `assistant` 事件发出。 - 分块流式传输可以在 `text_end` 或 `message_end` 时发出部分回复。 - 推理流式传输可以作为单独的流发出,也可以作为分块回复发出。 -- 关于分块和分块回复行为,参见 [流式传输](/zh-CN/concepts/streaming)。 +- 有关分块和分块回复行为,请参见 [流式传输](/zh-CN/concepts/streaming)。 ## 工具执行 + 消息工具 - 工具开始/更新/结束事件会在 `tool` 流上发出。 -- 工具结果在记录/发出前会针对大小和图像负载进行清理。 -- 消息工具发送会被跟踪,以抑制重复的 assistant 确认。 +- 在记录/发出之前,工具结果会针对大小和图像负载进行清理。 +- 消息工具发送会被跟踪,以抑制重复的 assistant 确认消息。 -## 回复整形 + 抑制 +## 回复塑形 + 抑制 -- 最终负载由以下内容组装而成: - - assistant 文本(以及可选的推理内容) - - 内联工具摘要(当 `verbose` 开启且允许时) - - 当模型出错时的 assistant 错误文本 -- 精确的静默令牌 `NO_REPLY` / `no_reply` 会从出站 +- 最终负载由以下内容组装: + - assistant 文本(以及可选的推理) + - 内联工具摘要(当 `verbose` 且允许时) + - 模型报错时的 assistant 错误文本 +- 精确的静默标记 `NO_REPLY` / `no_reply` 会从出站 负载中过滤掉。 -- 消息工具的重复内容会从最终负载列表中移除。 -- 如果没有可渲染的负载剩余且某个工具报错,则会发出一个后备工具错误回复 +- 消息工具重复项会从最终负载列表中移除。 +- 如果没有可渲染的负载剩下且某个工具报错,则会发出后备工具错误回复 (除非某个消息工具已经发送了用户可见的回复)。 ## 压缩 + 重试 -- 自动压缩会发出 `compaction` 流事件,并且可能触发一次重试。 -- 在重试时,内存缓冲区和工具摘要会被重置,以避免重复输出。 -- 关于压缩管道,参见 [压缩](/zh-CN/concepts/compaction)。 +- 自动压缩会发出 `compaction` 流事件,并且可能触发重试。 +- 重试时,内存中的缓冲区和工具摘要会被重置,以避免重复输出。 +- 有关压缩流水线,请参见 [压缩](/zh-CN/concepts/compaction)。 ## 事件流(当前) -- `lifecycle`:由 `subscribeEmbeddedPiSession` 发出(以及由 `agentCommand` 作为后备发出) +- `lifecycle`:由 `subscribeEmbeddedPiSession` 发出(并由 `agentCommand` 作为后备发出) - `assistant`:来自 `pi-agent-core` 的流式增量 - `tool`:来自 `pi-agent-core` 的流式工具事件 ## 聊天渠道处理 - assistant 增量会被缓冲为聊天 `delta` 消息。 -- 在 **lifecycle end/error** 时会发出一个聊天 `final`。 +- 聊天 `final` 会在 **lifecycle end/error** 时发出。 ## 超时 - `agent.wait` 默认值:30 秒(仅等待)。可通过 `timeoutMs` 参数覆盖。 - 智能体运行时:`agents.defaults.timeoutSeconds` 默认值为 172800 秒(48 小时);由 `runEmbeddedPiAgent` 中的中止计时器强制执行。 -- LLM 空闲超时:`agents.defaults.llm.idleTimeoutSeconds` 会在空闲窗口内未收到任何响应分块时中止模型请求。对于缓慢的本地模型或推理/工具调用型提供商,请显式设置它;设为 0 则禁用。如果未设置,OpenClaw 会在已配置 `agents.defaults.timeoutSeconds` 时使用该值,否则使用 120 秒。对于没有显式 LLM 或智能体超时的 cron 触发运行,会禁用空闲监视器,并依赖 cron 外层超时。 +- LLM 空闲超时:`agents.defaults.llm.idleTimeoutSeconds` 会在空闲窗口内未收到任何响应分块时中止模型请求。对于较慢的本地模型或推理/工具调用提供商,请显式设置;设为 0 可禁用。如果未设置,OpenClaw 会在已配置时使用 `agents.defaults.timeoutSeconds`,否则使用 120 秒。对于未显式设置 LLM 或智能体超时的 cron 触发运行,会禁用空闲监视器,并依赖 cron 外层超时。 -## 可能提前结束的位置 +## 可能提前结束的情况 - 智能体超时(中止) - `AbortSignal`(取消) -- Gateway 断开连接或 RPC 超时 +- Gateway 网关断开连接或 RPC 超时 - `agent.wait` 超时(仅等待,不会停止智能体) ## 相关内容 @@ -169,5 +169,5 @@ OpenClaw 有两套 Hook 系统: - [工具](/zh-CN/tools) — 可用的智能体工具 - [Hooks](/zh-CN/automation/hooks) — 由智能体生命周期事件触发的事件驱动脚本 - [压缩](/zh-CN/concepts/compaction) — 长对话如何被总结 -- [Exec 审批](/zh-CN/tools/exec-approvals) — shell 命令的审批门控 +- [Exec 审批](/zh-CN/tools/exec-approvals) — shell 命令的审批门禁 - [Thinking](/zh-CN/tools/thinking) — thinking/推理级别配置 diff --git a/docs/zh-CN/concepts/context.md b/docs/zh-CN/concepts/context.md index d80aab8a1..6deb9ef87 100644 --- a/docs/zh-CN/concepts/context.md +++ b/docs/zh-CN/concepts/context.md @@ -1,15 +1,15 @@ --- read_when: - - 你想了解在 OpenClaw 中“上下文”是什么意思 - - 你在调试为什么模型“知道”某件事(或忘记了它) + - 你想了解 “context” 在 OpenClaw 中的含义 + - 你正在调试为什么模型“知道”某些内容(或为什么它忘记了这些内容) - 你想减少上下文开销(`/context`、`/status`、`/compact`) -summary: 上下文:模型看到了什么、它是如何构建的,以及如何检查它 +summary: 上下文:模型会看到什么、它是如何构建的,以及如何检查它 title: 上下文 x-i18n: - generated_at: "2026-04-06T12:42:44Z" + generated_at: "2026-04-12T18:22:04Z" model: gpt-5.4 provider: openai - source_hash: a75b4cd65bf6385d46265b9ce1643310bc99d220e35ec4b4924096bed3ca4aa0 + source_hash: 3620db1a8c1956d91a01328966df491388d3a32c4003dc4447197eb34316c77d source_path: concepts/context.md workflow: 15 --- @@ -22,23 +22,23 @@ x-i18n: - **系统提示词**(由 OpenClaw 构建):规则、工具、Skills 列表、时间/运行时信息,以及注入的工作区文件。 - **对话历史**:你在此会话中的消息 + 助手的消息。 -- **工具调用/结果 + 附件**:命令输出、文件读取、图像/音频等。 +- **工具调用/结果 + 附件**:命令输出、文件读取、图片/音频等。 -上下文 _并不等同于_ “记忆”:记忆可以存储在磁盘上并在之后重新加载;上下文则是模型当前窗口中的内容。 +上下文 _不等同于_ “memory”:memory 可以存储到磁盘并在之后重新加载;上下文则是模型当前窗口中的内容。 ## 快速开始(检查上下文) -- `/status` → 快速查看“你的窗口用了多少?”以及会话设置。 -- `/context list` → 查看注入了什么 + 粗略大小(每个文件 + 总计)。 -- `/context detail` → 更深入的明细:每个文件、每个工具 schema 大小、每个 skill 条目大小,以及系统提示词大小。 -- `/usage tokens` → 在普通回复后附加每条回复的用量页脚。 +- `/status` → 快速查看“我的窗口用了多少?”以及会话设置。 +- `/context list` → 查看注入了什么内容 + 大致大小(每个文件 + 总计)。 +- `/context detail` → 更深入的明细:按文件、按工具 schema 大小、按 Skills 条目大小,以及系统提示词大小。 +- `/usage tokens` → 在普通回复后追加每次回复的用量页脚。 - `/compact` → 将较早的历史总结为一条紧凑条目,以释放窗口空间。 -另请参阅:[Slash 命令](/zh-CN/tools/slash-commands)、[Token 使用与成本](/zh-CN/reference/token-use)、[压缩](/zh-CN/concepts/compaction)。 +另请参阅:[Slash commands](/zh-CN/tools/slash-commands)、[Token use & costs](/zh-CN/reference/token-use)、[Compaction](/zh-CN/concepts/compaction)。 ## 示例输出 -具体值会因模型、提供商、工具策略以及你的工作区内容而异。 +数值会因模型、提供商、工具策略以及你的工作区内容而有所不同。 ### `/context list` @@ -90,22 +90,22 @@ Top tools (schema size): - 系统提示词(所有部分)。 - 对话历史。 - 工具调用 + 工具结果。 -- 附件/转录内容(图像/音频/文件)。 +- 附件/转录内容(图片/音频/文件)。 - 压缩摘要和裁剪产物。 -- 提供商“包装层”或隐藏标头(不可见,但仍会计入)。 +- 提供商的“包装层”或隐藏头信息(你看不到,但依然计入)。 ## OpenClaw 如何构建系统提示词 -系统提示词由 **OpenClaw 拥有**,并会在每次运行时重新构建。它包括: +系统提示词 **由 OpenClaw 持有**,并在每次运行时重新构建。它包括: -- 工具列表 + 简短说明。 +- 工具列表 + 简短描述。 - Skills 列表(仅元数据;见下文)。 - 工作区位置。 -- 时间(UTC + 如果已配置则转换后的用户时间)。 -- 运行时元数据(主机/OS/模型/思考设置)。 -- **Project Context** 下已注入的工作区引导文件。 +- 时间(UTC + 如果已配置则包含转换后的用户时间)。 +- 运行时元数据(主机/OS/模型/thinking)。 +- **Project Context** 下的注入工作区 bootstrap 文件。 -完整明细参见:[系统提示词](/zh-CN/concepts/system-prompt)。 +完整细分说明请参阅:[System Prompt](/zh-CN/concepts/system-prompt)。 ## 注入的工作区文件(Project Context) @@ -119,67 +119,61 @@ Top tools (schema size): - `HEARTBEAT.md` - `BOOTSTRAP.md`(仅首次运行) -大文件会按文件使用 `agents.defaults.bootstrapMaxChars`(默认 `20000` 个字符)进行截断。OpenClaw 还会通过 `agents.defaults.bootstrapTotalMaxChars`(默认 `150000` 个字符)对所有文件的总引导注入量设置上限。`/context` 会显示 **原始大小与注入后大小**,以及是否发生了截断。 +大文件会按单文件通过 `agents.defaults.bootstrapMaxChars`(默认 `20000` 字符)进行截断。OpenClaw 还会对跨文件的 bootstrap 注入总量施加总上限 `agents.defaults.bootstrapTotalMaxChars`(默认 `150000` 字符)。`/context` 会显示 **原始大小与注入后大小**,以及是否发生了截断。 -发生截断时,运行时可以在 Project Context 下方注入一个提示词内警告块。可通过 `agents.defaults.bootstrapPromptTruncationWarning` 进行配置(`off`、`once`、`always`;默认 `once`)。 +发生截断时,运行时可以在 Project Context 下方注入一个提示词内警告块。可通过 `agents.defaults.bootstrapPromptTruncationWarning` 配置此行为(`off`、`once`、`always`;默认 `once`)。 -## Skills:默认注入 vs 按需加载 +## Skills:默认注入与按需加载 -系统提示词包含一个精简的 **Skills 列表**(名称 + 描述 + 位置)。这个列表确实会带来开销。 +系统提示词会包含一个紧凑的 **Skills 列表**(名称 + 描述 + 位置)。这个列表本身就有实际开销。 -Skill 指令默认 _不会_ 被包含。模型应仅在需要时通过 `read` 读取该 skill 的 `SKILL.md`。 +Skill 说明 _默认不会_ 被包含。模型应当只在需要时才使用 `read` 去读取该 Skill 的 `SKILL.md`。 -## 工具:有两种成本 +## Tools:有两类成本 -工具会通过两种方式影响上下文: +Tools 会通过两种方式影响上下文: -1. 系统提示词中的 **工具列表文本**(你看到的 “Tooling”)。 -2. **工具 schema**(JSON)。这些内容会发送给模型,以便它调用工具。即使你看不到它们的纯文本形式,它们仍然会计入上下文。 +1. 系统提示词中的 **工具列表文本**(也就是你看到的 “Tooling”)。 +2. **工具 schema**(JSON)。这些内容会发送给模型,以便它可以调用工具。即使你看不到其纯文本形式,它们依然会计入上下文。 -`/context detail` 会拆解最大的工具 schema,以便你查看主要开销来源。 +`/context detail` 会拆分显示最大的工具 schema,这样你就能看出主要开销来自哪里。 ## 命令、指令和“内联快捷方式” -Slash 命令由 Gateway 网关 处理。这里有几种不同的行为: +Slash commands 由 Gateway 网关处理。这里有几种不同的行为: -- **独立命令**:如果一条消息只有 `/...`,它会作为命令执行。 -- **指令**:`/think`、`/verbose`、`/reasoning`、`/elevated`、`/model`、`/queue` 会在模型看到消息之前被剥离。 - - 仅包含指令的消息会持久化会话设置。 +- **独立命令**:如果一条消息只有 `/...`,它会作为命令运行。 +- **指令**:`/think`、`/verbose`、`/trace`、`/reasoning`、`/elevated`、`/model`、`/queue` 会在模型看到消息之前被剥离。 + - 只有指令的消息会持久化会话设置。 - 普通消息中的内联指令会作为单条消息级别的提示。 - **内联快捷方式**(仅限 allowlist 发送者):普通消息中的某些 `/...` token 可以立即执行(例如:“hey /status”),并会在模型看到剩余文本之前被剥离。 -详情参见:[Slash 命令](/zh-CN/tools/slash-commands)。 +详情请参阅:[Slash commands](/zh-CN/tools/slash-commands)。 -## 会话、压缩和裁剪(哪些内容会持久化) +## 会话、压缩与裁剪(哪些内容会持久化) 跨消息持久化哪些内容,取决于具体机制: -- **普通历史** 会持久保留在会话转录中,直到被策略压缩/裁剪。 -- **压缩** 会将摘要持久写入转录,并保留最近的消息不变。 -- **裁剪** 会从某次运行的 _内存中_ 提示词里移除旧的工具结果,但不会重写转录。 +- **普通历史** 会持久保存在会话转录中,直到按策略被压缩/裁剪。 +- **压缩** 会把摘要持久化到转录中,并保留最近的消息。 +- **裁剪** 会从某次运行的 _内存中_ 提示词里移除较旧的工具结果,但不会改写转录。 -文档参见:[会话](/zh-CN/concepts/session)、[压缩](/zh-CN/concepts/compaction)、[会话裁剪](/zh-CN/concepts/session-pruning)。 +文档: [Session](/zh-CN/concepts/session)、[Compaction](/zh-CN/concepts/compaction)、[Session pruning](/zh-CN/concepts/session-pruning)。 -默认情况下,OpenClaw 使用内置的 `legacy` 上下文引擎来进行组装和 -压缩。如果你安装了一个提供 `kind: "context-engine"` 的插件,并通过 -`plugins.slots.contextEngine` 选择它,OpenClaw 就会将上下文组装、`/compact` -以及相关的子智能体上下文生命周期钩子委托给该引擎。`ownsCompaction: false` -不会自动回退到 legacy 引擎;活动引擎仍必须正确实现 `compact()`。完整的 -可插拔接口、生命周期钩子和配置参见 -[Context Engine](/zh-CN/concepts/context-engine)。 +默认情况下,OpenClaw 使用内置的 `legacy` 上下文引擎来进行组装和压缩。如果你安装了一个提供 `kind: "context-engine"` 的插件,并通过 `plugins.slots.contextEngine` 选择它,OpenClaw 就会把上下文组装、`/compact` 以及相关的 subagent 上下文生命周期 hook 委托给该引擎。`ownsCompaction: false` 不会自动回退到 legacy 引擎;当前激活的引擎仍必须正确实现 `compact()`。完整的可插拔接口、生命周期 hook 和配置请参阅 [Context Engine](/zh-CN/concepts/context-engine)。 ## `/context` 实际报告的是什么 -`/context` 在可用时会优先使用最新的 **按运行构建** 的系统提示词报告: +在可用时,`/context` 会优先使用最新的 **运行时已构建** 系统提示词报告: -- `System prompt (run)` = 从上一次嵌入式(支持工具)运行中捕获,并持久保存到会话存储中。 -- `System prompt (estimate)` = 当不存在运行报告时即时计算(或在使用不会生成该报告的 CLI 后端运行时计算)。 +- `System prompt (run)` = 从上一次嵌入式(支持工具)运行中捕获,并持久化在会话存储中。 +- `System prompt (estimate)` = 当不存在运行报告时动态计算得出(或者在使用不会生成该报告的 CLI 后端运行时)。 -无论哪种方式,它报告的都是大小和主要贡献项;它 **不会** 转储完整的系统提示词或工具 schema。 +无论哪种方式,它都会报告大小和主要贡献项;它 **不会** 输出完整的系统提示词或工具 schema。 ## 相关内容 - [Context Engine](/zh-CN/concepts/context-engine) — 通过插件进行自定义上下文注入 -- [压缩](/zh-CN/concepts/compaction) — 总结长对话 -- [系统提示词](/zh-CN/concepts/system-prompt) — 系统提示词的构建方式 -- [智能体循环](/zh-CN/concepts/agent-loop) — 完整的智能体执行周期 +- [Compaction](/zh-CN/concepts/compaction) — 总结长对话 +- [System Prompt](/zh-CN/concepts/system-prompt) — 系统提示词是如何构建的 +- [Agent Loop](/zh-CN/concepts/agent-loop) — 完整的智能体执行循环 diff --git a/docs/zh-CN/gateway/security/index.md b/docs/zh-CN/gateway/security/index.md index 286864e02..d66813ba9 100644 --- a/docs/zh-CN/gateway/security/index.md +++ b/docs/zh-CN/gateway/security/index.md @@ -1,13 +1,13 @@ --- read_when: - - 添加会扩大访问范围或自动化能力的功能 -summary: 运行具有 shell 访问权限的 AI Gateway 网关的安全注意事项和威胁模型 + - 添加会扩大访问范围或自动化程度的功能 +summary: 运行具有 Shell 访问权限的 AI Gateway 网关时的安全注意事项和威胁模型 title: 安全性 x-i18n: - generated_at: "2026-04-10T20:41:21Z" + generated_at: "2026-04-12T18:22:03Z" model: gpt-5.4 provider: openai - source_hash: 770407f64b2ce27221ebd9756b2f8490a249c416064186e64edb663526f9d6b5 + source_hash: 7f3ef693813b696be2e24bcc333c8ee177fa56c3cb06c5fac12a0bd220a29917 source_path: gateway/security/index.md workflow: 15 --- @@ -15,29 +15,29 @@ x-i18n: # 安全性 -**个人助理信任模型:** 本指南假设每个 Gateway 网关对应一个受信任的操作员边界(单用户 / 个人助理模型)。 -OpenClaw **并不是** 用于多个对抗性用户共享同一个智能体 / Gateway 网关时的敌对多租户安全边界。 -如果你需要混合信任或对抗性用户场景,请拆分信任边界(独立的 Gateway 网关 + 凭证,理想情况下还应使用独立的操作系统用户 / 主机)。 +**个人助理信任模型:** 本指南假设每个 Gateway 网关只有一个受信任的操作员边界(单用户 / 个人助理模型)。 +OpenClaw **不是** 用于多个对抗性用户共享同一个智能体 / Gateway 网关时的恶意多租户安全边界。 +如果你需要混合信任或对抗性用户场景,请拆分信任边界(单独的 Gateway 网关 + 凭证,最好还要使用单独的 OS 用户 / 主机)。 -**本页内容:** [信任模型](#scope-first-personal-assistant-security-model) | [快速审计](#quick-check-openclaw-security-audit) | [加固基线](#hardened-baseline-in-60-seconds) | [私信访问模型](#dm-access-model-pairing-allowlist-open-disabled) | [配置加固](#configuration-hardening-examples) | [事件响应](#incident-response) +**本页内容:** [信任模型](#scope-first-personal-assistant-security-model) | [快速审计](#quick-check-openclaw-security-audit) | [强化基线](#hardened-baseline-in-60-seconds) | [私信访问模型](#dm-access-model-pairing-allowlist-open-disabled) | [配置加固](#configuration-hardening-examples) | [事件响应](#incident-response) -## 先明确范围:个人助理安全模型 +## 首先明确范围:个人助理安全模型 -OpenClaw 的安全指南假设的是**个人助理**部署方式:一个受信任的操作员边界,可能包含多个智能体。 +OpenClaw 的安全指南假设你部署的是一个**个人助理**:一个受信任的操作员边界,可能包含多个智能体。 -- 支持的安全姿态:每个 Gateway 网关对应一个用户 / 信任边界(最好每个边界对应一个操作系统用户 / 主机 / VPS)。 -- 不受支持的安全边界:多个彼此不受信任或具有对抗性的用户共享同一个 Gateway 网关 / 智能体。 -- 如果需要对抗性用户隔离,请按信任边界拆分(独立的 Gateway 网关 + 凭证,并且最好使用独立的操作系统用户 / 主机)。 -- 如果多个不受信任的用户都可以向同一个启用了工具的智能体发送消息,应将他们视为共享该智能体的同一组委托工具权限。 +- 支持的安全姿态:每个 Gateway 网关一个用户 / 信任边界(最好每个边界对应一个 OS 用户 / 主机 / VPS)。 +- 不受支持的安全边界:多个彼此不受信任或具有对抗关系的用户共享同一个 Gateway 网关 / 智能体。 +- 如果需要对抗性用户隔离,请按信任边界拆分(单独的 Gateway 网关 + 凭证,最好还要使用单独的 OS 用户 / 主机)。 +- 如果多个不受信任的用户都能向同一个启用了工具的智能体发消息,请把他们视为共享该智能体的同一组委派工具权限。 -本页说明的是**在该模型之内**如何加固。它并不声称可以在同一个共享 Gateway 网关上提供敌对多租户隔离。 +本页说明的是**在该模型内**如何加固。它并不声称单个共享 Gateway 网关可以提供恶意多租户隔离。 ## 快速检查:`openclaw security audit` -另请参阅:[Formal Verification(Security Models)](/zh-CN/security/formal-verification) +另请参阅:[形式化验证(安全模型)](/zh-CN/security/formal-verification) -请定期运行此命令(尤其是在更改配置或暴露网络访问面之后): +请定期运行它(尤其是在修改配置或暴露网络面之后): ```bash openclaw security audit @@ -46,103 +46,103 @@ openclaw security audit --fix openclaw security audit --json ``` -`security audit --fix` 的修复范围刻意保持很窄:它会将常见的开放群组策略切换为 allowlist,恢复 `logging.redactSensitive: "tools"`,收紧状态 / 配置 / include 文件的权限,并且在 Windows 上运行时使用 Windows ACL 重置而不是 POSIX `chmod`。 +`security audit --fix` 的范围被刻意保持很窄:它会把常见的开放群组策略切换为 allowlist,恢复 `logging.redactSensitive: "tools"`,收紧状态 / 配置 / include 文件的权限,并在 Windows 上使用 Windows ACL 重置,而不是 POSIX `chmod`。 -它会标记常见的易踩坑配置(Gateway 网关认证暴露、浏览器控制暴露、高权限 allowlist、文件系统权限、宽松的执行批准,以及开放渠道中的工具暴露)。 +它会标记常见的易踩坑配置(Gateway 网关身份验证暴露、浏览器控制暴露、提升权限的 allowlist、文件系统权限、宽松的 exec 批准,以及开放渠道的工具暴露)。 -OpenClaw 既是一个产品,也是一个实验:你正在把前沿模型行为连接到真实的消息渠道和真实工具上。**不存在“绝对安全”的配置。** 目标是有意识地决定: +OpenClaw 既是一个产品,也是一个实验:你正在把前沿模型行为接到真实的消息渠道和真实工具上。**不存在“绝对安全”的配置。** 目标是有意识地决定: - 谁可以和你的机器人对话 -- 机器人被允许在哪些地方执行操作 -- 机器人可以接触哪些内容 +- 机器人被允许在哪里执行操作 +- 机器人可以接触什么 -从仍然可用的最小权限开始,然后随着信心增加再逐步放宽。 +先从仍然可用的最小访问范围开始,随着信心增加再逐步放宽。 ### 部署与主机信任 -OpenClaw 假定主机和配置边界是受信任的: +OpenClaw 假设主机和配置边界是受信任的: -- 如果有人可以修改 Gateway 网关主机的状态 / 配置(`~/.openclaw`,包括 `openclaw.json`),就应将其视为受信任的操作员。 -- 让多个彼此不受信任 / 具有对抗性的操作员共用一个 Gateway 网关,**不是推荐的部署方式**。 -- 对于混合信任团队,请通过独立的 Gateway 网关(至少也要独立的操作系统用户 / 主机)来拆分信任边界。 -- 推荐默认做法:每台机器 / 主机(或 VPS)一个用户,该用户一个 Gateway 网关,并在该 Gateway 网关中运行一个或多个智能体。 -- 在同一个 Gateway 网关实例内部,经过身份验证的操作员访问属于受信任的控制平面角色,而不是按用户隔离的租户角色。 +- 如果有人可以修改 Gateway 网关主机状态 / 配置(`~/.openclaw`,包括 `openclaw.json`),请把他们视为受信任的操作员。 +- 让多个彼此不受信任 / 具有对抗关系的操作员共用一个 Gateway 网关 **不是推荐配置**。 +- 对于混合信任团队,请使用单独的 Gateway 网关 来拆分信任边界(至少也要使用单独的 OS 用户 / 主机)。 +- 推荐默认做法:每台机器 / 主机(或 VPS)一个用户,该用户一个 Gateway 网关,该 Gateway 网关中可运行一个或多个智能体。 +- 在单个 Gateway 网关实例内部,经过身份验证的操作员访问属于受信任的控制平面角色,而不是按用户区分的租户角色。 - 会话标识符(`sessionKey`、会话 ID、标签)是路由选择器,不是授权令牌。 -- 如果多个人都可以给同一个启用了工具的智能体发送消息,那么他们每个人都可以驱动该智能体使用同一组权限。按用户进行的会话 / 记忆隔离有助于保护隐私,但不会把共享智能体变成按用户划分的主机授权边界。 +- 如果多个人都可以向同一个启用了工具的智能体发消息,那么他们每个人都可以驱动同一组权限。按用户隔离的会话 / Memory 虽然有助于保护隐私,但并不能把共享智能体变成按用户授权的主机权限边界。 ### 共享 Slack 工作区:真实风险 -如果“Slack 里的所有人都可以给机器人发消息”,核心风险是委托工具权限: +如果“Slack 中的所有人都可以给机器人发消息”,核心风险是委派工具权限: -- 任何被允许的发送者都可以在该智能体策略允许的范围内触发工具调用(`exec`、浏览器、网络 / 文件工具); -- 某个发送者的提示 / 内容注入可能导致影响共享状态、设备或输出的操作; -- 如果某个共享智能体拥有敏感凭证 / 文件,那么任何被允许的发送者都可能借助工具使用来驱动数据外泄。 +- 任何被允许的发送者都可以在该智能体的策略范围内诱发工具调用(`exec`、浏览器、网络 / 文件工具); +- 某个发送者的提示 / 内容注入,可能导致影响共享状态、设备或输出的操作; +- 如果某个共享智能体拥有敏感凭证 / 文件,那么任何被允许的发送者都可能通过工具使用驱动数据外泄。 -团队工作流请使用最小工具集的独立智能体 / Gateway 网关;包含个人数据的智能体应保持私有。 +对团队工作流,请使用工具最少化的单独智能体 / Gateway 网关;保存个人数据的智能体应保持私有。 ### 公司共享智能体:可接受模式 -当使用该智能体的所有人都处于同一个信任边界内(例如同一个公司团队),并且该智能体被严格限制在业务范围内时,这是一种可接受的模式。 +当使用该智能体的所有人都位于同一信任边界内(例如同一个公司团队),并且该智能体严格限定在业务范围内时,这是可以接受的。 -- 在专用机器 / VM / 容器上运行它; -- 为该运行时使用专用的操作系统用户 + 专用的浏览器 / 配置文件 / 账号; -- 不要让该运行时登录个人 Apple / Google 账号,也不要使用个人密码管理器 / 浏览器配置文件。 +- 在专用机器 / VM / 容器中运行它; +- 为该运行时使用专用的 OS 用户 + 专用的浏览器 / 配置文件 / 账号; +- 不要让该运行时登录个人 Apple / Google 账号,或个人密码管理器 / 浏览器配置文件。 -如果你在同一个运行时中混用个人身份和公司身份,那么你就打破了这种隔离,并增加了个人数据暴露风险。 +如果你在同一个运行时中混用个人身份与公司身份,就会打破这种隔离,并增加个人数据暴露风险。 -## Gateway 网关与节点信任概念 +## Gateway 网关与节点的信任概念 请将 Gateway 网关和节点视为同一个操作员信任域中的不同角色: -- **Gateway 网关** 是控制平面和策略面(`gateway.auth`、工具策略、路由)。 +- **Gateway 网关** 是控制平面和策略层(`gateway.auth`、工具策略、路由)。 - **节点** 是与该 Gateway 网关配对的远程执行面(命令、设备操作、主机本地能力)。 -- 通过 Gateway 网关认证的调用方,在 Gateway 网关范围内被视为受信任。完成配对后,节点操作被视为该节点上的受信任操作员行为。 -- `sessionKey` 是路由 / 上下文选择键,不是按用户划分的认证机制。 -- 执行批准(allowlist + 询问)是用于约束操作员意图的护栏,不是敌对多租户隔离机制。 -- OpenClaw 针对受信任的单操作员场景,其产品默认行为是在 `gateway` / `node` 上允许主机执行而不弹出批准提示(`security="full"`、`ask="off"`,除非你主动收紧)。这个默认值是有意的用户体验设计,本身并不是漏洞。 -- 执行批准会绑定精确的请求上下文以及尽力识别的直接本地文件操作数;它们不会对每一种运行时 / 解释器加载路径进行语义建模。如果你需要强边界,请使用沙箱隔离和主机隔离。 +- 通过 Gateway 网关身份验证的调用方,在 Gateway 网关范围内是受信任的。完成配对后,节点操作就属于该节点上的受信任操作员行为。 +- `sessionKey` 是路由 / 上下文选择,不是按用户划分的身份验证。 +- Exec 批准(allowlist + 询问)是为了约束操作员意图的护栏,而不是恶意多租户隔离。 +- OpenClaw 针对受信任单操作员场景的产品默认值,是允许在 `gateway` / `node` 上直接执行主机命令而不弹出批准提示(`security="full"`、`ask="off"`,除非你主动收紧)。这是有意为之的 UX 默认值,本身并不是漏洞。 +- Exec 批准会绑定精确的请求上下文,以及尽力识别的直接本地文件操作数;它不会对所有运行时 / 解释器加载路径进行语义建模。如果你需要强边界,请使用沙箱隔离和主机级隔离。 -如果你需要敌对用户隔离,请按操作系统用户 / 主机拆分信任边界,并运行独立的 Gateway 网关。 +如果你需要恶意用户隔离,请按 OS 用户 / 主机拆分信任边界,并运行单独的 Gateway 网关。 ## 信任边界矩阵 -在分析风险时,可以把它当作一个快速模型: +在进行风险分级时,可将其作为快速模型: -| 边界或控制项 | 含义 | 常见误解 | -| --- | --- | --- | -| `gateway.auth`(令牌 / 密码 / trusted-proxy / 设备认证) | 对 Gateway 网关 API 的调用方进行认证 | “要安全,就必须给每一帧消息都加上逐条签名” | -| `sessionKey` | 用于上下文 / 会话选择的路由键 | “会话键就是用户认证边界” | -| 提示 / 内容护栏 | 降低模型被滥用的风险 | “仅凭提示注入就能证明认证绕过” | -| `canvas.eval` / 浏览器 evaluate | 启用后属于有意暴露给操作员的能力 | “任何 JS eval 原语在这个信任模型下都自动算漏洞” | +| 边界或控制项 | 它的含义 | 常见误解 | +| --------------------------------------------------------- | ------------------------------------------------- | ----------------------------------------------------------------------------- | +| `gateway.auth`(token / password / trusted-proxy / device auth) | 对 Gateway 网关 API 的调用方进行身份验证 | “要安全,就必须对每一帧消息都做签名” | +| `sessionKey` | 用于上下文 / 会话选择的路由键 | “会话 key 是用户身份验证边界” | +| 提示 / 内容护栏 | 降低模型被滥用的风险 | “仅凭提示注入就能证明身份验证被绕过” | +| `canvas.eval` / 浏览器 evaluate | 启用时属于有意提供给操作员的能力 | “任何 JS eval 原语在这个信任模型里都会自动构成漏洞” | | 本地 TUI `!` shell | 由操作员显式触发的本地执行 | “本地 shell 便捷命令就是远程注入” | -| 节点配对和节点命令 | 在已配对设备上的操作员级远程执行 | “远程设备控制默认就应该被视为不受信任的用户访问” | +| 节点配对与节点命令 | 对已配对设备进行操作员级远程执行 | “远程设备控制默认应视为不受信任用户访问” | ## 按设计不属于漏洞的情况 -以下模式很常被报告,但通常都会以无需处理结案,除非能证明存在真实的边界绕过: +以下模式经常被报告,但通常会以无需处理关闭,除非能证明存在真实的边界绕过: -- 只有提示注入链,而没有策略 / 认证 / 沙箱绕过。 -- 假设在同一共享主机 / 配置上存在敌对多租户运行。 -- 将普通操作员读取路径访问(例如 `sessions.list` / `sessions.preview` / `chat.history`)在共享 Gateway 网关场景中归类为 IDOR 的说法。 -- 仅限 localhost 部署的发现(例如仅 loopback 的 Gateway 网关上缺少 HSTS)。 -- 针对本仓库中并不存在的入站路径所提出的 Discord 入站 webhook 签名问题。 -- 将节点配对元数据当作 `system.run` 的隐藏第二层逐命令批准机制,而实际执行边界仍然是 Gateway 网关的全局节点命令策略加上节点自身的执行批准。 -- 将 `sessionKey` 视为认证令牌而提出的“缺少按用户授权”问题。 +- 仅有提示注入链,而没有策略 / 身份验证 / 沙箱绕过。 +- 假设在单一共享主机 / 配置上存在恶意多租户运行的主张。 +- 把正常的操作员读取路径访问(例如 `sessions.list` / `sessions.preview` / `chat.history`)在共享 Gateway 网关场景下归类为 IDOR 的说法。 +- 仅限 localhost 的部署问题(例如仅 loopback Gateway 网关上的 HSTS)。 +- 针对本仓库中并不存在的入站路径而提出的 Discord 入站 webhook 签名问题。 +- 把节点配对元数据视为 `system.run` 的隐藏第二层逐命令批准机制的报告,而实际执行边界仍然是 Gateway 网关的全局节点命令策略加上节点自身的 exec 批准。 +- 把 `sessionKey` 当作身份验证令牌,并据此提出“缺少按用户授权”的发现。 -## 研究人员预检清单 +## 研究人员预检查清单 -在提交 GHSA 之前,请先验证以下所有事项: +在提交 GHSA 之前,请确认以下所有事项: -1. 复现问题在最新 `main` 或最新发布版本上仍然成立。 -2. 报告中包含精确的代码路径(`file`、函数、行范围)以及测试所用版本 / commit。 -3. 影响必须跨越一个有文档说明的信任边界(而不只是提示注入)。 -4. 该主张不在 [Out of Scope](https://github.com/openclaw/openclaw/blob/main/SECURITY.md#out-of-scope) 列表中。 -5. 已检查现有安全通告是否重复(适用时应复用规范的 GHSA)。 -6. 已明确部署假设(loopback / 本地还是对外暴露,受信任还是不受信任的操作员)。 +1. 在最新 `main` 或最新发布版本上仍可复现。 +2. 报告包含精确的代码路径(`file`、函数、行范围)以及已测试的版本 / commit。 +3. 影响跨越了某个文档化的信任边界(而不只是提示注入)。 +4. 该主张未列在 [Out of Scope](https://github.com/openclaw/openclaw/blob/main/SECURITY.md#out-of-scope) 中。 +5. 已检查现有安全通告是否重复(适用时复用规范的 GHSA)。 +6. 已明确部署假设(loopback / 本地 还是对外暴露,受信任操作员还是不受信任操作员)。 -## 60 秒完成加固基线 +## 在 60 秒内建立强化基线 -先使用这个基线,然后再针对每个受信任的智能体选择性重新启用工具: +先使用这套基线,然后再按受信任智能体逐项重新启用工具: ```json5 { @@ -167,209 +167,205 @@ OpenClaw 假定主机和配置边界是受信任的: } ``` -这会让 Gateway 网关仅限本地访问、隔离私信,并默认禁用控制平面 / 运行时工具。 +这样会将 Gateway 网关保持为仅本地可访问,隔离私信,并默认禁用控制平面 / 运行时工具。 ## 共享收件箱快速规则 -如果不止一个人可以给你的机器人发送私信: +如果有多个人可以给你的机器人发私信: -- 设置 `session.dmScope: "per-channel-peer"`(对于多账号渠道,则使用 `"per-account-channel-peer"`)。 +- 设置 `session.dmScope: "per-channel-peer"`(多账号渠道则用 `"per-account-channel-peer"`)。 - 保持 `dmPolicy: "pairing"` 或使用严格的 allowlist。 -- 绝不要把共享私信和广泛的工具访问权限组合在一起。 -- 这可以加固协作式 / 共享收件箱场景,但并不是为在用户共享主机 / 配置写权限时实现敌对共租户隔离而设计的。 +- 绝不要把共享私信和宽泛的工具访问结合起来。 +- 这可以加固协作式 / 共享收件箱,但当用户共享主机 / 配置写权限时,它并不是为恶意共租户隔离而设计的。 ## 上下文可见性模型 OpenClaw 区分两个概念: -- **触发授权**:谁可以触发智能体(`dmPolicy`、`groupPolicy`、allowlist、提及门槛)。 -- **上下文可见性**:哪些补充上下文会被注入到模型输入中(回复正文、引用文本、线程历史、转发元数据)。 +- **触发授权**:谁可以触发智能体(`dmPolicy`、`groupPolicy`、allowlist、提及门控)。 +- **上下文可见性**:哪些补充上下文会被注入模型输入(回复正文、引用文本、线程历史、转发元数据)。 -Allowlists 控制触发和命令授权。`contextVisibility` 设置则控制补充上下文(引用回复、线程根消息、已获取的历史记录)如何被过滤: +Allowlists 用于控制触发和命令授权。`contextVisibility` 设置控制补充上下文(引用回复、线程根消息、拉取的历史记录)的过滤方式: -- `contextVisibility: "all"`(默认)保留接收到的全部补充上下文。 +- `contextVisibility: "all"`(默认)会按接收到的内容保留全部补充上下文。 - `contextVisibility: "allowlist"` 会将补充上下文过滤为仅包含通过当前 allowlist 检查的发送者内容。 -- `contextVisibility: "allowlist_quote"` 的行为与 `allowlist` 类似,但仍会保留一条显式引用的回复。 +- `contextVisibility: "allowlist_quote"` 的行为类似 `allowlist`,但仍保留一条显式引用的回复。 -你可以按渠道,或按房间 / 会话分别设置 `contextVisibility`。配置详情参见 [群聊](/zh-CN/channels/groups#context-visibility-and-allowlists)。 +你可以按渠道或按房间 / 会话设置 `contextVisibility`。具体配置细节请参阅 [群聊](/zh-CN/channels/groups#context-visibility-and-allowlists)。 -安全通告分诊指导: +安全通告分级指南: -- 仅仅证明“模型可以看到来自未列入 allowlist 的发送者的引用文本或历史文本”的主张,属于可通过 `contextVisibility` 解决的加固问题,本身并不构成认证或沙箱边界绕过。 -- 若要产生安全影响,报告仍然需要展示一个明确的信任边界绕过(认证、策略、沙箱、批准流程,或其他有文档说明的边界)。 +- 如果报告只展示了“模型可以看到来自未列入 allowlist 的发送者的引用或历史文本”,这属于可通过 `contextVisibility` 处理的加固问题,而不是身份验证或沙箱边界绕过本身。 +- 要构成安全影响,报告仍然需要证明跨越了某个信任边界(身份验证、策略、沙箱、批准机制,或其他文档化边界)。 -## 审计会检查什么(高层概览) +## 审计会检查什么(高层级) - **入站访问**(私信策略、群组策略、allowlist):陌生人是否可以触发机器人? -- **工具影响半径**(高权限工具 + 开放房间):提示注入是否可能演变为 shell / 文件 / 网络操作? -- **执行批准漂移**(`security=full`、`autoAllowSkills`、未启用 `strictInlineEval` 的解释器 allowlist):主机执行护栏是否仍然如你所想那样生效? - - `security="full"` 是一种宽泛的姿态警告,不代表已经证明存在漏洞。它是为受信任的个人助理场景选择的默认值;只有当你的威胁模型需要批准或 allowlist 护栏时,才应将其收紧。 -- **网络暴露**(Gateway 网关 bind / auth、Tailscale Serve / Funnel、弱或过短的认证令牌)。 +- **工具爆炸半径**(提升权限工具 + 开放房间):提示注入是否可能演变为 Shell / 文件 / 网络操作? +- **Exec 批准漂移**(`security=full`、`autoAllowSkills`、未启用 `strictInlineEval` 的解释器 allowlist):主机 exec 护栏是否仍然按你的预期工作? + - `security="full"` 是一种广义姿态警告,并不等于证明存在漏洞。它是受信任个人助理场景下有意选择的默认值;只有当你的威胁模型确实需要批准或 allowlist 护栏时,才需要收紧它。 +- **网络暴露**(Gateway 网关 bind / auth、Tailscale Serve / Funnel、弱或过短的身份验证 token)。 - **浏览器控制暴露**(远程节点、中继端口、远程 CDP 端点)。 -- **本地磁盘卫生**(权限、符号链接、配置 include、 “同步文件夹” 路径)。 -- **插件**(存在未经过显式 allowlist 的扩展)。 -- **策略漂移 / 配置错误**(配置了 sandbox docker 设置但沙箱模式关闭;无效的 `gateway.nodes.denyCommands` 模式,因为匹配只针对精确命令名进行,例如 `system.run`,不会检查 shell 文本;危险的 `gateway.nodes.allowCommands` 条目;全局 `tools.profile="minimal"` 被按智能体的 profile 覆盖;在宽松工具策略下可访问的扩展插件工具)。 -- **运行时期望漂移**(例如,错误地认为隐式 exec 仍然表示 `sandbox`,而实际上 `tools.exec.host` 现在默认是 `auto`;或者显式设置 `tools.exec.host="sandbox"`,但沙箱模式已关闭)。 -- **模型卫生**(当配置的模型看起来比较陈旧时发出警告;不是硬性阻止)。 +- **本地磁盘卫生**(权限、符号链接、配置 includes、“同步文件夹”路径)。 +- **插件**(存在扩展,但没有显式 allowlist)。 +- **策略漂移 / 配置错误**(已配置 sandbox docker 设置但沙箱模式关闭;无效的 `gateway.nodes.denyCommands` 模式,因为匹配仅针对精确命令名(例如 `system.run`),不会检查 Shell 文本;危险的 `gateway.nodes.allowCommands` 条目;全局 `tools.profile="minimal"` 被按智能体配置覆盖;在宽松工具策略下仍可访问扩展插件工具)。 +- **运行时期望漂移**(例如误以为隐式 exec 仍表示 `sandbox`,而 `tools.exec.host` 现在默认是 `auto`;或者显式设置 `tools.exec.host="sandbox"`,但沙箱模式实际上已关闭)。 +- **模型卫生**(当已配置模型看起来像旧模型时发出警告;不是硬性阻断)。 -如果你运行 `--deep`,OpenClaw 还会尽力尝试进行一次实时 Gateway 网关探测。 +如果你运行 `--deep`,OpenClaw 还会尽力尝试进行实时 Gateway 网关探测。 ## 凭证存储映射 -在审计访问权限或决定备份哪些内容时,可使用此映射: +在审计访问范围或决定备份内容时,可以参考这一节: - **WhatsApp**:`~/.openclaw/credentials/whatsapp//creds.json` -- **Telegram 机器人令牌**:配置 / 环境变量,或 `channels.telegram.tokenFile`(仅接受常规文件;拒绝符号链接) -- **Discord 机器人令牌**:配置 / 环境变量,或 SecretRef(env / file / exec 提供商) -- **Slack 令牌**:配置 / 环境变量(`channels.slack.*`) +- **Telegram 机器人 token**:配置 / 环境变量,或 `channels.telegram.tokenFile`(仅接受常规文件;拒绝符号链接) +- **Discord 机器人 token**:配置 / 环境变量,或 SecretRef(env / file / exec providers) +- **Slack tokens**:配置 / 环境变量(`channels.slack.*`) - **配对 allowlist**: - `~/.openclaw/credentials/-allowFrom.json`(默认账号) - `~/.openclaw/credentials/--allowFrom.json`(非默认账号) -- **模型认证配置文件**:`~/.openclaw/agents//agent/auth-profiles.json` -- **基于文件的密钥载荷(可选)**:`~/.openclaw/secrets.json` +- **模型 auth 配置文件**:`~/.openclaw/agents//agent/auth-profiles.json` +- **基于文件的 secrets 负载(可选)**:`~/.openclaw/secrets.json` - **旧版 OAuth 导入**:`~/.openclaw/credentials/oauth.json` -## 安全审计检查清单 +## 安全审计清单 -当审计输出发现项时,请按以下优先级顺序处理: +当审计输出发现项时,请按以下优先顺序处理: -1. **任何“开放” + 已启用工具**:先锁定私信 / 群组(配对 / allowlist),再收紧工具策略 / 沙箱隔离。 -2. **公共网络暴露**(LAN bind、Funnel、缺少认证):立即修复。 -3. **浏览器控制的远程暴露**:将其视为操作员访问处理(仅 tailnet、谨慎配对节点、避免公开暴露)。 -4. **权限**:确保状态 / 配置 / 凭证 / 认证内容不可被组用户或所有用户读取。 +1. **任何“开放”且启用了工具的配置**:先锁定私信 / 群组(pairing / allowlist),然后收紧工具策略 / 沙箱隔离。 +2. **公共网络暴露**(LAN bind、Funnel、缺少身份验证):立即修复。 +3. **浏览器控制的远程暴露**:将其视为操作员级访问(仅 tailnet、审慎配对节点、避免公开暴露)。 +4. **权限**:确保状态 / 配置 / 凭证 / auth 文件对组用户或所有人都不可读。 5. **插件 / 扩展**:只加载你明确信任的内容。 -6. **模型选择**:对于任何启用了工具的机器人,优先使用现代、具备更强指令加固能力的模型。 +6. **模型选择**:对于任何启用了工具的机器人,优先使用现代、具备更强指令防护能力的模型。 ## 安全审计术语表 -在真实部署中你最可能看到的高信号 `checkId` 值如下(并非完整列表): +你在真实部署中最可能看到的一些高信号 `checkId` 值如下(并非完整列表): -| `checkId` | 严重性 | 重要原因 | 主要修复键 / 路径 | 自动修复 | -| --- | --- | --- | --- | --- | -| `fs.state_dir.perms_world_writable` | critical | 其他用户 / 进程可以修改整个 OpenClaw 状态 | `~/.openclaw` 的文件系统权限 | 是 | -| `fs.state_dir.perms_group_writable` | warn | 同组用户可以修改整个 OpenClaw 状态 | `~/.openclaw` 的文件系统权限 | 是 | -| `fs.state_dir.perms_readable` | warn | 状态目录可被其他人读取 | `~/.openclaw` 的文件系统权限 | 是 | -| `fs.state_dir.symlink` | warn | 状态目录目标变成了另一个信任边界 | 状态目录文件系统布局 | 否 | -| `fs.config.perms_writable` | critical | 其他人可以更改认证 / 工具策略 / 配置 | `~/.openclaw/openclaw.json` 的文件系统权限 | 是 | -| `fs.config.symlink` | warn | 配置文件目标变成了另一个信任边界 | 配置文件文件系统布局 | 否 | -| `fs.config.perms_group_readable` | warn | 同组用户可以读取配置中的令牌 / 设置 | 配置文件的文件系统权限 | 是 | -| `fs.config.perms_world_readable` | critical | 配置可能泄露令牌 / 设置 | 配置文件的文件系统权限 | 是 | -| `fs.config_include.perms_writable` | critical | 配置 include 文件可被其他人修改 | 从 `openclaw.json` 引用的 include 文件权限 | 是 | -| `fs.config_include.perms_group_readable` | warn | 同组用户可以读取被包含的密钥 / 设置 | 从 `openclaw.json` 引用的 include 文件权限 | 是 | -| `fs.config_include.perms_world_readable` | critical | 被包含的密钥 / 设置对所有人可读 | 从 `openclaw.json` 引用的 include 文件权限 | 是 | -| `fs.auth_profiles.perms_writable` | critical | 其他人可以注入或替换已存储的模型凭证 | `agents//agent/auth-profiles.json` 的权限 | 是 | -| `fs.auth_profiles.perms_readable` | warn | 其他人可以读取 API 密钥和 OAuth 令牌 | `agents//agent/auth-profiles.json` 的权限 | 是 | -| `fs.credentials_dir.perms_writable` | critical | 其他人可以修改渠道配对 / 凭证状态 | `~/.openclaw/credentials` 的文件系统权限 | 是 | -| `fs.credentials_dir.perms_readable` | warn | 其他人可以读取渠道凭证状态 | `~/.openclaw/credentials` 的文件系统权限 | 是 | -| `fs.sessions_store.perms_readable` | warn | 其他人可以读取会话转录 / 元数据 | 会话存储权限 | 是 | -| `fs.log_file.perms_readable` | warn | 其他人可以读取虽已脱敏但仍然敏感的日志 | Gateway 网关日志文件权限 | 是 | -| `fs.synced_dir` | warn | 将状态 / 配置放在 iCloud / Dropbox / Drive 中会扩大令牌 / 转录暴露范围 | 将配置 / 状态移出同步文件夹 | 否 | -| `gateway.bind_no_auth` | critical | 远程 bind 且没有共享密钥 | `gateway.bind`、`gateway.auth.*` | 否 | -| `gateway.loopback_no_auth` | critical | 经反向代理暴露的 loopback 可能变成未认证访问 | `gateway.auth.*`、代理设置 | 否 | -| `gateway.trusted_proxies_missing` | warn | 存在反向代理头,但未配置为受信任代理 | `gateway.trustedProxies` | 否 | -| `gateway.http.no_auth` | warn/critical | 使用 `auth.mode="none"` 时 Gateway 网关 HTTP API 可被访问 | `gateway.auth.mode`、`gateway.http.endpoints.*` | 否 | -| `gateway.http.session_key_override_enabled` | info | HTTP API 调用方可以覆盖 `sessionKey` | `gateway.http.allowSessionKeyOverride` | 否 | -| `gateway.tools_invoke_http.dangerous_allow` | warn/critical | 通过 HTTP API 重新启用了危险工具 | `gateway.tools.allow` | 否 | -| `gateway.nodes.allow_commands_dangerous` | warn/critical | 启用了高影响节点命令(摄像头 / 屏幕 / 联系人 / 日历 / 短信) | `gateway.nodes.allowCommands` | 否 | -| `gateway.nodes.deny_commands_ineffective` | warn | 类似模式的拒绝条目无法匹配 shell 文本或命令组 | `gateway.nodes.denyCommands` | 否 | -| `gateway.tailscale_funnel` | critical | 暴露到公共互联网 | `gateway.tailscale.mode` | 否 | -| `gateway.tailscale_serve` | info | 已通过 Serve 启用 tailnet 暴露 | `gateway.tailscale.mode` | 否 | -| `gateway.control_ui.allowed_origins_required` | critical | 非 loopback 的控制 UI 未显式配置浏览器来源 allowlist | `gateway.controlUi.allowedOrigins` | 否 | -| `gateway.control_ui.allowed_origins_wildcard` | warn/critical | `allowedOrigins=["*"]` 会禁用浏览器来源 allowlist | `gateway.controlUi.allowedOrigins` | 否 | -| `gateway.control_ui.host_header_origin_fallback` | warn/critical | 启用 Host 头来源回退(降低 DNS rebinding 加固强度) | `gateway.controlUi.dangerouslyAllowHostHeaderOriginFallback` | 否 | -| `gateway.control_ui.insecure_auth` | warn | 启用了不安全认证兼容开关 | `gateway.controlUi.allowInsecureAuth` | 否 | -| `gateway.control_ui.device_auth_disabled` | critical | 禁用了设备身份校验 | `gateway.controlUi.dangerouslyDisableDeviceAuth` | 否 | -| `gateway.real_ip_fallback_enabled` | warn/critical | 信任 `X-Real-IP` 回退可能因代理配置错误导致源 IP 伪造 | `gateway.allowRealIpFallback`、`gateway.trustedProxies` | 否 | -| `gateway.token_too_short` | warn | 过短的共享令牌更容易被暴力破解 | `gateway.auth.token` | 否 | -| `gateway.auth_no_rate_limit` | warn | 暴露的认证端点如果没有速率限制,会增加暴力破解风险 | `gateway.auth.rateLimit` | 否 | -| `gateway.trusted_proxy_auth` | critical | 代理身份现在成为认证边界 | `gateway.auth.mode="trusted-proxy"` | 否 | -| `gateway.trusted_proxy_no_proxies` | critical | 使用 trusted-proxy 认证但未配置受信任代理 IP,不安全 | `gateway.trustedProxies` | 否 | -| `gateway.trusted_proxy_no_user_header` | critical | trusted-proxy 认证无法安全解析用户身份 | `gateway.auth.trustedProxy.userHeader` | 否 | -| `gateway.trusted_proxy_no_allowlist` | warn | trusted-proxy 认证会接受任何已通过上游认证的用户 | `gateway.auth.trustedProxy.allowUsers` | 否 | -| `checkId` | 严重性 | 重要原因 | 主要修复键 / 路径 | 自动修复 | -| --- | --- | --- | --- | --- | -| `gateway.probe_auth_secretref_unavailable` | warn | 深度探测无法在当前命令路径中解析认证 SecretRef | 深度探测认证来源 / SecretRef 可用性 | 否 | -| `gateway.probe_failed` | warn/critical | 实时 Gateway 网关探测失败 | Gateway 网关可达性 / 认证 | 否 | -| `discovery.mdns_full_mode` | warn/critical | mDNS 完整模式会在本地网络上广播 `cliPath` / `sshPort` 元数据 | `discovery.mdns.mode`、`gateway.bind` | 否 | -| `config.insecure_or_dangerous_flags` | warn | 启用了不安全 / 危险的调试标志 | 多个键(见发现详情) | 否 | -| `config.secrets.gateway_password_in_config` | warn | Gateway 网关密码直接存储在配置中 | `gateway.auth.password` | 否 | -| `config.secrets.hooks_token_in_config` | warn | Hook bearer 令牌直接存储在配置中 | `hooks.token` | 否 | -| `hooks.token_reuse_gateway_token` | critical | Hook 入站令牌同时也可用于 Gateway 网关认证 | `hooks.token`、`gateway.auth.token` | 否 | -| `hooks.token_too_short` | warn | Hook 入站更容易被暴力破解 | `hooks.token` | 否 | -| `hooks.default_session_key_unset` | warn | Hook 智能体运行时会扇出到按请求生成的会话中 | `hooks.defaultSessionKey` | 否 | -| `hooks.allowed_agent_ids_unrestricted` | warn/critical | 已认证的 Hook 调用方可以路由到任意已配置智能体 | `hooks.allowedAgentIds` | 否 | -| `hooks.request_session_key_enabled` | warn/critical | 外部调用方可以选择 `sessionKey` | `hooks.allowRequestSessionKey` | 否 | -| `hooks.request_session_key_prefixes_missing` | warn/critical | 外部会话键格式没有边界限制 | `hooks.allowedSessionKeyPrefixes` | 否 | -| `hooks.path_root` | critical | Hook 路径是 `/`,使入站流量更容易发生冲突或误路由 | `hooks.path` | 否 | -| `hooks.installs_unpinned_npm_specs` | warn | Hook 安装记录未固定到不可变的 npm 规范 | Hook 安装元数据 | 否 | -| `hooks.installs_missing_integrity` | warn | Hook 安装记录缺少完整性元数据 | Hook 安装元数据 | 否 | -| `hooks.installs_version_drift` | warn | Hook 安装记录与已安装包发生漂移 | Hook 安装元数据 | 否 | -| `logging.redact_off` | warn | 敏感值会泄露到日志 / 状态输出中 | `logging.redactSensitive` | 是 | -| `browser.control_invalid_config` | warn | 浏览器控制配置在运行前就是无效的 | `browser.*` | 否 | -| `browser.control_no_auth` | critical | 浏览器控制在没有令牌 / 密码认证的情况下暴露 | `gateway.auth.*` | 否 | -| `browser.remote_cdp_http` | warn | 通过纯 HTTP 访问远程 CDP 缺少传输加密 | 浏览器配置文件 `cdpUrl` | 否 | -| `browser.remote_cdp_private_host` | warn | 远程 CDP 指向私有 / 内部主机 | 浏览器配置文件 `cdpUrl`、`browser.ssrfPolicy.*` | 否 | -| `sandbox.docker_config_mode_off` | warn | 已存在 sandbox Docker 配置,但当前未启用 | `agents.*.sandbox.mode` | 否 | -| `sandbox.bind_mount_non_absolute` | warn | 相对 bind mount 可能以不可预测的方式解析 | `agents.*.sandbox.docker.binds[]` | 否 | -| `sandbox.dangerous_bind_mount` | critical | sandbox bind mount 目标指向被阻止的系统、凭证或 Docker socket 路径 | `agents.*.sandbox.docker.binds[]` | 否 | -| `sandbox.dangerous_network_mode` | critical | sandbox Docker 网络使用 `host` 或 `container:*` 这类命名空间合并模式 | `agents.*.sandbox.docker.network` | 否 | -| `sandbox.dangerous_seccomp_profile` | critical | sandbox seccomp 配置会削弱容器隔离 | `agents.*.sandbox.docker.securityOpt` | 否 | -| `sandbox.dangerous_apparmor_profile` | critical | sandbox AppArmor 配置会削弱容器隔离 | `agents.*.sandbox.docker.securityOpt` | 否 | -| `sandbox.browser_cdp_bridge_unrestricted` | warn | sandbox 浏览器桥未限制来源地址范围即对外暴露 | `sandbox.browser.cdpSourceRange` | 否 | -| `sandbox.browser_container.non_loopback_publish` | critical | 现有浏览器容器在非 loopback 接口上发布了 CDP | 浏览器沙箱容器发布配置 | 否 | -| `sandbox.browser_container.hash_label_missing` | warn | 现有浏览器容器早于当前配置哈希标签机制创建 | `openclaw sandbox recreate --browser --all` | 否 | -| `sandbox.browser_container.hash_epoch_stale` | warn | 现有浏览器容器早于当前浏览器配置 epoch 创建 | `openclaw sandbox recreate --browser --all` | 否 | -| `tools.exec.host_sandbox_no_sandbox_defaults` | warn | 当沙箱关闭时,`exec host=sandbox` 会以关闭方式失败 | `tools.exec.host`、`agents.defaults.sandbox.mode` | 否 | -| `tools.exec.host_sandbox_no_sandbox_agents` | warn | 当沙箱关闭时,按智能体配置的 `exec host=sandbox` 会以关闭方式失败 | `agents.list[].tools.exec.host`、`agents.list[].sandbox.mode` | 否 | -| `tools.exec.security_full_configured` | warn/critical | 主机 exec 正在使用 `security="full"` 运行 | `tools.exec.security`、`agents.list[].tools.exec.security` | 否 | -| `tools.exec.auto_allow_skills_enabled` | warn | exec 批准会隐式信任 skill 二进制文件 | `~/.openclaw/exec-approvals.json` | 否 | -| `tools.exec.allowlist_interpreter_without_strict_inline_eval` | warn | 解释器 allowlist 允许 inline eval,且不会强制重新批准 | `tools.exec.strictInlineEval`、`agents.list[].tools.exec.strictInlineEval`、exec 批准 allowlist | 否 | -| `tools.exec.safe_bins_interpreter_unprofiled` | warn | `safeBins` 中的解释器 / 运行时二进制如果没有显式 profile,会扩大 exec 风险 | `tools.exec.safeBins`、`tools.exec.safeBinProfiles`、`agents.list[].tools.exec.*` | 否 | -| `tools.exec.safe_bins_broad_behavior` | warn | `safeBins` 中行为范围过宽的工具会削弱低风险 stdin 过滤信任模型 | `tools.exec.safeBins`、`agents.list[].tools.exec.safeBins` | 否 | -| `tools.exec.safe_bin_trusted_dirs_risky` | warn | `safeBinTrustedDirs` 包含可变或高风险目录 | `tools.exec.safeBinTrustedDirs`、`agents.list[].tools.exec.safeBinTrustedDirs` | 否 | -| `skills.workspace.symlink_escape` | warn | 工作区 `skills/**/SKILL.md` 解析到了工作区根目录之外(符号链接链漂移) | 工作区 `skills/**` 文件系统状态 | 否 | -| `plugins.extensions_no_allowlist` | warn | 已安装扩展,但没有显式插件 allowlist | `plugins.allowlist` | 否 | -| `plugins.installs_unpinned_npm_specs` | warn | 插件安装记录未固定到不可变的 npm 规范 | 插件安装元数据 | 否 | -| `checkId` | 严重性 | 重要原因 | 主要修复键 / 路径 | 自动修复 | -| --- | --- | --- | --- | --- | -| `plugins.installs_missing_integrity` | warn | 插件安装记录缺少完整性元数据 | 插件安装元数据 | 否 | -| `plugins.installs_version_drift` | warn | 插件安装记录与已安装包发生漂移 | 插件安装元数据 | 否 | -| `plugins.code_safety` | warn/critical | 插件代码扫描发现可疑或危险模式 | 插件代码 / 安装来源 | 否 | -| `plugins.code_safety.entry_path` | warn | 插件入口路径指向隐藏目录或 `node_modules` 位置 | 插件清单 `entry` | 否 | -| `plugins.code_safety.entry_escape` | critical | 插件入口逃逸出插件目录 | 插件清单 `entry` | 否 | -| `plugins.code_safety.scan_failed` | warn | 插件代码扫描未能完成 | 插件扩展路径 / 扫描环境 | 否 | -| `skills.code_safety` | warn/critical | Skill 安装器元数据 / 代码包含可疑或危险模式 | skill 安装来源 | 否 | -| `skills.code_safety.scan_failed` | warn | Skill 代码扫描未能完成 | skill 扫描环境 | 否 | -| `security.exposure.open_channels_with_exec` | warn/critical | 共享 / 公开房间可以访问启用了 exec 的智能体 | `channels.*.dmPolicy`、`channels.*.groupPolicy`、`tools.exec.*`、`agents.list[].tools.exec.*` | 否 | -| `security.exposure.open_groups_with_elevated` | critical | 开放群组 + 高权限工具会形成高影响提示注入路径 | `channels.*.groupPolicy`、`tools.elevated.*` | 否 | -| `security.exposure.open_groups_with_runtime_or_fs` | critical/warn | 开放群组可在没有沙箱 / 工作区护栏的情况下访问命令 / 文件工具 | `channels.*.groupPolicy`、`tools.profile/deny`、`tools.fs.workspaceOnly`、`agents.*.sandbox.mode` | 否 | -| `security.trust_model.multi_user_heuristic` | warn | 配置看起来像多用户使用,但 Gateway 网关信任模型是个人助理 | 拆分信任边界,或进行共享用户加固(`sandbox.mode`、工具 deny / 工作区范围限制) | 否 | -| `tools.profile_minimal_overridden` | warn | 智能体覆盖配置绕过了全局 minimal profile | `agents.list[].tools.profile` | 否 | -| `plugins.tools_reachable_permissive_policy` | warn | 扩展工具可在宽松策略上下文中访问 | `tools.profile` + 工具 allow / deny | 否 | -| `models.legacy` | warn | 仍然配置了旧版模型家族 | 模型选择 | 否 | -| `models.weak_tier` | warn | 当前配置的模型低于推荐层级 | 模型选择 | 否 | -| `models.small_params` | critical/info | 小模型 + 不安全工具面会提高注入风险 | 模型选择 + 沙箱 / 工具策略 | 否 | -| `summary.attack_surface` | info | 对认证、渠道、工具和暴露姿态的汇总摘要 | 多个键(见发现详情) | 否 | +| `checkId` | 严重级别 | 重要原因 | 主要修复键 / 路径 | 自动修复 | +| ------------------------------------------------------------- | ------------- | ------------------------------------------------------------------------------------ | ---------------------------------------------------------------------------------------------------- | -------- | +| `fs.state_dir.perms_world_writable` | critical | 其他用户 / 进程可以修改完整的 OpenClaw 状态 | `~/.openclaw` 的文件系统权限 | yes | +| `fs.state_dir.perms_group_writable` | warn | 组内用户可以修改完整的 OpenClaw 状态 | `~/.openclaw` 的文件系统权限 | yes | +| `fs.state_dir.perms_readable` | warn | 其他人可以读取状态目录 | `~/.openclaw` 的文件系统权限 | yes | +| `fs.state_dir.symlink` | warn | 状态目录目标变成另一个信任边界 | 状态目录文件系统布局 | no | +| `fs.config.perms_writable` | critical | 其他人可以更改 auth / 工具策略 / 配置 | `~/.openclaw/openclaw.json` 的文件系统权限 | yes | +| `fs.config.symlink` | warn | 配置目标变成另一个信任边界 | 配置文件文件系统布局 | no | +| `fs.config.perms_group_readable` | warn | 组内用户可以读取配置 token / 设置 | 配置文件的文件系统权限 | yes | +| `fs.config.perms_world_readable` | critical | 配置可能暴露 token / 设置 | 配置文件的文件系统权限 | yes | +| `fs.config_include.perms_writable` | critical | 配置 include 文件可被其他人修改 | `openclaw.json` 引用的 include 文件权限 | yes | +| `fs.config_include.perms_group_readable` | warn | 组内用户可以读取包含的 secrets / 设置 | `openclaw.json` 引用的 include 文件权限 | yes | +| `fs.config_include.perms_world_readable` | critical | 包含的 secrets / 设置对所有人可读 | `openclaw.json` 引用的 include 文件权限 | yes | +| `fs.auth_profiles.perms_writable` | critical | 其他人可以注入或替换已存储的模型凭证 | `agents//agent/auth-profiles.json` 的权限 | yes | +| `fs.auth_profiles.perms_readable` | warn | 其他人可以读取 API keys 和 OAuth tokens | `agents//agent/auth-profiles.json` 的权限 | yes | +| `fs.credentials_dir.perms_writable` | critical | 其他人可以修改渠道配对 / 凭证状态 | `~/.openclaw/credentials` 的文件系统权限 | yes | +| `fs.credentials_dir.perms_readable` | warn | 其他人可以读取渠道凭证状态 | `~/.openclaw/credentials` 的文件系统权限 | yes | +| `fs.sessions_store.perms_readable` | warn | 其他人可以读取会话转录 / 元数据 | 会话存储权限 | yes | +| `fs.log_file.perms_readable` | warn | 其他人可以读取虽经脱敏但仍然敏感的日志 | Gateway 网关日志文件权限 | yes | +| `fs.synced_dir` | warn | iCloud / Dropbox / Drive 中的状态 / 配置会扩大 token / 转录内容暴露范围 | 将配置 / 状态移出同步文件夹 | no | +| `gateway.bind_no_auth` | critical | 远程 bind 但没有共享密钥 | `gateway.bind`、`gateway.auth.*` | no | +| `gateway.loopback_no_auth` | critical | 经反向代理暴露的 loopback 可能变成无身份验证访问 | `gateway.auth.*`、代理设置 | no | +| `gateway.trusted_proxies_missing` | warn | 存在反向代理头,但未信任代理来源 | `gateway.trustedProxies` | no | +| `gateway.http.no_auth` | warn/critical | 可通过 `auth.mode="none"` 访问 Gateway 网关 HTTP API | `gateway.auth.mode`、`gateway.http.endpoints.*` | no | +| `gateway.http.session_key_override_enabled` | info | HTTP API 调用方可以覆盖 `sessionKey` | `gateway.http.allowSessionKeyOverride` | no | +| `gateway.tools_invoke_http.dangerous_allow` | warn/critical | 通过 HTTP API 重新启用了危险工具 | `gateway.tools.allow` | no | +| `gateway.nodes.allow_commands_dangerous` | warn/critical | 启用了高影响节点命令(相机 / 屏幕 / 通讯录 / 日历 / 短信) | `gateway.nodes.allowCommands` | no | +| `gateway.nodes.deny_commands_ineffective` | warn | 类似模式的 deny 条目不会匹配 Shell 文本或分组 | `gateway.nodes.denyCommands` | no | +| `gateway.tailscale_funnel` | critical | 公开互联网暴露 | `gateway.tailscale.mode` | no | +| `gateway.tailscale_serve` | info | 已通过 Serve 启用 tailnet 暴露 | `gateway.tailscale.mode` | no | +| `gateway.control_ui.allowed_origins_required` | critical | 非 loopback 的 Control UI 未显式设置浏览器 origin allowlist | `gateway.controlUi.allowedOrigins` | no | +| `gateway.control_ui.allowed_origins_wildcard` | warn/critical | `allowedOrigins=["*"]` 会禁用浏览器 origin allowlist | `gateway.controlUi.allowedOrigins` | no | +| `gateway.control_ui.host_header_origin_fallback` | warn/critical | 启用了 Host 头 origin 回退(降低 DNS rebinding 加固强度) | `gateway.controlUi.dangerouslyAllowHostHeaderOriginFallback` | no | +| `gateway.control_ui.insecure_auth` | warn | 启用了不安全 auth 兼容性开关 | `gateway.controlUi.allowInsecureAuth` | no | +| `gateway.control_ui.device_auth_disabled` | critical | 禁用了设备身份检查 | `gateway.controlUi.dangerouslyDisableDeviceAuth` | no | +| `gateway.real_ip_fallback_enabled` | warn/critical | 信任 `X-Real-IP` 回退可能因代理配置错误导致源 IP 欺骗 | `gateway.allowRealIpFallback`、`gateway.trustedProxies` | no | +| `gateway.token_too_short` | warn | 共享 token 过短,更容易被暴力破解 | `gateway.auth.token` | no | +| `gateway.auth_no_rate_limit` | warn | 暴露的 auth 若无速率限制,会增加暴力破解风险 | `gateway.auth.rateLimit` | no | +| `gateway.trusted_proxy_auth` | critical | 代理身份现在成为 auth 边界 | `gateway.auth.mode="trusted-proxy"` | no | +| `gateway.trusted_proxy_no_proxies` | critical | trusted-proxy auth 若没有受信任代理 IP,则不安全 | `gateway.trustedProxies` | no | +| `gateway.trusted_proxy_no_user_header` | critical | trusted-proxy auth 无法安全解析用户身份 | `gateway.auth.trustedProxy.userHeader` | no | +| `gateway.trusted_proxy_no_allowlist` | warn | trusted-proxy auth 会接受任何已通过上游认证的用户 | `gateway.auth.trustedProxy.allowUsers` | no | +| `gateway.probe_auth_secretref_unavailable` | warn | 深度探测在当前命令路径中无法解析 auth SecretRefs | 深度探测 auth 来源 / SecretRef 可用性 | no | +| `gateway.probe_failed` | warn/critical | 实时 Gateway 网关探测失败 | Gateway 网关可达性 / auth | no | +| `discovery.mdns_full_mode` | warn/critical | mDNS 完整模式会在本地网络上广播 `cliPath` / `sshPort` 元数据 | `discovery.mdns.mode`、`gateway.bind` | no | +| `config.insecure_or_dangerous_flags` | warn | 启用了不安全 / 危险的调试标志 | 多个键(见发现详情) | no | +| `config.secrets.gateway_password_in_config` | warn | Gateway 网关密码直接存储在配置中 | `gateway.auth.password` | no | +| `config.secrets.hooks_token_in_config` | warn | Hook bearer token 直接存储在配置中 | `hooks.token` | no | +| `hooks.token_reuse_gateway_token` | critical | Hook 入站 token 同时也能解锁 Gateway 网关 auth | `hooks.token`、`gateway.auth.token` | no | +| `hooks.token_too_short` | warn | Hook 入站更容易被暴力破解 | `hooks.token` | no | +| `hooks.default_session_key_unset` | warn | Hook 智能体运行时会扇出到按请求生成的会话中 | `hooks.defaultSessionKey` | no | +| `hooks.allowed_agent_ids_unrestricted` | warn/critical | 已认证的 Hook 调用方可以路由到任何已配置的智能体 | `hooks.allowedAgentIds` | no | +| `hooks.request_session_key_enabled` | warn/critical | 外部调用方可以选择 `sessionKey` | `hooks.allowRequestSessionKey` | no | +| `hooks.request_session_key_prefixes_missing` | warn/critical | 外部会话 key 的形状没有边界限制 | `hooks.allowedSessionKeyPrefixes` | no | +| `hooks.path_root` | critical | Hook 路径是 `/`,使入站更容易发生冲突或误路由 | `hooks.path` | no | +| `hooks.installs_unpinned_npm_specs` | warn | Hook 安装记录未固定到不可变的 npm specs | Hook 安装元数据 | no | +| `hooks.installs_missing_integrity` | warn | Hook 安装记录缺少完整性元数据 | Hook 安装元数据 | no | +| `hooks.installs_version_drift` | warn | Hook 安装记录与已安装包发生版本漂移 | Hook 安装元数据 | no | +| `logging.redact_off` | warn | 敏感值会泄露到日志 / 状态输出中 | `logging.redactSensitive` | yes | +| `browser.control_invalid_config` | warn | 浏览器控制配置在运行前就已无效 | `browser.*` | no | +| `browser.control_no_auth` | critical | 浏览器控制在没有 token / password auth 的情况下暴露 | `gateway.auth.*` | no | +| `browser.remote_cdp_http` | warn | 通过纯 HTTP 使用远程 CDP 缺少传输加密 | 浏览器配置文件 `cdpUrl` | no | +| `browser.remote_cdp_private_host` | warn | 远程 CDP 指向私有 / 内部主机 | 浏览器配置文件 `cdpUrl`、`browser.ssrfPolicy.*` | no | +| `sandbox.docker_config_mode_off` | warn | 已存在沙箱 Docker 配置,但当前未启用 | `agents.*.sandbox.mode` | no | +| `sandbox.bind_mount_non_absolute` | warn | 相对 bind mounts 的解析结果可能不可预测 | `agents.*.sandbox.docker.binds[]` | no | +| `sandbox.dangerous_bind_mount` | critical | 沙箱 bind mount 指向被阻止的系统、凭证或 Docker socket 路径 | `agents.*.sandbox.docker.binds[]` | no | +| `sandbox.dangerous_network_mode` | critical | 沙箱 Docker 网络使用 `host` 或 `container:*` 命名空间加入模式 | `agents.*.sandbox.docker.network` | no | +| `sandbox.dangerous_seccomp_profile` | critical | 沙箱 seccomp 配置文件削弱了容器隔离 | `agents.*.sandbox.docker.securityOpt` | no | +| `sandbox.dangerous_apparmor_profile` | critical | 沙箱 AppArmor 配置文件削弱了容器隔离 | `agents.*.sandbox.docker.securityOpt` | no | +| `sandbox.browser_cdp_bridge_unrestricted` | warn | 沙箱浏览器桥接暴露时没有来源范围限制 | `sandbox.browser.cdpSourceRange` | no | +| `sandbox.browser_container.non_loopback_publish` | critical | 现有浏览器容器在非 loopback 接口上发布了 CDP | 浏览器沙箱容器发布配置 | no | +| `sandbox.browser_container.hash_label_missing` | warn | 现有浏览器容器早于当前配置哈希标签机制 | `openclaw sandbox recreate --browser --all` | no | +| `sandbox.browser_container.hash_epoch_stale` | warn | 现有浏览器容器早于当前浏览器配置 epoch | `openclaw sandbox recreate --browser --all` | no | +| `tools.exec.host_sandbox_no_sandbox_defaults` | warn | 当沙箱关闭时,`exec host=sandbox` 会以失败关闭方式运行 | `tools.exec.host`、`agents.defaults.sandbox.mode` | no | +| `tools.exec.host_sandbox_no_sandbox_agents` | warn | 当沙箱关闭时,按智能体设置的 `exec host=sandbox` 会以失败关闭方式运行 | `agents.list[].tools.exec.host`、`agents.list[].sandbox.mode` | no | +| `tools.exec.security_full_configured` | warn/critical | 主机 exec 正在以 `security="full"` 运行 | `tools.exec.security`、`agents.list[].tools.exec.security` | no | +| `tools.exec.auto_allow_skills_enabled` | warn | Exec 批准会隐式信任 Skills 二进制文件 | `~/.openclaw/exec-approvals.json` | no | +| `tools.exec.allowlist_interpreter_without_strict_inline_eval` | warn | 解释器 allowlist 允许内联 eval,但不会强制重新批准 | `tools.exec.strictInlineEval`、`agents.list[].tools.exec.strictInlineEval`、exec approvals allowlist | no | +| `tools.exec.safe_bins_interpreter_unprofiled` | warn | `safeBins` 中的解释器 / 运行时二进制缺少显式 profile,会扩大 exec 风险 | `tools.exec.safeBins`、`tools.exec.safeBinProfiles`、`agents.list[].tools.exec.*` | no | +| `tools.exec.safe_bins_broad_behavior` | warn | `safeBins` 中的宽行为工具会削弱低风险 stdin 过滤信任模型 | `tools.exec.safeBins`、`agents.list[].tools.exec.safeBins` | no | +| `tools.exec.safe_bin_trusted_dirs_risky` | warn | `safeBinTrustedDirs` 包含可变或高风险目录 | `tools.exec.safeBinTrustedDirs`、`agents.list[].tools.exec.safeBinTrustedDirs` | no | +| `skills.workspace.symlink_escape` | warn | 工作区 `skills/**/SKILL.md` 解析到了工作区根目录之外(符号链接链漂移) | 工作区 `skills/**` 文件系统状态 | no | +| `plugins.extensions_no_allowlist` | warn | 已安装扩展,但没有显式插件 allowlist | `plugins.allowlist` | no | +| `plugins.installs_unpinned_npm_specs` | warn | 插件安装记录未固定到不可变的 npm specs | 插件安装元数据 | no | +| `plugins.installs_missing_integrity` | warn | 插件安装记录缺少完整性元数据 | 插件安装元数据 | no | +| `plugins.installs_version_drift` | warn | 插件安装记录与已安装包发生版本漂移 | 插件安装元数据 | no | +| `plugins.code_safety` | warn/critical | 插件代码扫描发现可疑或危险模式 | 插件代码 / 安装来源 | no | +| `plugins.code_safety.entry_path` | warn | 插件入口路径指向隐藏目录或 `node_modules` 位置 | 插件清单 `entry` | no | +| `plugins.code_safety.entry_escape` | critical | 插件入口逃逸出插件目录 | 插件清单 `entry` | no | +| `plugins.code_safety.scan_failed` | warn | 插件代码扫描无法完成 | 插件扩展路径 / 扫描环境 | no | +| `skills.code_safety` | warn/critical | Skills 安装器元数据 / 代码包含可疑或危险模式 | Skills 安装来源 | no | +| `skills.code_safety.scan_failed` | warn | Skills 代码扫描无法完成 | Skills 扫描环境 | no | +| `security.exposure.open_channels_with_exec` | warn/critical | 共享 / 公开房间可访问启用了 exec 的智能体 | `channels.*.dmPolicy`、`channels.*.groupPolicy`、`tools.exec.*`、`agents.list[].tools.exec.*` | no | +| `security.exposure.open_groups_with_elevated` | critical | 开放群组 + 提升权限工具会形成高影响的提示注入路径 | `channels.*.groupPolicy`、`tools.elevated.*` | no | +| `security.exposure.open_groups_with_runtime_or_fs` | critical/warn | 开放群组可访问命令 / 文件工具,且没有沙箱隔离 / 工作区护栏 | `channels.*.groupPolicy`、`tools.profile/deny`、`tools.fs.workspaceOnly`、`agents.*.sandbox.mode` | no | +| `security.trust_model.multi_user_heuristic` | warn | 配置看起来像多用户场景,但 Gateway 网关信任模型是个人助理模型 | 拆分信任边界,或采用共享用户加固(`sandbox.mode`、工具 deny / 工作区范围限制) | no | +| `tools.profile_minimal_overridden` | warn | 智能体覆盖配置绕过了全局 minimal profile | `agents.list[].tools.profile` | no | +| `plugins.tools_reachable_permissive_policy` | warn | 在宽松策略上下文中仍可访问扩展工具 | `tools.profile` + 工具 allow / deny | no | +| `models.legacy` | warn | 仍然配置了旧模型家族 | 模型选择 | no | +| `models.weak_tier` | warn | 已配置模型低于当前推荐层级 | 模型选择 | no | +| `models.small_params` | critical/info | 小模型 + 不安全工具面会提高注入风险 | 模型选择 + 沙箱隔离 / 工具策略 | no | +| `summary.attack_surface` | info | 对 auth、渠道、工具和暴露姿态的汇总摘要 | 多个键(见发现详情) | no | -## 通过 HTTP 使用控制 UI +## 通过 HTTP 使用 Control UI -控制 UI 需要一个**安全上下文**(HTTPS 或 localhost)来生成设备身份。`gateway.controlUi.allowInsecureAuth` 是一个本地兼容性开关: +Control UI 需要一个**安全上下文**(HTTPS 或 localhost)来生成设备身份。`gateway.controlUi.allowInsecureAuth` 是一个本地兼容性开关: -- 在 localhost 上,当页面通过非安全 HTTP 加载时,它允许控制 UI 在没有设备身份的情况下进行认证。 +- 在 localhost 上,当页面通过不安全的 HTTP 加载时,它允许 Control UI 在没有设备身份的情况下进行 auth。 - 它不会绕过配对检查。 - 它不会放宽远程(非 localhost)设备身份要求。 -优先使用 HTTPS(Tailscale Serve),或者在 `127.0.0.1` 上打开 UI。 +优先使用 HTTPS(Tailscale Serve),或在 `127.0.0.1` 上打开 UI。 -仅在紧急兜底场景下,`gateway.controlUi.dangerouslyDisableDeviceAuth` 才会完全禁用设备身份检查。这会严重降低安全性;除非你正在主动调试并且可以很快恢复,否则请保持关闭。 +仅用于紧急兜底场景,`gateway.controlUi.dangerouslyDisableDeviceAuth` 会完全禁用设备身份检查。这是一次严重的安全降级;除非你正在主动调试并且能够快速回退,否则请保持关闭。 -与这些危险标志不同,成功配置 `gateway.auth.mode: "trusted-proxy"` 可以让**操作员**控制 UI 会话在没有设备身份的情况下通过认证。这是该认证模式的有意行为,而不是 `allowInsecureAuth` 的捷径,而且它仍然不适用于 node 角色的控制 UI 会话。 +与这些危险标志分开的是,成功配置 `gateway.auth.mode: "trusted-proxy"` 后,可以允许**操作员** Control UI 会话在没有设备身份的情况下通过。这是有意设计的 auth 模式行为,不是 `allowInsecureAuth` 的捷径,而且它仍然不适用于节点角色的 Control UI 会话。 启用该设置时,`openclaw security audit` 会发出警告。 ## 不安全或危险标志汇总 -当已知的不安全 / 危险调试开关被启用时,`openclaw security audit` 会包含 `config.insecure_or_dangerous_flags`。该检查目前会汇总以下项: +启用已知不安全 / 危险调试开关时,`openclaw security audit` 会包含 `config.insecure_or_dangerous_flags`。当前该检查聚合以下项: - `gateway.controlUi.allowInsecureAuth=true` - `gateway.controlUi.dangerouslyAllowHostHeaderOriginFallback=true` @@ -379,7 +375,7 @@ Allowlists 控制触发和命令授权。`contextVisibility` 设置则控制补 - `tools.exec.applyPatch.workspaceOnly=false` - `plugins.entries.acpx.config.permissionMode=approve-all` -OpenClaw 配置 schema 中定义的完整 `dangerous*` / `dangerously*` 配置键: +在 OpenClaw 配置 schema 中定义的完整 `dangerous*` / `dangerously*` 配置键包括: - `gateway.controlUi.dangerouslyAllowHostHeaderOriginFallback` - `gateway.controlUi.dangerouslyDisableDeviceAuth` @@ -411,85 +407,86 @@ OpenClaw 配置 schema 中定义的完整 `dangerous*` / `dangerously*` 配置 ## 反向代理配置 -如果你在反向代理(nginx、Caddy、Traefik 等)后面运行 Gateway 网关,请配置 `gateway.trustedProxies` 以正确处理转发的客户端 IP。 +如果你在反向代理(nginx、Caddy、Traefik 等)后面运行 Gateway 网关,请配置 `gateway.trustedProxies`,以便正确处理转发的客户端 IP。 -当 Gateway 网关检测到来自**不在** `trustedProxies` 中地址的代理头时,它将**不会**把这些连接视为本地客户端。如果 Gateway 网关认证被关闭,这些连接会被拒绝。这样可以防止认证绕过:否则,经代理转发的连接可能看起来像是来自 localhost,从而自动获得信任。 +当 Gateway 网关检测到来自**不在** `trustedProxies` 中地址的代理头时,它**不会**将这些连接视为本地客户端。如果 Gateway 网关 auth 被禁用,这些连接会被拒绝。这样可以防止一种身份验证绕过:否则经代理的连接可能会看起来像来自 localhost,从而自动获得信任。 -`gateway.trustedProxies` 也会被 `gateway.auth.mode: "trusted-proxy"` 使用,但该认证模式更严格: +`gateway.trustedProxies` 也会为 `gateway.auth.mode: "trusted-proxy"` 提供支持,但该 auth 模式更严格: -- trusted-proxy 认证会**在 loopback 来源代理下以关闭方式失败** -- 同一主机上的 loopback 反向代理仍然可以使用 `gateway.trustedProxies` 来进行本地客户端检测和转发 IP 处理 -- 对于同一主机上的 loopback 反向代理,请使用令牌 / 密码认证,而不要使用 `gateway.auth.mode: "trusted-proxy"` +- trusted-proxy auth **对来自 loopback 源的代理采取失败关闭** +- 同主机上的 loopback 反向代理仍然可以使用 `gateway.trustedProxies` 来进行本地客户端检测和转发 IP 处理 +- 对于同主机 loopback 反向代理,请使用 token / password auth,而不是 `gateway.auth.mode: "trusted-proxy"` ```yaml gateway: trustedProxies: - "10.0.0.1" # 反向代理 IP # 可选。默认 false。 - # 仅当你的代理无法提供 X-Forwarded-For 时才启用。 + # 仅当你的代理无法提供 X-Forwarded-For 时启用。 allowRealIpFallback: false auth: mode: password password: ${OPENCLAW_GATEWAY_PASSWORD} ``` -配置 `trustedProxies` 后,Gateway 网关会使用 `X-Forwarded-For` 来确定客户端 IP。默认情况下会忽略 `X-Real-IP`,除非你显式设置 `gateway.allowRealIpFallback: true`。 +配置了 `trustedProxies` 后,Gateway 网关会使用 `X-Forwarded-For` 来确定客户端 IP。默认情况下会忽略 `X-Real-IP`,除非你显式设置 `gateway.allowRealIpFallback: true`。 -好的反向代理行为(覆盖传入的转发头): +良好的反向代理行为(覆盖传入的转发头): ```nginx proxy_set_header X-Forwarded-For $remote_addr; proxy_set_header X-Real-IP $remote_addr; ``` -不好的反向代理行为(追加 / 保留不受信任的转发头): +不良的反向代理行为(追加 / 保留不受信任的转发头): ```nginx proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; ``` -## HSTS 与来源说明 +## HSTS 和 origin 说明 -- OpenClaw Gateway 网关优先面向本地 / loopback。如果你在反向代理处终止 TLS,请在面向代理的 HTTPS 域名上由代理设置 HSTS。 -- 如果由 Gateway 网关自身终止 HTTPS,你可以设置 `gateway.http.securityHeaders.strictTransportSecurity`,让 OpenClaw 在响应中发出 HSTS 头。 +- OpenClaw Gateway 网关首先面向本地 / loopback。如果你在反向代理处终止 TLS,请在那里为面向代理的 HTTPS 域设置 HSTS。 +- 如果由 Gateway 网关自身终止 HTTPS,你可以设置 `gateway.http.securityHeaders.strictTransportSecurity`,让 OpenClaw 在响应中发送 HSTS 头。 - 详细部署指南见 [Trusted Proxy Auth](/zh-CN/gateway/trusted-proxy-auth#tls-termination-and-hsts)。 -- 对于非 loopback 的控制 UI 部署,默认要求配置 `gateway.controlUi.allowedOrigins`。 -- `gateway.controlUi.allowedOrigins: ["*"]` 表示显式允许所有浏览器来源的策略,不是加固后的默认值。除非是严格受控的本地测试,否则应避免使用。 -- 即使启用了通用的 loopback 豁免,loopback 上浏览器来源认证失败仍然会受到速率限制,但锁定键会按规范化后的 `Origin` 值分别划分,而不是共用一个 localhost 桶。 -- `gateway.controlUi.dangerouslyAllowHostHeaderOriginFallback=true` 会启用 Host 头来源回退模式;请将其视为由操作员主动选择的危险策略。 -- 请将 DNS rebinding 和代理 Host 头行为视为部署加固问题;保持 `trustedProxies` 范围尽可能严格,并避免将 Gateway 网关直接暴露到公共互联网。 +- 对于非 loopback 的 Control UI 部署,默认要求设置 `gateway.controlUi.allowedOrigins`。 +- `gateway.controlUi.allowedOrigins: ["*"]` 表示显式允许所有浏览器 origin 的策略,不是强化默认值。除非是在严格受控的本地测试中,否则应避免使用。 +- 即使启用了通用 loopback 豁免,loopback 上的浏览器 origin auth 失败仍会受到速率限制,但锁定 key 会按规范化后的 `Origin` 值分别计算,而不是共用一个 localhost 桶。 +- `gateway.controlUi.dangerouslyAllowHostHeaderOriginFallback=true` 会启用 Host 头 origin 回退模式;请将其视为由操作员主动选择的危险策略。 +- 请将 DNS rebinding 和代理 Host 头行为视为部署加固问题;保持 `trustedProxies` 范围严格,并避免将 Gateway 网关直接暴露到公共互联网。 -## 本地会话日志存储在磁盘上 +## 本地会话日志会落盘保存 -OpenClaw 会将会话转录保存在磁盘上的 `~/.openclaw/agents//sessions/*.jsonl` 中。 -这是实现会话连续性以及(可选)会话记忆索引所必需的,但这也意味着 -**任何拥有文件系统访问权限的进程 / 用户都可以读取这些日志**。请将磁盘访问视为信任边界,并锁定 `~/.openclaw` 的权限(参见下方审计部分)。如果你需要在智能体之间实现更强隔离,请在独立的操作系统用户或独立主机下运行它们。 +OpenClaw 会将会话转录存储到磁盘,路径为 `~/.openclaw/agents//sessions/*.jsonl`。 +这是实现会话连续性以及(可选的)会话 Memory 索引所必需的,但这也意味着 +**任何具有文件系统访问权限的进程 / 用户都可以读取这些日志**。请将磁盘访问视为信任 +边界,并锁紧 `~/.openclaw` 的权限(见下方审计部分)。如果你需要智能体之间更强的隔离,请在不同的 OS 用户或不同的主机下运行它们。 ## 节点执行(`system.run`) -如果某个 macOS 节点已完成配对,Gateway 网关就可以在该节点上调用 `system.run`。这属于该 Mac 上的**远程代码执行**: +如果已配对一个 macOS 节点,Gateway 网关可以在该节点上调用 `system.run`。这属于在该 Mac 上的**远程代码执行**: -- 需要节点配对(批准 + 令牌)。 -- Gateway 网关节点配对不是逐命令批准面。它建立的是节点身份 / 信任以及令牌签发。 +- 需要节点配对(批准 + token)。 +- Gateway 网关节点配对不是逐命令批准层。它建立的是节点身份 / 信任以及 token 签发。 - Gateway 网关通过 `gateway.nodes.allowCommands` / `denyCommands` 应用粗粒度的全局节点命令策略。 - 在 Mac 上通过**设置 → Exec approvals**进行控制(security + ask + allowlist)。 -- 每个节点的 `system.run` 策略由该节点自身的执行批准文件(`exec.approvals.node.*`)控制,它可以比 Gateway 网关的全局命令 ID 策略更严格,也可以更宽松。 -- 如果某个节点以 `security="full"` 且 `ask="off"` 运行,那是在遵循默认的受信任操作员模型。除非你的部署明确要求更严格的批准或 allowlist 姿态,否则应将其视为预期行为。 -- 批准模式会绑定精确的请求上下文,并在可能时绑定一个具体的本地脚本 / 文件操作数。如果 OpenClaw 无法为解释器 / 运行时命令精确识别出一个直接的本地文件,那么依赖批准的执行将被拒绝,而不是对完整语义覆盖作出承诺。 -- 对于 `host=node`,依赖批准的运行还会存储一个规范化的已准备 `systemRunPlan`;后续已批准的转发会复用该存储计划,并且 Gateway 网关验证会拒绝调用方在批准请求创建后再修改命令 / cwd / 会话上下文。 +- 每个节点的 `system.run` 策略由节点自己的 exec approvals 文件(`exec.approvals.node.*`)控制,它可以比 Gateway 网关的全局命令 ID 策略更严格,也可以更宽松。 +- 当节点以 `security="full"` 和 `ask="off"` 运行时,它遵循的是默认的受信任操作员模型。除非你的部署明确需要更严格的批准或 allowlist 姿态,否则应将其视为预期行为。 +- 批准模式会绑定精确的请求上下文,并在可能时绑定一个具体的本地脚本 / 文件操作数。如果 OpenClaw 无法为某个解释器 / 运行时命令精确识别出唯一的直接本地文件,那么基于批准的执行将被拒绝,而不是声称已覆盖完整语义。 +- 对于 `host=node`,基于批准的运行还会存储一个规范化的预备 `systemRunPlan`;之后的已批准转发会复用该已存储计划,而 Gateway 网关验证会拒绝调用方在批准请求创建后再修改命令 / cwd / 会话上下文。 - 如果你不希望远程执行,请将 security 设为 **deny**,并移除该 Mac 的节点配对。 -这一区别对分诊很重要: +这一区分在分级时很重要: -- 已重新连接的配对节点声明了不同的命令列表,这本身**不构成**漏洞,只要 Gateway 网关的全局策略和该节点本地的执行批准仍然在执行真正的边界控制。 -- 将节点配对元数据视为隐藏的第二层逐命令批准机制的报告,通常属于策略 / UX 误解,而不是安全边界绕过。 +- 已配对节点重新连接后声明了不同的命令列表,这本身**不是**漏洞,只要 Gateway 网关全局策略和节点本地 exec approvals 仍然在执行真正的边界控制。 +- 把节点配对元数据当作第二层隐藏的逐命令批准机制的报告,通常属于策略 / UX 混淆,而不是安全边界绕过。 ## 动态 Skills(watcher / 远程节点) OpenClaw 可以在会话中途刷新 Skills 列表: -- **Skills watcher**:对 `SKILL.md` 的更改可以在智能体的下一轮中更新 Skills 快照。 -- **远程节点**:连接 macOS 节点后,可以让仅限 macOS 的 Skills 变为可用(基于二进制探测)。 +- **Skills watcher**:对 `SKILL.md` 的更改可以在智能体下一轮运行时更新 Skills 快照。 +- **远程节点**:连接一个 macOS 节点后,可能会使仅限 macOS 的 Skills 变为可用(基于二进制探测)。 请将 skill 文件夹视为**受信任代码**,并限制谁可以修改它们。 @@ -497,49 +494,49 @@ OpenClaw 可以在会话中途刷新 Skills 列表: 你的 AI 助手可以: -- 执行任意 shell 命令 -- 读取 / 写入文件 +- 执行任意 Shell 命令 +- 读写文件 - 访问网络服务 -- 给任何人发送消息(如果你赋予它 WhatsApp 访问权限) +- 给任何人发消息(如果你赋予它 WhatsApp 访问权限) 能给你发消息的人可以: -- 试图诱骗你的 AI 去做坏事 -- 通过社交工程获取你的数据访问权限 -- 探测你的基础设施细节 +- 试图诱导你的 AI 做坏事 +- 通过社会工程获取你的数据访问权限 +- 探测基础设施细节 ## 核心概念:先做访问控制,再谈智能 -这里的大多数失败都不是什么高级利用——而是“有人给机器人发了消息,机器人照做了”。 +这里的大多数失败并不是什么高深利用——而是“某人给机器人发了消息,而机器人照做了”。 OpenClaw 的立场是: -- **身份优先:** 先决定谁可以和机器人对话(私信配对 / allowlist / 显式 “open”)。 -- **范围其次:** 再决定机器人被允许在哪里行动(群组 allowlist + 提及门槛、工具、沙箱隔离、设备权限)。 -- **模型最后:** 假设模型可以被操纵;设计时要让这种操纵的影响半径受到限制。 +- **身份优先:** 先决定谁可以和机器人对话(私信配对 / allowlist / 显式 `open`)。 +- **范围其次:** 再决定机器人被允许在哪里操作(群组 allowlist + 提及门控、工具、沙箱隔离、设备权限)。 +- **模型最后:** 假设模型可以被操纵;系统设计应让这种操纵的爆炸半径受到限制。 ## 命令授权模型 -Slash commands 和指令只会对**已授权的发送者**生效。授权来源于 -渠道 allowlist / 配对以及 `commands.useAccessGroups`(参见 [Configuration](/zh-CN/gateway/configuration) -和 [Slash commands](/zh-CN/tools/slash-commands))。如果某个渠道的 allowlist 为空,或包含 `"*"`, +Slash commands 和指令只会对**已授权发送者**生效。授权来源于 +渠道 allowlist / pairing 加上 `commands.useAccessGroups`(参见 [配置](/zh-CN/gateway/configuration) +和 [Slash commands](/zh-CN/tools/slash-commands))。如果某个渠道 allowlist 为空或包含 `"*"`, 那么该渠道上的命令实际上就是开放的。 -`/exec` 是仅供已授权操作员使用的会话内便捷功能。它**不会**写入配置,也**不会** -更改其他会话。 +`/exec` 是面向已授权操作员的仅会话内便捷命令。它**不会**写入配置,也**不会** +修改其他会话。 ## 控制平面工具风险 -有两个内置工具可以进行持久化的控制平面更改: +有两个内置工具可以进行持久化的控制平面变更: -- `gateway` 可以使用 `config.schema.lookup` / `config.get` 检查配置,也可以通过 `config.apply`、`config.patch` 和 `update.run` 进行持久化更改。 -- `cron` 可以创建计划任务,这些任务会在原始聊天 / 任务结束后继续运行。 +- `gateway` 可以通过 `config.schema.lookup` / `config.get` 检查配置,也可以通过 `config.apply`、`config.patch` 和 `update.run` 进行持久化修改。 +- `cron` 可以创建计划任务,使其在原始聊天 / 任务结束后继续运行。 -仅限所有者的 `gateway` 运行时工具仍然拒绝重写 +仅限所有者使用的 `gateway` 运行时工具仍然拒绝重写 `tools.exec.ask` 或 `tools.exec.security`;旧版 `tools.bash.*` 别名会 -在写入之前被规范化为相同的受保护 exec 路径。 +先规范化为相同的受保护 exec 路径,然后再进行写入。 -对于任何会处理不受信任内容的智能体 / 表面,默认都应拒绝这些工具: +对于任何会处理不受信任内容的智能体 / 入口面,默认应拒绝这些工具: ```json5 { @@ -556,28 +553,28 @@ Slash commands 和指令只会对**已授权的发送者**生效。授权来源 插件会**在 Gateway 网关进程内**运行。请将它们视为受信任代码: - 只从你信任的来源安装插件。 -- 优先使用显式 `plugins.allow` allowlist。 -- 启用前先审查插件配置。 +- 优先使用显式的 `plugins.allow` allowlist。 +- 启用前先检查插件配置。 - 插件变更后重启 Gateway 网关。 - 如果你安装或更新插件(`openclaw plugins install `、`openclaw plugins update `),请将其视为运行不受信任代码: - - 安装路径是当前插件安装根目录下对应插件的目录。 - - OpenClaw 会在安装 / 更新前运行内置危险代码扫描。`critical` 发现默认会阻止安装。 + - 安装路径是当前插件安装根目录下该插件对应的目录。 + - OpenClaw 会在安装 / 更新前运行内置危险代码扫描。`critical` 级发现默认会阻止继续。 - OpenClaw 会使用 `npm pack`,然后在该目录中运行 `npm install --omit=dev`(npm 生命周期脚本可能会在安装期间执行代码)。 - - 优先使用固定的精确版本(`@scope/pkg@1.2.3`),并在启用前检查磁盘上解包后的代码。 - - `--dangerously-force-unsafe-install` 仅用于紧急兜底场景,针对插件安装 / 更新流程中内置扫描的误报。它不会绕过插件 `before_install` hook 的策略阻止,也不会绕过扫描失败。 - - 由 Gateway 网关支持的 skill 依赖安装遵循同样的危险 / 可疑划分:内置 `critical` 发现默认会阻止安装,除非调用方显式设置 `dangerouslyForceUnsafeInstall`;而可疑发现仍然只会发出警告。`openclaw skills install` 仍然是单独的 ClawHub skill 下载 / 安装流程。 + - 优先使用固定、精确的版本(`@scope/pkg@1.2.3`),并在启用前检查磁盘上解包后的代码。 + - `--dangerously-force-unsafe-install` 仅用于紧急兜底场景,用来处理插件安装 / 更新流程中内置扫描的误报。它不会绕过插件 `before_install` hook 策略阻止,也不会绕过扫描失败。 + - 由 Gateway 网关驱动的 skill 依赖安装遵循相同的危险 / 可疑分级:内置 `critical` 发现默认会阻止,除非调用方显式设置 `dangerouslyForceUnsafeInstall`;而可疑发现仍然只会发出警告。`openclaw skills install` 仍然是单独的 ClawHub skill 下载 / 安装流程。 -详情参见:[Plugins](/zh-CN/tools/plugin) +详情见:[插件](/zh-CN/tools/plugin) ## 私信访问模型(pairing / allowlist / open / disabled) -所有当前支持私信的渠道都支持私信策略(`dmPolicy` 或 `*.dm.policy`),用于在消息被处理**之前**控制入站私信: +所有当前支持私信的渠道都支持私信策略(`dmPolicy` 或 `*.dm.policy`),用于在消息被处理**之前**拦截入站私信: -- `pairing`(默认):未知发送者会收到一个简短的配对码,机器人会忽略其消息,直到获得批准。配对码 1 小时后过期;在创建新的请求之前,重复发送私信不会再次发送配对码。待处理请求默认每个渠道最多 **3 个**。 -- `allowlist`:未知发送者会被阻止(没有配对握手)。 -- `open`:允许任何人发送私信(公开)。**要求**该渠道的 allowlist 包含 `"*"`(显式选择加入)。 +- `pairing`(默认):未知发送者会收到一个简短的配对码,机器人会忽略其消息,直到获得批准。配对码 1 小时后过期;在新请求创建之前,重复发送私信不会重新发送配对码。默认情况下,每个渠道最多保留 **3 个待处理请求**。 +- `allowlist`:未知发送者会被拦截(没有配对握手)。 +- `open`:允许任何人发送私信(公开)。**要求**该渠道的 allowlist 包含 `"*"`(显式选择启用)。 - `disabled`:完全忽略入站私信。 通过 CLI 批准: @@ -587,11 +584,11 @@ openclaw pairing list openclaw pairing approve ``` -详情和磁盘上的文件位置参见:[Pairing](/zh-CN/channels/pairing) +详情及磁盘文件位置见:[配对](/zh-CN/channels/pairing) ## 私信会话隔离(多用户模式) -默认情况下,OpenClaw 会将**所有私信都路由到主会话**,这样你的助手就能在不同设备和渠道之间保持连续性。如果**有多个人**可以给机器人发送私信(开放私信或多人 allowlist),请考虑隔离私信会话: +默认情况下,OpenClaw 会将**所有私信都路由到主会话**,这样你的助理可以在不同设备和渠道间保持连续性。如果**有多个人**可以给机器人发私信(开放私信或多人 allowlist),请考虑隔离私信会话: ```json5 { @@ -601,178 +598,188 @@ openclaw pairing approve 这样可以防止跨用户上下文泄露,同时保持群聊彼此隔离。 -这是消息上下文边界,不是主机管理员边界。如果用户彼此对抗并共享同一个 Gateway 网关主机 / 配置,请为每个信任边界分别运行独立的 Gateway 网关。 +这是消息上下文边界,不是主机管理员边界。如果用户彼此对抗且共享同一 Gateway 网关主机 / 配置,请按信任边界分别运行独立的 Gateway 网关。 ### 安全私信模式(推荐) -请将上面的片段视为**安全私信模式**: +可将上面的片段视为**安全私信模式**: -- 默认:`session.dmScope: "main"`(所有私信共享一个会话,以保持连续性)。 -- 本地 CLI 新手引导默认:当未设置时,写入 `session.dmScope: "per-channel-peer"`(保留现有的显式值)。 -- 安全私信模式:`session.dmScope: "per-channel-peer"`(每个渠道 + 发送者组合拥有独立的私信上下文)。 -- 跨渠道联系人隔离:`session.dmScope: "per-peer"`(同类型的所有渠道中,每个发送者共用一个会话)。 +- 默认:`session.dmScope: "main"`(所有私信共享同一会话,以保持连续性)。 +- 本地 CLI 新手引导默认:当未设置时,会写入 `session.dmScope: "per-channel-peer"`(保留现有显式值)。 +- 安全私信模式:`session.dmScope: "per-channel-peer"`(每个渠道 + 发送者组合都有独立的私信上下文)。 +- 跨渠道联系人隔离:`session.dmScope: "per-peer"`(同一发送者在同类型所有渠道中共用一个会话)。 -如果你在同一渠道中运行多个账号,请改用 `per-account-channel-peer`。如果同一个人通过多个渠道联系你,请使用 `session.identityLinks` 将这些私信会话合并为一个规范身份。参见 [Session Management](/zh-CN/concepts/session) 和 [Configuration](/zh-CN/gateway/configuration)。 +如果你在同一个渠道上运行多个账号,请改用 `per-account-channel-peer`。如果同一个人会通过多个渠道联系你,请使用 `session.identityLinks` 将这些私信会话合并到一个规范身份下。参见 [会话管理](/zh-CN/concepts/session) 和 [配置](/zh-CN/gateway/configuration)。 -## Allowlists(私信 + 群组)- 术语说明 +## Allowlists(私信 + 群组)——术语说明 -OpenClaw 有两个独立的“谁可以触发我?”层: +OpenClaw 有两层独立的“谁可以触发我?”控制: -- **私信 allowlist**(`allowFrom` / `channels.discord.allowFrom` / `channels.slack.allowFrom`;旧版:`channels.discord.dm.allowFrom`、`channels.slack.dm.allowFrom`):谁被允许在私信中与机器人对话。 - - 当 `dmPolicy="pairing"` 时,批准结果会写入 `~/.openclaw/credentials/` 下按账号范围存储的配对 allowlist 中(默认账号为 `-allowFrom.json`,非默认账号为 `--allowFrom.json`),并与配置中的 allowlist 合并。 -- **群组 allowlist**(按渠道定义):机器人总体上会接受哪些群组 / 渠道 / guild 的消息。 +- **私信 allowlist**(`allowFrom` / `channels.discord.allowFrom` / `channels.slack.allowFrom`;旧版:`channels.discord.dm.allowFrom`、`channels.slack.dm.allowFrom`):哪些人被允许在私信中和机器人对话。 + - 当 `dmPolicy="pairing"` 时,批准结果会写入 `~/.openclaw/credentials/` 下按账号范围划分的配对 allowlist 存储(默认账号用 `-allowFrom.json`,非默认账号用 `--allowFrom.json`),并与配置中的 allowlists 合并。 +- **群组 allowlist**(按渠道定义):机器人究竟接受哪些群组 / 渠道 / guild 的消息。 - 常见模式: - - `channels.whatsapp.groups`、`channels.telegram.groups`、`channels.imessage.groups`:按群组设置默认值,例如 `requireMention`;设置后它也会充当群组 allowlist(如需保持允许所有群组的行为,请包含 `"*"`)。 - - `groupPolicy="allowlist"` + `groupAllowFrom`:限制在某个群组会话内,谁可以触发机器人(WhatsApp / Telegram / Signal / iMessage / Microsoft Teams)。 - - `channels.discord.guilds` / `channels.slack.channels`:按表面配置的 allowlist + 提及默认值。 - - 群组检查按以下顺序运行:先 `groupPolicy` / 群组 allowlist,再提及 / 回复激活。 - - 回复机器人消息(隐式提及)**不会**绕过像 `groupAllowFrom` 这样的发送者 allowlist。 - - **安全说明:** 请将 `dmPolicy="open"` 和 `groupPolicy="open"` 视为最后手段。它们应尽量少用;除非你完全信任房间中的每个成员,否则优先使用 pairing + allowlist。 + - `channels.whatsapp.groups`、`channels.telegram.groups`、`channels.imessage.groups`:像 `requireMention` 这样的按群组默认值;设置后它也会充当群组 allowlist(包含 `"*"` 可保留允许所有的行为)。 + - `groupPolicy="allowlist"` + `groupAllowFrom`:限制在群组会话内部究竟谁可以触发机器人(WhatsApp / Telegram / Signal / iMessage / Microsoft Teams)。 + - `channels.discord.guilds` / `channels.slack.channels`:按入口面划分的 allowlists + 提及默认值。 + - 群组检查顺序如下:先 `groupPolicy` / 群组 allowlists,后提及 / 回复激活。 + - 回复机器人消息(隐式提及)**不会**绕过像 `groupAllowFrom` 这样的发送者 allowlists。 + - **安全说明:** 请将 `dmPolicy="open"` 和 `groupPolicy="open"` 视为最后手段。应尽量少用;除非你完全信任房间里的每个成员,否则应优先使用 pairing + allowlists。 -详情参见:[Configuration](/zh-CN/gateway/configuration) 和 [Groups](/zh-CN/channels/groups) +详情见:[配置](/zh-CN/gateway/configuration) 和 [群组](/zh-CN/channels/groups) -## 提示注入(是什么,为什么重要) +## 提示注入(它是什么,为什么重要) -提示注入是指攻击者精心构造一条消息,操纵模型去做不安全的事情(“忽略你的指令”、“导出你的文件系统”、“打开这个链接并运行命令”等)。 +提示注入是指攻击者构造一条消息,操纵模型去执行不安全的事情(“忽略你的指令”、“导出你的文件系统”、“访问这个链接并运行命令”等)。 -即使系统提示非常强,**提示注入问题也没有被彻底解决**。系统提示护栏只是软性指导;真正的硬性约束来自工具策略、执行批准、沙箱隔离和渠道 allowlist(并且操作员也可以按设计关闭这些约束)。在实践中有效的做法包括: +即使有强系统提示,**提示注入仍然没有被彻底解决**。系统提示护栏只是软性引导;真正的强制执行来自工具策略、exec approvals、沙箱隔离和渠道 allowlists(并且操作员也可以按设计关闭它们)。实践中真正有帮助的是: -- 锁定入站私信(pairing / allowlist)。 -- 在群组中优先使用提及门槛;避免在公开房间中使用“始终在线”的机器人。 +- 保持入站私信处于锁定状态(pairing / allowlists)。 +- 在群组中优先使用提及门控;避免在公开房间中部署“始终在线”的机器人。 - 默认将链接、附件和粘贴的指令视为敌对内容。 -- 在沙箱中执行敏感工具;将密钥保存在智能体可访问文件系统之外。 -- 注意:沙箱隔离是显式选择加入的。如果沙箱模式关闭,隐式 `host=auto` 会解析到 Gateway 网关主机。显式 `host=sandbox` 仍会以关闭方式失败,因为没有可用的沙箱运行时。如果你希望这种行为在配置中更明确,请设置 `host=gateway`。 -- 将高风险工具(`exec`、`browser`、`web_fetch`、`web_search`)限制给受信任的智能体或显式 allowlist。 -- 如果你要对解释器进行 allowlist(`python`、`node`、`ruby`、`perl`、`php`、`lua`、`osascript`),请启用 `tools.exec.strictInlineEval`,这样 inline eval 形式仍然需要显式批准。 -- **模型选择很重要:** 较旧 / 较小 / 旧版模型在抵御提示注入和工具滥用方面明显更弱。对于启用了工具的智能体,请使用当前可用的最新一代、具备更强指令加固能力的模型。 +- 在沙箱中运行敏感工具执行;不要让 secrets 落在智能体可访问的文件系统里。 +- 注意:沙箱隔离是选择启用的。如果沙箱模式关闭,隐式 `host=auto` 会解析为 Gateway 网关主机。显式 `host=sandbox` 仍会以失败关闭方式终止,因为没有可用的沙箱运行时。如果你希望这种行为在配置中明确表达,请设置 `host=gateway`。 +- 将高风险工具(`exec`、`browser`、`web_fetch`、`web_search`)限制给受信任智能体或显式 allowlists。 +- 如果你为解释器设置 allowlist(`python`、`node`、`ruby`、`perl`、`php`、`lua`、`osascript`),请启用 `tools.exec.strictInlineEval`,这样内联 eval 形式仍然需要显式批准。 +- **模型选择很重要:** 较旧 / 较小 / 旧代模型对提示注入和工具误用的抵抗力明显更弱。对于启用了工具的智能体,请使用当前最强、最新一代、经过指令强化的模型。 -以下危险信号应视为不受信任: +以下红旗内容应视为不受信任: -- “读取这个文件 / URL,然后严格照做。” +- “读取这个文件 / URL,并严格照它说的做。” - “忽略你的系统提示或安全规则。” - “泄露你的隐藏指令或工具输出。” -- “把 `~/.openclaw` 或你的日志的完整内容粘贴出来。” +- “把 `~/.openclaw` 或你的日志完整内容贴出来。” ## 不安全外部内容绕过标志 -OpenClaw 包含一些显式绕过标志,可关闭外部内容安全包装: +OpenClaw 包含一些显式绕过标志,可用于禁用外部内容安全包装: - `hooks.mappings[].allowUnsafeExternalContent` - `hooks.gmail.allowUnsafeExternalContent` -- Cron 载荷字段 `allowUnsafeExternalContent` +- Cron 负载字段 `allowUnsafeExternalContent` -指导建议: +指南: -- 在生产环境中保持这些值未设置 / 为 false。 -- 仅在范围严格受控的临时调试中启用。 -- 如果启用,请隔离该智能体(沙箱隔离 + 最小工具集 + 专用会话命名空间)。 +- 在生产环境中保持这些设置为未设置 / false。 +- 只在范围严格受限的调试场景中临时启用。 +- 如果启用,请隔离该智能体(沙箱隔离 + 最少工具 + 专用会话命名空间)。 Hooks 风险说明: -- Hook 载荷属于不受信任内容,即使投递来自你控制的系统也是如此(邮件 / 文档 / Web 内容都可能携带提示注入)。 -- 较弱的模型层级会放大这一风险。对于由 Hook 驱动的自动化,请优先使用强大的现代模型层级,并保持严格的工具策略(`tools.profile: "messaging"` 或更严格),同时尽可能启用沙箱隔离。 +- Hook 负载属于不受信任内容,即使投递来自你控制的系统也是如此(邮件 / 文档 / 网页内容都可能携带提示注入)。 +- 较弱的模型层级会放大这一风险。对于 Hook 驱动的自动化,请优先使用强力的现代模型层级,并保持严格的工具策略(`tools.profile: "messaging"` 或更严格),同时尽可能启用沙箱隔离。 ### 提示注入并不需要公开私信 -即使**只有你自己**可以给机器人发送消息,只要机器人读取了任何**不受信任的内容**(Web 搜索 / 抓取结果、浏览器页面、邮件、文档、附件、粘贴的日志 / 代码),提示注入仍然可能发生。换句话说:发送者并不是唯一的威胁面;**内容本身**也可能携带对抗性指令。 +即使**只有你自己**能给机器人发消息,提示注入仍然可以通过 +机器人读取的任何**不受信任内容**发生(web 搜索 / 抓取结果、浏览器页面、 +邮件、文档、附件、粘贴的日志 / 代码)。换句话说:发送者并不是唯一的威胁面; +**内容本身**也可能携带对抗性指令。 -当启用了工具时,典型风险是窃取上下文或触发工具调用。可以通过以下方式缩小影响半径: +启用工具后,典型风险是泄露上下文或触发工具调用。可通过以下方式降低爆炸半径: -- 使用只读或禁用工具的**读取型智能体**来总结不受信任内容,然后再将摘要传递给主智能体。 -- 除非确有需要,否则为启用了工具的智能体关闭 `web_search` / `web_fetch` / `browser`。 -- 对于 OpenResponses URL 输入(`input_file` / `input_image`),设置严格的 +- 使用一个只读或禁用工具的**reader 智能体**来总结不受信任内容, + 然后再把摘要传给主智能体。 +- 对启用了工具的智能体,除非确有需要,否则关闭 `web_search` / `web_fetch` / `browser`。 +- 对于 OpenResponses URL 输入(`input_file` / `input_image`),请严格设置 `gateway.http.endpoints.responses.files.urlAllowlist` 和 - `gateway.http.endpoints.responses.images.urlAllowlist`,并保持较低的 `maxUrlParts`。 - 空 allowlist 会被视为未设置;如果你想完全禁用 URL 抓取,请使用 `files.allowUrl: false` / `images.allowUrl: false`。 -- 对于 OpenResponses 文件输入,解码后的 `input_file` 文本仍会作为**不受信任的外部内容**注入。不要因为 Gateway 网关是在本地解码文件,就认为文件文本是可信的。注入块仍然带有明确的 - `<<>>` 边界标记以及 `Source: External` - 元数据,尽管此路径省略了更长的 `SECURITY NOTICE:` 横幅。 -- 当媒体理解功能在将文本附加到媒体提示之前,从附带文档中提取文本时,也会应用同样基于标记的包装。 -- 对任何会接触不受信任输入的智能体启用沙箱隔离和严格的工具 allowlist。 -- 不要把密钥放进提示中;请通过 Gateway 网关主机上的环境变量 / 配置传递。 + `gateway.http.endpoints.responses.images.urlAllowlist`,并保持 `maxUrlParts` 较低。 + 空 allowlists 会被视为未设置;如果你想完全禁用 URL 抓取,请使用 `files.allowUrl: false` / `images.allowUrl: false`。 +- 对于 OpenResponses 文件输入,解码后的 `input_file` 文本仍会作为 + **不受信任的外部内容**注入。不要因为 Gateway 网关是在本地解码文件文本, + 就把它当成可信内容。注入块仍然带有显式的 + `<<>>` 边界标记和 `Source: External` + 元数据,只是这一路径省略了更长的 `SECURITY NOTICE:` 横幅。 +- 当 media-understanding 在将附加文档文本追加到媒体提示前提取文本时, + 同样会应用这种基于标记的包装。 +- 对任何会接触不受信任输入的智能体,启用沙箱隔离和严格的工具 allowlists。 +- 不要把 secrets 放进提示词;应通过 Gateway 网关主机上的环境变量 / 配置传递它们。 ### 模型强度(安全说明) -不同模型层级对提示注入的抵抗力**并不相同**。较小 / 较便宜的模型通常更容易受到工具滥用和指令劫持的影响,尤其是在对抗性提示下。 +不同模型层级的提示注入抵抗能力**并不一致**。更小 / 更便宜的模型通常更容易被对抗性提示诱导误用工具或劫持指令。 -对于启用了工具的智能体,或会读取不受信任内容的智能体,较旧 / 较小模型带来的提示注入风险通常过高。不要在弱模型层级上运行这些工作负载。 +对于启用了工具的智能体,或者会读取不受信任内容的智能体,较旧 / 较小模型带来的提示注入风险通常过高。不要在弱模型层级上运行这类工作负载。 建议: -- 对任何能够运行工具或接触文件 / 网络的机器人,**使用最新一代、最高层级的模型**。 -- **不要为启用了工具的智能体或不受信任的收件箱使用较旧 / 较弱 / 较小的层级**;提示注入风险过高。 -- 如果你必须使用较小的模型,**就要缩小影响半径**(只读工具、强沙箱隔离、最小文件系统访问、严格 allowlist)。 -- 运行小模型时,**为所有会话启用沙箱隔离**,并且**禁用 `web_search` / `web_fetch` / `browser`**,除非输入受到严格控制。 -- 对于仅聊天、输入可信且没有工具的个人助理,小模型通常是可以接受的。 +- 对任何可以运行工具或接触文件 / 网络的机器人,**使用最新一代、最高层级的模型**。 +- 对启用了工具的智能体或不受信任收件箱,**不要使用较旧 / 较弱 / 较小的层级**;提示注入风险过高。 +- 如果你必须使用较小模型,请**缩小爆炸半径**(只读工具、强沙箱隔离、最小文件系统访问、严格 allowlists)。 +- 运行小模型时,请**为所有会话启用沙箱隔离**,并**禁用 web_search / web_fetch / browser**,除非输入受到严格控制。 +- 对于仅聊天、输入受信任且无工具的个人助理,较小模型通常是可以接受的。 ## 群组中的推理与详细输出 -`/reasoning` 和 `/verbose` 可能会暴露原本不应出现在公开渠道中的内部推理或工具输出。在群组环境中,请将它们视为**仅供调试**的功能,除非你明确需要,否则请保持关闭。 +`/reasoning`、`/verbose` 和 `/trace` 可能暴露内部推理、工具 +输出或插件诊断信息,而这些内容 +原本并不适合公开渠道。在群组环境中,请将它们视为**仅用于调试** +的功能,除非你明确需要,否则应保持关闭。 -指导建议: +指南: -- 在公开房间中保持 `/reasoning` 和 `/verbose` 关闭。 -- 如果要启用,也只应在受信任的私信或严格受控的房间中启用。 -- 请记住:详细输出可能包含工具参数、URL 以及模型看到的数据。 +- 在公开房间中保持 `/reasoning`、`/verbose` 和 `/trace` 关闭。 +- 如果要启用,只在受信任的私信或严格受控的房间中启用。 +- 请记住:详细和 trace 输出可能包含工具参数、URL、插件诊断信息以及模型看到的数据。 ## 配置加固(示例) -### 0)文件权限 +### 0) 文件权限 -在 Gateway 网关主机上保持配置和状态私有: +在 Gateway 网关主机上保持配置 + 状态私有: -- `~/.openclaw/openclaw.json`:`600`(仅用户可读 / 可写) -- `~/.openclaw`:`700`(仅用户可访问) +- `~/.openclaw/openclaw.json`:`600`(仅用户可读 / 写) +- `~/.openclaw`:`700`(仅用户) -`openclaw doctor` 可以发出警告并提供收紧这些权限的选项。 +`openclaw doctor` 可以发出警告,并提供收紧这些权限的选项。 -### 0.4)网络暴露(bind + port + firewall) +### 0.4) 网络暴露(bind + port + firewall) -Gateway 网关会在单一端口上复用 **WebSocket + HTTP**: +Gateway 网关在单个端口上复用 **WebSocket + HTTP**: -- 默认:`18789` +- 默认值:`18789` - 配置 / 标志 / 环境变量:`gateway.port`、`--port`、`OPENCLAW_GATEWAY_PORT` -这个 HTTP 面包括控制 UI 和 canvas host: +这一 HTTP 暴露面包括 Control UI 和 canvas host: -- 控制 UI(SPA 资源)(默认基础路径 `/`) +- Control UI(SPA 静态资源)(默认基础路径 `/`) - Canvas host:`/__openclaw__/canvas/` 和 `/__openclaw__/a2ui/`(任意 HTML / JS;应将其视为不受信任内容) -如果你在普通浏览器中加载 canvas 内容,应像对待其他不受信任的网页一样对待它: +如果你在普通浏览器中加载 canvas 内容,请像对待其他不受信任网页一样处理它: - 不要将 canvas host 暴露给不受信任的网络 / 用户。 -- 除非你完全理解其中影响,否则不要让 canvas 内容与高权限 Web 表面共享同一来源。 +- 不要让 canvas 内容与有特权的 Web 入口面共享同一个 origin,除非你完全理解其影响。 -bind 模式控制 Gateway 网关监听的位置: +Bind 模式控制 Gateway 网关的监听位置: - `gateway.bind: "loopback"`(默认):只有本地客户端可以连接。 -- 非 loopback bind(`"lan"`、`"tailnet"`、`"custom"`)会扩大攻击面。只有在启用了 Gateway 网关认证(共享令牌 / 密码,或正确配置的非 loopback trusted proxy)并配合真实防火墙时才应使用。 +- 非 loopback bind(`"lan"`、`"tailnet"`、`"custom"`)会扩大攻击面。只有在启用了 Gateway 网关 auth(共享 token / password,或正确配置的非 loopback trusted proxy)并且有真实防火墙的情况下才应使用。 经验规则: - 优先使用 Tailscale Serve,而不是 LAN bind(Serve 会让 Gateway 网关保持在 loopback 上,由 Tailscale 处理访问)。 -- 如果必须 bind 到 LAN,请用防火墙将端口限制为严格的源 IP allowlist;不要大范围做端口转发。 -- 永远不要在 `0.0.0.0` 上以未认证方式暴露 Gateway 网关。 +- 如果你必须 bind 到 LAN,请使用防火墙将该端口限制为严格的源 IP allowlist;不要广泛进行端口转发。 +- 绝不要将未认证的 Gateway 网关暴露在 `0.0.0.0` 上。 -### 0.4.1)Docker 端口发布 + UFW(`DOCKER-USER`) +### 0.4.1) Docker 端口发布 + UFW(`DOCKER-USER`) 如果你在 VPS 上通过 Docker 运行 OpenClaw,请记住,已发布的容器端口 -(`-p HOST:CONTAINER` 或 Compose `ports:`)会经过 Docker 的转发链路, +(`-p HOST:CONTAINER` 或 Compose `ports:`)流量经过的是 Docker 的转发链, 而不只是主机的 `INPUT` 规则。 -为了让 Docker 流量与防火墙策略保持一致,请在 -`DOCKER-USER` 中强制执行规则(这个链会在 Docker 自己的 accept 规则之前评估)。 -在许多现代发行版中,`iptables` / `ip6tables` 使用 `iptables-nft` 前端, -但这些规则仍然会应用到 nftables 后端。 +为了让 Docker 流量与你的防火墙策略保持一致,请在 +`DOCKER-USER` 中强制实施规则(该链会在 Docker 自己的 accept 规则之前被评估)。 +在许多现代发行版上,`iptables` / `ip6tables` 使用的是 `iptables-nft` 前端, +但这些规则仍然会应用到底层的 nftables 后端。 最小 allowlist 示例(IPv4): ```bash -# /etc/ufw/after.rules(追加为独立的 *filter 段) +# /etc/ufw/after.rules(以独立的 *filter 段追加) *filter :DOCKER-USER - [0:0] -A DOCKER-USER -m conntrack --ctstate ESTABLISHED,RELATED -j RETURN @@ -791,8 +798,8 @@ COMMIT IPv6 使用独立的表。如果启用了 Docker IPv6,请在 `/etc/ufw/after6.rules` 中 添加对应策略。 -不要在文档示例中硬编码诸如 `eth0` 这样的接口名。不同 VPS 镜像的接口名 -各不相同(`ens3`、`enp*` 等),不匹配可能会导致你的拒绝规则被意外跳过。 +避免在文档示例中硬编码像 `eth0` 这样的接口名。接口名会因 VPS 镜像而异 +(`ens3`、`enp*` 等),如果不匹配,可能会意外跳过你的拒绝规则。 重新加载后的快速验证: @@ -803,22 +810,22 @@ ip6tables -S DOCKER-USER nmap -sT -p 1-65535 --open ``` -预期对外开放的端口应只包括你有意暴露的那些(对大多数配置来说: -SSH + 你的反向代理端口)。 +预期的对外开放端口应当只有你明确打算暴露的那些(对大多数 +配置来说:SSH + 你的反向代理端口)。 -### 0.4.2)mDNS / Bonjour 发现(信息泄露) +### 0.4.2) mDNS / Bonjour 发现(信息泄露) -Gateway 网关会通过 mDNS(端口 5353 上的 `_openclaw-gw._tcp`)广播自身存在,以便本地设备发现。在完整模式下,这还包括可能暴露运行细节的 TXT 记录: +Gateway 网关会通过 mDNS(端口 5353 上的 `_openclaw-gw._tcp`)广播自身存在,以支持本地设备发现。在完整模式下,这还会包含可能暴露运行细节的 TXT 记录: -- `cliPath`:CLI 二进制的完整文件系统路径(会暴露用户名和安装位置) -- `sshPort`:广播主机上可用的 SSH 端口 +- `cliPath`:CLI 二进制文件的完整文件系统路径(会泄露用户名和安装位置) +- `sshPort`:广播主机上 SSH 的可用性 - `displayName`、`lanHost`:主机名信息 -**运维安全注意事项:** 广播基础设施细节会让同一本地网络上的任何人更容易进行侦察。即使是文件系统路径和 SSH 可用性这类“看似无害”的信息,也能帮助攻击者绘制你的环境地图。 +**操作安全考量:** 广播基础设施细节会让本地网络上的任何人更容易进行侦察。即使像文件系统路径和 SSH 可用性这样“看似无害”的信息,也有助于攻击者绘制你的环境图谱。 **建议:** -1. **最小模式**(默认,推荐用于已暴露的 Gateway 网关):从 mDNS 广播中省略敏感字段: +1. **Minimal 模式**(默认,推荐用于暴露型 Gateway 网关):从 mDNS 广播中省略敏感字段: ```json5 { @@ -838,7 +845,7 @@ Gateway 网关会通过 mDNS(端口 5353 上的 `_openclaw-gw._tcp`)广播 } ``` -3. **完整模式**(显式选择加入):在 TXT 记录中包含 `cliPath` + `sshPort`: +3. **Full 模式**(选择启用):在 TXT 记录中包含 `cliPath` + `sshPort`: ```json5 { @@ -848,19 +855,19 @@ Gateway 网关会通过 mDNS(端口 5353 上的 `_openclaw-gw._tcp`)广播 } ``` -4. **环境变量**(替代方式):设置 `OPENCLAW_DISABLE_BONJOUR=1`,无需改配置即可禁用 mDNS。 +4. **环境变量**(替代方式):设置 `OPENCLAW_DISABLE_BONJOUR=1`,无需更改配置即可禁用 mDNS。 -在最小模式下,Gateway 网关仍会广播足够用于设备发现的信息(`role`、`gatewayPort`、`transport`),但会省略 `cliPath` 和 `sshPort`。需要 CLI 路径信息的应用,之后可以通过已认证的 WebSocket 连接获取。 +在 minimal 模式下,Gateway 网关仍会广播足够用于设备发现的信息(`role`、`gatewayPort`、`transport`),但会省略 `cliPath` 和 `sshPort`。需要 CLI 路径信息的应用可以通过经过身份验证的 WebSocket 连接来获取。 -### 0.5)锁定 Gateway 网关 WebSocket(本地认证) +### 0.5) 锁定 Gateway 网关 WebSocket(本地 auth) -默认情况下**必须启用** Gateway 网关认证。如果没有配置有效的 Gateway 网关认证路径, -Gateway 网关会拒绝 WebSocket 连接(以关闭方式失败)。 +默认情况下**必须启用** Gateway 网关 auth。如果未配置任何有效的 Gateway 网关 auth 路径, +Gateway 网关会拒绝 WebSocket 连接(失败关闭)。 -新手引导默认会生成一个令牌(即使是在 loopback 上),因此 -本地客户端也必须进行认证。 +新手引导默认会生成一个 token(即使是 loopback),因此 +本地客户端也必须进行身份验证。 -设置一个令牌,这样**所有** WS 客户端都必须认证: +设置 token,以便**所有** WS 客户端都必须完成身份验证: ```json5 { @@ -873,130 +880,128 @@ Gateway 网关会拒绝 WebSocket 连接(以关闭方式失败)。 Doctor 可以为你生成一个:`openclaw doctor --generate-gateway-token`。 注意:`gateway.remote.token` / `.password` 是客户端凭证来源。 -它们本身**不会**保护本地 WS 访问。 -只有在 `gateway.auth.*` 未设置时, -本地调用路径才会把 `gateway.remote.*` 作为回退使用。 -如果通过 SecretRef 显式配置了 `gateway.auth.token` / `gateway.auth.password`,但未能解析, -则解析会以关闭方式失败(不会由远程回退悄悄掩盖)。 -可选:在使用 `wss://` 时,可通过 `gateway.remote.tlsFingerprint` 固定远程 TLS。 -默认情况下,明文 `ws://` 仅限 loopback。对于受信任的私有网络路径, -可在客户端进程上设置 `OPENCLAW_ALLOW_INSECURE_PRIVATE_WS=1` 作为紧急兜底。 +它们**本身不会**保护本地 WS 访问。 +只有在 `gateway.auth.*` 未设置时,本地调用路径才可以将 `gateway.remote.*` 作为回退来源。 +如果通过 SecretRef 显式配置了 `gateway.auth.token` / `gateway.auth.password`,但无法解析,则会失败关闭(不会用远程回退来掩盖)。 +可选:使用 `wss://` 时,可通过 `gateway.remote.tlsFingerprint` 固定远程 TLS。 +纯文本 `ws://` 默认仅限 loopback。对于受信任的私有网络 +路径,可在客户端进程上设置 `OPENCLAW_ALLOW_INSECURE_PRIVATE_WS=1` 作为紧急兜底。 本地设备配对: -- 对于直接的本地 loopback 连接,设备配对会自动批准, - 以保持同主机客户端体验顺畅。 -- OpenClaw 还提供了一条狭义的后端 / 容器本地自连接路径,用于 +- 为了让同主机客户端使用更顺畅,直接本地 loopback 连接会自动批准设备配对。 +- OpenClaw 还提供一条窄范围的后端 / 容器本地自连接路径,用于 受信任的共享密钥辅助流程。 -- Tailnet 和 LAN 连接,包括同一主机上的 tailnet bind, - 在配对上都被视为远程连接,仍然需要批准。 +- Tailnet 和 LAN 连接(包括同主机 tailnet bind)在配对方面都被视为远程连接,仍然需要批准。 -认证模式: +Auth 模式: -- `gateway.auth.mode: "token"`:共享 bearer 令牌(推荐用于大多数配置)。 -- `gateway.auth.mode: "password"`:密码认证(建议通过环境变量设置:`OPENCLAW_GATEWAY_PASSWORD`)。 -- `gateway.auth.mode: "trusted-proxy"`:信任具备身份感知能力的反向代理,由其认证用户并通过头传递身份(参见 [Trusted Proxy Auth](/zh-CN/gateway/trusted-proxy-auth))。 +- `gateway.auth.mode: "token"`:共享 bearer token(大多数场景推荐)。 +- `gateway.auth.mode: "password"`:密码 auth(建议通过环境变量设置:`OPENCLAW_GATEWAY_PASSWORD`)。 +- `gateway.auth.mode: "trusted-proxy"`:信任具备身份感知能力的反向代理来为用户完成身份验证,并通过头部传递身份(见 [Trusted Proxy Auth](/zh-CN/gateway/trusted-proxy-auth))。 -轮换检查清单(令牌 / 密码): +轮换检查清单(token / password): -1. 生成 / 设置新的密钥(`gateway.auth.token` 或 `OPENCLAW_GATEWAY_PASSWORD`)。 -2. 重启 Gateway 网关(如果由 macOS 应用托管 Gateway 网关,则重启该应用)。 -3. 更新所有远程客户端(调用该 Gateway 网关的机器上的 `gateway.remote.token` / `.password`)。 +1. 生成 / 设置新的 secret(`gateway.auth.token` 或 `OPENCLAW_GATEWAY_PASSWORD`)。 +2. 重启 Gateway 网关(如果由 macOS 应用监管 Gateway 网关,则重启该应用)。 +3. 更新所有远程客户端(在会调用该 Gateway 网关的机器上更新 `gateway.remote.token` / `.password`)。 4. 验证旧凭证已无法再建立连接。 -### 0.6)Tailscale Serve 身份头 +### 0.6) Tailscale Serve 身份头 当 `gateway.auth.allowTailscale` 为 `true`(Serve 的默认值)时,OpenClaw -会接受 Tailscale Serve 身份头(`tailscale-user-login`)用于控制 UI / WebSocket 认证。OpenClaw 会通过本地 Tailscale 守护进程解析 -`x-forwarded-for` 地址(`tailscale whois`),并将其与该头进行匹配,以验证身份。这个流程仅会在请求命中 loopback, -并且包含由 Tailscale 注入的 `x-forwarded-for`、`x-forwarded-proto` 和 `x-forwarded-host` 时触发。 -对于这条异步身份校验路径,来自同一 `{scope, ip}` -的失败尝试会先被串行化,然后限流器才记录失败。因此,同一个 Serve 客户端发起的并发错误重试 -可能会让第二次尝试被立即锁定,而不是像两个普通不匹配那样发生竞态。 +会接受 Tailscale Serve 身份头(`tailscale-user-login`)用于 Control +UI / WebSocket 身份验证。OpenClaw 会通过本地 Tailscale 守护进程 +(`tailscale whois`)解析 `x-forwarded-for` 地址并与该头进行匹配,以验证身份。这仅会在请求命中 loopback 且包含由 Tailscale 注入的 +`x-forwarded-for`、`x-forwarded-proto` 和 `x-forwarded-host` +时触发。 +对于这条异步身份检查路径,来自同一 `{scope, ip}` +的失败尝试会在限流器记录失败之前被串行化。因此,同一个 Serve 客户端的并发错误重试 +可能会让第二次尝试立即被锁定,而不是像两个普通不匹配那样竞速通过。 HTTP API 端点(例如 `/v1/*`、`/tools/invoke` 和 `/api/channels/*`) -**不会**使用 Tailscale 身份头认证。它们仍然遵循 Gateway 网关 -所配置的 HTTP 认证模式。 +**不会**使用 Tailscale 身份头 auth。它们仍然遵循 Gateway 网关 +已配置的 HTTP auth 模式。 重要边界说明: -- Gateway 网关 HTTP bearer 认证在效果上等同于全有或全无的操作员访问。 -- 任何可以调用 `/v1/chat/completions`、`/v1/responses` 或 `/api/channels/*` 的凭证,都应视为该 Gateway 网关的全访问操作员密钥。 -- 在兼容 OpenAI 的 HTTP 表面上,共享密钥 bearer 认证会恢复完整的默认操作员作用域(`operator.admin`、`operator.approvals`、`operator.pairing`、`operator.read`、`operator.talk.secrets`、`operator.write`)以及智能体轮次中的 owner 语义;更窄的 `x-openclaw-scopes` 值不会缩小这条共享密钥路径的权限。 -- 在 HTTP 上,逐请求作用域语义仅适用于带有身份信息的模式,例如 trusted proxy 认证,或私有入口上的 `gateway.auth.mode="none"`。 -- 在这些带身份信息的模式下,如果省略 `x-openclaw-scopes`,则会回退到普通的默认操作员作用域集合;如果你想使用更窄的作用域集,请显式发送该头。 -- `/tools/invoke` 遵循相同的共享密钥规则:基于令牌 / 密码的 bearer 认证在那里同样会被视为完整操作员访问,而带身份信息的模式仍会遵循声明的作用域。 -- 不要将这些凭证共享给不受信任的调用方;请为不同信任边界优先使用独立的 Gateway 网关。 +- Gateway 网关 HTTP bearer auth 实际上等同于全有或全无的操作员访问。 +- 将能够调用 `/v1/chat/completions`、`/v1/responses` 或 `/api/channels/*` 的凭证视为该 Gateway 网关的完全访问操作员 secret。 +- 在 OpenAI 兼容的 HTTP 入口面上,共享 secret bearer auth 会恢复完整的默认操作员作用域(`operator.admin`、`operator.approvals`、`operator.pairing`、`operator.read`、`operator.talk.secrets`、`operator.write`)以及面向智能体轮次的 owner 语义;更窄的 `x-openclaw-scopes` 值不会收缩这条共享 secret 路径。 +- HTTP 上的按请求作用域语义只在请求来自带身份模式时适用,例如 trusted proxy auth,或者私有入口上的 `gateway.auth.mode="none"`。 +- 在这些带身份的模式中,如果省略 `x-openclaw-scopes`,则会回退到普通的默认操作员作用域集合;如果你想使用更窄的作用域集合,请显式发送该头。 +- `/tools/invoke` 遵循相同的共享 secret 规则:token / password bearer auth 在这里同样被视为完整操作员访问,而带身份模式仍会遵守声明的作用域。 +- 不要与不受信任的调用方共享这些凭证;应按信任边界使用单独的 Gateway 网关。 -**信任假设:** 无令牌的 Serve 认证假设 Gateway 网关主机本身是受信任的。 -不要把它当作抵御同主机敌对进程的保护机制。如果 Gateway 网关主机上 -可能运行不受信任的本地代码,请禁用 `gateway.auth.allowTailscale`,并要求显式共享密钥认证,使用 `gateway.auth.mode: "token"` 或 -`"password"`。 +**信任假设:** 无 token 的 Serve auth 假设 Gateway 网关主机本身是受信任的。 +不要把它当作防御同主机恶意进程的机制。如果 Gateway 网关主机上可能运行不受信任的 +本地代码,请禁用 `gateway.auth.allowTailscale`,并要求显式共享 secret auth, +即使用 `gateway.auth.mode: "token"` 或 `"password"`。 -**安全规则:** 不要从你自己的反向代理转发这些头。如果 +**安全规则:** 不要通过你自己的反向代理转发这些头。如果 你在 Gateway 网关前终止 TLS 或做代理,请禁用 -`gateway.auth.allowTailscale`,并改用共享密钥认证(`gateway.auth.mode: +`gateway.auth.allowTailscale`,并改用共享 secret auth(`gateway.auth.mode: "token"` 或 `"password"`)或 [Trusted Proxy Auth](/zh-CN/gateway/trusted-proxy-auth)。 受信任代理: - 如果你在 Gateway 网关前终止 TLS,请将 `gateway.trustedProxies` 设置为你的代理 IP。 -- OpenClaw 会信任来自这些 IP 的 `x-forwarded-for`(或 `x-real-ip`),用它来确定客户端 IP,以进行本地配对检查和 HTTP 认证 / 本地检查。 +- OpenClaw 会信任来自这些 IP 的 `x-forwarded-for`(或 `x-real-ip`),以确定客户端 IP,用于本地配对检查以及 HTTP auth / 本地检查。 - 确保你的代理会**覆盖** `x-forwarded-for`,并阻止直接访问 Gateway 网关端口。 -参见 [Tailscale](/zh-CN/gateway/tailscale) 和 [Web overview](/web)。 +参见 [Tailscale](/zh-CN/gateway/tailscale) 和 [Web 概览](/web)。 -### 0.6.1)通过节点主机进行浏览器控制(推荐) +### 0.6.1) 通过节点主机进行浏览器控制(推荐) -如果你的 Gateway 网关位于远程位置,而浏览器运行在另一台机器上,请在浏览器所在机器上运行一个**节点主机**, -让 Gateway 网关代理浏览器操作(参见 [Browser tool](/zh-CN/tools/browser))。 -请将节点配对视为管理员访问。 +如果你的 Gateway 网关位于远端,而浏览器运行在另一台机器上,请在浏览器所在机器上运行一个**节点主机**, +让 Gateway 网关代理浏览器操作(见 [浏览器工具](/zh-CN/tools/browser))。 +请将节点配对视为管理员级访问。 推荐模式: -- 让 Gateway 网关和节点主机位于同一个 tailnet(Tailscale)中。 -- 有意识地进行节点配对;如果你不需要浏览器代理路由,请将其禁用。 +- 保持 Gateway 网关和节点主机位于同一 tailnet(Tailscale)中。 +- 有意识地完成节点配对;如果你不需要浏览器代理路由,就将其关闭。 -避免: +应避免: -- 通过 LAN 或公共互联网暴露中继 / 控制端口。 +- 通过 LAN 或公共互联网暴露 relay / control 端口。 - 对浏览器控制端点使用 Tailscale Funnel(公共暴露)。 -### 0.7)磁盘上的密钥(敏感数据) +### 0.7) 磁盘上的 secrets(敏感数据) -假设 `~/.openclaw/`(或 `$OPENCLAW_STATE_DIR/`)下的任何内容都可能包含密钥或私密数据: +请假设 `~/.openclaw/`(或 `$OPENCLAW_STATE_DIR/`)下的任何内容都可能包含 secrets 或私密数据: -- `openclaw.json`:配置中可能包含令牌(Gateway 网关、远程 Gateway 网关)、提供商设置和 allowlist。 -- `credentials/**`:渠道凭证(例如 WhatsApp 凭证)、配对 allowlist、旧版 OAuth 导入。 -- `agents//agent/auth-profiles.json`:API 密钥、令牌配置文件、OAuth 令牌,以及可选的 `keyRef` / `tokenRef`。 -- `secrets.json`(可选):供 `file` SecretRef 提供商(`secrets.providers`)使用的基于文件的密钥载荷。 -- `agents//agent/auth.json`:旧版兼容文件。发现静态 `api_key` 条目时会进行清理。 -- `agents//sessions/**`:会话转录(`*.jsonl`)+ 路由元数据(`sessions.json`),其中可能包含私人消息和工具输出。 -- 内置插件包:已安装的插件(以及它们的 `node_modules/`)。 -- `sandboxes/**`:工具沙箱工作区;可能会累积你在沙箱中读取 / 写入文件的副本。 +- `openclaw.json`:配置中可能包含 token(Gateway 网关、远程 Gateway 网关)、provider 设置和 allowlists。 +- `credentials/**`:渠道凭证(例如 WhatsApp 凭证)、配对 allowlists、旧版 OAuth 导入。 +- `agents//agent/auth-profiles.json`:API keys、token 配置文件、OAuth tokens,以及可选的 `keyRef` / `tokenRef`。 +- `secrets.json`(可选):基于文件的 secret 负载,供 `file` SecretRef providers(`secrets.providers`)使用。 +- `agents//agent/auth.json`:旧版兼容文件。发现静态 `api_key` 条目时会自动清除。 +- `agents//sessions/**`:会话转录(`*.jsonl`)+ 路由元数据(`sessions.json`),其中可能包含私信和工具输出。 +- 内置插件包:已安装插件(以及它们的 `node_modules/`)。 +- `sandboxes/**`:工具沙箱工作区;其中可能累积你在沙箱内读写文件的副本。 加固建议: - 保持严格权限(目录 `700`,文件 `600`)。 - 在 Gateway 网关主机上使用全盘加密。 -- 如果主机由多人共享,优先为 Gateway 网关使用专用操作系统用户账号。 +- 如果主机是共享的,优先为 Gateway 网关使用专用的 OS 用户账号。 -### 0.8)日志 + 转录(脱敏 + 保留) +### 0.8) 日志 + 转录内容(脱敏 + 保留) -即使访问控制配置正确,日志和转录仍然可能泄露敏感信息: +即使访问控制正确,日志和转录内容仍可能泄露敏感信息: - Gateway 网关日志可能包含工具摘要、错误和 URL。 -- 会话转录可能包含粘贴的密钥、文件内容、命令输出和链接。 +- 会话转录内容可能包含粘贴的 secrets、文件内容、命令输出和链接。 建议: - 保持工具摘要脱敏开启(`logging.redactSensitive: "tools"`;默认值)。 -- 通过 `logging.redactPatterns` 为你的环境添加自定义模式(令牌、主机名、内部 URL)。 -- 在分享诊断信息时,优先使用 `openclaw status --all`(可直接粘贴,密钥已脱敏),而不是原始日志。 -- 如果不需要长期保留,请清理旧的会话转录和日志文件。 +- 通过 `logging.redactPatterns` 为你的环境添加自定义模式(tokens、主机名、内部 URL)。 +- 共享诊断信息时,优先使用 `openclaw status --all`(可直接粘贴,secrets 已脱敏),而不是原始日志。 +- 如果你不需要长期保留,请清理旧的会话转录内容和日志文件。 -详情参见:[Logging](/zh-CN/gateway/logging) +详情见:[日志记录](/zh-CN/gateway/logging) -### 1)私信:默认使用 pairing +### 1) 私信:默认使用 pairing ```json5 { @@ -1004,7 +1009,7 @@ HTTP API 端点(例如 `/v1/*`、`/tools/invoke` 和 `/api/channels/*`) } ``` -### 2)群组:全部要求提及 +### 2) 群组:全局要求提及 ```json { @@ -1026,31 +1031,31 @@ HTTP API 端点(例如 `/v1/*`、`/tools/invoke` 和 `/api/channels/*`) } ``` -在群聊中,只有在被明确提及时才进行回复。 +在群聊中,只有被明确提及时才回复。 -### 3)分开号码(WhatsApp、Signal、Telegram) +### 3) 分开号码(WhatsApp、Signal、Telegram) -对于基于电话号码的渠道,请考虑让你的 AI 使用一个与你个人号码分开的号码运行: +对于基于手机号的渠道,建议考虑让你的 AI 使用与个人号码不同的独立号码: - 个人号码:你的对话保持私密 -- 机器人号码:AI 处理这些对话,并设置适当的边界 +- 机器人号码:由 AI 处理,并设置适当边界 -### 4)只读模式(通过沙箱 + 工具) +### 4) 只读模式(通过沙箱 + 工具) -你可以通过组合以下方式构建只读 profile: +你可以通过组合以下设置构建一个只读 profile: -- `agents.defaults.sandbox.workspaceAccess: "ro"`(或 `"none"`,表示完全不访问工作区) +- `agents.defaults.sandbox.workspaceAccess: "ro"`(或者使用 `"none"` 以完全禁用工作区访问) - 阻止 `write`、`edit`、`apply_patch`、`exec`、`process` 等的工具 allow / deny 列表 -额外加固选项: +其他加固选项: -- `tools.exec.applyPatch.workspaceOnly: true`(默认):确保 `apply_patch` 即使在未启用沙箱隔离时,也无法在工作区目录之外写入 / 删除。只有当你明确希望 `apply_patch` 访问工作区外文件时,才将其设置为 `false`。 -- `tools.fs.workspaceOnly: true`(可选):将 `read` / `write` / `edit` / `apply_patch` 路径以及原生提示图像自动加载路径限制在工作区目录内(如果你当前允许绝对路径,并希望加上一个统一护栏,这会很有用)。 -- 保持文件系统根路径范围狭窄:避免把你的主目录这类宽泛根路径作为智能体工作区 / 沙箱工作区。宽泛根路径可能会让文件系统工具暴露敏感本地文件(例如 `~/.openclaw` 下的状态 / 配置)。 +- `tools.exec.applyPatch.workspaceOnly: true`(默认):确保即使关闭了沙箱隔离,`apply_patch` 也不能在工作区目录之外写入 / 删除。只有当你明确希望 `apply_patch` 触及工作区外文件时,才将其设为 `false`。 +- `tools.fs.workspaceOnly: true`(可选):将 `read` / `write` / `edit` / `apply_patch` 路径,以及原生提示图像自动加载路径限制在工作区目录内(如果你目前允许绝对路径,并希望有一个统一护栏,这会很有用)。 +- 保持文件系统根范围尽可能小:避免将你的主目录这类宽范围根目录用作智能体工作区 / 沙箱工作区。宽范围根目录可能会让文件系统工具接触到敏感本地文件(例如 `~/.openclaw` 下的状态 / 配置)。 -### 5)安全基线(可直接复制 / 粘贴) +### 5) 安全基线(可直接复制 / 粘贴) -一个“安全默认”配置:保持 Gateway 网关私有、要求私信 pairing,并避免群组机器人始终在线: +下面是一份“安全默认值”配置,可让 Gateway 网关保持私有、要求私信 pairing,并避免始终在线的群组机器人: ```json5 { @@ -1069,9 +1074,9 @@ HTTP API 端点(例如 `/v1/*`、`/tools/invoke` 和 `/api/channels/*`) } ``` -如果你还希望工具执行也“默认更安全”,请为任何非所有者智能体添加沙箱,并拒绝危险工具(参见下方“按智能体划分的访问 profile”示例)。 +如果你还希望工具执行也“默认更安全”,可为任何非 owner 智能体添加沙箱隔离 + 禁用危险工具(见下文“按智能体划分的访问配置”示例)。 -聊天驱动的智能体轮次内置基线:非所有者发送者不能使用 `cron` 或 `gateway` 工具。 +面向聊天驱动型智能体轮次的内置基线:非 owner 发送者不能使用 `cron` 或 `gateway` 工具。 ## 沙箱隔离(推荐) @@ -1080,58 +1085,58 @@ HTTP API 端点(例如 `/v1/*`、`/tools/invoke` 和 `/api/channels/*`) 两种互补方式: - **在 Docker 中运行完整 Gateway 网关**(容器边界):[Docker](/zh-CN/install/docker) -- **工具沙箱**(`agents.defaults.sandbox`,主机运行 Gateway 网关 + 用 Docker 隔离工具):[沙箱隔离](/zh-CN/gateway/sandboxing) +- **工具沙箱**(`agents.defaults.sandbox`,Gateway 网关运行在主机上 + 工具运行在 Docker 隔离环境中):[沙箱隔离](/zh-CN/gateway/sandboxing) -注意:为了防止跨智能体访问,请将 `agents.defaults.sandbox.scope` 保持为 `"agent"`(默认) +注意:为防止跨智能体访问,请将 `agents.defaults.sandbox.scope` 保持为 `"agent"`(默认) 或使用 `"session"` 以获得更严格的按会话隔离。`scope: "shared"` 会使用 -单个容器 / 工作区。 +单一容器 / 工作区。 -同时也要考虑沙箱内部的智能体工作区访问: +还要考虑沙箱中的智能体工作区访问: -- `agents.defaults.sandbox.workspaceAccess: "none"`(默认)会禁止访问智能体工作区;工具会针对 `~/.openclaw/sandboxes` 下的沙箱工作区运行 -- `agents.defaults.sandbox.workspaceAccess: "ro"` 会把智能体工作区以只读方式挂载到 `/agent`(会禁用 `write` / `edit` / `apply_patch`) -- `agents.defaults.sandbox.workspaceAccess: "rw"` 会把智能体工作区以读写方式挂载到 `/workspace` -- 额外的 `sandbox.docker.binds` 会根据规范化和 canonicalized 后的源路径进行校验。如果父级符号链接技巧或主目录规范别名最终解析到诸如 `/etc`、`/var/run` 或操作系统主目录下凭证目录等被阻止的根路径,仍会以关闭方式失败。 +- `agents.defaults.sandbox.workspaceAccess: "none"`(默认)会将智能体工作区保持为不可访问;工具会针对 `~/.openclaw/sandboxes` 下的沙箱工作区运行 +- `agents.defaults.sandbox.workspaceAccess: "ro"` 会将智能体工作区以只读方式挂载到 `/agent`(会禁用 `write` / `edit` / `apply_patch`) +- `agents.defaults.sandbox.workspaceAccess: "rw"` 会将智能体工作区以读写方式挂载到 `/workspace` +- 额外的 `sandbox.docker.binds` 会基于规范化和 canonicalized 后的源路径进行验证。如果父目录符号链接技巧和规范 home 别名最终解析到了被阻止的根路径(例如 `/etc`、`/var/run` 或 OS home 下的凭证目录),仍然会以失败关闭方式拒绝。 -重要说明:`tools.elevated` 是全局基线逃逸通道,会在沙箱之外运行 exec。其实际主机默认是 `gateway`,当 exec 目标配置为 `node` 时则为 `node`。请保持 `tools.elevated.allowFrom` 范围严格,不要为陌生人启用。你还可以通过 `agents.list[].tools.elevated` 进一步按智能体限制高权限模式。参见 [Elevated Mode](/zh-CN/tools/elevated)。 +重要说明:`tools.elevated` 是全局基线逃逸口,它会让 exec 在沙箱外运行。默认有效 host 是 `gateway`,当 exec 目标配置为 `node` 时则为 `node`。请保持 `tools.elevated.allowFrom` 范围严格,不要对陌生人启用它。你还可以通过 `agents.list[].tools.elevated` 按智能体进一步限制 elevated。参见 [提升权限模式](/zh-CN/tools/elevated)。 ### 子智能体委派护栏 如果你允许会话工具,请将委派给子智能体的运行视为另一项边界决策: -- 除非智能体确实需要委派,否则拒绝 `sessions_spawn`。 -- 保持 `agents.defaults.subagents.allowAgents` 以及任何按智能体覆盖的 `agents.list[].subagents.allowAgents` 仅限于已知安全的目标智能体。 -- 对于任何必须保持沙箱隔离的工作流,请使用 `sandbox: "require"` 调用 `sessions_spawn`(默认值为 `inherit`)。 +- 除非该智能体确实需要委派,否则应拒绝 `sessions_spawn`。 +- 将 `agents.defaults.subagents.allowAgents` 以及任何按智能体覆盖的 `agents.list[].subagents.allowAgents` 限制在已知安全的目标智能体范围内。 +- 对于任何必须保持沙箱隔离的工作流,请使用 `sandbox: "require"` 调用 `sessions_spawn`(默认值是 `inherit`)。 - 当目标子运行时未启用沙箱隔离时,`sandbox: "require"` 会快速失败。 ## 浏览器控制风险 -启用浏览器控制意味着模型可以驱动一个真实浏览器。 -如果该浏览器配置文件已经登录了各种会话,模型就可以 -访问这些账号和数据。请将浏览器配置文件视为**敏感状态**: +启用浏览器控制后,模型就拥有了驱动真实浏览器的能力。 +如果该浏览器 profile 已经包含登录会话,模型就可以 +访问这些账号和数据。请将浏览器 profile 视为**敏感状态**: -- 优先为智能体使用专用配置文件(默认 `openclaw` 配置文件)。 -- 避免将智能体指向你的个人日常主配置文件。 -- 除非你信任这些智能体,否则应为启用了沙箱隔离的智能体关闭主机浏览器控制。 -- 独立的 loopback 浏览器控制 API 只接受共享密钥认证 - (Gateway 网关令牌 bearer 认证或 Gateway 网关密码)。它不会使用 +- 优先为智能体使用专用 profile(默认 `openclaw` profile)。 +- 避免让智能体使用你的个人日常主力 profile。 +- 对于沙箱隔离的智能体,除非你信任它们,否则应保持主机浏览器控制关闭。 +- 独立的 loopback 浏览器控制 API 只接受共享 secret auth + (Gateway 网关 token bearer auth 或 Gateway 网关 password)。它不会使用 trusted-proxy 或 Tailscale Serve 身份头。 - 将浏览器下载内容视为不受信任输入;优先使用隔离的下载目录。 -- 如有可能,在智能体配置文件中禁用浏览器同步 / 密码管理器(可缩小影响半径)。 -- 对于远程 Gateway 网关,请将“浏览器控制”视为等同于对该配置文件所能访问内容的“操作员访问”。 -- 保持 Gateway 网关和节点主机仅在 tailnet 中可访问;避免将浏览器控制端口暴露到 LAN 或公共互联网。 +- 尽可能在智能体 profile 中禁用浏览器同步 / 密码管理器(降低爆炸半径)。 +- 对于远程 Gateway 网关,应将“浏览器控制”等同于“对该 profile 可访问内容的操作员级访问”。 +- 保持 Gateway 网关和节点主机仅在 tailnet 内可达;避免将浏览器控制端口暴露到 LAN 或公共互联网。 - 在不需要时关闭浏览器代理路由(`gateway.nodes.browser.mode="off"`)。 -- Chrome MCP 的现有会话模式**并不更安全**;它会以你的身份访问该主机 Chrome 配置文件所能访问的任何内容。 +- Chrome MCP 的 existing-session 模式**并不更安全**;它可以像你一样操作该主机 Chrome profile 可访问的任何内容。 ### 浏览器 SSRF 策略(默认严格) -OpenClaw 的浏览器导航策略默认是严格的:私有 / 内部目标默认保持阻止状态,除非你显式选择加入。 +OpenClaw 的浏览器导航策略默认是严格的:私有 / 内部目标默认保持阻止状态,除非你显式选择启用。 - 默认:`browser.ssrfPolicy.dangerouslyAllowPrivateNetwork` 未设置,因此浏览器导航会继续阻止私有 / 内部 / 特殊用途目标。 -- 旧版别名:为兼容性起见,仍接受 `browser.ssrfPolicy.allowPrivateNetwork`。 -- 显式选择加入模式:设置 `browser.ssrfPolicy.dangerouslyAllowPrivateNetwork: true`,以允许私有 / 内部 / 特殊用途目标。 -- 在严格模式下,使用 `hostnameAllowlist`(如 `*.example.com` 这样的模式)和 `allowedHostnames`(精确主机例外,包括像 `localhost` 这样的默认阻止名称)来配置显式例外。 -- 为减少基于重定向的跳转,系统会在请求前检查导航目标,并在导航结束后的最终 `http(s)` URL 上尽力再次检查。 +- 旧版别名:`browser.ssrfPolicy.allowPrivateNetwork` 仍可出于兼容性而使用。 +- 选择启用模式:设置 `browser.ssrfPolicy.dangerouslyAllowPrivateNetwork: true`,以允许访问私有 / 内部 / 特殊用途目标。 +- 在严格模式下,使用 `hostnameAllowlist`(如 `*.example.com` 这类模式)和 `allowedHostnames`(精确主机例外,包括像 `localhost` 这样的被阻止名称)来添加显式例外。 +- 系统会在请求前检查导航目标,并在导航结束后的最终 `http(s)` URL 上尽力再次检查,以降低基于重定向的 pivot 风险。 严格策略示例: @@ -1147,17 +1152,17 @@ OpenClaw 的浏览器导航策略默认是严格的:私有 / 内部目标默 } ``` -## 按智能体划分的访问 profile(多智能体) +## 按智能体划分的访问配置(多智能体) -在多智能体路由中,每个智能体都可以有自己的沙箱 + 工具策略: -利用这一点,你可以为不同智能体分别赋予**完全访问**、**只读**或**无访问**权限。 -完整详情和优先级规则参见 [Multi-Agent Sandbox & Tools](/zh-CN/tools/multi-agent-sandbox-tools)。 +在多智能体路由中,每个智能体都可以有自己的沙箱隔离 + 工具策略: +你可以借此为不同智能体分配**完全访问**、**只读**或**无访问权限**。 +完整细节和优先级规则见 [多智能体沙箱隔离与工具](/zh-CN/tools/multi-agent-sandbox-tools)。 常见用例: - 个人智能体:完全访问,不使用沙箱 - 家庭 / 工作智能体:启用沙箱隔离 + 只读工具 -- 公开智能体:启用沙箱隔离 + 不允许文件系统 / shell 工具 +- 公开智能体:启用沙箱隔离 + 无文件系统 / Shell 工具 ### 示例:完全访问(无沙箱) @@ -1199,7 +1204,7 @@ OpenClaw 的浏览器导航策略默认是严格的:私有 / 内部目标默 } ``` -### 示例:无文件系统 / shell 访问(允许提供商消息工具) +### 示例:无文件系统 / Shell 访问(允许 provider 消息工具) ```json5 { @@ -1213,8 +1218,8 @@ OpenClaw 的浏览器导航策略默认是严格的:私有 / 内部目标默 scope: "agent", workspaceAccess: "none", }, - // 会话工具可能会从转录中泄露敏感数据。默认情况下,OpenClaw 将这些工具限制为 - // 当前会话 + 由其派生的子智能体会话,但如果需要,你还可以进一步收紧。 + // 会话工具可能泄露转录内容中的敏感数据。默认情况下,OpenClaw 将这些工具限制为 + // 当前会话 + 生成的子智能体会话,但如有需要,你可以进一步收紧。 // 参见配置参考中的 `tools.sessions.visibility`。 tools: { sessions: { visibility: "tree" }, // self | tree | agent | all @@ -1250,9 +1255,9 @@ OpenClaw 的浏览器导航策略默认是严格的:私有 / 内部目标默 } ``` -## 你应该告诉 AI 什么 +## 该如何告诉你的 AI -请在你的智能体系统提示中加入安全指南: +在智能体的系统提示中加入安全指南: ``` ## Security Rules @@ -1269,35 +1274,35 @@ OpenClaw 的浏览器导航策略默认是严格的:私有 / 内部目标默 ### 遏制 -1. **先停止它:** 停止 macOS 应用(如果它在托管 Gateway 网关),或终止你的 `openclaw gateway` 进程。 -2. **关闭暴露面:** 将 `gateway.bind` 设为 `"loopback"`(或禁用 Tailscale Funnel / Serve),直到你弄清发生了什么。 -3. **冻结访问:** 将高风险私信 / 群组切换为 `dmPolicy: "disabled"` / 要求提及,并删除你曾经设置过的 `"*"` 全允许条目。 +1. **立即停止:** 停止 macOS 应用(如果它在监管 Gateway 网关),或终止你的 `openclaw gateway` 进程。 +2. **关闭暴露面:** 将 `gateway.bind` 设为 `"loopback"`(或禁用 Tailscale Funnel / Serve),直到你弄清楚发生了什么。 +3. **冻结访问:** 将高风险私信 / 群组切换为 `dmPolicy: "disabled"` / 要求提及,并移除你此前配置的 `"*"` 全开放条目。 -### 轮换(如果密钥已泄露,则按已失陷处理) +### 轮换(如果 secrets 已泄露,则按已失陷处理) -1. 轮换 Gateway 网关认证(`gateway.auth.token` / `OPENCLAW_GATEWAY_PASSWORD`)并重启。 -2. 轮换所有可以调用 Gateway 网关的机器上的远程客户端密钥(`gateway.remote.token` / `.password`)。 -3. 轮换提供商 / API 凭证(WhatsApp 凭证、Slack / Discord 令牌、`auth-profiles.json` 中的模型 / API 密钥,以及启用时加密密钥载荷中的值)。 +1. 轮换 Gateway 网关 auth(`gateway.auth.token` / `OPENCLAW_GATEWAY_PASSWORD`)并重启。 +2. 轮换所有可调用该 Gateway 网关机器上的远程客户端 secrets(`gateway.remote.token` / `.password`)。 +3. 轮换 provider / API 凭证(WhatsApp 凭证、Slack / Discord tokens、`auth-profiles.json` 中的模型 / API keys,以及启用时的加密 secrets 负载值)。 ### 审计 1. 检查 Gateway 网关日志:`/tmp/openclaw/openclaw-YYYY-MM-DD.log`(或 `logging.file`)。 -2. 审查相关转录:`~/.openclaw/agents//sessions/*.jsonl`。 -3. 审查最近的配置更改(任何可能扩大访问范围的内容:`gateway.bind`、`gateway.auth`、私信 / 群组策略、`tools.elevated`、插件变更)。 -4. 重新运行 `openclaw security audit --deep`,并确认关键发现已被解决。 +2. 查看相关转录内容:`~/.openclaw/agents//sessions/*.jsonl`。 +3. 查看最近的配置变更(任何可能扩大访问范围的项:`gateway.bind`、`gateway.auth`、私信 / 群组策略、`tools.elevated`、插件变更)。 +4. 重新运行 `openclaw security audit --deep`,并确认 critical 级发现已全部解决。 -### 为报告收集信息 +### 为报告收集的信息 -- 时间戳、Gateway 网关主机操作系统 + OpenClaw 版本 -- 会话转录 + 一小段日志尾部(脱敏后) -- 攻击者发送了什么 + 智能体做了什么 +- 时间戳、Gateway 网关主机 OS + OpenClaw 版本 +- 会话转录内容 + 一小段日志尾部(脱敏后) +- 攻击者发送了什么 + 智能体执行了什么 - Gateway 网关是否暴露到了 loopback 之外(LAN / Tailscale Funnel / Serve) -## 密钥扫描(`detect-secrets`) +## Secret Scanning(detect-secrets) -CI 会在 `secrets` 任务中运行 `detect-secrets` pre-commit hook。 -推送到 `main` 时始终会执行全文件扫描。Pull request 在有基线 commit 可用时, -会走已更改文件的快速路径,否则会回退到全文件扫描。如果失败,说明存在尚未加入基线的新候选项。 +CI 会在 `secrets` job 中运行 `detect-secrets` pre-commit hook。 +推送到 `main` 时始终会执行全文件扫描。Pull request 会在有基准 commit 可用时 +走已更改文件的快速路径,否则回退为全文件扫描。如果失败,说明出现了尚未写入 baseline 的新候选项。 ### 如果 CI 失败 @@ -1308,23 +1313,26 @@ CI 会在 `secrets` 任务中运行 `detect-secrets` pre-commit hook。 ``` 2. 了解这些工具: - - pre-commit 中的 `detect-secrets` 会使用仓库的基线和排除项运行 `detect-secrets-hook`。 - - `detect-secrets audit` 会打开交互式审查界面,用于将基线中的每一项标记为真实密钥或误报。 -3. 对于真实密钥:先轮换 / 删除,然后重新运行扫描以更新基线。 -4. 对于误报:运行交互式审查,并将其标记为误报: + - pre-commit 中的 `detect-secrets` 会使用仓库的 + baseline 和 excludes 运行 `detect-secrets-hook`。 + - `detect-secrets audit` 会打开一个交互式审查界面,用于将 baseline + 中的每一项标记为真实 secret 或误报。 +3. 对于真实 secrets:轮换 / 删除它们,然后重新运行扫描以更新 baseline。 +4. 对于误报:运行交互式审查并将其标记为误报: ```bash detect-secrets audit .secrets.baseline ``` -5. 如果你需要新增排除项,请将它们添加到 `.detect-secrets.cfg`,并使用匹配的 `--exclude-files` / `--exclude-lines` 标志重新生成基线(该配置文件仅供参考;detect-secrets 不会自动读取它)。 +5. 如果你需要新增 excludes,请将其添加到 `.detect-secrets.cfg`,并使用匹配的 `--exclude-files` / `--exclude-lines` 标志重新生成 + baseline(该配置文件仅供参考;detect-secrets 不会自动读取它)。 -当 `.secrets.baseline` 反映出预期状态后,提交更新后的文件。 +当更新后的 `.secrets.baseline` 反映出预期状态后,请将其提交。 ## 报告安全问题 在 OpenClaw 中发现了漏洞?请负责任地报告: -1. 发送邮件至:[security@openclaw.ai](mailto:security@openclaw.ai) -2. 在修复之前不要公开发布 -3. 我们会注明你的贡献(除非你希望匿名) +1. 电子邮件:[security@openclaw.ai](mailto:security@openclaw.ai) +2. 在修复前不要公开发布 +3. 我们会为你署名致谢(除非你希望匿名) diff --git a/docs/zh-CN/help/debugging.md b/docs/zh-CN/help/debugging.md index 4a1f78a02..971f463cc 100644 --- a/docs/zh-CN/help/debugging.md +++ b/docs/zh-CN/help/debugging.md @@ -1,28 +1,28 @@ --- read_when: - - 你需要检查原始模型输出中的推理泄漏 + - 你需要检查原始模型输出,以排查推理泄漏 - 你想在迭代时以监视模式运行 Gateway 网关 - 你需要一个可重复的调试工作流 summary: 调试工具:监视模式、原始模型流,以及推理泄漏追踪 title: 调试 x-i18n: - generated_at: "2026-04-05T22:30:00Z" + generated_at: "2026-04-12T18:22:07Z" model: gpt-5.4 provider: openai - source_hash: 4bc72e8d6cad3a1acaad066f381c82309583fabf304c589e63885f2685dc704e + source_hash: bc31ce9b41e92a14c4309f32df569b7050b18024f83280930e53714d3bfcd5cc source_path: help/debugging.md workflow: 15 --- # 调试 -本页介绍了用于流式输出的调试辅助工具,尤其适用于提供商将推理内容混入普通文本的情况。 +本页介绍用于流式输出的调试辅助工具,尤其适用于提供商将推理内容混入普通文本时的情况。 ## 运行时调试覆盖 -在聊天中使用 `/debug` 设置**仅运行时**的配置覆盖(保存在内存中,而非磁盘)。 -`/debug` 默认禁用;使用 `commands.debug: true` 启用。 -当你需要切换一些不常用设置,而又不想编辑 `openclaw.json` 时,这会很方便。 +在聊天中使用 `/debug` 来设置**仅运行时**的配置覆盖(存储在内存中,而不是磁盘)。 +`/debug` 默认禁用;可通过 `commands.debug: true` 启用。 +当你需要切换一些较少使用的设置,而不想编辑 `openclaw.json` 时,这会很方便。 示例: @@ -33,34 +33,49 @@ x-i18n: /debug reset ``` -`/debug reset` 会清除所有覆盖,并恢复到磁盘上的配置。 +`/debug reset` 会清除所有覆盖,并恢复为磁盘上的配置。 + +## 会话追踪输出 + +当你想在单个会话中查看插件拥有的追踪/调试行,而不启用完整详细模式时,请使用 `/trace`。 + +示例: + +```text +/trace +/trace on +/trace off +``` + +将 `/trace` 用于插件诊断,例如 Active Memory 调试摘要。 +对于常规的详细状态/工具输出,继续使用 `/verbose`;对于仅运行时的配置覆盖,继续使用 `/debug`。 ## Gateway 网关监视模式 -为了快速迭代,可在文件监视器下运行 Gateway 网关: +为了快速迭代,请在文件监视器下运行 Gateway 网关: ```bash pnpm gateway:watch ``` -它映射到: +这对应于: ```bash node scripts/watch-node.mjs gateway --force ``` -监视器会在 `src/` 下与构建相关的文件、扩展源码文件、扩展的 `package.json` 和 `openclaw.plugin.json` 元数据、`tsconfig.json`、`package.json` 以及 `tsdown.config.ts` 发生变化时重启。 +监视器会在 `src/` 下与构建相关的文件、扩展源码文件、扩展的 `package.json` 和 `openclaw.plugin.json` 元数据、`tsconfig.json`、`package.json` 以及 `tsdown.config.ts` 发生变更时重启。 扩展元数据变更会在不强制执行 `tsdown` 重建的情况下重启 Gateway 网关;源码和配置变更仍会先重建 `dist`。 -在 `gateway:watch` 之后添加任何 Gateway 网关 CLI 标志,它们都会在每次重启时透传。 -现在,对于同一仓库和相同标志组合,重复运行相同的监视命令会替换旧的监视器,而不会留下重复的监视器父进程。 +在 `gateway:watch` 后添加任何 Gateway 网关 CLI 标志,它们都会在每次重启时透传。 +现在,对于同一仓库/标志组合重复运行相同的监视命令时,会替换旧的监视器,而不是留下重复的监视器父进程。 ## 开发配置文件 + 开发 Gateway 网关(`--dev`) -使用开发配置文件来隔离状态,并为调试启动一个安全、可随时丢弃的环境。这里有**两个** `--dev` 标志: +使用开发配置文件来隔离状态,并为调试启动一个安全、可丢弃的环境。这里有**两个** `--dev` 标志: -- **全局 `--dev`(配置文件):** 将状态隔离到 `~/.openclaw-dev` 下,并将 Gateway 网关端口默认设为 `19001`(派生端口也会随之变化)。 -- **`gateway --dev`:** 告诉 Gateway 网关在缺失时自动创建默认配置 + 工作区**(并跳过 BOOTSTRAP.md)**。 +- **全局 `--dev`(配置文件):** 将状态隔离到 `~/.openclaw-dev` 下,并将 Gateway 网关端口默认为 `19001`(派生端口也会随之变化)。 +- **`gateway --dev`:** 告诉 Gateway 网关在缺失时自动创建默认配置 + 工作区(并跳过 `BOOTSTRAP.md`)。 推荐流程(开发配置文件 + 开发引导): @@ -71,21 +86,21 @@ OPENCLAW_PROFILE=dev openclaw tui 如果你还没有全局安装,请通过 `pnpm openclaw ...` 运行 CLI。 -它会执行以下操作: +具体作用如下: 1. **配置文件隔离**(全局 `--dev`) - `OPENCLAW_PROFILE=dev` - `OPENCLAW_STATE_DIR=~/.openclaw-dev` - `OPENCLAW_CONFIG_PATH=~/.openclaw-dev/openclaw.json` - - `OPENCLAW_GATEWAY_PORT=19001`(浏览器/canvas 端口也会相应变化) + - `OPENCLAW_GATEWAY_PORT=19001`(browser/canvas 端口也会相应变化) 2. **开发引导**(`gateway --dev`) - - 如果缺失则写入最小化配置(`gateway.mode=local`,绑定到 loopback)。 - - 将 `agent.workspace` 设为开发工作区。 - - 设置 `agent.skipBootstrap=true`(不使用 BOOTSTRAP.md)。 - - 如果缺失,则为工作区填充以下文件: + - 如果缺失,则写入最小配置(`gateway.mode=local`,绑定到 loopback)。 + - 将 `agent.workspace` 设置为开发工作区。 + - 设置 `agent.skipBootstrap=true`(不使用 `BOOTSTRAP.md`)。 + - 如果缺失,则为工作区填充这些文件: `AGENTS.md`、`SOUL.md`、`TOOLS.md`、`IDENTITY.md`、`USER.md`、`HEARTBEAT.md`。 - - 默认身份:**C3‑PO**(礼仪机器人)。 + - 默认身份:**C3‑PO**(协议机器人)。 - 在开发模式下跳过渠道提供商(`OPENCLAW_SKIP_CHANNELS=1`)。 重置流程(全新开始): @@ -94,16 +109,16 @@ OPENCLAW_PROFILE=dev openclaw tui pnpm gateway:dev:reset ``` -注意:`--dev` 是一个**全局**配置文件标志,有些运行器会吞掉它。 -如果你需要显式写出它,请使用环境变量形式: +注意:`--dev` 是一个**全局**配置文件标志,某些运行器会吞掉它。 +如果你需要明确写出来,请使用环境变量形式: ```bash OPENCLAW_PROFILE=dev openclaw gateway --dev --reset ``` -`--reset` 会清除配置、凭证、会话以及开发工作区(使用 `trash`,而不是 `rm`),然后重新创建默认的开发环境。 +`--reset` 会清除配置、凭证、会话和开发工作区(使用 `trash`,而不是 `rm`),然后重新创建默认的开发环境。 -提示:如果一个非开发模式的 Gateway 网关已经在运行(`launchd`/`systemd`),请先停止它: +提示:如果一个非开发 Gateway 网关已经在运行(launchd/systemd),请先停止它: ```bash openclaw gateway stop @@ -112,7 +127,7 @@ openclaw gateway stop ## 原始流日志(OpenClaw) OpenClaw 可以在任何过滤/格式化之前记录**原始 assistant 流**。 -这是查看推理内容是否以纯文本增量形式到达(或作为独立 thinking 块到达)的最佳方式。 +这是查看推理内容是否作为纯文本增量到达(或作为单独的 thinking 块到达)的最佳方式。 通过 CLI 启用: @@ -126,7 +141,7 @@ pnpm gateway:watch --raw-stream pnpm gateway:watch --raw-stream --raw-stream-path ~/.openclaw/logs/raw-stream.jsonl ``` -等价的环境变量: +等效环境变量: ```bash OPENCLAW_RAW_STREAM=1 @@ -139,7 +154,7 @@ OPENCLAW_RAW_STREAM_PATH=~/.openclaw/logs/raw-stream.jsonl ## 原始分块日志(pi-mono) -要在块被解析之前捕获**原始 OpenAI 兼容分块**,pi-mono 提供了一个单独的日志记录器: +要在解析为块之前捕获**原始 OpenAI-compat 分块**,pi-mono 提供了一个单独的日志记录器: ```bash PI_RAW_STREAM=1 @@ -162,4 +177,4 @@ PI_RAW_STREAM_PATH=~/.pi-mono/logs/raw-openai-completions.jsonl - 原始流日志可能包含完整提示词、工具输出和用户数据。 - 请将日志保留在本地,并在调试后删除。 -- 如果你要分享日志,请先清除密钥和个人身份信息(PII)。 +- 如果你要共享日志,请先清理其中的密钥和个人身份信息。 diff --git a/docs/zh-CN/help/faq.md b/docs/zh-CN/help/faq.md index ce20fac79..628d31b10 100644 --- a/docs/zh-CN/help/faq.md +++ b/docs/zh-CN/help/faq.md @@ -1,25 +1,25 @@ --- read_when: - 回答常见的设置、安装、新手引导或运行时支持问题 - - 在进行更深入调试前,对用户报告的问题进行初步分诊 -summary: 关于 OpenClaw 设置、配置和使用的常见问题解答 + - 在深入调试之前,对用户报告的问题进行分诊 +summary: 关于 OpenClaw 设置、配置和使用的常见问题 title: 常见问题 x-i18n: - generated_at: "2026-04-07T19:46:24Z" + generated_at: "2026-04-12T18:22:09Z" model: gpt-5.4 provider: openai - source_hash: 001b4605966b45b08108606f76ae937ec348c2179b04cf6fb34fef94833705e6 + source_hash: d2a78d0fea9596625cc2753e6dc8cc42c2379a3a0c91729265eee0261fe53eaa source_path: help/faq.md workflow: 15 --- # 常见问题 -为真实世界部署场景提供快速答案以及更深入的故障排除(本地开发、VPS、多智能体、OAuth/API 密钥、模型故障转移)。如需运行时诊断,请参阅 [故障排除](/zh-CN/gateway/troubleshooting)。如需完整配置参考,请参阅 [Configuration](/zh-CN/gateway/configuration)。 +针对真实世界部署(本地开发、VPS、多智能体、OAuth/API 密钥、模型故障切换)的快速解答,以及更深入的故障排除。有关运行时诊断,请参阅 [故障排除](/zh-CN/gateway/troubleshooting)。有关完整配置参考,请参阅 [配置](/zh-CN/gateway/configuration)。 -## 如果出了问题,最初的六十秒 +## 如果出了问题,最初的六十秒该做什么 -1. **快速状态(第一步检查)** +1. **快速状态(第一项检查)** ```bash openclaw status @@ -27,13 +27,13 @@ x-i18n: 快速本地摘要:操作系统 + 更新、Gateway 网关/服务可达性、智能体/会话、提供商配置 + 运行时问题(当 Gateway 网关可达时)。 -2. **可直接粘贴的报告(可安全分享)** +2. **可粘贴的报告(可安全分享)** ```bash openclaw status --all ``` - 只读诊断,包含日志尾部(令牌已脱敏)。 + 只读诊断,附带日志尾部(令牌已脱敏)。 3. **守护进程 + 端口状态** @@ -41,7 +41,7 @@ x-i18n: openclaw gateway status ``` - 显示监督器运行状态与 RPC 可达性、探测目标 URL,以及服务可能使用的是哪份配置。 + 显示监督器运行状态与 RPC 可达性、探测目标 URL,以及服务可能使用了哪个配置。 4. **深度探测** @@ -49,22 +49,22 @@ x-i18n: openclaw status --deep ``` - 运行实时 Gateway 网关健康探测,包括支持时的渠道探测 - (需要 Gateway 网关可达)。参阅 [Health](/zh-CN/gateway/health)。 + 运行实时 Gateway 网关健康探测,包括在支持时的渠道探测 + (需要可访问的 Gateway 网关)。请参阅 [健康状态](/zh-CN/gateway/health)。 -5. **查看最新日志尾部** +5. **查看最新日志** ```bash openclaw logs --follow ``` - 如果 RPC 不可用,则退回到: + 如果 RPC 不可用,则回退到: ```bash tail -f "$(ls -t /tmp/openclaw/openclaw-*.log | head -1)" ``` - 文件日志与服务日志是分开的;参阅 [Logging](/zh-CN/logging) 和 [故障排除](/zh-CN/gateway/troubleshooting)。 + 文件日志与服务日志是分开的;请参阅 [日志记录](/zh-CN/logging) 和 [故障排除](/zh-CN/gateway/troubleshooting)。 6. **运行 Doctor(修复)** @@ -72,48 +72,48 @@ x-i18n: openclaw doctor ``` - 修复/迁移配置与状态 + 运行健康检查。参阅 [Doctor](/zh-CN/gateway/doctor)。 + 修复/迁移配置/状态 + 运行健康检查。请参阅 [Doctor](/zh-CN/gateway/doctor)。 7. **Gateway 网关快照** ```bash openclaw health --json - openclaw health --verbose # 出错时显示目标 URL + 配置路径 + openclaw health --verbose # 在错误时显示目标 URL + 配置路径 ``` - 向正在运行的 Gateway 网关请求完整快照(仅限 WS)。参阅 [Health](/zh-CN/gateway/health)。 + 向正在运行的 Gateway 网关请求完整快照(仅 WS)。请参阅 [健康状态](/zh-CN/gateway/health)。 ## 快速开始和首次运行设置 - - 使用一个可以**看到你的机器**的本地 AI 智能体。这比去 Discord 提问 - 有效得多,因为大多数“我卡住了”的情况都是**本地配置或环境问题**, + + 使用一个能**看到你的机器**的本地 AI 智能体。这比在 Discord 里提问有效得多, + 因为大多数“我卡住了”的情况其实是**本地配置或环境问题**, 远程协助者无法直接检查。 - - **Claude Code**: [https://www.anthropic.com/claude-code/](https://www.anthropic.com/claude-code/) - - **OpenAI Codex**: [https://openai.com/codex/](https://openai.com/codex/) + - **Claude Code**: [https://www.anthropic.com/claude-code/](https://www.anthropic.com/claude-code/) + - **OpenAI Codex**: [https://openai.com/codex/](https://openai.com/codex/) - 这些工具可以读取仓库、运行命令、检查日志,并帮助修复你机器级别的 + 这些工具可以读取仓库、运行命令、检查日志,并帮助修复机器级别的 设置(PATH、服务、权限、认证文件)。通过可修改的(git)安装方式, - 将**完整源码检出**提供给它们: + 把**完整源码检出**交给它们: ```bash curl -fsSL https://openclaw.ai/install.sh | bash -s -- --install-method git ``` - 这会**从 git 检出安装** OpenClaw,因此智能体可以读取代码 + 文档, - 并基于你正在运行的确切版本进行推理。你之后随时可以通过重新运行 - 安装器且不带 `--install-method git` 切回稳定版。 + 这会**从 git 检出**安装 OpenClaw,因此智能体可以读取代码 + 文档, + 并针对你正在运行的确切版本进行分析。之后你随时都可以通过重新运行安装程序、 + 并去掉 `--install-method git`,切回稳定版。 - 提示:让智能体**规划并监督**修复过程(按步骤进行),然后只执行 + 提示:让智能体先**规划并监督**修复过程(逐步执行),然后只执行 必要的命令。这样改动会更小,也更容易审计。 如果你发现了真实的 bug 或修复,请提交 GitHub issue 或发送 PR: [https://github.com/openclaw/openclaw/issues](https://github.com/openclaw/openclaw/issues) [https://github.com/openclaw/openclaw/pulls](https://github.com/openclaw/openclaw/pulls) - 求助时先运行这些命令(并分享输出): + 先从这些命令开始(在寻求帮助时分享输出): ```bash openclaw status @@ -123,35 +123,36 @@ x-i18n: 它们的作用: - - `openclaw status`: Gateway 网关/智能体健康状态 + 基础配置的快速快照。 - - `openclaw models status`: 检查提供商认证 + 模型可用性。 - - `openclaw doctor`: 验证并修复常见配置/状态问题。 + - `openclaw status`:快速查看 Gateway 网关/智能体健康状态 + 基本配置。 + - `openclaw models status`:检查提供商认证 + 模型可用性。 + - `openclaw doctor`:验证并修复常见的配置/状态问题。 其他有用的 CLI 检查:`openclaw status --all`、`openclaw logs --follow`、 `openclaw gateway status`、`openclaw health --verbose`。 - 快速调试循环:[如果出了问题,最初的六十秒](#如果出了问题最初的六十秒)。 - 安装文档:[Install](/zh-CN/install)、[Installer flags](/zh-CN/install/installer)、[Updating](/zh-CN/install/updating)。 + 快速调试循环: [如果出了问题,最初的六十秒该做什么](#如果出了问题最初的六十秒该做什么)。 + 安装文档: [安装](/zh-CN/install)、[安装器标志](/zh-CN/install/installer)、[更新](/zh-CN/install/updating)。 - + 常见的 Heartbeat 跳过原因: - - `quiet-hours`: 不在已配置的活跃时段窗口内 - - `empty-heartbeat-file`: `HEARTBEAT.md` 存在,但只包含空白/仅标题的脚手架内容 - - `no-tasks-due`: `HEARTBEAT.md` 任务模式已启用,但目前没有任何任务间隔到期 - - `alerts-disabled`: 所有 Heartbeat 可见性都已禁用(`showOk`、`showAlerts` 和 `useIndicator` 全部关闭) + - `quiet-hours`:不在已配置的活跃时段窗口内 + - `empty-heartbeat-file`:`HEARTBEAT.md` 存在,但只包含空白/仅标题的脚手架内容 + - `no-tasks-due`:`HEARTBEAT.md` 任务模式已启用,但目前没有任何任务间隔到期 + - `alerts-disabled`:所有 Heartbeat 可见性都已禁用(`showOk`、`showAlerts` 和 `useIndicator` 全部关闭) - 在任务模式下,只有在一次真实的 Heartbeat 运行 - 完成后,到期时间戳才会推进。被跳过的运行不会把任务标记为已完成。 + 在任务模式下,只有在真实的 Heartbeat 运行 + 完成后,才会推进到期时间戳。 + 被跳过的运行不会将任务标记为已完成。 - 文档:[Heartbeat](/zh-CN/gateway/heartbeat)、[自动化与任务](/zh-CN/automation)。 + 文档: [Heartbeat](/zh-CN/gateway/heartbeat)、[自动化与任务](/zh-CN/automation)。 - - 仓库推荐从源码运行并使用新手引导: + + 仓库推荐从源码运行,并使用新手引导: ```bash curl -fsSL https://openclaw.ai/install.sh | bash @@ -171,90 +172,90 @@ x-i18n: openclaw onboard ``` - 如果你还没有全局安装,也可以通过 `pnpm openclaw onboard` 运行它。 + 如果你还没有全局安装,可以通过 `pnpm openclaw onboard` 运行它。 - - 向导会在新手引导结束后立即打开浏览器,访问一个干净的(不含令牌的)控制面板 URL,并且也会在摘要中打印该链接。保持这个标签页打开;如果它没有自动启动,就在同一台机器上复制/粘贴打印出的 URL。 + + 向导会在新手引导完成后立即用你的浏览器打开一个干净的(不带令牌的)仪表板 URL,并且也会在摘要中打印该链接。请保持该标签页打开;如果它没有自动启动,请在同一台机器上复制/粘贴输出的 URL。 - + **Localhost(同一台机器):** - 打开 `http://127.0.0.1:18789/`。 - 如果它要求共享密钥认证,请将已配置的令牌或密码粘贴到 Control UI 设置中。 - 令牌来源:`gateway.auth.token`(或 `OPENCLAW_GATEWAY_TOKEN`)。 - 密码来源:`gateway.auth.password`(或 `OPENCLAW_GATEWAY_PASSWORD`)。 - - 如果还没有配置共享密钥,可用 `openclaw doctor --generate-gateway-token` 生成令牌。 + - 如果尚未配置共享密钥,请使用 `openclaw doctor --generate-gateway-token` 生成一个令牌。 **不在 localhost:** - - **Tailscale Serve**(推荐):保持绑定 loopback,运行 `openclaw gateway --tailscale serve`,打开 `https:///`。如果 `gateway.auth.allowTailscale` 为 `true`,身份头会满足 Control UI/WebSocket 认证要求(无需粘贴共享密钥,前提是信任 Gateway 网关主机);HTTP API 仍然需要共享密钥认证,除非你有意使用私有入口 `none` 或 trusted-proxy HTTP 认证。 - 来自同一客户端的并发错误 Serve 认证尝试会在失败认证限流器记录之前被串行化,因此第二次错误重试可能已经显示 `retry later`。 - - **Tailnet 绑定**:运行 `openclaw gateway --bind tailnet --token ""`(或配置密码认证),打开 `http://:18789/`,然后在控制面板设置中粘贴匹配的共享密钥。 - - **支持身份感知的反向代理**:将 Gateway 网关保留在非 loopback 的 trusted proxy 后面,配置 `gateway.auth.mode: "trusted-proxy"`,然后打开代理 URL。 - - **SSH 隧道**:`ssh -N -L 18789:127.0.0.1:18789 user@host` 然后打开 `http://127.0.0.1:18789/`。共享密钥认证在隧道上仍然有效;如有提示,请粘贴已配置的令牌或密码。 + - **Tailscale Serve**(推荐):保持绑定到 loopback,运行 `openclaw gateway --tailscale serve`,打开 `https:///`。如果 `gateway.auth.allowTailscale` 为 `true`,身份标头即可满足 Control UI/WebSocket 认证要求(无需粘贴共享密钥,但假设 Gateway 网关主机可信);除非你明确使用 private-ingress `none` 或 trusted-proxy HTTP 认证,否则 HTTP API 仍然需要共享密钥认证。 + 来自同一客户端的错误并发 Serve 认证尝试会在失败认证限流器记录之前被串行化,因此第二次错误重试时就可能已经显示 `retry later`。 + - **Tailnet 绑定**:运行 `openclaw gateway --bind tailnet --token ""`(或配置密码认证),打开 `http://:18789/`,然后在仪表板设置中粘贴匹配的共享密钥。 + - **支持身份感知的反向代理**:将 Gateway 网关保留在非 loopback 的受信任代理后面,配置 `gateway.auth.mode: "trusted-proxy"`,然后打开代理 URL。 + - **SSH 隧道**:`ssh -N -L 18789:127.0.0.1:18789 user@host`,然后打开 `http://127.0.0.1:18789/`。通过隧道时共享密钥认证仍然适用;如果出现提示,请粘贴已配置的令牌或密码。 - 参阅 [Dashboard](/web/dashboard) 和 [Web surfaces](/web) 了解绑定模式和认证细节。 + 有关绑定模式和认证详情,请参阅 [仪表板](/web/dashboard) 和 [Web 界面](/web)。 - 它们控制的是不同层: + 它们控制的是不同层级: - - `approvals.exec`: 将审批提示转发到聊天目标 - - `channels..execApprovals`: 让该渠道作为 exec 审批的原生审批客户端 + - `approvals.exec`:将审批提示转发到聊天目标 + - `channels..execApprovals`:让该渠道作为 exec 审批的原生审批客户端 主机的 exec 策略仍然是真正的审批关卡。聊天配置只控制审批 - 提示出现在哪里,以及人们如何回应。 + 提示出现在哪里,以及人们如何作答。 - 在大多数设置中,你**不**需要同时用到两者: + 在大多数设置中,你**不**需要同时使用这两者: - - 如果聊天本身已经支持命令和回复,那么同聊天中的 `/approve` 会通过共享路径生效。 - - 如果受支持的原生渠道能够安全推断审批人,OpenClaw 现在会在 `channels..execApprovals.enabled` 未设置或为 `"auto"` 时,自动启用私信优先的原生审批。 - - 当提供原生审批卡片/按钮时,该原生 UI 是主要路径;只有当工具结果表明聊天审批不可用或手动审批是唯一方式时,智能体才应包含手动 `/approve` 命令。 - - 仅当提示也必须转发到其他聊天或明确的运维房间时,才使用 `approvals.exec`。 - - 仅当你明确希望审批提示也发回原始房间/话题时,才使用 `channels..execApprovals.target: "channel"` 或 `"both"`。 - - 插件审批又是另一套:默认使用同聊天 `/approve`,可选 `approvals.plugin` 转发,并且只有部分原生渠道会在此基础上保留原生插件审批处理。 + - 如果聊天本身已经支持命令和回复,那么在同一聊天中使用 `/approve` 就会通过共享路径生效。 + - 如果受支持的原生渠道能够安全推断审批人,那么当 `channels..execApprovals.enabled` 未设置或为 `"auto"` 时,OpenClaw 现在会自动启用私信优先的原生审批。 + - 当原生审批卡片/按钮可用时,该原生 UI 是主要路径;只有当工具结果表明聊天审批不可用,或者手动审批是唯一可用路径时,智能体才应附带手动 `/approve` 命令。 + - 仅当提示还需要转发到其他聊天或明确的运维房间时,才使用 `approvals.exec`。 + - 仅当你明确希望将审批提示发回原始房间/主题时,才使用 `channels..execApprovals.target: "channel"` 或 `"both"`。 + - 插件审批则是另外一套:它们默认使用同一聊天中的 `/approve`、可选的 `approvals.plugin` 转发,而且只有某些原生渠道会在此基础上继续保留原生插件审批处理。 - 简单来说:转发用于路由,原生客户端配置用于提供更丰富的渠道特定 UX。 - 参阅 [Exec Approvals](/zh-CN/tools/exec-approvals)。 + 简短来说:转发用于路由,原生客户端配置用于提供更丰富的渠道专属 UX。 + 请参阅 [Exec 审批](/zh-CN/tools/exec-approvals)。 - 需要 Node **>= 22**。推荐使用 `pnpm`。**不推荐**为 Gateway 网关使用 Bun。 + 需要 Node **>= 22**。推荐使用 `pnpm`。Gateway 网关**不推荐**使用 Bun。 - 可以。Gateway 网关很轻量——文档列出的个人使用需求为 **512MB-1GB RAM**、**1 个核心** 和约 **500MB** - 磁盘空间,并说明 **Raspberry Pi 4 可以运行它**。 + 可以。Gateway 网关很轻量——文档中写明,个人使用场景下,**512MB-1GB 内存**、**1 个核心**和大约 **500MB** + 磁盘空间就足够,并且还特别说明 **Raspberry Pi 4 可以运行它**。 - 如果你想要更多余量(日志、媒体、其他服务),推荐 **2GB**,但这 - 不是硬性最低要求。 + 如果你想要更多余量(日志、媒体、其他服务),推荐使用 **2GB**, + 但这不是硬性最低要求。 - 提示:小型 Pi/VPS 可以托管 Gateway 网关,而你可以在笔记本/手机上配对**节点**以实现 - 本地屏幕/摄像头/canvas 或命令执行。参阅 [Nodes](/zh-CN/nodes)。 + 提示:一个小型 Pi/VPS 就可以托管 Gateway 网关,而你可以在笔记本电脑/手机上配对**节点**, + 以提供本地屏幕/摄像头/canvas 或命令执行。请参阅 [节点](/zh-CN/nodes)。 - 简短版本:可以运行,但要预期会有一些边角问题。 + 简短来说:可以运行,但要预期会有一些边缘问题。 - 使用 **64 位**操作系统,并保持 Node >= 22。 - - 优先选择**可修改的(git)安装**,这样你可以查看日志并快速更新。 - - 开始时先不要加渠道/Skills,然后再逐个添加。 - - 如果你遇到奇怪的二进制问题,通常是 **ARM 兼容性**问题。 + - 优先使用**可修改的(git)安装**,这样你可以查看日志并快速更新。 + - 先不要启用渠道/Skills,然后逐个添加。 + - 如果你遇到奇怪的二进制问题,通常都是 **ARM 兼容性**问题。 - 文档:[Linux](/zh-CN/platforms/linux)、[Install](/zh-CN/install)。 + 文档: [Linux](/zh-CN/platforms/linux)、[安装](/zh-CN/install)。 - - 这个界面依赖 Gateway 网关可达且已认证。TUI 也会在首次 hatch 时自动发送 - “Wake up, my friend!”。如果你看到这行文字却**没有回复**, - 并且令牌数保持为 0,说明智能体根本没有运行。 + + 该界面依赖于 Gateway 网关可访问且已通过认证。TUI 在首次 hatch 时也会自动发送 + “Wake up, my friend!”。如果你看到这一行却**没有回复**, + 并且令牌仍然为 0,说明智能体根本没有运行。 1. 重启 Gateway 网关: @@ -270,20 +271,20 @@ x-i18n: openclaw logs --follow ``` - 3. 如果仍然卡住,运行: + 3. 如果仍然卡住,请运行: ```bash openclaw doctor ``` - 如果 Gateway 网关是远程的,请确保隧道/Tailscale 连接正常,且 UI - 指向的是正确的 Gateway 网关。参阅 [Remote access](/zh-CN/gateway/remote)。 + 如果 Gateway 网关是远程的,请确认隧道/Tailscale 连接正常,并且 UI + 指向了正确的 Gateway 网关。请参阅 [远程访问](/zh-CN/gateway/remote)。 - - 可以。复制**状态目录**和**工作区**,然后运行一次 Doctor。这会 - 让你的机器人“完全保持不变”(记忆、会话历史、认证和渠道 + + 可以。复制**状态目录**和**工作区**,然后运行一次 Doctor。这样 + 你的机器人就能保持“完全一样”(记忆、会话历史、认证和渠道 状态),前提是你复制了**这两个**位置: 1. 在新机器上安装 OpenClaw。 @@ -291,61 +292,60 @@ x-i18n: 3. 复制你的工作区(默认:`~/.openclaw/workspace`)。 4. 运行 `openclaw doctor` 并重启 Gateway 网关服务。 - 这会保留配置、认证配置文件、WhatsApp 凭据、会话和记忆。如果你使用的是 - 远程模式,请记住会话存储和工作区都由 gateway host 拥有。 + 这会保留配置、认证配置文件、WhatsApp 凭证、会话和记忆。如果你处于 + 远程模式,请记住会话存储和工作区归 Gateway 网关主机所有。 **重要:**如果你只是把工作区提交/推送到 GitHub,你备份的是 - **记忆 + 引导文件**,但**不是**会话历史或认证。那些内容位于 + **记忆 + 引导文件**,但**不包括**会话历史或认证信息。这些内容位于 `~/.openclaw/` 下(例如 `~/.openclaw/agents//sessions/`)。 - 相关内容:[Migrating](/zh-CN/install/migrating)、[磁盘上的文件位置](#磁盘上的文件位置)、 + 相关内容: [迁移](/zh-CN/install/migrating)、[磁盘上的文件位置](#where-things-live-on-disk)、 [智能体工作区](/zh-CN/concepts/agent-workspace)、[Doctor](/zh-CN/gateway/doctor)、 [远程模式](/zh-CN/gateway/remote)。 - + 查看 GitHub 更新日志: [https://github.com/openclaw/openclaw/blob/main/CHANGELOG.md](https://github.com/openclaw/openclaw/blob/main/CHANGELOG.md) - 最新条目在最上方。如果顶部部分标记为 **Unreleased**,那么下一个带日期的 + 最新条目位于顶部。如果顶部部分标记为 **Unreleased**,则下一个带日期的 部分就是最近发布的版本。条目按 **Highlights**、**Changes** 和 - **Fixes** 分组(需要时还会包含文档/其他部分)。 + **Fixes** 分组(如有需要,也会包含文档/其他部分)。 - 某些 Comcast/Xfinity 连接会因为 Xfinity - Advanced Security 错误地拦截 `docs.openclaw.ai`。请禁用它或将 `docs.openclaw.ai` - 加入允许列表,然后重试。 - 也请帮我们通过这里报告以便解除拦截:[https://spa.xfinity.com/check_url_status](https://spa.xfinity.com/check_url_status)。 + 某些 Comcast/Xfinity 连接会被 Xfinity + Advanced Security 错误地拦截 `docs.openclaw.ai`。请禁用它或将 `docs.openclaw.ai` 加入允许列表,然后重试。 + 也请通过这里帮助我们解除拦截: [https://spa.xfinity.com/check_url_status](https://spa.xfinity.com/check_url_status)。 如果你仍然无法访问该站点,文档在 GitHub 上也有镜像: [https://github.com/openclaw/openclaw/tree/main/docs](https://github.com/openclaw/openclaw/tree/main/docs) - - **Stable** 和 **beta** 是 **npm dist-tag**,不是不同的代码分支: + + **Stable** 和 **beta** 是 **npm dist-tag**,不是独立的代码线: - `latest` = 稳定版 - `beta` = 用于测试的早期构建 - 通常,一个稳定版本会先发布到 **beta**,然后通过一个显式的 - 提升步骤把同一个版本移动到 `latest`。维护者在需要时也可以 - 直接发布到 `latest`。这就是为什么 beta 和稳定版在提升后可以 + 通常,稳定版本会先发布到 **beta**,然后再通过一个明确的 + 提升步骤将同一版本移动到 `latest`。维护者也可以在需要时 + 直接发布到 `latest`。这就是为什么在提升之后,beta 和稳定版可能会 指向**同一个版本**。 - 查看改动内容: + 查看变更内容: [https://github.com/openclaw/openclaw/blob/main/CHANGELOG.md](https://github.com/openclaw/openclaw/blob/main/CHANGELOG.md) - 关于安装单行命令以及 beta 和 dev 的区别,请参阅下面的折叠项。 + 有关安装单行命令以及 beta 和 dev 的区别,请参阅下面的折叠项。 - - **Beta** 是 npm dist-tag `beta`(提升后可能与 `latest` 相同)。 - **Dev** 是 `main` 的移动头部(git);发布时使用 npm dist-tag `dev`。 + + **Beta** 是 npm dist-tag `beta`(在提升后可能与 `latest` 相同)。 + **Dev** 是 `main` 的持续更新头部版本(git);发布时使用 npm dist-tag `dev`。 单行命令(macOS/Linux): @@ -357,14 +357,14 @@ x-i18n: curl -fsSL --proto '=https' --tlsv1.2 https://openclaw.ai/install.sh | bash -s -- --install-method git ``` - Windows 安装器(PowerShell): + Windows 安装程序(PowerShell): [https://openclaw.ai/install.ps1](https://openclaw.ai/install.ps1) - 更多细节:[Development channels](/zh-CN/install/development-channels) 和 [Installer flags](/zh-CN/install/installer)。 + 更多细节: [开发渠道](/zh-CN/install/development-channels) 和 [安装器标志](/zh-CN/install/installer)。 - + 有两种方式: 1. **Dev 渠道(git 检出):** @@ -381,9 +381,9 @@ x-i18n: curl -fsSL https://openclaw.ai/install.sh | bash -s -- --install-method git ``` - 这样你就会得到一个可以本地编辑的仓库,然后通过 git 更新。 + 这样你会得到一个可本地编辑的仓库,然后可通过 git 更新。 - 如果你更喜欢手动做一次干净克隆,请使用: + 如果你更喜欢手动进行干净克隆,请使用: ```bash git clone https://github.com/openclaw/openclaw.git @@ -392,23 +392,23 @@ x-i18n: pnpm build ``` - 文档:[Update](/cli/update)、[Development channels](/zh-CN/install/development-channels)、 - [Install](/zh-CN/install)。 + 文档: [更新](/cli/update)、[开发渠道](/zh-CN/install/development-channels)、 + [安装](/zh-CN/install)。 - 大致参考: + 粗略参考: - **安装:**2-5 分钟 - **新手引导:**5-15 分钟,取决于你配置了多少渠道/模型 - 如果卡住了,请查看 [安装器卡住了](#快速开始和首次运行设置) - 以及 [我卡住了](#快速开始和首次运行设置) 中的快速调试循环。 + 如果卡住了,请参阅 [安装器卡住了](#quick-start-and-first-run-setup) + 以及 [我卡住了](#quick-start-and-first-run-setup) 中的快速调试循环。 - + 使用**详细输出**重新运行安装器: ```bash @@ -427,25 +427,25 @@ x-i18n: curl -fsSL https://openclaw.ai/install.sh | bash -s -- --install-method git --verbose ``` - Windows(PowerShell)等效方式: + Windows(PowerShell)等价方式: ```powershell - # install.ps1 目前还没有专门的 -Verbose 标志。 + # install.ps1 目前还没有专用的 -Verbose 标志。 Set-PSDebug -Trace 1 & ([scriptblock]::Create((iwr -useb https://openclaw.ai/install.ps1))) -NoOnboard Set-PSDebug -Trace 0 ``` - 更多选项:[Installer flags](/zh-CN/install/installer)。 + 更多选项: [安装器标志](/zh-CN/install/installer)。 - + 两个常见的 Windows 问题: **1) npm 错误 spawn git / git not found** - - 安装 **Git for Windows** 并确保 `git` 在你的 PATH 中。 + - 安装 **Git for Windows**,并确保 `git` 在你的 PATH 中。 - 关闭并重新打开 PowerShell,然后重新运行安装器。 **2) 安装后 openclaw is not recognized** @@ -457,23 +457,23 @@ x-i18n: npm config get prefix ``` - - 将该目录添加到你的用户 PATH 中(Windows 上不需要 `\bin` 后缀;大多数系统上是 `%AppData%\npm`)。 + - 将该目录添加到你的用户 PATH 中(Windows 上不需要 `\bin` 后缀;在大多数系统上它是 `%AppData%\npm`)。 - 更新 PATH 后,关闭并重新打开 PowerShell。 - 如果你想获得最顺畅的 Windows 设置体验,请使用 **WSL2**,而不是原生 Windows。 - 文档:[Windows](/zh-CN/platforms/windows)。 + 如果你想获得最顺畅的 Windows 设置体验,请使用 **WSL2** 而不是原生 Windows。 + 文档: [Windows](/zh-CN/platforms/windows)。 - - 这通常是原生 Windows shell 的控制台代码页不匹配所致。 + + 这通常是原生 Windows shell 中控制台代码页不匹配造成的。 症状: - - `system.run`/`exec` 输出将中文显示为乱码 - - 同一命令在另一个终端配置中显示正常 + - `system.run`/`exec` 输出中的中文显示为乱码 + - 同一条命令在另一个终端配置中显示正常 - 在 PowerShell 中的快速解决方法: + PowerShell 中的快速解决方法: ```powershell chcp 65001 @@ -488,66 +488,66 @@ x-i18n: openclaw gateway restart ``` - 如果你在最新 OpenClaw 上仍然能复现,请在以下位置跟踪/报告: + 如果你在最新版本 OpenClaw 上仍然能复现此问题,请在这里跟踪/报告: - [Issue #30640](https://github.com/openclaw/openclaw/issues/30640) - - 使用**可修改的(git)安装**,这样你就能在本地拥有完整源码和文档,然后 - 在_该文件夹内_向你的机器人(或 Claude/Codex)提问,这样它就可以读取仓库并给出精确回答。 + + 使用**可修改的(git)安装**,这样你就可以在本地获得完整源码和文档,然后 + 在_该目录中_向你的机器人(或 Claude/Codex)提问,这样它就能读取仓库并给出准确答案。 ```bash curl -fsSL https://openclaw.ai/install.sh | bash -s -- --install-method git ``` - 更多细节:[Install](/zh-CN/install) 和 [Installer flags](/zh-CN/install/installer)。 + 更多细节: [安装](/zh-CN/install) 和 [安装器标志](/zh-CN/install/installer)。 - + 简短回答:按照 Linux 指南操作,然后运行新手引导。 - - Linux 快速路径 + 服务安装:[Linux](/zh-CN/platforms/linux)。 - - 完整演练:[入门指南](/zh-CN/start/getting-started)。 - - 安装器 + 更新:[Install & updates](/zh-CN/install/updating)。 + - Linux 快速路径 + 服务安装: [Linux](/zh-CN/platforms/linux)。 + - 完整演练: [入门指南](/zh-CN/start/getting-started)。 + - 安装器 + 更新: [安装与更新](/zh-CN/install/updating)。 - - 任何 Linux VPS 都可以。在服务器上安装,然后使用 SSH/Tailscale 访问 Gateway 网关。 + + 任何 Linux VPS 都可以。先在服务器上安装,然后通过 SSH/Tailscale 访问 Gateway 网关。 - 指南:[exe.dev](/zh-CN/install/exe-dev)、[Hetzner](/zh-CN/install/hetzner)、[Fly.io](/zh-CN/install/fly)。 - 远程访问:[Gateway remote](/zh-CN/gateway/remote)。 + 指南: [exe.dev](/zh-CN/install/exe-dev)、[Hetzner](/zh-CN/install/hetzner)、[Fly.io](/zh-CN/install/fly)。 + 远程访问: [Gateway 网关远程访问](/zh-CN/gateway/remote)。 - 我们维护了一个**托管中心**,列出常见提供商。选择一个并按照指南操作: + 我们维护了一个**托管中心**,包含常见提供商。选择一个并按照对应指南操作: - - [VPS hosting](/zh-CN/vps)(所有提供商汇总在一个地方) + - [VPS 托管](/zh-CN/vps)(所有提供商集中在一处) - [Fly.io](/zh-CN/install/fly) - [Hetzner](/zh-CN/install/hetzner) - [exe.dev](/zh-CN/install/exe-dev) - 它在云端的工作方式:**Gateway 网关运行在服务器上**,你通过 - Control UI(或 Tailscale/SSH)从笔记本/手机访问它。你的状态 + 工作区 - 也保存在服务器上,因此应将该主机视为事实来源并做好备份。 + 云端的工作方式是:**Gateway 网关运行在服务器上**,而你通过 Control UI(或 Tailscale/SSH) + 从笔记本电脑/手机访问它。你的状态 + 工作区 + 保存在服务器上,因此应将主机视为事实来源并做好备份。 - 你可以把**节点**(Mac/iOS/Android/无头设备)配对到这个云端 Gateway 网关, - 以访问本地屏幕/摄像头/canvas,或在笔记本上运行命令,同时将 - Gateway 网关保留在云端。 + 你可以将**节点**(Mac/iOS/Android/无头)配对到该云端 Gateway 网关,以访问 + 本地屏幕/摄像头/canvas,或在保留 + Gateway 网关于云端的同时,在你的笔记本电脑上运行命令。 - 中心页:[Platforms](/zh-CN/platforms)。远程访问:[Gateway remote](/zh-CN/gateway/remote)。 - 节点:[Nodes](/zh-CN/nodes)、[Nodes CLI](/cli/nodes)。 + 中心: [平台](/zh-CN/platforms)。远程访问: [Gateway 网关远程访问](/zh-CN/gateway/remote)。 + 节点: [节点](/zh-CN/nodes)、[Nodes CLI](/cli/nodes)。 - + 简短回答:**可以,但不推荐**。更新流程可能会重启 - Gateway 网关(这会中断当前会话),可能需要一个干净的 git 检出, - 并且可能会要求确认。更安全的做法:由操作员在 shell 中运行更新。 + Gateway 网关(这会中断当前会话),可能需要干净的 git 检出, + 还可能要求确认。更安全的方式:由操作员在 shell 中运行更新。 使用 CLI: @@ -559,14 +559,14 @@ x-i18n: openclaw update --no-restart ``` - 如果你必须从智能体中自动化: + 如果你必须从智能体自动化执行: ```bash openclaw update --yes --no-restart openclaw gateway restart ``` - 文档:[Update](/cli/update)、[Updating](/zh-CN/install/updating)。 + 文档: [更新](/cli/update)、[更新中](/zh-CN/install/updating)。 @@ -576,62 +576,60 @@ x-i18n: - **模型/认证设置**(提供商 OAuth、API 密钥、Anthropic setup-token,以及 LM Studio 等本地模型选项) - **工作区**位置 + 引导文件 - **Gateway 网关设置**(绑定/端口/认证/tailscale) - - **渠道**(WhatsApp、Telegram、Discord、Mattermost、Signal、iMessage,以及 QQ Bot 等内置渠道插件) - - **守护进程安装**(macOS 上为 LaunchAgent;Linux/WSL2 上为 systemd user unit) - - **健康检查** 和 **Skills** 选择 + - **渠道**(WhatsApp、Telegram、Discord、Mattermost、Signal、iMessage,以及像 QQ Bot 这样的内置渠道插件) + - **守护进程安装**(macOS 上为 LaunchAgent;Linux/WSL2 上为 systemd 用户单元) + - **健康检查**和 **Skills** 选择 如果你配置的模型未知或缺少认证,它还会发出警告。 - 不需要。你可以使用**API 密钥**(Anthropic/OpenAI/其他)运行 OpenClaw,或者使用 - **纯本地模型**,这样你的数据就能保留在设备上。这些订阅(Claude - Pro/Max 或 OpenAI Codex)只是为这些提供商认证的可选方式。 + 不需要。你可以通过 **API 密钥**(Anthropic/OpenAI/其他)运行 OpenClaw,或者使用 + **纯本地模型**,这样你的数据就会保留在你的设备上。订阅(Claude + Pro/Max 或 OpenAI Codex)只是这些提供商的可选认证方式。 - 对于 OpenClaw 中的 Anthropic,实际区分如下: + 对于 OpenClaw 中的 Anthropic,实际上的区分是: - - **Anthropic API key**:正常的 Anthropic API 计费 + - **Anthropic API key**:常规 Anthropic API 计费 - **OpenClaw 中的 Claude CLI / Claude 订阅认证**:Anthropic 员工 - 告诉我们,这种用法再次被允许,因此 OpenClaw 将 `claude -p` - 的使用视为此集成下被认可的用法,除非 Anthropic 发布新的 + 告诉我们这种用法再次被允许,OpenClaw 目前将 `claude -p` + 的使用视为此集成的受支持方式,除非 Anthropic 发布新的 政策 - 对于长期运行的 gateway host,Anthropic API 密钥仍然是 - 更可预测的设置方式。OpenAI Codex OAuth 则被明确支持用于 + 对于长期运行的 Gateway 网关主机来说,Anthropic API 密钥仍然是更 + 可预测的设置方式。OpenAI Codex OAuth 已明确支持 OpenClaw 这类外部工具。 - OpenClaw 还支持其他托管型订阅选项,包括 + OpenClaw 还支持其他托管式订阅选项,包括 **Qwen Cloud Coding Plan**、**MiniMax Coding Plan** 和 **Z.AI / GLM Coding Plan**。 - 文档:[Anthropic](/zh-CN/providers/anthropic)、[OpenAI](/zh-CN/providers/openai)、 + 文档: [Anthropic](/zh-CN/providers/anthropic)、[OpenAI](/zh-CN/providers/openai)、 [Qwen Cloud](/zh-CN/providers/qwen)、 [MiniMax](/zh-CN/providers/minimax)、[GLM Models](/zh-CN/providers/glm)、 - [Local models](/zh-CN/gateway/local-models)、[Models](/zh-CN/concepts/models)。 + [本地模型](/zh-CN/gateway/local-models)、[模型](/zh-CN/concepts/models)。 - + 可以。 Anthropic 员工告诉我们,OpenClaw 风格的 Claude CLI 用法再次被允许,因此 - OpenClaw 将 Claude 订阅认证和 `claude -p` 用法视为此集成下被认可的方式, - 除非 Anthropic 发布新的政策。如果你想要 - 最可预测的服务端设置,请改用 Anthropic API key。 + 除非 Anthropic 发布新的政策,否则 OpenClaw 会将 Claude 订阅认证和 `claude -p` 的使用视为此集成中受支持的方式。如果你想要 + 最可预测的服务器端设置,建议改用 Anthropic API 密钥。 支持。 - Anthropic 员工告诉我们,这种用法再次被允许,因此 OpenClaw 将 - Claude CLI 复用和 `claude -p` 用法视为此集成下被认可的方式, - 除非 Anthropic 发布新的政策。 + Anthropic 员工告诉我们,这种用法再次被允许,因此除非 Anthropic 发布新的政策,否则 OpenClaw 会将 + Claude CLI 复用和 `claude -p` 的使用视为此集成中受支持的方式。 - Anthropic setup-token 仍然可作为受支持的 OpenClaw 令牌路径,但 OpenClaw 现在更偏好在可用时复用 Claude CLI 和 `claude -p`。 - 对于生产环境或多用户工作负载,Anthropic API key 认证仍然是 - 更安全、更可预测的选择。如果你想在 OpenClaw 中使用其他托管型订阅 + Anthropic setup-token 仍然是 OpenClaw 支持的令牌路径,但在可用时,OpenClaw 现在更倾向于优先使用 Claude CLI 复用和 `claude -p`。 + 对于生产环境或多用户工作负载,Anthropic API 密钥认证仍然是 + 更安全、更可预测的选择。如果你想在 OpenClaw 中使用其他托管式订阅 选项,请参阅 [OpenAI](/zh-CN/providers/openai)、[Qwen / Model Cloud](/zh-CN/providers/qwen)、[MiniMax](/zh-CN/providers/minimax) 和 [GLM Models](/zh-CN/providers/glm)。 @@ -640,118 +638,118 @@ x-i18n: -这意味着你当前窗口内的 **Anthropic 配额/速率限制** 已耗尽。如果你 +这意味着你当前时间窗口内的 **Anthropic 配额/速率限制** 已耗尽。如果你 使用 **Claude CLI**,请等待窗口重置或升级你的套餐。如果你 -使用 **Anthropic API key**,请检查 Anthropic Console -中的使用量/计费情况,并按需提高限额。 +使用 **Anthropic API 密钥**,请检查 Anthropic Console +中的用量/计费情况,并根据需要提高限额。 - 如果消息明确是: - `Extra usage is required for long context requests`,则说明该请求正在尝试使用 + 如果消息具体是: + `Extra usage is required for long context requests`,则表示该请求正试图使用 Anthropic 的 1M 上下文 beta(`context1m: true`)。这只有在你的 - 凭据有资格进行长上下文计费时才有效(API key 计费,或者启用了 Extra Usage 的 + 凭证符合长上下文计费条件时才可用(API 密钥计费,或启用了 Extra Usage 的 OpenClaw Claude 登录路径)。 - 提示:设置一个**后备模型**,这样当某个提供商被限流时,OpenClaw 仍能继续回复。 - 参阅 [Models](/cli/models)、[OAuth](/zh-CN/concepts/oauth) 和 + 提示:设置一个**回退模型**,这样 OpenClaw 就能在某个提供商受到速率限制时继续回复。 + 请参阅 [模型](/cli/models)、[OAuth](/zh-CN/concepts/oauth) 和 [/gateway/troubleshooting#anthropic-429-extra-usage-required-for-long-context](/zh-CN/gateway/troubleshooting#anthropic-429-extra-usage-required-for-long-context)。 - 支持。OpenClaw 内置了 **Amazon Bedrock(Converse)** 提供商。当 AWS 环境标记存在时,OpenClaw 可以自动发现流式/文本 Bedrock 目录,并将其合并为隐式的 `amazon-bedrock` 提供商;否则你也可以显式启用 `plugins.entries.amazon-bedrock.config.discovery.enabled`,或手动添加一个提供商条目。参阅 [Amazon Bedrock](/zh-CN/providers/bedrock) 和 [Model providers](/zh-CN/providers/models)。如果你更偏好托管密钥流程,在 Bedrock 前面使用 OpenAI 兼容代理仍然是一个可行选择。 + 支持。OpenClaw 内置了 **Amazon Bedrock(Converse)** 提供商。当存在 AWS 环境标记时,OpenClaw 可以自动发现支持流式传输/文本的 Bedrock 目录,并将其作为隐式 `amazon-bedrock` 提供商合并;否则你也可以显式启用 `plugins.entries.amazon-bedrock.config.discovery.enabled`,或手动添加提供商条目。请参阅 [Amazon Bedrock](/zh-CN/providers/bedrock) 和 [模型提供商](/zh-CN/providers/models)。如果你更偏好托管式密钥流程,在 Bedrock 前面使用 OpenAI 兼容代理仍然是可行的选择。 - OpenClaw 通过 OAuth(ChatGPT 登录)支持 **OpenAI Code(Codex)**。新手引导可以运行 OAuth 流程,并会在适当时将默认模型设为 `openai-codex/gpt-5.4`。参阅 [Model providers](/zh-CN/concepts/model-providers) 和 [新手引导(CLI)](/zh-CN/start/wizard)。 + OpenClaw 通过 OAuth(ChatGPT 登录)支持 **OpenAI Code(Codex)**。新手引导可以运行 OAuth 流程,并会在合适时将默认模型设置为 `openai-codex/gpt-5.4`。请参阅 [模型提供商](/zh-CN/concepts/model-providers) 和 [设置向导(CLI)](/zh-CN/start/wizard)。 - OpenClaw 将这两种路径分开处理: + OpenClaw 将这两条路径分开处理: - `openai-codex/gpt-5.4` = ChatGPT/Codex OAuth - `openai/gpt-5.4` = 直接 OpenAI Platform API - 在 OpenClaw 中,ChatGPT/Codex 登录绑定到 `openai-codex/*` 路由, - 而不是直接的 `openai/*` 路由。如果你希望在 - OpenClaw 中使用直接 API 路径,请设置 `OPENAI_API_KEY`(或等效的 OpenAI 提供商配置)。 - 如果你希望在 OpenClaw 中使用 ChatGPT/Codex 登录,请使用 `openai-codex/*`。 + 在 OpenClaw 中,ChatGPT/Codex 登录绑定到 `openai-codex/*` 路径, + 而不是直接的 `openai/*` 路径。如果你想在 OpenClaw 中使用直接 API 路径, + 请设置 `OPENAI_API_KEY`(或等效的 OpenAI 提供商配置)。 + 如果你想在 OpenClaw 中使用 ChatGPT/Codex 登录,请使用 `openai-codex/*`。 - - `openai-codex/*` 使用 Codex OAuth 路径,而其可用配额窗口由 - OpenAI 管理,并取决于你的套餐。实际上,这些限额可能与 - ChatGPT 网站/应用体验不同,即使两者都绑定在同一账户下。 + + `openai-codex/*` 使用 Codex OAuth 路径,而它的可用配额窗口由 + OpenAI 管理,并取决于套餐。实际上,即使两者都绑定到同一个账户, + 这些限制也可能与 ChatGPT 网站/应用中的体验不同。 OpenClaw 可以在 - `openclaw models status` 中显示当前可见的提供商使用量/配额窗口,但它不会凭空创建 - 或将 ChatGPT Web 权限标准化为直接 API 访问。如果你想使用直接的 OpenAI Platform - 计费/限额路径,请配合 API key 使用 `openai/*`。 + `openclaw models status` 中显示当前可见的提供商用量/配额窗口,但不会自行推断或规范化 ChatGPT 网页版 + 权益为直接 API 访问。如果你想要直接的 OpenAI Platform + 计费/限额路径,请配合 API 密钥使用 `openai/*`。 支持。OpenClaw 完全支持 **OpenAI Code(Codex)订阅 OAuth**。 - OpenAI 明确允许在 OpenClaw - 这类外部工具/工作流中使用订阅 OAuth。新手引导可以帮你运行该 OAuth 流程。 + OpenAI 明确允许在 OpenClaw 这样的外部工具/工作流中 + 使用订阅 OAuth。新手引导可以为你运行 OAuth 流程。 - 参阅 [OAuth](/zh-CN/concepts/oauth)、[Model providers](/zh-CN/concepts/model-providers) 和 [新手引导(CLI)](/zh-CN/start/wizard)。 + 请参阅 [OAuth](/zh-CN/concepts/oauth)、[模型提供商](/zh-CN/concepts/model-providers) 和 [设置向导(CLI)](/zh-CN/start/wizard)。 - - Gemini CLI 使用的是**插件认证流程**,而不是在 `openclaw.json` 中填写 `client id` 或 `secret`。 + + Gemini CLI 使用的是**插件认证流程**,而不是在 `openclaw.json` 中配置 client id 或 secret。 步骤: - 1. 在本地安装 Gemini CLI,确保 `gemini` 在 `PATH` 中 + 1. 在本地安装 Gemini CLI,确保 `gemini` 已加入 `PATH` - Homebrew:`brew install gemini-cli` - npm:`npm install -g @google/gemini-cli` 2. 启用插件:`openclaw plugins enable google` 3. 登录:`openclaw models auth login --provider google-gemini-cli --set-default` 4. 登录后的默认模型:`google-gemini-cli/gemini-3-flash-preview` - 5. 如果请求失败,请在 gateway host 上设置 `GOOGLE_CLOUD_PROJECT` 或 `GOOGLE_CLOUD_PROJECT_ID` + 5. 如果请求失败,请在 Gateway 网关主机上设置 `GOOGLE_CLOUD_PROJECT` 或 `GOOGLE_CLOUD_PROJECT_ID` - 这会将 OAuth 令牌存储在 gateway host 上的认证配置文件中。详情参阅:[Model providers](/zh-CN/concepts/model-providers)。 + 这会将 OAuth 令牌存储到 Gateway 网关主机上的认证配置文件中。详情请参阅: [模型提供商](/zh-CN/concepts/model-providers)。 - 通常不适合。OpenClaw 需要大上下文 + 强安全性;小卡会发生截断和泄漏。如果你一定要这样做,请在本地运行你能承受的**最大**模型构建(LM Studio),并查看 [/gateway/local-models](/zh-CN/gateway/local-models)。更小/量化更重的模型会提高提示注入风险——参阅 [Security](/zh-CN/gateway/security)。 + 通常不适合。OpenClaw 需要大上下文 + 强安全性;小模型会截断并泄漏。如果你确实需要,请在本地运行你能承载的**最大**模型构建(LM Studio),并参阅 [/gateway/local-models](/zh-CN/gateway/local-models)。更小/量化后的模型会增加提示注入风险——请参阅 [安全性](/zh-CN/gateway/security)。 - - 选择固定区域的端点。OpenRouter 为 MiniMax、Kimi 和 GLM 提供美国托管选项;选择美国托管变体即可让数据保留在该区域内。你仍然可以通过使用 `models.mode: "merge"` 将 Anthropic/OpenAI 一并列出,这样在保留所选区域化提供商的同时,也能保留后备模型。 + + 选择固定区域的端点。OpenRouter 为 MiniMax、Kimi 和 GLM 提供美国托管选项;选择美国托管变体即可让数据保留在该区域内。你仍然可以通过使用 `models.mode: "merge"` 将 Anthropic/OpenAI 一起列出,这样在遵守你所选区域提供商限制的同时,回退模型也仍然可用。 - - 不需要。OpenClaw 可以运行在 macOS 或 Linux 上(Windows 通过 WSL2)。Mac mini 只是可选项——有些人 - 会买一台作为常开主机,但小型 VPS、家用服务器或 Raspberry Pi 级别的机器也可以。 + + 不需要。OpenClaw 可运行在 macOS 或 Linux 上(Windows 通过 WSL2)。Mac mini 是可选的——有些人 + 会买一台作为常开主机,但小型 VPS、家用服务器或 Raspberry Pi 级别的设备也可以。 - 只有在你需要 **仅限 macOS 的工具**时才需要 Mac。对于 iMessage,请使用 [BlueBubbles](/zh-CN/channels/bluebubbles)(推荐)——BlueBubbles 服务器运行在任意 Mac 上,而 Gateway 网关可以运行在 Linux 或其他地方。如果你想使用其他仅限 macOS 的工具,可以在 Mac 上运行 Gateway 网关,或配对一个 macOS 节点。 + 只有在你需要**仅限 macOS 的工具**时才必须使用 Mac。对于 iMessage,请使用 [BlueBubbles](/zh-CN/channels/bluebubbles)(推荐)——BlueBubbles 服务器可以运行在任意 Mac 上,而 Gateway 网关可以运行在 Linux 或其他环境中。如果你需要其他仅限 macOS 的工具,请在 Mac 上运行 Gateway 网关,或配对一个 macOS 节点。 - 文档:[BlueBubbles](/zh-CN/channels/bluebubbles)、[Nodes](/zh-CN/nodes)、[Mac remote mode](/zh-CN/platforms/mac/remote)。 + 文档: [BlueBubbles](/zh-CN/channels/bluebubbles)、[节点](/zh-CN/nodes)、[Mac 远程模式](/zh-CN/platforms/mac/remote)。 - - 你需要一台**已登录 Messages 的 macOS 设备**。它**不一定**是 Mac mini—— - 任意 Mac 都可以。对于 iMessage,**请使用 [BlueBubbles](/zh-CN/channels/bluebubbles)**(推荐)——BlueBubbles 服务器运行在 macOS 上,而 Gateway 网关可以运行在 Linux 或其他地方。 + + 你需要**某种已登录 Messages 的 macOS 设备**。它**不一定**必须是 Mac mini—— + 任何 Mac 都可以。对于 iMessage,**请使用 [BlueBubbles](/zh-CN/channels/bluebubbles)**(推荐)——BlueBubbles 服务器运行在 macOS 上,而 Gateway 网关可以运行在 Linux 或其他地方。 常见设置: - - 在 Linux/VPS 上运行 Gateway 网关,在任意已登录 Messages 的 Mac 上运行 BlueBubbles 服务器。 - - 如果你想要最简单的单机设置,也可以将所有内容都运行在该 Mac 上。 + - 在 Linux/VPS 上运行 Gateway 网关,并在任意一台已登录 Messages 的 Mac 上运行 BlueBubbles 服务器。 + - 如果你想要最简单的单机设置,也可以把所有内容都运行在那台 Mac 上。 - 文档:[BlueBubbles](/zh-CN/channels/bluebubbles)、[Nodes](/zh-CN/nodes)、 - [Mac remote mode](/zh-CN/platforms/mac/remote)。 + 文档: [BlueBubbles](/zh-CN/channels/bluebubbles)、[节点](/zh-CN/nodes)、 + [Mac 远程模式](/zh-CN/platforms/mac/remote)。 可以。**Mac mini 可以运行 Gateway 网关**,而你的 MacBook Pro 可以作为 - **节点**(配套设备)连接。节点不会运行 Gateway 网关——它们提供额外 - 功能,例如该设备上的屏幕/摄像头/canvas 和 `system.run`。 + **节点**(配套设备)连接。节点不运行 Gateway 网关——它们提供额外 + 能力,比如该设备上的屏幕/摄像头/canvas 和 `system.run`。 常见模式: @@ -759,49 +757,49 @@ x-i18n: - MacBook Pro 运行 macOS 应用或节点主机,并与 Gateway 网关配对。 - 使用 `openclaw nodes status` / `openclaw nodes list` 查看它。 - 文档:[Nodes](/zh-CN/nodes)、[Nodes CLI](/cli/nodes)。 + 文档: [节点](/zh-CN/nodes)、[Nodes CLI](/cli/nodes)。 **不推荐**使用 Bun。我们观察到运行时 bug,尤其是在 WhatsApp 和 Telegram 上。 - 稳定的 Gateway 网关请使用 **Node**。 + 想要稳定的 Gateway 网关,请使用 **Node**。 - 如果你仍想试验 Bun,请在非生产 Gateway 网关上进行, - 且不要启用 WhatsApp/Telegram。 + 如果你仍然想尝试 Bun,请在非生产 Gateway 网关上进行, + 并且不要接入 WhatsApp/Telegram。 - `channels.telegram.allowFrom` 填的是**真实用户发送者的 Telegram user ID**(数字),而不是机器人用户名。 + `channels.telegram.allowFrom` 应填写**真人发送者的 Telegram 用户 ID**(数字),不是机器人用户名。 - 新手引导接受 `@username` 输入并会将其解析为数字 ID,但 OpenClaw 授权仅使用数字 ID。 + 新手引导接受 `@username` 输入并将其解析为数字 ID,但 OpenClaw 授权只使用数字 ID。 - 更安全的方式(无需第三方机器人): + 更安全的方式(无需第三方 bot): - - 给你的机器人发私信,然后运行 `openclaw logs --follow` 并查看 `from.id`。 + - 给你的 bot 发私信,然后运行 `openclaw logs --follow` 并读取 `from.id`。 官方 Bot API: - - 给你的机器人发私信,然后调用 `https://api.telegram.org/bot/getUpdates` 并查看 `message.from.id`。 + - 给你的 bot 发私信,然后调用 `https://api.telegram.org/bot/getUpdates` 并读取 `message.from.id`。 - 第三方方式(隐私较差): + 第三方方式(隐私性较差): - 给 `@userinfobot` 或 `@getidsbot` 发私信。 - 参阅 [/channels/telegram](/zh-CN/channels/telegram#access-control-and-activation)。 + 请参阅 [/channels/telegram](/zh-CN/channels/telegram#access-control-and-activation)。 - - 可以,通过**多智能体路由**实现。将每个发送者的 WhatsApp **私信**(peer `kind: "direct"`,发送者 E.164 例如 `+15551234567`)绑定到不同的 `agentId`,这样每个人都会拥有自己的工作区和会话存储。回复仍然来自**同一个 WhatsApp 账户**,而私信访问控制(`channels.whatsapp.dmPolicy` / `channels.whatsapp.allowFrom`)对每个 WhatsApp 账户来说是全局的。参阅 [Multi-Agent Routing](/zh-CN/concepts/multi-agent) 和 [WhatsApp](/zh-CN/channels/whatsapp)。 + + 可以,通过**多智能体路由**实现。将每个发送者的 WhatsApp **私信**(peer `kind: "direct"`,发送者 E.164 如 `+15551234567`)绑定到不同的 `agentId`,这样每个人都会有自己的工作区和会话存储。回复仍然来自**同一个 WhatsApp 账号**,而私信访问控制(`channels.whatsapp.dmPolicy` / `channels.whatsapp.allowFrom`)对于该 WhatsApp 账号是全局的。请参阅 [多智能体路由](/zh-CN/concepts/multi-agent) 和 [WhatsApp](/zh-CN/channels/whatsapp)。 - - 可以。使用多智能体路由:为每个智能体设置各自的默认模型,然后将入站路由(提供商账户或特定 peers)绑定到各个智能体。示例配置见 [Multi-Agent Routing](/zh-CN/concepts/multi-agent)。另请参阅 [Models](/zh-CN/concepts/models) 和 [Configuration](/zh-CN/gateway/configuration)。 + + 可以。使用多智能体路由:为每个智能体设置各自的默认模型,然后将入站路由(提供商账号或特定 peer)绑定到各个智能体。示例配置见 [多智能体路由](/zh-CN/concepts/multi-agent)。另请参阅 [模型](/zh-CN/concepts/models) 和 [配置](/zh-CN/gateway/configuration)。 - + 可以。Homebrew 支持 Linux(Linuxbrew)。快速设置: ```bash @@ -811,25 +809,25 @@ x-i18n: brew install ``` - 如果你通过 systemd 运行 OpenClaw,请确保服务 PATH 包含 `/home/linuxbrew/.linuxbrew/bin`(或你的 brew 前缀),以便 `brew` 安装的工具能在非登录 shell 中被解析。 - 近期构建还会为 Linux systemd 服务预置常见用户 bin 目录(例如 `~/.local/bin`、`~/.npm-global/bin`、`~/.local/share/pnpm`、`~/.bun/bin`),并在设置时识别 `PNPM_HOME`、`NPM_CONFIG_PREFIX`、`BUN_INSTALL`、`VOLTA_HOME`、`ASDF_DATA_DIR`、`NVM_DIR` 和 `FNM_DIR`。 + 如果你通过 systemd 运行 OpenClaw,请确保服务的 PATH 包含 `/home/linuxbrew/.linuxbrew/bin`(或你的 brew 前缀),这样 `brew` 安装的工具才能在非登录 shell 中被正确解析。 + 最近的构建也会在 Linux systemd 服务上预置常见用户 bin 目录(例如 `~/.local/bin`、`~/.npm-global/bin`、`~/.local/share/pnpm`、`~/.bun/bin`),并在已设置时识别 `PNPM_HOME`、`NPM_CONFIG_PREFIX`、`BUN_INSTALL`、`VOLTA_HOME`、`ASDF_DATA_DIR`、`NVM_DIR` 和 `FNM_DIR`。 - + - **可修改的(git)安装:**完整源码检出,可编辑,最适合贡献者。 - 你在本地运行构建,也可以修补代码/文档。 - - **npm install:**全局 CLI 安装,没有仓库,最适合“只想直接运行”。 + 你会在本地运行构建,也可以修改代码/文档。 + - **npm install:**全局 CLI 安装,不包含仓库,最适合“只想跑起来”。 更新来自 npm dist-tag。 - 文档:[入门指南](/zh-CN/start/getting-started)、[Updating](/zh-CN/install/updating)。 + 文档: [入门指南](/zh-CN/start/getting-started)、[更新中](/zh-CN/install/updating)。 - - 可以。安装另一种形式后,运行 Doctor,让 gateway service 指向新的入口点。 - 这**不会删除你的数据**——它只会更改 OpenClaw 代码的安装方式。你的状态 - (`~/.openclaw`)和工作区(`~/.openclaw/workspace`)保持不变。 + + 可以。安装另一种形式后,再运行 Doctor,让 Gateway 网关服务指向新的入口点。 + 这**不会删除你的数据**——它只会更改 OpenClaw 的代码安装方式。你的状态 + (`~/.openclaw`)和工作区(`~/.openclaw/workspace`)都会保持不变。 从 npm 切换到 git: @@ -850,153 +848,152 @@ x-i18n: openclaw gateway restart ``` - Doctor 会检测 gateway service 入口点不匹配,并提示将服务配置重写为与当前安装匹配(自动化时使用 `--repair`)。 + Doctor 会检测 Gateway 网关服务入口点不匹配的问题,并提供将服务配置重写为与当前安装匹配的选项(在自动化中使用 `--repair`)。 - 备份提示:参阅 [备份策略](#磁盘上的文件位置)。 + 备份建议:请参阅 [备份策略](#where-things-live-on-disk)。 - - 简短回答:**如果你想要 24/7 可靠性,就用 VPS**。如果你想要 - 最低阻力,并且可以接受休眠/重启,那就在本地运行。 + + 简短回答:**如果你想要 24/7 的可靠性,请使用 VPS**。如果你希望 + 摩擦最小,并且可以接受休眠/重启,那就在本地运行。 - **笔记本(本地 Gateway 网关)** + **笔记本电脑(本地 Gateway 网关)** - - **优点:**没有服务器成本,直接访问本地文件,可见的浏览器窗口。 - - **缺点:**休眠/网络断开 = 连接中断,操作系统更新/重启会打断,机器必须保持唤醒。 + - **优点:**无服务器成本,可直接访问本地文件,有可见的浏览器窗口。 + - **缺点:**休眠/网络中断 = 断连,操作系统更新/重启会中断,必须保持唤醒。 **VPS / 云端** - - **优点:**始终在线,网络稳定,没有笔记本休眠问题,更容易保持运行。 - - **缺点:**通常是无头运行(需要用截图),只能远程访问文件,更新必须 SSH 进去。 + - **优点:**始终在线,网络稳定,没有笔记本休眠问题,更容易长期保持运行。 + - **缺点:**通常以无头模式运行(使用截图),只能远程访问文件,更新时必须通过 SSH。 - **OpenClaw 特定说明:**WhatsApp/Telegram/Slack/Mattermost/Discord 在 VPS 上都能正常工作。唯一真正的权衡是**无头浏览器**还是可见窗口。参阅 [Browser](/zh-CN/tools/browser)。 + **OpenClaw 特别说明:**WhatsApp/Telegram/Slack/Mattermost/Discord 在 VPS 上都能正常运行。真正的取舍只有**无头浏览器**与可见窗口之间的差别。请参阅 [浏览器](/zh-CN/tools/browser)。 - **推荐默认方案:**如果你之前遇到过 gateway disconnect,使用 VPS。本地运行则非常适合你正在主动使用 Mac,且希望访问本地文件或使用可见浏览器做 UI 自动化的场景。 + **推荐默认选择:**如果你之前遇到过 Gateway 网关断连,建议使用 VPS。本地运行非常适合你正在积极使用 Mac,并且想要本地文件访问或带可见浏览器的 UI 自动化时。 - 不是必须,但**出于可靠性和隔离性,推荐这样做**。 + 不是必须,但**为了可靠性和隔离性,推荐这样做**。 - - **专用主机(VPS/Mac mini/Pi):**始终在线,更少休眠/重启中断,权限更干净,更容易保持运行。 - - **共享笔记本/台式机:**用于测试和主动使用完全没问题,但当机器休眠或更新时,预期会有暂停。 + - **专用主机(VPS/Mac mini/Pi):**始终在线,休眠/重启中断更少,权限更干净,更容易持续运行。 + - **共享笔记本/台式机:**用于测试和主动使用完全没问题,但机器休眠或更新时预计会出现暂停。 - 如果你想两全其美,可以把 Gateway 网关放在专用主机上,再将笔记本配对为一个**节点**,用于本地屏幕/摄像头/exec 工具。参阅 [Nodes](/zh-CN/nodes)。 - 有关安全指导,请阅读 [Security](/zh-CN/gateway/security)。 + 如果你想兼顾两者优势,可以将 Gateway 网关放在专用主机上,再把笔记本电脑作为**节点**配对,用于本地屏幕/摄像头/exec 工具。请参阅 [节点](/zh-CN/nodes)。 + 有关安全指南,请阅读 [安全性](/zh-CN/gateway/security)。 - + OpenClaw 很轻量。对于基础 Gateway 网关 + 一个聊天渠道: - - **绝对最低:**1 vCPU、1GB RAM、约 500MB 磁盘。 - - **推荐:**1-2 vCPU、2GB RAM 或更多余量(日志、媒体、多个渠道)。节点工具和浏览器自动化可能比较吃资源。 + - **绝对最低配置:**1 vCPU、1GB RAM、约 500MB 磁盘。 + - **推荐配置:**1-2 vCPU、2GB RAM 或更多余量(日志、媒体、多个渠道)。Node 工具和浏览器自动化可能比较耗费资源。 - 操作系统:使用 **Ubuntu LTS**(或任意现代 Debian/Ubuntu)。Linux 安装路径在这些系统上测试最充分。 + 操作系统:使用 **Ubuntu LTS**(或任何现代 Debian/Ubuntu)。Linux 安装路径在这些系统上测试最充分。 - 文档:[Linux](/zh-CN/platforms/linux)、[VPS hosting](/zh-CN/vps)。 + 文档: [Linux](/zh-CN/platforms/linux)、[VPS 托管](/zh-CN/vps)。 - - 可以。把 VM 当作 VPS 来看:它需要始终运行、可访问,并且有足够的 - RAM 用于 Gateway 网关和你启用的任何渠道。 + + 可以。把虚拟机当作 VPS 看待即可:它需要始终在线、可访问,并且有足够的 + RAM 来运行 Gateway 网关以及你启用的各个渠道。 - 基线建议: + 基础建议: - - **绝对最低:**1 vCPU、1GB RAM。 - - **推荐:**如果你运行多个渠道、浏览器自动化或媒体工具,建议 2GB RAM 或更多。 + - **绝对最低配置:**1 vCPU、1GB RAM。 + - **推荐配置:**如果你运行多个渠道、浏览器自动化或媒体工具,建议使用 2GB RAM 或更多。 - **操作系统:**Ubuntu LTS 或其他现代 Debian/Ubuntu。 - 如果你在 Windows 上,**WSL2 是最简单的 VM 风格设置**,并且工具 - 兼容性最好。参阅 [Windows](/zh-CN/platforms/windows)、[VPS hosting](/zh-CN/vps)。 - 如果你在 VM 中运行 macOS,请参阅 [macOS VM](/zh-CN/install/macos-vm)。 + 如果你使用的是 Windows,**WSL2 是最容易上手的虚拟机式配置**,并且具有最好的工具 + 兼容性。请参阅 [Windows](/zh-CN/platforms/windows)、[VPS 托管](/zh-CN/vps)。 + 如果你在虚拟机中运行 macOS,请参阅 [macOS VM](/zh-CN/install/macos-vm)。 -## 什么是 OpenClaw? +## OpenClaw 是什么? - - OpenClaw 是一个运行在你自己设备上的个人 AI 助手。它会在你已经使用的消息界面上回复你(WhatsApp、Telegram、Slack、Mattermost、Discord、Google Chat、Signal、iMessage、WebChat,以及 QQ Bot 等内置渠道插件),并且在受支持的平台上也能提供语音 + 实时 Canvas。**Gateway 网关**是始终在线的控制平面;这个助手才是产品本身。 + + OpenClaw 是一个运行在你自己设备上的个人 AI 助手。它会在你已经使用的消息界面上回复(WhatsApp、Telegram、Slack、Mattermost、Discord、Google Chat、Signal、iMessage、WebChat,以及 QQ Bot 等内置渠道插件),并且在受支持的平台上还可以提供语音 + 实时 Canvas。**Gateway 网关**是始终在线的控制平面;而这个助手本身才是产品。 - OpenClaw 并不只是“Claude 的一层封装”。它是一个**本地优先的控制平面**,让你可以在**自己的硬件**上运行一个 - 能力强大的助手,并通过你已使用的聊天应用访问它,同时具备 - 有状态会话、记忆和工具——而无需把你的工作流控制权交给托管式 + OpenClaw 不是“又一个 Claude 包装器”。它是一个**本地优先的控制平面**,让你能够在**自己的硬件**上运行一个 + 功能强大的助手,并通过你已经在使用的聊天应用访问它,同时拥有 + 有状态的会话、记忆和工具——而不需要把你的工作流控制权交给托管式 SaaS。 亮点: - - **你的设备,你的数据:**在任何你想要的地方运行 Gateway 网关(Mac、Linux、VPS),并将 - 工作区 + 会话历史保留在本地。 - - **真实渠道,而不是 web 沙箱:**WhatsApp/Telegram/Slack/Discord/Signal/iMessage 等, - 以及受支持平台上的移动语音和 Canvas。 - - **模型无关:**使用 Anthropic、OpenAI、MiniMax、OpenRouter 等,并支持按智能体路由 - 和故障转移。 - - **纯本地选项:**运行本地模型,这样**所有数据都可以保留在你的设备上**(如果你愿意)。 - - **多智能体路由:**按渠道、账户或任务拆分智能体,每个都有自己的 + - **你的设备,你的数据:**你可以在任意位置运行 Gateway 网关(Mac、Linux、VPS),并保持 + 工作区 + 会话历史保存在本地。 + - **真实渠道,而不是 Web 沙箱:**WhatsApp/Telegram/Slack/Discord/Signal/iMessage 等, + 以及在受支持平台上的移动语音和 Canvas。 + - **模型无关:**使用 Anthropic、OpenAI、MiniMax、OpenRouter 等,并支持按智能体进行路由 + 和故障切换。 + - **纯本地选项:**运行本地模型,这样如果你愿意,**所有数据都可以保留在你的设备上**。 + - **多智能体路由:**按渠道、账号或任务划分独立智能体,每个都有自己的 工作区和默认设置。 - - **开源且可修改:**可自行检查、扩展和自托管,不受厂商锁定。 + - **开源且可修改:**可以检查、扩展和自行托管,不受供应商锁定。 - 文档:[Gateway 网关](/zh-CN/gateway)、[Channels](/zh-CN/channels)、[多智能体](/zh-CN/concepts/multi-agent)、 - [Memory](/zh-CN/concepts/memory)。 + 文档: [Gateway 网关](/zh-CN/gateway)、[渠道](/zh-CN/channels)、[多智能体](/zh-CN/concepts/multi-agent)、 + [记忆](/zh-CN/concepts/memory)。 - - 很适合一开始尝试的项目: + + 很好的首批项目包括: - - 构建一个网站(WordPress、Shopify,或一个简单的静态站点)。 - - 制作一个移动应用原型(大纲、页面、API 计划)。 + - 构建一个网站(WordPress、Shopify,或简单的静态站点)。 + - 制作一个移动应用原型(大纲、界面、API 计划)。 - 整理文件和文件夹(清理、命名、打标签)。 - 连接 Gmail 并自动生成摘要或后续跟进。 - 它可以处理大型任务,但当你把它们拆分成多个阶段, - 并使用子智能体并行工作时,效果通常最好。 + 它可以处理大型任务,但当你把任务拆分为多个阶段,并 + 使用子智能体并行工作时,效果最好。 日常收益通常体现在: - - **个人简报:**总结收件箱、日历和你关心的新闻。 - - **研究与起草:**快速调研、摘要,以及邮件或文档的初稿。 - - **提醒与跟进:**由 cron 或 heartbeat 驱动的提醒和检查清单。 - - **浏览器自动化:**填写表单、收集数据、重复 web 任务。 - - **跨设备协作:**从手机发送任务,让 Gateway 网关在服务器上运行,然后在聊天中把结果发回给你。 + - **个人简报:**汇总你的收件箱、日历和你关心的新闻。 + - **研究与起草:**快速研究、摘要,以及邮件或文档的初稿。 + - **提醒与跟进:**由 cron 或 Heartbeat 驱动的提醒和检查清单。 + - **浏览器自动化:**填写表单、收集数据,以及重复性的 Web 任务。 + - **跨设备协作:**从手机发送任务,让 Gateway 网关在服务器上运行,再把结果返回到聊天中。 - 可以用于**研究、资格筛选和起草**。它可以扫描网站、建立候选列表、 - 总结潜在客户,并撰写外联或广告文案草稿。 + 对于**研究、资格筛选和起草**,可以。它可以扫描网站、建立候选名单、 + 汇总潜在客户信息,并撰写外联或广告文案草稿。 - 对于**外联或广告投放**,请始终让人工参与。避免垃圾信息,遵守当地法律和 + 对于**外联或广告投放**,请保持人工参与。避免垃圾信息,遵守当地法律和 平台政策,并在发送前审核所有内容。最安全的模式是让 - OpenClaw 起草,由你批准。 + OpenClaw 先起草,再由你审批。 - 文档:[Security](/zh-CN/gateway/security)。 + 文档: [安全性](/zh-CN/gateway/security)。 - - OpenClaw 是一个**个人助手**和协调层,不是 IDE 替代品。对于仓库内最快的直接编码循环,请使用 - Claude Code 或 Codex。对于 - 需要持久记忆、跨设备访问和工具编排的场景,请使用 OpenClaw。 + + OpenClaw 是一个**个人助手**和协调层,而不是 IDE 替代品。要在仓库内获得最快的直接编码循环, + 请使用 Claude Code 或 Codex。需要持久记忆、跨设备访问和工具编排时,请使用 OpenClaw。 优势: - **跨会话的持久记忆 + 工作区** - **多平台访问**(WhatsApp、Telegram、TUI、WebChat) - **工具编排**(浏览器、文件、调度、hooks) - - **始终在线的 Gateway 网关**(可运行在 VPS 上,随处交互) - - 用于本地浏览器/屏幕/摄像头/exec 的 **Nodes** + - **始终在线的 Gateway 网关**(运行在 VPS 上,可随时随地交互) + - 用于本地浏览器/屏幕/摄像头/exec 的**节点** - 展示页:[https://openclaw.ai/showcase](https://openclaw.ai/showcase) + 展示: [https://openclaw.ai/showcase](https://openclaw.ai/showcase) @@ -1004,69 +1001,69 @@ x-i18n: ## Skills 和自动化 - - 使用托管覆盖,而不是直接编辑仓库副本。把你的改动放到 `~/.openclaw/skills//SKILL.md` 中(或通过 `~/.openclaw/openclaw.json` 中的 `skills.load.extraDirs` 添加一个文件夹)。优先级是 `/skills` → `/.agents/skills` → `~/.agents/skills` → `~/.openclaw/skills` → 内置 → `skills.load.extraDirs`,因此托管覆盖仍然会优先于内置技能,而无需改动 git。如果你需要让某个技能全局安装但只对部分智能体可见,请将共享副本放在 `~/.openclaw/skills`,并通过 `agents.defaults.skills` 和 `agents.list[].skills` 控制可见性。只有值得上游合并的修改才应该放在仓库里并通过 PR 提交。 + + 使用托管覆盖,而不是直接编辑仓库副本。将你的修改放到 `~/.openclaw/skills//SKILL.md` 中(或者通过 `~/.openclaw/openclaw.json` 里的 `skills.load.extraDirs` 添加一个文件夹)。优先级顺序是 `/skills` → `/.agents/skills` → `~/.agents/skills` → `~/.openclaw/skills` → 内置 → `skills.load.extraDirs`,因此托管覆盖仍然会优先于内置 Skills,而无需改动 git。如果你需要让某个 Skill 全局安装但只对某些智能体可见,请把共享副本放在 `~/.openclaw/skills` 中,再通过 `agents.defaults.skills` 和 `agents.list[].skills` 控制可见性。只有值得上游合并的修改才应放在仓库里并通过 PR 提交。 - - 可以。通过 `~/.openclaw/openclaw.json` 中的 `skills.load.extraDirs` 添加额外目录(最低优先级)。默认优先级是 `/skills` → `/.agents/skills` → `~/.agents/skills` → `~/.openclaw/skills` → 内置 → `skills.load.extraDirs`。`clawhub` 默认安装到 `./skills`,OpenClaw 会在下一个会话中将其视为 `/skills`。如果该技能只应对特定智能体可见,请结合 `agents.defaults.skills` 或 `agents.list[].skills` 一起使用。 + + 可以。通过 `~/.openclaw/openclaw.json` 中的 `skills.load.extraDirs` 添加额外目录(最低优先级)。默认优先级顺序是 `/skills` → `/.agents/skills` → `~/.agents/skills` → `~/.openclaw/skills` → 内置 → `skills.load.extraDirs`。`clawhub` 默认安装到 `./skills`,OpenClaw 会在下一次会话中将其视为 `/skills`。如果某个 Skill 只应对特定智能体可见,请结合 `agents.defaults.skills` 或 `agents.list[].skills` 使用。 - 当前支持的模式有: + 目前支持的模式有: - - **Cron 作业**:隔离作业可为每个作业设置 `model` 覆盖。 - - **子智能体**:将任务路由到使用不同默认模型的独立智能体。 + - **Cron 作业**:隔离作业可以为每个作业设置 `model` 覆盖。 + - **子智能体**:将任务路由到具有不同默认模型的独立智能体。 - **按需切换**:随时使用 `/model` 切换当前会话模型。 - 参阅 [Cron jobs](/zh-CN/automation/cron-jobs)、[Multi-Agent Routing](/zh-CN/concepts/multi-agent) 和 [Slash commands](/zh-CN/tools/slash-commands)。 + 请参阅 [Cron 作业](/zh-CN/automation/cron-jobs)、[多智能体路由](/zh-CN/concepts/multi-agent) 和 [斜杠命令](/zh-CN/tools/slash-commands)。 - - 对于耗时或并行任务,请使用**子智能体**。子智能体在各自独立的会话中运行, - 返回一个摘要,并保持你的主聊天保持响应。 + + 对于长时间运行或并行任务,请使用**子智能体**。子智能体会在自己的会话中运行, + 返回摘要,并保持你的主聊天界面依然响应。 - 让你的机器人“为这个任务启动一个子智能体”,或者使用 `/subagents`。 - 使用聊天中的 `/status` 查看 Gateway 网关当前在做什么(以及它是否繁忙)。 + 你可以让机器人“为这个任务启动一个子智能体”,或者使用 `/subagents`。 + 使用聊天中的 `/status` 可以查看 Gateway 网关当前正在做什么(以及它是否繁忙)。 - 令牌提示:长任务和子智能体都会消耗令牌。如果你关心成本,请通过 `agents.defaults.subagents.model` 为子智能体设置一个 + 令牌提示:长任务和子智能体都会消耗令牌。如果你在意成本,可以通过 `agents.defaults.subagents.model` 为子智能体设置 更便宜的模型。 - 文档:[子智能体](/zh-CN/tools/subagents)、[后台任务](/zh-CN/automation/tasks)。 + 文档: [子智能体](/zh-CN/tools/subagents)、[后台任务](/zh-CN/automation/tasks)。 - - 使用线程绑定。你可以将 Discord 线程绑定到某个子智能体或会话目标,这样该线程中的后续消息就会持续停留在该绑定会话上。 + + 使用线程绑定。你可以把 Discord 线程绑定到子智能体或会话目标,这样该线程中的后续消息就会始终发送到绑定的那个会话。 基本流程: - - 使用 `sessions_spawn` 并设置 `thread: true` 启动(也可选 `mode: "session"` 用于持久后续跟进)。 - - 或手动使用 `/focus ` 进行绑定。 + - 使用 `sessions_spawn` 并设置 `thread: true` 启动(也可选择 `mode: "session"` 以实现持久跟进)。 + - 或者手动用 `/focus ` 进行绑定。 - 使用 `/agents` 查看绑定状态。 - 使用 `/session idle ` 和 `/session max-age ` 控制自动取消聚焦。 - - 使用 `/unfocus` 从线程解绑。 + - 使用 `/unfocus` 解除线程绑定。 - 必需配置: + 所需配置: - 全局默认值:`session.threadBindings.enabled`、`session.threadBindings.idleHours`、`session.threadBindings.maxAgeHours`。 - Discord 覆盖:`channels.discord.threadBindings.enabled`、`channels.discord.threadBindings.idleHours`、`channels.discord.threadBindings.maxAgeHours`。 - - 生成时自动绑定:设置 `channels.discord.threadBindings.spawnSubagentSessions: true`。 + - 在启动时自动绑定:设置 `channels.discord.threadBindings.spawnSubagentSessions: true`。 - 文档:[子智能体](/zh-CN/tools/subagents)、[Discord](/zh-CN/channels/discord)、[Configuration Reference](/zh-CN/gateway/configuration-reference)、[Slash commands](/zh-CN/tools/slash-commands)。 + 文档: [子智能体](/zh-CN/tools/subagents)、[Discord](/zh-CN/channels/discord)、[配置参考](/zh-CN/gateway/configuration-reference)、[斜杠命令](/zh-CN/tools/slash-commands)。 - - 先检查解析后的请求者路由: + + 先检查已解析的请求者路由: - - 完成模式的子智能体投递会优先使用任何已绑定的线程或会话路由(如果存在)。 - - 如果完成来源只包含一个渠道,OpenClaw 会回退到请求者会话中存储的路由(`lastChannel` / `lastTo` / `lastAccountId`),以便直接投递仍然可以成功。 - - 如果既没有绑定路由,也没有可用的存储路由,直接投递可能会失败,结果会回退为排队的会话投递,而不是立即发到聊天中。 - - 无效或过期的目标仍可能导致队列回退或最终投递失败。 - - 如果子会话中最后一个可见的助手回复正好是静默令牌 `NO_REPLY` / `no_reply`,或正好是 `ANNOUNCE_SKIP`,OpenClaw 会有意抑制公告,而不是发布更早的陈旧进度。 - - 如果子会话在仅调用工具后超时,公告可能会将其折叠为简短的部分进度摘要,而不是回放原始工具输出。 + - 当存在已绑定的线程或对话路由时,完成模式的子智能体投递会优先使用它们。 + - 如果完成来源只携带渠道,OpenClaw 会回退到请求者会话中存储的路由(`lastChannel` / `lastTo` / `lastAccountId`),这样直接投递仍可能成功。 + - 如果既没有绑定路由,也没有可用的已存储路由,直接投递可能失败,结果会回退为排队的会话投递,而不是立即发送到聊天中。 + - 无效或过期的目标仍可能导致回退到队列投递,或最终投递失败。 + - 如果子任务最后一个可见的助手回复正好是静默令牌 `NO_REPLY` / `no_reply`,或者正好是 `ANNOUNCE_SKIP`,OpenClaw 会有意抑制公告,而不是发送之前已过期的进度信息。 + - 如果子任务在仅执行了工具调用后超时,公告可能会将其折叠为简短的部分进度摘要,而不是重放原始工具输出。 调试: @@ -1074,18 +1071,18 @@ x-i18n: openclaw tasks show ``` - 文档:[子智能体](/zh-CN/tools/subagents)、[后台任务](/zh-CN/automation/tasks)、[Session Tools](/zh-CN/concepts/session-tool)。 + 文档: [子智能体](/zh-CN/tools/subagents)、[后台任务](/zh-CN/automation/tasks)、[会话工具](/zh-CN/concepts/session-tool)。 - Cron 在 Gateway 网关进程内运行。如果 Gateway 网关没有持续运行, - 定时作业就不会执行。 + Cron 在 Gateway 网关进程内部运行。如果 Gateway 网关没有持续运行, + 计划任务就不会执行。 检查清单: - - 确认 cron 已启用(`cron.enabled`),且未设置 `OPENCLAW_SKIP_CRON`。 - - 检查 Gateway 网关是否 24/7 运行(没有休眠/重启)。 + - 确认已启用 cron(`cron.enabled`),并且未设置 `OPENCLAW_SKIP_CRON`。 + - 检查 Gateway 网关是否在 24/7 持续运行(没有休眠/重启)。 - 验证作业的时区设置(`--tz` 与主机时区)。 调试: @@ -1095,21 +1092,21 @@ x-i18n: openclaw cron runs --id --limit 50 ``` - 文档:[Cron jobs](/zh-CN/automation/cron-jobs)、[自动化与任务](/zh-CN/automation)。 + 文档: [Cron 作业](/zh-CN/automation/cron-jobs)、[自动化与任务](/zh-CN/automation)。 - + 先检查投递模式: - - `--no-deliver` / `delivery.mode: "none"` 表示不会有外部消息输出。 - - 缺失或无效的公告目标(`channel` / `to`)表示运行器跳过了出站投递。 - - 渠道认证失败(`unauthorized`、`Forbidden`)表示运行器尝试投递了,但被凭据阻止。 - - 静默的隔离结果(仅 `NO_REPLY` / `no_reply`)会被视为有意不可投递,因此运行器也会抑制排队回退投递。 + - `--no-deliver` / `delivery.mode: "none"` 表示不会有外部消息发送。 + - 缺少或无效的公告目标(`channel` / `to`)表示运行器跳过了对外投递。 + - 渠道认证失败(`unauthorized`、`Forbidden`)表示运行器尝试过投递,但凭证阻止了它。 + - 静默的隔离结果(仅有 `NO_REPLY` / `no_reply`)会被视为有意不可投递,因此运行器也会抑制排队回退投递。 - 对于隔离的 cron 作业,运行器负责最终投递。智能体应当 - 返回一个纯文本摘要,由运行器发送。`--no-deliver` 会将 - 结果保留在内部;它不会让智能体改为直接通过 + 对于隔离的 cron 作业,最终投递由运行器负责。系统预期 + 智能体返回纯文本摘要,由运行器负责发送。`--no-deliver` 会将 + 该结果保留在内部;它并不会让智能体改为直接使用 message 工具发送。 调试: @@ -1119,27 +1116,27 @@ x-i18n: openclaw tasks show ``` - 文档:[Cron jobs](/zh-CN/automation/cron-jobs)、[后台任务](/zh-CN/automation/tasks)。 + 文档: [Cron 作业](/zh-CN/automation/cron-jobs)、[后台任务](/zh-CN/automation/tasks)。 - - 通常这属于实时模型切换路径,而不是重复调度。 + + 这通常是实时模型切换路径,而不是重复调度。 - 隔离 cron 在活动运行抛出 `LiveSessionModelSwitchError` 时, - 可以持久化运行时模型切换并重试。重试会保留切换后的 - provider/model;如果切换还携带了新的认证配置文件覆盖,cron - 也会在重试前一并持久化它。 + 隔离的 cron 可以在活动运行抛出 `LiveSessionModelSwitchError` 时, + 持久化运行时模型切换并重试。重试会保留已切换的 + 提供商/模型;如果切换还携带了新的认证配置文件覆盖,cron + 也会在重试前将其持久化。 相关选择规则: - - 如果适用,Gmail hook 模型覆盖优先级最高。 + - 若适用,Gmail hook 模型覆盖优先生效。 - 然后是每个作业的 `model`。 - 然后是任何已存储的 cron 会话模型覆盖。 - - 再然后才是正常的智能体/默认模型选择。 + - 最后才是正常的智能体/默认模型选择。 - 重试循环是有边界的。首次尝试之后最多再进行 2 次切换重试, - 超过后 cron 会中止,而不是无限循环。 + 重试循环是有上限的。在初次尝试加上 2 次切换重试之后, + cron 会中止,而不是无限循环。 调试: @@ -1148,12 +1145,12 @@ x-i18n: openclaw tasks show ``` - 文档:[Cron jobs](/zh-CN/automation/cron-jobs)、[cron CLI](/cli/cron)。 + 文档: [Cron 作业](/zh-CN/automation/cron-jobs)、[cron CLI](/cli/cron)。 - 使用原生 `openclaw skills` 命令,或将 Skills 放入你的工作区。macOS 的 Skills UI 在 Linux 上不可用。 + 使用原生 `openclaw skills` 命令,或直接将 Skills 放入你的工作区。macOS 的 Skills UI 在 Linux 上不可用。 可在 [https://clawhub.ai](https://clawhub.ai) 浏览 Skills。 ```bash @@ -1168,40 +1165,40 @@ x-i18n: ``` 原生 `openclaw skills install` 会写入当前工作区的 `skills/` - 目录。只有在你想发布或同步 - 自己的 Skills 时,才需要单独安装 `clawhub` CLI。对于跨智能体共享安装,请把技能放到 - `~/.openclaw/skills` 下,并使用 `agents.defaults.skills` 或 - `agents.list[].skills` 来限制哪些智能体可以看到它。 + 目录。只有在你想发布或 + 同步自己的 Skills 时,才需要单独安装 `clawhub` CLI。若要在多个智能体之间共享安装,请将 Skill 放到 + `~/.openclaw/skills` 下;如果你想限制只有某些智能体可见,请使用 `agents.defaults.skills` 或 + `agents.list[].skills`。 可以。使用 Gateway 网关调度器: - - **Cron 作业**:用于计划性或周期性任务(跨重启持久保存)。 + - **Cron 作业**:用于计划任务或周期性任务(重启后仍会保留)。 - **Heartbeat**:用于“主会话”的周期性检查。 - - **隔离作业**:用于自主智能体,它们可以发布摘要或投递到聊天中。 + - **隔离作业**:用于可自主运行、会发布摘要或投递到聊天中的智能体。 - 文档:[Cron jobs](/zh-CN/automation/cron-jobs)、[自动化与任务](/zh-CN/automation)、 + 文档: [Cron 作业](/zh-CN/automation/cron-jobs)、[自动化与任务](/zh-CN/automation)、 [Heartbeat](/zh-CN/gateway/heartbeat)。 - - 不能直接运行。macOS Skills 会受 `metadata.openclaw.os` 和所需二进制文件限制,并且只有当它们在 **Gateway 网关主机**上符合条件时,才会出现在 system prompt 中。在 Linux 上,`darwin` 专属 Skills(如 `apple-notes`、`apple-reminders`、`things-mac`)不会加载,除非你覆盖这些限制。 + + 不能直接运行。macOS Skills 受 `metadata.openclaw.os` 和所需二进制文件约束,且只有在 **Gateway 网关主机** 上符合条件时,这些 Skills 才会出现在系统提示中。在 Linux 上,`darwin` 专属 Skills(例如 `apple-notes`、`apple-reminders`、`things-mac`)不会加载,除非你覆盖此门控。 你有三种受支持的模式: **选项 A - 在 Mac 上运行 Gateway 网关(最简单)。** - 在具备 macOS 二进制文件的机器上运行 Gateway 网关,然后通过 [远程模式](#gateway-端口已经在运行以及远程模式) 或 Tailscale 从 Linux 连接。由于 Gateway 网关主机是 macOS,这些 Skills 会正常加载。 + 在存在 macOS 二进制文件的地方运行 Gateway 网关,然后通过 [远程模式](#gateway-ports-already-running-and-remote-mode) 或 Tailscale 从 Linux 连接。因为 Gateway 网关主机是 macOS,所以这些 Skills 会正常加载。 **选项 B - 使用 macOS 节点(无需 SSH)。** - 在 Linux 上运行 Gateway 网关,配对一个 macOS 节点(菜单栏应用),并在 Mac 上将 **Node Run Commands** 设为 “Always Ask” 或 “Always Allow”。当节点上存在所需二进制文件时,OpenClaw 可以将这些仅限 macOS 的 Skills 视为符合条件。智能体会通过 `nodes` 工具运行这些 Skills。如果你选择 “Always Ask”,在提示中批准 “Always Allow” 会将该命令加入允许列表。 + 在 Linux 上运行 Gateway 网关,配对一个 macOS 节点(菜单栏应用),并在 Mac 上将 **Node Run Commands** 设置为 “Always Ask” 或 “Always Allow”。当节点上存在所需二进制文件时,OpenClaw 可以将 macOS 专属 Skills 视为符合条件。智能体会通过 `nodes` 工具运行这些 Skills。如果你选择 “Always Ask”,在提示中批准 “Always Allow” 会将该命令加入允许列表。 **选项 C - 通过 SSH 代理 macOS 二进制文件(高级)。** - 保持 Gateway 网关在 Linux 上运行,但让所需 CLI 二进制文件解析为 SSH 包装器,从而在一台 Mac 上执行。然后覆盖该技能以允许 Linux,使其保持可用。 + 将 Gateway 网关保留在 Linux 上,但让所需的 CLI 二进制文件解析为在 Mac 上运行的 SSH 包装器。然后覆盖 Skill,使其允许 Linux,从而保持符合条件。 - 1. 为该二进制创建一个 SSH 包装器(示例:Apple Notes 的 `memo`): + 1. 为该二进制文件创建一个 SSH 包装器(示例:Apple Notes 的 `memo`): ```bash #!/usr/bin/env bash @@ -1210,17 +1207,17 @@ x-i18n: ``` 2. 将该包装器放到 Linux 主机的 `PATH` 中(例如 `~/bin/memo`)。 - 3. 覆盖技能元数据(工作区或 `~/.openclaw/skills`),允许 Linux: + 3. 覆盖 Skill 元数据(工作区或 `~/.openclaw/skills`),以允许 Linux: ```markdown --- name: apple-notes - description: Manage Apple Notes via the memo CLI on macOS. + description: 通过 macOS 上的 memo CLI 管理 Apple Notes。 metadata: { "openclaw": { "os": ["darwin", "linux"], "requires": { "bins": ["memo"] } } } --- ``` - 4. 启动一个新会话,以刷新 Skills 快照。 + 4. 启动新会话,以刷新 Skills 快照。 @@ -1229,16 +1226,16 @@ x-i18n: 可选方案: - - **自定义技能 / 插件:**最适合可靠的 API 访问(Notion/HeyGen 都有 API)。 - - **浏览器自动化:**无需写代码即可使用,但更慢也更脆弱。 + - **自定义 Skill / 插件:**最适合可靠的 API 访问(Notion/HeyGen 都有 API)。 + - **浏览器自动化:**无需写代码,但更慢,也更脆弱。 - 如果你想为每个客户保留上下文(例如代理机构工作流),一种简单模式是: + 如果你想为每个客户保留上下文(代理机构工作流),一种简单模式是: - - 为每个客户建一个 Notion 页面(上下文 + 偏好 + 当前工作)。 - - 让智能体在会话开始时拉取该页面。 + - 每个客户一个 Notion 页面(上下文 + 偏好 + 当前工作)。 + - 让智能体在会话开始时先获取该页面。 如果你想要原生集成,可以提交功能请求,或构建一个 - 调用这些 API 的技能。 + 面向这些 API 的 Skill。 安装 Skills: @@ -1247,32 +1244,32 @@ x-i18n: openclaw skills update --all ``` - 原生安装会落到当前工作区的 `skills/` 目录中。若要在多个智能体之间共享 Skills,请将其放到 `~/.openclaw/skills//SKILL.md`。如果只希望部分智能体看到共享安装,请配置 `agents.defaults.skills` 或 `agents.list[].skills`。有些 Skills 需要通过 Homebrew 安装二进制;在 Linux 上这意味着 Linuxbrew(参见上面的 Homebrew Linux 常见问题条目)。参阅 [Skills](/zh-CN/tools/skills)、[Skills 配置](/zh-CN/tools/skills-config) 和 [ClawHub](/zh-CN/tools/clawhub)。 + 原生安装会落到当前工作区的 `skills/` 目录中。若要在多个智能体之间共享 Skills,请将它们放在 `~/.openclaw/skills//SKILL.md`。如果只有部分智能体应看到共享安装,请配置 `agents.defaults.skills` 或 `agents.list[].skills`。某些 Skills 依赖通过 Homebrew 安装的二进制文件;在 Linux 上,这意味着 Linuxbrew(见上面的 Homebrew Linux 常见问题条目)。请参阅 [Skills](/zh-CN/tools/skills)、[Skills 配置](/zh-CN/tools/skills-config) 和 [ClawHub](/zh-CN/tools/clawhub)。 - - 使用内置的 `user` 浏览器配置,它会通过 Chrome DevTools MCP 进行连接: + + 使用内置的 `user` 浏览器配置文件,它通过 Chrome DevTools MCP 进行连接: ```bash openclaw browser --browser-profile user tabs openclaw browser --browser-profile user snapshot ``` - 如果你想用自定义名称,可以创建一个显式 MCP 配置: + 如果你想使用自定义名称,请创建一个显式 MCP 配置文件: ```bash openclaw browser create-profile --name chrome-live --driver existing-session openclaw browser --browser-profile chrome-live tabs ``` - 这条路径是主机本地的。如果 Gateway 网关运行在别处,要么在浏览器所在机器上运行一个节点主机,要么改用远程 CDP。 + 这条路径是主机本地的。如果 Gateway 网关运行在别处,请在浏览器所在机器上运行一个节点主机,或者改用远程 CDP。 `existing-session` / `user` 当前限制: - - 操作基于 ref,而不是 CSS 选择器 + - 操作是基于 ref 驱动,而不是基于 CSS 选择器 - 上传需要 `ref` / `inputRef`,并且当前一次只支持一个文件 - - `responsebody`、PDF 导出、下载拦截和批量操作仍然需要托管浏览器或原始 CDP 配置 + - `responsebody`、PDF 导出、下载拦截和批量操作仍然需要受管浏览器或原始 CDP 配置文件 @@ -1281,96 +1278,97 @@ x-i18n: - 有。参阅 [沙箱隔离](/zh-CN/gateway/sandboxing)。对于 Docker 特定设置(在 Docker 中运行完整 Gateway 网关或沙箱镜像),参阅 [Docker](/zh-CN/install/docker)。 + 有。请参阅 [沙箱隔离](/zh-CN/gateway/sandboxing)。有关 Docker 专属设置(完整 Gateway 网关运行在 Docker 中,或沙箱镜像),请参阅 [Docker](/zh-CN/install/docker)。 - - 默认镜像以安全优先方式运行,并以 `node` 用户身份执行,因此它不 + + 默认镜像以安全优先为原则,并以 `node` 用户身份运行,因此它不 包含系统软件包、Homebrew 或内置浏览器。若要获得更完整的设置: - - 持久化 `/home/node`,使用 `OPENCLAW_HOME_VOLUME`,这样缓存才能保留。 + - 持久化 `/home/node`,并使用 `OPENCLAW_HOME_VOLUME`,这样缓存就能保留下来。 - 使用 `OPENCLAW_DOCKER_APT_PACKAGES` 将系统依赖烘焙进镜像。 - 通过内置 CLI 安装 Playwright 浏览器: `node /app/node_modules/playwright-core/cli.js install chromium` - - 设置 `PLAYWRIGHT_BROWSERS_PATH`,并确保该路径已持久化。 + - 设置 `PLAYWRIGHT_BROWSERS_PATH` 并确保该路径已持久化。 - 文档:[Docker](/zh-CN/install/docker)、[Browser](/zh-CN/tools/browser)。 + 文档: [Docker](/zh-CN/install/docker)、[浏览器](/zh-CN/tools/browser)。 - - 可以——前提是你的私人流量来自**私信**,公开流量来自**群组**。 + + 可以——前提是你的私密流量是**私信**,公开流量是**群组**。 - 使用 `agents.defaults.sandbox.mode: "non-main"`,这样群组/渠道会话(非主会话键)就在 Docker 中运行,而主私信会话则保留在主机上运行。然后通过 `tools.sandbox.tools` 限制沙箱隔离会话中可用的工具。 + 使用 `agents.defaults.sandbox.mode: "non-main"`,这样群组/渠道会话(非主键)会在 Docker 中运行,而主私信会话仍在主机上运行。然后通过 `tools.sandbox.tools` 限制沙箱隔离会话中可用的工具。 - 设置演练 + 示例配置:[群组:个人私信 + 公开群组](/zh-CN/channels/groups#pattern-personal-dms-public-groups-single-agent) + 设置演练 + 示例配置: [群组:个人私信 + 公开群组](/zh-CN/channels/groups#pattern-personal-dms-public-groups-single-agent) - 关键配置参考:[Gateway 网关配置](/zh-CN/gateway/configuration-reference#agentsdefaultssandbox) + 关键配置参考: [Gateway 网关配置](/zh-CN/gateway/configuration-reference#agentsdefaultssandbox) - - 设置 `agents.defaults.sandbox.docker.binds` 为 `["host:path:mode"]`(例如 `"/home/user/src:/src:ro"`)。全局绑定 + 每智能体绑定会合并;当 `scope: "shared"` 时,会忽略每智能体绑定。对任何敏感内容请使用 `:ro`,并记住绑定会绕过沙箱文件系统边界。 + + 将 `agents.defaults.sandbox.docker.binds` 设置为 `["host:path:mode"]`(例如 `"/home/user/src:/src:ro"`)。全局绑定和按智能体绑定会合并;当 `scope: "shared"` 时,按智能体绑定会被忽略。对任何敏感内容都使用 `:ro`,并记住绑定会绕过沙箱文件系统隔离墙。 - OpenClaw 会根据规范化路径以及通过最深已存在祖先解析出的规范路径,同时验证绑定源。这意味着即使最后一个路径片段尚不存在,父级符号链接逃逸仍会以失败关闭方式被拦截,并且在符号链接解析后仍会应用允许根目录检查。 + OpenClaw 会同时根据规范化路径,以及通过最深层已存在祖先解析得到的规范路径,来验证绑定源。这意味着即使最后一个路径段尚不存在,经由符号链接父目录逃逸的情况仍会以默认拒绝方式关闭;并且在符号链接解析之后,允许根目录检查仍然会生效。 - 示例和安全说明请参阅 [沙箱隔离](/zh-CN/gateway/sandboxing#custom-bind-mounts) 和 [Sandbox vs Tool Policy vs Elevated](/zh-CN/gateway/sandbox-vs-tool-policy-vs-elevated#bind-mounts-security-quick-check)。 + 有关示例和安全说明,请参阅 [沙箱隔离](/zh-CN/gateway/sandboxing#custom-bind-mounts) 和 [沙箱 vs 工具策略 vs 提权](/zh-CN/gateway/sandbox-vs-tool-policy-vs-elevated#bind-mounts-security-quick-check)。 - OpenClaw 记忆其实就是智能体工作区中的 Markdown 文件: + OpenClaw 的记忆就是智能体工作区中的 Markdown 文件: - - 每日笔记在 `memory/YYYY-MM-DD.md` - - 筛选后的长期笔记在 `MEMORY.md` 中(仅主/私密会话) + - `memory/YYYY-MM-DD.md` 中的每日笔记 + - `MEMORY.md` 中整理好的长期笔记(仅主/私密会话) - OpenClaw 还会运行一个**静默的预压缩记忆刷写**,提醒模型 - 在自动压缩前写入持久笔记。只有在工作区可写时才会执行这一操作 - (只读沙箱会跳过)。参阅 [Memory](/zh-CN/concepts/memory)。 + OpenClaw 还会运行一个**静默的预压缩记忆刷新**,提醒模型 + 在自动压缩前写入持久笔记。它只会在工作区 + 可写时运行(只读沙箱会跳过)。请参阅 [记忆](/zh-CN/concepts/memory)。 - + 让机器人**把这个事实写入记忆**。长期笔记应写入 `MEMORY.md`, 短期上下文则写入 `memory/YYYY-MM-DD.md`。 - 这是我们仍在持续改进的领域。提醒模型去保存记忆会很有帮助; - 它知道该怎么做。如果它仍然频繁遗忘,请确认 Gateway 网关每次运行时使用的是同一个 + 这是我们仍在持续改进的领域。提醒模型存储记忆会有帮助; + 它会知道该怎么做。如果它仍然总是忘记,请确认 Gateway 网关每次运行时使用的是同一个 工作区。 - 文档:[Memory](/zh-CN/concepts/memory)、[智能体工作区](/zh-CN/concepts/agent-workspace)。 + 文档: [记忆](/zh-CN/concepts/memory)、[智能体工作区](/zh-CN/concepts/agent-workspace)。 - - 记忆文件保存在磁盘上,除非你删除,否则会一直保留。限制来自你的 - 存储空间,而不是模型。**会话上下文**仍然受模型上下文窗口 - 限制,因此长对话可能会压缩或截断。这就是 - 为什么有记忆搜索——它只会把相关部分重新拉回上下文。 + + 记忆文件存储在磁盘上,并会一直保留,直到你删除它们。限制来自你的 + 存储空间,而不是模型。**会话上下文**仍然受限于模型的 + 上下文窗口,因此长对话可能会被压缩或截断。这就是为什么 + 需要记忆搜索——它只会把相关部分重新拉回上下文。 - 文档:[Memory](/zh-CN/concepts/memory)、[Context](/zh-CN/concepts/context)。 + 文档: [记忆](/zh-CN/concepts/memory)、[上下文](/zh-CN/concepts/context)。 - - 只有在你使用**OpenAI embeddings** 时才需要。Codex OAuth 仅覆盖聊天/补全, - 并**不**提供 embeddings 访问,因此**使用 Codex 登录(OAuth 或 - Codex CLI 登录)**并不能帮助语义记忆搜索。OpenAI embeddings - 仍然需要真实的 API key(`OPENAI_API_KEY` 或 `models.providers.openai.apiKey`)。 + + 只有在你使用 **OpenAI embeddings** 时才需要。Codex OAuth 只覆盖聊天/补全, + **不**提供 embeddings 访问,因此**使用 Codex 登录(OAuth 或 + Codex CLI 登录)**并不能帮助启用语义记忆搜索。OpenAI embeddings + 仍然需要真实的 API 密钥(`OPENAI_API_KEY` 或 `models.providers.openai.apiKey`)。 - 如果你没有显式设置 provider,OpenClaw 会在能够解析出 API key 时自动选择 - 一个 provider(认证配置文件、`models.providers.*.apiKey` 或环境变量)。 - 如果能解析出 OpenAI key,则优先 OpenAI;否则如果能解析出 Gemini key,则优先 Gemini; - 然后是 Voyage,再然后是 Mistral。如果没有可用的远程 key,记忆 - 搜索会保持禁用,直到你完成配置。如果你已经配置并存在本地模型路径,OpenClaw - 会优先使用 `local`。当你显式设置 + 如果你没有显式设置提供商,只要能解析到 API 密钥,OpenClaw 就会自动选择提供商 + (认证配置文件、`models.providers.*.apiKey` 或环境变量)。 + 如果能解析到 OpenAI 密钥,它会优先选择 OpenAI;否则如果能解析到 Gemini 密钥, + 就选择 Gemini;再然后是 Voyage,最后是 Mistral。如果没有可用的远程密钥,记忆 + 搜索会保持禁用,直到你完成配置。如果你配置了本地模型路径 + 且该路径存在,OpenClaw + 会优先选择 `local`。当你显式设置 `memorySearch.provider = "ollama"` 时,也支持 Ollama。 - 如果你更希望保持本地,请设置 `memorySearch.provider = "local"`(也可选 + 如果你更希望保持本地化,请设置 `memorySearch.provider = "local"`(并可选设置 `memorySearch.fallback = "none"`)。如果你想使用 Gemini embeddings,请设置 - `memorySearch.provider = "gemini"` 并提供 `GEMINI_API_KEY`(或 - `memorySearch.remote.apiKey`)。我们支持 **OpenAI、Gemini、Voyage、Mistral、Ollama 或 local** - 的 embedding 模型——设置详情请参阅 [Memory](/zh-CN/concepts/memory)。 + `memorySearch.provider = "gemini"`,并提供 `GEMINI_API_KEY`(或 + `memorySearch.remote.apiKey`)。我们支持 **OpenAI、Gemini、Voyage、Mistral、Ollama 或 local** 的 embedding + 模型——具体设置详情请参阅 [记忆](/zh-CN/concepts/memory)。 @@ -1378,52 +1376,52 @@ x-i18n: ## 磁盘上的文件位置 - - 不是——**OpenClaw 的状态在本地**,但**外部服务仍然能看到你发送给它们的内容**。 + + 不会——**OpenClaw 的状态保存在本地**,但**外部服务仍然会看到你发给它们的内容**。 - - **默认保存在本地:**会话、记忆文件、配置和工作区保存在 Gateway 网关主机上 + - **默认保存在本地:**会话、记忆文件、配置和工作区都保存在 Gateway 网关主机上 (`~/.openclaw` + 你的工作区目录)。 - - **必须远程发送:**你发送给模型提供商(Anthropic/OpenAI 等)的消息会进入 - 它们的 API,聊天平台(WhatsApp/Telegram/Slack 等)也会在 - 它们的服务器上存储消息数据。 + - **必须远程发送:**你发给模型提供商(Anthropic/OpenAI 等)的消息会发送到 + 它们的 API,而聊天平台(WhatsApp/Telegram/Slack 等)会在它们的 + 服务器上存储消息数据。 - **足迹由你控制:**使用本地模型可以让提示保留在你的机器上,但渠道 - 流量仍然会通过对应渠道的服务器。 + 流量仍然会经过该渠道的服务器。 - 相关内容:[智能体工作区](/zh-CN/concepts/agent-workspace)、[Memory](/zh-CN/concepts/memory)。 + 相关内容: [智能体工作区](/zh-CN/concepts/agent-workspace)、[记忆](/zh-CN/concepts/memory)。 - - 所有内容都位于 `$OPENCLAW_STATE_DIR`(默认:`~/.openclaw`)下: + + 所有内容都位于 `$OPENCLAW_STATE_DIR` 下(默认:`~/.openclaw`): | 路径 | 用途 | | --------------------------------------------------------------- | ------------------------------------------------------------------ | - | `$OPENCLAW_STATE_DIR/openclaw.json` | 主配置(JSON5) | + | `$OPENCLAW_STATE_DIR/openclaw.json` | 主配置(JSON5) | | `$OPENCLAW_STATE_DIR/credentials/oauth.json` | 旧版 OAuth 导入(首次使用时复制到认证配置文件中) | - | `$OPENCLAW_STATE_DIR/agents//agent/auth-profiles.json` | 认证配置文件(OAuth、API 密钥,以及可选的 `keyRef`/`tokenRef`) | - | `$OPENCLAW_STATE_DIR/secrets.json` | `file` SecretRef provider 的可选文件型 secret 载荷 | + | `$OPENCLAW_STATE_DIR/agents//agent/auth-profiles.json` | 认证配置文件(OAuth、API 密钥,以及可选的 `keyRef`/`tokenRef`) | + | `$OPENCLAW_STATE_DIR/secrets.json` | `file` SecretRef 提供商的可选文件后端密钥负载 | | `$OPENCLAW_STATE_DIR/agents//agent/auth.json` | 旧版兼容文件(静态 `api_key` 条目已清理) | | `$OPENCLAW_STATE_DIR/credentials/` | 提供商状态(例如 `whatsapp//creds.json`) | - | `$OPENCLAW_STATE_DIR/agents/` | 每个智能体的状态(agentDir + 会话) | + | `$OPENCLAW_STATE_DIR/agents/` | 按智能体划分的状态(agentDir + 会话) | | `$OPENCLAW_STATE_DIR/agents//sessions/` | 对话历史和状态(按智能体) | | `$OPENCLAW_STATE_DIR/agents//sessions/sessions.json` | 会话元数据(按智能体) | 旧版单智能体路径:`~/.openclaw/agent/*`(由 `openclaw doctor` 迁移)。 - 你的**工作区**(AGENTS.md、记忆文件、Skills 等)是分开的,通过 `agents.defaults.workspace` 配置(默认:`~/.openclaw/workspace`)。 + 你的**工作区**(AGENTS.md、记忆文件、Skills 等)是分开的,并通过 `agents.defaults.workspace` 配置(默认:`~/.openclaw/workspace`)。 这些文件位于**智能体工作区**中,而不是 `~/.openclaw`。 - - **工作区(按智能体)**:`AGENTS.md`、`SOUL.md`、`IDENTITY.md`、`USER.md`、 - `MEMORY.md`(如果没有 `MEMORY.md`,则回退到旧版 `memory.md`), - `memory/YYYY-MM-DD.md`,以及可选的 `HEARTBEAT.md`。 - - **状态目录(`~/.openclaw`)**:配置、渠道/提供商状态、认证配置文件、会话、日志, + - **工作区(按智能体):**`AGENTS.md`、`SOUL.md`、`IDENTITY.md`、`USER.md`、 + `MEMORY.md`(当 `MEMORY.md` 不存在时,使用旧版回退 `memory.md`)、 + `memory/YYYY-MM-DD.md`、可选的 `HEARTBEAT.md`。 + - **状态目录(`~/.openclaw`):**配置、渠道/提供商状态、认证配置文件、会话、日志, 以及共享 Skills(`~/.openclaw/skills`)。 - 默认工作区是 `~/.openclaw/workspace`,可通过以下方式配置: + 默认工作区为 `~/.openclaw/workspace`,可通过以下方式配置: ```json5 { @@ -1431,41 +1429,41 @@ x-i18n: } ``` - 如果机器人在重启后“遗忘”了,请确认 Gateway 网关每次启动时使用的是同一个 - 工作区(并记住:远程模式使用的是**gateway host 的** - 工作区,而不是你本地笔记本上的工作区)。 + 如果机器人在重启后“忘记”了内容,请确认 Gateway 网关在每次启动时都使用相同的 + 工作区(并且要记住:远程模式使用的是**Gateway 网关主机的** + 工作区,而不是你本地笔记本电脑上的工作区)。 - 提示:如果你希望某种行为或偏好能够持久保留,请让机器人**把它写进 - AGENTS.md 或 MEMORY.md**,而不要仅依赖聊天历史。 + 提示:如果你希望某种行为或偏好能长期保留,最好让机器人**把它写入 + AGENTS.md 或 MEMORY.md**,而不是仅依赖聊天历史。 - 参阅 [智能体工作区](/zh-CN/concepts/agent-workspace) 和 [Memory](/zh-CN/concepts/memory)。 + 请参阅 [智能体工作区](/zh-CN/concepts/agent-workspace) 和 [记忆](/zh-CN/concepts/memory)。 - 将你的**智能体工作区**放入一个**私有** git 仓库,并备份到某个 + 将你的**智能体工作区**放进一个**私有** git 仓库,并把它备份到某个 私密位置(例如 GitHub 私有仓库)。这样可以保存记忆 + AGENTS/SOUL/USER - 文件,并让你以后恢复助手的“心智”。 + 文件,并让你日后能够恢复这个助手的“心智”。 - **不要**提交 `~/.openclaw` 下的任何内容(凭据、会话、令牌或加密的 secret 载荷)。 + **不要**提交 `~/.openclaw` 下的任何内容(凭证、会话、令牌或加密的密钥负载)。 如果你需要完整恢复,请分别备份工作区和状态目录 - (参见上面的迁移问题)。 + (见上面的迁移问题)。 - 文档:[智能体工作区](/zh-CN/concepts/agent-workspace)。 + 文档: [智能体工作区](/zh-CN/concepts/agent-workspace)。 - 请参阅专门指南:[Uninstall](/zh-CN/install/uninstall)。 + 请参阅专门指南: [卸载](/zh-CN/install/uninstall)。 可以。工作区是**默认 cwd** 和记忆锚点,而不是硬性沙箱。 - 相对路径会在工作区内解析,但绝对路径可以访问主机上的其他 - 位置,除非启用了沙箱隔离。如果你需要隔离,请使用 - [`agents.defaults.sandbox`](/zh-CN/gateway/sandboxing) 或按智能体设置沙箱。如果你 + 相对路径会在工作区内解析,但绝对路径可以访问其他 + 主机位置,除非启用了沙箱隔离。如果你需要隔离,请使用 + [`agents.defaults.sandbox`](/zh-CN/gateway/sandboxing) 或按智能体设置的沙箱配置。如果你 希望某个仓库成为默认工作目录,请将该智能体的 - `workspace` 指向该仓库根目录。OpenClaw 仓库只是源码;除非你有意让智能体在其中工作,否则请将 + `workspace` 指向仓库根目录。OpenClaw 仓库本身只是源代码;除非你明确希望智能体在其中工作,否则请将 工作区与其分开。 示例(将仓库作为默认 cwd): @@ -1483,29 +1481,29 @@ x-i18n: - 会话状态由**gateway host** 持有。如果你使用远程模式,你需要关心的会话存储位于远程机器上,而不是你本地笔记本。参阅 [Session management](/zh-CN/concepts/session)。 + 会话状态归**Gateway 网关主机**所有。如果你处于远程模式,你关心的会话存储位于远程机器上,而不是你本地的笔记本电脑。请参阅 [会话管理](/zh-CN/concepts/session)。 ## 配置基础 - - OpenClaw 会从 `$OPENCLAW_CONFIG_PATH` 读取可选的 **JSON5** 配置(默认:`~/.openclaw/openclaw.json`): + + OpenClaw 会从 `$OPENCLAW_CONFIG_PATH` 读取一个可选的 **JSON5** 配置(默认:`~/.openclaw/openclaw.json`): ``` $OPENCLAW_CONFIG_PATH ``` - 如果该文件不存在,它会使用相对安全的默认值(包括默认工作区 `~/.openclaw/workspace`)。 + 如果该文件不存在,它会使用较为安全的默认值(包括默认工作区 `~/.openclaw/workspace`)。 - 非 loopback 绑定**要求有有效的 gateway auth 路径**。实际意味着: + 非 loopback 绑定**需要有效的 Gateway 网关认证路径**。实际来说,这意味着: - 共享密钥认证:令牌或密码 - - `gateway.auth.mode: "trusted-proxy"`,并且位于正确配置的非 loopback、支持身份感知的反向代理之后 + - 在配置正确的非 loopback 身份感知反向代理之后使用 `gateway.auth.mode: "trusted-proxy"` ```json5 { @@ -1519,25 +1517,25 @@ x-i18n: } ``` - 注意: + 说明: - - `gateway.remote.token` / `.password` **本身不会**启用本地 gateway 认证。 - - 只有在 `gateway.auth.*` 未设置时,本地调用路径才会将 `gateway.remote.*` 用作回退。 - - 对于密码认证,请设置 `gateway.auth.mode: "password"` 并同时设置 `gateway.auth.password`(或 `OPENCLAW_GATEWAY_PASSWORD`)。 - - 如果 `gateway.auth.token` / `gateway.auth.password` 通过 SecretRef 显式配置但无法解析,则解析会以失败关闭方式结束(不会被远程回退掩盖)。 - - 共享密钥 Control UI 设置通过 `connect.params.auth.token` 或 `connect.params.auth.password` 进行认证(保存在 app/UI 设置中)。像 Tailscale Serve 或 `trusted-proxy` 这样的带身份模式则使用请求头。避免把共享密钥放进 URL 中。 - - 使用 `gateway.auth.mode: "trusted-proxy"` 时,同主机 loopback 反向代理**仍然不能**满足 trusted-proxy 认证。trusted proxy 必须来自已配置的非 loopback 来源。 + - `gateway.remote.token` / `.password` 本身**不会**启用本地 Gateway 网关认证。 + - 只有当 `gateway.auth.*` 未设置时,本地调用路径才能将 `gateway.remote.*` 用作回退。 + - 对于密码认证,请改为设置 `gateway.auth.mode: "password"`,并同时设置 `gateway.auth.password`(或 `OPENCLAW_GATEWAY_PASSWORD`)。 + - 如果 `gateway.auth.token` / `gateway.auth.password` 通过 SecretRef 显式配置但无法解析,解析会以默认拒绝方式关闭(不会由远程回退掩盖)。 + - 共享密钥的 Control UI 设置通过 `connect.params.auth.token` 或 `connect.params.auth.password` 进行认证(存储在应用/UI 设置中)。像 Tailscale Serve 或 `trusted-proxy` 这样的带身份模式则改用请求标头。避免把共享密钥放进 URL。 + - 当使用 `gateway.auth.mode: "trusted-proxy"` 时,同一主机上的 loopback 反向代理**仍然不能**满足 trusted-proxy 认证要求。受信任代理必须是已配置的非 loopback 来源。 - - OpenClaw 默认强制执行 gateway auth,包括 loopback。在正常默认路径下,这意味着令牌认证:如果没有配置显式认证路径,gateway 启动时会解析为令牌模式并自动生成一个令牌,将其保存到 `gateway.auth.token` 中,因此**本地 WS 客户端也必须认证**。这可以阻止其他本地进程调用 Gateway 网关。 + + OpenClaw 默认强制要求 Gateway 网关认证,包括 loopback。在正常默认路径下,这意味着使用令牌认证:如果没有显式配置认证路径,Gateway 网关启动时会解析为令牌模式,并自动生成一个令牌,保存到 `gateway.auth.token` 中,因此**本地 WS 客户端必须进行认证**。这样可以阻止其他本地进程调用 Gateway 网关。 - 如果你更喜欢其他认证路径,可以显式选择密码模式(或者,对于非 loopback 且支持身份感知的反向代理,使用 `trusted-proxy`)。如果你**真的**想开放 loopback,请在配置中显式设置 `gateway.auth.mode: "none"`。Doctor 也可以随时为你生成令牌:`openclaw doctor --generate-gateway-token`。 + 如果你更偏好其他认证路径,可以显式选择密码模式(或者,对于非 loopback 的身份感知反向代理,选择 `trusted-proxy`)。如果你**确实**想开放 loopback,请在配置中显式设置 `gateway.auth.mode: "none"`。Doctor 随时都可以帮你生成令牌:`openclaw doctor --generate-gateway-token`。 - + Gateway 网关会监视配置并支持热重载: - `gateway.reload.mode: "hybrid"`(默认):安全变更热应用,关键变更则重启 @@ -1545,7 +1543,7 @@ x-i18n: - + 在配置中设置 `cli.banner.taglineMode`: ```json5 @@ -1558,23 +1556,23 @@ x-i18n: } ``` - - `off`:隐藏标语文本,但保留 banner 标题/版本行。 + - `off`:隐藏标语文本,但保留横幅标题/版本行。 - `default`:始终使用 `All your chats, one OpenClaw.`。 - `random`:轮换搞笑/季节性标语(默认行为)。 - - 如果你想完全不显示 banner,请设置环境变量 `OPENCLAW_HIDE_BANNER=1`。 + - 如果你想完全不显示横幅,请设置环境变量 `OPENCLAW_HIDE_BANNER=1`。 - - `web_fetch` 无需 API key 即可使用。`web_search` 则取决于你选择的 - provider: + + `web_fetch` 无需 API 密钥即可使用。`web_search` 取决于你选择的 + 提供商: - - Brave、Exa、Firecrawl、Gemini、Grok、Kimi、MiniMax Search、Perplexity 和 Tavily 等基于 API 的 provider 需要按其常规方式配置 API key。 - - Ollama Web 搜索 不需要 key,但它使用你配置的 Ollama 主机,并要求 `ollama signin`。 - - DuckDuckGo 不需要 key,但它是非官方的基于 HTML 的集成。 - - SearXNG 不需要 key,可自托管;请配置 `SEARXNG_BASE_URL` 或 `plugins.entries.searxng.config.webSearch.baseUrl`。 + - Brave、Exa、Firecrawl、Gemini、Grok、Kimi、MiniMax Search、Perplexity 和 Tavily 等基于 API 的提供商,需要按其常规方式配置 API 密钥。 + - Ollama Web 搜索不需要密钥,但它会使用你配置的 Ollama 主机,并要求执行 `ollama signin`。 + - DuckDuckGo 不需要密钥,但它是非官方的基于 HTML 的集成。 + - SearXNG 不需要密钥/可自行托管;配置 `SEARXNG_BASE_URL` 或 `plugins.entries.searxng.config.webSearch.baseUrl`。 - **推荐:**运行 `openclaw configure --section web` 并选择一个 provider。 + **推荐:**运行 `openclaw configure --section web` 并选择一个提供商。 环境变量替代方案: - Brave:`BRAVE_API_KEY` @@ -1617,59 +1615,59 @@ x-i18n: } ``` - provider 特定的 web 搜索配置现在位于 `plugins.entries..config.webSearch.*` 下。 - 旧版 `tools.web.search.*` provider 路径暂时仍会出于兼容性目的被加载,但新配置不应继续使用它们。 - Firecrawl 的 web 抓取回退配置位于 `plugins.entries.firecrawl.config.webFetch.*` 下。 + 提供商专属的 Web 搜索配置现在位于 `plugins.entries..config.webSearch.*` 下。 + 出于兼容性考虑,旧版 `tools.web.search.*` 提供商路径暂时仍可加载,但不应再用于新配置。 + Firecrawl 的 Web 抓取回退配置位于 `plugins.entries.firecrawl.config.webFetch.*` 下。 - 注意: + 说明: - - 如果你使用允许列表,请添加 `web_search`/`web_fetch`/`x_search` 或 `group:web`。 - - `web_fetch` 默认启用(除非显式关闭)。 - - 如果省略 `tools.web.fetch.provider`,OpenClaw 会从可用凭据中自动检测第一个可用的抓取回退 provider。目前内置 provider 是 Firecrawl。 - - 守护进程会从 `~/.openclaw/.env`(或服务环境)中读取环境变量。 + - 如果你使用允许列表,请加入 `web_search`/`web_fetch`/`x_search` 或 `group:web`。 + - `web_fetch` 默认启用(除非显式禁用)。 + - 如果省略 `tools.web.fetch.provider`,OpenClaw 会从可用凭证中自动检测第一个可用的抓取回退提供商。目前内置提供商是 Firecrawl。 + - 守护进程会从 `~/.openclaw/.env`(或服务环境)读取环境变量。 - 文档:[Web tools](/zh-CN/tools/web)。 + 文档: [Web 工具](/zh-CN/tools/web)。 - - `config.apply` 会替换**整个配置**。如果你发送的是部分对象,其余 - 内容都会被删除。 + + `config.apply` 会替换**整个配置**。如果你发送的是部分对象,其他所有内容 + 都会被移除。 恢复方法: - 从备份恢复(git 或复制的 `~/.openclaw/openclaw.json`)。 - - 如果没有备份,重新运行 `openclaw doctor`,并重新配置渠道/模型。 - - 如果这不是预期行为,请提交 bug,并附上你最后已知的配置或任何备份。 - - 本地编码智能体通常可以根据日志或历史重建一个可工作的配置。 + - 如果你没有备份,请重新运行 `openclaw doctor`,然后重新配置渠道/模型。 + - 如果这不是你预期的行为,请提交一个 bug,并附上你最后已知的配置或任何备份。 + - 本地编码智能体通常可以根据日志或历史记录重建一个可用配置。 避免方法: - - 对小改动使用 `openclaw config set`。 - - 对交互式编辑使用 `openclaw configure`。 - - 当你不确定确切路径或字段形状时,先使用 `config.schema.lookup`;它会返回一个浅层 schema 节点以及其直接子项摘要,以便逐层深入。 - - 对部分 RPC 编辑使用 `config.patch`;仅在你确实要完整替换配置时才使用 `config.apply`。 - - 如果你在智能体运行中使用 owner-only 的 `gateway` 工具,它仍然会拒绝写入 `tools.exec.ask` / `tools.exec.security`(包括会规范化到同一受保护 exec 路径的旧版 `tools.bash.*` 别名)。 + - 小改动请使用 `openclaw config set`。 + - 交互式编辑请使用 `openclaw configure`。 + - 当你不确定准确路径或字段结构时,先使用 `config.schema.lookup`;它会返回一个浅层 schema 节点及其直接子项摘要,便于逐层深入。 + - 对于部分 RPC 编辑,请使用 `config.patch`;仅在需要完整替换配置时才使用 `config.apply`。 + - 如果你在智能体运行中使用仅限所有者的 `gateway` 工具,它仍会拒绝对 `tools.exec.ask` / `tools.exec.security` 的写入(包括会归一化为同一受保护 exec 路径的旧版 `tools.bash.*` 别名)。 - 文档:[Config](/cli/config)、[Configure](/cli/configure)、[Doctor](/zh-CN/gateway/doctor)。 + 文档: [配置](/cli/config)、[配置向导](/cli/configure)、[Doctor](/zh-CN/gateway/doctor)。 - + 常见模式是**一个 Gateway 网关**(例如 Raspberry Pi)加上**节点**和**智能体**: - - **Gateway 网关(中心):**管理渠道(Signal/WhatsApp)、路由和会话。 - - **节点(设备):**Mac/iOS/Android 作为外设连接,并暴露本地工具(`system.run`、`canvas`、`camera`)。 - - **智能体(工作节点):**用于特殊角色的独立“大脑”/工作区(例如“Hetzner 运维”、“个人数据”)。 - - **子智能体:**当你需要并行时,从主智能体中派生后台任务。 - - **TUI:**连接到 Gateway 网关,并切换智能体/会话。 + - **Gateway 网关(中心):**负责渠道(Signal/WhatsApp)、路由和会话。 + - **节点(设备):**Mac/iOS/Android 作为外围设备连接,并暴露本地工具(`system.run`、`canvas`、`camera`)。 + - **智能体(工作者):**为专门角色提供独立的大脑/工作区(例如“Hetzner 运维”“个人数据”)。 + - **子智能体:**当你想并行处理时,从主智能体派生后台工作。 + - **TUI:**连接到 Gateway 网关并切换智能体/会话。 - 文档:[Nodes](/zh-CN/nodes)、[远程访问](/zh-CN/gateway/remote)、[Multi-Agent Routing](/zh-CN/concepts/multi-agent)、[子智能体](/zh-CN/tools/subagents)、[TUI](/web/tui)。 + 文档: [节点](/zh-CN/nodes)、[远程访问](/zh-CN/gateway/remote)、[多智能体路由](/zh-CN/concepts/multi-agent)、[子智能体](/zh-CN/tools/subagents)、[TUI](/web/tui)。 - 可以。这是一个配置项: + 可以。这是一个配置选项: ```json5 { @@ -1682,46 +1680,47 @@ x-i18n: } ``` - 默认值是 `false`(有头模式)。无头模式更容易触发某些站点的反机器人检查。参阅 [Browser](/zh-CN/tools/browser)。 + 默认值是 `false`(有头模式)。无头模式在某些网站上更容易触发反机器人检查。请参阅 [浏览器](/zh-CN/tools/browser)。 - 无头模式使用**同一个 Chromium 引擎**,适用于大多数自动化任务(表单、点击、抓取、登录)。主要差异: + 无头模式使用**相同的 Chromium 引擎**,适用于大多数自动化任务(表单、点击、抓取、登录)。主要区别在于: - - 没有可见的浏览器窗口(如果你需要视觉效果,请使用截图)。 - - 某些网站在无头模式下对自动化更严格(CAPTCHA、反机器人)。 - 例如,X/Twitter 经常会阻止无头会话。 + - 没有可见的浏览器窗口(如果你需要可视化,请使用截图)。 + - 有些网站在无头模式下对自动化更严格(CAPTCHA、反机器人)。 + 例如,X/Twitter 经常会拦截无头会话。 - 将 `browser.executablePath` 设置为你的 Brave 二进制路径(或任意基于 Chromium 的浏览器),然后重启 Gateway 网关。 - 完整配置示例见 [Browser](/zh-CN/tools/browser#use-brave-or-another-chromium-based-browser)。 + 将 `browser.executablePath` 设置为你的 Brave 二进制文件(或任何基于 Chromium 的浏览器),然后重启 Gateway 网关。 + 完整配置示例请参阅 [浏览器](/zh-CN/tools/browser#use-brave-or-another-chromium-based-browser)。 ## 远程 Gateway 网关和节点 - - Telegram 消息由**gateway**处理。gateway 会运行智能体, - 只有在需要节点工具时,才会通过**Gateway WebSocket** 调用节点: + + Telegram 消息由 **Gateway 网关**处理。Gateway 网关运行智能体, + 只有在需要节点工具时,才会通过 **Gateway WebSocket** + 调用节点: - Telegram → Gateway → Agent → `node.*` → Node → Gateway → Telegram + Telegram → Gateway 网关 → 智能体 → `node.*` → 节点 → Gateway 网关 → Telegram - 节点看不到入站 provider 流量;它们只会接收节点 RPC 调用。 + 节点看不到入站提供商流量;它们只接收节点 RPC 调用。 - - 简短回答:**把你的电脑配对为一个节点**。Gateway 网关运行在别处,但它可以 - 通过 Gateway WebSocket 调用你本地机器上的 `node.*` 工具(屏幕、摄像头、系统)。 + + 简短回答:**把你的电脑配对为节点**。Gateway 网关运行在别处,但它可以 + 通过 Gateway WebSocket 在你的本地机器上调用 `node.*` 工具(屏幕、摄像头、系统)。 典型设置: - 1. 在始终在线的主机(VPS/家庭服务器)上运行 Gateway 网关。 - 2. 将 Gateway 网关主机和你的电脑放在同一个 tailnet 中。 + 1. 在始终在线的主机(VPS/家用服务器)上运行 Gateway 网关。 + 2. 将 Gateway 网关主机和你的电脑放到同一个 tailnet 中。 3. 确保 Gateway WS 可达(tailnet 绑定或 SSH 隧道)。 - 4. 在本地打开 macOS 应用,并以**Remote over SSH** 模式(或直接通过 tailnet) - 连接,这样它就能注册为一个节点。 + 4. 在本地打开 macOS 应用,并以**通过 SSH 远程连接**模式(或直接 tailnet) + 连接,以便它注册为一个节点。 5. 在 Gateway 网关上批准该节点: ```bash @@ -1731,41 +1730,41 @@ x-i18n: 不需要单独的 TCP bridge;节点通过 Gateway WebSocket 连接。 - 安全提醒:配对一个 macOS 节点意味着该机器上允许 `system.run`。仅 - 配对你信任的设备,并查看 [Security](/zh-CN/gateway/security)。 + 安全提醒:配对一个 macOS 节点意味着允许在该机器上执行 `system.run`。只 + 配对你信任的设备,并查看 [安全性](/zh-CN/gateway/security)。 - 文档:[Nodes](/zh-CN/nodes)、[Gateway protocol](/zh-CN/gateway/protocol)、[macOS remote mode](/zh-CN/platforms/mac/remote)、[Security](/zh-CN/gateway/security)。 + 文档: [节点](/zh-CN/nodes)、[Gateway 网关协议](/zh-CN/gateway/protocol)、[macOS 远程模式](/zh-CN/platforms/mac/remote)、[安全性](/zh-CN/gateway/security)。 - + 先检查基础项: - - Gateway 网关是否在运行:`openclaw gateway status` + - Gateway 网关正在运行:`openclaw gateway status` - Gateway 网关健康状态:`openclaw status` - 渠道健康状态:`openclaw channels status` 然后验证认证和路由: - - 如果你使用 Tailscale Serve,请确保 `gateway.auth.allowTailscale` 设置正确。 - - 如果你通过 SSH 隧道连接,请确认本地隧道已建立,并且指向正确端口。 - - 确认你的允许列表(私信或群组)包含你的账户。 + - 如果你使用 Tailscale Serve,请确认 `gateway.auth.allowTailscale` 设置正确。 + - 如果你通过 SSH 隧道连接,请确认本地隧道已建立并指向正确端口。 + - 确认你的允许列表(私信或群组)包含你的账号。 - 文档:[Tailscale](/zh-CN/gateway/tailscale)、[远程访问](/zh-CN/gateway/remote)、[Channels](/zh-CN/channels)。 + 文档: [Tailscale](/zh-CN/gateway/tailscale)、[远程访问](/zh-CN/gateway/remote)、[渠道](/zh-CN/channels)。 - - 可以。虽然没有内置“机器人对机器人”桥接,但你可以通过几种 - 可靠方式实现: + + 可以。虽然没有内置的“机器人对机器人”桥接,但你可以通过几种 + 可靠方式来实现: **最简单:**使用两个机器人都能访问的普通聊天渠道(Telegram/Slack/WhatsApp)。 - 让 Bot A 给 Bot B 发送消息,然后让 Bot B 像平时一样回复。 + 让机器人 A 向机器人 B 发送消息,然后由机器人 B 正常回复。 - **CLI 桥接(通用):**运行一个脚本,通过 - `openclaw agent --message ... --deliver` 调用另一端 Gateway 网关, - 并将消息发往另一个机器人监听的聊天中。如果其中一个机器人在远程 VPS 上,请让你的 CLI - 通过 SSH/Tailscale 指向那个远程 Gateway 网关(参阅 [远程访问](/zh-CN/gateway/remote))。 + **CLI bridge(通用):**运行一个脚本,通过 + `openclaw agent --message ... --deliver` 调用另一个 Gateway 网关,并将目标指向另一个机器人 + 监听的聊天。如果其中一个机器人部署在远程 VPS 上,请让你的 CLI 通过 SSH/Tailscale 指向那个远程 Gateway 网关 + (参见 [远程访问](/zh-CN/gateway/remote))。 示例模式(在能访问目标 Gateway 网关的机器上运行): @@ -1773,59 +1772,59 @@ x-i18n: openclaw agent --message "Hello from local bot" --deliver --channel telegram --reply-to ``` - 提示:添加一个防护措施,避免两个机器人无限循环回复(例如仅在被提及时回复、渠道 + 提示:添加一个保护措施,防止两个机器人无限循环(仅提及时回复、渠道 允许列表,或“不要回复机器人消息”的规则)。 - 文档:[远程访问](/zh-CN/gateway/remote)、[Agent CLI](/cli/agent)、[Agent send](/zh-CN/tools/agent-send)。 + 文档: [远程访问](/zh-CN/gateway/remote)、[智能体 CLI](/cli/agent)、[智能体发送](/zh-CN/tools/agent-send)。 - - 不需要。一个 Gateway 网关可以托管多个智能体,每个智能体都有自己的工作区、模型默认值 - 和路由。这是最常见的设置,也比为每个智能体运行 - 一个 VPS 更便宜、更简单。 + + 不需要。一个 Gateway 网关就可以托管多个智能体,每个智能体都有自己的工作区、默认模型 + 和路由。这是常见配置,比起为每个智能体分别运行 + 一个 VPS,更便宜也更简单。 只有当你需要硬隔离(安全边界)或非常 - 不同、且不想共享的配置时,才应使用多个 VPS。否则,保留一个 Gateway 网关, + 不同、且不想共享的配置时,才需要分别使用不同 VPS。否则,保留一个 Gateway 网关, 并使用多个智能体或子智能体即可。 - - 有——节点是从远程 Gateway 网关访问你笔记本的一级方案,而且它们 - 不仅仅提供 shell 访问。Gateway 网关运行在 macOS/Linux(Windows 通过 WSL2)上,且 - 非常轻量(小型 VPS 或 Raspberry Pi 级设备就够了;4 GB RAM 已经很充足),因此一种常见 - 配置是常开主机 + 你的笔记本作为一个节点。 + + 有——节点是从远程 Gateway 网关访问你笔记本电脑的一等方式,并且 + 提供的不只是 shell 访问。Gateway 网关可以运行在 macOS/Linux 上(Windows 通过 WSL2),并且 + 很轻量(小型 VPS 或 Raspberry Pi 级设备即可;4 GB RAM 已经很充足),因此一种常见 + 配置是使用一个始终在线的主机,再把你的笔记本电脑作为节点。 - - **无需入站 SSH。**节点会主动连接到 Gateway WebSocket,并使用设备配对。 - - **更安全的执行控制。**`system.run` 会受该笔记本上的节点允许列表/审批保护。 - - **更多设备工具。**除了 `system.run` 外,节点还暴露 `canvas`、`camera` 和 `screen`。 - - **本地浏览器自动化。**可将 Gateway 网关放在 VPS 上,但通过笔记本上的节点主机在本地运行 Chrome,或通过 Chrome MCP 挂接到主机上的本地 Chrome。 + - **无需入站 SSH。**节点主动连接到 Gateway WebSocket,并使用设备配对。 + - **更安全的执行控制。**`system.run` 在那台笔记本电脑上受节点允许列表/审批控制。 + - **更多设备工具。**除了 `system.run`,节点还暴露 `canvas`、`camera` 和 `screen`。 + - **本地浏览器自动化。**把 Gateway 网关放在 VPS 上,但通过笔记本电脑上的节点主机在本地运行 Chrome,或通过 Chrome MCP 连接到主机上的本地 Chrome。 - SSH 适合临时 shell 访问,但对持续性的智能体工作流和 - 设备自动化来说,节点更简单。 + SSH 适合临时 shell 访问,但对于持续性的智能体工作流和 + 设备自动化,节点更简单。 - 文档:[Nodes](/zh-CN/nodes)、[Nodes CLI](/cli/nodes)、[Browser](/zh-CN/tools/browser)。 + 文档: [节点](/zh-CN/nodes)、[Nodes CLI](/cli/nodes)、[浏览器](/zh-CN/tools/browser)。 - - 不会。除非你有意运行隔离配置文件,否则每台主机上只应运行**一个 gateway**(参见 [Multiple gateways](/zh-CN/gateway/multiple-gateways))。节点是连接到 - gateway 的外设(iOS/Android 节点,或菜单栏应用中的 macOS “node mode”)。关于无头节点 - 主机和 CLI 控制,请参阅 [Node host CLI](/cli/node)。 + + 不会。除非你有意运行隔离配置文件(参见 [多个 Gateway 网关](/zh-CN/gateway/multiple-gateways)),否则每台主机上只应运行**一个 Gateway 网关**。节点是连接到 + Gateway 网关的外围设备(iOS/Android 节点,或菜单栏应用中的 macOS“节点模式”)。有关无头节点 + 主机和 CLI 控制,请参阅 [节点主机 CLI](/cli/node)。 - 更改 `gateway`、`discovery` 和 `canvasHost` 后,必须执行完整重启。 + 对 `gateway`、`discovery` 和 `canvasHost` 的更改需要完整重启。 - + 有。 - - `config.schema.lookup`:在写入前检查某个配置子树及其浅层 schema 节点、匹配的 UI 提示和直接子项摘要 - - `config.get`:获取当前快照 + hash - - `config.patch`:安全的部分更新(大多数 RPC 编辑的首选);尽可能热重载,必要时重启 - - `config.apply`:校验 + 替换完整配置;尽可能热重载,必要时重启 - - owner-only 的 `gateway` 运行时工具仍然拒绝重写 `tools.exec.ask` / `tools.exec.security`;旧版 `tools.bash.*` 别名会规范化到同一受保护 exec 路径 + - `config.schema.lookup`:在写入前检查某个配置子树,返回其浅层 schema 节点、匹配的 UI 提示和直接子项摘要 + - `config.get`:获取当前快照 + 哈希 + - `config.patch`:安全的部分更新(大多数 RPC 编辑的首选);可热重载时热重载,必须重启时自动重启 + - `config.apply`:验证 + 替换完整配置;可热重载时热重载,必须重启时自动重启 + - 仅限所有者的 `gateway` 运行时工具仍然拒绝重写 `tools.exec.ask` / `tools.exec.security`;旧版 `tools.bash.*` 别名会归一化到同一受保护的 exec 路径 @@ -1841,8 +1840,8 @@ x-i18n: - - 最少步骤: + + 最小步骤: 1. **在 VPS 上安装并登录** @@ -1852,50 +1851,50 @@ x-i18n: ``` 2. **在你的 Mac 上安装并登录** - - 使用 Tailscale 应用,并登录到同一个 tailnet。 + - 使用 Tailscale 应用并登录到同一个 tailnet。 3. **启用 MagicDNS(推荐)** - 在 Tailscale 管理控制台中启用 MagicDNS,这样 VPS 就会有一个稳定名称。 4. **使用 tailnet 主机名** - SSH:`ssh user@your-vps.tailnet-xxxx.ts.net` - Gateway WS:`ws://your-vps.tailnet-xxxx.ts.net:18789` - 如果你想要 Control UI 而无需 SSH,可在 VPS 上使用 Tailscale Serve: + 如果你想在不使用 SSH 的情况下访问 Control UI,请在 VPS 上使用 Tailscale Serve: ```bash openclaw gateway --tailscale serve ``` - 这会让 gateway 保持绑定在 loopback 上,并通过 Tailscale 暴露 HTTPS。参阅 [Tailscale](/zh-CN/gateway/tailscale)。 + 这样会让 Gateway 网关继续绑定到 loopback,并通过 Tailscale 暴露 HTTPS。请参阅 [Tailscale](/zh-CN/gateway/tailscale)。 - - Serve 会暴露**Gateway Control UI + WS**。节点通过同一个 Gateway WS 端点连接。 + + Serve 会暴露**Gateway 网关 Control UI + WS**。节点通过相同的 Gateway WS 端点连接。 推荐设置: - 1. **确保 VPS 和 Mac 在同一个 tailnet 中**。 - 2. **在 Remote 模式下使用 macOS 应用**(SSH 目标可以是 tailnet 主机名)。 - 应用会为 Gateway 端口建立隧道,并以节点身份连接。 - 3. **在 gateway 上批准节点**: + 1. **确保 VPS 和 Mac 位于同一个 tailnet 中**。 + 2. **在远程模式下使用 macOS 应用**(SSH 目标可以是 tailnet 主机名)。 + 应用会隧道化 Gateway 端口,并以节点身份连接。 + 3. **在 Gateway 网关上批准该节点**: ```bash openclaw devices list openclaw devices approve ``` - 文档:[Gateway protocol](/zh-CN/gateway/protocol)、[Discovery](/zh-CN/gateway/discovery)、[macOS remote mode](/zh-CN/platforms/mac/remote)。 + 文档: [Gateway 网关协议](/zh-CN/gateway/protocol)、[设备发现](/zh-CN/gateway/discovery)、[macOS 远程模式](/zh-CN/platforms/mac/remote)。 - - 如果你只需要在第二台笔记本上使用**本地工具**(屏幕/摄像头/exec),就把它添加为一个 - **节点**。这样可以保持单一 Gateway 网关,避免重复配置。目前本地节点工具 - 仅支持 macOS,但我们计划将其扩展到其他操作系统。 + + 如果你只需要第二台笔记本电脑上的**本地工具**(屏幕/摄像头/exec),就把它添加为 + **节点**。这样可以保留一个单一 Gateway 网关,并避免重复配置。本地节点工具 + 目前仅支持 macOS,但我们计划扩展到其他操作系统。 - 只有当你需要**硬隔离**或两个完全独立的机器人时,才安装第二个 Gateway 网关。 + 只有在你需要**硬隔离**或两个完全独立的机器人时,才需要安装第二个 Gateway 网关。 - 文档:[Nodes](/zh-CN/nodes)、[Nodes CLI](/cli/nodes)、[Multiple gateways](/zh-CN/gateway/multiple-gateways)。 + 文档: [节点](/zh-CN/nodes)、[Nodes CLI](/cli/nodes)、[多个 Gateway 网关](/zh-CN/gateway/multiple-gateways)。 @@ -1907,9 +1906,9 @@ x-i18n: OpenClaw 会读取父进程中的环境变量(shell、launchd/systemd、CI 等),并额外加载: - 当前工作目录中的 `.env` - - 来自 `~/.openclaw/.env`(即 `$OPENCLAW_STATE_DIR/.env`)的全局回退 `.env` + - `~/.openclaw/.env` 中的全局回退 `.env`(也就是 `$OPENCLAW_STATE_DIR/.env`) - 两个 `.env` 文件都不会覆盖现有环境变量。 + 这两个 `.env` 文件都不会覆盖现有环境变量。 你也可以在配置中定义内联环境变量(仅在进程环境中缺失时应用): @@ -1922,15 +1921,15 @@ x-i18n: } ``` - 完整优先级和来源参阅 [/environment](/zh-CN/help/environment)。 + 完整的优先级和来源请参阅 [/environment](/zh-CN/help/environment)。 - - 两种常见修复方法: + + 两种常见修复方式: - 1. 将缺失的 key 放入 `~/.openclaw/.env`,这样即使服务没有继承你的 shell 环境,也能读取到。 - 2. 启用 shell 导入(可选的便利功能): + 1. 将缺失的键放入 `~/.openclaw/.env`,这样即使服务没有继承你的 shell 环境,也能读取到。 + 2. 启用 shell 导入(可选的便捷功能): ```json5 { @@ -1943,18 +1942,18 @@ x-i18n: } ``` - 这会运行你的登录 shell,并仅导入缺失的预期键名(绝不覆盖现有值)。对应环境变量: + 这会运行你的登录 shell,并且只导入缺失的预期键名(绝不覆盖)。对应环境变量: `OPENCLAW_LOAD_SHELL_ENV=1`、`OPENCLAW_SHELL_ENV_TIMEOUT_MS=15000`。 - - `openclaw models status` 报告的是是否启用了**shell 环境导入**。“Shell env: off” - **不**代表你的环境变量缺失——它只是表示 OpenClaw 不会 + + `openclaw models status` 报告的是**是否启用了 shell 环境导入**。“Shell env: off” + **不**表示你的环境变量缺失——它只是表示 OpenClaw 不会 自动加载你的登录 shell。 如果 Gateway 网关作为服务运行(launchd/systemd),它不会继承你的 shell - 环境。你可以通过以下方式之一修复: + 环境。可通过以下方式之一修复: 1. 将令牌放入 `~/.openclaw/.env`: @@ -1963,16 +1962,16 @@ x-i18n: ``` 2. 或启用 shell 导入(`env.shellEnv.enabled: true`)。 - 3. 或将其添加到配置中的 `env` 块中(仅在缺失时应用)。 + 3. 或将其加入配置中的 `env` 块(仅在缺失时应用)。 - 然后重启 gateway 并重新检查: + 然后重启 Gateway 网关并重新检查: ```bash openclaw models status ``` - Copilot 令牌从 `COPILOT_GITHUB_TOKEN` 读取(也支持 `GH_TOKEN` / `GITHUB_TOKEN`)。 - 参阅 [/concepts/model-providers](/zh-CN/concepts/model-providers) 和 [/environment](/zh-CN/help/environment)。 + Copilot 令牌会从 `COPILOT_GITHUB_TOKEN` 读取(也支持 `GH_TOKEN` / `GITHUB_TOKEN`)。 + 请参阅 [/concepts/model-providers](/zh-CN/concepts/model-providers) 和 [/environment](/zh-CN/help/environment)。 @@ -1980,15 +1979,15 @@ x-i18n: ## 会话和多个聊天 - - 发送 `/new` 或 `/reset` 作为独立消息。参阅 [Session management](/zh-CN/concepts/session)。 + + 发送 `/new` 或 `/reset` 作为独立消息。请参阅 [会话管理](/zh-CN/concepts/session)。 - 会话可以在 `session.idleMinutes` 之后过期,但这个功能**默认关闭**(默认 **0**)。 - 将其设置为正值即可启用空闲过期。启用后,空闲期后的**下一条** - 消息会为该聊天键启动一个新的会话 ID。 - 这不会删除转录内容——只是开启一个新会话。 + 会话可以在 `session.idleMinutes` 后过期,但这项功能**默认禁用**(默认值为 **0**)。 + 将其设置为正值即可启用空闲过期。启用后,空闲期过后的**下一条** + 消息会为该聊天键开启一个新的会话 ID。 + 这不会删除转录记录——它只是开始一个新会话。 ```json5 { @@ -2000,30 +1999,30 @@ x-i18n: - - 可以,通过**多智能体路由**和**子智能体**。你可以创建一个协调者 - 智能体,以及多个具有各自工作区和模型的工作智能体。 + + 有,可以通过**多智能体路由**和**子智能体**实现。你可以创建一个协调者 + 智能体,以及多个拥有各自工作区和模型的工作智能体。 - 不过,最好把它看作一种**有趣的实验**。它非常消耗令牌,而且通常 - 不如使用一个机器人配合不同会话高效。我们通常设想的模式 - 是你只与一个机器人对话,用不同会话进行并行工作。这个 - 机器人也可以在需要时派生子智能体。 + 不过,这更适合作为一个**有趣的实验**。它会消耗大量令牌,而且通常 + 不如使用一个机器人配合不同会话高效。我们通常设想的模型是: + 你只和一个机器人交互,但为并行工作使用不同会话。这个 + 机器人也可以在需要时启动子智能体。 - 文档:[多智能体路由](/zh-CN/concepts/multi-agent)、[子智能体](/zh-CN/tools/subagents)、[Agents CLI](/cli/agents)。 + 文档: [多智能体路由](/zh-CN/concepts/multi-agent)、[子智能体](/zh-CN/tools/subagents)、[智能体 CLI](/cli/agents)。 - - 会话上下文受模型窗口限制。长聊天、大量工具输出或很多 + + 会话上下文受限于模型窗口。长聊天、大量工具输出或许多 文件都可能触发压缩或截断。 有帮助的做法: - 让机器人总结当前状态并写入文件。 - 在长任务前使用 `/compact`,切换话题时使用 `/new`。 - - 将重要上下文保存在工作区中,并让机器人重新读取它。 - - 对于长任务或并行工作,使用子智能体,这样主聊天会更小。 - - 如果经常发生这种情况,请选择上下文窗口更大的模型。 + - 将重要上下文保存在工作区中,并让机器人重新读取。 + - 对长任务或并行工作使用子智能体,以保持主聊天更小。 + - 如果这种情况经常发生,请选择上下文窗口更大的模型。 @@ -2046,78 +2045,78 @@ x-i18n: openclaw onboard --install-daemon ``` - 注意: + 说明: - - 如果新手引导发现已有配置,也会提供**Reset** 选项。参阅 [新手引导(CLI)](/zh-CN/start/wizard)。 - - 如果你使用了 profiles(`--profile` / `OPENCLAW_PROFILE`),请重置每个状态目录(默认是 `~/.openclaw-`)。 - - 开发重置:`openclaw gateway --dev --reset`(仅限开发;会清空开发配置 + 凭据 + 会话 + 工作区)。 + - 如果新手引导检测到现有配置,也会提供**重置**选项。请参阅 [设置向导(CLI)](/zh-CN/start/wizard)。 + - 如果你使用了配置文件(`--profile` / `OPENCLAW_PROFILE`),请分别重置每个状态目录(默认是 `~/.openclaw-`)。 + - 开发重置:`openclaw gateway --dev --reset`(仅限开发;会清除开发配置 + 凭证 + 会话 + 工作区)。 - - 使用以下任一种: + + 使用以下任一方式: - - **压缩**(保留对话,但总结旧轮次): + - **压缩**(保留对话,但总结较早的轮次): ``` /compact ``` - 或使用 `/compact ` 来引导摘要内容。 + 或使用 `/compact ` 来指导摘要内容。 - - **重置**(为相同聊天键创建新的会话 ID): + - **重置**(为同一聊天键创建全新的会话 ID): ``` /new /reset ``` - 如果问题持续发生: + 如果这种情况反复发生: - - 启用或调整**会话修剪**(`agents.defaults.contextPruning`)以裁剪旧工具输出。 + - 启用或调整**会话修剪**(`agents.defaults.contextPruning`)以裁剪旧的工具输出。 - 使用上下文窗口更大的模型。 - 文档:[Compaction](/zh-CN/concepts/compaction)、[Session pruning](/zh-CN/concepts/session-pruning)、[Session management](/zh-CN/concepts/session)。 + 文档: [压缩](/zh-CN/concepts/compaction)、[会话修剪](/zh-CN/concepts/session-pruning)、[会话管理](/zh-CN/concepts/session)。 - - 这是一个 provider 校验错误:模型发出了一个缺少必需 - `input` 的 `tool_use` 块。通常表示会话历史已经陈旧或损坏(常见于长线程 + + 这是提供商验证错误:模型发出了一个缺少必需 + `input` 的 `tool_use` 块。通常意味着会话历史陈旧或已损坏(常见于长线程 或工具/schema 变更之后)。 - 修复方法:使用 `/new`(独立消息)开始一个全新会话。 + 修复方法:使用 `/new`(独立消息)开始一个新会话。 - - Heartbeat 默认每 **30m** 运行一次(使用 OAuth 认证时为 **1h**)。可以调整或禁用: + + Heartbeat 默认每 **30 分钟**运行一次(使用 OAuth 认证时为 **1 小时**)。你可以调整或禁用它们: ```json5 { agents: { defaults: { heartbeat: { - every: "2h", // 或 "0m" 表示禁用 + every: "2h", // 或设为 "0m" 以禁用 }, }, }, } ``` - 如果 `HEARTBEAT.md` 存在但实际上为空(只有空行和 markdown - 标题如 `# Heading`),OpenClaw 会跳过 heartbeat 运行以节省 API 调用。 - 如果该文件不存在,heartbeat 仍会运行,由模型决定该做什么。 + 如果 `HEARTBEAT.md` 存在但实际上为空(只有空行和 Markdown + 标题,例如 `# Heading`),OpenClaw 会跳过 heartbeat 运行以节省 API 调用。 + 如果文件不存在,heartbeat 仍会运行,并由模型决定该做什么。 - 每个智能体的覆盖使用 `agents.list[].heartbeat`。文档:[Heartbeat](/zh-CN/gateway/heartbeat)。 + 按智能体覆盖使用 `agents.list[].heartbeat`。文档: [Heartbeat](/zh-CN/gateway/heartbeat)。 - - 不需要。OpenClaw 运行在**你自己的账号**上,因此只要你在群里,OpenClaw 就能看到它。 + + 不需要。OpenClaw 运行在**你自己的账号**上,所以只要你在群里,OpenClaw 就能看到它。 默认情况下,群组回复会被阻止,直到你允许发送者(`groupPolicy: "allowlist"`)。 - 如果你只希望**你自己**能够触发群组回复: + 如果你希望只有**你自己**能够触发群组回复: ```json5 { @@ -2133,7 +2132,7 @@ x-i18n: - 选项 1(最快):查看日志尾部,并在群里发送一条测试消息: + 方式 1(最快):查看日志,并在群里发送一条测试消息: ```bash openclaw logs --follow --json @@ -2142,62 +2141,62 @@ x-i18n: 查找以 `@g.us` 结尾的 `chatId`(或 `from`),例如: `1234567890-1234567890@g.us`。 - 选项 2(如果已配置/加入允许列表):从配置中列出群组: + 方式 2(如果已配置/加入允许列表):从配置中列出群组: ```bash openclaw directory groups list --channel whatsapp ``` - 文档:[WhatsApp](/zh-CN/channels/whatsapp)、[Directory](/cli/directory)、[Logs](/cli/logs)。 + 文档: [WhatsApp](/zh-CN/channels/whatsapp)、[目录](/cli/directory)、[日志](/cli/logs)。 - + 两个常见原因: - - 提及门控已开启(默认)。你必须 @ 提及机器人(或匹配 `mentionPatterns`)。 - - 你配置了 `channels.whatsapp.groups` 但没有包含 `"*"`,且该群未加入允许列表。 + - 提及门控处于开启状态(默认)。你必须 @ 提及机器人(或匹配 `mentionPatterns`)。 + - 你配置了 `channels.whatsapp.groups`,但没有包含 `"*"`,并且该群组不在允许列表中。 - 参阅 [Groups](/zh-CN/channels/groups) 和 [Group messages](/zh-CN/channels/group-messages)。 + 请参阅 [群组](/zh-CN/channels/groups) 和 [群组消息](/zh-CN/channels/group-messages)。 - 直接聊天默认会折叠到主会话。群组/渠道拥有各自独立的会话键,而 Telegram 话题 / Discord 线程也是独立会话。参阅 [Groups](/zh-CN/channels/groups) 和 [Group messages](/zh-CN/channels/group-messages)。 + 直接聊天默认会折叠到主会话。群组/渠道有各自独立的会话键,而 Telegram 话题 / Discord 线程也都是独立会话。请参阅 [群组](/zh-CN/channels/groups) 和 [群组消息](/zh-CN/channels/group-messages)。 - 没有硬性限制。几十个(甚至上百个)都没问题,但请注意: + 没有硬性限制。几十个(甚至上百个)都没问题,但要注意: - - **磁盘增长:**会话 + 转录内容保存在 `~/.openclaw/agents//sessions/` 下。 - - **令牌成本:**更多智能体意味着更多并发模型使用。 + - **磁盘增长:**会话 + 转录记录位于 `~/.openclaw/agents//sessions/` 下。 + - **令牌成本:**智能体越多,并发模型使用也越多。 - **运维开销:**按智能体划分的认证配置文件、工作区和渠道路由。 提示: - - 为每个智能体保留一个**活跃**工作区(`agents.defaults.workspace`)。 - - 如果磁盘增长,修剪旧会话(删除 JSONL 或存储条目)。 - - 使用 `openclaw doctor` 发现零散工作区和 profile 不匹配问题。 + - 每个智能体保持一个**活跃**工作区(`agents.defaults.workspace`)。 + - 如果磁盘增长明显,请修剪旧会话(删除 JSONL 或存储条目)。 + - 使用 `openclaw doctor` 检查零散工作区和配置文件不匹配问题。 - - 可以。使用**多智能体路由**来运行多个隔离的智能体,并按 - channel/account/peer 路由入站消息。Slack 作为渠道受支持,也可以绑定到特定智能体。 + + 可以。使用**多智能体路由**来运行多个相互隔离的智能体,并按 + 渠道/账号/peer 路由入站消息。Slack 作为渠道受支持,也可以绑定到特定智能体。 - 浏览器访问能力很强,但并不等于“人类能做的都能做”——反机器人机制、CAPTCHA 和 MFA + 浏览器访问能力很强,但并不是“人类能做的都能做”——反机器人机制、CAPTCHA 和 MFA 仍然可能阻止自动化。若要获得最可靠的浏览器控制,请在主机上使用本地 Chrome MCP, 或在实际运行浏览器的机器上使用 CDP。 最佳实践设置: - 始终在线的 Gateway 网关主机(VPS/Mac mini)。 - - 每个角色一个智能体(bindings)。 - - 将 Slack 频道绑定到这些智能体。 - - 需要时通过 Chrome MCP 或节点访问本地浏览器。 + - 每个角色对应一个智能体(绑定)。 + - 将 Slack 渠道绑定到这些智能体。 + - 在需要时通过 Chrome MCP 或节点使用本地浏览器。 - 文档:[Multi-Agent Routing](/zh-CN/concepts/multi-agent)、[Slack](/zh-CN/channels/slack)、 - [Browser](/zh-CN/tools/browser)、[Nodes](/zh-CN/nodes)。 + 文档: [多智能体路由](/zh-CN/concepts/multi-agent)、[Slack](/zh-CN/channels/slack)、 + [浏览器](/zh-CN/tools/browser)、[节点](/zh-CN/nodes)。 @@ -2206,86 +2205,88 @@ x-i18n: - OpenClaw 的默认模型就是你在这里设置的内容: + OpenClaw 的默认模型就是你设置在: ``` agents.defaults.model.primary ``` - 模型以 `provider/model` 的形式引用(例如:`openai/gpt-5.4`)。如果你省略 provider,OpenClaw 会先尝试别名,然后尝试精确 model id 的唯一已配置 provider 匹配,最后才会回退到已配置默认 provider 的已弃用兼容路径。如果该 provider 已不再暴露所配置的默认模型,OpenClaw 会回退到第一个已配置的 provider/model,而不是继续暴露一个过期、已移除 provider 的默认值。你仍然应该**显式**设置 `provider/model`。 + 中的那个模型。 + + 模型以 `provider/model` 的形式引用(例如:`openai/gpt-5.4`)。如果你省略提供商,OpenClaw 会先尝试别名,然后尝试与该确切模型 id 唯一匹配的已配置提供商,只有最后才会回退到已配置默认提供商这一已弃用的兼容路径。如果该提供商已经不再暴露已配置的默认模型,OpenClaw 会回退到第一个已配置的提供商/模型,而不是暴露一个已移除提供商的陈旧默认值。你仍然应该**显式**设置 `provider/model`。 - - **推荐默认值:**使用你 provider 栈中可用的最强最新一代模型。 - **对于启用了工具或处理不可信输入的智能体:**优先考虑模型能力,而不是成本。 - **对于日常/低风险聊天:**使用更便宜的后备模型,并按智能体角色进行路由。 + + **推荐默认值:**使用你的提供商栈中可用的最强最新一代模型。 + **对于启用了工具或接收不可信输入的智能体:**优先考虑模型能力,而不是成本。 + **对于日常/低风险聊天:**使用更便宜的回退模型,并按智能体角色进行路由。 - MiniMax 有自己的文档:[MiniMax](/zh-CN/providers/minimax) 和 - [Local models](/zh-CN/gateway/local-models)。 + MiniMax 有自己的文档: [MiniMax](/zh-CN/providers/minimax) 和 + [本地模型](/zh-CN/gateway/local-models)。 - 经验法则:高风险工作使用你**负担得起的最佳模型**,日常聊天或摘要则使用更便宜的 - 模型。你可以按智能体路由模型,并使用子智能体来 - 并行长任务(每个子智能体都会消耗令牌)。参阅 [Models](/zh-CN/concepts/models) 和 + 经验法则:对于高风险工作,使用你**能负担得起的最佳模型**;对于日常聊天或摘要, + 使用更便宜的模型。你可以按智能体路由模型,并使用子智能体来 + 并行处理长任务(每个子智能体都会消耗令牌)。请参阅 [模型](/zh-CN/concepts/models) 和 [子智能体](/zh-CN/tools/subagents)。 强烈警告:较弱/过度量化的模型更容易受到提示 - 注入和不安全行为影响。参阅 [Security](/zh-CN/gateway/security)。 + 注入和不安全行为的影响。请参阅 [安全性](/zh-CN/gateway/security)。 - 更多背景:[Models](/zh-CN/concepts/models)。 + 更多背景: [模型](/zh-CN/concepts/models)。 - 使用**模型命令**,或只编辑**模型**字段。避免整份配置替换。 + 使用**模型命令**,或只编辑**模型**字段。避免整体替换配置。 - 安全方式: + 安全选项: - - 在聊天中使用 `/model`(快速,按会话) + - 在聊天中使用 `/model`(快速、按会话) - `openclaw models set ...`(只更新模型配置) - `openclaw configure --section model`(交互式) - 编辑 `~/.openclaw/openclaw.json` 中的 `agents.defaults.model` 除非你确实打算替换整个配置,否则不要对部分对象使用 `config.apply`。 - 对于 RPC 编辑,先用 `config.schema.lookup` 检查,并优先使用 `config.patch`。lookup 载荷会提供规范化路径、浅层 schema 文档/约束,以及直接子项摘要, + 对于 RPC 编辑,先用 `config.schema.lookup` 检查,并优先使用 `config.patch`。lookup 返回的数据会提供规范化路径、浅层 schema 文档/约束,以及直接子项摘要, 以便进行部分更新。 如果你确实覆盖了配置,请从备份恢复,或重新运行 `openclaw doctor` 进行修复。 - 文档:[Models](/zh-CN/concepts/models)、[Configure](/cli/configure)、[Config](/cli/config)、[Doctor](/zh-CN/gateway/doctor)。 + 文档: [模型](/zh-CN/concepts/models)、[配置向导](/cli/configure)、[配置](/cli/config)、[Doctor](/zh-CN/gateway/doctor)。 - + 可以。Ollama 是使用本地模型最简单的路径。 - 最快设置: + 最快设置方法: 1. 从 `https://ollama.com/download` 安装 Ollama 2. 拉取一个本地模型,例如 `ollama pull gemma4` - 3. 如果你也想使用云端模型,运行 `ollama signin` + 3. 如果你也想使用云模型,请运行 `ollama signin` 4. 运行 `openclaw onboard` 并选择 `Ollama` 5. 选择 `Local` 或 `Cloud + Local` - 注意: + 说明: - - `Cloud + Local` 会同时提供云端模型和你的本地 Ollama 模型 - - 像 `kimi-k2.5:cloud` 这样的云端模型不需要本地拉取 - - 如需手动切换,使用 `openclaw models list` 和 `openclaw models set ollama/` + - `Cloud + Local` 会同时提供云模型和你的本地 Ollama 模型 + - 像 `kimi-k2.5:cloud` 这样的云模型不需要本地拉取 + - 如需手动切换,请使用 `openclaw models list` 和 `openclaw models set ollama/` - 安全提示:更小或重度量化的模型更容易受到提示 + 安全说明:更小或高度量化的模型更容易受到提示 注入影响。对于任何可以使用工具的机器人,我们强烈建议使用**大模型**。 如果你仍然想使用小模型,请启用沙箱隔离和严格的工具允许列表。 - 文档:[Ollama](/zh-CN/providers/ollama)、[Local models](/zh-CN/gateway/local-models)、 - [Model providers](/zh-CN/concepts/model-providers)、[Security](/zh-CN/gateway/security)、 + 文档: [Ollama](/zh-CN/providers/ollama)、[本地模型](/zh-CN/gateway/local-models)、 + [模型提供商](/zh-CN/concepts/model-providers)、[安全性](/zh-CN/gateway/security)、 [沙箱隔离](/zh-CN/gateway/sandboxing)。 - - 这些部署可能彼此不同,并且会随时间变化;没有固定的 provider 推荐。 - - 在每个 gateway 上使用 `openclaw models status` 查看当前运行时设置。 - - 对于安全敏感/启用工具的智能体,请使用当前可用的最强最新一代模型。 + - 这些部署可能不同,而且会随时间变化;没有固定的提供商推荐。 + - 请在各自 Gateway 网关上通过 `openclaw models status` 检查当前运行时设置。 + - 对于安全敏感/启用了工具的智能体,请使用可用的最强最新一代模型。 @@ -2301,56 +2302,56 @@ x-i18n: /model gemini-flash-lite ``` - 这些是内置别名。你也可以通过 `agents.defaults.models` 添加自定义别名。 + 这些是内置别名。自定义别名可以通过 `agents.defaults.models` 添加。 - 你可以使用 `/model`、`/model list` 或 `/model status` 列出可用模型。 + 你可以使用 `/model`、`/model list` 或 `/model status` 查看可用模型。 - `/model`(以及 `/model list`)会显示一个紧凑的编号选择器。可按编号选择: + `/model`(以及 `/model list`)会显示一个紧凑的编号选择器。按编号选择: ``` /model 3 ``` - 你也可以为 provider 强制指定一个特定认证配置文件(按会话): + 你还可以为提供商强制指定某个认证配置文件(按会话): ``` /model opus@anthropic:default /model opus@anthropic:work ``` - 提示:`/model status` 会显示当前活跃的是哪个智能体、正在使用哪个 `auth-profiles.json` 文件,以及接下来会尝试哪个认证配置文件。 - 如果可用,它还会显示已配置的 provider 端点(`baseUrl`)和 API 模式(`api`)。 + 提示:`/model status` 会显示当前活跃的是哪个智能体、正在使用哪个 `auth-profiles.json` 文件,以及接下来将尝试哪个认证配置文件。 + 它还会在可用时显示已配置的提供商端点(`baseUrl`)和 API 模式(`api`)。 - **如何取消我用 @profile 固定的配置文件?** + **如何取消我通过 @profile 设置的固定配置文件?** - 重新运行 `/model`,但**不要**带 `@profile` 后缀: + 重新运行 `/model`,**不要**带 `@profile` 后缀: ``` /model anthropic/claude-opus-4-6 ``` - 如果你想回到默认值,请从 `/model` 中选择它(或发送 `/model `)。 - 使用 `/model status` 确认当前生效的认证配置文件。 + 如果你想回到默认值,就从 `/model` 中重新选择(或发送 `/model <默认 provider/model>`)。 + 使用 `/model status` 确认当前激活的是哪个认证配置文件。 - - 可以。将一个设为默认值,并在需要时切换: + + 可以。将其中一个设为默认值,并按需切换: - - **快速切换(按会话):**日常任务用 `/model gpt-5.4`,使用 Codex OAuth 编码时用 `/model openai-codex/gpt-5.4`。 - - **默认值 + 切换:**将 `agents.defaults.model.primary` 设为 `openai/gpt-5.4`,编码时切到 `openai-codex/gpt-5.4`(或者反过来)。 - - **子智能体:**将编码任务路由给默认模型不同的子智能体。 + - **快速切换(按会话):**日常任务使用 `/model gpt-5.4`,需要通过 Codex OAuth 编码时使用 `/model openai-codex/gpt-5.4`。 + - **默认值 + 切换:**将 `agents.defaults.model.primary` 设为 `openai/gpt-5.4`,编码时再切换到 `openai-codex/gpt-5.4`(或反过来)。 + - **子智能体:**将编码任务路由到使用不同默认模型的子智能体。 - 参阅 [Models](/zh-CN/concepts/models) 和 [Slash commands](/zh-CN/tools/slash-commands)。 + 请参阅 [模型](/zh-CN/concepts/models) 和 [斜杠命令](/zh-CN/tools/slash-commands)。 - 可以使用会话开关或配置默认值: + 可以使用会话切换或配置默认值: - - **按会话:**当会话使用 `openai/gpt-5.4` 或 `openai-codex/gpt-5.4` 时,发送 `/fast on`。 - - **按模型默认值:**将 `agents.defaults.models["openai/gpt-5.4"].params.fastMode` 设为 `true`。 - - **Codex OAuth 也适用:**如果你也使用 `openai-codex/gpt-5.4`,请为它设置相同标志。 + - **按会话:**当当前会话使用 `openai/gpt-5.4` 或 `openai-codex/gpt-5.4` 时,发送 `/fast on`。 + - **按模型默认值:**将 `agents.defaults.models["openai/gpt-5.4"].params.fastMode` 设置为 `true`。 + - **Codex OAuth 也一样:**如果你也使用 `openai-codex/gpt-5.4`,请在那里设置相同标志。 示例: @@ -2375,55 +2376,55 @@ x-i18n: } ``` - 对于 OpenAI,fast mode 会在受支持的原生 Responses 请求中映射到 `service_tier = "priority"`。会话中的 `/fast` 覆盖优先于配置默认值。 + 对于 OpenAI,fast mode 会在支持的原生 Responses 请求上映射为 `service_tier = "priority"`。会话中的 `/fast` 覆盖优先于配置默认值。 - 参阅 [Thinking and fast mode](/zh-CN/tools/thinking) 和 [OpenAI fast mode](/zh-CN/providers/openai#openai-fast-mode)。 + 请参阅 [思考与 fast mode](/zh-CN/tools/thinking) 和 [OpenAI fast mode](/zh-CN/providers/openai#openai-fast-mode)。 - - 如果设置了 `agents.defaults.models`,它就会成为 `/model` 及任何 + + 如果设置了 `agents.defaults.models`,它就会成为 `/model` 和任何 会话覆盖的**允许列表**。选择一个不在该列表中的模型会返回: ``` Model "provider/model" is not allowed. Use /model to list available models. ``` - 这个错误会**替代**正常回复返回。修复方法:将该模型加入 + 这个错误会**替代**正常回复返回。修复方法:把该模型加入 `agents.defaults.models`,移除允许列表,或从 `/model list` 中选择一个模型。 - - 这意味着**provider 没有配置**(未找到 MiniMax provider 配置或认证 - 配置文件),因此模型无法解析。 + + 这意味着**提供商未配置**(找不到 MiniMax 提供商配置或认证 + 配置文件),所以该模型无法解析。 - 修复清单: + 修复检查清单: - 1. 升级到当前 OpenClaw 版本(或直接运行源码 `main`),然后重启 gateway。 - 2. 确保已配置 MiniMax(通过向导或 JSON),或者环境变量/认证配置文件中 - 存在 MiniMax 认证,以便注入匹配的 provider - (`minimax` 用 `MINIMAX_API_KEY`,`minimax-portal` 用 `MINIMAX_OAUTH_TOKEN` 或已存储的 MiniMax + 1. 升级到当前 OpenClaw 版本(或从源码运行 `main`),然后重启 Gateway 网关。 + 2. 确保已配置 MiniMax(通过向导或 JSON),或者确保环境变量/认证配置文件中存在 MiniMax 认证, + 这样相应提供商才能被注入 + (`minimax` 使用 `MINIMAX_API_KEY`,`minimax-portal` 使用 `MINIMAX_OAUTH_TOKEN` 或已存储的 MiniMax OAuth)。 - 3. 对你的认证路径使用精确模型 id(区分大小写): - `minimax/MiniMax-M2.7` 或 `minimax/MiniMax-M2.7-highspeed` 用于 API key - 设置,或 `minimax-portal/MiniMax-M2.7` / - `minimax-portal/MiniMax-M2.7-highspeed` 用于 OAuth 设置。 + 3. 使用与你的认证路径完全匹配的模型 id(区分大小写): + API 密钥配置使用 `minimax/MiniMax-M2.7` 或 `minimax/MiniMax-M2.7-highspeed`, + OAuth 配置使用 `minimax-portal/MiniMax-M2.7` / + `minimax-portal/MiniMax-M2.7-highspeed`。 4. 运行: ```bash openclaw models list ``` - 并从列表中选择(或者在聊天中使用 `/model list`)。 + 然后从列表中选择(或在聊天中使用 `/model list`)。 - 参阅 [MiniMax](/zh-CN/providers/minimax) 和 [Models](/zh-CN/concepts/models)。 + 请参阅 [MiniMax](/zh-CN/providers/minimax) 和 [模型](/zh-CN/concepts/models)。 - - 可以。把 **MiniMax 设为默认值**,并在需要时**按会话**切换模型。 - 后备机制用于处理**错误**,而不是“高难任务”,因此请使用 `/model` 或单独的智能体。 + + 可以。将 **MiniMax 设为默认值**,并在需要时**按会话**切换模型。 + 回退机制用于处理**错误**,而不是“更难的任务”,所以请使用 `/model` 或单独的智能体。 **选项 A:按会话切换** @@ -2448,18 +2449,18 @@ x-i18n: /model gpt ``` - **选项 B:分离智能体** + **选项 B:使用不同智能体** - 智能体 A 默认:MiniMax - 智能体 B 默认:OpenAI - - 按智能体路由,或使用 `/agent` 切换 + - 通过智能体路由,或使用 `/agent` 进行切换 - 文档:[Models](/zh-CN/concepts/models)、[Multi-Agent Routing](/zh-CN/concepts/multi-agent)、[MiniMax](/zh-CN/providers/minimax)、[OpenAI](/zh-CN/providers/openai)。 + 文档: [模型](/zh-CN/concepts/models)、[多智能体路由](/zh-CN/concepts/multi-agent)、[MiniMax](/zh-CN/providers/minimax)、[OpenAI](/zh-CN/providers/openai)。 - 是。OpenClaw 自带一些默认简写(仅当模型存在于 `agents.defaults.models` 中时才生效): + 是。OpenClaw 自带一些默认简写(仅在模型存在于 `agents.defaults.models` 中时生效): - `opus` → `anthropic/claude-opus-4-6` - `sonnet` → `anthropic/claude-sonnet-4-6` @@ -2470,11 +2471,11 @@ x-i18n: - `gemini-flash` → `google/gemini-3-flash-preview` - `gemini-flash-lite` → `google/gemini-3.1-flash-lite-preview` - 如果你设置了同名自定义别名,则以你的值为准。 + 如果你设置了同名的自定义别名,则以你的值为准。 - + 别名来自 `agents.defaults.models..alias`。示例: ```json5 @@ -2492,11 +2493,11 @@ x-i18n: } ``` - 然后 `/model sonnet`(或在支持时使用 `/`)就会解析为该模型 ID。 + 然后 `/model sonnet`(或在支持时使用 `/`)就会解析到该模型 ID。 - + OpenRouter(按 token 计费;模型很多): ```json5 @@ -2525,95 +2526,779 @@ x-i18n: } ``` - 如果你引用了某个 provider/model,但缺少所需的 provider key,就会收到运行时认证错误(例如 `No API key found for provider "zai"`)。 + 如果你引用了某个提供商/模型,但缺少所需的提供商密钥,你会收到运行时认证错误(例如 `No API key found for provider "zai"`)。 - **添加新智能体后出现 No API key found for provider** + **添加新智能体后提示 No API key found for provider** - 这通常表示**新智能体**的认证存储是空的。认证是按智能体隔离的, - 存储在: + 这通常意味着**新智能体**的认证存储为空。认证是按智能体区分的, + 并存储在: ``` ~/.openclaw/agents//agent/auth-profiles.json ``` - 修复选项: + 修复方式: - 运行 `openclaw agents add `,并在向导中配置认证。 - - 或将主智能体 `agentDir` 中的 `auth-profiles.json` 复制到新智能体的 `agentDir` 中。 + - 或者把主智能体 `agentDir` 中的 `auth-profiles.json` 复制到新智能体的 `agentDir` 中。 **不要**在多个智能体之间复用 `agentDir`;这会导致认证/会话冲突。 -## 模型故障转移和“All models failed” +## 模型故障切换和 “All models failed” - - 故障转移分两个阶段: + + 故障切换分为两个阶段: - 1. 同一 provider 内的**认证配置文件轮换**。 - 2. 根据 `agents.defaults.model.fallbacks` 切换到下一个**后备模型**。 + 1. 同一提供商内的**认证配置文件轮换**。 + 2. **模型回退**到 `agents.defaults.model.fallbacks` 中的下一个模型。 - 对失败的 profile 会应用冷却时间(指数退避),因此即使 provider 被限流或暂时故障,OpenClaw 也能继续响应。 + 对失败的配置文件会应用冷却时间(指数退避),因此即使某个提供商被限流或暂时失败,OpenClaw 仍能继续响应。 - 速率限制桶不只包含普通的 `429` 响应。OpenClaw + 速率限制桶不仅包含普通的 `429` 响应。OpenClaw 还会将诸如 `Too many concurrent requests`、 `ThrottlingException`、`concurrency limit reached`、 `workers_ai ... quota limit exceeded`、`resource exhausted` 以及周期性 - 用量窗口限制(`weekly/monthly limit reached`)等消息视为值得触发故障转移的 + 用量窗口限制(`weekly/monthly limit reached`)等消息视为值得进行故障切换的 速率限制。 - 某些看起来像计费问题的响应并不是 `402`,而某些 HTTP `402` - 响应也会留在那个瞬时错误桶中。如果 provider 在 `401` 或 `403` 上返回 - 明确的计费文本,OpenClaw 仍然可以把它归入 - 计费通道,但 provider 特定的文本匹配器仍然只作用于它们所属的 - provider(例如 OpenRouter 的 `Key limit exceeded`)。如果某个 `402` - 消息看起来像可重试的用量窗口或 - organization/workspace 花费上限(`daily limit reached, resets tomorrow`、 + 某些看似计费相关的响应并不是 `402`,而某些 HTTP `402` + 响应也仍然会留在那个临时故障桶中。如果提供商在 `401` 或 `403` 上返回 + 明确的计费文本,OpenClaw 仍可将其保留在 + 计费通道中,但提供商专属的文本匹配器仍然限定在 + 拥有它们的提供商范围内(例如 OpenRouter 的 `Key limit exceeded`)。如果某个 `402` + 消息看起来像是可重试的用量窗口或 + 组织/工作区支出限制(`daily limit reached, resets tomorrow`、 `organization spending limit exceeded`),OpenClaw 会将其视为 `rate_limit`,而不是长期计费禁用。 - 上下文溢出错误则不同:如 + 上下文溢出错误则不同:像 `request_too_large`、`input exceeds the maximum number of tokens`、 `input token count exceeds the maximum number of input tokens`、 `input is too long for the model` 或 `ollama error: context length - exceeded` 之类的特征,会留在压缩/重试路径中,而不会推进模型故障转移。 + exceeded` 这样的特征,会保留在压缩/重试路径上,而不是推进模型 + 回退。 - 通用服务器错误文本的范围刻意比“凡是包含 - unknown/error 的都算”更窄。OpenClaw 确实会将 provider 语境下的瞬时形态 - 视为值得故障转移的超时/过载信号,例如 Anthropic 的裸 `An unknown error occurred`、OpenRouter 的裸 + 通用服务器错误文本有意比“任何带 unknown/error 的内容”更窄。OpenClaw 确实会将提供商范围内的临时形态 + 视为值得故障切换的超时/过载信号,例如 Anthropic 的裸 `An unknown error occurred`、OpenRouter 的裸 `Provider returned error`、停止原因错误如 `Unhandled stop reason: - error`、带有瞬时服务器文本的 JSON `api_error` 载荷 + error`、带有临时服务器文本的 JSON `api_error` 负载 (`internal server error`、`unknown error, 520`、`upstream error`、`backend - error`),以及 provider 繁忙错误如 `ModelNotReadyException`——前提是 - provider 上下文匹配。 - 而通用内部回退文本 `LLM request failed with an unknown - error.` 本身则保持保守,不会单独触发模型故障转移。 + error`),以及诸如 `ModelNotReadyException` 之类的提供商繁忙错误——前提是提供商上下文 + 匹配。 + 而像 `LLM request failed with an unknown + error.` 这样的通用内部回退文本则会保持保守,不会单独触发模型回退。 - 这表示系统尝试使用认证配置文件 ID `anthropic:default`,但在预期的认证存储中找不到对应凭据。 + 这意味着系统尝试使用认证配置文件 ID `anthropic:default`,但在预期的认证存储中找不到对应凭证。 - **修复清单:** + **修复检查清单:** - - **确认认证配置文件的位置**(新路径 vs 旧路径) - - 当前路径:`~/.openclaw/agents//agent/auth-profiles.json` - - 旧路径:`~/.openclaw/agent/*`(由 `openclaw doctor` 迁移) + - **确认认证配置文件存放位置**(新路径与旧路径) + - 当前:`~/.openclaw/agents//agent/auth-profiles.json` + - 旧版:`~/.openclaw/agent/*`(由 `openclaw doctor` 迁移) - **确认 Gateway 网关已加载你的环境变量** - - 如果你在 shell 中设置了 `ANTHROPIC_API_KEY`,但 Gateway 网关通过 systemd/launchd 运行,它可能不会继承。请把它放入 `~/.openclaw/.env`,或启用 `env.shellEnv`。 - - **确认你编辑的是正确的智能体** + - 如果你在 shell 中设置了 `ANTHROPIC_API_KEY`,但通过 systemd/launchd 运行 Gateway 网关,它可能不会继承该变量。请将其放到 `~/.openclaw/.env` 中,或启用 `env.shellEnv`。 + - **确保你编辑的是正确的智能体** - 多智能体设置意味着可能存在多个 `auth-profiles.json` 文件。 - - **做一次模型/认证状态检查** - - 使用 `openclaw models status` 查看配置的模型,以及 provider 是否已经认证。 + - **对模型/认证状态做基本检查** + - 使用 `openclaw models status` 查看已配置模型,以及提供商是否已认证。 - **“No credentials found for profile anthropic” 的修复清单** + **针对 “No credentials found for profile anthropic” 的修复检查清单** - 这意味着当前运行被固定到一个 Anthropic 认证配置文件,但 Gateway 网关 - 无法在它的认证存储中找到该配置文件。 + 这意味着当前运行被固定到了一个 Anthropic 认证配置文件,但 Gateway 网关 + 无法在其认证存储中找到它。 - **使用 Claude CLI** - - 在 gateway host 上运行 `openclaw models auth login --provider anthropic --method cli --set-default`。 - - **如果你想改用 API key** - - 将 ` \ No newline at end of file + - 在 Gateway 网关主机上运行 `openclaw models auth login --provider anthropic --method cli --set-default`。 + - **如果你想改用 API 密钥** + - 将 `ANTHROPIC_API_KEY` 放入**Gateway 网关主机**上的 `~/.openclaw/.env`。 + - 清除任何强制使用缺失配置文件的固定顺序: + + ```bash + openclaw models auth order clear --provider anthropic + ``` + + - **确认你是在 Gateway 网关主机上运行命令** + - 在远程模式下,认证配置文件位于 Gateway 网关机器上,而不是你的笔记本电脑上。 + + + + + 如果你的模型配置将 Google Gemini 设为回退项(或你切换到了 Gemini 简写),OpenClaw 就会在模型回退时尝试它。如果你没有配置 Google 凭证,就会看到 `No API key found for provider "google"`。 + + 修复方法:要么提供 Google 认证,要么从 `agents.defaults.model.fallbacks` / 别名中移除或避免使用 Google 模型,这样回退就不会路由到那里。 + + **LLM request rejected: thinking signature required(Google Antigravity)** + + 原因:会话历史中包含**没有签名的 thinking 块**(通常来自 + 中止/部分流式传输)。Google Antigravity 要求 thinking 块带有签名。 + + 修复方法:OpenClaw 现在会为 Google Antigravity Claude 移除未签名的 thinking 块。如果问题仍然出现,请开始一个**新会话**,或为该智能体设置 `/thinking off`。 + + + + +## 认证配置文件:它是什么,以及如何管理 + +相关内容:[/concepts/oauth](/zh-CN/concepts/oauth)(OAuth 流程、令牌存储、多账号模式) + + + + 认证配置文件是与某个提供商绑定的命名凭证记录(OAuth 或 API 密钥)。配置文件存放在: + + ``` + ~/.openclaw/agents//agent/auth-profiles.json + ``` + + + + + OpenClaw 使用带提供商前缀的 ID,例如: + + - `anthropic:default`(当没有邮箱身份时很常见) + - `anthropic:` 用于 OAuth 身份 + - 你自定义的 ID(例如 `anthropic:work`) + + + + + 可以。配置支持配置文件的可选元数据以及按提供商划分的顺序(`auth.order.`)。这**不会**存储密钥;它只是把 ID 映射到提供商/模式,并设置轮换顺序。 + + 如果某个配置文件处于短暂**冷却**状态(速率限制/超时/认证失败)或较长的**禁用**状态(计费/额度不足),OpenClaw 可能会临时跳过它。要检查这一点,请运行 `openclaw models status --json` 并查看 `auth.unusableProfiles`。调优项:`auth.cooldowns.billingBackoffHours*`。 + + 速率限制冷却可以限定到模型范围。一个配置文件如果只对某个模型处于冷却中, + 对同一提供商下的兄弟模型仍可能可用, + 但计费/禁用窗口仍会阻止整个配置文件。 + + 你还可以通过 CLI 设置**按智能体**的顺序覆盖(存储在该智能体的 `auth-state.json` 中): + + ```bash + # 默认为已配置的默认智能体(省略 --agent) + openclaw models auth order get --provider anthropic + + # 将轮换锁定为单个配置文件(只尝试这个) + openclaw models auth order set --provider anthropic anthropic:default + + # 或设置一个显式顺序(提供商内部回退) + openclaw models auth order set --provider anthropic anthropic:work anthropic:default + + # 清除覆盖(回退到配置中的 auth.order / 轮询) + openclaw models auth order clear --provider anthropic + ``` + + 目标指定到某个智能体: + + ```bash + openclaw models auth order set --provider anthropic --agent main anthropic:default + ``` + + 若要验证实际会尝试什么,请使用: + + ```bash + openclaw models status --probe + ``` + + 如果某个已存储的配置文件未包含在显式顺序中,probe 会对该配置文件报告 + `excluded_by_auth_order`,而不是静默尝试它。 + + + + + OpenClaw 两者都支持: + + - **OAuth** 通常会利用订阅访问权限(在适用时)。 + - **API 密钥** 使用按 token 计费。 + + 向导明确支持 Anthropic Claude CLI、OpenAI Codex OAuth 和 API 密钥。 + + + + +## Gateway 网关:端口、“already running”和远程模式 + + + + `gateway.port` 控制单一复用端口,供 WebSocket + HTTP(Control UI、hooks 等)使用。 + + 优先级: + + ``` + --port > OPENCLAW_GATEWAY_PORT > gateway.port > 默认 18789 + ``` + + + + + 因为 “running” 是**监督器**的视角(launchd/systemd/schtasks)。而 RPC probe 是 CLI 实际连接到 Gateway 网关 WebSocket 并调用 `status`。 + + 使用 `openclaw gateway status`,并重点看这些行: + + - `Probe target:`(探测实际使用的 URL) + - `Listening:`(端口上实际绑定的内容) + - `Last gateway error:`(当进程存活但端口未监听时的常见根因) + + + + + 你编辑的是一个配置文件,而服务实际运行的是另一个配置文件(通常是 `--profile` / `OPENCLAW_STATE_DIR` 不匹配)。 + + 修复方法: + + ```bash + openclaw gateway install --force + ``` + + 请在你希望服务使用的同一个 `--profile` / 环境下运行该命令。 + + + + + OpenClaw 会在启动时立即绑定 WebSocket 监听器(默认 `ws://127.0.0.1:18789`),以强制实现运行时锁。如果绑定因 `EADDRINUSE` 失败,就会抛出 `GatewayLockError`,表示已有另一个实例正在监听。 + + 修复方法:停止另一个实例,释放端口,或使用 `openclaw gateway --port ` 运行。 + + + + + 设置 `gateway.mode: "remote"`,并指向远程 WebSocket URL;你也可以选择性地附带共享密钥远程凭证: + + ```json5 + { + gateway: { + mode: "remote", + remote: { + url: "ws://gateway.tailnet:18789", + token: "your-token", + password: "your-password", + }, + }, + } + ``` + + 说明: + + - 只有当 `gateway.mode` 为 `local` 时,`openclaw gateway` 才会启动(或者你显式传入覆盖标志)。 + - macOS 应用会监视配置文件,并在这些值变更时实时切换模式。 + - `gateway.remote.token` / `.password` 只是客户端侧的远程凭证;它们本身不会启用本地 Gateway 网关认证。 + + + + + 你的 Gateway 网关认证路径与 UI 的认证方式不匹配。 + + 事实(来自代码): + + - Control UI 会将令牌保存在当前浏览器标签页会话和所选 Gateway 网关 URL 对应的 `sessionStorage` 中,因此同一标签页刷新后仍可正常工作,而无需恢复长期的 `localStorage` 令牌持久化。 + - 在出现 `AUTH_TOKEN_MISMATCH` 时,受信任客户端可以在 Gateway 网关返回重试提示(`canRetryWithDeviceToken=true`、`recommendedNextStep=retry_with_device_token`)后,使用缓存的设备令牌进行一次有界重试。 + - 该缓存令牌重试现在会复用与设备令牌一起存储的已批准作用域。显式的 `deviceToken` / 显式 `scopes` 调用方仍会保留它们请求的作用域集合,而不是继承缓存作用域。 + - 在该重试路径之外,连接认证优先级依次为:显式共享令牌/密码、显式 `deviceToken`、已存储设备令牌、bootstrap 令牌。 + - Bootstrap 令牌的作用域检查带有角色前缀。内置 bootstrap operator 允许列表只满足 operator 请求;节点或其他非 operator 角色仍需要各自角色前缀下的作用域。 + + 修复方法: + + - 最快方式:`openclaw dashboard`(会打印并复制仪表板 URL,尝试打开;若为无头环境会显示 SSH 提示)。 + - 如果你还没有令牌:`openclaw doctor --generate-gateway-token`。 + - 如果是远程环境,先建立隧道:`ssh -N -L 18789:127.0.0.1:18789 user@host`,然后打开 `http://127.0.0.1:18789/`。 + - 共享密钥模式:设置 `gateway.auth.token` / `OPENCLAW_GATEWAY_TOKEN`,或 `gateway.auth.password` / `OPENCLAW_GATEWAY_PASSWORD`,然后在 Control UI 设置中粘贴匹配的密钥。 + - Tailscale Serve 模式:确保已启用 `gateway.auth.allowTailscale`,并且你打开的是 Serve URL,而不是会绕过 Tailscale 身份标头的原始 loopback/tailnet URL。 + - trusted-proxy 模式:确保你是通过已配置的非 loopback 身份感知代理访问,而不是通过同主机 loopback 代理或原始 Gateway 网关 URL。 + - 如果在那一次重试后仍然不匹配,请轮换/重新批准已配对的设备令牌: + - `openclaw devices list` + - `openclaw devices rotate --device --role operator` + - 如果该 rotate 调用提示被拒绝,请检查两点: + - 已配对设备会话只能轮换**自己的**设备,除非它们还具备 `operator.admin` + - 显式 `--scope` 值不能超过调用方当前的 operator 作用域 + - 如果还是卡住?运行 `openclaw status --all`,并按照 [故障排除](/zh-CN/gateway/troubleshooting) 继续处理。认证详情请参阅 [仪表板](/web/dashboard)。 + + + + + `tailnet` 绑定会从你的网络接口中选择一个 Tailscale IP(100.64.0.0/10)。如果该机器未加入 Tailscale(或接口已断开),就没有可绑定的地址。 + + 修复方法: + + - 在该主机上启动 Tailscale(使其获得一个 100.x 地址),或者 + - 切换到 `gateway.bind: "loopback"` / `"lan"`。 + + 说明:`tailnet` 是显式的。`auto` 会优先选择 loopback;当你希望只绑定到 tailnet 时,请使用 `gateway.bind: "tailnet"`。 + + + + + 通常不需要——一个 Gateway 网关就可以运行多个消息渠道和智能体。只有在你需要冗余(例如救援机器人)或硬隔离时,才使用多个 Gateway 网关。 + + 可以,但你必须隔离以下内容: + + - `OPENCLAW_CONFIG_PATH`(每个实例各自配置) + - `OPENCLAW_STATE_DIR`(每个实例各自状态) + - `agents.defaults.workspace`(工作区隔离) + - `gateway.port`(唯一端口) + + 快速设置(推荐): + + - 每个实例使用 `openclaw --profile ...`(会自动创建 `~/.openclaw-`)。 + - 在每个配置文件中设置唯一的 `gateway.port`(或手动运行时传入 `--port`)。 + - 安装按 profile 区分的服务:`openclaw --profile gateway install`。 + + 配置文件还会给服务名添加后缀(`ai.openclaw.`;旧版为 `com.openclaw.*`、`openclaw-gateway-.service`、`OpenClaw Gateway ()`)。 + 完整指南: [多个 Gateway 网关](/zh-CN/gateway/multiple-gateways)。 + + + + + Gateway 网关是一个**WebSocket 服务器**,它要求收到的第一条消息 + 必须是 `connect` 帧。如果收到其他任何内容,它就会关闭连接, + 并返回 **code 1008**(策略违规)。 + + 常见原因: + + - 你在浏览器中打开了 **HTTP** URL(`http://...`),而不是使用 WS 客户端。 + - 你用了错误的端口或路径。 + - 代理或隧道剥离了认证标头,或发送了非 Gateway 网关请求。 + + 快速修复: + + 1. 使用 WS URL:`ws://:18789`(如果是 HTTPS,则使用 `wss://...`)。 + 2. 不要在普通浏览器标签页中打开 WS 端口。 + 3. 如果启用了认证,请在 `connect` 帧中包含令牌/密码。 + + 如果你使用 CLI 或 TUI,URL 应该如下所示: + + ``` + openclaw tui --url ws://:18789 --token + ``` + + 协议详情: [Gateway 网关协议](/zh-CN/gateway/protocol)。 + + + + +## 日志与调试 + + + + 文件日志(结构化): + + ``` + /tmp/openclaw/openclaw-YYYY-MM-DD.log + ``` + + 你可以通过 `logging.file` 设置固定路径。文件日志级别由 `logging.level` 控制。控制台详细程度由 `--verbose` 和 `logging.consoleLevel` 控制。 + + 查看日志的最快方式: + + ```bash + openclaw logs --follow + ``` + + 服务/监督器日志(当 Gateway 网关通过 launchd/systemd 运行时): + + - macOS:`$OPENCLAW_STATE_DIR/logs/gateway.log` 和 `gateway.err.log`(默认:`~/.openclaw/logs/...`;profile 使用 `~/.openclaw-/logs/...`) + - Linux:`journalctl --user -u openclaw-gateway[-].service -n 200 --no-pager` + - Windows:`schtasks /Query /TN "OpenClaw Gateway ()" /V /FO LIST` + + 更多信息请参阅 [故障排除](/zh-CN/gateway/troubleshooting)。 + + + + + 使用 Gateway 网关辅助命令: + + ```bash + openclaw gateway status + openclaw gateway restart + ``` + + 如果你是手动运行 Gateway 网关,`openclaw gateway --force` 可以夺回端口。请参阅 [Gateway 网关](/zh-CN/gateway)。 + + + + + Windows 有**两种安装模式**: + + **1)WSL2(推荐):**Gateway 网关运行在 Linux 内部。 + + 打开 PowerShell,进入 WSL,然后重启: + + ```powershell + wsl + openclaw gateway status + openclaw gateway restart + ``` + + 如果你从未安装服务,请以前台方式启动它: + + ```bash + openclaw gateway run + ``` + + **2)原生 Windows(不推荐):**Gateway 网关直接运行在 Windows 中。 + + 打开 PowerShell 并运行: + + ```powershell + openclaw gateway status + openclaw gateway restart + ``` + + 如果你是手动运行它(没有服务),请使用: + + ```powershell + openclaw gateway run + ``` + + 文档: [Windows(WSL2)](/zh-CN/platforms/windows)、[Gateway 网关服务运行手册](/zh-CN/gateway)。 + + + + + 先做一次快速健康检查: + + ```bash + openclaw status + openclaw models status + openclaw channels status + openclaw logs --follow + ``` + + 常见原因: + + - Gateway 网关主机上的模型认证未加载(检查 `models status`)。 + - 渠道配对/允许列表阻止了回复(检查渠道配置 + 日志)。 + - WebChat/仪表板已打开,但没有使用正确令牌。 + + 如果你是远程环境,请确认隧道/Tailscale 连接正常,并且 + Gateway 网关 WebSocket 可达。 + + 文档: [渠道](/zh-CN/channels)、[故障排除](/zh-CN/gateway/troubleshooting)、[远程访问](/zh-CN/gateway/remote)。 + + + + + 这通常意味着 UI 丢失了 WebSocket 连接。请检查: + + 1. Gateway 网关正在运行吗?`openclaw gateway status` + 2. Gateway 网关健康吗?`openclaw status` + 3. UI 是否使用了正确令牌?`openclaw dashboard` + 4. 如果是远程环境,隧道/Tailscale 链路是否正常? + + 然后查看日志: + + ```bash + openclaw logs --follow + ``` + + 文档: [仪表板](/web/dashboard)、[远程访问](/zh-CN/gateway/remote)、[故障排除](/zh-CN/gateway/troubleshooting)。 + + + + + 先从日志和渠道状态开始: + + ```bash + openclaw channels status + openclaw channels logs --channel telegram + ``` + + 然后对照错误: + + - `BOT_COMMANDS_TOO_MUCH`:Telegram 菜单项太多。OpenClaw 已经会裁剪到 Telegram 限制并用更少命令重试,但某些菜单项仍需删除。请减少插件/Skill/自定义命令,或在你不需要菜单时禁用 `channels.telegram.commands.native`。 + - `TypeError: fetch failed`、`Network request for 'setMyCommands' failed!` 或类似网络错误:如果你在 VPS 上或通过代理运行,请确认允许对 `api.telegram.org` 的出站 HTTPS 访问,并且 DNS 正常工作。 + + 如果 Gateway 网关是远程的,请确保你查看的是 Gateway 网关主机上的日志。 + + 文档: [Telegram](/zh-CN/channels/telegram)、[渠道故障排除](/zh-CN/channels/troubleshooting)。 + + + + + 先确认 Gateway 网关可达,并且智能体可以运行: + + ```bash + openclaw status + openclaw models status + openclaw logs --follow + ``` + + 在 TUI 中,使用 `/status` 查看当前状态。如果你期望回复发送到某个聊天 + 渠道,请确保已启用投递(`/deliver on`)。 + + 文档: [TUI](/web/tui)、[斜杠命令](/zh-CN/tools/slash-commands)。 + + + + + 如果你已安装服务: + + ```bash + openclaw gateway stop + openclaw gateway start + ``` + + 这会停止/启动**受监督服务**(macOS 上是 launchd,Linux 上是 systemd)。 + 当 Gateway 网关作为后台守护进程运行时,请使用这种方式。 + + 如果你是在前台运行,请用 Ctrl-C 停止,然后执行: + + ```bash + openclaw gateway run + ``` + + 文档: [Gateway 网关服务运行手册](/zh-CN/gateway)。 + + + + + - `openclaw gateway restart`:重启**后台服务**(launchd/systemd)。 + - `openclaw gateway`:在当前终端会话中**前台**运行 Gateway 网关。 + + 如果你安装了服务,请使用 gateway 命令。只有在 + 你想进行一次性的前台运行时,才使用 `openclaw gateway`。 + + + + + 用 `--verbose` 启动 Gateway 网关,以获得更多控制台细节。然后检查日志文件,查看渠道认证、模型路由和 RPC 错误。 + + + +## 媒体和附件 + + + + 来自智能体的出站附件必须包含一行 `MEDIA:`(单独占一行)。请参阅 [OpenClaw 助手设置](/zh-CN/start/openclaw) 和 [智能体发送](/zh-CN/tools/agent-send)。 + + CLI 发送方式: + + ```bash + openclaw message send --target +15555550123 --message "Here you go" --media /path/to/file.png + ``` + + 还要检查: + + - 目标渠道支持出站媒体,并且未被允许列表阻止。 + - 文件未超过提供商的大小限制(图片会被缩放到最大 2048px)。 + - `tools.fs.workspaceOnly=true` 会将本地路径发送限制在工作区、temp/media-store 和经沙箱验证的文件内。 + - `tools.fs.workspaceOnly=false` 允许 `MEDIA:` 发送智能体已经可以读取的主机本地文件,但仅限媒体和安全文档类型(图片、音频、视频、PDF 和 Office 文档)。纯文本和类似密钥的文件仍会被阻止。 + + 请参阅 [图片](/zh-CN/nodes/images)。 + + + + +## 安全性和访问控制 + + + + 请将入站私信视为不可信输入。默认行为的设计目标就是降低风险: + + - 支持私信的渠道默认行为是**配对**: + - 未知发送者会收到一个配对码;机器人不会处理他们的消息。 + - 使用以下命令批准:`openclaw pairing approve --channel [--account ] ` + - 每个渠道的待处理请求上限为 **3 个**;如果没有收到配对码,请检查 `openclaw pairing list --channel [--account ]`。 + - 公开开放私信需要显式选择加入(`dmPolicy: "open"` 且允许列表为 `"*"`)。 + + 运行 `openclaw doctor` 可以发现存在风险的私信策略。 + + + + + 不是。提示注入关乎的是**不可信内容**,而不只是“谁可以给机器人发私信”。 + 如果你的助手会读取外部内容(Web 搜索/抓取、浏览器页面、电子邮件、 + 文档、附件、粘贴的日志),这些内容就可能包含试图 + 劫持模型的指令。即使**你是唯一发送者**,这种情况也会发生。 + + 最大的风险来自启用了工具时:模型可能被诱导去 + 泄露上下文,或代表你调用工具。降低影响范围的方法包括: + + - 使用只读或禁用工具的“阅读器”智能体来总结不可信内容 + - 对启用了工具的智能体关闭 `web_search` / `web_fetch` / `browser` + - 将解码后的文件/文档文本也视为不可信:OpenResponses + `input_file` 和媒体附件提取都会将提取文本包装在 + 明确的外部内容边界标记中,而不是直接传递原始文件文本 + - 使用沙箱隔离和严格的工具允许列表 + + 详情: [安全性](/zh-CN/gateway/security)。 + + + + + 对于大多数设置来说,是的。通过独立的账号和电话号码隔离机器人, + 可以在出问题时降低影响范围。这也会让你更容易轮换 + 凭证或撤销访问,而不会影响你的个人账号。 + + 从小范围开始。只授予真正需要的工具和账号访问权限, + 如果后续有需要再逐步扩展。 + + 文档: [安全性](/zh-CN/gateway/security)、[配对](/zh-CN/channels/pairing)。 + + + + + 我们**不建议**让它对你的个人消息拥有完全自主权。最安全的模式是: + + - 让私信保持在**配对模式**或严格允许列表模式下。 + - 如果你希望它代表你发消息,请使用**单独的号码或账号**。 + - 让它先起草,然后**在发送前审批**。 + + 如果你想尝试,请在专用账号上进行,并保持隔离。请参阅 + [安全性](/zh-CN/gateway/security)。 + + + + + 可以,**前提是**该智能体仅用于聊天,且输入是可信的。更小档位的模型 + 更容易受到指令劫持影响,因此对于启用了工具的智能体 + 或需要读取不可信内容的场景,不建议使用。如果你必须使用更小的模型,请锁定 + 工具,并在沙箱中运行。请参阅 [安全性](/zh-CN/gateway/security)。 + + + + 只有当未知发送者给机器人发消息,并且 + 启用了 `dmPolicy: "pairing"` 时,才会发送配对码。单独执行 `/start` 不会生成配对码。 + + 检查待处理请求: + + ```bash + openclaw pairing list telegram + ``` + + 如果你想立即获得访问权限,请将你的发送者 id 加入允许列表,或为该账号设置 `dmPolicy: "open"`。 + + + + + 不会。WhatsApp 默认私信策略是**配对**。未知发送者只会收到一个配对码,而且他们的消息**不会被处理**。OpenClaw 只会回复它收到的聊天,或你显式触发的发送。 + + 使用以下命令批准配对: + + ```bash + openclaw pairing approve whatsapp + ``` + + 列出待处理请求: + + ```bash + openclaw pairing list whatsapp + ``` + + 向导中的电话号码提示:它用于设置你的**允许列表/所有者**,从而允许你自己的私信。它不会用于自动发送。如果你使用的是自己的个人 WhatsApp 号码,请使用该号码,并启用 `channels.whatsapp.selfChatMode`。 + + + + +## 聊天命令、终止任务,以及“它就是不停下来” + + + + 大多数内部消息或工具消息只会在该会话启用了 **verbose**、**trace** 或 **reasoning** 时显示。 + + 在出现问题的聊天中这样修复: + + ``` + /verbose off + /trace off + /reasoning off + ``` + + 如果仍然很吵,请检查 Control UI 中的会话设置,并将 verbose + 设为 **inherit**。同时确认你没有使用配置中将 `verboseDefault` 设为 + `on` 的机器人配置文件。 + + 文档: [思考与 verbose](/zh-CN/tools/thinking)、[安全性](/zh-CN/gateway/security#reasoning-verbose-output-in-groups)。 + + + + + 将以下任一内容**作为独立消息发送**(不带斜杠): + + ``` + stop + stop action + stop current action + stop run + stop current run + stop agent + stop the agent + stop openclaw + openclaw stop + stop don't do anything + stop do not do anything + stop doing anything + please stop + stop please + abort + esc + wait + exit + interrupt + ``` + + 这些是中止触发词(不是斜杠命令)。 + + 对于后台进程(来自 exec 工具),你可以让智能体运行: + + ``` + process action:kill sessionId:XXX + ``` + + 斜杠命令概览:请参阅 [斜杠命令](/zh-CN/tools/slash-commands)。 + + 大多数命令都必须作为**以 `/` 开头的独立消息**发送,但少数快捷方式(如 `/status`)对于在允许列表中的发送者也支持内联使用。 + + + + + OpenClaw 默认会阻止**跨提供商**消息发送。如果某次工具调用绑定到了 + Telegram,除非你显式允许,否则它不会发送到 Discord。 + + 为该智能体启用跨提供商消息发送: + + ```json5 + { + tools: { + message: { + crossContext: { + allowAcrossProviders: true, + marker: { enabled: true, prefix: "[from {channel}] " }, + }, + }, + }, + } + ``` + + 编辑配置后重启 Gateway 网关。 + + + + + 队列模式决定了新消息如何与正在运行中的任务交互。使用 `/queue` 切换模式: + + - `steer` - 新消息会重定向当前任务 + - `followup` - 消息按顺序一个个执行 + - `collect` - 批量收集消息后统一回复(默认) + - `steer-backlog` - 先重定向当前任务,再处理积压消息 + - `interrupt` - 中止当前运行并重新开始 + + 你还可以添加选项,例如 `debounce:2s cap:25 drop:summarize`,用于 followup 模式。 + + + + +## 杂项 + + + + 在 OpenClaw 中,凭证和模型选择是分开的。设置 `ANTHROPIC_API_KEY`(或在认证配置文件中存储 Anthropic API 密钥)会启用认证,但实际默认模型取决于你在 `agents.defaults.model.primary` 中的配置(例如 `anthropic/claude-sonnet-4-6` 或 `anthropic/claude-opus-4-6`)。如果你看到 `No credentials found for profile "anthropic:default"`,这意味着 Gateway 网关无法在当前运行智能体所对应的 `auth-profiles.json` 中找到 Anthropic 凭证。 + + + +--- + +还是卡住了?请到 [Discord](https://discord.com/invite/clawd) 提问,或发起一个 [GitHub discussion](https://github.com/openclaw/openclaw/discussions)。 diff --git a/docs/zh-CN/tools/slash-commands.md b/docs/zh-CN/tools/slash-commands.md index cf3f82d9d..b508257a7 100644 --- a/docs/zh-CN/tools/slash-commands.md +++ b/docs/zh-CN/tools/slash-commands.md @@ -5,31 +5,32 @@ read_when: summary: 斜杠命令:文本与原生、配置,以及支持的命令 title: 斜杠命令 x-i18n: - generated_at: "2026-04-10T21:20:39Z" + generated_at: "2026-04-12T18:22:04Z" model: gpt-5.4 provider: openai - source_hash: 2cc346361c3b1a63aae9ec0f28706f4cb0b866b6c858a3999101f6927b923b4a + source_hash: 9ef6f54500fa2ce3b873a8398d6179a0882b8bf6fba38f61146c64671055505e source_path: tools/slash-commands.md workflow: 15 --- # 斜杠命令 -命令由 Gateway 网关处理。大多数命令必须作为以 `/` 开头的**独立**消息发送。 -仅限主机的 bash 聊天命令使用 `! `(`/bash ` 是其别名)。 +命令由 Gateway 网关处理。大多数命令必须作为**独立**消息发送,并且以 `/` 开头。 +仅主机可用的 bash 聊天命令使用 `! `(`/bash ` 是它的别名)。 这里有两个相关系统: - **命令**:独立的 `/...` 消息。 -- **指令**:`/think`、`/fast`、`/verbose`、`/reasoning`、`/elevated`、`/exec`、`/model`、`/queue`。 - - 指令会在模型看到消息之前被剥离。 - - 在普通聊天消息中(不是仅包含指令的消息),它们会被视为“内联提示”,**不会**持久化会话设置。 - - 在仅包含指令的消息中(消息只包含指令),它们会持久化到会话,并回复一条确认信息。 - - 指令只会对**已授权的发送者**生效。如果设置了 `commands.allowFrom`,它就是唯一使用的允许列表;否则授权来源于渠道允许列表/配对以及 `commands.useAccessGroups`。 - 未授权的发送者会看到指令被当作普通文本处理。 +- **指令**:`/think`、`/fast`、`/verbose`、`/trace`、`/reasoning`、`/elevated`、`/exec`、`/model`、`/queue`。 + - 在模型看到消息之前,指令会从消息中剥离。 + - 在普通聊天消息中(不是纯指令消息),它们会被当作“内联提示”,并且**不会**持久化为会话设置。 + - 在纯指令消息中(消息只包含指令),它们会持久化到会话,并回复一条确认信息。 + - 指令仅对**已授权的发送者**生效。如果设置了 `commands.allowFrom`,它就是唯一使用的 + 允许列表;否则,授权来源于渠道允许列表/配对以及 `commands.useAccessGroups`。 + 未授权的发送者会看到这些指令被当作普通文本处理。 -还有一些**内联快捷方式**(仅限允许列表/已授权发送者):`/help`、`/commands`、`/status`、`/whoami`(`/id`)。 -它们会立即运行,在模型看到消息前被剥离,剩余文本会继续走正常流程。 +还有一些**内联快捷命令**(仅限已列入允许列表/已授权的发送者):`/help`、`/commands`、`/status`、`/whoami`(`/id`)。 +它们会立即运行,在模型看到消息之前被剥离,其余文本则继续按正常流程处理。 ## 配置 @@ -61,23 +62,24 @@ x-i18n: - `commands.text`(默认 `true`)启用在聊天消息中解析 `/...`。 - 在没有原生命令的界面上(WhatsApp/WebChat/Signal/iMessage/Google Chat/Microsoft Teams),即使你将其设为 `false`,文本命令仍然可用。 - `commands.native`(默认 `"auto"`)注册原生命令。 - - Auto:对 Discord/Telegram 开启;对 Slack 关闭(直到你添加 slash commands);对不支持原生能力的提供商忽略。 + - 自动:对 Discord/Telegram 开启;对 Slack 关闭(直到你添加斜杠命令);对于不支持原生命令的提供商则忽略。 - 设置 `channels.discord.commands.native`、`channels.telegram.commands.native` 或 `channels.slack.commands.native` 可按提供商覆盖(布尔值或 `"auto"`)。 - - `false` 会在启动时清除之前在 Discord/Telegram 上注册的命令。Slack 命令由 Slack 应用管理,不会被自动移除。 + - `false` 会在启动时清除之前在 Discord/Telegram 上注册的命令。Slack 命令由 Slack 应用管理,不会自动移除。 - `commands.nativeSkills`(默认 `"auto"`)在支持时以原生方式注册 **skill** 命令。 - - Auto:对 Discord/Telegram 开启;对 Slack 关闭(Slack 需要为每个 skill 创建一个 slash command)。 + - 自动:对 Discord/Telegram 开启;对 Slack 关闭(Slack 需要为每个 skill 创建一个斜杠命令)。 - 设置 `channels.discord.commands.nativeSkills`、`channels.telegram.commands.nativeSkills` 或 `channels.slack.commands.nativeSkills` 可按提供商覆盖(布尔值或 `"auto"`)。 - `commands.bash`(默认 `false`)启用 `! ` 以运行主机 shell 命令(`/bash ` 是别名;需要 `tools.elevated` 允许列表)。 - `commands.bashForegroundMs`(默认 `2000`)控制 bash 在切换到后台模式前等待多久(`0` 表示立即转入后台)。 - `commands.config`(默认 `false`)启用 `/config`(读取/写入 `openclaw.json`)。 -- `commands.mcp`(默认 `false`)启用 `/mcp`(读取/写入 `mcp.servers` 下由 OpenClaw 管理的 MCP 配置)。 +- `commands.mcp`(默认 `false`)启用 `/mcp`(读取/写入 OpenClaw 管理的 `mcp.servers` 下的 MCP 配置)。 - `commands.plugins`(默认 `false`)启用 `/plugins`(插件发现/状态,以及安装 + 启用/禁用控制)。 - `commands.debug`(默认 `false`)启用 `/debug`(仅运行时覆盖)。 - `commands.restart`(默认 `true`)启用 `/restart` 以及 Gateway 网关重启工具操作。 - `commands.ownerAllowFrom`(可选)为仅限所有者的命令/工具界面设置显式所有者允许列表。这与 `commands.allowFrom` 分开。 - `commands.ownerDisplay` 控制系统提示中所有者 id 的显示方式:`raw` 或 `hash`。 -- `commands.ownerDisplaySecret` 可选设置在 `commands.ownerDisplay="hash"` 时使用的 HMAC 密钥。 -- `commands.allowFrom`(可选)为命令授权设置按提供商划分的允许列表。配置后,它会成为命令和指令的唯一授权来源(渠道允许列表/配对和 `commands.useAccessGroups` 会被忽略)。使用 `"*"` 作为全局默认值;提供商特定键会覆盖它。 +- `commands.ownerDisplaySecret` 可选地设置当 `commands.ownerDisplay="hash"` 时使用的 HMAC 密钥。 +- `commands.allowFrom`(可选)为命令授权设置按提供商划分的允许列表。配置后,它将成为命令和指令的 + 唯一授权来源(渠道允许列表/配对以及 `commands.useAccessGroups` 会被忽略)。使用 `"*"` 作为全局默认值;提供商专用键会覆盖它。 - `commands.useAccessGroups`(默认 `true`)在未设置 `commands.allowFrom` 时,对命令强制执行允许列表/策略。 ## 命令列表 @@ -93,50 +95,51 @@ x-i18n: 当前可用的内置命令: -- `/new [model]` 启动一个新会话;`/reset` 是重置别名。 +- `/new [model]` 启动新会话;`/reset` 是重置别名。 - `/compact [instructions]` 压缩会话上下文。参见 [/concepts/compaction](/zh-CN/concepts/compaction)。 - `/stop` 中止当前运行。 - `/session idle ` 和 `/session max-age ` 管理线程绑定过期时间。 - `/think ` 设置思考级别。别名:`/thinking`、`/t`。 - `/verbose on|off|full` 切换详细输出。别名:`/v`。 +- `/trace on|off` 为当前会话切换插件追踪输出。 - `/fast [status|on|off]` 显示或设置快速模式。 - `/reasoning [on|off|stream]` 切换推理可见性。别名:`/reason`。 - `/elevated [on|off|ask|full]` 切换提升模式。别名:`/elev`。 - `/exec host= security= ask= node=` 显示或设置 exec 默认值。 - `/model [name|#|status]` 显示或设置模型。 - `/models [provider] [page] [limit=|size=|all]` 列出提供商,或列出某个提供商的模型。 -- `/queue ` 管理队列行为(`steer`、`interrupt`、`followup`、`collect`、`steer-backlog`),以及如 `debounce:2s cap:25 drop:summarize` 等选项。 -- `/help` 显示简短帮助摘要。 +- `/queue ` 管理队列行为(`steer`、`interrupt`、`followup`、`collect`、`steer-backlog`),以及 `debounce:2s cap:25 drop:summarize` 之类的选项。 +- `/help` 显示简要帮助摘要。 - `/commands` 显示生成的命令目录。 -- `/tools [compact|verbose]` 显示当前智能体此刻可用的内容。 +- `/tools [compact|verbose]` 显示当前智能体此刻可以使用的内容。 - `/status` 显示运行时状态,包括可用时的提供商使用量/配额。 -- `/tasks` 列出当前会话的活跃/最近后台任务。 +- `/tasks` 列出当前会话中活跃/最近的后台任务。 - `/context [list|detail|json]` 说明上下文是如何组装的。 - `/export-session [path]` 将当前会话导出为 HTML。别名:`/export`。 - `/whoami` 显示你的发送者 id。别名:`/id`。 - `/skill [input]` 按名称运行一个 skill。 - `/allowlist [list|add|remove] ...` 管理允许列表条目。仅文本。 - `/approve ` 处理 exec 审批提示。 -- `/btw ` 提一个侧边问题,而不改变未来会话上下文。参见 [/tools/btw](/zh-CN/tools/btw)。 +- `/btw ` 在不改变未来会话上下文的情况下提出一个旁支问题。参见 [/tools/btw](/zh-CN/tools/btw)。 - `/subagents list|kill|log|info|send|steer|spawn` 管理当前会话的子智能体运行。 - `/acp spawn|cancel|steer|close|sessions|status|set-mode|set|cwd|permissions|timeout|model|reset-options|doctor|install|help` 管理 ACP 会话和运行时选项。 - `/focus ` 将当前 Discord 线程或 Telegram 话题/会话绑定到一个会话目标。 - `/unfocus` 移除当前绑定。 -- `/agents` 列出当前会话中线程绑定的智能体。 -- `/kill ` 中止一个或全部正在运行的子智能体。 +- `/agents` 列出当前会话中绑定到线程的智能体。 +- `/kill ` 中止一个或所有正在运行的子智能体。 - `/steer ` 向正在运行的子智能体发送引导。别名:`/tell`。 -- `/config show|get|set|unset` 读取或写入 `openclaw.json`。仅限所有者。需要 `commands.config: true`。 -- `/mcp show|get|set|unset` 读取或写入 `mcp.servers` 下由 OpenClaw 管理的 MCP 服务器配置。仅限所有者。需要 `commands.mcp: true`。 +- `/config show|get|set|unset` 读取或写入 `openclaw.json`。仅所有者。需要 `commands.config: true`。 +- `/mcp show|get|set|unset` 读取或写入 OpenClaw 管理的 `mcp.servers` 下的 MCP 服务器配置。仅所有者。需要 `commands.mcp: true`。 - `/plugins list|inspect|show|get|install|enable|disable` 检查或修改插件状态。`/plugin` 是别名。写操作仅限所有者。需要 `commands.plugins: true`。 -- `/debug show|set|unset|reset` 管理仅运行时配置覆盖。仅限所有者。需要 `commands.debug: true`。 -- `/usage off|tokens|full|cost` 控制每次响应的使用量页脚,或打印本地成本摘要。 +- `/debug show|set|unset|reset` 管理仅运行时配置覆盖。仅所有者。需要 `commands.debug: true`。 +- `/usage off|tokens|full|cost` 控制每次响应的使用量页脚,或输出本地成本摘要。 - `/tts on|off|status|provider|limit|summary|audio|help` 控制 TTS。参见 [/tools/tts](/zh-CN/tools/tts)。 -- `/restart` 在启用时重启 OpenClaw。默认:启用;设置 `commands.restart: false` 可禁用。 +- `/restart` 在启用时重启 OpenClaw。默认:启用;设置 `commands.restart: false` 可禁用它。 - `/activation mention|always` 设置群组激活模式。 -- `/send on|off|inherit` 设置发送策略。仅限所有者。 -- `/bash ` 运行主机 shell 命令。仅文本。别名:`! `。需要 `commands.bash: true`,并且需要 `tools.elevated` 允许列表。 -- `!poll [sessionId]` 检查一个后台 bash 作业。 -- `!stop [sessionId]` 停止一个后台 bash 作业。 +- `/send on|off|inherit` 设置发送策略。仅所有者。 +- `/bash ` 运行主机 shell 命令。仅文本。别名:`! `。需要 `commands.bash: true` 以及 `tools.elevated` 允许列表。 +- `!poll [sessionId]` 检查后台 bash 作业。 +- `!stop [sessionId]` 停止后台 bash 作业。 ### 生成的 dock 命令 @@ -151,13 +154,13 @@ Dock 命令由支持原生命令的渠道插件生成。当前内置集合: 内置插件可以添加更多斜杠命令。此仓库中当前的内置命令: -- `/dreaming [on|off|status|help]` 切换记忆 dreaming。参见 [Dreaming](/zh-CN/concepts/dreaming)。 +- `/dreaming [on|off|status|help]` 切换 memory dreaming。参见 [Dreaming](/zh-CN/concepts/dreaming)。 - `/pair [qr|status|pending|approve|cleanup|notify]` 管理设备配对/设置流程。参见 [Pairing](/zh-CN/channels/pairing)。 - `/phone status|arm [duration]|disarm` 临时启用高风险手机节点命令。 - `/voice status|list [limit]|set ` 管理 Talk 语音配置。在 Discord 上,原生命令名称是 `/talkvoice`。 - `/card ...` 发送 LINE 富卡片预设。参见 [LINE](/zh-CN/channels/line)。 -- `/codex status|models|threads|resume|compact|review|account|mcp|skills` 检查并控制内置 Codex app-server harness。参见 [Codex Harness](/zh-CN/plugins/codex-harness)。 -- 仅限 QQ Bot 的命令: +- `/codex status|models|threads|resume|compact|review|account|mcp|skills` 检查并控制内置的 Codex 应用服务器 harness。参见 [Codex Harness](/zh-CN/plugins/codex-harness)。 +- 仅 QQ Bot 命令: - `/bot-ping` - `/bot-version` - `/bot-help` @@ -166,66 +169,71 @@ Dock 命令由支持原生命令的渠道插件生成。当前内置集合: ### 动态 skill 命令 -用户可调用的 Skills 也会作为斜杠命令暴露: +用户可调用的 Skills 也会作为斜杠命令公开: -- `/skill [input]` 始终可用,作为通用入口点。 -- 当 skill/插件注册它们时,Skills 也可能作为直接命令出现,例如 `/prose`。 +- `/skill [input]` 始终可作为通用入口点使用。 +- 当 skill/插件注册它们时,skills 也可能显示为直接命令,例如 `/prose`。 - 原生 skill 命令注册由 `commands.nativeSkills` 和 `channels..commands.nativeSkills` 控制。 -说明: +注意: -- 命令支持在命令与参数之间可选添加 `:`(例如 `/think: high`、`/send: on`、`/help:`)。 -- `/new ` 接受模型别名、`provider/model` 或提供商名称(模糊匹配);如果没有匹配项,该文本会被视为消息正文。 -- 如需完整的提供商使用量明细,请使用 `openclaw status --usage`。 -- `/allowlist add|remove` 需要 `commands.config=true`,并遵循渠道 `configWrites`。 +- 命令支持在命令与参数之间可选使用 `:`(例如 `/think: high`、`/send: on`、`/help:`)。 +- `/new ` 接受模型别名、`provider/model` 或提供商名称(模糊匹配);如果没有匹配,文本会被视为消息正文。 +- 要查看完整的提供商使用量细分,请使用 `openclaw status --usage`。 +- `/allowlist add|remove` 需要 `commands.config=true`,并遵循渠道的 `configWrites`。 - 在多账号渠道中,面向配置目标的 `/allowlist --account ` 和 `/config set channels..accounts....` 也会遵循目标账号的 `configWrites`。 - `/usage` 控制每次响应的使用量页脚;`/usage cost` 会根据 OpenClaw 会话日志输出本地成本摘要。 -- `/restart` 默认启用;设置 `commands.restart: false` 可禁用。 -- `/plugins install ` 接受与 `openclaw plugins install` 相同的插件规格:本地路径/压缩包、npm 包,或 `clawhub:`。 +- `/restart` 默认启用;设置 `commands.restart: false` 可禁用它。 +- `/plugins install ` 接受与 `openclaw plugins install` 相同的插件规格:本地路径/归档、npm 包或 `clawhub:`。 - `/plugins enable|disable` 会更新插件配置,并且可能提示你重启。 -- 仅限 Discord 的原生命令:`/vc join|leave|status` 用于控制语音频道(需要 `channels.discord.voice` 和原生命令;不提供文本形式)。 +- 仅 Discord 原生命令:`/vc join|leave|status` 用于控制语音频道(需要 `channels.discord.voice` 和原生命令;不提供文本形式)。 - Discord 线程绑定命令(`/focus`、`/unfocus`、`/agents`、`/session idle`、`/session max-age`)要求有效启用线程绑定(`session.threadBindings.enabled` 和/或 `channels.discord.threadBindings.enabled`)。 - ACP 命令参考和运行时行为: [ACP Agents](/zh-CN/tools/acp-agents)。 -- `/verbose` 用于调试和额外可见性;在正常使用中请保持其为**关闭**。 -- `/fast on|off` 会持久化一个会话级覆盖。使用 Sessions UI 的 `inherit` 选项可清除它,并回退到配置默认值。 -- `/fast` 具有提供商特异性:OpenAI/OpenAI Codex 会在原生 Responses 端点上将其映射为 `service_tier=priority`,而直接发送到 `api.anthropic.com` 的公开 Anthropic 请求(包括使用 OAuth 身份验证的流量)会将其映射为 `service_tier=auto` 或 `standard_only`。参见 [OpenAI](/zh-CN/providers/openai) 和 [Anthropic](/zh-CN/providers/anthropic)。 -- 工具失败摘要在相关时仍会显示,但详细失败文本仅在 `/verbose` 为 `on` 或 `full` 时才会包含。 -- `/reasoning`(以及 `/verbose`)在群组环境中存在风险:它们可能暴露你原本不打算公开的内部推理或工具输出。建议保持关闭,尤其是在群聊中。 +- `/verbose` 主要用于调试和额外可见性;正常使用时请保持**关闭**。 +- `/trace` 比 `/verbose` 更窄:它只显示插件自有的追踪/调试行,并保持普通的详细工具输出关闭。 +- `/fast on|off` 会持久化一个会话覆盖。使用 Sessions UI 的 `inherit` 选项可清除它,并回退到配置默认值。 +- `/fast` 是提供商相关的:OpenAI/OpenAI Codex 会在原生 Responses 端点上将其映射为 `service_tier=priority`,而直接发送到 `api.anthropic.com` 的公开 Anthropic 请求(包括通过 OAuth 认证的流量)会将其映射为 `service_tier=auto` 或 `standard_only`。参见 [OpenAI](/zh-CN/providers/openai) 和 [Anthropic](/zh-CN/providers/anthropic)。 +- 相关时仍会显示工具失败摘要,但详细失败文本仅在 `/verbose` 为 `on` 或 `full` 时包含。 +- `/reasoning`、`/verbose` 和 `/trace` 在群组环境中存在风险:它们可能暴露你原本无意公开的内部推理、工具输出或插件诊断信息。建议保持关闭,尤其是在群聊中。 - `/model` 会立即持久化新的会话模型。 -- 如果智能体处于空闲状态,下一次运行会立即使用它。 -- 如果已有运行处于活跃状态,OpenClaw 会将实时切换标记为待处理,并且只会在一个干净的重试点重启到新模型。 -- 如果工具活动或回复输出已经开始,待处理切换可能会保持排队状态,直到后续重试机会或下一次用户回合。 -- **快速路径:** 来自允许列表发送者的纯命令消息会被立即处理(绕过队列 + 模型)。 +- 如果智能体空闲,下一次运行会立即使用它。 +- 如果某次运行已经处于活动状态,OpenClaw 会将实时切换标记为待处理,并且只会在一个干净的重试点重启到新模型。 +- 如果工具活动或回复输出已经开始,待处理切换可能会一直排队到之后的重试机会,或直到用户下一轮输入。 +- **快速路径:** 来自允许列表发送者的纯命令消息会立即处理(绕过队列 + 模型)。 - **群组提及门控:** 来自允许列表发送者的纯命令消息会绕过提及要求。 -- **内联快捷方式(仅限允许列表发送者):** 某些命令在嵌入普通消息时也可生效,并会在模型看到剩余文本前被剥离。 - - 示例:`hey /status` 会触发状态回复,剩余文本继续走正常流程。 +- **内联快捷命令(仅限允许列表发送者):** 某些命令嵌入普通消息中时也可生效,并且会在模型看到其余文本之前被剥离。 + - 示例:`hey /status` 会触发一条状态回复,其余文本则继续按正常流程处理。 - 当前包括:`/help`、`/commands`、`/status`、`/whoami`(`/id`)。 -- 未授权的纯命令消息会被静默忽略,而内联 `/...` 标记会被视为普通文本。 -- **skill 命令:** `user-invocable` 的 Skills 也会作为斜杠命令暴露。名称会被清洗为 `a-z0-9_`(最多 32 个字符);冲突时会添加数字后缀(例如 `_2`)。 - - `/skill [input]` 按名称运行一个 skill(当原生命令限制阻止为每个 skill 创建单独命令时,这很有用)。 +- 未授权的纯命令消息会被静默忽略,而内联 `/...` 标记会被当作普通文本处理。 +- **skill 命令:** `user-invocable` Skills 会公开为斜杠命令。名称会被规范化为 `a-z0-9_`(最长 32 个字符);冲突时会附加数字后缀(例如 `_2`)。 + - `/skill [input]` 按名称运行一个 skill(当原生命令限制阻止按 skill 单独创建命令时,这很有用)。 - 默认情况下,skill 命令会作为普通请求转发给模型。 - - Skills 可选择声明 `command-dispatch: tool`,以将命令直接路由到工具(确定性,无需模型)。 + - Skills 可以选择声明 `command-dispatch: tool`,将命令直接路由到某个工具(确定性、无模型)。 - 示例:`/prose`(OpenProse 插件)——参见 [OpenProse](/zh-CN/prose)。 -- **原生命令参数:** Discord 对动态选项使用自动补全(当你省略必需参数时,也会使用按钮菜单)。Telegram 和 Slack 会在命令支持选项且你省略参数时显示按钮菜单。 +- **原生命令参数:** Discord 对动态选项使用自动补全(省略必填参数时也会显示按钮菜单)。Telegram 和 Slack 在某个命令支持选项且你省略该参数时,会显示按钮菜单。 ## `/tools` -`/tools` 回答的是一个运行时问题,而不是一个配置问题:**这个智能体现在在这段对话中可以使用什么**。 +`/tools` 回答的是一个运行时问题,而不是配置问题:**这个智能体现在在 +这个会话中能使用什么**。 -- 默认的 `/tools` 是紧凑模式,并针对快速浏览进行了优化。 +- 默认的 `/tools` 是紧凑模式,针对快速浏览进行了优化。 - `/tools verbose` 会添加简短说明。 -- 支持参数的原生命令界面也会暴露相同的模式切换:`compact|verbose`。 -- 结果是作用于会话范围的,因此更改智能体、渠道、线程、发送者授权或模型,都可能改变输出。 -- `/tools` 包括在运行时实际可达的工具,包括核心工具、已连接的插件工具和渠道自有工具。 +- 支持参数的原生命令界面会公开相同的模式切换,即 `compact|verbose`。 +- 结果是按会话范围限定的,因此更换智能体、渠道、线程、发送者授权或模型都可能 + 改变输出。 +- `/tools` 包含在运行时实际可达的工具,包括核心工具、已连接的 + 插件工具,以及渠道自有工具。 -如需编辑 profile 和 override,请使用 Control UI Tools 面板或配置/目录界面,而不要把 `/tools` 当作静态目录。 +如需编辑 profile 和覆盖项,请使用 Control UI Tools 面板或配置/目录界面,而不要 +将 `/tools` 视为静态目录。 -## 使用量界面(哪些内容显示在哪里) +## 使用量界面(各处显示内容) -- **提供商使用量/配额**(例如“Claude 剩余 80%”)会在启用使用量跟踪时显示在当前模型提供商的 `/status` 中。OpenClaw 会将提供商窗口统一为“剩余百分比”;对于 MiniMax,仅提供剩余百分比字段时会在显示前取反,而 `model_remains` 响应会优先选择 chat-model 条目以及带模型标签的套餐标签。 -- `/status` 中的**令牌/缓存行**,在实时会话快照内容较少时,可以回退到最近一次转录使用量条目。现有的非零实时值仍然优先,且当存储总量缺失或更小时,转录回退还可以恢复当前活跃运行时模型标签以及一个更大的、面向提示词的总量。 -- **每次响应的令牌/成本** 由 `/usage off|tokens|full` 控制(附加到正常回复后)。 -- `/model status` 关注的是**模型/认证/端点**,而不是使用量。 +- **提供商使用量/配额**(例如:“Claude 剩余 80%”)会在启用使用量跟踪时显示在当前模型提供商的 `/status` 中。OpenClaw 会将提供商窗口统一规范为“剩余 %”;对于 MiniMax,仅剩余百分比字段会在显示前反转,而 `model_remains` 响应会优先使用聊天模型条目以及带模型标签的套餐标签。 +- `/status` 中的**令牌/缓存行**在实时会话快照信息不足时,可以回退到最近的转录使用量条目。现有的非零实时值仍然优先,转录回退还可以在已存储总量缺失或更小时,恢复当前活动运行时模型标签以及一个更偏向提示词的更大总量。 +- **每次响应的令牌/成本** 由 `/usage off|tokens|full` 控制(附加在普通回复后)。 +- `/model status` 关注的是**模型/凭证/端点**,而不是使用量。 ## 模型选择(`/model`) @@ -244,14 +252,14 @@ Dock 命令由支持原生命令的渠道插件生成。当前内置集合: 说明: -- `/model` 和 `/model list` 会显示一个紧凑的编号选择器(模型家族 + 可用提供商)。 -- 在 Discord 上,`/model` 和 `/models` 会打开一个交互式选择器,其中包含提供商和模型下拉菜单,以及一个提交步骤。 -- `/model <#>` 会从该选择器中进行选择(并尽可能优先当前提供商)。 -- `/model status` 会显示详细视图,包括已配置的提供商端点(`baseUrl`)和 API 模式(`api`),如果可用。 +- `/model` 和 `/model list` 会显示一个紧凑的编号选择器(模型系列 + 可用提供商)。 +- 在 Discord 上,`/model` 和 `/models` 会打开一个交互式选择器,其中包含提供商和模型下拉菜单以及提交步骤。 +- `/model <#>` 会从该选择器中进行选择(并在可能时优先当前提供商)。 +- `/model status` 会显示详细视图,包括已配置的提供商端点(`baseUrl`)以及 API 模式(`api`,如果可用)。 ## 调试覆盖 -`/debug` 允许你设置**仅运行时**的配置覆盖(内存中,不写磁盘)。仅限所有者。默认禁用;通过 `commands.debug: true` 启用。 +`/debug` 让你设置**仅运行时**配置覆盖(内存中,不写磁盘)。仅所有者。默认禁用;通过 `commands.debug: true` 启用。 示例: @@ -266,11 +274,32 @@ Dock 命令由支持原生命令的渠道插件生成。当前内置集合: 说明: - 覆盖会立即应用于新的配置读取,但**不会**写入 `openclaw.json`。 -- 使用 `/debug reset` 清除所有覆盖,并返回磁盘上的配置。 +- 使用 `/debug reset` 可清除所有覆盖,并返回到磁盘上的配置。 + +## 插件追踪输出 + +`/trace` 让你在不开启完整详细模式的情况下切换**会话范围的插件追踪/调试行**。 + +示例: + +```text +/trace +/trace on +/trace off +``` + +说明: + +- 不带参数的 `/trace` 会显示当前会话的追踪状态。 +- `/trace on` 会为当前会话启用插件追踪行。 +- `/trace off` 会再次将其关闭。 +- 插件追踪行可能会出现在 `/status` 中,也可能作为普通 assistant 回复之后的附加诊断消息出现。 +- `/trace` 不能替代 `/debug`;`/debug` 仍用于管理仅运行时配置覆盖。 +- `/trace` 也不能替代 `/verbose`;普通的详细工具/状态输出仍属于 `/verbose`。 ## 配置更新 -`/config` 会写入你的磁盘配置(`openclaw.json`)。仅限所有者。默认禁用;通过 `commands.config: true` 启用。 +`/config` 会写入你的磁盘配置(`openclaw.json`)。仅所有者。默认禁用;通过 `commands.config: true` 启用。 示例: @@ -284,12 +313,12 @@ Dock 命令由支持原生命令的渠道插件生成。当前内置集合: 说明: -- 配置会在写入前进行校验;无效更改会被拒绝。 +- 写入前会验证配置;无效更改会被拒绝。 - `/config` 更新会在重启后保留。 ## MCP 更新 -`/mcp` 会写入 `mcp.servers` 下由 OpenClaw 管理的 MCP 服务器定义。仅限所有者。默认禁用;通过 `commands.mcp: true` 启用。 +`/mcp` 会把 OpenClaw 管理的 MCP 服务器定义写入 `mcp.servers` 下。仅所有者。默认禁用;通过 `commands.mcp: true` 启用。 示例: @@ -302,8 +331,8 @@ Dock 命令由支持原生命令的渠道插件生成。当前内置集合: 说明: -- `/mcp` 将配置存储在 OpenClaw 配置中,而不是 Pi 自有项目设置中。 -- 运行时适配器决定哪些传输实际上可执行。 +- `/mcp` 将配置存储在 OpenClaw 配置中,而不是 Pi 自有的项目设置中。 +- 运行时适配器决定哪些传输实际上可以执行。 ## 插件更新 @@ -321,34 +350,34 @@ Dock 命令由支持原生命令的渠道插件生成。当前内置集合: 说明: -- `/plugins list` 和 `/plugins show` 会基于当前工作区加磁盘配置执行真实的插件发现。 -- `/plugins enable|disable` 仅更新插件配置;不会安装或卸载插件。 -- 在启用/禁用更改后,重启 gateway 以应用它们。 +- `/plugins list` 和 `/plugins show` 会基于当前工作区和磁盘配置执行真实的插件发现。 +- `/plugins enable|disable` 只会更新插件配置;不会安装或卸载插件。 +- 启用/禁用变更后,请重启 Gateway 网关以应用它们。 ## 界面说明 -- **文本命令** 在正常聊天会话中运行(私信共享 `main`,群组有各自的会话)。 +- **文本命令** 在普通聊天会话中运行(私信共享 `main`,群组有各自的会话)。 - **原生命令** 使用隔离会话: - Discord:`agent::discord:slash:` - Slack:`agent::slack:slash:`(前缀可通过 `channels.slack.slashCommand.sessionPrefix` 配置) - - Telegram:`telegram:slash:`(通过 `CommandTargetSessionKey` 指向聊天会话) -- **`/stop`** 以活跃聊天会话为目标,因此它可以中止当前运行。 -- **Slack:** `channels.slack.slashCommand` 仍支持单个 `/openclaw` 风格命令。如果你启用 `commands.native`,则必须为每个内置命令创建一个 Slack slash command(名称与 `/help` 等相同)。Slack 的命令参数菜单会以临时 Block Kit 按钮的形式提供。 - - Slack 原生命令例外:请注册 `/agentstatus`(不是 `/status`),因为 Slack 保留了 `/status`。文本 `/status` 在 Slack 消息中仍可使用。 + - Telegram:`telegram:slash:`(通过 `CommandTargetSessionKey` 定位到聊天会话) +- **`/stop`** 以当前活动聊天会话为目标,因此它可以中止当前运行。 +- **Slack:** `channels.slack.slashCommand` 仍然支持单个 `/openclaw` 风格命令。如果你启用了 `commands.native`,则必须为每个内置命令在 Slack 中创建一个斜杠命令(名称与 `/help` 相同)。Slack 的命令参数菜单会以临时 Block Kit 按钮形式传递。 + - Slack 原生例外:请注册 `/agentstatus`(而不是 `/status`),因为 Slack 保留了 `/status`。文本 `/status` 在 Slack 消息中仍然可用。 -## BTW 侧边问题 +## BTW 旁支问题 -`/btw` 是一个关于当前会话的快捷**侧边问题**。 +`/btw` 是一个关于当前会话的快速**旁支问题**。 与普通聊天不同: - 它会使用当前会话作为背景上下文, -- 它会作为一个独立的**无工具**单次调用运行, +- 它会作为一次独立的**无工具**单次调用运行, - 它不会改变未来的会话上下文, - 它不会写入转录历史, -- 它会作为实时侧边结果交付,而不是普通的助手消息。 +- 它会作为实时旁支结果交付,而不是普通 assistant 消息。 -这让 `/btw` 在你希望获得临时澄清、同时主任务继续进行时非常有用。 +这使得 `/btw` 在你希望主任务继续进行的同时,临时获取一个澄清时非常有用。 示例: @@ -356,4 +385,4 @@ Dock 命令由支持原生命令的渠道插件生成。当前内置集合: /btw what are we doing right now? ``` -完整行为和客户端 UX 细节请参见 [BTW Side Questions](/zh-CN/tools/btw)。 +有关完整行为和客户端 UX 细节,请参见 [BTW Side Questions](/zh-CN/tools/btw)。 diff --git a/docs/zh-CN/tools/thinking.md b/docs/zh-CN/tools/thinking.md index 6a6a01926..1118880a1 100644 --- a/docs/zh-CN/tools/thinking.md +++ b/docs/zh-CN/tools/thinking.md @@ -1,109 +1,118 @@ --- read_when: - - 调整 thinking、快速模式或 verbose 指令解析或默认值 -summary: 用于 /think、/fast、/verbose 和 reasoning 可见性的指令语法 -title: Thinking 级别 + - 调整思考、快速模式或详细输出指令的解析方式或默认值 +summary: '`/think`、`/fast`、`/verbose`、`/trace` 的指令语法,以及推理可见性' +title: 思考级别 x-i18n: - generated_at: "2026-04-05T10:12:41Z" + generated_at: "2026-04-12T18:22:23Z" model: gpt-5.4 provider: openai - source_hash: f60aeb6ab4c7ce858f725f589f54184b29d8c91994d18c8deafa75179b9a62cb + source_hash: 4f3b1341281f07ba4e9061e3355845dca234be04cc0d358594312beeb7676e68 source_path: tools/thinking.md workflow: 15 --- -# Thinking 级别(`/think` 指令) +# 思考级别(`/think` 指令) ## 它的作用 -- 可在任何传入消息正文中使用的内联指令:`/t `、`/think:` 或 `/thinking `。 +- 可在任何入站消息正文中使用内联指令:`/t `、`/think:` 或 `/thinking `。 - 级别(别名):`off | minimal | low | medium | high | xhigh | adaptive` - minimal → “think” - low → “think hard” - medium → “think harder” - high → “ultrathink”(最大预算) - - xhigh → “ultrathink+”(仅限 GPT-5.2 + Codex 模型) - - adaptive → 由提供商管理的自适应 reasoning 预算(适用于 Anthropic Claude 4.6 模型家族) - - `x-high`、`x_high`、`extra-high`、`extra high` 和 `extra_high` 都映射到 `xhigh`。 - - `highest`、`max` 都映射到 `high`。 + - xhigh → “ultrathink+”(仅适用于 GPT-5.2 和 Codex 模型) + - adaptive → 由提供商管理的自适应推理预算(支持 Anthropic Claude 4.6 模型系列) + - `x-high`、`x_high`、`extra-high`、`extra high` 和 `extra_high` 都映射为 `xhigh`。 + - `highest`、`max` 映射为 `high`。 - 提供商说明: - - 当未设置显式 thinking 级别时,Anthropic Claude 4.6 模型默认使用 `adaptive`。 - - 走 Anthropic-compatible 流式路径的 MiniMax(`minimax/*`)默认使用 `thinking: { type: "disabled" }`,除非你在模型参数或请求参数中显式设置 thinking。这样可以避免 MiniMax 的非原生 Anthropic 流格式泄露 `reasoning_content` 增量。 - - Z.AI(`zai/*`)仅支持二元 thinking(`on`/`off`)。任何非 `off` 级别都会被视为 `on`(映射到 `low`)。 - - Moonshot(`moonshot/*`)会将 `/think off` 映射到 `thinking: { type: "disabled" }`,将任何非 `off` 级别映射到 `thinking: { type: "enabled" }`。启用 thinking 时,Moonshot 仅接受 `tool_choice` 为 `auto|none`;OpenClaw 会将不兼容的值规范化为 `auto`。 + - 当未显式设置思考级别时,Anthropic Claude 4.6 模型默认使用 `adaptive`。 + - 在 Anthropic 兼容流式路径上,MiniMax(`minimax/*`)默认使用 `thinking: { type: "disabled" }`,除非你在模型参数或请求参数中显式设置 thinking。这样可避免 MiniMax 的非原生 Anthropic 流格式泄露 `reasoning_content` 增量。 + - Z.AI(`zai/*`)只支持二元 thinking(`on`/`off`)。任何非 `off` 级别都会被视为 `on`(映射为 `low`)。 + - Moonshot(`moonshot/*`)将 `/think off` 映射为 `thinking: { type: "disabled" }`,并将任何非 `off` 级别映射为 `thinking: { type: "enabled" }`。启用 thinking 时,Moonshot 只接受 `tool_choice` 为 `auto|none`;OpenClaw 会将不兼容的值规范化为 `auto`。 ## 解析顺序 -1. 消息中的内联指令(仅对该条消息生效)。 -2. 会话覆盖(通过发送仅包含指令的消息设置)。 -3. 按智能体的默认值(配置中的 `agents.list[].thinkingDefault`)。 +1. 消息上的内联指令(仅适用于该条消息)。 +2. 会话覆盖(通过发送仅包含指令的消息来设置)。 +3. 每个智能体的默认值(配置中的 `agents.list[].thinkingDefault`)。 4. 全局默认值(配置中的 `agents.defaults.thinkingDefault`)。 -5. 回退:Anthropic Claude 4.6 模型为 `adaptive`,其他支持 reasoning 的模型为 `low`,否则为 `off`。 +5. 回退:Anthropic Claude 4.6 模型为 `adaptive`,其他支持推理的模型为 `low`,否则为 `off`。 ## 设置会话默认值 -- 发送一条**只包含该指令**的消息(允许空白字符),例如 `/think:medium` 或 `/t high`。 -- 该设置会固定到当前会话中(默认按发送者区分);会通过 `/think:off` 或会话空闲重置来清除。 -- 会发送确认回复(`Thinking level set to high.` / `Thinking disabled.`)。如果级别无效(例如 `/thinking big`),命令会被拒绝并附带提示,会话状态保持不变。 -- 发送不带参数的 `/think`(或 `/think:`)可查看当前 thinking 级别。 +- 发送一条**仅包含该指令**的消息(允许空白),例如 `/think:medium` 或 `/t high`。 +- 该设置会保留在当前会话中(默认按发送者划分);可通过 `/think:off` 或会话空闲重置来清除。 +- 会发送确认回复(`Thinking level set to high.` / `Thinking disabled.`)。如果级别无效(例如 `/thinking big`),该命令会被拒绝并给出提示,会话状态保持不变。 +- 发送不带参数的 `/think`(或 `/think:`)可查看当前思考级别。 ## 按智能体应用 -- **嵌入式 Pi**:解析后的级别会传递给进程内 Pi 智能体运行时。 +- **嵌入式 Pi**:解析后的级别会传递给进程内的 Pi 智能体运行时。 ## 快速模式(`/fast`) - 级别:`on|off`。 - 仅包含指令的消息会切换会话快速模式覆盖,并回复 `Fast mode enabled.` / `Fast mode disabled.`。 -- 不带模式发送 `/fast`(或 `/fast status`)可查看当前实际生效的快速模式状态。 +- 发送不带模式的 `/fast`(或 `/fast status`)可查看当前生效的快速模式状态。 - OpenClaw 按以下顺序解析快速模式: - 1. 内联/仅指令 `/fast on|off` + 1. 内联 / 仅指令 `/fast on|off` 2. 会话覆盖 - 3. 按智能体的默认值(`agents.list[].fastModeDefault`) - 4. 按模型配置:`agents.defaults.models["/"].params.fastMode` + 3. 每个智能体的默认值(`agents.list[].fastModeDefault`) + 4. 每个模型的配置:`agents.defaults.models["/"].params.fastMode` 5. 回退:`off` -- 对于 `openai/*`,快速模式会通过在受支持的 Responses 请求上发送 `service_tier=priority` 映射到 OpenAI 优先处理。 -- 对于 `openai-codex/*`,快速模式会在 Codex Responses 上发送相同的 `service_tier=priority` 标志。OpenClaw 会在这两条认证路径之间共用一个 `/fast` 开关。 -- 对于直连公开 `anthropic/*` 请求,包括发送到 `api.anthropic.com` 的 OAuth 认证流量,快速模式会映射到 Anthropic service tier:`/fast on` 设置 `service_tier=auto`,`/fast off` 设置 `service_tier=standard_only`。 -- 对于 Anthropic-compatible 路径上的 `minimax/*`,`/fast on`(或 `params.fastMode: true`)会将 `MiniMax-M2.7` 重写为 `MiniMax-M2.7-highspeed`。 -- 当两者同时设置时,显式的 Anthropic `serviceTier` / `service_tier` 模型参数会覆盖快速模式默认值。对于非 Anthropic 代理 base URL,OpenClaw 仍会跳过 Anthropic service-tier 注入。 +- 对于 `openai/*`,快速模式会通过在受支持的 Responses 请求中发送 `service_tier=priority` 来映射为 OpenAI 优先级处理。 +- 对于 `openai-codex/*`,快速模式会在 Codex Responses 上发送相同的 `service_tier=priority` 标志。OpenClaw 在这两种认证路径上共用一个 `/fast` 开关。 +- 对于直接发送到 `anthropic/*` 的公共请求,包括发送到 `api.anthropic.com` 的 OAuth 认证流量,快速模式会映射为 Anthropic 服务层级:`/fast on` 设置 `service_tier=auto`,`/fast off` 设置 `service_tier=standard_only`。 +- 对于 Anthropic 兼容路径上的 `minimax/*`,`/fast on`(或 `params.fastMode: true`)会将 `MiniMax-M2.7` 改写为 `MiniMax-M2.7-highspeed`。 +- 当两者都设置时,显式的 Anthropic `serviceTier` / `service_tier` 模型参数会覆盖快速模式默认值。对于非 Anthropic 代理 base URL,OpenClaw 仍会跳过注入 Anthropic 服务层级。 -## Verbose 指令(`/verbose` 或 `/v`) +## 详细输出指令(`/verbose` 或 `/v`) -- 级别:`on`(最简)| `full` | `off`(默认)。 -- 仅包含指令的消息会切换会话 verbose,并回复 `Verbose logging enabled.` / `Verbose logging disabled.`;无效级别会返回提示而不更改状态。 -- `/verbose off` 会存储一个显式会话覆盖;可在 Sessions UI 中选择 `inherit` 来清除。 -- 内联指令仅影响当前消息;其他情况适用会话/全局默认值。 -- 不带参数发送 `/verbose`(或 `/verbose:`)可查看当前 verbose 级别。 -- 当 verbose 开启时,会输出结构化工具结果的智能体(Pi、其他 JSON 智能体)会将每次工具调用作为单独的仅元数据消息发回;如果可用,会以 ` : ` 为前缀(路径/命令)。这些工具摘要会在每个工具启动时立即发送(单独气泡),而不是作为流式增量发送。 -- 在普通模式下,工具失败摘要仍然可见,但原始错误详情后缀会被隐藏,除非 verbose 为 `on` 或 `full`。 -- 当 verbose 为 `full` 时,工具输出也会在完成后转发(单独气泡,并截断到安全长度)。如果你在运行进行中切换 `/verbose on|full|off`,后续工具气泡会遵循新设置。 +- 级别:`on`(最少)| `full` | `off`(默认)。 +- 仅包含指令的消息会切换会话详细输出,并回复 `Verbose logging enabled.` / `Verbose logging disabled.`;无效级别会返回提示,不会更改状态。 +- `/verbose off` 会存储显式的会话覆盖;可在会话 UI 中选择 `inherit` 以清除它。 +- 内联指令仅影响该条消息;否则应用会话 / 全局默认值。 +- 发送不带参数的 `/verbose`(或 `/verbose:`)可查看当前详细输出级别。 +- 启用详细输出时,会发出结构化工具结果的智能体(Pi、其他 JSON 智能体)会将每次工具调用作为单独的仅元数据消息发回;如果可用,会以 ` : ` 为前缀(路径 / 命令)。这些工具摘要会在每个工具启动时立即发送(单独气泡),而不是作为流式增量发送。 +- 工具失败摘要在普通模式下仍然可见,但原始错误详情后缀会被隐藏,除非详细输出为 `on` 或 `full`。 +- 当详细输出为 `full` 时,工具输出也会在完成后转发(单独气泡,并截断到安全长度)。如果你在一次运行进行中切换 `/verbose on|full|off`,后续工具气泡会遵循新设置。 -## Reasoning 可见性(`/reasoning`) +## 插件追踪指令(`/trace`) + +- 级别:`on` | `off`(默认)。 +- 仅包含指令的消息会切换会话插件追踪输出,并回复 `Plugin trace enabled.` / `Plugin trace disabled.`。 +- 内联指令仅影响该条消息;否则应用会话 / 全局默认值。 +- 发送不带参数的 `/trace`(或 `/trace:`)可查看当前追踪级别。 +- `/trace` 比 `/verbose` 更窄:它只暴露插件拥有的追踪 / 调试行,例如 Active Memory 调试摘要。 +- 追踪行可能出现在 `/status` 中,也可能作为普通助手回复后的附加诊断消息出现。 + +## 推理可见性(`/reasoning`) - 级别:`on|off|stream`。 - 仅包含指令的消息会切换是否在回复中显示 thinking 块。 -- 启用后,reasoning 会作为**单独消息**发送,并带有 `Reasoning:` 前缀。 -- `stream`(仅 Telegram):在回复生成期间,将 reasoning 流式写入 Telegram 草稿气泡中,然后发送不包含 reasoning 的最终答案。 +- 启用后,推理会作为**单独消息**发送,并以 `Reasoning:` 为前缀。 +- `stream`(仅 Telegram):在回复生成期间,将推理流式传输到 Telegram 草稿气泡中,然后发送不带推理内容的最终答案。 - 别名:`/reason`。 -- 不带参数发送 `/reasoning`(或 `/reasoning:`)可查看当前 reasoning 级别。 -- 解析顺序:内联指令,然后会话覆盖,然后按智能体默认值(`agents.list[].reasoningDefault`),最后回退(`off`)。 +- 发送不带参数的 `/reasoning`(或 `/reasoning:`)可查看当前推理级别。 +- 解析顺序:内联指令,然后是会话覆盖,然后是每个智能体的默认值(`agents.list[].reasoningDefault`),最后是回退值(`off`)。 ## 相关内容 -- Elevated mode 文档位于 [Elevated mode](/zh-CN/tools/elevated)。 +- 提权模式文档位于 [Elevated mode](/zh-CN/tools/elevated)。 -## Heartbeats +## 心跳 -- Heartbeat 探测消息正文是已配置的 heartbeat 提示词(默认值:`Read HEARTBEAT.md if it exists (workspace context). Follow it strictly. Do not infer or repeat old tasks from prior chats. If nothing needs attention, reply HEARTBEAT_OK.`)。heartbeat 消息中的内联指令会照常生效(但应避免通过 heartbeat 更改会话默认值)。 -- Heartbeat 投递默认仅发送最终载荷。若还要发送单独的 `Reasoning:` 消息(如果可用),请设置 `agents.defaults.heartbeat.includeReasoning: true` 或按智能体设置 `agents.list[].heartbeat.includeReasoning: true`。 +- 心跳探测正文是已配置的心跳提示(默认:`Read HEARTBEAT.md if it exists (workspace context). Follow it strictly. Do not infer or repeat old tasks from prior chats. If nothing needs attention, reply HEARTBEAT_OK.`)。心跳消息中的内联指令会像平常一样生效(但应避免通过心跳更改会话默认值)。 +- 心跳传递默认仅发送最终负载。若还要发送单独的 `Reasoning:` 消息(如果可用),请设置 `agents.defaults.heartbeat.includeReasoning: true` 或按智能体设置 `agents.list[].heartbeat.includeReasoning: true`。 ## Web 聊天 UI -- Web 聊天中的 thinking 选择器会在页面加载时,从传入会话存储/配置中镜像该会话的已存储级别。 -- 选择另一个级别会立即通过 `sessions.patch` 写入会话覆盖;它不会等到下一次发送,也不是一次性的 `thinkingOnce` 覆盖。 -- 第一个选项始终是 `Default ()`,其中解析后的默认值来自当前会话模型:Anthropic/Bedrock 上的 Claude 4.6 为 `adaptive`,其他支持 reasoning 的模型为 `low`,否则为 `off`。 -- 该选择器会保持提供商感知: +- 页面加载时,Web 聊天思考选择器会镜像来自入站会话存储 / 配置的会话已存储级别。 +- 选择其他级别会立即通过 `sessions.patch` 写入会话覆盖;它不会等待下一次发送,也不是一次性的 `thinkingOnce` 覆盖。 +- 第一个选项始终是 `Default ()`,其中解析出的默认值来自当前会话模型:Anthropic/Bedrock 上的 Claude 4.6 为 `adaptive`,其他支持推理的模型为 `low`,否则为 `off`。 +- 选择器会保持提供商感知: - 大多数提供商显示 `off | minimal | low | medium | high | adaptive` - Z.AI 显示二元选项 `off | on` -- `/think:` 仍然可用,并会更新同一个已存储的会话级别,因此聊天指令和选择器会保持同步。 +- `/think:` 仍然有效,并会更新同一个已存储的会话级别,因此聊天指令与选择器保持同步。