Klaar voor DM’s en guild-kanalen via de officiële Discord Gateway.Documentation Index
Fetch the complete documentation index at: https://docs2.openclaw.ai/llms.txt
Use this file to discover all available pages before exploring further.
Pairing
Slash commands
Channel troubleshooting
Snelle installatie
Je moet een nieuwe applicatie met een bot maken, de bot aan je server toevoegen en deze aan OpenClaw koppelen. We raden aan je bot aan je eigen privéserver toe te voegen. Als je er nog geen hebt, maak er dan eerst een (kies Create My Own > For me and my friends).Create a Discord application and bot
Enable privileged intents
- Message Content Intent (vereist)
- Server Members Intent (aanbevolen; vereist voor rol-allowlists en naam-naar-ID-koppeling)
- Presence Intent (optioneel; alleen nodig voor aanwezigheidsupdates)
Copy your bot token
Generate an invite URL and add the bot to your server
botapplications.commands
- Kanalen bekijken Text Permissions
- Berichten verzenden
- Berichtgeschiedenis lezen
- Links insluiten
- Bestanden bijvoegen
- Reacties toevoegen (optioneel)
Enable Developer Mode and collect your IDs
- Klik op User Settings (tandwielpictogram naast je avatar) → Advanced → schakel Developer Mode in
- Rechtsklik op je serverpictogram in de zijbalk → Copy Server ID
- Rechtsklik op je eigen avatar → Copy User ID
Allow DMs from server members
Set your bot token securely (do not send it in chat)
openclaw gateway run te stoppen en opnieuw te starten.
Voor beheerde service-installaties voer je openclaw gateway install uit vanuit een shell waarin DISCORD_BOT_TOKEN aanwezig is, of sla je de variabele op in ~/.openclaw/.env, zodat de service de env SecretRef na herstart kan oplossen.
Als je host wordt geblokkeerd of rate-limited door Discord’s applicatie-opzoeking bij het opstarten, stel dan de Discord-applicatie-/client-ID in vanuit de Developer Portal zodat het opstarten die REST-call kan overslaan. Gebruik channels.discord.applicationId voor het standaardaccount, of channels.discord.accounts.<accountId>.applicationId wanneer je meerdere Discord-bots gebruikt.Configure OpenClaw and pair
- Ask your agent
- CLI / config
“Ik heb mijn Discord-bottoken al ingesteld in config. Rond de Discord-installatie af met User ID<user_id>en Server ID<server_id>.”
Approve first DM pairing
- Ask your agent
- CLI
“Keur deze Discord-koppelingscode goed: <CODE>”
DISCORD_BOT_TOKEN wordt alleen gebruikt voor het standaardaccount.
Als twee ingeschakelde Discord-accounts naar hetzelfde bottoken oplossen, start OpenClaw slechts één Gateway-monitor voor dat token. Een uit config afkomstig token heeft voorrang op de standaard env-fallback; anders wint het eerste ingeschakelde account en wordt het dubbele account als uitgeschakeld gerapporteerd.
Voor geavanceerde uitgaande calls (berichttool/kanaalacties) wordt een expliciet per-call token voor die call gebruikt. Dit geldt voor verzend- en lees-/probe-achtige acties (bijvoorbeeld read/search/fetch/thread/pins/permissions). Accountbeleid en retry-instellingen komen nog steeds uit het geselecteerde account in de actieve runtimesnapshot.Aanbevolen: stel een guild-werkruimte in
Zodra DM’s werken, kun je je Discord-server instellen als een volledige werkruimte waarin elk kanaal zijn eigen agentsessie met eigen context krijgt. Dit wordt aanbevolen voor privéservers waar alleen jij en je bot aanwezig zijn.Add your server to the guild allowlist
- Ask your agent
- Config
“Voeg mijn Discord Server ID <server_id> toe aan de guild-allowlist”
Allow responses without @mention
message worden verzonden, zodat de agent standaard kan meekijken en alleen post wanneer hij besluit dat een kanaalantwoord nuttig is.Dit betekent dat het geselecteerde model betrouwbaar tools moet aanroepen. Als Discord typen toont en de logs tokengebruik laten zien maar er geen bericht wordt geplaatst, controleer dan de sessielog op assistenttekst met didSendViaMessagingTool: false. Dat betekent dat het model een privé definitief antwoord produceerde in plaats van message(action=send) aan te roepen. Schakel over naar een sterker tool-calling model, of gebruik de configuratie hieronder om legacy automatische definitieve antwoorden te herstellen.- Ask your agent
- Config
“Sta mijn agent toe op deze server te reageren zonder @mentioned te hoeven worden”
Plan for memory in guild channels
- Ask your agent
- Manual
“Wanneer ik vragen stel in Discord-kanalen, gebruik memory_search of memory_get als je langetermijncontext uit MEMORY.md nodig hebt.”
#coding, #home, #research instellen, of wat ook bij je workflow past.
Runtimemodel
- Gateway beheert de Discord-verbinding.
- Antwoordroutering is deterministisch: inkomende Discord-antwoorden gaan terug naar Discord.
- Discord-guild-/kanaalmetadata wordt toegevoegd aan de modelprompt als niet-vertrouwde context, niet als een voor gebruikers zichtbaar antwoordvoorvoegsel. Als een model die envelop terug kopieert, verwijdert OpenClaw de gekopieerde metadata uit uitgaande antwoorden en uit toekomstige replaycontext.
- Standaard (
session.dmScope=main) delen directe chats de hoofdsessie van de agent (agent:main:main). - Guild-kanalen zijn geisoleerde sessiesleutels (
agent:<agentId>:discord:channel:<channelId>). - Groeps-DM’s worden standaard genegeerd (
channels.discord.dm.groupEnabled=false). - Native slash-commando’s draaien in geisoleerde commandosessies (
agent:<agentId>:discord:slash:<userId>), terwijl ze nog steedsCommandTargetSessionKeymeenemen naar de gerouteerde gesprekssessie. - Alleen-tekst cron-/Heartbeat-aankondigingslevering aan Discord gebruikt eenmaal het uiteindelijke voor de assistent zichtbare antwoord. Media en gestructureerde componentpayloads blijven meerdere berichten wanneer de agent meerdere leverbare payloads uitzendt.
Forumkanalen
Discord-forum- en mediakanalen accepteren alleen threadberichten. OpenClaw ondersteunt twee manieren om ze aan te maken:- Stuur een bericht naar de forumbovenliggende (
channel:<forumId>) om automatisch een thread aan te maken. De threadtitel gebruikt de eerste niet-lege regel van je bericht. - Gebruik
openclaw message thread createom direct een thread aan te maken. Geef geen--message-iddoor voor forumkanalen.
channel:<threadId>).
Interactieve componenten
OpenClaw ondersteunt Discord components v2-containers voor agentberichten. Gebruik de berichttool met eencomponents-payload. Interactieresultaten worden als normale inkomende berichten terug naar de agent gerouteerd en volgen de bestaande Discord-instellingen voor replyToMode.
Ondersteunde blokken:
text,section,separator,actions,media-gallery,file- Actierijen staan maximaal 5 knoppen of een enkel selectiemenu toe
- Selectietypen:
string,user,role,mentionable,channel
components.reusable=true in om knoppen, selecties en formulieren meerdere keren te kunnen gebruiken totdat ze verlopen.
Stel allowedUsers op die knop in om te beperken wie op een knop kan klikken (Discord-gebruikers-ID’s, tags of *). Wanneer dit is geconfigureerd, ontvangen niet-overeenkomende gebruikers een ephemeral weigering.
De slash-commando’s /model en /models openen een interactieve modelkiezer met dropdowns voor provider, model en compatibele runtime plus een verzendstap. /models add is verouderd en retourneert nu een verouderingsbericht in plaats van modellen vanuit chat te registreren. Het antwoord van de kiezer is ephemeral en alleen de aanroepende gebruiker kan het gebruiken. Discord-selectiemenu’s zijn beperkt tot 25 opties, dus voeg provider/*-vermeldingen toe aan agents.defaults.models wanneer je wilt dat de kiezer dynamisch ontdekte modellen alleen toont voor geselecteerde providers zoals openai-codex of vllm.
Bestandsbijlagen:
file-blokken moeten verwijzen naar een bijlagereferentie (attachment://<filename>)- Lever de bijlage via
media/path/filePath(enkel bestand); gebruikmedia-galleryvoor meerdere bestanden - Gebruik
filenameom de uploadnaam te overschrijven wanneer die moet overeenkomen met de bijlagereferentie
- Voeg
components.modaltoe met maximaal 5 velden - Veldtypen:
text,checkbox,radio,select,role-select,user-select - OpenClaw voegt automatisch een triggerknop toe
Toegangscontrole en routering
- DM policy
- Access groups
- Guild policy
- Mentions and group DMs
channels.discord.dmPolicy beheert DM-toegang. channels.discord.allowFrom is de canonieke DM-allowlist.pairing(standaard)allowlistopen(vereist datchannels.discord.allowFrom"*"bevat)disabled
pairing-modus).Prioriteit bij meerdere accounts:channels.discord.accounts.default.allowFromgeldt alleen voor hetdefault-account.- Voor een account heeft
allowFromvoorrang op legacydm.allowFrom. - Benoemde accounts erven
channels.discord.allowFromwanneer hun eigenallowFromen legacydm.allowFromniet zijn ingesteld. - Benoemde accounts erven
channels.discord.accounts.default.allowFromniet.
channels.discord.dm.policy en channels.discord.dm.allowFrom worden nog steeds gelezen voor compatibiliteit. openclaw doctor --fix migreert ze naar dmPolicy en allowFrom wanneer dat kan zonder de toegang te wijzigen.DM-doelnotatie voor levering:user:<id><@id>-vermelding
allowFrom van het account worden voor compatibiliteit behandeld als gebruikers-DM-doelen.Rolgebaseerde agentroutering
Gebruikbindings[].match.roles om Discord-guildleden op basis van rol-ID naar verschillende agents te routeren. Rolgebaseerde bindings accepteren alleen rol-ID’s en worden geevalueerd na peer- of parent-peer-bindings en voor guild-only-bindings. Als een binding ook andere matchvelden instelt (bijvoorbeeld peer + guildId + roles), moeten alle geconfigureerde velden overeenkomen.
Native commando’s en commando-auth
commands.nativeis standaard"auto"en is ingeschakeld voor Discord.- Override per kanaal:
channels.discord.commands.native. commands.native=falseslaat Discord-slashcommandregistratie en opschoning tijdens het opstarten over. Eerder geregistreerde commando’s kunnen zichtbaar blijven in Discord totdat je ze uit de Discord-app verwijdert.- Native commando-auth gebruikt dezelfde Discord-allowlists/beleidsregels als normale berichtverwerking.
- Commando’s kunnen nog steeds zichtbaar zijn in de Discord-UI voor gebruikers die niet zijn geautoriseerd; uitvoering dwingt nog steeds OpenClaw-auth af en retourneert “not authorized”.
ephemeral: true
Functiedetails
Antwoordtags en native antwoorden
Antwoordtags en native antwoorden
Live streamvoorbeeld
Live streamvoorbeeld
channels.discord.streaming accepteert off | partial | block | progress (standaard). progress houdt één bewerkbaar statusconcept bij en werkt dit bij met toolvoortgang tot de uiteindelijke aflevering; het gedeelde startlabel is een doorlopende regel, zodat die net als de rest wegscrollt zodra er genoeg werk verschijnt. streamMode is een verouderde runtime-alias. Voer openclaw doctor --fix uit om opgeslagen configuratie te herschrijven naar de canonieke sleutel.Stel channels.discord.streaming.mode in op off om Discord-voorbeeldbewerkingen uit te schakelen. Als Discord-blokstreaming expliciet is ingeschakeld, slaat OpenClaw de voorbeeldstream over om dubbel streamen te voorkomen.partialbewerkt één voorbeeldbericht terwijl tokens binnenkomen.blockverzendt conceptgrote stukken (gebruikdraftChunkom grootte en breekpunten af te stemmen, begrensd tottextChunkLimit).- Media, fouten en finales met expliciete antwoorden annuleren openstaande voorbeeldbewerkingen.
streaming.preview.toolProgress(standaardtrue) bepaalt of tool-/voortgangsupdates het voorbeeldbericht hergebruiken.- Tool-/voortgangsrijen worden weergegeven als compacte emoji + titel + detail wanneer beschikbaar, bijvoorbeeld
🛠️ Bash: run testsof🔎 Web Search: for "query". streaming.preview.commandText/streaming.progress.commandTextbeheert commando-/exec-details in compacte voortgangsregels:raw(standaard) ofstatus(alleen toollabel).
block-streaming expliciet is ingeschakeld, slaat OpenClaw de voorbeeldstream over om dubbel streamen te voorkomen.Geschiedenis, context en threadgedrag
Geschiedenis, context en threadgedrag
channels.discord.historyLimitstandaard20- fallback:
messages.groupChat.historyLimit 0schakelt uit
channels.discord.dmHistoryLimitchannels.discord.dms["<user_id>"].historyLimit
- Discord-threads routeren als kanaalsessies en erven de configuratie van het bovenliggende kanaal, tenzij overschreven.
- Threadsessies erven de sessieniveau-
/model-selectie van het bovenliggende kanaal als alleen-model-fallback; threadlokale/model-selecties hebben nog steeds voorrang en de transcriptgeschiedenis van de parent wordt niet gekopieerd tenzij transcriptovererving is ingeschakeld. channels.discord.thread.inheritParent(standaardfalse) laat nieuwe auto-threads zaaien vanuit het parenttranscript. Overrides per account staan onderchannels.discord.accounts.<id>.thread.inheritParent.- Reacties van berichttools kunnen
user:<id>-DM-targets oplossen. guilds.<guild>.channels.<channel>.requireMention: falsewordt behouden tijdens de fallback voor activering in de antwoordfase.
Threadgebonden sessies voor subagents
Threadgebonden sessies voor subagents
/focus <target>bind huidige/nieuwe thread aan een subagent-/sessietarget/unfocusverwijder huidige threadbinding/agentstoon actieve runs en bindingsstatus/session idle <duration|off>inspecteer/update inactiviteits-auto-unfocus voor gefocuste bindingen/session max-age <duration|off>inspecteer/update harde maximale leeftijd voor gefocuste bindingen
session.threadBindings.*stelt globale standaardwaarden in.channels.discord.threadBindings.*overschrijft Discord-gedrag.spawnSessionsbeheert automatisch threads maken/binden voorsessions_spawn({ thread: true })en ACP-threadspawns. Standaard:true.defaultSpawnContextbeheert native subagentcontext voor threadgebonden spawns. Standaard:"fork".- Verouderde sleutels
spawnSubagentSessions/spawnAcpSessionsworden gemigreerd dooropenclaw doctor --fix. - Als threadbindingen zijn uitgeschakeld voor een account, zijn
/focusen gerelateerde threadbindingsbewerkingen niet beschikbaar.
Persistente ACP-kanaalbindingen
Persistente ACP-kanaalbindingen
bindings[]mettype: "acp"enmatch.channel: "discord"
/acp spawn codex --bind herebindt het huidige kanaal of de huidige thread op zijn plaats en houdt toekomstige berichten op dezelfde ACP-sessie. Threadberichten erven de binding van het bovenliggende kanaal.- In een gebonden kanaal of gebonden thread resetten
/newen/resetdezelfde ACP-sessie op zijn plaats. Tijdelijke threadbindingen kunnen targetresolutie overschrijven zolang ze actief zijn. spawnSessionsbegrenst het maken/binden van childthreads via--thread auto|here.
Reactiemeldingen
Reactiemeldingen
offown(standaard)allallowlist(gebruiktguilds.<id>.users)
Ack-reacties
Ack-reacties
ackReaction verzendt een bevestigingsemoji terwijl OpenClaw een inkomend bericht verwerkt.Resolutievolgorde:channels.discord.accounts.<accountId>.ackReactionchannels.discord.ackReactionmessages.ackReaction- fallback naar emoji voor agentidentiteit (
agents.list[].identity.emoji, anders ”👀”)
- Discord accepteert Unicode-emoji of namen van aangepaste emoji.
- Gebruik
""om de reactie voor een kanaal of account uit te schakelen.
Configuratieschrijfacties
Configuratieschrijfacties
/config set|unset-flows (wanneer commandofuncties zijn ingeschakeld).Uitschakelen:Gateway-proxy
Gateway-proxy
channels.discord.proxy.PluralKit-ondersteuning
PluralKit-ondersteuning
- allowlists kunnen
pk:<memberId>gebruiken - weergavenamen van leden worden alleen op naam/slug gematcht wanneer
channels.discord.dangerouslyAllowNameMatching: true - lookups gebruiken de oorspronkelijke bericht-ID en zijn beperkt door een tijdvenster
- als lookup mislukt, worden proxied berichten behandeld als botberichten en genegeerd tenzij
allowBots=true
Uitgaande vermeldingsaliassen
Uitgaande vermeldingsaliassen
mentionAliases wanneer agents deterministische uitgaande vermeldingen nodig hebben voor bekende Discord-gebruikers. Sleutels zijn handles zonder de voorafgaande @; waarden zijn Discord-gebruikers-ID’s. Onbekende handles, @everyone, @here en vermeldingen in Markdown-codespans blijven ongewijzigd.Aanwezigheidsconfiguratie
Aanwezigheidsconfiguratie
- 0: Spelen
- 1: Streamen (vereist
activityUrl) - 2: Luisteren
- 3: Kijken
- 4: Aangepast (gebruikt de activiteitstekst als statusstatus; emoji is optioneel)
- 5: Deelnemen
autoPresence.healthyTextautoPresence.degradedTextautoPresence.exhaustedText(ondersteunt{reason}-placeholder)
Goedkeuringen in Discord
Goedkeuringen in Discord
channels.discord.execApprovals.enabledchannels.discord.execApprovals.approvers(optioneel; valt waar mogelijk terug opcommands.ownerAllowFrom)channels.discord.execApprovals.target(dm|channel|both, standaard:dm)agentFilter,sessionFilter,cleanupAfterResolve
enabled niet is ingesteld of "auto" is en ten minste één goedkeurder kan worden opgelost, hetzij vanuit execApprovals.approvers, hetzij vanuit commands.ownerAllowFrom. Discord leidt exec-goedkeurders niet af uit kanaal-allowFrom, legacy dm.allowFrom of direct-message defaultTo. Stel enabled: false in om Discord expliciet uit te schakelen als native goedkeuringsclient.Voor gevoelige owner-only groepsopdrachten zoals /diagnostics en /export-trajectory stuurt OpenClaw goedkeuringsprompts en eindresultaten privé. Het probeert eerst Discord-DM wanneer de aanroepende eigenaar een Discord-eigenaarroute heeft; als die niet beschikbaar is, valt het terug op de eerste beschikbare eigenaarroute uit commands.ownerAllowFrom, zoals Telegram.Wanneer target channel of both is, is de goedkeuringsprompt zichtbaar in het kanaal. Alleen opgeloste goedkeurders kunnen de knoppen gebruiken; andere gebruikers ontvangen een ephemeral weigering. Goedkeuringsprompts bevatten de opdrachttekst, dus schakel kanaalbezorging alleen in vertrouwde kanalen in. Als de kanaal-ID niet uit de sessiesleutel kan worden afgeleid, valt OpenClaw terug op DM-bezorging.Discord rendert ook de gedeelde goedkeuringsknoppen die door andere chatkanalen worden gebruikt. De native Discord-adapter voegt vooral DM-routering voor goedkeurders en kanaalfanout toe.
Wanneer die knoppen aanwezig zijn, vormen zij de primaire goedkeurings-UX; OpenClaw
moet alleen een handmatige /approve-opdracht opnemen wanneer het toolresultaat zegt
dat chatgoedkeuringen niet beschikbaar zijn of handmatige goedkeuring de enige route is.
Als de native goedkeuringsruntime van Discord niet actief is, houdt OpenClaw de
lokale deterministische /approve <id> <decision>-prompt zichtbaar. Als de
runtime actief is maar een native kaart niet aan een doel kan worden bezorgd,
stuurt OpenClaw een fallbackmelding in dezelfde chat met de exacte /approve-
opdracht uit de wachtende goedkeuring.Gateway-authenticatie en goedkeuringsresolutie volgen het gedeelde Gateway-clientcontract (plugin:-ID’s worden opgelost via plugin.approval.resolve; andere ID’s via exec.approval.resolve). Goedkeuringen verlopen standaard na 30 minuten.Zie Exec-goedkeuringen.Tools en actiepoorten
Discord-berichtacties omvatten berichten, kanaalbeheer, moderatie, aanwezigheid en metadata-acties. Kernvoorbeelden:- berichten:
sendMessage,readMessages,editMessage,deleteMessage,threadReply - reacties:
react,reactions,emojiList - moderatie:
timeout,kick,ban - aanwezigheid:
setPresence
event-create accepteert een optionele parameter image (URL of lokaal bestandspad) om de omslagafbeelding van de geplande gebeurtenis in te stellen.
Actiepoorten bevinden zich onder channels.discord.actions.*.
Standaardgedrag van poorten:
| Actiegroep | Standaard |
|---|---|
| reacties, berichten, threads, pins, polls, zoeken, memberInfo, roleInfo, channelInfo, kanalen, voiceStatus, events, stickers, emojiUploads, stickerUploads, permissions | ingeschakeld |
| roles | uitgeschakeld |
| moderatie | uitgeschakeld |
| aanwezigheid | uitgeschakeld |
Components v2-UI
OpenClaw gebruikt Discord components v2 voor exec-goedkeuringen en cross-context-markeringen. Discord-berichtacties kunnen ookcomponents accepteren voor aangepaste UI (geavanceerd; vereist het construeren van een componentpayload via de discord-tool), terwijl legacy embeds beschikbaar blijven maar niet worden aanbevolen.
channels.discord.ui.components.accentColorstelt de accentkleur in die wordt gebruikt door Discord-componentcontainers (hex).- Stel per account in met
channels.discord.accounts.<id>.ui.components.accentColor. embedsworden genegeerd wanneer components v2 aanwezig zijn.
Spraak
Discord heeft twee afzonderlijke spraakoppervlakken: realtime spraakkanalen (doorlopende gesprekken) en spraakberichtbijlagen (de golfvormpreview-indeling). De gateway ondersteunt beide.Spraakkanalen
Installatiechecklist:- Schakel Message Content Intent in de Discord Developer Portal in.
- Schakel Server Members Intent in wanneer allowlists voor rollen/gebruikers worden gebruikt.
- Nodig de bot uit met de scopes
botenapplications.commands. - Verleen Connect, Speak, Send Messages en Read Message History in het doelspraakkanaal.
- Schakel native opdrachten in (
commands.nativeofchannels.discord.commands.native). - Configureer
channels.discord.voice.
/vc join|leave|status om sessies te beheren. De opdracht gebruikt de standaardagent van het account en volgt dezelfde allowlist- en groepsbeleidsregels als andere Discord-opdrachten.
voice.ttsoverschrijftmessages.ttsalleen voorstt-tts-stemweergave. Realtime-modi gebruikenvoice.realtime.voice.voice.modebepaalt het gesprekspad. De standaardwaarde isagent-proxy: een realtime voice-front-end verwerkt beurt-timing, onderbreking en weergave, delegeert inhoudelijk werk aan de gerouteerde OpenClaw-agent viaopenclaw_agent_consult, en behandelt het resultaat als een getypte Discord-prompt van die spreker.stt-ttsbehoudt de oudere batch-STT plus TTS-stroom. Metbidikan het realtime-model rechtstreeks converseren terwijlopenclaw_agent_consultbeschikbaar blijft voor het OpenClaw-brein.voice.agentSessionbepaalt welk OpenClaw-gesprek stembeurten ontvangt. Laat dit ongezet voor de eigen sessie van het spraakkanaal, of stel{ mode: "target", target: "channel:<text-channel-id>" }in om het spraakkanaal te laten fungeren als microfoon-/luidsprekeruitbreiding van een bestaande Discord-tekstkanaalsessie zoals#maintainers.voice.modeloverschrijft het OpenClaw-agentbrein voor Discord-stemreacties en realtime-consults. Laat dit ongezet om het gerouteerde agentmodel te erven. Het staat los vanvoice.realtime.model.agent-proxyrouteert spraak viadiscord-voice, waardoor de normale eigenaar-/toolautorisatie voor de spreker en doelsessie behouden blijft, maar de agenttoolttswordt verborgen omdat Discord voice eigenaar is van de weergave. Standaard geeftagent-proxyde consult volledige eigenaar-equivalente tooltoegang voor eigenaars-sprekers (voice.realtime.toolPolicy: "owner") en geeft het sterk de voorkeur aan het raadplegen van de OpenClaw-agent vóór inhoudelijke antwoorden (voice.realtime.consultPolicy: "always"). In die standaardmodusalwaysspreekt de realtime-laag niet automatisch opvulling uit vóór het consultantwoord; deze legt spraak vast en transcribeert die, en spreekt daarna het gerouteerde OpenClaw-antwoord uit. Als meerdere afgedwongen consultantwoorden klaar zijn terwijl Discord nog steeds het eerste antwoord afspeelt, worden latere antwoorden met exacte spraak in een wachtrij gezet totdat de weergave inactief is, in plaats van spraak midden in een zin te vervangen.- In de modus
stt-ttsgebruikt STTtools.media.audio;voice.modelheeft geen invloed op transcriptie. - In realtime-modi configureren
voice.realtime.provider,voice.realtime.modelenvoice.realtime.voicede realtime-audiosessie. Gebruik voor OpenAI Realtime 2 plus het Codex-breinvoice.realtime.model: "gpt-realtime-2"envoice.model: "openai-codex/gpt-5.5". - De realtime-provider van OpenAI accepteert huidige Realtime 2-gebeurtenisnamen en legacy Codex-compatibele aliassen voor uitvoeraudio- en transcriptgebeurtenissen, zodat compatibele providersnapshots kunnen verschuiven zonder assistentaudio te laten wegvallen.
voice.realtime.bargeInbepaalt of spreker-startgebeurtenissen van Discord actieve realtime-weergave onderbreken. Als dit ongezet is, volgt het de instelling voor input-audio-onderbreking van de realtime-provider.voice.realtime.minBargeInAudioEndMsbepaalt de minimale duur van assistentweergave voordat een OpenAI realtime-barge-in audio afkapt. Standaard:250. Stel0in voor onmiddellijke onderbreking in ruimtes met weinig echo, of verhoog dit voor luidsprekeropstellingen met veel echo.- Stel voor een OpenAI-stem bij Discord-weergave
voice.tts.provider: "openai"in en kies een Text-to-speech-stem ondervoice.tts.openai.voiceofvoice.tts.providers.openai.voice.cedaris een goede mannelijk klinkende keuze op het huidige OpenAI TTS-model. - Per-kanaal Discord-overschrijvingen voor
systemPromptzijn van toepassing op stemtranscriptbeurten voor dat spraakkanaal. - Stemtranscriptbeurten leiden de eigenaarsstatus af van Discord
allowFrom(ofdm.allowFrom); niet-eigenaarsprekers hebben geen toegang tot tools die alleen voor eigenaars zijn (bijvoorbeeldgatewayencron). - Discord voice is opt-in voor tekst-only configuraties; stel
channels.discord.voice.enabled=truein (of behoud een bestaandchannels.discord.voice-blok) om/vc-opdrachten, de voice-runtime en deGuildVoiceStatesGateway-intent in te schakelen. channels.discord.intents.voiceStateskan het abonnement op de voice-state-intent expliciet overschrijven. Laat dit ongezet zodat de intent de effectieve voice-inschakeling volgt.- Als
voice.autoJoinmeerdere items voor dezelfde guild heeft, sluit OpenClaw aan bij het laatst geconfigureerde kanaal voor die guild. voice.allowedChannelsis een optionele allowlist voor verblijf. Laat dit ongezet om/vc jointoe te staan in elk geautoriseerd Discord-spraakkanaal. Wanneer dit is ingesteld, zijn/vc join, automatisch aansluiten bij opstarten en verplaatsingen van de bot-voice-state beperkt tot de vermelde{ guildId, channelId }-items. Stel dit in op een lege array om alle Discord voice-joins te weigeren. Als Discord de bot buiten de allowlist verplaatst, verlaat OpenClaw dat kanaal en sluit het opnieuw aan bij het geconfigureerde auto-join-doel wanneer er een beschikbaar is.voice.daveEncryptionenvoice.decryptionFailureToleranceworden doorgegeven aan de join-opties van@discordjs/voice.- De standaardwaarden van
@discordjs/voicezijndaveEncryption=trueendecryptionFailureTolerance=24als ze ongezet zijn. - OpenClaw gebruikt standaard de pure-JS
opusscript-decoder voor het ontvangen van Discord voice. Het optionele native pakket@discordjs/opuswordt genegeerd door het pnpm-installatiebeleid van de repo, zodat normale installaties, Docker-lanes en niet-gerelateerde tests geen native addon compileren. Toegewijde hosts voor voice-performance kunnen opt-in gebruiken metOPENCLAW_DISCORD_OPUS_DECODER=nativenadat de native addon is geïnstalleerd. voice.connectTimeoutMsbepaalt de initiële@discordjs/voiceReady-wachttijd voor/vc joinen auto-join-pogingen. Standaard:30000.voice.reconnectGraceMsbepaalt hoelang OpenClaw wacht totdat een verbroken voicesessie opnieuw begint te verbinden voordat deze wordt vernietigd. Standaard:15000.- In de modus
stt-ttsstopt stemweergave niet alleen omdat een andere gebruiker begint te spreken. Om feedbackloops te voorkomen, negeert OpenClaw nieuwe stemopname terwijl TTS wordt afgespeeld; spreek nadat de weergave is voltooid voor de volgende beurt. Realtime-modi sturen spreker-startsignalen door als barge-in-signalen naar de realtime-provider. - In realtime-modi kan echo van luidsprekers in een open microfoon lijken op barge-in en weergave onderbreken. Stel voor Discord-ruimtes met veel echo
voice.realtime.providers.openai.interruptResponseOnInputAudio: falsein om te voorkomen dat OpenAI automatisch onderbreekt bij input-audio. Voegvoice.realtime.bargeIn: truetoe als je nog steeds wilt dat spreker-startgebeurtenissen van Discord actieve weergave onderbreken. De OpenAI realtime-bridge negeert afkappingen van weergave die korter zijn danvoice.realtime.minBargeInAudioEndMsals waarschijnlijke echo/ruis en logt ze als overgeslagen in plaats van Discord-weergave te wissen. voice.captureSilenceGraceMsbepaalt hoelang OpenClaw wacht nadat Discord meldt dat een spreker is gestopt voordat dat audiosegment voor STT wordt afgerond. Standaard:2500; verhoog dit als Discord normale pauzes opsplitst in haperige gedeeltelijke transcripties.- Wanneer ElevenLabs de geselecteerde TTS-provider is, gebruikt Discord-stemweergave streaming-TTS en start deze vanuit de providerresponsstream. Providers zonder streamingondersteuning vallen terug op het pad met een gesynthetiseerd tijdelijk bestand.
- OpenClaw bewaakt ook decryptiefouten bij ontvangst en herstelt automatisch door het spraakkanaal te verlaten en opnieuw te joinen na herhaalde fouten binnen een kort tijdsvenster.
- Als ontvangstlogs na een update herhaaldelijk
DecryptionFailed(UnencryptedWhenPassthroughDisabled)tonen, verzamel dan een dependencyrapport en logs. De gebundelde@discordjs/voice-lijn bevat de upstream padding-fix uit discord.js PR #11449, waarmee discord.js issue #11419 werd gesloten. - Ontvangstgebeurtenissen
The operation was abortedworden verwacht wanneer OpenClaw een vastgelegd sprekersegment afrondt; het zijn uitgebreide diagnostische meldingen, geen waarschuwingen. - Uitgebreide Discord voice-logs bevatten een begrensde eenregelige STT-transcriptpreview voor elk geaccepteerd sprekersegment, zodat debugging zowel de gebruikerskant als de agentantwoordkant toont zonder onbeperkte transcripttekst te dumpen.
- In de modus
agent-proxyslaat afgedwongen consultfallback waarschijnlijk onvolledige transcriptfragmenten over, zoals tekst die eindigt op...of een afsluitende connector zoalsand, plus duidelijk niet-actiegerichte afsluitingen zoals “be right back” of “bye”. Logs tonenforced agent consult skipped reason=...wanneer dit een verouderd antwoord in de wachtrij voorkomt.
node-gyp source-build-toolchain nodig hebben.
Start na installatie van de native addon de Gateway met:
discord voice: opus decoder: @discordjs/opus moeten tonen. Zonder de env-opt-in, of als de native addon ontbreekt of niet op de host kan laden, logt OpenClaw discord voice: opus decoder: opusscript en blijft het voice ontvangen via de pure-JS fallback.
STT plus TTS-pijplijn:
- Discord PCM-opname wordt geconverteerd naar een tijdelijk WAV-bestand.
tools.media.audioverwerkt STT, bijvoorbeeldopenai/gpt-4o-mini-transcribe.- Het transcript wordt via Discord-ingress en routering verzonden terwijl de response-LLM draait met een voice-outputbeleid dat de agenttool
ttsverbergt en om teruggegeven tekst vraagt, omdat Discord voice eigenaar is van de uiteindelijke TTS-weergave. voice.model, wanneer ingesteld, overschrijft alleen de response-LLM voor deze spraakkanaalbeurt.voice.ttswordt overmessages.ttssamengevoegd; providers met streamingmogelijkheden voeden de speler rechtstreeks, anders wordt het resulterende audiobestand afgespeeld in het gejoinde kanaal.
voice.agentSession-blok krijgt elk spraakkanaal zijn eigen gerouteerde OpenClaw-sessie. Bijvoorbeeld, /vc join channel:234567890123456789 praat met de sessie voor dat Discord-spraakkanaal. Het realtime-model is alleen de voice-front-end; inhoudelijke verzoeken worden doorgegeven aan de geconfigureerde OpenClaw-agent. Als het realtime-model een definitief transcript produceert zonder de consulttool aan te roepen, dwingt OpenClaw het consult af als fallback, zodat de standaard nog steeds werkt alsof je met de agent praat.
Legacy STT plus TTS-voorbeeld:
agent-proxy joint de bot het geconfigureerde spraakkanaal, maar OpenClaw-agentbeurten gebruiken de normale gerouteerde sessie en agent van het doelkanaal. De realtime-voicesessie spreekt het teruggegeven resultaat terug in het spraakkanaal. De supervisor-agent kan nog steeds normale berichttools gebruiken volgens zijn toolbeleid, inclusief het verzenden van een apart Discord-bericht als dat de juiste actie is.
Nuttige doelvormen:
target: "channel:123456789012345678"routeert via een Discord-tekstkanaalsessie.target: "123456789012345678"wordt behandeld als kanaaldoel.target: "dm:123456789012345678"oftarget: "user:123456789012345678"routeert via die direct-message-sessie.
bargeIn: true ervoor zorgt dat Discord-gebeurtenissen voor het starten van een spreker en al actieve sprekeraudio actieve realtime-antwoorden kunnen annuleren voordat de volgende vastgelegde beurt OpenAI bereikt. Zeer vroege barge-in-signalen met audioEndMs onder minBargeInAudioEndMs worden behandeld als vermoedelijke echo/ruis en genegeerd, zodat het model niet stopt bij het eerste afspeelframe.
Verwachte spraaklogs:
- Bij deelnemen:
discord voice: joining ... voiceSession=... supervisorSession=... agentSessionMode=... voiceModel=... realtimeModel=... - Bij realtime-start:
discord voice: realtime bridge starting ... autoRespond=false interruptResponse=false bargeIn=false minBargeInAudioEndMs=... - Bij sprekeraudio:
discord voice: realtime speaker turn opened ...,discord voice: realtime input audio started ... outputAudioMs=... outputActive=..., endiscord voice: realtime speaker turn closed ... chunks=... discordBytes=... realtimeBytes=... interruptedPlayback=... - Bij overgeslagen verouderde spraak:
discord voice: realtime forced agent consult skipped reason=incomplete-transcript ...ofreason=non-actionable-closing ... - Bij voltooiing van realtime-antwoord:
discord voice: realtime audio playback finishing reason=response.done ... audioMs=... chunks=... - Bij stoppen/resetten van weergave:
discord voice: realtime audio playback stopped reason=... audioMs=... elapsedMs=... chunks=... - Bij realtime-consult:
discord voice: realtime consult requested ... voiceSession=... supervisorSession=... question=... - Bij agentantwoord:
discord voice: agent turn answer ... - Bij exacte spraak in de wachtrij:
discord voice: realtime exact speech queued ... queued=... outputAudioMs=... outputActive=..., gevolgd doordiscord voice: realtime exact speech dequeued reason=player-idle ... - Bij barge-in-detectie:
discord voice: realtime barge-in detected source=speaker-start ...ofdiscord voice: realtime barge-in detected source=active-speaker-audio ..., gevolgd doordiscord voice: realtime barge-in requested reason=... outputAudioMs=... outputActive=... - Bij realtime-onderbreking:
discord voice: realtime model interrupt requested client:response.cancel reason=barge-in, gevolgd doordiscord voice: realtime model audio truncated client:conversation.item.truncate reason=barge-in audioEndMs=...ofdiscord voice: realtime model interrupt confirmed server:response.done status=cancelled ... - Bij genegeerde echo/ruis:
discord voice: realtime model interrupt ignored client:conversation.item.truncate.skipped reason=barge-in audioEndMs=0 minAudioEndMs=250 - Bij uitgeschakelde barge-in:
discord voice: realtime capture ignored during playback (barge-in disabled) ... - Bij inactieve weergave:
discord voice: realtime barge-in ignored reason=... outputActive=false ... playbackChunks=0
realtime audio playback startedbetekent dat Discord is begonnen met het afspelen van assistentaudio. De brug begint vanaf dit punt assistent-uitvoerchunks, Discord PCM-bytes, realtime-bytes van de provider en gesynthetiseerde audioduur te tellen.realtime speaker turn openedmarkeert dat een Discord-spreker actief wordt. Als weergave al actief is enbargeInis ingeschakeld, kan dit worden gevolgd doorbarge-in detected source=speaker-start.realtime input audio startedmarkeert het eerste daadwerkelijke audioframe dat voor die sprekerbeurt is ontvangen.outputActive=trueof een niet-nuloutputAudioMsbetekent hier dat de microfoon invoer verzendt terwijl assistentweergave nog actief is.barge-in detected source=active-speaker-audiobetekent dat OpenClaw live sprekeraudio zag terwijl assistentweergave actief was. Dit is nuttig om een echte onderbreking te onderscheiden van een Discord-gebeurtenis voor het starten van een spreker zonder bruikbare audio.barge-in requested reason=...betekent dat OpenClaw de realtime-provider heeft gevraagd het actieve antwoord te annuleren of af te kappen. Het bevatoutputAudioMs,outputActiveenplaybackChunks, zodat je kunt zien hoeveel assistentaudio daadwerkelijk was afgespeeld vóór de onderbreking.realtime audio playback stopped reason=...is het lokale resetpunt voor Discord-weergave. De reden geeft aan wie de weergave heeft gestopt:barge-in,player-idle,provider-clear-audio,forced-agent-consult,stream-closeofsession-close.realtime speaker turn closedvat de vastgelegde invoerbeurt samen.chunks=0ofhasAudio=falsebetekent dat de sprekerbeurt werd geopend, maar dat geen bruikbare audio de realtime-brug bereikte.interruptedPlayback=truebetekent dat die invoerbeurt overlapte met assistentuitvoer en barge-in-logica activeerde.
outputAudioMs: duur van assistentaudio die vóór de logregel door de realtime-provider is gegenereerd.audioMs: duur van assistentaudio die OpenClaw telde voordat de weergave stopte.elapsedMs: wandkloktijd tussen het openen en sluiten van de weergavestream of sprekerbeurt.discordBytes: 48 kHz stereo PCM-bytes verzonden naar of ontvangen van Discord-spraak.realtimeBytes: PCM-bytes in providerformaat verzonden naar of ontvangen van de realtime-provider.playbackChunks: assistentaudiochunks doorgestuurd naar Discord voor het actieve antwoord.sinceLastAudioMs: onderbreking tussen het laatst vastgelegde sprekeraudioframe en het sluiten van de sprekerbeurt.
- Direct afkappen met
source=active-speaker-audio, kleineoutputAudioMsen dezelfde gebruiker in de buurt wijst meestal op luidsprekerecho die de microfoon binnenkomt. Verhoogvoice.realtime.minBargeInAudioEndMs, verlaag het luidsprekervolume, gebruik een koptelefoon of stelvoice.realtime.providers.openai.interruptResponseOnInputAudio: falsein. source=speaker-startgevolgd doorspeaker turn closed ... hasAudio=falsebetekent dat Discord een sprekerstart meldde, maar dat geen audio OpenClaw bereikte. Dat kan een tijdelijke Discord-spraakgebeurtenis zijn, gedrag van een noise gate of een client die kort de microfoon activeert.audio playback stopped reason=stream-closezonder nabije barge-in ofprovider-clear-audiobetekent dat de lokale Discord-weergavestream onverwacht is beëindigd. Controleer de voorafgaande provider- en Discord-spelerlogs.capture ignored during playback (barge-in disabled)betekent dat OpenClaw invoer bewust heeft laten vallen terwijl assistentaudio actief was. Schakelvoice.realtime.bargeInin als je wilt dat spraak de weergave onderbreekt.barge-in ignored ... outputActive=falsebetekent dat Discord of provider-VAD spraak meldde, maar dat OpenClaw geen actieve weergave had om te onderbreken. Dit zou audio niet moeten afkappen.
voice.model, STT-authenticatie voor tools.media.audio, TTS-authenticatie voor messages.tts/voice.tts en realtime-provider-authenticatie voor voice.realtime.providers of de normale authenticatieconfiguratie van de provider.
Spraakberichten
Discord-spraakberichten tonen een golfvormvoorbeeld en vereisen OGG/Opus-audio. OpenClaw genereert de golfvorm automatisch, maar heeftffmpeg en ffprobe op de Gateway-host nodig om te inspecteren en te converteren.
- Geef een lokaal bestandspad op (URL’s worden geweigerd).
- Laat tekstinhoud weg (Discord weigert tekst + spraakbericht in dezelfde payload).
- Elk audioformaat wordt geaccepteerd; OpenClaw converteert waar nodig naar OGG/Opus.
Probleemoplossing
Used disallowed intents or bot sees no guild messages
Used disallowed intents or bot sees no guild messages
- schakel Message Content Intent in
- schakel Server Members Intent in wanneer je afhankelijk bent van gebruikers-/ledenresolutie
- herstart Gateway na het wijzigen van intents
Guild messages blocked unexpectedly
Guild messages blocked unexpectedly
- controleer
groupPolicy - controleer de guild-allowlist onder
channels.discord.guilds - als de guild-
channels-map bestaat, zijn alleen vermelde kanalen toegestaan - controleer
requireMention-gedrag en vermeldingspatronen
Require mention false but still blocked
Require mention false but still blocked
groupPolicy="allowlist"zonder overeenkomende guild-/kanaal-allowlistrequireMentiongeconfigureerd op de verkeerde plaats (moet onderchannels.discord.guildsof kanaalitem staan)- afzender geblokkeerd door guild-/kanaal-
users-allowlist
Long-running Discord turns or duplicate replies
Long-running Discord turns or duplicate replies
Slow listener detected ...stuck session: sessionKey=agent:...:discord:... state=processing ...
- enkel account:
channels.discord.eventQueue.listenerTimeout - meerdere accounts:
channels.discord.accounts.<accountId>.eventQueue.listenerTimeout - dit beheert alleen Discord Gateway-listenerwerk, niet de levensduur van agentbeurten
Gateway metadata lookup timeout warnings
Gateway metadata lookup timeout warnings
/gateway/bot-metadata op voordat verbinding wordt gemaakt. Tijdelijke fouten vallen terug op de standaard Gateway-URL van Discord en worden in logs in snelheid beperkt.Metadata-timeoutknoppen:- enkel account:
channels.discord.gatewayInfoTimeoutMs - meerdere accounts:
channels.discord.accounts.<accountId>.gatewayInfoTimeoutMs - env-fallback wanneer config niet is ingesteld:
OPENCLAW_DISCORD_GATEWAY_INFO_TIMEOUT_MS - standaard:
30000(30 seconden), max:120000
Gateway READY timeout restarts
Gateway READY timeout restarts
READY-event. Configuraties met meerdere accounts en gespreide opstart kunnen een langer READY-venster bij opstarten nodig hebben dan de standaardwaarde.READY-timeoutknoppen:- opstarten enkel account:
channels.discord.gatewayReadyTimeoutMs - opstarten meerdere accounts:
channels.discord.accounts.<accountId>.gatewayReadyTimeoutMs - opstart-env-fallback wanneer config niet is ingesteld:
OPENCLAW_DISCORD_READY_TIMEOUT_MS - opstartstandaard:
15000(15 seconden), max:120000 - runtime enkel account:
channels.discord.gatewayRuntimeReadyTimeoutMs - runtime meerdere accounts:
channels.discord.accounts.<accountId>.gatewayRuntimeReadyTimeoutMs - runtime-env-fallback wanneer config niet is ingesteld:
OPENCLAW_DISCORD_RUNTIME_READY_TIMEOUT_MS - runtimestandaard:
30000(30 seconden), max:120000
Permissions audit mismatches
Permissions audit mismatches
channels status --probe-machtigingscontroles werken alleen voor numerieke kanaal-ID’s.Als je slug-sleutels gebruikt, kan runtime-matching nog steeds werken, maar de probe kan machtigingen niet volledig verifiëren.DM and pairing issues
DM and pairing issues
- DM uitgeschakeld:
channels.discord.dm.enabled=false - DM-beleid uitgeschakeld:
channels.discord.dmPolicy="disabled"(legacy:channels.discord.dm.policy) - wacht op koppelingsgoedkeuring in
pairing-modus
Bot to bot loops
Bot to bot loops
channels.discord.allowBots=true instelt, gebruik dan strikte vermelding- en allowlist-regels om lusgedrag te voorkomen.
Geef de voorkeur aan channels.discord.allowBots="mentions" om alleen botberichten te accepteren die de bot vermelden.Voice STT drops with DecryptionFailed(...)
Voice STT drops with DecryptionFailed(...)
- houd OpenClaw actueel (
openclaw update) zodat de herstel-logica voor het ontvangen van Discord-spraak aanwezig is - bevestig
channels.discord.voice.daveEncryption=true(standaard) - begin met
channels.discord.voice.decryptionFailureTolerance=24(upstream-standaard) en pas alleen aan als dat nodig is - controleer logs op:
discord voice: DAVE decrypt failures detecteddiscord voice: repeated decrypt failures; attempting rejoin
- als fouten na automatisch opnieuw deelnemen blijven optreden, verzamel dan logs en vergelijk die met de upstream DAVE-ontvangstgeschiedenis in discord.js #11419 en discord.js #11449
Configuratiereferentie
Primaire referentie: Configuratiereferentie - Discord.High-signal Discord fields
High-signal Discord fields
- opstarten/authenticatie:
enabled,token,accounts.*,allowBots - beleid:
groupPolicy,dm.*,guilds.*,guilds.*.channels.* - opdracht:
commands.native,commands.useAccessGroups,configWrites,slashCommand.* - gebeurteniswachtrij:
eventQueue.listenerTimeout(listener-budget),eventQueue.maxQueueSize,eventQueue.maxConcurrency - Gateway:
gatewayInfoTimeoutMs,gatewayReadyTimeoutMs,gatewayRuntimeReadyTimeoutMs - antwoord/geschiedenis:
replyToMode,historyLimit,dmHistoryLimit,dms.*.historyLimit - levering:
textChunkLimit,chunkMode,maxLinesPerMessage - streaming:
streaming(verouderde alias:streamMode),streaming.preview.toolProgress,draftChunk,blockStreaming,blockStreamingCoalesce - media/opnieuw proberen:
mediaMaxMb(beperkt uitgaande Discord-uploads, standaard100MB),retry - acties:
actions.* - aanwezigheid:
activity,status,activityType,activityUrl - UI:
ui.components.accentColor - functies:
threadBindings, top-levelbindings[](type: "acp"),pluralkit,execApprovals,intents,agentComponents,heartbeat,responsePrefix
Veiligheid en beheer
- Behandel bottokens als geheimen (
DISCORD_BOT_TOKENheeft de voorkeur in beheerde omgevingen). - Verleen Discord-machtigingen met minimale rechten.
- Als opdrachtimplementatie/-status verouderd is, herstart dan de Gateway en controleer opnieuw met
openclaw channels status --probe.