Mainstream messaging
Slack
Produktionsreif für DMs und Kanäle über Slack-App-Integrationen. Der Standardmodus ist Socket Mode; HTTP Request URLs werden ebenfalls unterstützt. Der Relay-Modus ist für verwaltete Bereitstellungen vorgesehen, bei denen ein vertrauenswürdiger Router den Slack-Eingang besitzt.
Slack-DMs verwenden standardmäßig den Kopplungsmodus.
Natives Befehlsverhalten und Befehlskatalog.
Kanalübergreifende Diagnose- und Reparatur-Playbooks.
Socket Mode oder HTTP Request URLs auswählen
Beide Transporte sind produktionsreif und erreichen Funktionsparität für Messaging, Slash-Befehle, App Home und Interaktivität. Wählen Sie nach Bereitstellungsform, nicht nach Funktionen.
| Aspekt | Socket Mode (Standard) | HTTP Request URLs |
|---|---|---|
| Öffentliche Gateway-URL | Nicht erforderlich | Erforderlich (DNS, TLS, Reverse-Proxy oder Tunnel) |
| Ausgehendes Netzwerk | Ausgehendes WSS zu wss-primary.slack.com muss erreichbar sein |
Kein ausgehendes WS; nur eingehendes HTTPS |
| Benötigte Token | Bot-Token + App-Level Token mit connections:write |
Bot-Token + Signing Secret |
| Entwickler-Laptop / hinter Firewall | Funktioniert unverändert | Benötigt einen öffentlichen Tunnel (ngrok, Cloudflare Tunnel, Tailscale Funnel) oder ein Staging-Gateway |
| Horizontale Skalierung | Eine Socket-Mode-Sitzung pro App und Host; mehrere Gateways benötigen separate Slack-Apps | Zustandsloser POST-Handler; mehrere Gateway-Replikate können eine App hinter einem Load Balancer teilen |
| Mehrere Konten auf einem Gateway | Unterstützt; jedes Konto öffnet eigenes WS | Unterstützt; jedes Konto benötigt einen eindeutigen webhookPath (Standard /slack/events), damit Registrierungen nicht kollidieren |
| Transport für Slash-Befehl | Wird über die WS-Verbindung zugestellt; slash_commands[].url wird ignoriert |
Slack sendet POSTs an slash_commands[].url; das Feld ist erforderlich, damit der Befehl ausgelöst wird |
| Request-Signierung | Nicht verwendet (Authentifizierung ist das App-Level Token) | Slack signiert jede Anfrage; OpenClaw prüft mit signingSecret |
| Wiederherstellung nach Verbindungsabbruch | Automatische Wiederverbindung des Slack SDK ist aktiviert; OpenClaw startet fehlgeschlagene Socket-Mode-Sitzungen zusätzlich mit begrenztem Backoff neu. Pong-Timeout-Transportabstimmung gilt. | Keine persistente Verbindung, die abbrechen kann; Wiederholungen erfolgen pro Anfrage durch Slack |
Relay-Modus
Der Relay-Modus trennt den Slack-Eingang vom OpenClaw-Gateway. Ein vertrauenswürdiger Router besitzt die einzelne Slack-Socket-Mode-Verbindung, wählt ein Ziel-Gateway aus und leitet ein typisiertes Ereignis über einen authentifizierten Websocket weiter. Das Gateway verwendet weiterhin sein Bot-Token für ausgehende Slack-Web-API-Aufrufe.
{ channels: { slack: { mode: "relay", botToken: { source: "env", provider: "default", id: "SLACK_BOT_TOKEN" }, relay: { url: "wss://router.example.com/gateway/ws", authToken: { source: "env", provider: "default", id: "SLACK_RELAY_AUTH_TOKEN" }, gatewayId: "team-gateway", }, }, },}Die Relay-URL muss wss:// verwenden, außer sie zielt auf localhost. Behandeln Sie das Bearer-Token und
die Routing-Tabelle des Routers als Teil der Slack-Autorisierungsgrenze: Weitergeleitete Ereignisse gelangen als autorisierte Aktivierungen in den
normalen Slack-Nachrichtenhandler. Eine vom Router bereitgestellte slack_identity
im Websocket-hello-Frame kann den standardmäßigen ausgehenden Benutzernamen und das Symbol festlegen; eine explizit
vom Aufrufer bereitgestellte Identität hat weiterhin Vorrang. Die Relay-Verbindung stellt die Verbindung mit demselben
begrenzten Backoff-Timing wieder her, das von Socket Mode verwendet wird, und löscht die vom Router bereitgestellte Identität immer dann,
wenn die Verbindung getrennt wird.
Installation
Installieren Sie Slack, bevor Sie den Kanal konfigurieren:
openclaw plugins install @openclaw/slackplugins install registriert und aktiviert das Plugin. Das Plugin tut dennoch nichts, bis Sie die Slack-App und die Kanaleinstellungen unten konfigurieren. Allgemeines Plugin-Verhalten und Installationsregeln finden Sie unter Plugins.
Schnelleinrichtung
Socket Mode (default)
Create a new Slack app
Öffnen Sie api.slack.com/apps → Create New App → From a manifest → wählen Sie Ihren Workspace aus → fügen Sie eines der folgenden Manifeste ein → Next → Create.
{"display_information": {"name": "OpenClaw","description": "Slack connector for OpenClaw"},"features": {"bot_user": { "display_name": "OpenClaw", "always_online": true },"app_home": {"home_tab_enabled": true,"messages_tab_enabled": true,"messages_tab_read_only_enabled": false},"assistant_view": {"assistant_description": "OpenClaw connects Slack assistant threads to OpenClaw agents.","suggested_prompts": [{ "title": "What can you do?", "message": "What can you help me with?" },{"title": "Summarize this channel","message": "Summarize the recent activity in this channel."},{ "title": "Draft a reply", "message": "Help me draft a reply." }]},"slash_commands": [{"command": "/openclaw","description": "Send a message to OpenClaw","should_escape": false}]},"oauth_config": {"scopes": {"bot": ["app_mentions:read","assistant:write","channels:history","channels:read","chat:write","commands","emoji:read","files:read","files:write","groups:history","groups:read","im:history","im:read","im:write","mpim:history","mpim:read","mpim:write","pins:read","pins:write","reactions:read","reactions:write","usergroups:read","users:read"]}},"settings": {"socket_mode_enabled": true,"event_subscriptions": {"bot_events": ["app_home_opened","app_mention","assistant_thread_context_changed","assistant_thread_started","channel_rename","member_joined_channel","member_left_channel","message.channels","message.groups","message.im","message.mpim","pin_added","pin_removed","reaction_added","reaction_removed"]}}}{"display_information": {"name": "OpenClaw","description": "Slack connector for OpenClaw"},"features": {"bot_user": { "display_name": "OpenClaw", "always_online": true },"app_home": {"home_tab_enabled": true,"messages_tab_enabled": true,"messages_tab_read_only_enabled": false},"assistant_view": {"assistant_description": "OpenClaw connects Slack assistant threads to OpenClaw agents.","suggested_prompts": [{ "title": "What can you do?", "message": "What can you help me with?" },{"title": "Summarize this channel","message": "Summarize the recent activity in this channel."},{ "title": "Draft a reply", "message": "Help me draft a reply." }]},"slash_commands": [{"command": "/openclaw","description": "Send a message to OpenClaw","should_escape": false}]},"oauth_config": {"scopes": {"bot": ["app_mentions:read","assistant:write","channels:history","channels:read","chat:write","commands","groups:history","groups:read","im:history","im:read","im:write","users:read"]}},"settings": {"socket_mode_enabled": true,"event_subscriptions": {"bot_events": ["app_home_opened","app_mention","assistant_thread_context_changed","assistant_thread_started","message.channels","message.groups","message.im"]}}}Nachdem Slack die App erstellt hat:
- Basic Information -> App-Level Tokens -> Generate Token and Scopes: Fügen Sie
connections:writehinzu, speichern Sie und kopieren Sie das App-Level Token. - Install App -> Install to Workspace: Kopieren Sie das Bot User OAuth Token.
Configure OpenClaw
Empfohlene SecretRef-Einrichtung:
export SLACK_APP_TOKEN=slack-app-token-exampleexport SLACK_BOT_TOKEN=slack-bot-token-examplecat > slack.socket.patch.json5 <<'JSON5'{channels: {slack: {enabled: true,mode: "socket",appToken: { source: "env", provider: "default", id: "SLACK_APP_TOKEN" },botToken: { source: "env", provider: "default", id: "SLACK_BOT_TOKEN" },},},}JSON5openclaw config patch --file ./slack.socket.patch.json5 --dry-runopenclaw config patch --file ./slack.socket.patch.json5Env-Fallback (nur Standardkonto):
SLACK_APP_TOKEN=slack-app-token-exampleSLACK_BOT_TOKEN=slack-bot-token-exampleStart gateway
openclaw gatewayHTTP-Anfrage-URLs
Neue Slack-App erstellen
Öffnen Sie api.slack.com/apps → Neue App erstellen → Aus einem Manifest → wählen Sie Ihren Workspace aus → fügen Sie eines der unten stehenden Manifeste ein → ersetzen Sie https://gateway-host.example.com/slack/events durch Ihre öffentliche Gateway-URL → Weiter → Erstellen.
{"display_information": {"name": "OpenClaw","description": "Slack connector for OpenClaw"},"features": {"bot_user": { "display_name": "OpenClaw", "always_online": true },"app_home": {"home_tab_enabled": true,"messages_tab_enabled": true,"messages_tab_read_only_enabled": false},"assistant_view": {"assistant_description": "OpenClaw connects Slack assistant threads to OpenClaw agents.","suggested_prompts": [{ "title": "What can you do?", "message": "What can you help me with?" },{"title": "Summarize this channel","message": "Summarize the recent activity in this channel."},{ "title": "Draft a reply", "message": "Help me draft a reply." }]},"slash_commands": [{"command": "/openclaw","description": "Send a message to OpenClaw","should_escape": false,"url": "https://gateway-host.example.com/slack/events"}]},"oauth_config": {"scopes": {"bot": ["app_mentions:read","assistant:write","channels:history","channels:read","chat:write","commands","emoji:read","files:read","files:write","groups:history","groups:read","im:history","im:read","im:write","mpim:history","mpim:read","mpim:write","pins:read","pins:write","reactions:read","reactions:write","usergroups:read","users:read"]}},"settings": {"event_subscriptions": {"request_url": "https://gateway-host.example.com/slack/events","bot_events": ["app_home_opened","app_mention","assistant_thread_context_changed","assistant_thread_started","channel_rename","member_joined_channel","member_left_channel","message.channels","message.groups","message.im","message.mpim","pin_added","pin_removed","reaction_added","reaction_removed"]},"interactivity": {"is_enabled": true,"request_url": "https://gateway-host.example.com/slack/events","message_menu_options_url": "https://gateway-host.example.com/slack/events"}}}{"display_information": {"name": "OpenClaw","description": "Slack connector for OpenClaw"},"features": {"bot_user": { "display_name": "OpenClaw", "always_online": true },"app_home": {"home_tab_enabled": true,"messages_tab_enabled": true,"messages_tab_read_only_enabled": false},"assistant_view": {"assistant_description": "OpenClaw connects Slack assistant threads to OpenClaw agents.","suggested_prompts": [{ "title": "What can you do?", "message": "What can you help me with?" },{"title": "Summarize this channel","message": "Summarize the recent activity in this channel."},{ "title": "Draft a reply", "message": "Help me draft a reply." }]},"slash_commands": [{"command": "/openclaw","description": "Send a message to OpenClaw","should_escape": false,"url": "https://gateway-host.example.com/slack/events"}]},"oauth_config": {"scopes": {"bot": ["app_mentions:read","assistant:write","channels:history","channels:read","chat:write","commands","groups:history","groups:read","im:history","im:read","im:write","users:read"]}},"settings": {"event_subscriptions": {"request_url": "https://gateway-host.example.com/slack/events","bot_events": ["app_home_opened","app_mention","assistant_thread_context_changed","assistant_thread_started","message.channels","message.groups","message.im"]},"interactivity": {"is_enabled": true,"request_url": "https://gateway-host.example.com/slack/events","message_menu_options_url": "https://gateway-host.example.com/slack/events"}}}Nachdem Slack die App erstellt hat:
- Grundinformationen → App-Anmeldedaten: Kopieren Sie das Signing Secret zur Anfrageverifizierung.
- App installieren -> In Workspace installieren: Kopieren Sie das Bot User OAuth Token.
OpenClaw konfigurieren
Empfohlene SecretRef-Einrichtung:
export SLACK_BOT_TOKEN=slack-bot-token-exampleexport SLACK_SIGNING_SECRET=...cat > slack.http.patch.json5 <<'JSON5'{channels: {slack: {enabled: true,mode: "http",botToken: { source: "env", provider: "default", id: "SLACK_BOT_TOKEN" },signingSecret: { source: "env", provider: "default", id: "SLACK_SIGNING_SECRET" },webhookPath: "/slack/events",},},}JSON5openclaw config patch --file ./slack.http.patch.json5 --dry-runopenclaw config patch --file ./slack.http.patch.json5Gateway starten
openclaw gatewayTransportabstimmung für Socket Mode
OpenClaw setzt das Pong-Timeout des Slack-SDK-Clients im Socket Mode standardmäßig auf 15 Sekunden. Überschreiben Sie die Transporteinstellungen nur, wenn Sie Workspace- oder host-spezifische Abstimmung benötigen:
{ channels: { slack: { mode: "socket", socketMode: { clientPingTimeout: 20000, serverPingTimeout: 30000, pingPongLoggingEnabled: false, }, }, },}Verwenden Sie dies nur für Socket-Mode-Workspaces, die Slack-WebSocket-Pong-/Server-Ping-Timeouts protokollieren oder auf Hosts mit bekannter Event-Loop-Überlastung laufen. clientPingTimeout ist die Wartezeit auf Pong, nachdem das SDK einen Client-Ping sendet; serverPingTimeout ist die Wartezeit auf Slack-Server-Pings. App-Nachrichten und Events bleiben Anwendungszustand, keine Liveness-Signale des Transports.
Hinweise:
socketModewird im HTTP Request URL-Modus ignoriert.- Basis-Einstellungen unter
channels.slack.socketModegelten für alle Slack-Konten, sofern sie nicht überschrieben werden. Kontospezifische Überschreibungen verwendenchannels.slack.accounts.<accountId>.socketMode; da dies eine Objektüberschreibung ist, müssen Sie jedes Socket-Abstimmungsfeld angeben, das Sie für dieses Konto verwenden möchten. - Nur
clientPingTimeouthat einen OpenClaw-Standardwert (15000).serverPingTimeoutundpingPongLoggingEnabledwerden nur bei Konfiguration an das Slack-SDK übergeben. - Der Neustart-Backoff für Socket Mode beginnt bei etwa 2 Sekunden und ist bei etwa 30 Sekunden gedeckelt. Wiederherstellbare Start-, Start-Warte- und Verbindungsabbruchfehler werden erneut versucht, bis der Channel stoppt. Permanente Konto- und Anmeldedatenfehler wie ungültige Authentifizierung, widerrufene Tokens oder fehlende Scopes schlagen schnell fehl, statt unbegrenzt wiederholt zu werden.
Manifest- und Scope-Checkliste
Das Basismanifest der Slack-App ist für Socket Mode und HTTP-Anfrage-URLs identisch. Nur der Block settings (und die Slash-Befehl-url) unterscheidet sich.
Basismanifest (Socket-Mode-Standard):
{ "display_information": { "name": "OpenClaw", "description": "Slack connector for OpenClaw" }, "features": { "bot_user": { "display_name": "OpenClaw", "always_online": true }, "app_home": { "home_tab_enabled": true, "messages_tab_enabled": true, "messages_tab_read_only_enabled": false }, "assistant_view": { "assistant_description": "OpenClaw connects Slack assistant threads to OpenClaw agents.", "suggested_prompts": [ { "title": "What can you do?", "message": "What can you help me with?" }, { "title": "Summarize this channel", "message": "Summarize the recent activity in this channel." }, { "title": "Draft a reply", "message": "Help me draft a reply." } ] }, "slash_commands": [ { "command": "/openclaw", "description": "Send a message to OpenClaw", "should_escape": false } ] }, "oauth_config": { "scopes": { "bot": [ "app_mentions:read", "assistant:write", "channels:history", "channels:read", "chat:write", "commands", "emoji:read", "files:read", "files:write", "groups:history", "groups:read", "im:history", "im:read", "im:write", "mpim:history", "mpim:read", "mpim:write", "pins:read", "pins:write", "reactions:read", "reactions:write", "usergroups:read", "users:read" ] } }, "settings": { "socket_mode_enabled": true, "event_subscriptions": { "bot_events": [ "app_home_opened", "app_mention", "assistant_thread_context_changed", "assistant_thread_started", "channel_rename", "member_joined_channel", "member_left_channel", "message.channels", "message.groups", "message.im", "message.mpim", "pin_added", "pin_removed", "reaction_added", "reaction_removed" ] } }}Ersetzen Sie für den HTTP Request URLs-Modus settings durch die HTTP-Variante und fügen Sie jedem Slash-Befehl url hinzu. Öffentliche URL erforderlich:
{ "features": { "slash_commands": [ { "command": "/openclaw", "description": "Send a message to OpenClaw", "should_escape": false, "url": "https://gateway-host.example.com/slack/events" } ] }, "settings": { "event_subscriptions": { "request_url": "https://gateway-host.example.com/slack/events", "bot_events": [ "app_home_opened", "app_mention", "assistant_thread_context_changed", "assistant_thread_started", "channel_rename", "member_joined_channel", "member_left_channel", "message.channels", "message.groups", "message.im", "message.mpim", "pin_added", "pin_removed", "reaction_added", "reaction_removed" ] }, "interactivity": { "is_enabled": true, "request_url": "https://gateway-host.example.com/slack/events", "message_menu_options_url": "https://gateway-host.example.com/slack/events" } }}Zusätzliche Manifest-Einstellungen
Zeigen Sie andere Funktionen an, die die oben genannten Standardwerte erweitern.
Das Standardmanifest aktiviert den Slack App Home-Tab Home und abonniert app_home_opened. Wenn ein Workspace-Mitglied den Home-Tab öffnet, veröffentlicht OpenClaw mit views.publish eine sichere Standard-Home-Ansicht; es werden keine Konversations-Payloads oder privaten Konfigurationen einbezogen. Der Tab Messages bleibt für Slack-DMs aktiviert. Das Manifest aktiviert außerdem Slack-Assistant-Threads mit features.assistant_view, assistant:write, assistant_thread_started und assistant_thread_context_changed; Assistant-Threads werden an eigene OpenClaw-Thread-Sessions weitergeleitet und halten den von Slack bereitgestellten Thread-Kontext für den Agent verfügbar.
Optional native slash commands
Mehrere native Slash-Befehle können mit entsprechenden Nuancen anstelle eines einzelnen konfigurierten Befehls verwendet werden:
- Verwenden Sie
/agentstatusstatt/status, da der Befehl/statusreserviert ist. - Es können höchstens 25 Slash-Befehle gleichzeitig verfügbar gemacht werden.
Ersetzen Sie Ihren vorhandenen Abschnitt features.slash_commands durch eine Teilmenge der verfügbaren Befehle:
Socket Mode (default)
{"slash_commands": [{"command": "/new","description": "Start a new session","usage_hint": "[model]"},{"command": "/reset","description": "Reset the current session"},{"command": "/compact","description": "Compact the session context","usage_hint": "[instructions]"},{"command": "/stop","description": "Stop the current run"},{"command": "/session","description": "Manage thread-binding expiry","usage_hint": "idle <duration|off> or max-age <duration|off>"},{"command": "/think","description": "Set the thinking level","usage_hint": "<level>"},{"command": "/verbose","description": "Toggle verbose output","usage_hint": "on|off|full"},{"command": "/fast","description": "Show or set fast mode","usage_hint": "[status|on|off]"},{"command": "/reasoning","description": "Toggle reasoning visibility","usage_hint": "[on|off|stream]"},{"command": "/elevated","description": "Toggle elevated mode","usage_hint": "[on|off|ask|full]"},{"command": "/exec","description": "Show or set exec defaults","usage_hint": "host=<auto|sandbox|gateway|node> security=<deny|allowlist|full> ask=<off|on-miss|always> node=<id>"},{"command": "/approve","description": "Approve or deny pending approval requests","usage_hint": "<id> <decision>"},{"command": "/model","description": "Show or set the model","usage_hint": "[name|#|status]"},{"command": "/models","description": "List providers/models","usage_hint": "[provider] [page] [limit=<n>|size=<n>|all]"},{"command": "/help","description": "Show the short help summary"},{"command": "/commands","description": "Show the generated command catalog"},{"command": "/tools","description": "Show what the current agent can use right now","usage_hint": "[compact|verbose]"},{"command": "/agentstatus","description": "Show runtime status, including provider usage/quota when available"},{"command": "/tasks","description": "List active/recent background tasks for the current session"},{"command": "/context","description": "Explain how context is assembled","usage_hint": "[list|detail|json]"},{"command": "/whoami","description": "Show your sender identity"},{"command": "/skill","description": "Run a skill by name","usage_hint": "<name> [input]"},{"command": "/btw","description": "Ask a side question without changing session context","usage_hint": "<question>"},{"command": "/side","description": "Ask a side question without changing session context","usage_hint": "<question>"},{"command": "/usage","description": "Control the usage footer or show cost summary","usage_hint": "off|tokens|full|cost"}]}HTTP Request URLs
Verwenden Sie dieselbe slash_commands-Liste wie oben für Socket Mode und fügen Sie jedem Eintrag "url": "https://gateway-host.example.com/slack/events" hinzu. Beispiel:
{"slash_commands": [{"command": "/new","description": "Start a new session","usage_hint": "[model]","url": "https://gateway-host.example.com/slack/events"},{"command": "/help","description": "Show the short help summary","url": "https://gateway-host.example.com/slack/events"}]}Wiederholen Sie diesen url-Wert für jeden Befehl in der Liste.
Optional authorship scopes (write operations)
Fügen Sie den Bot-Scope chat:write.customize hinzu, wenn ausgehende Nachrichten die aktive Agent-Identität (benutzerdefinierter Benutzername und Icon) statt der standardmäßigen Slack-App-Identität verwenden sollen.
Wenn Sie ein Emoji-Icon verwenden, erwartet Slack die Syntax :emoji_name:.
Optional user-token scopes (read operations)
Wenn Sie channels.slack.userToken konfigurieren, sind typische Lese-Scopes:
channels:history,groups:history,im:history,mpim:historychannels:read,groups:read,im:read,mpim:readusers:readreactions:readpins:reademoji:readsearch:read(wenn Sie von Slack-Suchlesevorgängen abhängen)
Token-Modell
botToken+appTokensind für Socket Mode erforderlich.- Der HTTP-Modus erfordert
botToken+signingSecret. - Der Relay-Modus erfordert
botTokensowierelay.url,relay.authTokenundrelay.gatewayId; er verwendet kein App-Token und kein Signing Secret. botToken,appToken,signingSecret,relay.authTokenunduserTokenakzeptieren Klartext- Zeichenfolgen oder SecretRef-Objekte.- Konfigurations-Token überschreiben Env-Fallbacks.
- Der Env-Fallback
SLACK_BOT_TOKEN/SLACK_APP_TOKENgilt nur für das Standardkonto. userTokenist ausschließlich konfigurationsbasiert (kein Env-Fallback) und ist standardmäßig auf schreibgeschütztes Verhalten eingestellt (userTokenReadOnly: true).
Verhalten von Status-Snapshots:
- Die Slack-Kontoinspektion verfolgt pro Zugangsdaten die Felder
*Sourceund*Status(botToken,appToken,signingSecret,userToken). - Der Status ist
available,configured_unavailableodermissing. configured_unavailablebedeutet, dass das Konto über SecretRef oder eine andere nicht inline angegebene Secret-Quelle konfiguriert ist, der aktuelle Befehls-/Runtime-Pfad den tatsächlichen Wert jedoch nicht auflösen konnte.- Im HTTP-Modus ist
signingSecretStatusenthalten; in Socket Mode ist das erforderliche PaarbotTokenStatus+appTokenStatus.
Aktionen und Gates
Slack-Aktionen werden über channels.slack.actions.* gesteuert.
Verfügbare Aktionsgruppen im aktuellen Slack-Tooling:
| Gruppe | Standard |
|---|---|
| messages | enabled |
| reactions | enabled |
| pins | enabled |
| memberInfo | enabled |
| emojiList | enabled |
Aktuelle Slack-Nachrichtenaktionen umfassen send, upload-file, download-file, read, edit, delete, pin, unpin, list-pins, member-info und emoji-list. download-file akzeptiert Slack-Datei-IDs, die in Platzhaltern für eingehende Dateien angezeigt werden, und gibt für Bilder Bildvorschauen oder für andere Dateitypen lokale Dateimetadaten zurück.
Zugriffssteuerung und Routing
DM policy
channels.slack.dmPolicy steuert den DM-Zugriff. channels.slack.allowFrom ist die kanonische DM-Allowlist.
pairing(Standard)allowlistopen(erfordert, dasschannels.slack.allowFrom"*"enthält)disabled
DM-Flags:
dm.enabled(standardmäßig true)channels.slack.allowFromdm.allowFrom(Legacy)dm.groupEnabled(Gruppen-DMs standardmäßig false)dm.groupChannels(optionale MPIM-Allowlist)
Priorität bei mehreren Konten:
channels.slack.accounts.default.allowFromgilt nur für das Kontodefault.- Benannte Konten erben
channels.slack.allowFrom, wenn ihr eigenesallowFromnicht gesetzt ist. - Benannte Konten erben
channels.slack.accounts.default.allowFromnicht.
Die Legacy-Werte channels.slack.dm.policy und channels.slack.dm.allowFrom werden aus Kompatibilitätsgründen weiterhin gelesen. openclaw doctor --fix migriert sie zu dmPolicy und allowFrom, wenn dies ohne Änderung des Zugriffs möglich ist.
Pairing in DMs verwendet openclaw pairing approve slack <code>.
Channel policy
channels.slack.groupPolicy steuert die Kanalverarbeitung:
openallowlistdisabled
Die Kanal-Allowlist befindet sich unter channels.slack.channels und muss stabile Slack-Kanal-IDs (zum Beispiel C12345678) als Konfigurationsschlüssel verwenden.
Laufzeithinweis: Wenn channels.slack vollständig fehlt (reine Env-Einrichtung), fällt die Laufzeit auf groupPolicy="allowlist" zurück und protokolliert eine Warnung (auch wenn channels.defaults.groupPolicy gesetzt ist).
Namens-/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 Kanalnamens-Einträge bleiben wie konfiguriert erhalten, werden standardmäßig aber beim Routing ignoriert
- eingehende Autorisierung und Kanal-Routing sind standardmäßig ID-first; direkter Abgleich von Benutzernamen/Slugs erfordert
channels.slack.dangerouslyAllowNameMatching: true
Mentions and channel users
Kanalnachrichten sind standardmäßig durch Erwähnungen geschützt.
Erwähnungsquellen:
- explizite App-Erwähnung (
<@botId>) - Slack-Benutzergruppen-Erwähnung (
<!subteam^S...>), wenn der Bot-Benutzer Mitglied dieser Benutzergruppe ist; erfordertusergroups:read - Erwähnungs-Regex-Muster (
agents.list[].groupChat.mentionPatterns, Fallbackmessages.groupChat.mentionPatterns) - implizites Antwort-an-Bot-Thread-Verhalten (deaktiviert, wenn
thread.requireExplicitMentiontrueist)
Pro-Kanal-Steuerungen (channels.slack.channels.<id>; Namen nur über Startauflösung oder dangerouslyAllowNameMatching):
requireMentionusers(Allowlist)allowBotsskillssystemPrompttools,toolsBySender- Schlüsselformat für
toolsBySender:channel:,id:,e164:,username:,name:oder"*"-Wildcard (Legacy-Schlüssel ohne Präfix werden weiterhin nurid:zugeordnet)
allowBots ist für Kanäle und private Kanäle konservativ: Von Bots verfasste Raumnachrichten werden nur akzeptiert, wenn der sendende Bot ausdrücklich in der users-Allowlist dieses Raums aufgeführt ist oder wenn mindestens eine explizite Slack-Owner-ID aus channels.slack.allowFrom derzeit Mitglied des Raums ist. Wildcards und Owner-Einträge mit Anzeigenamen erfüllen die Owner-Präsenz nicht. Die Owner-Präsenz verwendet Slack conversations.members; stellen Sie sicher, dass die App den passenden Lesebereich für den Raumtyp hat (channels:read für öffentliche Kanäle, groups:read für private Kanäle). Wenn die Mitgliedersuche fehlschlägt, verwirft OpenClaw die vom Bot verfasste Raumnachricht.
Akzeptierte, von Bots verfasste Slack-Nachrichten verwenden den gemeinsamen Bot-Loop-Schutz. Konfigurieren Sie channels.defaults.botLoopProtection für das Standardbudget und überschreiben Sie es dann mit channels.slack.botLoopProtection oder channels.slack.channels.<id>.botLoopProtection, wenn ein Workspace oder Kanal ein anderes Limit benötigt.
Threading, Sitzungen und Antwort-Tags
- DMs werden als
directgeroutet; Kanäle alschannel; MPIMs alsgroup. - Slack-Routenbindungen akzeptieren rohe Peer-IDs sowie Slack-Zielformen wie
channel:C12345678,user:U12345678und<@U12345678>. - Mit dem Standard
session.dmScope=mainwerden Slack-DMs auf die Hauptsitzung des Agenten reduziert. - Kanalsitzungen:
agent:<agentId>:slack:channel:<channelId>. - Gewöhnliche Top-Level-Kanalnachrichten bleiben in der Sitzung pro Kanal, selbst wenn
replyToModenichtoffist. - Slack-Thread-Antworten verwenden das übergeordnete Slack-
thread_tsfür Sitzungssuffixe (:thread:<threadTs>), selbst wenn ausgehendes Antwort-Threading mitreplyToMode="off"deaktiviert ist. - OpenClaw setzt einen geeigneten Top-Level-Kanal-Root in
agent:<agentId>:slack:channel:<channelId>:thread:<rootTs>ein, wenn dieser Root voraussichtlich einen sichtbaren Slack-Thread startet, sodass der Root und spätere Thread-Antworten dieselbe OpenClaw-Sitzung teilen. Dies gilt fürapp_mention-Ereignisse, explizite Bot- oder konfigurierte Erwähnungsmuster-Treffer und Kanäle mitrequireMention: falseund nicht-offreplyToMode. - Der Standard für
channels.slack.thread.historyScopeistthread; der Standard fürthread.inheritParentistfalse. channels.slack.thread.initialHistoryLimitsteuert, wie viele vorhandene Thread-Nachrichten abgerufen werden, wenn eine neue Thread-Sitzung startet (Standard20; auf0setzen, um dies zu deaktivieren).channels.slack.thread.requireExplicitMention(Standardfalse): Wenntrue, werden implizite Thread-Erwähnungen unterdrückt, sodass der Bot nur auf explizite@bot-Erwähnungen innerhalb von Threads reagiert, selbst wenn der Bot bereits am Thread beteiligt war. Ohne dies umgehen Antworten in einem Thread mit Bot-Beteiligung dasrequireMention-Gating.
Steuerung des Antwort-Threadings:
channels.slack.replyToMode:off|first|all|batched(Standardoff)channels.slack.replyToModeByChatType: prodirect|group|channel- Legacy-Fallback für direkte Chats:
channels.slack.dm.replyToMode
Manuelle Antwort-Tags werden unterstützt:
[[reply_to_current]][[reply_to:<id>]]
Für explizite Slack-Thread-Antworten aus dem message-Tool setzen Sie replyBroadcast: true mit action: "send" und threadId oder replyTo, um Slack aufzufordern, die Thread-Antwort auch im übergeordneten Kanal zu veröffentlichen. Dies wird auf Slacks chat.postMessage-Flag reply_broadcast abgebildet und wird nur für Text- oder Block-Kit-Sendungen unterstützt, nicht für Medien-Uploads.
Wenn ein message-Tool-Aufruf innerhalb eines Slack-Threads läuft und denselben Kanal adressiert, übernimmt OpenClaw normalerweise den aktuellen Slack-Thread gemäß replyToMode. Setzen Sie topLevel: true bei action: "send" oder action: "upload-file", um stattdessen eine neue Nachricht im übergeordneten Kanal zu erzwingen. threadId: null wird als dieselbe Top-Level-Abwahl akzeptiert.
Ack-Reaktionen
ackReaction sendet ein Bestätigungs-Emoji, während OpenClaw eine eingehende Nachricht verarbeitet. ackReactionScope entscheidet, wann dieses Emoji tatsächlich gesendet wird.
Emoji (ackReaction)
Auflösungsreihenfolge:
channels.slack.accounts.<accountId>.ackReactionchannels.slack.ackReactionmessages.ackReaction- Fallback auf Emoji der Agentenidentität (
agents.list[].identity.emoji, sonst"eyes"/ 👀)
Hinweise:
- Slack erwartet Shortcodes (zum Beispiel
"eyes"). - Verwenden Sie
"", um die Reaktion für das Slack-Konto oder global zu deaktivieren.
Scope (messages.ackReactionScope)
Der Slack-Provider liest den Scope aus messages.ackReactionScope (Standard "group-mentions"). Es gibt heute keine Überschreibung auf Slack-Konto- oder Slack-Kanalebene; der Wert gilt global für den Gateway.
Werte:
"all": in DMs und Gruppen reagieren."direct": nur in DMs reagieren."group-all": auf jede Gruppennachricht reagieren (keine DMs)."group-mentions"(Standard): in Gruppen reagieren, aber nur wenn der Bot erwähnt wird (oder in Gruppenerwähnungen, die sich dafür entschieden haben). DMs sind ausgeschlossen."off"/"none": nie reagieren.
{ messages: { ackReaction: "eyes", ackReactionScope: "all", // react in DMs and groups },}Text-Streaming
channels.slack.streaming steuert das Live-Vorschauverhalten:
off: Live-Vorschau-Streaming deaktivieren.partial(Standard): Vorschautext durch die neueste Teilausgabe ersetzen.block: gestückelte Vorschau-Updates anhängen.progress: Fortschrittsstatus-Text während der Generierung anzeigen und anschließend finalen Text senden.streaming.preview.toolProgress: Wenn die Entwurfsvorschau aktiv ist, Tool-/Fortschrittsupdates in dieselbe bearbeitete Vorschaunachricht routen (Standard:true). Auffalsesetzen, um separate Tool-/Fortschrittsnachrichten beizubehalten.streaming.preview.commandText/streaming.progress.commandText: aufstatussetzen, um kompakte Tool-Fortschrittszeilen beizubehalten und rohen Befehls-/Ausführungstext auszublenden (Standard:raw).
Rohen Befehls-/Ausführungstext ausblenden und kompakte Fortschrittszeilen beibehalten:
{ "channels": { "slack": { "streaming": { "mode": "progress", "progress": { "toolProgress": true, "commandText": "status" } } } }}channels.slack.streaming.nativeTransport steuert Slack-natives Text-Streaming, wenn channels.slack.streaming.mode partial ist (Standard: true).
Slack-native Fortschritts-Aufgabenkarten sind für den Fortschrittsmodus opt-in. Setzen Sie channels.slack.streaming.progress.nativeTaskCards auf true mit channels.slack.streaming.mode="progress", um eine Slack-native Plan-/Aufgabenkarte zu senden, während die Arbeit läuft, und dieselbe Aufgabenkarte bei Abschluss zu aktualisieren. Ohne dieses Flag behält der Fortschrittsmodus das portable Entwurfsvorschauverhalten bei.
- Für natives Text-Streaming und die Anzeige des Slack-Assistenten-Threadstatus muss ein Antwort-Thread verfügbar sein. Die Thread-Auswahl folgt weiterhin
replyToMode. - Kanal-, Gruppenchat- und Top-Level-DM-Roots können weiterhin die normale Entwurfsvorschau verwenden, wenn natives Streaming nicht verfügbar ist oder kein Antwort-Thread existiert.
- Top-Level-Slack-DMs bleiben standardmäßig außerhalb von Threads, daher zeigen sie Slacks threadartige native Stream-/Statusvorschau nicht an; OpenClaw postet und bearbeitet stattdessen eine Entwurfsvorschau in der DM.
- Medien und Nicht-Text-Payloads fallen auf normale Zustellung zurück.
- Medien-/Fehler-Endausgaben brechen ausstehende Vorschau-Bearbeitungen ab; geeignete Text-/Block-Endausgaben werden nur geflusht, wenn sie die Vorschau an Ort und Stelle bearbeiten können.
- Wenn Streaming mitten in einer Antwort fehlschlägt, fällt OpenClaw für verbleibende Payloads auf normale Zustellung zurück.
Entwurfsvorschau statt Slack-nativem Text-Streaming verwenden:
{ channels: { slack: { streaming: { mode: "partial", nativeTransport: false, }, }, },}Slack-native Fortschritts-Aufgabenkarten aktivieren:
{ channels: { slack: { streaming: { mode: "progress", progress: { nativeTaskCards: true, render: "rich", }, }, }, },}Legacy-Schlüssel:
channels.slack.streamMode(replace | status_final | append) ist ein Legacy-Runtime-Alias fürchannels.slack.streaming.mode.- Boolesches
channels.slack.streamingist ein Legacy-Runtime-Alias fürchannels.slack.streaming.modeundchannels.slack.streaming.nativeTransport. - Legacy-
channels.slack.nativeStreamingist ein Runtime-Alias fürchannels.slack.streaming.nativeTransport. - Führen Sie
openclaw doctor --fixaus, um persistierte Slack-Streaming-Konfiguration in die kanonischen Schlüssel umzuschreiben.
Fallback für Tippreaktion
typingReaction fügt der eingehenden Slack-Nachricht eine temporäre Reaktion hinzu, während OpenClaw eine Antwort verarbeitet, und entfernt sie, wenn der Lauf abgeschlossen ist. Dies ist am nützlichsten außerhalb von Thread-Antworten, die einen standardmäßigen Statusindikator „is typing...“ verwenden.
Auflösungsreihenfolge:
channels.slack.accounts.<accountId>.typingReactionchannels.slack.typingReaction
Hinweise:
- Slack erwartet Shortcodes (zum Beispiel
"hourglass_flowing_sand"). - Die Reaktion erfolgt nach bestem Bemühen, und die Bereinigung wird nach Abschluss des Antwort- oder Fehlerpfads automatisch versucht.
Medien, Chunking und Zustellung
Inbound attachments
Slack-Dateianhänge werden von Slack-gehosteten privaten URLs heruntergeladen (tokenauthentifizierter Anfragefluss) und bei erfolgreichem Abruf sowie zulässigen Größenlimits in den Medienspeicher geschrieben. Dateiplatzhalter enthalten die Slack-fileId, damit Agenten die Originaldatei mit download-file abrufen können.
Downloads verwenden begrenzte Idle- und Gesamt-Timeouts. Wenn der Abruf einer Slack-Datei hängen bleibt oder fehlschlägt, verarbeitet OpenClaw die Nachricht weiter und fällt auf den Dateiplatzhalter zurück.
Die Laufzeit-Obergrenze für eingehende Größen ist standardmäßig 20MB, sofern sie nicht durch channels.slack.mediaMaxMb überschrieben wird.
Outbound text and files
- Text-Chunks verwenden
channels.slack.textChunkLimit(Standard 4000) channels.slack.chunkMode="newline"aktiviert absatzorientierte Aufteilung- Dateisendungen verwenden Slack-Upload-APIs und können Thread-Antworten enthalten (
thread_ts) - Die Obergrenze für ausgehende Medien folgt
channels.slack.mediaMaxMb, wenn konfiguriert; andernfalls verwenden Kanalsendungen MIME-Art-Standards aus der Medienpipeline
Delivery targets
Bevorzugte explizite Ziele:
user:<id>für DMschannel:<id>für Kanäle
Nur-Text-/Nur-Block-Slack-DMs können direkt an Benutzer-IDs posten; Datei-Uploads und Thread-Sendungen öffnen die DM zuerst über Slack-Konversations-APIs, da diese Pfade eine konkrete Konversations-ID benötigen.
Befehle und Slash-Verhalten
Slash-Befehle erscheinen in Slack entweder als ein einzelner konfigurierter Befehl oder als mehrere native Befehle. Konfigurieren Sie channels.slack.slashCommand, um Befehlsstandards zu ändern:
enabled: falsename: "openclaw"sessionPrefix: "slack:slash"ephemeral: true
/openclaw /helpNative Befehle erfordern zusätzliche Manifest-Einstellungen in Ihrer Slack-App und werden stattdessen mit channels.slack.commands.native: true oder commands.native: true in globalen Konfigurationen aktiviert.
- Der automatische Modus für native Befehle ist für Slack aus, sodass
commands.native: "auto"Slack-native Befehle nicht aktiviert.
/helpNative Argumentmenüs verwenden eine adaptive Rendering-Strategie, die vor dem Dispatch eines ausgewählten Optionswerts ein Bestätigungsmodal anzeigt:
- bis zu 5 Optionen: Button-Blöcke
- 6-100 Optionen: statisches Auswahlmenü
- mehr als 100 Optionen: externe Auswahl mit asynchroner Optionsfilterung, wenn Interaktivitäts-Optionshandler verfügbar sind
- überschrittene Slack-Limits: codierte Optionswerte fallen auf Buttons zurück
/thinkSlash-Sitzungen verwenden isolierte Schlüssel wie agent:<agentId>:slack:slash:<userId> und leiten Befehlsausführungen weiterhin mit CommandTargetSessionKey an die Ziel-Konversationssitzung weiter.
Interaktive Antworten
Slack kann von Agenten erstellte interaktive Antwortsteuerelemente darstellen, aber diese Funktion ist standardmäßig deaktiviert.
Für neue Agenten-, CLI- und Plugin-Ausgaben sollten Sie die gemeinsamen
presentation-Buttons oder Auswahlblöcke bevorzugen. Sie verwenden denselben Slack-Interaktionspfad
und werden zugleich auf anderen Kanälen herabgestuft.
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 weiterhin veraltete, nur für Slack geltende 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-Interaktionsereignispfad zurück. Behalten Sie sie für alte Prompts und Slack-spezifische Ausweichmöglichkeiten bei; verwenden Sie gemeinsame Präsentation für neue portable Steuerelemente.
Die Direktiven-Compiler-APIs sind für neuen Producer-Code ebenfalls veraltet:
compileSlackInteractiveReplies(...)parseSlackOptionsLine(...)isSlackInteractiveRepliesEnabled(...)buildSlackInteractiveBlocks(...)
Verwenden Sie presentation-Payloads und buildSlackPresentationBlocks(...) für neue
in Slack gerenderte Steuerelemente.
Hinweise:
- Dies ist eine Slack-spezifische Legacy-UI. Andere Kanäle übersetzen Slack Block Kit-Direktiven nicht in ihre eigenen Button-Systeme.
- Die interaktiven Callback-Werte sind von OpenClaw erzeugte undurchsichtige Tokens, keine rohen, vom Agenten erstellten Werte.
- Wenn generierte interaktive Blöcke die Slack Block Kit-Grenzwerte überschreiten würden, fällt OpenClaw auf die ursprüngliche Textantwort zurück, statt eine ungültige Blocks-Payload zu senden.
Plugin-eigene Modal-Übermittlungen
Slack-Plugins, die einen interaktiven Handler registrieren, können auch Modal-
view_submission- und view_closed-Lebenszyklusereignisse empfangen, bevor OpenClaw
die Payload für das agentensichtbare Systemereignis komprimiert. Verwenden Sie eines dieser Routing-
Muster, wenn Sie ein Slack-Modal öffnen:
- Setzen Sie
callback_idaufopenclaw:<namespace>:<payload>. - Oder behalten Sie eine bestehende
callback_idbei und legen SiepluginInteractiveData: "<namespace>:<payload>"inprivate_metadatades Modals ab.
Der Handler erhält ctx.interaction.kind als view_submission oder
view_closed, normalisierte inputs und das vollständige rohe stateValues-Objekt von
Slack. Routing nur über die Callback-ID reicht aus, um den Plugin-Handler aufzurufen; fügen Sie
die bestehenden private_metadata-Benutzer-/Sitzungs-Routingfelder des Modals ein, wenn das
Modal auch ein agentensichtbares Systemereignis erzeugen soll. Der Agent erhält ein
kompaktes, redigiertes Systemereignis Slack interaction: .... Wenn der Handler
systemEvent.summary, systemEvent.reference oder systemEvent.data zurückgibt, werden diese
Felder in dieses kompakte Ereignis aufgenommen, damit der Agent auf
Plugin-eigenen Speicher verweisen kann, ohne die vollständige Formular-Payload zu sehen.
Native Genehmigungen in Slack
Slack kann als nativer Genehmigungsclient mit interaktiven Buttons und Interaktionen dienen, statt auf die Web-UI oder das Terminal zurückzufallen.
- Exec- und Plugin-Genehmigungen können als Slack-native Block Kit-Prompts gerendert werden.
channels.slack.execApprovals.*bleibt die Aktivierungs- und DM-/Kanal-Routing-Konfiguration für den nativen Exec-Genehmigungsclient.- Exec-Genehmigungs-DMs verwenden
channels.slack.execApprovals.approversodercommands.ownerAllowFrom. - Plugin-Genehmigungen verwenden Slack-native Buttons, wenn Slack als nativer Genehmigungsclient für die Ursprungssitzung aktiviert ist oder wenn
approvals.pluginan die ursprüngliche Slack-Sitzung oder ein Slack-Ziel weiterleitet. - Plugin-Genehmigungs-DMs verwenden Slack-Plugin-Genehmigende aus
channels.slack.allowFrom, benannte Konto-allowFrom-Einträge oder die Standardroute des Kontos. - Die Autorisierung von Genehmigenden wird weiterhin erzwungen: Nur-Exec-Genehmigende können Plugin-Anfragen nicht genehmigen, es sei denn, sie sind auch Plugin-Genehmigende.
Dies verwendet dieselbe gemeinsame Genehmigungs-Button-Oberfläche wie andere Kanäle. Wenn interactivity in Ihren Slack-App-Einstellungen aktiviert ist, werden Genehmigungs-Prompts direkt in der Konversation als Block Kit-Buttons gerendert.
Wenn diese Buttons vorhanden sind, sind sie die primäre Genehmigungs-UX; OpenClaw
sollte nur dann einen manuellen /approve-Befehl einschließen, wenn das Tool-Ergebnis besagt, dass Chat-
Genehmigungen nicht verfügbar sind oder manuelle Genehmigung der einzige Weg ist.
Konfigurationspfad:
channels.slack.execApprovals.enabledchannels.slack.execApprovals.approvers(optional; fällt nach Möglichkeit aufcommands.ownerAllowFromzurück)channels.slack.execApprovals.target(dm|channel|both, Standard:dm)agentFilter,sessionFilter
Slack aktiviert native Exec-Genehmigungen automatisch, wenn enabled nicht gesetzt oder "auto" ist und mindestens ein
Exec-Genehmigender aufgelöst wird. Slack kann über diesen nativen Client-Pfad auch native Plugin-Genehmigungen verarbeiten,
wenn Slack-Plugin-Genehmigende aufgelöst werden und die Anfrage den nativen Client-Filtern entspricht. Setzen Sie
enabled: false, um Slack als nativen Genehmigungsclient explizit zu deaktivieren. Setzen Sie enabled: true, um
native Genehmigungen zu erzwingen, wenn Genehmigende aufgelöst werden. Das Deaktivieren von Slack-Exec-Genehmigungen deaktiviert nicht
die native Slack-Plugin-Genehmigungszustellung, die über approvals.plugin aktiviert ist; die Plugin-Genehmigungszustellung
verwendet stattdessen Slack-Plugin-Genehmigende.
Standardverhalten ohne explizite Slack-Exec-Genehmigungskonfiguration:
{ commands: { ownerAllowFrom: ["slack:U12345678"], },}Explizite Slack-native Konfiguration ist nur erforderlich, wenn Sie Genehmigende überschreiben, Filter hinzufügen oder die Zustellung an den Ursprungschat aktivieren möchten:
{ channels: { slack: { execApprovals: { enabled: true, approvers: ["U12345678"], target: "both", }, }, },}Gemeinsame approvals.exec-Weiterleitung ist separat. Verwenden Sie sie nur, wenn Exec-Genehmigungs-Prompts zusätzlich
an andere Chats oder explizite Out-of-Band-Ziele weitergeleitet werden müssen. Gemeinsame approvals.plugin-Weiterleitung ist ebenfalls
separat; Slack-native Zustellung unterdrückt diesen Fallback nur, wenn Slack die Plugin-
Genehmigungsanfrage nativ verarbeiten kann.
/approve im selben Chat funktioniert auch in Slack-Kanälen und DMs, die bereits Befehle unterstützen. Siehe Exec-Genehmigungen für das vollständige Modell der Genehmigungsweiterleitung.
Ereignisse und Betriebsverhalten
- Nachrichtenbearbeitungen/-löschungen werden in Systemereignisse abgebildet.
- Thread-Broadcasts (Thread-Antworten mit „Also send to channel“) werden als normale Benutzernachrichten verarbeitet.
- Hinzufügen/Entfernen von Reaktionen wird in Systemereignisse abgebildet.
- Beitritt/Austritt von Mitgliedern, erstellte/umbenannte Kanäle und Hinzufügen/Entfernen von Pins werden in Systemereignisse abgebildet.
channel_id_changedkann Kanal-Konfigurationsschlüssel migrieren, wennconfigWritesaktiviert ist.- Kanalthema/-zweck-Metadaten werden als nicht vertrauenswürdiger Kontext behandelt und können in den Routing-Kontext injiziert werden.
- Thread-Starter und anfängliches Seed-Setzen des Thread-Verlaufskontexts werden, sofern anwendbar, nach konfigurierten Sender-Allowlists gefiltert.
- Block-Aktionen, Shortcuts und Modal-Interaktionen geben strukturierte Systemereignisse
Slack interaction: ...mit umfangreichen Payload-Feldern aus:- Block-Aktionen: ausgewählte Werte, Labels, Picker-Werte und
workflow_*-Metadaten - Globale Shortcuts: Callback- und Akteur-Metadaten, an die direkte Sitzung des Akteurs weitergeleitet
- Nachrichten-Shortcuts: Callback, Akteur, Kanal, Thread und Kontext der ausgewählten Nachricht
- Modal-
view_submission- undview_closed-Ereignisse mit weitergeleiteten Kanal-Metadaten und Formulareingaben
- Block-Aktionen: ausgewählte Werte, Labels, Picker-Werte und
Definieren Sie globale oder Nachrichten-Shortcuts in Ihrer Slack-App-Konfiguration und verwenden Sie eine beliebige nicht leere Callback-ID. OpenClaw bestätigt passende Shortcut-Payloads, wendet dieselbe DM-/Kanal-Sender-Richtlinie wie bei anderen Slack-Interaktionen an und stellt das bereinigte Ereignis für die weitergeleitete Agentensitzung in die Warteschlange. Trigger-IDs und Antwort-URLs werden aus dem Agentenkontext redigiert.
Konfigurationsreferenz
Primäre Referenz: Konfigurationsreferenz - 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äts-Umschalter:
dangerouslyAllowNameMatching(Notfalloption; ausgeschaltet lassen, sofern nicht erforderlich) - Kanalzugriff:
groupPolicy,channels.*,channels.*.users,channels.*.requireMention - Threading/Verlauf:
replyToMode,replyToModeByChatType,thread.*,historyLimit,dmHistoryLimit,dms.*.historyLimit - Zustellung:
textChunkLimit,chunkMode,mediaMaxMb,streaming,streaming.nativeTransport,streaming.preview.toolProgress - Unfurls:
unfurlLinks(Standard:false),unfurlMediafür die Steuerung von Link-/Medienvorschauen inchat.postMessage; setzen SieunfurlLinks: true, um Linkvorschauen wieder zu aktivieren - Betrieb/Funktionen:
configWrites,commands.native,slashCommand.*,actions.*,userToken,userTokenReadOnly
Fehlerbehebung
Keine Antworten in Kanälen
Prüfen Sie der Reihe nach:
groupPolicy- Kanal-Allowlist (
channels.slack.channels) — Schlüssel müssen Kanal-IDs sein (C12345678), keine Namen (#channel-name). Namensbasierte Schlüssel schlagen untergroupPolicy: "allowlist"still fehl, weil Kanal-Routing standardmäßig ID-zuerst erfolgt. So finden Sie eine ID: Rechtsklick auf den Kanal in Slack → Link kopieren — der WertC...am Ende der URL ist die Kanal-ID. requireMention- kanalbezogene
users-Allowlist messages.groupChat.visibleReplies: Normale Gruppen-/Kanal-Anfragen verwenden standardmäßig"automatic". Wenn Sie"message_tool"aktiviert haben und Logs Assistententext ohnemessage(action=send)-Aufruf zeigen, hat das Modell den sichtbaren Message-Tool-Pfad verfehlt. Abschlusstext bleibt in diesem Modus privat; prüfen Sie das ausführliche Gateway-Log auf unterdrückte Payload-Metadaten oder setzen Sie den Wert auf"automatic", wenn Sie möchten, dass jede normale abschließende Assistentenantwort über den Legacy-Pfad gepostet wird.messages.groupChat.unmentionedInbound: Wenn der Wert"room_event"ist, ist nicht erwähnter, erlaubter Kanal-Chat Umgebungskontext und bleibt stumm, sofern der Agent nicht dasmessage-Tool aufruft. Siehe Umgebungs-Raumereignisse.
{messages: {groupChat: { visibleReplies: "automatic",},},}Nützliche Befehle:
openclaw channels status --probeopenclaw logs --followopenclaw doctorDM-Nachrichten ignoriert
Prüfen Sie:
channels.slack.dm.enabledchannels.slack.dmPolicy(oder Legacychannels.slack.dm.policy)- Pairing-Genehmigungen / Allowlist-Einträge (
dmPolicy: "open"erfordert weiterhinchannels.slack.allowFrom: ["*"]) - Gruppen-DMs verwenden MPIM-Verarbeitung; aktivieren Sie
channels.slack.dm.groupEnabledund nehmen Sie, falls konfiguriert, die MPIM inchannels.slack.dm.groupChannelsauf - Slack Assistant-DM-Ereignisse: Ausführliche Logs mit
drop message_changedbedeuten in der Regel, dass Slack ein bearbeitetes Assistant-Thread-Ereignis ohne wiederherstellbaren menschlichen Sender in den Nachrichtenmetadaten gesendet hat
openclaw pairing list slackSocket Mode verbindet nicht
Validieren Sie Bot- und App-Tokens sowie die Aktivierung von Socket Mode in den Slack-App-Einstellungen.
Das App-Level Token benötigt connections:write, und das Bot User OAuth Token
muss zur gleichen Slack-App bzw. zum gleichen Workspace gehören wie das App-Token.
Wenn openclaw channels status --probe --json botTokenStatus oder
appTokenStatus: "configured_unavailable" zeigt, ist das Slack-Konto
konfiguriert, aber die aktuelle Laufzeit konnte den SecretRef-gestützten
Wert nicht auflösen.
Logs wie slack socket mode failed to start; retry ... sind behebbare
Startfehler. Fehlende Scopes, widerrufene Tokens und ungültige Authentifizierung schlagen
stattdessen schnell fehl. Ein Log slack token mismatch ... bedeutet, dass Bot-Token und App-Token
offenbar zu unterschiedlichen Slack-Apps gehören; korrigieren Sie die Zugangsdaten der Slack-App.
HTTP-Modus empfängt keine Ereignisse
Prüfen Sie:
- Signing Secret
- Webhook-Pfad
- Slack Request URLs (Events + Interactivity + Slash Commands)
- eindeutiger
webhookPathpro HTTP-Konto - die öffentliche URL terminiert TLS und leitet Anfragen an den Gateway-Pfad weiter
- der Slack-App-Pfad
request_urlentspricht exaktchannels.slack.webhookPath(Standard/slack/events)
Wenn signingSecretStatus: "configured_unavailable" in Konto-Snapshots
erscheint, ist das HTTP-Konto konfiguriert, aber die aktuelle Runtime konnte
das SecretRef-basierte Signing Secret nicht auflösen.
Ein wiederholtes Log slack: webhook path ... already registered bedeutet, dass zwei HTTP-
Konten denselben webhookPath verwenden; geben Sie jedem Konto einen eigenen Pfad.
Native Befehle/Slash-Befehle werden nicht ausgelöst
Prüfen Sie, was Sie beabsichtigt haben:
- nativer Befehlsmodus (
channels.slack.commands.native: true) mit passenden in Slack registrierten Slash-Befehlen - oder einzelner Slash-Befehlsmodus (
channels.slack.slashCommand.enabled: true)
Slack erstellt oder entfernt Slash-Befehle nicht automatisch. commands.native: "auto" aktiviert keine nativen Slack-Befehle; verwenden Sie true und erstellen Sie die passenden Befehle in der Slack-App. Im HTTP-Modus muss jeder Slack-Slash-Befehl die Gateway-URL enthalten. Im Socket Mode kommen Befehls-Payloads über den WebSocket an, und Slack ignoriert slash_commands[].url.
Prüfen Sie außerdem commands.useAccessGroups, DM-Autorisierung, Kanal-Allowlists
und kanalbezogene users-Allowlists. Slack gibt kurzlebige Fehler für
blockierte Absender von Slash-Befehlen zurück, darunter:
This channel is not allowed.You are not authorized to use this command here.
Referenz zu Vision für Anhänge
Slack kann heruntergeladene Medien an den Agent-Turn anhängen, wenn Slack-Dateidownloads erfolgreich sind und Größenbeschränkungen es zulassen. Bilddateien können durch den Pfad für Medienverständnis oder direkt an ein antwortendes Modell mit Vision-Fähigkeit übergeben werden; andere Dateien bleiben als herunterladbarer Dateikontext erhalten, statt als Bildeingabe behandelt zu werden.
Unterstützte Medientypen
| Medientyp | Quelle | Aktuelles Verhalten | Hinweise |
|---|---|---|---|
| JPEG-/PNG-/GIF-/WebP-Bilder | Slack-Datei-URL | Heruntergeladen und für Vision-fähige Verarbeitung an den Turn angehängt | Begrenzung pro Datei: channels.slack.mediaMaxMb (Standard 20 MB) |
| PDF-Dateien | Slack-Datei-URL | Heruntergeladen und als Dateikontext für Tools wie download-file oder pdf bereitgestellt |
Slack-Inbound konvertiert PDFs nicht automatisch in Bild-Vision-Eingaben |
| Andere Dateien | Slack-Datei-URL | Wenn möglich heruntergeladen und als Dateikontext bereitgestellt | Binärdateien werden nicht als Bildeingabe behandelt |
| Thread-Antworten | Dateien des Thread-Starters | Dateien der Root-Nachricht können als Kontext hydriert werden, wenn die Antwort keine direkten Medien hat | Starter nur mit Dateien verwenden einen Anhang-Platzhalter |
| Nachrichten mit mehreren Bildern | Mehrere Slack-Dateien | Jede Datei wird unabhängig ausgewertet | Die Slack-Verarbeitung ist auf acht Dateien pro Nachricht begrenzt |
Inbound-Pipeline
Wenn eine Slack-Nachricht mit Dateianhängen eintrifft:
- OpenClaw lädt die Datei mit dem Bot-Token von der privaten Slack-URL herunter.
- Die Datei wird bei Erfolg in den Medienspeicher geschrieben.
- Heruntergeladene Medienpfade und Inhaltstypen werden dem Inbound-Kontext hinzugefügt.
- Bildfähige Modell-/Tool-Pfade können Bildanhänge aus diesem Kontext verwenden.
- Nicht-Bilddateien bleiben als Dateimetadaten oder Medienreferenzen für Tools verfügbar, die damit umgehen können.
Vererbung von Anhängen aus der Thread-Root
Wenn eine Nachricht in einem Thread eintrifft (mit einem thread_ts-Parent):
- Wenn die Antwort selbst keine direkten Medien hat und die enthaltene Root-Nachricht Dateien enthält, kann Slack die Root-Dateien als Thread-Starter-Kontext hydrieren.
- Direkte Antwortanhänge haben Vorrang vor Anhängen der Root-Nachricht.
- Eine Root-Nachricht, die nur Dateien und keinen Text enthält, wird mit einem Anhang-Platzhalter dargestellt, damit der Fallback ihre Dateien weiterhin einbeziehen kann.
Umgang mit mehreren Anhängen
Wenn eine einzelne Slack-Nachricht mehrere Dateianhänge enthält:
- Jeder Anhang wird unabhängig durch die Medien-Pipeline verarbeitet.
- Heruntergeladene Medienreferenzen werden im Nachrichtenkontext zusammengeführt.
- Die Verarbeitungsreihenfolge folgt der Dateireihenfolge von Slack im Ereignis-Payload.
- Ein Fehler beim Download eines Anhangs blockiert die anderen nicht.
Größen-, Download- und Modelllimits
- Größenbegrenzung: Standardmäßig 20 MB pro Datei. Konfigurierbar über
channels.slack.mediaMaxMb. - Downloadfehler: Dateien, die Slack nicht bereitstellen kann, abgelaufene URLs, unzugängliche Dateien, zu große Dateien und Slack-Auth-/Login-HTML-Antworten werden übersprungen, statt als nicht unterstützte Formate gemeldet zu werden.
- Vision-Modell: Die Bildanalyse verwendet das aktive Antwortmodell, wenn es Vision unterstützt, oder das unter
agents.defaults.imageModelkonfigurierte Bildmodell.
Bekannte Grenzen
| Szenario | Aktuelles Verhalten | Workaround |
|---|---|---|
| Abgelaufene Slack-Datei-URL | Datei übersprungen; kein Fehler angezeigt | Laden Sie die Datei erneut in Slack hoch |
| Vision-Modell nicht konfiguriert | Bildanhänge werden als Medienreferenzen gespeichert, aber nicht als Bilder analysiert | Konfigurieren Sie agents.defaults.imageModel oder verwenden Sie ein antwortendes Modell mit Vision-Fähigkeit |
| Sehr große Bilder (> 20 MB standardmäßig) | Gemäß Größenbegrenzung übersprungen | Erhöhen Sie channels.slack.mediaMaxMb, wenn Slack dies zulässt |
| Weitergeleitete/geteilte Anhänge | Text und von Slack gehostete Bild-/Dateimedien werden nach bestem Aufwand verarbeitet | Teilen Sie sie direkt im OpenClaw-Thread erneut |
| PDF-Anhänge | Als Datei-/Medienkontext gespeichert, nicht automatisch durch Image Vision geleitet | Verwenden Sie download-file für Dateimetadaten oder das Tool pdf für PDF-Analysen |
Verwandte Dokumentation
- Pipeline für Medienverständnis
- PDF-Tool
- Epic: #51349 — Aktivierung von Vision für Slack-Anhänge
- Regressionstests: #51353
- Live-Verifizierung: #51354
Verwandt
Koppeln Sie einen Slack-Benutzer mit dem Gateway.
Verhalten von Kanälen und Gruppen-DMs.
Leiten Sie Inbound-Nachrichten an Agenten weiter.
Bedrohungsmodell und Härtung.
Konfigurationslayout und Priorität.
Befehlskatalog und Verhalten.