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
WSS sortant vers wss-primary.slack.com doit être accessible
Pas de WS sortant ; uniquement HTTPS entrant
Jetons nécessaires
Jeton de bot (xoxb-...) + Jeton de niveau application (xapp-...) avec connections:write
Jeton de bot (xoxb-...) + Signing Secret
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 que les enregistrements entrent en collision
Transport de commande slash
Livré via la connexion WS ; slash_commands[].url est ignoré
Slack envoie des POST vers slash_commands[].url ; le champ est requis pour l’acheminement 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 toujours rien tant que vous n’avez pas configuré l’application Slack et les paramètres du canal ci-dessous. Consultez Plugins pour connaître 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 manifests ci-dessous → Next → Create.
Ouvrez api.slack.com/apps → Create New App → From a manifest → sélectionnez votre espace de travail → collez l’un des manifests ci-dessous → remplacez https://gateway-host.example.com/slack/events par votre URL Gateway publique → 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,
},
},
},
}
Utilisez ceci uniquement pour les espaces de travail en mode Socket qui enregistrent des délais d’attente de pong websocket/ping serveur Slack ou qui s’exécutent sur des hôtes avec un manque connu d’événements de boucle (event-loop starvation). clientPingTimeout est le temps d’attente du pong après l’envoi d’un ping client par le SDK ; serverPingTimeout est l’attente des pings serveur Slack. Les messages et événements de l’application restent un é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.socketMode 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 clientPingTimeout a une valeur par défaut OpenClaw (15000). serverPingTimeout et pingPongLoggingEnabled sont transmis au SDK Slack uniquement lorsqu’ils sont configurés.
Le temporisateur de redémarrage (backoff) du mode Socket commence autour de 2 secondes et plafonne autour de 30 secondes. Les défaillances consécutives récupérables de démarrage/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 entament un nouveau cycle de tentatives. Les erreurs d’authentification Slack non récupérables telles que invalid_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 settings (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 Accueil, OpenClaw publie une vue Accueil par défaut sécurisée avec views.publishSlackSlack ; aucune charge utile de conversation ni de configuration privée n’est incluse. L’onglet Messages reste activé pour les Slack DMs. 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 acheminent vers leurs propres sessions de fils de discussion OpenClaw et gardent le contexte de fil de discussion fourni par Slack disponible pour l’agent.
Commandes slash natives optionnelles
Plusieurs commandes slash natives peuvent être utilisées au lieu d’une seule commande configurée avec nuance :
Utilisez /agentstatus au lieu de /status car la commande /status est réservée.
Pas plus de 25 commandes slash ne peuvent être disponibles à la fois.
Remplacez votre section features.slash_commands existante par un sous-ensemble de commandes disponibles :
”
},
{
“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 (fallback) d’env SLACK_BOT_TOKEN / SLACK_APP_TOKEN ne s’applique qu’au compte par défaut.
userToken (xoxp-...) est réservé à la configuration (pas de repli d’env) et par défaut à un comportement en lecture seule (userTokenReadOnly: true).
Comportement de l’instantané d’état :
L’inspection du 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/exécution 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 fichier Slack affichés dans les espaces réservés de fichier entrants et renvoie des aperçus d’image pour les images ou les métadonnées de fichier local pour les autres types de fichiers.
channels.slack.accounts.default.allowFrom ne s’applique qu’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 acheminés en tant que direct ; les channels en tant que channel ; les MPIM en tant que group.
Les liaisons de route Slack acceptent les ID de homologues bruts ainsi que les formes cibles Slack telles que channel:C12345678, user:U12345678 et <@U12345678>.
Avec 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 premier niveau ordinaires restent sur la session par channel, même lorsque replyToMode est non off.
Les réponses aux fils de discussion Slack utilisent le Slack thread_ts parent pour les suffixes de session (`:thread:
), même lorsque le threading des réponses sortantes est désactivé avec replyToMode=“off”`.
OpenClaw initialise une racine de channel de premier niveau éligible dans `agent:
:slack:channel:
:thread:
lorsque cette racine est censée démarrer un fil de discussion Slack visible, 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 explicites du bot ou des modèles de mention configurés, et aux channels requireMention: falseavec unreplyToModenonoff`.
La valeur par défaut de channels.slack.thread.historyScope est thread ; la valeur par défaut de 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éfinissez 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 explicites @bot à l’intérieur des fils, même si le bot a déjà participé au fil. Sans cela, les réponses dans un fil auquel participe le bot contournent le filtrage requireMention.
channels.slack.replyToModeByChatType : par direct|group|channel
solution de repli héritée pour les chats directs : 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 Slack depuis l’outil message, définissez replyBroadcast: true avec action: "send" et threadId ou replyTo pour demander à Slack de diffuser également la réponse du fil vers le canal parent. Cela correspond au drapeau chat.postMessagereply_broadcast 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 d’outil message s’exécute dans un fil Slack et cible le même canal, OpenClaw hérite normalement du fil Slack actuel selon replyToMode. Définissez topLevel: true sur action: "send" ou action: "upload-file" pour forcer un nouveau message de canal parent à la place. threadId: null est accepté comme la même option de refus de niveau supérieur.
channels.slack.streaming contrôle le comportement de l’aperçu en direct :
off : désactiver la diffusion de l’aperçu en direct.
partial (par défaut) : remplacer le texte d’aperçu par la dernière sortie partielle.
block : ajouter les mises à jour d’aperçu par morceaux.
progress : afficher le texte d’état de 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éfinir false pour conserver des messages d’outil/progression séparés.
streaming.preview.commandText / streaming.progress.commandText : définir sur status pour conserver les lignes de progression d’outil compactes tout en masquant le texte de commande/exec 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).
Un fil de réponse doit être disponible pour que le flux de texte natif et le statut du fil de l’assistant Slack apparaissent. La sélection du fil suit toujours replyToMode.
Les canaux, les discussions de groupe et les messages directs de niveau supérieur peuvent toujours utiliser l’aperçu de brouillon normal lorsque le flux natif n’est pas disponible ou qu’aucun fil de réponse n’existe.
Par défaut, les messages directs de niveau supérieur Slack restent hors fil, ils n’affichent donc pas l’aperçu de flux/statut natif de style fil de Slack ; OpenClaw publie et modifie à la place un aperçu de brouillon dans le message direct.
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 textes/blocs éligibles ne sont envoyées que 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,
},
},
},
}
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.
le booléen channels.slack.streaming est un alias d’exécution hérité pour channels.slack.streaming.mode et channels.slack.streaming.nativeTransport.
legacy 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 vers les clés canoniques.
typingReaction ajoute une réaction temporaire au message Slack entrant pendant que OpenClaw traite une réponse, puis la supprime lorsque l’exécution est terminée. Ceci est surtout utile en dehors des réponses sur fil, qui utilisent un indicateur de statut “est en train d’écrire…” par défaut.
Ordre de résolution :
`channels.slack.accounts.
.typingReaction`
channels.slack.typingReaction
Notes :
Slack attend des codes abrégés (par exemple "hourglass_flowing_sand").
La réaction est best-effort et un nettoyage est tenté automatiquement une fois le chemin de réponse ou d’échec terminé.
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 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 borné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 au moment de 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 (4000 par défaut)
channels.slack.chunkMode="newline" active la segmentation paragraphe en premier
les envois de fichiers utilisent les API de téléchargement Slack et peuvent inclure des réponses de fil (thread_ts)
la limite de média sortant suit channels.slack.mediaMaxMb lorsqu’elle est configurée ; sinon, les envois de canal 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 texte/bloc uniquement peuvent poster directement aux ID utilisateur ; les téléchargements de fichiers et les envois threadés ouvrent le DM via les API de conversation Slack d'abord 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 fenêtre modale 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 de 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 résultats d’agent, de CLI et de plugin, préférez les boutons
ou 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 sont compilées 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 les payloads presentation et buildSlackPresentationBlocks(...) pour les nouveaux
contrôles rendus par Slack.
Notes :
Il s’agit d’une interface utilisateur (UI) héritée spécifique à Slack. Les autres canaux ne traduisent pas les
directives Slack Block Kit dans leurs propres systèmes de boutons.
Les valeurs de rappel interactives sont des jetons opaques générés par OpenClaw, et non les 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 textuelle d’origine au lieu d’envoyer un payload de blocs non valide.
Les plugins Slack qui enregistrent un gestionnaire interactif peuvent également recevoir les é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 comme view_submission ou
view_closed, inputs normalisé, et l’objet complet brut stateValues de
Slack. Un routage basé uniquement sur l’identifiant de rappel suffit pour invoquer le gestionnaire de plugin ; incluez
les champs de routage utilisateur/session de la modale private_metadata existants 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 utilisent channels.slack.execApprovals.* pour le routage natif DM/channel.
Les approbations de plugin peuvent toujours être résolues via la même surface de bouton native Slack lorsque la demande atterrit déjà sur Slack et que le type d’ID d’approbation est plugin:.
L’autorisation de l’approbateur est toujours appliquée : seuls les utilisateurs identifiés comme approbateurs peuvent approuver ou refuser des demandes via Slack.
Ceci utilise la même surface de bouton d’approbation partagée que les autres canaux. Lorsque interactivity est activé dans les paramètres de votre application Slack, les invites d’approbation s’affichent 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 une commande manuelle /approve uniquement lorsque le résultat de l’outil indique que les
approbations par chat sont indisponibles ou que l’approbation manuelle est le seul chemin.
Chemin de configuration :
channels.slack.execApprovals.enabled
channels.slack.execApprovals.approvers (facultatif ; revient à commands.ownerAllowFrom si possible)
Slack active automatiquement les approbations d’exécution natives lorsque enabled n’est pas défini ou est "auto" et qu’au moins un
approbateur est résolu. Définissez enabled: false pour désactiver Slack en tant que client d’approbation natif de manière explicite.
Définissez enabled: true pour forcer l’activation des approbations natives lorsque les approbateurs sont résolus.
Comportement par défaut sans configuration explicite d’approbation d’exécution Slack :
{
commands: {
ownerAllowFrom: ["slack:U12345678"],
},
}
Une configuration native Slack explicite n’est nécessaire que lorsque vous souhaitez remplacer les approbateurs, 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. Utilisez-le uniquement lorsque les invites d’approbation exec doivent également être acheminées vers d’autres chats ou des cibles hors bande explicites. Le transfert partagé approvals.plugin est également distinct ; les boutons natifs Slack peuvent toujours résoudre les approbations de plugins lorsque ces demandes aboutissent déjà sur Slack.
Le /approve dans le même chat fonctionne également dans les canaux et les DM Slack qui prennent déjà en charge les commandes. Consultez Approbations Exec pour le modèle complet de transfert des approbations.
Les modifications/suppressions de messages sont mappées en événements système.
Les diffusions de fils (réponses de fil “Envoyer également au channel”) sont traitées comme des messages utilisateur normaux.
Les événements d’ajout/suppression de réactions sont mappés en événements système.
Les événements d’arrivée/départ de membre, de channel créé/renommé et d’ajout/suppression d’épingle sont mappés en événements système.
channel_id_changed peut migrer les clés de configuration du channel lorsque configWrites est activé.
Les métadonnées de sujet/objectif du channel sont traitées comme un contexte non approuvé et peuvent être injectées dans le contexte de routage.
Le lanceur de fil et l’amorçage initial du contexte d’historique du fil sont filtrés par les listes autorisées d’expéditeurs configurées, le cas échéant.
Les actions de bloc et les interactions modales émettent des événements système structurés Slack interaction: ... avec des champs de payload riches :
actions de bloc : valeurs sélectionnées, étiquettes, valeurs du sélecteur et métadonnées workflow_*
événements modaux view_submission et view_closed avec des métadonnées de channel acheminées et des entrées de formulaire
unfurls : unfurlLinks (par défaut : false), unfurlMedia pour le contrôle de l’aperçu des liens/médias chat.postMessage ; définissez unfurlLinks: true pour réactiver les aperçus de liens
- allowlist de canaux (`channels.slack.channels`) — **les clés doivent être des ID de canal** (`C12345678`), et non des noms (`#channel-name`). Les clés basées sur le nom échouent silencieusement sous `groupPolicy: "allowlist"` car le routage des canaux est prioritaire à l'ID par défaut. Pour trouver un ID : cliquez avec le bouton droit sur le canal dans Slack → **Copy link** — la valeur `C...` à la fin de l'URL est l'ID du canal.
- `requireMention`
- allowlist `users` par canal
- `messages.groupChat.visibleReplies` : les requêtes normales de groupe/canal sont par défaut `"automatic"`. 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 de l'outil de message visible. 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 postée via l'ancien chemin.
- `messages.groupChat.unmentionedInbound` : s'il est `"room_event"`, les bavardages de canal autorisés non mentionnés constituent un contexte ambiant et restent silencieux sauf si l'agent appelle l'outil `message`. Voir [Événements de salle ambiante](/fr/channels/ambient-room-events).
- les approbations de jumelage / les entrées de liste verte (`dmPolicy: "open"` nécessite toujours `channels.slack.allowFrom: ["*"]`)
- les DM de groupe utilisent le traitement 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 de bot + d’application et l’activation du Socket Mode dans les paramètres de l’application Slack.
Le jeton de niveau application xapp-... a besoin de connections:write, et le jeton bot
xoxb-... doit appartenir à la même application/au même 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 l’exécution actuelle 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 à la place.
Un journal slack token mismatch ... signifie que le jeton bot et le jeton d’application
semblent appartenir à des applications Slack différentes ; corrigez les identifiants de l’application Slack.
l’URL publique termine le TLS et transfère les requêtes 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 l’environnement d’exécution 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 natif (channels.slack.commands.native: true) avec des slash commands correspondantes enregistrées dans Slack
ou le mode de slash command unique (channels.slack.slashCommand.enabled: true)
Slack ne crée ni ne supprime automatiquement les slash commands. commands.native: "auto" n’active pas les commandes natives Slack ; utilisez true et créez les commandes correspondantes dans l’application Slack. En mode HTTP, chaque slash command Slack doit inclure l’URL du Gateway. En mode Socket, les charges utiles des commandes arrivent via le websocket et Slack ignore slash_commands[].url.
Vérifiez également commands.useAccessGroups, l’autorisation DM, les listes d’autorisation de canal,
et les listes d’autorisation users par canal. Slack renvoie des erreurs éphémères pour
les expéditeurs de slash commands bloqués, notamment :
Slack peut joindre des 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 compatible avec la 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 de discussion (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 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 secours 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’authentification/connexion de 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.