Slack
Statut : pret pour la production pour les DMs + salons via les integrations dâapplications Slack. Le mode par defaut est Socket Mode ; le mode API Events HTTP est egalement pris en charge.
- Appairage â Les DMs Slack utilisent le mode appairage par defaut.
- Commandes slash â Comportement des commandes natives et catalogue.
- Depannage des canaux â Diagnostics et procedures de reparation inter-canaux.
Configuration rapide
Socket Mode (par defaut)
### Etape 1 : creer l'application Slack et les tokens
Dans les parametres de l'application Slack :
- activez **Socket Mode**
- creez un **App Token** (`xapp-...`) avec `connections:write`
- installez l'application et copiez le **Bot Token** (`xoxb-...`)
### Etape 2 : configurer OpenClaw
{
channels: {
slack: {
enabled: true,
mode: "socket",
appToken: "xapp-...",
botToken: "xoxb-...",
},
},
}
Variable d'environnement de secours (compte par defaut uniquement) :
SLACK_APP_TOKEN=xapp-...
SLACK_BOT_TOKEN=xoxb-...
### Etape 3 : abonner les evenements de l'application
Abonnez les evenements bot pour :
- `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`
Activez egalement l'**onglet Messages** du App Home pour les DMs.
### Etape 4 : demarrer la gateway
openclaw gateway
Mode API Events HTTP
### Etape 1 : configurer l'application Slack pour HTTP
- definissez le mode sur HTTP (`channels.slack.mode="http"`)
- copiez le **Signing Secret** Slack
- definissez l'URL de requete des Event Subscriptions + Interactivite + commande Slash sur le meme chemin webhook (par defaut `/slack/events`)
### Etape 2 : configurer le mode HTTP OpenClaw
{
channels: {
slack: {
enabled: true,
mode: "http",
botToken: "xoxb-...",
signingSecret: "your-signing-secret",
webhookPath: "/slack/events",
},
},
}
### Etape 3 : utiliser des chemins webhook uniques pour le HTTP multi-comptes
Le mode HTTP par compte est pris en charge.
Donnez a chaque compte un `webhookPath` distinct pour eviter les collisions d'enregistrement.
Modele de tokens
botToken+appTokensont requis pour le Socket Mode.- Le mode HTTP necessite
botToken+signingSecret. - Les tokens de configuration ont priorite sur la variable dâenvironnement de secours.
SLACK_BOT_TOKEN/SLACK_APP_TOKENne sâappliquent quâau compte par defaut.userToken(xoxp-...) est configurable uniquement par fichier (pas de variable dâenvironnement) et en lecture seule par defaut (userTokenReadOnly: true).- Optionnel : ajoutez
chat:write.customizesi vous souhaitez que les messages sortants utilisent lâidentite de lâagent actif (nom dâutilisateur et icone personnalises).icon_emojiutilise la syntaxe:emoji_name:.
Astuce : Pour les actions/lectures de repertoire, le token utilisateur peut etre prefere lorsquâil est configure. Pour les ecritures, le token bot reste prefere ; les ecritures par token utilisateur ne sont autorisees que lorsque
userTokenReadOnly: falseet que le token bot est indisponible.
Controle dâacces et routage
Politique DM
`channels.slack.dmPolicy` controle l'acces DM (ancien : `channels.slack.dm.policy`) :
- `pairing` (par defaut)
- `allowlist`
- `open` (necessite que `channels.slack.allowFrom` contienne `"*"` ; ancien : `channels.slack.dm.allowFrom`)
- `disabled`
Options DM :
- `dm.enabled` (par defaut true)
- `channels.slack.allowFrom` (prefere)
- `dm.allowFrom` (ancien)
- `dm.groupEnabled` (DMs de groupe par defaut false)
- `dm.groupChannels` (liste d'autorisation MPIM optionnelle)
Priorite multi-comptes :
- `channels.slack.accounts.default.allowFrom` s'applique uniquement au compte `default`.
- Les comptes nommes heritent de `channels.slack.allowFrom` si leur propre `allowFrom` n'est pas defini.
- Les comptes nommes n'heritent pas de `channels.slack.accounts.default.allowFrom`.
L'appairage en DM utilise `openclaw pairing approve slack <code>`.
Politique de salon
`channels.slack.groupPolicy` controle la gestion des salons :
- `open`
- `allowlist`
- `disabled`
La liste d'autorisation des salons se trouve sous `channels.slack.channels` et doit utiliser des identifiants de salon stables.
Note d'execution : si `channels.slack` est completement absent (configuration par env uniquement), l'execution se replie sur `groupPolicy="allowlist"` et journalise un avertissement (meme si `channels.defaults.groupPolicy` est defini).
Resolution nom/identifiant :
- les entrees de liste d'autorisation de salon et de DM sont resolues au demarrage lorsque l'acces par token le permet
- les entrees de nom de salon non resolues sont conservees telles quelles mais ignorees pour le routage par defaut
- l'autorisation entrante et le routage de salon sont d'abord par identifiant ; la correspondance directe par nom d'utilisateur/slug necessite `channels.slack.dangerouslyAllowNameMatching: true`
Mentions et utilisateurs de salon
Les messages de salon sont filtres par mention par defaut.
Sources de mention :
- mention explicite de l'application (`<@botId>`)
- motifs de mention regex (`agents.list[].groupChat.mentionPatterns`, secours `messages.groupChat.mentionPatterns`)
- comportement implicite de reponse au bot dans un fil
Controles par salon (`channels.slack.channels.<id>` ; noms uniquement via resolution au demarrage ou `dangerouslyAllowNameMatching`) :
- `requireMention`
- `users` (liste d'autorisation)
- `allowBots`
- `skills`
- `systemPrompt`
- `tools`, `toolsBySender`
- Format des cles `toolsBySender` : `id:`, `e164:`, `username:`, `name:`, ou joker `"*"`
(les cles anciennes sans prefixe correspondent uniquement a `id:`)
Commandes et comportement slash
- Le mode commande native automatique est desactive pour Slack (
commands.native: "auto"nâactive pas les commandes natives Slack). - Activez les gestionnaires de commandes natives Slack avec
channels.slack.commands.native: true(ou globalcommands.native: true). - Lorsque les commandes natives sont activees, enregistrez les commandes slash correspondantes dans Slack (
/<command>), avec une exception :- enregistrez
/agentstatuspour la commande status (Slack reserve/status)
- enregistrez
- Si les commandes natives ne sont pas activees, vous pouvez executer une seule commande slash configuree via
channels.slack.slashCommand. - Les menus dâarguments natifs adaptent leur strategie de rendu :
- jusquâa 5 options : blocs de boutons
- 6-100 options : menu de selection statique
- plus de 100 options : selection externe avec filtrage asynchrone des options lorsque les gestionnaires dâoptions dâinteractivite sont disponibles
- si les valeurs dâoptions encodees depassent les limites Slack, le flux se replie sur les boutons
- Pour les payloads dâoptions longs, les menus dâarguments de commande slash utilisent une boite de dialogue de confirmation avant dâenvoyer la valeur selectionnee.
Reponses interactives
Slack peut afficher des controles de reponse interactifs rediges par lâagent, mais cette fonctionnalite est desactivee par defaut.
Activation globale :
{
channels: {
slack: {
capabilities: {
interactiveReplies: true,
},
},
},
}
Ou activation pour un seul compte Slack :
{
channels: {
slack: {
accounts: {
ops: {
capabilities: {
interactiveReplies: true,
},
},
},
},
},
}
Lorsque cette fonctionnalite est activee, les agents peuvent emettre des directives specifiques a Slack :
[[slack_buttons: Approve:approve, Reject:reject]][[slack_select: Choose a target | Canary:canary, Production:production]]
Ces directives sont compilees en Slack Block Kit et les clics ou selections sont routes via le chemin dâevenement dâinteraction Slack existant.
Remarques :
- Il sâagit dâune interface specifique a Slack. Les autres canaux ne traduisent pas les directives Block Kit Slack dans leurs propres systemes de boutons.
- Les valeurs de callback interactif sont des tokens opaques generes par OpenClaw, pas les valeurs brutes redigees par lâagent.
- Si les blocs interactifs generes depassent les limites Block Kit Slack, OpenClaw se replie sur la reponse en texte original au lieu dâenvoyer un payload de blocs invalide.
Parametres par defaut des commandes slash :
enabled: falsename: "openclaw"sessionPrefix: "slack:slash"ephemeral: true
Les sessions slash utilisent des cles isolees :
agent:<agentId>:slack:slash:<userId>
et routent toujours lâexecution de commande vers la session de conversation cible (CommandTargetSessionKey).
Fils, sessions et tags de reponse
- Les DMs sont routes comme
direct; les salons commechannel; les MPIMs commegroup. - Avec le
session.dmScope=mainpar defaut, les DMs Slack se regroupent dans la session principale de lâagent. - Sessions de salon :
agent:<agentId>:slack:channel:<channelId>. - Les reponses de fil peuvent creer des suffixes de session de fil (
:thread:<threadTs>) le cas echeant. channels.slack.thread.historyScopepar defaut estthread;thread.inheritParentpar defaut estfalse.channels.slack.thread.initialHistoryLimitcontrole le nombre de messages de fil existants recuperes au demarrage dâune nouvelle session de fil (par defaut20; definissez0pour desactiver).
Controles de fils de reponse :
channels.slack.replyToMode:off|first|all(par defautoff)channels.slack.replyToModeByChatType: pardirect|group|channel- secours ancien pour les chats directs :
channels.slack.dm.replyToMode
Les tags de reponse manuels sont pris en charge :
[[reply_to_current]][[reply_to:<id>]]
Remarque :
replyToMode="off"desactive tous les fils de reponse dans Slack, y compris les tags explicites[[reply_to_*]]. Ceci differe de Telegram, ou les tags explicites sont toujours honores en mode"off". La difference reflete les modeles de fil des plateformes : les fils Slack masquent les messages du salon, tandis que les reponses Telegram restent visibles dans le flux principal du chat.
Medias, decoupage et livraison
Pieces jointes entrantes
Les pieces jointes de fichiers Slack sont telechargees depuis les URLs privees hebergees par Slack (requete authentifiee par token) et ecrites dans le stockage media lorsque le telechargement reussit et que les limites de taille le permettent.
La limite de taille entrante a l'execution est par defaut de `20 Mo` sauf remplacement par `channels.slack.mediaMaxMb`.
Texte et fichiers sortants
- les morceaux de texte utilisent `channels.slack.textChunkLimit` (par defaut 4000)
- `channels.slack.chunkMode="newline"` active le decoupage par paragraphe en priorite
- les envois de fichiers utilisent les API d'upload Slack et peuvent inclure des reponses de fil (`thread_ts`)
- la limite media sortante suit `channels.slack.mediaMaxMb` lorsqu'elle est configuree ; sinon les envois de canal utilisent les valeurs par defaut du type MIME du pipeline media
Cibles de livraison
Cibles explicites preferees :
- `user:<id>` pour les DMs
- `channel:<id>` pour les salons
Les DMs Slack sont ouverts via les API de conversation Slack lors de l'envoi a des cibles utilisateur.
Actions et controles
Les actions Slack sont controlees par channels.slack.actions.*.
Groupes dâactions disponibles dans lâoutillage Slack actuel :
| Groupe | Par defaut |
|---|---|
| messages | active |
| reactions | active |
| pins | active |
| memberInfo | active |
| emojiList | active |
Evenements et comportement operationnel
- Les modifications/suppressions/diffusions de fil de messages sont transformes en evenements systeme.
- Les evenements dâajout/suppression de reaction sont transformes en evenements systeme.
- Les evenements dâarrivee/depart de membre, de creation/renommage de salon et dâajout/suppression dâepingle sont transformes en evenements systeme.
- Les mises a jour de statut des fils dâassistant (pour les indicateurs « est en train dâecrire⊠» dans les fils) utilisent
assistant.threads.setStatuset necessitent le scope botassistant:write. channel_id_changedpeut migrer les cles de configuration de salon lorsqueconfigWritesest active.- Les metadonnees de sujet/objectif de salon sont traitees comme contexte non fiable et peuvent etre injectees dans le contexte de routage.
- Les actions de blocs et interactions modales emettent des evenements systeme structures
Slack interaction: ...avec des champs de payload riches :- actions de blocs : valeurs selectionnees, libelles, valeurs de selecteur et metadonnees
workflow_* - evenements
view_submissionetview_closedmodaux avec les metadonnees du salon route et les saisies de formulaire
- actions de blocs : valeurs selectionnees, libelles, valeurs de selecteur et metadonnees
Reactions dâaccuse de reception
ackReaction envoie un emoji dâaccuse de reception pendant quâOpenClaw traite un message entrant.
Ordre de resolution :
channels.slack.accounts.<accountId>.ackReactionchannels.slack.ackReactionmessages.ackReaction- emoji de secours de lâidentite de lâagent (
agents.list[].identity.emoji, sinon âeyesâ)
Remarques :
- Slack attend des shortcodes (par exemple
"eyes"). - Utilisez
""pour desactiver la reaction pour le compte Slack ou globalement.
Reaction de saisie de secours
typingReaction ajoute une reaction temporaire au message Slack entrant pendant quâOpenClaw traite une reponse, puis la supprime lorsque lâexecution se termine. Câest un repli utile lorsque la saisie native de lâassistant Slack est indisponible, notamment en DM.
Ordre de resolution :
channels.slack.accounts.<accountId>.typingReactionchannels.slack.typingReaction
Remarques :
- Slack attend des shortcodes (par exemple
"hourglass_flowing_sand"). - La reaction est en best-effort et le nettoyage est tente automatiquement apres la reponse ou le chemin dâerreur.
Manifeste et checklist de scopes
Exemple de manifeste d'application 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"
]
}
}
}
Scopes optionnels du token utilisateur (operations de lecture)
Si vous configurez `channels.slack.userToken`, les scopes de lecture typiques sont :
- `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` (si vous dependez des lectures de recherche Slack)
Depannage
Pas de reponses dans les salons
Verifiez, dans l'ordre :
- `groupPolicy`
- liste d'autorisation des salons (`channels.slack.channels`)
- `requireMention`
- liste d'autorisation `users` par salon
Commandes utiles :
openclaw channels status --probe
openclaw logs --follow
openclaw doctor
Messages DM ignores
Verifiez :
- `channels.slack.dm.enabled`
- `channels.slack.dmPolicy` (ou ancien `channels.slack.dm.policy`)
- approbations d'appairage / entrees de liste d'autorisation
openclaw pairing list slack
Socket Mode ne se connecte pas
Validez les tokens bot + app et l'activation du Socket Mode dans les parametres de l'application Slack.
Le mode HTTP ne recoit pas d'evenements
Validez :
- signing secret
- chemin webhook
- URLs de requete Slack (Events + Interactivite + commandes Slash)
- `webhookPath` unique par compte HTTP
Les commandes natives/slash ne se declenchent pas
Verifiez si vous souhaitiez :
- le mode commande native (`channels.slack.commands.native: true`) avec des commandes slash correspondantes enregistrees dans Slack
- ou le mode commande slash unique (`channels.slack.slashCommand.enabled: true`)
Verifiez aussi `commands.useAccessGroups` et les listes d'autorisation salon/utilisateur.
Streaming texte
OpenClaw prend en charge le streaming texte natif Slack via lâAPI Agents and AI Apps.
channels.slack.streaming controle le comportement dâapercu en direct :
off: desactiver le streaming dâapercu en direct.partial(par defaut) : remplacer le texte dâapercu par la derniere sortie partielle.block: ajouter des mises a jour dâapercu par morceaux.progress: afficher un texte de statut de progression pendant la generation, puis envoyer le texte final.
channels.slack.nativeStreaming controle lâAPI de streaming native de Slack (chat.startStream / chat.appendStream / chat.stopStream) lorsque streaming est partial (par defaut : true).
Desactiver le streaming natif Slack (conserver le comportement dâapercu brouillon) :
channels:
slack:
streaming: partial
nativeStreaming: false
Cles anciennes :
channels.slack.streamMode(replace | status_final | append) est migre automatiquement verschannels.slack.streaming.- La valeur booleenne
channels.slack.streamingest migree automatiquement verschannels.slack.nativeStreaming.
Prerequis
- Activez Agents and AI Apps dans les parametres de votre application Slack.
- Assurez-vous que lâapplication a le scope
assistant:write. - Un fil de reponse doit etre disponible pour ce message. La selection du fil suit toujours
replyToMode.
Comportement
- Le premier morceau de texte demarre un flux (
chat.startStream). - Les morceaux suivants sont ajoutes au meme flux (
chat.appendStream). - La fin de la reponse finalise le flux (
chat.stopStream). - Les medias et payloads non textuels se replient sur la livraison normale.
- Si le streaming echoue en cours de reponse, OpenClaw se replie sur la livraison normale pour les payloads restants.
Pointeurs vers la reference de configuration
Reference principale :
-
Reference de configuration - Slack
Champs Slack a fort impact :
- mode/auth :
mode,botToken,appToken,signingSecret,webhookPath,accounts.* - acces DM :
dm.enabled,dmPolicy,allowFrom(ancien :dm.policy,dm.allowFrom),dm.groupEnabled,dm.groupChannels - bascule de compatibilite :
dangerouslyAllowNameMatching(derogatoire ; gardez desactive sauf si necessaire) - acces salon :
groupPolicy,channels.*,channels.*.users,channels.*.requireMention - fils/historique :
replyToMode,replyToModeByChatType,thread.*,historyLimit,dmHistoryLimit,dms.*.historyLimit - livraison :
textChunkLimit,chunkMode,mediaMaxMb,streaming,nativeStreaming - ops/fonctionnalites :
configWrites,commands.native,slashCommand.*,actions.*,userToken,userTokenReadOnly
- mode/auth :