2026-02-10 · AI
32
AI · 2026-02-10

OpenClaw + Discord 完整配置指南:Guild、Channel、Session、Heartbeat 到底怎么对应

最近在配置 OpenClaw 的 Discord 通道时,很多人都会卡在同一个点:

这个问题本身就很典型。因为这里混了两层系统:Discord Gateway 层和 OpenClaw 应用层。

这篇我把整个关系一次讲清楚,并结合我现在的实际用法(多频道分区 + 独立 Session)给出可直接落地的配置。

更新时间:2026-02-10

先把名词对齐:Server、Guild、Channel、Thread、DM

在 Discord 里:

在 OpenClaw 里,消息并不是直接“绑在 Discord UI 结构”上,而是映射成 Session Key:

这就是第一层核心:Discord 是消息来源,OpenClaw 用 Session Key 管理上下文。

你看到的这段配置,具体代表什么

你给的片段:

"guilds": {
  "GUILD_ID_REDACTED": {
    "requireMention": false,
    "tools": {
      "allow": ["read", "exec", "web_fetch"],
      "deny": []
    },
    "users": ["USER_ID_REDACTED"],
    "channels": {
      "CHANNEL_ID_CODE_LAB": {
        "allow": true,
        "requireMention": false
      },
      "CHANNEL_ID_BRAINSTORM": {
        "allow": true,
        "requireMention": false
      }
    }
  }
}

上面示例已做脱敏处理,真实环境请替换为你自己的 ID。

它的含义是:

这块解决的是“谁能在什么频道触发什么能力”,不是 heartbeat 发送目标。

为什么 heartbeat 不会按 session_id 自动推到 Discord

这里最容易误解。

Heartbeat 相关其实有两种:

  1. Discord Gateway heartbeat(op1/op11)
  2. OpenClaw heartbeat(定时 agent turn)

Discord Gateway 的 session_id 是给断线恢复(Resume)用的,不是业务消息路由键。

OpenClaw heartbeat 是否外发、发到哪,取决于:

一句话:

你当前这种“分区使用”思路是对的

从你截图看,你已经在做很实用的分区:

这种结构特别适合 OpenClaw:

你可以继续沿这个方向,把“频道职责”写死成策略,而不是靠临时 prompt 管。

一套更稳的配置模板(可直接改)

{
  "session": {
    "dmScope": "per-channel-peer"
  },
  "channels": {
    "discord": {
      "token": "${DISCORD_BOT_TOKEN}",
      "heartbeat": {
        "showOk": true,
        "showAlerts": true
      },
      "guilds": {
        "GUILD_ID_REDACTED": {
          "requireMention": false,
          "users": ["USER_ID_REDACTED"],
          "tools": {
            "allow": ["read", "exec", "web_fetch"],
            "deny": []
          },
          "channels": {
            "CHANNEL_ID_CODE_LAB": { "allow": true, "requireMention": false },
            "CHANNEL_ID_BRAINSTORM": { "allow": true, "requireMention": false }
          }
        }
      }
    }
  },
  "agents": {
    "defaults": {
      "heartbeat": {
        "every": "30m",
        "session": "agent:YOUR_AGENT_ID:heartbeat",
        "target": "discord",
        "to": "channel:YOUR_CHANNEL_ID"
      }
    }
  }
}

这份配置做了三件事:

一键命令版(不想手改 JSON)

openclaw config set agents.defaults.heartbeat.target "discord"
openclaw config set agents.defaults.heartbeat.to "channel:YOUR_CHANNEL_ID"
openclaw config set channels.discord.heartbeat.showOk true --json
openclaw config set session.dmScope "per-channel-peer"
openclaw config set agents.defaults.heartbeat.session "agent:YOUR_AGENT_ID:heartbeat"
openclaw system event --text "heartbeat test" --mode now

如果想静默运行不发外部消息:

openclaw config set agents.defaults.heartbeat.target "none"

Bot 添加与权限,一次说全

1) 在 Discord Developer Portal 建 Bot

2) 打开必要 Intents

至少包括:

3) OAuth2 邀请到目标 Guild

常见权限:

建议最小权限原则,不要一开始就给 Administrator。

4) OpenClaw 侧最小配置

5) 快速验证

常见故障与定位顺序

现象:Bot 在线但频道不回复

优先查:

现象:Heartbeat 明明执行了,但频道没看到

优先查:

现象:上下文串线

优先查:

一个实用的频道治理建议

如果你已经有多频道分区,建议再加一层“通道职责表”:

这样你后面做自动化时,就能把“工具权限、消息路由、会话隔离”保持一致,不会越跑越乱。

参考链接

目录 最新
← 左侧翻上一屏 · 右侧翻下一屏 · 中间唤出菜单