Mainstream messaging
Discord
OpenClaw verbindet sich über das offizielle Discord-Gateway als Bot mit Discord. DMs und Gildenkanäle werden unterstützt.
Discord-DMs verwenden standardmäßig den Kopplungsmodus.
Verhalten nativer Befehle und Befehlskatalog.
Kanalübergreifende Diagnose und Reparaturablauf.
Schnelleinrichtung
Erstellen Sie eine Discord-Anwendung mit einem Bot, fügen Sie den Bot Ihrem Server hinzu und koppeln Sie ihn mit OpenClaw. Verwenden Sie nach Möglichkeit einen privaten Server; erstellen Sie bei Bedarf zuerst einen (Create My Own > For me and my friends).
Discord-Anwendung und Bot erstellen
Klicken Sie im Discord Developer Portal auf New Application und vergeben Sie einen Namen (zum Beispiel „OpenClaw“).
Öffnen Sie in der Seitenleiste Bot und setzen Sie Username auf den Namen Ihres Agenten.
Privilegierte Intents aktivieren
Aktivieren Sie weiterhin auf der Seite Bot unter Privileged Gateway Intents Folgendes:
- Message Content Intent (erforderlich)
- Server Members Intent (empfohlen; erforderlich für Rollen-Zulassungslisten, die Zuordnung von Namen zu IDs und Zugriffsgruppen für die Kanalzielgruppe)
- Presence Intent (optional; nur für Anwesenheitsaktualisierungen)
Bot-Token kopieren
Klicken Sie auf der Seite Bot auf Reset Token und kopieren Sie das Token.
Einladungs-URL erzeugen und den Bot Ihrem Server hinzufügen
Öffnen Sie in der Seitenleiste OAuth2. Aktivieren Sie im OAuth2 URL Generator die folgenden Bereiche:
botapplications.commands
Aktivieren Sie im daraufhin angezeigten Abschnitt Bot Permissions mindestens Folgendes:
General Permissions
- View Channels
Text Permissions
- Send Messages
- Read Message History
- Embed Links
- Attach Files
- Add Reactions (optional)
Dies ist die Grundausstattung für normale Textkanäle. Wenn der Bot in Threads posten soll – einschließlich Abläufen in Foren- oder Medienkanälen, die einen Thread erstellen oder fortsetzen –, aktivieren Sie außerdem Send Messages in Threads.
Kopieren Sie die erzeugte URL, öffnen Sie sie in einem Browser, wählen Sie Ihren Server aus und klicken Sie auf Continue. Der Bot sollte nun auf Ihrem Server erscheinen.
Entwicklermodus aktivieren und IDs erfassen
Aktivieren Sie in der Discord-App den Entwicklermodus, damit Sie IDs kopieren können:
- User Settings (Zahnradsymbol) → Developer → Developer Mode einschalten (auf Mobilgeräten: App Settings → Advanced)
- Klicken Sie mit der rechten Maustaste auf Ihr Serversymbol → Copy Server ID
- Klicken Sie mit der rechten Maustaste auf Ihren eigenen Avatar → Copy User ID
Bewahren Sie die Server-ID und die Benutzer-ID zusammen mit Ihrem Bot-Token auf; im nächsten Schritt benötigen Sie alle drei.
DMs von Servermitgliedern zulassen
Damit die Kopplung funktioniert, muss Discord dem Bot erlauben, Ihnen eine DM zu senden. Klicken Sie mit der rechten Maustaste auf Ihr Serversymbol → Privacy Settings → Direct Messages einschalten.
Lassen Sie dies aktiviert, wenn Sie Discord-DMs mit OpenClaw verwenden. Wenn Sie nur Gildenkanäle verwenden, können Sie es nach der Kopplung deaktivieren.
Bot-Token sicher festlegen (nicht im Chat senden)
Das Bot-Token ist ein Geheimnis. Legen Sie es auf dem Computer fest, auf dem OpenClaw ausgeführt wird, bevor Sie Ihrem Agenten eine Nachricht senden:
export DISCORD_BOT_TOKEN="YOUR_BOT_TOKEN"cat > discord.patch.json5 <<'JSON5'{channels: {discord: { enabled: true, token: { source: "env", provider: "default", id: "DISCORD_BOT_TOKEN" },},},}JSON5openclaw config patch --file ./discord.patch.json5 --dry-runopenclaw config patch --file ./discord.patch.json5openclaw gatewayWenn OpenClaw bereits als Hintergrunddienst ausgeführt wird, starten Sie ihn über die OpenClaw-Mac-App neu oder indem Sie den Prozess openclaw gateway run beenden und neu starten.
Führen Sie bei verwalteten Dienstinstallationen openclaw gateway install in einer Shell aus, in der DISCORD_BOT_TOKEN gesetzt ist, oder speichern Sie die Variable in ~/.openclaw/.env, damit der Dienst die Umgebungs-SecretRef nach dem Neustart auflösen kann.
Wenn Ihr Host durch die Discord-Abfrage der Anwendung beim Start blockiert oder ratenbegrenzt wird, legen Sie die Anwendungs-/Client-ID aus dem Developer Portal fest, damit dieser REST-Aufruf beim Start übersprungen werden kann: channels.discord.applicationId für das Standardkonto oder channels.discord.accounts.<accountId>.applicationId pro Bot.
OpenClaw konfigurieren und koppeln
Ihren Agenten fragen
Chatten Sie über einen vorhandenen Kanal (zum Beispiel Telegram) mit Ihrem OpenClaw-Agenten und weisen Sie ihn an. Wenn Discord Ihr erster Kanal ist, verwenden Sie stattdessen den Tab „CLI / Konfiguration“.
„Ich habe mein Discord-Bot-Token bereits in der Konfiguration festgelegt. Bitte schließen Sie die Discord-Einrichtung mit der Benutzer-ID
<user_id>und der Server-ID<server_id>ab.“
CLI / Konfiguration
Dateibasierte Konfiguration:
{channels: {discord: {enabled: true,token: {source: "env",provider: "default",id: "DISCORD_BOT_TOKEN",},},},}Umgebungs-Fallback für das Standardkonto:
DISCORD_BOT_TOKEN=...Schreiben Sie für eine skriptgestützte oder entfernte Einrichtung denselben JSON5-Block mit openclaw config patch --file ./discord.patch.json5 --dry-run und führen Sie den Vorgang anschließend ohne --dry-run erneut aus. Klartextzeichenfolgen für token funktionieren ebenfalls, und für channels.discord.token werden SecretRef-Werte über Umgebungs-, Datei- und Exec-Provider hinweg unterstützt. Siehe Verwaltung von Geheimnissen.
Speichern Sie bei mehreren Discord-Bots jedes Bot-Token und jede Anwendungs-ID unter dem jeweiligen Konto. Ein channels.discord.applicationId auf oberster Ebene wird von den Konten geerbt; legen Sie ihn dort daher nur fest, wenn jedes Konto dieselbe Anwendungs-ID verwendet.
{channels: {discord: {enabled: true,accounts: {personal: { token: { source: "env", provider: "default", id: "DISCORD_PERSONAL_TOKEN" }, applicationId: "111111111111111111",},work: { token: { source: "env", provider: "default", id: "DISCORD_WORK_TOKEN" }, applicationId: "222222222222222222",},},},},}Erste DM-Kopplung genehmigen
Sobald das Gateway ausgeführt wird, senden Sie Ihrem Bot in Discord eine DM. Er antwortet mit einem Kopplungscode.
Ihren Agenten fragen
Senden Sie den Kopplungscode über Ihren vorhandenen Kanal an Ihren Agenten:
„Genehmigen Sie diesen Discord-Kopplungscode:
<CODE>“
CLI
openclaw pairing list discordopenclaw pairing approve discord <CODE>Kopplungscodes laufen nach 1 Stunde ab. Chatten Sie nach der Genehmigung über eine Discord-DM mit Ihrem Agenten.
Empfohlen: Gilden-Arbeitsbereich einrichten
Sobald DMs funktionieren, können Sie Ihren Server in einen vollständigen Arbeitsbereich umwandeln, in dem jeder Kanal eine eigene Agentensitzung mit eigenem Kontext erhält. Dies wird für private Server empfohlen, auf denen sich nur Sie und Ihr Bot befinden.
Server zur Gilden-Zulassungsliste hinzufügen
Dadurch kann Ihr Agent in jedem Kanal auf Ihrem Server antworten, nicht nur in DMs.
Ihren Agenten fragen
„Fügen Sie meine Discord-Server-ID
<server_id>zur Gilden-Zulassungsliste hinzu“
Konfiguration
{channels: {discord: {groupPolicy: "allowlist",guilds: {YOUR_SERVER_ID: { requireMention: true, users: ["YOUR_USER_ID"],},},},},}Antworten ohne @Erwähnung zulassen
Standardmäßig antwortet der Agent in Gildenkanälen nur, wenn er mit @ erwähnt wird. Auf einem privaten Server soll er wahrscheinlich auf jede Nachricht antworten.
In Gildenkanälen werden normale Antworten standardmäßig automatisch gepostet. Aktivieren Sie für gemeinsam genutzte, ständig aktive Räume messages.groupChat.visibleReplies: "message_tool", damit der Agent mitlesen und nur posten kann, wenn er eine Antwort im Kanal für sinnvoll hält. Dies funktioniert am besten mit Modellen der neuesten Generation, die Werkzeuge zuverlässig verwenden, wie GPT-5.6 Sol. Ereignisse in Umgebungsräumen bleiben still, sofern das Werkzeug nichts sendet. Die vollständige Konfiguration des Mitlesemodus finden Sie unter Ereignisse in Umgebungsräumen.
Wenn Discord anzeigt, dass eine Eingabe erfolgt, und die Protokolle eine Token-Nutzung zeigen, aber keine Nachricht gepostet wird, prüfen Sie, ob der Turn als Ereignis in einem Umgebungsraum konfiguriert war oder sichtbare Antworten über das Nachrichtenwerkzeug aktiviert wurden.
Ihren Agenten fragen
„Erlauben Sie meinem Agenten, auf diesem Server zu antworten, ohne mit @ erwähnt werden zu müssen“
Konfiguration
Legen Sie requireMention: false in Ihrer Gildenkonfiguration fest:
{channels: {discord: {guilds: {YOUR_SERVER_ID: { requireMention: false,},},},},}Legen Sie messages.groupChat.visibleReplies: "message_tool" fest, um für sichtbare Gruppen-/Kanalantworten das Senden über das Nachrichtenwerkzeug zu verlangen.
Speicher für Gildenkanäle einplanen
Der Langzeitspeicher (MEMORY.md) wird nur in DM-Sitzungen automatisch geladen; in Gildenkanälen wird er nicht geladen.
Ihren Agenten fragen
„Wenn ich Fragen in Discord-Kanälen stelle, verwenden Sie memory_search oder memory_get, falls Sie langfristigen Kontext aus MEMORY.md benötigen.“
Manuell
Legen Sie stabile Anweisungen für einen in jedem Kanal gemeinsam genutzten Kontext in AGENTS.md oder USER.md ab (wird in jede Sitzung eingefügt). Bewahren Sie langfristige Notizen in MEMORY.md auf und greifen Sie bei Bedarf mit Speicherwerkzeugen darauf zu.
Erstellen Sie nun Kanäle und beginnen Sie zu chatten. Der Agent sieht den Kanalnamen, und jeder Kanal ist eine isolierte Sitzung – richten Sie #coding, #home, #research oder etwas anderes ein, das zu Ihrem Arbeitsablauf passt.
Runtime-Modell
- Das Gateway verwaltet die Discord-Verbindung.
- Das Antwort-Routing ist deterministisch: Eingehende Discord-Nachrichten werden in Discord beantwortet.
- Metadaten von Discord-Gilden und -Kanälen werden dem Modell-Prompt als nicht vertrauenswürdiger Kontext hinzugefügt, nicht als für Benutzer sichtbares Antwortpräfix. Wenn ein Modell diesen Umschlag zurückkopiert, entfernt OpenClaw die kopierten Metadaten aus ausgehenden Antworten und aus dem künftigen Wiedergabekontext.
- Standardmäßig (
session.dmScope=main) verwenden Direktchats gemeinsam die Hauptsitzung des Agenten (agent:main:main). - Gildenkanäle verwenden isolierte Sitzungsschlüssel (
agent:<agentId>:discord:channel:<channelId>). - Gruppen-DMs werden standardmäßig ignoriert (
channels.discord.dm.groupEnabled=false). - Native Slash-Befehle werden in isolierten Befehlssitzungen ausgeführt (
agent:<agentId>:discord:slash:<userId>), wobeiCommandTargetSessionKeyweiterhin an die weitergeleitete Konversationssitzung übergeben wird. - Bei der Ankündigungszustellung rein textbasierter Cron-/Heartbeat-Nachrichten an Discord wird nur die letzte für den Assistenten sichtbare Antwort einmal gesendet. Medien und strukturierte Komponenten-Payloads werden weiterhin als mehrere Nachrichten gesendet, wenn der Agent mehrere zustellbare Payloads ausgibt.
Forenkanäle
Discord-Forum- und Medienkanäle akzeptieren nur Beiträge in Threads. OpenClaw unterstützt zwei Möglichkeiten, diese zu erstellen:
- Senden Sie eine Nachricht an das übergeordnete Forum (
channel:<forumId>), um automatisch einen Thread zu erstellen. Der Thread-Titel entspricht der ersten nicht leeren Zeile der Nachricht (gekürzt auf Discords Begrenzung von 100 Zeichen für Thread-Namen). - Verwenden Sie
openclaw message thread create, um direkt einen Thread zu erstellen. Übergeben Sie für Forumskanäle nicht--message-id.
Senden Sie eine Nachricht an das übergeordnete Forum, um einen Thread zu erstellen:
openclaw message send --channel discord --target channel:<forumId> \ --message "Thementitel\nInhalt des Beitrags"Erstellen Sie explizit einen Forum-Thread:
openclaw message thread create --channel discord --target channel:<forumId> \ --thread-name "Thementitel" --message "Inhalt des Beitrags"Übergeordnete Foren akzeptieren keine Discord-Komponenten. Wenn Sie Komponenten benötigen, senden Sie die Nachricht an den Thread selbst (channel:<threadId>).
Interaktive Komponenten
OpenClaw unterstützt Container mit Discord-Komponenten v2 für Agentennachrichten. Verwenden Sie das Nachrichtenwerkzeug mit einer components-Nutzlast. Interaktionsergebnisse werden als normale eingehende Nachrichten an den Agenten zurückgeleitet und folgen den vorhandenen Discord-Einstellungen unter replyToMode.
Unterstützte Blöcke:
text,section,separator,actions,media-gallery,file- Aktionszeilen erlauben bis zu 5 Schaltflächen oder ein einzelnes Auswahlmenü
- Auswahltypen:
string,user,role,mentionable,channel
Standardmäßig können Komponenten nur einmal verwendet werden. Legen Sie components.reusable=true fest, damit Schaltflächen, Auswahlmenüs und Formulare bis zu ihrem Ablauf mehrfach verwendet werden können.
Um einzuschränken, wer auf eine Schaltfläche klicken kann, legen Sie für diese Schaltfläche allowedUsers fest (Discord-Benutzer-IDs, Tags oder *). Nicht übereinstimmende Benutzer erhalten eine nur für sie sichtbare Ablehnung.
Komponenten-Callbacks laufen standardmäßig nach 30 Minuten ab. Legen Sie channels.discord.agentComponents.ttlMs fest, um die Lebensdauer der Callback-Registrierung für das Standardkonto zu ändern, oder channels.discord.accounts.<accountId>.agentComponents.ttlMs für einzelne Konten. Der Wert wird in Millisekunden angegeben, muss eine positive Ganzzahl sein und ist auf 86400000 (24 Stunden) begrenzt. Längere TTLs eignen sich für Prüfungs-/Genehmigungsabläufe, bei denen Schaltflächen verwendbar bleiben müssen, verlängern jedoch den Zeitraum, in dem eine alte Discord-Nachricht weiterhin eine Aktion auslösen kann. Verwenden Sie vorzugsweise die kürzeste passende TTL und behalten Sie den Standardwert bei, wenn veraltete Callbacks überraschend wären.
Die Slash-Befehle /model und /models öffnen eine interaktive Modellauswahl mit Dropdown-Menüs für Provider, Modell und kompatible Runtime sowie einem Submit-Schritt. /models add ist veraltet und gibt eine Veraltungsmeldung zurück, anstatt Modelle aus dem Chat zu registrieren. Die Antwort der Auswahl ist nur für den aufrufenden Benutzer sichtbar und verwendbar. Discord-Auswahlmenüs sind auf 25 Optionen begrenzt. Fügen Sie daher provider/*-Einträge zu agents.defaults.modelPolicy.allow hinzu, wenn die Auswahl dynamisch erkannte Modelle nur für ausgewählte Provider wie openai oder vllm anzeigen soll.
Dateianhänge:
file-Blöcke müssen auf eine Anhangsreferenz (attachment://<filename>) verweisen- Stellen Sie den Anhang über
media/path/filePathbereit (einzelne Datei); verwenden Siemedia-galleryfür mehrere Dateien - Verwenden Sie
filename, um den Upload-Namen zu überschreiben, wenn er mit der Anhangsreferenz übereinstimmen soll
Modale Formulare:
- Fügen Sie
components.modalmit bis zu 5 Feldern hinzu - Feldtypen:
text,checkbox,radio,select,role-select,user-select - OpenClaw fügt automatisch eine Auslöseschaltfläche hinzu
Beispiel:
{ channel: "discord", action: "send", to: "channel:123456789012345678", message: "Optionaler Ausweichtext", components: { reusable: true, text: "Wählen Sie einen Pfad", blocks: [ { type: "actions", buttons: [ { label: "Genehmigen", style: "success", allowedUsers: ["123456789012345678"], }, { label: "Ablehnen", style: "danger" }, ], }, { type: "actions", select: { type: "string", placeholder: "Wählen Sie eine Option", options: [ { label: "Option A", value: "a" }, { label: "Option B", value: "b" }, ], }, }, ], modal: { title: "Details", triggerLabel: "Formular öffnen", fields: [ { type: "text", label: "Anfragende Person" }, { type: "select", label: "Priorität", options: [ { label: "Niedrig", value: "low" }, { label: "Hoch", value: "high" }, ], }, ], }, },}Zugriffskontrolle und Routing
DM-Richtlinie
channels.discord.dmPolicy steuert den DM-Zugriff. channels.discord.allowFrom ist die kanonische DM-Zulassungsliste.
pairing(Standard)allowlist(erfordert mindestens einen Absender inallowFrom)open(erfordert, dasschannels.discord.allowFromden Eintrag"*"enthält)disabled
Wenn die DM-Richtlinie nicht offen ist, werden unbekannte Benutzer blockiert (oder im Modus pairing zur Kopplung aufgefordert).
Priorität bei mehreren Konten:
channels.discord.accounts.default.allowFromgilt nur für das Kontodefault.- Für ein Konto hat
allowFromVorrang vor dem veraltetendm.allowFrom. - Benannte Konten erben
channels.discord.allowFrom, wenn sowohl ihr eigenesallowFromals auch das veraltetedm.allowFromnicht festgelegt sind. - Benannte Konten erben
channels.discord.accounts.default.allowFromnicht.
Die veralteten Werte channels.discord.dm.policy und channels.discord.dm.allowFrom werden aus Kompatibilitätsgründen weiterhin gelesen. openclaw doctor --fix migriert sie zu dmPolicy und allowFrom, wenn dies ohne Änderung des Zugriffs möglich ist.
DM-Zielformat für die Zustellung:
user:<id><@id>-Erwähnung
Rein numerische IDs werden normalerweise als Kanal-IDs aufgelöst, wenn ein Kanalstandard aktiv ist. IDs, die in der effektiven DM-Zulassungsliste allowFrom des Kontos aufgeführt sind, werden aus Kompatibilitätsgründen jedoch als Benutzer-DM-Ziele behandelt.
Zugriffsgruppen
Discord-DMs und die Autorisierung von Textbefehlen können dynamische accessGroup:<name>-Einträge in channels.discord.allowFrom verwenden.
Namen von Zugriffsgruppen werden kanalübergreifend gemeinsam verwendet. Verwenden Sie type: "message.senders" für eine statische Gruppe, deren Mitglieder in der normalen allowFrom-Syntax des jeweiligen Kanals angegeben werden, oder type: "discord.channelAudience", wenn die aktuelle ViewChannel-Zielgruppe eines Discord-Kanals die Mitgliedschaft dynamisch bestimmen soll. Gemeinsames Verhalten von Zugriffsgruppen: Zugriffsgruppen.
{accessGroups: {operators: { type: "message.senders", members: { "*": ["global-owner-id"], discord: ["discord:123456789012345678"], telegram: ["987654321"], },},},channels: {discord: { dmPolicy: "allowlist", allowFrom: ["accessGroup:operators"],},},}Ein Discord-Textkanal hat keine separate Mitgliederliste. type: "discord.channelAudience" bildet die Mitgliedschaft folgendermaßen ab: Der DM-Absender ist Mitglied des konfigurierten Servers und besitzt derzeit nach Anwendung der Rollen- und Kanalüberschreibungen die effektive Berechtigung ViewChannel für den konfigurierten Kanal.
Beispiel: Erlauben Sie allen Personen, die #maintainers sehen können, dem Bot eine DM zu senden, während DMs für alle anderen geschlossen bleiben.
{accessGroups: {maintainers: { type: "discord.channelAudience", guildId: "1456350064065904867", channelId: "1456744319972282449", membership: "canViewChannel",},},channels: {discord: { dmPolicy: "allowlist", allowFrom: ["accessGroup:maintainers"],},},}Sie können dynamische und statische Einträge kombinieren:
{accessGroups: {maintainers: { type: "discord.channelAudience", guildId: "1456350064065904867", channelId: "1456744319972282449",},},channels: {discord: { dmPolicy: "allowlist", allowFrom: ["accessGroup:maintainers", "discord:123456789012345678"],},},}Suchvorgänge schlagen sicher geschlossen fehl. Wenn Discord Missing Access zurückgibt, die Mitgliedersuche fehlschlägt oder der Kanal zu einem anderen Server gehört, wird der DM-Absender als nicht autorisiert behandelt.
Aktivieren Sie im Discord Developer Portal Server Members Intent, wenn Sie kanalzielgruppenbasierte Zugriffsgruppen verwenden. DMs enthalten keinen Servermitgliedsstatus, daher löst OpenClaw das Mitglied zum Zeitpunkt der Autorisierung über Discord REST auf.
Serverrichtlinie
Die Behandlung von Servern wird durch channels.discord.groupPolicy gesteuert:
openallowlistdisabled
Wenn channels.discord vorhanden ist, lautet die sichere Ausgangskonfiguration allowlist.
Verhalten von allowlist:
- Der Server muss mit
channels.discord.guildsübereinstimmen (idbevorzugt, Slug akzeptiert) - optionale Absender-Zulassungslisten:
users(stabile IDs empfohlen) undroles(nur Rollen-IDs); wenn eine der beiden konfiguriert ist, werden Absender zugelassen, wenn sie mitusersODERrolesübereinstimmen - Der direkte Abgleich von Namen/Tags ist standardmäßig deaktiviert; aktivieren Sie
channels.discord.dangerouslyAllowNameMatching: truenur als Notfall-Kompatibilitätsmodus - Namen/Tags werden für
usersunterstützt, IDs sind jedoch sicherer;openclaw security auditwarnt, wenn Namens-/Tag-Einträge verwendet werden - Wenn für einen Server
channelskonfiguriert ist, werden nicht aufgeführte Kanäle abgelehnt - Wenn ein Server keinen
channels-Block besitzt, sind alle Kanäle dieses zugelassenen Servers erlaubt
Beispiel:
{channels: {discord: { groupPolicy: "allowlist", guilds: { "123456789012345678": { requireMention: true, ignoreOtherMentions: true, users: ["987654321098765432"], roles: ["123456789012345678"], channels: { general: { enabled: true }, help: { enabled: true, requireMention: true }, }, }, },},},}Der veraltete kanalspezifische Schlüssel allow wird durch openclaw doctor --fix zu enabled migriert.
Wenn Sie nur DISCORD_BOT_TOKEN festlegen und keinen channels.discord-Block erstellen, lautet der Runtime-Fallback groupPolicy="allowlist" (mit einer Warnung in den Protokollen), selbst wenn channels.defaults.groupPolicy auf open gesetzt ist.
Erwähnungen und Gruppen-DMs
Servernachrichten erfordern standardmäßig eine Erwähnung.
Die Erkennung von Erwähnungen umfasst:
- explizite Bot-Erwähnung
- konfigurierte Erwähnungsmuster (
agents.entries.*.groupChat.mentionPatterns, ersatzweisemessages.groupChat.mentionPatterns) - implizites Antwort-an-Bot-Verhalten in unterstützten Fällen
Verwenden Sie beim Verfassen ausgehender Discord-Nachrichten die kanonische Erwähnungssyntax: <@USER_ID> für Benutzer, <#CHANNEL_ID> für Kanäle und <@&ROLE_ID> für Rollen. Verwenden Sie nicht die veraltete Form <@!USER_ID> für Spitznamen-Erwähnungen.
requireMention wird pro Server/Kanal konfiguriert (channels.discord.guilds...).
ignoreOtherMentions verwirft optional Nachrichten, die einen anderen Benutzer oder eine andere Rolle, aber nicht den Bot erwähnen (ausgenommen @everyone/@here).
Gruppen-DMs:
- Standard: ignoriert (
dm.groupEnabled=false) - optionale Zulassungsliste über
dm.groupChannels(Kanal-IDs oder Slugs)
Rollenbasiertes Agenten-Routing
Verwenden Sie bindings[].match.roles, um Mitglieder eines Discord-Servers anhand der Rollen-ID an unterschiedliche Agenten weiterzuleiten. Rollenbasierte Bindungen akzeptieren ausschließlich Rollen-IDs und werden nach Peer- oder übergeordneten Peer-Bindungen sowie vor reinen Serverbindungen ausgewertet. Wenn eine Bindung zusätzlich weitere Abgleichsfelder festlegt (beispielsweise peer + guildId + roles), müssen alle konfigurierten Felder übereinstimmen.
{ bindings: [ { agentId: "opus", match: { channel: "discord", guildId: "123456789012345678", roles: ["111111111111111111"], }, }, { agentId: "sonnet", match: { channel: "discord", guildId: "123456789012345678", }, }, ],}Native Befehle und Befehlsautorisierung
commands.nativeverwendet standardmäßig"auto"und ist für Discord aktiviert.- Kanalspezifische Überschreibung:
channels.discord.commands.native. commands.native=falseüberspringt beim Start die Registrierung und Bereinigung von Discord-Slash-Befehlen. Zuvor registrierte Befehle können in Discord sichtbar bleiben, bis Sie sie aus der Discord-App entfernen.- Die Autorisierung nativer Befehle verwendet dieselben Discord-Zulassungslisten/-Richtlinien wie die normale Nachrichtenverarbeitung.
- Befehle können für nicht autorisierte Benutzer weiterhin in der Discord-Benutzeroberfläche sichtbar sein; bei der Ausführung wird die OpenClaw-Autorisierung durchgesetzt und mit „not authorized“ geantwortet.
- Standardeinstellungen für Slash-Befehle:
ephemeral: true(channels.discord.slashCommand.ephemeral).
Den Befehlskatalog und das Verhalten finden Sie unter Slash-Befehle.
Funktionsdetails
Antwort-Tags und native Antworten
Discord unterstützt Antwort-Tags in der Agentenausgabe:
[[reply_to_current]][[reply_to:<id>]]
Gesteuert durch channels.discord.replyToMode:
off(Standard): keine implizite Antwortverkettung; explizite[[reply_to_*]]-Tags werden weiterhin berücksichtigtfirst: fügt die implizite native Antwortreferenz an die erste ausgehende Discord-Nachricht des Durchlaufs anall: fügt sie an jede ausgehende Nachricht anbatched: fügt sie nur an, wenn das eingehende Ereignis ein entprellter Stapel mehrerer Nachrichten war – nützlich, wenn Sie native Antworten hauptsächlich für mehrdeutige, stoßweise Chats verwenden möchten und nicht für jeden Durchlauf mit nur einer Nachricht
Nachrichten-IDs werden im Kontext/Verlauf bereitgestellt, sodass Agenten bestimmte Nachrichten gezielt adressieren können.
Linkvorschauen
Discord erzeugt standardmäßig umfangreiche Link-Einbettungen für URLs. OpenClaw unterdrückt diese generierten Einbettungen standardmäßig bei ausgehenden Discord-Nachrichten, sodass von Agenten gesendete URLs einfache Links bleiben, sofern Sie dies nicht ausdrücklich aktivieren:
{channels: {discord: { suppressEmbeds: false,},},}Legen Sie channels.discord.accounts.<id>.suppressEmbeds fest, um ein einzelnes Konto zu überschreiben. Sendungen über das Nachrichtenwerkzeug des Agenten können für eine einzelne Nachricht außerdem suppressEmbeds: false übergeben. Explizite Discord-embeds-Nutzlasten werden durch die Standardeinstellung für Linkvorschauen nicht unterdrückt.
Live-Stream-Vorschau
OpenClaw kann Antwortentwürfe streamen, indem es eine temporäre Nachricht sendet und sie beim Eintreffen von Text bearbeitet. channels.discord.streaming.mode akzeptiert off | partial | block | progress (Standard, wenn weder der Schlüssel streaming noch der veraltete Schlüssel streamMode festgelegt ist). streamMode ist ein veralteter Alias; führen Sie openclaw doctor --fix aus, um die persistierte Konfiguration in die kanonische verschachtelte streaming-Form umzuschreiben.
{channels: {discord: { streaming: { mode: "progress", progress: { maxLines: 8, maxLineChars: 120, toolProgress: false, commentary: false, }, },},},}offdeaktiviert die Bearbeitung der Discord-Vorschau.partialbearbeitet beim Eintreffen von Tokens eine einzelne Vorschaunachricht.blockgibt entwurfsgroße Blöcke aus; Größe und Umbruchpunkte lassen sich mitstreaming.preview.chunk(minChars,maxChars,breakPreference) anpassen, begrenzt auftextChunkLimit. Wenn Block-Streaming ausdrücklich aktiviert ist, überspringt OpenClaw den Vorschau-Stream, um doppeltes Streaming zu vermeiden.progressbehält bis zur endgültigen Zustellung einen bearbeitbaren Statusentwurf bei. Standardmäßig zeigt er eine Zeile der neuesten Präambel oder Erläuterung des Agenten an, ohne generierte Beschriftung, Abstandshalter oder Werkzeugzeilen.- Medien, Fehler und endgültige Nachrichten mit expliziter Antwort brechen ausstehende Vorschaubearbeitungen ab.
streaming.preview.toolProgressverwendet im Moduspartial/blockstandardmäßigtrue. Der Discord-Fortschrittsmodus zeigt standardmäßig keine Werkzeugzeilen an; legen Siestreaming.progress.toolProgress: truefest, um sie zu aktivieren.- Legen Sie
streaming.progress.toolProgress: truefest, um kompakte Werkzeug-/Fortschrittszeilen wie🛠️ Bash: run testsoder🔎 Web Search: for "query"hinzuzufügen. Aus Kompatibilitätsgründen behält eine vorhandene Konfiguration mitprogress.labeloderprogress.labelsden bisherigen Standard für Werkzeugzeilen bei; legen SietoolProgress: falsefür eine benutzerdefinierte Beschriftung ohne Zeilen fest. streaming.progress.commentary(Standard:false) aktiviert rohe Assistentenkommentare im temporären Fortschrittsentwurf. Die standardmäßige Statuszeile für Präambel/Erläuterung ist von dieser Option unabhängig. Kommentare werden vor der Anzeige bereinigt, bleiben temporär und ändern die Zustellung der endgültigen Antwort nicht.streaming.progress.maxLineCharssteuert das Budget der Fortschrittsvorschau pro Zeile. Fließtext wird an Wortgrenzen gekürzt; bei Befehls- und Pfadangaben bleiben nützliche Endbestandteile erhalten.streaming.preview.commandText/streaming.progress.commandTextsteuert Befehls-/Ausführungsdetails in kompakten Fortschrittszeilen:raw(Standard) oderstatus(nur Werkzeugbeschriftung).
So blenden Sie rohen Befehls-/Ausführungstext aus und behalten gleichzeitig kompakte Fortschrittszeilen bei:
{ "channels": { "discord": { "streaming": { "mode": "progress", "progress": { "toolProgress": true, "commandText": "status" } } } }}Das Vorschau-Streaming unterstützt nur Text; Medienantworten greifen auf die normale Zustellung zurück.
Verlauf, Kontext und Thread-Verhalten
Kontext des Serververlaufs:
channels.discord.historyLimitstandardmäßig20- Fallback:
messages.groupChat.historyLimit 0deaktiviert
Steuerung des DM-Verlaufs:
channels.discord.dmHistoryLimitchannels.discord.dms["<user_id>"].historyLimit
Thread-Verhalten:
- Discord-Threads werden als Kanalsitzungen weitergeleitet und übernehmen die Konfiguration des übergeordneten Kanals, sofern sie nicht überschrieben wird.
- Thread-Sitzungen übernehmen die
/model-Auswahl auf Sitzungsebene des übergeordneten Kanals als reinen Modell-Fallback; Thread-lokale/model-Auswahlen haben Vorrang, und der Transkriptverlauf des übergeordneten Kanals wird nur kopiert, wenn die Transkriptvererbung aktiviert ist. channels.discord.thread.inheritParent(Standard:false) aktiviert für neue automatische Threads die Initialisierung aus dem übergeordneten Transkript. Kontospezifische Überschreibung:channels.discord.accounts.<id>.thread.inheritParent.- Reaktionen des Nachrichtenwerkzeugs können
user:<id>-DM-Ziele auflösen. guilds.<guild>.channels.<channel>.requireMention: falsebleibt beim Fallback der Aktivierung in der Antwortphase erhalten.
Kanalthemen werden als nicht vertrauenswürdiger Kontext eingefügt. Zulassungslisten beschränken, wer den Agenten auslösen kann; sie stellen keine vollständige Schwärzungsgrenze für ergänzenden Kontext dar.
Thread-gebundene Sitzungen für Subagenten
Discord kann einen Thread an ein Sitzungsziel binden, sodass Folgenachrichten in diesem Thread weiterhin an dieselbe Sitzung weitergeleitet werden (einschließlich Subagentensitzungen).
Befehle:
/focus <target>bindet den aktuellen/neuen Thread an ein Subagenten-/Sitzungsziel/unfocusentfernt die Bindung des aktuellen Threads/agentszeigt aktive Ausführungen und den Bindungsstatus an/session idle <duration|off>prüft/aktualisiert die automatische Aufhebung des Fokus bei Inaktivität für fokussierte Bindungen/session max-age <duration|off>prüft/aktualisiert das feste Höchstalter für fokussierte Bindungen
Konfiguration:
{session: {threadBindings: { enabled: true, idleHours: 24, maxAgeHours: 0, spawnSessions: true, defaultSpawnContext: "fork",},},}Hinweise:
session.threadBindings.*ist die kanonische Richtlinie für Discord und Telegram.spawnSessionssteuert das automatische Erstellen/Binden von Threads fürsessions_spawn({ thread: true })und ACP-Thread-Erstellungen. Standard:true.defaultSpawnContextsteuert den nativen Subagentenkontext für Thread-gebundene Erstellungen. Standard:"fork".- Veraltete Schlüssel
spawnSubagentSessions/spawnAcpSessionswerden durchopenclaw doctor --fixmigriert. - Wenn Thread-Bindungen deaktiviert sind, stehen
/focusund zugehörige Vorgänge nicht zur Verfügung.
Weitere Informationen finden Sie unter Subagenten, ACP-Agenten und Konfigurationsreferenz.
Subagentenfortschritt in der Ausgangsnachricht
Legen Sie channels.discord.subagentProgress: true fest, um Hintergrundaktivitäten untergeordneter Prozesse in der Discord-Nachricht anzuzeigen, die die übergeordnete Ausführung gestartet hat.
{channels: {discord: { subagentProgress: true,},},}Während untergeordnete Ausführungen aktiv sind, hält OpenClaw die Discord-Tippanzeige bis zu einer Stunde aktiv und ersetzt bei Änderungen der gleichzeitigen Anzahl eine einzelne Zählreaktion (1️⃣ bis 🔟); 🔟 steht außerdem für 10 oder mehr. Die Zählreaktion wird entfernt, nachdem der letzte untergeordnete Prozess beendet wurde. Ein fehlgeschlagener, wegen Zeitüberschreitung beendeter oder abgebrochener untergeordneter Prozess hinterlässt eine 🔴-Reaktion.
Diese Funktion muss ausdrücklich aktiviert werden und verwendet feste interne Zeit- und Emoji-Standards. Der Bot benötigt für Reaktionsfeedback die Berechtigung Add Reactions. channels.discord.accounts.<id>.subagentProgress auf Kontoebene überschreibt den Wert der obersten Ebene.
Persistente ACP-Kanalbindungen
Konfigurieren Sie für stabile, „ständig aktive“ ACP-Arbeitsbereiche typisierte ACP-Bindungen auf oberster Ebene, die auf Discord-Unterhaltungen verweisen.
Konfigurationspfad: bindings[] mit type: "acp" und match.channel: "discord".
{agents: {entries: { 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, }, }, }, },},},}Hinweise:
/acp spawn codex --bind herebindet den aktuellen Kanal oder Thread direkt und leitet zukünftige Nachrichten weiterhin an dieselbe ACP-Sitzung weiter. Thread-Nachrichten übernehmen die Bindung des übergeordneten Kanals.- In einem gebundenen Kanal oder Thread setzen
/newund/resetdieselbe ACP-Sitzung direkt zurück. Temporäre Thread-Bindungen können die Zielauflösung überschreiben, solange sie aktiv sind. spawnSessionssteuert die Erstellung/Bindung untergeordneter Threads über--thread auto|here.
Einzelheiten zum Bindungsverhalten finden Sie unter ACP-Agenten.
Reaktionsbenachrichtigungen
Modus für Reaktionsbenachrichtigungen pro Server (guilds.<id>.reactionNotifications):
offown(Standard)allallowlist(verwendetguilds.<id>.users)
Reaktionsereignisse werden in Systemereignisse umgewandelt und an die weitergeleitete Discord-Sitzung angehängt.
Online-Präsenzereignisse
Aktivieren Sie für einen Server weitergeleitete Agentenaktivierungen, wenn der Status eines menschlichen Mitglieds von offline zu online wechselt:
{ channels: { discord: { intents: { presence: true }, guilds: { "111111111111111111": { presenceEvents: { channelId: "222222222222222222", users: ["333333333333333333"], // optional; Kanalbetrachter weiter eingrenzen reconnectSuppressSeconds: 300, // optional; Ruhefenster für neue Sitzungen (0 deaktiviert) burstLimit: 8, // optional; maximale Ereignisse pro Burst-Fenster burstWindowSeconds: 60, // optional; gleitendes Fenster zur Burst-Erkennung }, }, }, }, },}presenceEvents erfordert einen aktivierten Heartbeat für den weitergeleiteten Agenten und den privilegierten Presence Intent auf der Bot-Seite der Anwendung im Discord Developer Portal. OpenClaw initialisiert die derzeit online befindlichen Mitglieder aus jedem vollständigen GUILD_CREATE-Snapshot, leitet beobachtete Übergänge von offline zu online weiter und behandelt außerdem ein späteres erstes Online-Signal für ein bisher unbekanntes Mitglied als neu verfügbar. Dieses Mitglied kann nach dem Snapshot online gegangen oder beigetreten sein, daher gibt das Ereignis keinen exakten vorherigen Status an. Nur Personen, die channelId sehen können, sind berechtigt: Kanäle und öffentliche Threads erfordern View Channel für den Kanal oder übergeordneten Kanal, während private Threads zusätzlich eine Mitgliedschaft oder Manage Threads erfordern. users kann diese Zielgruppe weiter eingrenzen. OpenClaw ignoriert Bots und unveränderte Online-Status und speichert eine achtstündige Abklingzeit pro Benutzer über Gateway-Neustarts hinweg. Wenn Discord eine neue Gateway-Sitzung herstellt und READY sendet, unterdrückt OpenClaw aus der Anwesenheit abgeleitete Ereignisse für reconnectSuppressSeconds (Standardwert 300, 0 deaktiviert dies), während der Anwesenheitsstatus der Guild neu aufgebaut wird, sodass erneut beobachtete Mitglieder den Agenten nicht einzeln aufwecken können. Zusätzlich begrenzt es erfolgreich eingereihte Ereignisse pro Guild auf burstLimit Ereignisse (Standardwert 8) pro gleitendem burstWindowSeconds-Fenster (Standardwert 60) und protokolliert jede Unterdrückungsphase einer Guild einmal. Eine fortgesetzte Sitzung wird nicht als neue Sitzung behandelt. Discord begrenzt Snapshots für Guilds mit mehr als 75.000 Mitgliedern; dort erfordert OpenClaw vor einer Begrüßung eine explizite Offline-Aktualisierung. Das Systemereignis enthält unveränderliche Benutzer-, Guild- und Kanal-IDs, ohne veränderliche Anzeigenamen einzubetten. Der Agent entscheidet, ob und wie er begrüßt.
Bestätigungsreaktionen
ackReaction sendet ein Bestätigungs-Emoji, während OpenClaw eine eingehende Nachricht verarbeitet.
Auflösungsreihenfolge:
channels.discord.accounts.<accountId>.ackReactionchannels.discord.ackReactionmessages.ackReaction- Fallback auf das Emoji der Agentenidentität (
agents.entries.*.identity.emoji, andernfalls "👀")
Hinweise:
- Discord akzeptiert Unicode-Emoji oder Namen benutzerdefinierter Emoji.
- Verwenden Sie
"", um die Reaktion für einen Kanal oder ein Konto zu deaktivieren.
Geltungsbereich (messages.ackReactionScope):
Werte: "all" (Direktnachrichten + Gruppen, einschließlich Umgebungsereignissen in Räumen), "direct" (nur Direktnachrichten), "group-all" (jede Gruppennachricht außer Umgebungsereignissen in Räumen, keine Direktnachrichten), "group-mentions" (Gruppen, wenn der Bot erwähnt wird; keine Direktnachrichten, Standardwert), "off" / "none" (deaktiviert).
Konfigurationsschreibvorgänge
Vom Kanal initiierte Konfigurationsschreibvorgänge sind standardmäßig aktiviert. Dies betrifft /config set|unset-Abläufe (wenn Befehlsfunktionen aktiviert sind).
Deaktivieren:
{channels: {discord: { configWrites: false,},},}Gateway-Proxy
Leiten Sie den Discord-Gateway-WebSocket-Datenverkehr und REST-Abfragen beim Start (Anwendungs-ID + Auflösung der Zulassungsliste) mit channels.discord.proxy über einen HTTP(S)-Proxy.
Das Proxying von Discord-Gateway-WebSockets ist explizit; WebSocket-Verbindungen übernehmen keine umgebungsbezogenen Proxy-Umgebungsvariablen vom Gateway-Prozess. REST-Abfragen beim Start verwenden diesen Proxy, wenn channels.discord.proxy konfiguriert ist.
{channels: {discord: { proxy: "http://proxy.example:8080",},},}Überschreibung pro Konto:
{channels: {discord: { accounts: { primary: { proxy: "http://proxy.example:8080", }, },},},}PluralKit-Unterstützung
Aktivieren Sie die PluralKit-Auflösung, um Proxy-Nachrichten der Identität eines Systemmitglieds zuzuordnen:
{channels: {discord: { pluralkit: { enabled: true, token: "pk_live_...", // optional; für private Systeme erforderlich },},},}Hinweise:
- Zulassungslisten können
pk:<memberId>verwenden - Anzeigenamen von Mitgliedern werden nur dann anhand von Name/Slug abgeglichen, wenn
channels.discord.dangerouslyAllowNameMatching: true - Abfragen fragen die PluralKit-API mit der ursprünglichen Nachrichten-ID ab
- wenn die Abfrage fehlschlägt, werden Proxy-Nachrichten als Bot-Nachrichten behandelt und verworfen, sofern
allowBotssie nicht durchlässt
Aliasse für ausgehende Erwähnungen
Verwenden Sie mentionAliases, wenn Agenten deterministische ausgehende Erwähnungen für bekannte Discord-Benutzer benötigen. Schlüssel sind Handles ohne das führende @; Werte sind Discord-Benutzer-IDs. Unbekannte Handles, @everyone, @here und Erwähnungen innerhalb von Markdown-Code-Spans bleiben unverändert.
{channels: {discord: { mentionAliases: { SupportLead: "123456789012345678", }, accounts: { ops: { mentionAliases: { OpsLead: "234567890123456789", }, }, },},},}Anwesenheitskonfiguration
Anwesenheitsaktualisierungen werden angewendet, wenn Sie ein Status- oder Aktivitätsfeld festlegen oder die automatische Anwesenheit aktivieren.
Nur Status:
{channels: {discord: { status: "idle",},},}Aktivität (benutzerdefinierter Status ist der standardmäßige Aktivitätstyp, wenn activity festgelegt ist):
{channels: {discord: { activity: "Fokuszeit", activityType: 4,},},}Streaming:
{channels: {discord: { activity: "Live-Programmierung", activityType: 1, activityUrl: "https://twitch.tv/openclaw",},},}Zuordnung der Aktivitätstypen:
- 0: Spielt
- 1: Streamt (erfordert
activityUrl;activityUrlerfordert wiederumactivityType: 1) - 2: Hört zu
- 3: Sieht zu
- 4: Benutzerdefiniert (verwendet den Aktivitätstext als Statuszustand; Emoji ist optional)
- 5: Tritt an
Automatische Anwesenheit (Laufzeit-Zustandssignal):
{channels: {discord: { autoPresence: { enabled: true, intervalMs: 30000, minUpdateIntervalMs: 15000, exhaustedText: "Token aufgebraucht", },},},}Die automatische Anwesenheit ordnet die Laufzeitverfügbarkeit dem Discord-Status zu: fehlerfrei => online, beeinträchtigt oder unbekannt => abwesend, aufgebraucht oder nicht verfügbar => nicht stören. Standardwerte: intervalMs 30000, minUpdateIntervalMs 15000 (muss kleiner oder gleich intervalMs sein). Optionale Textüberschreibungen:
autoPresence.healthyTextautoPresence.degradedTextautoPresence.exhaustedText(unterstützt den Platzhalter{reason})
Genehmigungen in Discord
Discord unterstützt die schaltflächenbasierte Verarbeitung von Genehmigungen in Direktnachrichten und kann Genehmigungsanfragen optional im ursprünglichen Kanal veröffentlichen.
Konfigurationspfad:
channels.discord.execApprovals.enabledchannels.discord.execApprovals.approvers(optional; greift nach Möglichkeit aufcommands.ownerAllowFromzurück)channels.discord.execApprovals.target(dm|channel|both, Standardwert:dm)agentFilter,sessionFilter,cleanupAfterResolve
Discord aktiviert native Ausführungsgenehmigungen automatisch, wenn enabled nicht festgelegt oder "auto" ist und mindestens eine genehmigende Person aufgelöst werden kann, entweder aus execApprovals.approvers oder aus commands.ownerAllowFrom. Discord leitet genehmigende Personen für Ausführungen nicht aus Kanal-allowFrom, dem veralteten dm.allowFrom oder Direktnachrichten-defaultTo ab. Setzen Sie enabled: false, um Discord explizit als nativen Genehmigungsclient zu deaktivieren.
Für vertrauliche Gruppenbefehle ausschließlich für Eigentümer wie /diagnostics und /export-trajectory sendet OpenClaw Genehmigungsanfragen und Endergebnisse privat. Zunächst wird eine Discord-Direktnachricht versucht, wenn für den aufrufenden Eigentümer eine Discord-Eigentümerroute vorhanden ist; andernfalls wird auf die erste verfügbare Eigentümerroute aus commands.ownerAllowFrom zurückgegriffen, beispielsweise Telegram.
Wenn target auf channel oder both gesetzt ist, ist die Genehmigungsanfrage im Kanal sichtbar. Nur aufgelöste genehmigende Personen können die Schaltflächen verwenden; andere Benutzer erhalten eine nur für sie sichtbare Ablehnung. Genehmigungsanfragen enthalten den Befehlstext. Aktivieren Sie daher die Kanalzustellung nur in vertrauenswürdigen Kanälen. Wenn die Kanal-ID nicht aus dem Sitzungsschlüssel abgeleitet werden kann, greift OpenClaw auf die Zustellung per Direktnachricht zurück.
Discord stellt die gemeinsam genutzten Genehmigungsschaltflächen dar, die auch von anderen Chat-Kanälen verwendet werden; der native Discord-Adapter ergänzt hauptsächlich die Weiterleitung von Direktnachrichten an genehmigende Personen und die Verteilung auf Kanäle. Wenn diese Schaltflächen vorhanden sind, bilden sie die primäre Benutzeroberfläche für Genehmigungen; OpenClaw sollte einen manuellen /approve-Befehl nur dann einfügen, wenn das Werkzeugergebnis angibt, dass Chat-Genehmigungen nicht verfügbar sind oder die manuelle Genehmigung der einzige Weg ist. Wenn die native Discord-Genehmigungslaufzeit nicht aktiv ist, lässt OpenClaw die lokale deterministische /approve <id> <decision>-Eingabeaufforderung sichtbar. Wenn die Laufzeit aktiv ist, aber keine native Karte an ein Ziel zugestellt werden kann, sendet OpenClaw im selben Chat einen Ausweichhinweis mit dem exakten /approve-Befehl aus der ausstehenden Genehmigung.
Gateway-Authentifizierung und Genehmigungsauflösung folgen dem gemeinsamen Gateway-Clientvertrag (plugin:-IDs werden über plugin.approval.resolve aufgelöst; andere IDs über exec.approval.resolve). Genehmigungen laufen standardmäßig nach 30 Minuten ab.
Siehe Ausführungsgenehmigungen.
Werkzeuge und Aktionssperren
Discord-Nachrichtenaktionen umfassen Nachrichtenübermittlung, Kanalverwaltung, Moderation, Anwesenheit und Metadaten.
Grundlegende Beispiele:
- Nachrichtenübermittlung:
sendMessage,readMessages,editMessage,deleteMessage,threadReply - Reaktionen:
react,reactions,emojiList - Moderation:
timeout,kick,ban - Anwesenheit:
setPresence
Die Aktion event-create akzeptiert einen optionalen Parameter image (URL oder lokaler Dateipfad), um das Titelbild des geplanten Ereignisses festzulegen.
Aktionssperren befinden sich unter channels.discord.actions.*.
Standardverhalten der Sperren:
| Aktionsgruppe | Standardmäßig |
|---|---|
| Reaktionen, Nachrichten, Threads, Pins, Umfragen, Suche, Mitgliedsinformationen, Rolleninformationen, Kanalinformationen, Kanäle, Sprachstatus, Ereignisse, Sticker, Emoji-Uploads, Sticker-Uploads, Berechtigungen | aktiviert |
| Rollen | deaktiviert |
| Moderation | deaktiviert |
| Anwesenheit | deaktiviert |
Components-v2-Benutzeroberfläche
OpenClaw verwendet Discord Components v2 für Ausführungsgenehmigungen und kontextübergreifende Markierungen. Discord-Nachrichtenaktionen können außerdem components für benutzerdefinierte Benutzeroberflächen akzeptieren (fortgeschritten; erfordert die Erstellung einer Komponenten-Payload über das Discord-Tool), während ältere embeds weiterhin verfügbar sind, aber nicht empfohlen werden.
channels.discord.ui.components.accentColorlegt die Akzentfarbe fest, die von Discord-Komponentencontainern verwendet wird (hexadezimal). Pro Konto:channels.discord.accounts.<id>.ui.components.accentColor.channels.discord.agentComponents.ttlMssteuert, wie lange gesendete Callbacks von Discord-Komponenten registriert bleiben (Standardwert1800000, Maximum86400000). Pro Konto:channels.discord.accounts.<id>.agentComponents.ttlMs.embedswerden ignoriert, wenn Components v2 vorhanden sind.- Einfache URL-Vorschauen werden standardmäßig unterdrückt. Legen Sie
suppressEmbeds: falsefür eine Nachrichtenaktion fest, wenn ein einzelner ausgehender Link erweitert werden soll.
Beispiel:
{ channels: { discord: { ui: { components: { accentColor: "#5865F2", }, }, }, },}Sprache
Discord verfügt über zwei unterschiedliche Sprachoberflächen: Echtzeit-Sprachkanäle (fortlaufende Unterhaltungen) und Sprachnachrichtenanhänge (das Format mit Wellenformvorschau). Das Gateway unterstützt beide.
Sprachkanäle
Einrichtungscheckliste:
- Aktivieren Sie Message Content Intent im Discord Developer Portal.
- Aktivieren Sie Server Members Intent, wenn Zulassungslisten für Rollen oder Benutzer verwendet werden.
- Laden Sie den Bot mit den Bereichen
botundapplications.commandsein. - Gewähren Sie Connect, Speak, Send Messages und Read Message History im Zielsprachkanal.
- Aktivieren Sie native Befehle (
commands.nativeoderchannels.discord.commands.native). - Konfigurieren Sie
channels.discord.voice.
Verwenden Sie /vc join|leave|status, um Sitzungen zu steuern. Der Befehl verwendet den Standard-Agenten des Kontos und folgt denselben Regeln für Zulassungslisten und Gruppenrichtlinien wie andere Discord-Befehle.
/vc join channel:<voice-channel-id>/vc status/vc leaveSo prüfen Sie vor dem Beitritt die effektiven Berechtigungen des Bots:
openclaw channels capabilities --channel discord --target channel:<voice-channel-id>Beispiel für automatischen Beitritt:
{ channels: { discord: { voice: { enabled: true, model: "openai/gpt-5.6-sol", autoJoin: [ { guildId: "123456789012345678", channelId: "234567890123456789", }, ], allowedChannels: [ { guildId: "123456789012345678", channelId: "234567890123456789", }, ], daveEncryption: true, decryptionFailureTolerance: 24, connectTimeoutMs: 30000, reconnectGraceMs: 15000, realtime: { provider: "openai", model: "gpt-realtime-2.1", speakerVoice: "cedar", }, }, }, },}Hinweise:
- Discord-Sprache ist für reine Textkonfigurationen optional; setzen Sie
channels.discord.voice.enabled=true(oder behalten Sie einen vorhandenenchannels.discord.voice-Block bei), um/vc-Befehle, die Sprachlaufzeit und denGuildVoiceStates-Gateway-Intent zu aktivieren.channels.discord.intents.voiceStateskann das Intent-Abonnement explizit überschreiben; lassen Sie die Einstellung ungesetzt, damit sie der effektiven Sprachaktivierung folgt. voice.modesteuert den Konversationspfad. Der Standardwert istagent-proxy: Ein Echtzeit-Sprach-Frontend verarbeitet den Zeitpunkt der Sprecherwechsel, Unterbrechungen und die Wiedergabe, delegiert inhaltliche Aufgaben überopenclaw_agent_consultan den weitergeleiteten OpenClaw-Agenten und behandelt das Ergebnis wie eine von diesem Sprecher eingegebene Discord-Eingabeaufforderung.stt-ttsbehält den älteren Ablauf aus Batch-STT und TTS bei.bidiermöglicht dem Echtzeitmodell, direkt zu kommunizieren, und stellt dabeiopenclaw_agent_consultfür das OpenClaw-Gehirn bereit.voice.agentSessionsteuert, welche OpenClaw-Konversation Sprachbeiträge empfängt. Lassen Sie die Einstellung für die eigene Sitzung des Sprachkanals ungesetzt, oder setzen Sie{ mode: "target", target: "channel:<text-channel-id>" }, damit der Sprachkanal als Mikrofon-/Lautsprechererweiterung einer vorhandenen Discord-Textkanalsitzung wie#maintainersfungiert.voice.modelüberschreibt das OpenClaw-Agentengehirn für Discord-Sprachantworten und Echtzeitkonsultationen. Lassen Sie die Einstellung ungesetzt, um das Modell des weitergeleiteten Agenten zu übernehmen. Sie ist unabhängig vonvoice.realtime.model.voice.followUsersermöglicht dem Bot, ausgewählten Benutzern in Discord-Sprachkanäle zu folgen, zwischen ihnen zu wechseln und sie zu verlassen. Siehe Benutzern in Sprachkanälen folgen.agent-proxyleitet Sprache überdiscord-voiceweiter. Dabei bleiben die normalen Besitzer-/Tool-Autorisierungen für den Sprecher und die Zielsitzung erhalten, das Agenten-Toolttswird jedoch ausgeblendet, da Discord-Sprache die Wiedergabe steuert. Standardmäßig gewährtagent-proxyder Konsultation für Besitzer-Sprecher (voice.realtime.toolPolicy: "owner") einen dem Besitzer vollständig gleichwertigen Tool-Zugriff und bevorzugt nachdrücklich eine Konsultation des OpenClaw-Agenten vor inhaltlichen Antworten (voice.realtime.consultPolicy: "always"). In diesem standardmäßigenalways-Modus spricht die Echtzeitebene vor der Konsultationsantwort nicht automatisch Fülltext; sie erfasst und transkribiert die Sprache und gibt anschließend die weitergeleitete OpenClaw-Antwort wieder. Wenn mehrere erzwungene Konsultationsantworten abgeschlossen werden, während Discord noch die erste Antwort wiedergibt, werden spätere Antworten mit exaktem Wortlaut bis zum Ende der Wiedergabe in die Warteschlange gestellt, anstatt die Sprachausgabe mitten im Satz zu ersetzen.- Im
stt-tts-Modus verwendet STTtools.media.audio;voice.modelwirkt sich nicht auf die Transkription aus. - In Echtzeitmodi konfigurieren
voice.realtime.provider,voice.realtime.modelundvoice.realtime.speakerVoicedie Echtzeit-Audiositzung. Verwenden Sie für OpenAI Realtime 2.1 zusammen mit dem Codex-Gehirnvoice.realtime.model: "gpt-realtime-2.1"undvoice.model: "openai/gpt-5.6-sol". - Echtzeit-Sprachmodi nehmen standardmäßig kleine
IDENTITY.md-,USER.md- undSOUL.md-Profildateien in die Anweisungen für den Echtzeit-Provider auf, damit schnelle direkte Beiträge dieselbe Identität, Benutzerverankerung und Persona wie der weitergeleitete OpenClaw-Agent beibehalten. Setzen Sievoice.realtime.bootstrapContextFilesauf eine Teilmenge, um dies anzupassen, oder[], um es zu deaktivieren. Nur diese Profildateien werden unterstützt;AGENTS.mdverbleibt im normalen Agentenkontext. Der eingefügte Profilkontext ersetztopenclaw_agent_consultnicht für Arbeiten im Arbeitsbereich, aktuelle Fakten, Speicherabfragen oder Tool-gestützte Aktionen. - Im OpenAI-Echtzeitmodus
agent-proxypasst sich die Aktivierungsnamenprüfung standardmäßig an den Raum an: Eine einzelne Person kann ohne Aktivierungsnamen natürlich sprechen, während bei zwei oder mehr Personen ein Beitrag mit einem Aktivierungsnamen beginnen oder enden muss. Andere Bots zählen nicht als Personen. Setzen Sievoice.realtime.requireWakeName: true, um immer einen Aktivierungsnamen zu verlangen, oderfalse, um nie einen zu verlangen. Konfigurierte Aktivierungsnamen müssen aus einem oder zwei Wörtern bestehen. Wennvoice.realtime.wakeNamesungesetzt ist, verwendet OpenClawnamedes weitergeleiteten Agenten zusammen mitOpenClawund greift ersatzweise auf die Agenten-ID zusammen mitOpenClawzurück. Eine aktive Aktivierungsnamenprüfung deaktiviert die automatische Antwort des Echtzeit-Providers, leitet akzeptierte Beiträge über den Konsultationspfad des OpenClaw-Agenten und gibt eine kurze gesprochene Bestätigung aus, wenn ein vorangestellter Aktivierungsname anhand einer Teiltranskription erkannt wird, bevor das endgültige Transkript eintrifft. Die Richtlinie berücksichtigt Beitritte und Austritte in Echtzeit, ohne die Sprachverbindung neu herzustellen. - Der OpenAI-Echtzeit-Provider akzeptiert aktuelle Realtime-2-Ereignisnamen und ältere Codex-kompatible Aliasse für Ausgabeaudio- und Transkriptereignisse, sodass kompatible Provider-Snapshots abweichen können, ohne dass Assistentenaudio verloren geht.
voice.realtime.bargeInsteuert, ob Discord-Ereignisse beim Sprechbeginn eine aktive Echtzeitwiedergabe unterbrechen. Wenn die Einstellung ungesetzt ist, folgt sie der Einstellung des Echtzeit-Providers für Unterbrechungen durch Eingangsaudio.voice.realtime.minBargeInAudioEndMssteuert die Mindestwiedergabedauer des Assistenten, bevor eine Unterbrechung in OpenAI-Echtzeit das Audio abschneidet. Standard:250. Setzen Sie für eine sofortige Unterbrechung in Räumen mit geringem Echo0, oder erhöhen Sie den Wert für Lautsprecherkonfigurationen mit starkem Echo.voice.ttsüberschreibtttsnur für die Sprachwiedergabe überstt-tts; Echtzeitmodi verwenden stattdessenvoice.realtime.speakerVoice. Legen Sie für eine OpenAI-Stimme bei der Discord-Wiedergabevoice.tts.provider: "openai"fest und wählen Sie untervoice.tts.providers.openai.speakerVoiceeine Text-to-Speech-Stimme aus.cedarist beim aktuellen OpenAI-TTS-Modell eine gute männlich klingende Wahl.- Kanalspezifische Discord-Überschreibungen für
systemPromptgelten für Sprachtranskriptbeiträge dieses Sprachkanals. - Wenn OpenClaw einem Sprachkanal beitritt, erhält die weitergeleitete Agentensitzung ein stilles Systemereignis mit der aktuellen Teilnehmerliste. Spätere Beitritte und Austritte von Teilnehmern aktualisieren diese Sitzung, ohne eine unaufgeforderte gesprochene Antwort auszulösen; Discord-Anzeigenamen werden als nicht vertrauenswürdige Bezeichnungen behandelt. Autorisierte Sprachbeiträge erhalten ebenfalls eine aktuelle Momentaufnahme der Teilnehmerliste.
- Sprachtranskriptbeiträge und
/vc-Befehle verwenden Discord-Einträge incommands.ownerAllowFromfür den Besitzerstatus. Wenn kein Besitzer für Discord-Befehle konfiguriert ist, kannallowFrom(oder das älteredm.allowFrom) des ausgewählten Discord-Kontos weiterhin den Sprachzugriff autorisieren, ohne Besitzerstatus zu gewähren. Die Sichtbarkeit von Agenten-Tools folgt der konfigurierten Tool-Richtlinie für die weitergeleitete Sitzung. - Wenn
voice.autoJoinmehrere Einträge für dieselbe Guild enthält, tritt OpenClaw dem zuletzt konfigurierten Kanal dieser Guild bei. voice.allowedChannelsist eine optionale Zulassungsliste für Aufenthaltsorte. Lassen Sie sie ungesetzt, damit/vc joinjedem autorisierten Discord-Sprachkanal beitreten kann. Wenn sie festgelegt ist, sind/vc join, der automatische Beitritt beim Start und durch den Sprachstatus des Bots ausgelöste Wechsel auf die aufgeführten{ guildId, channelId }-Einträge beschränkt. Legen Sie ein leeres Array fest, um alle Beitritte zu Discord-Sprachkanälen zu verweigern. Wenn Discord den Bot aus der Zulassungsliste heraus verschiebt, verlässt OpenClaw diesen Kanal und tritt erneut dem konfigurierten Ziel für den automatischen Beitritt bei, sofern eines verfügbar ist.voice.daveEncryptionundvoice.decryptionFailureTolerancewerden an die Beitrittsoptionen von@discordjs/voicedurchgereicht; die Upstream-Standardwerte sinddaveEncryption=trueunddecryptionFailureTolerance=24.- OpenClaw verwendet den mitgelieferten Codec
libopus-wasmfür den Empfang von Discord-Sprache und die Echtzeitwiedergabe von rohem PCM. Er enthält einen fest versionierten libopus-WebAssembly-Build und benötigt keine nativen Opus-Add-ons. voice.connectTimeoutMssteuert die anfängliche Wartezeit auf den@discordjs/voice-Status „Ready“ für/vc joinund automatische Beitrittsversuche. Standard:30000.voice.reconnectGraceMssteuert, wie lange OpenClaw darauf wartet, dass eine getrennte Sprachsitzung mit der Wiederherstellung der Verbindung beginnt, bevor sie verworfen wird. Standard:15000.- Im
stt-tts-Modus wird die Sprachwiedergabe nicht allein deshalb beendet, weil ein anderer Benutzer zu sprechen beginnt. Um Rückkopplungsschleifen zu vermeiden, ignoriert OpenClaw neue Sprachaufnahmen, während TTS wiedergegeben wird; sprechen Sie nach dem Ende der Wiedergabe für den nächsten Beitrag. Echtzeitmodi leiten den Sprechbeginn als Unterbrechungssignal an den Echtzeit-Provider weiter. - In Echtzeitmodi kann ein Echo von Lautsprechern in ein offenes Mikrofon wie eine Unterbrechung wirken und die Wiedergabe stoppen. Setzen Sie für Discord-Räume mit starkem Echo
voice.realtime.providers.openai.interruptResponseOnInputAudio: false, damit OpenAI bei Eingangsaudio nicht automatisch unterbricht. Fügen Sievoice.realtime.bargeIn: truehinzu, wenn Discord-Ereignisse beim Sprechbeginn eine aktive Wiedergabe dennoch unterbrechen sollen. Die OpenAI-Echtzeit-Bridge ignoriert Wiedergabeabschneidungen, die kürzer alsvoice.realtime.minBargeInAudioEndMssind, als wahrscheinliches Echo oder Rauschen und protokolliert sie als übersprungen, anstatt die Discord-Wiedergabe zu löschen. voice.captureSilenceGraceMssteuert, wie lange OpenClaw wartet, nachdem Discord das Ende eines Sprecherbeitrags gemeldet hat, bevor dieses Audiosegment für STT abgeschlossen wird. Standard:2000; erhöhen Sie den Wert, wenn Discord normale Pausen in abgehackte Teiltranskripte zerlegt.- Wenn ElevenLabs als TTS-Provider ausgewählt ist, verwendet die Discord-Sprachwiedergabe Streaming-TTS und beginnt mit der Wiedergabe aus dem Antwortstream des Providers. Provider ohne Streaming-Unterstützung greifen auf den Pfad mit einer synthetisierten temporären Datei zurück.
- OpenClaw überwacht Entschlüsselungsfehler beim Empfang und stellt die Funktion automatisch wieder her, indem es den Sprachkanal nach wiederholten Fehlern innerhalb eines kurzen Zeitfensters verlässt und ihm erneut beitritt.
- Wenn die Empfangsprotokolle nach einer Aktualisierung wiederholt
DecryptionFailed(UnencryptedWhenPassthroughDisabled)anzeigen, erfassen Sie einen Abhängigkeitsbericht und Protokolle. Die mitgelieferte@discordjs/voice-Zeile enthält die Upstream-Korrektur für Padding aus dem discord.js-PR #11449, durch den das discord.js-Issue #11419 geschlossen wurde. - Empfangsereignisse vom Typ
The operation was abortedsind zu erwarten, wenn OpenClaw ein erfasstes Sprechersegment abschließt; es handelt sich um ausführliche Diagnosemeldungen, nicht um Warnungen. - Ausführliche Discord-Sprachprotokolle enthalten für jedes akzeptierte Sprechersegment eine begrenzte einzeilige Vorschau des STT-Transkripts, sodass beim Debugging sowohl die Benutzerseite als auch die Antwortseite des Agenten sichtbar sind, ohne unbegrenzt langen Transkripttext auszugeben.
- Im
agent-proxy-Modus überspringt der erzwungene Konsultations-Fallback wahrscheinlich unvollständige Transkriptfragmente, etwa Text, der mit...oder einem nachgestellten Bindewort wie „und“ endet, sowie offensichtlich nicht handlungsrelevante Abschlüsse wie „bin gleich zurück“ oder „tschüss“. Die Protokolle zeigenforced agent consult skipped reason=..., wenn dadurch eine veraltete Antwort in der Warteschlange verhindert wird.
Benutzern in Sprachkanälen folgen
Verwenden Sie voice.followUsers, wenn der Discord-Sprachbot bei einem oder mehreren bekannten Discord-Benutzern bleiben soll, anstatt beim Start einem festen Kanal beizutreten oder auf /vc join zu warten.
{ channels: { discord: { voice: { enabled: true, followUsersEnabled: true, followUsers: ["discord:123456789012345678"], allowedChannels: [ { guildId: "123456789012345678", channelId: "234567890123456789", }, ], }, }, },}Verhalten:
followUsersakzeptiert rohe Discord-Benutzer-IDs unddiscord:<id>-Werte. OpenClaw normalisiert beide Formen vor dem Abgleich von Sprachstatusereignissen.followUsersEnabledverwendet standardmäßigtrue, wennfollowUserskonfiguriert ist. Setzen Sie den Wert auffalse, um die gespeicherte Liste beizubehalten, aber das automatische Folgen in Sprachkanäle zu beenden.followUserssteuert nur den Aufenthalt im Sprachkanal. Es gewährt weder Sprecherzugriff noch Eigentümerberechtigungen; konfigurieren Siecommands.ownerAllowFromsowie Benutzer und Rollen für Server oder Kanäle separat.- Wenn ein Benutzer, dem gefolgt wird, einem zulässigen Sprachkanal beitritt, tritt OpenClaw diesem Kanal bei. Wenn der Benutzer wechselt, wechselt OpenClaw mit ihm. Wenn der aktive Benutzer, dem gefolgt wird, die Verbindung trennt, verlässt OpenClaw den Kanal.
- Wenn sich mehrere Benutzer, denen gefolgt wird, auf demselben Server befinden und der aktive Benutzer den Kanal verlässt, wechselt OpenClaw zum Kanal eines anderen erfassten Benutzers, dem gefolgt wird, bevor OpenClaw den Server verlässt. Wenn mehrere Benutzer gleichzeitig wechseln, ist das zuletzt beobachtete Sprachstatusereignis maßgeblich.
allowedChannelsgilt weiterhin. Ein Benutzer, dem gefolgt wird und der sich in einem nicht zulässigen Kanal befindet, wird ignoriert, und eine durch das Folgen verwaltete Sitzung wechselt zu einem anderen Benutzer, dem gefolgt wird, oder wird beendet.- OpenClaw gleicht verpasste Sprachstatusereignisse beim Start und in einem begrenzten Intervall ab. Der Abgleich prüft stichprobenartig konfigurierte Server und begrenzt die REST-Abfragen pro Durchlauf. Daher können sehr große
followUsers-Listen mehr als ein Intervall benötigen, bis sie vollständig abgeglichen sind. - Wenn Discord oder ein Administrator den Bot verschiebt, während er einem Benutzer folgt, erstellt OpenClaw die Sprachsitzung neu und behält die Zuständigkeit des Folgemodus bei, sofern das Ziel zulässig ist. Wenn der Bot außerhalb von
allowedChannelsverschoben wird, verlässt OpenClaw den Kanal und tritt dem konfigurierten Ziel erneut bei, sofern eines vorhanden ist. - Bei der Wiederherstellung des DAVE-Empfangs kann derselbe Kanal nach wiederholten Entschlüsselungsfehlern verlassen und erneut betreten werden. Durch das Folgen verwaltete Sitzungen behalten während dieses Wiederherstellungspfads ihre Zuständigkeit des Folgemodus bei, sodass der Kanal weiterhin verlassen wird, wenn ein Benutzer, dem gefolgt wird, später die Verbindung trennt.
Wählen Sie einen der Beitrittsmodi:
- Verwenden Sie
followUsersfür persönliche oder Betreiberkonfigurationen, bei denen der Bot automatisch im Sprachkanal sein soll, wenn Sie es sind. - Verwenden Sie
autoJoinfür Bots in festen Räumen, die auch dann anwesend sein sollen, wenn sich kein erfasster Benutzer in einem Sprachkanal befindet. - Verwenden Sie
/vc joinfür einmalige Beitritte oder Räume, in denen eine automatische Anwesenheit im Sprachkanal unerwartet wäre.
Discord-Sprachcodec:
- Die Protokolle des Sprachempfangs zeigen
discord voice: opus decoder: libopus-wasm. - Die Echtzeitwiedergabe codiert rohes 48-kHz-Stereo-PCM mit demselben enthaltenen
libopus-wasm-Paket in Opus, bevor die Pakete an@discordjs/voiceübergeben werden. - Die Wiedergabe von Dateien und Provider-Streams transcodiert mit ffmpeg in rohes 48-kHz-Stereo-PCM und verwendet anschließend
libopus-wasmfür den an Discord gesendeten Opus-Paketstrom.
STT- plus TTS-Pipeline:
- Die Discord-PCM-Aufnahme wird in eine temporäre WAV-Datei konvertiert.
tools.media.audioverarbeitet STT, zum Beispielopenai/gpt-4o-mini-transcribe.- Das Transkript wird über den Discord-Eingang und das Routing gesendet, während das Antwort-LLM mit einer Sprachausgaberichtlinie ausgeführt wird, die das Agentenwerkzeug
ttsausblendet und zurückgegebenen Text anfordert, da Discord Voice die abschließende TTS-Wiedergabe steuert. voice.modelüberschreibt, sofern festgelegt, nur das Antwort-LLM für diesen Durchlauf im Sprachkanal.voice.ttswird überttszusammengeführt; Streaming-fähige Provider speisen den Player direkt, andernfalls wird die erzeugte Audiodatei im beigetretenen Kanal wiedergegeben.
Beispiel für eine standardmäßige Agenten-Proxy-Sprachkanalsitzung:
{ channels: { discord: { voice: { enabled: true, model: "openai/gpt-5.6-sol", followUsersEnabled: true, followUsers: ["123456789012345678"], realtime: { provider: "openai", model: "gpt-realtime-2.1", speakerVoice: "cedar", }, }, }, },}Ohne einen voice.agentSession-Block erhält jeder Sprachkanal eine eigene geroutete OpenClaw-Sitzung. Beispielsweise kommuniziert /vc join channel:234567890123456789 mit der Sitzung für diesen Discord-Sprachkanal. Das Echtzeitmodell dient nur als Sprach-Frontend; inhaltliche Anfragen werden an den konfigurierten OpenClaw-Agenten übergeben. Wenn das Echtzeitmodell ein endgültiges Transkript erzeugt, ohne das Beratungswerkzeug aufzurufen, erzwingt OpenClaw ersatzweise die Beratung, sodass sich die Standardeinstellung weiterhin wie ein Gespräch mit dem Agenten verhält.
Beispiel für veraltetes STT plus TTS:
{ channels: { discord: { voice: { enabled: true, mode: "stt-tts", model: "openai/gpt-5.4-mini", tts: { provider: "openai", providers: { openai: { model: "gpt-4o-mini-tts", speakerVoice: "cedar", }, }, }, }, }, },}Beispiel für bidirektionale Echtzeitkommunikation:
{ channels: { discord: { voice: { enabled: true, mode: "bidi", model: "openai/gpt-5.6-sol", realtime: { provider: "openai", model: "gpt-realtime-2.1", speakerVoice: "cedar", toolPolicy: "safe-read-only", consultPolicy: "always", }, }, }, },}Sprachkommunikation als Erweiterung einer vorhandenen Discord-Kanalsitzung:
{ channels: { discord: { voice: { enabled: true, mode: "agent-proxy", model: "openai/gpt-5.6-sol", agentSession: { mode: "target", target: "channel:123456789012345678", }, realtime: { provider: "openai", model: "gpt-realtime-2.1", speakerVoice: "cedar", }, }, }, },}Im Modus agent-proxy tritt der Bot dem konfigurierten Sprachkanal bei, die OpenClaw-Agentendurchläufe verwenden jedoch die regulär geroutete Sitzung und den Agenten des Zielkanals. Die Echtzeit-Sprachsitzung gibt das zurückgegebene Ergebnis im Sprachkanal wieder. Der überwachende Agent kann gemäß seiner Werkzeugrichtlinie weiterhin normale Nachrichtenwerkzeuge verwenden und beispielsweise eine separate Discord-Nachricht senden, wenn dies die richtige Aktion ist.
Während ein delegierter OpenClaw-Durchlauf aktiv ist, werden neue Discord-Sprachtranskripte als Live-Steuerung des Durchlaufs behandelt, bevor ein weiterer Agentendurchlauf gestartet wird. Formulierungen wie „Status“, „brechen Sie das ab“, „verwenden Sie die kleinere Korrektur“ oder „prüfen Sie nach Abschluss auch die Tests“ werden als Status-, Abbruch-, Steuerungs- oder Folgeeingabe für die aktive Sitzung klassifiziert. Status-, Abbruch-, akzeptierte Steuerungs- und Folgeergebnisse werden im Sprachkanal wiedergegeben, damit der Anrufer weiß, ob OpenClaw die Anfrage verarbeitet hat.
Nützliche Zielformen:
target: "channel:123456789012345678"leitet über eine Discord-Textkanalsitzung weiter.target: "123456789012345678"wird als Kanalziel behandelt.target: "dm:123456789012345678"odertarget: "user:123456789012345678"leitet über die entsprechende Direktnachrichtensitzung weiter.
Beispiel für OpenAI Realtime bei starkem Echo:
{ channels: { discord: { voice: { enabled: true, mode: "bidi", model: "openai/gpt-5.6-sol", realtime: { provider: "openai", model: "gpt-realtime-2.1", speakerVoice: "cedar", bargeIn: true, minBargeInAudioEndMs: 500, consultPolicy: "always", providers: { openai: { interruptResponseOnInputAudio: false, }, }, }, }, }, },}Verwenden Sie diese Konfiguration, wenn das Modell seine eigene Discord-Wiedergabe über ein offenes Mikrofon hört, Sie es aber dennoch durch Sprechen unterbrechen möchten. OpenClaw verhindert, dass OpenAI bei rohem Eingangsaudio automatisch unterbricht, während bargeIn: true ermöglicht, dass Ereignisse beim Sprechbeginn in Discord und bereits aktives Sprecheraudio aktive Echtzeitantworten abbrechen, bevor der nächste aufgenommene Durchlauf OpenAI erreicht. Sehr frühe Unterbrechungssignale mit audioEndMs unter minBargeInAudioEndMs werden als wahrscheinliches Echo oder Rauschen behandelt und ignoriert, damit das Modell nicht bereits beim ersten Wiedergabeframe abbricht.
Erwartete Sprachprotokolle:
- Beim Beitritt:
discord voice: joining ... voiceSession=... supervisorSession=... agentSessionMode=... voiceModel=... realtimeModel=... - Beim Echtzeitstart:
discord voice: realtime bridge starting ... autoRespond=false interruptResponse=false bargeIn=false minBargeInAudioEndMs=... - Bei Sprecheraudio:
discord voice: realtime speaker turn opened ...,discord voice: realtime input audio started ... outputAudioMs=... outputActive=...unddiscord voice: realtime speaker turn closed ... chunks=... discordBytes=... realtimeBytes=... interruptedPlayback=... - Beim Überspringen veralteter Sprache:
discord voice: realtime forced agent consult skipped reason=incomplete-transcript ...oderreason=non-actionable-closing ... - Beim Abschluss der Echtzeitantwort:
discord voice: realtime audio playback finishing reason=response.done ... audioMs=... chunks=... - Beim Stoppen oder Zurücksetzen der Wiedergabe:
discord voice: realtime audio playback stopped reason=... audioMs=... elapsedMs=... chunks=... - Bei der Echtzeitberatung:
discord voice: realtime consult requested ... voiceSession=... supervisorSession=... question=... - Bei der Agentenantwort:
discord voice: agent turn answer ... - Beim Einreihen exakter Sprachausgabe:
discord voice: realtime exact speech queued ... queued=... outputAudioMs=... outputActive=..., gefolgt vondiscord voice: realtime exact speech dequeued reason=player-idle ... - Bei der Erkennung einer Unterbrechung:
discord voice: realtime barge-in detected source=speaker-start ...oderdiscord voice: realtime barge-in detected source=active-speaker-audio ..., gefolgt vondiscord voice: realtime barge-in requested reason=... outputAudioMs=... outputActive=... - Bei einer Echtzeitunterbrechung:
discord voice: realtime model interrupt requested client:response.cancel reason=barge-in, gefolgt vondiscord voice: realtime model audio truncated client:conversation.item.truncate reason=barge-in audioEndMs=...oderdiscord voice: realtime model interrupt confirmed server:response.done status=cancelled ... - Bei ignoriertem Echo oder Rauschen:
discord voice: realtime model interrupt ignored client:conversation.item.truncate.skipped reason=barge-in audioEndMs=0 minAudioEndMs=250 - Bei deaktivierter Unterbrechung:
discord voice: realtime capture ignored during playback (barge-in disabled) ... - Bei inaktiver Wiedergabe:
discord voice: realtime barge-in ignored reason=... outputActive=false ... playbackChunks=0
Lesen Sie zur Fehlersuche bei abgeschnittenem Audio die Echtzeit-Sprachprotokolle als Zeitleiste:
realtime audio playback startedbedeutet, dass Discord mit der Wiedergabe von Assistentenaudio begonnen hat. Ab diesem Zeitpunkt zählt die Brücke die Ausgabeblöcke des Assistenten, die Discord-PCM-Bytes, die Echtzeitbytes des Providers und die Dauer des synthetisierten Audios.realtime speaker turn openedkennzeichnet, dass ein Discord-Sprecher aktiv wird. Wenn die Wiedergabe bereits aktiv undbargeInaktiviert ist, kann daraufbarge-in detected source=speaker-startfolgen.realtime input audio startedkennzeichnet den ersten tatsächlich empfangenen Audioframe für diesen Sprecherdurchlauf.outputActive=trueoder ein von null abweichender Wert füroutputAudioMsbedeutet hier, dass das Mikrofon Eingaben sendet, während die Assistentenwiedergabe noch aktiv ist.barge-in detected source=active-speaker-audiobedeutet, dass OpenClaw aktives Sprecheraudio erkannt hat, während die Assistentenwiedergabe aktiv war. Dies ist hilfreich, um eine echte Unterbrechung von einem Discord-Ereignis beim Sprechbeginn ohne verwertbares Audio zu unterscheiden.barge-in requested reason=...bedeutet, dass OpenClaw den Echtzeit-Provider angewiesen hat, die aktive Antwort abzubrechen oder zu kürzen. Der Eintrag enthältoutputAudioMs,outputActiveundplaybackChunks, sodass Sie erkennen können, wie viel Assistentenaudio vor der Unterbrechung tatsächlich wiedergegeben wurde.realtime audio playback stopped reason=...ist der lokale Rücksetzpunkt der Discord-Wiedergabe. Der Grund gibt an, wer die Wiedergabe beendet hat:barge-in,player-idle,provider-clear-audio,forced-agent-consult,stream-closeodersession-close.realtime speaker turn closedfasst den aufgenommenen Eingabedurchlauf zusammen.chunks=0oderhasAudio=falsebedeutet, dass der Sprecherdurchlauf geöffnet wurde, aber kein verwertbares Audio die Echtzeitbrücke erreicht hat.interruptedPlayback=truebedeutet, dass sich dieser Eingabedurchlauf mit der Assistentenausgabe überschnitten und die Unterbrechungslogik ausgelöst hat.
Nützliche Felder:
outputAudioMs: Dauer des Assistentenaudios, das der Echtzeit-Provider vor dieser Protokollzeile erzeugt hat.audioMs: Dauer des Assistentenaudios, die OpenClaw bis zum Ende der Wiedergabe gezählt hat.elapsedMs: verstrichene Echtzeit zwischen dem Öffnen und Schließen des Wiedergabestreams oder Sprecherdurchlaufs.discordBytes: an Discord Voice gesendete oder von Discord Voice empfangene 48-kHz-Stereo-PCM-Bytes.realtimeBytes: an den Echtzeit-Provider gesendete oder von ihm empfangene PCM-Bytes im Providerformat.playbackChunks: für die aktive Antwort an Discord weitergeleitete Assistenten-Audioblöcke.sinceLastAudioMs: Zeitspanne zwischen dem letzten aufgenommenen Sprecheraudioframe und dem Schließen des Sprecherdurchlaufs.
Häufige Muster:
- Ein sofortiger Abbruch mit
source=active-speaker-audio, einem kleinenoutputAudioMsund demselben Benutzer in der Nähe weist normalerweise darauf hin, dass ein Lautsprecherecho in das Mikrofon gelangt. Erhöhen Sievoice.realtime.minBargeInAudioEndMs, verringern Sie die Lautstärke des Lautsprechers, verwenden Sie Kopfhörer oder legen Sievoice.realtime.providers.openai.interruptResponseOnInputAudio: falsefest. source=speaker-startgefolgt vonspeaker turn closed ... hasAudio=falsebedeutet, dass Discord den Beginn einer Sprachausgabe gemeldet hat, aber kein Audio OpenClaw erreicht hat. Ursache kann ein vorübergehendes Discord-Sprachereignis, das Verhalten des Noise Gates oder ein Client sein, der das Mikrofon kurz aktiviert.audio playback stopped reason=stream-closeohne ein zeitnahes Dazwischensprechen oderprovider-clear-audiobedeutet, dass der lokale Discord-Wiedergabestream unerwartet beendet wurde. Prüfen Sie die vorhergehenden Provider- und Discord-Player-Protokolle.capture ignored during playback (barge-in disabled)bedeutet, dass OpenClaw Eingaben absichtlich verworfen hat, während Assistentenaudio aktiv war. Aktivieren Sievoice.realtime.bargeIn, wenn Sprache die Wiedergabe unterbrechen soll.barge-in ignored ... outputActive=falsebedeutet, dass Discord oder die VAD des Providers Sprache gemeldet hat, OpenClaw jedoch keine aktive Wiedergabe zum Unterbrechen hatte. Dadurch sollte Audio nicht abgebrochen werden.
Anmeldedaten werden komponentenbezogen aufgelöst: Authentifizierung der LLM-Route für voice.model, STT-Authentifizierung für tools.media.audio, TTS-Authentifizierung für tts/voice.tts und Echtzeit-Provider-Authentifizierung für voice.realtime.providers oder die normale Authentifizierungskonfiguration des Providers.
Sprachnachrichten
Discord-Sprachnachrichten zeigen eine Wellenformvorschau an und erfordern OGG/Opus-Audio. OpenClaw erzeugt die Wellenform automatisch, benötigt jedoch ffmpeg und ffprobe auf dem Gateway-Host, um das Audio zu untersuchen und zu konvertieren.
- Geben Sie einen lokalen Dateipfad an (URLs werden abgelehnt).
- Lassen Sie den Textinhalt weg (Discord lehnt Text und Sprachnachricht in derselben Nutzlast ab).
- Jedes Audioformat wird akzeptiert; OpenClaw konvertiert es bei Bedarf in OGG/Opus.
message(action="send", channel="discord", target="channel:123", path="/path/to/audio.mp3", asVoice=true)Fehlerbehebung
Nicht zulässige Intents verwendet oder Bot sieht keine Servernachrichten
- Message Content Intent aktivieren
- Server Members Intent aktivieren, wenn Sie auf die Auflösung von Benutzern/Mitgliedern angewiesen sind
- Gateway nach dem Ändern der Intents neu starten
Servernachrichten werden unerwartet blockiert
groupPolicyüberprüfen- Server-Zulassungsliste unter
channels.discord.guildsüberprüfen - wenn eine
channels-Zuordnung für einen Server vorhanden ist, sind nur aufgeführte Kanäle zulässig - Verhalten von
requireMentionund Erwähnungsmuster überprüfen
Nützliche Prüfungen:
openclaw doctoropenclaw channels status --probeopenclaw logs --followErwähnung nicht erforderlich, aber weiterhin blockiert
Häufige Ursachen:
groupPolicy="allowlist"ohne passende Server-/Kanal-ZulassungslisterequireMentionan der falschen Stelle konfiguriert (muss unterchannels.discord.guildsoder einem Kanaleintrag stehen)- Absender durch die
users-Zulassungsliste des Servers/Kanals blockiert
Lang laufende Discord-Durchläufe oder doppelte Antworten
Typische Protokolle:
Slow listener detected ...stuck session: sessionKey=agent:...:discord:... state=processing ...
Discord wendet auf Agentendurchläufe in der Warteschlange kein kanaleigenes Zeitlimit an. Nachrichten-Listener übergeben die Verarbeitung sofort, und Discord-Durchläufe in der Warteschlange behalten die sitzungsbezogene Reihenfolge bei, bis der Lebenszyklus der Sitzung, des Tools oder der Laufzeit abgeschlossen ist oder die Arbeit abbricht.
Warnungen wegen Zeitüberschreitung beim Abrufen von Gateway-Metadaten
OpenClaw ruft vor dem Verbinden die Discord-Metadaten /gateway/bot ab. Bei vorübergehenden Fehlern wird auf die standardmäßige Gateway-URL von Discord zurückgegriffen, und die Protokollierung wird ratenbegrenzt.
Das Zeitlimit für Metadaten beträgt standardmäßig 30 Sekunden. OPENCLAW_DISCORD_GATEWAY_INFO_TIMEOUT_MS kann es für ungewöhnliche Hostumgebungen überschreiben.
Neustarts wegen Zeitüberschreitung bei Gateway READY
OpenClaw wartet beim Start und nach erneuten Verbindungen der Laufzeit auf das Gateway-Ereignis READY von Discord. Konfigurationen mit mehreren Konten und gestaffeltem Start benötigen möglicherweise ein längeres READY-Zeitfenster beim Start als die Standardeinstellung.
Beim Start wird 15 Sekunden und bei erneuten Verbindungen der Laufzeit 30 Sekunden gewartet. OPENCLAW_DISCORD_READY_TIMEOUT_MS und OPENCLAW_DISCORD_RUNTIME_READY_TIMEOUT_MS bleiben für ungewöhnliche Hostumgebungen verfügbar.
Abweichungen bei der Berechtigungsprüfung
Die Berechtigungsprüfungen von channels status --probe funktionieren nur mit numerischen Kanal-IDs.
Wenn Sie Slug-Schlüssel verwenden, kann der Laufzeitabgleich weiterhin funktionieren, aber die Prüfung kann die Berechtigungen nicht vollständig verifizieren.
Probleme mit Direktnachrichten und Kopplung
- Direktnachrichten deaktiviert:
channels.discord.dm.enabled=false - Direktnachrichtenrichtlinie deaktiviert:
channels.discord.dmPolicy="disabled"(veraltet:channels.discord.dm.policy) - wartet im Modus
pairingauf die Genehmigung der Kopplung
Bot-zu-Bot-Schleifen
Standardmäßig werden von Bots verfasste Nachrichten ignoriert.
Wenn Sie channels.discord.allowBots=true festlegen, verwenden Sie strenge Regeln für Erwähnungen und Zulassungslisten, um Schleifen zu vermeiden.
Bevorzugen Sie channels.discord.allowBots="mentions", um nur Bot-Nachrichten zu akzeptieren, die den Bot erwähnen.
OpenClaw enthält außerdem einen gemeinsamen Schutz vor Bot-Schleifen. Immer wenn allowBots von Bots verfasste Nachrichten bis zur Weiterleitung durchlässt, ordnet Discord das eingehende Ereignis (account, channel, bot pair)-Fakten zu, und die generische Paarsicherung unterdrückt das Paar, nachdem es das konfigurierte Ereignisbudget überschritten hat. Die Sicherung verhindert unkontrollierte Schleifen zwischen zwei Bots, die zuvor durch Discord-Ratenbegrenzungen gestoppt werden mussten; sie wirkt sich nicht auf Bereitstellungen mit nur einem Bot oder einmalige Bot-Antworten aus, die unter dem Budget bleiben.
Standardeinstellungen (aktiv, wenn allowBots festgelegt ist):
maxEventsPerWindow: 20-- das Bot-Paar kann innerhalb des gleitenden Zeitfensters 20 Nachrichten austauschenwindowSeconds: 60-- Länge des gleitenden ZeitfensterscooldownSeconds: 60-- sobald das Budget ausgelöst wird, wird jede weitere Bot-zu-Bot-Nachricht in beide Richtungen eine Minute lang verworfen
Konfigurieren Sie den gemeinsamen Standard einmal unter channels.defaults.botLoopProtection und überschreiben Sie ihn anschließend für Discord, wenn ein legitimer Arbeitsablauf mehr Spielraum benötigt. Die Rangfolge lautet:
channels.discord.accounts.<account>.botLoopProtectionchannels.discord.botLoopProtectionchannels.defaults.botLoopProtection- integrierte Standardwerte
Discord verwendet die generischen Schlüssel maxEventsPerWindow, windowSeconds und cooldownSeconds.
{channels: {defaults: { botLoopProtection: { maxEventsPerWindow: 20, windowSeconds: 60, cooldownSeconds: 60, },},discord: { // Optionale Discord-weite Überschreibung. Kontoblöcke überschreiben einzelne // Felder und übernehmen hier ausgelassene Felder. botLoopProtection: { maxEventsPerWindow: 4, }, accounts: { alpha: { // Alpha hört nur auf andere Bots, wenn diese ihn erwähnen. allowBots: "mentions", }, bravo: { // Bravo hört auf alle von Bots verfassten Discord-Nachrichten. allowBots: true, mentionAliases: { // Ermöglicht Bravo, eine Discord-Erwähnung von Alpha mit der konfigurierten Benutzer-ID zu schreiben. Alpha: "ALPHA_DISCORD_USER_ID", }, botLoopProtection: { // Bis zu fünf Nachrichten pro Minute zulassen, bevor das Paar unterdrückt wird. maxEventsPerWindow: 5, windowSeconds: 60, cooldownSeconds: 90, }, }, },},},}Voice-STT-Ausfälle mit DecryptionFailed(...)
- OpenClaw aktuell halten (
openclaw update), damit die Wiederherstellungslogik für den Discord-Sprachempfang vorhanden ist channels.discord.voice.daveEncryption=truebestätigen (Standard)- mit
channels.discord.voice.decryptionFailureTolerance=24beginnen (Upstream-Standard) und nur bei Bedarf anpassen - Protokolle auf Folgendes überwachen:
discord voice: DAVE decrypt failures detecteddiscord voice: repeated decrypt failures; attempting rejoin
- wenn die Fehler nach dem automatischen erneuten Beitritt weiterhin auftreten, Protokolle erfassen und mit dem Upstream-DAVE-Empfangsverlauf in discord.js #11419 und discord.js #11449 vergleichen
Konfigurationsreferenz
Primäre Referenz: Konfigurationsreferenz – Discord.
Wichtige Discord-Felder
- Start/Authentifizierung:
enabled,token,applicationId,accounts.*,allowBots - Richtlinie:
groupPolicy,dmPolicy,allowFrom,dm.*,guilds.*,guilds.*.channels.* - Befehl:
commands.native,commands.useAccessGroups(global),configWrites,slashCommand.ephemeral - Gateway:
proxy - Antwort/Verlauf:
replyToMode,historyLimit,dmHistoryLimit,dms.*.historyLimit - Zustellung:
textChunkLimit(Standard2000),maxLinesPerMessage(Standard17) - Streaming:
streaming.mode,streaming.chunkMode,streaming.preview.*,streaming.progress.*,streaming.block.*(veraltete flache SchlüsselstreamMode,draftChunk,blockStreaming,blockStreamingCoalesce,chunkModewerden durchopenclaw doctor --fixinstreaming.*migriert) - Medien:
mediaMaxMb(begrenzt ausgehende Discord-Uploads, Standard100) - Aktionen:
actions.* - Präsenz:
activity,status,activityType,activityUrl,autoPresence.* - Benutzeroberfläche:
ui.components.accentColor - Funktionen:
threadBindings,bindings[]auf oberster Ebene (type: "acp"),pluralkit,execApprovals,intents,agentComponents.enabled,agentComponents.ttlMs,activities,heartbeat,responsePrefix
Discord Activities
Legen Sie channels.discord.activities fest, damit Agenten eigenständige HTML-Widgets veröffentlichen können, die innerhalb von Discord geöffnet werden. Der Block ist optional; wenn er fehlt, registriert OpenClaw keine Activity-Routen, kein Tool und keinen Interaktionshandler. Unter Discord Activities finden Sie Informationen zur Einrichtung des Developer Portal, des Tunnels, der Sicherheit und der Fehlerbehebung.
activities.clientSecret: OAuth2-Client-Secret für die Discord-Anwendung; greift ersatzweise aufDISCORD_CLIENT_SECRETzurückactivities.applicationId: optionale Activity-Anwendungs-ID; standardmäßig wird die beim Gateway-Start ermittelte Bot-Anwendungs-ID verwendet
Sicherheit und Betrieb
- Behandeln Sie Bot-Tokens als Geheimnisse (
DISCORD_BOT_TOKENwird in überwachten Umgebungen bevorzugt). - Erteilen Sie Discord-Berechtigungen nach dem Prinzip der geringsten Rechte.
- Wenn die Befehlsbereitstellung oder der Befehlsstatus veraltet ist, starten Sie das Gateway neu und prüfen Sie erneut mit
openclaw channels status --probe.
Verwandte Themen
Interaktive HTML-Widgets innerhalb von Discord starten.
Einen Discord-Benutzer mit dem Gateway koppeln.
Verhalten von Gruppenchats und Zulassungslisten.
Eingehende Nachrichten an Agenten weiterleiten.
Bedrohungsmodell und Härtung.
Server und Kanäle Agenten zuordnen.
Verhalten nativer Befehle.