Prêt pour la production pour les DMs et les channels via les intégrations d’application Slack. Le mode par défaut est Socket Mode ; les URL de requêtes HTTP sont également prises en charge.
Les deux modes de transport sont prêts pour la production et offrent une parité fonctionnelle pour la messagerie, les commandes slash, App Home et l’interactivité. Choisissez en fonction de la forme du déploiement, et non des fonctionnalités.
Souci
Mode Socket (par défaut)
URL de requête HTTP
URL publique Gateway
Non requis
Requis (DNS, TLS, proxy inverse ou tunnel)
Réseau sortant
La WSS sortante vers wss-primary.slack.com doit être accessible
Pas de WS sortant ; uniquement HTTPS entrant
Jetons nécessaires
Jeton de bot + Jeton de niveau application avec connections:write
Jeton de bot + Signature secrète
Ordinateur de développement / derrière un pare-feu
Fonctionne tel quel
Nécessite un tunnel public (ngrok, Cloudflare Tunnel, TailscaleGateway Funnel) ou une passerelle de staging
Mise à l’échelle horizontale
Une session Socket Mode par application par hôte ; plusieurs passerelles nécessitent des applications Slack distinctes
Gestionnaire POST sans état ; plusieurs répliques de Gateway peuvent partager une application derrière un répartiteur de charge
Multi-compte sur une seule passerelle
Pris en charge ; chaque compte ouvre son propre WS
Pris en charge ; chaque compte a besoin d’un webhookPath unique (par défaut /slack/events) pour éviter les collisions d’enregistrements
Transport de commande slash
Livré via la connexion WS ; slash_commands[].url est ignoré
Slack effectue des POST sur slash_commands[].url ; le champ est requis pour l’envoi de la commande
Signature de la requête
Non utilisé (l’auth est le Jeton de Niveau Application)
Slack signe chaque requête ; OpenClaw vérifie avec signingSecret
Récupération en cas de perte de connexion
La reconnexion automatique du SDK Slack est activée ; OpenClaw redémarre également les sessions Socket Mode échouées avec un exponentiel borné. Le réglage du transport du délai de pong s’applique.
Aucune connexion persistante à perdre ; les nouvelles tentatives sont effectuées par requête depuis Slack
plugins install enregistre et active le plugin. Le plugin ne fait rien tant que vous n’avez pas configuré l’application Slack et les paramètres de canal ci-dessous. Consultez Plugins pour le comportement général des plugins et les règles d’installation.
Ouvrez api.slack.com/apps → Create New App → From a manifest → sélectionnez votre espace de travail → collez l’un des manifestes ci-dessous → Next → Create.
Basic Information -> App-Level Tokens -> Generate Token and Scopes : ajoutez connections:write, enregistrez, copiez le jeton de niveau application (App-Level Token).
Install App -> Install to Workspace : copiez le jeton OAuth de l’utilisateur bot.
Ouvrez api.slack.com/apps → Create New App → From a manifest → sélectionnez votre espace de travail → collez l’un des manifestes ci-dessous → remplacez https://gateway-host.example.com/slack/events par votre URL publique Gateway → Next → Create.
OpenClaw définit le délai d’attente du pong du client Slack SDK à 15 secondes par défaut pour le mode Socket. Ne modifiez les paramètres de transport que si vous avez besoin d’un réglage spécifique à un espace de travail ou à un hôte :
{
channels: {
slack: {
mode: "socket",
socketMode: {
clientPingTimeout: 20000,
serverPingTimeout: 30000,
pingPongLoggingEnabled: false,
},
},
},
}
N’utilisez ceci que pour les espaces de travail en mode Socket qui enregistrent des délais d’expiration de pong/ping de serveur websocket Slack ou qui s’exécutent sur des hôtes avec une famine connue de la boucle d’événements. SlackclientPingTimeout est le temps d’attente du pong après l’envoi d’un ping client par le SDK ; serverPingTimeoutSlack est le temps d’attente pour les pings du serveur Slack. Les messages et événements de l’application restent dans l’état de l’application, et non des signaux de vivacité du transport.
Notes :
socketMode est ignoré en mode URL de requête HTTP.
Les paramètres de base channels.slack.socketModeSlack s’appliquent à tous les comptes Slack, sauf s’ils sont remplacés. Les remplacements par compte utilisent `channels.slack.accounts.
.socketMode` ; comme il s’agit d’un remplacement d’objet, incluez chaque champ de réglage de socket que vous souhaitez pour ce compte.
Seul clientPingTimeoutOpenClaw a une valeur par défaut OpenClaw (15000). serverPingTimeout et pingPongLoggingEnabledSlack sont transmis au SDK Slack uniquement lorsqu’ils sont configurés.
Le délai de redémarrage en mode Socket commence autour de 2 secondes et plafonne autour de 30 secondes. Les échecs consécutifs récupérables de démarrage/d’attente de démarrage s’arrêtent après 12 tentatives ; après une connexion réussie, les déconnexions récupérables ultérieures commencent un nouveau cycle de tentatives. Les erreurs d’authentification Slack non récupérables telles que Slackinvalid_auth, les jetons révoqués ou les portées manquantes échouent rapidement au lieu de réessayer indéfiniment.
Le manifeste de base de l’application Slack est le même pour le mode Socket et les URL de requête HTTP. Seul le bloc Slacksettings (et la commande slash url) diffère.
Présentez différentes fonctionnalités qui étendent les valeurs par défaut ci-dessus.
Le manifeste par défaut active l’onglet Home de l’application Slack et s’abonne à Slackapp_home_openedOpenClaw. Lorsqu’un membre de l’espace de travail ouvre l’onglet Home, OpenClaw publie une vue Home par défaut sécurisée avec views.publishSlackSlack ; aucune charge de conversation ou configuration privée n’est incluse. L’onglet Messages reste activé pour les DMs Slack. Le manifeste active également les fils de discussion de l’assistant Slack avec features.assistant_view, assistant:write, assistant_thread_started et assistant_thread_context_changedOpenClawSlack ; les fils de discussion de l’assistant sont acheminés vers leurs propres sessions de fil OpenClaw et gardent le contexte de fil fourni par Slack disponible pour l’agent.
”
},
{
“command”: “/model”,
“description”: “Show or set the model”,
“usage_hint”: “[name|#|status]”
},
{
“command”: “/models”,
“description”: “List providers/models”,
“usage_hint”: “[provider] [page] [limit=
|size=
|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”: ”
[input]”
},
{
“command”: “/btw”,
“description”: “Ask a side question without changing session context”,
“usage_hint”: ”
”
},
{
“command”: “/side”,
“description”: “Ask a side question without changing session context”,
“usage_hint”: ”
”
},
{
“command”: “/usage”,
“description”: “Control the usage footer or show cost summary”,
“usage_hint”: “off|tokens|full|cost”
}
]
}
Utilisez la même liste `slash_commands` que pour le Mode Socket ci-dessus, et ajoutez `"url": "https://gateway-host.example.com/slack/events"` à chaque entrée. Exemple :
Répétez cette valeur `url` pour chaque commande de la liste.
Optional authorship scopes (write operations)
Ajoutez la portée chat:write.customize bot si vous souhaitez que les messages sortants utilisent l’identité de l’agent actif (nom d’utilisateur et icône personnalisés) au lieu de l’identité par défaut de l’application Slack.
Si vous utilisez une icône emoji, Slack attend la syntaxe :emoji_name:.
Optional user-token scopes (read operations)
Si vous configurez channels.slack.userToken, les portées de lecture typiques sont :
botToken + appToken sont requis pour le mode Socket.
Le mode HTTP nécessite botToken + signingSecret.
botToken, appToken, signingSecret et userToken acceptent des chaînes
en texte brut ou des objets SecretRef.
Les jetons de configuration remplacent le repli (fallback) des variables d’environnement.
Le repli d’env SLACK_BOT_TOKEN / SLACK_APP_TOKEN ne s’applique qu’au compte par défaut.
userToken est uniquement configuré (pas de repli d’env) et par défaut à un comportement en lecture seule (userTokenReadOnly: true).
Comportement de l’instantané d’état :
L’inspection de compte Slack suit les champs *Source et *Status
par identifiant (botToken, appToken, signingSecret, userToken).
Le statut est available, configured_unavailable ou missing.
configured_unavailable signifie que le compte est configuré via SecretRef
ou une autre source de secret non en ligne, mais que le chemin de commande/runtime actuel
n’a pas pu résoudre la valeur réelle.
En mode HTTP, signingSecretStatus est inclus ; en mode Socket, la
paire requise est botTokenStatus + appTokenStatus.
Les actions Slack sont contrôlées par channels.slack.actions.*.
Groupes d’actions disponibles dans les outils Slack actuels :
Groupe
Par défaut
messages
activé
réactions
activé
épingles
activé
memberInfo
activé
emojiList
activé
Les actions de message Slack actuelles incluent send, upload-file, download-file, read, edit, delete, pin, unpin, list-pins, member-info et emoji-list. download-file accepte les ID de fichiers Slack affichés dans les espaces réservés de fichiers entrants et renvoie des aperçus d’images pour les images ou des métadonnées de fichiers locaux pour les autres types de fichiers.
channels.slack.accounts.default.allowFrom s’applique uniquement au compte default.
Les comptes nommés héritent de channels.slack.allowFrom lorsque leur propre allowFrom n’est pas défini.
Les comptes nommés n’héritent pas de channels.slack.accounts.default.allowFrom.
Les channels.slack.dm.policy et channels.slack.dm.allowFrom obsolètes sont toujours lus pour compatibilité. openclaw doctor --fix les migre vers dmPolicy et allowFrom lorsqu’il peut le faire sans modifier l’accès.
L’appairage dans les DM utilise `openclaw pairing approve slack
`.
Fils de discussion, sessions et balises de réponse
Les DMs sont routés en tant que direct ; les channels en tant que channel ; les MPIM en tant que group.
Les liaisons de routage Slack acceptent les ID de pairs bruts ainsi que les formes cibles Slack telles que channel:C12345678, user:U12345678 et <@U12345678>.
Avec le session.dmScope=main par défaut, les DMs Slack sont réduits à la session principale de l’agent.
Sessions de channel : `agent:
:slack:channel:
`.
Les messages de channel de niveau ordinaire restent sur la session par channel, même lorsque replyToMode est non off.
Les réponses aux fils de discussion Slack utilisent le thread_ts Slack parent pour les suffixes de session (`:thread:
), même lorsque le threading des réponses sortantes est désactivé avec replyToMode=“off”`.
OpenClaw amorce une racine de channel de niveau supérieur éligible dans `agent:
:slack:channel:
:thread:
lorsque cette racine est censée démarrer un fil de discussion visible Slack, de sorte que la racine et les réponses ultérieures du fil partagent une session OpenClaw. Cela s'applique aux événementsapp_mention, aux correspondances de bot explicites ou de modèles de mention configurés, et aux channels requireMention: falseavec unreplyToModenonoff`.
Par défaut, channels.slack.thread.historyScope est thread ; par défaut, thread.inheritParent est false.
channels.slack.thread.initialHistoryLimit contrôle le nombre de messages de fil existants récupérés lors du démarrage d’une nouvelle session de fil (par défaut 20 ; définir 0 pour désactiver).
channels.slack.thread.requireExplicitMention (par défaut false) : lorsque true, supprime les mentions implicites de fils de discussion afin que le bot ne réponde qu’aux mentions @bot explicites à l’intérieur des fils, même si le bot a déjà participé au fil. Sans cela, les réponses dans un fil où le bot participe contournent le filtrage requireMention.
channels.slack.replyToModeByChatType : par direct|group|channel
solution de repli héritée pour les discussions directes : channels.slack.dm.replyToMode
Les balises de réponse manuelles sont prises en charge :
[[reply_to_current]]
`[[reply_to:
]]`
Pour les réponses explicites aux fils de discussion Slack provenant de l’outil message, définissez replyBroadcast: true avec action: "send" et threadId ou replyTo pour demander à Slack de diffuser également la réponse au fil vers le canal parent. Cela correspond au drapeau reply_broadcastchat.postMessage de Slack et n’est pris en charge que pour les envois de texte ou de Block Kit, et non pour les téléchargements de médias.
Lorsqu’un appel à l’outil message s’exécute dans un fil de discussion Slack et cible le même canal, OpenClaw hérite normalement du fil de discussion Slack actuel selon replyToMode. Définissez topLevel: true sur action: "send" ou action: "upload-file" pour forcer l’envoi d’un nouveau message dans le canal parent à la place. threadId: null est accepté comme la même option de refus de niveau supérieur.
ackReaction envoie un emoji d’accusé de réception pendant que OpenClaw traite un message entrant. ackReactionScope décide quand cet emoji est réellement envoyé.
Le fournisseur Slack lit la portée depuis messages.ackReactionScope (par défaut "group-mentions"). Il n’y a aujourd’hui aucune substitution au niveau du compte Slack ou du canal Slack ; la valeur est globale pour la passerelle.
Valeurs :
"all" : réagir dans les DMs et les groupes.
"direct" : réagir uniquement dans les DMs.
"group-all" : réagir à chaque message de groupe (pas de DMs).
"group-mentions" (par défaut) : réagir dans les groupes, mais seulement lorsque le bot est mentionné (ou dans les groupes mentionnables qui ont opté pour cela). Les DMs sont exclus.
"off" / "none" : ne jamais réagir.
{
messages: {
ackReaction: "eyes",
ackReactionScope: "all", // react in DMs and groups
channels.slack.streaming contrôle le comportement de l’aperçu en direct :
off : désactiver le flux de l’aperçu en direct.
partial (par défaut) : remplacer le texte de l’aperçu par la dernière sortie partielle.
block : ajouter les mises à jour d’aperçu par blocs.
progress : afficher le texte d’état de la progression pendant la génération, puis envoyer le texte final.
streaming.preview.toolProgress : lorsque l’aperçu de brouillon est actif, acheminer les mises à jour d’outil/progression dans le même message d’aperçu modifié (par défaut : true). Définissez false pour conserver des messages d’outil/progression distincts.
streaming.preview.commandText / streaming.progress.commandText : définir sur status pour conserver des lignes de progression d’outil compactes tout en masquant le texte de commande/exécution brut (par défaut : raw).
Masquer le texte de commande/exec brut tout en conservant les lignes de progression compactes :
{
"channels": {
"slack": {
"streaming": {
"mode": "progress",
"progress": {
"toolProgress": true,
"commandText": "status"
}
}
}
}
}
channels.slack.streaming.nativeTransport contrôle le flux de texte natif Slack lorsque channels.slack.streaming.mode est partial (par défaut : true).
Les cartes de tâches de progression natives Slack sont optionnelles pour le mode progression. Définissez channels.slack.streaming.progress.nativeTaskCards sur true avec channels.slack.streaming.mode="progress" pour envoyer une carte de plan/tâche native Slack pendant l’exécution du travail, puis mettre à jour la même carte de tâche à la fin. Sans cet indicateur, le mode progression conserve le comportement d’aperçu de brouillon portable.
Un fil de discussion de réponse doit être disponible pour que le flux de texte natif et le statut du fil de discussion de l’assistant Slack apparaissent. La sélection du fil suit toujours replyToMode.
Les racines de canal, de conversation de groupe et de DM de premier niveau peuvent toujours utiliser l’aperçu de brouillon normal lorsque le flux natif n’est pas disponible ou qu’aucun fil de discussion de réponse n’existe.
Les Slack DMs de premier niveau restent hors fil par défaut, ils n’affichent donc pas l’aperçu de flux/statut natif de style fil de Slack ; OpenClaw publie et modifie un aperçu de brouillon dans le DM à la place.
Les médias et les charges utiles non textuelles reviennent à la livraison normale.
Les finales médias/erreur annulent les modifications d’aperçu en attente ; les finales texte/bloc éligibles sont vidées uniquement lorsqu’elles peuvent modifier l’aperçu en place.
Si le flux échoue en cours de réponse, OpenClaw revient à la livraison normale pour les charges utiles restantes.
Utiliser l’aperçu de brouillon au lieu du flux de texte natif Slack :
{
channels: {
slack: {
streaming: {
mode: "partial",
nativeTransport: false,
},
},
},
}
Activer les cartes de tâche de progression natives Slack :
{
channels: {
slack: {
streaming: {
mode: "progress",
progress: {
nativeTaskCards: true,
render: "rich",
},
},
},
},
}
Clés héritées :
channels.slack.streamMode (replace | status_final | append) est un alias d’exécution hérité pour channels.slack.streaming.mode.
booléen channels.slack.streaming est un alias d’exécution hérité pour channels.slack.streaming.mode et channels.slack.streaming.nativeTransport.
hérité channels.slack.nativeStreaming est un alias d’exécution pour channels.slack.streaming.nativeTransport.
Exécutez openclaw doctor --fix pour réécrire la configuration de flux Slack persistante avec les clés canoniques.
typingReaction ajoute une réaction temporaire au message entrant Slack pendant que OpenClaw traite une réponse, puis la supprime une fois l’exécution terminée. Ceci est surtout utile en dehors des réponses en fil, qui utilisent un indicateur d’état « est en train d’écrire… » par défaut.
Ordre de résolution :
`channels.slack.accounts.
.typingReaction`
channels.slack.typingReaction
Notes :
Slack attend des codes courts (par exemple "hourglass_flowing_sand").
La réaction est au mieux effort et le nettoyage est tenté automatiquement après l’achèvement de la réponse ou du chemin d’échec.
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êtes authentifiées par token) et écrites dans le média store lorsque le téléchargement réussit et que les limites de taille le permettent. Les espaces réservés de fichiers incluent le Slack fileId afin que les agents puissent récupérer le fichier d’origine avec download-file.
Les téléchargements utilisent des délais d’inactivité et totaux limités. Si la récupération du fichier Slack stagne ou échoue, OpenClaw continue de traiter le message et revient à l’espace réservé du fichier.
La limite de taille entrante à l’exécution est 20MB par défaut, sauf si elle est remplacée par channels.slack.mediaMaxMb.
Texte et fichiers sortants
les segments de texte utilisent channels.slack.textChunkLimit (par défaut 4000)
channels.slack.chunkMode="newline" active le découpage prioritaire des paragraphes
l’envoi de fichiers utilise les API de téléchargement Slack et peut inclure des réponses de fils de discussion (thread_ts)
la limite de média sortant suit channels.slack.mediaMaxMb lorsque configuré ; sinon, les envois de channel utilisent les valeurs par défaut de type MIME du pipeline média
Cibles de livraison
Cibles explicites préférées :
`user:
pour les DMs -channel:
` pour les channels
Les DMs Slack contenant uniquement du texte ou des blocs peuvent être publiés directement sur les ID utilisateur ; les téléchargements de fichiers et les envois en fil de discussion ouvrent d'abord le DM via les API de conversation Slack car ces chemins nécessitent un ID de conversation concret.
Les commandes slash apparaissent dans Slack soit comme une seule commande configurée, soit comme plusieurs commandes natives. Configurez channels.slack.slashCommand pour modifier les valeurs par défaut des commandes :
enabled: false
name: "openclaw"
sessionPrefix: "slack:slash"
ephemeral: true
/openclaw /help
Les commandes natives nécessitent des paramètres de manifeste supplémentaires dans votre application Slack et sont activées avec channels.slack.commands.native: true ou commands.native: true dans les configurations globales à la place.
Le mode automatique des commandes natives est désactivé pour Slack, donc commands.native: "auto" n’active pas les commandes natives Slack.
/help
Les menus d’arguments natifs utilisent une stratégie de rendu adaptatif qui affiche une modal de confirmation avant d’envoyer une valeur d’option sélectionnée :
jusqu’à 5 options : blocs de boutons
6-100 options : menu de sélection statique
plus de 100 options : sélection externe avec filtrage d’options asynchrone lorsque les gestionnaires d’options d’interactivité sont disponibles
limites Slack dépassées : les valeurs d’option encodées reviennent aux boutons
/think
Les sessions slash utilisent des clés isolées comme `agent:
:slack:slash:
et acheminent toujours les exécutions de commandes vers la session de conversation cible en utilisantCommandTargetSessionKey`.
Slack peut afficher des contrôles de réponse interactifs créés par l’agent, mais cette fonctionnalité est désactivée par défaut.
Pour les nouveaux agents, CLI et les sorties de plugins, préférez les boutons
ou les blocs de sélection partagés presentation. Ils utilisent le même chemin d’interaction
Slack tout en se dégradant sur d’autres canaux.
Activez-le globalement :
{
channels: {
slack: {
capabilities: {
interactiveReplies: true,
},
},
},
}
Ou activez-le pour un seul compte Slack :
{
channels: {
slack: {
accounts: {
ops: {
capabilities: {
interactiveReplies: true,
},
},
},
},
},
}
Lorsqu’il est activé, les agents peuvent toujours émettre des directives de réponse obsolètes uniquement Slack :
[[slack_buttons: Approve:approve, Reject:reject]]
[[slack_select: Choose a target | Canary:canary, Production:production]]
Ces directives compilent en Slack Block Kit et acheminent les clics ou les sélections
via le chemin d’événement d’interaction Slack existant. Conservez-les pour les anciennes
invites et les échappatoires spécifiques à Slack ; utilisez une présentation partagée pour les nouveaux
contrôles portables.
Les API du compilateur de directives sont également obsolètes pour le nouveau code producteur :
compileSlackInteractiveReplies(...)
parseSlackOptionsLine(...)
isSlackInteractiveRepliesEnabled(...)
buildSlackInteractiveBlocks(...)
Utilisez des payloads presentation et buildSlackPresentationBlocks(...) pour les nouveaux
contrôles rendus par Slack.
Remarques :
Il s’agit d’une interface utilisateur (UI) héritée spécifique à Slack. Les autres canaux ne traduisent pas les
directives du Slack Block Kit en leurs propres systèmes de boutons.
Les valeurs de rappel interactif sont des jetons opaques générés par OpenClaw, et non des valeurs brutes créées par l’agent.
Si les blocs interactifs générés dépassent les limites du Slack Block Kit, OpenClaw revient à la réponse texte originale au lieu d’envoyer un payload de blocs non valide.
Les plugins Slack qui enregistrent un gestionnaire interactif peuvent également recevoir des événements
de cycle de vie modale view_submission et view_closed avant que OpenClaw ne compacte
le payload pour l’événement système visible par l’agent. Utilisez l’un de ces modèles de routage
lors de l’ouverture d’une modale Slack :
Définissez callback_id sur `openclaw:
:
`.
Ou conservez un callback_id existant et mettez `pluginInteractiveData:
”
:
“in the modalprivate_metadata`.
Le gestionnaire reçoit ctx.interaction.kind en tant que view_submission ou
view_closed, inputs normalisé, et l’objet stateValues brut complet de
Slack. Un routage basé uniquement sur l’ID de rappel suffit pour invoquer le gestionnaire de plugin ; incluez
les champs de routage utilisateur/session private_metadata de la modale existante lorsque la
modale doit également produire un événement système visible par l’agent. L’agent reçoit un
événement système Slack interaction: ... compact et expurgé. Si le gestionnaire renvoie
systemEvent.summary, systemEvent.reference ou systemEvent.data, ces
champs sont inclus dans cet événement compact afin que l’agent puisse référencer
le stockage appartenant au plugin sans voir le payload complet du formulaire.
Slack peut agir comme un client d’approbation natif avec des boutons interactifs et des interactions, au lieu de revenir à l’interface Web ou au terminal.
Les approbations Exec et plugin peuvent être rendues sous forme de invites Block Kit natives Slack.
channels.slack.execApprovals.* reste l’activation du client d’approbation natif exec et la config de routage DM/channel.
Les DM d’approbation Exec utilisent channels.slack.execApprovals.approvers ou commands.ownerAllowFrom.
Les approbations de plugin utilisent des boutons natifs Slack lorsque Slack est activé en tant que client d’approbation natif pour la session d’origine, ou lorsque approvals.plugin achemine vers la session Slack d’origine ou une cible Slack.
Les DM d’approbation de plugin utilisent les approbateurs de plugin Slack provenant de channels.slack.allowFrom, allowFrom de compte nommé, ou la route par défaut du compte.
L’autorisation de l’approbateur est toujours appliquée : les approbateurs exec-only ne peuvent pas approuver les demandes de plugin à moins qu’ils ne soient également des approbateurs de plugin.
Cela utilise la même surface de bouton d’approbation partagée que les autres canaux. Lorsque interactivity est activé dans vos paramètres d’application Slack, les invites d’approbation sont rendues sous forme de boutons Block Kit directement dans la conversation.
Lorsque ces boutons sont présents, ils constituent l’UX d’approbation principal ; OpenClaw
doit inclure uniquement une commande manuelle /approve lorsque le résultat de l’outil indique que les approbations de chat ne sont pas disponibles ou que l’approbation manuelle est le seul chemin.
Chemin de configuration :
channels.slack.execApprovals.enabled
channels.slack.execApprovals.approvers (optionnel ; revient à commands.ownerAllowFrom si possible)
channels.slack.execApprovals.target (dm | channel | both, par défaut : dm)
agentFilter, sessionFilter
Slack active automatiquement les approbations d’exécution natives lorsque Slackenabled n’est pas défini ou est "auto"SlackSlack et qu’au moins un approuveur d’exécution est résolu. Slack peut également gérer les approbations de plugins natifs via ce chemin native-client lorsque les approuveurs de plugins Slack sont résolus et que la demande correspond aux filtres native-client. Définissez enabled: falseSlack pour désactiver explicitement Slack en tant que client d’approbation native. Définissez enabled: trueSlackSlack pour forcer l’activation des approbations natives lorsque les approuveurs sont résolus. La désactivation des approbations d’exécution Slack ne désactive pas la livraison des approbations de plugins Slack natives qui est activée via approvals.pluginSlack ; la livraison des approbations de plugins utilise les approuveurs de plugins Slack à la place.
Comportement par défaut sans configuration explicite des approbations d’exécution Slack :
{
commands: {
ownerAllowFrom: ["slack:U12345678"],
},
}
Une configuration native explicite de Slack n’est nécessaire que si vous souhaitez remplacer les approuveurs, ajouter des filtres ou opter pour la livraison origin-chat :
{
channels: {
slack: {
execApprovals: {
enabled: true,
approvers: ["U12345678"],
target: "both",
},
},
},
}
Le transfert partagé approvals.exec est distinct. Ne l’utilisez que lorsque les invites d’approbation d’exécution doivent également être acheminées vers d’autres discussions ou cibles hors bande explicites. Le transfert partagé approvals.pluginSlackSlack est également distinct ; la livraison native Slack ne supprime ce repli que lorsque Slack peut gérer la demande d’approbation du plugin de manière native.
Le /approveSlack same-chat fonctionne également dans les canaux et les DMs Slack qui prennent déjà en charge les commandes. Consultez Exec approvals pour connaître le modèle complet de transfert d’approbation.
Les modifications/suppressions de messages sont mappées dans des événements système.
Les diffusions de fils (réponses de fils « Envoyer également au canal ») sont traitées comme des messages utilisateur normaux.
Les événements d’ajout/suppression de réactions sont mappés dans des événements système.
Les événements d’arrivée/départ de membres, de création/renommage de canal et d’ajout/suppression d’épingles sont mappés dans des événements système.
channel_id_changed peut migrer les clés de configuration de canal lorsque configWrites est activé.
Les métadonnées du sujet/de l’objet du canal sont traitées comme un contexte non fiable et peuvent être injectées dans le contexte de routage.
Le lanceur de fil de discussion et l’amorçage initial du contexte de l’historique du fil sont filtrés par les listes d’autorisation des expéditeurs configurées, le cas échéant.
Les actions de bloc et les interactions modales émettent des Slack interaction: ... événements système structurés avec des champs de charge utile riches :
actions de bloc : valeurs sélectionnées, étiquettes, valeurs du sélecteur et métadonnées workflow_*
événements view_submission et view_closed modaux avec les métadonnées du canal routé et les entrées du formulaire
unfurls : unfurlLinks (par défaut : false), unfurlMedia pour chat.postMessage contrôle de prévisualisation des liens/medias ; définissez unfurlLinks: true pour réactiver les prévisualisations de liens
- channel allowlist (`channels.slack.channels`) — **les clés doivent être des ID de channel** (`C12345678`), et non des noms (`#channel-name`). Les clés basées sur le nom échouent silencieusement sous `groupPolicy: "allowlist"`Slack car le routage des canaux est basé sur l'ID par défaut. Pour trouver un ID : clic droit sur le channel dans Slack → **Copy link** — la valeur `C...` à la fin de l'URL est l'ID du channel.
- `requireMention`
- allowlist `users` par channel
- `messages.groupChat.visibleReplies` : les requêtes normales de groupe/channel sont `"automatic"` par défaut. Si vous avez opté pour `"message_tool"` et que les journaux montrent du texte d'assistant sans appel `message(action=send)`, le modèle a manqué le chemin visible de l'outil de message. Le texte final reste privé dans ce mode ; inspectez le journal détaillé de la passerelle pour les métadonnées de payload supprimées, ou définissez-le sur `"automatic"` si vous souhaitez que chaque réponse finale normale de l'assistant soit publiée via l'ancien chemin.
- `messages.groupChat.unmentionedInbound` : s'il est `"room_event"`, les conversations non mentionnées des canaux autorisés sont un contexte ambiant et restent silencieuses à moins que l'agent n'appelle l'outil `message`. Voir [Ambient room events](/fr/channels/ambient-room-events).
- les approbations d'appairage / les entrées de liste d'autorisation (`dmPolicy: "open"` nécessite toujours `channels.slack.allowFrom: ["*"]`)
- les DM de groupe utilisent la gestion MPIM ; activez `channels.slack.dm.groupEnabled` et, si configuré, incluez le MPIM dans `channels.slack.dm.groupChannels`
- Événements DM de Slack Assistant : les journaux détaillés mentionnant `drop message_changed`
signifient généralement que Slack a envoyé un événement de fil Assistant modifié sans
expéditeur humain récupérable dans les métadonnées du message
Fenêtre de terminal
openclawpairinglistslack
Socket mode not connecting
Validez les jetons bot + application et l’activation du mode Socket dans les paramètres de l’application Slack.
Le jeton de niveau application nécessite connections:write, et le jeton bot OAuth de l’utilisateur
doit appartenir à la même application/espace de travail Slack que le jeton d’application.
Si openclaw channels status --probe --json affiche botTokenStatus ou
appTokenStatus: "configured_unavailable", le compte Slack
est configuré mais le runtime actuel n’a pas pu résoudre la valeur
soutenue par SecretRef.
Les journaux tels que slack socket mode failed to start; retry ... sont des échecs de démarrage
récupérables. Les étendues manquantes, les jetons révoqués et les authentifications invalides échouent rapidement.
Un journal slack token mismatch ... signifie que le jeton bot et le jeton d’application
semblent appartenir à des applications Slack différentes ; corrigez les informations d’identification de l’application Slack.
HTTP mode not receiving events
Validez :
le signing secret
le chemin du webhook
les Slack Request URLs (Events + Interactivity + Slash Commands)
un webhookPath unique par compte HTTP
l’URL publique termine le TLS et transfère les demandes vers le chemin du Gateway
le chemin request_url de l’application Slack correspond exactement à channels.slack.webhookPath (par défaut /slack/events)
Si signingSecretStatus: "configured_unavailable" apparaît dans les instantanés
de compte, le compte HTTP est configuré mais le runtime actuel n’a pas pu
résoudre le signing secret soutenu par SecretRef.
Un journal slack: webhook path ... already registered répété signifie que deux comptes
HTTP utilisent le même webhookPath ; donnez à chaque compte un chemin distinct.
Native/slash commands not firing
Vérifiez si vous aviez l’intention d’utiliser :
le mode de commande native (channels.slack.commands.native: true) avec des commandes slash correspondantes enregistrées dans Slack
ou le mode de commande slash unique (channels.slack.slashCommand.enabled: true)
Slack ne crée ni ne supprime automatiquement les commandes slash. commands.native: "auto" n’active pas les commandes natives de Slack ; utilisez true et créez les commandes correspondantes dans l’application Slack. En mode HTTP, chaque commande slash Slack doit inclure l’URL du Gateway. En mode Socket, les charges utiles de commande arrivent via le websocket et Slack ignore slash_commands[].url.
Vérifiez également commands.useAccessGroups, l’autorisation DM, les listes d’autorisation de canaux,
et les listes d’autorisation users par canal. Slack renvoie des erreurs éphémères pour
les expéditeurs de commandes slash bloqués, notamment :
Slack peut joindre les médias téléchargés au tour de l’agent lorsque les téléchargements de fichiers Slack réussissent et que les limites de taille le permettent. Les fichiers image peuvent être transmis via le chemin de compréhension des médias ou directement à un modèle de réponse capable de vision ; les autres fichiers sont conservés en tant que contexte de fichier téléchargeable plutôt que traités comme une entrée image.
Lorsqu’un message arrive dans un fil (a un parent thread_ts) :
Si la réponse elle-même n’a pas de média direct et que le message racine inclus contient des fichiers, Slack peut hydrater les fichiers racine en tant que contexte de démarrage de fil.
Les pièces jointes de réponse directe ont la priorité sur les pièces jointes du message racine.
Un message racine qui ne contient que des fichiers et aucun texte est représenté par un espace réservé de pièce jointe afin que la solution de repli puisse toujours inclure ses fichiers.
Limite de taille : 20 Mo par fichier par défaut. Configurable via channels.slack.mediaMaxMb.
Échecs de téléchargement : Les fichiers que Slack ne peut pas servir, les URL expirées, les fichiers inaccessibles, les fichiers trop volumineux et les réponses HTML d’authentitation/connexion Slack sont ignorés au lieu d’être signalés comme des formats non pris en charge.
Modèle de vision : L’analyse d’image utilise le modèle de réponse actif lorsqu’il prend en charge la vision, ou le modèle d’image configuré à agents.defaults.imageModel.