Vai al contenuto principale

Slack

Stato: pronto per la produzione per DM + canali tramite integrazioni dell’app Slack. La modalità predefinita è Socket Mode; sono supportate anche le URL di richiesta HTTP.

Abbinamento

Le DM di Slack usano per impostazione predefinita la modalità di abbinamento.

Comandi slash

Comportamento nativo dei comandi e catalogo dei comandi.

Risoluzione dei problemi del canale

Diagnostica tra canali e playbook di riparazione.

Configurazione rapida

1

Crea una nuova app Slack

Nelle impostazioni dell’app Slack premi il pulsante Create New App:
  • scegli from a manifest e seleziona uno spazio di lavoro per la tua app
  • incolla il manifesto di esempio qui sotto e continua con la creazione
  • genera un App-Level Token (xapp-...) con connections:write
  • installa l’app e copia il Bot Token (xoxb-...) mostrato
2

Configura OpenClaw

{
  channels: {
    slack: {
      enabled: true,
      mode: "socket",
      appToken: "xapp-...",
      botToken: "xoxb-...",
    },
  },
}
Variabili d’ambiente di fallback (solo account predefinito):
SLACK_APP_TOKEN=xapp-...
SLACK_BOT_TOKEN=xoxb-...
3

Avvia il Gateway

openclaw gateway

Checklist di manifesto e ambiti

{
  "display_information": {
    "name": "OpenClaw",
    "description": "Slack connector for OpenClaw"
  },
  "features": {
    "bot_user": {
      "display_name": "OpenClaw",
      "always_online": true
    },
    "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": [
        "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",
        "users:read"
      ]
    }
  },
  "settings": {
    "socket_mode_enabled": true,
    "event_subscriptions": {
      "bot_events": [
        "app_mention",
        "channel_rename",
        "member_joined_channel",
        "member_left_channel",
        "message.channels",
        "message.groups",
        "message.im",
        "message.mpim",
        "pin_added",
        "pin_removed",
        "reaction_added",
        "reaction_removed"
      ]
    }
  }
}

Impostazioni aggiuntive del manifesto

Espongono diverse funzionalità che estendono i valori predefiniti sopra indicati.
È possibile usare più comandi slash nativi invece di un singolo comando configurato, con alcune sfumature:
  • Usa /agentstatus invece di /status perché il comando /status è riservato.
  • Non è possibile rendere disponibili più di 25 comandi slash contemporaneamente.
Sostituisci la sezione esistente features.slash_commands con un sottoinsieme dei comandi disponibili:
    "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": "/model",
        "description": "Show or set the model",
        "usage_hint": "[name|#|status]"
      },
      {
        "command": "/models",
        "description": "List providers or models for a provider",
        "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": "/usage",
        "description": "Control the usage footer or show cost summary",
        "usage_hint": "off|tokens|full|cost"
      }
    ]
Aggiungi l’ambito bot chat:write.customize se vuoi che i messaggi in uscita usino l’identità dell’agente attivo (nome utente e icona personalizzati) invece dell’identità predefinita dell’app Slack.Se usi un’icona emoji, Slack si aspetta la sintassi :emoji_name:.
Se configuri channels.slack.userToken, gli ambiti 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 di Slack)

Modello dei token

  • botToken + appToken sono richiesti per Socket Mode.
  • La modalità HTTP richiede botToken + signingSecret.
  • botToken, appToken, signingSecret e userToken accettano stringhe in chiaro o oggetti SecretRef.
  • I token di configurazione hanno la precedenza sul fallback env.
  • Il fallback env SLACK_BOT_TOKEN / SLACK_APP_TOKEN si applica solo all’account predefinito.
  • userToken (xoxp-...) è solo di configurazione (nessun fallback env) e per impostazione predefinita usa un comportamento di sola lettura (userTokenReadOnly: true).
Comportamento dell’istantanea di stato:
  • L’ispezione dell’account Slack traccia i campi *Source e *Status per credenziale (botToken, appToken, signingSecret, userToken).
  • Lo stato è available, configured_unavailable o missing.
  • configured_unavailable significa che l’account è configurato tramite SecretRef o un’altra origine di segreto non inline, ma il percorso corrente di comando/runtime non ha potuto risolvere il valore effettivo.
  • In modalità HTTP, è incluso signingSecretStatus; in Socket Mode, la coppia richiesta è botTokenStatus + appTokenStatus.
Per le azioni/letture di directory, il token utente può essere preferito quando configurato. Per le scritture, il token bot resta preferito; le scritture con token utente sono consentite solo quando userTokenReadOnly: false e il token bot non è disponibile.

Azioni e controlli

Le azioni Slack sono controllate da channels.slack.actions.*. Gruppi di azioni disponibili negli strumenti Slack attuali:
GroupDefault
messaggiabilitato
reazioniabilitato
pinabilitato
infoMembroabilitato
elencoEmojiabilitato
Le attuali azioni sui messaggi Slack includono send, upload-file, download-file, read, edit, delete, pin, unpin, list-pins, member-info ed emoji-list.

Controllo degli accessi e instradamento

channels.slack.dmPolicy controlla l’accesso ai 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 predefiniti false)
  • dm.groupChannels (allowlist MPIM facoltativa)
Precedenza multi-account:
  • channels.slack.accounts.default.allowFrom si applica solo all’account default.
  • Gli account con nome ereditano channels.slack.allowFrom quando il loro allowFrom non è impostato.
  • Gli account con nome non ereditano channels.slack.accounts.default.allowFrom.
L’abbinamento nei DM usa openclaw pairing approve slack <code>.

Thread, sessioni e tag di risposta

  • I DM vengono instradati come direct; i canali come channel; gli MPIM come group.
  • Con il valore predefinito session.dmScope=main, i DM di Slack confluiscono nella sessione principale dell’agente.
  • Sessioni del canale: agent:<agentId>:slack:channel:<channelId>.
  • Le risposte nei thread possono creare suffissi di sessione del thread (:thread:<threadTs>) quando applicabile.
  • Il valore predefinito di channels.slack.thread.historyScope è thread; quello di thread.inheritParent è false.
  • channels.slack.thread.initialHistoryLimit controlla quanti messaggi esistenti del thread vengono recuperati quando inizia una nuova sessione del thread (predefinito 20; imposta 0 per disabilitare).
  • channels.slack.thread.requireExplicitMention (predefinito false): quando è true, sopprime le menzioni implicite nei thread, così il bot risponde solo a menzioni esplicite @bot all’interno dei thread, anche quando il bot ha già partecipato al thread. Senza questo, le risposte in un thread a cui il bot ha partecipato bypassano il controllo requireMention.
Controlli del threading delle risposte:
  • channels.slack.replyToMode: off|first|all|batched (predefinito off)
  • channels.slack.replyToModeByChatType: per direct|group|channel
  • fallback legacy per chat dirette: channels.slack.dm.replyToMode
Sono supportati tag di risposta manuali:
  • [[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 modalità "off". La differenza riflette i modelli di threading delle piattaforme: i thread di Slack nascondono i messaggi dal canale, mentre le risposte di Telegram restano visibili nel flusso principale della chat.

Reazioni di ack

ackReaction invia un’emoji di conferma mentre OpenClaw elabora un messaggio in ingresso. Ordine di risoluzione:
  • channels.slack.accounts.<accountId>.ackReaction
  • channels.slack.ackReaction
  • messages.ackReaction
  • fallback all’emoji dell’identità dell’agente (agents.list[].identity.emoji, altrimenti ”👀”)
Note:
  • Slack si aspetta shortcode (ad esempio "eyes").
  • Usa "" per disabilitare la reazione per l’account Slack o globalmente.

Streaming del testo

channels.slack.streaming controlla il comportamento dell’anteprima live:
  • off: disabilita lo streaming dell’anteprima live.
  • partial (predefinito): sostituisce il testo di anteprima con l’output parziale più recente.
  • block: aggiunge aggiornamenti di anteprima a blocchi.
  • progress: mostra il testo di stato dell’avanzamento durante la generazione, quindi invia il testo finale.
channels.slack.streaming.nativeTransport controlla lo streaming nativo del testo di Slack quando channels.slack.streaming.mode è partial (predefinito: true).
  • Per visualizzare lo streaming nativo del testo e lo stato del thread assistant di Slack deve essere disponibile un thread di risposta. La selezione del thread continua comunque a seguire replyToMode.
  • Le radici di canali e chat di gruppo possono comunque usare la normale anteprima bozza quando lo streaming nativo non è disponibile.
  • Le DM Slack di primo livello restano fuori thread per impostazione predefinita, quindi non mostrano l’anteprima in stile thread; usa risposte nei thread o typingReaction se vuoi un avanzamento visibile lì.
  • I contenuti multimediali e i payload non testuali usano il fallback alla consegna normale.
  • Se lo streaming fallisce a metà risposta, OpenClaw usa il fallback alla consegna normale per i payload rimanenti.
Usa l’anteprima bozza invece dello streaming nativo del testo di Slack:
{
  channels: {
    slack: {
      streaming: {
        mode: "partial",
        nativeTransport: false,
      },
    },
  },
}
Chiavi legacy:
  • channels.slack.streamMode (replace | status_final | append) viene migrato automaticamente in channels.slack.streaming.mode.
  • il booleano channels.slack.streaming viene migrato automaticamente in channels.slack.streaming.mode e channels.slack.streaming.nativeTransport.
  • la chiave legacy channels.slack.nativeStreaming viene migrata automaticamente in channels.slack.streaming.nativeTransport.

Fallback della reazione di digitazione

typingReaction aggiunge una reazione temporanea al messaggio Slack in ingresso mentre OpenClaw elabora una risposta, quindi la rimuove al termine dell’esecuzione. Questo è particolarmente utile al di fuori delle risposte nei thread, che usano un indicatore di stato predefinito “sta scrivendo…”. Ordine di risoluzione:
  • channels.slack.accounts.<accountId>.typingReaction
  • channels.slack.typingReaction
Note:
  • Slack si aspetta shortcode (ad esempio "hourglass_flowing_sand").
  • La reazione è best-effort e la pulizia viene tentata automaticamente dopo il completamento della risposta o del percorso di errore.

Media, suddivisione in blocchi e consegna

Gli allegati file di Slack vengono scaricati da URL private ospitate da Slack (flusso di richiesta autenticato tramite token) e scritti nell’archivio media quando il recupero ha esito positivo e i limiti di dimensione lo consentono.Il limite di dimensione in ingresso a runtime è per impostazione predefinita 20MB, salvo override con channels.slack.mediaMaxMb.
  • i blocchi di testo usano channels.slack.textChunkLimit (predefinito 4000)
  • channels.slack.chunkMode="newline" abilita la suddivisione con priorità ai paragrafi
  • gli invii di file usano le API di upload di Slack e possono includere risposte nei thread (thread_ts)
  • il limite dei media in uscita segue channels.slack.mediaMaxMb quando configurato; altrimenti gli invii del canale usano i valori predefiniti per tipo MIME dalla pipeline media
Destinazioni esplicite preferite:
  • user:<id> per i DM
  • channel:<id> per i canali
I DM Slack vengono aperti tramite le API di conversazione di Slack quando si invia verso destinazioni utente.

Comandi e comportamento slash

I comandi slash appaiono in Slack come un singolo comando configurato o come più comandi nativi. Configura channels.slack.slashCommand per modificare i valori predefiniti del comando:
  • enabled: false
  • name: "openclaw"
  • sessionPrefix: "slack:slash"
  • ephemeral: true
/openclaw /help
I comandi nativi richiedono impostazioni aggiuntive del manifesto nella tua app Slack e vengono invece abilitati con channels.slack.commands.native: true o commands.native: true nelle configurazioni globali.
  • La modalità automatica dei comandi nativi è disattivata per Slack, quindi commands.native: "auto" non abilita i comandi nativi di Slack.
/help
I menu nativi degli argomenti usano una strategia di rendering adattiva che mostra un modal di conferma prima di inviare il valore dell’opzione selezionata:
  • fino a 5 opzioni: blocchi di pulsanti
  • 6-100 opzioni: menu statico di selezione
  • più di 100 opzioni: selezione esterna con filtro asincrono delle opzioni quando sono disponibili gestori per le opzioni di interattività
  • superati i limiti di Slack: i valori di opzione codificati usano il fallback ai pulsanti
/think
Le sessioni slash usano chiavi isolate come agent:<agentId>:slack:slash:<userId> e continuano comunque a instradare le esecuzioni dei comandi verso la sessione della conversazione di destinazione usando CommandTargetSessionKey.

Risposte interattive

Slack può renderizzare controlli di risposta interattivi creati dall’agente, ma questa funzionalità è disabilitata per impostazione predefinita. Abilitala globalmente:
{
  channels: {
    slack: {
      capabilities: {
        interactiveReplies: true,
      },
    },
  },
}
Oppure abilitala solo per un account Slack:
{
  channels: {
    slack: {
      accounts: {
        ops: {
          capabilities: {
            interactiveReplies: true,
          },
        },
      },
    },
  },
}
Quando è abilitata, gli agenti possono emettere direttive di risposta solo 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 esistente degli eventi di interazione Slack. Note:
  • Si tratta di UI specifica di Slack. Gli altri canali non traducono le direttive Slack Block Kit nei propri sistemi di pulsanti.
  • I valori di callback interattivi sono token opachi generati da OpenClaw, non valori grezzi creati dall’agente.
  • Se i blocchi interattivi generati superano i limiti di Slack Block Kit, OpenClaw usa il fallback alla risposta testuale originale invece di inviare un payload blocks non valido.

Approvazioni exec in Slack

Slack può agire come client di approvazione nativo con pulsanti e interazioni interattivi, invece di usare il fallback alla Web UI o al terminale.
  • Le approvazioni exec usano channels.slack.execApprovals.* per l’instradamento nativo in DM/canale.
  • Le approvazioni Plugin possono comunque essere risolte tramite la stessa superficie nativa di pulsanti Slack quando la richiesta arriva già in Slack e il tipo di id di approvazione è plugin:.
  • L’autorizzazione degli approvatori continua a essere applicata: solo gli utenti identificati come approvatori possono approvare o negare richieste tramite Slack.
Questo usa la stessa superficie condivisa di pulsanti di approvazione degli altri canali. Quando interactivity è abilitato nelle impostazioni della tua app Slack, i prompt di approvazione vengono renderizzati come pulsanti Block Kit direttamente nella conversazione. Quando questi pulsanti sono presenti, rappresentano la UX di approvazione primaria; OpenClaw dovrebbe includere un comando manuale /approve solo quando il risultato dello strumento indica che le approvazioni in chat non sono disponibili o che l’approvazione manuale è l’unico percorso. Percorso di configurazione:
  • channels.slack.execApprovals.enabled
  • channels.slack.execApprovals.approvers (facoltativo; usa il fallback a commands.ownerAllowFrom quando possibile)
  • channels.slack.execApprovals.target (dm | channel | both, predefinito: dm)
  • agentFilter, sessionFilter
Slack abilita automaticamente le approvazioni exec native quando enabled non è impostato o è "auto" e viene risolto almeno un approvatore. Imposta enabled: false per disabilitare esplicitamente Slack come client di approvazione nativo. Imposta enabled: true per forzare l’attivazione delle approvazioni native quando gli approvatori vengono risolti. Comportamento predefinito senza configurazione esplicita delle approvazioni exec Slack:
{
  commands: {
    ownerAllowFrom: ["slack:U12345678"],
  },
}
La configurazione nativa esplicita di Slack è necessaria solo quando vuoi sovrascrivere gli approvatori, aggiungere filtri o attivare la consegna nella chat di origine:
{
  channels: {
    slack: {
      execApprovals: {
        enabled: true,
        approvers: ["U12345678"],
        target: "both",
      },
    },
  },
}
L’inoltro condiviso approvals.exec è separato. Usalo solo quando i prompt di approvazione exec devono essere instradati anche verso altre chat o destinazioni esplicite fuori banda. Anche l’inoltro condiviso approvals.plugin è separato; i pulsanti nativi di Slack possono comunque risolvere le approvazioni Plugin quando tali richieste arrivano già in Slack. Anche /approve nella stessa chat funziona in canali e DM Slack che supportano già i comandi. Vedi Approvazioni exec per il modello completo di inoltro delle approvazioni.

Eventi e comportamento operativo

  • Le modifiche/eliminazioni dei messaggi e i broadcast dei thread vengono mappati in eventi di sistema.
  • Gli eventi di aggiunta/rimozione di reazioni vengono mappati in eventi di sistema.
  • Gli eventi di ingresso/uscita membri, creazione/rinomina canale e aggiunta/rimozione pin vengono mappati in eventi di sistema.
  • channel_id_changed può migrare le chiavi di configurazione del canale quando configWrites è abilitato.
  • I metadati di topic/purpose del canale vengono trattati come contesto non attendibile e possono essere iniettati nel contesto di instradamento.
  • Il thread starter e il seeding iniziale del contesto della cronologia del thread vengono filtrati tramite le allowlist di mittenti configurate quando applicabile.
  • Le azioni sui blocchi e le interazioni con i modal emettono eventi di sistema strutturati Slack interaction: ... con campi payload avanzati:
    • azioni sui blocchi: valori selezionati, etichette, valori dei picker e metadati workflow_*
    • eventi modal view_submission e view_closed con metadati del canale instradato e input del modulo

Puntatori al riferimento della configurazione

Riferimento principale:
  • Riferimento della configurazione - Slack Campi Slack ad alto segnale:
    • modalità/auth: mode, botToken, appToken, signingSecret, webhookPath, accounts.*
    • accesso DM: dm.enabled, dmPolicy, allowFrom (legacy: dm.policy, dm.allowFrom), dm.groupEnabled, dm.groupChannels
    • interruttore di compatibilità: dangerouslyAllowNameMatching (solo emergenza; lascialo disattivato salvo necessità)
    • accesso canale: groupPolicy, channels.*, channels.*.users, channels.*.requireMention
    • threading/cronologia: replyToMode, replyToModeByChatType, thread.*, historyLimit, dmHistoryLimit, dms.*.historyLimit
    • consegna: textChunkLimit, chunkMode, mediaMaxMb, streaming, streaming.nativeTransport
    • operazioni/funzionalità: configWrites, commands.native, slashCommand.*, actions.*, userToken, userTokenReadOnly

Risoluzione dei problemi

Controlla, in ordine:
  • groupPolicy
  • allowlist del canale (channels.slack.channels)
  • requireMention
  • allowlist users per canale
Comandi utili:
openclaw channels status --probe
openclaw logs --follow
openclaw doctor
Controlla:
  • channels.slack.dm.enabled
  • channels.slack.dmPolicy (o il legacy channels.slack.dm.policy)
  • approvazioni di abbinamento / voci allowlist
openclaw pairing list slack
Verifica i token bot + app e l’abilitazione di Socket Mode nelle impostazioni dell’app Slack.Se openclaw channels status --probe --json mostra botTokenStatus o appTokenStatus: "configured_unavailable", l’account Slack è configurato ma il runtime corrente non è riuscito a risolvere il valore supportato da SecretRef.
Verifica:
  • signing secret
  • percorso webhook
  • URL di richiesta Slack (Eventi + Interattività + comandi slash)
  • webhookPath univoco per ogni account HTTP
Se signingSecretStatus: "configured_unavailable" appare nelle istantanee dell’account, l’account HTTP è configurato ma il runtime corrente non è riuscito a risolvere il signing secret supportato da SecretRef.
Verifica se intendevi usare:
  • modalità comandi nativi (channels.slack.commands.native: true) con i corrispondenti comandi slash registrati in Slack
  • oppure modalità comando slash singolo (channels.slack.slashCommand.enabled: true)
Controlla anche commands.useAccessGroups e le allowlist di canali/utenti.

Correlati