Langsung ke konten utama

Discord (Bot API)

Status: siap untuk DM dan saluran guild melalui gateway Discord resmi.

Pairing

DM Discord secara default menggunakan mode pairing.

Slash commands

Perilaku perintah native dan katalog perintah.

Pemecahan masalah saluran

Diagnostik lintas saluran dan alur perbaikan.

Penyiapan cepat

Anda perlu membuat aplikasi baru dengan bot, menambahkan bot ke server Anda, lalu memasangkannya ke OpenClaw. Kami merekomendasikan menambahkan bot Anda ke server pribadi Anda sendiri. Jika Anda belum punya, buat dulu (pilih Create My Own > For me and my friends).
1

Buat aplikasi dan bot Discord

Buka Discord Developer Portal dan klik New Application. Beri nama seperti “OpenClaw”.Klik Bot di bilah sisi. Atur Username ke apa pun yang Anda gunakan untuk menyebut agen OpenClaw Anda.
2

Aktifkan intent istimewa

Masih di halaman Bot, gulir ke bawah ke Privileged Gateway Intents lalu aktifkan:
  • Message Content Intent (wajib)
  • Server Members Intent (direkomendasikan; wajib untuk allowlist peran dan pencocokan nama-ke-ID)
  • Presence Intent (opsional; hanya diperlukan untuk pembaruan presence)
3

Salin token bot Anda

Gulir kembali ke atas di halaman Bot lalu klik Reset Token.
Meskipun namanya begitu, ini menghasilkan token pertama Anda — tidak ada yang sedang “direset.”
Salin token tersebut dan simpan di suatu tempat. Ini adalah Bot Token Anda dan Anda akan segera membutuhkannya.
4

Buat URL undangan dan tambahkan bot ke server Anda

Klik OAuth2 di bilah sisi. Anda akan membuat URL undangan dengan izin yang tepat untuk menambahkan bot ke server Anda.Gulir ke bawah ke OAuth2 URL Generator dan aktifkan:
  • bot
  • applications.commands
Bagian Bot Permissions akan muncul di bawah. Aktifkan:
  • View Channels
  • Send Messages
  • Read Message History
  • Embed Links
  • Attach Files
  • Add Reactions (opsional)
Salin URL yang dihasilkan di bagian bawah, tempelkan ke browser Anda, pilih server Anda, lalu klik Continue untuk menghubungkan. Anda sekarang seharusnya dapat melihat bot Anda di server Discord.
5

Aktifkan Developer Mode dan kumpulkan ID Anda

Kembali ke aplikasi Discord, Anda perlu mengaktifkan Developer Mode agar dapat menyalin ID internal.
  1. Klik User Settings (ikon roda gigi di samping avatar Anda) → Advanced → aktifkan Developer Mode
  2. Klik kanan ikon server Anda di bilah sisi → Copy Server ID
  3. Klik kanan avatar Anda sendiriCopy User ID
Simpan Server ID dan User ID Anda bersama Bot Token — Anda akan mengirim ketiganya ke OpenClaw pada langkah berikutnya.
6

Izinkan DM dari anggota server

Agar pairing berfungsi, Discord perlu mengizinkan bot Anda mengirimi Anda DM. Klik kanan ikon server Anda → Privacy Settings → aktifkan Direct Messages.Ini memungkinkan anggota server (termasuk bot) mengirimkan DM kepada Anda. Biarkan ini tetap aktif jika Anda ingin menggunakan DM Discord dengan OpenClaw. Jika Anda hanya berencana menggunakan saluran guild, Anda dapat menonaktifkan DM setelah pairing.
7

Setel token bot Anda dengan aman (jangan kirim di chat)

Token bot Discord Anda adalah rahasia (seperti kata sandi). Setel token ini pada mesin yang menjalankan OpenClaw sebelum mengirim pesan ke agen Anda.
export DISCORD_BOT_TOKEN="YOUR_BOT_TOKEN"
openclaw config set channels.discord.token --ref-provider default --ref-source env --ref-id DISCORD_BOT_TOKEN --dry-run
openclaw config set channels.discord.token --ref-provider default --ref-source env --ref-id DISCORD_BOT_TOKEN
openclaw config set channels.discord.enabled true --strict-json
openclaw gateway
Jika OpenClaw sudah berjalan sebagai layanan latar belakang, mulai ulang melalui aplikasi OpenClaw Mac atau dengan menghentikan lalu menjalankan kembali proses openclaw gateway run.
8

Konfigurasikan OpenClaw dan lakukan pairing

Chat dengan agen OpenClaw Anda di saluran yang sudah ada (misalnya Telegram) lalu beri tahu. Jika Discord adalah saluran pertama Anda, gunakan tab CLI / config sebagai gantinya.
“Saya sudah menetapkan token bot Discord saya di config. Tolong selesaikan penyiapan Discord dengan User ID <user_id> dan Server ID <server_id>.”
9

Setujui pairing DM pertama

Tunggu sampai gateway berjalan, lalu kirim DM ke bot Anda di Discord. Bot akan merespons dengan kode pairing.
Kirim kode pairing ke agen Anda di saluran yang sudah ada:
“Setujui kode pairing Discord ini: <CODE>
Kode pairing kedaluwarsa setelah 1 jam.Anda sekarang seharusnya dapat mengobrol dengan agen Anda di Discord melalui DM.
Resolusi token bersifat account-aware. Nilai token config lebih diprioritaskan daripada fallback env. DISCORD_BOT_TOKEN hanya digunakan untuk akun default. Untuk panggilan outbound lanjutan (aksi alat pesan/saluran), token eksplisit per panggilan digunakan untuk panggilan tersebut. Ini berlaku untuk aksi bergaya kirim dan baca/probe (misalnya read/search/fetch/thread/pins/permissions). Pengaturan kebijakan/retry akun tetap berasal dari akun yang dipilih dalam snapshot runtime aktif.

Rekomendasi: siapkan workspace guild

Setelah DM berfungsi, Anda dapat menyiapkan server Discord Anda sebagai workspace penuh di mana setiap saluran mendapatkan sesi agen sendiri dengan konteksnya sendiri. Ini direkomendasikan untuk server pribadi yang hanya berisi Anda dan bot Anda.
1

Tambahkan server Anda ke guild allowlist

Ini memungkinkan agen Anda merespons di saluran mana pun di server Anda, bukan hanya DM.
“Tambahkan Server ID Discord saya <server_id> ke guild allowlist”
2

Izinkan respons tanpa @mention

Secara default, agen Anda hanya merespons di saluran guild saat di-@mention. Untuk server pribadi, kemungkinan Anda ingin agen merespons setiap pesan.
“Izinkan agen saya merespons di server ini tanpa harus di-@mention”
3

Rencanakan memori di saluran guild

Secara default, memori jangka panjang (MEMORY.md) hanya dimuat dalam sesi DM. Saluran guild tidak otomatis memuat MEMORY.md.
“Saat saya mengajukan pertanyaan di saluran Discord, gunakan memory_search atau memory_get jika Anda memerlukan konteks jangka panjang dari MEMORY.md.”
Sekarang buat beberapa saluran di server Discord Anda dan mulai mengobrol. Agen Anda dapat melihat nama saluran, dan setiap saluran mendapatkan sesi terisolasi sendiri — jadi Anda dapat menyiapkan #coding, #home, #research, atau apa pun yang sesuai dengan alur kerja Anda.

Model runtime

  • Gateway memiliki koneksi Discord.
  • Perutean balasan bersifat deterministik: balasan masuk dari Discord dikembalikan ke Discord.
  • Secara default (session.dmScope=main), chat langsung berbagi sesi utama agen (agent:main:main).
  • Saluran guild adalah kunci sesi terisolasi (agent:<agentId>:discord:channel:<channelId>).
  • Group DM diabaikan secara default (channels.discord.dm.groupEnabled=false).
  • Slash command native berjalan dalam sesi perintah terisolasi (agent:<agentId>:discord:slash:<userId>), sambil tetap membawa CommandTargetSessionKey ke sesi percakapan yang dirutekan.

Saluran forum

Saluran 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 pesan Anda yang tidak kosong.
  • Gunakan openclaw message thread create untuk membuat thread secara langsung. Jangan berikan --message-id untuk saluran forum.
Contoh: kirim ke induk forum untuk membuat thread
openclaw message send --channel discord --target channel:<forumId> \
  --message "Topic title\nBody of the post"
Contoh: buat thread forum secara eksplisit
openclaw message thread create --channel discord --target channel:<forumId> \
  --thread-name "Topic title" --message "Body of the post"
Induk forum tidak menerima komponen Discord. Jika Anda membutuhkan komponen, kirim ke thread itu sendiri (channel:<threadId>).

Komponen interaktif

OpenClaw mendukung container komponen v2 Discord untuk pesan agen. Gunakan alat pesan dengan payload components. Hasil interaksi dirutekan kembali ke agen sebagai pesan masuk biasa 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
  • Tipe select: string, user, role, mentionable, channel
Secara default, komponen hanya dapat digunakan satu kali. Tetapkan components.reusable=true agar tombol, select, dan formulir dapat digunakan berkali-kali sampai kedaluwarsa. Untuk membatasi siapa yang dapat mengeklik tombol, tetapkan allowedUsers pada tombol tersebut (ID pengguna Discord, tag, atau *). Jika dikonfigurasi, pengguna yang tidak cocok akan menerima penolakan ephemeral. Slash command /model dan /models membuka pemilih model interaktif dengan dropdown provider dan model serta langkah Submit. Balasan pemilih bersifat ephemeral dan hanya pengguna yang memanggilnya yang dapat menggunakannya. Lampiran file:
  • blok file harus menunjuk ke referensi lampiran (attachment://<filename>)
  • Berikan lampiran melalui media/path/filePath (satu file); gunakan media-gallery untuk beberapa file
  • Gunakan filename untuk mengganti nama unggahan saat harus cocok dengan referensi lampiran
Formulir modal:
  • Tambahkan components.modal dengan hingga 5 field
  • Tipe field: text, checkbox, radio, select, role-select, user-select
  • OpenClaw otomatis menambahkan tombol pemicu
Contoh:
{
  channel: "discord",
  action: "send",
  to: "channel:123456789012345678",
  message: "Optional fallback text",
  components: {
    reusable: true,
    text: "Choose a path",
    blocks: [
      {
        type: "actions",
        buttons: [
          {
            label: "Approve",
            style: "success",
            allowedUsers: ["123456789012345678"],
          },
          { label: "Decline", style: "danger" },
        ],
      },
      {
        type: "actions",
        select: {
          type: "string",
          placeholder: "Pick an option",
          options: [
            { label: "Option A", value: "a" },
            { label: "Option B", value: "b" },
          ],
        },
      },
    ],
    modal: {
      title: "Details",
      triggerLabel: "Open form",
      fields: [
        { type: "text", label: "Requester" },
        {
          type: "select",
          label: "Priority",
          options: [
            { label: "Low", value: "low" },
            { label: "High", value: "high" },
          ],
        },
      ],
    },
  },
}

Kontrol akses dan perutean

channels.discord.dmPolicy mengontrol akses DM (legacy: channels.discord.dm.policy):
  • pairing (default)
  • allowlist
  • open (memerlukan channels.discord.allowFrom mencakup "*"; legacy: channels.discord.dm.allowFrom)
  • disabled
Jika kebijakan DM tidak open, pengguna yang tidak dikenal diblokir (atau diminta melakukan pairing dalam mode pairing).Prioritas multi-akun:
  • channels.discord.accounts.default.allowFrom hanya berlaku untuk akun default.
  • Akun bernama mewarisi channels.discord.allowFrom saat allowFrom mereka sendiri tidak ditetapkan.
  • Akun bernama tidak mewarisi channels.discord.accounts.default.allowFrom.
Format target DM untuk pengiriman:
  • user:<id>
  • mention <@id>
ID numerik polos bersifat ambigu dan ditolak kecuali jenis target user/channel eksplisit diberikan.

Perutean agen berbasis peran

Gunakan bindings[].match.roles untuk merutekan anggota guild Discord ke agen yang 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 suatu binding juga menetapkan field pencocokan lain (misalnya peer + guildId + roles), semua field yang dikonfigurasi harus cocok.
{
  bindings: [
    {
      agentId: "opus",
      match: {
        channel: "discord",
        guildId: "123456789012345678",
        roles: ["111111111111111111"],
      },
    },
    {
      agentId: "sonnet",
      match: {
        channel: "discord",
        guildId: "123456789012345678",
      },
    },
  ],
}

Penyiapan Developer Portal

  1. Discord Developer Portal -> Applications -> New Application
  2. Bot -> Add Bot
  3. Salin token bot
Di Bot -> Privileged Gateway Intents, aktifkan:
  • Message Content Intent
  • Server Members Intent (direkomendasikan)
Presence intent bersifat opsional dan hanya diperlukan jika Anda ingin menerima pembaruan presence. Menetapkan presence bot (setPresence) tidak memerlukan pembaruan presence untuk anggota diaktifkan.
Generator URL OAuth:
  • scopes: bot, applications.commands
Izin baseline yang umum:
  • View Channels
  • Send Messages
  • Read Message History
  • Embed Links
  • Attach Files
  • Add Reactions (opsional)
Hindari Administrator kecuali benar-benar diperlukan.
Aktifkan Discord Developer Mode, lalu salin:
  • ID server
  • ID saluran
  • ID pengguna
Lebih pilih ID numerik dalam config OpenClaw untuk audit dan probe yang andal.

Perintah native dan autentikasi perintah

  • commands.native secara default bernilai "auto" dan diaktifkan untuk Discord.
  • Override per saluran: channels.discord.commands.native.
  • commands.native=false secara eksplisit menghapus perintah native Discord yang sebelumnya terdaftar.
  • Autentikasi perintah native menggunakan allowlist/kebijakan Discord yang sama seperti penanganan pesan biasa.
  • Perintah mungkin tetap terlihat di UI Discord bagi pengguna yang tidak berwenang; eksekusi tetap menerapkan autentikasi OpenClaw dan mengembalikan “not authorized”.
Lihat Slash commands untuk katalog dan perilaku perintah. Pengaturan slash command default:
  • ephemeral: true

Detail fitur

Discord mendukung tag balasan dalam output agen:
  • [[reply_to_current]]
  • [[reply_to:<id>]]
Dikontrol oleh channels.discord.replyToMode:
  • off (default)
  • first
  • all
  • batched
Catatan: off menonaktifkan threading balasan implisit. Tag [[reply_to_*]] eksplisit 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 giliran masuk adalah batch terdebounce dari beberapa pesan. Ini berguna ketika Anda menginginkan balasan native terutama untuk chat yang ambigu dan ramai, bukan untuk setiap giliran satu pesan.ID pesan dimunculkan dalam konteks/riwayat sehingga agen dapat menargetkan pesan tertentu.
OpenClaw dapat melakukan streaming draf balasan dengan mengirim pesan sementara dan mengeditnya saat teks tiba.
  • channels.discord.streaming mengontrol streaming pratinjau (off | partial | block | progress, default: off).
  • Default tetap off karena edit pratinjau Discord dapat dengan cepat terkena batas laju, terutama ketika beberapa bot atau gateway berbagi akun atau lalu lintas guild yang sama.
  • progress diterima untuk konsistensi lintas saluran dan dipetakan ke partial di Discord.
  • channels.discord.streamMode adalah alias legacy dan dimigrasikan otomatis.
  • partial mengedit satu pesan pratinjau saat token tiba.
  • block mengeluarkan potongan seukuran draf (gunakan draftChunk untuk menyesuaikan ukuran dan breakpoint).
Contoh:
{
  channels: {
    discord: {
      streaming: "partial",
    },
  },
}
Default potongan mode block (dibatasi ke channels.discord.textChunkLimit):
{
  channels: {
    discord: {
      streaming: "block",
      draftChunk: {
        minChars: 200,
        maxChars: 800,
        breakPreference: "paragraph",
      },
    },
  },
}
Streaming pratinjau hanya untuk teks; balasan media kembali ke pengiriman normal.Catatan: streaming pratinjau terpisah dari block streaming. Saat block streaming secara eksplisit diaktifkan untuk Discord, OpenClaw melewati stream pratinjau untuk menghindari streaming ganda.
Konteks riwayat guild:
  • channels.discord.historyLimit default 20
  • fallback: messages.groupChat.historyLimit
  • 0 menonaktifkan
Kontrol riwayat DM:
  • channels.discord.dmHistoryLimit
  • channels.discord.dms["<user_id>"].historyLimit
Perilaku thread:
  • Thread Discord dirutekan sebagai sesi saluran
  • metadata thread induk dapat digunakan untuk keterkaitan sesi induk
  • config thread mewarisi config saluran induk kecuali ada entri khusus thread
Topik saluran disuntikkan sebagai konteks tidak tepercaya (bukan sebagai system prompt). Konteks balasan dan pesan yang dikutip saat ini tetap sebagaimana diterima. Allowlist Discord terutama membatasi siapa yang dapat memicu agen, bukan batas penyuntingan konteks tambahan yang sepenuhnya lengkap.
Discord dapat mengikat thread ke target sesi sehingga pesan tindak lanjut di thread tersebut tetap dirutekan ke sesi yang sama (termasuk sesi subagen).Perintah:
  • /focus <target> mengikat thread saat ini/baru ke target subagen/sesi
  • /unfocus menghapus binding thread saat ini
  • /agents menampilkan run aktif dan status binding
  • /session idle <duration|off> memeriksa/memperbarui auto-unfocus karena tidak aktif untuk binding yang difokuskan
  • /session max-age <duration|off> memeriksa/memperbarui usia maksimum keras untuk binding yang difokuskan
Config:
{
  session: {
    threadBindings: {
      enabled: true,
      idleHours: 24,
      maxAgeHours: 0,
    },
  },
  channels: {
    discord: {
      threadBindings: {
        enabled: true,
        idleHours: 24,
        maxAgeHours: 0,
        spawnSubagentSessions: false, // opt-in
      },
    },
  },
}
Catatan:
  • session.threadBindings.* menetapkan default global.
  • channels.discord.threadBindings.* menggantikan perilaku Discord.
  • spawnSubagentSessions harus bernilai true untuk membuat/mengikat thread otomatis bagi sessions_spawn({ thread: true }).
  • spawnAcpSessions harus bernilai true untuk membuat/mengikat thread otomatis bagi ACP (/acp spawn ... --thread ... atau sessions_spawn({ runtime: "acp", thread: true })).
  • Jika thread binding dinonaktifkan untuk suatu akun, /focus dan operasi thread binding terkait tidak tersedia.
Lihat Sub-agents, ACP Agents, dan Configuration Reference.
Untuk workspace ACP yang stabil dan “selalu aktif”, konfigurasikan binding ACP bertipe tingkat atas yang menargetkan percakapan Discord.Jalur config:
  • bindings[] dengan type: "acp" dan match.channel: "discord"
Contoh:
{
  agents: {
    list: [
      {
        id: "codex",
        runtime: {
          type: "acp",
          acp: {
            agent: "codex",
            backend: "acpx",
            mode: "persistent",
            cwd: "/workspace/openclaw",
          },
        },
      },
    ],
  },
  bindings: [
    {
      type: "acp",
      agentId: "codex",
      match: {
        channel: "discord",
        accountId: "default",
        peer: { kind: "channel", id: "222222222222222222" },
      },
      acp: { label: "codex-main" },
    },
  ],
  channels: {
    discord: {
      guilds: {
        "111111111111111111": {
          channels: {
            "222222222222222222": {
              requireMention: false,
            },
          },
        },
      },
    },
  },
}
Catatan:
  • /acp spawn codex --bind here mengikat saluran atau thread Discord saat ini di tempat dan menjaga agar pesan mendatang tetap dirutekan ke sesi ACP yang sama.
  • Itu masih dapat berarti “memulai sesi ACP Codex baru”, tetapi tidak dengan sendirinya membuat thread Discord baru. Saluran yang ada tetap menjadi permukaan chat.
  • Codex mungkin tetap berjalan dalam cwd atau workspace backend tersendiri di disk. Workspace itu adalah state runtime, bukan thread Discord.
  • Pesan thread dapat mewarisi binding ACP saluran induk.
  • Dalam saluran atau thread yang terikat, /new dan /reset mereset sesi ACP yang sama di tempat.
  • Thread binding sementara tetap berfungsi dan dapat menggantikan resolusi target saat aktif.
  • spawnAcpSessions hanya diperlukan ketika OpenClaw perlu membuat/mengikat thread anak melalui --thread auto|here. Ini tidak diperlukan untuk /acp spawn ... --bind here di saluran saat ini.
Lihat ACP Agents untuk detail perilaku binding.
Mode notifikasi reaksi per guild:
  • off
  • own (default)
  • all
  • allowlist (menggunakan guilds.<id>.users)
Event reaksi diubah menjadi system event dan dilampirkan ke sesi Discord yang dirutekan.
ackReaction mengirim emoji pengakuan saat OpenClaw sedang memproses pesan masuk.Urutan resolusi:
  • channels.discord.accounts.<accountId>.ackReaction
  • channels.discord.ackReaction
  • messages.ackReaction
  • fallback emoji identitas agen (agents.list[].identity.emoji, jika tidak ada ”👀”)
Catatan:
  • Discord menerima emoji unicode atau nama emoji kustom.
  • Gunakan "" untuk menonaktifkan reaksi untuk saluran atau akun.
Penulisan config yang dimulai dari saluran diaktifkan secara default.Ini memengaruhi alur /config set|unset (saat fitur perintah diaktifkan).Nonaktifkan:
{
  channels: {
    discord: {
      configWrites: false,
    },
  },
}
Rutekan lalu lintas WebSocket gateway Discord dan lookup REST saat startup (ID aplikasi + resolusi allowlist) melalui proxy HTTP(S) dengan channels.discord.proxy.
{
  channels: {
    discord: {
      proxy: "http://proxy.example:8080",
    },
  },
}
Override per akun:
{
  channels: {
    discord: {
      accounts: {
        primary: {
          proxy: "http://proxy.example:8080",
        },
      },
    },
  },
}
Aktifkan resolusi PluralKit untuk memetakan pesan yang diproksikan ke identitas anggota sistem:
{
  channels: {
    discord: {
      pluralkit: {
        enabled: true,
        token: "pk_live_...", // opsional; diperlukan untuk sistem privat
      },
    },
  },
}
Catatan:
  • allowlist dapat menggunakan pk:<memberId>
  • nama tampilan anggota dicocokkan berdasarkan nama/slug hanya ketika channels.discord.dangerouslyAllowNameMatching: true
  • lookup menggunakan ID pesan asli dan dibatasi oleh jendela waktu
  • jika lookup gagal, pesan yang diproksikan diperlakukan sebagai pesan bot dan dibuang kecuali allowBots=true
Pembaruan presence diterapkan ketika Anda menetapkan field status atau activity, atau saat Anda mengaktifkan auto presence.Contoh hanya status:
{
  channels: {
    discord: {
      status: "idle",
    },
  },
}
Contoh activity (custom status adalah tipe activity default):
{
  channels: {
    discord: {
      activity: "Focus time",
      activityType: 4,
    },
  },
}
Contoh streaming:
{
  channels: {
    discord: {
      activity: "Live coding",
      activityType: 1,
      activityUrl: "https://twitch.tv/openclaw",
    },
  },
}
Peta tipe activity:
  • 0: Playing
  • 1: Streaming (memerlukan activityUrl)
  • 2: Listening
  • 3: Watching
  • 4: Custom (menggunakan teks activity sebagai status state; emoji opsional)
  • 5: Competing
Contoh auto presence (sinyal kesehatan runtime):
{
  channels: {
    discord: {
      autoPresence: {
        enabled: true,
        intervalMs: 30000,
        minUpdateIntervalMs: 15000,
        exhaustedText: "token exhausted",
      },
    },
  },
}
Auto presence memetakan ketersediaan runtime ke status Discord: sehat => online, terdegradasi atau tidak diketahui => idle, habis atau tidak tersedia => dnd. Override teks opsional:
  • autoPresence.healthyText
  • autoPresence.degradedText
  • autoPresence.exhaustedText (mendukung placeholder {reason})
Discord mendukung penanganan persetujuan berbasis tombol di DM dan secara opsional dapat memposting prompt persetujuan di saluran asal.Jalur config:
  • channels.discord.execApprovals.enabled
  • channels.discord.execApprovals.approvers (opsional; fallback ke commands.ownerAllowFrom jika memungkinkan)
  • channels.discord.execApprovals.target (dm | channel | both, default: dm)
  • agentFilter, sessionFilter, cleanupAfterResolve
Discord otomatis mengaktifkan persetujuan exec native ketika enabled tidak ditetapkan atau "auto" dan setidaknya satu approver dapat diresolusikan, baik dari execApprovals.approvers atau dari commands.ownerAllowFrom. Discord tidak menyimpulkan approver exec dari allowFrom saluran, dm.allowFrom legacy, atau defaultTo direct-message. Tetapkan enabled: false untuk menonaktifkan Discord sebagai klien persetujuan native secara eksplisit.Saat target adalah channel atau both, prompt persetujuan terlihat di saluran. Hanya approver yang dapat diresolusikan yang dapat menggunakan tombol; pengguna lain menerima penolakan ephemeral. Prompt persetujuan menyertakan teks perintah, jadi hanya aktifkan pengiriman saluran di saluran tepercaya. Jika ID saluran tidak dapat diturunkan dari session key, OpenClaw kembali ke pengiriman DM.Discord juga merender tombol persetujuan bersama yang digunakan oleh saluran chat lain. Adapter Discord native terutama menambahkan perutean DM approver dan fanout saluran. Saat tombol-tombol itu ada, tombol tersebut adalah UX persetujuan utama; OpenClaw hanya seharusnya menyertakan perintah /approve manual ketika hasil alat menyatakan persetujuan chat tidak tersedia atau persetujuan manual adalah satu-satunya jalur.Autentikasi gateway untuk handler ini menggunakan kontrak resolusi kredensial bersama yang sama seperti klien Gateway lainnya:
  • autentikasi lokal env-first (OPENCLAW_GATEWAY_TOKEN / OPENCLAW_GATEWAY_PASSWORD lalu gateway.auth.*)
  • dalam mode lokal, gateway.remote.* dapat digunakan sebagai fallback hanya ketika gateway.auth.* tidak ditetapkan; SecretRef lokal yang dikonfigurasi namun tidak dapat diresolusikan gagal secara tertutup
  • dukungan mode remote melalui gateway.remote.* bila berlaku
  • override URL aman terhadap override: override CLI tidak menggunakan ulang kredensial implisit, dan override env hanya menggunakan kredensial env
Perilaku resolusi persetujuan:
  • ID yang diawali plugin: diresolusikan melalui plugin.approval.resolve.
  • ID lainnya diresolusikan melalui exec.approval.resolve.
  • Discord tidak melakukan lompatan fallback exec-ke-plugin tambahan di sini; prefiks id menentukan metode gateway mana yang dipanggil.
Persetujuan exec kedaluwarsa setelah 30 menit secara default. Jika persetujuan gagal dengan ID persetujuan yang tidak dikenal, verifikasi resolusi approver, pengaktifan fitur, dan bahwa jenis id persetujuan yang dikirim cocok dengan permintaan yang tertunda.Dokumen terkait: Exec approvals

Alat dan gerbang aksi

Aksi pesan Discord mencakup pesan, administrasi saluran, moderasi, presence, dan aksi metadata. Contoh inti:
  • pesan: sendMessage, readMessages, editMessage, deleteMessage, threadReply
  • reaksi: react, reactions, emojiList
  • moderasi: timeout, kick, ban
  • presence: setPresence
Aksi event-create menerima parameter image opsional (URL atau path file lokal) untuk menetapkan gambar sampul event terjadwal. Gerbang aksi berada di bawah channels.discord.actions.*. Perilaku gerbang default:
Kelompok aksiDefault
reactions, messages, threads, pins, polls, search, memberInfo, roleInfo, channelInfo, channels, voiceStatus, events, stickers, emojiUploads, stickerUploads, permissionsenabled
rolesdisabled
moderationdisabled
presencedisabled

UI komponen v2

OpenClaw menggunakan komponen v2 Discord untuk persetujuan exec dan penanda lintas konteks. Aksi pesan Discord juga dapat menerima components untuk UI kustom (lanjutan; memerlukan pembuatan payload komponen melalui alat discord), sementara embeds legacy tetap tersedia tetapi tidak direkomendasikan.
  • channels.discord.ui.components.accentColor menetapkan warna aksen yang digunakan oleh container komponen Discord (hex).
  • Tetapkan per akun dengan channels.discord.accounts.<id>.ui.components.accentColor.
  • embeds diabaikan ketika komponen v2 ada.
Contoh:
{
  channels: {
    discord: {
      ui: {
        components: {
          accentColor: "#5865F2",
        },
      },
    },
  },
}

Saluran suara

OpenClaw dapat bergabung ke saluran suara Discord untuk percakapan realtime yang berkelanjutan. Ini terpisah dari lampiran pesan suara. Persyaratan:
  • Aktifkan perintah native (commands.native atau channels.discord.commands.native).
  • Konfigurasikan channels.discord.voice.
  • Bot memerlukan izin Connect + Speak di saluran suara target.
Gunakan perintah native khusus Discord /vc join|leave|status untuk mengontrol sesi. Perintah ini menggunakan agen default akun dan mengikuti aturan allowlist dan group policy yang sama seperti perintah Discord lainnya. Contoh auto-join:
{
  channels: {
    discord: {
      voice: {
        enabled: true,
        autoJoin: [
          {
            guildId: "123456789012345678",
            channelId: "234567890123456789",
          },
        ],
        daveEncryption: true,
        decryptionFailureTolerance: 24,
        tts: {
          provider: "openai",
          openai: { voice: "alloy" },
        },
      },
    },
  },
}
Catatan:
  • voice.tts menggantikan messages.tts hanya untuk pemutaran suara.
  • Giliran transkrip suara menurunkan status owner dari Discord allowFrom (atau dm.allowFrom); pembicara non-owner tidak dapat mengakses alat khusus owner (misalnya gateway dan cron).
  • Voice diaktifkan secara default; tetapkan channels.discord.voice.enabled=false untuk menonaktifkannya.
  • voice.daveEncryption dan voice.decryptionFailureTolerance diteruskan ke opsi join @discordjs/voice.
  • Default @discordjs/voice adalah daveEncryption=true dan decryptionFailureTolerance=24 jika tidak ditetapkan.
  • OpenClaw juga memantau kegagalan dekripsi saat menerima dan melakukan pemulihan otomatis dengan keluar/bergabung ulang ke saluran suara setelah kegagalan berulang dalam jangka waktu singkat.
  • Jika log penerimaan berulang kali menampilkan DecryptionFailed(UnencryptedWhenPassthroughDisabled), ini mungkin bug penerimaan upstream @discordjs/voice yang dilacak di discord.js #11419.

Pesan suara

Pesan suara Discord menampilkan pratinjau waveform dan memerlukan audio OGG/Opus beserta metadata. OpenClaw menghasilkan waveform secara otomatis, tetapi memerlukan ffmpeg dan ffprobe tersedia di host gateway untuk memeriksa dan mengonversi file audio. Persyaratan dan batasan:
  • Berikan path file lokal (URL ditolak).
  • Hilangkan konten teks (Discord tidak mengizinkan teks + pesan suara dalam payload yang sama).
  • Format audio apa pun diterima; OpenClaw mengonversi ke OGG/Opus bila diperlukan.
Contoh:
message(action="send", channel="discord", target="channel:123", path="/path/to/audio.mp3", asVoice=true)

Pemecahan masalah

  • aktifkan Message Content Intent
  • aktifkan Server Members Intent saat Anda bergantung pada resolusi pengguna/anggota
  • mulai ulang gateway setelah mengubah intent
  • verifikasi groupPolicy
  • verifikasi guild allowlist di bawah channels.discord.guilds
  • jika peta channels guild ada, hanya saluran yang tercantum yang diizinkan
  • verifikasi perilaku requireMention dan pola mention
Pemeriksaan yang berguna:
openclaw doctor
openclaw channels status --probe
openclaw logs --follow
Penyebab umum:
  • groupPolicy="allowlist" tanpa guild/channel allowlist yang cocok
  • requireMention dikonfigurasi di tempat yang salah (harus di bawah channels.discord.guilds atau entri saluran)
  • pengirim diblokir oleh allowlist users guild/channel
Log yang umum:
  • Listener DiscordMessageListener timed out after 30000ms for event MESSAGE_CREATE
  • Slow listener detected ...
  • discord inbound worker timed out after ...
Pengaturan anggaran listener:
  • akun tunggal: channels.discord.eventQueue.listenerTimeout
  • multi-akun: channels.discord.accounts.<accountId>.eventQueue.listenerTimeout
Pengaturan timeout run worker:
  • akun tunggal: channels.discord.inboundWorker.runTimeoutMs
  • multi-akun: channels.discord.accounts.<accountId>.inboundWorker.runTimeoutMs
  • default: 1800000 (30 menit); tetapkan 0 untuk menonaktifkan
Baseline yang direkomendasikan:
{
  channels: {
    discord: {
      accounts: {
        default: {
          eventQueue: {
            listenerTimeout: 120000,
          },
          inboundWorker: {
            runTimeoutMs: 1800000,
          },
        },
      },
    },
  },
}
Gunakan eventQueue.listenerTimeout untuk penyiapan listener yang lambat dan inboundWorker.runTimeoutMs hanya jika Anda menginginkan katup pengaman terpisah untuk giliran agen yang masuk ke antrean.
Pemeriksaan izin channels status --probe hanya berfungsi untuk ID saluran numerik.Jika Anda menggunakan kunci slug, pencocokan runtime masih dapat berfungsi, tetapi probe tidak dapat sepenuhnya memverifikasi izin.
  • 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
Secara default pesan yang ditulis bot diabaikan.Jika Anda menetapkan channels.discord.allowBots=true, gunakan aturan mention dan allowlist yang ketat untuk menghindari perilaku loop. Lebih pilih channels.discord.allowBots="mentions" agar hanya menerima pesan bot yang menyebut bot.
  • pastikan OpenClaw tetap terbaru (openclaw update) agar logika pemulihan penerimaan voice 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 detected
    • discord voice: repeated decrypt failures; attempting rejoin
  • jika kegagalan berlanjut setelah bergabung ulang otomatis, kumpulkan log dan bandingkan dengan discord.js #11419

Penunjuk referensi konfigurasi

Referensi utama: Field Discord dengan sinyal tinggi:
  • startup/auth: enabled, token, accounts.*, allowBots
  • kebijakan: groupPolicy, dm.*, guilds.*, guilds.*.channels.*
  • perintah: commands.native, commands.useAccessGroups, configWrites, slashCommand.*
  • antrean event: eventQueue.listenerTimeout (anggaran listener), eventQueue.maxQueueSize, eventQueue.maxConcurrency
  • inbound worker: inboundWorker.runTimeoutMs
  • balasan/riwayat: replyToMode, historyLimit, dmHistoryLimit, dms.*.historyLimit
  • pengiriman: textChunkLimit, chunkMode, maxLinesPerMessage
  • streaming: streaming (alias legacy: streamMode), draftChunk, blockStreaming, blockStreamingCoalesce
  • media/retry: mediaMaxMb, retry
    • mediaMaxMb membatasi unggahan Discord keluar (default: 100MB)
  • aksi: actions.*
  • presence: activity, status, activityType, activityUrl
  • UI: ui.components.accentColor
  • fitur: threadBindings, bindings[] tingkat atas (type: "acp"), pluralkit, execApprovals, intents, agentComponents, heartbeat, responsePrefix

Keamanan dan operasi

  • Perlakukan token bot sebagai rahasia (DISCORD_BOT_TOKEN lebih disukai di lingkungan yang diawasi).
  • Berikan izin Discord seminimal mungkin.
  • Jika deploy/state perintah basi, mulai ulang gateway dan periksa ulang dengan openclaw channels status --probe.

Terkait