Gateway
Konfiguration — Kanäle
Kanalspezifische Konfigurationsschlüssel unter channels.*. Behandelt DM- und Gruppenzugriff,
Multi-Account-Setups, Mention-Gating und kanalspezifische Schlüssel für Slack, Discord,
Telegram, WhatsApp, Matrix, iMessage und die anderen gebündelten Channel-Plugins.
Für Agents, Tools, Gateway-Laufzeit und andere Schlüssel auf oberster Ebene siehe Konfigurationsreferenz.
Kanäle
Jeder Kanal startet automatisch, wenn sein Konfigurationsabschnitt vorhanden ist (außer bei enabled: false).
DM- und Gruppenzugriff
Alle Kanäle unterstützen DM-Richtlinien und Gruppenrichtlinien:
| DM-Richtlinie | Verhalten |
|---|---|
pairing (Standard) |
Unbekannte Absender erhalten einen einmaligen Pairing-Code; der Besitzer muss zustimmen |
allowlist |
Nur Absender in allowFrom (oder im gekoppelten Allow-Store) |
open |
Alle eingehenden DMs erlauben (erfordert allowFrom: ["*"]) |
disabled |
Alle eingehenden DMs ignorieren |
| Gruppenrichtlinie | Verhalten |
|---|---|
allowlist (Standard) |
Nur Gruppen, die der konfigurierten Allowlist entsprechen |
open |
Gruppen-Allowlists umgehen (Mention-Gating gilt weiterhin) |
disabled |
Alle Gruppen-/Raumnachrichten blockieren |
Kanalmodell-Überschreibungen
Verwenden Sie channels.modelByChannel, um bestimmte Kanal-IDs an ein Modell zu binden. Werte akzeptieren provider/model oder konfigurierte Modellaliasnamen. Die Kanalzuordnung gilt, wenn eine Sitzung nicht bereits eine Modellüberschreibung hat (zum Beispiel per /model gesetzt).
{
channels: {
modelByChannel: {
discord: {
"123456789012345678": "anthropic/claude-opus-4-6",
},
slack: {
C1234567890: "openai/gpt-4.1",
},
telegram: {
"-1001234567890": "openai/gpt-4.1-mini",
"-1001234567890:topic:99": "anthropic/claude-sonnet-4-6",
},
},
},
}
Kanalstandards und Heartbeat
Verwenden Sie channels.defaults für gemeinsame Gruppenrichtlinien- und Heartbeat-Verhalten über Provider hinweg:
{
channels: {
defaults: {
groupPolicy: "allowlist", // open | allowlist | disabled
contextVisibility: "all", // all | allowlist | allowlist_quote
heartbeat: {
showOk: false,
showAlerts: true,
useIndicator: true,
},
},
},
}
channels.defaults.groupPolicy: Fallback-Gruppenrichtlinie, wenn eine Provider-weitegroupPolicynicht gesetzt ist.channels.defaults.contextVisibility: Standardmodus für die Sichtbarkeit von zusätzlichem Kontext für alle Kanäle. Werte:all(Standard, gesamten zitierten/Thread-/Verlaufskontext einschließen),allowlist(nur Kontext von Absendern auf der Allowlist einschließen),allowlist_quote(wie Allowlist, aber expliziten Zitat-/Antwortkontext beibehalten). Kanalspezifische Überschreibung:channels.<channel>.contextVisibility.channels.defaults.heartbeat.showOk: Gesunde Kanalstatus in die Heartbeat-Ausgabe einschließen.channels.defaults.heartbeat.showAlerts: Herabgestufte/Fehlerstatus in die Heartbeat-Ausgabe einschließen.channels.defaults.heartbeat.useIndicator: Kompakte Heartbeat-Ausgabe im Indikatorstil rendern.
WhatsApp läuft über den Webkanal des Gateways (Baileys Web). Es 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: 120000,
factor: 1.4,
jitter: 0.2,
maxAttempts: 0,
},
},
channels: {
whatsapp: {
dmPolicy: "pairing", // pairing | allowlist | open | disabled
allowFrom: ["+15555550123", "+447700900123"],
textChunkLimit: 4000,
chunkMode: "length", // length | newline
mediaMaxMb: 50,
sendReadReceipts: true, // blue ticks (false in self-chat mode)
groups: {
"*": { requireMention: true },
},
groupPolicy: "allowlist",
groupAllowFrom: ["+15551234567"],
},
},
}
WhatsApp mit mehreren Accounts
{
channels: {
whatsapp: {
accounts: {
default: {},
personal: {},
biz: {
// authDir: "~/.openclaw/credentials/whatsapp/biz",
},
},
},
},
}
- Ausgehende Befehle verwenden standardmäßig den Account
default, falls vorhanden; andernfalls die erste konfigurierte Account-ID (sortiert). - Optionales
channels.whatsapp.defaultAccountüberschreibt diese Fallback-Auswahl des Standard-Accounts, wenn es einer konfigurierten Account-ID entspricht. - Das alte Baileys-Auth-Verzeichnis für einen einzelnen Account wird von
openclaw doctornachwhatsapp/defaultmigriert. - Account-spezifische Ü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: "Keep answers brief.",
topics: {
"99": {
requireMention: false,
skills: ["search"],
systemPrompt: "Stay on topic.",
},
},
},
},
customCommands: [
{ command: "backup", description: "Git backup" },
{ command: "generate", description: "Create an image" },
],
historyLimit: 50,
replyToMode: "first", // off | first | all | batched
linkPreview: true,
streaming: "partial", // off | partial | block | progress (default: off; opt in explicitly to avoid preview-edit rate limits)
actions: { reactions: true, sendMessage: true },
reactionNotifications: "own", // off | own | all
mediaMaxMb: 100,
retry: {
attempts: 3,
minDelayMs: 400,
maxDelayMs: 30000,
jitter: 0.1,
},
network: {
autoSelectFamily: true,
dnsResultOrder: "ipv4first",
},
apiRoot: "https://api.telegram.org",
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 Datei; Symlinks werden abgelehnt), mitTELEGRAM_BOT_TOKENals Fallback für den Standard-Account. apiRootist nur der Root der Telegram Bot API. Verwenden Siehttps://api.telegram.orgoder Ihren selbst gehosteten/Proxy-Root, nichthttps://api.telegram.org/bot<TOKEN>;openclaw doctor --fixentfernt ein versehentliches abschließendes Suffix/bot<TOKEN>.- Optionales
channels.telegram.defaultAccountüberschreibt die Auswahl des Standard-Accounts, wenn es einer konfigurierten Account-ID entspricht. - In Multi-Account-Setups (2+ Account-IDs) legen Sie einen expliziten Standard fest (
channels.telegram.defaultAccountoderchannels.telegram.accounts.default), um Fallback-Routing zu vermeiden;openclaw doctorwarnt, wenn dieser fehlt oder ungültig ist. configWrites: falseblockiert von Telegram initiierte Konfigurationsschreibvorgänge (Supergruppen-ID-Migrationen,/config set|unset).- Einträge in
bindings[]auf oberster Ebene mittype: "acp"konfigurieren persistente ACP-Bindings für Forum-Themen (verwenden Sie das kanonischechatId:topic:topicIdinmatch.peer.id). Die Feldsemantik wird in ACP-Agents gemeinsam verwendet. - Telegram-Stream-Vorschauen verwenden
sendMessage+editMessageText(funktioniert in Direkt- und Gruppenchats). - 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: "Short answers only.",
},
},
},
},
historyLimit: 20,
textChunkLimit: 2000,
chunkMode: "length", // length | newline
streaming: {
mode: "progress", // off | partial | block | progress (Discord default: progress)
progress: {
label: "auto",
maxLines: 8,
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 Fallback für das Standardkonto. - Direkte ausgehende Aufrufe, die ein explizites Discord-
tokenangeben, verwenden dieses Token für den Aufruf; Einstellungen für Konto-Wiederholungen/-Richtlinien stammen weiterhin aus dem ausgewählten Konto im aktiven Runtime-Snapshot. - Das optionale
channels.discord.defaultAccountüberschreibt die Auswahl des Standardkontos, wenn es mit einer konfigurierten Konto-ID übereinstimmt. - Verwenden Sie
user:<id>(DM) oderchannel:<id>(Guild-Kanal) für Zustellziele; bloße numerische IDs werden abgelehnt. - Guild-Slugs sind kleingeschrieben und Leerzeichen werden durch
-ersetzt; Kanal-Schlüssel verwenden den slugifizierten 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 gefiltert). channels.discord.guilds.<id>.ignoreOtherMentions(und Kanal-Überschreibungen) verwirft Nachrichten, die einen anderen Benutzer oder eine 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 deterministisch erwähnt werden können, selbst wenn der flüchtige Verzeichnis-Cache leer ist. Kontoabhängige Überschreibungen liegen unterchannels.discord.accounts.<accountId>.mentionAliases.maxLinesPerMessage(Standardwert 17) teilt hohe Nachrichten auf, selbst wenn sie unter 2000 Zeichen liegen.channels.discord.threadBindingssteuert Thread-gebundenes Discord-Routing:enabled: Discord-Überschreibung für Thread-gebundene Sitzungsfunktionen (/focus,/unfocus,/agents,/session idle,/session max-agesowie gebundene Zustellung/Routing)idleHours: Discord-Überschreibung für automatisches Unfocus bei Inaktivität in Stunden (0deaktiviert)maxAgeHours: Discord-Überschreibung für das harte Höchstalter in Stunden (0deaktiviert)spawnSessions: Schalter fürsessions_spawn({ thread: true })und automatische ACP-Thread-Erstellung/-Bindung bei Thread-Spawns (Standardwert:true)defaultSpawnContext: nativer Subagent-Kontext für Thread-gebundene Spawns (standardmäßig"fork")
- Einträge auf oberster 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 ist in ACP-Agenten gemeinsam beschrieben. channels.discord.ui.components.accentColorlegt die Akzentfarbe für Discord-Komponenten-v2-Container fest.channels.discord.voiceaktiviert Discord-Sprachkanal-Unterhaltungen und optionale Auto-Join- sowie LLM- und TTS-Überschreibungen. Reine Text-Discord-Konfigurationen lassen Sprache standardmäßig deaktiviert; setzen Siechannels.discord.voice.enabled=true, 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.daveEncryptionundchannels.discord.voice.decryptionFailureTolerancewerden an die DAVE-Optionen von@discordjs/voicedurchgereicht (standardmäßigtrueund24).channels.discord.voice.connectTimeoutMssteuert die anfängliche@discordjs/voice-Ready-Wartezeit für/vc joinund Auto-Join-Versuche (standardmäßig30000).channels.discord.voice.reconnectGraceMssteuert, wie lange eine getrennte Sprachsitzung Zeit hat, in Reconnect-Signalisierung überzugehen, bevor OpenClaw sie zerstört (standardmäßig15000).- Discord-Sprachwiedergabe wird nicht durch das Sprechbeginn-Ereignis eines anderen Benutzers unterbrochen. Um Feedback-Schleifen zu vermeiden, ignoriert OpenClaw neue Sprachaufnahme, während TTS abgespielt wird.
- OpenClaw versucht außerdem, den Sprachempfang wiederherzustellen, indem es eine Sprachsitzung nach wiederholten Entschlüsselungsfehlern verlässt und ihr erneut beitritt.
channels.discord.streamingist der kanonische Schlüssel für den Stream-Modus. Discord verwendet standardmäßigstreaming.mode: "progress", sodass Tool-/Arbeitsfortschritt in einer bearbeiteten Vorschau-Nachricht erscheint; setzen Siestreaming.mode: "off", um dies zu deaktivieren. Legacy-streamMode- und booleschestreaming-Werte bleiben Runtime-Aliasse; führen Sieopenclaw doctor --fixaus, um persistierte Konfiguration umzuschreiben.channels.discord.autoPresenceordnet Runtime-Verfügbarkeit der Bot-Präsenz zu (healthy => online, degraded => idle, exhausted => dnd) und erlaubt optionale Status-Textüberschreibungen.channels.discord.dangerouslyAllowNameMatchingaktiviert veränderliches Namens-/Tag-Matching wieder (Break-Glass-Kompatibilitätsmodus).channels.discord.execApprovals: Discord-native Zustellung von Exec-Genehmigungen und Autorisierung von Genehmigenden.enabled:true,falseoder"auto"(Standard). Im Auto-Modus werden Exec-Genehmigungen aktiviert, wenn Genehmigende ausapproversodercommands.ownerAllowFromaufgelöst werden können.approvers: Discord-Benutzer-IDs, die Exec-Anfragen genehmigen dürfen. Fällt aufcommands.ownerAllowFromzurück, wenn ausgelassen.agentFilter: optionale Agent-ID-Allowlist. Weglassen, um Genehmigungen für alle Agenten weiterzuleiten.sessionFilter: optionale Sitzungsschlüssel-Muster (Teilzeichenfolge oder Regex).target: wohin Genehmigungsaufforderungen gesendet werden."dm"(Standard) sendet an DMs der Genehmigenden,"channel"sendet an den Ursprungskanal,"both"sendet an beide. Wenn das Ziel"channel"enthält, sind Buttons nur für aufgelöste Genehmigende verwendbar.cleanupAfterResolve: löscht beitrueGenehmigungs-DMs nach Genehmigung, Ablehnung oder Timeout.
Reaktionsbenachrichtigungsmodi: off (keine), own (Nachrichten des Bots, Standard), all (alle Nachrichten), allowlist (aus guilds.<id>.users für alle 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). - Dienstkonto-SecretRef wird ebenfalls unterstützt (
serviceAccountRef). - Env-Fallbacks:
GOOGLE_CHAT_SERVICE_ACCOUNToderGOOGLE_CHAT_SERVICE_ACCOUNT_FILE. - Verwenden Sie
spaces/<spaceId>oderusers/<userId>für Zustellziele. channels.googlechat.dangerouslyAllowNameMatchingaktiviert veränderliches Matching von E-Mail-Principals wieder (Break-Glass-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: { allow: true, requireMention: true, allowBots: false },
"#general": {
allow: true,
requireMention: true,
allowBots: false,
users: ["U123"],
skills: ["docs"],
systemPrompt: "Short answers only.",
},
},
historyLimit: 50,
allowBots: false,
reactionNotifications: "own",
reactionAllowlist: ["U123"],
replyToMode: "off", // off | first | all | batched
thread: {
historyScope: "thread", // thread | channel
inheritParent: false,
},
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",
textChunkLimit: 4000,
chunkMode: "length",
streaming: {
mode: "partial", // off | partial | block | progress
nativeTransport: true, // use Slack native streaming API when 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_TOKENals Env-Fallback für das Standardkonto). - HTTP-Modus erfordert
botTokenplussigningSecret(auf Root-Ebene oder pro Konto). socketModereicht Transport-Tuning für den Socket Mode des Slack SDK an die öffentliche Bolt-Receiver-API durch. Verwenden Sie es nur, wenn Sie Ping/Pong-Timeouts oder veraltetes Websocket-Verhalten untersuchen.botToken,appToken,signingSecretunduserTokenakzeptieren Klartextzeichenfolgen oder SecretRef-Objekte.- Slack-Konto-Snapshots legen pro Zugangsdatenquelle/-status Felder offen, etwa
botTokenSource,botTokenStatus,appTokenStatusund im HTTP-ModussigningSecretStatus.configured_unavailablebedeutet, dass das Konto über SecretRef konfiguriert ist, der aktuelle Befehls-/Runtime-Pfad den Secret-Wert 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 Slack-Schlüssel für den Stream-Modus.channels.slack.streaming.nativeTransportsteuert Slacks nativen Streaming-Transport. Legacy-streamMode-, booleschestreaming- undnativeStreaming-Werte bleiben Runtime-Aliasse; führen Sieopenclaw doctor --fixaus, um persistierte Konfiguration umzuschreiben.- Verwenden Sie
user:<id>(DM) oderchannel:<id>für Zustellziele.
Reaktionsbenachrichtigungsmodi: off, own (Standard), all, allowlist (aus reactionAllowlist).
Thread-Sitzungsisolierung: thread.historyScope ist pro Thread (Standard) oder kanalweit geteilt. thread.inheritParent kopiert das Transkript des übergeordneten Kanals in neue Threads.
- Slack-natives Streaming plus der Slack-Assistant-artige Thread-Status „is typing...“ erfordern ein Antwort-Thread-Ziel. DMs auf oberster Ebene bleiben standardmäßig außerhalb von Threads, sodass sie weiterhin über Slack-Entwurfs-Post-und-Bearbeitungs-Vorschauen streamen können, anstatt die native Stream-/Statusvorschau im Thread-Stil anzuzeigen.
typingReactionfügt der eingehenden Slack-Nachricht eine temporäre Reaktion hinzu, während eine Antwort läuft, und entfernt sie nach Abschluss. Verwenden Sie einen Slack-Emoji-Shortcode wie"hourglass_flowing_sand".channels.slack.execApprovals: Slack-native Zustellung von Exec-Genehmigungen und Autorisierung von Genehmigenden. Gleiches Schema wie Discord:enabled(true/false/"auto"),approvers(Slack-Benutzer-IDs),agentFilter,sessionFilterundtarget("dm","channel"oder"both").
| Aktionsgruppe | Standard | Hinweise |
|---|---|---|
| reactions | aktiviert | Reaktionen senden + auflisten |
| messages | aktiviert | Lesen/senden/bearbeiten/löschen |
| pins | aktiviert | Anheften/lösen/auflisten |
| memberInfo | aktiviert | Mitgliederinformationen |
| emojiList | aktiviert | Benutzerdefinierte Emoji-Liste |
Mattermost
Mattermost wird in aktuellen OpenClaw-Releases als gebündeltes Plugin ausgeliefert. Ältere oder
angepasste Builds können ein aktuelles npm-Paket mit
openclaw plugins install @openclaw/mattermost installieren. Prüfen Sie
npmjs.com/package/@openclaw/mattermost
auf die aktuellen Dist-Tags, bevor Sie eine Version pinnen.
{
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, // opt-in
nativeSkills: true,
callbackPath: "/api/channels/mattermost/command",
// Optional explicit URL for reverse-proxy/public deployments
callbackUrl: "https://gateway.example.com/api/channels/mattermost/command",
},
textChunkLimit: 4000,
chunkMode: "length",
},
},
}
Chatmodi: oncall (Antwort bei @-Erwähnung, Standard), onmessage (jede Nachricht), onchar (Nachrichten, die mit einem Auslösepräfix beginnen).
Wenn native Mattermost-Befehle aktiviert sind:
commands.callbackPathmuss ein Pfad sein (zum Beispiel/api/channels/mattermost/command), keine vollständige URL.commands.callbackUrlmuss zum OpenClaw-Gateway-Endpunkt auflösen und vom Mattermost-Server 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 sind, lehnt OpenClaw Callbacks mit
Unauthorized: invalid command token.ab. - Für private/tailnet/interne Callback-Hosts kann Mattermost erfordern, dass
ServiceSettings.AllowedUntrustedInternalConnectionsden Callback-Host bzw. die Domain enthält. Verwenden Sie Host-/Domain-Werte, keine vollständigen URLs. channels.mattermost.configWrites: Konfigurationsschreibvorgänge, die von Mattermost initiiert werden, erlauben oder verweigern.channels.mattermost.requireMention: eine@mentionvor Antworten in Kanälen verlangen.channels.mattermost.groups.<channelId>.requireMention: kanalspezifische Überschreibung für Erwähnungs-Gating ("*"als Standard).- Optional überschreibt
channels.mattermost.defaultAccountdie Auswahl des Standardkontos, wenn es mit einer konfigurierten Konto-ID übereinstimmt.
Signal
{
channels: {
signal: {
enabled: true,
account: "+15555550123", // optional account binding
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: Kanalstart auf eine bestimmte Signal-Kontoidentität festlegen.channels.signal.configWrites: Konfigurationsschreibvorgänge, die von Signal initiiert werden, erlauben oder verweigern.- Optional überschreibt
channels.signal.defaultAccountdie Auswahl des Standardkontos, wenn es mit einer konfigurierten Konto-ID übereinstimmt.
BlueBubbles
BlueBubbles ist die ältere iMessage-Bridge (Plugin-gestützt, unter channels.bluebubbles konfiguriert). Bestehende Setups bleiben unterstützt, neue OpenClaw-iMessage-Bereitstellungen sollten jedoch channels.imessage bevorzugen, wenn imsg auf dem Messages-Host ausgeführt werden kann.
{
channels: {
bluebubbles: {
enabled: true,
dmPolicy: "pairing",
// serverUrl, password, webhookPath, group controls, and advanced actions:
// see /channels/bluebubbles
},
},
}
- Hier behandelte zentrale Schlüsselpfade:
channels.bluebubbles,channels.bluebubbles.dmPolicy. - Optional überschreibt
channels.bluebubbles.defaultAccountdie Auswahl des Standardkontos, wenn es mit einer konfigurierten Konto-ID übereinstimmt. - Einträge in
bindings[]auf oberster Ebene mittype: "acp"können BlueBubbles-Unterhaltungen an persistente ACP-Sitzungen binden. Verwenden Sie ein BlueBubbles-Handle oder eine Zielzeichenfolge (chat_id:*,chat_guid:*,chat_identifier:*) inmatch.peer.id. Gemeinsame Feldsemantik: ACP Agents. - Die vollständige BlueBubbles-Kanalkonfiguration und die Begründung für die Einstellung sind in BlueBubbles dokumentiert.
iMessage
OpenClaw startet imsg rpc (JSON-RPC über stdio). Kein Daemon und kein Port erforderlich. Dies ist der bevorzugte Weg für neue OpenClaw-iMessage-Setups, wenn der Host Berechtigungen für die Messages-Datenbank und Automation gewähren kann.
{
channels: {
imessage: {
enabled: true,
cliPath: "imsg",
dbPath: "~/Library/Messages/chat.db",
remoteHost: "user@gateway-host",
dmPolicy: "pairing",
allowFrom: ["+15555550123", "[email protected]", "chat_id:123"],
historyLimit: 50,
includeAttachments: false,
attachmentRoots: ["/Users/*/Library/Messages/Attachments"],
remoteAttachmentRoots: ["/Users/*/Library/Messages/Attachments"],
mediaMaxMb: 16,
service: "auto",
region: "US",
},
},
}
-
Optional überschreibt
channels.imessage.defaultAccountdie Auswahl des Standardkontos, wenn es mit einer konfigurierten Konto-ID übereinstimmt. -
Erfordert Full Disk Access für die Messages-Datenbank.
-
Bevorzugen Sie
chat_id:<id>-Ziele. Verwenden Sieimsg chats --limit 20, um Chats aufzulisten. -
cliPathkann auf einen SSH-Wrapper verweisen; setzen SieremoteHost(hostoderuser@host) für das Abrufen von Anhängen per SCP. -
attachmentRootsundremoteAttachmentRootsbeschränken eingehende Anhangspfade (Standard:/Users/*/Library/Messages/Attachments). -
SCP verwendet strikte Host-Key-Prüfung; stellen Sie daher sicher, dass der Relay-Host-Schlüssel bereits in
~/.ssh/known_hostsvorhanden ist. -
channels.imessage.configWrites: Konfigurationsschreibvorgänge, die von iMessage initiiert werden, erlauben oder verweigern. -
Einträge in
bindings[]auf oberster Ebene mittype: "acp"können iMessage-Unterhaltungen an persistente ACP-Sitzungen binden. Verwenden Sie ein normalisiertes Handle oder ein explizites Chat-Ziel (chat_id:*,chat_guid:*,chat_identifier:*) inmatch.peer.id. Gemeinsame Feldsemantik: ACP Agents.
Beispiel für iMessage-SSH-Wrapper
#!/usr/bin/env bash
exec ssh -T gateway-host imsg "$@"
Matrix
Matrix ist Plugin-gestützt und wird 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",
},
},
},
},
}
- Token-Authentifizierung verwendet
accessToken; Passwortauthentifizierung verwendetuserId+password. channels.matrix.proxyleitet 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 Netzwerk-Opt-in-Einstellung sind unabhängige Steuerungen.channels.matrix.defaultAccountwählt das bevorzugte Konto in Setups mit mehreren Konten aus.channels.matrix.autoJoinist standardmäßigoff, sodass eingeladene Räume und neue DM-artige Einladungen ignoriert werden, bis SieautoJoin: "allowlist"mitautoJoinAllowlistoderautoJoin: "always"setzen.channels.matrix.execApprovals: Matrix-native Zustellung von Exec-Genehmigungen und Autorisierung von Genehmigenden.enabled:true,falseoder"auto"(Standard). Im Auto-Modus werden Exec-Genehmigungen aktiviert, wenn Genehmigende ausapproversodercommands.ownerAllowFromaufgelöst werden können.approvers: Matrix-Benutzer-IDs (z. B.@owner:example.org), die Exec-Anfragen genehmigen dürfen.agentFilter: optionale Allowlist für Agent-IDs. Weglassen, um Genehmigungen für alle Agents weiterzuleiten.sessionFilter: optionale Sitzungsschlüsselmuster (Teilzeichenfolge oder Regex).target: wohin Genehmigungsaufforderungen gesendet werden."dm"(Standard),"channel"(Ursprungsraum) oder"both".- Kontospezifische Überschreibungen:
channels.matrix.accounts.<id>.execApprovals.
channels.matrix.dm.sessionScopesteuert, wie Matrix-DMs zu Sitzungen gruppiert werden:per-user(Standard) teilt nach geroutetem Peer, währendper-roomjeden DM-Raum isoliert.- Matrix-Statusprüfungen und Live-Verzeichnisabfragen verwenden dieselbe Proxy-Richtlinie wie Laufzeitdatenverkehr.
- Die vollständige Matrix-Konfiguration, Zielregeln und Setup-Beispiele sind in Matrix dokumentiert.
Microsoft Teams
Microsoft Teams ist Plugin-gestützt und wird unter channels.msteams konfiguriert.
{
channels: {
msteams: {
enabled: true,
configWrites: true,
// appId, appPassword, tenantId, webhook, team/channel policies:
// see /channels/msteams
},
},
}
- Hier behandelte zentrale Schlüsselpfade:
channels.msteams,channels.msteams.configWrites. - Die vollständige Teams-Konfiguration (Anmeldedaten, Webhook, DM-/Gruppenrichtlinie, Überschreibungen pro Team/pro Kanal) ist in Microsoft Teams dokumentiert.
IRC
IRC ist Plugin-gestützt und wird unter channels.irc konfiguriert.
{
channels: {
irc: {
enabled: true,
dmPolicy: "pairing",
configWrites: true,
nickserv: {
enabled: true,
service: "NickServ",
password: "${IRC_NICKSERV_PASSWORD}",
register: false,
registerEmail: "[email protected]",
},
},
},
}
- Hier behandelte zentrale Schlüsselpfade:
channels.irc,channels.irc.dmPolicy,channels.irc.configWrites,channels.irc.nickserv.*. - Optional überschreibt
channels.irc.defaultAccountdie Auswahl des Standardkontos, wenn es mit einer konfigurierten Konto-ID übereinstimmt. - Die vollständige IRC-Kanalkonfiguration (Host/Port/TLS/Kanäle/Allowlists/Erwähnungs-Gating) ist in IRC dokumentiert.
Mehrere Konten (alle Kanäle)
Führen Sie mehrere Konten pro Kanal aus (jedes mit eigener accountId):
{
channels: {
telegram: {
accounts: {
default: {
name: "Primary bot",
botToken: "123456:ABC...",
},
alerts: {
name: "Alerts bot",
botToken: "987654:XYZ...",
},
},
},
},
}
defaultwird verwendet, wennaccountIdausgelassen wird (CLI + Routing).- Env-Tokens gelten nur für das Standardkonto.
- Basiskanaleinstellungen gelten für alle Konten, sofern sie nicht pro Konto überschrieben werden.
- Verwenden Sie
bindings[].match.accountId, um jedes Konto an einen anderen Agent weiterzuleiten. - Wenn Sie ein Nicht-Standardkonto über
openclaw channels add(oder Kanal-Onboarding) hinzufügen, während Sie noch eine Einkonto-Kanalkonfiguration auf oberster Ebene verwenden, befördert OpenClaw zunächst kontobezogene Einkonto-Werte auf oberster Ebene in die Kontozuordnung des Kanals, damit das ursprüngliche Konto weiter funktioniert. Die meisten Kanäle verschieben sie nachchannels.<channel>.accounts.default; Matrix kann stattdessen ein vorhandenes passendes benanntes/Standardziel beibehalten. - Bestehende kanalweite Bindings (ohne
accountId) stimmen weiterhin mit dem Standardkonto überein; kontobezogene Bindings bleiben optional. openclaw doctor --fixrepariert auch gemischte Formen, indem kontobezogene Einkonto-Werte auf oberster Ebene in das für diesen Kanal ausgewählte beförderte Konto verschoben werden. Die meisten Kanäle verwendenaccounts.default; Matrix kann stattdessen ein vorhandenes passendes benanntes/Standardziel beibehalten.
Andere Plugin-Kanäle
Viele Plugin-Kanäle werden als channels.<id> konfiguriert und auf ihren jeweiligen Kanalseiten dokumentiert (zum Beispiel Feishu, Matrix, LINE, Nostr, Zalo, Nextcloud Talk, Synology Chat und Twitch).
Siehe den vollständigen Kanalindex: Kanäle.
Erwähnungs-Gating für Gruppenchats
Gruppennachrichten erfordern standardmäßig eine Erwähnung (Metadaten-Erwähnung oder sichere Regex-Muster). Gilt für WhatsApp, Telegram, Discord, Google Chat und iMessage-Gruppenchats.
Sichtbare Antworten werden separat gesteuert. Gruppen-/Kanalräume verwenden standardmäßig messages.groupChat.visibleReplies: "message_tool": OpenClaw verarbeitet den Turn weiterhin, aber normale finale Antworten bleiben privat, und sichtbare Raumausgabe erfordert message(action=send). Setzen Sie "automatic" nur, wenn Sie das Legacy-Verhalten möchten, bei dem normale Antworten zurück in den Raum gepostet werden. Um dasselbe tool-only-Verhalten für sichtbare Antworten auch auf Direktchats anzuwenden, setzen Sie messages.visibleReplies: "message_tool"; der Codex-Harness verwendet dieses tool-only-Verhalten außerdem als nicht gesetzten Standard für Direktchats.
Tool-only sichtbare Antworten erfordern ein Modell/eine Runtime, die zuverlässig Tools aufruft. Wenn
das Sitzungsprotokoll Assistant-Text mit didSendViaMessagingTool: false zeigt, hat das
Modell eine private finale Antwort erzeugt, statt das Nachrichtentool aufzurufen.
Wechseln Sie für diesen Kanal zu einem stärkeren Modell für Tool-Aufrufe, oder setzen Sie
messages.groupChat.visibleReplies: "automatic", um sichtbare finale
Legacy-Antworten wiederherzustellen.
Wenn das Nachrichtentool unter der aktiven Tool-Richtlinie nicht verfügbar ist, fällt OpenClaw auf automatische sichtbare Antworten zurück, statt die Antwort stillschweigend zu unterdrücken. openclaw doctor warnt vor dieser Fehlanpassung.
Das Gateway lädt die messages-Konfiguration nach dem Speichern der Datei per Hot-Reload neu. Starten Sie nur neu, wenn Dateiüberwachung oder Konfigurations-Neuladen in der Bereitstellung deaktiviert ist.
Erwähnungstypen:
- Metadaten-Erwähnungen: Native @-Erwähnungen der Plattform. Werden im WhatsApp-Self-Chat-Modus ignoriert.
- Textmuster: Sichere Regex-Muster in
agents.list[].groupChat.mentionPatterns. Ungültige Muster und unsichere verschachtelte Wiederholungen werden ignoriert. - Erwähnungs-Gating wird nur erzwungen, wenn Erkennung möglich ist (native Erwähnungen oder mindestens ein Muster).
{
messages: {
visibleReplies: "automatic", // global default for direct/source chats; Codex harness defaults unset direct chats to message_tool
groupChat: {
historyLimit: 50,
visibleReplies: "message_tool", // default; use "automatic" for legacy final replies
},
},
agents: {
list: [{ id: "main", groupChat: { mentionPatterns: ["@openclaw", "openclaw"] } }],
},
}
messages.groupChat.historyLimit legt den globalen Standard fest. Kanäle können ihn mit channels.<channel>.historyLimit (oder pro Konto) überschreiben. Setzen Sie 0, um ihn zu deaktivieren.
messages.visibleReplies ist der globale Standard für Source-Turns; messages.groupChat.visibleReplies überschreibt ihn für Gruppen-/Kanal-Source-Turns. Wenn messages.visibleReplies nicht gesetzt ist, kann ein Harness seinen eigenen Direkt-/Source-Standard bereitstellen; der Codex-Harness verwendet standardmäßig message_tool. Kanal-Allowlists und Erwähnungs-Gating entscheiden weiterhin, ob ein Turn verarbeitet wird.
DM-Verlaufslimits
{
channels: {
telegram: {
dmHistoryLimit: 30,
dms: {
"123456789": { historyLimit: 50 },
},
},
},
}
Auflösung: Pro-DM-Überschreibung → Provider-Standard → kein Limit (alles wird beibehalten).
Unterstützt: telegram, whatsapp, discord, slack, signal, imessage, msteams.
Self-Chat-Modus
Fügen Sie Ihre eigene Nummer in allowFrom ein, um den Self-Chat-Modus zu aktivieren (ignoriert native @-Erwähnungen, antwortet nur auf Textmuster):
{
channels: {
whatsapp: {
allowFrom: ["+15555550123"],
groups: { "*": { requireMention: true } },
},
},
agents: {
list: [
{
id: "main",
groupChat: { mentionPatterns: ["reisponde", "@openclaw"] },
},
],
},
}
Befehle (Chat-Befehlsverarbeitung)
{
commands: {
native: "auto", // register native commands when supported
nativeSkills: "auto", // register native skill commands when supported
text: true, // parse /commands in chat messages
bash: false, // allow ! (alias: /bash)
bashForegroundMs: 2000,
config: false, // allow /config
mcp: false, // allow /mcp
plugins: false, // allow /plugins
debug: false, // allow /debug
restart: true, // allow /restart + gateway restart tool
ownerAllowFrom: ["discord:123456789012345678"],
ownerDisplay: "raw", // raw | hash
ownerDisplaySecret: "${OWNER_ID_HASH_SECRET}",
allowFrom: {
"*": ["user1"],
discord: ["user:123"],
},
useAccessGroups: true,
},
}
Befehlsdetails
- Dieser Block konfiguriert Befehlsoberflächen. Den aktuellen integrierten und gebündelten Befehlskatalog finden Sie unter Slash-Befehle.
- Diese Seite ist eine Konfigurationsschlüssel-Referenz, nicht der vollständige Befehlskatalog. Kanal-/Plugin-eigene Befehle wie QQ Bot
/bot-ping/bot-help/bot-logs, LINE/card, Geräte-Kopplung/pair, Memory/dreaming, Telefonsteuerung/phoneund Talk/voicesind auf ihren Kanal-/Plugin-Seiten sowie unter Slash-Befehle dokumentiert. - Textbefehle müssen eigenständige Nachrichten mit führendem
/sein. native: "auto"aktiviert native Befehle für Discord/Telegram und lässt Slack deaktiviert.nativeSkills: "auto"aktiviert native Skill-Befehle für Discord/Telegram und lässt Slack deaktiviert.- Pro Kanal überschreiben:
channels.discord.commands.native(boolesch oder"auto"). Bei Discord überspringtfalsedie Registrierung und Bereinigung nativer Befehle während des Starts. - Überschreiben Sie die Registrierung nativer Skill-Befehle pro Kanal mit
channels.<provider>.commands.nativeSkills. channels.telegram.customCommandsfügt zusätzliche Telegram-Bot-Menüeinträge hinzu.bash: trueaktiviert! <cmd>für die Host-Shell. Erforderttools.elevated.enabledund einen Absender intools.elevated.allowFrom.<channel>.config: trueaktiviert/config(liest/schreibtopenclaw.json). Für Gateway-chat.send-Clients erfordern persistente/config set|unset-Schreibvorgänge außerdemoperator.admin; schreibgeschützte/config showbleibt für normale Operator-Clients mit Schreibbereich verfügbar.mcp: trueaktiviert/mcpfür von OpenClaw verwaltete MCP-Serverkonfiguration untermcp.servers.plugins: trueaktiviert/pluginsfür Plugin-Erkennung, Installation und Aktivierungs-/Deaktivierungssteuerungen.channels.<provider>.configWritessteuert Konfigurationsänderungen pro Kanal (Standard: true).- Bei Multi-Konto-Kanälen steuert
channels.<provider>.accounts.<id>.configWritesaußerdem Schreibvorgänge, die dieses Konto betreffen (zum Beispiel/allowlist --config --account <id>oder/config set channels.<provider>.accounts.<id>...). restart: falsedeaktiviert/restartund Gateway-Neustart-Tool-Aktionen. Standard:true.ownerAllowFromist die explizite Owner-Allowlist für Owner-only-Befehle/-Tools. Sie ist vonallowFromgetrennt.ownerDisplay: "hash"hasht Owner-IDs im System-Prompt. Setzen SieownerDisplaySecret, um das Hashing zu steuern.allowFromist Provider-spezifisch. Wenn gesetzt, ist es die einzige Autorisierungsquelle (Kanal-Allowlists/Kopplung unduseAccessGroupswerden ignoriert).useAccessGroups: falseerlaubt Befehlen, Access-Group-Richtlinien zu umgehen, wennallowFromnicht gesetzt ist.- Zuordnung der Befehlsdokumentation:
- integrierter und gebündelter Katalog: Slash-Befehle
- kanalspezifische Befehlsoberflächen: Kanäle
- QQ Bot-Befehle: QQ Bot
- Kopplungsbefehle: Kopplung
- LINE-Kartenbefehl: LINE
- Memory-Dreaming: Dreaming
Verwandt
- Konfigurationsreferenz — Schlüssel der obersten Ebene
- Konfiguration — Agents
- Kanalübersicht