Slack
Status: Produktionsreif für DMs + Kanäle via Slack-App-Integrationen. Standardmodus ist Socket Mode; HTTP Events API-Modus wird ebenfalls unterstützt.
- Pairing — Slack-DMs verwenden standardmäßig den Pairing-Modus.
- Slash-Befehle — Natives Befehlsverhalten und Befehlskatalog.
- Kanal-Fehlerbehebung — Kanalübergreifende Diagnose- und Reparatur-Playbooks.
Schnelleinrichtung
Socket Mode (Standard)
### Schritt 1: Slack-App und Tokens erstellen
In den Slack-App-Einstellungen:
- **Socket Mode** aktivieren
- **App Token** erstellen (`xapp-...`) mit `connections:write`
- App installieren und **Bot Token** kopieren (`xoxb-...`)
### Schritt 2: OpenClaw konfigurieren
{
channels: {
slack: {
enabled: true,
mode: "socket",
appToken: "xapp-...",
botToken: "xoxb-...",
},
},
}
Umgebungsvariablen-Fallback (nur Standardkonto):
SLACK_APP_TOKEN=xapp-...
SLACK_BOT_TOKEN=xoxb-...
### Schritt 3: App-Events abonnieren
Bot-Events abonnieren für:
- `app_mention`
- `message.channels`, `message.groups`, `message.im`, `message.mpim`
- `reaction_added`, `reaction_removed`
- `member_joined_channel`, `member_left_channel`
- `channel_rename`
- `pin_added`, `pin_removed`
Außerdem den App Home **Messages Tab** für DMs aktivieren.
### Schritt 4: Gateway starten
openclaw gateway
HTTP Events API-Modus
### Schritt 1: Slack-App für HTTP konfigurieren
- Modus auf HTTP setzen (`channels.slack.mode="http"`)
- Slack **Signing Secret** kopieren
- Event Subscriptions + Interactivity + Slash Command Request-URL auf denselben Webhook-Pfad setzen (Standard `/slack/events`)
### Schritt 2: OpenClaw HTTP-Modus konfigurieren
{
channels: {
slack: {
enabled: true,
mode: "http",
botToken: "xoxb-...",
signingSecret: "your-signing-secret",
webhookPath: "/slack/events",
},
},
}
### Schritt 3: Eindeutige Webhook-Pfade für Multi-Account-HTTP verwenden
Pro-Konto-HTTP-Modus wird unterstützt.
Gib jedem Konto einen eigenen `webhookPath`, damit Registrierungen nicht kollidieren.
Token-Modell
botToken+appTokensind für Socket Mode erforderlich.- HTTP-Modus erfordert
botToken+signingSecret. - Konfigurations-Tokens überschreiben Umgebungsvariablen-Fallbacks.
SLACK_BOT_TOKEN/SLACK_APP_TOKENUmgebungsvariablen-Fallback gilt nur für das Standardkonto.userToken(xoxp-...) ist nur in der Konfiguration verfügbar (kein Umgebungsvariablen-Fallback) und verhält sich standardmäßig schreibgeschützt (userTokenReadOnly: true).- Optional:
chat:write.customizehinzufügen, wenn ausgehende Nachrichten die aktive Agent-Identität verwenden sollen (benutzerdefinierterusernameund Icon).icon_emojiverwendet die:emoji_name:-Syntax.
Tipp: Für Aktionen/Verzeichnislesevorgänge kann das User Token bevorzugt werden, wenn konfiguriert. Für Schreibvorgänge bleibt das Bot Token bevorzugt; User-Token-Schreibvorgänge sind nur erlaubt, wenn
userTokenReadOnly: falseist und kein Bot Token verfügbar ist.
Zugriffssteuerung und Routing
DM-Richtlinie
`channels.slack.dmPolicy` steuert den DM-Zugriff (Legacy: `channels.slack.dm.policy`):
- `pairing` (Standard)
- `allowlist`
- `open` (erfordert, dass `channels.slack.allowFrom` `"*"` enthält; Legacy: `channels.slack.dm.allowFrom`)
- `disabled`
DM-Flags:
- `dm.enabled` (Standard true)
- `channels.slack.allowFrom` (bevorzugt)
- `dm.allowFrom` (Legacy)
- `dm.groupEnabled` (Gruppen-DMs Standard false)
- `dm.groupChannels` (optionale MPIM-Allowlist)
Multi-Account-Vorrang:
- `channels.slack.accounts.default.allowFrom` gilt nur für das `default`-Konto.
- Benannte Konten erben `channels.slack.allowFrom`, wenn ihr eigenes `allowFrom` nicht gesetzt ist.
- Benannte Konten erben nicht `channels.slack.accounts.default.allowFrom`.
Pairing in DMs verwendet `openclaw pairing approve slack <code>`.
Kanalrichtlinie
`channels.slack.groupPolicy` steuert die Kanalbehandlung:
- `open`
- `allowlist`
- `disabled`
Die Kanal-Allowlist befindet sich unter `channels.slack.channels` und sollte stabile Kanal-IDs verwenden.
Laufzeithinweis: Wenn `channels.slack` vollständig fehlt (reines Umgebungsvariablen-Setup), fällt die Laufzeit auf `groupPolicy="allowlist"` zurück und protokolliert eine Warnung (auch wenn `channels.defaults.groupPolicy` gesetzt ist).
Name/ID-Auflösung:
- Kanal-Allowlist-Einträge und DM-Allowlist-Einträge werden beim Start aufgelöst, wenn der Token-Zugriff dies erlaubt
- nicht aufgelöste Kanalnamen-Einträge werden wie konfiguriert beibehalten, aber standardmäßig beim Routing ignoriert
- eingehende Autorisierung und Kanal-Routing sind standardmäßig ID-first; direktes Benutzername-/Slug-Matching erfordert `channels.slack.dangerouslyAllowNameMatching: true`
Erwähnungen und Kanalbenutzer
Kanalnachrichten sind standardmäßig durch Erwähnungen geschützt.
Erwähnungsquellen:
- explizite App-Erwähnung (`<@botId>`)
- Erwähnungsmuster (`agents.list[].groupChat.mentionPatterns`, Fallback `messages.groupChat.mentionPatterns`)
- implizites Reply-to-Bot-Thread-Verhalten
Pro-Kanal-Steuerungen (`channels.slack.channels.<id>`; Namen nur über Startauflösung oder `dangerouslyAllowNameMatching`):
- `requireMention`
- `users` (Allowlist)
- `allowBots`
- `skills`
- `systemPrompt`
- `tools`, `toolsBySender`
- `toolsBySender`-Schlüsselformat: `id:`, `e164:`, `username:`, `name:` oder `"*"` Wildcard
(Legacy-Schlüssel ohne Präfix werden weiterhin nur auf `id:` abgebildet)
Befehle und Slash-Verhalten
- Nativer Befehlsautomodus ist für Slack deaktiviert (
commands.native: "auto"aktiviert keine nativen Slack-Befehle). - Aktiviere native Slack-Befehlshandler mit
channels.slack.commands.native: true(oder globalcommands.native: true). - Wenn native Befehle aktiviert sind, registriere passende Slash-Befehle in Slack (
/<command>-Namen), mit einer Ausnahme:- registriere
/agentstatusfür den Status-Befehl (Slack reserviert/status)
- registriere
- Wenn native Befehle nicht aktiviert sind, kannst du einen einzelnen konfigurierten Slash-Befehl über
channels.slack.slashCommandausführen. - Native Argument-Menüs passen ihre Darstellungsstrategie jetzt an:
- bis zu 5 Optionen: Button-Blöcke
- 6-100 Optionen: statisches Select-Menü
- mehr als 100 Optionen: externes Select mit asynchroner Optionsfilterung, wenn Interaktivitäts-Optionshandler verfügbar sind
- wenn kodierte Optionswerte Slack-Limits überschreiten, fällt der Ablauf auf Buttons zurück
- Für lange Options-Payloads verwenden Slash-Befehl-Argument-Menüs einen Bestätigungsdialog vor dem Absenden eines ausgewählten Werts.
Interaktive Antworten
Slack kann vom Agenten erstellte interaktive Antwortsteuerungen rendern, aber diese Funktion ist standardmäßig deaktiviert.
Global aktivieren:
{
channels: {
slack: {
capabilities: {
interactiveReplies: true,
},
},
},
}
Oder nur für ein Slack-Konto aktivieren:
{
channels: {
slack: {
accounts: {
ops: {
capabilities: {
interactiveReplies: true,
},
},
},
},
},
}
Wenn aktiviert, können Agenten Slack-spezifische Antwortdirektiven ausgeben:
[[slack_buttons: Approve:approve, Reject:reject]][[slack_select: Choose a target | Canary:canary, Production:production]]
Diese Direktiven werden in Slack Block Kit kompiliert und leiten Klicks oder Auswahlen über den bestehenden Slack-Interaktions-Event-Pfad zurück.
Hinweise:
- Dies ist Slack-spezifische UI. Andere Kanäle übersetzen Slack Block Kit-Direktiven nicht in ihre eigenen Button-Systeme.
- Die interaktiven Callback-Werte sind von OpenClaw generierte undurchsichtige Tokens, keine rohen, vom Agenten verfassten Werte.
- Wenn generierte interaktive Blöcke die Slack Block Kit-Limits überschreiten würden, fällt OpenClaw auf die ursprüngliche Textantwort zurück, anstatt einen ungültigen Blocks-Payload zu senden.
Standard-Slash-Befehl-Einstellungen:
enabled: falsename: "openclaw"sessionPrefix: "slack:slash"ephemeral: true
Slash-Sessions verwenden isolierte Schlüssel:
agent:<agentId>:slack:slash:<userId>
und leiten die Befehlsausführung weiterhin gegen die Zielkonversations-Session (CommandTargetSessionKey) weiter.
Threading, Sessions und Antwort-Tags
- DMs werden als
directgeroutet; Kanäle alschannel; MPIMs alsgroup. - Bei Standard
session.dmScope=mainwerden Slack-DMs zur Agent-Hauptsession zusammengefasst. - Kanal-Sessions:
agent:<agentId>:slack:channel:<channelId>. - Thread-Antworten können Thread-Session-Suffixe erstellen (
:thread:<threadTs>), wenn zutreffend. channels.slack.thread.historyScopeStandard istthread;thread.inheritParentStandard istfalse.channels.slack.thread.initialHistoryLimitsteuert, wie viele bestehende Thread-Nachrichten beim Start einer neuen Thread-Session abgerufen werden (Standard20;0zum Deaktivieren).
Antwort-Threading-Steuerungen:
channels.slack.replyToMode:off|first|all(Standardoff)channels.slack.replyToModeByChatType: prodirect|group|channel- Legacy-Fallback für Direkt-Chats:
channels.slack.dm.replyToMode
Manuelle Antwort-Tags werden unterstützt:
[[reply_to_current]][[reply_to:<id>]]
Hinweis: replyToMode="off" deaktiviert alles Antwort-Threading in Slack, einschließlich expliziter [[reply_to_*]]-Tags. Dies unterscheidet sich von Telegram, wo explizite Tags auch im "off"-Modus weiterhin berücksichtigt werden. Der Unterschied spiegelt die Plattform-Threading-Modelle wider: Slack-Threads verbergen Nachrichten aus dem Kanal, während Telegram-Antworten im Hauptchat-Verlauf sichtbar bleiben.
Medien, Chunking und Zustellung
Eingehende Anhänge
Slack-Dateianhänge werden von Slack-gehosteten privaten URLs heruntergeladen (token-authentifizierter Anfrage-Ablauf) und in den Medienspeicher geschrieben, wenn der Abruf erfolgreich ist und Größenlimits dies erlauben.
Die Laufzeit-Eingangs-Größenbegrenzung ist standardmäßig `20MB`, sofern nicht durch `channels.slack.mediaMaxMb` überschrieben.
Ausgehende Texte und Dateien
- Text-Chunks verwenden `channels.slack.textChunkLimit` (Standard 4000)
- `channels.slack.chunkMode="newline"` aktiviert Absatz-first-Splitting
- Dateisendungen verwenden Slack-Upload-APIs und können Thread-Antworten enthalten (`thread_ts`)
- die ausgehende Medien-Obergrenze folgt `channels.slack.mediaMaxMb`, wenn konfiguriert; andernfalls verwenden Kanalsendungen MIME-Typ-Standards aus der Medien-Pipeline
Zustellungsziele
Bevorzugte explizite Ziele:
- `user:<id>` für DMs
- `channel:<id>` für Kanäle
Slack-DMs werden über Slack-Konversations-APIs geöffnet, wenn an Benutzerziele gesendet wird.
Aktionen und Gates
Slack-Aktionen werden durch channels.slack.actions.* gesteuert.
Verfügbare Aktionsgruppen im aktuellen Slack-Tooling:
| Gruppe | Standard |
|---|---|
| messages | aktiviert |
| reactions | aktiviert |
| pins | aktiviert |
| memberInfo | aktiviert |
| emojiList | aktiviert |
Events und Betriebsverhalten
- Nachrichtenbearbeitungen/-löschungen/Thread-Broadcasts werden auf Systemevents abgebildet.
- Reaktions-Hinzufügen/-Entfernen-Events werden auf Systemevents abgebildet.
- Mitglied-Beitritt/-Austritt, Kanal-Erstellt/-Umbenannt und Pin-Hinzufügen/-Entfernen-Events werden auf Systemevents abgebildet.
- Assistenten-Thread-Status-Updates (für „tippt…”-Indikatoren in Threads) verwenden
assistant.threads.setStatusund erfordern den Bot-Scopeassistant:write. channel_id_changedkann Kanal-Konfigurationsschlüssel migrieren, wennconfigWritesaktiviert ist.- Kanal-Topic/Zweck-Metadaten werden als nicht vertrauenswürdiger Kontext behandelt und können in den Routing-Kontext injiziert werden.
- Block-Aktionen und Modal-Interaktionen emittieren strukturierte
Slack interaction: ...-Systemevents mit umfangreichen Payload-Feldern:- Block-Aktionen: ausgewählte Werte, Labels, Picker-Werte und
workflow_*-Metadaten - Modal
view_submission- undview_closed-Events mit geroutetem Kanal-Metadaten und Formulareingaben
- Block-Aktionen: ausgewählte Werte, Labels, Picker-Werte und
Ack-Reaktionen
ackReaction sendet ein Bestätigungs-Emoji, während OpenClaw eine eingehende Nachricht verarbeitet.
Auflösungsreihenfolge:
channels.slack.accounts.<accountId>.ackReactionchannels.slack.ackReactionmessages.ackReaction- Agent-Identitäts-Emoji-Fallback (
agents.list[].identity.emoji, sonst ”👀”)
Hinweise:
- Slack erwartet Shortcodes (zum Beispiel
"eyes"). - Verwende
"", um die Reaktion für das Slack-Konto oder global zu deaktivieren.
Tipp-Reaktions-Fallback
typingReaction fügt der eingehenden Slack-Nachricht eine temporäre Reaktion hinzu, während OpenClaw eine Antwort verarbeitet, und entfernt sie, wenn der Durchlauf abgeschlossen ist. Dies ist ein nützlicher Fallback, wenn Slack-natives Assistenten-Tippen nicht verfügbar ist, besonders in DMs.
Auflösungsreihenfolge:
channels.slack.accounts.<accountId>.typingReactionchannels.slack.typingReaction
Hinweise:
- Slack erwartet Shortcodes (zum Beispiel
"hourglass_flowing_sand"). - Die Reaktion ist Best-Effort und die Bereinigung wird automatisch nach dem Antwort- oder Fehlerpfad versucht.
Manifest und Scope-Checkliste
Slack-App-Manifest-Beispiel
{
"display_information": {
"name": "OpenClaw",
"description": "Slack connector for OpenClaw"
},
"features": {
"bot_user": {
"display_name": "OpenClaw",
"always_online": false
},
"app_home": {
"messages_tab_enabled": true,
"messages_tab_read_only_enabled": false
},
"slash_commands": [
{
"command": "/openclaw",
"description": "Send a message to OpenClaw",
"should_escape": false
}
]
},
"oauth_config": {
"scopes": {
"bot": [
"chat:write",
"channels:history",
"channels:read",
"groups:history",
"im:history",
"im:read",
"im:write",
"mpim:history",
"mpim:read",
"mpim:write",
"users:read",
"app_mentions:read",
"assistant:write",
"reactions:read",
"reactions:write",
"pins:read",
"pins:write",
"emoji:read",
"commands",
"files:read",
"files:write"
]
}
},
"settings": {
"socket_mode_enabled": true,
"event_subscriptions": {
"bot_events": [
"app_mention",
"message.channels",
"message.groups",
"message.im",
"message.mpim",
"reaction_added",
"reaction_removed",
"member_joined_channel",
"member_left_channel",
"channel_rename",
"pin_added",
"pin_removed"
]
}
}
}
Optionale User-Token-Scopes (Leseoperationen)
Wenn du `channels.slack.userToken` konfigurierst, sind typische Lese-Scopes:
- `channels:history`, `groups:history`, `im:history`, `mpim:history`
- `channels:read`, `groups:read`, `im:read`, `mpim:read`
- `users:read`
- `reactions:read`
- `pins:read`
- `emoji:read`
- `search:read` (wenn du auf Slack-Suchlese angewiesen bist)
Fehlerbehebung
Keine Antworten in Kanälen
Prüfe in dieser Reihenfolge:
- `groupPolicy`
- Kanal-Allowlist (`channels.slack.channels`)
- `requireMention`
- Pro-Kanal-`users`-Allowlist
Nützliche Befehle:
openclaw channels status --probe
openclaw logs --follow
openclaw doctor
DM-Nachrichten ignoriert
Prüfe:
- `channels.slack.dm.enabled`
- `channels.slack.dmPolicy` (oder Legacy `channels.slack.dm.policy`)
- Pairing-Genehmigungen / Allowlist-Einträge
openclaw pairing list slack
Socket Mode verbindet nicht
Überprüfe Bot- + App-Tokens und die Socket Mode-Aktivierung in den Slack-App-Einstellungen.
HTTP-Modus empfängt keine Events
Überprüfe:
- Signing Secret
- Webhook-Pfad
- Slack Request-URLs (Events + Interactivity + Slash Commands)
- eindeutiger `webhookPath` pro HTTP-Konto
Native/Slash-Befehle werden nicht ausgelöst
Prüfe, ob du Folgendes beabsichtigt hast:
- nativer Befehlsmodus (`channels.slack.commands.native: true`) mit passenden Slash-Befehlen, die in Slack registriert sind
- oder Einzelner-Slash-Befehl-Modus (`channels.slack.slashCommand.enabled: true`)
Prüfe auch `commands.useAccessGroups` und Kanal-/Benutzer-Allowlists.
Text-Streaming
OpenClaw unterstützt natives Slack-Text-Streaming über die Agents and AI Apps API.
channels.slack.streaming steuert das Live-Preview-Verhalten:
off: Live-Preview-Streaming deaktivieren.partial(Standard): Preview-Text durch die neueste Teilausgabe ersetzen.block: Chunked Preview-Updates anhängen.progress: Fortschrittsstatus-Text während der Generierung anzeigen, dann endgültigen Text senden.
channels.slack.nativeStreaming steuert Slacks native Streaming-API (chat.startStream / chat.appendStream / chat.stopStream), wenn streaming partial ist (Standard: true).
Natives Slack-Streaming deaktivieren (Draft-Preview-Verhalten beibehalten):
channels:
slack:
streaming: partial
nativeStreaming: false
Legacy-Schlüssel:
channels.slack.streamMode(replace | status_final | append) wird automatisch zuchannels.slack.streamingmigriert.- boolesches
channels.slack.streamingwird automatisch zuchannels.slack.nativeStreamingmigriert.
Anforderungen
- Agents and AI Apps in deinen Slack-App-Einstellungen aktivieren.
- Sicherstellen, dass die App den Scope
assistant:writehat. - Ein Antwort-Thread muss für diese Nachricht verfügbar sein. Die Thread-Auswahl folgt weiterhin
replyToMode.
Verhalten
- Erster Text-Chunk startet einen Stream (
chat.startStream). - Spätere Text-Chunks werden an denselben Stream angehängt (
chat.appendStream). - Ende der Antwort finalisiert den Stream (
chat.stopStream). - Medien und Nicht-Text-Payloads fallen auf normale Zustellung zurück.
- Wenn Streaming mitten in der Antwort fehlschlägt, fällt OpenClaw für verbleibende Payloads auf normale Zustellung zurück.
Konfigurationsreferenz
Primäre Referenz:
-
Configuration reference - Slack
Wichtige Slack-Felder:
- Modus/Auth:
mode,botToken,appToken,signingSecret,webhookPath,accounts.* - DM-Zugriff:
dm.enabled,dmPolicy,allowFrom(Legacy:dm.policy,dm.allowFrom),dm.groupEnabled,dm.groupChannels - Kompatibilitätsschalter:
dangerouslyAllowNameMatching(Notfall; deaktiviert lassen, wenn nicht benötigt) - Kanalzugriff:
groupPolicy,channels.*,channels.*.users,channels.*.requireMention - Threading/History:
replyToMode,replyToModeByChatType,thread.*,historyLimit,dmHistoryLimit,dms.*.historyLimit - Zustellung:
textChunkLimit,chunkMode,mediaMaxMb,streaming,nativeStreaming - Betrieb/Features:
configWrites,commands.native,slashCommand.*,actions.*,userToken,userTokenReadOnly
- Modus/Auth: