Passer au contenu principal

Documentation Index

Fetch the complete documentation index at: https://docs.openclaw.ai/llms.txt

Use this file to discover all available pages before exploring further.

Prêt pour la production pour les DM et les canaux via les intégrations d’app Slack. Le mode par défaut est Socket Mode ; les HTTP Request URLs sont également prises en charge.

Association

Les DM Slack utilisent par défaut le mode d’association.

Commandes slash

Comportement natif des commandes et catalogue des commandes.

Dépannage des canaux

Diagnostics intercanaux et guides de réparation.

Choisir Socket Mode ou les HTTP Request URLs

Les deux transports sont prêts pour la production et atteignent la parité fonctionnelle pour la messagerie, les commandes slash, App Home et l’interactivité. Choisissez selon la forme du déploiement, pas selon les fonctionnalités.
Point à considérerSocket Mode (par défaut)HTTP Request URLs
URL publique du GatewayNon requiseRequise (DNS, TLS, proxy inverse ou tunnel)
Réseau sortantLe WSS sortant vers wss-primary.slack.com doit être joignablePas de WS sortant ; HTTPS entrant uniquement
Jetons nécessairesJeton de bot (xoxb-...) + App-Level Token (xapp-...) avec connections:writeJeton de bot (xoxb-...) + Signing Secret
Ordinateur de développement / derrière un pare-feuFonctionne tel quelNécessite un tunnel public (ngrok, Cloudflare Tunnel, Tailscale Funnel) ou un Gateway de préproduction
Mise à l’échelle horizontaleUne session Socket Mode par app et par hôte ; plusieurs Gateway nécessitent des apps Slack distinctesGestionnaire POST sans état ; plusieurs réplicas de Gateway peuvent partager une app derrière un répartiteur de charge
Multi-compte sur un GatewayPris en charge ; chaque compte ouvre son propre WSPris en charge ; chaque compte nécessite un webhookPath unique (/slack/events par défaut) afin que les inscriptions n’entrent pas en conflit
Transport des commandes slashLivré via la connexion WS ; slash_commands[].url est ignoréSlack envoie des POST vers slash_commands[].url ; le champ est requis pour que la commande soit distribuée
Signature des requêtesNon utilisée (l’authentification est l’App-Level Token)Slack signe chaque requête ; OpenClaw vérifie avec signingSecret
Récupération après perte de connexionLe SDK Slack se reconnecte automatiquement ; le réglage de transport du délai pong du Gateway s’appliquePas de connexion persistante à perdre ; les nouvelles tentatives sont effectuées par requête depuis Slack
Choisissez Socket Mode pour les hôtes avec un seul Gateway, les ordinateurs de développement et les réseaux sur site qui peuvent joindre *.slack.com en sortie mais ne peuvent pas accepter de HTTPS entrant.Choisissez les HTTP Request URLs lorsque vous exécutez plusieurs réplicas de Gateway derrière un répartiteur de charge, lorsque le WSS sortant est bloqué mais que le HTTPS entrant est autorisé, ou lorsque vous terminez déjà les Webhook Slack sur un proxy inverse.

Configuration rapide

1

Créer une nouvelle app Slack

Ouvrez api.slack.com/appsCreate New AppFrom a manifest → sélectionnez votre espace de travail → collez l’un des manifests ci-dessous → NextCreate.
{
  "display_information": {
    "name": "OpenClaw",
    "description": "Slack connector for OpenClaw"
  },
  "features": {
    "bot_user": { "display_name": "OpenClaw", "always_online": true },
    "app_home": {
      "home_tab_enabled": true,
      "messages_tab_enabled": true,
      "messages_tab_read_only_enabled": false
    },
    "slash_commands": [
      {
        "command": "/openclaw",
        "description": "Send a message to OpenClaw",
        "should_escape": false
      }
    ]
  },
  "oauth_config": {
    "scopes": {
      "bot": [
        "app_mentions:read",
        "assistant:write",
        "channels:history",
        "channels:read",
        "chat:write",
        "commands",
        "emoji:read",
        "files:read",
        "files:write",
        "groups:history",
        "groups:read",
        "im:history",
        "im:read",
        "im:write",
        "mpim:history",
        "mpim:read",
        "mpim:write",
        "pins:read",
        "pins:write",
        "reactions:read",
        "reactions:write",
        "usergroups:read",
        "users:read"
      ]
    }
  },
  "settings": {
    "socket_mode_enabled": true,
    "event_subscriptions": {
      "bot_events": [
        "app_home_opened",
        "app_mention",
        "channel_rename",
        "member_joined_channel",
        "member_left_channel",
        "message.channels",
        "message.groups",
        "message.im",
        "message.mpim",
        "pin_added",
        "pin_removed",
        "reaction_added",
        "reaction_removed"
      ]
    }
  }
}
Recommandé correspond à l’ensemble complet de fonctionnalités du Plugin Slack intégré : App Home, commandes slash, fichiers, réactions, épingles, DM de groupe et lectures d’emojis/groupes d’utilisateurs. Choisissez Minimal lorsque la politique de l’espace de travail limite les portées : il couvre les DM, l’historique des canaux/groupes, les mentions et les commandes slash, mais exclut les fichiers, les réactions, les épingles, les DM de groupe (mpim:*), emoji:read et usergroups:read. Consultez la liste de contrôle du manifest et des portées pour la justification de chaque portée et les options additives comme des commandes slash supplémentaires.
Après la création de l’app par Slack :
  • Basic Information → App-Level Tokens → Generate Token and Scopes : ajoutez connections:write, enregistrez, copiez la valeur xapp-....
  • Install App → Install to Workspace : copiez le Bot User OAuth Token xoxb-....
2

Configurer OpenClaw

Configuration SecretRef recommandée :
export SLACK_APP_TOKEN=xapp-...
export SLACK_BOT_TOKEN=xoxb-...
cat > slack.socket.patch.json5 <<'JSON5'
{
  channels: {
    slack: {
      enabled: true,
      mode: "socket",
      appToken: { source: "env", provider: "default", id: "SLACK_APP_TOKEN" },
      botToken: { source: "env", provider: "default", id: "SLACK_BOT_TOKEN" },
    },
  },
}
JSON5
openclaw config patch --file ./slack.socket.patch.json5 --dry-run
openclaw config patch --file ./slack.socket.patch.json5
Solution de repli via l’environnement (compte par défaut uniquement) :
SLACK_APP_TOKEN=xapp-...
SLACK_BOT_TOKEN=xoxb-...
3

Démarrer le Gateway

openclaw gateway

Réglage du transport en mode Socket Mode

OpenClaw définit par défaut le délai d’attente pong du client SDK Slack à 15 secondes pour Socket Mode. Remplacez les paramètres de transport uniquement lorsque vous avez besoin d’un réglage propre à 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 Socket Mode qui journalisent des délais d’attente de pong websocket Slack ou de ping serveur, ou qui s’exécutent sur des hôtes présentant une famine connue de boucle d’événements. clientPingTimeout est l’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 d’application restent un état applicatif, pas des signaux de disponibilité du transport.

Liste de contrôle du manifeste et des portées

Le manifeste d’application Slack de base est le même pour Socket Mode et les URL de requête HTTP. Seul le bloc settings (et l’url de la commande slash) diffère. Manifeste de base (Socket Mode par défaut) :
{
  "display_information": {
    "name": "OpenClaw",
    "description": "Slack connector for OpenClaw"
  },
  "features": {
    "bot_user": { "display_name": "OpenClaw", "always_online": true },
    "app_home": {
      "home_tab_enabled": true,
      "messages_tab_enabled": true,
      "messages_tab_read_only_enabled": false
    },
    "slash_commands": [
      {
        "command": "/openclaw",
        "description": "Send a message to OpenClaw",
        "should_escape": false
      }
    ]
  },
  "oauth_config": {
    "scopes": {
      "bot": [
        "app_mentions:read",
        "assistant:write",
        "channels:history",
        "channels:read",
        "chat:write",
        "commands",
        "emoji:read",
        "files:read",
        "files:write",
        "groups:history",
        "groups:read",
        "im:history",
        "im:read",
        "im:write",
        "mpim:history",
        "mpim:read",
        "mpim:write",
        "pins:read",
        "pins:write",
        "reactions:read",
        "reactions:write",
        "usergroups:read",
        "users:read"
      ]
    }
  },
  "settings": {
    "socket_mode_enabled": true,
    "event_subscriptions": {
      "bot_events": [
        "app_home_opened",
        "app_mention",
        "channel_rename",
        "member_joined_channel",
        "member_left_channel",
        "message.channels",
        "message.groups",
        "message.im",
        "message.mpim",
        "pin_added",
        "pin_removed",
        "reaction_added",
        "reaction_removed"
      ]
    }
  }
}
Pour le mode URL de requête HTTP, remplacez settings par la variante HTTP et ajoutez url à chaque commande slash. URL publique requise :
{
  "features": {
    "slash_commands": [
      {
        "command": "/openclaw",
        "description": "Send a message to OpenClaw",
        "should_escape": false,
        "url": "https://gateway-host.example.com/slack/events"
      }
    ]
  },
  "settings": {
    "event_subscriptions": {
      "request_url": "https://gateway-host.example.com/slack/events",
      "bot_events": [
        "app_home_opened",
        "app_mention",
        "channel_rename",
        "member_joined_channel",
        "member_left_channel",
        "message.channels",
        "message.groups",
        "message.im",
        "message.mpim",
        "pin_added",
        "pin_removed",
        "reaction_added",
        "reaction_removed"
      ]
    },
    "interactivity": {
      "is_enabled": true,
      "request_url": "https://gateway-host.example.com/slack/events",
      "message_menu_options_url": "https://gateway-host.example.com/slack/events"
    }
  }
}

Paramètres supplémentaires du manifeste

Exposez différentes fonctionnalités qui étendent les valeurs par défaut ci-dessus. Le manifeste par défaut active l’onglet Home de Slack App Home et s’abonne à app_home_opened. Lorsqu’un membre de l’espace de travail ouvre l’onglet Home, OpenClaw publie une vue Home par défaut sûre avec views.publish ; aucune charge utile de conversation ni configuration privée n’est incluse. L’onglet Messages reste activé pour les messages privés Slack.
Plusieurs commandes slash natives peuvent être utilisées au lieu d’une seule commande configurée, avec des nuances :
  • Utilisez /agentstatus au lieu de /status, car la commande /status est réservée.
  • Pas plus de 25 commandes slash peuvent être mises à disposition simultanément.
Remplacez votre section features.slash_commands existante par un sous-ensemble des commandes disponibles :
{
  "slash_commands": [
    {
      "command": "/new",
      "description": "Start a new session",
      "usage_hint": "[model]"
    },
    {
      "command": "/reset",
      "description": "Reset the current session"
    },
    {
      "command": "/compact",
      "description": "Compact the session context",
      "usage_hint": "[instructions]"
    },
    {
      "command": "/stop",
      "description": "Stop the current run"
    },
    {
      "command": "/session",
      "description": "Manage thread-binding expiry",
      "usage_hint": "idle <duration|off> or max-age <duration|off>"
    },
    {
      "command": "/think",
      "description": "Set the thinking level",
      "usage_hint": "<level>"
    },
    {
      "command": "/verbose",
      "description": "Toggle verbose output",
      "usage_hint": "on|off|full"
    },
    {
      "command": "/fast",
      "description": "Show or set fast mode",
      "usage_hint": "[status|on|off]"
    },
    {
      "command": "/reasoning",
      "description": "Toggle reasoning visibility",
      "usage_hint": "[on|off|stream]"
    },
    {
      "command": "/elevated",
      "description": "Toggle elevated mode",
      "usage_hint": "[on|off|ask|full]"
    },
    {
      "command": "/exec",
      "description": "Show or set exec defaults",
      "usage_hint": "host=<auto|sandbox|gateway|node> security=<deny|allowlist|full> ask=<off|on-miss|always> node=<id>"
    },
    {
      "command": "/model",
      "description": "Show or set the model",
      "usage_hint": "[name|#|status]"
    },
    {
      "command": "/models",
      "description": "List providers/models",
      "usage_hint": "[provider] [page] [limit=<n>|size=<n>|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": "<name> [input]"
    },
    {
      "command": "/btw",
      "description": "Ask a side question without changing session context",
      "usage_hint": "<question>"
    },
    {
      "command": "/side",
      "description": "Ask a side question without changing session context",
      "usage_hint": "<question>"
    },
    {
      "command": "/usage",
      "description": "Control the usage footer or show cost summary",
      "usage_hint": "off|tokens|full|cost"
    }
  ]
}
Ajoutez la portée de bot chat:write.customize si vous voulez 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:.
Si vous configurez channels.slack.userToken, les portées de lecture habituelles sont :
  • channels:history, groups:history, im:history, mpim:history
  • channels:read, groups:read, im:read, mpim:read
  • users:read
  • reactions:read
  • pins:read
  • emoji:read
  • search:read (si vous dépendez des lectures de recherche Slack)

Modèle de jetons

  • botToken + appToken sont requis pour le Socket Mode.
  • Le mode HTTP requiert 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 par variables d’environnement.
  • Le repli par variables d’environnement SLACK_BOT_TOKEN / SLACK_APP_TOKEN s’applique uniquement au compte par défaut.
  • userToken (xoxp-...) est uniquement configurable (pas de repli par variable d’environnement) et utilise 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).
  • L’état est available, configured_unavailable ou missing.
  • configured_unavailable signifie que le compte est configuré via SecretRef ou une autre source de secret non intégrée, mais que la commande ou le chemin d’exécution actuel n’a pas pu résoudre la valeur réelle.
  • En mode HTTP, signingSecretStatus est inclus ; en Socket Mode, la paire requise est botTokenStatus + appTokenStatus.
Pour les actions et les lectures d’annuaire, le jeton utilisateur peut être préféré lorsqu’il est configuré. Pour les écritures, le jeton de bot reste préféré ; les écritures avec jeton utilisateur ne sont autorisées que lorsque userTokenReadOnly: false et que le jeton de bot est indisponible.

Actions et garde-fous

Les actions Slack sont contrôlées par channels.slack.actions.*. Groupes d’actions disponibles dans l’outillage Slack actuel :
GroupePar défaut
messagesactivé
reactionsactivé
pinsactivé
memberInfoactivé
emojiListactivé
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 fichier local pour les autres types de fichiers.

Contrôle d’accès et routage

channels.slack.dmPolicy contrôle l’accès aux DM. channels.slack.allowFrom est la liste d’autorisation canonique des DM.
  • pairing (par défaut)
  • allowlist
  • open (requiert que channels.slack.allowFrom inclue "*")
  • disabled
Indicateurs DM :
  • dm.enabled (vrai par défaut)
  • channels.slack.allowFrom
  • dm.allowFrom (ancien)
  • dm.groupEnabled (DM de groupe faux par défaut)
  • dm.groupChannels (liste d’autorisation MPIM facultative)
Priorité multi-comptes :
  • 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 anciens channels.slack.dm.policy et channels.slack.dm.allowFrom sont encore 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 <code>.

Threads, sessions et balises de réponse

  • Les DM sont routés comme direct ; les canaux comme channel ; les MPIM comme group.
  • Les liaisons de routes Slack acceptent les ID de pairs bruts ainsi que les formes de cible Slack telles que channel:C12345678, user:U12345678 et <@U12345678>.
  • Avec session.dmScope=main par défaut, les DM Slack sont regroupés dans la session principale de l’agent.
  • Sessions de canal : agent:<agentId>:slack:channel:<channelId>.
  • Les réponses dans un thread peuvent créer des suffixes de session de thread (:thread:<threadTs>) le cas échéant.
  • Dans les canaux où OpenClaw traite les messages de premier niveau sans exiger de mention explicite, un replyToMode différent de off route chaque racine traitée vers agent:<agentId>:slack:channel:<channelId>:thread:<rootTs> afin que le thread Slack visible corresponde à une session OpenClaw dès le premier tour.
  • La valeur par défaut de channels.slack.thread.historyScope est thread ; celle de thread.inheritParent est false.
  • channels.slack.thread.initialHistoryLimit contrôle le nombre de messages de thread existants récupérés lorsqu’une nouvelle session de thread démarre (par défaut 20 ; définissez 0 pour désactiver).
  • channels.slack.thread.requireExplicitMention (par défaut false) : lorsqu’il vaut true, supprime les mentions implicites de thread afin que le bot ne réponde qu’aux mentions @bot explicites dans les threads, même lorsque le bot a déjà participé au thread. Sans cela, les réponses dans un thread auquel le bot a participé contournent le garde-fou requireMention.
Contrôles de threading des réponses :
  • channels.slack.replyToMode : off|first|all|batched (par défaut off)
  • channels.slack.replyToModeByChatType : par direct|group|channel
  • repli ancien pour les discussions directes : channels.slack.dm.replyToMode
Les balises de réponse manuelles sont prises en charge :
  • [[reply_to_current]]
  • [[reply_to:<id>]]
Pour les réponses explicites dans un thread 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 thread dans le canal parent. Cela correspond au drapeau reply_broadcast de chat.postMessage Slack et n’est pris en charge que pour les envois de texte ou Block Kit, pas pour les téléversements de médias. Lorsqu’un appel à l’outil message s’exécute dans un thread Slack et cible le même canal, OpenClaw hérite normalement du thread Slack actuel selon replyToMode. Définissez topLevel: true sur action: "send" ou action: "upload-file" pour forcer un nouveau message dans le canal parent à la place. threadId: null est accepté comme le même désengagement de premier niveau.
replyToMode="off" désactive tout le threading de réponses 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". Les threads Slack masquent les messages du canal, tandis que les réponses Telegram restent visibles en ligne.

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.<accountId>.ackReaction
  • channels.slack.ackReaction
  • messages.ackReaction
  • repli vers l’emoji d’identité de l’agent (agents.list[].identity.emoji, sinon ”👀”)
Notes :
  • Slack attend des shortcodes (par exemple "eyes").
  • Utilisez "" pour désactiver la réaction pour le compte Slack ou globalement.

Diffusion de texte en continu

channels.slack.streaming contrôle le comportement d’aperçu en direct :
  • off : désactive la diffusion en continu de l’aperçu en direct.
  • partial (par défaut) : remplace le texte d’aperçu par la dernière sortie partielle.
  • block : ajoute des mises à jour d’aperçu par morceaux.
  • progress : affiche un texte d’état de progression pendant la génération, puis envoie le texte final.
  • streaming.preview.toolProgress : lorsque l’aperçu de brouillon est actif, route les mises à jour d’outils/progression vers le même message d’aperçu modifié (par défaut : true). Définissez false pour conserver des messages d’outils/progression séparés.
  • streaming.preview.commandText / streaming.progress.commandText : définissez sur status pour conserver des lignes compactes de progression d’outil tout en masquant le texte brut de commande/exec (par défaut : raw).
Masquer le texte brut de commande/exec tout en conservant des lignes de progression compactes :
{
  "channels": {
    "slack": {
      "streaming": {
        "mode": "progress",
        "progress": {
          "toolProgress": true,
          "commandText": "status"
        }
      }
    }
  }
}
channels.slack.streaming.nativeTransport contrôle la diffusion de texte native Slack lorsque channels.slack.streaming.mode vaut partial (par défaut : true).
  • Un fil de réponse doit être disponible pour que le streaming de texte natif et l’état du fil d’assistant Slack apparaissent. La sélection du fil suit toujours replyToMode.
  • Les racines de canal, de discussion de groupe et de DM de premier niveau peuvent toujours utiliser l’aperçu de brouillon normal lorsque le streaming natif est indisponible ou qu’aucun fil de réponse n’existe.
  • Les DM Slack de premier niveau restent hors fil par défaut, ils n’affichent donc pas l’aperçu de streaming/état natif de style fil de Slack ; OpenClaw publie et modifie plutôt un aperçu de brouillon dans le DM.
  • Les médias et les charges utiles non textuelles reviennent à la livraison normale.
  • Les finals de média/erreur annulent les modifications d’aperçu en attente ; les finals de texte/bloc admissibles ne sont vidés que lorsqu’ils peuvent modifier l’aperçu sur place.
  • Si le streaming échoue au milieu d’une réponse, OpenClaw revient à la livraison normale pour les charges utiles restantes.
Utilisez l’aperçu de brouillon au lieu du streaming 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.
  • L’ancien channels.slack.nativeStreaming est un alias d’exécution pour channels.slack.streaming.nativeTransport.
  • Exécutez openclaw doctor --fix pour réécrire la configuration persistée du streaming Slack avec les clés canoniques.

Solution de repli 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 particulièrement utile en dehors des réponses en fil, qui utilisent un indicateur d’état par défaut « est en train d’écrire… ». Ordre de résolution :
  • channels.slack.accounts.<accountId>.typingReaction
  • channels.slack.typingReaction
Notes :
  • Slack attend des shortcodes (par exemple "hourglass_flowing_sand").
  • La réaction est en mode meilleur effort et le nettoyage est tenté automatiquement après la réponse ou l’achèvement du chemin d’échec.

Médias, découpage 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 magasin de médias lorsque la récupération réussit et que les limites de taille le permettent. Les placeholders de fichier incluent le fileId Slack 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 de fichier Slack se bloque ou échoue, OpenClaw continue à traiter le message et revient au placeholder de fichier.La limite de taille entrante à l’exécution est par défaut de 20MB, sauf si elle est remplacée par channels.slack.mediaMaxMb.
  • les fragments de texte utilisent channels.slack.textChunkLimit (4000 par défaut)
  • channels.slack.chunkMode="newline" active le découpage priorisant les paragraphes
  • les envois de fichiers utilisent les API de téléversement Slack et peuvent inclure des réponses en fil (thread_ts)
  • la limite des médias sortants suit channels.slack.mediaMaxMb lorsqu’elle est configurée ; sinon les envois de canal utilisent les valeurs par défaut par type MIME du pipeline média
Cibles explicites préférées :
  • user:<id> pour les DM
  • channel:<id> pour les canaux
Les DM Slack contenant uniquement du texte/des blocs peuvent publier directement vers des ID utilisateur ; les téléversements de fichiers et les envois en fil ouvrent d’abord le DM via les API de conversation Slack, car ces chemins nécessitent un ID de conversation concret.

Commandes et comportement slash

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 plutôt activées avec channels.slack.commands.native: true ou commands.native: true dans les configurations globales.
  • 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 adaptative 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 asynchrone des options lorsque les gestionnaires d’options d’interactivité sont disponibles
  • limites Slack dépassées : les valeurs d’option encodées reviennent à des boutons
/think
Les sessions slash utilisent des clés isolées comme agent:<agentId>:slack:slash:<userId> et routent toujours les exécutions de commandes vers la session de conversation cible à l’aide de CommandTargetSessionKey.

Réponses interactives

Slack peut afficher des contrôles de réponse interactifs rédigés par l’agent, mais cette fonctionnalité est désactivée par défaut. Activez-la globalement :
{
  channels: {
    slack: {
      capabilities: {
        interactiveReplies: true,
      },
    },
  },
}
Ou activez-la uniquement pour un compte Slack :
{
  channels: {
    slack: {
      accounts: {
        ops: {
          capabilities: {
            interactiveReplies: true,
          },
        },
      },
    },
  },
}
Lorsqu’elle est activée, les agents peuvent émettre des directives de réponse propres à Slack :
  • [[slack_buttons: Approve:approve, Reject:reject]]
  • [[slack_select: Choose a target | Canary:canary, Production:production]]
Ces directives se compilent en Slack Block Kit et routent les clics ou sélections via le chemin d’événement d’interaction Slack existant. Notes :
  • Il s’agit d’une interface utilisateur propre à 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 des valeurs brutes rédigées par l’agent.
  • Si les blocs interactifs générés dépassaient les limites de Slack Block Kit, OpenClaw revient à la réponse textuelle d’origine au lieu d’envoyer une charge utile de blocs invalide.

Approbations d’exécution dans Slack

Slack peut agir comme client d’approbation natif avec des boutons et interactions interactifs, au lieu de revenir à l’interface Web ou au terminal.
  • Les approbations d’exécution utilisent channels.slack.execApprovals.* pour le routage DM/canal natif.
  • Les approbations de Plugin peuvent toujours être résolues via la même surface de boutons native Slack lorsque la requête arrive déjà dans 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 requêtes via Slack.
Cela utilise la même surface partagée de boutons d’approbation 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’expérience d’approbation principale ; OpenClaw ne doit inclure une commande /approve manuelle que 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 lorsque c’est possible)
  • channels.slack.execApprovals.target (dm | channel | both, par défaut : dm)
  • agentFilter, sessionFilter
Slack active automatiquement les approbations d’exécution natives lorsque enabled n’est pas défini ou vaut "auto" et qu’au moins un approbateur est résolu. Définissez enabled: false pour désactiver explicitement Slack comme client d’approbation natif. 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"],
  },
}
La configuration native Slack explicite n’est nécessaire que lorsque vous souhaitez remplacer les approbateurs, ajouter des filtres ou opter pour la livraison au chat d’origine :
{
  channels: {
    slack: {
      execApprovals: {
        enabled: true,
        approvers: ["U12345678"],
        target: "both",
      },
    },
  },
}
Le transfert partagé approvals.exec est séparé. Utilisez-le uniquement lorsque les invites d’approbation d’exécution doivent également être routées vers d’autres chats ou des cibles explicites hors bande. Le transfert partagé approvals.plugin est également séparé ; les boutons natifs Slack peuvent toujours résoudre les approbations de Plugin lorsque ces requêtes arrivent déjà dans Slack. La commande /approve dans le même chat fonctionne également dans les canaux Slack et les DM qui prennent déjà les commandes en charge. Consultez Approbations d’exécution pour le modèle complet de transfert des approbations.

Événements et comportement opérationnel

  • Les modifications/suppressions de messages sont mappées vers des événements système.
  • Les diffusions de fil (« Également envoyer au canal » pour les réponses en fil) sont traitées comme des messages utilisateur normaux.
  • Les événements d’ajout/suppression de réaction sont mappés vers des é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’épingle sont mappés vers 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 de sujet/objectif de canal sont traitées comme un contexte non fiable et peuvent être injectées dans le contexte de routage.
  • Le contexte d’amorçage du message de départ de fil et de l’historique initial du fil est filtré par les listes d’autorisation d’expéditeurs configurées, le cas échéant.
  • Les actions de bloc et les interactions de modale émettent des événements système structurés Slack interaction: ... avec des champs de charge utile riches :
    • actions de bloc : valeurs sélectionnées, libellés, valeurs de sélecteur et métadonnées workflow_*
    • événements view_submission et view_closed de modale avec métadonnées de canal routées et entrées de formulaire

Référence de configuration

Référence principale : Référence de configuration - Slack.
  • mode/auth : mode, botToken, appToken, signingSecret, webhookPath, accounts.*
  • accès DM : dm.enabled, dmPolicy, allowFrom (hérité : dm.policy, dm.allowFrom), dm.groupEnabled, dm.groupChannels
  • bascule de compatibilité : dangerouslyAllowNameMatching (mesure d’urgence ; laissez désactivé sauf nécessité)
  • accès au canal : groupPolicy, channels.*, channels.*.users, channels.*.requireMention
  • fils/historique : replyToMode, replyToModeByChatType, thread.*, historyLimit, dmHistoryLimit, dms.*.historyLimit
  • livraison : textChunkLimit, chunkMode, mediaMaxMb, streaming, streaming.nativeTransport, streaming.preview.toolProgress
  • aperçus : unfurlLinks, unfurlMedia pour le contrôle de l’aperçu des liens/médias de chat.postMessage
  • opérations/fonctionnalités : configWrites, commands.native, slashCommand.*, actions.*, userToken, userTokenReadOnly

Dépannage

Vérifiez, dans l’ordre :
  • groupPolicy
  • liste d’autorisation des canaux (channels.slack.channels) — les clés doivent être des ID de canal (C12345678), pas des noms (#channel-name). Les clés basées sur les noms échouent silencieusement avec groupPolicy: "allowlist" parce que le routage de canal se fait d’abord par ID par défaut. Pour trouver un ID : faites un clic droit sur le canal dans Slack → Copier le lien — la valeur C... à la fin de l’URL est l’ID du canal.
  • requireMention
  • liste d’autorisation users par canal
Commandes utiles :
openclaw channels status --probe
openclaw logs --follow
openclaw doctor
Vérifiez :
  • channels.slack.dm.enabled
  • channels.slack.dmPolicy (ou l’ancien channels.slack.dm.policy)
  • approbations d’association / entrées de liste d’autorisation
  • événements DM de l’assistant Slack : les journaux verbeux mentionnant drop message_changed signifient généralement que Slack a envoyé un événement de fil d’assistant modifié sans expéditeur humain récupérable dans les métadonnées du message
openclaw pairing list slack
Validez les jetons de bot et d’application, ainsi que l’activation de Socket Mode dans les paramètres de l’application Slack.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 reposant sur SecretRef.
Valider :
  • secret de signature
  • chemin du webhook
  • URL de requête Slack (Events + Interactivity + Slash Commands)
  • webhookPath unique par compte HTTP
Si signingSecretStatus: "configured_unavailable" apparaît dans les instantanés de compte, le compte HTTP est configuré, mais l’exécution actuelle n’a pas pu résoudre le secret de signature adossé à SecretRef.
Vérifiez si vous vouliez 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)
Vérifiez également commands.useAccessGroups et les listes d’autorisation de canaux/utilisateurs.

Référence pour la vision des pièces jointes

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 passer par le chemin de compréhension des médias ou être transmis directement à un modèle de réponse compatible avec la vision ; les autres fichiers sont conservés comme contexte de fichier téléchargeable plutôt que traités comme entrée image.

Types de médias pris en charge

Type de médiaSourceComportement actuelNotes
Images JPEG / PNG / GIF / WebPURL de fichier SlackTéléchargées et jointes au tour pour une gestion compatible avec la visionPlafond par fichier : channels.slack.mediaMaxMb (20 Mo par défaut)
Fichiers PDFURL de fichier SlackTéléchargés et exposés comme contexte de fichier pour des outils comme download-file ou pdfL’entrée Slack ne convertit pas automatiquement les PDF en entrée de vision d’image
Autres fichiersURL de fichier SlackTéléchargés lorsque possible et exposés comme contexte de fichierLes fichiers binaires ne sont pas traités comme entrée image
Réponses de filFichiers du message de départ du filLes fichiers du message racine peuvent être hydratés comme contexte lorsque la réponse n’a pas de média directLes messages de départ contenant uniquement des fichiers utilisent un espace réservé de pièce jointe
Messages multi-imagesPlusieurs fichiers SlackChaque fichier est évalué indépendammentLe traitement Slack est plafonné à huit fichiers par message

Pipeline entrant

Lorsqu’un message Slack avec pièces jointes de fichier arrive :
  1. OpenClaw télécharge le fichier depuis l’URL privée de Slack à l’aide du jeton du bot (xoxb-...).
  2. Le fichier est écrit dans le magasin de médias en cas de réussite.
  3. Les chemins des médias téléchargés et les types de contenu sont ajoutés au contexte entrant.
  4. Les chemins de modèles/outils compatibles avec les images peuvent utiliser les pièces jointes image depuis ce contexte.
  5. Les fichiers non image restent disponibles comme métadonnées de fichier ou références média pour les outils capables de les traiter.

Héritage des pièces jointes du message racine du fil

Lorsqu’un message arrive dans un fil (avec 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 comme contexte de départ du fil.
  • Les pièces jointes directes de la réponse 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é avec un espace réservé de pièce jointe afin que le repli puisse toujours inclure ses fichiers.

Gestion de plusieurs pièces jointes

Lorsqu’un seul message Slack contient plusieurs pièces jointes de fichier :
  • Chaque pièce jointe est traitée indépendamment via le pipeline média.
  • Les références de médias téléchargés sont agrégées dans le contexte du message.
  • L’ordre de traitement suit l’ordre des fichiers Slack dans la charge utile de l’événement.
  • L’échec du téléchargement d’une pièce jointe ne bloque pas les autres.

Limites de taille, de téléchargement et de modèle

  • Plafond 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 Slack sont ignorés au lieu d’être signalés comme 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é dans agents.defaults.imageModel.

Limites connues

ScénarioComportement actuelContournement
URL de fichier Slack expiréeFichier ignoré ; aucune erreur affichéeTéléversez de nouveau le fichier dans Slack
Modèle de vision non configuréLes pièces jointes image sont stockées comme références média, mais ne sont pas analysées comme imagesConfigurez agents.defaults.imageModel ou utilisez un modèle de réponse compatible avec la vision
Images très volumineuses (> 20 Mo par défaut)Ignorées selon le plafond de tailleAugmentez channels.slack.mediaMaxMb si Slack le permet
Pièces jointes transférées/partagéesLe texte et les médias image/fichier hébergés par Slack sont traités au mieuxPartagez de nouveau directement dans le fil OpenClaw
Pièces jointes PDFStockées comme contexte fichier/média, pas automatiquement routées via la vision d’imageUtilisez download-file pour les métadonnées de fichier ou l’outil pdf pour l’analyse PDF

Documentation associée

Associé

Appairage

Associez un utilisateur Slack au Gateway.

Groupes

Comportement des canaux et des messages directs de groupe.

Routage des canaux

Acheminez les messages entrants vers les agents.

Sécurité

Modèle de menace et renforcement.

Configuration

Disposition et priorité de la configuration.

Commandes slash

Catalogue et comportement des commandes.