Gateway
Konfiguration — Kanäle
Kanalspezifische Konfigurationsschlüssel unter channels.*: Zugriff auf Direktnachrichten und Gruppen, Setups mit mehreren Konten, Erwähnungsbeschränkung sowie kanalspezifische Schlüssel für Slack, Discord, Telegram, WhatsApp, Matrix, iMessage und andere Kanal-Plugins.
Informationen zu Agenten, Tools, der Gateway-Laufzeit und anderen Schlüsseln der obersten Ebene finden Sie in der Konfigurationsreferenz.
Kanäle
Jeder Kanal wird automatisch gestartet, sobald sein Konfigurationsabschnitt vorhanden ist (sofern nicht enabled: false festgelegt ist). Telegram und iMessage sind im zentralen openclaw-Paket enthalten. Andere offizielle Kanäle (Discord, Slack, WhatsApp, Matrix, Microsoft Teams, IRC, Google Chat, Signal, Mattermost und weitere) werden mit openclaw plugins install <spec> als separate Plugins installiert; die vollständige Liste und die Installationsspezifikationen finden Sie unter Kanäle.
Zugriff auf Direktnachrichten und Gruppen
Alle Kanäle unterstützen Richtlinien für Direktnachrichten und Gruppen:
| Direktnachrichtenrichtlinie | Verhalten |
|---|---|
pairing (Standard) |
Unbekannte Absender erhalten einen einmaligen Kopplungscode; der Eigentümer muss ihn genehmigen |
allowlist |
Nur Absender in allowFrom (oder im Speicher für gekoppelte zulässige Absender) |
open |
Alle eingehenden Direktnachrichten zulassen (erfordert allowFrom: ["*"]) |
disabled |
Alle eingehenden Direktnachrichten ignorieren |
| Gruppenrichtlinie | Verhalten |
|---|---|
allowlist (Standard) |
Nur Gruppen, die der konfigurierten Zulassungsliste entsprechen |
open |
Gruppenzulassungslisten umgehen (die Erwähnungsbeschränkung gilt weiterhin) |
disabled |
Alle Gruppen-/Raumnachrichten blockieren |
Kanalspezifische Modellüberschreibungen
Verwenden Sie channels.modelByChannel, um bestimmte Kanal-IDs oder Kommunikationspartner in Direktnachrichten an ein Modell zu binden. Als Werte werden provider/model oder konfigurierte Modellaliase akzeptiert. Die Kanalzuordnung gilt nur, wenn für eine Sitzung noch keine aktive Modellüberschreibung vorhanden ist (beispielsweise eine über /model festgelegte).
Bei Gruppen-/Thread-Unterhaltungen sind die Schlüssel kanalspezifische Gruppen-IDs, Themen-IDs oder Kanalnamen. Bei Direktnachrichten-Unterhaltungen sind die Schlüssel Kennungen der Kommunikationspartner, die aus der Absenderidentität des Kanals abgeleitet werden (nativeDirectUserId, origin.from, origin.to, OriginatingTo, From oder SenderId). Die genaue Form des Schlüssels hängt vom Kanal ab:
| Kanal | Form des Direktnachrichtenschlüssels | Beispiel |
|---|---|---|
| Discord | unverarbeitete Benutzer-ID | 987654321 |
| Feishu | feishu:ou_... |
feishu:ou_a8b6cab7e945387de5f253775d9b4d85 |
| Matrix | Matrix-Benutzer-ID | @user:matrix.org |
| Slack | user:U... |
user:U12345 |
| Telegram | unverarbeitete Benutzer-ID | 123456789 |
| Telefonnummer oder JID | 15551234567 |
{ channels: { modelByChannel: { discord: { "123456789012345678": "anthropic/claude-opus-4-6", }, slack: { C1234567890: "openai/gpt-5.6-sol", "user:U12345": "openai/gpt-5.4-mini", }, telegram: { "-1001234567890": "openai/gpt-5.4-mini", "-1001234567890:topic:99": "anthropic/claude-sonnet-4-6", "123456789": "openai/gpt-4.1", }, }, },}Direktnachrichtenspezifische Schlüssel stimmen nur in Direktnachrichten-Unterhaltungen überein; sie wirken sich nicht auf das Routing von Gruppen oder Threads aus.
Kanalstandardwerte und Heartbeat
Verwenden Sie channels.defaults für gemeinsame Gruppenrichtlinien und das Heartbeat-Verhalten über Provider hinweg:
{ channels: { defaults: { groupPolicy: "allowlist", // offen | Zulassungsliste | deaktiviert contextVisibility: "all", // alle | Zulassungsliste | Zulassungsliste_Zitat heartbeat: { showOk: false, showAlerts: true, useIndicator: true, }, }, },}channels.defaults.groupPolicy: Ersatz-Gruppenrichtlinie, wenngroupPolicyauf Provider-Ebene nicht festgelegt ist.channels.defaults.contextVisibility: Standardmodus für die Sichtbarkeit ergänzenden Kontexts für alle Kanäle. Werte:all(Standard, sämtlichen Kontext aus Zitaten, Threads und Verlauf einbeziehen),allowlist(nur Kontext von Absendern auf der Zulassungsliste einbeziehen),allowlist_quote(wie Zulassungsliste, aber expliziten Zitat-/Antwortkontext beibehalten). Kanalspezifische Überschreibung:channels.<channel>.contextVisibility.channels.defaults.heartbeat.showOk: Status fehlerfrei funktionierender Kanäle in die Heartbeat-Ausgabe einbeziehen (Standard:false).channels.defaults.heartbeat.showAlerts: Status beeinträchtigter/fehlerhafter Kanäle in die Heartbeat-Ausgabe einbeziehen (Standard:true).channels.defaults.heartbeat.useIndicator: kompakte Heartbeat-Ausgabe im Indikatorstil darstellen (Standard:true).
WhatsApp wird über den Webkanal des Gateways (Baileys Web) ausgeführt. Er startet automatisch, wenn eine verknüpfte Sitzung vorhanden ist.
{ web: { enabled: true, heartbeatSeconds: 60, whatsapp: { keepAliveIntervalMs: 25000, connectTimeoutMs: 60000, defaultQueryTimeoutMs: 60000, }, reconnect: { initialMs: 2000, maxMs: 30000, factor: 1.8, jitter: 0.25, maxAttempts: 12, // 0 = unbegrenzt erneut versuchen }, }, channels: { whatsapp: { dmPolicy: "pairing", // Kopplung | Zulassungsliste | offen | deaktiviert allowFrom: ["+15555550123", "+447700900123"], textChunkLimit: 4000, chunkMode: "length", // Länge | Zeilenumbruch mediaMaxMb: 50, sendReadReceipts: true, // blaue Häkchen (im Selbstchat-Modus false) groups: { "*": { requireMention: true }, }, groupPolicy: "allowlist", groupAllowFrom: ["+15551234567"], }, },}web.whatsapp.keepAliveIntervalMs(Standard:25000),connectTimeoutMs(Standard:60000) unddefaultQueryTimeoutMs(Standard:60000) passen den Baileys-Socket an.- Standardwerte für
web.reconnect:initialMs: 2000,maxMs: 30000,factor: 1.8,jitter: 0.25,maxAttempts: 12. MitmaxAttempts: 0werden Verbindungsversuche unbegrenzt fortgesetzt, statt aufzugeben. - Einträge in
bindings[]auf oberster Ebene mittype: "acp"konfigurieren persistente ACP-Bindungen für WhatsApp-Direktnachrichten und -Gruppen. Verwenden Sie inmatch.peer.ideine direkte Nummer im E.164-Format oder eine WhatsApp-Gruppen-JID. Die Feldsemantik wird unter ACP-Agenten gemeinsam beschrieben.
WhatsApp mit mehreren Konten
{channels: { whatsapp: { accounts: { default: {}, personal: {}, biz: { // authDir: "~/.openclaw/credentials/whatsapp/biz", }, }, },},}- Ausgehende Befehle verwenden standardmäßig das Konto
default, sofern vorhanden; andernfalls die erste konfigurierte Konto-ID (sortiert). - Optional überschreibt
channels.whatsapp.defaultAccountdiese standardmäßige Auswahl des Ausweichkontos, wenn der Wert einer konfigurierten Konto-ID entspricht. - Das veraltete Baileys-Authentifizierungsverzeichnis für ein einzelnes Konto wird durch
openclaw doctornachwhatsapp/defaultmigriert. - Kontospezifische Überschreibungen:
channels.whatsapp.accounts.<id>.sendReadReceipts,channels.whatsapp.accounts.<id>.dmPolicy,channels.whatsapp.accounts.<id>.allowFrom.
Telegram
{ channels: { telegram: { enabled: true, botToken: "your-bot-token", dmPolicy: "pairing", allowFrom: ["tg:123456789"], groups: { "*": { requireMention: true }, "-1001234567890": { allowFrom: ["@admin"], systemPrompt: "Antworten Sie kurz.", topics: { "99": { requireMention: false, skills: ["search"], systemPrompt: "Bleiben Sie beim Thema.", }, }, }, }, customCommands: [ { command: "backup", description: "Git-Sicherung" }, { command: "generate", description: "Ein Bild erstellen" }, ], historyLimit: 50, replyToMode: "first", // aus | erste | alle | gebündelt linkPreview: true, streaming: "partial", // aus | teilweise | Block | Fortschritt (Standard: teilweise) actions: { reactions: true, sendMessage: true }, reactionNotifications: "own", // aus | eigene | alle mediaMaxMb: 100, retry: { attempts: 3, minDelayMs: 400, maxDelayMs: 30000, jitter: 0.1, }, network: { autoSelectFamily: true, dnsResultOrder: "ipv4first", }, apiRoot: "https://api.telegram.org", trustedLocalFileRoots: ["/srv/telegram-bot-api-data"], proxy: "socks5://localhost:9050", webhookUrl: "https://example.com/telegram-webhook", webhookSecret: "secret", webhookPath: "/telegram-webhook", }, },}- Bot-Token:
channels.telegram.botTokenoderchannels.telegram.tokenFile(nur reguläre Dateien; symbolische Links werden abgelehnt), mitTELEGRAM_BOT_TOKENals Ausweichoption für das Standardkonto. apiRootist ausschließlich der Telegram-Bot-API-Stammpfad. Verwenden Siehttps://api.telegram.orgoder den Stammpfad Ihrer selbst gehosteten Instanz bzw. Ihres Proxys, nichthttps://api.telegram.org/bot<TOKEN>;openclaw doctor --fixentfernt ein versehentlich angehängtes Suffix/bot<TOKEN>.- Bei einem selbst gehosteten Bot-API-Server im Modus
--localführttrustedLocalFileRootsdie Hostpfade auf, die OpenClaw lesen darf. Binden Sie das Datenvolume des Servers auf dem OpenClaw-Host ein und konfigurieren Sie entweder dessen Datenstammpfad oder das tokenspezifische Verzeichnis; Containerpfade unter/var/lib/telegram-bot-apiwerden diesen Stammpfaden zugeordnet. Andere absolute Pfade werden weiterhin abgelehnt. - Optional überschreibt
channels.telegram.defaultAccountdie Auswahl des Standardkontos, wenn der Wert einer konfigurierten Konto-ID entspricht. - Legen Sie bei Konfigurationen mit mehreren Konten (2+ Konto-IDs) explizit ein Standardkonto fest (
channels.telegram.defaultAccountoderchannels.telegram.accounts.default), um eine Ausweichweiterleitung zu vermeiden;openclaw doctorwarnt, wenn diese Angabe fehlt oder ungültig ist. configWrites: falseblockiert von Telegram ausgelöste Konfigurationsänderungen (Migrationen von Supergruppen-IDs,/config set|unset).- Einträge der obersten Ebene in
bindings[]mittype: "acp"konfigurieren persistente ACP-Bindungen für Forenthemen (verwenden Sie die kanonische FormchatId:topic:topicIdinmatch.peer.id). Die Feldsemantik wird unter ACP-Agenten gemeinsam beschrieben. - Telegram-Streamvorschauen verwenden
sendMessage+editMessageText(funktioniert in Direkt- und Gruppenchats). network.dnsResultOrderist standardmäßig auf"ipv4first"gesetzt, um häufige IPv6-Abruffehler zu vermeiden.- Wiederholungsrichtlinie: siehe Wiederholungsrichtlinie.
Discord
{ channels: { discord: { enabled: true, token: "your-bot-token", mediaMaxMb: 100, allowBots: false, actions: { reactions: true, stickers: true, polls: true, permissions: true, messages: true, threads: true, pins: true, search: true, memberInfo: true, roleInfo: true, roles: false, channelInfo: true, voiceStatus: true, events: true, moderation: false, }, replyToMode: "off", // off | first | all | batched dmPolicy: "pairing", allowFrom: ["1234567890", "123456789012345678"], dm: { enabled: true, groupEnabled: false, groupChannels: ["openclaw-dm"] }, guilds: { "123456789012345678": { slug: "friends-of-openclaw", requireMention: false, ignoreOtherMentions: true, reactionNotifications: "own", users: ["987654321098765432"], channels: { general: { allow: true }, help: { allow: true, requireMention: true, users: ["987654321098765432"], skills: ["docs"], systemPrompt: "Nur kurze Antworten.", }, }, }, }, historyLimit: 20, textChunkLimit: 2000, suppressEmbeds: true, streaming: { mode: "progress", // off | partial | block | progress (Discord-Standard: progress) chunkMode: "length", // length | newline progress: { label: "auto", maxLines: 8, maxLineChars: 120, toolProgress: true, }, }, maxLinesPerMessage: 17, ui: { components: { accentColor: "#5865F2", }, }, threadBindings: { enabled: true, idleHours: 24, maxAgeHours: 0, spawnSessions: true, defaultSpawnContext: "fork", }, voice: { enabled: true, autoJoin: [ { guildId: "123456789012345678", channelId: "234567890123456789", }, ], daveEncryption: true, decryptionFailureTolerance: 24, connectTimeoutMs: 30000, reconnectGraceMs: 15000, tts: { provider: "openai", openai: { voice: "alloy" }, }, }, execApprovals: { enabled: "auto", // true | false | "auto" approvers: ["987654321098765432"], agentFilter: ["default"], sessionFilter: ["discord:"], target: "dm", // dm | channel | both cleanupAfterResolve: false, }, retry: { attempts: 3, minDelayMs: 500, maxDelayMs: 30000, jitter: 0.1, }, }, },}- Token:
channels.discord.token, mitDISCORD_BOT_TOKENals Rückfalloption für das Standardkonto. - Direkte ausgehende Aufrufe, die ein explizites Discord-
tokenangeben, verwenden dieses Token für den Aufruf; die Wiederholungs- und Richtlinieneinstellungen des Kontos stammen weiterhin aus dem ausgewählten Konto im aktiven Runtime-Snapshot. - Optional überschreibt
channels.discord.defaultAccountdie Auswahl des Standardkontos, wenn der Wert mit einer konfigurierten Konto-ID übereinstimmt. - Verwenden Sie
user:<id>(DM) oderchannel:<id>(Guild-Kanal) als Zustellziele; reine numerische IDs werden abgelehnt. - Guild-Slugs sind kleingeschrieben, wobei Leerzeichen durch
-ersetzt werden; Kanalschlüssel verwenden den als Slug formatierten Namen (ohne#). Bevorzugen Sie Guild-IDs. - Von Bots verfasste Nachrichten werden standardmäßig ignoriert.
allowBots: trueaktiviert sie; verwenden SieallowBots: "mentions", um nur Bot-Nachrichten zu akzeptieren, die den Bot erwähnen (eigene Nachrichten werden weiterhin herausgefiltert). - Kanäle, die eingehende, von Bots verfasste Nachrichten unterstützen, können den gemeinsamen Bot-Schleifenschutz verwenden. Legen Sie
channels.defaults.botLoopProtectionfür grundlegende Paarbudgets fest und überschreiben Sie anschließend den Kanal oder das Konto nur, wenn eine Oberfläche andere Grenzwerte benötigt. channels.discord.guilds.<id>.ignoreOtherMentions(und Kanalüberschreibungen) verwirft Nachrichten, die einen anderen Benutzer oder eine andere Rolle, aber nicht den Bot erwähnen (ausgenommen @everyone/@here).channels.discord.mentionAliasesordnet stabilen ausgehenden@handle-Text vor dem Senden Discord-Benutzer-IDs zu, sodass bekannte Teammitglieder auch dann deterministisch erwähnt werden können, wenn der temporäre Verzeichnis-Cache leer ist. Kontospezifische Überschreibungen befinden sich unterchannels.discord.accounts.<accountId>.mentionAliases.maxLinesPerMessage(Standardwert17) teilt hohe Nachrichten auch dann auf, wenn sie weniger als 2000 Zeichen enthalten.channels.discord.suppressEmbedsist standardmäßigtrue, sodass ausgehende URLs nicht als Discord-Linkvorschauen erweitert werden, sofern dies nicht deaktiviert wird. Expliziteembeds-Payloads werden weiterhin normal gesendet; Tool-Aufrufe pro Nachricht können dies mitsuppressEmbedsüberschreiben.channels.discord.threadBindingssteuert das an Discord-Threads gebundene Routing:enabled: Discord-Überschreibung für Funktionen Thread-gebundener Sitzungen (/focus,/unfocus,/agents,/session idle,/session max-agesowie gebundene Zustellung und gebundenes Routing)idleHours: Discord-Überschreibung für das automatische Aufheben des Fokus nach Inaktivität in Stunden (0deaktiviert die Funktion)maxAgeHours: Discord-Überschreibung für das feste Höchstalter in Stunden (0deaktiviert die Funktion)spawnSessions: Schalter fürsessions_spawn({ thread: true })und die automatische Thread-Erstellung und -Bindung beim ACP-Thread-Spawn (Standardwert:true)defaultSpawnContext: nativer Subagent-Kontext für Thread-gebundene Spawns (standardmäßig"fork")
- Einträge der obersten Ebene in
bindings[]mittype: "acp"konfigurieren persistente ACP-Bindungen für Kanäle und Threads (verwenden Sie die Kanal-/Thread-ID inmatch.peer.id). Die Feldsemantik wird unter ACP-Agenten gemeinsam beschrieben. channels.discord.ui.components.accentColorlegt die Akzentfarbe für Discord-Komponenten-v2-Container fest.channels.discord.agentComponents.ttlMssteuert, wie lange Callbacks gesendeter Discord-Komponenten registriert bleiben. Standardwert1800000(30 Minuten), maximal86400000(24 Stunden). Kontospezifische Überschreibungen befinden sich unterchannels.discord.accounts.<accountId>.agentComponents.ttlMs. Bevorzugen Sie die kürzeste TTL, die für den Workflow ausreicht.channels.discord.voiceaktiviert Unterhaltungen in Discord-Sprachkanälen sowie optionale Überschreibungen für automatischen Beitritt, LLM und TTS. Reine Textkonfigurationen für Discord lassen Sprache standardmäßig deaktiviert; legen Siechannels.discord.voice.enabled=truefest, um sie zu aktivieren.channels.discord.voice.modelüberschreibt optional das LLM-Modell, das für Antworten in Discord-Sprachkanälen verwendet wird.channels.discord.voice.daveEncryption(Standardwerttrue) undchannels.discord.voice.decryptionFailureTolerance(Standardwert24) werden an die DAVE-Optionen von@discordjs/voiceweitergegeben.channels.discord.voice.connectTimeoutMssteuert die anfängliche Wartezeit auf den Status Ready von@discordjs/voicefür/vc joinund Versuche des automatischen Beitritts (Standardwert30000).channels.discord.voice.reconnectGraceMssteuert, wie lange eine getrennte Sprachsitzung benötigen darf, um in die Signalisierung für die erneute Verbindung einzutreten, bevor OpenClaw sie beendet (Standardwert15000).- Die Discord-Sprachwiedergabe wird nicht durch das Ereignis unterbrochen, dass ein anderer Benutzer zu sprechen beginnt. Um Rückkopplungsschleifen zu vermeiden, ignoriert OpenClaw neue Sprachaufnahmen, während TTS wiedergegeben wird.
- OpenClaw versucht außerdem, den Sprachempfang wiederherzustellen, indem es nach wiederholten Entschlüsselungsfehlern eine Sprachsitzung verlässt und ihr erneut beitritt.
channels.discord.streamingist der kanonische Schlüssel für den Streaming-Modus. Discord verwendet standardmäßigstreaming.mode: "progress", sodass der Fortschritt von Tools und Arbeit in einer einzigen bearbeiteten Vorschaunachricht erscheint; legen Siestreaming.mode: "off"fest, um dies zu deaktivieren. Veraltete flache Schlüssel (streamMode,chunkMode,blockStreaming,draftChunk,blockStreamingCoalesce) werden zur Laufzeit nicht mehr gelesen; führen Sieopenclaw doctor --fixaus, um persistierte Konfigurationen zu migrieren.channels.discord.autoPresenceordnet die Runtime-Verfügbarkeit der Bot-Präsenz zu (fehlerfrei => online, beeinträchtigt => idle, erschöpft => dnd) und ermöglicht optionale Überschreibungen des Statustexts.channels.discord.dangerouslyAllowNameMatchingaktiviert den Abgleich veränderlicher Namen/Tags erneut (Notfall-Kompatibilitätsmodus).channels.discord.execApprovals: Discord-native Zustellung von Ausführungsgenehmigungen und Autorisierung der Genehmigenden.enabled:true,falseoder"auto"(Standardwert). Im automatischen Modus werden Ausführungsgenehmigungen aktiviert, wenn Genehmigende ausapproversodercommands.ownerAllowFromaufgelöst werden können.approvers: Discord-Benutzer-IDs, die Ausführungsanfragen genehmigen dürfen. Fällt aufcommands.ownerAllowFromzurück, wenn nicht angegeben.agentFilter: optionale Zulassungsliste für Agenten-IDs. Lassen Sie den Wert weg, um Genehmigungen für alle Agenten weiterzuleiten.sessionFilter: optionale Muster für Sitzungsschlüssel (Teilzeichenfolge oder regulärer Ausdruck).target: Ziel für Genehmigungsaufforderungen."dm"(Standardwert) sendet sie an die DMs der Genehmigenden,"channel"an den ursprünglichen Kanal und"both"an beide. Wenn das Ziel"channel"umfasst, können die Schaltflächen nur von aufgelösten Genehmigenden verwendet werden.cleanupAfterResolve: Wenntrue, werden Genehmigungs-DMs nach Genehmigung, Ablehnung oder Zeitüberschreitung gelöscht.
Modi für Reaktionsbenachrichtigungen: off (keine), own (Nachrichten des Bots, Standardwert), all (alle Nachrichten), allowlist (von guilds.<id>.users bei allen Nachrichten).
Google Chat
{ channels: { googlechat: { enabled: true, serviceAccountFile: "/path/to/service-account.json", audienceType: "app-url", // app-url | project-number audience: "https://gateway.example.com/googlechat", webhookPath: "/googlechat", botUser: "users/1234567890", dm: { enabled: true, policy: "pairing", allowFrom: ["users/1234567890"], }, groupPolicy: "allowlist", groups: { "spaces/AAAA": { allow: true, requireMention: true }, }, actions: { reactions: true }, typingIndicator: "message", mediaMaxMb: 20, }, },}- Dienstkonto-JSON: inline (
serviceAccount) oder dateibasiert (serviceAccountFile). - SecretRef für das Dienstkonto wird ebenfalls unterstützt (
serviceAccountRef). - Rückfalloptionen für Umgebungsvariablen:
GOOGLE_CHAT_SERVICE_ACCOUNToderGOOGLE_CHAT_SERVICE_ACCOUNT_FILE(nur Standardkonto). - Verwenden Sie
spaces/<spaceId>oderusers/<userId>als Zustellziele. channels.googlechat.dangerouslyAllowNameMatchingaktiviert den Abgleich veränderlicher E-Mail-Prinzipale erneut (Notfall-Kompatibilitätsmodus).
Slack
{ channels: { slack: { enabled: true, botToken: "xoxb-...", appToken: "xapp-...", socketMode: { clientPingTimeout: 15000, serverPingTimeout: 30000, pingPongLoggingEnabled: false, }, dmPolicy: "pairing", allowFrom: ["U123", "U456", "*"], dm: { enabled: true, groupEnabled: false, groupChannels: ["G123"] }, channels: { C123: { enabled: true, requireMention: true, allowBots: false }, "#general": { enabled: true, requireMention: true, allowBots: false, users: ["U123"], skills: ["docs"], systemPrompt: "Nur kurze Antworten.", }, }, historyLimit: 50, allowBots: false, reactionNotifications: "own", reactionAllowlist: ["U123"], replyToMode: "off", // off | first | all | batched thread: { historyScope: "thread", // thread | channel inheritParent: false, initialHistoryLimit: 20, }, actions: { reactions: true, messages: true, pins: true, memberInfo: true, emojiList: true, }, slashCommand: { enabled: true, name: "openclaw", sessionPrefix: "slack:slash", ephemeral: true, }, typingReaction: "hourglass_flowing_sand", unfurlLinks: false, unfurlMedia: false, textChunkLimit: 4000, streaming: { mode: "partial", // off | partial | block | progress chunkMode: "length", // length | newline nativeTransport: true, // native Streaming-API von Slack verwenden, wenn mode=partial }, mediaMaxMb: 20, execApprovals: { enabled: "auto", // true | false | "auto" approvers: ["U123"], agentFilter: ["default"], sessionFilter: ["slack:"], target: "dm", // dm | channel | both }, }, },}- Socket-Modus erfordert sowohl
botTokenals auchappToken(SLACK_BOT_TOKEN+SLACK_APP_TOKENfür den Umgebungsvariablen-Fallback des Standardkontos). - HTTP-Modus erfordert
botTokensowiesigningSecret(auf Stammebene oder pro Konto). enterpriseOrgInstall: truebindet ein Konto in den organisationsweiten Ereignispfad von Slack Enterprise Grid ein. Beim Start wird das Bot-Token mitauth.testüberprüft; der Start schlägt fehl, wenn der konfigurierte Modus nicht mit der Installationsidentität von Slack übereinstimmt. Enterprise-DMs müssen deaktiviert sein oderdmPolicy: "open"mit einem effektivenallowFrom: ["*"]verwenden. Kanal- und Benutzerrichtlinien müssen stabile Slack-IDs verwenden; veränderliche Namen und nicht unterstützte Kanalpräfixe führen dazu, dass der Start fehlschlägt. V1 verarbeitet nur direkte Socket-Mode- oder HTTP-Ereignisse vom Typmessageundapp_mentionmit unmittelbaren Antworten; Relay, Befehle, Interaktionen, App Home, Listener für Reaktionsereignisse, Pins, Aktionswerkzeuge, native Genehmigungen, Bindungen, verzögerte Zustellung und proaktive Sendungen sind nicht verfügbar. Listener-eigene Bestätigungen, Tippanzeigen und Statusreaktionen bleiben mitreactions:writeverfügbar; Benachrichtigungen über eingehende Reaktionen und Reaktionsaktionswerkzeuge sind nicht verfügbar. Unter Organisationsweite Installationen für Enterprise Grid finden Sie das Manifest mit den geringsten Berechtigungen, den Einrichtungsablauf und die vollständigen Einschränkungen.socketModeübergibt die Transporteinstellungen des Slack-SDK-Socket-Modus an die öffentliche Bolt-Receiver-API. Verwenden Sie dies nur zur Untersuchung von Ping-/Pong-Zeitüberschreitungen oder veraltetem WebSocket-Verhalten.clientPingTimeoutist standardmäßig15000;serverPingTimeoutundpingPongLoggingEnabledwerden nur übergeben, wenn sie konfiguriert sind.botToken,appToken,signingSecretunduserTokenakzeptieren Klartextzeichenfolgen oder SecretRef-Objekte.- Slack-Kontomomentaufnahmen stellen quell- und statusbezogene Felder pro
Anmeldedatenwert bereit, beispielsweise
botTokenSource,botTokenStatus,appTokenStatusund im HTTP-ModussigningSecretStatus.configured_unavailablebedeutet, dass das Konto über SecretRef konfiguriert ist, der aktuelle Befehls-/Laufzeitpfad den Geheimniswert jedoch nicht auflösen konnte. configWrites: falseblockiert von Slack initiierte Konfigurationsschreibvorgänge.- Das optionale
channels.slack.defaultAccountüberschreibt die Auswahl des Standardkontos, wenn es mit einer konfigurierten Konto-ID übereinstimmt. channels.slack.streaming.modeist der kanonische Schlüssel für den Slack-Stream-Modus (Standard:"partial").channels.slack.streaming.nativeTransportsteuert den nativen Streaming-Transport von Slack (Standard:true). Veraltete Werte fürstreamMode, den booleschen Wertstreaming,chunkMode,blockStreaming,blockStreamingCoalesceundnativeStreamingwerden zur Laufzeit nicht mehr gelesen; führen Sieopenclaw doctor --fixaus, um persistierte Konfigurationen zustreaming.{mode,chunkMode,block.enabled,block.coalesce,nativeTransport}zu migrieren.unfurlLinksundunfurlMediaübergeben die booleschen Slack-Werte vonchat.postMessagezum Aufklappen von Links und Medien für Bot-Antworten.unfurlLinksist standardmäßigfalse, sodass ausgehende Bot-Links nur bei Aktivierung inline aufgeklappt werden;unfurlMediawird ausgelassen, sofern es nicht konfiguriert ist. Legen Sie einen der Werte unterchannels.slack.accounts.<accountId>fest, um den Wert auf oberster Ebene für ein Konto zu überschreiben.- Verwenden Sie
user:<id>(DM) oderchannel:<id>als Zustellungsziele.
Modi für Reaktionsbenachrichtigungen: off, own (Standard), all, allowlist (aus reactionAllowlist).
Isolation von Thread-Sitzungen: thread.historyScope gilt pro Thread (Standard) oder wird kanalübergreifend geteilt. thread.inheritParent kopiert das Transkript des übergeordneten Kanals in neue Threads. thread.initialHistoryLimit (Standard: 20) begrenzt die Anzahl vorhandener Thread-Nachrichten, die beim Start einer neuen Thread-Sitzung abgerufen werden; 0 deaktiviert den Abruf des Thread-Verlaufs.
- Natives Slack-Streaming und der Slack-Assistentenstatus „is typing...“ für Threads erfordern einen Antwort-Thread als Ziel. DMs auf oberster Ebene bleiben standardmäßig außerhalb von Threads, sodass sie weiterhin über Slack-Entwurfsvorschauen mit Veröffentlichen und Bearbeiten streamen können, anstatt die native Stream-/Statusvorschau im Thread-Stil anzuzeigen.
typingReactionfügt der eingehenden Slack-Nachricht vorübergehend eine Reaktion hinzu, während eine Antwort ausgeführt wird, und entfernt sie nach Abschluss. Verwenden Sie einen Slack-Emoji-Kurzcode wie"hourglass_flowing_sand".channels.slack.execApprovals: Slack-native Zustellung an Genehmigungsclients und Autorisierung von Ausführungsgenehmigern. Dasselbe Schema wie bei Discord:enabled(true/false/"auto"),approvers(Slack-Benutzer-IDs),agentFilter,sessionFilterundtarget("dm","channel"oder"both"). Plugin-Genehmigungen können diesen nativen Clientpfad für von Slack stammende Anfragen verwenden, wenn Slack-Plugin-Genehmiger aufgelöst werden; die Slack-native Zustellung von Plugin-Genehmigungen kann außerdem überapprovals.pluginfür von Slack stammende Sitzungen oder Slack-Ziele aktiviert werden. Plugin-Genehmigungen verwenden Slack-Plugin-Genehmiger ausallowFromund das Standardrouting, nicht die Ausführungsgenehmiger.
| Aktionsgruppe | Standard | Hinweise |
|---|---|---|
| reactions | aktiviert | Reagieren + Reaktionen auflisten |
| messages | aktiviert | Lesen/senden/bearbeiten/löschen |
| pins | aktiviert | Anheften/lösen/auflisten |
| memberInfo | aktiviert | Mitgliedsinformationen |
| emojiList | aktiviert | Liste benutzerdefinierter Emojis |
Mattermost
Mattermost wird auf dieselbe Weise wie Discord, Slack und WhatsApp als separates Plugin installiert:
openclaw plugins install @openclaw/mattermostPrüfen Sie vor dem Festlegen einer Version die aktuellen Dist-Tags unter npmjs.com/package/@openclaw/mattermost.
{ channels: { mattermost: { enabled: true, botToken: "mm-token", baseUrl: "https://chat.example.com", dmPolicy: "pairing", chatmode: "oncall", // oncall | onmessage | onchar oncharPrefixes: [">", "!"], groups: { "*": { requireMention: true }, "team-channel-id": { requireMention: false }, }, commands: { native: true, // freiwillige Aktivierung nativeSkills: true, callbackPath: "/api/channels/mattermost/command", // Optionale explizite URL für Reverse-Proxy-/öffentliche Bereitstellungen callbackUrl: "https://gateway.example.com/api/channels/mattermost/command", }, textChunkLimit: 4000, chunkMode: "length", }, },}Chat-Modi: oncall (bei @-Erwähnung antworten, Standard), onmessage (jede Nachricht), onchar (Nachrichten, die mit einem Auslösepräfix beginnen).
Wenn native Mattermost-Befehle aktiviert sind:
commands.callbackPathmuss ein Pfad sein (beispielsweise/api/channels/mattermost/command), keine vollständige URL.commands.callbackUrlmuss zum OpenClaw-Gateway-Endpunkt aufgelöst werden und vom Mattermost-Server aus erreichbar sein.- Native Slash-Callbacks werden mit den befehlsspezifischen Tokens authentifiziert,
die Mattermost bei der Registrierung von Slash-Befehlen zurückgibt. Wenn die
Registrierung fehlschlägt oder keine Befehle aktiviert werden, lehnt OpenClaw
Callbacks mit
Unauthorized: invalid command token.ab. - Bei privaten/Tailnet-/internen Callback-Hosts kann Mattermost verlangen, dass
ServiceSettings.AllowedUntrustedInternalConnectionsden Callback-Host bzw. die Callback-Domain enthält. Verwenden Sie Host-/Domainwerte, keine vollständigen URLs. channels.mattermost.configWrites: Von Mattermost initiierte Konfigurationsschreibvorgänge zulassen oder verweigern.channels.mattermost.requireMention: Vor Antworten in Kanälen eine@mentionverlangen.channels.mattermost.groups.<channelId>.requireMention: Kanalspezifische Überschreibung der Erwähnungsanforderung ("*"als Standard).- Das optionale
channels.mattermost.defaultAccountüberschreibt die Auswahl des Standardkontos, wenn es mit einer konfigurierten Konto-ID übereinstimmt.
Signal
{ channels: { signal: { enabled: true, account: "+15555550123", // optionale Kontobindung dmPolicy: "pairing", allowFrom: ["+15551234567", "uuid:123e4567-e89b-12d3-a456-426614174000"], configWrites: true, reactionNotifications: "own", // off | own | all | allowlist reactionAllowlist: ["+15551234567", "uuid:123e4567-e89b-12d3-a456-426614174000"], historyLimit: 50, }, },}Modi für Reaktionsbenachrichtigungen: off, own (Standard), all, allowlist (aus reactionAllowlist).
channels.signal.account: Den Kanalstart an eine bestimmte Signal-Kontoidentität binden.channels.signal.configWrites: Von Signal initiierte Konfigurationsschreibvorgänge zulassen oder verweigern.- Das optionale
channels.signal.defaultAccountüberschreibt die Auswahl des Standardkontos, wenn es mit einer konfigurierten Konto-ID übereinstimmt.
iMessage
OpenClaw startet imsg rpc (JSON-RPC über stdio). Es ist kein Daemon oder Port erforderlich. Dies ist der bevorzugte Pfad für neue OpenClaw-iMessage-Einrichtungen, wenn der Host Berechtigungen für die Messages-Datenbank und Automation erteilen kann.
Die Unterstützung für BlueBubbles wurde entfernt. channels.bluebubbles ist in der aktuellen OpenClaw-Version keine unterstützte Laufzeitkonfigurationsoberfläche. Migrieren Sie alte Konfigurationen zu channels.imessage; eine Kurzfassung finden Sie unter Entfernung von BlueBubbles und der imsg-iMessage-Pfad, die vollständige Übersetzungstabelle unter Umstieg von BlueBubbles.
Wenn der Gateway nicht auf dem bei Messages angemeldeten Mac ausgeführt wird, behalten Sie channels.imessage.enabled=true bei und setzen Sie channels.imessage.cliPath auf einen SSH-Wrapper, der imsg "$@" auf diesem Mac ausführt. Der lokale Standardpfad für imsg ist ausschließlich unter macOS verfügbar.
Bevor Sie sich für produktive Sendungen auf einen SSH-Wrapper verlassen, überprüfen Sie einen ausgehenden imsg send über genau diesen Wrapper. In einigen macOS-TCC-Zuständen wird die Messages-Automatisierung /usr/libexec/sshd-keygen-wrapper zugewiesen, wodurch Lesevorgänge und Prüfungen funktionieren können, während Sendungen mit dem AppleEvents-Fehler -1743 fehlschlagen; lesen Sie dazu den Abschnitt zur Fehlerbehebung für SSH-Wrapper unter iMessage.
{ channels: { imessage: { enabled: true, cliPath: "imsg", dbPath: "~/Library/Messages/chat.db", remoteHost: "user@gateway-host", dmPolicy: "pairing", allowFrom: ["+15555550123", "user@example.com", "chat_id:123"], historyLimit: 50, includeAttachments: false, attachmentRoots: ["/Users/*/Library/Messages/Attachments"], remoteAttachmentRoots: ["/Users/*/Library/Messages/Attachments"], mediaMaxMb: 16, service: "auto", sendTransport: "auto", region: "US", actions: { reactions: true, edit: true, unsend: true, reply: true, sendWithEffect: true, sendAttachment: true, }, }, },}- Das optionale
channels.imessage.defaultAccountüberschreibt die standardmäßige Kontoauswahl, wenn es mit einer konfigurierten Konto-ID übereinstimmt. - Erfordert vollständigen Festplattenzugriff auf die Messages-Datenbank.
- Bevorzugen Sie Ziele im Format
chat_id:<id>. Verwenden Sieimsg chats --limit 20, um Chats aufzulisten. cliPathkann auf einen SSH-Wrapper verweisen; legen SieremoteHost(hostoderuser@host) für den Abruf von Anhängen per SCP fest.attachmentRootsundremoteAttachmentRootsbeschränken die Pfade eingehender Anhänge (Standard:/Users/*/Library/Messages/Attachments).- SCP verwendet eine strikte Hostschlüsselprüfung. Stellen Sie daher sicher, dass der Hostschlüssel des Relay-Hosts bereits in
~/.ssh/known_hostsvorhanden ist. channels.imessage.configWrites: durch iMessage initiierte Konfigurationsänderungen zulassen oder verweigern.channels.imessage.sendTransport: bevorzugterimsg-RPC-Sendetransport für normale ausgehende Antworten.auto(Standard) verwendet für bestehende Chats die IMCore-Bridge, wenn sie ausgeführt wird, und greift anschließend auf AppleScript zurück;bridgeerfordert die Zustellung über eine private API;applescripterzwingt den öffentlichen Messages-Automatisierungspfad.channels.imessage.actions.*: aktiviert Aktionen der privaten API, die zusätzlich durchimsg status/openclaw channels status --probeeingeschränkt werden.channels.imessage.includeAttachmentsist standardmäßig deaktiviert; setzen Sie es auftrue, bevor Sie eingehende Medien in Agent-Durchläufen erwarten.- Die Wiederherstellung eingehender Nachrichten nach einem Neustart der Bridge/des Gateways erfolgt automatisch (GUID-Deduplizierung sowie eine Altersgrenze für veraltete Rückstände). Bestehende Konfigurationen mit
channels.imessage.catchup.enabled: truewerden weiterhin als veraltetes Kompatibilitätsprofil berücksichtigt;catchupist standardmäßig deaktiviert. channels.imessage.groups: Gruppenregister und gruppenspezifische Einstellungen. Konfigurieren Sie beigroupPolicy: "allowlist"entweder explizitechat_id-Schlüssel oder einen Platzhaltereintrag"*", damit Gruppennachrichten die Registerprüfung passieren können.- Einträge der obersten Ebene in
bindings[]mittype: "acp"können iMessage-Unterhaltungen an persistente ACP-Sitzungen binden. Verwenden Sie inmatch.peer.idein normalisiertes Handle oder ein explizites Chat-Ziel (chat_id:*,chat_guid:*,chat_identifier:*). Gemeinsame Feldsemantik: ACP-Agenten.
Beispiel für einen iMessage-SSH-Wrapper
#!/usr/bin/env bashexec ssh -T gateway-host imsg "$@"Matrix
Matrix wird durch ein Plugin bereitgestellt und unter channels.matrix konfiguriert.
{ channels: { matrix: { enabled: true, homeserver: "https://matrix.example.org", accessToken: "syt_bot_xxx", proxy: "http://127.0.0.1:7890", encryption: true, initialSyncLimit: 20, defaultAccount: "ops", accounts: { ops: { name: "Ops", userId: "@ops:example.org", accessToken: "syt_ops_xxx", }, alerts: { userId: "@alerts:example.org", password: "secret", proxy: "http://127.0.0.1:7891", }, }, }, },}- Die Token-Authentifizierung verwendet
accessToken; die Passwortauthentifizierung verwendetuserId+password. channels.matrix.proxyleitet den Matrix-HTTP-Datenverkehr über einen expliziten HTTP(S)-Proxy. Benannte Konten können dies mitchannels.matrix.accounts.<id>.proxyüberschreiben.channels.matrix.network.dangerouslyAllowPrivateNetworkerlaubt private/interne Homeserver.proxyund diese Netzwerkfreigabe sind voneinander unabhängige Steuerelemente.channels.matrix.defaultAccountwählt das bevorzugte Konto in Konfigurationen mit mehreren Konten aus.channels.matrix.autoJoinist standardmäßig"off". Daher werden Einladungen zu Räumen und neue DM-ähnliche Einladungen ignoriert, bis SieautoJoin: "allowlist"mitautoJoinAllowlistoderautoJoin: "always"festlegen.channels.matrix.execApprovals: Matrix-native Zustellung von Ausführungsgenehmigungen und Autorisierung der Genehmigenden.enabled:true,falseoder"auto"(Standard). Im automatischen Modus werden Ausführungsgenehmigungen aktiviert, wenn Genehmigende überapproversodercommands.ownerAllowFromermittelt werden können.approvers: Matrix-Benutzer-IDs (z. B.@owner:example.org), die Ausführungsanfragen genehmigen dürfen.agentFilter: optionale Zulassungsliste für Agent-IDs. Lassen Sie diese Option weg, um Genehmigungen für alle Agenten weiterzuleiten.sessionFilter: optionale Muster für Sitzungsschlüssel (Teilzeichenfolge oder regulärer Ausdruck).target: Ziel für Genehmigungsaufforderungen."dm"(Standard),"channel"(ursprünglicher Raum) oder"both".- Kontospezifische Überschreibungen:
channels.matrix.accounts.<id>.execApprovals.
channels.matrix.dm.sessionScopesteuert, wie Matrix-Direktnachrichten zu Sitzungen gruppiert werden:per-user(Standard) verwendet eine gemeinsame Sitzung pro weitergeleitetem Kommunikationspartner, währendper-roomjeden Direktnachrichtenraum isoliert.- Matrix-Statusprüfungen und Live-Verzeichnissuchen verwenden dieselbe Proxy-Richtlinie wie der Laufzeitdatenverkehr.
- Die vollständige Matrix-Konfiguration, Zieladressierungsregeln und Einrichtungsbeispiele sind unter Matrix dokumentiert.
Microsoft Teams
Microsoft Teams wird durch ein Plugin bereitgestellt und unter channels.msteams konfiguriert.
{ channels: { msteams: { enabled: true, configWrites: true, // appId, appPassword, tenantId, webhook, team/channel policies: // siehe /channels/msteams }, },}- Hier behandelte zentrale Schlüsselpfade:
channels.msteams,channels.msteams.configWrites. - Die vollständige Teams-Konfiguration (Anmeldedaten, Webhook, Direktnachrichten-/Gruppenrichtlinie sowie team- und kanalspezifische Überschreibungen) ist unter Microsoft Teams dokumentiert.
IRC
IRC wird durch ein Plugin bereitgestellt und unter channels.irc konfiguriert.
{ channels: { irc: { enabled: true, dmPolicy: "pairing", configWrites: true, nickserv: { enabled: true, service: "NickServ", password: "${IRC_NICKSERV_PASSWORD}", register: false, registerEmail: "bot@example.com", }, }, },}- Hier behandelte zentrale Schlüsselpfade:
channels.irc,channels.irc.dmPolicy,channels.irc.configWrites,channels.irc.nickserv.*. - Das optionale
channels.irc.defaultAccountüberschreibt die standardmäßige Kontoauswahl, wenn es mit einer konfigurierten Konto-ID übereinstimmt. - Die vollständige IRC-Kanalkonfiguration (Host/Port/TLS/Kanäle/Zulassungslisten/Erwähnungsprüfung) ist unter IRC dokumentiert.
Mehrere Konten (alle Kanäle)
Führen Sie mehrere Konten pro Kanal aus (jeweils mit eigener accountId):
{ channels: { telegram: { accounts: { default: { name: "Primary bot", botToken: "123456:ABC...", }, alerts: { name: "Alerts bot", botToken: "987654:XYZ...", }, }, }, },}defaultwird verwendet, wennaccountIdweggelassen wird (CLI + Routing).- Umgebungsvariablen-Token gelten nur für das Standardkonto.
- Die Basiseinstellungen des Kanals gelten für alle Konten, sofern sie nicht pro Konto überschrieben werden.
- Verwenden Sie
bindings[].match.accountId, um jedes Konto an einen anderen Agenten weiterzuleiten. - Wenn Sie über
openclaw channels add(oder die Kanaleinrichtung) ein Konto hinzufügen, das nicht das Standardkonto ist, während weiterhin eine Kanalkonfiguration der obersten Ebene mit nur einem Konto verwendet wird, verschiebt OpenClaw zunächst die kontospezifischen Einzelkontowerte der obersten Ebene in die Kontozuordnung des Kanals, damit das ursprüngliche Konto weiterhin funktioniert. Die meisten Kanäle verschieben sie nachchannels.<channel>.accounts.default; Matrix kann stattdessen ein vorhandenes übereinstimmendes benanntes/standardmäßiges Ziel beibehalten. - Bestehende kanalweite Bindungen (ohne
accountId) stimmen weiterhin mit dem Standardkonto überein; kontospezifische Bindungen bleiben optional. openclaw doctor --fixrepariert auch gemischte Strukturen, indem kontospezifische Einzelkontowerte der obersten Ebene in das für diesen Kanal ausgewählte hochgestufte Konto verschoben werden. Die meisten Kanäle verwendenaccounts.default; Matrix kann stattdessen ein vorhandenes übereinstimmendes benanntes/standardmäßiges Ziel beibehalten.
Weitere Plugin-Kanäle
Viele Plugin-Kanäle werden als channels.<id> konfiguriert und auf ihren jeweiligen Kanalseiten dokumentiert (beispielsweise Feishu, LINE, Nextcloud Talk, Nostr, QQ Bot, Synology Chat, Twitch und Zalo).
Den vollständigen Kanalindex finden Sie unter: Kanäle.
Erwähnungsprüfung in Gruppenchats
Gruppennachrichten erfordern standardmäßig eine Erwähnung (Metadaten-Erwähnung oder sichere Regex-Muster). Dies gilt für Gruppenchats in WhatsApp, Telegram, Discord, Google Chat und iMessage.
Sichtbare Antworten werden separat gesteuert. Normale direkte Anfragen in Gruppen, Kanälen und dem internen WebChat verwenden standardmäßig die automatische endgültige Zustellung: Der endgültige Assistententext wird über den bisherigen Pfad für sichtbare Antworten veröffentlicht. Aktivieren Sie messages.visibleReplies: "message_tool" oder messages.groupChat.visibleReplies: "message_tool", wenn sichtbare Ausgaben erst veröffentlicht werden sollen, nachdem der Agent message(action=send) aufgerufen hat. Wenn das Modell in einem aktivierten Nur-Tool-Modus eine inhaltlich gehaltvolle endgültige Antwort zurückgibt, ohne das Nachrichtenwerkzeug aufzurufen, bleibt dieser endgültige Text privat, das ausführliche Gateway-Protokoll zeichnet Metadaten zur unterdrückten Nutzlast auf und OpenClaw stellt einen Wiederherstellungsversuch in die Warteschlange, der das Modell auffordert, dieselbe Antwort über message(action=send) zuzustellen.
Nur über Tools sichtbare Antworten erfordern ein Modell/eine Laufzeit, das bzw. die Tools zuverlässig aufruft, und werden für gemeinsam genutzte Umgebungsräume auf Modellen der neuesten Generation wie GPT-5.6 Sol empfohlen. Einige schwächere Modelle können endgültigen Text ausgeben, verstehen jedoch nicht, dass für die Quelle sichtbare Ausgaben mit message(action=send) gesendet werden müssen. OpenClaw stellt den häufigen Fall einer nicht zugestellten endgültigen Antwort standardmäßig nur dann wieder her, wenn die endgültige Antwort inhaltlich gehaltvoll ist, der Quelldurchlauf kein Raumereignis war, die Senderichtlinie die Zustellung nicht verweigert hat und noch keine Antwort an die Quelle gesendet wurde. Die Wiederherstellung ist auf einen Versuch begrenzt; sie unterdrückt die Persistierung der synthetischen Wiederholungsaufforderung und schließt diesen Versuch von der Sammelverarbeitung aus, sodass er nicht mit unabhängigen Aufforderungen in der Warteschlange zusammengeführt werden kann. Wenn auch der Wiederholungsversuch nicht zugestellt oder nicht in die Warteschlange aufgenommen werden kann, liefert OpenClaw nur eine bereinigte Diagnose wie „Ich habe eine Antwort erstellt, konnte sie aber nicht an diesen Chat zustellen. Bitte versuchen Sie es erneut.“ Der ursprüngliche private endgültige Text wird niemals für eine automatische Zustellung an die Quelle markiert. Verwenden Sie für Modelle, bei denen Antworten wiederholt nicht zugestellt werden, "automatic", damit der endgültige Assistentendurchlauf als Pfad für sichtbare Antworten dient, wechseln Sie zu einem leistungsfähigeren Modell mit Tool-Aufrufen, prüfen Sie das ausführliche Gateway-Protokoll auf die Zusammenfassung der unterdrückten Nutzlast oder legen Sie messages.groupChat.visibleReplies: "automatic" fest, um für jede Gruppen-/Kanalanfrage sichtbare endgültige Antworten zu verwenden.
Wenn das Nachrichtenwerkzeug gemäß der aktiven Tool-Richtlinie nicht verfügbar ist, greift OpenClaw auf automatische sichtbare Antworten zurück, anstatt die Antwort stillschweigend zu unterdrücken. openclaw doctor warnt vor dieser Abweichung.
Diese Regel gilt für den normalen endgültigen Text des Agenten. Plugin-eigene Unterhaltungsbindungen verwenden bei beanspruchten Durchläufen gebundener Threads die vom zuständigen Plugin zurückgegebene Antwort als sichtbare Antwort; das Plugin muss für diese Bindungsantworten nicht message(action=send) aufrufen.
Fehlerbehebung: Eine @Erwähnung in einer Gruppe löst die Tippanzeige aus, danach folgt Stille (kein Fehler)
Symptom: Eine @Erwähnung in einer Gruppe/einem Kanal zeigt die Tippanzeige an und das Gateway-Protokoll meldet dispatch complete (queuedFinal=false, replies=0), aber im Raum erscheint keine Nachricht. Direktnachrichten an denselben Agenten werden normal beantwortet.
Ursache: Der Modus für sichtbare Antworten der Gruppe/des Kanals wird als "message_tool" aufgelöst. OpenClaw führt den Durchlauf daher aus, unterdrückt jedoch den endgültigen Assistententext, sofern der Agent nicht message(action=send) aufruft. In diesem Modus gibt es keinen NO_REPLY-Vertrag; ohne Aufruf des Nachrichtenwerkzeugs bleibt der ursprüngliche endgültige Text privat. Für inhaltlich gehaltvolle Quelldurchläufe versucht OpenClaw nun einen abgesicherten Wiederherstellungsversuch; kurze Hinweise, ausdrücklich gewünschtes Schweigen, Raumereignisse, durch die Senderichtlinie verweigerte Durchläufe und bereits zugestellte Durchläufe werden nicht erneut versucht. Normale Gruppen- und Kanaldurchläufe verwenden standardmäßig "automatic". Dieses Symptom tritt daher nur auf, wenn messages.groupChat.visibleReplies (oder das globale messages.visibleReplies) explizit auf "message_tool" gesetzt ist. defaultVisibleReplies des Testsystems gilt hier nicht — die Gruppen-/Kanalauflösung ignoriert diese Einstellung; sie wirkt sich nur auf direkte/Quellchats aus (das Codex-Testsystem unterdrückt auf diese Weise endgültige Antworten in direkten Chats).
Fehlerbehebung: Wählen Sie entweder ein leistungsfähigeres Modell für Tool-Aufrufe, entfernen Sie die explizite Überschreibung "message_tool", um auf den Standardwert "automatic" zurückzufallen, oder setzen Sie messages.groupChat.visibleReplies: "automatic", um sichtbare Antworten für jede Gruppen-/Kanalanfrage zu erzwingen. Ein inhaltlich relevantes, nicht zugestelltes Endergebnis sollte nicht mehr als stiller Erfolg enden; stattdessen sollte entweder eine Wiederherstellung durch einen erneuten message(action=send)-Versuch erfolgen oder die bereinigte Diagnose des Zustellungsfehlers angezeigt werden. Der Gateway lädt die messages-Konfiguration nach dem Speichern der Datei zur Laufzeit neu; starten Sie den Gateway nur neu, wenn die Dateiüberwachung oder das Neuladen der Konfiguration in der Bereitstellung deaktiviert ist.
Erwähnungstypen:
- Metadaten-Erwähnungen: Native @-Erwähnungen der Plattform. Werden im WhatsApp-Selbstchat-Modus ignoriert.
- Textmuster: Sichere reguläre Ausdrücke in
agents.list[].groupChat.mentionPatterns. Ungültige Muster und unsichere verschachtelte Wiederholungen werden ignoriert. - Die Erwähnungsbeschränkung wird nur durchgesetzt, wenn eine Erkennung möglich ist (native Erwähnungen oder mindestens ein Muster).
{ messages: { visibleReplies: "automatic", // alte automatische Endantworten für Direkt-/Quellchats erzwingen groupChat: { historyLimit: 50, unmentionedInbound: "room_event", // dauerhaft aktives, nicht erwähnendes Raumgespräch wird zu stillem Kontext visibleReplies: "message_tool", // Opt-in; message(action=send) für sichtbare Raumantworten voraussetzen }, }, agents: { list: [{ id: "main", groupChat: { mentionPatterns: ["@openclaw", "openclaw"] } }], },}messages.groupChat.historyLimit legt den globalen Standardwert fest. Kanäle können ihn mit channels.<channel>.historyLimit (oder pro Konto) überschreiben. Setzen Sie ihn zum Deaktivieren auf 0.
messages.groupChat.unmentionedInbound: "room_event" übermittelt nicht erwähnende Nachrichten aus dauerhaft aktiven Gruppen/Kanälen auf unterstützten Kanälen als stillen Raumkontext. Nachrichten mit Erwähnungen, Befehle und Direktnachrichten bleiben Benutzeranfragen. Vollständige Beispiele für Discord, Slack und Telegram finden Sie unter Umgebungsbezogene Raumereignisse.
messages.visibleReplies ist der globale Standardwert für Quellereignisse; messages.groupChat.visibleReplies überschreibt ihn für Quellereignisse aus Gruppen/Kanälen. Wenn messages.visibleReplies nicht gesetzt ist, verwenden Direkt-/Quellchats den Standardwert der ausgewählten Laufzeit oder Testumgebung, interne direkte WebChat-Interaktionen verwenden jedoch die automatische Zustellung der Endantwort, um die Prompt-Parität zwischen Pi und Codex sicherzustellen. Setzen Sie messages.visibleReplies: "message_tool", um für sichtbare Ausgaben ausdrücklich message(action=send) vorauszusetzen. Kanal-Zulassungslisten und die Erwähnungsbeschränkung bestimmen weiterhin, ob ein Ereignis verarbeitet wird.
Verlaufsgrenzen für Direktnachrichten
{ channels: { telegram: { dmHistoryLimit: 30, dms: { "123456789": { historyLimit: 50 }, }, }, },}Auflösung: Außerkraftsetzung pro Direktnachricht → Provider-Standardwert → keine Begrenzung (alle werden beibehalten).
Dieser Resolver liest channels.<provider>.dmHistoryLimit und channels.<provider>.dms.<id>.historyLimit für jeden Kanal, dessen Sitzungsschlüssel der Standardform provider:direct:<id> (oder der veralteten Form provider:dm:<id>) entspricht. Daher funktioniert er sowohl für gebündelte als auch für Plugin-Kanäle und nicht nur für eine feste Liste.
Selbstchat-Modus
Nehmen Sie Ihre eigene Nummer in allowFrom auf, um den Selbstchat-Modus zu aktivieren (native @-Erwähnungen werden ignoriert, es wird nur auf Textmuster reagiert):
{ channels: { whatsapp: { allowFrom: ["+15555550123"], groups: { "*": { requireMention: true } }, }, }, agents: { list: [ { id: "main", groupChat: { mentionPatterns: ["reisponde", "@openclaw"] }, }, ], },}Befehle (Verarbeitung von Chatbefehlen)
{ commands: { native: "auto", // native Befehle registrieren, wenn unterstützt nativeSkills: "auto", // native Skills-Befehle registrieren, wenn unterstützt text: true, // /Befehle in Chatnachrichten parsen bash: false, // ! zulassen (Alias: /bash) bashForegroundMs: 2000, config: false, // /config zulassen mcp: false, // /mcp zulassen plugins: false, // /plugins zulassen debug: false, // /debug zulassen restart: true, // /restart und das Tool zum Neustart des Gateways zulassen ownerAllowFrom: ["discord:123456789012345678"], ownerDisplay: "raw", // raw | hash ownerDisplaySecret: "${OWNER_ID_HASH_SECRET}", allowFrom: { "*": ["user1"], discord: ["user:123"], }, useAccessGroups: true, },}Befehlsdetails
- Dieser Block konfiguriert die Befehlsoberflächen. Den aktuellen Katalog integrierter und gebündelter Befehle finden Sie unter Slash-Befehle.
- Diese Seite ist eine Referenz für Konfigurationsschlüssel, nicht der vollständige Befehlskatalog. Kanal-/Plugin-eigene Befehle wie QQ Bot
/bot-ping/bot-help/bot-logs, LINE/card, Gerätekopplung/pair, Speicher/dreaming, Telefonsteuerung/phoneund Talk/voicesind auf den jeweiligen Kanal-/Plugin-Seiten sowie unter Slash-Befehle dokumentiert. - Textbefehle müssen eigenständige Nachrichten mit vorangestelltem
/sein. native: "auto"aktiviert native Befehle für Discord/Telegram und lässt sie für Slack deaktiviert.nativeSkills: "auto"aktiviert native Skills-Befehle für Discord/Telegram und lässt sie für Slack deaktiviert.- Außerkraftsetzung pro Kanal:
channels.discord.commands.native(boolescher Wert oder"auto"). Bei Discord überspringtfalsedie Registrierung und Bereinigung nativer Befehle beim Start. - Überschreiben Sie die Registrierung nativer Skills pro Kanal mit
channels.<provider>.commands.nativeSkills. channels.telegram.customCommandsfügt zusätzliche Einträge zum Telegram-Bot-Menü hinzu.bash: trueaktiviert! <cmd>für die Host-Shell. Erforderttools.elevated.enabledund den Absender intools.elevated.allowFrom.<channel>.config: trueaktiviert/config(liest/schreibtopenclaw.json). Für Gateway-Clients vonchat.senderfordern dauerhafte Schreibvorgänge mit/config set|unsetzusätzlichoperator.admin; das schreibgeschützte/config showbleibt für reguläre Operator-Clients mit Schreibberechtigung verfügbar.mcp: trueaktiviert/mcpfür die von OpenClaw verwaltete MCP-Serverkonfiguration untermcp.servers.plugins: trueaktiviert/pluginsfür die Plugin-Suche, Installation sowie Steuerelemente zum Aktivieren/Deaktivieren.channels.<provider>.configWritessteuert Konfigurationsänderungen pro Kanal (Standardwert: true).- Bei Kanälen mit mehreren Konten steuert
channels.<provider>.accounts.<id>.configWritesaußerdem Schreibvorgänge, die auf dieses Konto abzielen (zum Beispiel/allowlist --config --account <id>oder/config set channels.<provider>.accounts.<id>...). restart: falsedeaktiviert/restartund Aktionen des Tools zum Neustart des Gateways. Standardwert:true.ownerAllowFromist die explizite Eigentümer-Zulassungsliste für ausschließlich Eigentümern vorbehaltene Befehle und eigentümerbeschränkte Kanalaktionen. Sie ist vonallowFromgetrennt.ownerDisplay: "hash"hasht Eigentümer-IDs im System-Prompt. Legen Sie mitownerDisplaySecretdie Hash-Bildung fest.allowFromgilt pro Provider. Wenn es gesetzt ist, ist es die einzige Autorisierungsquelle (Kanal-Zulassungslisten/Kopplung unduseAccessGroupswerden ignoriert).useAccessGroups: falseermöglicht Befehlen, Zugriffsgruppenrichtlinien zu umgehen, wennallowFromnicht gesetzt ist.- Übersicht der Befehlsdokumentation:
- integrierter und gebündelter Katalog: Slash-Befehle
- kanalspezifische Befehlsoberflächen: Kanäle
- QQ-Bot-Befehle: QQ Bot
- Kopplungsbefehle: Kopplung
- LINE-Kartenbefehl: LINE
- Speicher-Dreaming: Dreaming
Verwandte Themen
- Konfigurationsreferenz — Schlüssel der obersten Ebene
- Konfiguration — Agenten
- Kanalübersicht