Slack
Stato: pronto per la produzione per DM + canali tramite integrazioni app Slack. La modalita predefinita e Socket Mode; anche la modalita HTTP Events API e supportata.
- Pairing — I DM Slack usano la modalita pairing per impostazione predefinita.
- Comandi slash — Comportamento comandi nativi e catalogo comandi.
- Risoluzione problemi canali — Diagnostica cross-canale e playbook di riparazione.
Setup rapido
Socket Mode (predefinito)
### Step 1: Crea app Slack e token
Nelle impostazioni dell'app Slack:
- abilita **Socket Mode**
- crea **App Token** (`xapp-...`) con `connections:write`
- installa l'app e copia il **Bot Token** (`xoxb-...`)
### Step 2: Configura OpenClaw
{
channels: {
slack: {
enabled: true,
mode: "socket",
appToken: "xapp-...",
botToken: "xoxb-...",
},
},
}
Fallback via env (solo account predefinito):
SLACK_APP_TOKEN=xapp-...
SLACK_BOT_TOKEN=xoxb-...
### Step 3: Sottoscrivi gli eventi dell'app
Sottoscrivi gli eventi bot per:
- `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`
Abilita anche la **Messages Tab** dell'App Home per i DM.
### Step 4: Avvia il gateway
openclaw gateway
Modalita HTTP Events API
### Step 1: Configura l'app Slack per HTTP
- imposta la modalita a HTTP (`channels.slack.mode="http"`)
- copia il **Signing Secret** di Slack
- imposta Event Subscriptions + Interactivity + Slash command Request URL allo stesso percorso webhook (predefinito `/slack/events`)
### Step 2: Configura OpenClaw in modalita HTTP
{
channels: {
slack: {
enabled: true,
mode: "http",
botToken: "xoxb-...",
signingSecret: "your-signing-secret",
webhookPath: "/slack/events",
},
},
}
### Step 3: Usa percorsi webhook unici per HTTP multi-account
La modalita HTTP per account e supportata.
Dai a ogni account un `webhookPath` distinto cosi le registrazioni non collidono.
Modello token
botToken+appTokensono necessari per Socket Mode.- La modalita HTTP richiede
botToken+signingSecret. - I token nel config sovrascrivono il fallback env.
- Il fallback env
SLACK_BOT_TOKEN/SLACK_APP_TOKENsi applica solo all’account predefinito. userToken(xoxp-...) e solo nel config (nessun fallback env) e predefinito a comportamento sola lettura (userTokenReadOnly: true).- Opzionale: aggiungi
chat:write.customizese vuoi che i messaggi in uscita usino l’identita dell’agent attivo (usernamee icona personalizzati).icon_emojiusa la sintassi:emoji_name:.
Suggerimento: Per azioni/letture directory, il user token puo essere preferito quando configurato. Per le scritture, il bot token rimane preferito; le scritture con user-token sono consentite solo quando
userTokenReadOnly: falsee il bot token non e disponibile.
Controllo degli accessi e routing
Policy DM
`channels.slack.dmPolicy` controlla l'accesso DM (legacy: `channels.slack.dm.policy`):
- `pairing` (predefinito)
- `allowlist`
- `open` (richiede che `channels.slack.allowFrom` includa `"*"`; legacy: `channels.slack.dm.allowFrom`)
- `disabled`
Flag DM:
- `dm.enabled` (predefinito true)
- `channels.slack.allowFrom` (preferito)
- `dm.allowFrom` (legacy)
- `dm.groupEnabled` (DM di gruppo predefinito false)
- `dm.groupChannels` (allowlist MPIM opzionale)
Precedenza multi-account:
- `channels.slack.accounts.default.allowFrom` si applica solo all'account `default`.
- Gli account nominati ereditano `channels.slack.allowFrom` quando il proprio `allowFrom` non e impostato.
- Gli account nominati non ereditano `channels.slack.accounts.default.allowFrom`.
Il pairing nei DM usa `openclaw pairing approve slack <code>`.
Policy canali
`channels.slack.groupPolicy` controlla la gestione dei canali:
- `open`
- `allowlist`
- `disabled`
L'allowlist canali vive sotto `channels.slack.channels` e dovrebbe usare ID canale stabili.
Nota runtime: se `channels.slack` e completamente assente (setup solo env), il runtime torna a `groupPolicy="allowlist"` e registra un avviso (anche se `channels.defaults.groupPolicy` e impostato).
Risoluzione nome/ID:
- le voci dell'allowlist canali e dell'allowlist DM vengono risolte all'avvio quando l'accesso al token lo consente
- le voci nome-canale non risolte vengono mantenute come configurate ma ignorate per il routing per impostazione predefinita
- l'autorizzazione in ingresso e il routing canale sono ID-first per impostazione predefinita; il matching diretto per username/slug richiede `channels.slack.dangerouslyAllowNameMatching: true`
Menzioni e utenti canale
I messaggi nei canali sono filtrati per menzione per impostazione predefinita.
Fonti di menzione:
- menzione esplicita dell'app (`<@botId>`)
- pattern regex di menzione (`agents.list[].groupChat.mentionPatterns`, fallback `messages.groupChat.mentionPatterns`)
- comportamento implicito di risposta al bot nei thread
Controlli per canale (`channels.slack.channels.<id>`; nomi solo tramite risoluzione all'avvio o `dangerouslyAllowNameMatching`):
- `requireMention`
- `users` (allowlist)
- `allowBots`
- `skills`
- `systemPrompt`
- `tools`, `toolsBySender`
- formato chiave `toolsBySender`: `id:`, `e164:`, `username:`, `name:`, o wildcard `"*"`
(le chiavi legacy senza prefisso mappano solo a `id:`)
Comandi e comportamento slash
- La modalita auto dei comandi nativi e disattivata per Slack (
commands.native: "auto"non abilita i comandi nativi Slack). - Abilita i gestori comandi nativi Slack con
channels.slack.commands.native: true(o globalecommands.native: true). - Quando i comandi nativi sono abilitati, registra i comandi slash corrispondenti in Slack (nomi
/<comando>), con un’eccezione:- registra
/agentstatusper il comando status (Slack riserva/status)
- registra
- Se i comandi nativi non sono abilitati, puoi eseguire un singolo comando slash configurato tramite
channels.slack.slashCommand. - I menu argomenti nativi ora adattano la loro strategia di rendering:
- fino a 5 opzioni: blocchi bottoni
- 6-100 opzioni: menu select statico
- piu di 100 opzioni: select esterno con filtro opzioni asincrono quando i gestori opzioni di interattivita sono disponibili
- se i valori opzione codificati superano i limiti Slack, il flusso torna ai bottoni
- Per payload opzioni lunghi, i menu argomenti dei comandi slash usano un dialogo di conferma prima di inviare un valore selezionato.
Risposte interattive
Slack puo renderizzare controlli di risposta interattiva creati dall’agent, ma questa funzionalita e disabilitata per impostazione predefinita.
Abilitala globalmente:
{
channels: {
slack: {
capabilities: {
interactiveReplies: true,
},
},
},
}
O abilitala per un solo account Slack:
{
channels: {
slack: {
accounts: {
ops: {
capabilities: {
interactiveReplies: true,
},
},
},
},
},
}
Quando abilitato, gli agent possono emettere direttive di risposta specifiche per Slack:
[[slack_buttons: Approve:approve, Reject:reject]][[slack_select: Choose a target | Canary:canary, Production:production]]
Queste direttive vengono compilate in Slack Block Kit e instradano clic o selezioni attraverso il percorso eventi di interazione Slack esistente.
Note:
- Questa e UI specifica per Slack. Gli altri canali non traducono le direttive Block Kit di Slack nei propri sistemi di bottoni.
- I valori callback interattivi sono token opachi generati da OpenClaw, non valori raw scritti dall’agent.
- Se i blocchi interattivi generati supererebbero i limiti di Slack Block Kit, OpenClaw torna alla risposta testuale originale invece di inviare un payload blocchi non valido.
Impostazioni predefinite comando slash:
enabled: falsename: "openclaw"sessionPrefix: "slack:slash"ephemeral: true
Le sessioni slash usano chiavi isolate:
agent:<agentId>:slack:slash:<userId>
e instradano comunque l’esecuzione comandi verso la sessione di conversazione target (CommandTargetSessionKey).
Threading, sessioni e tag di risposta
- I DM instradano come
direct; i canali comechannel; gli MPIM comegroup. - Con il
session.dmScope=mainpredefinito, i DM Slack collassano nella sessione principale dell’agent. - Sessioni canale:
agent:<agentId>:slack:channel:<channelId>. - Le risposte nei thread possono creare suffissi di sessione thread (
:thread:<threadTs>) quando applicabile. - Il
channels.slack.thread.historyScopepredefinito ethread; ilthread.inheritParentpredefinito efalse. channels.slack.thread.initialHistoryLimitcontrolla quanti messaggi thread esistenti vengono recuperati quando una nuova sessione thread inizia (predefinito20; imposta0per disabilitare).
Controlli threading risposte:
channels.slack.replyToMode:off|first|all(predefinitooff)channels.slack.replyToModeByChatType: perdirect|group|channel- fallback legacy per chat dirette:
channels.slack.dm.replyToMode
I tag di risposta manuali sono supportati:
[[reply_to_current]][[reply_to:<id>]]
Nota: replyToMode="off" disabilita tutto il threading delle risposte in Slack, inclusi i tag espliciti [[reply_to_*]]. Questo differisce da Telegram, dove i tag espliciti vengono comunque rispettati in modalita "off". La differenza riflette i modelli di threading delle piattaforme: i thread Slack nascondono i messaggi dal canale, mentre le risposte Telegram rimangono visibili nel flusso principale della chat.
Media, segmentazione e consegna
Allegati in ingresso
Gli allegati file Slack vengono scaricati da URL privati ospitati su Slack (flusso di richiesta autenticata con token) e scritti nel media store quando il fetch riesce e i limiti di dimensione lo permettono.
Il limite dimensione in ingresso runtime e predefinito a `20MB` a meno che non sia sovrascritto da `channels.slack.mediaMaxMb`.
Testo e file in uscita
- i segmenti testo usano `channels.slack.textChunkLimit` (predefinito 4000)
- `channels.slack.chunkMode="newline"` abilita la divisione per paragrafi prioritaria
- gli invii file usano le API di upload Slack e possono includere risposte thread (`thread_ts`)
- il limite media in uscita segue `channels.slack.mediaMaxMb` quando configurato; altrimenti gli invii canale usano i default per tipo MIME dalla pipeline media
Target di consegna
Target espliciti preferiti:
- `user:<id>` per i DM
- `channel:<id>` per i canali
I DM Slack vengono aperti tramite le API conversazione Slack quando si invia a target utente.
Azioni e gate
Le azioni Slack sono controllate da channels.slack.actions.*.
Gruppi di azioni disponibili negli strumenti Slack attuali:
| Gruppo | Predefinito |
|---|---|
| messages | abilitato |
| reactions | abilitato |
| pins | abilitato |
| memberInfo | abilitato |
| emojiList | abilitato |
Eventi e comportamento operativo
- Le modifiche/cancellazioni/broadcast thread dei messaggi sono mappati in eventi di sistema.
- Gli eventi di aggiunta/rimozione reazione sono mappati in eventi di sistema.
- Gli eventi di ingresso/uscita membri, creazione/rinomina canale e aggiunta/rimozione pin sono mappati in eventi di sistema.
- Gli aggiornamenti stato thread dell’assistente (per indicatori “sta scrivendo…” nei thread) usano
assistant.threads.setStatuse richiedono lo scope botassistant:write. channel_id_changedpuo migrare le chiavi di configurazione canale quandoconfigWritese abilitato.- I metadati topic/scopo del canale sono trattati come contesto non fidato e possono essere iniettati nel contesto di routing.
- Le azioni sui blocchi e le interazioni modali emettono eventi di sistema strutturati
Slack interaction: ...con campi payload ricchi:- azioni blocco: valori selezionati, etichette, valori picker e metadati
workflow_* - eventi modali
view_submissioneview_closedcon metadati canale instradato e input form
- azioni blocco: valori selezionati, etichette, valori picker e metadati
Reazioni di conferma
ackReaction invia un emoji di conferma mentre OpenClaw sta elaborando un messaggio in ingresso.
Ordine di risoluzione:
channels.slack.accounts.<accountId>.ackReactionchannels.slack.ackReactionmessages.ackReaction- fallback emoji identita agent (
agents.list[].identity.emoji, altrimenti ”👀”)
Note:
- Slack si aspetta shortcode (ad esempio
"eyes"). - Usa
""per disabilitare la reazione per l’account Slack o globalmente.
Reazione typing di fallback
typingReaction aggiunge una reazione temporanea al messaggio Slack in ingresso mentre OpenClaw sta elaborando una risposta, poi la rimuove quando l’esecuzione termina. E un fallback utile quando il typing nativo dell’assistente Slack non e disponibile, specialmente nei DM.
Ordine di risoluzione:
channels.slack.accounts.<accountId>.typingReactionchannels.slack.typingReaction
Note:
- Slack si aspetta shortcode (ad esempio
"hourglass_flowing_sand"). - La reazione e best-effort e la pulizia viene tentata automaticamente dopo il completamento della risposta o del percorso di errore.
Manifest e checklist scope
Esempio manifest app Slack
{
"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"
]
}
}
}
Scope user-token opzionali (operazioni di lettura)
Se configuri `channels.slack.userToken`, gli scope di lettura tipici sono:
- `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` (se dipendi dalle letture di ricerca Slack)
Risoluzione problemi
Nessuna risposta nei canali
Controlla, in ordine:
- `groupPolicy`
- allowlist canali (`channels.slack.channels`)
- `requireMention`
- allowlist `users` per canale
Comandi utili:
openclaw channels status --probe
openclaw logs --follow
openclaw doctor
Messaggi DM ignorati
Controlla:
- `channels.slack.dm.enabled`
- `channels.slack.dmPolicy` (o legacy `channels.slack.dm.policy`)
- approvazioni pairing / voci allowlist
openclaw pairing list slack
Socket mode non si connette
Valida i token bot + app e l'abilitazione Socket Mode nelle impostazioni dell'app Slack.
Modalita HTTP non riceve eventi
Valida:
- signing secret
- percorso webhook
- URL di richiesta Slack (Events + Interactivity + Slash Commands)
- `webhookPath` unico per account HTTP
Comandi nativi/slash non funzionano
Verifica se intendevi:
- modalita comandi nativi (`channels.slack.commands.native: true`) con comandi slash corrispondenti registrati in Slack
- o modalita singolo comando slash (`channels.slack.slashCommand.enabled: true`)
Controlla anche `commands.useAccessGroups` e allowlist canale/utente.
Streaming testo
OpenClaw supporta lo streaming testo nativo Slack tramite l’API Agents and AI Apps.
channels.slack.streaming controlla il comportamento dell’anteprima live:
off: disabilita lo streaming anteprima live.partial(predefinito): sostituisce il testo anteprima con l’ultimo output parziale.block: appende aggiornamenti anteprima a blocchi.progress: mostra testo stato avanzamento durante la generazione, poi invia il testo finale.
channels.slack.nativeStreaming controlla l’API di streaming nativa Slack (chat.startStream / chat.appendStream / chat.stopStream) quando streaming e partial (predefinito: true).
Disabilita lo streaming nativo Slack (mantieni il comportamento anteprima bozza):
channels:
slack:
streaming: partial
nativeStreaming: false
Chiavi legacy:
channels.slack.streamMode(replace | status_final | append) viene auto-migrato achannels.slack.streaming.channels.slack.streamingbooleano viene auto-migrato achannels.slack.nativeStreaming.
Requisiti
- Abilita Agents and AI Apps nelle impostazioni della tua app Slack.
- Assicurati che l’app abbia lo scope
assistant:write. - Deve essere disponibile un thread di risposta per quel messaggio. La selezione thread segue comunque
replyToMode.
Comportamento
- Il primo segmento testo avvia uno stream (
chat.startStream). - I segmenti testo successivi appendono allo stesso stream (
chat.appendStream). - La fine della risposta finalizza lo stream (
chat.stopStream). - I payload media e non-testuali tornano alla consegna normale.
- Se lo streaming fallisce durante la risposta, OpenClaw torna alla consegna normale per i payload rimanenti.
Riferimenti configurazione
Riferimento primario:
-
Riferimento configurazione - Slack
Campi Slack ad alto segnale:
- modalita/auth:
mode,botToken,appToken,signingSecret,webhookPath,accounts.* - accesso DM:
dm.enabled,dmPolicy,allowFrom(legacy:dm.policy,dm.allowFrom),dm.groupEnabled,dm.groupChannels - toggle compatibilita:
dangerouslyAllowNameMatching(break-glass; mantieni disattivato se non necessario) - accesso canali:
groupPolicy,channels.*,channels.*.users,channels.*.requireMention - threading/storico:
replyToMode,replyToModeByChatType,thread.*,historyLimit,dmHistoryLimit,dms.*.historyLimit - consegna:
textChunkLimit,chunkMode,mediaMaxMb,streaming,nativeStreaming - ops/funzionalita:
configWrites,commands.native,slashCommand.*,actions.*,userToken,userTokenReadOnly
- modalita/auth: