Discord (Bot API)
Status: siap untuk DM dan channel guild melalui gateway Discord resmi.Pairing
Slash commands
Channel troubleshooting
Penyiapan cepat
Anda perlu membuat aplikasi baru dengan bot, menambahkan bot ke server Anda, dan memasangkannya ke OpenClaw. Kami merekomendasikan menambahkan bot Anda ke server privat Anda sendiri. Jika Anda belum memilikinya, buat dulu (pilih Create My Own > For me and my friends).Create a Discord application and bot
Enable privileged intents
- Message Content Intent (wajib)
- Server Members Intent (disarankan; wajib untuk allowlist role dan pencocokan nama ke ID)
- Presence Intent (opsional; hanya diperlukan untuk pembaruan presence)
Copy your bot token
Generate an invite URL and add the bot to your server
botapplications.commands
- View Channels
- Send Messages
- Read Message History
- Embed Links
- Attach Files
- Add Reactions (opsional)
Enable Developer Mode and collect your IDs
- Klik User Settings (ikon roda gigi di sebelah avatar Anda) → Advanced → aktifkan Developer Mode
- Klik kanan ikon server Anda di sidebar → Copy Server ID
- Klik kanan avatar Anda sendiri → Copy User ID
Allow DMs from server members
Set your bot token securely (do not send it in chat)
openclaw gateway run.Configure OpenClaw and pair
- Ask your agent
- CLI / config
“Saya sudah menetapkan token bot Discord saya di config. Tolong selesaikan penyiapan Discord dengan User ID<user_id>dan Server ID<server_id>.”
Approve first DM pairing
- Ask your agent
- CLI
“Setujui kode pairing Discord ini: <CODE>”
DISCORD_BOT_TOKEN hanya digunakan untuk akun default.
Untuk panggilan keluar tingkat lanjut (aksi message tool/channel), token eksplisit per panggilan digunakan untuk panggilan tersebut. Ini berlaku untuk aksi gaya kirim dan baca/probe (misalnya read/search/fetch/thread/pins/permissions). Pengaturan kebijakan akun/retry tetap berasal dari akun yang dipilih dalam snapshot runtime aktif.Rekomendasi: Siapkan workspace guild
Setelah DM berfungsi, Anda dapat menyiapkan server Discord Anda sebagai workspace penuh, di mana setiap channel mendapatkan sesi agen tersendiri dengan konteksnya sendiri. Ini direkomendasikan untuk server privat yang hanya berisi Anda dan bot Anda.Add your server to the guild allowlist
- Ask your agent
- Config
“Tambahkan Server ID Discord saya <server_id> ke guild allowlist”
Allow responses without @mention
- Ask your agent
- Config
“Izinkan agen saya merespons di server ini tanpa harus di-@mention”
Plan for memory in guild channels
- Ask your agent
- Manual
“Saat saya mengajukan pertanyaan di channel Discord, gunakan memory_search atau memory_get jika Anda memerlukan konteks jangka panjang dari MEMORY.md.”
#coding, #home, #research, atau apa pun yang sesuai dengan alur kerja Anda.
Model runtime
- Gateway memiliki koneksi Discord.
- Routing balasan bersifat deterministik: balasan masuk Discord kembali ke Discord.
- Secara default (
session.dmScope=main), chat langsung berbagi sesi utama agen (agent:main:main). - Channel guild menggunakan kunci sesi terisolasi (
agent:<agentId>:discord:channel:<channelId>). - Group DM diabaikan secara default (
channels.discord.dm.groupEnabled=false). - Slash command native berjalan dalam sesi perintah terisolasi (
agent:<agentId>:discord:slash:<userId>), sambil tetap membawaCommandTargetSessionKeyke sesi percakapan yang dirutekan.
Channel forum
Channel forum dan media Discord hanya menerima posting thread. OpenClaw mendukung dua cara untuk membuatnya:- Kirim pesan ke induk forum (
channel:<forumId>) untuk membuat thread secara otomatis. Judul thread menggunakan baris pertama pesan Anda yang tidak kosong. - Gunakan
openclaw message thread createuntuk membuat thread secara langsung. Jangan berikan--message-iduntuk channel forum.
channel:<threadId>).
Komponen interaktif
OpenClaw mendukung container Discord components v2 untuk pesan agen. Gunakan message tool dengan payloadcomponents. Hasil interaksi dirutekan kembali ke agen sebagai pesan masuk normal dan mengikuti pengaturan Discord replyToMode yang ada.
Blok yang didukung:
text,section,separator,actions,media-gallery,file- Baris aksi mengizinkan hingga 5 tombol atau satu menu pilih
- Jenis select:
string,user,role,mentionable,channel
components.reusable=true agar tombol, select, dan form dapat digunakan beberapa kali sampai kedaluwarsa.
Untuk membatasi siapa yang dapat mengklik tombol, tetapkan allowedUsers pada tombol tersebut (ID pengguna Discord, tag, atau *). Saat dikonfigurasi, pengguna yang tidak cocok akan menerima penolakan ephemeral.
Slash command /model dan /models membuka pemilih model interaktif dengan dropdown penyedia dan model serta langkah Submit. Balasan pemilih bersifat ephemeral dan hanya pengguna yang memanggil yang dapat menggunakannya.
Lampiran file:
- blok
fileharus menunjuk ke referensi lampiran (attachment://<filename>) - Berikan lampiran melalui
media/path/filePath(satu file); gunakanmedia-galleryuntuk beberapa file - Gunakan
filenameuntuk mengganti nama upload saat harus cocok dengan referensi lampiran
- Tambahkan
components.modaldengan hingga 5 field - Jenis field:
text,checkbox,radio,select,role-select,user-select - OpenClaw menambahkan tombol pemicu secara otomatis
Kontrol akses dan routing
- DM policy
- Guild policy
- Mentions and group DMs
channels.discord.dmPolicy mengontrol akses DM (lama: channels.discord.dm.policy):pairing(default)allowlistopen(memerlukanchannels.discord.allowFrommenyertakan"*"; lama:channels.discord.dm.allowFrom)disabled
pairing).Prioritas multi-akun:channels.discord.accounts.default.allowFromhanya berlaku untuk akundefault.- Akun bernama mewarisi
channels.discord.allowFromketikaallowFrommilik mereka sendiri tidak ditetapkan. - Akun bernama tidak mewarisi
channels.discord.accounts.default.allowFrom.
user:<id>- mention
<@id>
Routing agen berbasis role
Gunakanbindings[].match.roles untuk merutekan anggota guild Discord ke agen yang berbeda berdasarkan ID role. Binding berbasis role hanya menerima ID role dan dievaluasi setelah binding peer atau parent-peer dan sebelum binding khusus guild. Jika binding juga menetapkan field pencocokan lain (misalnya peer + guildId + roles), semua field yang dikonfigurasi harus cocok.
Penyiapan Developer Portal
Create app and bot
Create app and bot
- Discord Developer Portal -> Applications -> New Application
- Bot -> Add Bot
- Salin token bot
Privileged intents
Privileged intents
- Message Content Intent
- Server Members Intent (disarankan)
setPresence) tidak memerlukan pengaktifan pembaruan presence untuk anggota.OAuth scopes and baseline permissions
OAuth scopes and baseline permissions
- cakupan:
bot,applications.commands
- View Channels
- Send Messages
- Read Message History
- Embed Links
- Attach Files
- Add Reactions (opsional)
Administrator kecuali benar-benar diperlukan.Copy IDs
Copy IDs
- ID server
- ID channel
- ID pengguna
Perintah native dan autentikasi perintah
commands.nativedefault ke"auto"dan diaktifkan untuk Discord.- Override per-channel:
channels.discord.commands.native. commands.native=falsesecara eksplisit menghapus perintah native Discord yang sebelumnya terdaftar.- Autentikasi perintah native menggunakan allowlist/kebijakan Discord yang sama seperti penanganan pesan normal.
- Perintah mungkin tetap terlihat di UI Discord untuk pengguna yang tidak berwenang; eksekusi tetap menegakkan autentikasi OpenClaw dan mengembalikan “not authorized”.
ephemeral: true
Detail fitur
Reply tags and native replies
Reply tags and native replies
Live stream preview
Live stream preview
channels.discord.streamingmengontrol streaming pratinjau (off|partial|block|progress, default:off).- Default tetap
offkarena edit pratinjau Discord dapat dengan cepat mencapai batas laju, terutama ketika beberapa bot atau gateway berbagi akun atau lalu lintas guild yang sama. progressditerima untuk konsistensi lintas-channel dan dipetakan kepartialdi Discord.channels.discord.streamModeadalah alias lama dan dimigrasikan otomatis.partialmengedit satu pesan pratinjau saat token masuk.blockmengeluarkan potongan seukuran draf (gunakandraftChunkuntuk menyetel ukuran dan titik pemisahan).
block (dibatasi ke channels.discord.textChunkLimit):History, context, and thread behavior
History, context, and thread behavior
channels.discord.historyLimitdefault20- fallback:
messages.groupChat.historyLimit 0menonaktifkan
channels.discord.dmHistoryLimitchannels.discord.dms["<user_id>"].historyLimit
- thread Discord dirutekan sebagai sesi channel
- metadata thread induk dapat digunakan untuk penautan sesi induk
- config thread mewarisi config channel induk kecuali ada entri khusus thread
Thread-bound sessions for subagents
Thread-bound sessions for subagents
/focus <target>mengikat thread saat ini/baru ke target subagen/sesi/unfocusmenghapus ikatan thread saat ini/agentsmenampilkan run aktif dan status binding/session idle <duration|off>memeriksa/memperbarui auto-unfocus karena tidak aktif untuk binding yang difokuskan/session max-age <duration|off>memeriksa/memperbarui usia maksimum keras untuk binding yang difokuskan
session.threadBindings.*menetapkan default global.channels.discord.threadBindings.*mengganti perilaku Discord.spawnSubagentSessionsharus true untuk membuat/mengikat thread secara otomatis bagisessions_spawn({ thread: true }).spawnAcpSessionsharus true untuk membuat/mengikat thread secara otomatis bagi ACP (/acp spawn ... --thread ...atausessions_spawn({ runtime: "acp", thread: true })).- Jika thread binding dinonaktifkan untuk suatu akun,
/focusdan operasi thread binding terkait tidak tersedia.
Persistent ACP channel bindings
Persistent ACP channel bindings
bindings[]dengantype: "acp"danmatch.channel: "discord"
/acp spawn codex --bind heremengikat channel atau thread Discord saat ini di tempat dan menjaga pesan selanjutnya tetap dirutekan ke sesi ACP yang sama.- Itu masih bisa berarti “memulai sesi ACP Codex baru”, tetapi tidak membuat thread Discord baru dengan sendirinya. Channel yang ada tetap menjadi permukaan chat.
- Codex mungkin tetap berjalan di
cwdatau workspace backend miliknya sendiri di disk. Workspace tersebut adalah status runtime, bukan thread Discord. - Pesan thread dapat mewarisi binding ACP channel induk.
- Di channel atau thread yang terikat,
/newdan/resetmereset sesi ACP yang sama di tempat. - Thread binding sementara tetap berfungsi dan dapat mengganti resolusi target saat aktif.
spawnAcpSessionshanya diperlukan saat OpenClaw perlu membuat/mengikat child thread melalui--thread auto|here. Ini tidak diperlukan untuk/acp spawn ... --bind heredi channel saat ini.
Reaction notifications
Reaction notifications
offown(default)allallowlist(menggunakanguilds.<id>.users)
Ack reactions
Ack reactions
ackReaction mengirim emoji pengakuan saat OpenClaw sedang memproses pesan masuk.Urutan resolusi:channels.discord.accounts.<accountId>.ackReactionchannels.discord.ackReactionmessages.ackReaction- fallback emoji identitas agen (
agents.list[].identity.emoji, jika tidak ”👀”)
- Discord menerima emoji unicode atau nama emoji kustom.
- Gunakan
""untuk menonaktifkan reaction bagi channel atau akun.
Config writes
Config writes
/config set|unset (saat fitur perintah diaktifkan).Nonaktifkan:Gateway proxy
Gateway proxy
channels.discord.proxy.PluralKit support
PluralKit support
- allowlist dapat menggunakan
pk:<memberId> - nama tampilan anggota dicocokkan berdasarkan nama/slug hanya ketika
channels.discord.dangerouslyAllowNameMatching: true - lookup menggunakan ID pesan asli dan dibatasi oleh jendela waktu
- jika lookup gagal, pesan yang diproksikan diperlakukan sebagai pesan bot dan dihapus kecuali
allowBots=true
Presence configuration
Presence configuration
- 0: Playing
- 1: Streaming (memerlukan
activityUrl) - 2: Listening
- 3: Watching
- 4: Custom (menggunakan teks aktivitas sebagai status state; emoji opsional)
- 5: Competing
autoPresence.healthyTextautoPresence.degradedTextautoPresence.exhaustedText(mendukung placeholder{reason})
Approvals in Discord
Approvals in Discord
channels.discord.execApprovals.enabledchannels.discord.execApprovals.approvers(opsional; fallback kecommands.ownerAllowFrombila memungkinkan)channels.discord.execApprovals.target(dm|channel|both, default:dm)agentFilter,sessionFilter,cleanupAfterResolve
enabled tidak ditetapkan atau "auto" dan setidaknya satu approver dapat di-resolve, baik dari execApprovals.approvers maupun dari commands.ownerAllowFrom. Discord tidak menyimpulkan approver exec dari channel allowFrom, dm.allowFrom lama, atau defaultTo direct message. Tetapkan enabled: false untuk menonaktifkan Discord sebagai klien approval native secara eksplisit.Saat target adalah channel atau both, prompt approval terlihat di channel. Hanya approver yang berhasil di-resolve yang dapat menggunakan tombol; pengguna lain menerima penolakan ephemeral. Prompt approval menyertakan teks perintah, jadi aktifkan pengiriman channel hanya di channel tepercaya. Jika ID channel tidak dapat diturunkan dari kunci sesi, OpenClaw fallback ke pengiriman DM.Discord juga merender tombol approval bersama yang digunakan oleh channel chat lain. Adaptor Discord native terutama menambahkan routing DM approver dan fanout channel.
Saat tombol-tombol tersebut ada, itulah UX approval utama; OpenClaw
seharusnya hanya menyertakan perintah /approve manual saat hasil tool menyatakan
approval chat tidak tersedia atau approval manual adalah satu-satunya jalur.Autentikasi Gateway untuk handler ini menggunakan kontrak resolusi kredensial bersama yang sama seperti klien Gateway lain:- autentikasi lokal env-first (
OPENCLAW_GATEWAY_TOKEN/OPENCLAW_GATEWAY_PASSWORDlalugateway.auth.*) - dalam mode lokal,
gateway.remote.*dapat digunakan sebagai fallback hanya ketikagateway.auth.*tidak ditetapkan; SecretRef lokal yang dikonfigurasi tetapi tidak ter-resolve gagal tertutup - dukungan mode remote melalui
gateway.remote.*jika berlaku - override URL aman terhadap override: override CLI tidak menggunakan ulang kredensial implisit, dan override env hanya menggunakan kredensial env
- ID dengan prefiks
plugin:di-resolve melaluiplugin.approval.resolve. - ID lain di-resolve melalui
exec.approval.resolve. - Discord tidak melakukan hop fallback exec-ke-plugin tambahan di sini; prefiks id menentukan metode gateway yang dipanggil.
Tools dan action gates
Aksi pesan Discord mencakup perpesanan, admin channel, moderasi, presence, dan aksi metadata. Contoh inti:- perpesanan:
sendMessage,readMessages,editMessage,deleteMessage,threadReply - reaction:
react,reactions,emojiList - moderasi:
timeout,kick,ban - presence:
setPresence
channels.discord.actions.*.
Perilaku gate default:
| Action group | Default |
|---|---|
| reactions, messages, threads, pins, polls, search, memberInfo, roleInfo, channelInfo, channels, voiceStatus, events, stickers, emojiUploads, stickerUploads, permissions | enabled |
| roles | disabled |
| moderation | disabled |
| presence | disabled |
UI Components v2
OpenClaw menggunakan Discord components v2 untuk approval exec dan penanda lintas-konteks. Aksi pesan Discord juga dapat menerimacomponents untuk UI kustom (lanjutan; memerlukan pembuatan payload komponen melalui discord tool), sementara embeds lama tetap tersedia tetapi tidak direkomendasikan.
channels.discord.ui.components.accentColormenetapkan warna aksen yang digunakan oleh container komponen Discord (hex).- Tetapkan per akun dengan
channels.discord.accounts.<id>.ui.components.accentColor. embedsdiabaikan saat components v2 ada.
Channel suara
OpenClaw dapat bergabung ke channel suara Discord untuk percakapan realtime yang berkelanjutan. Ini terpisah dari lampiran pesan suara. Persyaratan:- Aktifkan perintah native (
commands.nativeatauchannels.discord.commands.native). - Konfigurasikan
channels.discord.voice. - Bot memerlukan izin Connect + Speak di channel suara target.
/vc join|leave|status untuk mengontrol sesi. Perintah ini menggunakan agen default akun dan mengikuti aturan allowlist serta group policy yang sama seperti perintah Discord lainnya.
Contoh auto-join:
voice.ttsmenggantikanmessages.ttshanya untuk pemutaran suara.- Giliran transkrip suara menurunkan status owner dari Discord
allowFrom(ataudm.allowFrom); pembicara non-owner tidak dapat mengakses tool khusus owner (misalnyagatewaydancron). - Voice diaktifkan secara default; tetapkan
channels.discord.voice.enabled=falseuntuk menonaktifkannya. voice.daveEncryptiondanvoice.decryptionFailureTolerancediteruskan ke opsi join@discordjs/voice.- Default
@discordjs/voiceadalahdaveEncryption=truedandecryptionFailureTolerance=24jika tidak ditetapkan. - OpenClaw juga memantau kegagalan dekripsi penerimaan dan memulihkan secara otomatis dengan keluar/bergabung kembali ke channel suara setelah kegagalan berulang dalam jangka waktu singkat.
- Jika log penerimaan terus menunjukkan
DecryptionFailed(UnencryptedWhenPassthroughDisabled), ini mungkin bug receive upstream@discordjs/voiceyang dilacak di discord.js #11419.
Pesan suara
Pesan suara Discord menampilkan pratinjau waveform dan memerlukan audio OGG/Opus serta metadata. OpenClaw menghasilkan waveform secara otomatis, tetapi membutuhkanffmpeg dan ffprobe yang tersedia pada host gateway untuk memeriksa dan mengonversi file audio.
Persyaratan dan batasan:
- Berikan jalur file lokal (URL ditolak).
- Hilangkan konten teks (Discord tidak mengizinkan teks + pesan suara dalam payload yang sama).
- Format audio apa pun diterima; OpenClaw mengonversi ke OGG/Opus bila diperlukan.
Troubleshooting
Used disallowed intents or bot sees no guild messages
Used disallowed intents or bot sees no guild messages
- aktifkan Message Content Intent
- aktifkan Server Members Intent saat Anda bergantung pada resolusi user/member
- mulai ulang gateway setelah mengubah intents
Guild messages blocked unexpectedly
Guild messages blocked unexpectedly
- verifikasi
groupPolicy - verifikasi guild allowlist di bawah
channels.discord.guilds - jika peta
channelsguild ada, hanya channel yang terdaftar yang diizinkan - verifikasi perilaku
requireMentiondan pola mention
Require mention false but still blocked
Require mention false but still blocked
groupPolicy="allowlist"tanpa guild/channel allowlist yang cocokrequireMentiondikonfigurasi di tempat yang salah (harus di bawahchannels.discord.guildsatau entri channel)- pengirim diblokir oleh allowlist
usersguild/channel
Long-running handlers time out or duplicate replies
Long-running handlers time out or duplicate replies
Listener DiscordMessageListener timed out after 30000ms for event MESSAGE_CREATESlow listener detected ...discord inbound worker timed out after ...
- akun tunggal:
channels.discord.eventQueue.listenerTimeout - multi-akun:
channels.discord.accounts.<accountId>.eventQueue.listenerTimeout
- akun tunggal:
channels.discord.inboundWorker.runTimeoutMs - multi-akun:
channels.discord.accounts.<accountId>.inboundWorker.runTimeoutMs - default:
1800000(30 menit); tetapkan0untuk menonaktifkan
eventQueue.listenerTimeout untuk penyiapan listener yang lambat dan inboundWorker.runTimeoutMs
hanya jika Anda ingin katup pengaman terpisah untuk giliran agen yang diantrikan.Permissions audit mismatches
Permissions audit mismatches
channels status --probe hanya berfungsi untuk ID channel numerik.Jika Anda menggunakan kunci slug, pencocokan runtime masih dapat berfungsi, tetapi probe tidak dapat memverifikasi izin sepenuhnya.DM and pairing issues
DM and pairing issues
- DM dinonaktifkan:
channels.discord.dm.enabled=false - kebijakan DM dinonaktifkan:
channels.discord.dmPolicy="disabled"(lama:channels.discord.dm.policy) - menunggu persetujuan pairing dalam mode
pairing
Bot to bot loops
Bot to bot loops
channels.discord.allowBots=true, gunakan aturan mention dan allowlist yang ketat untuk menghindari perilaku loop.
Lebih baik gunakan channels.discord.allowBots="mentions" agar hanya menerima pesan bot yang me-mention bot.Voice STT drops with DecryptionFailed(...)
Voice STT drops with DecryptionFailed(...)
- pastikan OpenClaw tetap mutakhir (
openclaw update) agar logika pemulihan receive suara Discord tersedia - pastikan
channels.discord.voice.daveEncryption=true(default) - mulai dari
channels.discord.voice.decryptionFailureTolerance=24(default upstream) dan sesuaikan hanya bila perlu - pantau log untuk:
discord voice: DAVE decrypt failures detecteddiscord voice: repeated decrypt failures; attempting rejoin
- jika kegagalan berlanjut setelah join ulang otomatis, kumpulkan log dan bandingkan dengan discord.js #11419
Pointer referensi konfigurasi
Referensi utama: Field Discord dengan sinyal tinggi:- startup/auth:
enabled,token,accounts.*,allowBots - kebijakan:
groupPolicy,dm.*,guilds.*,guilds.*.channels.* - perintah:
commands.native,commands.useAccessGroups,configWrites,slashCommand.* - event queue:
eventQueue.listenerTimeout(anggaran listener),eventQueue.maxQueueSize,eventQueue.maxConcurrency - inbound worker:
inboundWorker.runTimeoutMs - balasan/riwayat:
replyToMode,historyLimit,dmHistoryLimit,dms.*.historyLimit - pengiriman:
textChunkLimit,chunkMode,maxLinesPerMessage - streaming:
streaming(alias lama:streamMode),draftChunk,blockStreaming,blockStreamingCoalesce - media/retry:
mediaMaxMb,retrymediaMaxMbmembatasi upload Discord keluar (default:8MB)
- actions:
actions.* - presence:
activity,status,activityType,activityUrl - UI:
ui.components.accentColor - fitur:
threadBindings, top-levelbindings[](type: "acp"),pluralkit,execApprovals,intents,agentComponents,heartbeat,responsePrefix
Keamanan dan operasi
- Perlakukan token bot sebagai rahasia (
DISCORD_BOT_TOKENlebih disukai di environment yang diawasi). - Berikan izin Discord dengan hak minimum.
- Jika deploy/status perintah usang, mulai ulang gateway dan periksa kembali dengan
openclaw channels status --probe.