Aller au contenu

Slack

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.

Pairing

Les MD Slack sont en mode d’appairage par défaut.

Slash commands

Comportement des commandes natives et catalogue de commandes.

Channel troubleshooting

Playbooks de diagnostic et de réparation inter-canaux.

Choisir entre le mode Socket et les URL de requête HTTP

Section intitulée « Choisir entre le mode Socket et les URL de requête HTTP »

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.

SouciMode Socket (par défaut)URL de requête HTTP
URL publique GatewayNon requisRequis (DNS, TLS, proxy inverse ou tunnel)
Réseau sortantLa WSS sortante vers wss-primary.slack.com doit être accessiblePas de WS sortant ; uniquement HTTPS entrant
Jetons nécessairesJeton de bot + Jeton de niveau application avec connections:writeJeton de bot + Signature secrète
Ordinateur de développement / derrière un pare-feuFonctionne tel quelNécessite un tunnel public (ngrok, Cloudflare Tunnel, TailscaleGateway Funnel) ou une passerelle de staging
Mise à l’échelle horizontaleUne session Socket Mode par application par hôte ; plusieurs passerelles nécessitent des applications Slack distinctesGestionnaire POST sans état ; plusieurs répliques de Gateway peuvent partager une application derrière un répartiteur de charge
Multi-compte sur une seule passerellePris en charge ; chaque compte ouvre son propre WSPris en charge ; chaque compte a besoin d’un webhookPath unique (par défaut /slack/events) pour éviter les collisions d’enregistrements
Transport de commande slashLivré 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êteNon 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 connexionLa 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

Installez Slack avant de configurer le channel :

Fenêtre de terminal
openclaw plugins install @openclaw/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.

  1. Créer une nouvelle application Slack

    Ouvrez api.slack.com/appsCreate New AppFrom a manifest → sélectionnez votre espace de travail → collez l’un des manifestes 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
    },
    "assistant_view": {
    "assistant_description": "OpenClaw connects Slack assistant threads to OpenClaw agents.",
    "suggested_prompts": [
    { "title": "What can you do?", "message": "What can you help me with?" },
    {
    "title": "Summarize this channel",
    "message": "Summarize the recent activity in this channel."
    },
    { "title": "Draft a reply", "message": "Help me draft a reply." }
    ]
    },
    "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", "assistant_thread_context_changed", "assistant_thread_started", "channel_rename", "member_joined_channel", "member_left_channel", "message.channels", "message.groups", "message.im", "message.mpim", "pin_added", "pin_removed", "reaction_added", "reaction_removed"]
    }
    }
    }
    {
    "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
    },
    "assistant_view": {
    "assistant_description": "OpenClaw connects Slack assistant threads to OpenClaw agents.",
    "suggested_prompts": [
    { "title": "What can you do?", "message": "What can you help me with?" },
    {
    "title": "Summarize this channel",
    "message": "Summarize the recent activity in this channel."
    },
    { "title": "Draft a reply", "message": "Help me draft a reply." }
    ]
    },
    "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", "groups:history", "groups:read", "im:history", "im:read", "im:write", "users:read"]
    }
    },
    "settings": {
    "socket_mode_enabled": true,
    "event_subscriptions": {
    "bot_events": ["app_home_opened", "app_mention", "assistant_thread_context_changed", "assistant_thread_started", "message.channels", "message.groups", "message.im"]
    }
    }
    }

    Une fois que Slack a créé l’application :

    • 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.
  2. Configurer OpenClaw

    Configuration SecretRef recommandée :
    Fenêtre de terminal
    export SLACK_APP_TOKEN=slack-app-token-example
    export SLACK_BOT_TOKEN=slack-bot-token-example
    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
    Fallback Env (compte par défaut uniquement) :
    Fenêtre de terminal
    SLACK_APP_TOKEN=slack-app-token-example
    SLACK_BOT_TOKEN=slack-bot-token-example
  3. Démarrer la passerelle

    Fenêtre de terminal
    openclaw gateway

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.

Liste de vérification du manifeste et des portées

Section intitulée « Liste de vérification du manifeste et des portées »

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.

Manifeste de base (par défaut du mode Socket) :

{
"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
},
"assistant_view": {
"assistant_description": "OpenClaw connects Slack assistant threads to OpenClaw agents.",
"suggested_prompts": [
{ "title": "What can you do?", "message": "What can you help me with?" },
{
"title": "Summarize this channel",
"message": "Summarize the recent activity in this channel."
},
{ "title": "Draft a reply", "message": "Help me draft a reply." }
]
},
"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", "assistant_thread_context_changed", "assistant_thread_started", "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", "assistant_thread_context_changed", "assistant_thread_started", "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"
}
}
}

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.

Commandes natives de barre oblique facultatives

Plusieurs commandes natives de barre oblique 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 de barre oblique ne peuvent être disponibles à la fois.

Remplacez votre section features.slash_commands existante par un sous-ensemble de 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

or max-age

” }, { “command”: “/think”, “description”: “Set the thinking level”, “usage_hint”: ”

” }, { “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=

security=

ask=

node=

” }, { “command”: “/approve”, “description”: “Approve or deny pending approval requests”, “usage_hint”: ”

” }, { “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” } ] }

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 :

  • 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)
  • 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 :

GroupePar défaut
messagesactivé
réactionsactivé
épinglesactivé
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 fichiers locaux pour les autres types de fichiers.

channels.slack.dmPolicy contrôle l’accès aux DM. channels.slack.allowFrom est la liste d’autorisation (allowlist) canonique pour les DM.

  • pairing (par défaut)
  • allowlist
  • open (nécessite que channels.slack.allowFrom inclue "*")
  • disabled

Indicateurs (flags) de DM :

  • dm.enabled (true par défaut)
  • channels.slack.allowFrom
  • dm.allowFrom (obsolète)
  • dm.groupEnabled (false par défaut pour les DM de groupe)
  • dm.groupChannels (liste d’autorisation MPIM optionnelle)

Priorité multi-compte :

  • 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

Section intitulée « 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.

Contrôles des fils de réponse :

  • channels.slack.replyToMode : off|first|all|batched (par défaut off)
  • 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_broadcast chat.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é.

Ordre de résolution :

  • `channels.slack.accounts.

.ackReaction`

  • channels.slack.ackReaction
  • messages.ackReaction
  • emoji de repli d’identité de l’agent (agents.list[].identity.emoji, sinon "eyes" / 👀)

Notes :

  • Slack attend des codes courts (par exemple "eyes").
  • Utilisez "" pour désactiver la réaction pour le compte Slack ou globalement.

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.
Pièces jointes entrantes

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

Référence principale : Référence de configuration - Slack.

SlackChamps de signal élevée Slack
  • mode/auth : mode, botToken, appToken, signingSecret, webhookPath, accounts.*
  • accès DM : dm.enabled, dmPolicy, allowFrom (obsolète : dm.policy, dm.allowFrom), dm.groupEnabled, dm.groupChannels
  • commutateur de compatibilité : dangerouslyAllowNameMatching (bris de verre ; désactiver sauf en cas de besoin)
  • accès au channel : groupPolicy, channels.*, channels.*.users, channels.*.requireMention
  • threading/historique : replyToMode, replyToModeByChatType, thread.*, historyLimit, dmHistoryLimit, dms.*.historyLimit
  • livraison : textChunkLimit, chunkMode, mediaMaxMb, streaming, streaming.nativeTransport, streaming.preview.toolProgress
  • 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
  • opérations/fonctionnalités : configWrites, commands.native, slashCommand.*, actions.*, userToken, userTokenReadOnly
Pas de réponses dans les canaux
Vérifiez, dans l'ordre :
- `groupPolicy`
- 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).
{
messages: {
groupChat: {
visibleReplies: "automatic",
},
},
}
Commandes utiles :
Fenêtre de terminal
openclaw channels status --probe
openclaw logs --follow
openclaw doctor
DM messages ignored
Vérifiez :
- `channels.slack.dm.enabled`
- `channels.slack.dmPolicy` (ou l'ancien `channels.slack.dm.policy`)
- 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
openclaw pairing list slack
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 :

  • This channel is not allowed.
  • You are not authorized to use this command here.

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.

Type de médiaSourceComportement actuelRemarques
Images JPEG / PNG / GIF / WebPURL de fichier SlackTéléchargé et joint au tour pour un traitement capable de visionLimite par fichier : channels.slack.mediaMaxMb (par défaut 20 Mo)
Fichiers PDFURL de fichier SlackTéléchargé et exposé en tant que contexte de fichier pour les outils tels que download-file ou pdfSlack entrant ne convertit pas automatiquement les PDF en entrée de vision par image
Autres fichiersURL de fichier SlackTéléchargé si possible et exposé en tant que contexte de fichierLes fichiers binaires ne sont pas traités comme une entrée image
Réponses de fil de discussionFichiers de démarrage de filLes fichiers du message racine peuvent être hydratés en tant que contexte lorsque la réponse n’a pas de média directLes démarreurs composés uniquement de fichiers utilisent un espace réservé pour la pièce jointe
Messages multi-imagesFichiers Slack multiplesChaque fichier est évalué indépendammentLe traitement Slack est plafonné à huit fichiers par message

Lorsqu’un message Slack avec des pièces jointes de fichiers arrive :

  1. OpenClaw télécharge le fichier à partir de l’URL privée de Slack à l’aide du jeton du bot.
  2. Le fichier est écrit dans le magasin de médias en cas de succès.
  3. Les chemins et types de contenu des médias téléchargés sont ajoutés au contexte entrant.
  4. Les chemins de modèle/outil capables d’image peuvent utiliser les pièces jointes d’image à partir de ce contexte.
  5. Les fichiers non-image restent disponibles en tant que métadonnées de fichier ou références de médias pour les outils capables de les gérer.

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.

Lorsqu’un seul message Slack contient plusieurs fichiers joints :

  • Chaque pièce jointe est traitée indépendamment via le pipeline média.
  • Les références médias téléchargées sont agrégées dans le contexte du message.
  • L’ordre de traitement suit l’ordre des fichiers de Slack dans la charge utile de l’événement.
  • Un échec lors 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

Section intitulée « Limites de taille, de téléchargement et de modèle »
  • 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.
ScénarioComportement actuelSolution de contournement
URL de fichier Slack expiréeFichier ignoré ; aucune erreur affichéeTéléchargez à nouveau le fichier dans Slack
Modèle de vision non configuréLes pièces jointes d’images sont stockées sous forme de références médias, mais ne sont pas analysées en tant qu’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 en raison de la limite 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 mieux effortPartagez à nouveau directement dans le fil OpenClaw
Pièces jointes PDFStockées en tant que contexte fichier/média, non acheminées automatiquement via la vision par imageUtilisez download-file pour les métadonnées de fichier ou l’outil pdf pour l’analyse PDF
Pairing

Associer un utilisateur Slack à la passerelle.

Groups

Comportement des DM de groupe et de canal.

Channel routing

Acheminer les messages entrants vers les agents.

Security

Modèle de menace et durcissement.

Configuration

Disposition et priorité de la configuration.

Slash commands

Catalogue et comportement des commandes.