消息平台

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 并启用:

    • bot
    • applications.commands

    下方会出现 Bot Permissions 部分。至少启用:

    General Permissions

    • 查看频道 Text Permissions
    • 发送消息
    • 读取消息历史
    • 嵌入链接
    • 附加文件
    • 添加回应(可选)

    这是普通文本频道的基线权限集。如果你计划在 Discord 话题中发帖,包括会创建或继续话题的论坛或媒体频道工作流,还需要启用 Send Messages in Threads。 复制底部生成的 URL,粘贴到浏览器中,选择你的服务器,然后点击 Continue 进行连接。现在你应该能在 Discord 服务器中看到你的机器人。

  • 启用 Developer Mode 并收集你的 ID

    回到 Discord 应用,你需要启用 Developer Mode,以便复制内部 ID。

    1. 点击 User Settings(头像旁的齿轮图标)→ Advanced → 打开 Developer Mode
    2. 右键点击侧边栏中的服务器图标Copy Server ID
    3. 右键点击你自己的头像Copy User ID

    将你的 Server IDUser 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 配对码:&lt;CODE&gt;

    CLI

    openclaw pairing list discord
    openclaw pairing approve discord &lt;CODE&gt;
    

    配对码会在 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.mdUSER.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 设置。

    支持的区块:

    • textsectionseparatoractionsmedia-galleryfile
    • 操作行最多允许 5 个按钮或单个选择菜单
    • 选择类型:stringuserrolementionablechannel

    默认情况下,组件只能使用一次。设置 components.reusable=true 可允许按钮、选择器和表单在过期前被多次使用。

    要限制谁可以点击按钮,请在该按钮上设置 allowedUsers(Discord 用户 ID、标签或 *)。配置后,不匹配的用户会收到一条临时拒绝消息。

    /model/models 斜杠命令会打开一个交互式模型选择器,其中包含提供商、模型和兼容运行时下拉菜单以及提交步骤。/models add 已弃用,现在会返回弃用消息,而不是从聊天中注册模型。选择器回复是临时的,且只有调用用户可以使用它。

    文件附件:

    • file 区块必须指向附件引用(attachment://<filename>
    • 通过 media/path/filePath 提供附件(单个文件);多个文件请使用 media-gallery
    • 当上传名称应匹配附件引用时,使用 filename 覆盖上传名称

    模态表单:

    • 添加最多包含 5 个字段的 components.modal
    • 字段类型:textcheckboxradioselectrole-selectuser-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(默认)
    • allowlist
    • open(要求 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.policychannels.discord.dm.allowFrom 仍会为兼容性而读取。openclaw doctor --fix 会在不改变访问权限的前提下,将它们迁移到 dmPolicyallowFrom

    用于投递的私信目标格式:

    • 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 控制:

    • open
    • allowlist
    • disabled

    channels.discord 存在时,安全基线为 allowlist

    allowlist 行为:

    • 服务器必须匹配 channels.discord.guilds(推荐使用 id,也接受 slug)
    • 可选发送者允许列表:users(推荐稳定 ID)和 roles(仅角色 ID);如果配置了任一项,发送者匹配 usersroles 时即被允许
    • 默认禁用直接名称/标签匹配;仅在破窗兼容模式下启用 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.groupPolicyopen

    提及和群组私信

    服务器消息默认由提及门控。

    提及检测包括:

    • 显式机器人提及
    • 已配置的提及模式(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(默认)
    • first
    • all
    • batched

    注意: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.dmHistoryLimit
    • channels.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 渠道绑定

    对于稳定的“始终在线”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 智能体了解绑定行为详情。

    反应通知

    按公会设置的反应通知模式:

    • off
    • own(默认)
    • all
    • allowlist(使用 guilds.<id>.users

    反应事件会被转换为系统事件,并附加到路由后的 Discord 会话。

    确认反应

    ackReaction 会在 OpenClaw 处理入站消息时发送确认 emoji。

    解析顺序:

    • channels.discord.accounts.<accountId>.ackReaction
    • channels.discord.ackReaction
    • messages.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.healthyText
    • autoPresence.degradedText
    • autoPresence.exhaustedText(支持 {reason} 占位符)
    Discord 中的审批

    Discord 支持在私信中基于按钮处理审批,也可以选择在发起审批的渠道中发布审批提示。

    配置路径:

    • channels.discord.execApprovals.enabled
    • channels.discord.execApprovals.approvers(可选;在可行时回退到 commands.ownerAllowFrom
    • channels.discord.execApprovals.targetdm | channel | both,默认值:dm
    • agentFiltersessionFiltercleanupAfterResolve

    enabled 未设置或为 "auto",且至少可以解析出一个审批人时,Discord 会自动启用原生 exec 审批;审批人可来自 execApprovals.approverscommands.ownerAllowFrom。Discord 不会从渠道 allowFrom、旧版 dm.allowFrom 或私信 defaultTo 推断 exec 审批人。设置 enabled: false 可明确禁止 Discord 作为原生审批客户端。

    对于 /diagnostics/export-trajectory 等敏感的仅所有者可用群组命令,OpenClaw 会私下发送审批提示和最终结果。当调用命令的所有者有 Discord 所有者路由时,它会先尝试 Discord 私信;如果不可用,则回退到 commands.ownerAllowFrom 中第一个可用的所有者路由,例如 Telegram。

    targetchannelboth 时,审批提示会在渠道中可见。只有已解析的审批人可以使用按钮;其他用户会收到一条临时拒绝消息。审批提示包含命令文本,因此仅应在受信任的渠道中启用渠道投递。如果无法从会话键派生渠道 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 消息操作包括消息、渠道管理、审核、在线状态和元数据操作。

    核心示例:

    • 消息:sendMessagereadMessageseditMessagedeleteMessagethreadReply
    • 反应:reactreactionsemojiList
    • 审核:timeoutkickban
    • 在线状态: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 网关同时支持两者。

    语音频道

    设置检查清单:

    1. 在 Discord Developer Portal 中启用 Message Content Intent。
    2. 使用角色/用户允许列表时,启用 Server Members Intent。
    3. 使用 botapplications.commands scope 邀请机器人。
    4. 在目标语音频道中授予 Connect、Speak、Send Messages 和 Read Message History 权限。
    5. 启用原生命令(commands.nativechannels.discord.commands.native)。
    6. 配置 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.audiovoice.model 不影响转录。
    • 按渠道设置的 Discord systemPrompt 覆盖项适用于该语音频道的语音转录轮次。
    • 语音转录轮次会从 Discord allowFrom(或 dm.allowFrom)派生所有者状态;非所有者说话者无法访问仅所有者可用工具(例如 gatewaycron)。
    • Discord 语音对纯文本配置是选择加入;设置 channels.discord.voice.enabled=true(或保留已有的 channels.discord.voice 块)以启用 /vc 命令、语音运行时和 GuildVoiceStates Gateway 网关 intent。
    • channels.discord.intents.voiceStates 可以显式覆盖语音状态 intent 订阅。保持未设置可让该 intent 跟随有效的语音启用状态。
    • voice.daveEncryptionvoice.decryptionFailureTolerance 会透传给 @discordjs/voice join 选项。
    • 如果未设置,@discordjs/voice 默认值为 daveEncryption=truedecryptionFailureTolerance=24
    • voice.connectTimeoutMs 控制 /vc join 和自动加入尝试期间初始 @discordjs/voice Ready 等待时间。默认值: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 网关主机上的 ffmpegffprobe 来检查和转换。

    • 提供本地文件路径(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 detected
      • discord voice: repeated decrypt failures; attempting rejoin
    • 如果自动重新加入后故障仍然持续,请收集日志,并与 discord.js #11419discord.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 重新检查。

    相关内容