常见任务
常见任务¶
??? 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-peerthreadBindings:线程绑定会话路由的全局默认设置。使用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 等价命令:
作用说明:
- 让网关能够通过外部中继发送
push.test、唤醒提示和重连唤醒。 - 使用由配对 iOS 应用转发的、注册作用域的发送授权。网关不需要部署范围的中继令牌。
- 将每个中继支持的注册绑定到 iOS 应用所配对的网关身份,因此其他网关无法重用已存储的注册。
- 保持本地/手动 iOS 构建直连 APNs。中继支持的发送仅适用于通过中继注册的官方分发构建。
- 必须与内置到 iOS 构建中的中继基础 URL 匹配,以便注册和发送流量到达同一中继部署。
端到端流程:
- 安装官方 iOS 应用。
- 可选:仅在使用刻意独立的自定义中继构建时,在网关上配置
gateway.push.apns.relay.baseUrl。 - 将 iOS 应用与网关配对,并让节点和操作员会话都能连接。
- iOS 应用获取网关身份,使用 App Attest 和应用收据向中继注册,然后向配对的网关发布中继支持的
push.apns.register负载。 - 网关存储中继句柄和发送授权,然后将其用于
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。
设置心跳(定期检入)
every:时长字符串(30m、2h)。设为0m可禁用周期性节奏;定向事件驱动的唤醒仍可运行一个代理回合。默认值:30m。target:owner(默认操作员 DM)|last(最近的对话,包括群组)|none(仅内部)|<channel-id>directPolicy:allow(默认)或block,用于 DM 风格的心跳目标- 完整指南请参阅 心跳。
配置 cron 任务
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