Siap untuk DM dan kanal guild melalui Discord gateway resmi.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.
Pairing
Perintah slash
Pemecahan masalah kanal
Penyiapan cepat
Anda perlu membuat aplikasi baru dengan bot, menambahkan bot ke server Anda, dan memasangkannya ke OpenClaw. Kami menyarankan menambahkan bot Anda ke server pribadi Anda sendiri. Jika Anda belum memilikinya, buat terlebih dahulu (pilih Create My Own > For me and my friends).Buat aplikasi dan bot Discord
Aktifkan intent dengan hak istimewa
- Message Content Intent (wajib)
- Server Members Intent (disarankan; wajib untuk daftar izin peran dan pencocokan nama-ke-ID)
- Presence Intent (opsional; hanya diperlukan untuk pembaruan presence)
Salin token bot Anda
Buat URL undangan dan tambahkan bot ke server Anda
botapplications.commands
- View Channels Text Permissions
- Send Messages
- Read Message History
- Embed Links
- Attach Files
- Add Reactions (opsional)
Aktifkan Developer Mode dan kumpulkan ID Anda
- Klik User Settings (ikon roda gigi di samping avatar Anda) → Advanced → aktifkan Developer Mode
- Klik kanan server icon Anda di bilah sisi → Copy Server ID
- Klik kanan own avatar Anda → Copy User ID
Izinkan DM dari anggota server
Atur token bot Anda secara aman (jangan kirim di chat)
openclaw gateway run.
Untuk instalasi layanan terkelola, jalankan openclaw gateway install dari shell tempat DISCORD_BOT_TOKEN tersedia, atau simpan variabel tersebut di ~/.openclaw/.env, agar layanan dapat menyelesaikan SecretRef env setelah mulai ulang.
Jika host Anda diblokir atau dibatasi laju oleh pencarian aplikasi startup Discord, atur ID aplikasi/klien Discord dari Developer Portal agar startup dapat melewati panggilan REST tersebut. Gunakan channels.discord.applicationId untuk akun default, atau channels.discord.accounts.<accountId>.applicationId saat Anda menjalankan beberapa bot Discord.Konfigurasikan OpenClaw dan lakukan pairing
- Tanya agen Anda
- CLI / config
“Saya sudah mengatur token bot Discord saya di config. Selesaikan penyiapan Discord dengan User ID<user_id>dan Server ID<server_id>.”
Setujui pairing DM pertama
- Tanya agen Anda
- CLI
“Setujui kode pairing Discord ini: <CODE>”
DISCORD_BOT_TOKEN hanya digunakan untuk akun default.
Jika dua akun Discord yang aktif diselesaikan ke token bot yang sama, OpenClaw hanya memulai satu pemantau gateway untuk token tersebut. Token yang bersumber dari config mengalahkan fallback env default; jika tidak, akun aktif pertama menang dan akun duplikat dilaporkan dinonaktifkan.
Untuk panggilan outbound lanjutan (alat pesan/tindakan kanal), token eksplisit per panggilan digunakan untuk panggilan tersebut. Ini berlaku untuk tindakan send dan read/probe-style (misalnya read/search/fetch/thread/pins/permissions). Kebijakan akun/pengaturan percobaan ulang tetap berasal dari akun yang dipilih dalam snapshot runtime aktif.Disarankan: Siapkan workspace guild
Setelah DM berfungsi, Anda dapat menyiapkan server Discord Anda sebagai workspace penuh tempat setiap kanal mendapatkan sesi agennya sendiri dengan konteksnya sendiri. Ini disarankan untuk server pribadi yang hanya berisi Anda dan bot Anda.Tambahkan server Anda ke daftar izin guild
- Tanya agen Anda
- Config
“Tambahkan Discord Server ID <server_id> saya ke daftar izin guild”
Izinkan respons tanpa @mention
message, sehingga agen dapat mengamati secara default dan hanya memposting ketika memutuskan bahwa balasan kanal berguna.Ini berarti model yang dipilih harus dapat memanggil alat dengan andal. Jika Discord menampilkan sedang mengetik dan log menunjukkan penggunaan token tetapi tidak ada pesan yang diposting, periksa log sesi untuk teks asisten dengan didSendViaMessagingTool: false. Itu berarti model menghasilkan jawaban akhir privat alih-alih memanggil message(action=send). Beralihlah ke model pemanggilan alat yang lebih kuat, atau gunakan config di bawah untuk memulihkan balasan akhir otomatis lama.- Tanya agen Anda
- Config
“Izinkan agen saya merespons di server ini tanpa harus di-@mention”
Rencanakan memori di kanal guild
- Tanya agen Anda
- Manual
“Saat saya mengajukan pertanyaan di kanal Discord, gunakan memory_search atau memory_get jika Anda memerlukan konteks jangka panjang dari MEMORY.md.”
#coding, #home, #research, atau apa pun yang cocok dengan alur kerja Anda.
Model runtime
- Gateway memiliki koneksi Discord.
- Perutean balasan bersifat deterministik: balasan masuk Discord kembali ke Discord.
- Metadata guild/channel Discord ditambahkan ke prompt model sebagai konteks tidak tepercaya, bukan sebagai prefiks balasan yang terlihat oleh pengguna. Jika model menyalin envelope itu kembali, OpenClaw menghapus metadata yang disalin dari balasan keluar dan dari konteks replay berikutnya.
- Secara default (
session.dmScope=main), obrolan langsung berbagi sesi utama agen (agent:main:main). - Channel guild adalah kunci sesi terisolasi (
agent:<agentId>:discord:channel:<channelId>). - DM grup diabaikan secara default (
channels.discord.dm.groupEnabled=false). - Perintah slash native berjalan dalam sesi perintah terisolasi (
agent:<agentId>:discord:slash:<userId>), sambil tetap membawaCommandTargetSessionKeyke sesi percakapan yang dirutekan. - Pengiriman pengumuman cron/heartbeat teks-saja ke Discord menggunakan jawaban akhir yang terlihat oleh asisten satu kali. Payload media dan komponen terstruktur tetap berupa banyak pesan ketika agen memancarkan beberapa payload yang dapat dikirim.
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 otomatis. Judul thread menggunakan baris pertama yang tidak kosong dari pesan Anda. - Gunakan
openclaw message thread createuntuk membuat thread secara langsung. Jangan teruskan--message-iduntuk channel forum.
channel:<threadId>).
Komponen interaktif
OpenClaw mendukung kontainer komponen Discord v2 untuk pesan agen. Gunakan alat pesan 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 pilih:
string,user,role,mentionable,channel
components.reusable=true untuk mengizinkan tombol, pilihan, dan formulir digunakan beberapa kali hingga kedaluwarsa.
Untuk membatasi siapa yang dapat mengklik tombol, atur allowedUsers pada tombol tersebut (ID pengguna Discord, tag, atau *). Saat dikonfigurasi, pengguna yang tidak cocok menerima penolakan ephemeral.
Perintah slash /model dan /models membuka pemilih model interaktif dengan dropdown provider, model, dan runtime yang kompatibel serta langkah Submit. /models add tidak digunakan lagi dan sekarang mengembalikan pesan penghentian penggunaan alih-alih mendaftarkan model dari chat. Balasan pemilih bersifat ephemeral dan hanya pengguna yang memanggilnya yang dapat menggunakannya. Menu pilih Discord dibatasi hingga 25 opsi, jadi tambahkan entri provider/* ke agents.defaults.models ketika Anda ingin pemilih menampilkan model yang ditemukan secara dinamis hanya untuk provider terpilih seperti openai-codex atau vllm.
Lampiran file:
- Blok
fileharus menunjuk ke referensi lampiran (attachment://<filename>) - Sediakan lampiran melalui
media/path/filePath(satu file); gunakanmedia-galleryuntuk beberapa file - Gunakan
filenameuntuk menimpa nama unggahan ketika harus cocok dengan referensi lampiran
- Tambahkan
components.modaldengan hingga 5 bidang - Jenis bidang:
text,checkbox,radio,select,role-select,user-select - OpenClaw menambahkan tombol pemicu secara otomatis
Kontrol akses dan perutean
- DM policy
- Access groups
- Guild policy
- Mentions and group DMs
channels.discord.dmPolicy mengontrol akses DM. channels.discord.allowFrom adalah allowlist DM kanonis.pairing(default)allowlistopen(memerlukanchannels.discord.allowFromuntuk menyertakan"*")disabled
pairing).Presedensi multi-akun:channels.discord.accounts.default.allowFromhanya berlaku untuk akundefault.- Untuk satu akun,
allowFrommemiliki prioritas atasdm.allowFromlama. - Akun bernama mewarisi
channels.discord.allowFromketikaallowFrommiliknya sendiri dandm.allowFromlama tidak diatur. - Akun bernama tidak mewarisi
channels.discord.accounts.default.allowFrom.
channels.discord.dm.policy dan channels.discord.dm.allowFrom lama masih dibaca untuk kompatibilitas. openclaw doctor --fix memigrasikannya ke dmPolicy dan allowFrom ketika dapat melakukannya tanpa mengubah akses.Format target DM untuk pengiriman:user:<id>- mention
<@id>
allowFrom efektif akun diperlakukan sebagai target DM pengguna untuk kompatibilitas.Perutean agen berbasis role
Gunakanbindings[].match.roles untuk merutekan anggota guild Discord ke agen berbeda berdasarkan ID role. Binding berbasis role hanya menerima ID role dan dievaluasi setelah binding peer atau parent-peer serta sebelum binding khusus guild. Jika sebuah binding juga menetapkan bidang match lain (misalnya peer + guildId + roles), semua bidang yang dikonfigurasi harus cocok.
Perintah native dan autentikasi perintah
commands.nativedefaultnya"auto"dan diaktifkan untuk Discord.- Penggantian per-channel:
channels.discord.commands.native. commands.native=falsemelewati pendaftaran dan pembersihan slash-command Discord selama startup. Perintah yang sebelumnya terdaftar mungkin tetap terlihat di Discord sampai Anda menghapusnya dari aplikasi Discord.- Autentikasi perintah native menggunakan allowlist/kebijakan Discord yang sama seperti penanganan pesan normal.
- Perintah mungkin tetap terlihat di UI Discord bagi pengguna yang tidak diotorisasi; eksekusi tetap memberlakukan 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.streaming menerima off | partial | block | progress (default). progress mempertahankan satu draf status yang dapat diedit dan memperbaruinya dengan progres alat sampai pengiriman final; label awal bersama adalah baris bergulir, sehingga akan tergulir seperti yang lain setelah cukup banyak pekerjaan muncul. streamMode adalah alias runtime lama. Jalankan openclaw doctor --fix untuk menulis ulang konfigurasi tersimpan ke kunci kanonis.Atur channels.discord.streaming.mode ke off untuk menonaktifkan edit pratinjau Discord. Jika streaming blok Discord diaktifkan secara eksplisit, OpenClaw melewati stream pratinjau untuk menghindari streaming ganda.partialmengedit satu pesan pratinjau saat token masuk.blockmemancarkan potongan berukuran draf (gunakandraftChunkuntuk menyesuaikan ukuran dan titik jeda, dibatasi ketextChunkLimit).- Final media, kesalahan, dan balasan eksplisit membatalkan edit pratinjau yang tertunda.
streaming.preview.toolProgress(defaulttrue) mengontrol apakah pembaruan alat/progres menggunakan ulang pesan pratinjau.- Baris alat/progres dirender sebagai emoji ringkas + judul + detail bila tersedia, misalnya
🛠️ Bash: run testsatau🔎 Web Search: for "query". streaming.preview.commandText/streaming.progress.commandTextmengontrol detail perintah/exec dalam baris progres ringkas:raw(default) ataustatus(hanya label alat).
block diaktifkan secara eksplisit, OpenClaw melewati stream pratinjau untuk menghindari streaming ganda.History, context, and thread behavior
History, context, and thread behavior
- Default
channels.discord.historyLimitadalah20 - fallback:
messages.groupChat.historyLimit 0menonaktifkan
channels.discord.dmHistoryLimitchannels.discord.dms["<user_id>"].historyLimit
- Thread Discord dirutekan sebagai sesi channel dan mewarisi konfigurasi channel induk kecuali diganti.
- Sesi thread mewarisi pilihan
/modeltingkat sesi milik channel induk sebagai fallback khusus model; pilihan/modellokal thread tetap diprioritaskan dan riwayat transkrip induk tidak disalin kecuali pewarisan transkrip diaktifkan. channels.discord.thread.inheritParent(defaultfalse) mengikutsertakan auto-thread baru untuk disemai dari transkrip induk. Penggantian per-akun berada di bawahchannels.discord.accounts.<id>.thread.inheritParent.- Reaksi alat pesan dapat menyelesaikan target DM
user:<id>. guilds.<guild>.channels.<channel>.requireMention: falsedipertahankan selama fallback aktivasi tahap balasan.
Thread-bound sessions for subagents
Thread-bound sessions for subagents
/focus <target>ikat thread saat ini/baru ke target subagen/sesi/unfocushapus pengikatan thread saat ini/agentstampilkan run aktif dan status pengikatan/session idle <duration|off>periksa/perbarui auto-unfocus karena tidak aktif untuk pengikatan terfokus/session max-age <duration|off>periksa/perbarui usia maksimum keras untuk pengikatan terfokus
session.threadBindings.*menetapkan default global.channels.discord.threadBindings.*mengganti perilaku Discord.spawnSessionsmengontrol pembuatan/pengikatan thread otomatis untuksessions_spawn({ thread: true })dan spawn thread ACP. Default:true.defaultSpawnContextmengontrol konteks subagen native untuk spawn yang terikat thread. Default:"fork".- Kunci
spawnSubagentSessions/spawnAcpSessionsyang tidak digunakan lagi dimigrasikan olehopenclaw doctor --fix. - Jika pengikatan thread dinonaktifkan untuk akun,
/focusdan operasi pengikatan thread 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 saat ini di tempat dan menjaga pesan berikutnya tetap pada sesi ACP yang sama. Pesan thread mewarisi pengikatan channel induk.- Dalam channel atau thread yang terikat,
/newdan/resetmereset sesi ACP yang sama di tempat. Pengikatan thread sementara dapat mengganti resolusi target saat aktif. spawnSessionsmembatasi pembuatan/pengikatan thread anak melalui--thread auto|here.
Reaction notifications
Reaction notifications
offown(default)allallowlist(menggunakanguilds.<id>.users)
Ack reactions
Ack reactions
ackReaction mengirim emoji pengakuan saat OpenClaw memproses pesan masuk.Urutan resolusi:channels.discord.accounts.<accountId>.ackReactionchannels.discord.ackReactionmessages.ackReaction- fallback emoji identitas agen (
agents.list[].identity.emoji, jika tidak ada ”👀”)
- Discord menerima emoji unicode atau nama emoji kustom.
- Gunakan
""untuk menonaktifkan reaksi bagi channel atau akun.
Config writes
Config writes
/config set|unset (ketika 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 jendela waktu
- jika lookup gagal, pesan yang diproksi diperlakukan sebagai pesan bot dan dibuang kecuali
allowBots=true
Outbound mention aliases
Outbound mention aliases
mentionAliases ketika agen membutuhkan mention keluar deterministik untuk pengguna Discord yang diketahui. Kunci adalah handle tanpa awalan @; nilai adalah ID pengguna Discord. Handle tidak dikenal, @everyone, @here, dan mention di dalam rentang kode Markdown dibiarkan tidak berubah.Presence configuration
Presence configuration
- 0: Bermain
- 1: Streaming (memerlukan
activityUrl) - 2: Mendengarkan
- 3: Menonton
- 4: Kustom (menggunakan teks aktivitas sebagai keadaan status; emoji bersifat opsional)
- 5: Berkompetisi
autoPresence.healthyTextautoPresence.degradedTextautoPresence.exhaustedText(mendukung placeholder{reason})
Persetujuan di Discord
Persetujuan di Discord
channels.discord.execApprovals.enabledchannels.discord.execApprovals.approvers(opsional; kembali kecommands.ownerAllowFromjika memungkinkan)channels.discord.execApprovals.target(dm|channel|both, default:dm)agentFilter,sessionFilter,cleanupAfterResolve
enabled tidak disetel atau "auto" dan setidaknya satu pemberi persetujuan dapat diselesaikan, baik dari execApprovals.approvers maupun dari commands.ownerAllowFrom. Discord tidak menyimpulkan pemberi persetujuan eksekusi dari allowFrom saluran, dm.allowFrom lama, atau defaultTo pesan langsung. Setel enabled: false untuk menonaktifkan Discord secara eksplisit sebagai klien persetujuan native.Untuk perintah grup sensitif yang hanya untuk pemilik seperti /diagnostics dan /export-trajectory, OpenClaw mengirim prompt persetujuan dan hasil akhir secara privat. OpenClaw mencoba DM Discord terlebih dahulu ketika pemilik yang memanggil memiliki rute pemilik Discord; jika tidak tersedia, OpenClaw kembali ke rute pemilik pertama yang tersedia dari commands.ownerAllowFrom, seperti Telegram.Ketika target adalah channel atau both, prompt persetujuan terlihat di saluran. Hanya pemberi persetujuan yang terselesaikan yang dapat menggunakan tombol; pengguna lain menerima penolakan ephemeral. Prompt persetujuan menyertakan teks perintah, jadi aktifkan pengiriman saluran hanya di saluran tepercaya. Jika ID saluran tidak dapat diturunkan dari kunci sesi, OpenClaw kembali ke pengiriman DM.Discord juga merender tombol persetujuan bersama yang digunakan oleh saluran obrolan lain. Adapter Discord native terutama menambahkan perutean DM pemberi persetujuan dan fanout saluran.
Ketika tombol tersebut ada, tombol itu menjadi UX persetujuan utama; OpenClaw
sebaiknya hanya menyertakan perintah /approve manual ketika hasil alat menyatakan
persetujuan obrolan tidak tersedia atau persetujuan manual adalah satu-satunya jalur.
Jika runtime persetujuan native Discord tidak aktif, OpenClaw menjaga
prompt lokal deterministik /approve <id> <decision> tetap terlihat. Jika
runtime aktif tetapi kartu native tidak dapat dikirim ke target mana pun,
OpenClaw mengirim pemberitahuan fallback di obrolan yang sama dengan perintah /approve
persis dari persetujuan tertunda.Autentikasi Gateway dan penyelesaian persetujuan mengikuti kontrak klien Gateway bersama (ID plugin: diselesaikan melalui plugin.approval.resolve; ID lain melalui exec.approval.resolve). Persetujuan kedaluwarsa setelah 30 menit secara default.Lihat Persetujuan eksekusi.Alat dan gerbang tindakan
Tindakan pesan Discord mencakup tindakan perpesanan, admin saluran, moderasi, kehadiran, dan metadata. Contoh inti:- perpesanan:
sendMessage,readMessages,editMessage,deleteMessage,threadReply - reaksi:
react,reactions,emojiList - moderasi:
timeout,kick,ban - kehadiran:
setPresence
event-create menerima parameter image opsional (URL atau jalur file lokal) untuk menyetel gambar sampul acara terjadwal.
Gerbang tindakan berada di bawah channels.discord.actions.*.
Perilaku gerbang default:
| Grup tindakan | Default |
|---|---|
| reaksi, pesan, thread, pin, polling, pencarian, infoAnggota, infoPeran, infoSaluran, saluran, statusSuara, acara, stiker, unggahanEmoji, unggahanStiker, izin | diaktifkan |
| peran | dinonaktifkan |
| moderasi | dinonaktifkan |
| kehadiran | dinonaktifkan |
UI Components v2
OpenClaw menggunakan components v2 Discord untuk persetujuan eksekusi dan penanda lintas konteks. Tindakan pesan Discord juga dapat menerimacomponents untuk UI kustom (lanjutan; memerlukan pembuatan payload komponen melalui alat discord), sementara embeds lama tetap tersedia tetapi tidak direkomendasikan.
channels.discord.ui.components.accentColormenyetel warna aksen yang digunakan oleh kontainer komponen Discord (hex).- Setel per akun dengan
channels.discord.accounts.<id>.ui.components.accentColor. embedsdiabaikan ketika components v2 ada.
Suara
Discord memiliki dua permukaan suara yang berbeda: saluran suara realtime (percakapan berkelanjutan) dan lampiran pesan suara (format pratinjau waveform). Gateway mendukung keduanya.Saluran suara
Daftar periksa penyiapan:- Aktifkan Message Content Intent di Discord Developer Portal.
- Aktifkan Server Members Intent ketika daftar izin peran/pengguna digunakan.
- Undang bot dengan cakupan
botdanapplications.commands. - Berikan Connect, Speak, Send Messages, dan Read Message History di saluran suara target.
- Aktifkan perintah native (
commands.nativeatauchannels.discord.commands.native). - Konfigurasikan
channels.discord.voice.
/vc join|leave|status untuk mengontrol sesi. Perintah ini menggunakan agen default akun dan mengikuti aturan daftar izin serta kebijakan grup yang sama seperti perintah Discord lainnya.
voice.ttsmenimpamessages.ttshanya untuk pemutaran suarastt-tts. Mode realtime menggunakanvoice.realtime.voice.voice.modemengontrol jalur percakapan. Default-nya adalahagent-proxy: antarmuka depan suara realtime menangani pengaturan waktu giliran, interupsi, dan pemutaran, mendelegasikan pekerjaan substantif ke agen OpenClaw yang dirutekan melaluiopenclaw_agent_consult, dan memperlakukan hasilnya seperti prompt Discord yang diketik dari pembicara tersebut.stt-ttsmempertahankan alur STT batch lama plus TTS.bidimemungkinkan model realtime bercakap langsung sambil mengeksposopenclaw_agent_consultuntuk otak OpenClaw.voice.agentSessionmengontrol percakapan OpenClaw mana yang menerima giliran suara. Biarkan tidak diatur untuk sesi milik kanal suara itu sendiri, atau atur{ mode: "target", target: "channel:<text-channel-id>" }agar kanal suara bertindak sebagai ekstensi mikrofon/speaker dari sesi kanal teks Discord yang sudah ada seperti#maintainers.voice.modelmenimpa otak agen OpenClaw untuk respons suara Discord dan konsultasi realtime. Biarkan tidak diatur untuk mewarisi model agen yang dirutekan. Ini terpisah darivoice.realtime.model.agent-proxymerutekan ucapan melaluidiscord-voice, yang mempertahankan otorisasi pemilik/alat normal untuk pembicara dan sesi target tetapi menyembunyikan alatttsagen karena suara Discord memiliki pemutaran. Secara default,agent-proxymemberi konsultasi akses alat penuh yang setara pemilik untuk pembicara pemilik (voice.realtime.toolPolicy: "owner") dan sangat mengutamakan konsultasi dengan agen OpenClaw sebelum jawaban substantif (voice.realtime.consultPolicy: "always"). Dalam mode defaultalwaystersebut, lapisan realtime tidak otomatis mengucapkan pengisi sebelum jawaban konsultasi; lapisan itu menangkap dan mentranskripsi ucapan, lalu mengucapkan jawaban OpenClaw yang dirutekan. Jika beberapa jawaban konsultasi paksa selesai saat Discord masih memutar jawaban pertama, jawaban ucapan persis berikutnya akan diantrekan hingga pemutaran menganggur, bukan mengganti ucapan di tengah kalimat.- Dalam mode
stt-tts, STT menggunakantools.media.audio;voice.modeltidak memengaruhi transkripsi. - Dalam mode realtime,
voice.realtime.provider,voice.realtime.model, danvoice.realtime.voicemengonfigurasi sesi audio realtime. Untuk OpenAI Realtime 2 plus otak Codex, gunakanvoice.realtime.model: "gpt-realtime-2"danvoice.model: "openai-codex/gpt-5.5". - Penyedia realtime OpenAI menerima nama peristiwa Realtime 2 saat ini dan alias lama yang kompatibel dengan Codex untuk peristiwa audio output dan transkrip, sehingga snapshot penyedia yang kompatibel dapat bergeser tanpa menghentikan audio asisten.
voice.realtime.bargeInmengontrol apakah peristiwa speaker-start Discord menginterupsi pemutaran realtime aktif. Jika tidak diatur, ini mengikuti pengaturan interupsi input-audio milik penyedia realtime.voice.realtime.minBargeInAudioEndMsmengontrol durasi minimum pemutaran asisten sebelum barge-in realtime OpenAI memotong audio. Default:250. Atur0untuk interupsi langsung di ruangan dengan gema rendah, atau naikkan untuk setup speaker dengan gema berat.- Untuk suara OpenAI pada pemutaran Discord, atur
voice.tts.provider: "openai"dan pilih suara Text-to-speech di bawahvoice.tts.openai.voiceatauvoice.tts.providers.openai.voice.cedaradalah pilihan bersuara maskulin yang baik pada model TTS OpenAI saat ini. - Penimpaan
systemPromptDiscord per kanal berlaku untuk giliran transkrip suara bagi kanal suara tersebut. - Giliran transkrip suara memperoleh status pemilik dari
allowFromDiscord (ataudm.allowFrom); pembicara non-pemilik tidak dapat mengakses alat khusus pemilik (misalnyagatewaydancron). - Suara Discord bersifat opt-in untuk konfigurasi teks saja; atur
channels.discord.voice.enabled=true(atau pertahankan blokchannels.discord.voiceyang sudah ada) untuk mengaktifkan perintah/vc, runtime suara, dan intent GatewayGuildVoiceStates. channels.discord.intents.voiceStatesdapat secara eksplisit menimpa langganan intent voice-state. Biarkan tidak diatur agar intent mengikuti pengaktifan suara efektif.- Jika
voice.autoJoinmemiliki beberapa entri untuk guild yang sama, OpenClaw bergabung ke kanal terakhir yang dikonfigurasi untuk guild tersebut. voice.allowedChannelsadalah daftar izin residensi opsional. Biarkan tidak diatur untuk mengizinkan/vc joinke kanal suara Discord resmi mana pun. Saat diatur,/vc join, auto-join saat startup, dan perpindahan voice-state bot dibatasi ke entri{ guildId, channelId }yang tercantum. Atur ke array kosong untuk menolak semua join suara Discord. Jika Discord memindahkan bot ke luar daftar izin, OpenClaw meninggalkan kanal itu dan bergabung kembali ke target auto-join yang dikonfigurasi ketika tersedia.voice.daveEncryptiondanvoice.decryptionFailureTolerancediteruskan ke opsi join@discordjs/voice.- Default
@discordjs/voiceadalahdaveEncryption=truedandecryptionFailureTolerance=24jika tidak diatur. - OpenClaw menggunakan default decoder
opusscriptpure-JS untuk penerimaan suara Discord. Paket native opsional@discordjs/opusdiabaikan oleh kebijakan instalasi pnpm repo sehingga instalasi normal, lane Docker, dan pengujian yang tidak terkait tidak mengompilasi addon native. Host performa suara khusus dapat ikut serta denganOPENCLAW_DISCORD_OPUS_DECODER=nativesetelah menginstal addon native. voice.connectTimeoutMsmengontrol penantian Ready awal@discordjs/voiceuntuk upaya/vc joindan auto-join. Default:30000.voice.reconnectGraceMsmengontrol berapa lama OpenClaw menunggu sesi suara yang terputus mulai menyambung kembali sebelum menghancurkannya. Default:15000.- Dalam mode
stt-tts, pemutaran suara tidak berhenti hanya karena pengguna lain mulai berbicara. Untuk menghindari loop umpan balik, OpenClaw mengabaikan tangkapan suara baru saat TTS sedang diputar; berbicaralah setelah pemutaran selesai untuk giliran berikutnya. Mode realtime meneruskan speaker start sebagai sinyal barge-in ke penyedia realtime. - Dalam mode realtime, gema dari speaker ke mikrofon terbuka dapat terlihat seperti barge-in dan menginterupsi pemutaran. Untuk ruangan Discord dengan gema berat, atur
voice.realtime.providers.openai.interruptResponseOnInputAudio: falseagar OpenAI tidak otomatis menginterupsi pada audio input. Tambahkanvoice.realtime.bargeIn: truejika Anda tetap ingin peristiwa speaker-start Discord menginterupsi pemutaran aktif. Bridge realtime OpenAI mengabaikan pemotongan pemutaran yang lebih pendek darivoice.realtime.minBargeInAudioEndMssebagai kemungkinan gema/noise dan mencatatnya sebagai dilewati alih-alih membersihkan pemutaran Discord. voice.captureSilenceGraceMsmengontrol berapa lama OpenClaw menunggu setelah Discord melaporkan pembicara telah berhenti sebelum menyelesaikan segmen audio tersebut untuk STT. Default:2500; naikkan ini jika Discord membagi jeda normal menjadi transkrip parsial yang terputus-putus.- Saat ElevenLabs adalah penyedia TTS yang dipilih, pemutaran suara Discord menggunakan TTS streaming dan dimulai dari stream respons penyedia. Penyedia tanpa dukungan streaming kembali ke jalur file sementara hasil sintesis.
- OpenClaw juga memantau kegagalan dekripsi penerimaan dan pulih otomatis dengan meninggalkan/bergabung kembali ke kanal suara setelah kegagalan berulang dalam jendela waktu singkat.
- Jika log penerimaan berulang kali menampilkan
DecryptionFailed(UnencryptedWhenPassthroughDisabled)setelah pembaruan, kumpulkan laporan dependensi dan log. Baris@discordjs/voiceyang dibundel menyertakan perbaikan padding upstream dari PR discord.js #11449, yang menutup isu discord.js #11419. - Peristiwa penerimaan
The operation was aborteddiharapkan saat OpenClaw menyelesaikan segmen pembicara yang ditangkap; itu adalah diagnostik verbose, bukan peringatan. - Log suara Discord verbose menyertakan pratinjau transkrip STT satu baris terbatas untuk setiap segmen pembicara yang diterima, sehingga debugging menampilkan sisi pengguna dan sisi balasan agen tanpa membuang teks transkrip tak terbatas.
- Dalam mode
agent-proxy, fallback konsultasi paksa melewati fragmen transkrip yang mungkin belum lengkap seperti teks yang berakhir dengan...atau konektor penutup sepertiand, plus penutup yang jelas tidak dapat ditindaklanjuti seperti “segera kembali” atau “sampai jumpa”. Log menampilkanforced agent consult skipped reason=...saat ini mencegah jawaban antrean yang basi.
node-gyp lokal.
Setelah menginstal addon native, mulai Gateway dengan:
discord voice: opus decoder: @discordjs/opus. Tanpa opt-in env, atau jika addon native hilang atau tidak dapat dimuat di host, OpenClaw mencatat discord voice: opus decoder: opusscript dan tetap menerima suara melalui fallback pure-JS.
Pipeline STT plus TTS:
- Tangkapan PCM Discord dikonversi menjadi file sementara WAV.
tools.media.audiomenangani STT, misalnyaopenai/gpt-4o-mini-transcribe.- Transkrip dikirim melalui ingress dan routing Discord sementara LLM respons berjalan dengan kebijakan output suara yang menyembunyikan alat
ttsagen dan meminta teks yang dikembalikan, karena suara Discord memiliki pemutaran TTS akhir. voice.model, saat diatur, hanya menimpa LLM respons untuk giliran kanal suara ini.voice.ttsdigabungkan di atasmessages.tts; penyedia yang mendukung streaming memberi makan pemutar secara langsung, jika tidak file audio yang dihasilkan diputar di kanal yang sudah digabungkan.
voice.agentSession, setiap kanal suara mendapatkan sesi OpenClaw yang dirutekan miliknya sendiri. Misalnya, /vc join channel:234567890123456789 berbicara ke sesi untuk kanal suara Discord tersebut. Model realtime hanya antarmuka depan suara; permintaan substantif diserahkan ke agen OpenClaw yang dikonfigurasi. Jika model realtime menghasilkan transkrip final tanpa memanggil alat konsultasi, OpenClaw memaksa konsultasi sebagai fallback sehingga default tetap berperilaku seperti berbicara dengan agen.
Contoh STT plus TTS lama:
agent-proxy, bot bergabung ke kanal suara yang dikonfigurasi, tetapi giliran agen OpenClaw menggunakan sesi dan agen normal kanal target yang dirutekan. Sesi suara realtime mengucapkan hasil yang dikembalikan kembali ke kanal suara. Agen supervisor masih dapat menggunakan alat pesan normal sesuai kebijakan alatnya, termasuk mengirim pesan Discord terpisah jika itu tindakan yang tepat.
Bentuk target yang berguna:
target: "channel:123456789012345678"merutekan melalui sesi kanal teks Discord.target: "123456789012345678"diperlakukan sebagai target kanal.target: "dm:123456789012345678"atautarget: "user:123456789012345678"merutekan melalui sesi pesan langsung tersebut.
bargeIn: true memungkinkan peristiwa awal-pembicara Discord dan audio pembicara yang sudah aktif membatalkan respons realtime aktif sebelum giliran tertangkap berikutnya mencapai OpenAI. Sinyal barge-in yang sangat awal dengan audioEndMs di bawah minBargeInAudioEndMs diperlakukan sebagai kemungkinan gema/noise dan diabaikan agar model tidak terpotong pada frame pemutaran pertama.
Log suara yang diharapkan:
- Saat bergabung:
discord voice: joining ... voiceSession=... supervisorSession=... agentSessionMode=... voiceModel=... realtimeModel=... - Saat realtime dimulai:
discord voice: realtime bridge starting ... autoRespond=false interruptResponse=false bargeIn=false minBargeInAudioEndMs=... - Saat audio pembicara:
discord voice: realtime speaker turn opened ...,discord voice: realtime input audio started ... outputAudioMs=... outputActive=..., dandiscord voice: realtime speaker turn closed ... chunks=... discordBytes=... realtimeBytes=... interruptedPlayback=... - Saat ucapan usang dilewati:
discord voice: realtime forced agent consult skipped reason=incomplete-transcript ...ataureason=non-actionable-closing ... - Saat respons realtime selesai:
discord voice: realtime audio playback finishing reason=response.done ... audioMs=... chunks=... - Saat pemutaran berhenti/direset:
discord voice: realtime audio playback stopped reason=... audioMs=... elapsedMs=... chunks=... - Saat konsultasi realtime:
discord voice: realtime consult requested ... voiceSession=... supervisorSession=... question=... - Saat jawaban agen:
discord voice: agent turn answer ... - Saat ucapan persis diantrekan:
discord voice: realtime exact speech queued ... queued=... outputAudioMs=... outputActive=..., diikuti olehdiscord voice: realtime exact speech dequeued reason=player-idle ... - Saat deteksi barge-in:
discord voice: realtime barge-in detected source=speaker-start ...ataudiscord voice: realtime barge-in detected source=active-speaker-audio ..., diikuti olehdiscord voice: realtime barge-in requested reason=... outputAudioMs=... outputActive=... - Saat interupsi realtime:
discord voice: realtime model interrupt requested client:response.cancel reason=barge-in, diikuti olehdiscord voice: realtime model audio truncated client:conversation.item.truncate reason=barge-in audioEndMs=...ataudiscord voice: realtime model interrupt confirmed server:response.done status=cancelled ... - Saat gema/noise diabaikan:
discord voice: realtime model interrupt ignored client:conversation.item.truncate.skipped reason=barge-in audioEndMs=0 minAudioEndMs=250 - Saat barge-in dinonaktifkan:
discord voice: realtime capture ignored during playback (barge-in disabled) ... - Saat pemutaran idle:
discord voice: realtime barge-in ignored reason=... outputActive=false ... playbackChunks=0
realtime audio playback startedberarti Discord telah mulai memutar audio asisten. Bridge mulai menghitung chunk output asisten, byte PCM Discord, byte realtime provider, dan durasi audio tersintesis dari titik ini.realtime speaker turn openedmenandai pembicara Discord menjadi aktif. Jika pemutaran sudah aktif danbargeIndiaktifkan, ini dapat diikuti olehbarge-in detected source=speaker-start.realtime input audio startedmenandai frame audio aktual pertama yang diterima untuk giliran pembicara tersebut.outputActive=trueatauoutputAudioMsbukan nol di sini berarti mikrofon mengirim input sementara pemutaran asisten masih aktif.barge-in detected source=active-speaker-audioberarti OpenClaw melihat audio pembicara langsung saat pemutaran asisten aktif. Ini berguna untuk membedakan interupsi nyata dari peristiwa awal-pembicara Discord tanpa audio yang berguna.barge-in requested reason=...berarti OpenClaw meminta provider realtime untuk membatalkan atau memotong respons aktif. Ini menyertakanoutputAudioMs,outputActive, danplaybackChunkssehingga Anda dapat melihat berapa banyak audio asisten yang sebenarnya sudah diputar sebelum interupsi.realtime audio playback stopped reason=...adalah titik reset pemutaran Discord lokal. Alasannya menunjukkan siapa yang menghentikan pemutaran:barge-in,player-idle,provider-clear-audio,forced-agent-consult,stream-close, atausession-close.realtime speaker turn closedmerangkum giliran input yang ditangkap.chunks=0atauhasAudio=falseberarti giliran pembicara terbuka tetapi tidak ada audio yang dapat digunakan mencapai bridge realtime.interruptedPlayback=trueberarti giliran input tersebut tumpang tindih dengan output asisten dan memicu logika barge-in.
outputAudioMs: durasi audio asisten yang dihasilkan oleh provider realtime sebelum baris log.audioMs: durasi audio asisten yang dihitung OpenClaw sebelum pemutaran berhenti.elapsedMs: waktu wall-clock antara pembukaan dan penutupan stream pemutaran atau giliran pembicara.discordBytes: byte PCM stereo 48 kHz yang dikirim ke atau diterima dari suara Discord.realtimeBytes: byte PCM format provider yang dikirim ke atau diterima dari provider realtime.playbackChunks: chunk audio asisten yang diteruskan ke Discord untuk respons aktif.sinceLastAudioMs: jeda antara frame audio pembicara terakhir yang ditangkap dan penutupan giliran pembicara.
- Terpotong langsung dengan
source=active-speaker-audio,outputAudioMskecil, dan pengguna yang sama di dekatnya biasanya mengarah ke gema speaker yang masuk ke mikrofon. Naikkanvoice.realtime.minBargeInAudioEndMs, turunkan volume speaker, gunakan headphone, atau setelvoice.realtime.providers.openai.interruptResponseOnInputAudio: false. source=speaker-startdiikuti olehspeaker turn closed ... hasAudio=falseberarti Discord melaporkan awal pembicara tetapi tidak ada audio yang mencapai OpenClaw. Itu dapat berupa peristiwa suara Discord sementara, perilaku noise gate, atau klien yang sebentar mengaktifkan mikrofon.audio playback stopped reason=stream-closetanpa barge-in terdekat atauprovider-clear-audioberarti stream pemutaran Discord lokal berakhir secara tidak terduga. Periksa log provider dan pemutar Discord sebelumnya.capture ignored during playback (barge-in disabled)berarti OpenClaw sengaja membuang input saat audio asisten aktif. Aktifkanvoice.realtime.bargeInjika Anda ingin ucapan menginterupsi pemutaran.barge-in ignored ... outputActive=falseberarti Discord atau VAD provider melaporkan ucapan, tetapi OpenClaw tidak memiliki pemutaran aktif untuk diinterupsi. Ini seharusnya tidak memotong audio.
voice.model, auth STT untuk tools.media.audio, auth TTS untuk messages.tts/voice.tts, dan auth provider realtime untuk voice.realtime.providers atau konfigurasi auth normal provider.
Pesan suara
Pesan suara Discord menampilkan pratinjau waveform dan memerlukan audio OGG/Opus. OpenClaw membuat waveform secara otomatis, tetapi memerlukanffmpeg dan ffprobe di host Gateway untuk memeriksa dan mengonversi.
- Berikan jalur file lokal (URL ditolak).
- Hilangkan konten teks (Discord menolak teks + pesan suara dalam payload yang sama).
- Format audio apa pun diterima; OpenClaw mengonversi ke OGG/Opus sesuai kebutuhan.
Pemecahan masalah
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 ketika Anda bergantung pada resolusi pengguna/anggota
- mulai ulang Gateway setelah mengubah intent
Guild messages blocked unexpectedly
Guild messages blocked unexpectedly
- verifikasi
groupPolicy - verifikasi allowlist guild di bawah
channels.discord.guilds - jika peta
channelsguild ada, hanya channel yang tercantum yang diizinkan - verifikasi perilaku
requireMentiondan pola mention
Require mention false but still blocked
Require mention false but still blocked
groupPolicy="allowlist"tanpa allowlist guild/channel yang cocokrequireMentiondikonfigurasi di tempat yang salah (harus berada di bawahchannels.discord.guildsatau entri channel)- pengirim diblokir oleh allowlist
usersguild/channel
Long-running Discord turns or duplicate replies
Long-running Discord turns or duplicate replies
Slow listener detected ...stuck session: sessionKey=agent:...:discord:... state=processing ...
- satu akun:
channels.discord.eventQueue.listenerTimeout - multi-akun:
channels.discord.accounts.<accountId>.eventQueue.listenerTimeout - ini hanya mengontrol pekerjaan listener Gateway Discord, bukan masa pakai giliran agen
Gateway metadata lookup timeout warnings
Gateway metadata lookup timeout warnings
/gateway/bot Discord sebelum terhubung. Kegagalan sementara kembali ke URL Gateway default Discord dan dibatasi lajunya di log.Kenop timeout metadata:- satu akun:
channels.discord.gatewayInfoTimeoutMs - multi-akun:
channels.discord.accounts.<accountId>.gatewayInfoTimeoutMs - fallback env ketika config tidak disetel:
OPENCLAW_DISCORD_GATEWAY_INFO_TIMEOUT_MS - default:
30000(30 detik), maks:120000
Gateway READY timeout restarts
Gateway READY timeout restarts
READY Discord selama startup dan setelah koneksi ulang runtime. Penyiapan multi-akun dengan penjarakan startup dapat memerlukan jendela READY startup yang lebih panjang daripada default.Kenop timeout READY:- startup satu akun:
channels.discord.gatewayReadyTimeoutMs - startup multi-akun:
channels.discord.accounts.<accountId>.gatewayReadyTimeoutMs - fallback env startup ketika config tidak disetel:
OPENCLAW_DISCORD_READY_TIMEOUT_MS - default startup:
15000(15 detik), maks:120000 - runtime satu akun:
channels.discord.gatewayRuntimeReadyTimeoutMs - runtime multi-akun:
channels.discord.accounts.<accountId>.gatewayRuntimeReadyTimeoutMs - fallback env runtime ketika config tidak disetel:
OPENCLAW_DISCORD_RUNTIME_READY_TIMEOUT_MS - default runtime:
30000(30 detik), maks:120000
Permissions audit mismatches
Permissions audit mismatches
channels status --probe hanya bekerja untuk ID channel numerik.Jika Anda menggunakan kunci slug, pencocokan runtime masih dapat bekerja, 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"(legacy: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.
Sebaiknya gunakan channels.discord.allowBots="mentions" agar hanya menerima pesan bot yang menyebut bot tersebut.Voice STT drops with DecryptionFailed(...)
Voice STT drops with DecryptionFailed(...)
- jaga agar OpenClaw tetap mutakhir (
openclaw update) supaya logika pemulihan penerimaan suara Discord tersedia - konfirmasi
channels.discord.voice.daveEncryption=true(default) - mulai dari
channels.discord.voice.decryptionFailureTolerance=24(default upstream) dan sesuaikan hanya jika diperlukan - pantau log untuk:
discord voice: DAVE decrypt failures detecteddiscord voice: repeated decrypt failures; attempting rejoin
- jika kegagalan berlanjut setelah rejoin otomatis, kumpulkan log dan bandingkan dengan riwayat penerimaan DAVE upstream di discord.js #11419 dan discord.js #11449
Referensi konfigurasi
Referensi utama: Referensi konfigurasi - Discord.High-signal Discord fields
High-signal Discord fields
- startup/auth:
enabled,token,accounts.*,allowBots - policy:
groupPolicy,dm.*,guilds.*,guilds.*.channels.* - command:
commands.native,commands.useAccessGroups,configWrites,slashCommand.* - event queue:
eventQueue.listenerTimeout(anggaran listener),eventQueue.maxQueueSize,eventQueue.maxConcurrency - gateway:
gatewayInfoTimeoutMs,gatewayReadyTimeoutMs,gatewayRuntimeReadyTimeoutMs - reply/history:
replyToMode,historyLimit,dmHistoryLimit,dms.*.historyLimit - delivery:
textChunkLimit,chunkMode,maxLinesPerMessage - streaming:
streaming(alias lama:streamMode),streaming.preview.toolProgress,draftChunk,blockStreaming,blockStreamingCoalesce - media/retry:
mediaMaxMb(membatasi unggahan keluar Discord, default100MB),retry - actions:
actions.* - presence:
activity,status,activityType,activityUrl - UI:
ui.components.accentColor - features:
threadBindings,bindings[]tingkat atas (type: "acp"),pluralkit,execApprovals,intents,agentComponents,heartbeat,responsePrefix
Keamanan dan operasi
- Perlakukan token bot sebagai rahasia (
DISCORD_BOT_TOKENlebih disarankan di lingkungan yang diawasi). - Berikan izin Discord dengan hak akses paling minimal.
- Jika deploy/status perintah sudah usang, mulai ulang Gateway dan periksa ulang dengan
openclaw channels status --probe.