Mainstream messaging

Discord

OpenClaw verbindet sich über das offizielle Discord-Gateway als Bot mit Discord. DMs und Gildenkanäle werden unterstützt.

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:

    • bot
    • applications.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:

    1. User Settings (Zahnradsymbol) → DeveloperDeveloper Mode einschalten (auf Mobilgeräten: App SettingsAdvanced)
    2. Klicken Sie mit der rechten Maustaste auf Ihr ServersymbolCopy Server ID
    3. Klicken Sie mit der rechten Maustaste auf Ihren eigenen AvatarCopy 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 ServersymbolPrivacy SettingsDirect 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:

    bash
    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 gateway

    Wenn 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:

    json5
    {channels: {discord: {enabled: true,token: {source: "env",provider: "default",id: "DISCORD_BOT_TOKEN",},},},}

    Umgebungs-Fallback für das Standardkonto:

    bash
    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.

    json5
    {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: &lt;CODE&gt;

    CLI

    bash
    openclaw pairing list discordopenclaw pairing approve discord &lt;CODE&gt;

    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

    json5
    {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:

    json5
    {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>), wobei CommandTargetSessionKey weiterhin 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:

    bash
    openclaw message send --channel discord --target channel:<forumId> \  --message "Thementitel\nInhalt des Beitrags"

    Erstellen Sie explizit einen Forum-Thread:

    bash
    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/filePath bereit (einzelne Datei); verwenden Sie media-gallery fü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.modal mit bis zu 5 Feldern hinzu
    • Feldtypen: text, checkbox, radio, select, role-select, user-select
    • OpenClaw fügt automatisch eine Auslöseschaltfläche hinzu

    Beispiel:

    json5
    {  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 in allowFrom)
    • open (erfordert, dass channels.discord.allowFrom den 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.allowFrom gilt nur für das Konto default.
    • Für ein Konto hat allowFrom Vorrang vor dem veralteten dm.allowFrom.
    • Benannte Konten erben channels.discord.allowFrom, wenn sowohl ihr eigenes allowFrom als auch das veraltete dm.allowFrom nicht festgelegt sind.
    • Benannte Konten erben channels.discord.accounts.default.allowFrom nicht.

    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.

    json5
    {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.

    json5
    {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:

    json5
    {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:

    • open
    • allowlist
    • disabled

    Wenn channels.discord vorhanden ist, lautet die sichere Ausgangskonfiguration allowlist.

    Verhalten von allowlist:

    • Der Server muss mit channels.discord.guilds übereinstimmen (id bevorzugt, Slug akzeptiert)
    • optionale Absender-Zulassungslisten: users (stabile IDs empfohlen) und roles (nur Rollen-IDs); wenn eine der beiden konfiguriert ist, werden Absender zugelassen, wenn sie mit users ODER roles übereinstimmen
    • Der direkte Abgleich von Namen/Tags ist standardmäßig deaktiviert; aktivieren Sie channels.discord.dangerouslyAllowNameMatching: true nur als Notfall-Kompatibilitätsmodus
    • Namen/Tags werden für users unterstützt, IDs sind jedoch sicherer; openclaw security audit warnt, wenn Namens-/Tag-Einträge verwendet werden
    • Wenn für einen Server channels konfiguriert ist, werden nicht aufgeführte Kanäle abgelehnt
    • Wenn ein Server keinen channels-Block besitzt, sind alle Kanäle dieses zugelassenen Servers erlaubt

    Beispiel:

    json5
    {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, ersatzweise messages.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.

    json5
    {  bindings: [    {      agentId: "opus",      match: {        channel: "discord",        guildId: "123456789012345678",        roles: ["111111111111111111"],      },    },    {      agentId: "sonnet",      match: {        channel: "discord",        guildId: "123456789012345678",      },    },  ],}

    Native Befehle und Befehlsautorisierung

    • commands.native verwendet 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ücksichtigt
    • first: fügt die implizite native Antwortreferenz an die erste ausgehende Discord-Nachricht des Durchlaufs an
    • all: fügt sie an jede ausgehende Nachricht an
    • batched: 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:

    json5
    {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.

    json5
    {channels: {discord: {  streaming: {    mode: "progress",    progress: {      maxLines: 8,      maxLineChars: 120,      toolProgress: false,      commentary: false,    },  },},},}
    • off deaktiviert die Bearbeitung der Discord-Vorschau.
    • partial bearbeitet beim Eintreffen von Tokens eine einzelne Vorschaunachricht.
    • block gibt entwurfsgroße Blöcke aus; Größe und Umbruchpunkte lassen sich mit streaming.preview.chunk (minChars, maxChars, breakPreference) anpassen, begrenzt auf textChunkLimit. Wenn Block-Streaming ausdrücklich aktiviert ist, überspringt OpenClaw den Vorschau-Stream, um doppeltes Streaming zu vermeiden.
    • progress behä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.toolProgress verwendet im Modus partial/block standardmäßig true. Der Discord-Fortschrittsmodus zeigt standardmäßig keine Werkzeugzeilen an; legen Sie streaming.progress.toolProgress: true fest, um sie zu aktivieren.
    • Legen Sie streaming.progress.toolProgress: true fest, um kompakte Werkzeug-/Fortschrittszeilen wie 🛠️ Bash: run tests oder 🔎 Web Search: for "query" hinzuzufügen. Aus Kompatibilitätsgründen behält eine vorhandene Konfiguration mit progress.label oder progress.labels den bisherigen Standard für Werkzeugzeilen bei; legen Sie toolProgress: false fü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.maxLineChars steuert 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.commandText steuert Befehls-/Ausführungsdetails in kompakten Fortschrittszeilen: raw (Standard) oder status (nur Werkzeugbeschriftung).

    So blenden Sie rohen Befehls-/Ausführungstext aus und behalten gleichzeitig kompakte Fortschrittszeilen bei:

    json
    {  "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.historyLimit standardmäßig 20
    • Fallback: messages.groupChat.historyLimit
    • 0 deaktiviert

    Steuerung des DM-Verlaufs:

    • channels.discord.dmHistoryLimit
    • channels.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: false bleibt 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
    • /unfocus entfernt die Bindung des aktuellen Threads
    • /agents zeigt 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:

    json5
    {session: {threadBindings: {  enabled: true,  idleHours: 24,  maxAgeHours: 0,  spawnSessions: true,  defaultSpawnContext: "fork",},},}

    Hinweise:

    • session.threadBindings.* ist die kanonische Richtlinie für Discord und Telegram.
    • spawnSessions steuert das automatische Erstellen/Binden von Threads für sessions_spawn({ thread: true }) und ACP-Thread-Erstellungen. Standard: true.
    • defaultSpawnContext steuert den nativen Subagentenkontext für Thread-gebundene Erstellungen. Standard: "fork".
    • Veraltete Schlüssel spawnSubagentSessions/spawnAcpSessions werden durch openclaw doctor --fix migriert.
    • Wenn Thread-Bindungen deaktiviert sind, stehen /focus und 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.

    json5
    {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".

    json5
    {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 here bindet 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 /new und /reset dieselbe ACP-Sitzung direkt zurück. Temporäre Thread-Bindungen können die Zielauflösung überschreiben, solange sie aktiv sind.
    • spawnSessions steuert 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):

    • off
    • own (Standard)
    • all
    • allowlist (verwendet guilds.<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:

    json5
    {  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>.ackReaction
    • channels.discord.ackReaction
    • messages.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:

    json5
    {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.

    json5
    {channels: {discord: {  proxy: "http://proxy.example:8080",},},}

    Überschreibung pro Konto:

    json5
    {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:

    json5
    {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 allowBots sie 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.

    json5
    {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:

    json5
    {channels: {discord: {  status: "idle",},},}

    Aktivität (benutzerdefinierter Status ist der standardmäßige Aktivitätstyp, wenn activity festgelegt ist):

    json5
    {channels: {discord: {  activity: "Fokuszeit",  activityType: 4,},},}

    Streaming:

    json5
    {channels: {discord: {  activity: "Live-Programmierung",  activityType: 1,  activityUrl: "https://twitch.tv/openclaw",},},}

    Zuordnung der Aktivitätstypen:

    • 0: Spielt
    • 1: Streamt (erfordert activityUrl; activityUrl erfordert wiederum activityType: 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):

    json5
    {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.healthyText
    • autoPresence.degradedText
    • autoPresence.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.enabled
    • channels.discord.execApprovals.approvers (optional; greift nach Möglichkeit auf commands.ownerAllowFrom zurü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.accentColor legt die Akzentfarbe fest, die von Discord-Komponentencontainern verwendet wird (hexadezimal). Pro Konto: channels.discord.accounts.<id>.ui.components.accentColor.
    • channels.discord.agentComponents.ttlMs steuert, wie lange gesendete Callbacks von Discord-Komponenten registriert bleiben (Standardwert 1800000, Maximum 86400000). Pro Konto: channels.discord.accounts.<id>.agentComponents.ttlMs.
    • embeds werden ignoriert, wenn Components v2 vorhanden sind.
    • Einfache URL-Vorschauen werden standardmäßig unterdrückt. Legen Sie suppressEmbeds: false für eine Nachrichtenaktion fest, wenn ein einzelner ausgehender Link erweitert werden soll.

    Beispiel:

    json5
    {  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:

    1. Aktivieren Sie Message Content Intent im Discord Developer Portal.
    2. Aktivieren Sie Server Members Intent, wenn Zulassungslisten für Rollen oder Benutzer verwendet werden.
    3. Laden Sie den Bot mit den Bereichen bot und applications.commands ein.
    4. Gewähren Sie Connect, Speak, Send Messages und Read Message History im Zielsprachkanal.
    5. Aktivieren Sie native Befehle (commands.native oder channels.discord.commands.native).
    6. 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.

    bash
    /vc join channel:<voice-channel-id>/vc status/vc leave

    So prüfen Sie vor dem Beitritt die effektiven Berechtigungen des Bots:

    bash
    openclaw channels capabilities --channel discord --target channel:<voice-channel-id>

    Beispiel für automatischen Beitritt:

    json5
    {  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 vorhandenen channels.discord.voice-Block bei), um /vc-Befehle, die Sprachlaufzeit und den GuildVoiceStates-Gateway-Intent zu aktivieren. channels.discord.intents.voiceStates kann das Intent-Abonnement explizit überschreiben; lassen Sie die Einstellung ungesetzt, damit sie der effektiven Sprachaktivierung folgt.
    • voice.mode steuert den Konversationspfad. Der Standardwert ist agent-proxy: Ein Echtzeit-Sprach-Frontend verarbeitet den Zeitpunkt der Sprecherwechsel, Unterbrechungen und die Wiedergabe, delegiert inhaltliche Aufgaben über openclaw_agent_consult an den weitergeleiteten OpenClaw-Agenten und behandelt das Ergebnis wie eine von diesem Sprecher eingegebene Discord-Eingabeaufforderung. stt-tts behält den älteren Ablauf aus Batch-STT und TTS bei. bidi ermöglicht dem Echtzeitmodell, direkt zu kommunizieren, und stellt dabei openclaw_agent_consult für das OpenClaw-Gehirn bereit.
    • voice.agentSession steuert, 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 #maintainers fungiert.
    • 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 von voice.realtime.model.
    • voice.followUsers ermö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-proxy leitet Sprache über discord-voice weiter. Dabei bleiben die normalen Besitzer-/Tool-Autorisierungen für den Sprecher und die Zielsitzung erhalten, das Agenten-Tool tts wird jedoch ausgeblendet, da Discord-Sprache die Wiedergabe steuert. Standardmäßig gewährt agent-proxy der 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äßigen always-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 STT tools.media.audio; voice.model wirkt sich nicht auf die Transkription aus.
    • In Echtzeitmodi konfigurieren voice.realtime.provider, voice.realtime.model und voice.realtime.speakerVoice die Echtzeit-Audiositzung. Verwenden Sie für OpenAI Realtime 2.1 zusammen mit dem Codex-Gehirn voice.realtime.model: "gpt-realtime-2.1" und voice.model: "openai/gpt-5.6-sol".
    • Echtzeit-Sprachmodi nehmen standardmäßig kleine IDENTITY.md-, USER.md- und SOUL.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 Sie voice.realtime.bootstrapContextFiles auf eine Teilmenge, um dies anzupassen, oder [], um es zu deaktivieren. Nur diese Profildateien werden unterstützt; AGENTS.md verbleibt im normalen Agentenkontext. Der eingefügte Profilkontext ersetzt openclaw_agent_consult nicht für Arbeiten im Arbeitsbereich, aktuelle Fakten, Speicherabfragen oder Tool-gestützte Aktionen.
    • Im OpenAI-Echtzeitmodus agent-proxy passt 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 Sie voice.realtime.requireWakeName: true, um immer einen Aktivierungsnamen zu verlangen, oder false, um nie einen zu verlangen. Konfigurierte Aktivierungsnamen müssen aus einem oder zwei Wörtern bestehen. Wenn voice.realtime.wakeNames ungesetzt ist, verwendet OpenClaw name des weitergeleiteten Agenten zusammen mit OpenClaw und greift ersatzweise auf die Agenten-ID zusammen mit OpenClaw zurü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.bargeIn steuert, 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.minBargeInAudioEndMs steuert 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 Echo 0, oder erhöhen Sie den Wert für Lautsprecherkonfigurationen mit starkem Echo.
    • voice.tts überschreibt tts nur für die Sprachwiedergabe über stt-tts; Echtzeitmodi verwenden stattdessen voice.realtime.speakerVoice. Legen Sie für eine OpenAI-Stimme bei der Discord-Wiedergabe voice.tts.provider: "openai" fest und wählen Sie unter voice.tts.providers.openai.speakerVoice eine Text-to-Speech-Stimme aus. cedar ist beim aktuellen OpenAI-TTS-Modell eine gute männlich klingende Wahl.
    • Kanalspezifische Discord-Überschreibungen für systemPrompt gelten 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 in commands.ownerAllowFrom für den Besitzerstatus. Wenn kein Besitzer für Discord-Befehle konfiguriert ist, kann allowFrom (oder das ältere dm.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.autoJoin mehrere Einträge für dieselbe Guild enthält, tritt OpenClaw dem zuletzt konfigurierten Kanal dieser Guild bei.
    • voice.allowedChannels ist eine optionale Zulassungsliste für Aufenthaltsorte. Lassen Sie sie ungesetzt, damit /vc join jedem 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.daveEncryption und voice.decryptionFailureTolerance werden an die Beitrittsoptionen von @discordjs/voice durchgereicht; die Upstream-Standardwerte sind daveEncryption=true und decryptionFailureTolerance=24.
    • OpenClaw verwendet den mitgelieferten Codec libopus-wasm fü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.connectTimeoutMs steuert die anfängliche Wartezeit auf den @discordjs/voice-Status „Ready“ für /vc join und automatische Beitrittsversuche. Standard: 30000.
    • voice.reconnectGraceMs steuert, 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 Sie voice.realtime.bargeIn: true hinzu, wenn Discord-Ereignisse beim Sprechbeginn eine aktive Wiedergabe dennoch unterbrechen sollen. Die OpenAI-Echtzeit-Bridge ignoriert Wiedergabeabschneidungen, die kürzer als voice.realtime.minBargeInAudioEndMs sind, als wahrscheinliches Echo oder Rauschen und protokolliert sie als übersprungen, anstatt die Discord-Wiedergabe zu löschen.
    • voice.captureSilenceGraceMs steuert, 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 aborted sind 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 zeigen forced 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.

    json5
    {  channels: {    discord: {      voice: {        enabled: true,        followUsersEnabled: true,        followUsers: ["discord:123456789012345678"],        allowedChannels: [          {            guildId: "123456789012345678",            channelId: "234567890123456789",          },        ],      },    },  },}

    Verhalten:

    • followUsers akzeptiert rohe Discord-Benutzer-IDs und discord:<id>-Werte. OpenClaw normalisiert beide Formen vor dem Abgleich von Sprachstatusereignissen.
    • followUsersEnabled verwendet standardmäßig true, wenn followUsers konfiguriert ist. Setzen Sie den Wert auf false, um die gespeicherte Liste beizubehalten, aber das automatische Folgen in Sprachkanäle zu beenden.
    • followUsers steuert nur den Aufenthalt im Sprachkanal. Es gewährt weder Sprecherzugriff noch Eigentümerberechtigungen; konfigurieren Sie commands.ownerAllowFrom sowie 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.
    • allowedChannels gilt 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 allowedChannels verschoben 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 followUsers für persönliche oder Betreiberkonfigurationen, bei denen der Bot automatisch im Sprachkanal sein soll, wenn Sie es sind.
    • Verwenden Sie autoJoin für Bots in festen Räumen, die auch dann anwesend sein sollen, wenn sich kein erfasster Benutzer in einem Sprachkanal befindet.
    • Verwenden Sie /vc join fü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-wasm fü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.audio verarbeitet STT, zum Beispiel openai/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 tts ausblendet 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.tts wird über tts zusammengefü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:

    json5
    {  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:

    json5
    {  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:

    json5
    {  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:

    json5
    {  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" oder target: "user:123456789012345678" leitet über die entsprechende Direktnachrichtensitzung weiter.

    Beispiel für OpenAI Realtime bei starkem Echo:

    json5
    {  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=... und discord voice: realtime speaker turn closed ... chunks=... discordBytes=... realtimeBytes=... interruptedPlayback=...
    • Beim Überspringen veralteter Sprache: discord voice: realtime forced agent consult skipped reason=incomplete-transcript ... oder reason=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 von discord voice: realtime exact speech dequeued reason=player-idle ...
    • Bei der Erkennung einer Unterbrechung: discord voice: realtime barge-in detected source=speaker-start ... oder discord voice: realtime barge-in detected source=active-speaker-audio ..., gefolgt von discord voice: realtime barge-in requested reason=... outputAudioMs=... outputActive=...
    • Bei einer Echtzeitunterbrechung: discord voice: realtime model interrupt requested client:response.cancel reason=barge-in, gefolgt von discord voice: realtime model audio truncated client:conversation.item.truncate reason=barge-in audioEndMs=... oder discord 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:

    1. realtime audio playback started bedeutet, 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.
    2. realtime speaker turn opened kennzeichnet, dass ein Discord-Sprecher aktiv wird. Wenn die Wiedergabe bereits aktiv und bargeIn aktiviert ist, kann darauf barge-in detected source=speaker-start folgen.
    3. realtime input audio started kennzeichnet den ersten tatsächlich empfangenen Audioframe für diesen Sprecherdurchlauf. outputActive=true oder ein von null abweichender Wert für outputAudioMs bedeutet hier, dass das Mikrofon Eingaben sendet, während die Assistentenwiedergabe noch aktiv ist.
    4. barge-in detected source=active-speaker-audio bedeutet, 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.
    5. barge-in requested reason=... bedeutet, dass OpenClaw den Echtzeit-Provider angewiesen hat, die aktive Antwort abzubrechen oder zu kürzen. Der Eintrag enthält outputAudioMs, outputActive und playbackChunks, sodass Sie erkennen können, wie viel Assistentenaudio vor der Unterbrechung tatsächlich wiedergegeben wurde.
    6. 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-close oder session-close.
    7. realtime speaker turn closed fasst den aufgenommenen Eingabedurchlauf zusammen. chunks=0 oder hasAudio=false bedeutet, dass der Sprecherdurchlauf geöffnet wurde, aber kein verwertbares Audio die Echtzeitbrücke erreicht hat. interruptedPlayback=true bedeutet, 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 kleinen outputAudioMs und demselben Benutzer in der Nähe weist normalerweise darauf hin, dass ein Lautsprecherecho in das Mikrofon gelangt. Erhöhen Sie voice.realtime.minBargeInAudioEndMs, verringern Sie die Lautstärke des Lautsprechers, verwenden Sie Kopfhörer oder legen Sie voice.realtime.providers.openai.interruptResponseOnInputAudio: false fest.
    • source=speaker-start gefolgt von speaker turn closed ... hasAudio=false bedeutet, 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-close ohne ein zeitnahes Dazwischensprechen oder provider-clear-audio bedeutet, 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 Sie voice.realtime.bargeIn, wenn Sprache die Wiedergabe unterbrechen soll.
    • barge-in ignored ... outputActive=false bedeutet, 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.
    bash
    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 requireMention und Erwähnungsmuster überprüfen

    Nützliche Prüfungen:

    bash
    openclaw doctoropenclaw channels status --probeopenclaw logs --follow
    Erwähnung nicht erforderlich, aber weiterhin blockiert

    Häufige Ursachen:

    • groupPolicy="allowlist" ohne passende Server-/Kanal-Zulassungsliste
    • requireMention an der falschen Stelle konfiguriert (muss unter channels.discord.guilds oder 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 pairing auf 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 austauschen
    • windowSeconds: 60 -- Länge des gleitenden Zeitfensters
    • cooldownSeconds: 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>.botLoopProtection
    • channels.discord.botLoopProtection
    • channels.defaults.botLoopProtection
    • integrierte Standardwerte

    Discord verwendet die generischen Schlüssel maxEventsPerWindow, windowSeconds und cooldownSeconds.

    json5
    {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=true bestätigen (Standard)
    • mit channels.discord.voice.decryptionFailureTolerance=24 beginnen (Upstream-Standard) und nur bei Bedarf anpassen
    • Protokolle auf Folgendes überwachen:
      • discord voice: DAVE decrypt failures detected
      • discord 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 (Standard 2000), maxLinesPerMessage (Standard 17)
    • Streaming: streaming.mode, streaming.chunkMode, streaming.preview.*, streaming.progress.*, streaming.block.* (veraltete flache Schlüssel streamMode, draftChunk, blockStreaming, blockStreamingCoalesce, chunkMode werden durch openclaw doctor --fix in streaming.* migriert)
    • Medien: mediaMaxMb (begrenzt ausgehende Discord-Uploads, Standard 100)
    • 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 auf DISCORD_CLIENT_SECRET zurück
    • activities.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_TOKEN wird 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

    Was this useful?
    On this page

    On this page