跳转至

常见任务

常见任务

??? note "设置渠道(WhatsApp、Telegram、Discord 等)" {#set-up-a-channel-whatsapp-telegram-discord-etc}

每个渠道在 `channels.<provider>` 下都有自己的配置节。有关设置步骤,请参阅专门的渠道页面:

- [Discord](../../channels/discord.md) - `channels.discord`
- [Feishu](../../channels/feishu.md) - `channels.feishu`
- [Google Chat](../../channels/googlechat.md) - `channels.googlechat`
- [iMessage](../../channels/imessage.md) - `channels.imessage`
- [Mattermost](../../channels/mattermost.md) - `channels.mattermost`
- [Microsoft Teams](../../channels/msteams.md) - `channels.msteams`
- [Signal](../../channels/signal.md) - `channels.signal`
- [Slack](../../channels/slack.md) - `channels.slack`
- [Telegram](../../channels/telegram.md) - `channels.telegram`
- [WhatsApp](../../channels/whatsapp.md) - `channels.whatsapp`

所有渠道共用相同的 DM 策略模式:

```json5
{
  channels: {
    telegram: {
      enabled: true,
      botToken: "123:abc",
      dmPolicy: "pairing",   // pairing | allowlist | open | disabled
      allowFrom: ["tg:123"], // only for allowlist/open
    },
  },
}
```

??? note "选择并配置模型" {#choose-and-configure-models}

设置主模型和可选的备用模型:

```json5
{
  agents: {
    defaults: {
      model: {
        primary: "anthropic/claude-sonnet-4-6",
        fallbacks: ["openai/gpt-5.4"],
      },
      models: {
        "anthropic/claude-sonnet-4-6": { alias: "Sonnet" },
        "openai/gpt-5.4": { alias: "GPT" },
      },
    },
  },
}
```

- `agents.defaults.models` 存储别名和按模型的设置;添加条目绝不会限制 `/model` 或 `--model` 覆盖。
- `agents.defaults.modelPolicy.allow` 是用于覆盖和模型选择器的显式允许列表。它接受精确的模型引用和 `provider/*` 通配符;省略它或使用 `[]` 即可允许任意模型。
- 模型引用使用 `provider/model` 格式(例如 `anthropic/claude-opus-4-6`)。
- `agents.defaults.imageMaxDimensionPx` 控制转录/工具图片的缩小处理(默认 `1200`);较低的值通常可减少截图密集型运行中的 vision-token 用量。
- 有关在聊天中切换模型,请参阅 [Models CLI](../../concepts/models.md);有关认证轮换和回退行为,请参阅 [Model Failover](../../concepts/model-failover.md)。
- 对于自定义/自托管提供商,请参阅参考文档中的 [Custom providers](../config-tools.md#custom-providers-and-base-urls)。

??? note "控制谁可以给机器人发消息" {#control-who-can-message-the-bot}

DM 访问权限通过 `dmPolicy`(默认 `"pairing"`)按渠道控制:

- `"pairing"`:未知发送者会收到一个需批准的一次性配对码
- `"allowlist"`:仅允许 `allowFrom`(或已配对的允许存储)中的发送者
- `"open"`:允许所有入站 DM(需要 `allowFrom: ["*"]`)
- `"disabled"`:忽略所有 DM

对于群组,请使用 `groupPolicy`(`"allowlist" | "open" | "disabled"`)以及 `groupAllowFrom` 或特定于渠道的允许列表。

有关各渠道的详细信息,请参阅[完整参考](../config-channels.md#dm-and-group-access)。

??? note "设置群聊提及门控" {#set-up-group-chat-mention-gating}

群消息默认**要求提及(mention)**。可为每个代理配置触发模式。普通群组/渠道回复会自动发布;对于需要代理自行决定何时发言的共享房间,可选择使用 message-tool 路径:

```json5
{
  messages: {
    visibleReplies: "automatic", // set "message_tool" to require message-tool sends everywhere
    groupChat: {
      visibleReplies: "message_tool", // opt-in; visible output requires message(action=send)
      unmentionedInbound: "room_event", // unmentioned always-on group chatter is quiet context
    },
  },
  agents: {
    entries: {
      main: {
        default: true,
        groupChat: {
          mentionPatterns: ["@openclaw", "openclaw"],
        },
      },
    },
  },
  channels: {
    whatsapp: {
      groups: { "*": { requireMention: true } },
    },
  },
}
```

- **元数据提及**:原生 @提及(WhatsApp 点按提及、Telegram @bot 等)
- **文本模式**:`mentionPatterns` 中的安全正则表达式模式
- **可见回复**:`messages.visibleReplies` 可全局要求通过 message-tool 发送;`messages.groupChat.visibleReplies` 可为群组/渠道覆盖此设置。
- 有关可见回复模式、按渠道覆盖以及自我聊天模式,请参阅[完整参考](../config-channels.md#group-chat-mention-gating)。

??? note "按代理限制技能" {#restrict-skills-per-agent}

使用 `agents.defaults.skills` 设置共享基线,然后通过 `agents.entries.*.skills` 覆盖特定代理:

```json5
{
  agents: {
    defaults: {
      skills: ["github", "weather"],
    },
    entries: {
      writer: { default: true }, // inherits github, weather
      docs: { skills: ["docs-search"] }, // replaces defaults
      "locked-down": { skills: [] }, // no skills
    },
  },
}
```

- 省略 `agents.defaults.skills` 表示默认不限制技能。
- 省略 `agents.entries.*.skills` 则继承默认设置。
- 将 `agents.entries.*.skills` 设为 `[]` 表示不启用任何技能。
- 请参阅 [Skills](../../tools/skills.md)、[Skills config](../../tools/skills-config.md) 以及 [Configuration Reference](../config-agents/workspace-and-bootstrap.md#agents-defaults-skills)。

??? note "配置按渠道的健康监控" {#configure-per-channel-health-monitoring}

为某个渠道或账号禁用或启用自动健康重启:

```json5
{
  channels: {
    telegram: {
      healthMonitor: { enabled: false },
      accounts: {
        alerts: {
          healthMonitor: { enabled: true },
        },
      },
    },
  },
}
```

- 使用 `channels.<provider>.healthMonitor.enabled` 或 `channels.<provider>.accounts.<id>.healthMonitor.enabled` 来控制某个渠道或账号的自动重启。
- 有关运维排障,请参阅 [Health Checks](../health.md);有关所有字段,请参阅[完整参考](../config-gateway.md#gateway)。
配置会话与重置

会话控制对话的连续性与隔离性:

{
  session: {
    dmScope: "per-channel-peer",  // recommended for multi-user
    threadBindings: {
      enabled: true,
      idleHours: 24,
      maxAgeHours: 0,
    },
    reset: {
      mode: "daily",
      atHour: 4,
      idleMinutes: 120,
    },
  },
}
  • dmScope:main(共享)| per-peer | per-channel-peer | per-account-channel-peer
  • threadBindings:线程绑定会话路由的全局默认设置。使用 sessions_spawn({ thread: true }) 或 /acp spawn --thread auto 生成。使用 /session unbind、/agents、/session idle 和 /session max-age 来解除绑定、列出和调整绑定(Discord 绑定线程,Telegram 绑定话题/对话)。
  • 有关作用域、身份链接和发送策略,请参阅 会话管理。
  • 有关所有字段,请参阅 完整参考。
启用沙箱

在隔离的沙箱运行时中运行代理会话:

{
  agents: {
    defaults: {
      sandbox: {
        mode: "non-main",  // off | non-main | all
        scope: "agent",    // session | agent | shared
      },
    },
  },
}

请先构建镜像——从源码检出运行 scripts/sandbox-setup.sh,或从 npm 安装请参阅 沙箱 § 镜像与设置 中的内联 docker build 命令。

完整指南请参阅 沙箱,所有选项请参阅 完整参考。

为官方 iOS 构建启用中继推送

面向公开 App Store 构建的中继推送使用托管的 OpenClaw 中继:https://ios-push-relay.openclaw.ai。

自定义中继部署需要一条刻意独立的 iOS 构建/部署路径,其中继 URL 必须与网关中继 URL 匹配。如果你使用的是自定义中继构建,请在网关配置中设置:

{
  gateway: {
    push: {
      apns: {
        relay: {
          baseUrl: "https://relay.example.com",
          // Optional. Default: 10000
          timeoutMs: 10000,
        },
      },
    },
  },
}

CLI 等价命令:

openclaw config set gateway.push.apns.relay.baseUrl https://relay.example.com

作用说明:

  • 让网关能够通过外部中继发送 push.test、唤醒提示和重连唤醒。
  • 使用由配对 iOS 应用转发的、注册作用域的发送授权。网关不需要部署范围的中继令牌。
  • 将每个中继支持的注册绑定到 iOS 应用所配对的网关身份,因此其他网关无法重用已存储的注册。
  • 保持本地/手动 iOS 构建直连 APNs。中继支持的发送仅适用于通过中继注册的官方分发构建。
  • 必须与内置到 iOS 构建中的中继基础 URL 匹配,以便注册和发送流量到达同一中继部署。

端到端流程:

  1. 安装官方 iOS 应用。
  2. 可选:仅在使用刻意独立的自定义中继构建时,在网关上配置 gateway.push.apns.relay.baseUrl。
  3. 将 iOS 应用与网关配对,并让节点和操作员会话都能连接。
  4. iOS 应用获取网关身份,使用 App Attest 和应用收据向中继注册,然后向配对的网关发布中继支持的 push.apns.register 负载。
  5. 网关存储中继句柄和发送授权,然后将其用于 push.test、唤醒提示和重连唤醒。

运维说明:

  • 如果你将 iOS 应用切换到不同的网关,请重新连接应用,以便它能发布绑定到该网关的新中继注册。
  • 如果你发布指向不同中继部署的新 iOS 构建,应用会刷新其缓存的中继注册,而不是重用旧的中继源。

兼容性说明:

  • OPENCLAW_APNS_RELAY_BASE_URL 和 OPENCLAW_APNS_RELAY_TIMEOUT_MS 仍可作为临时环境变量覆盖项使用。
  • 自定义网关中继 URL 必须与内置到 iOS 构建中的中继基础 URL 匹配;公开 App Store 发布通道拒绝自定义 iOS 中继 URL 覆盖。
  • OPENCLAW_APNS_RELAY_ALLOW_HTTP=true 仍然只是回环专用的开发逃生通道;请勿在配置中持久化 HTTP 中继 URL。

端到端流程请参阅 iOS 应用,中继安全模型请参阅 认证与信任流程。

设置心跳(定期检入)
{
  agents: {
    defaults: {
      heartbeat: {
        every: "30m",
        target: "owner",
      },
    },
  },
}
  • every:时长字符串(30m、2h)。设为 0m 可禁用周期性节奏;定向事件驱动的唤醒仍可运行一个代理回合。默认值:30m。
  • target:owner(默认操作员 DM)| last(最近的对话,包括群组)| none(仅内部)| <channel-id>
  • directPolicy:allow(默认)或 block,用于 DM 风格的心跳目标
  • 完整指南请参阅 心跳。
配置 cron 任务
{
  cron: {
    enabled: true,
    sessionRetention: "24h",
  },
}
  • sessionRetention:从 SQLite 会话行中清理已完成的隔离运行会话(默认 24h;设为 false 或零时长(如 "0h")可禁用)。
  • 终端运行历史保留 7 天(lost 行保留 24 小时),此外每个任务和历史类别还会强制保留最新的 2000 行作为额外上限。
  • 功能概览和 CLI 示例请参阅 cron 任务。
设置 Webhook(hooks)

在 Gateway 上启用 HTTP Webhook 端点:

{
  hooks: {
    enabled: true,
    token: "shared-secret",
    path: "/hooks",
    defaultSessionKey: "hook:ingress",
    allowRequestSessionKey: false,
    allowedSessionKeyPrefixes: ["hook:"],
    mappings: [
      {
        match: { path: "gmail" },
        action: "agent",
        agentId: "main",
        sessionKey: "hook:gmail",
        sessionMode: "persistent",
        deliver: true,
      },
    ],
  },
}

安全说明: - 将所有 hook/webhook 负载内容视为不可信输入。 - 使用专用的 hooks.token;不要复用当前在用的网关认证密钥(gateway.auth.token / OPENCLAW_GATEWAY_TOKEN 或 gateway.auth.password / OPENCLAW_GATEWAY_PASSWORD)。 - Hook 认证仅支持请求头方式(Authorization: Bearer ... 或 x-openclaw-token);查询字符串中的令牌会被拒绝。 - hooks.path 不能为 /;请将 webhook 入口保留在专用子路径上,例如 /hooks。 - 除非进行严格限定的调试,否则应保持不安全内容绕过开关处于禁用状态(hooks.gmail.allowUnsafeExternalContent、hooks.mappings[].allowUnsafeExternalContent)。 - 如果启用了 hooks.allowRequestSessionKey,同时还要设置 hooks.allowedSessionKeyPrefixes,以限定调用方选择的会话键。 - 除非有意使用持久化上下文,否则应保持 hook 会话相互隔离。直接持久化的 hook 需要显式且带前缀限定的请求 sessionKey;映射的持久化 hook 需要稳定的映射键或 hooks.defaultSessionKey。 - 对于 hook 驱动的智能体,建议优先选择强大的现代模型档次和严格的工具策略(例如仅限消息通信,并在可能的情况下启用沙箱)。

有关所有映射选项和 Gmail 集成,请参阅完整参考。

配置多智能体路由

运行多个相互隔离的智能体,每个智能体拥有独立的工作区和会话:

{
  agents: {
    entries: {
      home: { default: true, workspace: "~/.openclaw/workspace-home" },
      work: { workspace: "~/.openclaw/workspace-work" },
    },
  },
  bindings: [
    { agentId: "home", match: { channel: "whatsapp", accountId: "personal" } },
    { agentId: "work", match: { channel: "whatsapp", accountId: "biz" } },
  ],
}

有关绑定规则和每个智能体的访问配置,请参阅多智能体与完整参考。

将配置拆分为多个文件($include)

使用 $include 组织大型配置:

// ~/.openclaw/openclaw.json
{
  gateway: { port: 18789 },
  agents: { $include: "./agents.json5" },
  broadcast: {
    $include: ["./clients/a.json5", "./clients/b.json5"],
  },
}
  • 单个文件:替换包含该 $include 指令的对象。
  • 文件数组:按顺序深度合并(后者优先),最多支持 10 层嵌套。
  • 兄弟键:在 include 之后合并(覆盖被包含的值)。
  • 相对路径:相对于包含该指令的文件进行解析。
  • 路径格式:include 路径不得包含空字节,且解析前后的长度都必须严格小于 4096 个字符。
  • OpenClaw 自管写入:当所有变更的键都由对象键路径上的某个单文件 include 拥有时,OpenClaw 会更新层级最深的属主 include,并保持 openclaw.json 不变。这既适用于 plugins: { $include: "./plugins.json5" } 这样的顶层部分,也适用于嵌套的对象映射条目。写穿透仅针对顶层配置目录内的 include 文件;通过 OPENCLAW_INCLUDE_ROOTS 放行的 include 对 OpenClaw 自管写入保持只读。
  • Control UI 表单保存:表单编辑的是经过 include 解析后的源配置。未更改的脱敏凭据(包括 SecretRef ID、渠道令牌和 Provider 请求头)即使只编写在被包含的文件中,保存后也会保留。下文所述的相同写穿透限制同样适用。
  • 不支持的写穿透:以下情况会失败关闭(fail closed),而不是展平配置:根级 include(配置中根对象编写了 $include 的每个部分)、实际的数组条目 include、include 数组、兄弟覆盖、被多个逻辑路径共享的文件、跨越属主边界的变更、合并属主之下的任何嵌套 include,以及自身文件仍含有嵌套 $include 指令的 include。数字对象键会被视为映射键,而不是数组位置。持久化前后会重新检查 include 的目标和内容;如果中间 include 文件被并发编辑,写入会被拒绝,或将其未变更的叶子文件回滚。
  • Doctor 修复:openclaw doctor --fix 在写入穿透时遵循相同的边界。如果一次运行中的候选修复同时包含根属主修复和 include 属主修复,则整个运行会被拒绝。被拒绝的写入会使所有文件保持不变(同一运行中较早的写入仍然保留),Doctor 会指出需要用户重新运行前手动修复的边界;如果根文件编写了该边界的 $include,还会一并指出被包含的一个或多个文件(智能体名册边界只指出边界本身,不指出其文件)。
  • 限制范围:$include 路径必须解析到 openclaw.json 所在目录之下。要在多台机器或多个用户之间共享目录树,可以将 OPENCLAW_INCLUDE_ROOTS 设置为一个路径列表(POSIX 使用 :,Windows 使用 ;),列出 include 可以引用的附加目录。符号链接会被解析并重新检查,因此,路径在词法上位于配置目录内、但其真实目标超出所有允许根目录的情况仍然会被拒绝。
  • 错误处理:对于文件缺失、解析错误、循环 include、路径格式无效和长度超限等情况,会给出清晰的错误信息。

Hello! How can I help you today?

本页原文 Markdown:在 AtomGit 查看·内容源自开源项目 cl/openclaw