Plateformes de messagerie
Slack
Statut : prêt pour la production pour les messages directs + canaux via les intégrations d'app Slack. Le mode par défaut est le Socket Mode ; le mode HTTP Events API est également pris en charge.
Installation rapide
Modèle de jetons
botToken+appTokensont requis pour le Socket Mode.- Le mode HTTP nécessite
botToken+signingSecret. - Les jetons de configuration écrasent le fallback d'environnement.
- Le fallback d'environnement
SLACK_BOT_TOKEN/SLACK_APP_TOKENs'applique uniquement au compte par défaut. userToken(xoxp-...) est configurable uniquement (pas de fallback d'environnement) et adopte par défaut un comportement en lecture seule (userTokenReadOnly: true).- Optionnel : ajoutez
chat:write.customizesi vous souhaitez que les messages sortants utilisent l'identité de l'agent actif (personnalisation duusernameet de l'icône).icon_emojiutilise la syntaxe:nom_emoji:.
💡 Pour les actions/lectures de répertoire, le jeton utilisateur peut être préféré lorsqu'il est configuré. Pour les écritures, le jeton bot reste préféré ; les écritures avec jeton utilisateur ne sont autorisées que lorsque
userTokenReadOnly: falseet que le jeton bot n'est pas disponible.
Contrôle d'accès et routage
channels.slack.dmPolicy contrôle l'accès aux messages directs (ancienne clé : channels.slack.dm.policy) :
pairing(par défaut)allowlistopen(nécessite quechannels.slack.allowFrominclue"*"; ancienne clé :channels.slack.dm.allowFrom)disabled
Indicateurs pour les messages directs :
dm.enabled(par défaut true)channels.slack.allowFrom(préféré)dm.allowFrom(ancienne clé)dm.groupEnabled(messages directs de groupe par défaut false)dm.groupChannels(allowlist optionnelle pour les MPIM)
Précédence multi-comptes :
channels.slack.accounts.default.allowFroms'applique uniquement au comptedefault.- Les comptes nommés héritent de
channels.slack.allowFromlorsque leur propreallowFromn'est pas défini. - Les comptes nommés n'héritent pas de
channels.slack.accounts.default.allowFrom.
L'appairage dans les messages directs utilise openclaw pairing approve slack .
channels.slack.groupPolicy contrôle la gestion des canaux :
openallowlistdisabled
L'allowlist des canaux se trouve sous channels.slack.channels.
Note d'exécution : si channels.slack est complètement absent (configuration uniquement par environnement), l'exécution revient à groupPolicy="allowlist" et enregistre un avertissement (même si channels.defaults.groupPolicy est défini).
Résolution des noms/ID :
- les entrées de l'allowlist des canaux et de l'allowlist des messages directs sont résolues au démarrage lorsque l'accès au jeton le permet
- les entrées non résolues sont conservées telles que configurées
- la correspondance d'autorisation entrante se fait par ID en premier par défaut ; la correspondance directe par nom d'utilisateur/slug nécessite
channels.slack.dangerouslyAllowNameMatching: true
Les messages dans les canaux sont par défaut conditionnés par une mention. Sources de mention :
- mention explicite de l'application (
<@botId>) - motifs regex de mention (
agents.list[].groupChat.mentionPatterns, fallbackmessages.groupChat.mentionPatterns) - comportement implicite de réponse au bot dans un fil
Contrôles par canal (channels.slack.channels.<id|name>) :
requireMentionusers(allowlist)allowBotsskillssystemPrompttools,toolsBySender- Format de clé
toolsBySender:id:,e164:,username:,name:, ou le joker"*"(les anciennes clés non préfixées correspondent toujours uniquement àid:)
Commandes et comportement slash
- Le mode auto des commandes natives est désactivé 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 globalementcommands.native: true). - Lorsque les commandes natives sont activées, enregistrez les commandes slash correspondantes dans Slack (noms
/), avec une exception :- enregistrez
/agentstatuspour la commande status (Slack réserve/status)
- enregistrez
- Si les commandes natives ne sont pas activées, vous pouvez exécuter une seule commande slash configurée via
channels.slack.slashCommand. - Les menus d'arguments natifs adaptent maintenant leur stratégie de rendu :
- jusqu'à 5 options : blocs de boutons
- 6-100 options : menu de sélection statique
- plus de 100 options : sélection externe avec filtrage asynchrone des options lorsque les gestionnaires d'options d'interactivité sont disponibles
- si les valeurs d'option encodées dépassent les limites de Slack, le flux revient aux boutons
- Pour les charges utiles d'options longues, les menus d'arguments des commandes slash utilisent une boîte de dialogue de confirmation avant d'envoyer une valeur sélectionnée.
Paramètres par défaut des commandes slash :
enabled: falsename: "openclaw"sessionPrefix: "slack:slash"ephemeral: true
Les sessions slash utilisent des clés isolées :
agent::slack:slash:
et acheminent toujours l'exécution de la commande vers la session de conversation cible (CommandTargetSessionKey).
Threading, sessions et balises de réponse
- Les messages directs sont routés en tant que
direct; les canaux en tant quechannel; les MPIM en tant quegroup. - Avec la valeur par défaut
session.dmScope=main, les messages directs Slack sont regroupés dans la session principale de l'agent. - Sessions de canal :
agent::slack:channel:. - Les réponses dans un fil peuvent créer des suffixes de session de fil (
:thread:) le cas échéant. channels.slack.thread.historyScopepar défaut estthread;thread.inheritParentpar défaut estfalse.channels.slack.thread.initialHistoryLimitcontrôle le nombre de messages de fil existants récupérés lorsqu'une nouvelle session de fil démarre (par défaut20; définissez0pour désactiver).
Contrôles du threading des réponses :
channels.slack.replyToMode:off|first|all(par défautoff)channels.slack.replyToModeByChatType: pardirect|group|channel- fallback hérité pour les discussions directes :
channels.slack.dm.replyToMode
Les balises de réponse manuelles sont prises en charge :
[[reply_to_current]][[reply_to:]]
Note : replyToMode="off" désactive tous les threadings de réponse dans Slack, y compris les balises explicites [[reply_to_*]]. Cela diffère de Telegram, où les balises explicites sont toujours honorées en mode "off". La différence reflète les modèles de threading des plateformes : les fils Slack masquent les messages du canal, tandis que les réponses Telegram restent visibles dans le flux principal de la discussion.
Médias, fragmentation et livraison
Les pièces jointes de fichiers Slack sont téléchargées depuis des URL privées hébergées par Slack (flux de requête authentifié par jeton) et écrites dans le stockage de médias lorsque le téléchargement réussit et que les limites de taille le permettent.
La limite de taille entrante par défaut est de 20MB sauf si elle est écrasée par channels.slack.mediaMaxMb.
- les fragments de texte utilisent
channels.slack.textChunkLimit(par défaut 4000) channels.slack.chunkMode="newline"active la division par paragraphe en premier- les envois de fichiers utilisent les API d'upload de Slack et peuvent inclure des réponses dans un fil (
thread_ts) - la limite de médias sortants suit
channels.slack.mediaMaxMblorsqu'elle est configurée ; sinon, les envois dans les canaux utilisent les valeurs par défaut par type MIME du pipeline média
Cibles explicites préférées :
user:pour les messages directschannel:pour les canaux
Les messages directs Slack sont ouverts via les API de conversation de Slack lors de l'envoi vers des cibles utilisateur.
Actions et portes
Les actions Slack sont contrôlées par channels.slack.actions.*. Groupes d'actions disponibles dans l'outillage Slack actuel :
| Groupe | Par défaut |
|---|---|
| messages | activé |
| reactions | activé |
| pins | activé |
| memberInfo | activé |
| emojiList | activé |
Événements et comportement opérationnel
- Les modifications/suppressions de messages et les diffusions dans les fils sont mappées en événements système.
- Les événements d'ajout/suppression de réaction sont mappés en événements système.
- Les événements d'arrivée/départ de membre, de création/renommage de canal, et d'ajout/suppression d'épinglage sont mappés en événements système.
- Les mises à jour de statut des fils de l'assistant (pour les indicateurs "est en train d'écrire..." dans les fils) utilisent
assistant.threads.setStatuset nécessitent la portée botassistant:write. channel_id_changedpeut migrer les clés de configuration de canal lorsqueconfigWritesest activé.- Les métadonnées de sujet/objectif du canal sont traitées comme un contexte non fiable et peuvent être injectées dans le contexte de routage.
- Les actions de bloc et les interactions modales émettent des événements système structurés
Slack interaction: ...avec des champs de charge utile riches :- actions de bloc : valeurs sélectionnées, étiquettes, valeurs de sélecteur et métadonnées
workflow_* - événements modaux
view_submissionetview_closedavec métadonnées de canal routées et entrées de formulaire
- actions de bloc : valeurs sélectionnées, étiquettes, valeurs de sélecteur et métadonnées
Réactions d'accusé de réception
ackReaction envoie un emoji d'accusé de réception pendant qu'OpenClaw traite un message entrant. Ordre de résolution :
channels.slack.accounts..ackReactionchannels.slack.ackReactionmessages.ackReaction- fallback sur l'emoji de l'identité de l'agent (
agents.list[].identity.emoji, sinon ”👀”)
Notes :
- Slack attend des codes courts (par exemple
"eyes"). - Utilisez
""pour désactiver la réaction pour le compte Slack ou globalement.
Fallback de réaction de saisie
typingReaction ajoute une réaction temporaire au message Slack entrant pendant qu'OpenClaw traite une réponse, puis la supprime lorsque l'exécution se termine. C'est un fallback utile lorsque la saisie native de l'assistant Slack n'est pas disponible, notamment dans les messages directs. Ordre de résolution :
channels.slack.accounts..typingReactionchannels.slack.typingReaction
Notes :
- Slack attend des codes courts (par exemple
"hourglass_flowing_sand"). - La réaction est à "best-effort" et le nettoyage est tenté automatiquement après la fin de la réponse ou du chemin d'échec.
Manifeste et checklist des portées
{
"display_information": {
"name": "OpenClaw",
"description": "Connecteur Slack pour 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": "Envoyer un message à 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"
]
}
}
}
Si vous configurez channels.slack.userToken, les portées de lecture typiques sont :
channels:history,groups:history,im:history,mpim:historychannels:read,groups:read,im:read,mpim:readusers:readreactions:readpins:reademoji:readsearch:read(si vous dépendez des lectures de recherche Slack)
Dépannage
Vérifiez, dans l'ordre :
groupPolicy- l'allowlist des canaux (
channels.slack.channels) requireMention- l'allowlist
userspar canal
Commandes utiles :
openclaw channels status --probe
openclaw logs --follow
openclaw doctor
Vérifiez :
channels.slack.dm.enabledchannels.slack.dmPolicy(ou l'ancienne cléchannels.slack.dm.policy)- les approbations d'appairage / les entrées de l'allowlist
openclaw pairing list slack
Validez les jetons bot + app et l'activation du Socket Mode dans les paramètres de l'app Slack.
Validez :
- le secret de signature
- le chemin du webhook
- les URL de requête Slack (Événements + Interactivité + Commandes Slash)
- un
webhookPathunique par compte HTTP
Vérifiez si vous souhaitiez :
- le mode commande native (
channels.slack.commands.native: true) avec les commandes slash correspondantes enregistrées dans Slack - ou le mode commande slash unique (
channels.slack.slashCommand.enabled: true)
Vérifiez également commands.useAccessGroups et les allowlists de canal/utilisateur.
Diffusion de texte en continu
OpenClaw prend en charge la diffusion de texte native Slack via l'API Agents and AI Apps. channels.slack.streaming contrôle le comportement de prévisualisation en direct :
off: désactive la diffusion de prévisualisation en direct.partial(par défaut) : remplace le texte de prévisualisation par la dernière sortie partielle.block: ajoute des mises à jour de prévisualisation par blocs.progress: affiche un texte d'état de progression pendant la génération, puis envoie le texte final.
channels.slack.nativeStreaming contrôle l'API de diffusion native de Slack (chat.startStream / chat.appendStream / chat.stopStream) lorsque streaming est partial (par défaut : true). Désactivez la diffusion native Slack (conservez le comportement de prévisualisation brouillon) :
channels:
slack:
streaming: partial
nativeStreaming: false
Anciennes clés :
channels.slack.streamMode(replace | status_final | append) est automatiquement migré verschannels.slack.streaming.- le booléen
channels.slack.streamingest automatiquement migré verschannels.slack.nativeStreaming.
Prérequis
- Activez Agents and AI Apps dans les paramètres de votre app Slack.
- Assurez-vous que l'app a la portée
assistant:write. - Un fil de réponse doit être disponible pour ce message. La sélection du fil suit toujours
replyToMode.
Comportement
- Le premier fragment de texte démarre un flux (
chat.startStream). - Les fragments de texte suivants s'ajoutent au même flux (
chat.appendStream). - La fin de la réponse finalise le flux (
chat.stopStream). - Les médias et charges utiles non textuelles reviennent à la livraison normale.
- Si la diffusion échoue en cours de réponse, OpenClaw revient à la livraison normale pour les charges utiles restantes.
Pointeurs de référence de configuration
Référence principale :
- Référence de configuration - Slack Champs Slack à fort signal :
- mode/auth :
mode,botToken,appToken,signingSecret,webhookPath,accounts.* - accès aux messages directs :
dm.enabled,dmPolicy,allowFrom(anciennes clés :dm.policy,dm.allowFrom),dm.groupEnabled,dm.groupChannels - bascule de compatibilité :
dangerouslyAllowNameMatching(break-glass ; gardez désactivé sauf besoin) - accès aux canaux :
groupPolicy,channels.*,channels.*.users,channels.*.requireMention - threading/historique :
replyToMode,replyToModeByChatType,thread.*,historyLimit,dmHistoryLimit,dms.*.historyLimit - livraison :
textChunkLimit,chunkMode,mediaMaxMb,streaming,nativeStreaming - opérations/fonctionnalités :
configWrites,commands.native,slashCommand.*,actions.*,userToken,userTokenReadOnly
- mode/auth :