状态:已支持通过官方 Discord 机器人网关进行私信和服务器文字频道通信。
DISCORD_BOT_TOKEN=...channels.discord.token: "..."。最小配置:
{
channels: {
discord: {
enabled: true,
token: "YOUR_BOT_TOKEN",
},
},
}
agent:main:main);服务器频道保持隔离为 agent:<agentId>:discord:channel:<channelId>(显示名称使用 discord:<guildSlug>#<channelSlug>)。channels.discord.dm.groupEnabled 启用,并可选择通过 channels.discord.dm.groupChannels 进行限制。channels.discord.token 配置 OpenClaw(或使用 DISCORD_BOT_TOKEN 作为回退)。channels.discord.enabled 不为 false 时,它会自动启动 Discord 渠道。DISCORD_BOT_TOKEN(配置块是可选的)。user:<id>(或 <@id> 提及);所有对话都进入共享的 main 会话。纯数字 ID 是模糊的,会被拒绝。channel:<channelId>。默认需要提及,可以按服务器或按频道设置。channels.discord.dm.policy 进行安全保护(默认:"pairing")。未知发送者会收到配对码(1 小时后过期);通过 openclaw pairing approve discord <code> 批准。channels.discord.dm.policy="open" 和 channels.discord.dm.allowFrom=["*"]。channels.discord.dm.policy="allowlist" 并在 channels.discord.dm.allowFrom 中列出发送者。channels.discord.dm.enabled=false 或 channels.discord.dm.policy="disabled"。channels.discord.dm.groupEnabled 启用,并可选择通过 channels.discord.dm.groupChannels 进行限制。channels.discord.guilds,以服务器 ID(首选)或 slug 为键,并包含每个频道的规则。commands.native 默认为 "auto"(Discord/Telegram 开启,Slack 关闭)。使用 channels.discord.commands.native: true|false|"auto" 覆盖;false 会清除之前注册的命令。文本命令由 commands.text 控制,必须作为独立的 /... 消息发送。使用 commands.useAccessGroups: false 可跳过命令的访问组检查。channels.discord.historyLimit(默认 20,回退到 messages.groupChat.historyLimit)以在回复提及时包含最近 N 条服务器消息作为上下文。设置 0 禁用。discord 工具触发表情反应(受 channels.discord.actions.* 控制)。discord 工具仅在当前渠道是 Discord 时暴露。agent:<agentId>:discord:slash:<userId>)而不是共享的 main 会话。注意:名称 → ID 解析使用服务器成员搜索,需要 Server Members Intent;如果机器人无法搜索成员,请使用 ID 或 <@id> 提及。
注意:Slug 为小写,空格替换为 -。频道名称的 slug 不包含前导 #。
注意:服务器上下文 [from:] 行包含 author.tag + id,便于进行可提及的回复。
默认情况下,允许 Discord 写入由 /config set|unset 触发的配置更新(需要 commands.config: true)。
禁用方式:
{
channels: { discord: { configWrites: false } },
}
这是在服务器(guild)频道(如 #help)中运行 OpenClaw 的"Discord 开发者门户"设置。
DISCORD_BOT_TOKEN 的内容)Discord 会阻止"特权意图",除非你明确启用它们。
在 Bot → Privileged Gateway Intents 中启用:
你通常不需要 Presence Intent。
在你的应用中:OAuth2 → URL Generator
Scopes
botapplications.commands(原生命令所需)Bot Permissions(最小基线)
除非你在调试并完全信任机器人,否则避免使用 Administrator。
复制生成的 URL,打开它,选择你的服务器,然后安装机器人。
Discord 到处使用数字 ID;OpenClaw 配置优先使用 ID。
#help)→ 复制频道 ID通过环境变量设置机器人令牌(服务器上推荐):
DISCORD_BOT_TOKEN=...或通过配置:
{
channels: {
discord: {
enabled: true,
token: "YOUR_BOT_TOKEN",
},
},
}
多账户支持:使用 channels.discord.accounts,每个账户有自己的令牌和可选的 name。参见 gateway/configuration 了解通用模式。
示例"单服务器,只允许我,只允许 #help":
{
channels: {
discord: {
enabled: true,
dm: { enabled: false },
guilds: {
YOUR_GUILD_ID: {
users: ["YOUR_USER_ID"],
requireMention: true,
channels: {
help: { allow: true, requireMention: true },
},
},
},
retry: {
attempts: 3,
minDelayMs: 500,
maxDelayMs: 30000,
jitter: 0.1,
},
},
},
}
注意:
requireMention: true 意味着机器人只在被提及时回复(推荐用于共享频道)。agents.list[].groupChat.mentionPatterns(或 messages.groupChat.mentionPatterns)对于服务器消息也算作提及。agents.list[].groupChat.mentionPatterns 上设置每个智能体的模式。channels,任何未列出的频道默认被拒绝。"*" 频道条目在所有频道应用默认值;显式频道条目覆盖通配符。requireMention、Skills、提示词等),除非你显式添加话题频道 ID。channels.discord.allowBots=true 允许它们(自己的消息仍被过滤)。channels.discord.allowBots=true),请使用 requireMention、channels.discord.guilds.*.channels.<id>.users 允许列表和/或在 AGENTS.md 和 SOUL.md 中设置明确的防护措施来防止机器人之间的回复循环。@Krill hello(或你的机器人名称)。openclaw doctor 和 openclaw channels status --probe(可操作的警告 + 快速审计)。requireMention: false 但仍然没有回复:channels.discord.groupPolicy 默认为 allowlist;将其设置为 "open" 或在 channels.discord.guilds 下添加服务器条目(可选择在 channels.discord.guilds.<id>.channels 下列出频道以进行限制)。DISCORD_BOT_TOKEN 而从未创建 channels.discord 部分,运行时会将 groupPolicy 默认为 open。添加 channels.discord.groupPolicy、channels.defaults.groupPolicy 或服务器/频道允许列表来锁定它。requireMention 必须位于 channels.discord.guilds(或特定频道)下。顶层的 channels.discord.requireMention 会被忽略。channels status --probe)只检查数字频道 ID。如果你使用 slug/名称作为 channels.discord.guilds.*.channels 键,审计无法验证权限。channels.discord.dm.enabled=false、channels.discord.dm.policy="disabled",或者你尚未被批准(channels.discord.dm.policy="pairing")。/approve <id> ... 仅用于转发的审批,不会解析 Discord 的按钮提示。如果你看到 ❌ Failed to submit approval: Error: unknown approval id 或 UI 从未出现,请检查:
channels.discord.textChunkLimit(默认 2000),并按行数分割长回复(channels.discord.maxLinesPerMessage,默认 17)。channels.discord.chunkMode="newline" 以在空行(段落边界)处分割,然后再进行长度分块。channels.discord.mediaMaxMb(默认 8 MB)。channels.discord.replyToMode 和回复标签启用。出站 Discord API 调用在速率限制(429)时使用 Discord retry_after(如果可用)进行重试,采用指数退避和抖动。通过 channels.discord.retry 配置。参见重试策略。
{
channels: {
discord: {
enabled: true,
token: "abc.123",
groupPolicy: "allowlist",
guilds: {
"*": {
channels: {
general: { allow: true },
},
},
},
mediaMaxMb: 8,
actions: {
reactions: true,
stickers: true,
emojiUploads: true,
stickerUploads: true,
polls: true,
permissions: true,
messages: true,
threads: true,
pins: true,
search: true,
memberInfo: true,
roleInfo: true,
roles: false,
channelInfo: true,
channels: true,
voiceStatus: true,
events: true,
moderation: false,
},
replyToMode: "off",
dm: {
enabled: true,
policy: "pairing", // pairing | allowlist | open | disabled
allowFrom: ["123456789012345678", "steipete"],
groupEnabled: false,
groupChannels: ["openclaw-dm"],
},
guilds: {
"*": { requireMention: true },
"123456789012345678": {
slug: "friends-of-openclaw",
requireMention: false,
reactionNotifications: "own",
users: ["987654321098765432", "steipete"],
channels: {
general: { allow: true },
help: {
allow: true,
requireMention: true,
users: ["987654321098765432"],
skills: ["search", "docs"],
systemPrompt: "Keep answers short.",
},
},
},
},
},
},
}
确认表情反应通过 messages.ackReaction + messages.ackReactionScope 全局控制。使用 messages.removeAckAfterReply 在机器人回复后清除确认表情反应。
dm.enabled:设置 false 忽略所有私信(默认 true)。dm.policy:私信访问控制(推荐 pairing)。"open" 需要 dm.allowFrom=["*"]。dm.allowFrom:私信允许列表(用户 ID 或名称)。用于 dm.policy="allowlist" 和 dm.policy="open" 验证。向导接受用户名,并在机器人可以搜索成员时将其解析为 ID。dm.groupEnabled:启用群组私信(默认 false)。dm.groupChannels:群组私信频道 ID 或 slug 的可选允许列表。groupPolicy:控制服务器频道处理(open|disabled|allowlist);allowlist 需要频道允许列表。guilds:按服务器规则,以服务器 ID(首选)或 slug 为键。guilds."*":当没有显式条目时应用的默认每服务器设置。guilds.<id>.slug:用于显示名称的可选友好 slug。guilds.<id>.users:可选的每服务器用户允许列表(ID 或名称)。guilds.<id>.tools:可选的每服务器工具策略覆盖(allow/deny/alsoAllow),在频道覆盖缺失时使用。guilds.<id>.toolsBySender:服务器级别的可选每发送者工具策略覆盖(在频道覆盖缺失时应用;支持 "*" 通配符)。guilds.<id>.channels.<channel>.allow:当 groupPolicy="allowlist" 时允许/拒绝频道。guilds.<id>.channels.<channel>.requireMention:频道的提及限制。guilds.<id>.channels.<channel>.tools:可选的每频道工具策略覆盖(allow/deny/alsoAllow)。guilds.<id>.channels.<channel>.toolsBySender:频道内的可选每发送者工具策略覆盖(支持 "*" 通配符)。guilds.<id>.channels.<channel>.users:可选的每频道用户允许列表。guilds.<id>.channels.<channel>.skills:Skills 过滤器(省略 = 所有 Skills,空 = 无)。guilds.<id>.channels.<channel>.systemPrompt:频道的额外系统提示词(与频道主题组合)。guilds.<id>.channels.<channel>.enabled:设置 false 禁用频道。guilds.<id>.channels:频道规则(键为频道 slug 或 ID)。guilds.<id>.requireMention:每服务器提及要求(可按频道覆盖)。guilds.<id>.reactionNotifications:表情反应系统事件模式(off、own、all、allowlist)。textChunkLimit:出站文本块大小(字符)。默认:2000。chunkMode:length(默认)仅在超过 textChunkLimit 时分割;newline 在空行(段落边界)处分割,然后再进行长度分块。maxLinesPerMessage:每条消息的软最大行数。默认:17。mediaMaxMb:限制保存到磁盘的入站媒体大小。historyLimit:回复提及时作为上下文包含的最近服务器消息数量(默认 20;回退到 messages.groupChat.historyLimit;0 禁用)。dmHistoryLimit:私信历史限制(用户轮次)。每用户覆盖:dms["<user_id>"].historyLimit。retry:出站 Discord API 调用的重试策略(attempts、minDelayMs、maxDelayMs、jitter)。pluralkit:解析 PluralKit 代理消息,使系统成员显示为不同的发送者。actions:每操作工具门控;省略允许所有(设置 false 禁用)。reactions(涵盖表情反应 + 读取表情反应)stickers、emojiUploads、stickerUploads、polls、permissions、messages、threads、pins、searchmemberInfo、roleInfo、channelInfo、voiceStatus、eventschannels(创建/编辑/删除频道 + 类别 + 权限)roles(角色添加/移除,默认 false)moderation(超时/踢出/封禁,默认 false)execApprovals:Discord 专用执行审批私信(按钮 UI)。支持 enabled、approvers、agentFilter、sessionFilter。表情反应通知使用 guilds.<id>.reactionNotifications:
off:无表情反应事件。own:机器人自己消息上的表情反应(默认)。all:所有消息上的所有表情反应。allowlist:来自 guilds.<id>.users 的用户在所有消息上的表情反应(空列表禁用)。启用 PK 查找,以便代理消息解析到底层系统 + 成员。启用后,OpenClaw 使用成员身份进行允许列表匹配,并将发送者标记为 Member (PK:System) 以避免意外的 Discord 提及。
{
channels: {
discord: {
pluralkit: {
enabled: true,
token: "pk_live_...", // 可选;私有系统需要
},
},
},
}
允许列表注意事项(启用 PK 时):
dm.allowFrom、guilds.<id>.users 或每频道 users 中使用 pk:<memberId>。channels.discord.allowBots=true。| 操作组 | 默认 | 说明 | | -------------- | ---- | ----------------------------------- | | reactions | 启用 | 表情反应 + 列出表情反应 + emojiList | | stickers | 启用 | 发送贴纸 | | emojiUploads | 启用 | 上传表情 | | stickerUploads | 启用 | 上传贴纸 | | polls | 启用 | 创建投票 | | permissions | 启用 | 频道权限快照 | | messages | 启用 | 读取/发送/编辑/删除 | | threads | 启用 | 创建/列出/回复 | | pins | 启用 | 置顶/取消置顶/列出 | | search | 启用 | 消息搜索(预览功能) | | memberInfo | 启用 | 成员信息 | | roleInfo | 启用 | 角色列表 | | channelInfo | 启用 | 频道信息 + 列表 | | channels | 启用 | 频道/类别管理 | | voiceStatus | 启用 | 语音状态查询 | | events | 启用 | 列出/创建预定事件 | | roles | 禁用 | 角色添加/移除 | | moderation | 禁用 | 超时/踢出/封禁 |
replyToMode:off(默认)、first 或 all。仅在模型包含回复标签时适用。要请求线程回复,模型可以在其输出中包含一个标签:
[[reply_to_current]] — 回复触发的 Discord 消息。[[reply_to:<id>]] — 回复上下文/历史中的特定消息 ID。当前消息 ID 作为 [message_id: …] 附加到提示词;历史条目已包含 ID。行为由 channels.discord.replyToMode 控制:
off:忽略标签。first:只有第一个出站块/附件是回复。all:每个出站块/附件都是回复。允许列表匹配注意事项:
allowFrom/users/groupChannels 接受 ID、名称、标签或像 <@id> 这样的提及。discord:/user:(用户)和 channel:(群组私信)等前缀。* 允许任何发送者/频道。guilds.<id>.channels 时,未列出的频道默认被拒绝。guilds.<id>.channels 时,允许列表中服务器的所有频道都被允许。channels.discord.groupPolicy: "disabled"(或保持空允许列表)。Guild/Channel 名称(公开 + 私有)并在可能时将其解析为 ID。原生命令注意事项:
channels.discord.dm.allowFrom、channels.discord.guilds、每频道规则)。智能体可以使用以下操作调用 discord:
react / reactions(添加或列出表情反应)sticker、poll、permissionsreadMessages、sendMessage、editMessage、deleteMessagetimestampMs(UTC 纪元毫秒)和 timestampUtc 以及原始 Discord timestamp。threadCreate、threadList、threadReplypinMessage、unpinMessage、listPinssearchMessages、memberInfo、roleInfo、roleAdd、roleRemove、emojiListchannelInfo、channelList、voiceStatus、eventList、eventCreatetimeout、kick、banDiscord 消息 ID 在注入的上下文中显示([discord message id: …] 和历史行),以便智能体可以定位它们。
表情可以是 unicode(例如 ✅)或自定义表情语法如 <:party_blob:1234567890>。
DISCORD_BOT_TOKEN 环境变量,或锁定配置文件权限。openclaw gateway --force)。