Pemasangan
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 untuk menambahkan bot Anda ke server privat milik 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 istimewa
- Message Content Intent (wajib)
- Server Members Intent (disarankan; wajib untuk allowlist 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
- 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 sebelah avatar Anda) → Gulir ke Developer di bilah samping → aktifkan Developer Mode (Catatan: Di aplikasi seluler Discord, Developer Mode berada di bawah App Settings → Advanced)
- Klik kanan ikon server Anda di bilah samping → Copy Server ID
- Klik kanan avatar Anda sendiri → Copy User ID
Izinkan DM dari anggota server
Atur token bot Anda dengan 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 dimulai ulang.
Jika host Anda diblokir atau dibatasi lajunya oleh lookup aplikasi saat 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 pasangkan
- Tanyakan kepada 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 pemasangan DM pertama
- Tanyakan kepada agen Anda
- CLI
“Setujui kode pemasangan 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 monitor Gateway untuk token tersebut. Token yang bersumber dari config mengungguli fallback env default; jika tidak, akun aktif pertama menang dan akun duplikat dilaporkan dinonaktifkan.
Untuk panggilan keluar lanjutan (alat pesan/tindakan kanal), token eksplisit per panggilan digunakan untuk panggilan tersebut. Ini berlaku untuk tindakan kirim dan baca/probe (misalnya read/search/fetch/thread/pins/permissions). Kebijakan akun/pengaturan coba ulang tetap berasal dari akun yang dipilih dalam snapshot runtime aktif.Disarankan: Siapkan ruang kerja guild
Setelah DM berfungsi, Anda dapat menyiapkan server Discord Anda sebagai ruang kerja penuh tempat setiap kanal mendapatkan sesi agennya sendiri dengan konteksnya sendiri. Ini disarankan untuk server privat yang hanya berisi Anda dan bot Anda.Tambahkan server Anda ke allowlist guild
- Tanyakan kepada agen Anda
- Config
“Tambahkan Discord Server ID <server_id> saya ke allowlist guild”
Izinkan respons tanpa @mention
messages.groupChat.visibleReplies: "message_tool" agar agen dapat mengamati diam-diam dan hanya memposting ketika agen memutuskan bahwa balasan kanal berguna. Ini bekerja paling baik dengan model generasi terbaru yang andal menggunakan alat, seperti GPT 5.5. Peristiwa ruang ambien tetap diam kecuali alat mengirim. Lihat Peristiwa ruang ambien untuk config mode mengamati lengkap.Jika Discord menampilkan sedang mengetik dan log menunjukkan penggunaan token tetapi tidak ada pesan yang diposting, periksa apakah turn dikonfigurasi sebagai peristiwa ruang ambien atau ikut serta ke balasan terlihat message-tool.- Tanyakan kepada agen Anda
- Config
“Izinkan agen saya merespons di server ini tanpa harus di-@mention”
Rencanakan memori di kanal guild
- Tanyakan kepada agen Anda
- Manual
“Saat saya mengajukan pertanyaan di kanal Discord, gunakan memory_search atau memory_get jika Anda membutuhkan 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/saluran Discord ditambahkan ke prompt model sebagai konteks yang tidak tepercaya, bukan sebagai prefiks balasan yang terlihat 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), chat langsung berbagi sesi utama agen (agent:main:main). - Saluran guild menggunakan 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 khusus teks ke Discord menggunakan jawaban akhir yang terlihat asisten satu kali. Payload media dan komponen terstruktur tetap berupa beberapa pesan ketika agen mengeluarkan beberapa payload yang dapat dikirim.
Saluran forum
Saluran forum dan media Discord hanya menerima postingan 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 berikan--message-iduntuk saluran 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 tindakan mengizinkan hingga 5 tombol atau satu menu pilihan
- Jenis pilihan:
string,user,role,mentionable,channel
components.reusable=true untuk mengizinkan tombol, pilihan, dan formulir digunakan beberapa kali hingga kedaluwarsa.
Untuk membatasi siapa yang dapat mengeklik tombol, atur allowedUsers pada tombol tersebut (ID pengguna Discord, tag, atau *). Saat dikonfigurasi, pengguna yang tidak cocok menerima penolakan ephemeral.
Callback komponen kedaluwarsa setelah 30 menit secara default. Atur channels.discord.agentComponents.ttlMs untuk mengubah masa pakai registri callback tersebut untuk akun Discord default, atau channels.discord.accounts.<accountId>.agentComponents.ttlMs untuk menimpa satu akun dalam setup multi-akun. Nilainya dalam milidetik, harus berupa bilangan bulat positif, dan dibatasi pada 86400000 (24 jam). TTL yang lebih panjang berguna untuk alur kerja review atau persetujuan yang membutuhkan tombol tetap dapat digunakan, tetapi juga memperpanjang jendela ketika pesan Discord lama masih dapat memicu tindakan. Pilih TTL tersingkat yang sesuai dengan alur kerja, dan pertahankan default ketika callback basi akan mengejutkan.
Perintah slash /model dan /models membuka pemilih model interaktif dengan dropdown provider, model, dan runtime kompatibel, ditambah langkah Submit. /models add sudah deprecated dan sekarang mengembalikan pesan deprecation alih-alih mendaftarkan model dari chat. Balasan pemilih bersifat ephemeral dan hanya pengguna yang memanggilnya yang dapat menggunakannya. Menu pilihan Discord dibatasi hingga 25 opsi, jadi tambahkan entri provider/* ke agents.defaults.models saat Anda ingin pemilih menampilkan model yang ditemukan secara dinamis hanya untuk provider yang dipilih seperti openai 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
- Kebijakan DM
- Grup akses
- Kebijakan guild
- Mention dan DM grup
channels.discord.dmPolicy mengontrol akses DM. channels.discord.allowFrom adalah allowlist DM kanonis.pairing(default)allowlistopen(memerlukanchannels.discord.allowFromuntuk menyertakan"*")disabled
pairing).Prioritas multi-akun:channels.discord.accounts.default.allowFromhanya berlaku untuk akundefault.- Untuk satu akun,
allowFromlebih diprioritaskan daripadadm.allowFromlegacy. - Akun bernama mewarisi
channels.discord.allowFromketikaallowFrommiliknya sendiri dandm.allowFromlegacy tidak diatur. - Akun bernama tidak mewarisi
channels.discord.accounts.default.allowFrom.
channels.discord.dm.policy dan channels.discord.dm.allowFrom legacy 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 akun diperlakukan sebagai target DM pengguna untuk kompatibilitas.Perutean agen berbasis role
Gunakanbindings[].match.roles untuk merutekan anggota guild Discord ke agent berbeda berdasarkan ID peran. Binding berbasis peran hanya menerima ID peran dan dievaluasi setelah binding peer atau parent-peer dan sebelum binding khusus guild. Jika sebuah binding juga menetapkan kolom match lain (misalnya peer + guildId + roles), semua kolom yang dikonfigurasi harus cocok.
Perintah native dan autentikasi perintah
commands.nativedefault-nya"auto"dan diaktifkan untuk Discord.- Override per channel:
channels.discord.commands.native. commands.native=falsemelewati pendaftaran dan pembersihan perintah slash Discord saat 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 menerapkan autentikasi OpenClaw dan mengembalikan “tidak diotorisasi”.
ephemeral: true
Detail fitur
Tag balasan dan balasan native
Tag balasan dan balasan native
[[reply_to_current]][[reply_to:<id>]]
channels.discord.replyToMode:off(default)firstallbatched
off menonaktifkan threading balasan implisit. Tag eksplisit [[reply_to_*]] tetap dihormati.
first selalu melampirkan referensi balasan native implisit ke pesan Discord keluar pertama untuk giliran tersebut.
batched hanya melampirkan referensi balasan native implisit Discord ketika
event masuk adalah batch yang didebounce dari beberapa pesan. Ini berguna
saat Anda menginginkan balasan native terutama untuk chat bursty yang ambigu, bukan setiap
giliran satu pesan.ID pesan ditampilkan di konteks/riwayat agar agent dapat menargetkan pesan tertentu.Pratinjau tautan
Pratinjau tautan
channels.discord.accounts.<id>.suppressEmbeds untuk meng-override satu akun. Pengiriman message-tool agent juga dapat meneruskan suppressEmbeds: false untuk satu pesan. Payload embeds Discord eksplisit tidak ditekan oleh pengaturan pratinjau tautan default.Pratinjau stream langsung
Pratinjau stream langsung
channels.discord.streaming menerima off | partial | block | progress (default). progress mempertahankan satu draf status yang dapat diedit dan memperbaruinya dengan progres tool sampai pengiriman final; label awal bersama adalah baris bergulir, sehingga akan tergulir keluar seperti sisanya setelah cukup banyak pekerjaan muncul. streamMode adalah alias runtime lama. Jalankan openclaw doctor --fix untuk menulis ulang config tersimpan ke key kanonis.Tetapkan channels.discord.streaming.mode ke off untuk menonaktifkan edit pratinjau Discord. Jika streaming block Discord diaktifkan secara eksplisit, OpenClaw melewati stream pratinjau untuk menghindari streaming ganda.partialmengedit satu pesan pratinjau saat token masuk.blockmemancarkan chunk seukuran draf (gunakandraftChunkuntuk menyetel ukuran dan breakpoint, dibatasi ketextChunkLimit).- Final media, error, dan balasan eksplisit membatalkan edit pratinjau yang tertunda.
streaming.preview.toolProgress(defaulttrue) mengontrol apakah pembaruan tool/progres menggunakan ulang pesan pratinjau.- Baris tool/progres dirender sebagai emoji ringkas + judul + detail jika tersedia, misalnya
🛠️ Bash: run testsatau🔎 Web Search: for "query". streaming.progress.commentary(defaultfalse) memilih untuk menyertakan teks komentar/preambul assistant dalam draf progres sementara. Komentar dibersihkan sebelum ditampilkan, tetap sementara, dan tidak mengubah pengiriman jawaban final.streaming.progress.maxLineCharsmengontrol anggaran pratinjau progres per baris. Prosa dipersingkat pada batas kata; detail perintah dan path mempertahankan sufiks yang berguna.streaming.preview.commandText/streaming.progress.commandTextmengontrol detail command/exec dalam baris progres ringkas:raw(default) ataustatus(hanya label tool).
block diaktifkan secara eksplisit, OpenClaw melewati stream pratinjau untuk menghindari streaming ganda.Riwayat, konteks, dan perilaku thread
Riwayat, konteks, dan perilaku thread
channels.discord.historyLimitdefault20- fallback:
messages.groupChat.historyLimit 0menonaktifkan
channels.discord.dmHistoryLimitchannels.discord.dms["<user_id>"].historyLimit
- Thread Discord dirutekan sebagai sesi channel dan mewarisi config channel induk kecuali di-override.
- Sesi thread mewarisi pilihan
/modeltingkat sesi milik channel induk sebagai fallback khusus model; pilihan/modellokal thread tetap diutamakan dan riwayat transkrip induk tidak disalin kecuali pewarisan transkrip diaktifkan. channels.discord.thread.inheritParent(defaultfalse) memilih agar auto-thread baru disemai dari transkrip induk. Override per akun berada di bawahchannels.discord.accounts.<id>.thread.inheritParent.- Reaksi message-tool dapat me-resolve target DM
user:<id>. guilds.<guild>.channels.<channel>.requireMention: falsedipertahankan selama fallback aktivasi tahap balasan.
Sesi terikat thread untuk subagent
Sesi terikat thread untuk subagent
/focus <target>ikat thread saat ini/baru ke target subagent/sesi/unfocushapus binding thread saat ini/agentstampilkan run aktif dan status binding/session idle <duration|off>periksa/perbarui auto-unfocus karena inaktivitas untuk binding yang difokuskan/session max-age <duration|off>periksa/perbarui usia maksimum keras untuk binding yang difokuskan
session.threadBindings.*menetapkan default global.channels.discord.threadBindings.*meng-override perilaku Discord.spawnSessionsmengontrol pembuatan/pengikatan thread otomatis untuksessions_spawn({ thread: true })dan spawn thread ACP. Default:true.defaultSpawnContextmengontrol konteks subagent native untuk spawn terikat thread. Default:"fork".- Key
spawnSubagentSessions/spawnAcpSessionsyang sudah deprecated dimigrasikan olehopenclaw doctor --fix. - Jika binding thread dinonaktifkan untuk sebuah akun,
/focusdan operasi binding thread terkait tidak tersedia.
Binding channel ACP persisten
Binding channel ACP persisten
bindings[]dengantype: "acp"danmatch.channel: "discord"
/acp spawn codex --bind heremengikat channel atau thread saat ini di tempat dan mempertahankan pesan mendatang pada sesi ACP yang sama. Pesan thread mewarisi binding channel induk.- Di channel atau thread yang terikat,
/newdan/resetmereset sesi ACP yang sama di tempat. Binding thread sementara dapat meng-override resolusi target saat aktif. spawnSessionsmembatasi pembuatan/pengikatan thread anak melalui--thread auto|here.
Notifikasi reaksi
Notifikasi reaksi
offown(default)allallowlist(menggunakanguilds.<id>.users)
Reaksi ack
Reaksi ack
ackReaction mengirim emoji pengakuan saat OpenClaw memproses pesan masuk.Urutan resolusi:channels.discord.accounts.<accountId>.ackReactionchannels.discord.ackReactionmessages.ackReaction- fallback emoji identitas agent (
agents.list[].identity.emoji, jika tidak ada ”👀”)
- Discord menerima emoji unicode atau nama emoji kustom.
- Gunakan
""untuk menonaktifkan reaksi bagi channel atau akun.
Penulisan config
Penulisan config
/config set|unset (ketika fitur perintah diaktifkan).Nonaktifkan:Proxy Gateway
Proxy Gateway
channels.discord.proxy.
Proxying WebSocket Gateway Discord bersifat eksplisit; koneksi WebSocket tidak mewarisi variabel lingkungan proxy ambient dari proses Gateway. Lookup REST startup menggunakan proxy ini ketika channels.discord.proxy dikonfigurasi.Dukungan PluralKit
Dukungan PluralKit
- daftar izin dapat menggunakan
pk:<memberId> - nama tampilan anggota dicocokkan berdasarkan nama/slug hanya ketika
channels.discord.dangerouslyAllowNameMatching: true - pencarian menggunakan ID pesan asli dan dibatasi oleh jendela waktu
- jika pencarian gagal, pesan terproksi diperlakukan sebagai pesan bot dan dibuang kecuali
allowBots=true
Alias mention keluar
Alias mention keluar
mentionAliases ketika agen memerlukan mention keluar deterministik untuk pengguna Discord yang dikenal. Kunci adalah handle tanpa awalan @; nilai adalah ID pengguna Discord. Handle yang tidak dikenal, @everyone, @here, dan mention di dalam rentang kode Markdown dibiarkan tidak berubah.Konfigurasi presence
Konfigurasi presence
- 0: Bermain
- 1: Streaming (memerlukan
activityUrl) - 2: Mendengarkan
- 3: Menonton
- 4: Kustom (menggunakan teks aktivitas sebagai status state; emoji bersifat opsional)
- 5: Bertanding
autoPresence.healthyTextautoPresence.degradedTextautoPresence.exhaustedText(mendukung placeholder{reason})
Persetujuan di Discord
Persetujuan di Discord
channels.discord.execApprovals.enabledchannels.discord.execApprovals.approvers(opsional; fallback kecommands.ownerAllowFromjika memungkinkan)channels.discord.execApprovals.target(dm|channel|both, default:dm)agentFilter,sessionFilter,cleanupAfterResolve
enabled tidak ditetapkan atau "auto" dan setidaknya satu pemberi persetujuan dapat di-resolve, baik dari execApprovals.approvers maupun dari commands.ownerAllowFrom. Discord tidak menyimpulkan pemberi persetujuan exec dari allowFrom saluran, dm.allowFrom legacy, atau defaultTo pesan langsung. Tetapkan enabled: false untuk menonaktifkan Discord sebagai klien persetujuan native secara eksplisit.Untuk perintah grup sensitif khusus pemilik seperti /diagnostics dan /export-trajectory, OpenClaw mengirim prompt persetujuan dan hasil akhir secara privat. Ini mencoba DM Discord terlebih dahulu ketika pemilik yang memanggil memiliki rute pemilik Discord; jika tidak tersedia, ini fallback 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 berhasil di-resolve 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 fallback ke pengiriman DM.Discord juga merender tombol persetujuan bersama yang digunakan oleh saluran chat lain. Adapter native Discord terutama menambahkan perutean DM pemberi persetujuan dan fanout saluran.
Ketika tombol tersebut tersedia, tombol itu adalah UX persetujuan utama; OpenClaw
hanya boleh menyertakan perintah manual /approve ketika hasil alat menyatakan
persetujuan chat tidak tersedia atau persetujuan manual adalah satu-satunya jalur.
Jika runtime persetujuan native Discord tidak aktif, OpenClaw mempertahankan
prompt lokal deterministik /approve <id> <decision> tetap terlihat. Jika
runtime aktif tetapi kartu native tidak dapat dikirimkan ke target mana pun,
OpenClaw mengirim pemberitahuan fallback di chat yang sama dengan perintah /approve
persis dari persetujuan yang tertunda.Autentikasi Gateway dan resolusi persetujuan mengikuti kontrak klien Gateway bersama (ID plugin: di-resolve melalui plugin.approval.resolve; ID lain melalui exec.approval.resolve). Persetujuan kedaluwarsa setelah 30 menit secara default.Lihat Persetujuan exec.Alat dan gerbang tindakan
Tindakan pesan Discord mencakup tindakan perpesanan, admin saluran, moderasi, presence, dan metadata. Contoh inti:- perpesanan:
sendMessage,readMessages,editMessage,deleteMessage,threadReply - reaksi:
react,reactions,emojiList - moderasi:
timeout,kick,ban - presence:
setPresence
event-create menerima parameter image opsional (URL atau jalur file lokal) untuk menetapkan gambar sampul acara terjadwal.
Gerbang tindakan berada di bawah channels.discord.actions.*.
Perilaku gerbang default:
| Grup tindakan | Default |
|---|---|
| reaksi, pesan, utas, pin, polling, pencarian, memberInfo, roleInfo, channelInfo, saluran, voiceStatus, acara, stiker, emojiUploads, stickerUploads, izin | diaktifkan |
| peran | dinonaktifkan |
| moderasi | dinonaktifkan |
| presence | dinonaktifkan |
UI komponen v2
OpenClaw menggunakan komponen Discord v2 untuk persetujuan exec dan penanda lintas konteks. Tindakan pesan Discord juga dapat menerimacomponents untuk UI kustom (lanjutan; memerlukan pembuatan payload komponen melalui alat discord), sementara embeds legacy tetap tersedia tetapi tidak direkomendasikan.
channels.discord.ui.components.accentColormenetapkan warna aksen yang digunakan oleh kontainer komponen Discord (hex).- Tetapkan per akun dengan
channels.discord.accounts.<id>.ui.components.accentColor. channels.discord.agentComponents.ttlMsmengontrol berapa lama callback komponen Discord yang dikirim tetap terdaftar (default1800000, maksimum86400000). Tetapkan per akun denganchannels.discord.accounts.<id>.agentComponents.ttlMs.embedsdiabaikan ketika komponen v2 tersedia.- Pratinjau URL polos ditekan secara default. Tetapkan
suppressEmbeds: falsepada tindakan pesan ketika satu tautan keluar harus diperluas.
Suara
Discord memiliki dua permukaan suara yang berbeda: saluran suara realtime (percakapan berkelanjutan) dan lampiran pesan suara (format pratinjau gelombang). Gateway mendukung keduanya.Saluran suara
Checklist 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). - Konfigurasi
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.speakerVoice.voice.modemengontrol jalur percakapan. Defaultnya adalahagent-proxy: antarmuka depan suara realtime menangani 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 lama STT batch plus TTS.bidimemungkinkan model realtime bercakap langsung sambil mengeksposopenclaw_agent_consultuntuk otak OpenClaw.voice.agentSessionmengontrol percakapan OpenClaw mana yang menerima giliran suara. Biarkan tidak disetel untuk sesi milik kanal suara, atau setel{ 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 disetel untuk mewarisi model agen yang dirutekan. Ini terpisah darivoice.realtime.model.voice.followUsersmemungkinkan bot bergabung, berpindah, dan keluar dari suara Discord bersama pengguna yang dipilih. Lihat Ikuti pengguna dalam suara untuk aturan perilaku dan contoh.agent-proxymerutekan ucapan melaluidiscord-voice, yang mempertahankan otorisasi owner/tool normal untuk pembicara dan sesi target tetapi menyembunyikan toolttsagen karena suara Discord memiliki pemutaran. Secara default,agent-proxymemberi konsultasi akses tool penuh yang setara owner untuk pembicara owner (voice.realtime.toolPolicy: "owner") dan sangat memprioritaskan konsultasi dengan agen OpenClaw sebelum jawaban substantif (voice.realtime.consultPolicy: "always"). Dalam mode defaultalwaysitu, lapisan realtime tidak otomatis mengucapkan pengisi sebelum jawaban konsultasi; lapisan ini 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 diantrekan sampai pemutaran idle, alih-alih 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.speakerVoicemengonfigurasi sesi audio realtime. Untuk OpenAI Realtime 2 plus otak Codex, gunakanvoice.realtime.model: "gpt-realtime-2"danvoice.model: "openai/gpt-5.5". - Mode suara realtime menyertakan file profil kecil
IDENTITY.md,USER.md, danSOUL.mddalam instruksi penyedia realtime secara default sehingga giliran langsung yang cepat mempertahankan identitas, landasan pengguna, dan persona yang sama seperti agen OpenClaw yang dirutekan. Setelvoice.realtime.bootstrapContextFileske subset untuk menyesuaikannya, atau[]untuk menonaktifkannya. File bootstrap realtime yang didukung terbatas pada file profil tersebut;AGENTS.mdtetap berada dalam konteks agen normal. Konteks profil yang disisipkan tidak menggantikanopenclaw_agent_consultuntuk pekerjaan workspace, fakta terkini, pencarian memori, atau tindakan berbasis tool. - Dalam mode realtime OpenAI
agent-proxy, setelvoice.realtime.requireWakeName: trueagar suara realtime Discord tetap diam sampai transkrip dimulai atau diakhiri dengan nama bangun. Nama bangun yang dikonfigurasi harus satu atau dua kata. Jikavoice.realtime.wakeNamestidak disetel, OpenClaw menggunakannameagen yang dirutekan plusOpenClaw, dengan fallback ke id agen plusOpenClaw. Pembatasan nama bangun menonaktifkan respons otomatis penyedia realtime, merutekan giliran yang diterima melalui jalur konsultasi agen OpenClaw, dan memberikan pengakuan lisan singkat ketika nama bangun di awal dikenali dari transkripsi parsial sebelum transkrip final tiba. - Penyedia realtime OpenAI menerima nama peristiwa Realtime 2 saat ini dan alias lama yang kompatibel dengan Codex untuk peristiwa audio keluaran dan transkrip, sehingga snapshot penyedia yang kompatibel dapat bergeser tanpa menjatuhkan audio asisten.
voice.realtime.bargeInmengontrol apakah peristiwa mulai-berbicara Discord menginterupsi pemutaran realtime aktif. Jika tidak disetel, ini mengikuti pengaturan interupsi input-audio penyedia realtime.voice.realtime.minBargeInAudioEndMsmengontrol durasi minimum pemutaran asisten sebelum barge-in realtime OpenAI memotong audio. Default:250. Setel0untuk interupsi langsung di ruangan dengan gema rendah, atau naikkan untuk pengaturan speaker dengan gema berat.- Untuk suara OpenAI pada pemutaran Discord, setel
voice.tts.provider: "openai"dan pilih suara Text-to-speech di bawahvoice.tts.providers.openai.speakerVoice.cedaradalah pilihan yang terdengar maskulin dan baik pada model TTS OpenAI saat ini. - Penimpaan
systemPromptDiscord per kanal berlaku untuk giliran transkrip suara pada kanal suara tersebut. - Giliran transkrip suara menurunkan status owner dari
allowFromDiscord (ataudm.allowFrom) untuk perintah berpagar owner dan tindakan kanal. Visibilitas tool agen mengikuti kebijakan tool yang dikonfigurasi untuk sesi yang dirutekan. - Suara Discord bersifat opt-in untuk konfigurasi hanya teks; setel
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 disetel 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 allowlist residensi opsional. Biarkan tidak disetel untuk mengizinkan/vc joinke kanal suara Discord resmi mana pun. Jika disetel,/vc join, auto-join saat startup, dan perpindahan voice-state bot dibatasi ke entri{ guildId, channelId }yang tercantum. Setel ke array kosong untuk menolak semua join suara Discord. Jika Discord memindahkan bot ke luar allowlist, OpenClaw meninggalkan kanal tersebut dan bergabung kembali ke target auto-join yang dikonfigurasi saat tersedia.voice.daveEncryptiondanvoice.decryptionFailureTolerancediteruskan ke opsi join@discordjs/voice.- Default
@discordjs/voiceadalahdaveEncryption=truedandecryptionFailureTolerance=24jika tidak disetel. - OpenClaw menggunakan codec
libopus-wasmbawaan untuk penerimaan suara Discord dan pemutaran PCM mentah realtime. Ini mengirimkan build WebAssembly libopus yang dipin dan tidak memerlukan addon opus native. voice.connectTimeoutMsmengontrol penantian Ready awal@discordjs/voiceuntuk/vc joindan percobaan 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 mulai-berbicara 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, setel
voice.realtime.providers.openai.interruptResponseOnInputAudio: falseagar OpenAI tidak otomatis menginterupsi pada audio input. Tambahkanvoice.realtime.bargeIn: truejika Anda tetap ingin peristiwa mulai-berbicara 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 menghapus pemutaran Discord. voice.captureSilenceGraceMsmengontrol berapa lama OpenClaw menunggu setelah Discord melaporkan pembicara telah berhenti sebelum memfinalisasi segmen audio tersebut untuk STT. Default:2000; naikkan ini jika Discord memecah jeda normal menjadi transkrip parsial yang tersendat.- 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 temp-file yang disintesis.
- OpenClaw juga mengawasi kegagalan dekripsi penerimaan dan memulihkan otomatis dengan keluar/bergabung kembali ke kanal suara setelah kegagalan berulang dalam jendela singkat.
- Jika log penerimaan berulang kali menampilkan
DecryptionFailed(UnencryptedWhenPassthroughDisabled)setelah pembaruan, kumpulkan laporan dependensi dan log. Baris@discordjs/voicebawaan mencakup perbaikan padding upstream dari PR discord.js #11449, yang menutup issue discord.js #11419. - Peristiwa penerimaan
The operation was aborteddiharapkan saat OpenClaw memfinalisasi segmen pembicara yang ditangkap; itu adalah diagnostik verbose, bukan peringatan. - Log suara Discord verbose menyertakan pratinjau transkrip STT satu baris yang dibatasi untuk setiap segmen pembicara yang diterima, sehingga debugging menunjukkan sisi pengguna dan sisi balasan agen tanpa membuang teks transkrip tanpa batas.
- Dalam mode
agent-proxy, fallback konsultasi paksa melewati fragmen transkrip yang kemungkinan belum lengkap seperti teks yang berakhir dengan...atau konektor akhir sepertiand, plus penutup yang jelas tidak dapat ditindaklanjuti seperti “be right back” atau “bye”. Log menampilkanforced agent consult skipped reason=...saat ini mencegah jawaban antrean yang usang.
Ikuti pengguna dalam suara
Gunakanvoice.followUsers saat Anda ingin bot suara Discord tetap bersama satu atau beberapa pengguna Discord yang dikenal alih-alih bergabung ke kanal tetap saat startup atau menunggu /vc join.
followUsersmenerima ID pengguna Discord mentah dan nilaidiscord:<id>. OpenClaw menormalkan kedua bentuk sebelum mencocokkan peristiwa voice-state.followUsersEnableddefault ketruesaatfollowUsersdikonfigurasi. Setel kefalseuntuk mempertahankan daftar tersimpan tetapi menghentikan mengikuti suara otomatis.- Saat pengguna yang diikuti bergabung ke kanal suara yang diizinkan, OpenClaw bergabung ke kanal tersebut. Saat pengguna berpindah, OpenClaw berpindah bersama mereka. Saat pengguna yang diikuti aktif terputus, OpenClaw keluar.
- Jika beberapa pengguna yang diikuti berada di guild yang sama dan pengguna yang diikuti aktif keluar, OpenClaw berpindah ke kanal pengguna lain yang diikuti dan dilacak sebelum meninggalkan guild. Jika beberapa pengguna yang diikuti berpindah sekaligus, peristiwa voice-state terbaru yang diamati menang.
allowedChannelstetap berlaku. Pengguna yang diikuti di kanal yang tidak diizinkan diabaikan, dan sesi milik follow berpindah ke pengguna lain yang diikuti atau keluar.- OpenClaw merekonsiliasi peristiwa voice-state yang terlewat saat startup dan pada interval terbatas. Rekonsiliasi mengambil sampel guild yang dikonfigurasi dan membatasi pencarian REST per proses, sehingga daftar
followUsersyang sangat besar mungkin membutuhkan lebih dari satu interval untuk konvergen. - Jika Discord atau admin memindahkan bot saat sedang mengikuti pengguna, OpenClaw membangun ulang sesi suara dan mempertahankan kepemilikan follow saat tujuan diizinkan. Jika bot dipindahkan ke luar
allowedChannels, OpenClaw keluar dan bergabung kembali ke target yang dikonfigurasi saat ada. - Pemulihan penerimaan DAVE dapat keluar dan bergabung kembali ke kanal yang sama setelah kegagalan dekripsi berulang. Sesi milik follow mempertahankan kepemilikan follow melalui jalur pemulihan tersebut, sehingga pemutusan pengguna yang diikuti berikutnya tetap meninggalkan kanal.
- Gunakan
followUsersuntuk pengaturan personal atau operator ketika bot harus otomatis berada di suara saat Anda ada. - Gunakan
autoJoinuntuk bot ruang tetap yang harus hadir bahkan saat tidak ada pengguna terlacak dalam suara. - Gunakan
/vc joinuntuk join sekali pakai atau ruangan ketika kehadiran suara otomatis akan mengejutkan.
- Log penerimaan suara menampilkan
discord voice: opus decoder: libopus-wasm. - Pemutaran realtime mengodekan PCM stereo mentah 48 kHz ke Opus dengan paket
libopus-wasmbawaan yang sama sebelum menyerahkan paket ke@discordjs/voice. - Pemutaran file dan stream penyedia mentranskode ke PCM stereo mentah 48 kHz dengan ffmpeg, lalu menggunakan
libopus-wasmuntuk stream paket Opus yang dikirim ke Discord.
- Tangkapan PCM Discord dikonversi menjadi file sementara WAV.
tools.media.audiomenangani STT, misalnyaopenai/gpt-4o-mini-transcribe.- Transkrip dikirim melalui ingress dan perutean Discord sementara LLM respons berjalan dengan kebijakan keluaran suara yang menyembunyikan tool agen
ttsdan meminta teks yang dikembalikan, karena suara Discord memiliki pemutaran TTS akhir. voice.model, jika disetel, hanya menimpa LLM respons untuk giliran channel suara ini.voice.ttsdigabungkan di atasmessages.tts; penyedia yang mendukung streaming langsung memasok pemutar, jika tidak, file audio yang dihasilkan diputar di channel yang telah dimasuki.
voice.agentSession, setiap channel suara mendapatkan sesi OpenClaw terute sendiri. Misalnya, /vc join channel:234567890123456789 berbicara dengan sesi untuk channel suara Discord tersebut. Model realtime hanya menjadi front end suara; permintaan substantif diserahkan ke agen OpenClaw yang dikonfigurasi. Jika model realtime menghasilkan transkrip akhir tanpa memanggil tool konsultasi, OpenClaw memaksa konsultasi sebagai fallback agar bawaan tetap berperilaku seperti berbicara dengan agen.
Contoh STT plus TTS lama:
agent-proxy, bot bergabung ke channel suara yang dikonfigurasi, tetapi giliran agen OpenClaw menggunakan sesi terute normal dan agen milik channel target. Sesi suara realtime mengucapkan kembali hasil yang dikembalikan ke channel suara. Agen supervisor masih dapat menggunakan tool pesan normal sesuai kebijakan tool-nya, termasuk mengirim pesan Discord terpisah jika itu tindakan yang tepat.
Saat run OpenClaw yang didelegasikan aktif, transkrip suara Discord baru diperlakukan sebagai kontrol run langsung sebelum memulai giliran agen lain. Frasa seperti “status”, “cancel that”, “use the smaller fix”, atau “when you’re done also check tests” diklasifikasikan sebagai status, pembatalan, pengarahan, atau masukan tindak lanjut untuk sesi aktif. Hasil status, pembatalan, pengarahan yang diterima, dan tindak lanjut diucapkan kembali ke channel suara agar pemanggil tahu apakah OpenClaw menangani permintaan tersebut.
Bentuk target yang berguna:
target: "channel:123456789012345678"merutekan melalui sesi channel teks Discord.target: "123456789012345678"diperlakukan sebagai target channel.target: "dm:123456789012345678"atautarget: "user:123456789012345678"merutekan melalui sesi pesan langsung tersebut.
bargeIn: true memungkinkan peristiwa speaker-start Discord dan audio speaker yang sudah aktif membatalkan respons realtime aktif sebelum giliran tangkapan berikutnya mencapai OpenAI. Sinyal barge-in yang sangat awal dengan audioEndMs di bawah minBargeInAudioEndMs diperlakukan sebagai kemungkinan echo/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=... - Pada audio speaker:
discord voice: realtime speaker turn opened ...,discord voice: realtime input audio started ... outputAudioMs=... outputActive=..., dandiscord voice: realtime speaker turn closed ... chunks=... discordBytes=... realtimeBytes=... interruptedPlayback=... - Pada ucapan usang yang dilewati:
discord voice: realtime forced agent consult skipped reason=incomplete-transcript ...ataureason=non-actionable-closing ... - Pada penyelesaian respons realtime:
discord voice: realtime audio playback finishing reason=response.done ... audioMs=... chunks=... - Pada penghentian/reset pemutaran:
discord voice: realtime audio playback stopped reason=... audioMs=... elapsedMs=... chunks=... - Pada konsultasi realtime:
discord voice: realtime consult requested ... voiceSession=... supervisorSession=... question=... - Pada jawaban agen:
discord voice: agent turn answer ... - Pada ucapan persis yang diantrekan:
discord voice: realtime exact speech queued ... queued=... outputAudioMs=... outputActive=..., diikuti olehdiscord voice: realtime exact speech dequeued reason=player-idle ... - Pada 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=... - Pada 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 ... - Pada echo/noise yang diabaikan:
discord voice: realtime model interrupt ignored client:conversation.item.truncate.skipped reason=barge-in audioEndMs=0 minAudioEndMs=250 - Pada barge-in yang dinonaktifkan:
discord voice: realtime capture ignored during playback (barge-in disabled) ... - Pada 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 keluaran asisten, byte PCM Discord, byte realtime penyedia, dan durasi audio tersintesis dari titik ini.realtime speaker turn openedmenandai speaker 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 speaker tersebut.outputActive=trueatauoutputAudioMsbukan nol di sini berarti mikrofon mengirim input saat pemutaran asisten masih aktif.barge-in detected source=active-speaker-audioberarti OpenClaw melihat audio speaker langsung saat pemutaran asisten aktif. Ini berguna untuk membedakan interupsi nyata dari peristiwa speaker-start Discord tanpa audio yang berguna.barge-in requested reason=...berarti OpenClaw meminta penyedia realtime untuk membatalkan atau memotong respons aktif. Ini menyertakanoutputAudioMs,outputActive, danplaybackChunkssehingga Anda dapat melihat berapa banyak audio asisten yang benar-benar sudah diputar sebelum interupsi.realtime audio playback stopped reason=...adalah titik reset pemutaran Discord lokal. Alasannya menyatakan 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 speaker terbuka tetapi tidak ada audio yang dapat digunakan mencapai bridge realtime.interruptedPlayback=trueberarti giliran input tersebut tumpang tindih dengan keluaran asisten dan memicu logika barge-in.
outputAudioMs: durasi audio asisten yang dihasilkan oleh penyedia 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 speaker.discordBytes: byte PCM stereo 48 kHz yang dikirim ke atau diterima dari suara Discord.realtimeBytes: byte PCM format penyedia yang dikirim ke atau diterima dari penyedia realtime.playbackChunks: chunk audio asisten yang diteruskan ke Discord untuk respons aktif.sinceLastAudioMs: jeda antara frame audio speaker terakhir yang ditangkap dan penutupan giliran speaker.
- Pemotongan langsung dengan
source=active-speaker-audio,outputAudioMskecil, dan pengguna yang sama di dekatnya biasanya menunjukkan echo speaker masuk ke mikrofon. Naikkanvoice.realtime.minBargeInAudioEndMs, kecilkan volume speaker, gunakan headphone, atau setelvoice.realtime.providers.openai.interruptResponseOnInputAudio: false. source=speaker-startdiikuti olehspeaker turn closed ... hasAudio=falseberarti Discord melaporkan speaker mulai tetapi tidak ada audio yang mencapai OpenClaw. Itu bisa 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 penyedia 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 menyela pemutaran.barge-in ignored ... outputActive=falseberarti Discord atau VAD penyedia melaporkan ucapan, tetapi OpenClaw tidak memiliki pemutaran aktif untuk disela. Ini seharusnya tidak memotong audio.
voice.model, autentikasi STT untuk tools.media.audio, autentikasi TTS untuk messages.tts/voice.tts, dan autentikasi penyedia realtime untuk voice.realtime.providers atau konfigurasi autentikasi normal penyedia.
Pesan suara
Pesan suara Discord menampilkan pratinjau waveform dan memerlukan audio OGG/Opus. OpenClaw menghasilkan waveform secara otomatis, tetapi membutuhkanffmpeg dan ffprobe di host gateway untuk memeriksa dan mengonversi.
- Berikan jalur berkas 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 saat Anda bergantung pada resolusi pengguna/anggota
- mulai ulang gateway setelah mengubah intent
Guild messages blocked unexpectedly
Guild messages blocked unexpectedly
- verifikasi
groupPolicy - verifikasi daftar izin guild di bawah
channels.discord.guilds - jika peta
channelsguild ada, hanya kanal yang tercantum yang diizinkan - verifikasi perilaku
requireMentiondan pola mention
Require mention false but still blocked
Require mention false but still blocked
groupPolicy="allowlist"tanpa daftar izin guild/kanal yang cocokrequireMentiondikonfigurasi di tempat yang salah (harus berada di bawahchannels.discord.guildsatau entri kanal)- pengirim diblokir oleh daftar izin
usersguild/kanal
Long-running Discord turns or duplicate replies
Long-running Discord turns or duplicate replies
Slow listener detected ...stuck session: sessionKey=agent:...:discord:... state=processing ...
- akun tunggal:
channels.discord.eventQueue.listenerTimeout - multi-akun:
channels.discord.accounts.<accountId>.eventQueue.listenerTimeout - ini hanya mengontrol kerja listener Gateway Discord, bukan masa aktif giliran agen
Gateway metadata lookup timeout warnings
Gateway metadata lookup timeout warnings
/gateway/bot Discord sebelum terhubung. Kegagalan sementara menggunakan URL Gateway default Discord sebagai fallback dan dibatasi lajunya di log.Pengatur timeout metadata:- akun tunggal:
channels.discord.gatewayInfoTimeoutMs - multi-akun:
channels.discord.accounts.<accountId>.gatewayInfoTimeoutMs - fallback env saat config belum diatur:
OPENCLAW_DISCORD_GATEWAY_INFO_TIMEOUT_MS - default:
30000(30 detik), maks:120000
Gateway READY timeout restarts
Gateway READY timeout restarts
READY Gateway Discord selama startup dan setelah runtime terhubung ulang. Setup multi-akun dengan penjadwalan startup bertahap dapat memerlukan jendela READY startup yang lebih panjang daripada default.Pengatur timeout READY:- startup akun tunggal:
channels.discord.gatewayReadyTimeoutMs - startup multi-akun:
channels.discord.accounts.<accountId>.gatewayReadyTimeoutMs - fallback env startup saat config belum diatur:
OPENCLAW_DISCORD_READY_TIMEOUT_MS - default startup:
15000(15 detik), maks:120000 - runtime akun tunggal:
channels.discord.gatewayRuntimeReadyTimeoutMs - runtime multi-akun:
channels.discord.accounts.<accountId>.gatewayRuntimeReadyTimeoutMs - fallback env runtime saat config belum diatur:
OPENCLAW_DISCORD_RUNTIME_READY_TIMEOUT_MS - default runtime:
30000(30 detik), maks:120000
Permissions audit mismatches
Permissions audit mismatches
channels status --probe hanya berfungsi untuk ID kanal 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"(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 daftar izin yang ketat untuk menghindari perilaku loop.
Lebih baik gunakan channels.discord.allowBots="mentions" agar hanya menerima pesan bot yang me-mention bot tersebut.OpenClaw juga menyertakan perlindungan loop bot bersama. Setiap kali allowBots membiarkan pesan yang ditulis bot mencapai dispatch, Discord memetakan event masuk ke fakta (account, channel, bot pair) dan guard pasangan generik menekan pasangan tersebut setelah melewati anggaran event yang dikonfigurasi. Guard ini mencegah loop dua bot yang tidak terkendali yang sebelumnya harus dihentikan oleh batas laju Discord; guard ini tidak memengaruhi deployment bot tunggal atau balasan bot sekali jalan yang tetap berada di bawah anggaran.Pengaturan default (aktif saat allowBots diatur):maxEventsPerWindow: 20— pasangan bot dapat bertukar 20 pesan dalam jendela geserwindowSeconds: 60— panjang jendela gesercooldownSeconds: 60— setelah anggaran terlampaui, setiap pesan bot-ke-bot tambahan ke arah mana pun dibuang selama satu menit
channels.defaults.botLoopProtection, lalu timpa Discord saat workflow yang sah membutuhkan ruang lebih besar. Prioritasnya adalah:channels.discord.accounts.<account>.botLoopProtectionchannels.discord.botLoopProtectionchannels.defaults.botLoopProtection- default bawaan
maxEventsPerWindow, windowSeconds, dan cooldownSeconds.Voice STT drops with DecryptionFailed(...)
Voice STT drops with DecryptionFailed(...)
- pastikan OpenClaw tetap terbaru (
openclaw update) agar 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 - kebijakan:
groupPolicy,dm.*,guilds.*,guilds.*.channels.* - perintah:
commands.native,commands.useAccessGroups,configWrites,slashCommand.* - antrean event:
eventQueue.listenerTimeout(anggaran listener),eventQueue.maxQueueSize,eventQueue.maxConcurrency - Gateway:
gatewayInfoTimeoutMs,gatewayReadyTimeoutMs,gatewayRuntimeReadyTimeoutMs - balasan/riwayat:
replyToMode,historyLimit,dmHistoryLimit,dms.*.historyLimit - pengiriman:
textChunkLimit,chunkMode,maxLinesPerMessage - streaming:
streaming(alias legacy:streamMode),streaming.preview.toolProgress,draftChunk,blockStreaming,blockStreamingCoalesce - media/coba ulang:
mediaMaxMb(membatasi unggahan Discord keluar, default100MB),retry - tindakan:
actions.* - presence:
activity,status,activityType,activityUrl - UI:
ui.components.accentColor - fitur:
threadBindings,bindings[]tingkat atas (type: "acp"),pluralkit,execApprovals,intents,agentComponents.enabled,agentComponents.ttlMs,heartbeat,responsePrefix
Keamanan dan operasi
- Perlakukan token bot sebagai rahasia (
DISCORD_BOT_TOKENlebih disarankan di lingkungan yang diawasi). - Berikan izin Discord dengan hak paling rendah.
- Jika deployment/status perintah sudah usang, mulai ulang Gateway dan periksa ulang dengan
openclaw channels status --probe.