準備好透過官方 Discord Gateway 用於私訊和伺服器頻道。Documentation Index
Fetch the complete documentation index at: https://docs.openclaw.ai/llms.txt
Use this file to discover all available pages before exploring further.
配對
斜線指令
頻道疑難排解
快速設定
你需要建立一個包含 Bot 的新應用程式、將 Bot 加入你的伺服器,並將它配對到 OpenClaw。我們建議將 Bot 加入你自己的私人伺服器。如果你還沒有伺服器,請先建立一個(選擇 建立我自己的 > 給我和我的朋友)。建立 Discord 應用程式和 Bot
啟用特殊權限意圖
- Message Content Intent(必要)
- Server Members Intent(建議;角色允許清單與名稱對 ID 比對需要)
- Presence Intent(選用;只有在需要狀態更新時才需要)
複製你的 Bot token
產生邀請 URL 並將 Bot 加入你的伺服器
botapplications.commands
- 檢視頻道 文字權限
- 傳送訊息
- 讀取訊息歷史
- 嵌入連結
- 附加檔案
- 新增回應(選用)
啟用開發者模式並收集你的 ID
- 點選 使用者設定(你頭像旁的齒輪圖示)→ 進階 → 開啟 開發者模式
- 在側邊欄右鍵點選你的 伺服器圖示 → 複製伺服器 ID
- 右鍵點選你 自己的頭像 → 複製使用者 ID
允許伺服器成員傳送私訊
安全地設定你的 Bot token(不要在聊天中傳送)
openclaw gateway run 行程來重新啟動它。
對於受管理的服務安裝,請從存在 DISCORD_BOT_TOKEN 的 shell 執行 openclaw gateway install,或將變數儲存在 ~/.openclaw/.env,讓服務在重新啟動後能解析 env SecretRef。
如果你的主機受到 Discord 啟動應用程式查詢封鎖或速率限制,請從 Developer Portal 設定 Discord 應用程式/client ID,讓啟動可以略過該 REST 呼叫。預設帳戶請使用 channels.discord.applicationId;執行多個 Discord Bot 時,請使用 channels.discord.accounts.<accountId>.applicationId。設定 OpenClaw 並配對
- 詢問你的代理程式
- CLI / config
「我已經在 config 中設定 Discord Bot token。請使用 User ID<user_id>和 Server ID<server_id>完成 Discord 設定。」
DISCORD_BOT_TOKEN 只會用於預設帳戶。
如果兩個已啟用的 Discord 帳戶解析到相同的 Bot token,OpenClaw 只會為該 token 啟動一個 Gateway 監視器。來自 config 的 token 優先於預設 env 備援;否則第一個已啟用的帳戶會勝出,重複帳戶會回報為已停用。
對於進階外送呼叫(message tool/頻道動作),明確的逐次呼叫 token 會用於該呼叫。這適用於傳送與讀取/探測類動作(例如 read/search/fetch/thread/pins/permissions)。帳戶政策/重試設定仍來自作用中執行階段快照中選取的帳戶。建議:設定伺服器工作區
私訊開始運作後,你可以將 Discord 伺服器設定為完整工作區,讓每個頻道都有自己的代理程式工作階段與自己的情境。這建議用於只有你和 Bot 的私人伺服器。將你的伺服器加入伺服器允許清單
- 詢問你的代理程式
- Config
「將我的 Discord Server ID <server_id> 加入伺服器允許清單」
允許不使用 @mention 的回應
message tool 傳送,因此代理程式可以預設旁觀,只有在判斷頻道回覆有用時才發文。- 詢問你的代理程式
- Config
「允許我的代理程式在這個伺服器上回應,而不必被 @mentioned」
#coding、#home、#research,或任何符合你工作流程的頻道。
執行階段模型
- Gateway 擁有 Discord 連線。
- 回覆路由是確定性的:Discord 傳入回覆會回到 Discord。
- Discord 伺服器/頻道中繼資料會以不受信任的 脈絡加入模型提示,而不是作為使用者可見的回覆前綴。如果模型把該封套 複製回來,OpenClaw 會從傳出回覆和 之後的重播脈絡中移除複製的中繼資料。
- 預設情況下(
session.dmScope=main),直接聊天會共用代理程式主工作階段(agent:main:main)。 - 伺服器頻道會使用隔離的工作階段鍵(
agent:<agentId>:discord:channel:<channelId>)。 - 群組 DM 預設會被忽略(
channels.discord.dm.groupEnabled=false)。 - 原生斜線命令會在隔離的命令工作階段中執行(
agent:<agentId>:discord:slash:<userId>),同時仍會攜帶CommandTargetSessionKey到路由後的對話工作階段。 - 傳送到 Discord 的純文字 Cron/Heartbeat 公告會使用最終 助理可見答案一次。當代理程式發出多個可傳遞承載時,媒體和結構化元件承載仍會 以多則訊息傳送。
論壇頻道
Discord 論壇和媒體頻道只接受討論串貼文。OpenClaw 支援兩種建立方式:- 傳送訊息到論壇父層(
channel:<forumId>)以自動建立討論串。討論串標題會使用你訊息中的第一個非空白行。 - 使用
openclaw message thread create直接建立討論串。論壇頻道請不要傳入--message-id。
channel:<threadId>)。
互動式元件
OpenClaw 支援用於代理程式訊息的 Discord components 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 會自動加入觸發按鈕
存取控制與路由
- DM policy
- Guild policy
- Mentions and group DMs
channels.discord.dmPolicy 控制 DM 存取。channels.discord.allowFrom 是標準 DM 允許清單。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。傳遞用的 DM 目標格式:user:<id><@id>提及
allowFrom 中的 ID 會被視為使用者 DM 目標以維持相容性。以角色為基礎的代理程式路由
使用bindings[].match.roles 依角色 ID 將 Discord 伺服器成員路由到不同代理程式。以角色為基礎的繫結只接受角色 ID,並且會在對等或父層對等繫結之後、僅限伺服器繫結之前評估。如果繫結也設定其他比對欄位(例如 peer + guildId + roles),所有已設定欄位都必須符合。
原生命令與命令授權
commands.native預設為"auto",並已為 Discord 啟用。- 依頻道覆寫:
channels.discord.commands.native。 commands.native=false會明確清除先前註冊的 Discord 原生命令。- 原生命令授權使用與一般訊息處理相同的 Discord 允許清單/政策。
- 未授權的使用者可能仍會在 Discord UI 中看到命令;執行時仍會強制套用 OpenClaw 授權並傳回「未授權」。
ephemeral: true
功能詳細資料
Reply tags and native replies
Reply tags and native replies
Live stream preview
Live stream preview
channels.discord.streaming 接受 off(預設)| partial | block | progress。在 Discord 上,progress 會對應到 partial;streamMode 是舊版別名,且會自動遷移。預設維持 off,因為當多個 bot 或 Gateway 共用一個帳號時,Discord 預覽編輯很快就會觸及速率限制。partial會在 token 抵達時編輯單一預覽訊息。block會發出草稿大小的區塊(使用draftChunk調整大小和斷點,並限制在textChunkLimit內)。- 媒體、錯誤和明確回覆的最終訊息會取消待處理的預覽編輯。
streaming.preview.toolProgress(預設true)控制工具/進度更新是否重用預覽訊息。
block 串流時,OpenClaw 會略過預覽串流以避免雙重串流。History, context, and thread behavior
History, context, and thread behavior
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>DM 目標。 guilds.<guild>.channels.<channel>.requireMention: false會在回覆階段啟用備援期間保留。
Thread-bound sessions for subagents
Thread-bound sessions for subagents
/focus <target>將目前/新的執行緒繫結到子代理/工作階段目標/unfocus移除目前的執行緒繫結/agents顯示作用中的執行與繫結狀態/session idle <duration|off>檢查/更新聚焦繫結的非活動自動取消聚焦/session max-age <duration|off>檢查/更新聚焦繫結的硬性最長存在時間
session.threadBindings.*設定全域預設值。channels.discord.threadBindings.*覆寫 Discord 行為。spawnSubagentSessions必須為 true,才能為sessions_spawn({ thread: true })自動建立/繫結執行緒。spawnAcpSessions必須為 true,才能為 ACP(/acp spawn ... --thread ...或sessions_spawn({ runtime: "acp", thread: true }))自動建立/繫結執行緒。- 如果帳號停用執行緒繫結,
/focus和相關的執行緒繫結操作將不可用。
Persistent ACP channel bindings
Persistent ACP channel bindings
bindings[]搭配type: "acp"和match.channel: "discord"
/acp spawn codex --bind here會就地繫結目前頻道或執行緒,並讓未來訊息保留在同一個 ACP 工作階段。執行緒訊息會繼承父頻道繫結。- 在已繫結的頻道或執行緒中,
/new和/reset會就地重設同一個 ACP 工作階段。暫時執行緒繫結在啟用期間可以覆寫目標解析。 - 只有當 OpenClaw 需要透過
--thread auto|here建立/繫結子執行緒時,才需要spawnAcpSessions。
Reaction notifications
Reaction notifications
offown(預設)allallowlist(使用guilds.<id>.users)
Ack reactions
Ack reactions
ackReaction 會在 OpenClaw 處理傳入訊息時傳送確認 emoji。解析順序:channels.discord.accounts.<accountId>.ackReactionchannels.discord.ackReactionmessages.ackReaction- 代理身分 emoji 備援(
agents.list[].identity.emoji,否則為 ”👀”)
- Discord 接受 unicode emoji 或自訂 emoji 名稱。
- 使用
""可停用頻道或帳號的反應。
Config writes
Config writes
/config set|unset 流程(當命令功能啟用時)。停用:Gateway proxy
Gateway proxy
channels.discord.proxy 路由 Discord Gateway WebSocket 流量和啟動 REST 查詢(應用程式 ID + 允許清單解析)。PluralKit support
PluralKit support
- 允許清單可以使用
pk:<memberId> - 只有當
channels.discord.dangerouslyAllowNameMatching: true時,才會依名稱/slug 比對成員顯示名稱 - 查詢使用原始訊息 ID,並受時間窗限制
- 如果查詢失敗,代理訊息會被視為機器人訊息並丟棄,除非
allowBots=true
Presence configuration
Presence configuration
- 0: Playing
- 1: Streaming(需要
activityUrl) - 2: Listening
- 3: Watching
- 4: Custom(使用活動文字作為狀態狀態;emoji 為選填)
- 5: Competing
autoPresence.healthyTextautoPresence.degradedTextautoPresence.exhaustedText(支援{reason}placeholder)
Approvals in Discord
Approvals in 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 DM;如果不可用,則退回到 commands.ownerAllowFrom 中第一個可用的擁有者路由,例如 Telegram。當 target 為 channel 或 both 時,核准提示會在頻道中可見。只有已解析的核准者可以使用按鈕;其他使用者會收到暫時性拒絕。核准提示包含命令文字,因此只應在受信任頻道中啟用頻道傳送。如果無法從工作階段鍵推導頻道 ID,OpenClaw 會退回到 DM 傳送。Discord 也會呈現其他聊天頻道使用的共用核准按鈕。原生 Discord 配接器主要新增核准者 DM 路由和頻道扇出。
當這些按鈕存在時,它們是主要的核准 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 | 啟用 |
| roles | 停用 |
| moderation | 停用 |
| presence | 停用 |
元件 v2 UI
OpenClaw 使用 Discord 元件 v2 來處理執行核准和跨情境標記。Discord 訊息動作也可以接受components 以提供自訂 UI(進階;需要透過 discord 工具建構元件承載資料),而舊版 embeds 仍可使用,但不建議使用。
channels.discord.ui.components.accentColor設定 Discord 元件容器使用的強調色(十六進位)。- 使用
channels.discord.accounts.<id>.ui.components.accentColor針對每個帳號設定。 - 當元件 v2 存在時,會忽略
embeds。
語音
Discord 有兩種不同的語音介面:即時 語音頻道(連續對話)和 語音訊息附件(波形預覽格式)。Gateway 兩者都支援。語音頻道
設定檢查清單:- 在 Discord Developer Portal 中啟用訊息內容意圖。
- 使用角色/使用者允許清單時,啟用伺服器成員意圖。
- 使用
bot和applications.commands範圍邀請機器人。 - 在目標語音頻道授予連線、說話、傳送訊息和讀取訊息歷史權限。
- 啟用原生命令(
commands.native或channels.discord.commands.native)。 - 設定
channels.discord.voice。
/vc join|leave|status 控制工作階段。該命令會使用帳號預設代理,並遵循與其他 Discord 命令相同的允許清單和群組政策規則。
voice.tts只會針對語音播放覆寫messages.tts。voice.model只會覆寫用於 Discord 語音頻道回應的 LLM。未設定時會繼承已路由代理的模型。- STT 使用
tools.media.audio;voice.model不會影響轉錄。 - 語音逐字稿回合會從 Discord
allowFrom(或dm.allowFrom)衍生擁有者狀態;非擁有者說話者無法存取僅限擁有者的工具(例如gateway和cron)。 - 語音預設啟用;設定
channels.discord.voice.enabled=false可停用語音執行階段和GuildVoiceStatesGateway 意圖。 channels.discord.intents.voiceStates可以明確覆寫語音狀態意圖訂閱。未設定時,該意圖會跟隨voice.enabled。voice.daveEncryption和voice.decryptionFailureTolerance會傳遞至@discordjs/voice加入選項。- 若未設定,
@discordjs/voice的預設值為daveEncryption=true和decryptionFailureTolerance=24。 - OpenClaw 也會監看接收解密失敗,並在短時間內反覆失敗後,透過離開/重新加入語音頻道自動復原。
- 如果更新後接收日誌反覆顯示
DecryptionFailed(UnencryptedWhenPassthroughDisabled),請收集相依性報告和日誌。隨附的@discordjs/voice版本線包含來自 discord.js PR #11449 的上游填充修正,該修正關閉了 discord.js issue #11419。
- Discord PCM 擷取會轉換為 WAV 暫存檔。
tools.media.audio處理 STT,例如openai/gpt-4o-mini-transcribe。- 逐字稿會透過一般 Discord 入口和路由傳送。
- 設定
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。
疑難排解
Used disallowed intents or bot sees no guild messages
Used disallowed intents or bot sees no guild messages
- 啟用訊息內容意圖
- 當你依賴使用者/成員解析時,啟用伺服器成員意圖
- 變更意圖後重新啟動 Gateway
Guild messages blocked unexpectedly
Guild messages blocked unexpectedly
- 驗證
groupPolicy - 驗證
channels.discord.guilds下的伺服器允許清單 - 如果伺服器
channels對應存在,則只允許列出的頻道 - 驗證
requireMention行為和提及模式
Require mention false but still blocked
Require mention false but still blocked
groupPolicy="allowlist"但沒有相符的伺服器/頻道允許清單requireMention設定在錯誤位置(必須位於channels.discord.guilds或頻道項目下)- 傳送者遭伺服器/頻道
users允許清單封鎖
Long-running Discord turns or duplicate replies
Long-running Discord turns or duplicate replies
Slow listener detected ...stuck session: sessionKey=agent:...:discord:... state=processing ...
- 單帳號:
channels.discord.eventQueue.listenerTimeout - 多帳號:
channels.discord.accounts.<accountId>.eventQueue.listenerTimeout - 這只控制 Discord Gateway 監聽器工作,不控制代理回合生命週期
Gateway metadata lookup timeout warnings
Gateway metadata lookup timeout warnings
/gateway/bot 中繼資料。暫時性失敗會退回 Discord 的預設 Gateway URL,並在日誌中限速記錄。中繼資料逾時調整項:- 單帳號:
channels.discord.gatewayInfoTimeoutMs - 多帳號:
channels.discord.accounts.<accountId>.gatewayInfoTimeoutMs - 未設定 config 時的 env 後援:
OPENCLAW_DISCORD_GATEWAY_INFO_TIMEOUT_MS - 預設值:
30000(30 秒),最大值:120000
Permissions audit mismatches
Permissions audit mismatches
channels status --probe 權限檢查只適用於數字頻道 ID。如果你使用 slug 鍵,執行階段比對仍可運作,但探測無法完整驗證權限。DM and pairing issues
DM and pairing issues
- DM 已停用:
channels.discord.dm.enabled=false - DM 政策已停用:
channels.discord.dmPolicy="disabled"(舊版:channels.discord.dm.policy) - 在
pairing模式中等待配對核准
Bot to bot loops
Bot to bot loops
channels.discord.allowBots=true,請使用嚴格的提及和允許清單規則來避免迴圈行為。
建議使用 channels.discord.allowBots="mentions",只接受提及該機器人的機器人訊息。Voice STT drops with DecryptionFailed(...)
Voice STT drops with 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。High-signal Discord fields
High-signal Discord fields
- 啟動/驗證:
enabled、token、accounts.*、allowBots - 政策:
groupPolicy、dm.*、guilds.*、guilds.*.channels.* - 命令:
commands.native、commands.useAccessGroups、configWrites、slashCommand.* - 事件佇列:
eventQueue.listenerTimeout(監聽器預算)、eventQueue.maxQueueSize、eventQueue.maxConcurrency - Gateway 中繼資料:
gatewayInfoTimeoutMs - 回覆/歷史:
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
安全與操作
- 將機器人 Token 視為秘密(受監督環境中建議使用
DISCORD_BOT_TOKEN)。 - 授予最小權限的 Discord 權限。
- 如果命令部署/狀態過期,請重新啟動 Gateway,並使用
openclaw channels status --probe重新檢查。