消息平台
Discord
可通过官方 Discord Gateway 网关用于私信和服务器频道。
快速设置
你需要创建一个带机器人的新应用,将机器人添加到你的服务器,并将其配对到 OpenClaw。我们建议将机器人添加到你自己的私有服务器。如果你还没有服务器,请先创建一个(选择 Create My Own > For me and my friends)。
创建 Discord 应用和机器人
前往 Discord Developer Portal,点击 New Application。将它命名为类似 “OpenClaw” 的名称。
点击侧边栏中的 Bot。将 Username 设置为你的 OpenClaw 智能体名称。
启用特权意图
仍在 Bot 页面,向下滚动到 Privileged Gateway Intents 并启用:
- Message Content Intent(必需)
- Server Members Intent(推荐;角色允许列表和名称到 ID 匹配需要)
- Presence Intent(可选;仅存在状态更新需要)
复制你的机器人令牌
在 Bot 页面向上滚动,点击 Reset Token。
复制令牌并保存到某处。这就是你的 Bot Token,稍后会用到。
生成邀请 URL 并将机器人添加到你的服务器
点击侧边栏中的 OAuth2。你将生成一个带有正确权限的邀请 URL,用于将机器人添加到你的服务器。
向下滚动到 OAuth2 URL Generator 并启用:
botapplications.commands
下方会出现 Bot Permissions 部分。至少启用:
General Permissions
- 查看频道 Text Permissions
- 发送消息
- 读取消息历史
- 嵌入链接
- 附加文件
- 添加回应(可选)
这是普通文本频道的基线权限集。如果你计划在 Discord 话题中发帖,包括会创建或继续话题的论坛或媒体频道工作流,还需要启用 Send Messages in Threads。 复制底部生成的 URL,粘贴到浏览器中,选择你的服务器,然后点击 Continue 进行连接。现在你应该能在 Discord 服务器中看到你的机器人。
启用 Developer Mode 并收集你的 ID
回到 Discord 应用,你需要启用 Developer Mode,以便复制内部 ID。
- 点击 User Settings(头像旁的齿轮图标)→ Advanced → 打开 Developer Mode
- 右键点击侧边栏中的服务器图标 → Copy Server ID
- 右键点击你自己的头像 → Copy User ID
将你的 Server ID 和 User ID 与 Bot Token 一起保存;下一步你会把这三项都发送给 OpenClaw。
允许来自服务器成员的私信
要让配对正常工作,Discord 需要允许你的机器人向你发送私信。右键点击你的服务器图标 → Privacy Settings → 打开 Direct Messages。
这会允许服务器成员(包括机器人)向你发送私信。如果你想通过 Discord 私信使用 OpenClaw,请保持启用。如果你只计划使用服务器频道,可以在配对后禁用私信。
安全设置你的机器人令牌(不要在聊天中发送)
你的 Discord 机器人令牌是机密(类似密码)。请在运行 OpenClaw 的机器上设置它,然后再给你的智能体发消息。
export DISCORD_BOT_TOKEN="YOUR_BOT_TOKEN"
cat > discord.patch.json5 <<'JSON5'
{
channels: {
discord: {
enabled: true,
token: { source: "env", provider: "default", id: "DISCORD_BOT_TOKEN" },
},
},
}
JSON5
openclaw config patch --file ./discord.patch.json5 --dry-run
openclaw config patch --file ./discord.patch.json5
openclaw gateway
如果 OpenClaw 已经作为后台服务运行,请通过 OpenClaw Mac 应用重启它,或者停止并重启 openclaw gateway run 进程。
对于托管服务安装,请在存在 DISCORD_BOT_TOKEN 的 shell 中运行 openclaw gateway install,或者将变量存储在 ~/.openclaw/.env 中,这样服务重启后就能解析 env SecretRef。
如果你的主机被 Discord 的启动应用查找阻止或限速,请从 Developer Portal 设置 Discord application/client ID,这样启动时就能跳过该 REST 调用。默认账号使用 channels.discord.applicationId;运行多个 Discord 机器人时,使用 channels.discord.accounts.<accountId>.applicationId。
配置 OpenClaw 并配对
询问你的智能体
在任意现有渠道(例如 Telegram)中与你的 OpenClaw 智能体聊天并告知它。如果 Discord 是你的第一个渠道,请改用 CLI / 配置选项卡。
“我已经在配置中设置了 Discord 机器人令牌。请使用 User ID
<user_id>和 Server ID<server_id>完成 Discord 设置。”
CLI / 配置
如果你更喜欢基于文件的配置,请设置:
{
channels: {
discord: {
enabled: true,
token: {
source: "env",
provider: "default",
id: "DISCORD_BOT_TOKEN",
},
},
},
}
默认账号的 env 回退:
DISCORD_BOT_TOKEN=...
对于脚本化或远程设置,使用 openclaw config patch --file ./discord.patch.json5 --dry-run 写入相同的 JSON5 块,然后去掉 --dry-run 重新运行。支持明文 token 值。channels.discord.token 也支持跨 env/file/exec 提供商使用 SecretRef 值。请参阅密钥管理。
对于多个 Discord 机器人,请将每个机器人令牌和应用 ID 放在其账号下。顶层 channels.discord.applicationId 会被账号继承,因此只有在每个账号都应使用相同应用 ID 时才在那里设置它。
{
channels: {
discord: {
enabled: true,
accounts: {
personal: {
token: { source: "env", provider: "default", id: "DISCORD_PERSONAL_TOKEN" },
applicationId: "111111111111111111",
},
work: {
token: { source: "env", provider: "default", id: "DISCORD_WORK_TOKEN" },
applicationId: "222222222222222222",
},
},
},
},
}
批准第一次私信配对
等到 Gateway 网关运行后,在 Discord 中私信你的机器人。它会回复一个配对码。
询问你的智能体
在你现有的渠道中将配对码发送给你的智能体:
“批准这个 Discord 配对码:
<CODE>”
CLI
openclaw pairing list discord
openclaw pairing approve discord <CODE>
配对码会在 1 小时后过期。
现在你应该可以通过 Discord 私信与你的智能体聊天了。
推荐:设置服务器工作区
私信正常工作后,你可以将 Discord 服务器设置为完整工作区,让每个频道都有自己的智能体会话和上下文。对于只有你和你的机器人的私有服务器,推荐这样做。
将你的服务器添加到 guild 允许列表
这会允许你的智能体在服务器上的任何频道中响应,而不只是私信。
询问你的智能体
“将我的 Discord Server ID
<server_id>添加到 guild 允许列表”
配置
{
channels: {
discord: {
groupPolicy: "allowlist",
guilds: {
YOUR_SERVER_ID: {
requireMention: true,
users: ["YOUR_USER_ID"],
},
},
},
},
}
允许无需 @mention 的响应
默认情况下,你的智能体只有在服务器频道中被 @mentioned 时才会响应。对于私有服务器,你可能希望它响应每条消息。
在服务器频道中,普通助手最终回复默认保持私密。可见的 Discord 输出必须使用 message 工具显式发送,因此智能体可以默认旁观,只在判断频道回复有用时发帖。
这意味着所选模型必须可靠地调用工具。如果 Discord 显示正在输入,日志也显示了令牌使用量,但没有发布消息,请检查会话日志中是否有带 didSendViaMessagingTool: false 的助手文本。这意味着模型生成了私密最终答案,而不是调用 message(action=send)。请切换到更强的工具调用模型,或使用下面的配置恢复旧版自动最终回复。
询问你的智能体
“允许我的智能体在这个服务器上响应,而不必被 @mentioned”
配置
在你的 guild 配置中设置 requireMention: false:
{
channels: {
discord: {
guilds: {
YOUR_SERVER_ID: {
requireMention: false,
},
},
},
},
}
要为群组/频道房间恢复旧版自动最终回复,请设置 messages.groupChat.visibleReplies: "automatic"。
规划服务器频道中的记忆
默认情况下,长期记忆(MEMORY.md)只会在私信会话中加载。服务器频道不会自动加载 MEMORY.md。
询问你的智能体
“当我在 Discord 频道中提问时,如果你需要来自 MEMORY.md 的长期上下文,请使用 memory_search 或 memory_get。”
手动
如果你需要在每个频道中共享上下文,请将稳定指令放入 AGENTS.md 或 USER.md(它们会注入到每个会话中)。将长期笔记保存在 MEMORY.md 中,并按需通过记忆工具访问。
现在,在你的 Discord 服务器上创建一些频道并开始聊天。你的智能体可以看到频道名称,并且每个频道都有自己的隔离会话,所以你可以设置 #coding、#home、#research,或任何适合你工作流的频道。
运行时模型
- Gateway 网关负责 Discord 连接。
- 回复路由是确定性的:Discord 入站回复会回到 Discord。
- Discord 服务器/渠道元数据会作为不受信任的上下文添加到模型提示词中,而不是作为用户可见的回复前缀。如果模型把该封套复制回来,OpenClaw 会从出站回复和未来重放上下文中剥离复制的元数据。
- 默认情况下(
session.dmScope=main),直接聊天共享智能体主会话(agent:main:main)。 - 服务器渠道使用隔离的会话键(
agent:<agentId>:discord:channel:<channelId>)。 - 群组私信默认会被忽略(
channels.discord.dm.groupEnabled=false)。 - 原生斜杠命令在隔离的命令会话中运行(
agent:<agentId>:discord:slash:<userId>),同时仍携带CommandTargetSessionKey到路由后的对话会话。 - 面向 Discord 的纯文本 cron/heartbeat 公告投递只使用一次最终的助手可见答案。当智能体发出多个可投递载荷时,媒体和结构化组件载荷仍会保持多消息形式。
论坛渠道
Discord 论坛和媒体渠道只接受线程帖子。OpenClaw 支持两种创建方式:
- 向论坛父级(
channel:<forumId>)发送消息以自动创建线程。线程标题使用你消息中的第一行非空内容。 - 使用
openclaw message thread create直接创建线程。不要为论坛渠道传入--message-id。
示例:发送到论坛父级以创建线程
openclaw message send --channel discord --target channel:<forumId> \
--message "Topic title\nBody of the post"
示例:显式创建论坛线程
openclaw message thread create --channel discord --target channel:<forumId> \
--thread-name "Topic title" --message "Body of the post"
论坛父级不接受 Discord 组件。如果你需要组件,请发送到线程本身(channel:<threadId>)。
交互式组件
OpenClaw 支持用于智能体消息的 Discord 组件 v2 容器。使用带有 components 载荷的消息工具。交互结果会作为普通入站消息路由回智能体,并遵循现有的 Discord replyToMode 设置。
支持的区块:
text、section、separator、actions、media-gallery、file- 操作行最多允许 5 个按钮或单个选择菜单
- 选择类型:
string、user、role、mentionable、channel
默认情况下,组件只能使用一次。设置 components.reusable=true 可允许按钮、选择器和表单在过期前被多次使用。
要限制谁可以点击按钮,请在该按钮上设置 allowedUsers(Discord 用户 ID、标签或 *)。配置后,不匹配的用户会收到一条临时拒绝消息。
/model 和 /models 斜杠命令会打开一个交互式模型选择器,其中包含提供商、模型和兼容运行时下拉菜单以及提交步骤。/models add 已弃用,现在会返回弃用消息,而不是从聊天中注册模型。选择器回复是临时的,且只有调用用户可以使用它。
文件附件:
file区块必须指向附件引用(attachment://<filename>)- 通过
media/path/filePath提供附件(单个文件);多个文件请使用media-gallery - 当上传名称应匹配附件引用时,使用
filename覆盖上传名称
模态表单:
- 添加最多包含 5 个字段的
components.modal - 字段类型:
text、checkbox、radio、select、role-select、user-select - OpenClaw 会自动添加触发按钮
示例:
{
channel: "discord",
action: "send",
to: "channel:123456789012345678",
message: "Optional fallback text",
components: {
reusable: true,
text: "Choose a path",
blocks: [
{
type: "actions",
buttons: [
{
label: "Approve",
style: "success",
allowedUsers: ["123456789012345678"],
},
{ label: "Decline", style: "danger" },
],
},
{
type: "actions",
select: {
type: "string",
placeholder: "Pick an option",
options: [
{ label: "Option A", value: "a" },
{ label: "Option B", value: "b" },
],
},
},
],
modal: {
title: "Details",
triggerLabel: "Open form",
fields: [
{ type: "text", label: "Requester" },
{
type: "select",
label: "Priority",
options: [
{ label: "Low", value: "low" },
{ label: "High", value: "high" },
],
},
],
},
},
}
访问控制和路由
私信策略
channels.discord.dmPolicy 控制私信访问。channels.discord.allowFrom 是规范的私信允许列表。
pairing(默认)allowlistopen(要求channels.discord.allowFrom包含"*")disabled
如果私信策略不是开放的,未知用户会被阻止(或在 pairing 模式下被提示配对)。
多账号优先级:
channels.discord.accounts.default.allowFrom仅适用于default账号。- 对于单个账号,
allowFrom优先于旧版dm.allowFrom。 - 当命名账号自身的
allowFrom和旧版dm.allowFrom未设置时,它们会继承channels.discord.allowFrom。 - 命名账号不会继承
channels.discord.accounts.default.allowFrom。
旧版 channels.discord.dm.policy 和 channels.discord.dm.allowFrom 仍会为兼容性而读取。openclaw doctor --fix 会在不改变访问权限的前提下,将它们迁移到 dmPolicy 和 allowFrom。
用于投递的私信目标格式:
user:<id><@id>提及
当渠道默认值处于活动状态时,裸数字 ID 通常会解析为渠道 ID,但为了兼容性,账号有效私信 allowFrom 中列出的 ID 会被视为用户私信目标。
私信访问组
Discord 私信可以在 channels.discord.allowFrom 中使用动态 accessGroup:<name> 条目。
访问组名称在消息渠道之间共享。对于成员以各渠道常规 allowFrom 语法表示的静态组,请使用 type: "message.senders";当 Discord 渠道当前的 ViewChannel 受众应动态定义成员资格时,请使用 type: "discord.channelAudience"。共享访问组行为记录在这里:访问组。
{
accessGroups: {
operators: {
type: "message.senders",
members: {
"*": ["global-owner-id"],
discord: ["discord:123456789012345678"],
telegram: ["987654321"],
},
},
},
channels: {
discord: {
dmPolicy: "allowlist",
allowFrom: ["accessGroup:operators"],
},
},
}
Discord 文本渠道没有单独的成员列表。type: "discord.channelAudience" 将成员资格建模为:私信发送者是已配置服务器的成员,并且在应用角色和渠道覆盖项后,当前对已配置渠道拥有有效的 ViewChannel 权限。
示例:允许任何能看到 #maintainers 的人向机器人发送私信,同时对其他所有人保持私信关闭。
{
accessGroups: {
maintainers: {
type: "discord.channelAudience",
guildId: "1456350064065904867",
channelId: "1456744319972282449",
membership: "canViewChannel",
},
},
channels: {
discord: {
dmPolicy: "allowlist",
allowFrom: ["accessGroup:maintainers"],
},
},
}
你可以混合动态和静态条目:
{
accessGroups: {
maintainers: {
type: "discord.channelAudience",
guildId: "1456350064065904867",
channelId: "1456744319972282449",
},
},
channels: {
discord: {
dmPolicy: "allowlist",
allowFrom: ["accessGroup:maintainers", "discord:123456789012345678"],
},
},
}
查找会失败关闭。如果 Discord 返回 Missing Access,成员查找失败,或渠道属于不同服务器,则私信发送者会被视为未授权。
使用渠道受众访问组时,请在 Discord Developer Portal 中为机器人启用 Server Members Intent。私信不包含服务器成员状态,因此 OpenClaw 会在授权时通过 Discord REST 解析成员。
服务器策略
服务器处理由 channels.discord.groupPolicy 控制:
openallowlistdisabled
当 channels.discord 存在时,安全基线为 allowlist。
allowlist 行为:
- 服务器必须匹配
channels.discord.guilds(推荐使用id,也接受 slug) - 可选发送者允许列表:
users(推荐稳定 ID)和roles(仅角色 ID);如果配置了任一项,发送者匹配users或roles时即被允许 - 默认禁用直接名称/标签匹配;仅在破窗兼容模式下启用
channels.discord.dangerouslyAllowNameMatching: true users支持名称/标签,但 ID 更安全;使用名称/标签条目时,openclaw security audit会发出警告- 如果服务器配置了
channels,未列出的渠道会被拒绝 - 如果服务器没有
channels区块,则该已允许列表服务器中的所有渠道都被允许
示例:
{
channels: {
discord: {
groupPolicy: "allowlist",
guilds: {
"123456789012345678": {
requireMention: true,
ignoreOtherMentions: true,
users: ["987654321098765432"],
roles: ["123456789012345678"],
channels: {
general: { allow: true },
help: { allow: true, requireMention: true },
},
},
},
},
},
}
如果你只设置 DISCORD_BOT_TOKEN,且没有创建 channels.discord 区块,则运行时回退为 groupPolicy="allowlist"(日志中会有警告),即使 channels.defaults.groupPolicy 是 open。
提及和群组私信
服务器消息默认由提及门控。
提及检测包括:
- 显式机器人提及
- 已配置的提及模式(
agents.list[].groupChat.mentionPatterns,回退到messages.groupChat.mentionPatterns) - 受支持情况下的隐式回复机器人行为
编写出站 Discord 消息时,请使用规范提及语法:用户用 <@USER_ID>,渠道用 <#CHANNEL_ID>,角色用 <@&ROLE_ID>。不要使用旧版 <@!USER_ID> 昵称提及形式。
requireMention 按服务器/渠道配置(channels.discord.guilds...)。
ignoreOtherMentions 可选地丢弃提及其他用户/角色但未提及机器人的消息(不包括 @everyone/@here)。
群组私信:
- 默认:忽略(
dm.groupEnabled=false) - 可选允许列表通过
dm.groupChannels配置(渠道 ID 或 slug)
基于角色的智能体路由
使用 bindings[].match.roles 按角色 ID 将 Discord 服务器成员路由到不同智能体。基于角色的绑定仅接受角色 ID,并且在 peer 或 parent-peer 绑定之后、仅服务器绑定之前求值。如果某个绑定还设置了其他匹配字段(例如 peer + guildId + roles),则所有已配置字段都必须匹配。
{
bindings: [
{
agentId: "opus",
match: {
channel: "discord",
guildId: "123456789012345678",
roles: ["111111111111111111"],
},
},
{
agentId: "sonnet",
match: {
channel: "discord",
guildId: "123456789012345678",
},
},
],
}
原生命令和命令认证
commands.native默认为"auto",并对 Discord 启用。- 按渠道覆盖:
channels.discord.commands.native。 commands.native=false会在启动期间跳过 Discord 斜杠命令注册和清理。之前注册的命令可能仍会在 Discord 中可见,直到你从 Discord 应用中移除它们。- 原生命令认证使用与普通消息处理相同的 Discord allowlists/策略。
- 对未获授权的用户,命令可能仍会显示在 Discord UI 中;执行时仍会强制执行 OpenClaw 认证,并返回“未授权”。
请参阅斜杠命令了解命令目录和行为。
默认斜杠命令设置:
ephemeral: true
功能详情
回复标签和原生回复
Discord 支持智能体输出中的回复标签:
[[reply_to_current]][[reply_to:<id>]]
由 channels.discord.replyToMode 控制:
off(默认)firstallbatched
注意:off 会禁用隐式回复串联。显式 [[reply_to_*]] 标签仍会被遵循。
first 始终将隐式原生回复引用附加到该轮的第一条出站 Discord 消息。
batched 仅在入站轮次是多条消息经防抖后组成的批次时,才会附加 Discord 的隐式原生回复引用。若你主要希望在含义不明确的突发聊天中使用原生回复,而不是每个单消息轮次都使用,这会很有用。
消息 ID 会出现在上下文/历史中,便于智能体定位特定消息。
实时流式预览
OpenClaw 可以通过发送临时消息并在文本到达时编辑它来流式传输草稿回复。channels.discord.streaming 接受 off | partial | block | progress(默认)。progress 会保留一条可编辑的 Status 草稿,并用工具进度更新它,直到最终投递;streamMode 是旧版运行时别名。运行 openclaw doctor --fix 可将持久化配置改写为规范键。
将 channels.discord.streaming.mode 设置为 off 可禁用 Discord 预览编辑。如果显式启用了 Discord 分块流式传输,OpenClaw 会跳过预览流,以避免重复流式传输。
{
channels: {
discord: {
streaming: {
mode: "progress",
progress: {
label: "auto",
maxLines: 8,
toolProgress: true,
},
},
},
},
}
partial会在 token 到达时编辑单条预览消息。block会发出草稿大小的分块(使用draftChunk调整大小和断点,并受textChunkLimit限制)。- 媒体、错误和显式回复的最终消息会取消待处理的预览编辑。
streaming.preview.toolProgress(默认true)控制工具/进度更新是否复用预览消息。streaming.preview.commandText/streaming.progress.commandText控制紧凑进度行中的命令/执行详情:raw(默认)或status(仅工具标签)。
隐藏原始命令/执行文本,同时保留紧凑进度行:
{
"channels": {
"discord": {
"streaming": {
"mode": "progress",
"progress": {
"toolProgress": true,
"commandText": "status"
}
}
}
}
}
预览流式传输仅支持文本;媒体回复会回退到正常投递。当显式启用 block 流式传输时,OpenClaw 会跳过预览流,以避免重复流式传输。
历史、上下文和线程行为
公会历史上下文:
channels.discord.historyLimit默认20- 回退项:
messages.groupChat.historyLimit 0禁用
私信历史控制项:
channels.discord.dmHistoryLimitchannels.discord.dms["<user_id>"].historyLimit
线程行为:
- Discord 线程会作为渠道会话路由,并继承父渠道配置,除非被覆盖。
- 线程会话会继承父渠道的会话级
/model选择,作为仅模型的回退;线程本地的/model选择仍优先,并且父转录历史不会被复制,除非启用了转录继承。 channels.discord.thread.inheritParent(默认false)会让新的自动线程从父转录开始播种。按账号覆盖位于channels.discord.accounts.<id>.thread.inheritParent下。- 消息工具反应可以解析
user:<id>私信目标。 guilds.<guild>.channels.<channel>.requireMention: false会在回复阶段激活回退期间保留。
渠道主题会作为不受信任的上下文注入。Allowlists 控制谁可以触发智能体,并不是完整的补充上下文脱敏边界。
子智能体的线程绑定会话
Discord 可以将线程绑定到会话目标,使该线程中的后续消息继续路由到同一会话(包括子智能体会话)。
命令:
/focus <target>将当前/新线程绑定到子智能体/会话目标/unfocus移除当前线程绑定/agents显示活动运行和绑定状态/session idle <duration|off>检查/更新聚焦绑定的不活动自动取消聚焦时间/session max-age <duration|off>检查/更新聚焦绑定的硬性最大时长
配置:
{
session: {
threadBindings: {
enabled: true,
idleHours: 24,
maxAgeHours: 0,
},
},
channels: {
discord: {
threadBindings: {
enabled: true,
idleHours: 24,
maxAgeHours: 0,
spawnSessions: true,
defaultSpawnContext: "fork",
},
},
},
}
注意:
session.threadBindings.*设置全局默认值。channels.discord.threadBindings.*覆盖 Discord 行为。spawnSessions控制为sessions_spawn({ thread: true })和 ACP 线程生成自动创建/绑定线程。默认:true。defaultSpawnContext控制线程绑定生成的原生子智能体上下文。默认:"fork"。- 已弃用的
spawnSubagentSessions/spawnAcpSessions键会由openclaw doctor --fix迁移。 - 如果某个账号禁用了线程绑定,则
/focus和相关线程绑定操作不可用。
持久 ACP 渠道绑定
对于稳定的“始终在线”ACP 工作区,请配置面向 Discord 对话的顶层类型化 ACP 绑定。
配置路径:
- 带有
type: "acp"和match.channel: "discord"的bindings[]
示例:
{
agents: {
list: [
{
id: "codex",
runtime: {
type: "acp",
acp: {
agent: "codex",
backend: "acpx",
mode: "persistent",
cwd: "/workspace/openclaw",
},
},
},
],
},
bindings: [
{
type: "acp",
agentId: "codex",
match: {
channel: "discord",
accountId: "default",
peer: { kind: "channel", id: "222222222222222222" },
},
acp: { label: "codex-main" },
},
],
channels: {
discord: {
guilds: {
"111111111111111111": {
channels: {
"222222222222222222": {
requireMention: false,
},
},
},
},
},
},
}
注意:
/acp spawn codex --bind here会就地绑定当前渠道或线程,并让未来消息保持在同一 ACP 会话中。线程消息会继承父渠道绑定。- 在已绑定的渠道或线程中,
/new和/reset会就地重置同一 ACP 会话。临时线程绑定在活动时可以覆盖目标解析。 spawnSessions会门控通过--thread auto|here进行的子线程创建/绑定。
请参阅 ACP 智能体了解绑定行为详情。
反应通知
按公会设置的反应通知模式:
offown(默认)allallowlist(使用guilds.<id>.users)
反应事件会被转换为系统事件,并附加到路由后的 Discord 会话。
确认反应
ackReaction 会在 OpenClaw 处理入站消息时发送确认 emoji。
解析顺序:
channels.discord.accounts.<accountId>.ackReactionchannels.discord.ackReactionmessages.ackReaction- 智能体身份 emoji 回退(
agents.list[].identity.emoji,否则为 "👀")
注意:
- Discord 接受 unicode emoji 或自定义 emoji 名称。
- 使用
""可为渠道或账号禁用该反应。
配置写入
渠道发起的配置写入默认启用。
这会影响 /config set|unset 流程(当命令功能启用时)。
禁用:
{
channels: {
discord: {
configWrites: false,
},
},
}
Gateway 网关代理
通过带有 channels.discord.proxy 的 HTTP(S) 代理路由 Discord gateway WebSocket 流量和启动时 REST 查询(应用 ID + allowlist 解析)。
{
channels: {
discord: {
proxy: "http://proxy.example:8080",
},
},
}
按账号覆盖:
{
channels: {
discord: {
accounts: {
primary: {
proxy: "http://proxy.example:8080",
},
},
},
},
}
PluralKit 支持
启用 PluralKit 解析,将代理消息映射到系统成员身份:
{
channels: {
discord: {
pluralkit: {
enabled: true,
token: "pk_live_...", // optional; needed for private systems
},
},
},
}
注意:
- allowlists 可以使用
pk:<memberId> - 仅当
channels.discord.dangerouslyAllowNameMatching: true时,成员显示名称才会按名称/slug 匹配 - 查询使用原始消息 ID,并受时间窗口约束
- 如果查询失败,代理消息会被视为机器人消息并丢弃,除非
allowBots=true
出站提及别名
当智能体需要对已知 Discord 用户进行确定性的出站提及时,请使用 mentionAliases。键是不带前导 @ 的 handle;值是 Discord 用户 ID。未知 handle、@everyone、@here 以及 Markdown 代码跨度中的提及会保持不变。
{
channels: {
discord: {
mentionAliases: {
Vladislava: "123456789012345678",
},
accounts: {
ops: {
mentionAliases: {
OpsLead: "234567890123456789",
},
},
},
},
},
}
在线状态配置
当你设置状态或活动字段,或启用自动在线状态时,会应用在线状态更新。
仅状态示例:
{
channels: {
discord: {
status: "idle",
},
},
}
活动示例(自定义状态是默认活动类型):
{
channels: {
discord: {
activity: "Focus time",
activityType: 4,
},
},
}
流式传输示例:
{
channels: {
discord: {
activity: "Live coding",
activityType: 1,
activityUrl: "https://twitch.tv/openclaw",
},
},
}
活动类型映射:
- 0:Playing
- 1:Streaming(需要
activityUrl) - 2:Listening
- 3:Watching
- 4:Custom(使用活动文本作为状态 state;emoji 可选)
- 5:Competing
自动在线状态示例(运行时健康信号):
{
channels: {
discord: {
autoPresence: {
enabled: true,
intervalMs: 30000,
minUpdateIntervalMs: 15000,
exhaustedText: "token exhausted",
},
},
},
}
自动在线状态会将运行时可用性映射到 Discord 状态:healthy => online,degraded 或 unknown => idle,exhausted 或 unavailable => dnd。可选文本覆盖项:
autoPresence.healthyTextautoPresence.degradedTextautoPresence.exhaustedText(支持{reason}占位符)
Discord 中的审批
Discord 支持在私信中基于按钮处理审批,也可以选择在发起审批的渠道中发布审批提示。
配置路径:
channels.discord.execApprovals.enabledchannels.discord.execApprovals.approvers(可选;在可行时回退到commands.ownerAllowFrom)channels.discord.execApprovals.target(dm|channel|both,默认值:dm)agentFilter、sessionFilter、cleanupAfterResolve
当 enabled 未设置或为 "auto",且至少可以解析出一个审批人时,Discord 会自动启用原生 exec 审批;审批人可来自 execApprovals.approvers 或 commands.ownerAllowFrom。Discord 不会从渠道 allowFrom、旧版 dm.allowFrom 或私信 defaultTo 推断 exec 审批人。设置 enabled: false 可明确禁止 Discord 作为原生审批客户端。
对于 /diagnostics 和 /export-trajectory 等敏感的仅所有者可用群组命令,OpenClaw 会私下发送审批提示和最终结果。当调用命令的所有者有 Discord 所有者路由时,它会先尝试 Discord 私信;如果不可用,则回退到 commands.ownerAllowFrom 中第一个可用的所有者路由,例如 Telegram。
当 target 为 channel 或 both 时,审批提示会在渠道中可见。只有已解析的审批人可以使用按钮;其他用户会收到一条临时拒绝消息。审批提示包含命令文本,因此仅应在受信任的渠道中启用渠道投递。如果无法从会话键派生渠道 ID,OpenClaw 会回退到私信投递。
Discord 还会渲染其他聊天渠道使用的共享审批按钮。当这些按钮存在时,它们是主要的审批 UX;OpenClaw 仅应在工具结果表明聊天审批不可用,或手动审批是唯一路径时,才包含手动 /approve 命令。如果 Discord 原生审批运行时未激活,OpenClaw 会保持本地确定性的 /approve <id> <decision> 提示可见。如果运行时已激活,但原生卡片无法投递到任何目标,OpenClaw 会在同一聊天中发送回退通知,其中包含待处理审批中的确切 /approve 命令。
Gateway 网关认证和审批解析遵循共享 Gateway 网关客户端契约(plugin: ID 通过 plugin.approval.resolve 解析;其他 ID 通过 exec.approval.resolve 解析)。审批默认在 30 分钟后过期。
请参阅 Exec 审批。
工具和操作门控
Discord 消息操作包括消息、渠道管理、审核、在线状态和元数据操作。
核心示例:
- 消息:
sendMessage、readMessages、editMessage、deleteMessage、threadReply - 反应:
react、reactions、emojiList - 审核:
timeout、kick、ban - 在线状态:
setPresence
event-create 操作接受可选的 image 参数(URL 或本地文件路径),用于设置定时事件封面图。
操作门控位于 channels.discord.actions.* 下。
默认门控行为:
| 操作组 | 默认值 |
|---|---|
| reactions, messages, threads, pins, polls, search, memberInfo, roleInfo, channelInfo, channels, voiceStatus, events, stickers, emojiUploads, stickerUploads, permissions | enabled |
| roles | disabled |
| moderation | disabled |
| presence | disabled |
组件 v2 UI
OpenClaw 使用 Discord components v2 来处理 exec 审批和跨上下文标记。Discord 消息操作也可以接受 components 以实现自定义 UI(高级用法;需要通过 discord 工具构造组件载荷),而旧版 embeds 仍可使用,但不推荐。
channels.discord.ui.components.accentColor设置 Discord 组件容器使用的强调色(十六进制)。- 使用
channels.discord.accounts.<id>.ui.components.accentColor按账户设置。 - 当存在 components v2 时,
embeds会被忽略。
示例:
{
channels: {
discord: {
ui: {
components: {
accentColor: "#5865F2",
},
},
},
},
}
语音
Discord 有两个不同的语音表面:实时语音频道(连续对话)和语音消息附件(波形预览格式)。Gateway 网关同时支持两者。
语音频道
设置检查清单:
- 在 Discord Developer Portal 中启用 Message Content Intent。
- 使用角色/用户允许列表时,启用 Server Members Intent。
- 使用
bot和applications.commandsscope 邀请机器人。 - 在目标语音频道中授予 Connect、Speak、Send Messages 和 Read Message History 权限。
- 启用原生命令(
commands.native或channels.discord.commands.native)。 - 配置
channels.discord.voice。
使用 /vc join|leave|status 控制会话。该命令使用账户默认智能体,并遵循与其他 Discord 命令相同的允许列表和群组策略规则。
/vc join channel:<voice-channel-id>
/vc status
/vc leave
若要在加入前检查机器人的有效权限,请运行:
openclaw channels capabilities --channel discord --target channel:<voice-channel-id>
自动加入示例:
{
channels: {
discord: {
voice: {
enabled: true,
model: "openai/gpt-5.4-mini",
autoJoin: [
{
guildId: "123456789012345678",
channelId: "234567890123456789",
},
],
daveEncryption: true,
decryptionFailureTolerance: 24,
connectTimeoutMs: 30000,
reconnectGraceMs: 15000,
tts: {
provider: "openai",
openai: { voice: "onyx" },
},
},
},
},
}
说明:
voice.tts仅为语音播放覆盖messages.tts。voice.model仅覆盖用于 Discord 语音频道响应的 LLM。保持未设置可继承路由后的智能体模型。- STT 使用
tools.media.audio;voice.model不影响转录。 - 按渠道设置的 Discord
systemPrompt覆盖项适用于该语音频道的语音转录轮次。 - 语音转录轮次会从 Discord
allowFrom(或dm.allowFrom)派生所有者状态;非所有者说话者无法访问仅所有者可用工具(例如gateway和cron)。 - Discord 语音对纯文本配置是选择加入;设置
channels.discord.voice.enabled=true(或保留已有的channels.discord.voice块)以启用/vc命令、语音运行时和GuildVoiceStatesGateway 网关 intent。 channels.discord.intents.voiceStates可以显式覆盖语音状态 intent 订阅。保持未设置可让该 intent 跟随有效的语音启用状态。voice.daveEncryption和voice.decryptionFailureTolerance会透传给@discordjs/voicejoin 选项。- 如果未设置,
@discordjs/voice默认值为daveEncryption=true和decryptionFailureTolerance=24。 voice.connectTimeoutMs控制/vc join和自动加入尝试期间初始@discordjs/voiceReady 等待时间。默认值:30000。voice.reconnectGraceMs控制 OpenClaw 在销毁断开的语音会话前,等待其开始重新连接的时长。默认值:15000。- 语音播放不会仅因为其他用户开始说话而停止。为避免反馈循环,OpenClaw 会在 TTS 播放期间忽略新的语音捕获;请在播放结束后再说话以进入下一轮。
voice.captureSilenceGraceMs控制 Discord 报告说话者停止后,OpenClaw 在为 STT 完成该音频片段前等待的时长。默认值:2500;如果 Discord 将正常停顿拆分成零碎的部分转录,请调高此值。- 当 ElevenLabs 是所选 TTS 提供商时,Discord 语音播放会使用流式 TTS,并从提供商响应流开始。不支持流式传输的提供商会回退到合成临时文件路径。
- OpenClaw 还会监视接收解密失败,并在短时间窗口内重复失败后,通过离开并重新加入语音频道自动恢复。
- 如果更新后接收日志反复显示
DecryptionFailed(UnencryptedWhenPassthroughDisabled),请收集依赖报告和日志。内置的@discordjs/voice版本线包含来自 discord.js PR #11449 的上游 padding 修复,该修复关闭了 discord.js issue #11419。 The operation was aborted接收事件会在 OpenClaw 完成捕获的说话者片段时出现,这是预期行为;它们是详细诊断信息,不是警告。
语音频道流水线:
- Discord PCM 捕获会转换为 WAV 临时文件。
tools.media.audio处理 STT,例如openai/gpt-4o-mini-transcribe。- 转录文本会通过 Discord 入口和路由发送,同时响应 LLM 会以语音输出策略运行;该策略会隐藏智能体
tts工具并要求返回文本,因为 Discord 语音负责最终 TTS 播放。 - 设置
voice.model时,它仅覆盖此语音频道轮次的响应 LLM。 voice.tts会合并覆盖messages.tts;支持流式传输的提供商会直接馈送播放器,否则会在已加入的频道中播放生成的音频文件。
凭证按组件解析:voice.model 使用 LLM 路由认证,tools.media.audio 使用 STT 认证,messages.tts/voice.tts 使用 TTS 认证。
语音消息
Discord 语音消息会显示波形预览,并要求使用 OGG/Opus 音频。OpenClaw 会自动生成波形,但需要 Gateway 网关主机上的 ffmpeg 和 ffprobe 来检查和转换。
- 提供本地文件路径(URL 会被拒绝)。
- 省略文本内容(Discord 拒绝在同一载荷中同时包含文本和语音消息)。
- 接受任何音频格式;OpenClaw 会按需转换为 OGG/Opus。
message(action="send", channel="discord", target="channel:123", path="/path/to/audio.mp3", asVoice=true)
故障排除
使用了不允许的 intent,或机器人看不到服务器消息
- 启用 Message Content Intent
- 依赖用户/成员解析时,启用 Server Members Intent
- 更改 intent 后重启 Gateway 网关
服务器消息被意外阻止
- 检查
groupPolicy - 检查
channels.discord.guilds下的服务器允许列表 - 如果存在服务器
channels映射,则仅允许列出的渠道 - 检查
requireMention行为和提及模式
有用的检查:
openclaw doctor
openclaw channels status --probe
openclaw logs --follow
require mention 为 false 但仍被阻止
常见原因:
groupPolicy="allowlist"但没有匹配的服务器/渠道允许列表requireMention配置在了错误位置(必须位于channels.discord.guilds或渠道条目下)- 发送者被服务器/渠道
users允许列表阻止
长时间运行的 Discord 轮次或重复回复
典型日志:
Slow listener detected ...stuck session: sessionKey=agent:...:discord:... state=processing ...
Discord Gateway 网关队列参数:
- 单账号:
channels.discord.eventQueue.listenerTimeout - 多账号:
channels.discord.accounts.<accountId>.eventQueue.listenerTimeout - 这只控制 Discord Gateway 网关监听器工作,不控制智能体轮次生命周期
Discord 不会对排队的智能体轮次应用渠道拥有的超时。消息监听器会立即移交,排队的 Discord 运行会保留每个会话的顺序,直到会话/工具/运行时生命周期完成或中止该工作。
{
channels: {
discord: {
accounts: {
default: {
eventQueue: {
listenerTimeout: 120000,
},
},
},
},
},
}
Gateway 网关元数据查找超时警告
OpenClaw 会在连接前获取 Discord /gateway/bot 元数据。瞬时故障会回退到 Discord 的默认 Gateway 网关 URL,并在日志中限速记录。
元数据超时参数:
- 单账号:
channels.discord.gatewayInfoTimeoutMs - 多账号:
channels.discord.accounts.<accountId>.gatewayInfoTimeoutMs - 配置未设置时的环境变量回退:
OPENCLAW_DISCORD_GATEWAY_INFO_TIMEOUT_MS - 默认值:
30000(30 秒),最大值:120000
Gateway 网关 READY 超时重启
OpenClaw 会在启动期间以及运行时重连后等待 Discord 的 Gateway 网关 READY 事件。带启动错峰的多账号设置可能需要比默认值更长的启动 READY 窗口。
READY 超时参数:
- 启动单账号:
channels.discord.gatewayReadyTimeoutMs - 启动多账号:
channels.discord.accounts.<accountId>.gatewayReadyTimeoutMs - 配置未设置时的启动环境变量回退:
OPENCLAW_DISCORD_READY_TIMEOUT_MS - 启动默认值:
15000(15 秒),最大值:120000 - 运行时单账号:
channels.discord.gatewayRuntimeReadyTimeoutMs - 运行时多账号:
channels.discord.accounts.<accountId>.gatewayRuntimeReadyTimeoutMs - 配置未设置时的运行时环境变量回退:
OPENCLAW_DISCORD_RUNTIME_READY_TIMEOUT_MS - 运行时默认值:
30000(30 秒),最大值:120000
权限审计不匹配
channels status --probe 权限检查只适用于数字渠道 ID。
如果你使用 slug 键,运行时匹配仍然可以工作,但 probe 无法完整验证权限。
私信和配对问题
- 私信已禁用:
channels.discord.dm.enabled=false - 私信策略已禁用:
channels.discord.dmPolicy="disabled"(旧版:channels.discord.dm.policy) - 在
pairing模式下等待配对批准
机器人到机器人的循环
默认情况下,会忽略机器人发送的消息。
如果你设置 channels.discord.allowBots=true,请使用严格的提及和允许列表规则,以避免循环行为。
优先使用 channels.discord.allowBots="mentions",仅接受提及该机器人的机器人消息。
{
channels: {
discord: {
accounts: {
mantis: {
// Mantis listens to other bots only when they mention her.
allowBots: "mentions",
},
molty: {
// Molty listens to all bot-authored Discord messages.
allowBots: true,
mentionAliases: {
// Lets Molty write "@Mantis" and send a real Discord mention.
Mantis: "MANTIS_DISCORD_USER_ID",
},
},
},
},
},
}
语音 STT 因 DecryptionFailed(...) 丢弃
- 保持 OpenClaw 为最新版本(
openclaw update),以确保包含 Discord 语音接收恢复逻辑 - 确认
channels.discord.voice.daveEncryption=true(默认) - 从
channels.discord.voice.decryptionFailureTolerance=24(上游默认值)开始,仅在需要时调优 - 查看日志中的:
discord voice: DAVE decrypt failures detecteddiscord voice: repeated decrypt failures; attempting rejoin
- 如果自动重新加入后故障仍然持续,请收集日志,并与 discord.js #11419 和 discord.js #11449 中的上游 DAVE 接收历史进行比较
配置参考
主要参考:配置参考 - Discord。
高信号 Discord 字段
- 启动/认证:
enabled,token,accounts.*,allowBots - 策略:
groupPolicy,dm.*,guilds.*,guilds.*.channels.* - 命令:
commands.native,commands.useAccessGroups,configWrites,slashCommand.* - 事件队列:
eventQueue.listenerTimeout(监听器预算)、eventQueue.maxQueueSize,eventQueue.maxConcurrency - Gateway 网关:
gatewayInfoTimeoutMs,gatewayReadyTimeoutMs,gatewayRuntimeReadyTimeoutMs - 回复/历史:
replyToMode,historyLimit,dmHistoryLimit,dms.*.historyLimit - 投递:
textChunkLimit,chunkMode,maxLinesPerMessage - 流式传输:
streaming(旧版别名:streamMode)、streaming.preview.toolProgress,draftChunk,blockStreaming,blockStreamingCoalesce - 媒体/重试:
mediaMaxMb(限制出站 Discord 上传,默认100MB)、retry - 操作:
actions.* - 在线状态:
activity,status,activityType,activityUrl - UI:
ui.components.accentColor - 功能:
threadBindings, 顶层bindings[](type: "acp")、pluralkit,execApprovals,intents,agentComponents,heartbeat,responsePrefix
安全与运维
- 将机器人令牌视为密钥(在受监督环境中优先使用
DISCORD_BOT_TOKEN)。 - 授予最低权限的 Discord 权限。
- 如果命令部署/状态已过期,请重启 Gateway 网关,并使用
openclaw channels status --probe重新检查。