Kopplung
Slash-Befehle
Fehlerbehebung für Kanäle
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
Privilegierte Intents aktivieren
- 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
Einladungs-URL erzeugen und den Bot Ihrem Server hinzufügen
botapplications.commands
- View Channels
- Send Messages
- Read Message History
- Embed Links
- Attach Files
- Add Reactions (optional)
Entwicklermodus aktivieren und IDs erfassen
- 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
DMs von Servermitgliedern zulassen
Bot-Token sicher festlegen (nicht im Chat senden)
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
- 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.“
Erste DM-Kopplung genehmigen
- Ihren Agenten fragen
- CLI
„Genehmigen Sie diesen Discord-Kopplungscode: <CODE>“
DISCORD_BOT_TOKEN wird nur für das Standardkonto verwendet.
Wenn zwei aktivierte Discord-Konten dasselbe Bot-Token auflösen, startet OpenClaw nur einen Gateway-Monitor für dieses Token: Ein aus der Konfiguration stammendes Token hat Vorrang vor dem Umgebungs-Fallback; andernfalls gewinnt das erste aktivierte Konto, und das doppelte Konto wird mit dem Grund duplicate bot token als deaktiviert gemeldet.
Bei erweiterten ausgehenden Aufrufen (Nachrichtenwerkzeug/Kanalaktionen) wird ein explizites token pro Aufruf für diesen Aufruf verwendet. Dies gilt für Sendeaktionen sowie Aktionen zum Lesen/Prüfen (Lesen/Suchen/Abrufen/Thread/Pins/Berechtigungen). Kontorichtlinien und Wiederholungseinstellungen stammen weiterhin aus dem ausgewählten Konto im aktiven Runtime-Snapshot.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
- Ihren Agenten fragen
- Konfiguration
„Fügen Sie meine Discord-Server-ID <server_id> zur Gilden-Zulassungsliste hinzu“
Antworten ohne @Erwähnung zulassen
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
- Konfiguration
„Erlauben Sie meinem Agenten, auf diesem Server zu antworten, ohne mit @ erwähnt werden zu müssen“
Speicher für Gildenkanäle einplanen
- Ihren Agenten fragen
- Manuell
„Wenn ich Fragen in Discord-Kanälen stelle, verwenden Sie memory_search oder memory_get, falls Sie langfristigen Kontext aus MEMORY.md benötigen.“
#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.
channel:<threadId>).
Interaktive Komponenten
OpenClaw unterstützt Container mit Discord-Komponenten v2 für Agentennachrichten. Verwenden Sie das Nachrichtenwerkzeug mit einercomponents-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
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
- 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
Zugriffskontrolle und Routing
- DM-Richtlinie
- Zugriffsgruppen
- Serverrichtlinie
- Erwähnungen und Gruppen-DMs
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
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.
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
allowFrom des Kontos aufgeführt sind, werden aus Kompatibilitätsgründen jedoch als Benutzer-DM-Ziele behandelt.Rollenbasiertes Agenten-Routing
Verwenden Siebindings[].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.
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).
Funktionsdetails
Linkvorschauen
Linkvorschauen
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
Live-Stream-Vorschau
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.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).
Verlauf, Kontext und Thread-Verhalten
Verlauf, Kontext und Thread-Verhalten
channels.discord.historyLimitstandardmäßig20- Fallback:
messages.groupChat.historyLimit 0deaktiviert
channels.discord.dmHistoryLimitchannels.discord.dms["<user_id>"].historyLimit
- 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.
Thread-gebundene Sitzungen für Subagenten
Thread-gebundene Sitzungen für Subagenten
/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
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.
Subagentenfortschritt in der Ausgangsnachricht
Subagentenfortschritt in der Ausgangsnachricht
channels.discord.subagentProgress: true fest, um Hintergrundaktivitäten untergeordneter Prozesse in der Discord-Nachricht anzuzeigen, die die übergeordnete Ausführung gestartet hat.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
Persistente ACP-Kanalbindungen
bindings[] mit type: "acp" und match.channel: "discord"./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.
Reaktionsbenachrichtigungen
Reaktionsbenachrichtigungen
guilds.<id>.reactionNotifications):offown(Standard)allallowlist(verwendetguilds.<id>.users)
Online-Präsenzereignisse
Online-Präsenzereignisse
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
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 ”👀”)
- Discord akzeptiert Unicode-Emoji oder Namen benutzerdefinierter Emoji.
- Verwenden Sie
"", um die Reaktion für einen Kanal oder ein Konto zu deaktivieren.
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)."group-mentions") löst keine Bestätigungsreaktionen in Direktnachrichten oder bei Umgebungsereignissen in Räumen aus. Um eine Bestätigungsreaktion auf eingehende Discord-Direktnachrichten und Ereignisse in ruhigen Räumen zu erhalten, setzen Sie messages.ackReactionScope auf "all".Konfigurationsschreibvorgänge
Konfigurationsschreibvorgänge
/config set|unset-Abläufe (wenn Befehlsfunktionen aktiviert sind).Deaktivieren:Gateway-Proxy
Gateway-Proxy
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.PluralKit-Unterstützung
PluralKit-Unterstützung
- 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
Aliasse für ausgehende Erwähnungen
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.Anwesenheitskonfiguration
Anwesenheitskonfiguration
activity festgelegt ist):- 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
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
Genehmigungen in Discord
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
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
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:
Components-v2-Benutzeroberfläche
OpenClaw verwendet Discord Components v2 für Ausführungsgenehmigungen und kontextübergreifende Markierungen. Discord-Nachrichtenaktionen können außerdemcomponents 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.
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.
/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.
- 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 Sievoice.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.
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.
- 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.
- 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.
- 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.
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:
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.
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
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.
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.
- 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.
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 jedochffmpeg 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.
Fehlerbehebung
Nicht zulässige Intents verwendet oder Bot sieht keine Servernachrichten
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
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
Erwähnung nicht erforderlich, aber weiterhin blockiert
Erwähnung nicht erforderlich, aber weiterhin blockiert
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
Lang laufende Discord-Durchläufe oder doppelte Antworten
Slow listener detected ...stuck session: sessionKey=agent:...:discord:... state=processing ...
Warnungen wegen Zeitüberschreitung beim Abrufen von Gateway-Metadaten
Warnungen wegen Zeitüberschreitung beim Abrufen von Gateway-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
Neustarts wegen Zeitüberschreitung bei Gateway READY
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
Abweichungen bei der Berechtigungsprüfung
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
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
Bot-zu-Bot-Schleifen
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
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
maxEventsPerWindow, windowSeconds und cooldownSeconds.Voice-STT-Ausfälle mit DecryptionFailed(...)
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
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 Siechannels.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.