Slack
Mode socket (par defaut)
Demarrage rapide (debutant)
- Creez une application Slack et activez le Mode socket.
- Creez un App Token (
xapp-...) et un Bot Token (xoxb-...). - Definissez les tokens pour OpenClaw et demarrez la Gateway (passerelle).
Configuration
- Creez une application Slack (From scratch) sur https://api.slack.com/apps.
- Mode socket → activez l’option. Puis allez dans Basic Information → App-Level Tokens → Generate Token and Scopes avec le scope
connections:write. Copiez l’App Token (xapp-...). - OAuth & Permissions → ajoutez les scopes du bot (utilisez le manifeste ci-dessous). Cliquez sur Install to Workspace. Copiez le Bot User OAuth Token (
xoxb-...). - Optionnel : OAuth & Permissions → ajoutez des User Token Scopes (voir la liste en lecture seule ci-dessous). Reinstallez l’application et copiez le User OAuth Token (
xoxp-...). - Event Subscriptions → activez les evenements et abonnez-vous a :
message.*(inclut les editions/suppressions/diffusions de fils)app_mentionreaction_added,reaction_removedmember_joined_channel,member_left_channelchannel_renamepin_added,pin_removed
- Invitez le bot dans les canaux que vous souhaitez qu’il lise.
- Slash Commands → creez
/openclawsi vous utilisezchannels.slack.slashCommand. Si vous activez les commandes natives, ajoutez une commande slash par commande integree (memes noms que/help). Par defaut, le mode natif est desactive pour Slack, sauf si vous definissezchannels.slack.commands.native: true(la valeur globalecommands.nativeest"auto", ce qui laisse Slack desactive). - App Home → activez l’onglet Messages afin que les utilisateurs puissent envoyer des Messages prives au bot.
channels.slack.accounts avec des tokens par compte et name en option. Voir gateway/configuration pour le modele partage.
Configuration OpenClaw (minimale)
Definissez les tokens via des variables d’environnement (recommande) :SLACK_APP_TOKEN=xapp-...SLACK_BOT_TOKEN=xoxb-...
Token utilisateur (optionnel)
OpenClaw peut utiliser un token utilisateur Slack (xoxp-...) pour les operations de lecture (historique,
epingles, reactions, emoji, informations de membres). Par defaut, cela reste en lecture seule : les lectures
preferent le token utilisateur lorsqu’il est present, et les ecritures utilisent toujours le token du bot sauf
si vous y consentez explicitement. Meme avec userTokenReadOnly: false, le token du bot reste
prefere pour les ecritures lorsqu’il est disponible.
Les tokens utilisateur sont configures dans le fichier de configuration (pas de prise en charge par variables d’environnement). Pour le
multi-comptes, definissez channels.slack.accounts.<id>.userToken.
Exemple avec tokens bot + app + utilisateur :
Utilisation des tokens
- Operations de lecture (historique, liste des reactions, liste des epingles, liste des emoji, informations des membres, recherche) : preference pour le token utilisateur lorsqu’il est configure, sinon le token du bot.
- Operations d’ecriture (envoyer/editer/supprimer des messages, ajouter/supprimer des reactions, epingler/desepingler,
televersements de fichiers) : utilisent le token du bot par defaut. Si
userTokenReadOnly: falseet qu’aucun token de bot n’est disponible, OpenClaw bascule vers le token utilisateur.
Contexte d’historique
channels.slack.historyLimit(ouchannels.slack.accounts.*.historyLimit) controle le nombre de messages recents de canal/groupe integres dans le prompt.- Repli sur
messages.groupChat.historyLimit. Definissez0pour desactiver (par defaut 50).
Mode HTTP (API Events)
Utilisez le mode webhook HTTP lorsque votre Gateway (passerelle) est accessible par Slack via HTTPS (typique pour des deploiements serveur). Le mode HTTP utilise l’API Events + Interactivity + Slash Commands avec une URL de requete partagee.Configuration (mode HTTP)
- Creez une application Slack et desactivez le Mode socket (optionnel si vous n’utilisez que HTTP).
- Basic Information → copiez le Signing Secret.
- OAuth & Permissions → installez l’application et copiez le Bot User OAuth Token (
xoxb-...). - Event Subscriptions → activez les evenements et definissez l’URL de requete vers le chemin webhook de votre gateway (par defaut
/slack/events). - Interactivity & Shortcuts → activez et definissez la meme URL de requete.
- Slash Commands → definissez la meme URL de requete pour vos commande(s).
https://gateway-host/slack/events
Configuration OpenClaw (minimale)
channels.slack.accounts.<id>.mode = "http" et fournissez un
webhookPath unique par compte afin que chaque application Slack pointe vers sa propre URL.
Manifeste (optionnel)
Utilisez ce manifeste d’application Slack pour creer l’application rapidement (ajustez le nom/la commande si vous le souhaitez). Incluez les scopes utilisateur si vous prevoyez de configurer un token utilisateur.slash_commands par commande que vous souhaitez exposer (correspondant a la liste /help). Surchargez avec channels.slack.commands.native.
Scopes (actuels vs optionnels)
L’API Conversations de Slack est scopee par type : vous n’avez besoin que des scopes pour les types de conversations que vous utilisez reellement (channels, groups, im, mpim). Voir https://docs.slack.dev/apis/web-api/using-the-conversations-api/ pour la vue d’ensemble.Scopes du token du bot (requis)
chat:write(envoyer/mettre a jour/supprimer des messages viachat.postMessage) https://docs.slack.dev/reference/methods/chat.postMessageim:write(ouvrir des Messages prives viaconversations.openpour les Messages prives utilisateur) https://docs.slack.dev/reference/methods/conversations.openchannels:history,groups:history,im:history,mpim:historyhttps://docs.slack.dev/reference/methods/conversations.historychannels:read,groups:read,im:read,mpim:readhttps://docs.slack.dev/reference/methods/conversations.infousers:read(recherche d’utilisateurs) https://docs.slack.dev/reference/methods/users.inforeactions:read,reactions:write(reactions.get/reactions.add) https://docs.slack.dev/reference/methods/reactions.get https://docs.slack.dev/reference/methods/reactions.addpins:read,pins:write(pins.list/pins.add/pins.remove) https://docs.slack.dev/reference/scopes/pins.read https://docs.slack.dev/reference/scopes/pins.writeemoji:read(emoji.list) https://docs.slack.dev/reference/scopes/emoji.readfiles:write(televersements viafiles.uploadV2) https://docs.slack.dev/messaging/working-with-files/#upload
Scopes du token utilisateur (optionnels, lecture seule par defaut)
Ajoutez-les sous User Token Scopes si vous configurezchannels.slack.userToken.
channels:history,groups:history,im:history,mpim:historychannels:read,groups:read,im:read,mpim:readusers:readreactions:readpins:reademoji:readsearch:read
Non requis aujourd’hui (mais probables a l’avenir)
mpim:write(uniquement si nous ajoutons l’ouverture de group-DM / demarrage de DM viaconversations.open)groups:write(uniquement si nous ajoutons la gestion des canaux prives : creer/renommer/inviter/archiver)chat:write.public(uniquement si nous voulons publier dans des canaux dont le bot ne fait pas partie) https://docs.slack.dev/reference/scopes/chat.write.publicusers:read.email(uniquement si nous avons besoin des champs email depuisusers.info) https://docs.slack.dev/changelog/2017-04-narrowing-email-accessfiles:read(uniquement si nous commencons a lister/lire les metadonnees de fichiers)
Configuration
Slack utilise uniquement le Mode socket (pas de serveur webhook HTTP). Fournissez les deux tokens :SLACK_BOT_TOKENSLACK_APP_TOKEN
messages.ackReaction +
messages.ackReactionScope. Utilisez messages.removeAckAfterReply pour effacer la
reaction d’accuse de reception apres la reponse du bot.
Limites
- Le texte sortant est fragmente a
channels.slack.textChunkLimit(par defaut 4000). - Fragmentation optionnelle par retours a la ligne : definissez
channels.slack.chunkMode="newline"pour scinder sur les lignes vides (limites de paragraphes) avant la fragmentation par longueur. - Les televersements de medias sont limites par
channels.slack.mediaMaxMb(par defaut 20).
Fil de reponse
Par defaut, OpenClaw repond dans le canal principal. Utilisezchannels.slack.replyToMode pour controler le fil automatique :
| Mode | Comportement |
|---|---|
off | Par defaut. Repondre dans le canal principal. Ne creer un fil que si le message declencheur etait deja dans un fil. |
first | La premiere reponse va dans le fil (sous le message declencheur), les reponses suivantes vont dans le canal principal. Utile pour conserver le contexte sans encombrer les fils. |
all | Toutes les reponses vont dans le fil. Garde les conversations contenues mais peut reduire la visibilite. |
slack sendMessage).
Fil par type de discussion
Vous pouvez configurer un comportement de fil different par type de discussion en definissantchannels.slack.replyToModeByChatType :
direct: Messages prives 1:1 (Slackim)group: Messages prives de groupe / MPIMs (Slackmpim)channel: canaux standards (publics/prives)
replyToModeByChatType.<chatType>replyToMode- Fournisseur par défaut (
off)
channels.slack.dm.replyToMode est toujours accepte comme repli pour direct lorsqu’aucune surcharge par type de discussion n’est definie.
Exemples :
Sujet de discussion uniquement :
Balises de fil manuel
Pour un controle fin, utilisez ces balises dans les reponses de l’agent :[[reply_to_current]]— repondre au message declencheur (demarrer/continuer un fil).[[reply_to:<id>]]— repondre a un identifiant de message specifique.
Sessions + routage
- Les Messages prives partagent la session
main(comme WhatsApp/Telegram). - Les canaux correspondent a des sessions
agent:<agentId>:slack:channel:<channelId>. - Les commandes slash utilisent des sessions
agent:<agentId>:slack:slash:<userId>(prefixe configurable viachannels.slack.slashCommand.sessionPrefix). - Si Slack ne fournit pas
channel_type, OpenClaw l’infere a partir du prefixe d’ID de canal (D,C,G) et utilise par defautchannelafin de maintenir des cles de session stables. - L’enregistrement des commandes natives utilise
commands.native(valeur globale par defaut"auto"→ Slack desactive) et peut etre surcharge par espace de travail avecchannels.slack.commands.native. Les commandes texte necessitent des messages/...autonomes et peuvent etre desactivees aveccommands.text: false. Les commandes slash Slack sont gerees dans l’application Slack et ne sont pas supprimees automatiquement. Utilisezcommands.useAccessGroups: falsepour contourner les verifications de groupes d’acces pour les commandes. - Liste complete des commandes + configuration : Slash commands
Sécurité DM (jumelage)
- Par defaut :
channels.slack.dm.policy="pairing"— les expediteurs de Messages prives inconnus recoivent un code d’appairage (expire apres 1 heure). - Approbation via :
openclaw pairing approve slack <code>. - Pour autoriser tout le monde : definissez
channels.slack.dm.policy="open"etchannels.slack.dm.allowFrom=["*"]. channels.slack.dm.allowFromaccepte des identifiants utilisateur, des @handles ou des emails (resolus au demarrage lorsque les tokens le permettent). L’assistant accepte les noms d’utilisateur et les resout en identifiants pendant la configuration lorsque les tokens le permettent.
Politique de groupe
channels.slack.groupPolicycontrole la gestion des canaux (open|disabled|allowlist).allowlistexige que les canaux soient listes danschannels.slack.channels.- Si vous ne definissez que
SLACK_BOT_TOKEN/SLACK_APP_TOKENet ne creez jamais de sectionchannels.slack, les valeurs par defaut d’execution definissentgroupPolicysuropen. Ajoutezchannels.slack.groupPolicy,channels.defaults.groupPolicy, ou une liste d’autorisation de canaux pour verrouiller. - L’assistant de configuration accepte les noms
#channelet les resout en identifiants lorsque possible (publics + prives) ; s’il existe plusieurs correspondances, il prefere le canal actif. - Au demarrage, OpenClaw resout les noms de canaux/utilisateurs dans les listes d’autorisation en identifiants (lorsque les tokens le permettent) et journalise le mapping ; les entrees non resolues sont conservees telles quelles.
- Pour n’autoriser aucun canal, definissez
channels.slack.groupPolicy: "disabled"(ou conservez une liste d’autorisation vide).
channels.slack.channels.<id> ou channels.slack.channels.<name>) :
allow: autoriser/refuser le canal lorsquegroupPolicy="allowlist".requireMention: controle des mentions pour le canal.tools: surcharges optionnelles de politique d’outils par canal (allow/deny/alsoAllow).toolsBySender: surcharges optionnelles de politique d’outils par expediteur au sein du canal (cles = identifiants d’expediteur/@handles/emails ; joker"*"pris en charge).allowBots: autoriser les messages rediges par le bot dans ce canal (par defaut : false).users: liste d’autorisation utilisateur optionnelle par canal.skills: filtre de Skills (omettre = toutes les Skills, vide = aucune).systemPrompt: invite systeme supplementaire pour le canal (combinee avec le sujet/l’objectif).enabled: definissezfalsepour desactiver le canal.
Cibles de livraison
Utilisez-les avec des envois cron/CLI :user:<id>pour les Messages priveschannel:<id>pour les canaux
Actions d’outils
Les actions d’outils Slack peuvent etre controlees viachannels.slack.actions.* :
| Groupe d’actions | Par défaut | Notes |
|---|---|---|
| reactions | active | React + lister les reactions |
| messages | active | Lire/envoyer/editer/supprimer |
| pins | active | Epingler/desepingler/lister |
| memberInfo | active | Informations de membres |
| emojiList | active | Liste d’emoji personnalises |
Notes de securite
- Les ecritures utilisent par defaut le token du bot afin que les actions modifiant l’etat restent limitees aux permissions et a l’identite du bot de l’application.
- Definir
userTokenReadOnly: falsepermet d’utiliser le token utilisateur pour les operations d’ecriture lorsqu’aucun token de bot n’est disponible, ce qui signifie que les actions s’executent avec l’acces de l’utilisateur installateur. Traitez le token utilisateur comme hautement privilegie et maintenez des controles d’actions et des listes d’autorisation stricts. - Si vous activez les ecritures via token utilisateur, assurez-vous que le token utilisateur inclut les scopes d’ecriture attendus (
chat:write,reactions:write,pins:write,files:write) sinon ces operations echoueront.
Problemes courants
Exécutez d’abord cette échelle :- Réponses connectées mais pas de canal : canal bloqué par
groupPolicyou non dans la liste de diffusionchannels.slack.channels. - DMs ignorés: l’expéditeur n’est pas approuvé lorsque
channels.slack.dm.policy="appairage". - Erreurs d’API (
missing_scope,not_in_channel, échecs d’authentification): les tokens bot/app ou Slack sont incomplets.
Notes
- Le controle des mentions est gere via
channels.slack.channels(definissezrequireMentionsurtrue) ;agents.list[].groupChat.mentionPatterns(oumessages.groupChat.mentionPatterns) comptent egalement comme mentions. - Surcharge multi-agent : definissez des motifs par agent sur
agents.list[].groupChat.mentionPatterns. - Les notifications de reactions suivent
channels.slack.reactionNotifications(utilisezreactionAllowlistavec le modeallowlist). - Les messages rediges par le bot sont ignores par defaut ; activez via
channels.slack.allowBotsouchannels.slack.channels.<id>.allowBots. - Avertissement : si vous autorisez les reponses a d’autres bots (
channels.slack.allowBots=trueouchannels.slack.channels.<id>.allowBots=true), evitez les boucles de reponse bot-a-bot avec des listes d’autorisationrequireMention,channels.slack.channels.<id>.users, et/ou des garde-fous clairs dansAGENTS.mdetSOUL.md. - Pour l’outil Slack, la semantique de suppression de reactions est decrite dans /tools/reactions.
- Les pieces jointes sont telechargees vers le stockage media lorsque cela est autorise et en dessous de la limite de taille.