chore(i18n): refresh fr translations

This commit is contained in:
openclaw-docs-i18n[bot] 2026-05-04 07:08:34 +00:00
parent 4748ef0b96
commit 41efbd8e97
22 changed files with 4002 additions and 3695 deletions

File diff suppressed because it is too large Load Diff

View File

@ -1,47 +1,47 @@
---
read_when:
- Configuration de Slack ou débogage du mode socket/HTTP de Slack
summary: Configuration de Slack et comportement à lexécution (mode Socket + URL de requête HTTP)
- Configurer Slack ou déboguer le mode socket/HTTP de Slack
summary: Configuration de Slack et comportement à lexécution (mode Socket + URL de requêtes HTTP)
title: Slack
x-i18n:
generated_at: "2026-05-04T02:22:23Z"
generated_at: "2026-05-04T07:02:47Z"
model: gpt-5.5
provider: openai
source_hash: 2be45f03511a64373b1f4316c59800eeeef8baccb4c00454b49999258b2e546b
source_hash: d4a91fc1ae5f1e03f714308be54e164ef204809e74efabed8dc75c3035c14228
source_path: channels/slack.md
workflow: 16
---
Prêt pour la production pour les DM et les canaux via les intégrations dapplication Slack. Le mode par défaut est Socket Mode ; les URL de requête HTTP sont également prises en charge.
Prêt pour la production pour les MD et les canaux via les intégrations dapp Slack. Le mode par défaut est Socket Mode ; les URL de requête HTTP sont également prises en charge.
<CardGroup cols={3}>
<Card title="Pairing" icon="link" href="/fr/channels/pairing">
Les DM Slack utilisent le mode dassociation par défaut.
<Card title="Appairage" icon="link" href="/fr/channels/pairing">
Les MD Slack utilisent par défaut le mode dappairage.
</Card>
<Card title="Slash commands" icon="terminal" href="/fr/tools/slash-commands">
Comportement des commandes natives et catalogue des commandes.
<Card title="Commandes slash" icon="terminal" href="/fr/tools/slash-commands">
Comportement des commandes natives et catalogue de commandes.
</Card>
<Card title="Channel troubleshooting" icon="wrench" href="/fr/channels/troubleshooting">
Diagnostics inter-canaux et guides de réparation.
<Card title="Dépannage des canaux" icon="wrench" href="/fr/channels/troubleshooting">
Diagnostics intercanaux et procédures de réparation.
</Card>
</CardGroup>
## Configuration rapide
<Tabs>
<Tab title="Socket Mode (default)">
<Tab title="Socket Mode (par défaut)">
<Steps>
<Step title="Create a new Slack app">
Dans les paramètres de lapplication Slack, appuyez sur le bouton **[Create New App](https://api.slack.com/apps/new)** :
<Step title="Créer une nouvelle app Slack">
Dans les paramètres de lapp Slack, appuyez sur le bouton **[Create New App](https://api.slack.com/apps/new)** :
- choisissez **from a manifest** et sélectionnez un espace de travail pour votre application
- collez le [manifeste dexemple](#manifest-and-scope-checklist) ci-dessous et continuez pour créer
- choisissez **from a manifest** et sélectionnez un espace de travail pour votre app
- collez l[exemple de manifeste](#manifest-and-scope-checklist) ci-dessous et continuez pour créer
- générez un **App-Level Token** (`xapp-...`) avec `connections:write`
- installez lapplication et copiez le **Bot Token** (`xoxb-...`) affiché
- installez lapp et copiez le **Bot Token** (`xoxb-...`) affiché
</Step>
<Step title="Configure OpenClaw">
<Step title="Configurer OpenClaw">
Configuration SecretRef recommandée :
@ -64,7 +64,7 @@ openclaw config patch --file ./slack.socket.patch.json5 --dry-run
openclaw config patch --file ./slack.socket.patch.json5
```
Repli par variable denvironnement (compte par défaut uniquement) :
Solution de repli avec variables denvironnement (compte par défaut uniquement) :
```bash
SLACK_APP_TOKEN=xapp-...
@ -73,7 +73,7 @@ SLACK_BOT_TOKEN=xoxb-...
</Step>
<Step title="Start gateway">
<Step title="Démarrer le Gateway">
```bash
openclaw gateway
@ -84,19 +84,19 @@ openclaw gateway
</Tab>
<Tab title="HTTP Request URLs">
<Tab title="URL de requête HTTP">
<Steps>
<Step title="Create a new Slack app">
Dans les paramètres de lapplication Slack, appuyez sur le bouton **[Create New App](https://api.slack.com/apps/new)** :
<Step title="Créer une nouvelle app Slack">
Dans les paramètres de lapp Slack, appuyez sur le bouton **[Create New App](https://api.slack.com/apps/new)** :
- choisissez **from a manifest** et sélectionnez un espace de travail pour votre application
- collez le [manifeste dexemple](#manifest-and-scope-checklist) et mettez à jour les URL avant la création
- choisissez **from a manifest** et sélectionnez un espace de travail pour votre app
- collez l[exemple de manifeste](#manifest-and-scope-checklist) et mettez à jour les URL avant de créer
- enregistrez le **Signing Secret** pour la vérification des requêtes
- installez lapplication et copiez le **Bot Token** (`xoxb-...`) affiché
- installez lapp et copiez le **Bot Token** (`xoxb-...`) affiché
</Step>
<Step title="Configure OpenClaw">
<Step title="Configurer OpenClaw">
Configuration SecretRef recommandée :
@ -123,12 +123,12 @@ openclaw config patch --file ./slack.http.patch.json5
<Note>
Utilisez des chemins Webhook uniques pour le HTTP multicomptes
Attribuez à chaque compte un `webhookPath` distinct (`/slack/events` par défaut) afin que les enregistrements nentrent pas en conflit.
Donnez à chaque compte un `webhookPath` distinct (`/slack/events` par défaut) afin que les inscriptions nentrent pas en conflit.
</Note>
</Step>
<Step title="Start gateway">
<Step title="Démarrer le Gateway">
```bash
openclaw gateway
@ -142,7 +142,7 @@ openclaw gateway
## Réglage du transport Socket Mode
OpenClaw définit par défaut le délai dattente pong du client SDK Slack à 15 secondes pour Socket Mode. Ne remplacez les paramètres de transport que lorsque vous avez besoin dun réglage propre à lespace de travail ou à lhôte :
OpenClaw définit par défaut le délai dattente pong du client Slack SDK à 15 secondes pour Socket Mode. Remplacez les paramètres de transport uniquement lorsque vous avez besoin dun réglage propre à un espace de travail ou à un hôte :
```json5
{
@ -159,11 +159,11 @@ OpenClaw définit par défaut le délai dattente pong du client SDK Slack à
}
```
Utilisez cela uniquement pour les espaces de travail Socket Mode qui journalisent des délais dattente pong/websocket ou server-ping Slack, ou qui sexécutent sur des hôtes avec une famine connue de la boucle dévénements. `clientPingTimeout` est lattente du pong après que le SDK a envoyé un ping client ; `serverPingTimeout` est lattente des pings serveur Slack. Les messages et événements dapplication restent de létat applicatif, pas des signaux de vivacité du transport.
Utilisez cela uniquement pour les espaces de travail Socket Mode qui journalisent des délais dattente de pong websocket Slack ou de ping serveur, ou qui sexécutent sur des hôtes avec une famine connue de la boucle dévénements. `clientPingTimeout` est lattente du pong après lenvoi dun ping client par le SDK ; `serverPingTimeout` est lattente des pings serveur Slack. Les messages et événements de lapp restent un état applicatif, pas des signaux de disponibilité du transport.
## Liste de contrôle du manifeste et des portées
Le manifeste de base de lapplication Slack 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.
Le manifeste de base de lapp Slack 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) :
@ -240,7 +240,7 @@ Manifeste de base (Socket Mode par défaut) :
}
```
Pour le **mode URL de requête HTTP**, remplacez `settings` par la variante HTTP et ajoutez `url` à chaque commande slash. Une URL publique est requise :
Pour le **mode URL de requête HTTP**, remplacez `settings` par la variante HTTP et ajoutez `url` à chaque commande slash. URL publique requise :
```json
{
@ -282,24 +282,24 @@ Pour le **mode URL de requête HTTP**, remplacez `settings` par la variante HTTP
}
```
### Paramètres supplémentaires du manifeste
### Paramètres de manifeste supplémentaires
Exposez différentes fonctionnalités qui étendent les valeurs par défaut ci-dessus.
Exposez différentes fonctionnalités qui étendent les paramètres par défaut ci-dessus.
Le manifeste par défaut active longlet **Home** de Slack App Home et sabonne à `app_home_opened`. Lorsquun membre de lespace de travail ouvre longlet Home, OpenClaw publie une vue Home sûre par défaut avec `views.publish` ; aucune charge utile de conversation ni configuration privée nest incluse. Longlet **Messages** reste activé pour les DM Slack.
Le manifeste par défaut active longlet **Home** de Slack App Home et sabonne à `app_home_opened`. Lorsquun membre de lespace de travail ouvre longlet Home, OpenClaw publie une vue Home sûre par défaut avec `views.publish` ; aucune charge utile de conversation ni configuration privée nest incluse. Longlet **Messages** reste activé pour les MD Slack.
<AccordionGroup>
<Accordion title="Optional native slash commands">
<Accordion title="Commandes slash natives facultatives">
Plusieurs [commandes slash natives](#commands-and-slash-behavior) peuvent être utilisées à la place dune seule commande configurée, avec quelques nuances :
Plusieurs [commandes slash natives](#commands-and-slash-behavior) peuvent être utilisées au lieu dune seule commande configurée, avec certaines nuances :
- Utilisez `/agentstatus` au lieu de `/status`, car la commande `/status` est réservée.
- Pas plus de 25 commandes slash ne peuvent être rendues disponibles à la fois.
- Pas plus de 25 commandes slash peuvent être disponibles simultanément.
Remplacez votre section `features.slash_commands` existante par un sous-ensemble des [commandes disponibles](/fr/tools/slash-commands#command-list) :
<Tabs>
<Tab title="Socket Mode (default)">
<Tab title="Socket Mode (par défaut)">
```json
{
@ -422,7 +422,7 @@ Le manifeste par défaut active longlet **Home** de Slack App Home et sabo
```
</Tab>
<Tab title="HTTP Request URLs">
<Tab title="URL de requête HTTP">
Utilisez la même liste `slash_commands` que pour Socket Mode ci-dessus, et ajoutez `"url": "https://gateway-host.example.com/slack/events"` à chaque entrée. Exemple :
```json
@ -449,13 +449,13 @@ Le manifeste par défaut active longlet **Home** de Slack App Home et sabo
</Tabs>
</Accordion>
<Accordion title="Portées dauteur facultatives (opérations décriture)">
<Accordion title="Portées dattribution facultatives (opérations décriture)">
Ajoutez la portée de bot `chat:write.customize` si vous voulez que les messages sortants utilisent lidentité de lagent actif (nom dutilisateur et icône personnalisés) au lieu de lidentité par défaut de lapplication Slack.
Si vous utilisez une icône emoji, Slack attend la syntaxe `:emoji_name:`.
</Accordion>
<Accordion title="Portées facultatives de jeton utilisateur (opérations de lecture)">
<Accordion title="Portées facultatives du jeton utilisateur (opérations de lecture)">
Si vous configurez `channels.slack.userToken`, les portées de lecture typiques sont :
- `channels:history`, `groups:history`, `im:history`, `mpim:history`
@ -469,67 +469,67 @@ Le manifeste par défaut active longlet **Home** de Slack App Home et sabo
</Accordion>
</AccordionGroup>
## Modèle de jeton
## Modèle de jetons
- `botToken` + `appToken` sont requis pour le Socket Mode.
- 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 recours aux variables denvironnement.
- Le recours aux variables denvironnement `SLACK_BOT_TOKEN` / `SLACK_APP_TOKEN` sapplique uniquement au compte par défaut.
- `userToken` (`xoxp-...`) est uniquement configurable (aucun recours aux variables denvironnement) et utilise par défaut un comportement en lecture seule (`userTokenReadOnly: true`).
- `botToken` + `appToken` sont requis pour le mode Socket.
- Le mode HTTP requiert `botToken` + `signingSecret`.
- `botToken`, `appToken`, `signingSecret` et `userToken` acceptent les chaînes en texte clair
ou les objets SecretRef.
- Les jetons de configuration remplacent le repli env.
- Le repli env `SLACK_BOT_TOKEN` / `SLACK_APP_TOKEN` sapplique uniquement au compte par défaut.
- `userToken` (`xoxp-...`) est uniquement configurable (aucun repli env) et utilise par défaut un comportement en lecture seule (`userTokenReadOnly: true`).
Comportement de linstantané détat :
- Linspection des comptes Slack suit les champs `*Source` et `*Status`
par identifiant daccès (`botToken`, `appToken`, `signingSecret`, `userToken`).
- Linspection 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 dexécution actuel
ou une autre source de secret non inline, mais que le chemin de commande/dexécution actuel
na pas pu résoudre la valeur réelle.
- En mode HTTP, `signingSecretStatus` est inclus ; en Socket Mode, la
- En mode HTTP, `signingSecretStatus` est inclus ; en mode Socket, la
paire requise est `botTokenStatus` + `appTokenStatus`.
<Tip>
Pour les actions et les lectures dannuaire, le jeton utilisateur peut être préféré lorsquil 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.
Pour les actions/lectures de répertoire, le jeton utilisateur peut être préféré lorsquil 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.
</Tip>
## Actions et contrôles
## Actions et garde-fous
Les actions Slack sont contrôlées par `channels.slack.actions.*`.
Groupes dactions disponibles dans loutillage Slack actuel :
| Groupe | Par défaut |
| ---------- | ---------- |
| messages | activé |
| reactions | activé |
| pins | activé |
| memberInfo | activé |
| emojiList | activé |
| Groupe | Valeur par défaut |
| ---------- | ----------------- |
| messages | activé |
| reactions | activé |
| pins | activé |
| memberInfo | activé |
| emojiList | activé |
Les actions de message Slack actuelles incluent `send`, `upload-file`, `download-file`, `read`, `edit`, `delete`, `pin`, `unpin`, `list-pins`, `member-info` et `emoji-list`. `download-file` accepte les ID de fichiers Slack affichés dans les placeholders de fichiers entrants et renvoie des aperçus dimage pour les images ou des métadonnées de fichier local pour les autres types de fichiers.
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 placeholders de fichiers entrants et renvoie des aperçus dimage pour les images ou les métadonnées de fichier local pour les autres types de fichiers.
## Contrôle daccès et routage
<Tabs>
<Tab title="Politique de MP">
`channels.slack.dmPolicy` contrôle laccès aux MP. `channels.slack.allowFrom` est la liste dautorisation canonique des MP.
<Tab title="Politique de DM">
`channels.slack.dmPolicy` contrôle laccès aux DM. `channels.slack.allowFrom` est la liste dautorisation canonique des DM.
- `pairing` (par défaut)
- `allowlist`
- `open` (nécessite que `channels.slack.allowFrom` inclue `"*"`)
- `open` (requiert que `channels.slack.allowFrom` inclue `"*"`)
- `disabled`
Options de MP :
Indicateurs DM :
- `dm.enabled` (true par défaut)
- `channels.slack.allowFrom`
- `dm.allowFrom` (hérité)
- `dm.groupEnabled` (MP de groupe false par défaut)
- `dm.groupEnabled` (DM de groupe false par défaut)
- `dm.groupChannels` (liste dautorisation MPIM facultative)
Précédence multi-comptes :
Priorité multicomptes :
- `channels.slack.accounts.default.allowFrom` sapplique uniquement au compte `default`.
- Les comptes nommés héritent de `channels.slack.allowFrom` lorsque leur propre `allowFrom` nest pas défini.
@ -537,7 +537,7 @@ Les actions de message Slack actuelles incluent `send`, `upload-file`, `download
Les anciens `channels.slack.dm.policy` et `channels.slack.dm.allowFrom` sont toujours lus pour compatibilité. `openclaw doctor --fix` les migre vers `dmPolicy` et `allowFrom` lorsquil peut le faire sans modifier laccès.
Lassociation dans les MP utilise `openclaw pairing approve slack <code>`.
Lappairage dans les DM utilise `openclaw pairing approve slack <code>`.
</Tab>
@ -548,20 +548,20 @@ Les actions de message Slack actuelles incluent `send`, `upload-file`, `download
- `allowlist`
- `disabled`
La liste dautorisation des canaux se trouve sous `channels.slack.channels` et **doit utiliser des ID de canal Slack stables** (par exemple `C12345678`) comme clés de configuration.
La liste dautorisation des canaux se trouve sous `channels.slack.channels` et **doit utiliser des ID de canaux Slack stables** (par exemple `C12345678`) comme clés de configuration.
Note dexécution : si `channels.slack` est complètement absent (configuration uniquement par variables denvironnement), lexécution revient à `groupPolicy="allowlist"` et journalise un avertissement (même si `channels.defaults.groupPolicy` est défini).
Note dexécution : si `channels.slack` est totalement absent (configuration env uniquement), lexécution se rabat sur `groupPolicy="allowlist"` et journalise un avertissement (même si `channels.defaults.groupPolicy` est défini).
Résolution nom/ID :
- les entrées de liste dautorisation de canal et les entrées de liste dautorisation de MP sont résolues au démarrage lorsque laccès par jeton le permet
- les entrées de nom de canal non résolues sont conservées comme configurées, mais ignorées par défaut pour le routage
- lautorisation entrante et le routage des canaux sont centrés sur lID par défaut ; la correspondance directe par nom dutilisateur ou slug nécessite `channels.slack.dangerouslyAllowNameMatching: true`
- les entrées de liste dautorisation de canaux et les entrées de liste dautorisation de DM sont résolues au démarrage lorsque laccès au jeton le permet
- les entrées de noms de canaux non résolues sont conservées telles que configurées, mais ignorées par défaut pour le routage
- lautorisation entrante et le routage des canaux privilégient lID par défaut ; la correspondance directe par nom dutilisateur/slug requiert `channels.slack.dangerouslyAllowNameMatching: true`
<Warning>
Les clés basées sur le nom (`#channel-name` ou `channel-name`) ne correspondent **pas** avec `groupPolicy: "allowlist"`. La recherche de canal est centrée sur lID par défaut, donc une clé basée sur le nom ne sera jamais routée correctement et tous les messages de ce canal seront bloqués silencieusement. Cela diffère de `groupPolicy: "open"`, où la clé du canal nest pas requise pour le routage et où une clé basée sur le nom semble fonctionner.
Les clés basées sur le nom (`#channel-name` ou `channel-name`) ne correspondent **pas** sous `groupPolicy: "allowlist"`. La recherche de canal privilégie lID par défaut, donc une clé basée sur le nom ne sera jamais routée correctement et tous les messages dans ce canal seront bloqués silencieusement. Cela diffère de `groupPolicy: "open"`, où la clé de canal nest pas requise pour le routage et où une clé basée sur le nom semble fonctionner.
Utilisez toujours lID de canal Slack comme clé. Pour le trouver : faites un clic droit sur le canal dans Slack → **Copier le lien** — lID (`C...`) apparaît à la fin de lURL.
Utilisez toujours lID du canal Slack comme clé. Pour le trouver : faites un clic droit sur le canal dans Slack → **Copier le lien** — lID (`C...`) apparaît à la fin de lURL.
Correct :
@ -578,7 +578,7 @@ Les actions de message Slack actuelles incluent `send`, `upload-file`, `download
}
```
Incorrect (bloqué silencieusement avec `groupPolicy: "allowlist"`) :
Incorrect (bloqué silencieusement avec `groupPolicy: "allowlist"`):
```json5
{
@ -597,14 +597,14 @@ Les actions de message Slack actuelles incluent `send`, `upload-file`, `download
</Tab>
<Tab title="Mentions et utilisateurs de canal">
Les messages de canal sont soumis à une mention par défaut.
Les messages de canal sont soumis à une exigence de mention par défaut.
Sources de mention :
- mention explicite de lapplication (`<@botId>`)
- mention de groupe dutilisateurs Slack (`<!subteam^S...>`) lorsque lutilisateur bot est membre de ce groupe dutilisateurs ; nécessite `usergroups:read`
- motifs regex de mention (`agents.list[].groupChat.mentionPatterns`, recours à `messages.groupChat.mentionPatterns`)
- comportement implicite des fils répondant au bot (désactivé lorsque `thread.requireExplicitMention` vaut `true`)
- motifs regex de mention (`agents.list[].groupChat.mentionPatterns`, repli `messages.groupChat.mentionPatterns`)
- comportement implicite de fil en réponse au bot (désactivé lorsque `thread.requireExplicitMention` vaut `true`)
Contrôles par canal (`channels.slack.channels.<id>` ; noms uniquement via la résolution au démarrage ou `dangerouslyAllowNameMatching`) :
@ -614,30 +614,30 @@ Les actions de message Slack actuelles incluent `send`, `upload-file`, `download
- `skills`
- `systemPrompt`
- `tools`, `toolsBySender`
- format de clé `toolsBySender` : caractères génériques `id:`, `e164:`, `username:`, `name:` ou `"*"`
- format de clé `toolsBySender` : `id:`, `e164:`, `username:`, `name:`, ou caractère générique `"*"`
(les anciennes clés sans préfixe correspondent toujours uniquement à `id:`)
`allowBots` est conservateur pour les canaux et les canaux privés : les messages de salon rédigés par un bot ne sont acceptés que lorsque le bot expéditeur est explicitement répertorié dans la liste dautorisation `users` de ce salon, ou lorsquau moins un ID de propriétaire Slack explicite provenant de `channels.slack.allowFrom` est actuellement membre du salon. Les caractères génériques et les entrées de propriétaire par nom daffichage ne satisfont pas la présence du propriétaire. La présence du propriétaire utilise Slack `conversations.members` ; assurez-vous que lapplication dispose de la portée de lecture correspondante pour le type de salon (`channels:read` pour les canaux publics, `groups:read` pour les canaux privés). Si la recherche de membres échoue, OpenClaw abandonne le message de salon rédigé par un bot.
`allowBots` est conservateur pour les canaux et les canaux privés : les messages de salon rédigés par des bots sont acceptés uniquement lorsque le bot expéditeur est explicitement listé dans la liste dautorisation `users` de ce salon, ou lorsquau moins un ID de propriétaire Slack explicite provenant de `channels.slack.allowFrom` est actuellement membre du salon. Les caractères génériques et les entrées de propriétaire basées sur le nom daffichage ne satisfont pas la présence du propriétaire. La présence du propriétaire utilise Slack `conversations.members` ; assurez-vous que lapplication dispose du périmètre de lecture correspondant au type de salon (`channels:read` pour les canaux publics, `groups:read` pour les canaux privés). Si la recherche des membres échoue, OpenClaw ignore le message de salon rédigé par le bot.
</Tab>
</Tabs>
## Fils, sessions et balises de réponse
- Les MP sont routés comme `direct` ; les canaux comme `channel` ; les MPIM comme `group`.
- Les liaisons de route Slack acceptent les ID bruts de pair ainsi que les formes de cible Slack comme `channel:C12345678`, `user:U12345678` et `<@U12345678>`.
- Avec `session.dmScope=main` par défaut, les MP Slack sont regroupés dans la session principale de lagent.
- Les DM sont acheminés comme `direct` ; les canaux comme `channel` ; les MPIM comme `group`.
- Les liaisons de route Slack acceptent les ID de pairs bruts ainsi que les formes de cible Slack telles que `channel:C12345678`, `user:U12345678` et `<@U12345678>`.
- Avec la valeur par défaut `session.dmScope=main`, les DM Slack sont regroupés dans la session principale de lagent.
- Sessions de canal : `agent:<agentId>:slack:channel:<channelId>`.
- Les réponses de fil peuvent créer des suffixes de session de fil (`:thread:<threadTs>`) le cas échéant.
- La valeur par défaut de `channels.slack.thread.historyScope` est `thread` ; la valeur par défaut de `thread.inheritParent` est `false`.
- Les réponses dans un fil peuvent créer des suffixes de session de fil (`:thread:<threadTs>`) le cas échéant.
- La valeur par défaut de `channels.slack.thread.historyScope` est `thread` ; celle de `thread.inheritParent` est `false`.
- `channels.slack.thread.initialHistoryLimit` contrôle combien de messages de fil existants sont récupérés lorsquune nouvelle session de fil démarre (par défaut `20` ; définissez `0` pour désactiver).
- `channels.slack.thread.requireExplicitMention` (par défaut `false`) : lorsque `true`, supprime les mentions implicites dans les fils afin que le bot ne réponde quaux mentions explicites `@bot` dans les fils, même lorsque le bot a déjà participé au fil. Sans cela, les réponses dans un fil auquel le bot a participé contournent le contrôle `requireMention`.
- `channels.slack.thread.requireExplicitMention` (par défaut `false`) : lorsque défini sur `true`, supprime les mentions implicites dans les fils afin que le bot réponde uniquement aux mentions explicites `@bot` dans les fils, même lorsque le bot a déjà participé au fil. Sans cela, les réponses dans un fil auquel le bot a participé contournent le contrôle `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`
- recours hérité pour les conversations directes : `channels.slack.dm.replyToMode`
- repli hérité pour les conversations directes : `channels.slack.dm.replyToMode`
Les balises de réponse manuelles sont prises en charge :
@ -645,7 +645,7 @@ Les balises de réponse manuelles sont prises en charge :
- `[[reply_to:<id>]]`
<Note>
`replyToMode="off"` désactive **tous** les fils de réponse dans Slack, y compris les balises explicites `[[reply_to_*]]`. Cela diffère de Telegram, où les balises explicites sont toujours honorées en mode `"off"`. Les fils Slack masquent les messages du canal, tandis que les réponses Telegram restent visibles en ligne.
`replyToMode="off"` désactive **tous** les fils de réponse dans Slack, y compris les balises explicites `[[reply_to_*]]`. Cela diffère de Telegram, où les balises explicites restent honorées en mode `"off"`. Les fils Slack masquent les messages du canal, tandis que les réponses Telegram restent visibles en ligne.
</Note>
## Réactions daccusé de réception
@ -657,33 +657,52 @@ Ordre de résolution :
- `channels.slack.accounts.<accountId>.ackReaction`
- `channels.slack.ackReaction`
- `messages.ackReaction`
- recours à lemoji de lidentité de lagent (`agents.list[].identity.emoji`, sinon "👀")
- repli sur lemoji didentité de lagent (`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 du texte
## Diffusion de texte en continu
`channels.slack.streaming` contrôle le comportement daperçu en direct :
`channels.slack.streaming` contrôle le comportement de laperçu en direct :
- `off` : désactiver la diffusion daperçu en direct.
- `off` : désactiver la diffusion de laperçu en direct.
- `partial` (par défaut) : remplacer le texte daperçu par la dernière sortie partielle.
- `block` : ajouter des mises à jour daperçu par fragments.
- `progress` : afficher le texte détat de progression pendant la génération, puis envoyer le texte final.
- `streaming.preview.toolProgress` : lorsque laperçu de brouillon est actif, router les mises à jour doutil/progression vers le même message daperçu modifié (par défaut : `true`). Définissez `false` pour conserver des messages doutil/progression séparés.
- `progress` : afficher un texte détat de progression pendant la génération, puis envoyer le texte final.
- `streaming.preview.toolProgress` : lorsque laperçu de brouillon est actif, acheminer les mises à jour doutil/de progression vers le même message daperçu modifié (par défaut : `true`). Définissez `false` pour conserver des messages doutil/de progression séparés.
- `streaming.preview.commandText` / `streaming.progress.commandText` : définir sur `status` pour conserver des lignes compactes de progression doutil tout en masquant le texte brut de commande/dexécution (par défaut : `raw`).
`channels.slack.streaming.nativeTransport` contrôle la diffusion de texte native Slack lorsque `channels.slack.streaming.mode` vaut `partial` (par défaut : `true`).
Masquer le texte brut de commande/dexécution tout en conservant des lignes compactes de progression :
- Un fil de réponse doit être disponible pour que la diffusion de texte native et létat de fil dassistant Slack apparaissent. La sélection du fil suit toujours `replyToMode`.
- Les canaux, les discussions de groupe et les racines de MP de premier niveau peuvent toujours utiliser laperçu de brouillon normal lorsque la diffusion native est indisponible ou quaucun fil de réponse nexiste.
- Les MP Slack de premier niveau restent hors fil par défaut ; ils naffichent donc pas laperçu de flux/état natif de style fil de Slack ; OpenClaw publie et modifie plutôt un aperçu de brouillon dans le MP.
```json
{
"channels": {
"slack": {
"streaming": {
"mode": "progress",
"progress": {
"toolProgress": true,
"commandText": "status"
}
}
}
}
}
```
`channels.slack.streaming.nativeTransport` contrôle la diffusion native de texte Slack lorsque `channels.slack.streaming.mode` vaut `partial` (par défaut : `true`).
- Un fil de réponse doit être disponible pour que la diffusion native de texte et létat de fil de lassistant Slack apparaissent. La sélection du fil suit toujours `replyToMode`.
- Les racines de canaux, de conversations de groupe et de DM de premier niveau peuvent toujours utiliser laperçu de brouillon normal lorsque la diffusion native est indisponible ou quaucun fil de réponse nexiste.
- Les DM Slack de premier niveau restent hors fil par défaut ; ils naffichent donc pas laperçu de diffusion/é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 résultats finaux de média/erreur annulent les modifications daperçu en attente ; les résultats finaux de texte/bloc admissibles ne sont envoyés que lorsquils peuvent modifier laperçu sur place.
- Les finaux média/erreur annulent les modifications daperçu en attente ; les finaux texte/bloc éligibles ne sont vidés que lorsquils peuvent modifier laperçu en place.
- Si la diffusion échoue au milieu dune réponse, OpenClaw revient à la livraison normale pour les charges utiles restantes.
Utilisez laperçu de brouillon au lieu de la diffusion de texte native Slack :
Utiliser laperçu de brouillon au lieu de la diffusion native de texte Slack :
```json5
{
@ -698,15 +717,15 @@ Utilisez laperçu de brouillon au lieu de la diffusion de texte native Slack
}
```
Anciennes clés :
Clés héritées :
- `channels.slack.streamMode` (`replace | status_final | append`) est migré automatiquement vers `channels.slack.streaming.mode`.
- le booléen `channels.slack.streaming` est migré automatiquement vers `channels.slack.streaming.mode` et `channels.slack.streaming.nativeTransport`.
- lancien `channels.slack.nativeStreaming` est migré automatiquement vers `channels.slack.streaming.nativeTransport`.
- `channels.slack.streamMode` (`replace | status_final | append`) est automatiquement migré vers `channels.slack.streaming.mode`.
- le booléen `channels.slack.streaming` est automatiquement migré vers `channels.slack.streaming.mode` et `channels.slack.streaming.nativeTransport`.
- lancien `channels.slack.nativeStreaming` est automatiquement migré vers `channels.slack.streaming.nativeTransport`.
## Recours par réaction de saisie
## Repli de réaction de saisie
`typingReaction` ajoute une réaction temporaire au message Slack entrant pendant quOpenClaw traite une réponse, puis la supprime lorsque lexécution se termine. Cest particulièrement utile en dehors des réponses de fil, qui utilisent un indicateur détat par défaut "est en train décrire...".
`typingReaction` ajoute une réaction temporaire au message Slack entrant pendant quOpenClaw traite une réponse, puis la retire lorsque lexécution se termine. Cest surtout utile en dehors des réponses de fil, qui utilisent un indicateur détat par défaut « is typing... ».
Ordre de résolution :
@ -716,42 +735,42 @@ Ordre de résolution :
Notes :
- Slack attend des shortcodes (par exemple `"hourglass_flowing_sand"`).
- La réaction est appliquée au mieux, et le nettoyage est tenté automatiquement une fois le chemin de réponse ou déchec terminé.
- La réaction est appliquée au mieux et le nettoyage est tenté automatiquement une fois le chemin de réponse ou déchec terminé.
## Médias, découpage en fragments et livraison
## Médias, découpage et livraison
<AccordionGroup>
<Accordion title="Pièces jointes entrantes">
Les pièces jointes 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 espaces réservés de fichier incluent le `fileId` Slack afin que les agents puissent récupérer le fichier dorigine avec `download-file`.
<Accordion title="Inbound attachments">
Les pièces jointes de fichier Slack sont téléchargées depuis les URL privées hébergées par Slack (flux de requête authentifiée 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 original avec `download-file`.
Les téléchargements utilisent des délais dexpiration bornés pour linactivité et la durée totale. Si la récupération de fichier Slack se bloque ou échoue, OpenClaw continue de traiter le message et revient à lespace réservé du fichier.
Les téléchargements utilisent des délais dinactivité et totaux bornés. Si la récupération de fichier Slack se bloque ou échoue, OpenClaw continue à traiter le message et se rabat sur le placeholder de fichier.
La limite de taille entrante à lexécution est par défaut de `20MB`, sauf remplacement par `channels.slack.mediaMaxMb`.
Le plafond de taille entrante à lexécution vaut par défaut `20MB`, sauf sil est remplacé par `channels.slack.mediaMaxMb`.
</Accordion>
<Accordion title="Texte et fichiers sortants">
<Accordion title="Outbound text and files">
- les fragments de texte utilisent `channels.slack.textChunkLimit` (4000 par défaut)
- `channels.slack.chunkMode="newline"` active un découpage donnant la priorité aux paragraphes
- les envois de fichiers utilisent les API dimport Slack et peuvent inclure des réponses de fil (`thread_ts`)
- la limite de médias sortants suit `channels.slack.mediaMaxMb` lorsquelle est configurée ; sinon, les envois de canal utilisent les valeurs par défaut par type MIME du pipeline de médias
- les envois de fichiers utilisent les API de téléversement Slack et peuvent inclure des réponses de fil (`thread_ts`)
- le plafond de médias sortants suit `channels.slack.mediaMaxMb` lorsquil est configuré ; sinon les envois de canal utilisent les valeurs par défaut par type MIME du pipeline média
</Accordion>
<Accordion title="Cibles de livraison">
<Accordion title="Delivery targets">
Cibles explicites préférées :
- `user:<id>` pour les messages directs
- `user:<id>` pour les DM
- `channel:<id>` pour les canaux
Les messages directs Slack contenant uniquement du texte ou des blocs peuvent être publiés directement vers des identifiants utilisateur ; les imports de fichiers et les envois en fil ouvrent dabord le message direct via les API de conversation Slack, car ces chemins nécessitent un identifiant de conversation concret.
Les DM Slack contenant uniquement du texte ou des blocs peuvent publier directement vers des ID utilisateur ; les téléversements de fichiers et les envois dans des fils ouvrent dabord le DM via les API de conversation Slack, car ces chemins nécessitent un ID de conversation concret.
</Accordion>
</AccordionGroup>
## Commandes et comportement des commandes slash
## 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 :
Les commandes slash apparaissent dans Slack soit comme une commande configurée unique, soit comme plusieurs commandes natives. Configurez `channels.slack.slashCommand` pour modifier les valeurs par défaut des commandes :
- `enabled: false`
- `name: "openclaw"`
@ -762,30 +781,30 @@ Les commandes slash apparaissent dans Slack soit comme une seule commande config
/openclaw /help
```
Les commandes natives nécessitent des [paramètres de manifeste supplémentaires](#additional-manifest-settings) dans votre application Slack et sont plutôt activées avec `channels.slack.commands.native: true` ou `commands.native: true` dans les configurations globales.
Les commandes natives nécessitent des [paramètres de manifeste supplémentaires](#additional-manifest-settings) 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"` nactive pas les commandes natives Slack.
- Le mode automatique des commandes natives est **désactivé** pour Slack ; `commands.native: "auto"` nactive donc pas les commandes natives Slack.
```txt
/help
```
Les menus darguments natifs utilisent une stratégie de rendu adaptative qui affiche une fenêtre modale de confirmation avant de distribuer la valeur doption sélectionnée :
Les menus darguments natifs utilisent une stratégie de rendu adaptative qui affiche une fenêtre modale de confirmation avant de distribuer une valeur doption 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 des gestionnaires doptions dinteractivité sont disponibles
- limites Slack dépassées : les valeurs doption encodées reviennent à des boutons
- plus de 100 options : sélection externe avec filtrage asynchrone des options lorsque les gestionnaires doptions dinteractivité sont disponibles
- limites Slack dépassées : les valeurs doption encodées se rabattent sur des boutons
```txt
/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 à laide de `CommandTargetSessionKey`.
Les sessions slash utilisent des clés isolées comme `agent:<agentId>:slack:slash:<userId>` et acheminent toujours les exécutions de commandes vers la session de conversation cible avec `CommandTargetSessionKey`.
## Réponses interactives
Slack peut afficher des contrôles de réponse interactifs rédigés par lagent, mais cette fonctionnalité est désactivée par défaut.
Slack peut afficher des contrôles de réponse interactive rédigés par lagent, mais cette fonctionnalité est désactivée par défaut.
Activez-la globalement :
@ -819,44 +838,44 @@ Ou activez-la pour un seul compte Slack :
}
```
Lorsquelle est activée, les agents peuvent émettre des directives de réponse propres à Slack :
Une fois 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 sont compilées en Slack Block Kit et routent les clics ou les sélections via le chemin dévénements dinteraction Slack existant.
Ces directives sont compilées en Slack Block Kit et réacheminent les clics ou sélections via le chemin dévénement dinteraction Slack existant.
Remarques :
Notes :
- Il sagit dune interface propre à Slack. Les autres canaux ne traduisent pas les directives Slack Block Kit dans 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 rédigées par lagent.
- Si les blocs interactifs générés dépassaient les limites de Slack Block Kit, OpenClaw revient à la réponse textuelle dorigine au lieu denvoyer une charge utile de blocs invalide.
- Les valeurs de rappel interactives sont des jetons opaques générés par OpenClaw, et non des valeurs brutes rédigées par lagent.
- Si les blocs interactifs générés dépassaient les limites de Slack Block Kit, OpenClaw se rabat sur la réponse textuelle originale au lieu denvoyer une charge utile de blocs invalide.
## Approbations dexécution dans Slack
Slack peut agir comme client dapprobation natif avec des boutons et interactions interactifs, au lieu de revenir à linterface web ou au terminal.
Slack peut agir comme client dapprobation natif avec des boutons et interactions interactifs, au lieu de se rabattre sur linterface Web ou le terminal.
- Les approbations dexécution utilisent `channels.slack.execApprovals.*` pour le routage natif des messages directs/canaux.
- Les approbations de Plugin peuvent toujours se résoudre via la même surface de boutons native Slack lorsque la demande arrive déjà dans Slack et que le type didentifiant dapprobation est `plugin:`.
- Lautorisation de lapprobateur reste appliquée : seuls les utilisateurs identifiés comme approbateurs peuvent approuver ou refuser des demandes via Slack.
- Les approbations dexécution utilisent `channels.slack.execApprovals.*` pour le routage DM/canal natif.
- Les approbations de Plugin peuvent toujours se résoudre via la même surface de boutons native Slack lorsque la requête arrive déjà dans Slack et que le type dID dapprobation est `plugin:`.
- Lautorisation des approbateurs reste 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 dapprobation que les autres canaux. Lorsque `interactivity` est activé dans les paramètres de votre application Slack, les invites dapprobation saffichent sous forme de boutons Block Kit directement dans la conversation.
Lorsque ces boutons sont présents, ils constituent lexpérience dapprobation principale ; OpenClaw
ne doit inclure une commande manuelle `/approve` que lorsque le résultat de loutil indique que les
approbations par chat sont indisponibles ou que lapprobation manuelle est le seul chemin.
Cela utilise la même surface partagée de boutons dapprobation que les autres canaux. Lorsque `interactivity` est activé dans les paramètres de votre application Slack, les invites dapprobation saffichent comme des boutons Block Kit directement dans la conversation.
Lorsque ces boutons sont présents, ils constituent lUX dapprobation principale ; OpenClaw
ne doit inclure une commande `/approve` manuelle que lorsque le résultat de loutil indique que les approbations
par chat sont indisponibles ou que lapprobation manuelle est le seul chemin.
Chemin de configuration :
- `channels.slack.execApprovals.enabled`
- `channels.slack.execApprovals.approvers` (facultatif ; revient à `commands.ownerAllowFrom` lorsque possible)
- `channels.slack.execApprovals.target` (`dm` | `channel` | `both`, par défaut : `dm`)
- `channels.slack.execApprovals.approvers` (facultatif ; se rabat sur `commands.ownerAllowFrom` lorsque possible)
- `channels.slack.execApprovals.target` (`dm` | `channel` | `both`, valeur par défaut : `dm`)
- `agentFilter`, `sessionFilter`
Slack active automatiquement les approbations dexécution natives lorsque `enabled` nest pas défini ou vaut `"auto"` et quau moins un
approbateur est résolu. Définissez `enabled: false` pour désactiver explicitement Slack comme client dapprobation natif.
Définissez `enabled: true` pour forcer lactivation des approbations natives lorsque des approbateurs sont résolus.
Définissez `enabled: true` pour forcer les approbations natives lorsque des approbateurs sont résolus.
Comportement par défaut sans configuration explicite des approbations dexécution Slack :
Comportement par défaut sans configuration explicite dapprobation dexécution Slack :
```json5
{
@ -866,8 +885,8 @@ Comportement par défaut sans configuration explicite des approbations dexéc
}
```
Une configuration native Slack explicite nest nécessaire que lorsque vous souhaitez remplacer les approbateurs, ajouter des filtres ou
opter pour la livraison vers le chat dorigine :
La configuration native Slack explicite nest nécessaire que lorsque vous souhaitez remplacer les approbateurs, ajouter des filtres ou
opter pour la livraison dans le chat dorigine :
```json5
{
@ -883,35 +902,35 @@ opter pour la livraison vers le chat dorigine :
}
```
Le transfert partagé `approvals.exec` est séparé. Utilisez-le uniquement lorsque les invites dapprobation dexécution doivent aussi
être routées vers dautres 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 demandes arrivent déjà
Le transfert partagé `approvals.exec` est distinct. Utilisez-le uniquement lorsque les invites dapprobation dexécution doivent aussi
être routées vers dautres chats ou des cibles hors bande explicites. Le transfert partagé `approvals.plugin` est également
distinct ; les boutons natifs Slack peuvent toujours résoudre les approbations de Plugin lorsque ces requêtes arrivent déjà
dans Slack.
La commande `/approve` dans le même chat fonctionne également dans les canaux et messages directs Slack qui prennent déjà en charge les commandes. Consultez [Approbations dexécution](/fr/tools/exec-approvals) pour le modèle complet de transfert des approbations.
`/approve` dans le même chat fonctionne aussi dans les canaux Slack et les DM qui prennent déjà en charge les commandes. Consultez [Approbations dexécution](/fr/tools/exec-approvals) pour le modèle complet de transfert dapprobation.
## Événements et comportement opérationnel
- Les modifications/suppressions de messages sont mappées en événements système.
- Les diffusions de fil (réponses de fil « Envoyer aussi au canal ») sont traitées comme des messages utilisateur normaux.
- Les événements dajout/suppression de réactions sont mappés en événements système.
- Les événements darrivée/départ de membres, de création/renommage de canal et dajout/suppression dépingles sont mappés en événements système.
- Les modifications/suppressions de messages sont mappées vers des événements système.
- Les diffusions de fil (réponses de fil « Also send to channel ») sont traitées comme des messages utilisateur normaux.
- Les événements dajout/retrait de réaction sont mappés vers des événements système.
- Les événements darrivée/départ de membre, de création/renommage de canal et dajout/retrait 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 du contexte non approuvé et peuvent être injectées dans le contexte de routage.
- Lamorçage du contexte de démarreur de fil et dhistorique initial de fil est filtré par les listes dautorisation dexpéditeurs configurées, le cas échéant.
- Les actions de blocs et les interactions de modales émettent des événements système structurés `Slack interaction: ...` avec des champs de charge utile riches :
- actions de blocs : valeurs sélectionnées, libellés, valeurs de sélecteur et métadonnées `workflow_*`
- événements de modale `view_submission` et `view_closed` avec métadonnées de canal routées et entrées de formulaire
- Les métadonnées de sujet/objectif de canal sont traitées comme du contexte non fiable et peuvent être injectées dans le contexte de routage.
- Le démarrage de fil et lamorçage du contexte dhistorique initial de fil sont filtrés par les listes dautorisation dexpéditeurs configurées lorsquelles sappliquent.
- Les actions de bloc et les interactions modales émettent des événements système structurés `Slack interaction: ...` avec des champs de charge utile riches :
- actions de bloc : valeurs sélectionnées, libellés, valeurs de sélecteur et métadonnées `workflow_*`
- événements modaux `view_submission` et `view_closed` 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](/fr/gateway/config-channels#slack).
<Accordion title="Champs Slack à fort signal">
<Accordion title="High-signal Slack fields">
- mode/authentification : `mode`, `botToken`, `appToken`, `signingSecret`, `webhookPath`, `accounts.*`
- accès aux messages directs : `dm.enabled`, `dmPolicy`, `allowFrom` (héritage : `dm.policy`, `dm.allowFrom`), `dm.groupEnabled`, `dm.groupChannels`
- bascule de compatibilité : `dangerouslyAllowNameMatching` (solution durgence ; laissez désactivé sauf nécessité)
- accès DM : `dm.enabled`, `dmPolicy`, `allowFrom` (hérité : `dm.policy`, `dm.allowFrom`), `dm.groupEnabled`, `dm.groupChannels`
- bascule de compatibilité : `dangerouslyAllowNameMatching` (option durgence ; gardez-la désactivée sauf nécessité)
- accès aux canaux : `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`
@ -922,13 +941,13 @@ Référence principale : [Référence de configuration - Slack](/fr/gateway/conf
## Dépannage
<AccordionGroup>
<Accordion title="Aucune réponse dans les canaux">
<Accordion title="No replies in channels">
Vérifiez, dans lordre :
- `groupPolicy`
- liste dautorisation des canaux (`channels.slack.channels`) — **les clés doivent être des identifiants de canal** (`C12345678`), pas des noms (`#channel-name`). Les clés fondées sur les noms échouent silencieusement avec `groupPolicy: "allowlist"`, car le routage de canal utilise dabord les identifiants par défaut. Pour trouver un identifiant : faites un clic droit sur le canal dans Slack → **Copier le lien** — la valeur `C...` à la fin de lURL est lidentifiant du canal.
- liste dautorisation de 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 le nom échouent silencieusement sous `groupPolicy: "allowlist"` parce que le routage de canal privilégie les ID par défaut. Pour trouver un ID : faites un clic droit sur le canal dans Slack → **Copy link** — la valeur `C...` à la fin de lURL est lID du canal.
- `requireMention`
- liste dautorisation `users` propre au canal
- liste dautorisation `users` par canal
Commandes utiles :
@ -940,13 +959,13 @@ openclaw doctor
</Accordion>
<Accordion title="Messages directs ignorés">
<Accordion title="DM messages ignored">
Vérifiez :
- `channels.slack.dm.enabled`
- `channels.slack.dmPolicy` (ou lhéritage `channels.slack.dm.policy`)
- approbations dassociation / entrées de liste dautorisation
- Événements de message direct de lassistant Slack : les journaux détaillés mentionnant `drop message_changed`
- `channels.slack.dmPolicy` (ou lancien `channels.slack.dm.policy`)
- approbations dappairage / entrées de liste dautorisation
- É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
@ -956,8 +975,8 @@ openclaw pairing list slack
</Accordion>
<Accordion title="Le mode socket ne se connecte pas">
Validez les jetons de bot et dapplication ainsi que lactivation du Socket Mode dans les paramètres de lapplication Slack.
<Accordion title="Socket mode not connecting">
Validez les jetons bot + app et lactivation de Socket Mode dans les paramètres de lapplication Slack.
Si `openclaw channels status --probe --json` affiche `botTokenStatus` ou
`appTokenStatus: "configured_unavailable"`, le compte Slack est
@ -965,69 +984,69 @@ openclaw pairing list slack
</Accordion>
<Accordion title="Le mode HTTP ne reçoit pas les événements">
<Accordion title="HTTP mode not receiving events">
Validez :
- le secret de signature
- le chemin Webhook
- les URL de requête Slack (événements + interactivité + commandes slash)
- un `webhookPath` unique par compte HTTP
- `webhookPath` unique par compte HTTP
Si `signingSecretStatus: "configured_unavailable"` apparaît dans les
instantanés de compte, le compte HTTP est configuré, mais lexécution actuelle na pas pu
Si `signingSecretStatus: "configured_unavailable"` apparaît dans les instantanés de compte,
le compte HTTP est configuré, mais lexécution actuelle na pas pu
résoudre le secret de signature adossé à SecretRef.
</Accordion>
<Accordion title="Les commandes natives/slash ne se déclenchent pas">
Vérifiez ce que vous aviez lintention dutiliser :
<Accordion title="Native/slash commands not firing">
Vérifiez ce que 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`)
- mode de commande native (`channels.slack.commands.native: true`) avec des commandes slash correspondantes enregistrées dans Slack
- ou mode de commande slash unique (`channels.slack.slashCommand.enabled: true`)
Vérifiez également `commands.useAccessGroups` ainsi que les listes dautorisation de canaux/utilisateurs.
Vérifiez également `commands.useAccessGroups` et les listes dautorisation de canal/utilisateur.
</Accordion>
</AccordionGroup>
## Référence de vision pour les pièces jointes
## Référence de vision des pièces jointes
Slack peut joindre les médias téléchargés au tour de lagent 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 directement vers un modèle de réponse compatible vision ; les autres fichiers sont conservés comme contexte de fichier téléchargeable plutôt que traités comme entrée image.
Slack peut joindre les médias téléchargés au tour de lagent 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 directement vers 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édia | Source | Comportement actuel | Notes |
| ------------------------------ | -------------------- | -------------------------------------------------------------------------------- | ------------------------------------------------------------------------- |
| Images JPEG / PNG / GIF / WebP | URL de fichier Slack | Téléchargées et jointes au tour pour une gestion compatible avec la vision | Limite par fichier : `channels.slack.mediaMaxMb` (20 Mo par défaut) |
| Fichiers PDF | URL de fichier Slack | Téléchargés et exposés comme contexte de fichier pour des outils comme `download-file` ou `pdf` | Le flux entrant Slack ne convertit pas automatiquement les PDF en entrée de vision dimage |
| Autres fichiers | URL de fichier Slack | Téléchargés lorsque possible et exposés comme contexte de fichier | Les fichiers binaires ne sont pas traités comme entrée dimage |
| Réponses de fil | Fichiers du message initial du fil | Les fichiers du message racine peuvent être hydratés comme contexte lorsque la réponse na aucun média direct | Les messages initiaux contenant uniquement des fichiers utilisent un espace réservé de pièce jointe |
| Messages multi-images | Plusieurs fichiers Slack | Chaque fichier est évalué indépendamment | Le traitement Slack est limité à huit fichiers par message |
| Type de média | Source | Comportement actuel | Notes |
| ------------------------------ | -------------------- | --------------------------------------------------------------------------------- | ------------------------------------------------------------------------- |
| Images JPEG / PNG / GIF / WebP | URL de fichier Slack | Téléchargées et jointes au tour pour une prise en charge compatible avec la vision | Limite par fichier : `channels.slack.mediaMaxMb` (par défaut 20 Mo) |
| Fichiers PDF | URL de fichier Slack | Téléchargés et exposés comme contexte de fichier pour des outils tels que `download-file` ou `pdf` | Lentrée Slack ne convertit pas automatiquement les PDF en entrée de vision dimage |
| Autres fichiers | URL de fichier Slack | Téléchargés lorsque cest possible et exposés comme contexte de fichier | Les fichiers binaires ne sont pas traités comme entrée dimage |
| Réponses de fil | Fichiers du message initial du fil | Les fichiers du message racine peuvent être hydratés comme contexte lorsque la réponse na pas de média direct | Les messages initiaux ne contenant que des fichiers utilisent un placeholder de pièce jointe |
| Messages multi-images | Plusieurs fichiers Slack | Chaque fichier est évalué indépendamment | Le traitement Slack est limité à huit fichiers par message |
### Pipeline entrant
Lorsquun message Slack avec des pièces jointes de fichier arrive :
1. OpenClaw télécharge le fichier depuis lURL privée de Slack à laide du jeton du bot (`xoxb-...`).
2. Le fichier est écrit dans le stockage média en cas de succès.
1. OpenClaw télécharge le fichier depuis lURL privée de Slack à laide du token de bot (`xoxb-...`).
2. Le fichier est écrit dans le stockage des 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èle ou doutil compatibles avec les images peuvent utiliser les pièces jointes dimage de 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 gérer.
4. Les chemins de modèle/outil compatibles avec limage peuvent utiliser les pièces jointes dimage 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 de la racine du fil
Lorsquun message arrive dans un fil (avec un parent `thread_ts`) :
- Si la réponse elle-même na aucun média direct et que le message racine inclus contient des fichiers, Slack peut hydrater les fichiers racine comme contexte du message initial 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.
- Si la réponse elle-même na pas de média direct et que le message racine inclus contient des fichiers, Slack peut hydrater les fichiers racine comme contexte du message initial du fil.
- Les pièces jointes directes de la réponse sont prioritaires 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 placeholder de pièce jointe afin que le fallback puisse toujours inclure ses fichiers.
### Gestion de plusieurs pièces jointes
Lorsquun 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 média téléchargées sont agrégées dans le contexte du message.
- Les références des médias téléchargés sont agrégées dans le contexte du message.
- Lordre de traitement suit lordre des fichiers Slack dans la charge utile de lévénement.
- Léchec du téléchargement dune pièce jointe ne bloque pas les autres.
@ -1039,13 +1058,13 @@ Lorsquun seul message Slack contient plusieurs pièces jointes de fichier :
### Limites connues
| Scénario | Comportement actuel | Solution de contournement |
| Scénario | Comportement actuel | Solution de contournement |
| -------------------------------------- | ---------------------------------------------------------------------------- | -------------------------------------------------------------------------- |
| URL de fichier Slack expirée | Fichier ignoré ; aucune erreur affichée | Retéléverser le fichier dans Slack |
| URL de fichier Slack expirée | Fichier ignoré ; aucune erreur affichée | Téléverser à nouveau le fichier dans Slack |
| Modèle de vision non configuré | Les pièces jointes dimage sont stockées comme références média, mais ne sont pas analysées comme images | Configurer `agents.defaults.imageModel` ou utiliser un modèle de réponse compatible avec la vision |
| Images très volumineuses (> 20 Mo par défaut) | Ignorées selon la limite de taille | Augmenter `channels.slack.mediaMaxMb` si Slack lautorise |
| Pièces jointes transférées/partagées | Le texte et les médias image/fichier hébergés par Slack sont traités au mieux | Repartager directement dans le fil OpenClaw |
| Pièces jointes PDF | Stockées comme contexte fichier/média, sans routage automatique par la vision dimage | Utiliser `download-file` pour les métadonnées de fichier ou loutil `pdf` pour lanalyse PDF |
| Images très volumineuses (> 20 Mo par défaut) | Ignorées selon la limite de taille | Augmenter `channels.slack.mediaMaxMb` si Slack lautorise |
| Pièces jointes transférées/partagées | Le texte et les médias image/fichier hébergés par Slack sont traités au mieux | Repartager directement dans le fil OpenClaw |
| Pièces jointes PDF | Stockées comme contexte de fichier/média, sans routage automatique via la vision dimage | Utiliser `download-file` pour les métadonnées de fichier ou loutil `pdf` pour lanalyse PDF |
### Documentation associée
@ -1058,22 +1077,22 @@ Lorsquun seul message Slack contient plusieurs pièces jointes de fichier :
## Associé
<CardGroup cols={2}>
<Card title="Appairage" icon="link" href="/fr/channels/pairing">
<Card title="Pairing" icon="link" href="/fr/channels/pairing">
Associer un utilisateur Slack au Gateway.
</Card>
<Card title="Groupes" icon="users" href="/fr/channels/groups">
<Card title="Groups" icon="users" href="/fr/channels/groups">
Comportement des canaux et des MP de groupe.
</Card>
<Card title="Routage des canaux" icon="route" href="/fr/channels/channel-routing">
Acheminer les messages entrants vers les agents.
<Card title="Channel routing" icon="route" href="/fr/channels/channel-routing">
Router les messages entrants vers des agents.
</Card>
<Card title="Sécurité" icon="shield" href="/fr/gateway/security">
<Card title="Security" icon="shield" href="/fr/gateway/security">
Modèle de menace et durcissement.
</Card>
<Card title="Configuration" icon="sliders" href="/fr/gateway/configuration">
Structure et priorité de la configuration.
Agencement et précédence de la configuration.
</Card>
<Card title="Commandes slash" icon="terminal" href="/fr/tools/slash-commands">
<Card title="Slash commands" icon="terminal" href="/fr/tools/slash-commands">
Catalogue et comportement des commandes.
</Card>
</CardGroup>

View File

@ -1,22 +1,22 @@
---
read_when:
- Travailler sur les fonctionnalités Telegram ou les Webhooks
summary: État de la prise en charge du bot Telegram, fonctionnalités et configuration
summary: État de la prise en charge du bot Telegram, capacités et configuration
title: Telegram
x-i18n:
generated_at: "2026-05-03T21:27:16Z"
generated_at: "2026-05-04T07:02:49Z"
model: gpt-5.5
provider: openai
source_hash: 528ace9dae29eda22f98cc1436ec16146eb9d83edc73aa6db1ab8283f4f873c0
source_hash: 6ef1b019a6a0e261b33972b5edffaedd29310b1333d112bade2e79e9d56887c6
source_path: channels/telegram.md
workflow: 16
---
Prêt pour la production pour les messages privés de bots et les groupes via grammY. Le mode par défaut est le long polling ; le mode Webhook est facultatif.
Prêt pour la production pour les DM de bots et les groupes via grammY. Linterrogation longue est le mode par défaut ; le mode Webhook est facultatif.
<CardGroup cols={3}>
<Card title="Association" icon="link" href="/fr/channels/pairing">
La stratégie de messages privés par défaut pour Telegram est lassociation.
<Card title="Appairage" icon="link" href="/fr/channels/pairing">
La politique de DM par défaut pour Telegram est lappairage.
</Card>
<Card title="Dépannage des canaux" icon="wrench" href="/fr/channels/troubleshooting">
Diagnostics intercanaux et guides de réparation.
@ -30,13 +30,13 @@ Prêt pour la production pour les messages privés de bots et les groupes via gr
<Steps>
<Step title="Créer le jeton du bot dans BotFather">
Ouvrez Telegram et discutez avec **@BotFather** (vérifiez que lidentifiant est exactement `@BotFather`).
Ouvrez Telegram et discutez avec **@BotFather** (confirmez que lidentifiant est exactement `@BotFather`).
Exécutez `/newbot`, suivez les invites et enregistrez le jeton.
</Step>
<Step title="Configurer le jeton et la stratégie des messages privés">
<Step title="Configurer le jeton et la politique de DM">
```json5
{
@ -52,11 +52,11 @@ Prêt pour la production pour les messages privés de bots et les groupes via gr
```
Solution de repli par variable denvironnement : `TELEGRAM_BOT_TOKEN=...` (compte par défaut uniquement).
Telegram nutilise **pas** `openclaw channels login telegram` ; configurez le jeton dans la configuration ou lenvironnement, puis démarrez le Gateway.
Telegram nutilise **pas** `openclaw channels login telegram` ; configurez le jeton dans la config/lenvironnement, puis démarrez le Gateway.
</Step>
<Step title="Démarrer le Gateway et approuver le premier message privé">
<Step title="Démarrer le Gateway et approuver le premier DM">
```bash
openclaw gateway
@ -64,31 +64,31 @@ openclaw pairing list telegram
openclaw pairing approve telegram <CODE>
```
Les codes dassociation expirent après 1 heure.
Les codes dappairage expirent après 1 heure.
</Step>
<Step title="Ajouter le bot à un groupe">
Ajoutez le bot à votre groupe, puis définissez `channels.telegram.groups` et `groupPolicy` selon votre modèle daccès.
Ajoutez le bot à votre groupe, puis définissez `channels.telegram.groups` et `groupPolicy` pour correspondre à votre modèle daccès.
</Step>
</Steps>
<Note>
Lordre de résolution des jetons tient compte du compte. En pratique, les valeurs de configuration priment sur la solution de repli par variable denvironnement, et `TELEGRAM_BOT_TOKEN` ne sapplique quau compte par défaut.
Lordre de résolution des jetons tient compte du compte. En pratique, les valeurs de configuration lemportent sur la solution de repli par variable denvironnement, et `TELEGRAM_BOT_TOKEN` sapplique uniquement au compte par défaut.
</Note>
## Paramètres côté Telegram
<AccordionGroup>
<Accordion title="Mode de confidentialité et visibilité des groupes">
Par défaut, les bots Telegram utilisent le **Mode de confidentialité**, qui limite les messages de groupe quils reçoivent.
Les bots Telegram utilisent par défaut le **mode de confidentialité**, qui limite les messages de groupe quils reçoivent.
Si le bot doit voir tous les messages de groupe, vous pouvez :
Si le bot doit voir tous les messages de groupe, vous pouvez soit :
- désactiver le mode de confidentialité avec `/setprivacy`, ou
- désactiver le mode de confidentialité via `/setprivacy`, soit
- faire du bot un administrateur du groupe.
Lorsque vous modifiez le mode de confidentialité, retirez puis réajoutez le bot dans chaque groupe afin que Telegram applique le changement.
Lorsque vous activez ou désactivez le mode de confidentialité, supprimez puis rajoutez le bot dans chaque groupe afin que Telegram applique la modification.
</Accordion>
@ -101,8 +101,8 @@ Lordre de résolution des jetons tient compte du compte. En pratique, les val
<Accordion title="Options BotFather utiles">
- `/setjoingroups` pour autoriser ou refuser les ajouts aux groupes
- `/setprivacy` pour le comportement de visibilité dans les groupes
- `/setjoingroups` pour autoriser/refuser les ajouts aux groupes
- `/setprivacy` pour le comportement de visibilité des groupes
</Accordion>
</AccordionGroup>
@ -110,7 +110,7 @@ Lordre de résolution des jetons tient compte du compte. En pratique, les val
## Contrôle daccès et activation
<Tabs>
<Tab title="Stratégie de messages privés">
<Tab title="Politique de DM">
`channels.telegram.dmPolicy` contrôle laccès aux messages directs :
- `pairing` (par défaut)
@ -121,24 +121,24 @@ Lordre de résolution des jetons tient compte du compte. En pratique, les val
`dmPolicy: "open"` avec `allowFrom: ["*"]` permet à tout compte Telegram qui trouve ou devine le nom dutilisateur du bot de commander le bot. Utilisez-le uniquement pour des bots volontairement publics avec des outils strictement restreints ; les bots à propriétaire unique doivent utiliser `allowlist` avec des ID utilisateur numériques.
`channels.telegram.allowFrom` accepte les ID utilisateur Telegram numériques. Les préfixes `telegram:` / `tg:` sont acceptés et normalisés.
Dans les configurations multicomptes, un `channels.telegram.allowFrom` restrictif au niveau supérieur est traité comme une frontière de sécurité : les entrées `allowFrom: ["*"]` au niveau du compte ne rendent pas ce compte public, sauf si la liste dautorisation effective du compte contient encore un joker explicite après la fusion.
`dmPolicy: "allowlist"` avec un `allowFrom` vide bloque tous les messages privés et est rejeté par la validation de configuration.
Dans les configurations multicompte, un `channels.telegram.allowFrom` restrictif de premier niveau est traité comme une limite de sécurité : les entrées `allowFrom: ["*"]` au niveau du compte ne rendent pas ce compte public, sauf si la liste dautorisation effective du compte contient toujours un caractère générique explicite après la fusion.
`dmPolicy: "allowlist"` avec `allowFrom` vide bloque tous les DM et est rejeté par la validation de configuration.
La configuration demande uniquement des ID utilisateur numériques.
Si vous avez effectué une mise à niveau et que votre configuration contient des entrées de liste dautorisation `@username`, exécutez `openclaw doctor --fix` pour les résoudre (au mieux ; nécessite un jeton de bot Telegram).
Si vous utilisiez auparavant des fichiers de liste dautorisation du magasin dassociation, `openclaw doctor --fix` peut récupérer les entrées dans `channels.telegram.allowFrom` dans les flux de liste dautorisation (par exemple lorsque `dmPolicy: "allowlist"` na pas encore dID explicites).
Si vous vous appuyiez auparavant sur des fichiers de liste dautorisation du magasin dappairage, `openclaw doctor --fix` peut récupérer les entrées dans `channels.telegram.allowFrom` dans les flux de liste dautorisation (par exemple lorsque `dmPolicy: "allowlist"` na pas encore dID explicites).
Pour les bots à propriétaire unique, préférez `dmPolicy: "allowlist"` avec des ID numériques explicites dans `allowFrom` afin de conserver une stratégie daccès durable dans la configuration (au lieu de dépendre des approbations dassociation précédentes).
Pour les bots à propriétaire unique, préférez `dmPolicy: "allowlist"` avec des ID `allowFrom` numériques explicites afin de garder la politique daccès durable dans la configuration (au lieu de dépendre des approbations dappairage précédentes).
Confusion courante : lapprobation dassociation par message privé ne signifie pas « cet expéditeur est autorisé partout ».
Lassociation accorde laccès aux messages privés. Sil nexiste pas encore de propriétaire des commandes, la première association approuvée définit aussi `commands.ownerAllowFrom` afin que les commandes réservées au propriétaire et les approbations dexécution aient un compte opérateur explicite.
Lautorisation des expéditeurs dans les groupes provient toujours des listes dautorisation explicites de la configuration.
Si vous voulez « je suis autorisé une fois, et les messages privés comme les commandes de groupe fonctionnent », placez votre ID utilisateur Telegram numérique dans `channels.telegram.allowFrom` ; pour les commandes réservées au propriétaire, assurez-vous que `commands.ownerAllowFrom` contient `telegram:<your user id>`.
Confusion courante : lapprobation dappairage des DM ne signifie pas « cet expéditeur est autorisé partout ».
Lappairage accorde laccès aux DM. Si aucun propriétaire de commande nexiste encore, le premier appairage approuvé définit aussi `commands.ownerAllowFrom` afin que les commandes réservées au propriétaire et les approbations dexécution aient un compte opérateur explicite.
Lautorisation des expéditeurs de groupe provient toujours des listes dautorisation explicites de la configuration.
Si vous voulez « je suis autorisé une fois et les DM comme les commandes de groupe fonctionnent », mettez votre ID utilisateur Telegram numérique dans `channels.telegram.allowFrom` ; pour les commandes réservées au propriétaire, assurez-vous que `commands.ownerAllowFrom` contient `telegram:<your user id>`.
### Trouver votre ID utilisateur Telegram
Plus sûr (aucun bot tiers) :
Plus sûr (sans bot tiers)
1. Envoyez un message privé à votre bot.
1. Envoyez un message direct à votre bot.
2. Exécutez `openclaw logs --follow`.
3. Lisez `from.id`.
@ -152,12 +152,12 @@ curl "https://api.telegram.org/bot<bot_token>/getUpdates"
</Tab>
<Tab title="Stratégie de groupe et listes dautorisation">
<Tab title="Group policy and allowlists">
Deux contrôles sappliquent ensemble :
1. **Quels groupes sont autorisés** (`channels.telegram.groups`)
- pas de configuration `groups` :
- avec `groupPolicy: "open"` : nimporte quel groupe peut réussir les contrôles dID de groupe
- aucune configuration `groups` :
- avec `groupPolicy: "open"` : nimporte quel groupe peut passer les vérifications dID de groupe
- avec `groupPolicy: "allowlist"` (par défaut) : les groupes sont bloqués jusquà ce que vous ajoutiez des entrées `groups` (ou `"*"`)
- `groups` configuré : agit comme une liste dautorisation (ID explicites ou `"*"`)
@ -168,13 +168,13 @@ curl "https://api.telegram.org/bot<bot_token>/getUpdates"
`groupAllowFrom` est utilisé pour filtrer les expéditeurs de groupe. Sil nest pas défini, Telegram se rabat sur `allowFrom`.
Les entrées `groupAllowFrom` doivent être des ID utilisateur Telegram numériques (les préfixes `telegram:` / `tg:` sont normalisés).
Ne mettez pas dID de discussion de groupe ou de supergroupe Telegram dans `groupAllowFrom`. Les ID de discussion négatifs doivent être placés sous `channels.telegram.groups`.
Ne mettez pas dID de chat de groupe ou de supergroupe Telegram dans `groupAllowFrom`. Les ID de chat négatifs doivent être placés sous `channels.telegram.groups`.
Les entrées non numériques sont ignorées pour lautorisation des expéditeurs.
Frontière de sécurité (`2026.2.25+`) : lauthentification des expéditeurs de groupe nhérite **pas** des approbations du magasin dassociation des messages privés.
Lassociation reste limitée aux messages privés. Pour les groupes, définissez `groupAllowFrom` ou un `allowFrom` par groupe ou par sujet.
Si `groupAllowFrom` nest pas défini, Telegram se rabat sur la configuration `allowFrom`, et non sur le magasin dassociation.
Frontière de sécurité (`2026.2.25+`) : lauthentification des expéditeurs de groupe nhérite **pas** des approbations du magasin dappairage des messages directs.
Lappairage reste limité aux messages directs. Pour les groupes, définissez `groupAllowFrom` ou `allowFrom` par groupe/par sujet.
Si `groupAllowFrom` nest pas défini, Telegram se rabat sur la configuration `allowFrom`, pas sur le magasin dappairage.
Modèle pratique pour les bots à propriétaire unique : définissez votre ID utilisateur dans `channels.telegram.allowFrom`, laissez `groupAllowFrom` non défini, et autorisez les groupes cibles sous `channels.telegram.groups`.
Note dexécution : si `channels.telegram` est totalement absent, lexécution adopte par défaut un comportement fermé avec `groupPolicy="allowlist"`, sauf si `channels.defaults.groupPolicy` est explicitement défini.
Note dexécution : si `channels.telegram` est complètement absent, lexécution utilise par défaut une stratégie fermée `groupPolicy="allowlist"`, sauf si `channels.defaults.groupPolicy` est explicitement défini.
Exemple : autoriser nimporte quel membre dans un groupe spécifique :
@ -193,7 +193,7 @@ curl "https://api.telegram.org/bot<bot_token>/getUpdates"
}
```
Exemple : autoriser uniquement certains utilisateurs dans un groupe spécifique :
Exemple : nautoriser que des utilisateurs spécifiques dans un groupe spécifique :
```json5
{
@ -213,30 +213,30 @@ curl "https://api.telegram.org/bot<bot_token>/getUpdates"
<Warning>
Erreur courante : `groupAllowFrom` nest pas une liste dautorisation de groupes Telegram.
- Placez les ID de discussion de groupe ou de supergroupe Telegram négatifs comme `-1001234567890` sous `channels.telegram.groups`.
- Placez les ID utilisateur Telegram comme `8734062810` sous `groupAllowFrom` lorsque vous voulez limiter les personnes qui, dans un groupe autorisé, peuvent déclencher le bot.
- Placez les ID de chat de groupe ou de supergroupe Telegram négatifs comme `-1001234567890` sous `channels.telegram.groups`.
- Placez les ID utilisateur Telegram comme `8734062810` sous `groupAllowFrom` lorsque vous voulez limiter les personnes, au sein dun groupe autorisé, qui peuvent déclencher le bot.
- Utilisez `groupAllowFrom: ["*"]` uniquement lorsque vous voulez que nimporte quel membre dun groupe autorisé puisse parler au bot.
</Warning>
</Tab>
<Tab title="Comportement des mentions">
Les réponses de groupe nécessitent une mention par défaut.
<Tab title="Mention behavior">
Les réponses de groupe exigent une mention par défaut.
La mention peut provenir de :
La mention peut provenir :
- une mention native `@botusername`, ou
- des motifs de mention dans :
- dune mention native `@botusername`, ou
- de modèles de mention dans :
- `agents.list[].groupChat.mentionPatterns`
- `messages.groupChat.mentionPatterns`
Options de commande au niveau de la session :
Bascules de commande au niveau de la session :
- `/activation always`
- `/activation mention`
Elles mettent uniquement à jour létat de la session. Utilisez la configuration pour la persistance.
Elles ne mettent à jour que létat de session. Utilisez la configuration pour la persistance.
Exemple de configuration persistante :
@ -252,7 +252,7 @@ curl "https://api.telegram.org/bot<bot_token>/getUpdates"
}
```
Obtenir lID de discussion du groupe :
Obtenir lID du chat de groupe :
- transférez un message de groupe à `@userinfobot` / `@getidsbot`
- ou lisez `chat.id` depuis `openclaw logs --follow`
@ -261,35 +261,36 @@ curl "https://api.telegram.org/bot<bot_token>/getUpdates"
</Tab>
</Tabs>
## Comportement à lexécution
## Comportement dexécution
- Telegram appartient au processus Gateway.
- Le routage est déterministe : les messages entrants Telegram reçoivent une réponse sur Telegram (le modèle ne choisit pas les canaux).
- Le routage est déterministe : les réponses entrantes Telegram repartent vers Telegram (le modèle ne choisit pas les canaux).
- Les messages entrants sont normalisés dans lenveloppe de canal partagée avec les métadonnées de réponse et les espaces réservés de médias.
- Les sessions de groupe sont isolées par ID de groupe. Les sujets de forum ajoutent `:topic:<threadId>` pour garder les sujets isolés.
- Les messages privés peuvent porter `message_thread_id` ; OpenClaw préserve lID de fil pour les réponses, mais garde les messages privés sur la session plate par défaut. Configurez `channels.telegram.dm.threadReplies: "inbound"`, `channels.telegram.direct.<chatId>.threadReplies: "inbound"`, `requireTopic: true`, ou une configuration de sujet correspondante lorsque vous voulez intentionnellement isoler les sessions par sujet dans les messages privés.
- Le long polling utilise grammY runner avec un séquencement par discussion et par fil. La concurrence globale du puits du runner utilise `agents.defaults.maxConcurrent`.
- Le long polling est protégé dans chaque processus Gateway afin quun seul poller actif puisse utiliser un jeton de bot à la fois. Si vous voyez encore des conflits `getUpdates` 409, un autre Gateway OpenClaw, un script ou un poller externe utilise probablement le même jeton.
- Les redémarrages du watchdog de long polling se déclenchent par défaut après 120 secondes sans activité `getUpdates` terminée. Augmentez `channels.telegram.pollingStallThresholdMs` uniquement si votre déploiement voit encore de faux redémarrages pour blocage de polling pendant des tâches longues. La valeur est en millisecondes et autorisée de `30000` à `600000` ; les remplacements par compte sont pris en charge.
- Les messages directs peuvent transporter `message_thread_id` ; OpenClaw conserve lID de fil pour les réponses, mais garde par défaut les messages directs sur la session plate. Configurez `channels.telegram.dm.threadReplies: "inbound"`, `channels.telegram.direct.<chatId>.threadReplies: "inbound"`, `requireTopic: true`, ou une configuration de sujet correspondante lorsque vous voulez intentionnellement isoler les sessions de sujet en message direct.
- Linterrogation longue utilise le runner grammY avec un séquencement par chat/par fil. La concurrence globale du puits du runner utilise `agents.defaults.maxConcurrent`.
- Linterrogation longue est protégée dans chaque processus Gateway afin quun seul poller actif puisse utiliser un token de bot à la fois. Si vous voyez encore des conflits `getUpdates` 409, un autre Gateway OpenClaw, script ou poller externe utilise probablement le même token.
- Les redémarrages du chien de garde dinterrogation longue se déclenchent par défaut après 120 secondes sans vivacité `getUpdates` terminée. Augmentez `channels.telegram.pollingStallThresholdMs` uniquement si votre déploiement observe encore de faux redémarrages pour blocage dinterrogation pendant des tâches longues. La valeur est en millisecondes et est autorisée de `30000` à `600000` ; les remplacements par compte sont pris en charge.
- LAPI Bot Telegram ne prend pas en charge les accusés de lecture (`sendReadReceipts` ne sapplique pas).
## Référence des fonctionnalités
<AccordionGroup>
<Accordion title="Aperçu du flux en direct (modifications de message)">
<Accordion title="Live stream preview (message edits)">
OpenClaw peut diffuser des réponses partielles en temps réel :
- discussions directes : message daperçu + `editMessageText`
- chats directs : message daperçu + `editMessageText`
- groupes/sujets : message daperçu + `editMessageText`
Exigence :
- `channels.telegram.streaming` est `off | partial | block | progress` (par défaut : `partial`)
- `channels.telegram.streaming` vaut `off | partial | block | progress` (par défaut : `partial`)
- `progress` conserve un brouillon détat modifiable et le met à jour avec la progression des outils jusquà la livraison finale
- `streaming.preview.toolProgress` contrôle si les mises à jour doutil/progression réutilisent le même message daperçu modifié (par défaut : `true` lorsque le streaming daperçu est actif)
- les anciens `channels.telegram.streamMode` et les valeurs booléennes `streaming` sont détectés ; exécutez `openclaw doctor --fix` pour les migrer vers `channels.telegram.streaming.mode`
- `streaming.preview.commandText` contrôle les détails de commande/dexécution dans ces lignes de progression doutil : `raw` (par défaut, conserve le comportement publié) ou `status` (étiquette de loutil uniquement)
- les anciens `channels.telegram.streamMode` et valeurs booléennes `streaming` sont détectés ; exécutez `openclaw doctor --fix` pour les migrer vers `channels.telegram.streaming.mode`
Les mises à jour daperçu de progression des outils sont les courtes lignes détat affichées pendant lexécution des outils, par exemple lexécution de commandes, les lectures de fichiers, les mises à jour de planification ou les résumés de patch. Telegram les garde activées par défaut afin de correspondre au comportement publié dOpenClaw depuis `v2026.4.22` et versions ultérieures. Pour conserver laperçu modifié pour le texte de réponse, mais masquer les lignes de progression des outils, définissez :
Les mises à jour daperçu de progression doutil sont les courtes lignes détat affichées pendant lexécution des outils, par exemple lexécution de commandes, les lectures de fichiers, les mises à jour de planification ou les résumés de correctifs. Telegram les garde activées par défaut pour correspondre au comportement OpenClaw publié depuis `v2026.4.22` et versions ultérieures. Pour conserver laperçu modifié pour le texte de réponse mais masquer les lignes de progression doutil, définissez :
```json
{
@ -306,34 +307,70 @@ curl "https://api.telegram.org/bot<bot_token>/getUpdates"
}
```
Utilisez `streaming.mode: "off"` uniquement lorsque vous souhaitez une livraison finale uniquement : les modifications daperçu Telegram sont désactivées et les échanges génériques doutils/de progression sont supprimés au lieu dêtre envoyés comme messages détat autonomes. Les invites dapprobation, les charges utiles multimédias et les erreurs passent toujours par la livraison finale normale. Utilisez `streaming.preview.toolProgress: false` lorsque vous voulez seulement conserver les modifications daperçu de réponse tout en masquant les lignes détat de progression des outils.
Pour garder la progression doutil visible mais masquer le texte de commande/dexécution, définissez :
```json
{
"channels": {
"telegram": {
"streaming": {
"mode": "partial",
"preview": {
"commandText": "status"
}
}
}
}
}
```
Pour le mode brouillon de progression, placez la même stratégie de texte de commande sous `streaming.progress` :
```json
{
"channels": {
"telegram": {
"streaming": {
"mode": "progress",
"progress": {
"toolProgress": true,
"commandText": "status"
}
}
}
}
}
```
Utilisez `streaming.mode: "off"` uniquement lorsque vous voulez une livraison finale uniquement : les modifications daperçu Telegram sont désactivées et le bavardage générique doutil/progression est supprimé au lieu dêtre envoyé comme messages détat autonomes. Les demandes dapprobation, les charges utiles multimédias et les erreurs passent toujours par la livraison finale normale. Utilisez `streaming.preview.toolProgress: false` lorsque vous voulez seulement conserver les modifications daperçu de réponse tout en masquant les lignes détat de progression des outils.
<Note>
Les réponses avec citation sélectionnée Telegram sont lexception. Lorsque `replyToMode` vaut `"first"`, `"all"` ou `"batched"` et que le message entrant inclut du texte de citation sélectionné, OpenClaw envoie la réponse finale via le chemin natif de réponse avec citation de Telegram au lieu de modifier laperçu de réponse ; `streaming.preview.toolProgress` ne peut donc pas afficher les courtes lignes détat pour ce tour. Les réponses au message courant sans texte de citation sélectionné conservent toujours le streaming daperçu. Définissez `replyToMode: "off"` lorsque la visibilité de la progression des outils compte davantage que les réponses avec citation natives, ou définissez `streaming.preview.toolProgress: false` pour accepter le compromis.
Les réponses avec citation sélectionnée Telegram font exception. Lorsque `replyToMode` vaut `"first"`, `"all"` ou `"batched"` et que le message entrant inclut du texte de citation sélectionné, OpenClaw envoie la réponse finale via le chemin de réponse avec citation natif de Telegram au lieu de modifier laperçu de réponse, de sorte que `streaming.preview.toolProgress` ne peut pas afficher les courtes lignes détat pour ce tour. Les réponses au message actuel sans texte de citation sélectionné conservent toujours le streaming daperçu. Définissez `replyToMode: "off"` lorsque la visibilité de la progression des outils est plus importante que les réponses avec citation natives, ou définissez `streaming.preview.toolProgress: false` pour reconnaître ce compromis.
</Note>
Pour les réponses uniquement textuelles :
Pour les réponses en texte uniquement :
- aperçus courts en message privé/groupe/sujet : OpenClaw conserve le même message daperçu et effectue une modification finale sur place, sauf si un message visible hors aperçu a été envoyé après lapparition de laperçu
- aperçus suivis dune sortie visible hors aperçu : OpenClaw envoie la réponse terminée comme nouveau message final et nettoie lancien aperçu, de sorte que la réponse finale apparaisse après la sortie intermédiaire
- aperçus vieux denviron plus dune minute : OpenClaw envoie la réponse terminée comme nouveau message final, puis nettoie laperçu, de sorte que lhorodatage visible de Telegram reflète lheure de fin plutôt que lheure de création de laperçu
- aperçus courts en DM/groupe/sujet : OpenClaw conserve le même message daperçu et effectue une modification finale sur place, sauf si un message visible qui nest pas un aperçu a été envoyé après lapparition de laperçu
- aperçus suivis dune sortie visible qui nest pas un aperçu : OpenClaw envoie la réponse terminée comme nouveau message final et nettoie lancien aperçu, de sorte que la réponse finale apparaisse après la sortie intermédiaire
- aperçus de plus denviron une minute : OpenClaw envoie la réponse terminée comme nouveau message final, puis nettoie laperçu, de sorte que lhorodatage visible de Telegram reflète lheure dachèvement plutôt que lheure de création de laperçu
Pour les réponses complexes (par exemple les charges utiles multimédias), OpenClaw revient à la livraison finale normale, puis nettoie le message daperçu.
Le streaming daperçu est distinct du streaming par blocs. Lorsque le streaming par blocs est explicitement activé pour Telegram, OpenClaw ignore le flux daperçu pour éviter un double streaming.
Le streaming daperçu est distinct du streaming par blocs. Lorsque le streaming par blocs est explicitement activé pour Telegram, OpenClaw ignore le flux daperçu pour éviter le double streaming.
Flux de raisonnement propre à Telegram :
- `/reasoning stream` envoie le raisonnement à laperçu en direct pendant la génération
- laperçu du raisonnement est supprimé après la livraison finale ; utilisez `/reasoning on` lorsque le raisonnement doit rester visible
- la réponse finale est envoyée sans texte de raisonnement
</Accordion>
<Accordion title="Formatage et solution de repli HTML">
<Accordion title="Mise en forme et repli HTML">
Le texte sortant utilise Telegram `parse_mode: "HTML"`.
- Le texte de type Markdown est rendu en HTML compatible avec Telegram.
- Le HTML brut du modèle est échappé afin de réduire les échecs danalyse Telegram.
- Le HTML brut du modèle est échappé pour réduire les échecs danalyse Telegram.
- Si Telegram rejette le HTML analysé, OpenClaw réessaie en texte brut.
Les aperçus de liens sont activés par défaut et peuvent être désactivés avec `channels.telegram.linkPreview: false`.
@ -341,13 +378,13 @@ curl "https://api.telegram.org/bot<bot_token>/getUpdates"
</Accordion>
<Accordion title="Commandes natives et commandes personnalisées">
Lenregistrement du menu des commandes Telegram est géré au démarrage avec `setMyCommands`.
Lenregistrement du menu de commandes Telegram est géré au démarrage avec `setMyCommands`.
Valeurs par défaut des commandes natives :
- `commands.native: "auto"` active les commandes natives pour Telegram
Ajouter des entrées de menu de commandes personnalisées :
Ajoutez des entrées personnalisées au menu de commandes :
```json5
{
@ -367,35 +404,35 @@ curl "https://api.telegram.org/bot<bot_token>/getUpdates"
- les noms sont normalisés (suppression du `/` initial, minuscules)
- motif valide : `a-z`, `0-9`, `_`, longueur `1..32`
- les commandes personnalisées ne peuvent pas remplacer les commandes natives
- les conflits/doublons sont ignorés et consignés
- les conflits/doublons sont ignorés et journalisés
Notes :
- les commandes personnalisées sont uniquement des entrées de menu ; elles nimplémentent pas automatiquement de comportement
- les commandes de Plugin/Skills peuvent toujours fonctionner lorsquelles sont saisies, même si elles ne sont pas affichées dans le menu Telegram
- les commandes de plugin/skill peuvent toujours fonctionner lorsquelles sont saisies, même si elles ne sont pas affichées dans le menu Telegram
Si les commandes natives sont désactivées, les commandes intégrées sont supprimées. Les commandes personnalisées/de Plugin peuvent toujours senregistrer si elles sont configurées.
Si les commandes natives sont désactivées, les commandes intégrées sont supprimées. Les commandes personnalisées/de plugin peuvent toujours senregistrer si elles sont configurées.
Échecs de configuration courants :
- `setMyCommands failed` avec `BOT_COMMANDS_TOO_MUCH` signifie que le menu Telegram débordait encore après réduction ; réduisez les commandes de Plugin/Skills/personnalisées ou désactivez `channels.telegram.commands.native`.
- `setMyCommands failed` avec `BOT_COMMANDS_TOO_MUCH` signifie que le menu Telegram déborde toujours après réduction ; réduisez les commandes de plugin/skill/personnalisées ou désactivez `channels.telegram.commands.native`.
- Léchec de `deleteWebhook`, `deleteMyCommands` ou `setMyCommands` avec `404: Not Found` alors que les commandes curl directes de lAPI Bot fonctionnent peut signifier que `channels.telegram.apiRoot` a été défini sur le point de terminaison complet `/bot<TOKEN>`. `apiRoot` doit être uniquement la racine de lAPI Bot, et `openclaw doctor --fix` supprime un `/bot<TOKEN>` final accidentel.
- `getMe returned 401` signifie que Telegram a rejeté le jeton de bot configuré. Mettez à jour `botToken`, `tokenFile` ou `TELEGRAM_BOT_TOKEN` avec le jeton BotFather actuel ; OpenClaw sarrête avant linterrogation, ce qui évite que cela soit signalé comme un échec de nettoyage de Webhook.
- `setMyCommands failed` avec des erreurs réseau/fetch signifie généralement que le DNS/HTTPS sortant vers `api.telegram.org` est bloqué.
- `getMe returned 401` signifie que Telegram a rejeté le jeton de bot configuré. Mettez à jour `botToken`, `tokenFile` ou `TELEGRAM_BOT_TOKEN` avec le jeton BotFather actuel ; OpenClaw sarrête avant linterrogation, ce nest donc pas signalé comme un échec de nettoyage Webhook.
- `setMyCommands failed` avec des erreurs réseau/fetch signifie généralement que les sorties DNS/HTTPS vers `api.telegram.org` sont bloquées.
### Commandes dappairage dappareil (Plugin `device-pair`)
### Commandes dappairage dappareil (plugin `device-pair`)
Lorsque le Plugin `device-pair` est installé :
Lorsque le plugin `device-pair` est installé :
1. `/pair` génère le code de configuration
1. `/pair` génère un code de configuration
2. collez le code dans lapplication iOS
3. `/pair pending` liste les demandes en attente (rôle/portées inclus)
3. `/pair pending` liste les demandes en attente (y compris rôle/portées)
4. approuvez la demande :
- `/pair approve <requestId>` pour une approbation explicite
- `/pair approve` lorsquil ny a quune seule demande en attente
- `/pair approve latest` pour la plus récente
Le code de configuration transporte un jeton damorçage à courte durée de vie. Le transfert damorçage intégré conserve le jeton du nœud principal à `scopes: []` ; tout jeton dopérateur transféré reste limité à `operator.approvals`, `operator.read`, `operator.talk.secrets` et `operator.write`. Les vérifications de portée damorçage sont préfixées par rôle, de sorte que cette liste dautorisation dopérateur ne satisfait que les demandes dopérateur ; les rôles non opérateur nécessitent toujours des portées sous leur propre préfixe de rôle.
Le code de configuration transporte un jeton de bootstrap de courte durée. Le transfert de bootstrap intégré conserve le jeton du nœud principal avec `scopes: []` ; tout jeton opérateur transféré reste limité à `operator.approvals`, `operator.read`, `operator.talk.secrets` et `operator.write`. Les contrôles de portée de bootstrap sont préfixés par rôle, de sorte que cette liste dautorisation dopérateur ne satisfait que les demandes dopérateur ; les rôles non opérateurs ont toujours besoin de portées sous leur propre préfixe de rôle.
Si un appareil réessaie avec des détails dauthentification modifiés (par exemple rôle/portées/clé publique), la demande en attente précédente est remplacée et la nouvelle demande utilise un `requestId` différent. Réexécutez `/pair pending` avant dapprouver.
@ -404,7 +441,7 @@ curl "https://api.telegram.org/bot<bot_token>/getUpdates"
</Accordion>
<Accordion title="Boutons intégrés">
Configurer la portée du clavier intégré :
Configurez la portée du clavier intégré :
```json5
{
@ -469,18 +506,18 @@ curl "https://api.telegram.org/bot<bot_token>/getUpdates"
</Accordion>
<Accordion title="Actions de message Telegram pour les agents et lautomatisation">
<Accordion title="Actions de message Telegram pour agents et automatisation">
Les actions doutil Telegram incluent :
- `sendMessage` (`to`, `content`, `mediaUrl` facultatif, `replyToMessageId`, `messageThreadId`)
- `sendMessage` (`to`, `content`, optionnel `mediaUrl`, `replyToMessageId`, `messageThreadId`)
- `react` (`chatId`, `messageId`, `emoji`)
- `deleteMessage` (`chatId`, `messageId`)
- `editMessage` (`chatId`, `messageId`, `content`)
- `createForumTopic` (`chatId`, `name`, `iconColor` facultatif, `iconCustomEmojiId`)
- `createForumTopic` (`chatId`, `name`, optionnel `iconColor`, `iconCustomEmojiId`)
Les actions de message de canal exposent des alias ergonomiques (`send`, `react`, `delete`, `edit`, `sticker`, `sticker-search`, `topic-create`).
Contrôles de filtrage :
Contrôles de gating :
- `channels.telegram.actions.sendMessage`
- `channels.telegram.actions.deleteMessage`
@ -488,27 +525,27 @@ curl "https://api.telegram.org/bot<bot_token>/getUpdates"
- `channels.telegram.actions.sticker` (par défaut : désactivé)
Note : `edit` et `topic-create` sont actuellement activés par défaut et nont pas de bascules `channels.telegram.actions.*` séparées.
Les envois dexécution utilisent linstantané actif de configuration/secrets (démarrage/rechargement), de sorte que les chemins daction ne réévaluent pas ponctuellement les SecretRef à chaque envoi.
Les envois à lexécution utilisent linstantané actif de configuration/secrets (démarrage/rechargement), de sorte que les chemins daction ne réévaluent pas les SecretRef de manière ad hoc à chaque envoi.
Sémantique de suppression des réactions : [/tools/reactions](/fr/tools/reactions)
Sémantique de suppression de réaction : [/tools/reactions](/fr/tools/reactions)
</Accordion>
<Accordion title="Balises de fil de réponse">
Telegram prend en charge les balises explicites de fil de réponse dans la sortie générée :
<Accordion title="Balises de fil de réponses">
Telegram prend en charge les balises explicites de fil de réponses dans la sortie générée :
- `[[reply_to_current]]` répond au message déclencheur
- `[[reply_to:<id>]]` répond à un ID de message Telegram spécifique
`channels.telegram.replyToMode` contrôle la gestion :
`channels.telegram.replyToMode` contrôle le traitement :
- `off` (par défaut)
- `first`
- `all`
Lorsque le fil de réponse est activé et que le texte ou la légende Telegram dorigine est disponible, OpenClaw inclut automatiquement un extrait de citation natif Telegram. Telegram limite le texte de citation natif à 1024 unités de code UTF-16 ; les messages plus longs sont donc cités depuis le début et reviennent à une réponse simple si Telegram rejette la citation.
Lorsque le fil de réponses est activé et que le texte ou la légende Telegram dorigine est disponible, OpenClaw inclut automatiquement un extrait de citation Telegram natif. Telegram limite le texte de citation natif à 1024 unités de code UTF-16, donc les messages plus longs sont cités depuis le début et reviennent à une réponse simple si Telegram rejette la citation.
Note : `off` désactive le fil de réponse implicite. Les balises explicites `[[reply_to_*]]` restent honorées.
Note : `off` désactive le fil de réponses implicite. Les balises explicites `[[reply_to_*]]` restent honorées.
</Accordion>
@ -525,10 +562,10 @@ curl "https://api.telegram.org/bot<bot_token>/getUpdates"
- les envois de message omettent `message_thread_id` (Telegram rejette `sendMessage(...thread_id=1)`)
- les actions de saisie incluent toujours `message_thread_id`
Héritage des sujets : les entrées de sujet héritent des paramètres du groupe sauf remplacement (`requireMention`, `allowFrom`, `skills`, `systemPrompt`, `enabled`, `groupPolicy`).
Héritage des sujets : les entrées de sujet héritent des paramètres de groupe sauf remplacement (`requireMention`, `allowFrom`, `skills`, `systemPrompt`, `enabled`, `groupPolicy`).
`agentId` est propre au sujet et nhérite pas des valeurs par défaut du groupe.
**Routage dagent par sujet** : chaque sujet peut être routé vers un agent différent en définissant `agentId` dans la configuration du sujet. Cela donne à chaque sujet son propre espace de travail, sa mémoire et sa session isolés. Exemple :
**Routage dagent par sujet** : chaque sujet peut router vers un agent différent en définissant `agentId` dans la configuration du sujet. Cela donne à chaque sujet son propre espace de travail, sa mémoire et sa session isolés. Exemple :
```json5
{
@ -548,26 +585,26 @@ curl "https://api.telegram.org/bot<bot_token>/getUpdates"
}
```
Chaque sujet dispose ensuite de sa propre clé de session : `agent:zu:telegram:group:-1001234567890:topic:3`
Chaque sujet possède ensuite sa propre clé de session : `agent:zu:telegram:group:-1001234567890:topic:3`
**Liaison de sujet ACP persistante** : les sujets de forum peuvent épingler des sessions de harnais ACP via des liaisons ACP typées de premier niveau (`bindings[]` avec `type: "acp"` et `match.channel: "telegram"`, `peer.kind: "group"`, ainsi quun identifiant qualifié par sujet comme `-1001234567890:topic:42`). Actuellement limité aux sujets de forum dans les groupes/supergroupes. Voir [Agents ACP](/fr/tools/acp-agents).
**Liaison persistante de sujet ACP** : les sujets de forum peuvent épingler des sessions de harnais ACP via des liaisons ACP typées de premier niveau (`bindings[]` avec `type: "acp"` et `match.channel: "telegram"`, `peer.kind: "group"` et un identifiant qualifié par sujet comme `-1001234567890:topic:42`). Actuellement limité aux sujets de forum dans les groupes/supergroupes. Consultez [Agents ACP](/fr/tools/acp-agents).
**Création ACP liée au fil depuis le chat** : `/acp spawn <agent> --thread here|auto` lie le sujet courant à une nouvelle session ACP ; les suites y sont routées directement. OpenClaw épingle la confirmation de création dans le sujet. Nécessite que `channels.telegram.threadBindings.spawnSessions` reste activé (par défaut : `true`).
**Lancement ACP lié au fil depuis le chat** : `/acp spawn <agent> --thread here|auto` lie le sujet actuel à une nouvelle session ACP ; les suivis y sont routés directement. OpenClaw épingle la confirmation de lancement dans le sujet. Nécessite que `channels.telegram.threadBindings.spawnSessions` reste activé (par défaut : `true`).
Le contexte de modèle expose `MessageThreadId` et `IsForum`. Les conversations en message privé avec `message_thread_id` conservent par défaut le routage de message privé et les métadonnées de réponse sur des sessions plates ; elles nutilisent des clés de session conscientes des fils que lorsquelles sont configurées avec `threadReplies: "inbound"`, `threadReplies: "always"`, `requireTopic: true` ou une configuration de sujet correspondante. Utilisez `channels.telegram.dm.threadReplies` de premier niveau comme valeur par défaut du compte, ou `direct.<chatId>.threadReplies` pour un message privé.
Le contexte du modèle expose `MessageThreadId` et `IsForum`. Les conversations DM avec `message_thread_id` conservent par défaut le routage DM et les métadonnées de réponse sur des sessions plates ; elles nutilisent des clés de session tenant compte des fils que lorsquelles sont configurées avec `threadReplies: "inbound"`, `threadReplies: "always"`, `requireTopic: true` ou une configuration de sujet correspondante. Utilisez `channels.telegram.dm.threadReplies` au niveau supérieur pour la valeur par défaut du compte, ou `direct.<chatId>.threadReplies` pour un DM.
</Accordion>
<Accordion title="Audio, vidéo et stickers">
<Accordion title="Audio, vidéo et autocollants">
### Messages audio
Telegram distingue les notes vocales des fichiers audio.
- par défaut : comportement de fichier audio
- balise `[[audio_as_voice]]` dans la réponse de lagent pour forcer lenvoi en note vocale
- les transcriptions de notes vocales entrantes sont présentées comme du texte généré par machine,
non fiable dans le contexte de lagent ; la détection des mentions utilise toujours la
transcription brute afin que les messages vocaux soumis à mention continuent de fonctionner.
- les transcriptions de notes vocales entrantes sont encadrées comme du texte généré par machine,
non fiable, dans le contexte de lagent ; la détection des mentions utilise toujours la transcription
brute, de sorte que les messages vocaux soumis à mention continuent de fonctionner.
Exemple daction de message :
@ -599,15 +636,15 @@ curl "https://api.telegram.org/bot<bot_token>/getUpdates"
Les notes vidéo ne prennent pas en charge les légendes ; le texte de message fourni est envoyé séparément.
### Stickers
### Autocollants
Gestion des stickers entrants :
Gestion des autocollants entrants :
- WEBP statique : téléchargé et traité (placeholder `<media:sticker>`)
- TGS animé : ignoré
- WEBM vidéo : ignoré
Champs de contexte des stickers :
Champs de contexte des autocollants :
- `Sticker.emoji`
- `Sticker.setName`
@ -615,13 +652,13 @@ curl "https://api.telegram.org/bot<bot_token>/getUpdates"
- `Sticker.fileUniqueId`
- `Sticker.cachedDescription`
Fichier de cache des stickers :
Fichier de cache des autocollants :
- `~/.openclaw/telegram/sticker-cache.json`
Les stickers sont décrits une fois (quand cest possible) et mis en cache pour réduire les appels de vision répétés.
Les autocollants sont décrits une fois (si possible) et mis en cache afin de réduire les appels de vision répétés.
Activer les actions de sticker :
Activer les actions dautocollants :
```json5
{
@ -635,7 +672,7 @@ curl "https://api.telegram.org/bot<bot_token>/getUpdates"
}
```
Action denvoi de sticker :
Envoyer une action dautocollant :
```json5
{
@ -646,7 +683,7 @@ curl "https://api.telegram.org/bot<bot_token>/getUpdates"
}
```
Rechercher dans les stickers en cache :
Rechercher des autocollants en cache :
```json5
{
@ -659,31 +696,31 @@ curl "https://api.telegram.org/bot<bot_token>/getUpdates"
</Accordion>
<Accordion title="Notifications de réaction">
Les réactions Telegram arrivent comme mises à jour `message_reaction` (séparées des payloads de message).
<Accordion title="Notifications de réactions">
Les réactions Telegram arrivent sous forme de mises à jour `message_reaction` (distinctes des charges utiles de messages).
Quand elles sont activées, OpenClaw met en file dattente des événements système comme :
Lorsque cette option est activée, OpenClaw met en file dattente des événements système comme :
- `Telegram reaction added: 👍 by Alice (@alice) on msg 42`
Config :
Configuration :
- `channels.telegram.reactionNotifications` : `off | own | all` (par défaut : `own`)
- `channels.telegram.reactionLevel` : `off | ack | minimal | extensive` (par défaut : `minimal`)
Notes :
- `own` signifie uniquement les réactions des utilisateurs aux messages envoyés par le bot (au mieux via le cache des messages envoyés).
- Les événements de réaction respectent toujours les contrôles daccès Telegram (`dmPolicy`, `allowFrom`, `groupPolicy`, `groupAllowFrom`) ; les expéditeurs non autorisés sont rejetés.
- Telegram ne fournit pas didentifiants de thread dans les mises à jour de réaction.
- les groupes non-forum sont routés vers la session de chat de groupe
- les groupes forum sont routés vers la session du sujet général du groupe (`:topic:1`), pas vers le sujet dorigine exact
- `own` signifie uniquement les réactions dutilisateurs aux messages envoyés par le bot (au mieux, via le cache des messages envoyés).
- Les événements de réaction respectent toujours les contrôles daccès Telegram (`dmPolicy`, `allowFrom`, `groupPolicy`, `groupAllowFrom`) ; les expéditeurs non autorisés sont ignorés.
- Telegram ne fournit pas dID de fil dans les mises à jour de réactions.
- les groupes non forum sont routés vers la session de conversation du groupe
- les groupes forum sont routés vers la session du sujet général du groupe (`:topic:1`), et non vers le sujet dorigine exact
`allowed_updates` pour le polling/Webhook inclut automatiquement `message_reaction`.
</Accordion>
<Accordion title="Réactions ack">
<Accordion title="Réactions Ack">
`ackReaction` envoie un emoji daccusé de réception pendant quOpenClaw traite un message entrant.
Ordre de résolution :
@ -691,17 +728,17 @@ curl "https://api.telegram.org/bot<bot_token>/getUpdates"
- `channels.telegram.accounts.<accountId>.ackReaction`
- `channels.telegram.ackReaction`
- `messages.ackReaction`
- repli vers lemoji didentité de lagent (`agents.list[].identity.emoji`, sinon "👀")
- solution de repli sur lemoji didentité de lagent (`agents.list[].identity.emoji`, sinon "👀")
Notes :
- Telegram attend des emoji unicode (par exemple "👀").
- Telegram attend un emoji Unicode (par exemple "👀").
- Utilisez `""` pour désactiver la réaction pour un canal ou un compte.
</Accordion>
<Accordion title="Écritures de config depuis les événements et commandes Telegram">
Les écritures de config du canal sont activées par défaut (`configWrites !== false`).
<Accordion title="Écritures de configuration depuis les événements et commandes Telegram">
Les écritures de configuration de canal sont activées par défaut (`configWrites !== false`).
Les écritures déclenchées par Telegram incluent :
@ -722,32 +759,32 @@ curl "https://api.telegram.org/bot<bot_token>/getUpdates"
</Accordion>
<Accordion title="Long polling ou Webhook">
La valeur par défaut est le long polling. Pour le mode Webhook, définissez `channels.telegram.webhookUrl` et `channels.telegram.webhookSecret` ; `webhookPath`, `webhookHost`, `webhookPort` sont facultatifs (valeurs par défaut `/telegram-webhook`, `127.0.0.1`, `8787`).
<Accordion title="Long polling vs webhook">
Le mode par défaut est le long polling. Pour le mode Webhook, définissez `channels.telegram.webhookUrl` et `channels.telegram.webhookSecret` ; `webhookPath`, `webhookHost`, `webhookPort` sont facultatifs (valeurs par défaut `/telegram-webhook`, `127.0.0.1`, `8787`).
Le listener local se lie à `127.0.0.1:8787`. Pour une entrée publique, placez soit un proxy inverse devant le port local, soit définissez intentionnellement `webhookHost: "0.0.0.0"`.
Lécouteur local se lie à `127.0.0.1:8787`. Pour une entrée publique, placez un proxy inverse devant le port local ou définissez intentionnellement `webhookHost: "0.0.0.0"`.
Le mode Webhook valide les protections de requête, le token secret Telegram et le corps JSON avant de renvoyer `200` à Telegram.
OpenClaw traite ensuite la mise à jour de manière asynchrone via les mêmes lanes de bot par chat/par sujet que celles utilisées par le long polling, donc les tours dagent lents ne bloquent pas lACK de livraison de Telegram.
Le mode Webhook valide les protections de requête, le jeton secret Telegram et le corps JSON avant de renvoyer `200` à Telegram.
OpenClaw traite ensuite la mise à jour de manière asynchrone au moyen des mêmes files de bot par conversation/par sujet que celles utilisées par le long polling, afin que les tours dagent lents ne bloquent pas lACK de livraison de Telegram.
</Accordion>
<Accordion title="Limites, nouvelle tentative et cibles CLI">
<Accordion title="Limites, nouvelles tentatives et cibles CLI">
- `channels.telegram.textChunkLimit` vaut 4000 par défaut.
- `channels.telegram.chunkMode="newline"` préfère les limites de paragraphe (lignes vides) avant le découpage par longueur.
- `channels.telegram.mediaMaxMb` (100 par défaut) limite la taille des médias Telegram entrants et sortants.
- `channels.telegram.mediaGroupFlushMs` (500 par défaut) contrôle combien de temps les albums/groupes de médias Telegram sont mis en tampon avant quOpenClaw ne les distribue comme un seul message entrant. Augmentez cette valeur si des parties dalbum arrivent tard ; diminuez-la pour réduire la latence de réponse aux albums.
- `channels.telegram.timeoutSeconds` remplace le délai dexpiration du client API Telegram (si non défini, la valeur par défaut de grammY sapplique). Les clients de bot plafonnent les valeurs configurées sous la protection de requête de texte/typing sortante de 60 secondes, afin que grammY nabandonne pas la livraison de réponse visible avant que la protection de transport dOpenClaw et le repli puissent sexécuter. Le long polling utilise toujours une protection de requête `getUpdates` de 45 secondes afin que les polls inactifs ne soient pas abandonnés indéfiniment.
- `channels.telegram.pollingStallThresholdMs` vaut `120000` par défaut ; ajustez entre `30000` et `600000` uniquement pour les redémarrages dus à de faux positifs de blocage de polling.
- `channels.telegram.chunkMode="newline"` privilégie les limites de paragraphe (lignes vides) avant le découpage par longueur.
- `channels.telegram.mediaMaxMb` (100 par défaut) plafonne la taille des médias Telegram entrants et sortants.
- `channels.telegram.mediaGroupFlushMs` (500 par défaut) contrôle la durée pendant laquelle les albums/groupes de médias Telegram sont mis en mémoire tampon avant quOpenClaw ne les distribue comme un seul message entrant. Augmentez-la si des parties dalbum arrivent en retard ; diminuez-la pour réduire la latence de réponse aux albums.
- `channels.telegram.timeoutSeconds` remplace le délai dexpiration du client API Telegram (sil nest pas défini, la valeur par défaut de grammY sapplique). Les clients de bot plafonnent les valeurs configurées sous la protection de requête sortante texte/saisie de 60 secondes, afin que grammY nannule pas la livraison visible de la réponse avant que la protection de transport et la solution de repli dOpenClaw puissent sexécuter. Le long polling utilise toujours une protection de requête `getUpdates` de 45 secondes afin que les polls inactifs ne soient pas abandonnés indéfiniment.
- `channels.telegram.pollingStallThresholdMs` vaut `120000` par défaut ; ajustez entre `30000` et `600000` uniquement pour les redémarrages de polling bloqué faussement positifs.
- lhistorique de contexte de groupe utilise `channels.telegram.historyLimit` ou `messages.groupChat.historyLimit` (50 par défaut) ; `0` le désactive.
- le contexte supplémentaire de réponse/citation/transfert est actuellement transmis tel quil est reçu.
- les listes dautorisation Telegram contrôlent principalement qui peut déclencher lagent, pas une frontière complète de caviardage du contexte supplémentaire.
- Contrôles dhistorique des DM :
- le contexte supplémentaire de réponse/citation/transfert est actuellement transmis tel que reçu.
- les listes dautorisation Telegram contrôlent principalement qui peut déclencher lagent, et non une limite complète de masquage du contexte supplémentaire.
- Contrôles dhistorique DM :
- `channels.telegram.dmHistoryLimit`
- `channels.telegram.dms["<user_id>"].historyLimit`
- La config `channels.telegram.retry` sapplique aux helpers denvoi Telegram (CLI/outils/actions) pour les erreurs dAPI sortantes récupérables. La livraison de réponse finale entrante utilise aussi une nouvelle tentative denvoi sûr bornée pour les échecs Telegram avant connexion, mais elle ne réessaie pas les enveloppes réseau ambiguës après envoi qui pourraient dupliquer des messages visibles.
- La configuration `channels.telegram.retry` sapplique aux helpers denvoi Telegram (CLI/outils/actions) pour les erreurs dAPI sortantes récupérables. La livraison de réponse finale entrante utilise également une nouvelle tentative denvoi sûre et bornée pour les échecs Telegram avant connexion, mais elle ne réessaie pas les enveloppes réseau ambiguës après envoi qui pourraient dupliquer les messages visibles.
La cible denvoi CLI peut être un identifiant numérique de chat ou un nom dutilisateur :
La cible denvoi CLI peut être un ID de conversation numérique ou un nom dutilisateur :
```bash
openclaw message send --channel telegram --target 123456789 --message "hi"
@ -764,7 +801,7 @@ openclaw message poll --channel telegram --target -1001234567890:topic:42 \
--poll-duration-seconds 300 --poll-public
```
Flags de poll propres à Telegram :
Indicateurs de poll propres à Telegram :
- `--poll-duration-seconds` (5-600)
- `--poll-anonymous`
@ -774,8 +811,8 @@ openclaw message poll --channel telegram --target -1001234567890:topic:42 \
Lenvoi Telegram prend aussi en charge :
- `--presentation` avec des blocs `buttons` pour les claviers inline lorsque `channels.telegram.capabilities.inlineButtons` lautorise
- `--pin` ou `--delivery '{"pin":true}'` pour demander une livraison épinglée lorsque le bot peut épingler dans ce chat
- `--force-document` pour envoyer des images et GIF sortants comme documents plutôt que comme téléversements de photo compressée ou de média animé
- `--pin` ou `--delivery '{"pin":true}'` pour demander une livraison épinglée lorsque le bot peut épingler dans cette conversation
- `--force-document` pour envoyer les images et GIF sortants comme documents au lieu de téléversements photo compressés ou média animé
Contrôle des actions :
@ -785,20 +822,20 @@ openclaw message poll --channel telegram --target -1001234567890:topic:42 \
</Accordion>
<Accordion title="Approbations exec dans Telegram">
Telegram prend en charge les approbations exec dans les DM des approbateurs et peut éventuellement publier les invites dans le chat ou le sujet dorigine. Les approbateurs doivent être des identifiants numériques dutilisateurs Telegram.
Telegram prend en charge les approbations exec dans les DM des approbateurs et peut facultativement publier les invites dans la conversation ou le sujet dorigine. Les approbateurs doivent être des ID dutilisateurs Telegram numériques.
Chemin de config :
Chemin de configuration :
- `channels.telegram.execApprovals.enabled` (sactive automatiquement quand au moins un approbateur peut être résolu)
- `channels.telegram.execApprovals.approvers` (se replie sur les identifiants numériques de propriétaire depuis `commands.ownerAllowFrom`)
- `channels.telegram.execApprovals.enabled` (sactive automatiquement lorsquau moins un approbateur peut être résolu)
- `channels.telegram.execApprovals.approvers` (se replie sur les ID de propriétaires numériques depuis `commands.ownerAllowFrom`)
- `channels.telegram.execApprovals.target` : `dm` (par défaut) | `channel` | `both`
- `agentFilter`, `sessionFilter`
`channels.telegram.allowFrom`, `groupAllowFrom` et `defaultTo` contrôlent qui peut parler au bot et où il envoie les réponses normales. Ils ne font de personne un approbateur exec. Le premier appairage DM approuvé initialise `commands.ownerAllowFrom` lorsquaucun propriétaire de commande nexiste encore, donc la configuration à propriétaire unique fonctionne toujours sans dupliquer les identifiants sous `execApprovals.approvers`.
`channels.telegram.allowFrom`, `groupAllowFrom` et `defaultTo` contrôlent qui peut parler au bot et où celui-ci envoie les réponses normales. Ils ne transforment pas quelquun en approbateur exec. Le premier appairage DM approuvé amorce `commands.ownerAllowFrom` lorsquaucun propriétaire de commande nexiste encore, de sorte que la configuration à un seul propriétaire fonctionne toujours sans dupliquer les ID sous `execApprovals.approvers`.
La livraison au canal affiche le texte de commande dans le chat ; nactivez `channel` ou `both` que dans les groupes/sujets de confiance. Lorsque linvite arrive dans un sujet de forum, OpenClaw conserve le sujet pour linvite dapprobation et le suivi. Les approbations exec expirent après 30 minutes par défaut.
La livraison dans le canal affiche le texte de la commande dans la conversation ; nactivez `channel` ou `both` que dans des groupes/sujets de confiance. Lorsque linvite arrive dans un sujet de forum, OpenClaw conserve le sujet pour linvite dapprobation et le suivi. Les approbations exec expirent par défaut après 30 minutes.
Les boutons dapprobation inline exigent aussi que `channels.telegram.capabilities.inlineButtons` autorise la surface cible (`dm`, `group` ou `all`). Les identifiants dapprobation préfixés par `plugin:` sont résolus via les approbations de Plugin ; les autres sont dabord résolus via les approbations exec.
Les boutons dapprobation inline nécessitent également que `channels.telegram.capabilities.inlineButtons` autorise la surface cible (`dm`, `group` ou `all`). Les ID dapprobation préfixés par `plugin:` sont résolus via les approbations Plugin ; les autres sont dabord résolus via les approbations exec.
Voir [Approbations exec](/fr/tools/exec-approvals).
@ -807,14 +844,14 @@ openclaw message poll --channel telegram --target -1001234567890:topic:42 \
## Contrôles des réponses derreur
Lorsque lagent rencontre une erreur de livraison ou de fournisseur, Telegram peut soit répondre avec le texte de lerreur, soit la supprimer. Deux clés de config contrôlent ce comportement :
Lorsque lagent rencontre une erreur de livraison ou de fournisseur, Telegram peut répondre avec le texte derreur ou le supprimer. Deux clés de configuration contrôlent ce comportement :
| Clé | Valeurs | Par défaut | Description |
| ----------------------------------- | ----------------- | ---------- | ------------------------------------------------------------------------------------------------------------------------- |
| `channels.telegram.errorPolicy` | `reply`, `silent` | `reply` | `reply` envoie un message derreur convivial au chat. `silent` supprime entièrement les réponses derreur. |
| `channels.telegram.errorCooldownMs` | nombre (ms) | `60000` | Temps minimal entre les réponses derreur au même chat. Empêche le spam derreurs pendant les interruptions de service. |
| Clé | Valeurs | Par défaut | Description |
| ----------------------------------- | ----------------- | ---------- | --------------------------------------------------------------------------------------------------------------------- |
| `channels.telegram.errorPolicy` | `reply`, `silent` | `reply` | `reply` envoie un message derreur convivial à la conversation. `silent` supprime entièrement les réponses derreur. |
| `channels.telegram.errorCooldownMs` | nombre (ms) | `60000` | Temps minimal entre les réponses derreur à la même conversation. Empêche le spam derreurs pendant les pannes. |
Les remplacements par compte, par groupe et par sujet sont pris en charge (même héritage que les autres clés de config Telegram).
Les remplacements par compte, par groupe et par sujet sont pris en charge (même héritage que les autres clés de configuration Telegram).
```json5
{
@ -837,11 +874,11 @@ Les remplacements par compte, par groupe et par sujet sont pris en charge (même
<AccordionGroup>
<Accordion title="Le bot ne répond pas aux messages de groupe sans mention">
- Si `requireMention=false`, le mode de confidentialité Telegram doit permettre une visibilité complète.
- Si `requireMention=false`, le mode confidentialité Telegram doit autoriser la visibilité complète.
- BotFather : `/setprivacy` -> Disable
- puis retirez et rajoutez le bot au groupe
- `openclaw channels status` avertit lorsque la config attend des messages de groupe sans mention.
- `openclaw channels status --probe` peut vérifier des identifiants numériques de groupe explicites ; le caractère générique `"*"` ne peut pas être vérifié par appartenance.
- puis supprimez et rajoutez le bot au groupe
- `openclaw channels status` avertit lorsque la configuration attend des messages de groupe sans mention.
- `openclaw channels status --probe` peut vérifier des ID de groupe numériques explicites ; le joker `"*"` ne peut pas faire lobjet dune vérification dappartenance.
- test rapide de session : `/activation always`.
</Accordion>
@ -850,41 +887,41 @@ Les remplacements par compte, par groupe et par sujet sont pris en charge (même
- lorsque `channels.telegram.groups` existe, le groupe doit être listé (ou inclure `"*"`)
- vérifiez lappartenance du bot au groupe
- consultez les journaux : `openclaw logs --follow` pour les raisons dignorance
- consultez les journaux : `openclaw logs --follow` pour connaître les raisons des ignorés
</Accordion>
<Accordion title="Les commandes fonctionnent partiellement ou pas du tout">
- autorisez votre identité dexpéditeur (appairage et/ou `allowFrom` numérique)
- lautorisation de commande sapplique toujours même lorsque la stratégie de groupe est `open`
- `setMyCommands failed` avec `BOT_COMMANDS_TOO_MUCH` signifie que le menu natif contient trop dentrées ; réduisez les commandes de Plugin/skill/personnalisées ou désactivez les menus natifs
- les appels de démarrage `deleteMyCommands` / `setMyCommands` et les appels de typing `sendChatAction` sont bornés et réessayés une fois via le repli de transport de Telegram en cas dexpiration de requête. Les erreurs réseau/fetch persistantes indiquent généralement des problèmes daccessibilité DNS/HTTPS vers `api.telegram.org`
- autorisez votre identité dexpéditeur (association et/ou `allowFrom` numérique)
- lautorisation des commandes sapplique toujours même lorsque la politique de groupe est `open`
- `setMyCommands failed` avec `BOT_COMMANDS_TOO_MUCH` signifie que le menu natif contient trop dentrées ; réduisez les commandes de Plugin/Skills/personnalisées ou désactivez les menus natifs
- les appels de démarrage `deleteMyCommands` / `setMyCommands` et les appels de saisie `sendChatAction` sont bornés et réessayés une fois via le transport de secours de Telegram en cas de délai dexpiration de la requête. Les erreurs réseau/fetch persistantes indiquent généralement des problèmes daccessibilité DNS/HTTPS vers `api.telegram.org`
</Accordion>
<Accordion title="Le démarrage signale un token non autorisé">
<Accordion title="Le démarrage signale un jeton non autorisé">
- `getMe returned 401` est un échec dauthentification Telegram pour le jeton du bot configuré.
- `getMe returned 401` est un échec dauthentification Telegram pour le jeton de bot configuré.
- Recopiez ou régénérez le jeton du bot dans BotFather, puis mettez à jour `channels.telegram.botToken`, `channels.telegram.tokenFile`, `channels.telegram.accounts.<id>.botToken` ou `TELEGRAM_BOT_TOKEN` pour le compte par défaut.
- `deleteWebhook 401 Unauthorized` au démarrage est aussi un échec dauthentification ; le traiter comme « aucun webhook nexiste » ne ferait que reporter le même échec dû au jeton invalide aux appels dAPI ultérieurs.
- `deleteWebhook 401 Unauthorized` pendant le démarrage est aussi un échec dauthentification ; le traiter comme « aucun webhook nexiste » ne ferait que reporter le même échec dû à un mauvais jeton aux appels API ultérieurs.
</Accordion>
<Accordion title="Polling or network instability">
<Accordion title="Instabilité du polling ou du réseau">
- Node 22+ avec un fetch/proxy personnalisé peut déclencher un comportement dabandon immédiat si les types AbortSignal ne correspondent pas.
- Certains hôtes résolvent dabord `api.telegram.org` en IPv6 ; une sortie IPv6 défectueuse peut provoquer des échecs intermittents de lAPI Telegram.
- Si les journaux incluent `TypeError: fetch failed` ou `Network request for 'getUpdates' failed!`, OpenClaw les réessaie maintenant comme des erreurs réseau récupérables.
- Pendant le démarrage du polling, OpenClaw réutilise la sonde de démarrage `getMe` réussie pour grammY afin que le runner nait pas besoin dun deuxième `getMe` avant le premier `getUpdates`.
- Si `deleteWebhook` échoue avec une erreur réseau transitoire pendant le démarrage du polling, OpenClaw passe au long polling au lieu deffectuer un autre appel de plan de contrôle avant le polling. Un webhook encore actif apparaît comme un conflit `getUpdates` ; OpenClaw reconstruit alors le transport Telegram et réessaie le nettoyage du webhook.
- Si les sockets Telegram sont recyclés selon une cadence fixe courte, vérifiez si `channels.telegram.timeoutSeconds` est bas ; les clients de bot bornent les valeurs configurées en dessous des garde-fous des requêtes sortantes et `getUpdates`, mais les anciennes versions pouvaient abandonner chaque polling ou réponse lorsque cette valeur était définie sous ces garde-fous.
- Si les journaux incluent `Polling stall detected`, OpenClaw redémarre le polling et reconstruit le transport Telegram après 120 secondes sans liveness de long polling terminée par défaut.
- `openclaw channels status --probe` et `openclaw doctor` avertissent lorsquun compte de polling en cours dexécution na pas terminé `getUpdates` après la période de grâce au démarrage, lorsquun compte webhook en cours dexécution na pas terminé `setWebhook` après la période de grâce au démarrage, ou lorsque la dernière activité réussie du transport de polling est obsolète.
- Augmentez `channels.telegram.pollingStallThresholdMs` uniquement lorsque les appels `getUpdates` longs sont sains, mais que votre hôte signale encore à tort des redémarrages pour blocage de polling. Des blocages persistants indiquent généralement des problèmes de proxy, DNS, IPv6 ou sortie TLS entre lhôte et `api.telegram.org`.
- Telegram respecte aussi les variables denvironnement de proxy du processus pour le transport de lAPI Bot, notamment `HTTP_PROXY`, `HTTPS_PROXY`, `ALL_PROXY` et leurs variantes en minuscules. `NO_PROXY` / `no_proxy` peuvent toujours contourner `api.telegram.org`.
- Si le proxy géré par OpenClaw est configuré via `OPENCLAW_PROXY_URL` pour un environnement de service et quaucune variable denvironnement de proxy standard nest présente, Telegram utilise aussi cette URL pour le transport de lAPI Bot.
- Sur les hôtes VPS dont la sortie directe/TLS est instable, routez les appels à lAPI Telegram via `channels.telegram.proxy` :
- Node 22+ + fetch/proxy personnalisé peuvent déclencher un comportement dabandon immédiat si les types AbortSignal ne correspondent pas.
- Certains hôtes résolvent dabord `api.telegram.org` en IPv6 ; une sortie IPv6 défaillante peut provoquer des échecs intermittents de lAPI Telegram.
- Si les journaux incluent `TypeError: fetch failed` ou `Network request for 'getUpdates' failed!`, OpenClaw réessaie désormais ces erreurs comme des erreurs réseau récupérables.
- Pendant le démarrage du polling, OpenClaw réutilise la sonde `getMe` réussie du démarrage pour grammY, afin que le runner nait pas besoin dun second `getMe` avant le premier `getUpdates`.
- Si `deleteWebhook` échoue avec une erreur réseau transitoire pendant le démarrage du polling, OpenClaw continue en long polling au lieu deffectuer un autre appel de plan de contrôle avant le polling. Un webhook encore actif apparaît comme un conflit `getUpdates` ; OpenClaw reconstruit alors le transport Telegram et réessaie le nettoyage du webhook.
- Si les sockets Telegram sont recyclés selon une cadence fixe courte, vérifiez si `channels.telegram.timeoutSeconds` est faible ; les clients de bot bornent les valeurs configurées sous les garde-fous des requêtes sortantes et `getUpdates`, mais les anciennes versions pouvaient interrompre chaque polling ou réponse lorsque cette valeur était définie sous ces garde-fous.
- Si les journaux incluent `Polling stall detected`, OpenClaw redémarre le polling et reconstruit le transport Telegram après 120 secondes sans signal de vivacité de long polling terminé par défaut.
- `openclaw channels status --probe` et `openclaw doctor` avertissent lorsquun compte de polling en cours dexécution na pas terminé `getUpdates` après la période de grâce du démarrage, lorsquun compte webhook en cours dexécution na pas terminé `setWebhook` après la période de grâce du démarrage, ou lorsque la dernière activité réussie du transport de polling est obsolète.
- Naugmentez `channels.telegram.pollingStallThresholdMs` que lorsque les appels `getUpdates` longue durée sont sains mais que votre hôte signale toujours à tort des redémarrages pour blocage du polling. Des blocages persistants indiquent généralement des problèmes de proxy, DNS, IPv6 ou de sortie TLS entre lhôte et `api.telegram.org`.
- Telegram respecte aussi les variables denvironnement de proxy du processus pour le transport Bot API, notamment `HTTP_PROXY`, `HTTPS_PROXY`, `ALL_PROXY` et leurs variantes en minuscules. `NO_PROXY` / `no_proxy` peuvent toujours contourner `api.telegram.org`.
- Si le proxy géré par OpenClaw est configuré via `OPENCLAW_PROXY_URL` pour un environnement de service et quaucune variable denvironnement de proxy standard nest présente, Telegram utilise aussi cette URL pour le transport Bot API.
- Sur les hôtes VPS avec une sortie directe/TLS instable, routez les appels à lAPI Telegram via `channels.telegram.proxy` :
```yaml
channels:
@ -892,7 +929,7 @@ channels:
proxy: socks5://<user>:<password>@proxy-host:1080
```
- Node 22+ utilise par défaut `autoSelectFamily=true` (sauf WSL2). Lordre des résultats DNS Telegram respecte `OPENCLAW_TELEGRAM_DNS_RESULT_ORDER`, puis `channels.telegram.network.dnsResultOrder`, puis la valeur par défaut du processus comme `NODE_OPTIONS=--dns-result-order=ipv4first` ; si aucune ne sapplique, Node 22+ revient à `ipv4first`.
- Node 22+ utilise par défaut `autoSelectFamily=true` (sauf WSL2). Lordre des résultats DNS de Telegram respecte `OPENCLAW_TELEGRAM_DNS_RESULT_ORDER`, puis `channels.telegram.network.dnsResultOrder`, puis la valeur par défaut du processus comme `NODE_OPTIONS=--dns-result-order=ipv4first` ; si rien ne sapplique, Node 22+ revient à `ipv4first`.
- Si votre hôte est WSL2 ou fonctionne explicitement mieux avec un comportement IPv4 uniquement, forcez la sélection de famille :
```yaml
@ -902,11 +939,11 @@ channels:
autoSelectFamily: false
```
- Les réponses de plage de benchmark RFC 2544 (`198.18.0.0/15`) sont déjà autorisées
- Les réponses dans la plage de référence RFC 2544 (`198.18.0.0/15`) sont déjà autorisées
par défaut pour les téléchargements de médias Telegram. Si un faux IP de confiance ou
un proxy transparent réécrit `api.telegram.org` vers une autre
adresse privée/interne/à usage spécial pendant les téléchargements de médias, vous pouvez
activer le contournement limité à Telegram :
activer le contournement réservé à Telegram :
```yaml
channels:
@ -917,19 +954,19 @@ channels:
- La même activation est disponible par compte à
`channels.telegram.accounts.<accountId>.network.dangerouslyAllowPrivateNetwork`.
- Si votre proxy résout les hôtes de médias Telegram vers `198.18.x.x`, laissez dabord
lindicateur dangereux désactivé. Les médias Telegram autorisent déjà la plage de
benchmark RFC 2544 par défaut.
- Si votre proxy résout les hôtes de médias Telegram en `198.18.x.x`, laissez dabord
lindicateur dangereux désactivé. Les médias Telegram autorisent déjà la plage de référence
RFC 2544 par défaut.
<Warning>
`channels.telegram.network.dangerouslyAllowPrivateNetwork` affaiblit les protections SSRF
des médias Telegram. Utilisez-le uniquement pour des environnements de proxy de confiance
contrôlés par lopérateur, comme le routage fake-IP de Clash, Mihomo ou Surge lorsquils
synthétisent des réponses privées ou à usage spécial en dehors de la plage de benchmark
`channels.telegram.network.dangerouslyAllowPrivateNetwork` affaiblit les
protections SSRF des médias Telegram. Utilisez-le uniquement pour des environnements de proxy
de confiance contrôlés par lopérateur, tels que le routage de faux IP Clash, Mihomo ou Surge,
lorsquils synthétisent des réponses privées ou à usage spécial hors de la plage de référence
RFC 2544. Laissez-le désactivé pour un accès Telegram normal à linternet public.
</Warning>
- Remplacements par lenvironnement (temporaires) :
- Remplacements denvironnement (temporaires) :
- `OPENCLAW_TELEGRAM_DISABLE_AUTO_SELECT_FAMILY=1`
- `OPENCLAW_TELEGRAM_ENABLE_AUTO_SELECT_FAMILY=1`
- `OPENCLAW_TELEGRAM_DNS_RESULT_ORDER=ipv4first`
@ -949,17 +986,17 @@ Aide supplémentaire : [Dépannage des canaux](/fr/channels/troubleshooting).
Référence principale : [Référence de configuration - Telegram](/fr/gateway/config-channels#telegram).
<Accordion title="High-signal Telegram fields">
<Accordion title="Champs Telegram à fort signal">
- démarrage/authentification : `enabled`, `botToken`, `tokenFile`, `accounts.*` (`tokenFile` doit pointer vers un fichier standard ; les liens symboliques sont rejetés)
- démarrage/authentification : `enabled`, `botToken`, `tokenFile`, `accounts.*` (`tokenFile` doit pointer vers un fichier ordinaire ; les liens symboliques sont rejetés)
- contrôle daccès : `dmPolicy`, `allowFrom`, `groupPolicy`, `groupAllowFrom`, `groups`, `groups.*.topics.*`, `bindings[]` de premier niveau (`type: "acp"`)
- approbations dexécution : `execApprovals`, `accounts.*.execApprovals`
- approbations exec : `execApprovals`, `accounts.*.execApprovals`
- commande/menu : `commands.native`, `commands.nativeSkills`, `customCommands`
- fils/réponses : `replyToMode`, `dm.threadReplies`, `direct.*.threadReplies`
- streaming : `streaming` (aperçu), `streaming.preview.toolProgress`, `blockStreaming`
- mise en forme/livraison : `textChunkLimit`, `chunkMode`, `linkPreview`, `responsePrefix`
- médias/réseau : `mediaMaxMb`, `mediaGroupFlushMs`, `timeoutSeconds`, `pollingStallThresholdMs`, `retry`, `network.autoSelectFamily`, `network.dangerouslyAllowPrivateNetwork`, `proxy`
- racine dAPI personnalisée : `apiRoot` (racine de lAPI Bot uniquement ; nincluez pas `/bot<TOKEN>`)
- racine dAPI personnalisée : `apiRoot` (racine Bot API uniquement ; nincluez pas `/bot<TOKEN>`)
- webhook : `webhookUrl`, `webhookSecret`, `webhookPath`, `webhookHost`
- actions/capacités : `capabilities.inlineButtons`, `actions.sendMessage|editMessage|deleteMessage|reactions|sticker`
- réactions : `reactionNotifications`, `reactionLevel`
@ -969,28 +1006,28 @@ Référence principale : [Référence de configuration - Telegram](/fr/gateway/c
</Accordion>
<Note>
Priorité multi-compte : lorsque deux identifiants de compte ou plus sont configurés, définissez `channels.telegram.defaultAccount` (ou incluez `channels.telegram.accounts.default`) pour rendre le routage par défaut explicite. Sinon, OpenClaw revient au premier identifiant de compte normalisé et `openclaw doctor` émet un avertissement. Les comptes nommés héritent de `channels.telegram.allowFrom` / `groupAllowFrom`, mais pas des valeurs `accounts.default.*`.
Priorité multi-compte : lorsque deux ID de compte ou plus sont configurés, définissez `channels.telegram.defaultAccount` (ou incluez `channels.telegram.accounts.default`) afin de rendre le routage par défaut explicite. Sinon, OpenClaw revient au premier ID de compte normalisé et `openclaw doctor` émet un avertissement. Les comptes nommés héritent de `channels.telegram.allowFrom` / `groupAllowFrom`, mais pas des valeurs `accounts.default.*`.
</Note>
## Connexe
## Associés
<CardGroup cols={2}>
<Card title="Pairing" icon="link" href="/fr/channels/pairing">
Associer un utilisateur Telegram au gateway.
<Card title="Association" icon="link" href="/fr/channels/pairing">
Associez un utilisateur Telegram à la passerelle.
</Card>
<Card title="Groups" icon="users" href="/fr/channels/groups">
<Card title="Groupes" icon="users" href="/fr/channels/groups">
Comportement de liste dautorisation des groupes et des sujets.
</Card>
<Card title="Channel routing" icon="route" href="/fr/channels/channel-routing">
Router les messages entrants vers les agents.
<Card title="Routage de canal" icon="route" href="/fr/channels/channel-routing">
Routez les messages entrants vers les agents.
</Card>
<Card title="Security" icon="shield" href="/fr/gateway/security">
<Card title="Sécurité" icon="shield" href="/fr/gateway/security">
Modèle de menace et durcissement.
</Card>
<Card title="Multi-agent routing" icon="sitemap" href="/fr/concepts/multi-agent">
Associer les groupes et les sujets aux agents.
<Card title="Routage multi-agent" icon="sitemap" href="/fr/concepts/multi-agent">
Mappez les groupes et les sujets aux agents.
</Card>
<Card title="Troubleshooting" icon="wrench" href="/fr/channels/troubleshooting">
Diagnostics intercanaux.
<Card title="Dépannage" icon="wrench" href="/fr/channels/troubleshooting">
Diagnostics inter-canaux.
</Card>
</CardGroup>

View File

@ -3,92 +3,92 @@ read_when:
- Vous devez comprendre pourquoi une tâche CI sest exécutée ou non
- Vous déboguez une vérification GitHub Actions en échec
- Vous coordonnez une exécution ou une réexécution de validation de version
- Vous modifiez le déclenchement de ClawSweeper ou le transfert dactivité GitHub
summary: Graphe des jobs CI, gates de périmètre, regroupements de publication et équivalents des commandes locales
- Vous modifiez la répartition ClawSweeper ou la transmission de lactivité GitHub
summary: Graphe des jobs CI, garde-fous de périmètre, regroupements de publication et équivalents des commandes locales
title: Pipeline CI
x-i18n:
generated_at: "2026-05-03T21:27:40Z"
generated_at: "2026-05-04T07:03:15Z"
model: gpt-5.5
provider: openai
source_hash: e07fc44aa844cb66ce529c570cbbbbf502a61bcbcbc3d9488557abb459ef7678
source_hash: 72959d0feaf1339f01c9da263153fd89cc4727da6f928933819931991222714d
source_path: ci.md
workflow: 16
---
OpenClaw CI sexécute à chaque push vers `main` et à chaque pull request. Le job `preflight` classe le diff et désactive les lanes coûteuses lorsque seules des zones sans rapport ont changé. Les exécutions manuelles `workflow_dispatch` contournent volontairement le ciblage intelligent et déploient tout le graphe pour les release candidates et les validations larges. Les lanes Android restent opt-in via `include_android`. La couverture Plugin réservée aux releases se trouve dans le workflow séparé [`Plugin Prerelease`](#plugin-prerelease) et ne sexécute qu’à partir de [`Full Release Validation`](#full-release-validation) ou dun dispatch manuel explicite.
OpenClaw CI sexécute à chaque push vers `main` et pour chaque pull request. Le job `preflight` classe le diff et désactive les lanes coûteuses quand seules des zones sans rapport ont changé. Les exécutions manuelles `workflow_dispatch` contournent volontairement le périmétrage intelligent et déploient tout le graphe pour les release candidates et les validations larges. Les lanes Android restent optionnelles via `include_android`. La couverture Plugin réservée aux releases vit dans le workflow séparé [`Plugin Prerelease`](#plugin-prerelease) et ne sexécute que depuis [`Full Release Validation`](#full-release-validation) ou une dispatch manuelle explicite.
## Vue densemble du pipeline
| Job | Objectif | Quand il sexécute |
| -------------------------------- | ------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------- |
| `preflight` | Détecter les changements limités aux docs, les portées modifiées, les extensions modifiées, et construire le manifeste CI | Toujours sur les pushs et PRs non draft |
| `security-scm-fast` | Détection de clés privées et audit des workflows via `zizmor` | Toujours sur les pushs et PRs non draft |
| `security-dependency-audit` | Audit du lockfile de production sans dépendances par rapport aux advisories npm | Toujours sur les pushs et PRs non draft |
| `security-fast` | Agrégat requis pour les jobs de sécurité rapides | Toujours sur les pushs et PRs non draft |
| `check-dependencies` | Passe Knip de production limitée aux dépendances plus garde de lallowlist des fichiers inutilisés | Changements concernant Node |
| `build-artifacts` | Construire `dist/`, Control UI, les vérifications dartifacts construits, et les artifacts réutilisables en aval | Changements concernant Node |
| `checks-fast-core` | Lanes de correction Linux rapides comme les vérifications bundled/plugin-contract/protocol | Changements concernant Node |
| `checks-fast-contracts-channels` | Vérifications shardées des contrats de canaux avec un résultat de vérification agrégé stable | Changements concernant Node |
| `checks-node-core-test` | Shards de tests Node cœur, hors lanes canaux, bundled, contrats et extensions | Changements concernant Node |
| `check` | Équivalent shardé de la gate locale principale : types prod, lint, gardes, types de test, et smoke strict | Changements concernant Node |
| `check-additional` | Architecture, dérive shardée boundary/prompt, gardes dextensions, frontière de package et surveillance Gateway | Changements concernant Node |
| `build-smoke` | Tests smoke de la CLI construite et smoke de mémoire au démarrage | Changements concernant Node |
| `checks` | Vérificateur pour les tests de canaux sur artifacts construits | Changements concernant Node |
| `checks-node-compat-node22` | Lane de build et smoke de compatibilité Node 22 | Dispatch CI manuel pour les releases |
| `check-docs` | Formatage, lint et vérifications de liens cassés des docs | Docs modifiées |
| `skills-python` | Ruff + pytest pour les Skills adossés à Python | Changements concernant les Skills Python |
| `checks-windows` | Tests spécifiques Windows de processus/chemins plus régressions partagées de spécificateurs dimport runtime | Changements concernant Windows |
| `macos-node` | Lane de tests TypeScript macOS utilisant les artifacts construits partagés | Changements concernant macOS |
| `macos-swift` | Lint, build et tests Swift pour lapp macOS | Changements concernant macOS |
| `android` | Tests unitaires Android pour les deux flavors plus un build dAPK debug | Changements concernant Android |
| `test-performance-agent` | Optimisation quotidienne des tests lents Codex après activité fiable | Succès de la CI principale ou dispatch manuel |
| `openclaw-performance` | Rapports de performance runtime Kova quotidiens/à la demande avec lanes mock-provider, deep-profile et GPT 5.4 live | Planifié et dispatch manuel |
| Job | Objectif | Quand il sexécute |
| -------------------------------- | --------------------------------------------------------------------------------------------------------- | ---------------------------------- |
| `preflight` | Détecter les changements docs-only, les portées modifiées, les extensions modifiées et générer le manifeste CI | Toujours sur les pushs et PRs non draft |
| `security-scm-fast` | Détection de clés privées et audit des workflows via `zizmor` | Toujours sur les pushs et PRs non draft |
| `security-dependency-audit` | Audit du lockfile de production sans dépendances par rapport aux avis npm | Toujours sur les pushs et PRs non draft |
| `security-fast` | Agrégat requis pour les jobs de sécurité rapides | Toujours sur les pushs et PRs non draft |
| `check-dependencies` | Passe Knip de production limitée aux dépendances, plus garde de lallowlist des fichiers inutilisés | Changements pertinents pour Node |
| `build-artifacts` | Générer `dist/`, Control UI, les vérifications dartefacts générés et les artefacts aval réutilisables | Changements pertinents pour Node |
| `checks-fast-core` | Lanes Linux rapides de correction, comme les vérifications bundled/plugin-contract/protocol | Changements pertinents pour Node |
| `checks-fast-contracts-channels` | Vérifications de contrats de channels shardées avec un résultat de vérification agrégé stable | Changements pertinents pour Node |
| `checks-node-core-test` | Shards de tests Node du cœur, hors lanes de channel, bundled, contract et extension | Changements pertinents pour Node |
| `check` | Équivalent shardé de la gate locale principale : types prod, lint, guards, types de test et smoke strict | Changements pertinents pour Node |
| `check-additional` | Architecture, boundary/prompt drift shardés, guards dextension, boundary de package et gateway watch | Changements pertinents pour Node |
| `build-smoke` | Tests smoke de la CLI générée et smoke de mémoire au démarrage | Changements pertinents pour Node |
| `checks` | Vérificateur pour les tests de channel sur artefacts générés | Changements pertinents pour Node |
| `checks-node-compat-node22` | Lane de build et smoke de compatibilité Node 22 | Dispatch CI manuelle pour les releases |
| `check-docs` | Formatage, lint et vérifications de liens cassés de la documentation | Docs modifiées |
| `skills-python` | Ruff + pytest pour les Skills adossés à Python | Changements pertinents pour les Skills Python |
| `checks-windows` | Tests Windows spécifiques aux processus/chemins, plus régressions partagées de spécificateurs dimport runtime | Changements pertinents pour Windows |
| `macos-node` | Lane de tests TypeScript macOS utilisant les artefacts générés partagés | Changements pertinents pour macOS |
| `macos-swift` | Lint, build et tests Swift pour lapp macOS | Changements pertinents pour macOS |
| `android` | Tests unitaires Android pour les deux flavors, plus un build dAPK debug | Changements pertinents pour Android |
| `test-performance-agent` | Optimisation quotidienne des tests lents par Codex après une activité fiable | Succès de la CI principale ou dispatch manuelle |
| `openclaw-performance` | Rapports de performance runtime Kova quotidiens/à la demande avec lanes mock-provider, deep-profile et GPT 5.4 live | Planification et dispatch manuelle |
## Ordre fail-fast
## Ordre de fail-fast
1. `preflight` décide quelles lanes existent réellement. Les logiques `docs-scope` et `changed-scope` sont des étapes de ce job, pas des jobs autonomes.
2. `security-scm-fast`, `security-dependency-audit`, `security-fast`, `check`, `check-additional`, `check-docs` et `skills-python` échouent rapidement sans attendre les jobs plus lourds dartifacts et de matrices de plateformes.
3. `build-artifacts` chevauche les lanes Linux rapides afin que les consommateurs en aval puissent démarrer dès que le build partagé est prêt.
2. `security-scm-fast`, `security-dependency-audit`, `security-fast`, `check`, `check-additional`, `check-docs` et `skills-python` échouent rapidement sans attendre les jobs plus lourds dartefacts et de matrices de plateformes.
3. `build-artifacts` chevauche les lanes Linux rapides afin que les consommateurs aval puissent démarrer dès que le build partagé est prêt.
4. Les lanes plus lourdes de plateformes et de runtime se déploient ensuite : `checks-fast-core`, `checks-fast-contracts-channels`, `checks-node-core-test`, `checks`, `checks-windows`, `macos-node`, `macos-swift` et `android`.
GitHub peut marquer des jobs remplacés comme `cancelled` lorsquun push plus récent arrive sur la même PR ou ref `main`. Traitez cela comme du bruit CI sauf si lexécution la plus récente pour la même ref échoue aussi. Les vérifications agrégées de shards utilisent `!cancelled() && always()` afin de toujours signaler les échecs normaux de shards, sans toutefois se mettre en file après que tout le workflow a déjà été remplacé. La clé de concurrence CI automatique est versionnée (`CI-v7-*`) afin quun zombie côté GitHub dans un ancien groupe de file ne puisse pas bloquer indéfiniment les exécutions plus récentes de main. Les exécutions manuelles de la suite complète utilisent `CI-manual-v1-*` et nannulent pas les exécutions en cours.
GitHub peut marquer des jobs supplantés comme `cancelled` lorsquun push plus récent arrive sur la même PR ou ref `main`. Traitez cela comme du bruit CI, sauf si la plus récente exécution pour la même ref échoue aussi. Les vérifications agrégées de shards utilisent `!cancelled() && always()` afin de toujours signaler les échecs normaux de shards sans se mettre en file après que tout le workflow a déjà été supplanté. La clé de concurrence CI automatique est versionnée (`CI-v7-*`) afin quun zombie côté GitHub dans un ancien groupe de file ne puisse pas bloquer indéfiniment les exécutions main plus récentes. Les exécutions manuelles de suite complète utilisent `CI-manual-v1-*` et nannulent pas les exécutions en cours.
## Portée et routage
La logique de portée se trouve dans `scripts/ci-changed-scope.mjs` et est couverte par des tests unitaires dans `src/scripts/ci-changed-scope.test.ts`. Le dispatch manuel ignore la détection `changed-scope` et fait agir le manifeste preflight comme si chaque zone portée avait changé.
La logique de portée vit dans `scripts/ci-changed-scope.mjs` et est couverte par des tests unitaires dans `src/scripts/ci-changed-scope.test.ts`. La dispatch manuelle saute la détection `changed-scope` et fait agir le manifeste preflight comme si chaque zone délimitée avait changé.
- **Les modifications du workflow CI** valident le graphe CI Node plus le lint des workflows, mais ne forcent pas à elles seules les builds natifs Windows, Android ou macOS ; ces lanes de plateformes restent limitées aux changements de sources de plateforme.
- **Les modifications limitées au routage CI, certaines modifications peu coûteuses de fixtures de core-test, et les modifications étroites de helpers/tests de routage de contrats Plugin** utilisent un chemin de manifeste rapide Node uniquement : `preflight`, sécurité, et une seule tâche `checks-fast-core`. Ce chemin ignore les artifacts de build, la compatibilité Node 22, les contrats de canaux, les shards cœur complets, les shards de Plugins bundled et les matrices de gardes supplémentaires lorsque le changement est limité aux surfaces de routage ou de helpers exercées directement par la tâche rapide.
- **Les vérifications Node Windows** sont limitées aux wrappers de processus/chemins spécifiques Windows, aux helpers de runners npm/pnpm/UI, à la config du gestionnaire de packages et aux surfaces du workflow CI qui exécutent cette lane ; les changements sans rapport dans les sources, Plugins, install-smoke et tests restent sur les lanes Node Linux.
- **Les modifications de workflow CI** valident le graphe CI Node plus le linting de workflow, mais ne forcent pas à elles seules les builds natifs Windows, Android ou macOS ; ces lanes de plateforme restent limitées aux changements de sources de plateforme.
- **Les modifications limitées au routage CI, certaines modifications peu coûteuses de fixtures de tests core et les modifications étroites dhelpers/tests de routage de contrats Plugin** utilisent un chemin rapide de manifeste Node-only : `preflight`, sécurité et une seule tâche `checks-fast-core`. Ce chemin saute les artefacts de build, la compatibilité Node 22, les contrats de channels, les shards core complets, les shards de bundled plugins et les matrices de guards additionnelles lorsque le changement est limité aux surfaces de routage ou dhelpers que la tâche rapide exerce directement.
- **Les vérifications Node Windows** sont limitées aux wrappers processus/chemins spécifiques à Windows, aux helpers de runners npm/pnpm/UI, à la configuration du gestionnaire de packages et aux surfaces du workflow CI qui exécutent cette lane ; les changements de sources sans rapport, de plugins, dinstall-smoke et de tests seuls restent sur les lanes Node Linux.
Les familles de tests Node les plus lentes sont scindées ou équilibrées afin que chaque job reste petit sans sur-réserver des runners : les contrats de canaux sexécutent en trois shards pondérés, les lanes core unit fast/support sexécutent séparément, linfra runtime cœur est scindée entre shards état et processus/config, auto-reply sexécute avec des workers équilibrés (avec le sous-arbre reply scindé en shards agent-runner, dispatch et commands/state-routing), et les configs agentiques gateway/server sont scindées sur des lanes chat/auth/model/http-plugin/runtime/startup au lieu dattendre les artifacts construits. Les tests larges navigateur, QA, média et plugins divers utilisent leurs configs Vitest dédiées au lieu du catch-all Plugin partagé. Les shards à motifs dinclusion enregistrent des entrées de timing avec le nom du shard CI, afin que `.artifacts/vitest-shard-timings.json` puisse distinguer une config entière dun shard filtré. `check-additional` garde ensemble le travail de compilation/canary de frontière de package et sépare larchitecture de topologie runtime de la couverture de surveillance Gateway ; la liste de gardes de frontière est répartie sur quatre shards de matrice, chacun exécutant simultanément des gardes indépendantes sélectionnées et imprimant les timings par vérification, y compris `pnpm prompt:snapshots:check`, afin que la dérive de prompt du chemin heureux runtime Codex soit rattachée à la PR qui la causée. La surveillance Gateway, les tests de canaux et le shard de frontière de support cœur sexécutent simultanément dans `build-artifacts` après que `dist/` et `dist-runtime/` ont déjà été construits.
Les familles de tests Node les plus lentes sont divisées ou équilibrées afin que chaque job reste petit sans réserver trop de runners : les contrats de channels sexécutent en trois shards pondérés, les lanes core unit fast/support sexécutent séparément, linfra runtime core est divisée entre shards state et process/config, auto-reply sexécute comme des workers équilibrés (avec le sous-arbre reply divisé en shards agent-runner, dispatch et commands/state-routing), et les configs agentic gateway/server sont divisées entre lanes chat/auth/model/http-plugin/runtime/startup au lieu dattendre les artefacts générés. Les tests larges browser, QA, media et de plugins divers utilisent leurs configs Vitest dédiées au lieu du catch-all partagé des plugins. Les shards include-pattern enregistrent les entrées de timing avec le nom de shard CI, afin que `.artifacts/vitest-shard-timings.json` puisse distinguer une config entière dun shard filtré. `check-additional` garde ensemble le travail compile/canary de package-boundary et sépare larchitecture de topologie runtime de la couverture gateway watch ; la liste de guards boundary est répartie sur quatre shards de matrice, chacun exécutant des guards indépendants sélectionnés en parallèle et affichant les timings par vérification, y compris `pnpm prompt:snapshots:check` afin que la dérive de prompt du chemin nominal du runtime Codex soit rattachée à la PR qui la causée. Gateway watch, les tests de channels et le shard core support-boundary sexécutent en parallèle dans `build-artifacts` après que `dist/` et `dist-runtime/` ont déjà été générés.
La CI Android exécute à la fois `testPlayDebugUnitTest` et `testThirdPartyDebugUnitTest`, puis construit lAPK debug Play. Le flavor tiers na pas de source set ni de manifeste séparé ; sa lane de tests unitaires compile tout de même le flavor avec les flags BuildConfig SMS/call-log, tout en évitant un job de packaging dAPK debug en double à chaque push concernant Android.
La CI Android exécute à la fois `testPlayDebugUnitTest` et `testThirdPartyDebugUnitTest`, puis génère lAPK debug Play. Le flavor third-party na pas de source set ni de manifeste séparé ; sa lane de tests unitaires compile quand même le flavor avec les flags BuildConfig SMS/call-log, tout en évitant un job de packaging dAPK debug dupliqué à chaque push pertinent pour Android.
Le shard `check-dependencies` exécute `pnpm deadcode:dependencies` (une passe Knip de production limitée aux dépendances, épinglée à la dernière version de Knip, avec lâge minimal de release de pnpm désactivé pour linstallation `dlx`) et `pnpm deadcode:unused-files`, qui compare les résultats de fichiers de production inutilisés de Knip à `scripts/deadcode-unused-files.allowlist.mjs`. La garde des fichiers inutilisés échoue lorsquune PR ajoute un nouveau fichier inutilisé non revu ou laisse une entrée dallowlist obsolète, tout en préservant les surfaces intentionnelles de Plugin dynamique, générées, build, live-test et pont de package que Knip ne peut pas résoudre statiquement.
Le shard `check-dependencies` exécute `pnpm deadcode:dependencies` (une passe Knip de production limitée aux dépendances, épinglée à la dernière version de Knip, avec lâge minimal de publication de pnpm désactivé pour linstallation `dlx`) et `pnpm deadcode:unused-files`, qui compare les résultats de fichiers de production inutilisés trouvés par Knip à `scripts/deadcode-unused-files.allowlist.mjs`. Le guard des fichiers inutilisés échoue lorsquune PR ajoute un nouveau fichier inutilisé non revu ou laisse une entrée dallowlist obsolète, tout en préservant les surfaces intentionnelles de plugins dynamiques, générées, de build, de live-test et de pont de package que Knip ne peut pas résoudre statiquement.
## Transfert de lactivité ClawSweeper
## Transfert dactivité ClawSweeper
`.github/workflows/clawsweeper-dispatch.yml` est le pont côté cible entre lactivité du dépôt OpenClaw et ClawSweeper. Il ne checkout ni nexécute de code de pull request non fiable. Le workflow crée un token GitHub App à partir de `CLAWSWEEPER_APP_PRIVATE_KEY`, puis dispatch des payloads `repository_dispatch` compacts vers `openclaw/clawsweeper`.
`.github/workflows/clawsweeper-dispatch.yml` est le pont côté cible entre lactivité du dépôt OpenClaw et ClawSweeper. Il ne checkout pas et nexécute pas de code de pull request non fiable. Le workflow crée un token GitHub App à partir de `CLAWSWEEPER_APP_PRIVATE_KEY`, puis envoie des payloads `repository_dispatch` compacts à `openclaw/clawsweeper`.
Le workflow comporte quatre lanes :
- `clawsweeper_item` pour les demandes exactes de revue dissue et de pull request ;
- `clawsweeper_item` pour les demandes exactes de revue dissues et de pull requests ;
- `clawsweeper_comment` pour les commandes ClawSweeper explicites dans les commentaires dissues ;
- `clawsweeper_commit_review` pour les demandes de revue au niveau commit sur les pushs vers `main` ;
- `github_activity` pour lactivité GitHub générale que lagent ClawSweeper peut inspecter.
La lane `github_activity` transfère uniquement des métadonnées normalisées : type dévénement, action, acteur, dépôt, numéro délément, URL, titre, état, et courts extraits de commentaires ou de reviews lorsquils sont présents. Elle évite volontairement de transférer le corps complet du Webhook. Le workflow récepteur dans `openclaw/clawsweeper` est `.github/workflows/github-activity.yml`, qui publie lévénement normalisé vers le hook OpenClaw Gateway pour lagent ClawSweeper.
La lane `github_activity` transfère uniquement des métadonnées normalisées : type dévénement, action, acteur, dépôt, numéro délément, URL, titre, état et courts extraits pour les commentaires ou reviews lorsquils sont présents. Elle évite volontairement de transférer le corps complet du Webhook. Le workflow récepteur dans `openclaw/clawsweeper` est `.github/workflows/github-activity.yml`, qui publie lévénement normalisé vers le hook OpenClaw Gateway pour lagent ClawSweeper.
Lactivité générale relève de lobservation, pas dune livraison par défaut. Lagent ClawSweeper reçoit la cible Discord dans son prompt et ne devrait publier dans `#clawsweeper` que lorsque lévénement est surprenant, actionnable, risqué ou utile sur le plan opérationnel. Les ouvertures routinières, éditions, bruit de bots, bruit de Webhook en doublon et trafic normal de reviews devraient produire `NO_REPLY`.
Lactivité générale est une observation, pas une livraison par défaut. Lagent ClawSweeper reçoit la cible Discord dans son prompt et ne doit publier dans `#clawsweeper` que lorsque lévénement est surprenant, actionnable, risqué ou utile sur le plan opérationnel. Les ouvertures routinières, modifications, agitation de bots, bruit de Webhook dupliqué et trafic normal de review doivent produire `NO_REPLY`.
Traitez les titres, commentaires, corps, textes de review, noms de branches et messages de commit GitHub comme des données non fiables tout au long de ce chemin. Ce sont des entrées pour la synthèse et le triage, pas des instructions pour le workflow ou le runtime de lagent.
## Dispatchs manuels
## Dispatchs manuelles
Les dispatchs CI manuels exécutent le même graphe de jobs que la CI normale, mais activent de force chaque lane scoped non Android : shards Linux Node, shards de plugins intégrés, contrats de canaux, compatibilité Node 22, `check`, `check-additional`, smoke build, vérifications docs, Skills Python, Windows, macOS et i18n de Control UI. Les dispatchs CI manuels autonomes exécutent uniquement Android avec `include_android=true` ; lumbrella de release complète active Android en passant `include_android=true`. Les vérifications statiques de prérelease de Plugin, le shard `agentic-plugins` réservé à la release, le sweep complet par lot des extensions et les lanes Docker de prérelease de plugin sont exclus de la CI. La suite Docker de prérelease sexécute uniquement lorsque `Full Release Validation` déclenche le workflow séparé `Plugin Prerelease` avec le gate de validation de release activé.
Les dispatchs CI manuels exécutent le même graphe de jobs que la CI normale, mais activent de force chaque lane à portée non Android : fragments Linux Node, fragments de Plugins groupés, contrats de canaux, compatibilité Node 22, `check`, `check-additional`, smoke de build, vérifications docs, Skills Python, Windows, macOS et i18n de Control UI. Les dispatchs CI manuels autonomes exécutent uniquement Android avec `include_android=true` ; lombrelle de release complète active Android en transmettant `include_android=true`. Les vérifications statiques de préversion de Plugin, le fragment `agentic-plugins` réservé aux releases, le sweep complet par lot des extensions et les lanes Docker de préversion de Plugin sont exclus de la CI. La suite Docker de préversion sexécute uniquement lorsque `Full Release Validation` déclenche le workflow `Plugin Prerelease` séparé avec la gate de validation de release activée.
Les exécutions manuelles utilisent un groupe de concurrence unique afin quune suite complète de release candidate ne soit pas annulée par une autre exécution push ou PR sur la même ref. Lentrée optionnelle `target_ref` permet à un appelant de confiance dexécuter ce graphe sur une branche, un tag ou un SHA de commit complet tout en utilisant le fichier de workflow depuis la ref de dispatch sélectionnée.
Les exécutions manuelles utilisent un groupe de concurrence unique afin quune suite complète de release candidate ne soit pas annulée par un autre push ou une exécution de PR sur la même ref. Lentrée facultative `target_ref` permet à un appelant de confiance dexécuter ce graphe sur une branche, un tag ou un SHA de commit complet tout en utilisant le fichier de workflow depuis la ref de dispatch sélectionnée.
```bash
gh workflow run ci.yml --ref release/YYYY.M.D
@ -98,15 +98,15 @@ gh workflow run full-release-validation.yml --ref main -f ref=<branch-or-sha>
## Runners
| Runner | Jobs |
| -------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `ubuntu-24.04` | `preflight`, jobs de sécurité rapides et agrégats (`security-scm-fast`, `security-dependency-audit`, `security-fast`), vérifications rapides de protocole/contrat/bundled, vérifications de contrats de canaux shardées, shards `check` sauf lint, shards et agrégats `check-additional`, vérificateurs dagrégats de tests Node, vérifications docs, Skills Python, workflow-sanity, labeler, auto-response ; le preflight install-smoke utilise aussi Ubuntu hébergé par GitHub afin que la matrice Blacksmith puisse être mise en file plus tôt |
| `blacksmith-4vcpu-ubuntu-2404` | `CodeQL Critical Quality`, shards dextensions plus légers, `checks-fast-core`, `checks-node-compat-node22`, `check-prod-types` et `check-test-types` |
| `blacksmith-8vcpu-ubuntu-2404` | `build-artifacts`, build-smoke, shards de tests Linux Node, shards de tests de plugins intégrés, `android` |
| `blacksmith-16vcpu-ubuntu-2404` | `check-lint` (assez sensible au CPU pour que 8 vCPU coûtent plus quils néconomisent) ; builds Docker install-smoke (le temps de file de 32 vCPU coûtait plus quil néconomisait) |
| `blacksmith-16vcpu-windows-2025` | `checks-windows` |
| `blacksmith-6vcpu-macos-latest` | `macos-node` sur `openclaw/openclaw` ; les forks se replient sur `macos-latest` |
| `blacksmith-12vcpu-macos-latest` | `macos-swift` sur `openclaw/openclaw` ; les forks se replient sur `macos-latest` |
| Runner | Jobs |
| -------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `ubuntu-24.04` | `preflight`, jobs de sécurité rapides et agrégats (`security-scm-fast`, `security-dependency-audit`, `security-fast`), vérifications rapides de protocole/contrat/groupées, vérifications fragmentées de contrats de canaux, fragments `check` sauf lint, fragments et agrégats `check-additional`, vérificateurs dagrégats de tests Node, vérifications docs, Skills Python, workflow-sanity, labeler, auto-response ; le preflight install-smoke utilise aussi Ubuntu hébergé par GitHub afin que la matrice Blacksmith puisse être mise en file plus tôt |
| `blacksmith-4vcpu-ubuntu-2404` | `CodeQL Critical Quality`, fragments dextensions plus légers, `checks-fast-core`, `checks-node-compat-node22`, `check-prod-types` et `check-test-types` |
| `blacksmith-8vcpu-ubuntu-2404` | `build-artifacts`, build-smoke, fragments de tests Linux Node, fragments de tests de Plugins groupés, `android` |
| `blacksmith-16vcpu-ubuntu-2404` | `check-lint` (assez sensible au CPU pour que 8 vCPU coûtent plus quils néconomisent) ; builds Docker install-smoke (le temps de file dattente 32 vCPU coûtait plus quil néconomisait) |
| `blacksmith-16vcpu-windows-2025` | `checks-windows` |
| `blacksmith-6vcpu-macos-latest` | `macos-node` sur `openclaw/openclaw` ; les forks reviennent à `macos-latest` |
| `blacksmith-12vcpu-macos-latest` | `macos-swift` sur `openclaw/openclaw` ; les forks reviennent à `macos-latest` |
## Équivalents locaux
@ -145,30 +145,30 @@ gh workflow run openclaw-performance.yml --ref main -f profile=smoke -f repeat=1
gh workflow run openclaw-performance.yml --ref main -f target_ref=v2026.5.2 -f profile=diagnostic -f repeat=3
```
Le dispatch manuel benchmarke normalement la ref du workflow. Définissez `target_ref` pour benchmarker un tag de release ou une autre branche avec limplémentation de workflow actuelle. Les chemins de rapports publiés et les pointeurs latest sont indexés par la ref testée, et chaque `index.md` enregistre la ref/SHA testé, la ref/SHA du workflow, la ref Kova, le profil, le mode dauthentification de lane, le modèle, le nombre de répétitions et les filtres de scénarios.
Un dispatch manuel benchmarke normalement la ref du workflow. Définissez `target_ref` pour benchmarker un tag de release ou une autre branche avec limplémentation actuelle du workflow. Les chemins de rapports publiés et les pointeurs les plus récents sont indexés par la ref testée, et chaque `index.md` enregistre la ref/SHA testée, la ref/SHA du workflow, la ref Kova, le profil, le mode dauthentification de lane, le modèle, le nombre de répétitions et les filtres de scénarios.
Le workflow installe OCM depuis une release épinglée et Kova depuis `openclaw/Kova` à lentrée `kova_ref` épinglée, puis exécute trois lanes :
- `mock-provider` : scénarios de diagnostic Kova sur un runtime buildé localement avec une fausse authentification déterministe compatible OpenAI.
- `mock-deep-profile` : profiling CPU/heap/trace pour les hotspots de démarrage, Gateway et tour dagent.
- `mock-provider` : scénarios de diagnostic Kova contre un runtime de build local avec une fausse auth déterministe compatible OpenAI.
- `mock-deep-profile` : profilage CPU/heap/trace pour les points chauds du démarrage, du Gateway et des tours dagent.
- `live-gpt54` : un vrai tour dagent OpenAI `openai/gpt-5.4`, ignoré lorsque `OPENAI_API_KEY` nest pas disponible.
La lane mock-provider exécute aussi des sondes source natives OpenClaw après le passage Kova : timing de démarrage Gateway et mémoire pour les cas de démarrage par défaut, hook et 50 plugins ; boucles hello répétées mock-OpenAI `channel-chat-baseline` ; et commandes de démarrage CLI contre le Gateway démarré. Le résumé Markdown de sonde source se trouve dans `source/index.md` dans le bundle de rapport, avec le JSON brut à côté.
La lane mock-provider exécute aussi des sondes de source natives OpenClaw après le passage Kova : temps de démarrage et mémoire du Gateway sur les cas de démarrage par défaut, hook et 50 Plugins ; boucles hello répétées `channel-chat-baseline` mock-OpenAI ; et commandes de démarrage CLI contre le Gateway démarré. Le résumé Markdown des sondes de source se trouve dans `source/index.md` dans le bundle de rapport, avec le JSON brut à côté.
Chaque lane téléverse des artefacts GitHub. Lorsque `CLAWGRIT_REPORTS_TOKEN` est configuré, le workflow commite aussi `report.json`, `report.md`, les bundles, `index.md` et les artefacts de sonde source dans `openclaw/clawgrit-reports` sous `openclaw-performance/<tested-ref>/<run-id>-<attempt>/<lane>/`. Le pointeur de la ref testée actuelle est écrit sous `openclaw-performance/<tested-ref>/latest-<lane>.json`.
Chaque lane téléverse des artefacts GitHub. Lorsque `CLAWGRIT_REPORTS_TOKEN` est configuré, le workflow commit aussi `report.json`, `report.md`, les bundles, `index.md` et les artefacts de sondes de source dans `openclaw/clawgrit-reports` sous `openclaw-performance/<tested-ref>/<run-id>-<attempt>/<lane>/`. Le pointeur actuel de la ref testée est écrit sous `openclaw-performance/<tested-ref>/latest-<lane>.json`.
## Validation de release complète
## Validation complète de release
`Full Release Validation` est le workflow umbrella manuel pour « tout exécuter avant la release ». Il accepte une branche, un tag ou un SHA de commit complet, déclenche le workflow manuel `CI` avec cette cible, déclenche `Plugin Prerelease` pour les preuves plugin/package/statique/Docker réservées à la release, et déclenche `OpenClaw Release Checks` pour install smoke, acceptation de package, suites Docker du chemin de release, live/E2E, OpenWebUI, parité QA Lab, Matrix et lanes Telegram. Avec `rerun_group=all` et `release_profile=full`, il exécute aussi `NPM Telegram Beta E2E` contre lartefact `release-package-under-test` des release checks. Après publication, passez `npm_telegram_package_spec` pour réexécuter la même lane de package Telegram contre le package npm publié.
`Full Release Validation` est le workflow ombrelle manuel pour « tout exécuter avant la release ». Il accepte une branche, un tag ou un SHA de commit complet, déclenche le workflow manuel `CI` avec cette cible, déclenche `Plugin Prerelease` pour la preuve Plugin/package/statique/Docker réservée aux releases, et déclenche `OpenClaw Release Checks` pour le smoke dinstallation, lacceptation de package, les suites de chemin de release Docker, live/E2E, OpenWebUI, la parité QA Lab, Matrix et les lanes Telegram. Avec `rerun_group=all` et `release_profile=full`, il exécute aussi `NPM Telegram Beta E2E` contre lartefact `release-package-under-test` des vérifications de release. Après publication, transmettez `npm_telegram_package_spec` pour réexécuter la même lane de package Telegram contre le package npm publié.
Consultez [Validation de release complète](/fr/reference/full-release-validation) pour la
matrice détapes, les noms exacts des jobs de workflow, les différences de profils, les artefacts et les
handles de réexécution ciblée.
Voir [Validation complète de release](/fr/reference/full-release-validation) pour la
matrice détapes, les noms exacts des jobs de workflow, les différences de
profils, les artefacts et les identifiants de réexécution ciblée.
`OpenClaw Release Publish` est le workflow de release mutateur manuel. Déclenchez-le
`OpenClaw Release Publish` est le workflow manuel de release qui modifie létat. Déclenchez-le
depuis `release/YYYY.M.D` ou `main` après lexistence du tag de release et après la
réussite du preflight npm OpenClaw. Il vérifie `pnpm plugins:sync:check`,
déclenche `Plugin NPM Release` pour tous les packages de plugins publiables, déclenche
déclenche `Plugin NPM Release` pour tous les packages de Plugins publiables, déclenche
`Plugin ClawHub Release` pour le même SHA de release, puis déclenche seulement ensuite
`OpenClaw NPM Release` avec le `preflight_run_id` enregistré.
@ -180,45 +180,40 @@ gh workflow run openclaw-release-publish.yml \
-f npm_dist_tag=beta
```
Pour la preuve par commit épinglé sur une branche qui évolue rapidement, utilisez lassistant au lieu de
Pour une preuve de commit épinglé sur une branche qui évolue rapidement, utilisez lassistant plutôt que
`gh workflow run ... --ref main -f ref=<sha>` :
```bash
pnpm ci:full-release --sha <full-sha>
```
Les refs de dispatch de workflow GitHub doivent être des branches ou des tags, pas des SHA de commit bruts. Lassistant pousse une branche temporaire `release-ci/<sha>-...` au SHA cible,
déclenche `Full Release Validation` depuis cette ref épinglée, vérifie que chaque `headSha` de workflow enfant correspond à la cible, et supprime la branche temporaire lorsque
lexécution se termine. Le vérificateur umbrella échoue aussi si un workflow enfant sest exécuté à un
SHA différent.
Les refs de dispatch de workflow GitHub doivent être des branches ou des tags, pas des SHA de commit bruts. Lassistant pousse une branche temporaire `release-ci/<sha>-...` au SHA cible, déclenche `Full Release Validation` depuis cette ref épinglée, vérifie que chaque `headSha` de workflow enfant correspond à la cible, et supprime la branche temporaire lorsque lexécution se termine. Le vérificateur ombrelle échoue aussi si un workflow enfant sest exécuté sur un SHA différent.
`release_profile` contrôle létendue live/fournisseur transmise aux vérifications de release. Les
workflows de release manuelle utilisent `stable` par défaut ; utilisez `full` uniquement lorsque vous
voulez intentionnellement la large matrice consultative fournisseur/média.
`release_profile` contrôle létendue live/fournisseurs transmise aux contrôles de publication. Les workflows manuels de publication utilisent `stable` par défaut ; utilisez `full` uniquement lorsque vous voulez intentionnellement la matrice consultative étendue fournisseurs/médias.
- `minimum` conserve les lanes OpenAI/noyau critiques pour la release les plus rapides.
- `stable` ajoute lensemble stable de fournisseurs/backends.
- `full` exécute la large matrice consultative fournisseur/média.
- `minimum` conserve les lanes OpenAI/cœur critiques pour la publication les plus rapides.
- `stable` ajoute lensemble stable des fournisseurs/backends.
- `full` exécute la matrice consultative étendue fournisseurs/médias.
Le workflow englobant enregistre les identifiants des exécutions enfants déclenchées, et la tâche finale `Verify full validation` revérifie les conclusions actuelles des exécutions enfants et ajoute des tableaux des tâches les plus lentes pour chaque exécution enfant. Si un workflow enfant est relancé et passe au vert, relancez uniquement la tâche de vérification parente pour actualiser le résultat englobant et le résumé des temps.
Le workflow chapeau enregistre les ids dexécution des workflows enfants déclenchés, et le job final `Verify full validation` revérifie les conclusions actuelles des exécutions enfants et ajoute des tableaux des jobs les plus lents pour chaque exécution enfant. Si un workflow enfant est relancé et passe au vert, relancez uniquement le job vérificateur parent pour actualiser le résultat chapeau et le résumé des temps.
Pour la reprise, `Full Release Validation` et `OpenClaw Release Checks` acceptent tous deux `rerun_group`. Utilisez `all` pour un candidat de release, `ci` uniquement pour lenfant CI complet normal, `plugin-prerelease` uniquement pour lenfant de prérelease de Plugin, `release-checks` pour chaque enfant de release, ou un groupe plus étroit : `install-smoke`, `cross-os`, `live-e2e`, `package`, `qa`, `qa-parity`, `qa-live` ou `npm-telegram` sur le workflow englobant. Cela maintient bornée la relance dune boîte de release en échec après un correctif ciblé.
Pour la récupération, `Full Release Validation` et `OpenClaw Release Checks` acceptent tous deux `rerun_group`. Utilisez `all` pour une candidate de publication, `ci` pour seulement lenfant CI complet normal, `plugin-prerelease` pour seulement lenfant de prépublication des plugins, `release-checks` pour chaque enfant de publication, ou un groupe plus restreint : `install-smoke`, `cross-os`, `live-e2e`, `package`, `qa`, `qa-parity`, `qa-live`, ou `npm-telegram` sur le workflow chapeau. Cela limite la relance dune boîte de publication échouée après un correctif ciblé.
`OpenClaw Release Checks` utilise la référence de workflow approuvée pour résoudre une seule fois la référence sélectionnée en une archive `release-package-under-test`, puis transmet cet artefact au workflow Docker live/E2E du chemin de release et au shard dacceptation de package. Cela garde les octets du package cohérents entre les boîtes de release et évite de repackager le même candidat dans plusieurs tâches enfants.
`OpenClaw Release Checks` utilise la ref de workflow de confiance pour résoudre une seule fois la ref sélectionnée en une archive `release-package-under-test`, puis transmet cet artefact au workflow Docker du chemin de publication live/E2E et au shard dacceptation du paquet. Cela garde les octets du paquet cohérents entre les boîtes de publication et évite de repaqueter la même candidate dans plusieurs jobs enfants.
Les exécutions `Full Release Validation` dupliquées pour `ref=main` et `rerun_group=all`
remplacent le workflow englobant plus ancien. Le moniteur parent annule tout workflow enfant quil
a déjà déclenché lorsque le parent est annulé, de sorte quune validation plus récente de main
ne reste pas bloquée derrière une ancienne exécution de release-check de deux heures. La validation de branche/tag
de release et les groupes de relance ciblés gardent `cancel-in-progress: false`.
Les exécutions `Full Release Validation` en double pour `ref=main` et `rerun_group=all`
remplacent lancien workflow chapeau. Le moniteur parent annule tout workflow enfant quil
a déjà déclenché lorsque le parent est annulé, afin quune validation plus récente de main
ne reste pas bloquée derrière une exécution de contrôles de publication obsolète de deux heures. La validation de branche/tag de publication
et les groupes de relance ciblés gardent `cancel-in-progress: false`.
## Shards live et E2E
Lenfant live/E2E de release conserve une large couverture native `pnpm test:live`, mais lexécute comme shards nommés via `scripts/test-live-shard.mjs` au lieu dune seule tâche série :
Lenfant live/E2E de publication conserve une large couverture native `pnpm test:live`, mais lexécute comme shards nommés via `scripts/test-live-shard.mjs` au lieu dun seul job sériel :
- `native-live-src-agents`
- `native-live-src-gateway-core`
- tâches `native-live-src-gateway-profiles` filtrées par fournisseur
- jobs `native-live-src-gateway-profiles` filtrés par fournisseur
- `native-live-src-gateway-backends`
- `native-live-test`
- `native-live-extensions-a-k`
@ -226,61 +221,61 @@ Lenfant live/E2E de release conserve une large couverture native `pnpm test:l
- `native-live-extensions-openai`
- `native-live-extensions-o-z-other`
- `native-live-extensions-xai`
- shards audio/vidéo média séparés et shards musicaux filtrés par fournisseur
- shards audio/vidéo médias séparés et shards musique filtrés par fournisseur
Cela conserve la même couverture de fichiers tout en facilitant la relance et le diagnostic des échecs lents de fournisseurs live. Les noms de shards agrégés `native-live-extensions-o-z`, `native-live-extensions-media` et `native-live-extensions-media-music` restent valides pour les relances manuelles ponctuelles.
Cela garde la même couverture de fichiers tout en rendant les échecs lents de fournisseurs live plus faciles à relancer et à diagnostiquer. Les noms de shards agrégés `native-live-extensions-o-z`, `native-live-extensions-media` et `native-live-extensions-media-music` restent valides pour des relances manuelles ponctuelles.
Les shards média live natifs sexécutent dans `ghcr.io/openclaw/openclaw-live-media-runner:ubuntu-24.04`, construit par le workflow `Live Media Runner Image`. Cette image préinstalle `ffmpeg` et `ffprobe` ; les tâches média ne vérifient que les binaires avant la configuration. Gardez les suites live adossées à Docker sur des runners Blacksmith normaux — les tâches conteneurisées ne conviennent pas au lancement de tests Docker imbriqués.
Les shards médias live natifs sexécutent dans `ghcr.io/openclaw/openclaw-live-media-runner:ubuntu-24.04`, construit par le workflow `Live Media Runner Image`. Cette image préinstalle `ffmpeg` et `ffprobe` ; les jobs médias vérifient seulement les binaires avant la configuration. Gardez les suites live adossées à Docker sur des runners Blacksmith normaux — les jobs conteneurisés ne sont pas lendroit approprié pour lancer des tests Docker imbriqués.
Les shards live de modèles/backends adossés à Docker utilisent une image partagée distincte `ghcr.io/openclaw/openclaw-live-test:<sha>` par commit sélectionné. Le workflow de release live construit et pousse cette image une fois, puis les shards Docker live de modèle, de Gateway shardé par fournisseur, de backend CLI, de liaison ACP et de harnais Codex sexécutent avec `OPENCLAW_SKIP_DOCKER_BUILD=1`. Les shards Docker Gateway portent des limites `timeout` explicites au niveau du script, inférieures au délai dexpiration de la tâche de workflow, afin quun conteneur bloqué ou un chemin de nettoyage échoue rapidement au lieu de consommer tout le budget de release-check. Si ces shards reconstruisent indépendamment la cible Docker complète des sources, lexécution de release est mal configurée et gaspillera du temps horloge en builds dimage dupliqués.
Les shards live de modèles/backends adossés à Docker utilisent une image partagée distincte `ghcr.io/openclaw/openclaw-live-test:<sha>` par commit sélectionné. Le workflow live de publication construit et pousse cette image une seule fois, puis les shards de modèle live Docker, de Gateway shardé par fournisseur, de backend CLI, de liaison ACP et de harness Codex sexécutent avec `OPENCLAW_SKIP_DOCKER_BUILD=1`. Les shards Docker Gateway portent des plafonds `timeout` explicites au niveau script sous le timeout du job de workflow afin quun conteneur bloqué ou un chemin de nettoyage échoue rapidement au lieu de consommer tout le budget des contrôles de publication. Si ces shards reconstruisent indépendamment la cible Docker source complète, lexécution de publication est mal configurée et gaspillera du temps réel sur des builds dimage en double.
## Acceptation de package
## Acceptation du paquet
Utilisez `Package Acceptance` lorsque la question est : « ce package OpenClaw installable fonctionne-t-il comme un produit ? » Cest différent de la CI normale : la CI normale valide larborescence des sources, tandis que lacceptation de package valide une seule archive tar via le même harnais Docker E2E que les utilisateurs exercent après installation ou mise à jour.
Utilisez `Package Acceptance` lorsque la question est « ce paquet OpenClaw installable fonctionne-t-il comme produit ? » Cest différent de la CI normale : la CI normale valide larborescence source, tandis que lacceptation du paquet valide une seule archive via le même harness Docker E2E que les utilisateurs exercent après installation ou mise à jour.
### Tâches
### Jobs
1. `resolve_package` extrait `workflow_ref`, résout un candidat de package, écrit `.artifacts/docker-e2e-package/openclaw-current.tgz`, écrit `.artifacts/docker-e2e-package/package-candidate.json`, téléverse les deux comme artefact `package-under-test`, et imprime la source, la référence de workflow, la référence de package, la version, le SHA-256 et le profil dans le résumé détape GitHub.
2. `docker_acceptance` appelle `openclaw-live-and-e2e-checks-reusable.yml` avec `ref=workflow_ref` et `package_artifact_name=package-under-test`. Le workflow réutilisable télécharge cet artefact, valide linventaire de larchive tar, prépare les images Docker de digest de package lorsque nécessaire, et exécute les lanes Docker sélectionnées contre ce package au lieu dempaqueter lextraction du workflow. Lorsquun profil sélectionne plusieurs `docker_lanes` ciblées, le workflow réutilisable prépare le package et les images partagées une seule fois, puis déploie ces lanes comme tâches Docker ciblées parallèles avec des artefacts uniques.
3. `package_telegram` appelle éventuellement `NPM Telegram Beta E2E`. Il sexécute lorsque `telegram_mode` nest pas `none` et installe le même artefact `package-under-test` quand Package Acceptance en a résolu un ; un déclenchement Telegram autonome peut toujours installer une spécification npm publiée.
4. `summary` fait échouer le workflow si la résolution du package, lacceptation Docker ou la lane Telegram optionnelle a échoué.
1. `resolve_package` extrait `workflow_ref`, résout une candidate de paquet, écrit `.artifacts/docker-e2e-package/openclaw-current.tgz`, écrit `.artifacts/docker-e2e-package/package-candidate.json`, téléverse les deux comme artefact `package-under-test`, et affiche la source, la ref de workflow, la ref du paquet, la version, le SHA-256 et le profil dans le résumé détape GitHub.
2. `docker_acceptance` appelle `openclaw-live-and-e2e-checks-reusable.yml` avec `ref=workflow_ref` et `package_artifact_name=package-under-test`. Le workflow réutilisable télécharge cet artefact, valide linventaire de larchive, prépare les images Docker à condensé de paquet si nécessaire, et exécute les lanes Docker sélectionnées contre ce paquet au lieu de paqueter lextraction du workflow. Lorsquun profil sélectionne plusieurs `docker_lanes` ciblées, le workflow réutilisable prépare le paquet et les images partagées une seule fois, puis déploie ces lanes en jobs Docker ciblés parallèles avec des artefacts uniques.
3. `package_telegram` appelle facultativement `NPM Telegram Beta E2E`. Il sexécute lorsque `telegram_mode` nest pas `none` et installe le même artefact `package-under-test` lorsque lacceptation du paquet en a résolu un ; un déclenchement Telegram autonome peut toujours installer une spécification npm publiée.
4. `summary` fait échouer le workflow si la résolution du paquet, lacceptation Docker ou la lane Telegram facultative a échoué.
### Sources candidates
- `source=npm` accepte uniquement `openclaw@beta`, `openclaw@latest` ou une version de release OpenClaw exacte telle que `openclaw@2026.4.27-beta.2`. Utilisez cela pour lacceptation de prérelease/stable publiée.
- `source=ref` empaquette une branche, un tag ou un SHA de commit complet `package_ref` approuvé. Le résolveur récupère les branches/tags OpenClaw, vérifie que le commit sélectionné est joignable depuis lhistorique de branche du dépôt ou un tag de release, installe les dépendances dans un worktree détaché, et lempaquette avec `scripts/package-openclaw-for-docker.mjs`.
- `source=npm` accepte seulement `openclaw@beta`, `openclaw@latest`, ou une version exacte de publication OpenClaw comme `openclaw@2026.4.27-beta.2`. Utilisez cela pour lacceptation de prépublication/publication stable publiée.
- `source=ref` paquete une branche, un tag ou un SHA de commit complet `package_ref` de confiance. Le résolveur récupère les branches/tags OpenClaw, vérifie que le commit sélectionné est atteignable depuis lhistorique des branches du dépôt ou un tag de publication, installe les dépendances dans un worktree détaché, et le paquete avec `scripts/package-openclaw-for-docker.mjs`.
- `source=url` télécharge un `.tgz` HTTPS ; `package_sha256` est requis.
- `source=artifact` télécharge un `.tgz` depuis `artifact_run_id` et `artifact_name` ; `package_sha256` est facultatif mais doit être fourni pour les artefacts partagés en externe.
- `source=artifact` télécharge un `.tgz` depuis `artifact_run_id` et `artifact_name` ; `package_sha256` est facultatif mais devrait être fourni pour les artefacts partagés en externe.
Gardez `workflow_ref` et `package_ref` séparés. `workflow_ref` est le code de workflow/harnais approuvé qui exécute le test. `package_ref` est le commit source qui est empaqueté lorsque `source=ref`. Cela permet au harnais de test actuel de valider danciens commits source approuvés sans exécuter lancienne logique de workflow.
Gardez `workflow_ref` et `package_ref` séparés. `workflow_ref` est le code de workflow/harness de confiance qui exécute le test. `package_ref` est le commit source qui est paqueté lorsque `source=ref`. Cela permet au harness de test actuel de valider danciens commits source de confiance sans exécuter lancienne logique de workflow.
### Profils de suite
- `smoke``npm-onboard-channel-agent`, `gateway-network`, `config-reload`
- `package``npm-onboard-channel-agent`, `doctor-switch`, `update-channel-switch`, `upgrade-survivor`, `published-upgrade-survivor`, `plugins-offline`, `plugin-update`
- `product``package` plus `mcp-channels`, `cron-mcp-cleanup`, `openai-web-search-minimal`, `openwebui`
- `full`chunks complets Docker de chemin de release avec OpenWebUI
- `full`segments complets du chemin de publication Docker avec OpenWebUI
- `custom``docker_lanes` exactes ; requis lorsque `suite_profile=custom`
Le profil `package` utilise une couverture Plugin hors ligne afin que la validation de package publié ne dépende pas de la disponibilité live de ClawHub. La lane Telegram optionnelle réutilise lartefact `package-under-test` dans `NPM Telegram Beta E2E`, avec le chemin de spécification npm publiée conservé pour les déclenchements autonomes.
Le profil `package` utilise une couverture de plugins hors ligne afin que la validation du paquet publié ne dépende pas de la disponibilité live de ClawHub. La lane Telegram facultative réutilise lartefact `package-under-test` dans `NPM Telegram Beta E2E`, le chemin de spécification npm publié étant conservé pour les déclenchements autonomes.
Pour la politique dédiée aux tests de mise à jour et de Plugin, y compris les commandes locales,
les lanes Docker, les entrées Package Acceptance, les valeurs par défaut de release et le triage des échecs,
consultez [Tester les mises à jour et les Plugins](/fr/help/testing-updates-plugins).
Pour la politique dédiée aux tests de mise à jour et de plugins, y compris les commandes locales,
les lanes Docker, les entrées dacceptation du paquet, les valeurs par défaut de publication et le triage des échecs,
consultez [Tester les mises à jour et les plugins](/fr/help/testing-updates-plugins).
Les vérifications de release appellent Package Acceptance avec `source=artifact`, lartefact de package de release préparé, `suite_profile=custom`, `docker_lanes='doctor-switch update-channel-switch upgrade-survivor published-upgrade-survivor plugins-offline plugin-update'`, `published_upgrade_survivor_baselines=all-since-2026.4.23`, `published_upgrade_survivor_scenarios=reported-issues` et `telegram_mode=mock-openai`. Cela maintient la migration de package, la mise à jour, le nettoyage de dépendances de Plugin obsolètes, la réparation dinstallation de Plugin configuré, le Plugin hors ligne, la mise à jour de Plugin et la preuve Telegram sur la même archive tar de package résolue. Définissez `package_acceptance_package_spec` sur Full Release Validation ou OpenClaw Release Checks pour exécuter cette même matrice contre un package npm livré au lieu de lartefact construit depuis le SHA. Les vérifications de release multi-OS couvrent toujours lonboarding, linstallateur et le comportement de plateforme spécifiques à lOS ; la validation produit package/mise à jour doit commencer par Package Acceptance. La lane Docker `published-upgrade-survivor` valide une base de référence de package publié par exécution. Dans Package Acceptance, larchive tar `package-under-test` résolue est toujours le candidat et `published_upgrade_survivor_baseline` sélectionne la base de référence publiée de repli, avec `openclaw@latest` par défaut ; les commandes de relance de lane échouée préservent cette base de référence. Définissez `published_upgrade_survivor_baselines=all-since-2026.4.23` pour étendre la CI Full Release à chaque release npm stable de `2026.4.23` à `latest` ; `release-history` reste disponible pour un échantillonnage manuel plus large avec lancien point dancrage antérieur à cette date. Définissez `published_upgrade_survivor_scenarios=reported-issues` pour étendre les mêmes bases de référence à des fixtures façonnées comme des issues pour la configuration Feishu, les fichiers bootstrap/persona préservés, les installations de Plugins OpenClaw configurés, les chemins de journaux avec tilde et les racines de dépendances de Plugin héritées obsolètes. Le workflow séparé `Update Migration` utilise la lane Docker `update-migration` avec `all-since-2026.4.23` et `plugin-deps-cleanup` lorsque la question porte sur le nettoyage exhaustif des mises à jour publiées, et non sur létendue normale de la CI Full Release. Les exécutions agrégées locales peuvent passer des spécifications de package exactes avec `OPENCLAW_UPGRADE_SURVIVOR_BASELINE_SPECS`, garder une seule lane avec `OPENCLAW_UPGRADE_SURVIVOR_BASELINE_SPEC` telle que `openclaw@2026.4.15`, ou définir `OPENCLAW_UPGRADE_SURVIVOR_SCENARIOS` pour la matrice de scénarios. La lane publiée configure la base de référence avec une recette de commande `openclaw config set` intégrée, enregistre les étapes de recette dans `summary.json`, et sonde `/healthz`, `/readyz`, ainsi que le statut RPC après le démarrage du Gateway. Les lanes fraîches Windows empaquetées et installateur vérifient aussi quun package installé peut importer une surcharge browser-control depuis un chemin Windows absolu brut. Le smoke OpenAI multi-OS de tour dagent utilise par défaut `OPENCLAW_CROSS_OS_OPENAI_MODEL` lorsquil est défini, sinon `openai/gpt-5.4`, afin que la preuve dinstallation et de Gateway reste sur un modèle de test GPT-5 tout en évitant les valeurs par défaut GPT-4.x.
Les contrôles de publication appellent lacceptation du paquet avec `source=artifact`, lartefact de paquet de publication préparé, `suite_profile=custom`, `docker_lanes='doctor-switch update-channel-switch upgrade-survivor published-upgrade-survivor plugins-offline plugin-update'`, `published_upgrade_survivor_baselines=all-since-2026.4.23`, `published_upgrade_survivor_scenarios=reported-issues`, et `telegram_mode=mock-openai`. Cela garde la migration du paquet, la mise à jour, le nettoyage des dépendances obsolètes de plugins, la réparation dinstallation de plugin configuré, le plugin hors ligne, la mise à jour de plugin et la preuve Telegram sur la même archive de paquet résolue. Définissez `package_acceptance_package_spec` sur Full Release Validation ou OpenClaw Release Checks pour exécuter cette même matrice contre un paquet npm livré au lieu de lartefact construit depuis le SHA. Les contrôles de publication inter-OS couvrent toujours lonboarding, linstalleur et le comportement de plateforme spécifiques aux OS ; la validation produit paquet/mise à jour devrait commencer par lacceptation du paquet. La lane Docker `published-upgrade-survivor` valide une baseline de paquet publié par exécution. Dans lacceptation du paquet, larchive `package-under-test` résolue est toujours la candidate et `published_upgrade_survivor_baseline` sélectionne la baseline publiée de repli, par défaut `openclaw@latest` ; les commandes de relance de lanes échouées préservent cette baseline. Définissez `published_upgrade_survivor_baselines=all-since-2026.4.23` pour étendre la CI complète de publication à chaque publication npm stable de `2026.4.23` à `latest` ; `release-history` reste disponible pour un échantillonnage manuel plus large avec lancre antérieure plus ancienne. Définissez `published_upgrade_survivor_scenarios=reported-issues` pour étendre les mêmes baselines aux fixtures en forme dissues pour la configuration Feishu, les fichiers bootstrap/persona préservés, les installations de plugins OpenClaw configurés, les chemins de logs avec tilde, et les racines de dépendances de plugins hérités obsolètes. Le workflow séparé `Update Migration` utilise la lane Docker `update-migration` avec `all-since-2026.4.23` et `plugin-deps-cleanup` lorsque la question porte sur le nettoyage exhaustif des mises à jour publiées, pas sur létendue normale de la CI complète de publication. Les exécutions agrégées locales peuvent passer des spécifications exactes de paquets avec `OPENCLAW_UPGRADE_SURVIVOR_BASELINE_SPECS`, garder une seule lane avec `OPENCLAW_UPGRADE_SURVIVOR_BASELINE_SPEC` comme `openclaw@2026.4.15`, ou définir `OPENCLAW_UPGRADE_SURVIVOR_SCENARIOS` pour la matrice de scénarios. La lane publiée configure la baseline avec une recette de commande `openclaw config set` intégrée, enregistre les étapes de recette dans `summary.json`, et sonde `/healthz`, `/readyz`, ainsi que le statut RPC après le démarrage du Gateway. Les lanes fraîches Windows empaquetée et installeur vérifient aussi quun paquet installé peut importer un override browser-control depuis un chemin Windows absolu brut. La smoke inter-OS de tour dagent OpenAI utilise par défaut `OPENCLAW_CROSS_OS_OPENAI_MODEL` lorsquil est défini, sinon `openai/gpt-5.4`, afin que la preuve dinstallation et de Gateway reste sur un modèle de test GPT-5 tout en évitant les valeurs par défaut GPT-4.x.
### Fenêtres de compatibilité héritée
Package Acceptance dispose de fenêtres de compatibilité héritée bornées pour les packages déjà publiés. Les packages jusquà `2026.4.25`, y compris `2026.4.25-beta.*`, peuvent utiliser le chemin de compatibilité :
Lacceptation du paquet dispose de fenêtres bornées de compatibilité héritée pour les paquets déjà publiés. Les paquets jusquà `2026.4.25`, y compris `2026.4.25-beta.*`, peuvent utiliser le chemin de compatibilité :
- les entrées QA privées connues dans `dist/postinstall-inventory.json` peuvent pointer vers des fichiers omis de larchive tar ;
- `doctor-switch` peut ignorer le sous-cas de persistance `gateway install --wrapper` lorsque le package nexpose pas ce flag ;
- `update-channel-switch` peut élaguer les `pnpm.patchedDependencies` manquantes de la fixture fake git dérivée de larchive tar et peut journaliser labsence de `update.channel` persisté ;
- les smokes Plugin peuvent lire des emplacements hérités denregistrements dinstallation ou accepter labsence de persistance denregistrement dinstallation de marketplace ;
- `plugin-update` peut autoriser la migration des métadonnées de configuration tout en exigeant toujours que lenregistrement dinstallation et le comportement sans réinstallation restent inchangés.
- les entrées QA privées connues dans `dist/postinstall-inventory.json` peuvent pointer vers des fichiers omis de larchive ;
- `doctor-switch` peut ignorer le sous-cas de persistance `gateway install --wrapper` lorsque le paquet nexpose pas ce flag ;
- `update-channel-switch` peut élaguer les `pnpm.patchedDependencies` manquantes depuis la fixture git factice dérivée de larchive et peut journaliser un `update.channel` persistant manquant ;
- les smokes de plugins peuvent lire les anciens emplacements denregistrements dinstallation ou accepter une persistance manquante des enregistrements dinstallation de marketplace ;
- `plugin-update` peut autoriser la migration des métadonnées de configuration tout en exigeant que lenregistrement dinstallation et le comportement sans réinstallation restent inchangés.
Le package `2026.4.26` publié peut également avertir pour les fichiers de tampon de métadonnées de build local qui ont déjà été livrés. Les packages ultérieurs doivent satisfaire les contrats modernes ; les mêmes conditions échouent au lieu davertir ou dêtre ignorées.
Le paquet publié `2026.4.26` peut aussi avertir pour les fichiers destampille de métadonnées de build local déjà livrés. Les paquets ultérieurs doivent satisfaire les contrats modernes ; les mêmes conditions échouent au lieu davertir ou dêtre ignorées.
### Exemples
@ -323,151 +318,151 @@ gh workflow run package-acceptance.yml \
-f docker_lanes='install-e2e plugin-update'
```
Lors du débogage dune exécution dacceptation de package échouée, commencez par le résumé `resolve_package` pour confirmer la source du package, la version et le SHA-256. Inspectez ensuite lexécution enfant `docker_acceptance` et ses artefacts Docker : `.artifacts/docker-tests/**/summary.json`, `failures.json`, les journaux de lanes, les minutages de phases et les commandes de réexécution. Préférez réexécuter le profil de package échoué ou les lanes Docker exactes plutôt que de relancer toute la validation de release.
Lors du débogage dune exécution dacceptation de package échouée, commencez par le résumé `resolve_package` pour confirmer la source, la version et le SHA-256 du package. Inspectez ensuite lexécution enfant `docker_acceptance` et ses artefacts Docker : `.artifacts/docker-tests/**/summary.json`, `failures.json`, les journaux de lanes, les timings de phases et les commandes de réexécution. Préférez réexécuter le profil de package échoué ou les lanes Docker exactes plutôt que de relancer la validation complète de publication.
## Smoke test dinstallation
Le workflow distinct `Install Smoke` réutilise le même script de périmètre via son propre job `preflight`. Il divise la couverture smoke en `run_fast_install_smoke` et `run_full_install_smoke`.
Le workflow `Install Smoke` séparé réutilise le même script de portée via son propre job `preflight`. Il divise la couverture smoke entre `run_fast_install_smoke` et `run_full_install_smoke`.
- **Chemin rapide** sexécute pour les pull requests qui touchent les surfaces Docker/package, les changements de package/manifeste de Plugin intégré, ou les surfaces principales de Plugin/canal/Gateway/SDK Plugin exercées par les jobs de smoke Docker. Les changements de Plugin intégré limités au code source, les modifications limitées aux tests et les modifications limitées à la documentation ne réservent pas de workers Docker. Le chemin rapide construit une fois limage Dockerfile racine, vérifie la CLI, exécute le smoke CLI de suppression des agents dans lespace de travail partagé, exécute le2e du réseau Gateway de conteneur, vérifie un argument de build de Plugin intégré et exécute le profil Docker borné de Plugin intégré sous un délai dexpiration agrégé de 240 secondes pour la commande, chaque exécution Docker de scénario étant plafonnée séparément.
- **Chemin complet** conserve la couverture dinstallation de package QR et Docker/update de linstallateur pour les exécutions planifiées nocturnes, les déclenchements manuels, les vérifications de release via workflow-call et les pull requests qui touchent réellement les surfaces installateur/package/Docker. En mode complet, install-smoke prépare ou réutilise une image smoke GHCR Dockerfile racine pour le SHA cible, puis exécute linstallation de package QR, les smokes Dockerfile racine/Gateway, les smokes installateur/update et lE2E Docker rapide de Plugin intégré en tant que jobs séparés afin que le travail dinstallation nattende pas derrière les smokes de limage racine.
- **Chemin rapide** sexécute pour les pull requests touchant les surfaces Docker/package, les changements de package/manifeste de Plugin groupé, ou les surfaces Plugin SDK, Plugin, canal ou Gateway centrales que les jobs smoke Docker exercent. Les changements de source uniquement dans un Plugin groupé, les modifications limitées aux tests et les modifications limitées à la documentation ne réservent pas de workers Docker. Le chemin rapide construit une fois limage Dockerfile racine, vérifie la CLI, exécute le smoke CLI de suppression dagents en espace de travail partagé, exécute le2e container gateway-network, vérifie un argument de build dextension groupée, et exécute le profil Docker de Plugin groupé borné sous un délai global de commande de 240 secondes (chaque exécution Docker de scénario étant plafonnée séparément).
- **Chemin complet** conserve linstallation de package QR et la couverture Docker dinstallation/mise à jour pour les exécutions planifiées nocturnes, les déclenchements manuels, les contrôles de publication par workflow-call et les pull requests qui touchent réellement les surfaces installeur/package/Docker. En mode complet, install-smoke prépare ou réutilise une image smoke GHCR Dockerfile racine de SHA cible, puis exécute linstallation de package QR, les smokes Dockerfile racine/Gateway, les smokes installeur/mise à jour et lE2E Docker rapide de Plugin groupé comme jobs séparés afin que le travail dinstallation nattende pas derrière les smokes de limage racine.
Les pushes sur `main`, y compris les commits de merge, ne forcent pas le chemin complet ; lorsque la logique de périmètre modifié demanderait une couverture complète sur un push, le workflow conserve le smoke Docker rapide et laisse le smoke dinstallation complet à la validation nocturne ou de release.
Les pushs sur `main` (y compris les commits de merge) ne forcent pas le chemin complet ; lorsque la logique de portée modifiée demanderait une couverture complète sur un push, le workflow conserve le smoke Docker rapide et laisse le smoke dinstallation complet à la validation nocturne ou de publication.
Le smoke lent dinstallation globale Bun pour le fournisseur dimage est contrôlé séparément par `run_bun_global_install_smoke`. Il sexécute lors de la planification nocturne et depuis le workflow de vérifications de release, et les déclenchements manuels de `Install Smoke` peuvent lactiver, mais les pull requests et les pushes sur `main` ne le font pas. Les tests Docker QR et installateur conservent leurs propres Dockerfiles axés sur linstallation.
Le smoke lent du fournisseur dimages avec installation globale Bun est contrôlé séparément par `run_bun_global_install_smoke`. Il sexécute selon la planification nocturne et depuis le workflow des contrôles de publication, et les déclenchements manuels de `Install Smoke` peuvent lactiver explicitement, mais les pull requests et les pushs sur `main` ne le font pas. Les tests Docker QR et installeur conservent leurs propres Dockerfiles centrés sur linstallation.
## E2E Docker local
`pnpm test:docker:all` préconstruit une image de test live partagée, empaquette OpenClaw une seule fois sous forme de tarball npm et construit deux images partagées `scripts/e2e/Dockerfile` :
`pnpm test:docker:all` préconstruit une image live-test partagée, empaquette OpenClaw une fois sous forme de tarball npm, et construit deux images `scripts/e2e/Dockerfile` partagées :
- un runner Node/Git minimal pour les lanes installateur/update/dépendances de Plugin ;
- un runner Node/Git minimal pour les lanes installeur/mise à jour/dépendances de Plugin ;
- une image fonctionnelle qui installe le même tarball dans `/app` pour les lanes de fonctionnalité normales.
Les définitions de lanes Docker se trouvent dans `scripts/lib/docker-e2e-scenarios.mjs`, la logique de planification se trouve dans `scripts/lib/docker-e2e-plan.mjs`, et le runner exécute uniquement le plan sélectionné. Le planificateur sélectionne limage par lane avec `OPENCLAW_DOCKER_E2E_BARE_IMAGE` et `OPENCLAW_DOCKER_E2E_FUNCTIONAL_IMAGE`, puis exécute les lanes avec `OPENCLAW_SKIP_DOCKER_BUILD=1`.
Les définitions de lanes Docker se trouvent dans `scripts/lib/docker-e2e-scenarios.mjs`, la logique du planificateur dans `scripts/lib/docker-e2e-plan.mjs`, et le runner nexécute que le plan sélectionné. Lordonnanceur sélectionne limage par lane avec `OPENCLAW_DOCKER_E2E_BARE_IMAGE` et `OPENCLAW_DOCKER_E2E_FUNCTIONAL_IMAGE`, puis exécute les lanes avec `OPENCLAW_SKIP_DOCKER_BUILD=1`.
### Paramètres réglables
### Paramètres ajustables
| Variable | Valeur par défaut | Objectif |
| -------------------------------------- | ----------------- | --------------------------------------------------------------------------------------------- |
| `OPENCLAW_DOCKER_ALL_PARALLELISM` | 10 | Nombre de slots du pool principal pour les lanes normales. |
| `OPENCLAW_DOCKER_ALL_TAIL_PARALLELISM` | 10 | Nombre de slots du pool final sensible aux fournisseurs. |
| `OPENCLAW_DOCKER_ALL_LIVE_LIMIT` | 9 | Plafond de lanes live concurrentes afin que les fournisseurs ne limitent pas le débit. |
| `OPENCLAW_DOCKER_ALL_NPM_LIMIT` | 10 | Plafond de lanes dinstallation npm concurrentes. |
| `OPENCLAW_DOCKER_ALL_SERVICE_LIMIT` | 7 | Plafond de lanes multi-services concurrentes. |
| `OPENCLAW_DOCKER_ALL_START_STAGGER_MS` | 2000 | Décalage entre les démarrages de lanes pour éviter les tempêtes de création du démon Docker ; définissez `0` pour aucun décalage. |
| `OPENCLAW_DOCKER_ALL_LANE_TIMEOUT_MS` | 7200000 | Délai dexpiration de secours par lane (120 minutes) ; certaines lanes live/finales utilisent des plafonds plus stricts. |
| `OPENCLAW_DOCKER_ALL_DRY_RUN` | unset | `1` affiche le plan du planificateur sans exécuter les lanes. |
| `OPENCLAW_DOCKER_ALL_LANES` | unset | Liste exacte de lanes séparées par des virgules ; ignore le smoke de nettoyage afin que les agents puissent reproduire une lane échouée. |
| Variable | Par défaut | Objectif |
| -------------------------------------- | ---------- | --------------------------------------------------------------------------------------------- |
| `OPENCLAW_DOCKER_ALL_PARALLELISM` | 10 | Nombre de slots du pool principal pour les lanes normales. |
| `OPENCLAW_DOCKER_ALL_TAIL_PARALLELISM` | 10 | Nombre de slots du pool de queue sensible aux fournisseurs. |
| `OPENCLAW_DOCKER_ALL_LIVE_LIMIT` | 9 | Plafond de lanes live concurrentes afin que les fournisseurs ne limitent pas le débit. |
| `OPENCLAW_DOCKER_ALL_NPM_LIMIT` | 10 | Plafond de lanes dinstallation npm concurrentes. |
| `OPENCLAW_DOCKER_ALL_SERVICE_LIMIT` | 7 | Plafond de lanes multi-services concurrentes. |
| `OPENCLAW_DOCKER_ALL_START_STAGGER_MS` | 2000 | Décalage entre les démarrages de lanes pour éviter les tempêtes de création du démon Docker ; définissez `0` pour aucun décalage. |
| `OPENCLAW_DOCKER_ALL_LANE_TIMEOUT_MS` | 7200000 | Délai de secours par lane (120 minutes) ; certaines lanes live/de queue sélectionnées utilisent des plafonds plus serrés. |
| `OPENCLAW_DOCKER_ALL_DRY_RUN` | non défini | `1` affiche le plan de lordonnanceur sans exécuter les lanes. |
| `OPENCLAW_DOCKER_ALL_LANES` | non défini | Liste exacte de lanes séparées par des virgules ; ignore le smoke de nettoyage afin que les agents puissent reproduire une lane échouée. |
Une lane plus lourde que son plafond effectif peut tout de même démarrer depuis un pool vide, puis sexécuter seule jusquà libérer de la capacité. Le préflight agrégé local vérifie Docker, supprime les anciens conteneurs E2E OpenClaw, émet létat des lanes actives, persiste les minutages de lanes pour un ordre du plus long au plus court, et arrête par défaut de planifier de nouvelles lanes groupées après le premier échec.
Une lane plus lourde que son plafond effectif peut tout de même démarrer depuis un pool vide, puis sexécute seule jusquà libérer de la capacité. Les précontrôles locaux agrégés vérifient Docker, suppriment les conteneurs E2E OpenClaw périmés, émettent létat des lanes actives, persistent les timings des lanes pour lordre du plus long au plus court, et arrêtent par défaut de planifier de nouvelles lanes en pool après le premier échec.
### Workflow live/E2E réutilisable
Le workflow live/E2E réutilisable demande à `scripts/test-docker-all.mjs --plan-json` quelle couverture de package, type dimage, image live, lane et identifiants est requise. `scripts/docker-e2e.mjs` convertit ensuite ce plan en sorties et résumés GitHub. Il empaquette OpenClaw via `scripts/package-openclaw-for-docker.mjs`, télécharge un artefact de package de lexécution courante, ou télécharge un artefact de package depuis `package_artifact_run_id` ; valide linventaire du tarball ; construit et pousse des images E2E Docker GHCR minimales/fonctionnelles étiquetées par digest de package via le cache de couches Docker de Blacksmith lorsque le plan nécessite des lanes avec package installé ; et réutilise les entrées `docker_e2e_bare_image`/`docker_e2e_functional_image` fournies ou les images existantes par digest de package au lieu de reconstruire. Les récupérations dimages Docker sont retentées avec un délai dexpiration borné de 180 secondes par tentative afin quun flux de registre/cache bloqué réessaie rapidement au lieu de consommer la majeure partie du chemin critique CI.
Le workflow live/E2E réutilisable demande à `scripts/test-docker-all.mjs --plan-json` quelle couverture de package, de type dimage, dimage live, de lane et didentifiants est requise. `scripts/docker-e2e.mjs` convertit ensuite ce plan en sorties et résumés GitHub. Il empaquette OpenClaw via `scripts/package-openclaw-for-docker.mjs`, télécharge un artefact de package de lexécution courante ou télécharge un artefact de package depuis `package_artifact_run_id` ; valide linventaire du tarball ; construit et pousse les images E2E Docker GHCR bare/fonctionnelles étiquetées par digest de package via le cache de couches Docker de Blacksmith lorsque le plan nécessite des lanes avec package installé ; et réutilise les entrées `docker_e2e_bare_image`/`docker_e2e_functional_image` fournies ou des images existantes par digest de package au lieu de reconstruire. Les pulls dimages Docker sont retentés avec un délai borné de 180 secondes par tentative afin quun flux de registre/cache bloqué retente rapidement au lieu de consommer la majeure partie du chemin critique CI.
### Chunks du chemin de release
### Morceaux du chemin de publication
La couverture Docker de release exécute de plus petits jobs découpés avec `OPENCLAW_SKIP_DOCKER_BUILD=1` afin que chaque chunk récupère uniquement le type dimage dont il a besoin et exécute plusieurs lanes via le même planificateur pondéré :
La couverture Docker de publication exécute des jobs découpés plus petits avec `OPENCLAW_SKIP_DOCKER_BUILD=1` afin que chaque morceau ne tire que le type dimage dont il a besoin et exécute plusieurs lanes via le même ordonnanceur pondéré :
- `OPENCLAW_DOCKER_ALL_PROFILE=release-path`
- `OPENCLAW_DOCKER_ALL_CHUNK=core | package-update-openai | package-update-anthropic | package-update-core | plugins-runtime-plugins | plugins-runtime-services | plugins-runtime-install-a..h`
Les chunks Docker de release actuels sont `core`, `package-update-openai`, `package-update-anthropic`, `package-update-core`, `plugins-runtime-plugins`, `plugins-runtime-services`, et `plugins-runtime-install-a` à `plugins-runtime-install-h`. `plugins-runtime-core`, `plugins-runtime` et `plugins-integrations` restent des alias agrégés Plugin/runtime. Lalias de lane `install-e2e` reste lalias de réexécution manuelle agrégé pour les deux lanes dinstallation de fournisseurs.
Les morceaux Docker de publication actuels sont `core`, `package-update-openai`, `package-update-anthropic`, `package-update-core`, `plugins-runtime-plugins`, `plugins-runtime-services`, et `plugins-runtime-install-a` à `plugins-runtime-install-h`. `plugins-runtime-core`, `plugins-runtime` et `plugins-integrations` restent des alias agrégés Plugin/runtime. Lalias de lane `install-e2e` reste lalias agrégé de réexécution manuelle pour les deux lanes dinstallation fournisseur.
OpenWebUI est intégré à `plugins-runtime-services` lorsque la couverture complète du chemin de release le demande, et conserve un chunk autonome `openwebui` uniquement pour les déclenchements OpenWebUI seuls. Les lanes de mise à jour de canaux intégrés réessaient une fois en cas déchecs réseau npm transitoires.
OpenWebUI est intégré à `plugins-runtime-services` lorsque la couverture release-path complète le demande, et conserve un morceau autonome `openwebui` uniquement pour les déclenchements limités à OpenWebUI. Les lanes de mise à jour de canaux groupés réessaient une fois en cas déchecs réseau npm transitoires.
Chaque chunk téléverse `.artifacts/docker-tests/` avec les journaux de lanes, les minutages, `summary.json`, `failures.json`, les minutages de phases, le JSON du plan du planificateur, les tableaux de lanes lentes et les commandes de réexécution par lane. Lentrée `docker_lanes` du workflow exécute les lanes sélectionnées sur les images préparées au lieu des jobs de chunks, ce qui limite le débogage dune lane échouée à un seul job Docker ciblé et prépare, télécharge ou réutilise lartefact de package pour cette exécution ; si une lane sélectionnée est une lane Docker live, le job ciblé construit localement limage de test live pour cette réexécution. Les commandes GitHub générées de réexécution par lane incluent `package_artifact_run_id`, `package_artifact_name` et les entrées dimages préparées lorsque ces valeurs existent, afin quune lane échouée puisse réutiliser le package et les images exacts de lexécution échouée.
Chaque morceau téléverse `.artifacts/docker-tests/` avec les journaux de lanes, les timings, `summary.json`, `failures.json`, les timings de phases, le JSON du plan de lordonnanceur, les tableaux de lanes lentes et les commandes de réexécution par lane. Lentrée `docker_lanes` du workflow exécute les lanes sélectionnées contre les images préparées au lieu des jobs de morceaux, ce qui limite le débogage dune lane échouée à un job Docker ciblé et prépare, télécharge ou réutilise lartefact de package pour cette exécution ; si une lane sélectionnée est une lane Docker live, le job ciblé construit localement limage live-test pour cette réexécution. Les commandes GitHub de réexécution générées par lane incluent `package_artifact_run_id`, `package_artifact_name` et les entrées dimages préparées lorsque ces valeurs existent, afin quune lane échouée puisse réutiliser le package et les images exacts de lexécution échouée.
```bash
pnpm test:docker:rerun <run-id> # download Docker artifacts and print combined/per-lane targeted rerun commands
pnpm test:docker:timings <summary> # slow-lane and phase critical-path summaries
```
Le workflow live/E2E planifié exécute quotidiennement la suite Docker complète du chemin de release.
Le workflow live/E2E planifié exécute quotidiennement toute la suite Docker release-path.
## Prérelease Plugin
## Prépublication de Plugin
`Plugin Prerelease` est une couverture produit/package plus coûteuse ; il sagit donc dun workflow séparé déclenché par `Full Release Validation` ou par un opérateur explicite. Les pull requests normales, les pushes sur `main` et les déclenchements CI manuels autonomes gardent cette suite désactivée. Il répartit les tests de Plugins intégrés sur huit workers dextension ; ces jobs de shards dextension exécutent jusquà deux groupes de configuration de Plugin à la fois, avec un worker Vitest par groupe et un heap Node plus grand afin que les lots de Plugins lourds en imports ne créent pas de jobs CI supplémentaires. Le chemin Docker de prérelease réservé aux releases regroupe les lanes Docker ciblées en petits groupes pour éviter de réserver des dizaines de runners pour des jobs dune à trois minutes.
`Plugin Prerelease` est une couverture produit/package plus coûteuse ; il sagit donc dun workflow séparé déclenché par `Full Release Validation` ou par un opérateur explicite. Les pull requests normales, les pushs sur `main` et les déclenchements CI manuels autonomes gardent cette suite désactivée. Il équilibre les tests de Plugins groupés entre huit workers dextensions ; ces jobs de shards dextensions exécutent jusquà deux groupes de configuration de Plugin à la fois avec un worker Vitest par groupe et un tas Node plus grand, afin que les lots de Plugins lourds en imports ne créent pas de jobs CI supplémentaires. Le chemin de prépublication Docker réservé à la publication regroupe les lanes Docker ciblées en petits groupes pour éviter de réserver des dizaines de runners pour des jobs dune à trois minutes.
## Labo QA
## Laboratoire QA
Le Labo QA dispose de lanes CI dédiées en dehors du workflow principal à périmètre intelligent. La parité agentique est imbriquée sous les harnais QA et de release larges, et non dans un workflow PR autonome. Utilisez `Full Release Validation` avec `rerun_group=qa-parity` lorsque la parité doit accompagner une exécution de validation large.
QA Lab dispose de lanes CI dédiées en dehors du workflow principal à portée intelligente. La parité agentique est imbriquée sous les harnais QA et de publication larges, et non dans un workflow PR autonome. Utilisez `Full Release Validation` avec `rerun_group=qa-parity` lorsque la parité doit accompagner une exécution de validation large.
- Le workflow `QA-Lab - All Lanes` sexécute chaque nuit sur `main` et lors dun déclenchement manuel ; il déploie la lane de parité simulée, la lane Matrix live, ainsi que les lanes Telegram et Discord live comme jobs parallèles. Les jobs live utilisent lenvironnement `qa-live-shared`, et Telegram/Discord utilisent des baux Convex.
- Le workflow `QA-Lab - All Lanes` sexécute chaque nuit sur `main` et lors dun déclenchement manuel ; il déploie en parallèle la lane de parité mock, la lane Matrix live, ainsi que les lanes Telegram et Discord live sous forme de jobs parallèles. Les jobs live utilisent lenvironnement `qa-live-shared`, et Telegram/Discord utilisent des leases Convex.
Les vérifications de release exécutent les lanes de transport live Matrix et Telegram avec le fournisseur mock déterministe et des modèles qualifiés mock (`mock-openai/gpt-5.5` et `mock-openai/gpt-5.5-alt`) afin que le contrat de canal soit isolé de la latence des modèles live et du démarrage normal du Plugin fournisseur. Le Gateway de transport live désactive la recherche mémoire, car la parité QA couvre séparément le comportement mémoire ; la connectivité des fournisseurs est couverte par les suites distinctes modèle live, fournisseur natif et fournisseur Docker.
Les contrôles de publication exécutent les lanes de transport live Matrix et Telegram avec le fournisseur mock déterministe et des modèles qualifiés mock (`mock-openai/gpt-5.5` et `mock-openai/gpt-5.5-alt`) afin que le contrat de canal soit isolé de la latence des modèles live et du démarrage normal des Plugins fournisseurs. Le Gateway de transport live désactive la recherche mémoire, car la parité QA couvre séparément le comportement mémoire ; la connectivité fournisseur est couverte par les suites séparées de modèles live, fournisseurs natifs et fournisseurs Docker.
Matrix utilise `--profile fast` pour les gates planifiés et de release, en ajoutant `--fail-fast` uniquement lorsque la CLI extraite le prend en charge. La valeur par défaut de la CLI et lentrée manuelle du workflow restent `all` ; un déclenchement manuel `matrix_profile=all` segmente toujours la couverture Matrix complète en jobs `transport`, `media`, `e2ee-smoke`, `e2ee-deep` et `e2ee-cli`.
Matrix utilise `--profile fast` pour les gates planifiées et de publication, en ajoutant `--fail-fast` uniquement lorsque la CLI extraite le prend en charge. La valeur par défaut de la CLI et lentrée de workflow manuelle restent `all` ; un déclenchement manuel `matrix_profile=all` fragmente toujours la couverture Matrix complète en jobs `transport`, `media`, `e2ee-smoke`, `e2ee-deep` et `e2ee-cli`.
`OpenClaw Release Checks` exécute également les lanes QA Lab critiques pour la release avant lapprobation de la release ; son gate de parité QA exécute les packs candidat et de référence comme jobs de lanes parallèles, puis télécharge les deux artefacts dans un petit job de rapport pour la comparaison finale de parité.
`OpenClaw Release Checks` exécute également les lanes QA Lab critiques pour la publication avant lapprobation de publication ; son gate de parité QA exécute les packs candidat et de référence comme jobs de lanes parallèles, puis télécharge les deux artefacts dans un petit job de rapport pour la comparaison finale de parité.
Pour les PR normales, suivez les preuves CI/check à périmètre limité au lieu de traiter la parité comme un statut requis.
Pour les PR normales, suivez les preuves CI/contrôles à portée limitée au lieu de traiter la parité comme un statut requis.
## CodeQL
Le workflow `CodeQL` est volontairement un scanner de sécurité de premier passage restreint, et non une analyse complète du dépôt. Les exécutions quotidiennes, manuelles et de garde pour les pull requests non brouillon analysent le code des workflows Actions ainsi que les surfaces JavaScript/TypeScript les plus risquées, avec des requêtes de sécurité à haute confiance filtrées sur `security-severity` élevée/critique.
Le workflow `CodeQL` est intentionnellement un scanner de sécurité de premier passage à périmètre étroit, pas une analyse complète du dépôt. Les exécutions quotidiennes, manuelles et de garde des pull requests non brouillon analysent le code des workflows Actions ainsi que les surfaces JavaScript/TypeScript les plus risquées avec des requêtes de sécurité à haute confiance filtrées sur les niveaux `security-severity` élevé/critique.
La garde des pull requests reste légère : elle ne démarre que pour les changements sous `.github/actions`, `.github/codeql`, `.github/workflows`, `packages` ou `src`, et elle exécute la même matrice de sécurité à haute confiance que le workflow planifié. CodeQL Android et macOS restent hors des valeurs par défaut des PR.
La garde de pull request reste légère : elle ne démarre que pour les changements sous `.github/actions`, `.github/codeql`, `.github/workflows`, `packages` ou `src`, et elle exécute la même matrice de sécurité à haute confiance que le workflow planifié. Android et macOS CodeQL restent exclus des valeurs par défaut des PR.
### Catégories de sécurité
| Catégorie | Surface |
| ------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------- |
| `/codeql-security-high/core-auth-secrets` | Authentification, secrets, sandbox, cron et base de référence du Gateway |
| `/codeql-security-high/channel-runtime-boundary` | Contrats dimplémentation des canaux du cœur, plus runtime des Plugins de canal, Gateway, Plugin SDK, secrets et points de contact daudit |
| `/codeql-security-high/network-ssrf-boundary` | Surfaces de stratégie SSRF du cœur, analyse dIP, garde réseau, récupération web et Plugin SDK |
| `/codeql-security-high/mcp-process-tool-boundary` | Serveurs MCP, assistants dexécution de processus, livraison sortante et gardes dexécution doutils dagent |
| `/codeql-security-high/plugin-trust-boundary` | Surfaces de confiance de linstallation de Plugin, loader, manifeste, registre, installation par gestionnaire de paquets, chargement de source et contrat de paquet du Plugin SDK |
| `/codeql-security-high/core-auth-secrets` | Authentification, secrets, sandbox, Cron et base de référence Gateway |
| `/codeql-security-high/channel-runtime-boundary` | Contrats dimplémentation des canaux du cœur, ainsi que lexécution du Plugin de canal, le Gateway, le Plugin SDK, les secrets et les points de contact daudit |
| `/codeql-security-high/network-ssrf-boundary` | Surfaces SSRF du cœur, analyse dIP, garde réseau, récupération web et politique SSRF du Plugin SDK |
| `/codeql-security-high/mcp-process-tool-boundary` | Serveurs MCP, assistants dexécution de processus, livraison sortante et barrières dexécution doutils dagent |
| `/codeql-security-high/plugin-trust-boundary` | Surfaces de confiance de linstallation de Plugin, du chargeur, du manifeste, du registre, de linstallation via gestionnaire de paquets, du chargement de source et du contrat de paquet du Plugin SDK |
### Fragments de sécurité propres à la plateforme
### Éclats de sécurité propres aux plateformes
- `CodeQL Android Critical Security`fragment de sécurité Android planifié. Construit manuellement lapplication Android pour CodeQL sur le plus petit exécuteur Blacksmith Linux accepté par la vérification de cohérence du workflow. Téléverse sous `/codeql-critical-security/android`.
- `CodeQL macOS Critical Security`fragment de sécurité macOS hebdomadaire/manuel. Construit manuellement lapplication macOS pour CodeQL sur Blacksmith macOS, filtre les résultats de build des dépendances hors du SARIF téléversé, et téléverse sous `/codeql-critical-security/macos`. Conservé hors des valeurs par défaut quotidiennes parce que le build macOS domine le temps dexécution même lorsquil est propre.
- `CodeQL Android Critical Security`éclat de sécurité Android planifié. Construit manuellement lapplication Android pour CodeQL sur le plus petit runner Linux Blacksmith accepté par la validation de cohérence du workflow. Téléverse sous `/codeql-critical-security/android`.
- `CodeQL macOS Critical Security`éclat de sécurité macOS hebdomadaire/manuel. Construit manuellement lapplication macOS pour CodeQL sur Blacksmith macOS, filtre les résultats de construction des dépendances hors du SARIF téléversé et téléverse sous `/codeql-critical-security/macos`. Conservé en dehors des valeurs par défaut quotidiennes parce que la construction macOS domine le temps dexécution même lorsquelle est propre.
### Catégories de qualité critique
`CodeQL Critical Quality` est le fragment non sécuritaire correspondant. Il nexécute que des requêtes de qualité JavaScript/TypeScript de sévérité erreur et non sécuritaires sur des surfaces restreintes à forte valeur, sur le plus petit exécuteur Blacksmith Linux. Sa garde de pull request est volontairement plus réduite que le profil planifié : les PR non brouillon nexécutent que les fragments correspondants `agent-runtime-boundary`, `config-boundary`, `core-auth-secrets`, `channel-runtime-boundary`, `gateway-runtime-boundary`, `memory-runtime-boundary`, `mcp-process-runtime-boundary`, `provider-runtime-boundary`, `session-diagnostics-boundary`, `plugin-boundary`, `plugin-sdk-package-contract` et `plugin-sdk-reply-runtime` pour les changements de code dexécution de commandes/modèles/outils dagent et de distribution des réponses, de schéma/migration/E/S de configuration, dauthentification/secrets/sandbox/sécurité, de canaux du cœur et runtime des Plugins de canal groupés, de protocole Gateway/méthodes serveur, de runtime mémoire/glue SDK, de MCP/processus/livraison sortante, de runtime fournisseur/catalogue de modèles, de diagnostics de session/files de livraison, de loader de Plugin, de contrat Plugin SDK/paquet ou de runtime de réponse du Plugin SDK. Les changements de configuration CodeQL et de workflow qualité exécutent les douze fragments qualité de PR.
`CodeQL Critical Quality` est léclat non lié à la sécurité correspondant. Il exécute uniquement des requêtes de qualité JavaScript/TypeScript de sévérité erreur et non liées à la sécurité, sur des surfaces étroites à forte valeur, sur le plus petit runner Linux Blacksmith. Sa garde de pull request est intentionnellement plus petite que le profil planifié : les PR non brouillon nexécutent que les éclats correspondants `agent-runtime-boundary`, `config-boundary`, `core-auth-secrets`, `channel-runtime-boundary`, `gateway-runtime-boundary`, `memory-runtime-boundary`, `mcp-process-runtime-boundary`, `provider-runtime-boundary`, `session-diagnostics-boundary`, `plugin-boundary`, `plugin-sdk-package-contract` et `plugin-sdk-reply-runtime` pour les changements touchant le code dexécution des commandes/modèles/outils dagent et de distribution des réponses, le schéma/la migration/les E/S de configuration, le code dauthentification/secrets/sandbox/sécurité, lexécution des canaux du cœur et des Plugins de canal groupés, le protocole Gateway/la méthode serveur, la colle dexécution mémoire/SDK, MCP/processus/livraison sortante, le catalogue de modèles/lexécution fournisseur, les diagnostics de session/files de livraison, le chargeur de Plugin, le contrat Plugin SDK/paquet ou lexécution de réponse du Plugin SDK. Les changements de configuration CodeQL et de workflow de qualité exécutent les douze éclats de qualité PR.
Le déclenchement manuel accepte :
La distribution manuelle accepte :
```
profile=all|agent-runtime-boundary|config-boundary|core-auth-secrets|channel-runtime-boundary|gateway-runtime-boundary|memory-runtime-boundary|mcp-process-runtime-boundary|plugin-boundary|plugin-sdk-package-contract|plugin-sdk-reply-runtime|provider-runtime-boundary|session-diagnostics-boundary
```
Les profils restreints sont des points daccroche dapprentissage/itération pour exécuter un fragment qualité isolément.
Les profils étroits sont des points dancrage dapprentissage/itération pour exécuter un éclat de qualité isolément.
| Catégorie | Surface |
| ------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `/codeql-critical-quality/core-auth-secrets` | Code de frontière de sécurité pour authentification, secrets, sandbox, cron et Gateway |
| `/codeql-critical-quality/core-auth-secrets` | Code de frontière de sécurité pour lauthentification, les secrets, la sandbox, Cron et le Gateway |
| `/codeql-critical-quality/config-boundary` | Contrats de schéma de configuration, migration, normalisation et E/S |
| `/codeql-critical-quality/gateway-runtime-boundary` | Schémas du protocole Gateway et contrats de méthodes serveur |
| `/codeql-critical-quality/gateway-runtime-boundary` | Schémas de protocole Gateway et contrats de méthodes serveur |
| `/codeql-critical-quality/channel-runtime-boundary` | Contrats dimplémentation des canaux du cœur et des Plugins de canal groupés |
| `/codeql-critical-quality/agent-runtime-boundary` | Contrats de runtime pour exécution de commandes, distribution modèle/fournisseur, distribution et files dauto-réponse, et plan de contrôle ACP |
| `/codeql-critical-quality/mcp-process-runtime-boundary` | Serveurs MCP et passerelles doutils, assistants de supervision de processus, et contrats de livraison sortante |
| `/codeql-critical-quality/memory-runtime-boundary` | SDK hôte mémoire, façades de runtime mémoire, alias mémoire du Plugin SDK, glue dactivation du runtime mémoire, et commandes doctor mémoire |
| `/codeql-critical-quality/session-diagnostics-boundary` | Internes de file de réponses, files de livraison de session, assistants de liaison/livraison de session sortante, surfaces dévénements diagnostiques/bundles de journaux, et contrats CLI doctor de session |
| `/codeql-critical-quality/plugin-sdk-reply-runtime` | Distribution des réponses entrantes du Plugin SDK, assistants de payload/découpage/runtime de réponse, options de réponse de canal, files de livraison et assistants de liaison session/thread |
| `/codeql-critical-quality/provider-runtime-boundary` | Normalisation du catalogue de modèles, authentification et découverte des fournisseurs, enregistrement du runtime fournisseur, valeurs par défaut/catalogues fournisseur, et registres web/recherche/récupération/embedding |
| `/codeql-critical-quality/ui-control-plane` | Amorçage de lUI de contrôle, persistance locale, flux de contrôle Gateway et contrats de runtime du plan de contrôle des tâches |
| `/codeql-critical-quality/web-media-runtime-boundary` | Contrats de runtime pour récupération/recherche web du cœur, E/S média, compréhension média, génération dimages et génération média |
| `/codeql-critical-quality/plugin-boundary` | Contrats de loader, registre, surface publique et points dentrée du Plugin SDK |
| `/codeql-critical-quality/plugin-sdk-package-contract` | Source du Plugin SDK côté paquet publié et assistants de contrat de paquet Plugin |
| `/codeql-critical-quality/agent-runtime-boundary` | Exécution de commandes, distribution modèle/fournisseur, distribution et files de réponses automatiques, et contrats dexécution du plan de contrôle ACP |
| `/codeql-critical-quality/mcp-process-runtime-boundary` | Serveurs MCP et ponts doutils, assistants de supervision de processus, et contrats de livraison sortante |
| `/codeql-critical-quality/memory-runtime-boundary` | SDK hôte de mémoire, façades dexécution mémoire, alias mémoire du Plugin SDK, colle dactivation de lexécution mémoire et commandes doctor mémoire |
| `/codeql-critical-quality/session-diagnostics-boundary` | Internes de file de réponses, files de livraison de session, assistants de liaison/livraison de session sortante, surfaces de bundles dévénements/logs de diagnostic et contrats CLI doctor de session |
| `/codeql-critical-quality/plugin-sdk-reply-runtime` | Distribution des réponses entrantes du Plugin SDK, assistants de payload/découpage/exécution de réponse, options de réponse de canal, files de livraison et assistants de liaison session/thread |
| `/codeql-critical-quality/provider-runtime-boundary` | Normalisation du catalogue de modèles, authentification et découverte fournisseur, enregistrement de lexécution fournisseur, valeurs par défaut/catalogues fournisseur, et registres web/recherche/récupération/embedding |
| `/codeql-critical-quality/ui-control-plane` | Amorçage de linterface de contrôle, persistance locale, flux de contrôle Gateway et contrats dexécution du plan de contrôle des tâches |
| `/codeql-critical-quality/web-media-runtime-boundary` | Récupération/recherche web du cœur, E/S média, compréhension des médias, génération dimages et contrats dexécution de génération de médias |
| `/codeql-critical-quality/plugin-boundary` | Contrats de chargeur, registre, surface publique et points dentrée du Plugin SDK |
| `/codeql-critical-quality/plugin-sdk-package-contract` | Source du Plugin SDK côté paquet publié et assistants de contrat de paquet de plugin |
La qualité reste séparée de la sécurité afin que les constats de qualité puissent être planifiés, mesurés, désactivés ou étendus sans brouiller le signal de sécurité. Lextension CodeQL à Swift, Python et aux Plugins groupés devrait être réintroduite sous forme de suivi restreint ou fragmenté uniquement après stabilisation du runtime et du signal des profils restreints.
La qualité reste séparée de la sécurité afin que les constats de qualité puissent être planifiés, mesurés, désactivés ou étendus sans masquer le signal de sécurité. Lextension CodeQL Swift, Python et Plugins groupés doit être réintroduite comme travail de suivi à périmètre défini ou fragmenté uniquement après que les profils étroits disposent dun temps dexécution et dun signal stables.
## Workflows de maintenance
### Docs Agent
Le workflow `Docs Agent` est une voie de maintenance Codex pilotée par événements pour garder les docs existantes alignées avec les changements récemment intégrés. Il na pas de planification pure : une exécution CI réussie dun push non bot sur `main` peut le déclencher, et le déclenchement manuel peut lexécuter directement. Les invocations par workflow-run sont ignorées lorsque `main` a avancé ou lorsquune autre exécution Docs Agent non ignorée a été créée au cours de la dernière heure. Lorsquil sexécute, il examine la plage de commits depuis le SHA source du précédent Docs Agent non ignoré jusquau `main` actuel, de sorte quune exécution horaire peut couvrir tous les changements de main accumulés depuis le dernier passage docs.
Le workflow `Docs Agent` est une voie de maintenance Codex pilotée par événements pour garder les docs existantes alignées avec les changements récemment intégrés. Il na pas de planification pure : une exécution CI réussie sur `main` après push non bot peut le déclencher, et la distribution manuelle peut lexécuter directement. Les invocations par workflow-run sont ignorées lorsque `main` a avancé ou lorsquune autre exécution Docs Agent non ignorée a été créée dans lheure précédente. Lorsquil sexécute, il examine la plage de commits depuis le SHA source du précédent Docs Agent non ignoré jusquau `main` courant, de sorte quune exécution horaire peut couvrir tous les changements de main accumulés depuis le dernier passage docs.
### Test Performance Agent
Le workflow `Test Performance Agent` est une voie de maintenance Codex pilotée par événements pour les tests lents. Il na pas de planification pure : une exécution CI réussie dun push non bot sur `main` peut le déclencher, mais il est ignoré si une autre invocation par workflow-run a déjà été exécutée ou est en cours ce jour UTC. Le déclenchement manuel contourne cette garde dactivité quotidienne. La voie construit un rapport de performance Vitest groupé sur toute la suite, laisse Codex neffectuer que de petites corrections de performance de tests préservant la couverture au lieu de refactorisations larges, puis relance le rapport sur toute la suite et rejette les changements qui réduisent le nombre de tests réussis dans la base de référence. Si la base de référence contient des tests en échec, Codex ne peut corriger que les échecs évidents et le rapport sur toute la suite après agent doit réussir avant tout commit. Lorsque `main` avance avant que le push du bot narrive, la voie rebase le patch validé, relance `pnpm check:changed`, puis réessaie le push ; les patchs obsolètes en conflit sont ignorés. Elle utilise Ubuntu hébergé par GitHub afin que laction Codex puisse conserver la même posture de sécurité drop-sudo que lagent docs.
Le workflow `Test Performance Agent` est une voie de maintenance Codex pilotée par événements pour les tests lents. Il na pas de planification pure : une exécution CI réussie sur `main` après push non bot peut le déclencher, mais il signore si une autre invocation par workflow-run a déjà été exécutée ou est en cours ce jour UTC. La distribution manuelle contourne cette garde dactivité quotidienne. La voie construit un rapport de performance Vitest groupé sur toute la suite, laisse Codex effectuer uniquement de petites corrections de performance de tests préservant la couverture au lieu de refactorisations larges, puis réexécute le rapport de toute la suite et rejette les changements qui réduisent le nombre de tests de base réussis. Si la base de référence contient des tests en échec, Codex peut ne corriger que les échecs évidents et le rapport de toute la suite après lagent doit réussir avant toute validation. Lorsque `main` avance avant que le push du bot natterrisse, la voie rebase le patch validé, réexécute `pnpm check:changed` et réessaie le push ; les patchs obsolètes conflictuels sont ignorés. Elle utilise Ubuntu hébergé par GitHub afin que laction Codex puisse conserver la même posture de sécurité sans sudo que lagent docs.
### PR en double après fusion
### PR dupliquées après fusion
Le workflow `Duplicate PRs After Merge` est un workflow mainteneur manuel pour le nettoyage des doublons après intégration. Il utilise par défaut un dry-run et ne ferme que les PR explicitement listées lorsque `apply=true`. Avant de modifier GitHub, il vérifie que la PR intégrée est fusionnée et que chaque doublon possède soit une issue référencée commune, soit des hunks modifiés qui se chevauchent.
Le workflow `Duplicate PRs After Merge` est un workflow mainteneur manuel pour le nettoyage des doublons après intégration. Il utilise par défaut le mode dry-run et ne ferme que les PR explicitement listées lorsque `apply=true`. Avant de modifier GitHub, il vérifie que la PR intégrée est fusionnée et que chaque doublon a soit un ticket référencé commun, soit des hunks modifiés qui se chevauchent.
```bash
gh workflow run duplicate-after-merge.yml \
@ -478,38 +473,115 @@ gh workflow run duplicate-after-merge.yml \
## Portes de vérification locales et routage des changements
La logique locale des voies modifiées vit dans `scripts/changed-lanes.mjs` et est exécutée par `scripts/check-changed.mjs`. Cette porte de vérification locale est plus stricte sur les frontières darchitecture que le périmètre large de la plateforme CI :
La logique locale des voies de changement se trouve dans `scripts/changed-lanes.mjs` et est exécutée par `scripts/check-changed.mjs`. Cette porte de vérification locale est plus stricte sur les frontières darchitecture que le périmètre large de la plateforme CI :
- les changements de production du cœur exécutent le typecheck prod du cœur et test du cœur, plus lint/gardes du cœur ;
- les changements uniquement de tests du cœur exécutent seulement le typecheck test du cœur, plus le lint du cœur ;
- les changements de production dextension exécutent le typecheck prod dextension et test dextension, plus le lint dextension ;
- les changements uniquement de tests dextension exécutent le typecheck test dextension, plus le lint dextension ;
- les changements publics du Plugin SDK ou de contrat Plugin sétendent au typecheck dextension parce que les extensions dépendent de ces contrats du cœur (les analyses Vitest dextensions restent un travail de test explicite) ;
- les montées de version uniquement de métadonnées de release exécutent des vérifications ciblées de version/configuration/dépendances racine ;
- les changements root/config inconnus échouent prudemment vers toutes les voies de vérification.
- les changements de production du cœur exécutent le typecheck prod du cœur et le typecheck des tests du cœur, plus le lint/les gardes du cœur ;
- les changements touchant uniquement les tests du cœur nexécutent que le typecheck des tests du cœur plus le lint du cœur ;
- les changements de production dextension exécutent le typecheck prod dextension et le typecheck des tests dextension, plus le lint dextension ;
- les changements touchant uniquement les tests dextension exécutent le typecheck des tests dextension plus le lint dextension ;
- les changements de Plugin SDK public ou de contrat de plugin sétendent au typecheck dextension parce que les extensions dépendent de ces contrats du cœur (les balayages Vitest dextension restent du travail de test explicite) ;
- les incréments de version portant uniquement sur les métadonnées de release exécutent des vérifications ciblées version/configuration/dépendances racine ;
- les changements racine/config inconnus échouent prudemment vers toutes les voies de vérification.
Le routage local des tests modifiés vit dans `scripts/test-projects.test-support.mjs` et est volontairement moins coûteux que `check:changed` : les modifications directes de tests sexécutent elles-mêmes, les modifications de source privilégient les mappings explicites, puis les tests frères et les dépendants du graphe dimports. La configuration partagée de livraison group-room fait partie des mappings explicites : les changements de configuration de réponse visible de groupe, du mode de livraison de réponse source ou du prompt système de loutil de message passent par les tests de réponse du cœur plus les régressions de livraison Discord et Slack, afin quun changement de valeur par défaut partagée échoue avant le premier push de PR. Utilisez `OPENCLAW_TEST_CHANGED_BROAD=1 pnpm test:changed` uniquement lorsque le changement est assez transversal au harnais pour que lensemble mappé économique ne soit pas un proxy fiable.
Le routage local des tests modifiés se trouve dans `scripts/test-projects.test-support.mjs` et est intentionnellement moins coûteux que `check:changed` : les modifications directes de tests sexécutent elles-mêmes, les modifications de source privilégient les mappages explicites, puis les tests frères et les dépendants du graphe dimportation. La configuration de livraison de salle de groupe partagée fait partie des mappages explicites : les changements de la configuration de réponse visible de groupe, du mode de livraison des réponses source ou du prompt système de loutil de message passent par les tests de réponse du cœur ainsi que les régressions de livraison Discord et Slack, afin quun changement de valeur par défaut partagé échoue avant le premier push de PR. Utilisez `OPENCLAW_TEST_CHANGED_BROAD=1 pnpm test:changed` uniquement lorsque le changement est assez transversal au harnais pour que lensemble mappé peu coûteux ne soit pas un proxy fiable.
## Validation Testbox
Exécutez Testbox depuis la racine du dépôt et privilégiez une instance fraîchement préparée pour une validation large. Avant de lancer une vérification lente sur une instance réutilisée, expirée ou qui vient de signaler une synchronisation anormalement volumineuse, exécutez dabord `pnpm testbox:sanity` dans linstance.
Exécutez Testbox depuis la racine du dépôt et préférez une box fraîche préchauffée pour une validation étendue. Avant de lancer un gate lent sur une box qui a été réutilisée, a expiré ou vient de signaler une synchronisation étonnamment volumineuse, exécutez dabord `pnpm testbox:sanity` dans la box.
La vérification de cohérence échoue rapidement lorsque des fichiers racine requis comme `pnpm-lock.yaml` ont disparu ou lorsque `git status --short` affiche au moins 200 suppressions de fichiers suivis. Cela signifie généralement que létat de synchronisation distant nest pas une copie fiable de la PR ; arrêtez cette instance et préparez-en une nouvelle au lieu de déboguer léchec du test produit. Pour les PRs avec de nombreuses suppressions intentionnelles, définissez `OPENCLAW_TESTBOX_ALLOW_MASS_DELETIONS=1` pour cette exécution de cohérence.
Le contrôle dintégrité échoue rapidement lorsque des fichiers racine requis comme `pnpm-lock.yaml` ont disparu ou lorsque `git status --short` affiche au moins 200 suppressions suivies. Cela signifie généralement que létat de synchronisation distant nest pas une copie fiable de la PR ; arrêtez cette box et préchauffez-en une fraîche au lieu de déboguer léchec du test produit. Pour les PRs comportant intentionnellement de nombreuses suppressions, définissez `OPENCLAW_TESTBOX_ALLOW_MASS_DELETIONS=1` pour cette exécution dintégrité.
`pnpm testbox:run` termine aussi une invocation locale de la CLI Blacksmith qui reste en phase de synchronisation pendant plus de cinq minutes sans sortie post-synchronisation. Définissez `OPENCLAW_TESTBOX_SYNC_TIMEOUT_MS=0` pour désactiver cette protection, ou utilisez une valeur en millisecondes plus élevée pour des diffs locaux exceptionnellement volumineux.
`pnpm testbox:run` termine aussi une invocation locale de la CLI Blacksmith qui reste en phase de synchronisation pendant plus de cinq minutes sans sortie après synchronisation. Définissez `OPENCLAW_TESTBOX_SYNC_TIMEOUT_MS=0` pour désactiver cette protection, ou utilisez une valeur plus grande en millisecondes pour des diffs locaux exceptionnellement volumineux.
Crabbox est le second chemin dinstance distante propre au dépôt pour la validation Linux lorsque Blacksmith nest pas disponible ou lorsque la capacité cloud détenue est préférable. Préparez une instance, hydratez-la via le workflow du projet, puis exécutez les commandes avec la CLI Crabbox :
Crabbox est le wrapper de box distante appartenant au dépôt pour les validations Linux des mainteneurs. Utilisez-le quand une vérification est trop large pour une boucle dédition locale, quand la parité avec la CI importe, ou quand la validation nécessite des secrets, Docker, des lanes de paquet, des boxes réutilisables ou des journaux distants. Le backend OpenClaw normal est `blacksmith-testbox` ; la capacité AWS/Hetzner détenue est une solution de repli pour les pannes Blacksmith, les problèmes de quota ou les tests explicites sur capacité détenue.
Avant une première exécution, vérifiez le wrapper depuis la racine du dépôt :
```bash
pnpm crabbox:warmup -- --idle-timeout 90m
pnpm crabbox:hydrate -- --id <cbx_id>
pnpm crabbox:run -- --id <cbx_id> --shell "OPENCLAW_TESTBOX=1 pnpm check:changed"
pnpm crabbox:stop -- <cbx_id>
pnpm crabbox:run -- --help | sed -n '1,120p'
```
`.crabbox.yaml` détient les valeurs par défaut du fournisseur, de la synchronisation et de lhydratation GitHub Actions. Il exclut le `.git` local afin que le checkout Actions hydraté conserve ses propres métadonnées Git distantes au lieu de synchroniser les remotes et les magasins dobjets locaux du mainteneur, et il exclut les artefacts locaux dexécution et de build qui ne doivent jamais être transférés. `.github/workflows/crabbox-hydrate.yml` détient le checkout, la configuration Node/pnpm, la récupération de `origin/main` et la transmission de lenvironnement non secret que les commandes ultérieures `crabbox run --id <cbx_id>` sourcent.
Le wrapper du dépôt refuse un binaire Crabbox obsolète qui nannonce pas `blacksmith-testbox`. Passez le fournisseur explicitement même si `.crabbox.yaml` contient des valeurs par défaut owned-cloud.
## Liens connexes
Gate des modifications :
```bash
pnpm crabbox:run -- --provider blacksmith-testbox \
--blacksmith-org openclaw \
--blacksmith-workflow .github/workflows/ci-check-testbox.yml \
--blacksmith-job check \
--blacksmith-ref main \
--idle-timeout 90m \
--ttl 240m \
--timing-json \
--shell -- \
"env CI=1 NODE_OPTIONS=--max-old-space-size=4096 OPENCLAW_TEST_PROJECTS_PARALLEL=6 OPENCLAW_VITEST_MAX_WORKERS=1 OPENCLAW_VITEST_NO_OUTPUT_TIMEOUT_MS=900000 pnpm check:changed"
```
Relance de test ciblée :
```bash
pnpm crabbox:run -- --provider blacksmith-testbox \
--blacksmith-org openclaw \
--blacksmith-workflow .github/workflows/ci-check-testbox.yml \
--blacksmith-job check \
--blacksmith-ref main \
--idle-timeout 90m \
--ttl 240m \
--timing-json \
--shell -- \
"env CI=1 NODE_OPTIONS=--max-old-space-size=4096 OPENCLAW_VITEST_MAX_WORKERS=1 OPENCLAW_VITEST_NO_OUTPUT_TIMEOUT_MS=900000 pnpm test <path-or-filter>"
```
Suite complète :
```bash
pnpm crabbox:run -- --provider blacksmith-testbox \
--blacksmith-org openclaw \
--blacksmith-workflow .github/workflows/ci-check-testbox.yml \
--blacksmith-job check \
--blacksmith-ref main \
--idle-timeout 90m \
--ttl 240m \
--timing-json \
--shell -- \
"env CI=1 NODE_OPTIONS=--max-old-space-size=4096 OPENCLAW_TEST_PROJECTS_PARALLEL=6 OPENCLAW_VITEST_MAX_WORKERS=1 OPENCLAW_VITEST_NO_OUTPUT_TIMEOUT_MS=900000 pnpm test"
```
Lisez le résumé JSON final. Les champs utiles sont `provider`, `leaseId`, `syncDelegated`, `exitCode`, `commandMs` et `totalMs`. Les exécutions ponctuelles de Crabbox adossées à Blacksmith doivent arrêter la Testbox automatiquement ; si une exécution est interrompue ou si le nettoyage nest pas clair, inspectez les boxes actives et arrêtez uniquement celles que vous avez créées :
```bash
blacksmith testbox list
blacksmith testbox stop --id <tbx_id>
```
Nutilisez la réutilisation que lorsque vous avez intentionnellement besoin de plusieurs commandes sur la même box hydratée :
```bash
pnpm crabbox:run -- --provider blacksmith-testbox --id <tbx_id> --no-sync --timing-json --shell -- "pnpm test <path-or-filter>"
pnpm crabbox:stop -- <tbx_id>
```
Si Crabbox est la couche défaillante mais que Blacksmith lui-même fonctionne, utilisez directement Blacksmith comme solution de repli limitée :
```bash
blacksmith testbox warmup ci-check-testbox.yml --ref main --idle-timeout 90
blacksmith testbox run --id <tbx_id> "env CI=1 NODE_OPTIONS=--max-old-space-size=4096 OPENCLAW_TEST_PROJECTS_PARALLEL=6 OPENCLAW_VITEST_MAX_WORKERS=1 OPENCLAW_VITEST_NO_OUTPUT_TIMEOUT_MS=900000 pnpm check:changed"
blacksmith testbox stop --id <tbx_id>
```
Nescaladez vers la capacité Crabbox détenue que lorsque Blacksmith est indisponible, limité par quota, privé de lenvironnement nécessaire, ou que la capacité détenue est explicitement lobjectif :
```bash
pnpm crabbox:warmup -- --provider aws --class beast --market on-demand --idle-timeout 90m
pnpm crabbox:hydrate -- --id <cbx_id-or-slug>
pnpm crabbox:run -- --id <cbx_id-or-slug> --timing-json --shell -- "env NODE_OPTIONS=--max-old-space-size=4096 OPENCLAW_TEST_PROJECTS_PARALLEL=6 OPENCLAW_VITEST_MAX_WORKERS=1 OPENCLAW_VITEST_NO_OUTPUT_TIMEOUT_MS=900000 pnpm check:changed"
pnpm crabbox:stop -- <cbx_id-or-slug>
```
`.crabbox.yaml` détient les valeurs par défaut de fournisseur, de synchronisation et dhydratation GitHub Actions pour les lanes owned-cloud. Il exclut le `.git` local afin que le checkout Actions hydraté conserve ses propres métadonnées Git distantes au lieu de synchroniser les remotes et magasins dobjets locaux du mainteneur, et il exclut les artefacts locaux dexécution/de build qui ne doivent jamais être transférés. `.github/workflows/crabbox-hydrate.yml` détient le checkout, la configuration Node/pnpm, la récupération de `origin/main` et le transfert denvironnement non secret pour les commandes owned-cloud `crabbox run --id <cbx_id>`.
## Connexe
- [Vue densemble de linstallation](/fr/install)
- [Canaux de développement](/fr/install/development-channels)

View File

@ -1,15 +1,15 @@
---
read_when:
- Vous souhaitez installer ou gérer des plugins Gateway ou des paquets compatibles
- Vous souhaitez déboguer les échecs de chargement des Plugins
- Vous voulez installer ou gérer des plugins Gateway ou des bundles compatibles
- Vous voulez déboguer les échecs de chargement des Plugins
sidebarTitle: Plugins
summary: Référence CLI pour `openclaw plugins` (list, install, marketplace, uninstall, enable/disable, doctor)
summary: Référence CLI pour `openclaw plugins` (liste, installation, place de marché, désinstallation, activation/désactivation, diagnostic)
title: Plugins
x-i18n:
generated_at: "2026-05-03T21:29:28Z"
generated_at: "2026-05-04T07:03:00Z"
model: gpt-5.5
provider: openai
source_hash: d854d052b0a012a86f9c775775676a9a8fe8ae86b2c38a18118f1abf0732174c
source_hash: 36ae7edb12986ead7e126f25e0761bf312b2644b35017181b674082105886776
source_path: cli/plugins.md
workflow: 16
---
@ -17,19 +17,19 @@ x-i18n:
Gérer les plugins Gateway, les packs de hooks et les bundles compatibles.
<CardGroup cols={2}>
<Card title="Plugin system" href="/fr/tools/plugin">
Guide utilisateur final pour installer, activer et dépanner les plugins.
<Card title="Système de Plugin" href="/fr/tools/plugin">
Guide utilisateur pour installer, activer et dépanner les plugins.
</Card>
<Card title="Manage plugins" href="/fr/plugins/manage-plugins">
<Card title="Gérer les plugins" href="/fr/plugins/manage-plugins">
Exemples rapides pour installer, lister, mettre à jour, désinstaller et publier.
</Card>
<Card title="Plugin bundles" href="/fr/plugins/bundles">
<Card title="Bundles de Plugin" href="/fr/plugins/bundles">
Modèle de compatibilité des bundles.
</Card>
<Card title="Plugin manifest" href="/fr/plugins/manifest">
<Card title="Manifeste de Plugin" href="/fr/plugins/manifest">
Champs du manifeste et schéma de configuration.
</Card>
<Card title="Security" href="/fr/gateway/security">
<Card title="Sécurité" href="/fr/gateway/security">
Renforcement de la sécurité pour les installations de plugins.
</Card>
</CardGroup>
@ -62,14 +62,12 @@ openclaw plugins marketplace list <marketplace>
openclaw plugins marketplace list <marketplace> --json
```
Pour examiner une installation, une inspection, une désinstallation ou une actualisation de registre lente, exécutez la
commande avec `OPENCLAW_PLUGIN_LIFECYCLE_TRACE=1`. La trace écrit les temps des phases
sur stderr et garde la sortie JSON analysable. Consultez [Débogage](/fr/help/debugging#plugin-lifecycle-trace).
Pour examiner une installation, une inspection, une désinstallation ou une actualisation de registre lente, exécutez la commande avec `OPENCLAW_PLUGIN_LIFECYCLE_TRACE=1`. La trace écrit les durées des phases dans stderr et conserve une sortie JSON analysable. Consultez [Débogage](/fr/help/debugging#plugin-lifecycle-trace).
<Note>
Les plugins groupés sont fournis avec OpenClaw. Certains sont activés par défaut (par exemple les fournisseurs de modèles groupés, les fournisseurs de synthèse vocale groupés et le plugin de navigateur groupé) ; dautres nécessitent `plugins enable`.
Les plugins groupés sont livrés avec OpenClaw. Certains sont activés par défaut (par exemple les fournisseurs de modèles groupés, les fournisseurs de synthèse vocale groupés et le plugin de navigateur groupé) ; dautres nécessitent `plugins enable`.
Les plugins OpenClaw natifs doivent fournir `openclaw.plugin.json` avec un schéma JSON en ligne (`configSchema`, même vide). Les bundles compatibles utilisent plutôt leurs propres manifestes de bundle.
Les plugins OpenClaw natifs doivent livrer `openclaw.plugin.json` avec un schéma JSON en ligne (`configSchema`, même vide). Les bundles compatibles utilisent plutôt leurs propres manifestes de bundle.
`plugins list` affiche `Format: openclaw` ou `Format: bundle`. La sortie détaillée de list/info affiche aussi le sous-type du bundle (`codex`, `claude` ou `cursor`) ainsi que les capacités de bundle détectées.
</Note>
@ -93,71 +91,63 @@ openclaw plugins install <plugin> --marketplace https://github.com/<owner>/<repo
```
<Warning>
Les noms de paquets nus sinstallent depuis npm par défaut pendant la transition de lancement. Utilisez `clawhub:<package>` pour ClawHub. Traitez les installations de plugins comme lexécution de code. Préférez les versions épinglées.
Les noms de packages nus sinstallent depuis npm par défaut pendant la transition de lancement. Utilisez `clawhub:<package>` pour ClawHub. Traitez les installations de plugins comme lexécution de code. Préférez les versions épinglées.
</Warning>
`plugins search` interroge ClawHub pour trouver des paquets de plugins installables et affiche
des noms de paquets prêts à installer. La recherche porte sur les paquets de plugins de code et de plugins de bundle,
pas sur les Skills. Utilisez `openclaw skills search` pour les Skills ClawHub.
`plugins search` interroge ClawHub pour trouver des packages de plugins installables et affiche des noms de packages prêts à installer. La recherche porte sur les packages de plugins de code et de plugins de bundle, pas sur les Skills. Utilisez `openclaw skills search` pour les Skills ClawHub.
<Note>
ClawHub est la principale surface de distribution et de découverte pour la plupart des plugins. Npm
reste une solution de secours prise en charge et une voie dinstallation directe. Les paquets de plugins
`@openclaw/*` détenus par OpenClaw sont de nouveau publiés sur npm ; consultez la liste actuelle
sur [npmjs.com/org/openclaw](https://www.npmjs.com/org/openclaw) ou
[linventaire des plugins](/fr/plugins/plugin-inventory). Les installations stables utilisent `latest`.
Les installations et mises à jour du canal bêta préfèrent le dist-tag npm `beta` lorsque cette balise
est disponible, puis se rabattent sur `latest`.
ClawHub est la principale surface de distribution et de découverte pour la plupart des plugins. Npm reste une solution de repli prise en charge et un chemin dinstallation directe. Les packages de plugins `@openclaw/*` appartenant à OpenClaw sont de nouveau publiés sur npm ; consultez la liste actuelle sur [npmjs.com/org/openclaw](https://www.npmjs.com/org/openclaw) ou l[inventaire des plugins](/fr/plugins/plugin-inventory). Les installations stables utilisent `latest`. Les installations et mises à jour du canal bêta privilégient le dist-tag npm `beta` lorsque cette étiquette est disponible, puis se rabattent sur `latest`.
</Note>
<AccordionGroup>
<Accordion title="Config includes and invalid-config repair">
Si votre section `plugins` est adossée à un `$include` fichier unique, `plugins install/update/enable/disable/uninstall` écrit dans ce fichier inclus et laisse `openclaw.json` intact. Les includes racine, les tableaux dincludes et les includes avec des remplacements voisins échouent de manière fermée au lieu dêtre aplatis. Consultez [Includes de configuration](/fr/gateway/configuration) pour les formes prises en charge.
<Accordion title="Inclus de configuration et réparation des configurations invalides">
Si votre section `plugins` repose sur un `$include` à fichier unique, `plugins install/update/enable/disable/uninstall` écrit dans ce fichier inclus et laisse `openclaw.json` intact. Les inclus racine, les tableaux dinclus et les inclus avec remplacements voisins échouent de manière fermée au lieu dêtre aplatis. Consultez [Inclus de configuration](/fr/gateway/configuration) pour les formes prises en charge.
Si la configuration est invalide pendant linstallation, `plugins install` échoue normalement de manière fermée et vous indique dexécuter dabord `openclaw doctor --fix`. Au démarrage du Gateway et lors du rechargement à chaud, une configuration de plugin invalide échoue de manière fermée comme toute autre configuration invalide ; `openclaw doctor --fix` peut mettre en quarantaine lentrée de plugin invalide. La seule exception documentée au moment de linstallation est un chemin de récupération étroit pour plugins groupés, réservé aux plugins qui optent explicitement pour `openclaw.install.allowInvalidConfigRecovery`.
Si la configuration est invalide pendant linstallation, `plugins install` échoue normalement de manière fermée et vous indique dexécuter dabord `openclaw doctor --fix`. Pendant le démarrage du Gateway et le rechargement à chaud, une configuration de plugin invalide échoue de manière fermée comme toute autre configuration invalide ; `openclaw doctor --fix` peut mettre en quarantaine lentrée de plugin invalide. La seule exception documentée au moment de linstallation est un chemin de récupération étroit pour plugin groupé destiné aux plugins qui optent explicitement pour `openclaw.install.allowInvalidConfigRecovery`.
</Accordion>
<Accordion title="--force and reinstall vs update">
`--force` réutilise la cible dinstallation existante et remplace sur place un plugin ou un pack de hooks déjà installé. Utilisez-le lorsque vous réinstallez intentionnellement le même identifiant depuis un nouveau chemin local, une archive, un paquet ClawHub ou un artefact npm. Pour les mises à niveau courantes dun plugin npm déjà suivi, préférez `openclaw plugins update <id-or-npm-spec>`.
<Accordion title="--force et réinstallation ou mise à jour">
`--force` réutilise la cible dinstallation existante et écrase sur place un plugin ou un pack de hooks déjà installé. Utilisez-le lorsque vous réinstallez intentionnellement le même identifiant depuis un nouveau chemin local, une archive, un package ClawHub ou un artefact npm. Pour les mises à niveau courantes dun plugin npm déjà suivi, préférez `openclaw plugins update <id-or-npm-spec>`.
Si vous exécutez `plugins install` pour un identifiant de plugin déjà installé, OpenClaw sarrête et vous dirige vers `plugins update <id-or-npm-spec>` pour une mise à niveau normale, ou vers `plugins install <package> --force` lorsque vous voulez réellement remplacer linstallation actuelle depuis une autre source.
Si vous exécutez `plugins install` pour un identifiant de plugin déjà installé, OpenClaw sarrête et vous renvoie vers `plugins update <id-or-npm-spec>` pour une mise à niveau normale, ou vers `plugins install <package> --force` lorsque vous voulez réellement écraser linstallation actuelle depuis une autre source.
</Accordion>
<Accordion title="--pin scope">
`--pin` sapplique uniquement aux installations npm. Il nest pas pris en charge avec les installations `git:` ; utilisez une référence git explicite comme `git:github.com/acme/plugin@v1.2.3` lorsque vous voulez une source épinglée. Il nest pas pris en charge avec `--marketplace`, car les installations marketplace conservent les métadonnées de source marketplace au lieu dune spec npm.
<Accordion title="Portée de --pin">
`--pin` sapplique uniquement aux installations npm. Il nest pas pris en charge avec les installations `git:` ; utilisez une référence git explicite telle que `git:github.com/acme/plugin@v1.2.3` lorsque vous voulez une source épinglée. Il nest pas pris en charge avec `--marketplace`, car les installations marketplace conservent les métadonnées de source marketplace au lieu dune spécification npm.
</Accordion>
<Accordion title="--dangerously-force-unsafe-install">
`--dangerously-force-unsafe-install` est une option de dernier recours pour les faux positifs dans lanalyseur de code dangereux intégré. Elle permet à linstallation de continuer même lorsque lanalyseur intégré signale des résultats `critical`, mais elle ne contourne **pas** les blocages de politique des hooks `before_install` du plugin et ne contourne **pas** les échecs danalyse.
`--dangerously-force-unsafe-install` est une option durgence pour les faux positifs du scanner de code dangereux intégré. Elle permet à linstallation de continuer même lorsque le scanner intégré signale des résultats `critical`, mais elle ne contourne **pas** les blocages de politique du hook `before_install` du plugin et ne contourne **pas** les échecs danalyse.
Ce flag CLI sapplique aux flux dinstallation/mise à jour de plugins. Les installations de dépendances de Skills adossées au Gateway utilisent le remplacement de requête correspondant `dangerouslyForceUnsafeInstall`, tandis que `openclaw skills install` reste un flux séparé de téléchargement/installation de Skills ClawHub.
Cet indicateur CLI sapplique aux flux dinstallation/mise à jour de plugins. Les installations de dépendances de Skills adossées au Gateway utilisent le remplacement de requête correspondant `dangerouslyForceUnsafeInstall`, tandis que `openclaw skills install` reste un flux séparé de téléchargement/installation de Skills ClawHub.
Si un plugin que vous avez publié sur ClawHub est bloqué par une analyse de registre, utilisez les étapes de publication dans [ClawHub](/fr/tools/clawhub).
Si un plugin que vous avez publié sur ClawHub est bloqué par une analyse de registre, utilisez les étapes éditeur dans [ClawHub](/fr/tools/clawhub).
</Accordion>
<Accordion title="Hook packs and npm specs">
`plugins install` est aussi la surface dinstallation des packs de hooks qui exposent `openclaw.hooks` dans `package.json`. Utilisez `openclaw hooks` pour une visibilité filtrée des hooks et lactivation par hook, pas pour linstallation de paquets.
<Accordion title="Packs de hooks et spécifications npm">
`plugins install` est aussi la surface dinstallation pour les packs de hooks qui exposent `openclaw.hooks` dans `package.json`. Utilisez `openclaw hooks` pour une visibilité filtrée des hooks et lactivation par hook, pas pour linstallation de packages.
Les specs npm sont **uniquement registre** (nom de paquet + **version exacte** ou **dist-tag** facultatif). Les specs Git/URL/fichier et les plages semver sont rejetées. Les installations de dépendances sexécutent localement au projet avec `--ignore-scripts` pour la sécurité, même lorsque votre shell a des paramètres globaux dinstallation npm.
Les spécifications npm sont **réservées au registre** (nom de package + **version exacte** facultative ou **dist-tag**). Les spécifications Git/URL/fichier et les plages semver sont rejetées. Les installations de dépendances sexécutent localement au projet avec `--ignore-scripts` pour la sécurité, même lorsque votre shell dispose de paramètres dinstallation npm globaux.
Utilisez `npm:<package>` lorsque vous voulez rendre la résolution npm explicite. Les specs de paquets nues sinstallent aussi directement depuis npm pendant la transition de lancement.
Utilisez `npm:<package>` lorsque vous voulez rendre la résolution npm explicite. Les spécifications de package nues sinstallent aussi directement depuis npm pendant la transition de lancement.
Les specs nues et `@latest` restent sur le canal stable. Si npm résout lune delles vers une préversion, OpenClaw sarrête et vous demande dopter explicitement avec une balise de préversion comme `@beta`/`@rc` ou une version de préversion exacte comme `@1.2.3-beta.4`.
Les spécifications nues et `@latest` restent sur la piste stable. Les versions correctives OpenClaw datées telles que `2026.5.3-1` sont des versions stables pour cette vérification. Si npm résout lune delles en préversion, OpenClaw sarrête et vous demande dopter explicitement pour une étiquette de préversion telle que `@beta`/`@rc` ou pour une version de préversion exacte telle que `@1.2.3-beta.4`.
Si une spec dinstallation nue correspond à un identifiant officiel de plugin (par exemple `diffs`), OpenClaw installe directement lentrée du catalogue. Pour installer un paquet npm portant le même nom, utilisez une spec scoped explicite (par exemple `@scope/diffs`).
Si une spécification dinstallation nue correspond à un identifiant de plugin officiel (par exemple `diffs`), OpenClaw installe directement lentrée du catalogue. Pour installer un package npm portant le même nom, utilisez une spécification à portée explicite (par exemple `@scope/diffs`).
</Accordion>
<Accordion title="Git repositories">
Utilisez `git:<repo>` pour installer directement depuis un dépôt git. Les formes prises en charge incluent `git:github.com/owner/repo`, `git:owner/repo`, les URL de clonage complètes `https://`, `ssh://`, `git://`, `file://` et `git@host:owner/repo.git`. Ajoutez `@<ref>` ou `#<ref>` pour extraire une branche, une balise ou un commit avant linstallation.
<Accordion title="Dépôts Git">
Utilisez `git:<repo>` pour installer directement depuis un dépôt git. Les formes prises en charge incluent `git:github.com/owner/repo`, `git:owner/repo`, les URL de clonage complètes `https://`, `ssh://`, `git://`, `file://` et `git@host:owner/repo.git`. Ajoutez `@<ref>` ou `#<ref>` pour extraire une branche, une étiquette ou un commit avant linstallation.
Les installations Git clonent dans un répertoire temporaire, extraient la référence demandée lorsquelle est présente, puis utilisent linstallateur normal de répertoire de plugin. Cela signifie que la validation du manifeste, lanalyse de code dangereux, le travail dinstallation du gestionnaire de paquets et les enregistrements dinstallation se comportent comme pour les installations npm. Les installations git enregistrées incluent lURL/la référence source ainsi que le commit résolu afin que `openclaw plugins update` puisse résoudre de nouveau la source plus tard.
Les installations Git clonent dans un répertoire temporaire, extraient la référence demandée lorsquelle est présente, puis utilisent linstallateur de répertoire de plugin normal. Cela signifie que la validation du manifeste, lanalyse de code dangereux, le travail dinstallation du gestionnaire de packages et les enregistrements dinstallation se comportent comme pour les installations npm. Les installations git enregistrées incluent lURL/la référence source plus le commit résolu afin que `openclaw plugins update` puisse résoudre de nouveau la source ultérieurement.
Après une installation depuis git, utilisez `openclaw plugins inspect <id> --runtime --json` pour vérifier les enregistrements dexécution comme les méthodes du Gateway et les commandes CLI. Si le plugin a enregistré une racine CLI avec `api.registerCli`, exécutez cette commande directement via la CLI racine OpenClaw, par exemple `openclaw demo-plugin ping`.
Après une installation depuis git, utilisez `openclaw plugins inspect <id> --runtime --json` pour vérifier les enregistrements runtime tels que les méthodes Gateway et les commandes CLI. Si le plugin a enregistré une racine CLI avec `api.registerCli`, exécutez cette commande directement via la CLI racine OpenClaw, par exemple `openclaw demo-plugin ping`.
</Accordion>
<Accordion title="Archives">
Archives prises en charge : `.zip`, `.tgz`, `.tar.gz`, `.tar`. Les archives de plugins OpenClaw natifs doivent contenir un `openclaw.plugin.json` valide à la racine du plugin extrait ; les archives qui contiennent seulement `package.json` sont rejetées avant quOpenClaw nécrive les enregistrements dinstallation.
Archives prises en charge : `.zip`, `.tgz`, `.tar.gz`, `.tar`. Les archives de plugins OpenClaw natifs doivent contenir un `openclaw.plugin.json` valide à la racine du plugin extrait ; les archives qui ne contiennent que `package.json` sont rejetées avant quOpenClaw nécrive les enregistrements dinstallation.
Les installations depuis la marketplace Claude sont également prises en charge.
Les installations marketplace Claude sont également prises en charge.
</Accordion>
</AccordionGroup>
@ -169,21 +159,21 @@ openclaw plugins install clawhub:openclaw-codex-app-server
openclaw plugins install clawhub:openclaw-codex-app-server@1.2.3
```
Les specs de plugins nues compatibles npm sinstallent depuis npm par défaut pendant la transition de lancement :
Les spécifications de plugins nues compatibles npm sinstallent depuis npm par défaut pendant la transition de lancement :
```bash
openclaw plugins install openclaw-codex-app-server
```
Utilisez `npm:` pour rendre la résolution npm uniquement explicite :
Utilisez `npm:` pour rendre explicite la résolution limitée à npm :
```bash
openclaw plugins install npm:openclaw-codex-app-server
openclaw plugins install npm:@scope/plugin-name@1.0.1
```
OpenClaw vérifie la compatibilité annoncée de lAPI du plugin / Gateway minimal avant linstallation. Lorsque la version ClawHub sélectionnée publie un artefact ClawPack, OpenClaw télécharge le `.tgz` npm-pack versionné, vérifie len-tête de digest ClawHub et le digest de lartefact, puis linstalle via le chemin darchive normal. Les anciennes versions ClawHub sans métadonnées ClawPack sinstallent encore via lancien chemin de vérification darchive de paquet. Les installations enregistrées conservent leurs métadonnées de source ClawHub, le type dartefact, lintégrité npm, le shasum npm, le nom du tarball et les faits de digest ClawPack pour les mises à jour ultérieures.
Les installations ClawHub sans version conservent une spec enregistrée sans version afin que `openclaw plugins update` puisse suivre les nouvelles versions ClawHub ; les sélecteurs explicites de version ou de balise comme `clawhub:pkg@1.2.3` et `clawhub:pkg@beta` restent épinglés à ce sélecteur.
OpenClaw vérifie la compatibilité annoncée de lAPI de plugin / Gateway minimal avant linstallation. Lorsque la version ClawHub sélectionnée publie un artefact ClawPack, OpenClaw télécharge le `.tgz` versionné du npm-pack, vérifie len-tête de condensat ClawHub et le condensat de lartefact, puis linstalle via le chemin darchive normal. Les anciennes versions ClawHub sans métadonnées ClawPack sinstallent toujours via lancien chemin de vérification darchive de package. Les installations enregistrées conservent leurs métadonnées de source ClawHub, le type dartefact, lintégrité npm, le shasum npm, le nom du tarball et les informations de condensat ClawPack pour les mises à jour ultérieures.
Les installations ClawHub sans version conservent une spécification enregistrée sans version afin que `openclaw plugins update` puisse suivre les versions ClawHub plus récentes ; les sélecteurs explicites de version ou détiquette tels que `clawhub:pkg@1.2.3` et `clawhub:pkg@beta` restent épinglés à ce sélecteur.
#### Raccourci marketplace
@ -204,31 +194,31 @@ openclaw plugins install <plugin-name> --marketplace ./my-marketplace
```
<Tabs>
<Tab title="Sources de marketplace">
- un nom de marketplace Claude connu issu de `~/.claude/plugins/known_marketplaces.json`
- une racine de marketplace locale ou un chemin `marketplace.json`
- un raccourci de dépôt GitHub comme `owner/repo`
- une URL de dépôt GitHub comme `https://github.com/owner/repo`
<Tab title="Sources de place de marché">
- un nom de place de marché Claude connu depuis `~/.claude/plugins/known_marketplaces.json`
- une racine de place de marché locale ou un chemin `marketplace.json`
- un raccourci de dépôt GitHub tel que `owner/repo`
- une URL de dépôt GitHub telle que `https://github.com/owner/repo`
- une URL git
</Tab>
<Tab title="Règles de marketplace distant">
Pour les marketplaces distants chargés depuis GitHub ou git, les entrées de plugins doivent rester dans le dépôt de marketplace cloné. OpenClaw accepte les sources par chemin relatif depuis ce dépôt et rejette les sources de plugins HTTP(S), à chemin absolu, git, GitHub et autres sources non basées sur des chemins provenant de manifestes distants.
<Tab title="Règles des places de marché distantes">
Pour les places de marché distantes chargées depuis GitHub ou git, les entrées de plugin doivent rester dans le dépôt de place de marché cloné. OpenClaw accepte les sources avec chemin relatif depuis ce dépôt et rejette les sources de plugin HTTP(S), avec chemin absolu, git, GitHub et autres sources de plugin qui ne sont pas des chemins depuis les manifestes distants.
</Tab>
</Tabs>
Pour les chemins locaux et les archives, OpenClaw détecte automatiquement :
- les plugins OpenClaw natifs (`openclaw.plugin.json`)
- les bundles compatibles Codex (`.codex-plugin/plugin.json`)
- les bundles compatibles Claude (`.claude-plugin/plugin.json` ou la disposition de composants Claude par défaut)
- les bundles compatibles Cursor (`.cursor-plugin/plugin.json`)
- les bundles compatibles avec Codex (`.codex-plugin/plugin.json`)
- les bundles compatibles avec Claude (`.claude-plugin/plugin.json` ou la disposition de composants Claude par défaut)
- les bundles compatibles avec Cursor (`.cursor-plugin/plugin.json`)
<Note>
Les bundles compatibles sinstallent dans la racine normale des plugins et participent au même flux list/info/enable/disable. Aujourdhui, les Skills de bundle, les command-skills Claude, les valeurs par défaut Claude de `settings.json`, les valeurs par défaut Claude de `.lsp.json` / `lspServers` déclarées par le manifeste, les command-skills Cursor et les répertoires de hooks compatibles Codex sont pris en charge ; les autres capacités de bundle détectées sont affichées dans les diagnostics/info mais ne sont pas encore raccordées à lexécution runtime.
Les bundles compatibles sinstallent dans la racine normale des plugins et participent au même flux list/info/enable/disable. Aujourdhui, les skills de bundle, les command-skills Claude, les valeurs par défaut Claude `settings.json`, les valeurs par défaut Claude `.lsp.json` / `lspServers` déclarées dans le manifeste, les command-skills Cursor et les répertoires de hooks Codex compatibles sont pris en charge ; les autres capacités de bundle détectées sont affichées dans les diagnostics/info, mais ne sont pas encore connectées à lexécution runtime.
</Note>
### Lister
### Liste
```bash
openclaw plugins list
@ -241,30 +231,41 @@ openclaw plugins search <query> --json
```
<ParamField path="--enabled" type="boolean">
Afficher uniquement les plugins activés.
Affiche uniquement les plugins activés.
</ParamField>
<ParamField path="--verbose" type="boolean">
Passer de la vue en tableau à des lignes de détail par plugin avec les métadonnées source/origine/version/activation.
Passe de la vue tableau à des lignes de détail par plugin avec les métadonnées de source/origine/version/activation.
</ParamField>
<ParamField path="--json" type="boolean">
Inventaire lisible par machine, avec diagnostics du registre et état dinstallation des dépendances de package.
Inventaire lisible par machine avec diagnostics du registre et état dinstallation des dépendances de package.
</ParamField>
<Note>
`plugins list` lit dabord le registre local persistant des plugins, avec un repli dérivé uniquement du manifeste lorsque le registre est manquant ou invalide. Il est utile pour vérifier si un plugin est installé, activé et visible pour la planification du démarrage à froid, mais ce nest pas une sonde runtime live dun processus Gateway déjà en cours dexécution. Après avoir modifié le code dun plugin, son activation, la politique des hooks ou `plugins.load.paths`, redémarrez le Gateway qui sert le canal avant dattendre lexécution du nouveau code `register(api)` ou des hooks. Pour les déploiements distants/conteneurisés, vérifiez que vous redémarrez bien lenfant `openclaw gateway run` réel, et pas seulement un processus wrapper.
`plugins list` lit dabord le registre de plugins local persistant, avec un repli dérivé uniquement du manifeste lorsque le registre est manquant ou invalide. Cette commande est utile pour vérifier si un plugin est installé, activé et visible par la planification du démarrage à froid, mais ce nest pas une sonde runtime en direct dun processus Gateway déjà en cours dexécution. Après avoir modifié le code dun plugin, son activation, la politique de hooks ou `plugins.load.paths`, redémarrez le Gateway qui sert le canal avant de vous attendre à ce que le nouveau code `register(api)` ou les hooks sexécutent. Pour les déploiements distants/conteneurisés, vérifiez que vous redémarrez bien lenfant `openclaw gateway run` réel, et pas seulement un processus wrapper.
`plugins list --json` inclut le `dependencyStatus` de chaque plugin depuis les `dependencies` et `optionalDependencies` de `package.json`. OpenClaw vérifie si ces noms de packages sont présents le long du chemin de recherche Node `node_modules` normal du plugin ; il nimporte pas le code runtime du plugin, nexécute pas de gestionnaire de packages et ne répare pas les dépendances manquantes.
`plugins list --json` inclut le `dependencyStatus` de chaque plugin depuis les
`dependencies` et `optionalDependencies` de `package.json`. OpenClaw vérifie si ces noms de package
sont présents le long du chemin de recherche Node `node_modules` normal du plugin ; il
nimporte pas le code runtime du plugin, nexécute pas de gestionnaire de packages et ne répare pas les
dépendances manquantes.
</Note>
`plugins search` est une recherche dans le catalogue distant ClawHub. Elle ninspecte pas létat local, ne modifie pas la configuration, ninstalle pas de packages et ne charge pas le code runtime des plugins. Les résultats de recherche incluent le nom de package ClawHub, la famille, le canal, la version, le résumé et une indication dinstallation comme `openclaw plugins install clawhub:<package>`.
`plugins search` est une recherche distante dans le catalogue ClawHub. Cette commande ninspecte pas létat
local, ne modifie pas la configuration, ninstalle pas de packages et ne charge pas le code runtime du plugin. Les
résultats de recherche incluent le nom du package ClawHub, la famille, le canal, la version, le résumé et
une indication dinstallation telle que `openclaw plugins install clawhub:<package>`.
Pour travailler sur un plugin groupé dans une image Docker packagée, montez par bind mount le répertoire source du plugin par-dessus le chemin source packagé correspondant, comme `/app/extensions/synology-chat`. OpenClaw découvrira cette superposition de source montée avant `/app/dist/extensions/synology-chat` ; un simple répertoire source copié reste inerte, de sorte que les installations packagées normales utilisent toujours le dist compilé.
Pour travailler sur un plugin groupé dans une image Docker packagée, montez en bind le répertoire source
du plugin par-dessus le chemin source packagé correspondant, par exemple
`/app/extensions/synology-chat`. OpenClaw découvrira cette surcouche source montée
avant `/app/dist/extensions/synology-chat` ; un répertoire source simplement copié
reste inerte afin que les installations packagées normales utilisent toujours le dist compilé.
Pour déboguer les hooks runtime :
Pour le débogage des hooks runtime :
- `openclaw plugins inspect <id> --runtime --json` affiche les hooks enregistrés et les diagnostics issus dune passe dinspection avec chargement de module. Linspection runtime ninstalle jamais de dépendances ; utilisez `openclaw doctor --fix` pour nettoyer létat des dépendances héritées ou installer les plugins téléchargeables configurés manquants.
- `openclaw gateway status --deep --require-rpc` confirme le Gateway joignable, les indications de service/processus, le chemin de configuration et létat de santé RPC.
- Les hooks de conversation non groupés (`llm_input`, `llm_output`, `before_agent_finalize`, `agent_end`) exigent `plugins.entries.<id>.hooks.allowConversationAccess=true`.
- `openclaw plugins inspect <id> --runtime --json` affiche les hooks enregistrés et les diagnostics issus dune passe dinspection avec module chargé. Linspection runtime ninstalle jamais de dépendances ; utilisez `openclaw doctor --fix` pour nettoyer létat des dépendances héritées ou installer les plugins téléchargeables configurés manquants.
- `openclaw gateway status --deep --require-rpc` confirme le Gateway joignable, les indications de service/processus, le chemin de configuration et létat RPC.
- Les hooks de conversation non groupés (`llm_input`, `llm_output`, `before_agent_finalize`, `agent_end`) nécessitent `plugins.entries.<id>.hooks.allowConversationAccess=true`.
Utilisez `--link` pour éviter de copier un répertoire local (ajoute à `plugins.load.paths`) :
@ -278,13 +279,13 @@ openclaw plugins install -l ./my-plugin
Utilisez `--pin` sur les installations npm pour enregistrer la spécification exacte résolue (`name@version`) dans lindex des plugins gérés, tout en conservant le comportement par défaut non épinglé.
</Note>
### Index des plugins
### Index des Plugins
Les métadonnées dinstallation des Plugins sont un état géré par la machine, pas une configuration utilisateur. Les installations et mises à jour les écrivent dans `plugins/installs.json` sous le répertoire détat OpenClaw actif. Sa carte de premier niveau `installRecords` est la source durable des métadonnées dinstallation, y compris les enregistrements pour les manifestes de plugins cassés ou manquants. Le tableau `plugins` est le cache de registre à froid dérivé du manifeste. Le fichier inclut un avertissement de ne pas le modifier et est utilisé par `openclaw plugins update`, la désinstallation, les diagnostics et le registre à froid des plugins.
Les métadonnées dinstallation de Plugin sont un état géré par machine, pas une configuration utilisateur. Les installations et mises à jour les écrivent dans `plugins/installs.json` sous le répertoire détat OpenClaw actif. Sa carte de premier niveau `installRecords` est la source durable des métadonnées dinstallation, y compris les enregistrements pour les manifestes de plugin cassés ou manquants. Le tableau `plugins` est le cache de registre à froid dérivé du manifeste. Le fichier inclut un avertissement de ne pas modifier et est utilisé par `openclaw plugins update`, la désinstallation, les diagnostics et le registre de plugins à froid.
Quand OpenClaw voit dans la configuration des enregistrements hérités livrés `plugins.installs`, il les déplace vers lindex des plugins et supprime la clé de configuration ; si lune des écritures échoue, les enregistrements de configuration sont conservés afin que les métadonnées dinstallation ne soient pas perdues.
Quand OpenClaw voit des enregistrements hérités livrés `plugins.installs` dans la configuration, il les déplace dans lindex des plugins et supprime la clé de configuration ; si lune des écritures échoue, les enregistrements de configuration sont conservés afin que les métadonnées dinstallation ne soient pas perdues.
### Désinstaller
### Désinstallation
```bash
openclaw plugins uninstall <id>
@ -292,13 +293,13 @@ openclaw plugins uninstall <id> --dry-run
openclaw plugins uninstall <id> --keep-files
```
`uninstall` supprime les enregistrements de plugin de `plugins.entries`, de lindex persistant des plugins, des entrées de liste dautorisation/refus de plugins et, le cas échéant, des entrées liées de `plugins.load.paths`. Sauf si `--keep-files` est défini, la désinstallation supprime aussi le répertoire dinstallation géré suivi lorsquil se trouve dans la racine des extensions de plugins dOpenClaw. Pour les plugins Active Memory, lemplacement mémoire est réinitialisé à `memory-core`.
`uninstall` supprime les enregistrements de plugin de `plugins.entries`, de lindex de plugins persistant, des entrées de listes allow/deny de plugin et des entrées liées `plugins.load.paths` lorsque cela sapplique. Sauf si `--keep-files` est défini, la désinstallation supprime aussi le répertoire dinstallation géré suivi lorsquil se trouve dans la racine des extensions de plugins dOpenClaw. Pour les plugins de mémoire active, lemplacement mémoire est réinitialisé à `memory-core`.
<Note>
`--keep-config` est pris en charge comme alias déprécié de `--keep-files`.
`--keep-config` est pris en charge comme alias obsolète de `--keep-files`.
</Note>
### Mettre à jour
### Mise à jour
```bash
openclaw plugins update <id-or-npm-spec>
@ -316,25 +317,25 @@ Les mises à jour sappliquent aux installations de plugins suivies dans li
Pour les installations npm, vous pouvez aussi passer une spécification de package npm explicite avec un dist-tag ou une version exacte. OpenClaw résout ce nom de package vers lenregistrement de plugin suivi, met à jour ce plugin installé et enregistre la nouvelle spécification npm pour les futures mises à jour basées sur lidentifiant.
Passer le nom du package npm sans version ni tag résout également vers lenregistrement de plugin suivi. Utilisez cela lorsquun plugin était épinglé à une version exacte et que vous voulez le ramener vers la ligne de publication par défaut du registre.
Passer le nom du package npm sans version ni tag se résout aussi vers lenregistrement de plugin suivi. Utilisez cette option lorsquun plugin était épinglé à une version exacte et que vous voulez le ramener vers la ligne de publication par défaut du registre.
</Accordion>
<Accordion title="Mises à jour du canal bêta">
`openclaw plugins update` réutilise la spécification de plugin suivie sauf si vous passez une nouvelle spécification. `openclaw update` connaît en plus le canal de mise à jour OpenClaw actif : sur le canal bêta, les enregistrements de plugins npm et ClawHub sur la ligne par défaut essaient dabord `@beta`, puis se rabattent sur la spécification default/latest enregistrée si aucune publication bêta du plugin nexiste. Les versions exactes et tags explicites restent épinglés à ce sélecteur.
`openclaw plugins update` réutilise la spécification de plugin suivie sauf si vous passez une nouvelle spécification. `openclaw update` connaît en plus le canal de mise à jour OpenClaw actif : sur le canal bêta, les enregistrements de plugins npm et ClawHub sur la ligne par défaut essaient dabord `@beta`, puis se replient sur la spécification default/latest enregistrée si aucune publication bêta de plugin nexiste. Les versions exactes et les tags explicites restent épinglés à ce sélecteur.
</Accordion>
<Accordion title="Contrôles de version et dérive dintégrité">
Avant une mise à jour npm live, OpenClaw vérifie la version du package installé par rapport aux métadonnées du registre npm. Si la version installée et lidentité dartefact enregistrée correspondent déjà à la cible résolue, la mise à jour est ignorée sans téléchargement, réinstallation ni réécriture de `openclaw.json`.
<Accordion title="Vérifications de version et dérive dintégrité">
Avant une mise à jour npm en direct, OpenClaw vérifie la version du package installé par rapport aux métadonnées du registre npm. Si la version installée et lidentité dartefact enregistrée correspondent déjà à la cible résolue, la mise à jour est ignorée sans téléchargement, réinstallation ni réécriture de `openclaw.json`.
Lorsquun hash dintégrité stocké existe et que le hash de lartefact récupéré change, OpenClaw traite cela comme une dérive dartefact npm. La commande interactive `openclaw plugins update` affiche les hash attendus et réels, puis demande confirmation avant de poursuivre. Les assistants de mise à jour non interactifs échouent en mode fermé sauf si lappelant fournit une politique de continuation explicite.
Lorsquun hachage dintégrité stocké existe et que le hachage de lartefact récupéré change, OpenClaw traite cela comme une dérive dartefact npm. La commande interactive `openclaw plugins update` affiche les hachages attendu et réel et demande confirmation avant de continuer. Les assistants de mise à jour non interactifs échouent fermés sauf si lappelant fournit une politique de continuation explicite.
</Accordion>
<Accordion title="--dangerously-force-unsafe-install lors de la mise à jour">
`--dangerously-force-unsafe-install` est aussi disponible sur `plugins update` comme dérogation de dernier recours pour les faux positifs de lanalyse intégrée de code dangereux pendant les mises à jour de plugins. Il ne contourne toujours pas les blocages de politique `before_install` des plugins ni le blocage en cas déchec de lanalyse, et il ne sapplique quaux mises à jour de plugins, pas aux mises à jour de packs de hooks.
`--dangerously-force-unsafe-install` est aussi disponible sur `plugins update` comme dérogation de dernier recours pour les faux positifs de lanalyse de code dangereux intégrée pendant les mises à jour de plugins. Cette option ne contourne toujours pas les blocages de politique `before_install` du plugin ni le blocage sur échec danalyse, et elle ne sapplique quaux mises à jour de plugins, pas aux mises à jour de packs de hooks.
</Accordion>
</AccordionGroup>
### Inspecter
### Inspection
```bash
openclaw plugins inspect <id>
@ -342,21 +343,21 @@ openclaw plugins inspect <id> --runtime
openclaw plugins inspect <id> --json
```
Inspecter affiche lidentité, létat de chargement, la source, les capacités du manifeste, les indicateurs de politique, les diagnostics, les métadonnées dinstallation, les capacités de bundle et toute prise en charge détectée de serveurs MCP ou LSP, sans importer par défaut le runtime du plugin. Ajoutez `--runtime` pour charger le module du plugin et inclure les hooks, outils, commandes, services, méthodes Gateway et routes HTTP enregistrés. Linspection runtime signale directement les dépendances de plugin manquantes ; les installations et réparations restent dans `openclaw plugins install`, `openclaw plugins update` et `openclaw doctor --fix`.
Inspect affiche lidentité, létat de chargement, la source, les capacités du manifeste, les indicateurs de politique, les diagnostics, les métadonnées dinstallation, les capacités de bundle et toute prise en charge détectée de serveur MCP ou LSP sans importer le runtime du plugin par défaut. Ajoutez `--runtime` pour charger le module du plugin et inclure les hooks, outils, commandes, services, méthodes Gateway et routes HTTP enregistrés. Linspection runtime signale directement les dépendances de plugin manquantes ; les installations et réparations restent dans `openclaw plugins install`, `openclaw plugins update` et `openclaw doctor --fix`.
Les commandes CLI détenues par un plugin sont installées comme groupes de commandes racine `openclaw`. Après que `inspect --runtime` affiche une commande sous `cliCommands`, exécutez-la comme `openclaw <command> ...` ; par exemple, un plugin qui enregistre `demo-git` peut être vérifié avec `openclaw demo-git ping`.
Les commandes CLI détenues par des plugins sont installées comme groupes de commandes racine `openclaw`. Après que `inspect --runtime` affiche une commande sous `cliCommands`, exécutez-la sous la forme `openclaw <command> ...` ; par exemple, un plugin qui enregistre `demo-git` peut être vérifié avec `openclaw demo-git ping`.
Chaque plugin est classé selon ce quil enregistre réellement au runtime :
- **plain-capability** — un type de capacité (par exemple, un plugin uniquement fournisseur)
- **hybrid-capability** — plusieurs types de capacités (par exemple, texte + parole + images)
- **hook-only** — uniquement des hooks, sans capacités ni surfaces
- **plain-capability** — un type de capacité (p. ex. un plugin seulement provider)
- **hybrid-capability** — plusieurs types de capacités (p. ex. texte + parole + images)
- **hook-only** — uniquement des hooks, aucune capacité ni surface
- **non-capability** — outils/commandes/services mais aucune capacité
Consultez [Formes de plugins](/fr/plugins/architecture#plugin-shapes) pour en savoir plus sur le modèle de capacités.
Consultez [Formes de Plugin](/fr/plugins/architecture#plugin-shapes) pour en savoir plus sur le modèle de capacités.
<Note>
Loption `--json` produit un rapport lisible par machine adapté aux scripts et aux audits. `inspect --all` affiche un tableau pour tout le parc avec des colonnes de forme, types de capacités, avis de compatibilité, capacités de bundle et résumé des hooks. `info` est un alias de `inspect`.
Lindicateur `--json` génère un rapport lisible par machine adapté aux scripts et aux audits. `inspect --all` affiche un tableau couvrant toute la flotte avec des colonnes pour la forme, les types de capacités, les avis de compatibilité, les capacités de bundle et le résumé des hooks. `info` est un alias de `inspect`.
</Note>
### Doctor
@ -365,11 +366,11 @@ Loption `--json` produit un rapport lisible par machine adapté aux scripts e
openclaw plugins doctor
```
`doctor` signale les erreurs de chargement de plugins, les diagnostics de manifeste/découverte et les avis de compatibilité. Lorsque tout est propre, il affiche `No plugin issues detected.`
`doctor` signale les erreurs de chargement de plugin, les diagnostics de manifeste/découverte et les avis de compatibilité. Lorsque tout est propre, il affiche `No plugin issues detected.`
Si un plugin configuré est présent sur le disque mais bloqué par les contrôles de sécurité des chemins du chargeur, la validation de configuration conserve lentrée du plugin et la signale comme `present but blocked`. Corrigez le diagnostic de plugin bloqué précédent, comme la propriété du chemin ou des permissions world-writable, au lieu de supprimer la configuration `plugins.entries.<id>` ou `plugins.allow`.
Si un plugin configuré est présent sur disque mais bloqué par les vérifications de sécurité de chemin du chargeur, la validation de configuration conserve lentrée du plugin et la signale comme `present but blocked`. Corrigez le diagnostic de plugin bloqué précédent, par exemple la propriété du chemin ou les permissions world-writable, au lieu de supprimer la configuration `plugins.entries.<id>` ou `plugins.allow`.
Pour les échecs de forme de module, comme des exports `register`/`activate` manquants, relancez avec `OPENCLAW_PLUGIN_LOAD_DEBUG=1` pour inclure un résumé compact de la forme des exports dans la sortie de diagnostic.
Pour les échecs de forme de module comme des exports `register`/`activate` manquants, relancez avec `OPENCLAW_PLUGIN_LOAD_DEBUG=1` pour inclure un résumé compact de la forme des exports dans la sortie de diagnostic.
### Registre
@ -379,12 +380,12 @@ openclaw plugins registry --refresh
openclaw plugins registry --json
```
Le registre local des plugins est le modèle de lecture à froid persistant dOpenClaw pour lidentité des plugins installés, leur activation, les métadonnées de source et la propriété des contributions. Le démarrage normal, la recherche de propriétaire fournisseur, la classification de configuration des canaux et linventaire des plugins peuvent le lire sans importer les modules runtime des plugins.
Le registre de plugins local est le modèle de lecture à froid persistant dOpenClaw pour lidentité des plugins installés, leur activation, les métadonnées de source et la propriété des contributions. Le démarrage normal, la recherche du propriétaire du provider, la classification de configuration de canal et linventaire des plugins peuvent le lire sans importer les modules runtime des plugins.
Utilisez `plugins registry` pour vérifier si le registre persistant est présent, à jour ou obsolète. Utilisez `--refresh` pour le reconstruire à partir de lindex de plugins persistant, de la stratégie de configuration et des métadonnées de manifeste/package. Il sagit dun chemin de réparation, pas dun chemin dactivation à lexécution.
Utilisez `plugins registry` pour vérifier si le registre persistant est présent, à jour ou obsolète. Utilisez `--refresh` pour le reconstruire à partir de lindex persistant des plugins, de la politique de configuration et des métadonnées de manifeste/package. Cest un chemin de réparation, pas un chemin dactivation à lexécution.
<Warning>
`OPENCLAW_DISABLE_PERSISTED_PLUGIN_REGISTRY=1` est un commutateur de compatibilité durgence obsolète pour les échecs de lecture du registre. Préférez `plugins registry --refresh` ou `openclaw doctor --fix` ; le repli par variable denvironnement est réservé à la récupération durgence au démarrage pendant le déploiement de la migration.
`OPENCLAW_DISABLE_PERSISTED_PLUGIN_REGISTRY=1` est un interrupteur de compatibilité durgence obsolète pour les échecs de lecture du registre. Préférez `plugins registry --refresh` ou `openclaw doctor --fix` ; le repli par variable denvironnement est réservé à la récupération durgence au démarrage pendant le déploiement de la migration.
</Warning>
### Place de marché
@ -394,10 +395,10 @@ openclaw plugins marketplace list <source>
openclaw plugins marketplace list <source> --json
```
La liste de la place de marché accepte un chemin local de place de marché, un chemin `marketplace.json`, une abréviation GitHub comme `owner/repo`, une URL de dépôt GitHub ou une URL git. `--json` affiche le libellé de source résolu, ainsi que le manifeste de place de marché analysé et les entrées de plugins.
La liste de la place de marché accepte un chemin local de place de marché, un chemin `marketplace.json`, un raccourci GitHub comme `owner/repo`, une URL de dépôt GitHub ou une URL git. `--json` affiche le libellé de source résolu ainsi que le manifeste de place de marché analysé et les entrées de plugins.
## Associé
## Connexe
- [Création de plugins](/fr/plugins/building-plugins)
- [Référence CLI](/fr/cli)
- [Plugins communautaires](/fr/plugins/community)
- [Créer des plugins](/fr/plugins/building-plugins)
- [Référence de la CLI](/fr/cli)
- [Plugins de la communauté](/fr/plugins/community)

View File

@ -1,27 +1,27 @@
---
read_when:
- Vous devez valider le routage du proxy géré par lopérateur avant le déploiement
- Vous devez capturer le trafic de transport OpenClaw localement pour le débogage
- Vous voulez inspecter des sessions de proxy de débogage, des blobs ou des préréglages de requêtes intégrés
- Vous devez capturer localement le trafic de transport dOpenClaw à des fins de débogage
- Vous souhaitez inspecter des sessions de proxy de débogage, des objets binaires ou des préréglages de requêtes intégrés
summary: Référence CLI pour `openclaw proxy`, incluant la validation du proxy géré par lopérateur et linspecteur de capture du proxy de débogage local
title: Proxy
x-i18n:
generated_at: "2026-05-01T07:13:18Z"
generated_at: "2026-05-04T07:03:06Z"
model: gpt-5.5
provider: openai
source_hash: e0820de861bfe1ec14e0c1624d636d6474b5fedd317e3ba1baaa61f6530e06e9
source_hash: 9589bedafb97c31bcb6536a04307cd0c6550e1f307693bd4401785d79f34a1eb
source_path: cli/proxy.md
workflow: 16
---
# `openclaw proxy`
Validez le routage proxy géré par lopérateur, ou exécutez le proxy de débogage explicite local
et inspectez le trafic capturé.
Valider le routage proxy géré par l'opérateur, ou exécuter le proxy de débogage explicite local
et inspecter le trafic capturé.
Utilisez `validate` pour vérifier en amont un proxy de transfert géré par lopérateur avant dactiver
le routage proxy dOpenClaw. Les autres commandes sont des outils de débogage pour
linvestigation au niveau du transport : elles peuvent démarrer un proxy local, exécuter une commande enfant
Utilisez `validate` pour contrôler en amont un proxy direct géré par l'opérateur avant d'activer
le routage proxy d'OpenClaw. Les autres commandes sont des outils de débogage pour
l'investigation au niveau du transport : elles peuvent démarrer un proxy local, exécuter une commande enfant
avec la capture activée, lister les sessions de capture, interroger les modèles de trafic courants, lire
les blobs capturés et purger les données de capture locales.
@ -38,25 +38,26 @@ openclaw proxy blob --id <blobId>
openclaw proxy purge
```
## Validation
## Valider
`openclaw proxy validate` vérifie lURL effective du proxy géré par lopérateur à partir de
`--proxy-url`, de la configuration ou de `OPENCLAW_PROXY_URL`. Il signale un problème de configuration lorsque
aucun proxy nest activé et configuré ; utilisez `--proxy-url` pour une vérification ponctuelle
avant de modifier la configuration. Par défaut, il vérifie quune destination publique réussit
`openclaw proxy validate` vérifie l'URL effective du proxy géré par l'opérateur depuis
`--proxy-url`, la configuration ou `OPENCLAW_PROXY_URL`. Elle signale un problème de configuration lorsqu'
aucun proxy n'est activé et configuré ; utilisez `--proxy-url` pour un contrôle en amont ponctuel
avant de modifier la configuration. Par défaut, elle vérifie qu'une destination publique réussit
via le proxy et que le proxy ne peut pas atteindre un canari loopback temporaire.
Les destinations refusées personnalisées échouent en mode fermé : les réponses HTTP et les échecs de transport
ambigus échouent tous deux, sauf si vous pouvez vérifier séparément un signal de refus propre au déploiement.
Les destinations refusées personnalisées échouent fermées : les réponses HTTP et les échecs de
transport ambigus échouent tous deux, sauf si vous pouvez vérifier séparément un signal de refus
spécifique au déploiement.
Options :
- `--json` : afficher du JSON lisible par machine.
- `--proxy-url <url>` : valider cette URL de proxy au lieu de la configuration ou de lenvironnement.
- `--proxy-url <url>` : valider cette URL de proxy au lieu de la configuration ou de l'environnement.
- `--allowed-url <url>` : ajouter une destination censée réussir via le proxy. Répétez pour vérifier plusieurs destinations.
- `--denied-url <url>` : ajouter une destination censée être bloquée par le proxy. Répétez pour vérifier plusieurs destinations.
- `--timeout-ms <ms>` : délai dexpiration par requête en millisecondes.
- `--timeout-ms <ms>` : délai d'expiration par requête en millisecondes.
Consultez [Proxy réseau](/fr/security/network-proxy) pour les recommandations de déploiement et la sémantique
Consultez [Proxy réseau](/fr/security/network-proxy) pour les conseils de déploiement et la sémantique
de refus.
## Préréglages de requête
@ -70,15 +71,16 @@ de refus.
- `missing-ack`
- `error-bursts`
## Notes
## Remarques
- `start` utilise `127.0.0.1` par défaut, sauf si `--host` est défini.
- `run` démarre un proxy de débogage local, puis exécute la commande après `--`.
- `validate` quitte avec le code 1 lorsque la configuration du proxy ou les vérifications de destination échouent.
- Le transfert direct vers l'amont du proxy de débogage ouvre des sockets amont à des fins de diagnostic. Lorsque le mode proxy géré d'OpenClaw est actif, le transfert direct pour les requêtes proxy et les tunnels CONNECT est désactivé par défaut ; définissez `OPENCLAW_DEBUG_PROXY_ALLOW_DIRECT_CONNECT_WITH_MANAGED_PROXY=1` uniquement pour les diagnostics locaux approuvés.
- `validate` se termine avec le code 1 lorsque la configuration du proxy ou les vérifications de destination échouent.
- Les captures sont des données de débogage locales ; utilisez `openclaw proxy purge` lorsque vous avez terminé.
## Connexe
- [Référence CLI](/fr/cli)
- [Proxy réseau](/fr/security/network-proxy)
- [Authentification par proxy de confiance](/fr/gateway/trusted-proxy-auth)
- [Authentification de proxy approuvé](/fr/gateway/trusted-proxy-auth)

View File

@ -1,13 +1,13 @@
---
read_when:
- Vous voulez répertorier les sessions enregistrées et consulter lactivité récente
summary: Référence CLI pour `openclaw sessions` (lister les sessions enregistrées + utilisation)
- Vous souhaitez lister les sessions enregistrées et consulter lactivité récente
summary: Référence CLI pour `openclaw sessions` (lister les sessions stockées + utilisation)
title: Sessions
x-i18n:
generated_at: "2026-05-02T20:43:01Z"
generated_at: "2026-05-04T07:02:47Z"
model: gpt-5.5
provider: openai
source_hash: 5c9ec3ca55f7c5b6217b481e9da62f5416df73e69405a0dc15e77d2afeac723f
source_hash: 8dc90344f40c53513bd6db3696bc709279155f26e7c3b6ea27e81a07a2f9f15e
source_path: cli/sessions.md
workflow: 16
---
@ -16,7 +16,9 @@ x-i18n:
Liste les sessions de conversation stockées.
Les listes de sessions ne sont pas des vérifications de disponibilité de canal/fournisseur. Elles affichent les lignes de conversation persistées depuis les stockages de sessions. Un canal Discord, Slack, Telegram ou autre silencieux peut se reconnecter correctement sans créer de nouvelle ligne de session tant quun message nest pas traité. Utilisez `openclaw channels status --probe`, `openclaw status --deep` ou `openclaw health --verbose` lorsque vous avez besoin de la connectivité en direct des canaux.
Les listes de sessions ne sont pas des vérifications dactivité des canaux/fournisseurs. Elles affichent les lignes de conversation persistées depuis les magasins de sessions. Un canal Discord, Slack, Telegram ou autre silencieux peut se reconnecter correctement sans créer de nouvelle ligne de session tant quun message nest pas traité. Utilisez `openclaw channels status --probe`, `openclaw status --deep` ou `openclaw health --verbose` lorsque vous avez besoin de vérifier la connectivité en direct des canaux.
Les réponses Gateway `sessions.list` sont bornées par défaut afin que les grands magasins à longue durée de vie ne puissent pas monopoliser la boucle dévénements du Gateway. Passez une valeur `limit` positive explicite depuis les clients RPC lorsquune fenêtre de résultats différente est nécessaire ; les réponses incluent `totalCount`, `limitApplied` et `hasMore` lorsque les appelants doivent indiquer que dautres lignes existent.
```bash
openclaw sessions
@ -29,11 +31,11 @@ openclaw sessions --json
Sélection de la portée :
- par défaut : stockage de lagent par défaut configuré
- par défaut : magasin de lagent par défaut configuré
- `--verbose` : journalisation détaillée
- `--agent <id>` : un stockage dagent configuré
- `--all-agents` : agrège tous les stockages dagents configurés
- `--store <path>` : chemin de stockage explicite (ne peut pas être combiné avec `--agent` ou `--all-agents`)
- `--agent <id>` : un magasin dagent configuré
- `--all-agents` : agréger tous les magasins dagents configurés
- `--store <path>` : chemin explicite du magasin (ne peut pas être combiné avec `--agent` ou `--all-agents`)
Exporter un bundle de trajectoire pour une session stockée :
@ -42,9 +44,9 @@ openclaw sessions export-trajectory --session-key "agent:main:telegram:direct:12
openclaw sessions export-trajectory --session-key "agent:main:telegram:direct:123" --output bug-123 --json
```
Cest le chemin de commande utilisé par la commande slash `/export-trajectory` après lapprobation de la requête dexécution par le propriétaire. Le répertoire de sortie est toujours résolu dans `.openclaw/trajectory-exports/` sous lespace de travail sélectionné.
Il sagit du chemin de commande utilisé par la commande slash `/export-trajectory` après que le propriétaire a approuvé la demande dexécution. Le répertoire de sortie est toujours résolu dans `.openclaw/trajectory-exports/` sous lespace de travail sélectionné.
`openclaw sessions --all-agents` lit les stockages dagents configurés. La découverte des sessions Gateway et ACP est plus large : elle inclut aussi les stockages uniquement sur disque trouvés sous la racine `agents/` par défaut ou une racine `session.store` basée sur un modèle. Ces stockages découverts doivent se résoudre en fichiers `sessions.json` ordinaires à lintérieur de la racine de lagent ; les liens symboliques et les chemins hors racine sont ignorés.
`openclaw sessions --all-agents` lit les magasins dagents configurés. La découverte des sessions Gateway et ACP est plus large : elle inclut aussi les magasins présents uniquement sur disque trouvés sous la racine `agents/` par défaut ou une racine `session.store` modélisée. Ces magasins découverts doivent se résoudre en fichiers `sessions.json` ordinaires à lintérieur de la racine de lagent ; les liens symboliques et les chemins hors racine sont ignorés.
Exemples JSON :
@ -82,19 +84,19 @@ openclaw sessions cleanup --json
`openclaw sessions cleanup` utilise les paramètres `session.maintenance` de la configuration :
- Note sur la portée : `openclaw sessions cleanup` maintient les stockages de sessions, les transcriptions et les sidecars de trajectoire. Il ne purge pas les journaux dexécution Cron (`cron/runs/<jobId>.jsonl`), qui sont gérés par `cron.runLog.maxBytes` et `cron.runLog.keepLines` dans la [configuration Cron](/fr/automation/cron-jobs#configuration) et expliqués dans la [maintenance Cron](/fr/automation/cron-jobs#maintenance).
- Note sur la portée : `openclaw sessions cleanup` maintient les magasins de sessions, les transcriptions et les fichiers auxiliaires de trajectoire. Il ne purge pas les journaux dexécution Cron (`cron/runs/<jobId>.jsonl`), qui sont gérés par `cron.runLog.maxBytes` et `cron.runLog.keepLines` dans la [configuration Cron](/fr/automation/cron-jobs#configuration) et expliqués dans la [maintenance Cron](/fr/automation/cron-jobs#maintenance).
- `--dry-run` : prévisualise le nombre dentrées qui seraient purgées/limitées sans écrire.
- En mode texte, dry-run affiche un tableau dactions par session (`Action`, `Key`, `Age`, `Model`, `Flags`) afin que vous puissiez voir ce qui serait conservé ou supprimé.
- `--enforce` : applique la maintenance même lorsque `session.maintenance.mode` vaut `warn`.
- `--fix-missing` : supprime les entrées dont les fichiers de transcription sont manquants, même si elles ne seraient normalement pas encore retirées par âge/nombre.
- `--active-key <key>` : protège une clé active spécifique de léviction liée au budget disque. Les pointeurs de conversation externes durables, comme les sessions de groupe et les sessions de discussion limitées à un fil, sont aussi conservés par la maintenance dâge, de nombre et de budget disque.
- `--agent <id>` : exécute le nettoyage pour un stockage dagent configuré.
- `--all-agents` : exécute le nettoyage pour tous les stockages dagents configurés.
- `--store <path>` : sexécute sur un fichier `sessions.json` spécifique.
- `--json` : affiche un résumé JSON. Avec `--all-agents`, la sortie inclut un résumé par stockage.
- `--dry-run` : prévisualiser le nombre dentrées qui seraient purgées/plafonnées sans écrire.
- En mode texte, lexécution à blanc affiche un tableau dactions par session (`Action`, `Key`, `Age`, `Model`, `Flags`) afin que vous puissiez voir ce qui serait conservé ou supprimé.
- `--enforce` : appliquer la maintenance même lorsque `session.maintenance.mode` vaut `warn`.
- `--fix-missing` : supprimer les entrées dont les fichiers de transcription sont manquants, même si elles ne seraient normalement pas encore exclues par lâge/le nombre.
- `--active-key <key>` : protéger une clé active spécifique contre léviction liée au budget disque. Les pointeurs de conversation externes durables, comme les sessions de groupe et les sessions de discussion limitées à un fil, sont également conservés par la maintenance selon lâge, le nombre et le budget disque.
- `--agent <id>` : exécuter le nettoyage pour un magasin dagent configuré.
- `--all-agents` : exécuter le nettoyage pour tous les magasins dagents configurés.
- `--store <path>` : exécuter sur un fichier `sessions.json` spécifique.
- `--json` : afficher un résumé JSON. Avec `--all-agents`, la sortie inclut un résumé par magasin.
Lorsquun Gateway est joignable, le nettoyage sans dry-run pour les stockages dagents configurés est envoyé via le Gateway afin de partager le même writer de stockage de sessions que le trafic dexécution. Utilisez `--store <path>` pour la réparation hors ligne explicite dun fichier de stockage.
Lorsquun Gateway est joignable, le nettoyage hors exécution à blanc des magasins dagents configurés est envoyé via le Gateway afin de partager le même rédacteur de magasin de sessions que le trafic dexécution. Utilisez `--store <path>` pour la réparation hors ligne explicite dun fichier de magasin.
`openclaw sessions cleanup --all-agents --dry-run --json` :
@ -126,9 +128,9 @@ Lorsquun Gateway est joignable, le nettoyage sans dry-run pour les stockages
Connexe :
- Configuration des sessions : [Référence de configuration](/fr/gateway/config-agents#session)
- Configuration des sessions : [référence de configuration](/fr/gateway/config-agents#session)
## Connexe
- [Référence CLI](/fr/cli)
- [Gestion des sessions](/fr/concepts/session)
- [référence CLI](/fr/cli)
- [gestion des sessions](/fr/concepts/session)

View File

@ -1,58 +1,58 @@
---
read_when:
- Création ou exécution de lassurance qualité visuelle en direct pour les bogues OpenClaw
- Mettre en place ou exécuter un contrôle qualité visuel en direct pour les bogues OpenClaw
- Ajout dune vérification avant et après pour une demande de tirage
- Ajout de scénarios de transport en direct pour Discord, Slack, WhatsApp ou dautres
- Ajout de scénarios de transport en direct pour Discord, Slack, WhatsApp ou autres
- Débogage des exécutions QA nécessitant des captures décran, lautomatisation du navigateur ou un accès VNC
summary: Mantis est le système de vérification visuelle de bout en bout permettant de reproduire les bogues OpenClaw sur des transports en direct, de capturer des preuves avant et après, et de joindre des artefacts aux PR.
summary: Mantis est le système de vérification visuelle de bout en bout permettant de reproduire les bogues dOpenClaw sur des transports en direct, de capturer des preuves avant et après, et de joindre des artefacts aux PR.
title: Mante
x-i18n:
generated_at: "2026-05-04T02:23:18Z"
generated_at: "2026-05-04T07:03:09Z"
model: gpt-5.5
provider: openai
source_hash: 5a86ab4bc876d1c53ada1c30580034165f028194a072f559eb54a898a369211d
source_hash: 9d3f3fa3db111b1b5c85f8efeccd749fbd5885cee6b7843ca4c8d049acfd9164
source_path: concepts/mantis.md
workflow: 16
---
Mantis est le système de vérification de bout en bout dOpenClaw pour les bugs qui nécessitent un vrai runtime, un vrai transport et une preuve visible. Il exécute un scénario sur une référence connue comme défectueuse, capture les preuves, exécute le même scénario sur une référence candidate, puis publie la comparaison sous forme dartefacts quun mainteneur peut inspecter depuis une PR ou depuis une commande locale.
Mantis est le système de vérification de bout en bout dOpenClaw pour les bugs qui nécessitent un environnement dexécution réel, un transport réel et une preuve visible. Il exécute un scénario contre une ref connue comme défectueuse, capture les preuves, exécute le même scénario contre une ref candidate, puis publie la comparaison sous forme dartefacts quun mainteneur peut inspecter depuis une PR ou depuis une commande locale.
Mantis commence par Discord, car Discord nous offre une première voie à forte valeur ajoutée : authentification réelle du bot, vrais salons de guildes, réactions, fils de discussion, commandes natives et une interface navigateur où les humains peuvent confirmer visuellement ce que le transport a montré.
Mantis commence avec Discord parce que Discord nous donne une première voie à forte valeur : authentification de bot réelle, vrais salons de guilde, réactions, fils de discussion, commandes natives et une interface navigateur où les humains peuvent confirmer visuellement ce que le transport a montré.
## Objectifs
- Reproduire un bug issu dune issue ou PR GitHub avec la même forme de transport que celle vue par les utilisateurs.
- Capturer un artefact **avant** sur la référence de base avant dappliquer le correctif.
- Capturer un artefact **après** sur la référence candidate après avoir appliqué le correctif.
- Reproduire un bug depuis une issue ou une PR GitHub avec la même forme de transport que celle vue par les utilisateurs.
- Capturer un artefact **avant** sur la ref de référence avant dappliquer le correctif.
- Capturer un artefact **après** sur la ref candidate après avoir appliqué le correctif.
- Utiliser un oracle déterministe chaque fois que possible, comme une lecture de réaction via lAPI REST Discord ou une vérification de transcription de salon.
- Capturer des captures décran lorsque le bug possède une surface dinterface visible.
- Exécuter localement depuis une CLI contrôlée par agent et à distance depuis GitHub.
- Préserver assez détat machine pour un secours VNC lorsque la connexion, lautomatisation du navigateur ou lauthentification du fournisseur se bloque.
- Sexécuter localement depuis une CLI contrôlée par un agent et à distance depuis GitHub.
- Préserver suffisamment détat machine pour un secours VNC lorsque la connexion, lautomatisation du navigateur ou lauthentification du fournisseur se bloque.
- Publier un statut concis dans un salon Discord opérateur lorsque lexécution est bloquée, nécessite une aide VNC manuelle ou se termine.
## Non-objectifs
- Mantis ne remplace pas les tests unitaires. Une exécution Mantis devrait généralement devenir un test de régression plus petit une fois le correctif compris.
- Mantis nest pas la porte CI rapide normale. Il est plus lent, utilise des identifiants réels et est réservé aux bugs pour lesquels lenvironnement réel compte.
- Mantis ne devrait pas nécessiter dhumain en fonctionnement normal. Le VNC manuel est un chemin de secours, pas le chemin nominal.
- Mantis nest pas le portail CI rapide normal. Il est plus lent, utilise des identifiants réels et est réservé aux bugs où lenvironnement réel compte.
- Mantis ne devrait pas nécessiter dhumain en fonctionnement normal. Le VNC manuel est une voie de secours, pas le chemin nominal.
- Mantis ne stocke pas de secrets bruts dans les artefacts, journaux, captures décran, rapports Markdown ou commentaires de PR.
## Propriété
Mantis vit dans la stack QA dOpenClaw.
Mantis vit dans la pile QA dOpenClaw.
- OpenClaw possède le runtime de scénario, les adaptateurs de transport, le schéma de preuves et la CLI locale sous `pnpm openclaw qa mantis`.
- OpenClaw possède lenvironnement dexécution des scénarios, les adaptateurs de transport, le schéma de preuves et la CLI locale sous `pnpm openclaw qa mantis`.
- QA Lab possède les éléments du harnais de transport réel, les assistants de capture navigateur et les rédacteurs dartefacts.
- Crabbox possède les machines Linux préchauffées lorsquune VM distante est nécessaire.
- GitHub Actions possède le point dentrée du workflow distant et la conservation des artefacts.
- ClawSweeper possède le routage des commentaires GitHub : analyse des commandes de mainteneur, déclenchement du workflow et publication du commentaire PR final.
- GitHub Actions possède le point dentrée du workflow distant et la rétention des artefacts.
- ClawSweeper possède le routage des commentaires GitHub : analyse des commandes mainteneur, déclenchement du workflow et publication du commentaire final sur la PR.
- Les agents OpenClaw pilotent Mantis via Codex lorsquun scénario nécessite une configuration agentique, du débogage ou un signalement détat bloqué.
Cette frontière garde la connaissance du transport dans OpenClaw, la planification des machines dans Crabbox et la colle de workflow mainteneur dans ClawSweeper.
Cette limite garde la connaissance du transport dans OpenClaw, la planification des machines dans Crabbox et la colle du workflow mainteneur dans ClawSweeper.
## Forme des commandes
## Forme de commande
La première commande locale vérifie le bot Discord, la guilde, le salon, lenvoi de message, lenvoi de réaction et le chemin des artefacts :
La première commande locale vérifie le bot Discord, la guilde, le salon, lenvoi de message, lenvoi de réaction et le chemin dartefact :
```bash
pnpm openclaw qa mantis discord-smoke \
@ -70,7 +70,7 @@ pnpm openclaw qa mantis run \
--output-dir .artifacts/qa-e2e/mantis/local-discord-status-reactions
```
Lexécuteur crée des worktrees de base et candidats détachés sous le répertoire de sortie, installe les dépendances, construit chaque référence, exécute le scénario avec `--allow-failures`, puis écrit `baseline/`, `candidate/`, `comparison.json` et `mantis-report.md`. Pour le premier scénario Discord, une vérification réussie signifie que le statut de base est `fail` et que le statut candidat est `pass`.
Lexécuteur crée des worktrees détachés de référence et candidats sous le répertoire de sortie, installe les dépendances, construit chaque ref, exécute le scénario avec `--allow-failures`, puis écrit `baseline/`, `candidate/`, `comparison.json` et `mantis-report.md`. Pour le premier scénario Discord, une vérification réussie signifie que le statut de référence est `fail` et que le statut candidat est `pass`.
La première primitive VM/navigateur est le smoke desktop :
@ -79,30 +79,62 @@ pnpm openclaw qa mantis desktop-browser-smoke \
--output-dir .artifacts/qa-e2e/mantis/desktop-browser
```
Elle loue ou réutilise une machine desktop Crabbox, démarre un navigateur visible dans la session VNC, capture le bureau, rapatrie les artefacts vers le répertoire de sortie local et écrit la commande de reconnexion dans le rapport. La commande utilise par défaut le fournisseur Hetzner parce quil est le premier fournisseur avec une couverture desktop/VNC fonctionnelle dans la voie Mantis. Remplacez-le avec `--provider`, `--crabbox-bin` ou `OPENCLAW_MANTIS_CRABBOX_PROVIDER` lors dune exécution sur une autre flotte Crabbox.
Elle loue ou réutilise une machine desktop Crabbox, démarre un navigateur visible dans la session VNC, capture le desktop, rapatrie les artefacts dans le répertoire de sortie local et écrit la commande de reconnexion dans le rapport. La commande utilise par défaut le fournisseur Hetzner parce quil est le premier fournisseur avec une couverture desktop/VNC fonctionnelle dans la voie Mantis. Remplacez-le avec `--provider`, `--crabbox-bin` ou `OPENCLAW_MANTIS_CRABBOX_PROVIDER` lors de lexécution contre une autre flotte Crabbox.
Indicateurs utiles pour le smoke desktop :
Options utiles du smoke desktop :
- `--lease-id <cbx_...>` ou `OPENCLAW_MANTIS_CRABBOX_LEASE_ID` réutilise un desktop préchauffé.
- `--browser-url <url>` change la page ouverte dans le navigateur visible.
- `--html-file <path>` affiche un artefact HTML local au dépôt dans le navigateur visible. Mantis lutilise pour capturer la chronologie générée des réactions de statut Discord via un vrai desktop Crabbox.
- `--keep-lease` ou `OPENCLAW_MANTIS_KEEP_VM=1` garde ouverte une location nouvellement créée et réussie pour inspection VNC. Les exécutions échouées gardent la location par défaut lorsquune location a été créée afin quun opérateur puisse se reconnecter.
- `--class`, `--idle-timeout` et `--ttl` règlent la taille de la machine et la durée de vie de la location.
- `--html-file <path>` rend un artefact HTML local au dépôt dans le navigateur visible. Mantis lutilise pour capturer la chronologie générée des réactions de statut Discord via un vrai desktop Crabbox.
- `--keep-lease` ou `OPENCLAW_MANTIS_KEEP_VM=1` garde ouverte une location nouvellement créée et réussie pour inspection VNC. Les exécutions échouées gardent la location par défaut lorsquelle a été créée afin quun opérateur puisse se reconnecter.
- `--class`, `--idle-timeout` et `--ttl` ajustent la taille de machine et la durée de vie de la location.
Le workflow smoke GitHub est `Mantis Discord Smoke`. Le workflow GitHub avant et après pour le premier vrai scénario est `Mantis Discord Status Reactions`. Il accepte :
La première primitive complète de transport desktop est le smoke desktop Slack :
- `baseline_ref` : la référence censée reproduire le comportement file dattente uniquement.
- `candidate_ref` : la référence censée montrer `queued -> thinking -> done`.
```bash
pnpm openclaw qa mantis slack-desktop-smoke \
--output-dir .artifacts/qa-e2e/mantis/slack-desktop \
--gateway-setup \
--scenario slack-canary \
--keep-lease
```
Il récupère la référence du harnais de workflow, construit des worktrees de base et candidats séparés, exécute `discord-status-reactions-tool-only` sur chaque worktree et téléverse `baseline/`, `candidate/`, `comparison.json` et `mantis-report.md` comme artefacts Actions. Il rend aussi le HTML de chronologie de chaque voie dans un navigateur desktop Crabbox et publie ces captures décran VNC à côté des PNG de chronologie déterministes dans le commentaire PR. Le workflow construit la CLI Crabbox depuis `openclaw/crabbox` main afin de pouvoir utiliser les indicateurs de location desktop/navigateur actuels avant la prochaine publication du binaire Crabbox.
Elle loue ou réutilise une machine desktop Crabbox, synchronise le checkout courant dans la VM, exécute `pnpm openclaw qa slack` dans cette VM, ouvre Slack Web dans le navigateur VNC, capture le desktop visible et recopie à la fois les artefacts QA Slack et la capture décran VNC dans le répertoire de sortie local. Cest la première forme Mantis où le Gateway OpenClaw SUT et le navigateur vivent tous deux dans la même VM desktop Linux.
Vous pouvez aussi déclencher directement lexécution status-reactions depuis un commentaire de PR :
Avec `--gateway-setup`, la commande prépare un home OpenClaw jetable persistant dans `$HOME/.openclaw-mantis/slack-openclaw`, corrige la configuration Slack Socket Mode pour le salon sélectionné, démarre `openclaw gateway run` sur le port `38973` et garde Chrome en cours dexécution dans la session VNC. Cest le mode « laisse-moi un desktop Linux avec Slack et un claw en cours dexécution » ; la voie QA Slack bot-à-bot reste la valeur par défaut lorsque `--gateway-setup` est omis.
Entrées requises pour `--credential-source env` :
- `OPENCLAW_QA_SLACK_CHANNEL_ID`
- `OPENCLAW_QA_SLACK_DRIVER_BOT_TOKEN`
- `OPENCLAW_QA_SLACK_SUT_BOT_TOKEN`
- `OPENCLAW_QA_SLACK_SUT_APP_TOKEN`
- `OPENCLAW_LIVE_OPENAI_KEY` pour la voie modèle distante. Si seul `OPENAI_API_KEY` est défini localement, Mantis le mappe vers `OPENCLAW_LIVE_OPENAI_KEY` avant dinvoquer Crabbox afin que le transfert denv `OPENCLAW_*` de Crabbox puisse le transporter dans la VM.
Options utiles du desktop Slack :
- `--lease-id <cbx_...>` réexécute contre une machine où un opérateur sest déjà connecté à Slack Web via VNC.
- `--gateway-setup` démarre un Gateway Slack OpenClaw persistant dans la VM au lieu dexécuter uniquement la voie QA bot-à-bot.
- `--slack-url <url>` ouvre une URL Slack Web spécifique. Sans celle-ci, Mantis dérive `https://app.slack.com/client/<team>/<channel>` depuis `auth.test` de Slack lorsque le jeton du bot SUT est disponible.
- `--slack-channel-id <id>` contrôle la liste dautorisation des salons Slack utilisée par la configuration du Gateway.
- `OPENCLAW_MANTIS_SLACK_BROWSER_PROFILE_DIR` contrôle le profil Chrome persistant dans la VM. La valeur par défaut est `$HOME/.config/openclaw-mantis/slack-chrome-profile`, afin quune connexion manuelle à Slack Web survive aux réexécutions sur la même location.
- `--credential-source convex --credential-role ci` utilise le pool didentifiants partagé au lieu des jetons env Slack directs.
- `--provider-mode`, `--model`, `--alt-model` et `--fast` sont transmis à la voie Slack réelle.
Le workflow de smoke GitHub est `Mantis Discord Smoke`. Le workflow GitHub avant et après pour le premier vrai scénario est `Mantis Discord Status Reactions`. Il accepte :
- `baseline_ref` : la ref censée reproduire le comportement uniquement en file dattente.
- `candidate_ref` : la ref censée montrer `queued -> thinking -> done`.
Il checkout la ref du harnais de workflow, construit des worktrees distincts de référence et candidats, exécute `discord-status-reactions-tool-only` contre chaque worktree et téléverse `baseline/`, `candidate/`, `comparison.json` et `mantis-report.md` comme artefacts Actions. Il rend aussi le HTML de chronologie de chaque voie dans un navigateur desktop Crabbox et publie ces captures décran VNC à côté des PNG de chronologie déterministes dans le commentaire de PR. Le workflow construit la CLI Crabbox depuis `openclaw/crabbox` main afin de pouvoir utiliser les options de location desktop/navigateur actuelles avant la prochaine publication du binaire Crabbox.
Vous pouvez aussi déclencher lexécution des réactions de statut directement depuis un commentaire de PR :
```text
@Mantis discord status reactions
```
Le déclencheur de commentaire est volontairement étroit. Il ne sexécute que sur les commentaires de pull request provenant dutilisateurs ayant un accès write, maintain ou admin, et il ne reconnaît que les demandes de réactions de statut Discord. Par défaut, il utilise la référence de base connue comme défectueuse et le SHA HEAD de la PR courante comme candidat. Les mainteneurs peuvent remplacer lune ou lautre référence :
Le déclencheur par commentaire est volontairement étroit. Il ne sexécute que sur les commentaires de pull request provenant dutilisateurs disposant des droits write, maintain ou admin, et il ne reconnaît que les requêtes de réactions de statut Discord. Par défaut, il utilise la ref de référence connue comme défectueuse et le SHA de tête de la PR courante comme candidat. Les mainteneurs peuvent remplacer lune ou lautre ref :
```text
@Mantis discord status reactions baseline=origin/main candidate=HEAD
@ -115,32 +147,32 @@ Exemples de commandes ClawSweeper :
@clawsweeper verify e2e discord
```
La première commande est explicite et centrée sur le scénario. La seconde pourra plus tard associer une PR ou une issue aux scénarios Mantis recommandés à partir des labels, des fichiers modifiés et des constats de revue ClawSweeper.
La première commande est explicite et centrée sur le scénario. La seconde pourra plus tard mapper une PR ou une issue vers des scénarios Mantis recommandés à partir des libellés, des fichiers modifiés et des constats de revue ClawSweeper.
## Cycle dexécution
## Cycle de vie de lexécution
1. Acquérir les identifiants.
2. Allouer ou réutiliser une VM.
3. Préparer le profil desktop/navigateur lorsque le scénario nécessite une preuve dinterface.
4. Préparer un checkout propre pour la référence de base.
4. Préparer un checkout propre pour la ref de référence.
5. Installer les dépendances et construire uniquement ce dont le scénario a besoin.
6. Démarrer un Gateway OpenClaw enfant avec un répertoire détat isolé.
7. Configurer le transport réel, le fournisseur, le modèle et le profil navigateur.
8. Exécuter le scénario et capturer les preuves de base.
8. Exécuter le scénario et capturer les preuves de référence.
9. Arrêter le Gateway et préserver les journaux.
10. Préparer la référence candidate dans la même VM.
10. Préparer la ref candidate dans la même VM.
11. Exécuter le même scénario et capturer les preuves candidates.
12. Comparer les résultats de loracle et les preuves visuelles.
13. Écrire Markdown, JSON, journaux, captures décran et artefacts de trace optionnels.
13. Écrire le Markdown, le JSON, les journaux, les captures décran et les artefacts de trace facultatifs.
14. Téléverser les artefacts GitHub Actions.
15. Publier un message de statut concis dans la PR ou Discord.
15. Publier un message de statut concis sur la PR ou Discord.
Le scénario devrait pouvoir échouer de deux manières différentes :
Le scénario devrait pouvoir échouer de deux façons différentes :
- **Bug reproduit** : la base a échoué de la manière attendue.
- **Échec du harnais** : la configuration de lenvironnement, les identifiants, lAPI Discord, le navigateur ou le fournisseur a échoué avant que loracle du bug ne soit significatif.
- **Bug reproduit** : la référence a échoué de la façon attendue.
- **Échec du harnais** : la configuration de lenvironnement, les identifiants, lAPI Discord, le navigateur ou le fournisseur ont échoué avant que loracle du bug ne soit significatif.
Le rapport final doit séparer ces cas afin que les mainteneurs ne confondent pas un environnement instable avec le comportement du produit.
Le rapport final doit séparer ces cas afin que les mainteneurs ne confondent pas un environnement flaky avec le comportement du produit.
## MVP Discord
@ -148,10 +180,10 @@ Le premier scénario devrait cibler les réactions de statut Discord dans les sa
Pourquoi cest une bonne graine Mantis :
- Cest visible dans Discord comme réactions sur le message déclencheur.
- Il dispose dun oracle REST solide via létat des réactions du message Discord.
- Il exerce un vrai Gateway OpenClaw, lauthentification du bot Discord, la répartition des messages, le mode de livraison de réponse source, létat des réactions de statut et le cycle de vie du tour de modèle.
- Il est suffisamment étroit pour garder la première implémentation honnête.
- Cest visible dans Discord sous forme de réactions sur le message déclencheur.
- Il possède un oracle REST solide via létat des réactions au message Discord.
- Il exerce un vrai Gateway OpenClaw, lauthentification du bot Discord, la distribution de messages, le mode de livraison de réponse source, létat des réactions de statut et le cycle de vie du tour du modèle.
- Il est assez étroit pour garder la première implémentation honnête.
Forme de scénario attendue :
@ -184,7 +216,7 @@ evidence:
screenshotMessageRow: true
```
Les preuves de base devraient montrer la réaction daccusé de réception en file dattente, mais aucune transition de cycle de vie en mode tool-only. Les preuves candidates devraient montrer les réactions de statut de cycle de vie en cours dexécution lorsque `messages.statusReactions.enabled` est explicitement `true`.
Les preuves de référence devraient montrer la réaction daccusé de réception en file dattente, mais aucune transition de cycle de vie en mode tool-only. Les preuves candidates devraient montrer les réactions de statut de cycle de vie sexécutant lorsque `messages.statusReactions.enabled` est explicitement `true`.
La première tranche exécutable est le scénario QA Discord réel opt-in :
@ -198,20 +230,20 @@ pnpm openclaw qa discord \
--output-dir .artifacts/qa-e2e/mantis/discord-status-reactions-candidate
```
Il configure le SUT avec une gestion de guilde toujours active, `visibleReplies:
Il configure le SUT avec une gestion des serveurs toujours activée, `visibleReplies:
"message_tool"`, `ackReaction: "👀"` et des réactions de statut explicites. Loracle interroge le vrai message déclencheur Discord et attend la séquence observée `👀 -> 🤔 -> 👍`. Les artefacts incluent `discord-qa-reaction-timelines.json`, `discord-status-reactions-tool-only-timeline.html` et `discord-status-reactions-tool-only-timeline.png`.
## Éléments QA existants
## Composants QA existants
Mantis devrait sappuyer sur la stack QA privée existante au lieu de repartir de zéro :
Mantis doit sappuyer sur la pile QA privée existante au lieu de repartir de zéro :
- `pnpm openclaw qa discord` exécute déjà une voie Discord réelle avec des bots pilote et SUT.
- Lexécuteur de transport réel écrit déjà des rapports et des artefacts de messages observés sous `.artifacts/qa-e2e/`.
- Les locations didentifiants Convex fournissent déjà un accès exclusif aux identifiants de transport réel partagés.
- Le service de contrôle navigateur prend déjà en charge les captures décran, instantanés, profils gérés headless et profils CDP distants.
- QA Lab dispose déjà dune interface de débogage et dun bus pour les tests en forme de transport.
- `pnpm openclaw qa discord` exécute déjà une voie Discord en direct avec des bots pilote et SUT.
- Le runner de transport en direct écrit déjà les rapports et les artefacts de messages observés sous `.artifacts/qa-e2e/`.
- Les baux didentifiants Convex fournissent déjà un accès exclusif aux identifiants de transport en direct partagés.
- Le service de contrôle du navigateur prend déjà en charge les captures décran, les instantanés, les profils gérés headless et les profils CDP distants.
- QA Lab dispose déjà dune interface de débogage et dun bus pour les tests de type transport.
La première implémentation de Mantis peut être un mince exécuteur avant/après par-dessus ces éléments, plus une couche de preuves visuelles.
La première implémentation de Mantis peut être un runner avant/après léger par-dessus ces composants, avec une couche de preuve visuelle.
## Modèle de preuves
@ -235,72 +267,63 @@ Chaque exécution écrit un répertoire dartefacts stable :
run.log
```
`mantis-summary.json` devrait être la source de vérité lisible par machine. Le rapport Markdown sert aux commentaires PR et à la revue humaine.
`mantis-summary.json` doit être la source de vérité lisible par machine. Le rapport Markdown est destiné aux commentaires de PR et à la revue humaine.
Le résumé doit inclure :
- les références et SHA testés
- le transport et lidentifiant de scénario
- le fournisseur de machine et lidentifiant de machine ou de location
- les refs et les SHA testés
- le transport et lid du scénario
- le fournisseur de machine et lid de machine ou lid de bail
- la source des identifiants sans valeurs secrètes
- le résultat de base
- le résultat candidat
- si le bug a été reproduit sur la base
- le résultat de la baseline
- le résultat du candidat
- si le bug sest reproduit sur la baseline
- si le candidat la corrigé
- les chemins dartefacts
- les problèmes de configuration ou de nettoyage assainis
- les chemins des artefacts
- les problèmes de configuration ou de nettoyage nettoyés
Les captures décran sont des preuves, pas des secrets. Elles nécessitent tout de même une discipline de rédaction : noms de salons privés, noms dutilisateurs ou contenu de messages peuvent apparaître. Pour les PR publiques, préférez les liens vers les artefacts GitHub Actions plutôt que les images intégrées jusquà ce que la stratégie de rédaction soit plus solide.
Les captures décran sont des preuves, pas des secrets. Elles exigent tout de même une discipline de caviardage : des noms de canaux privés, des noms dutilisateurs ou le contenu de messages peuvent apparaître. Pour les PR publiques, préférez les liens dartefacts GitHub Actions aux images intégrées tant que la stratégie de caviardage nest pas plus solide.
## Navigateur et VNC
La voie navigateur possède deux modes :
La voie navigateur dispose de deux modes :
- **Automatisation headless** : par défaut pour la CI. Chrome sexécute avec CDP activé, et Playwright ou le contrôle navigateur OpenClaw capture les captures décran.
- **Secours VNC** : activé sur la même VM lorsque la connexion, la MFA, lanti-automatisation Discord ou le débogage visuel nécessite un humain.
- **Automatisation headless** : par défaut pour la CI. Chrome sexécute avec CDP activé, et Playwright ou le contrôle de navigateur OpenClaw capture les captures décran.
- **Secours VNC** : activé sur la même VM lorsque la connexion, le MFA, lanti-automatisation Discord ou le débogage visuel nécessitent un humain.
Le profil de navigateur observateur Discord doit être suffisamment persistant pour éviter
de se reconnecter à chaque exécution, mais isolé de létat du navigateur personnel. Un profil
appartient au pool de machines Mantis, pas à lordinateur portable dun développeur.
Le profil de navigateur observateur Discord doit être suffisamment persistant pour éviter une connexion à chaque exécution, mais isolé de létat du navigateur personnel. Un profil appartient au pool de machines Mantis, pas à un ordinateur portable de développeur.
Quand Mantis reste bloqué, il publie un message de statut Discord avec :
Quand Mantis se bloque, il publie un message de statut Discord avec :
- id dexécution
- id de scénario
- fournisseur de machine
- répertoire des artefacts
- instructions de connexion VNC ou noVNC si disponibles
- texte court décrivant le blocage
- lid dexécution
- lid du scénario
- le fournisseur de machine
- le répertoire dartefacts
- les instructions de connexion VNC ou noVNC si disponibles
- un court texte décrivant le blocage
Le premier déploiement privé peut publier ces messages dans le canal opérateur
existant et passer plus tard à un canal Mantis dédié.
Le premier déploiement privé peut publier ces messages dans le canal opérateur existant et migrer plus tard vers un canal Mantis dédié.
## Machines
Mantis doit privilégier AWS via Crabbox pour la première implémentation distante.
Crabbox nous fournit des machines préchauffées, le suivi des baux, lhydratation,
les journaux, les résultats et le nettoyage. Si la capacité AWS est trop lente ou
indisponible, ajoutez un fournisseur Hetzner derrière la même interface de machine.
Mantis doit privilégier AWS via Crabbox pour la première implémentation distante. Crabbox nous fournit des machines préchauffées, le suivi des baux, lhydratation, les journaux, les résultats et le nettoyage. Si la capacité AWS est trop lente ou indisponible, ajoutez un fournisseur Hetzner derrière la même interface de machine.
Exigences minimales pour la VM :
- Linux avec une installation Chrome ou Chromium compatible avec un bureau
- Linux avec une installation Chrome ou Chromium capable dexécuter un bureau
- accès CDP pour lautomatisation du navigateur
- VNC ou noVNC pour la récupération
- VNC ou noVNC pour le secours
- Node 22 et pnpm
- checkout OpenClaw et cache des dépendances
- cache du navigateur Playwright Chromium quand Playwright est utilisé
- suffisamment de CPU et de mémoire pour un OpenClaw Gateway, un navigateur et une exécution de modèle
- accès sortant à Discord, GitHub, aux fournisseurs de modèles et au courtier didentifiants
- cache du navigateur Chromium Playwright lorsque Playwright est utilisé
- suffisamment de CPU et de mémoire pour un Gateway OpenClaw, un navigateur et une exécution de modèle
- accès sortant vers Discord, GitHub, les fournisseurs de modèles et le courtier didentifiants
La VM ne doit pas conserver de secrets bruts à longue durée de vie en dehors des
magasins didentifiants ou de profils de navigateur attendus.
La VM ne doit pas conserver de secrets bruts de longue durée en dehors des magasins didentifiants ou de profils de navigateur attendus.
## Secrets
Les secrets résident dans les secrets dorganisation ou de dépôt GitHub pour les
exécutions distantes, et dans un fichier de secrets local contrôlé par lopérateur
pour les exécutions locales.
Les secrets résident dans les secrets dorganisation ou de dépôt GitHub pour les exécutions distantes, et dans un fichier de secrets local contrôlé par lopérateur pour les exécutions locales.
Noms de secrets recommandés :
@ -310,53 +333,32 @@ Noms de secrets recommandés :
- `OPENCLAW_QA_DISCORD_GUILD_ID`
- `OPENCLAW_QA_DISCORD_CHANNEL_ID`
- `OPENCLAW_QA_DISCORD_NOTIFY_CHANNEL_ID`
- `OPENCLAW_QA_REDACT_PUBLIC_METADATA=1` pour les téléversements dartefacts GitHub publics
- `OPENCLAW_QA_REDACT_PUBLIC_METADATA=1` pour les téléversements publics dartefacts GitHub
- `OPENCLAW_QA_CONVEX_SITE_URL`
- `OPENCLAW_QA_CONVEX_SECRET_CI`
- `OPENCLAW_QA_MANTIS_CRABBOX_COORDINATOR`
- `OPENCLAW_QA_MANTIS_CRABBOX_COORDINATOR_TOKEN`
À long terme, le pool didentifiants Convex doit rester la source normale des
identifiants de transport en direct. Les secrets GitHub amorcent le courtier et
les voies de secours. Le workflow des réactions de statut Discord mappe les
secrets Mantis Crabbox vers les variables denvironnement `CRABBOX_COORDINATOR`
et `CRABBOX_COORDINATOR_TOKEN` attendues par la CLI Crabbox. Les noms de secrets
GitHub `CRABBOX_*` simples restent acceptés comme solution de compatibilité.
À long terme, le pool didentifiants Convex doit rester la source normale des identifiants de transport en direct. Les secrets GitHub initialisent le courtier et les voies de secours. Le workflow de réactions de statut Discord remappe les secrets Crabbox Mantis vers les variables denvironnement `CRABBOX_COORDINATOR` et `CRABBOX_COORDINATOR_TOKEN` attendues par la CLI Crabbox. Les noms de secrets GitHub `CRABBOX_*` simples restent acceptés comme solution de compatibilité.
Le runner Mantis ne doit jamais afficher :
- jetons de bots Discord
- clés dAPI de fournisseurs
- cookies de navigateur
- contenu des profils dauthentification
- mots de passe VNC
- charges utiles didentifiants brutes
- les tokens de bot Discord
- les clés API de fournisseur
- les cookies de navigateur
- le contenu des profils dauthentification
- les mots de passe VNC
- les charges utiles didentifiants bruts
Les téléversements dartefacts publics doivent aussi caviarder les métadonnées de
cible Discord telles que les ids de bot, serveur, canal et message. Le workflow
smoke GitHub active `OPENCLAW_QA_REDACT_PUBLIC_METADATA=1` pour cette raison.
Les téléversements dartefacts publics doivent aussi caviarder les métadonnées de cible Discord telles que les ids de bot, de serveur, de canal et de message. Le workflow de smoke GitHub active `OPENCLAW_QA_REDACT_PUBLIC_METADATA=1` pour cette raison.
Si un jeton est accidentellement collé dans une issue, une PR, un chat ou un
journal, faites-le tourner après avoir stocké le nouveau secret.
Si un token est accidentellement collé dans une issue, une PR, une discussion ou un journal, faites-le pivoter après avoir stocké le nouveau secret.
## Artefacts GitHub et commentaires de PR
Les workflows Mantis doivent téléverser le paquet complet de preuves sous forme
dartefact Actions à courte durée de vie. Quand le workflow est exécuté pour un
rapport de bogue ou une PR de correction, il doit aussi publier les captures
décran PNG caviardées dans la branche `qa-artifacts` et insérer ou mettre à jour
un commentaire sur ce bogue ou cette PR de correction avec des captures décran
avant/après intégrées. Ne publiez pas la preuve principale uniquement sur une PR
générique dautomatisation QA. Les journaux bruts, messages observés et autres
preuves volumineuses restent dans lartefact Actions.
Les workflows Mantis doivent téléverser le bundle de preuves complet comme artefact Actions à durée de vie courte. Lorsque le workflow est exécuté pour un rapport de bug ou une PR de correctif, il doit aussi publier les captures décran PNG caviardées sur la branche `qa-artifacts` et mettre à jour ou créer un commentaire sur ce bug ou cette PR de correctif avec des captures décran avant/après intégrées. Ne publiez pas la preuve principale uniquement sur une PR générique dautomatisation QA. Les journaux bruts, les messages observés et les autres preuves volumineuses restent dans lartefact Actions.
Les workflows de production doivent publier ces commentaires avec la GitHub App
Mantis, pas avec `github-actions[bot]`. Stockez lid de lapp et la clé privée
comme secrets GitHub Actions `MANTIS_GITHUB_APP_ID` et
`MANTIS_GITHUB_APP_PRIVATE_KEY`. Le workflow utilise un marqueur masqué comme clé
dupsert, met à jour ce commentaire quand le jeton peut le modifier, et crée un
nouveau commentaire appartenant à Mantis quand un ancien marqueur appartenant à
un bot ne peut pas être modifié.
Les workflows de production doivent publier ces commentaires avec la GitHub App Mantis, pas avec `github-actions[bot]`. Stockez lid dapplication et la clé privée dans les secrets GitHub Actions `MANTIS_GITHUB_APP_ID` et `MANTIS_GITHUB_APP_PRIVATE_KEY`. Le workflow utilise un marqueur masqué comme clé de mise à jour, met à jour ce commentaire lorsque le token peut le modifier, et crée un nouveau commentaire appartenant à Mantis lorsquun ancien marqueur appartenant au bot ne peut pas être modifié.
Le commentaire de PR doit être court et visuel :
@ -378,76 +380,60 @@ candidate showed the expected queued -> thinking -> done sequence.
| <inline screenshot> | <inline screenshot> |
```
Quand lexécution échoue parce que le harnais a échoué, le commentaire doit le
dire au lieu de laisser entendre que le candidat a échoué.
Lorsque lexécution échoue parce que le harnais a échoué, le commentaire doit le dire au lieu de laisser entendre que le candidat a échoué.
## Notes de déploiement privé
Un déploiement privé peut déjà disposer dune application Discord Mantis.
Réutilisez cette application au lieu den créer une autre quand elle dispose des
bonnes autorisations de bot et peut faire lobjet dune rotation en toute sécurité.
Un déploiement privé peut déjà disposer dune application Discord Mantis. Réutilisez cette application au lieu de créer une autre application lorsquelle dispose des bonnes autorisations de bot et peut être tournée en toute sécurité.
Définissez le canal initial de notification des opérateurs via des secrets ou la
configuration de déploiement. Il peut dabord pointer vers un canal mainteneur ou
opérations existant, puis passer à un canal Mantis dédié dès quil existe.
Définissez le canal initial de notification opérateur via des secrets ou la configuration de déploiement. Il peut dabord pointer vers un canal de maintenance ou dopérations existant, puis migrer vers un canal Mantis dédié lorsquil existera.
Ne mettez pas dids de serveur, dids de canal, de jetons de bot, de cookies de
navigateur ou de mots de passe VNC dans ce document. Stockez-les dans les secrets
GitHub, le courtier didentifiants ou le magasin local de secrets de lopérateur.
Ne mettez pas dids de serveur, dids de canal, de tokens de bot, de cookies de navigateur ni de mots de passe VNC dans ce document. Stockez-les dans les secrets GitHub, le courtier didentifiants ou le magasin de secrets local de lopérateur.
## Ajouter un scénario
Un scénario Mantis doit déclarer :
- id et titre
- transport
- identifiants requis
- politique de référence de base
- politique de référence candidate
- correctif de configuration OpenClaw
- étapes de configuration
- stimulus
- oracle de référence attendu
- oracle candidat attendu
- cibles de capture visuelle
- budget de délai dexpiration
- étapes de nettoyage
- un id et un titre
- le transport
- les identifiants requis
- la politique de ref de baseline
- la politique de ref de candidat
- le patch de configuration OpenClaw
- les étapes de configuration
- le stimulus
- loracle attendu pour la baseline
- loracle attendu pour le candidat
- les cibles de capture visuelle
- le budget de délai dexpiration
- les étapes de nettoyage
Les scénarios doivent privilégier de petits oracles typés :
- état des réactions Discord pour les bogues de réactions
- références de messages Discord pour les bogues de fils de discussion
- ts de fil Slack et état de lAPI de réactions pour les bogues Slack
- ids et en-têtes de messages e-mail pour les bogues e-mail
- captures décran du navigateur quand lUI est le seul observable fiable
- létat des réactions Discord pour les bugs de réaction
- les références de messages Discord pour les bugs de fil de discussion
- le ts de fil Slack et létat de lAPI de réactions pour les bugs Slack
- les ids et en-têtes de messages e-mail pour les bugs e-mail
- les captures décran du navigateur lorsque lUI est le seul observable fiable
Les vérifications par vision doivent être additives. Si une API de plateforme peut
prouver le bogue, utilisez lAPI comme oracle de réussite/échec et conservez les
captures décran pour la confiance humaine.
Les vérifications par vision doivent être additives. Si une API de plateforme peut prouver le bug, utilisez lAPI comme oracle de réussite/échec et gardez les captures décran pour renforcer la confiance humaine.
## Extension des fournisseurs
Après Discord, le même runner peut ajouter :
- Slack : réactions, fils, mentions dapp, modales, téléversements de fichiers.
- E-mail : authentification Gmail et fils de messages avec `gog` quand les connecteurs ne
suffisent pas.
- WhatsApp : connexion QR, ré-identification, livraison des messages, médias, réactions.
- Telegram : contrôle des mentions de groupe, commandes, réactions quand disponibles.
- Slack : réactions, fils, mentions dapplication, modales, téléversements de fichiers.
- E-mail : authentification Gmail et threading de messages avec `gog` lorsque les connecteurs ne suffisent pas.
- WhatsApp : connexion par QR code, réidentification, livraison de messages, médias, réactions.
- Telegram : contrôle des mentions de groupe, commandes, réactions lorsque disponibles.
- Matrix : salons chiffrés, relations de fil ou de réponse, reprise après redémarrage.
Chaque transport doit avoir un scénario smoke peu coûteux et un ou plusieurs
scénarios par classe de bogues. Les scénarios visuels coûteux doivent rester
optionnels.
Chaque transport doit avoir un scénario smoke peu coûteux et un ou plusieurs scénarios par classe de bugs. Les scénarios visuels coûteux doivent rester opt-in.
## Questions ouvertes
- Quel bot Discord doit être le pilote, et lequel doit être le SUT, quand le
bot Mantis existant est réutilisé ?
- La connexion du navigateur observateur doit-elle utiliser un compte Discord
humain, un compte de test, ou seulement des preuves REST lisibles par bot pour
la première phase ?
- Quel bot Discord doit être le pilote, et lequel doit être le SUT, lorsque le bot Mantis existant est réutilisé ?
- La connexion du navigateur observateur doit-elle utiliser un compte Discord humain, un compte de test ou seulement des preuves REST lisibles par bot pour la première phase ?
- Combien de temps GitHub doit-il conserver les artefacts Mantis pour les PR ?
- Quand ClawSweeper doit-il recommander automatiquement Mantis au lieu dattendre
une commande de mainteneur ?
- Les captures décran doivent-elles être caviardées ou rognées avant le téléversement pour les PR publiques ?
- Quand ClawSweeper doit-il recommander automatiquement Mantis au lieu dattendre une commande dun mainteneur ?
- Les captures décran doivent-elles être caviardées ou recadrées avant le téléversement pour les PR publiques ?

View File

@ -1,20 +1,20 @@
---
read_when:
- Expliquer comment les messages entrants deviennent des réponses
- Clarification des sessions, des modes de mise en file dattente ou du comportement de diffusion en continu
- Documenter la visibilité du raisonnement et les implications dutilisation
- Clarification des sessions, des modes de mise en file dattente ou du comportement de streaming
- Documenter la visibilité du raisonnement et les implications d'utilisation
summary: Flux des messages, sessions, mise en file dattente et visibilité du raisonnement
title: Messages
x-i18n:
generated_at: "2026-04-30T16:27:51Z"
generated_at: "2026-05-04T07:03:35Z"
model: gpt-5.5
provider: openai
source_hash: fdeee014d92767a725501691fbe0c4ee6b631acc9a2ab5cbbcf321bfee9679b9
source_hash: 15242e21fd17a9f2013561003e108d197204d834caf51bbcdc53ffb3f118b14f
source_path: concepts/messages.md
workflow: 16
---
OpenClaw gère les messages entrants au moyen dun pipeline de résolution de session, de mise en file dattente, de streaming, dexécution doutils et de visibilité du raisonnement. Cette page cartographie le chemin dun message entrant jusquà la réponse.
OpenClaw gère les messages entrants au moyen dun pipeline de résolution de session, de mise en file dattente, de streaming, dexécution doutils et de visibilité du raisonnement. Cette page décrit le chemin dun message entrant jusquà la réponse.
## Flux des messages (vue densemble)
@ -30,17 +30,21 @@ Les principaux réglages se trouvent dans la configuration :
- `messages.*` pour les préfixes, la mise en file dattente et le comportement des groupes.
- `agents.defaults.*` pour les valeurs par défaut du streaming par blocs et du découpage.
- Les remplacements par canal (`channels.whatsapp.*`, `channels.telegram.*`, etc.) pour les limites et les bascules de streaming.
- Les remplacements par canal (`channels.whatsapp.*`, `channels.telegram.*`, etc.) pour les limites et les options de streaming.
Consultez [Configuration](/fr/gateway/configuration) pour le schéma complet.
Voir [Configuration](/fr/gateway/configuration) pour le schéma complet.
## Déduplication entrante
Les canaux peuvent relivrer le même message après des reconnexions. OpenClaw conserve un cache de courte durée indexé par canal/compte/pair/session/ID de message, afin que les livraisons en double ne déclenchent pas une autre exécution de lagent.
Les canaux peuvent renvoyer le même message après des reconnexions. OpenClaw conserve un
cache de courte durée indexé par canal/compte/paire/session/identifiant de message afin que les livraisons
dupliquées ne déclenchent pas une autre exécution dagent.
## Anti-rebond entrant
Les messages consécutifs rapides provenant du **même expéditeur** peuvent être regroupés en un seul tour dagent via `messages.inbound`. Lanti-rebond est limité à chaque canal + conversation et utilise le message le plus récent pour le fil de réponse et les ID.
Des messages rapides et consécutifs du **même expéditeur** peuvent être regroupés en un seul
tour dagent via `messages.inbound`. Lanti-rebond est limité à chaque canal + conversation
et utilise le message le plus récent pour le threading et les identifiants de réponse.
Configuration (valeur globale par défaut + remplacements par canal) :
@ -61,37 +65,46 @@ Configuration (valeur globale par défaut + remplacements par canal) :
Notes :
- Lanti-rebond sapplique aux messages **texte uniquement** ; les médias/pièces jointes sont vidés immédiatement.
- Les commandes de contrôle contournent lanti-rebond afin de rester autonomes — **sauf** lorsquun canal opte explicitement pour la fusion des DM du même expéditeur (par ex. [BlueBubbles `coalesceSameSenderDms`](/fr/channels/bluebubbles#coalescing-split-send-dms-command--url-in-one-composition)), où les commandes DM attendent dans la fenêtre danti-rebond afin quune charge utile envoyée en plusieurs parties puisse rejoindre le même tour dagent.
- Lanti-rebond sapplique aux messages **texte uniquement** ; les médias/pièces jointes sont envoyés immédiatement.
- Les commandes de contrôle contournent lanti-rebond afin de rester autonomes — **sauf** lorsquun canal choisit explicitement de regrouper les DM du même expéditeur (par exemple [BlueBubbles `coalesceSameSenderDms`](/fr/channels/bluebubbles#coalescing-split-send-dms-command--url-in-one-composition)), où les commandes DM attendent dans la fenêtre danti-rebond afin quune charge utile envoyée en plusieurs parties puisse rejoindre le même tour dagent.
## Sessions et appareils
Les sessions appartiennent au Gateway, pas aux clients.
- Les discussions directes sont regroupées dans la clé de session principale de lagent.
- Les discussions directes sont ramenées à la clé de session principale de lagent.
- Les groupes/canaux obtiennent leurs propres clés de session.
- Le magasin de sessions et les transcriptions résident sur lhôte Gateway.
- Le stockage des sessions et les transcriptions résident sur lhôte du Gateway.
Plusieurs appareils/canaux peuvent correspondre à la même session, mais lhistorique nest pas entièrement resynchronisé vers chaque client. Recommandation : utilisez un appareil principal pour les longues conversations afin déviter un contexte divergent. Linterface de contrôle et la TUI affichent toujours la transcription de session fournie par le Gateway ; elles constituent donc la source de vérité.
Plusieurs appareils/canaux peuvent pointer vers la même session, mais lhistorique nest pas entièrement
resynchronisé vers chaque client. Recommandation : utilisez un appareil principal pour les longues
conversations afin déviter un contexte divergent. Linterface de contrôle et la TUI affichent toujours la
transcription de session adossée au Gateway ; elles constituent donc la source de vérité.
Détails : [Gestion des sessions](/fr/concepts/session).
## Métadonnées des résultats doutil
Le `content` dun résultat doutil est le résultat visible par le modèle. Les `details` dun résultat doutil sont les métadonnées dexécution destinées au rendu de linterface, aux diagnostics, à la livraison de médias et aux plugins.
Le `content` dun résultat doutil est le résultat visible par le modèle. Le `details` dun résultat doutil contient
les métadonnées dexécution pour le rendu dinterface, les diagnostics, la livraison de médias et les plugins.
OpenClaw garde cette frontière explicite :
- `toolResult.details` est retiré avant la relecture par le fournisseur et lentrée de Compaction.
- Les transcriptions de session persistées ne conservent que des `details` bornés ; les métadonnées trop volumineuses sont remplacées par un résumé compact marqué `persistedDetailsTruncated: true`.
- Les plugins et outils doivent placer le texte que le modèle doit lire dans `content`, et pas seulement dans `details`.
- `toolResult.details` est supprimé avant la relecture par le fournisseur et lentrée de compaction.
- Les transcriptions de session persistées ne conservent que des `details` bornés ; les métadonnées trop volumineuses
sont remplacées par un résumé compact marqué `persistedDetailsTruncated: true`.
- Les plugins et les outils doivent placer le texte que le modèle doit lire dans `content`, pas seulement
dans `details`.
## Corps entrants et contexte dhistorique
OpenClaw sépare le **corps de prompt** du **corps de commande** :
- `BodyForAgent` : texte principal destiné au modèle pour le message actuel. Les plugins de canal doivent le garder centré sur le texte actuel de lexpéditeur qui porte le prompt.
- `Body` : solution de repli historique pour le prompt. Cela peut inclure des enveloppes de canal et des wrappers dhistorique facultatifs, mais les canaux actuels ne doivent pas sy fier comme entrée principale du modèle lorsque `BodyForAgent` est disponible.
- `BodyForAgent` : texte principal destiné au modèle pour le message actuel. Les plugins de canal
doivent le garder centré sur le texte actuel de lexpéditeur qui porte le prompt.
- `Body` : repli de prompt historique. Il peut inclure des enveloppes de canal et
des wrappers dhistorique facultatifs, mais les canaux actuels ne doivent pas sy fier comme
entrée principale du modèle lorsque `BodyForAgent` est disponible.
- `CommandBody` : texte utilisateur brut pour lanalyse des directives/commandes.
- `RawBody` : alias historique de `CommandBody` (conservé pour compatibilité).
@ -100,30 +113,48 @@ Lorsquun canal fournit un historique, il utilise un wrapper partagé :
- `[Chat messages since your last reply - for context]`
- `[Current message - respond to this]`
Pour les **discussions non directes** (groupes/canaux/salons), le **corps du message actuel** est préfixé par le libellé de lexpéditeur (même style que celui utilisé pour les entrées dhistorique). Cela garantit la cohérence des messages en temps réel et des messages mis en file dattente/historique dans le prompt de lagent.
Pour les **discussions non directes** (groupes/canaux/salles), le **corps du message actuel** est préfixé par le
libellé de lexpéditeur (dans le même style que les entrées dhistorique). Cela maintient la cohérence des messages en temps réel et en file dattente/historique
dans le prompt de lagent.
Les tampons dhistorique sont **uniquement en attente** : ils incluent les messages de groupe qui nont _pas_ déclenché dexécution (par exemple, les messages filtrés par mention) et **excluent** les messages déjà présents dans la transcription de session.
Les tampons dhistorique sont **uniquement en attente** : ils incluent les messages de groupe qui nont _pas_
déclenché dexécution (par exemple, les messages soumis à une mention) et **excluent** les messages
déjà présents dans la transcription de session.
La suppression des directives ne sapplique quà la section du **message actuel**, afin que lhistorique reste intact. Les canaux qui enveloppent lhistorique doivent définir `CommandBody` (ou `RawBody`) sur le texte du message original et conserver `Body` comme prompt combiné. Lhistorique structuré, les réponses, les messages transférés et les métadonnées de canal sont rendus comme des blocs de contexte non fiables de rôle utilisateur lors de lassemblage du prompt.
Les tampons dhistorique sont configurables via `messages.groupChat.historyLimit` (valeur globale par défaut) et les remplacements par canal comme `channels.slack.historyLimit` ou `channels.telegram.accounts.<id>.historyLimit` (définissez `0` pour désactiver).
La suppression des directives ne sapplique quà la section du **message actuel**, afin que lhistorique
reste intact. Les canaux qui enveloppent lhistorique doivent définir `CommandBody` (ou
`RawBody`) sur le texte original du message et conserver `Body` comme prompt combiné.
Lhistorique structuré, les réponses, les transferts et les métadonnées de canal sont rendus comme
blocs de contexte non fiable au rôle utilisateur lors de lassemblage du prompt.
Les tampons dhistorique sont configurables via `messages.groupChat.historyLimit` (valeur globale
par défaut) et des remplacements par canal comme `channels.slack.historyLimit` ou
`channels.telegram.accounts.<id>.historyLimit` (définissez `0` pour désactiver).
## Mise en file dattente et suivis
Si une exécution est déjà active, les messages entrants peuvent être mis en file dattente, orientés vers lexécution actuelle ou collectés pour un tour de suivi.
Si une exécution est déjà active, les messages entrants peuvent être mis en file dattente, orientés vers
lexécution actuelle ou collectés pour un tour de suivi.
- Configurez via `messages.queue` (et `messages.queue.byChannel`).
- Le mode par défaut est `steer`, avec un anti-rebond de suivi de 500 ms lorsque le guidage retombe sur la livraison de suivi en file dattente.
- Modes : `steer`, `followup`, `collect`, `steer-backlog`, `interrupt` et le mode historique un-à-la-fois `queue`.
- Le mode par défaut est `steer`, avec un anti-rebond de suivi de 500 ms lorsque lorientation revient
à une livraison de suivi mise en file dattente.
- Modes : `steer`, `followup`, `collect`, `steer-backlog`, `interrupt` et le mode historique
un-à-la-fois `queue`.
Détails : [File dattente des commandes](/fr/concepts/queue) et [File dattente de guidage](/fr/concepts/queue-steering).
Détails : [File de commandes](/fr/concepts/queue) et [File dorientation](/fr/concepts/queue-steering).
## Propriété des exécutions de canal
## Propriété dexécution des canaux
Les plugins de canal peuvent préserver lordre, appliquer un anti-rebond aux entrées et appliquer une contre-pression de transport avant quun message nentre dans la file de session. Ils ne doivent pas imposer un délai dexpiration séparé autour du tour dagent lui-même. Une fois quun message est routé vers une session, les travaux de longue durée sont régis par le cycle de vie de la session, des outils et du runtime, afin que tous les canaux signalent les tours lents et sen rétablissent de manière cohérente.
Les plugins de canal peuvent préserver lordre, appliquer un anti-rebond à lentrée et appliquer une contre-pression
de transport avant quun message nentre dans la file de session. Ils ne doivent pas imposer de
délai dexpiration séparé autour du tour dagent lui-même. Une fois quun message est routé vers une
session, les travaux de longue durée sont régis par la session, loutil et le cycle de vie
dexécution, afin que tous les canaux signalent les tours lents et sen remettent de manière cohérente.
## Streaming, découpage et regroupement
Le streaming par blocs envoie des réponses partielles à mesure que le modèle produit des blocs de texte. Le découpage respecte les limites de texte des canaux et évite de diviser les blocs de code clôturés.
Le streaming par blocs envoie des réponses partielles à mesure que le modèle produit des blocs de texte.
Le découpage respecte les limites de texte du canal et évite de scinder les blocs de code clôturés.
Paramètres clés :
@ -132,44 +163,53 @@ Paramètres clés :
- `agents.defaults.blockStreamingChunk` (`minChars|maxChars|breakPreference`)
- `agents.defaults.blockStreamingCoalesce` (regroupement basé sur linactivité)
- `agents.defaults.humanDelay` (pause de type humain entre les réponses par blocs)
- Remplacements par canal : `*.blockStreaming` et `*.blockStreamingCoalesce` (les canaux autres que Telegram exigent un `*.blockStreaming: true` explicite)
- Remplacements par canal : `*.blockStreaming` et `*.blockStreamingCoalesce` (les canaux non-Telegram nécessitent un `*.blockStreaming: true` explicite)
Détails : [Streaming + découpage](/fr/concepts/streaming).
## Visibilité du raisonnement et jetons
## Visibilité du raisonnement et tokens
OpenClaw peut exposer ou masquer le raisonnement du modèle :
- `/reasoning on|off|stream` contrôle la visibilité.
- Le contenu de raisonnement compte quand même dans lutilisation des jetons lorsquil est produit par le modèle.
- Telegram prend en charge le flux de raisonnement dans la bulle de brouillon.
- Le contenu de raisonnement compte toujours dans lutilisation des tokens lorsquil est produit par le modèle.
- Telegram prend en charge le flux de raisonnement dans une bulle de brouillon transitoire supprimée après la livraison finale ; utilisez `/reasoning on` pour une sortie de raisonnement persistante.
Détails : [Directives de réflexion + raisonnement](/fr/tools/thinking) et [Utilisation des jetons](/fr/reference/token-use).
Détails : [Directives de pensée + raisonnement](/fr/tools/thinking) et [Utilisation des tokens](/fr/reference/token-use).
## Préfixes, fils et réponses
## Préfixes, threading et réponses
Le formatage des messages sortants est centralisé dans `messages` :
La mise en forme des messages sortants est centralisée dans `messages` :
- `messages.responsePrefix`, `channels.<channel>.responsePrefix` et `channels.<channel>.accounts.<id>.responsePrefix` (cascade de préfixes sortants), plus `channels.whatsapp.messagePrefix` (préfixe entrant WhatsApp)
- Fil de réponse via `replyToMode` et valeurs par défaut par canal
- Threading des réponses via `replyToMode` et les valeurs par défaut par canal
Détails : [Configuration](/fr/gateway/config-agents#messages) et documentation des canaux.
## Réponses silencieuses
Le jeton silencieux exact `NO_REPLY` / `no_reply` signifie « ne pas livrer de réponse visible par lutilisateur ».
Lorsquun tour comporte aussi un média doutil en attente, comme un audio TTS généré, OpenClaw retire le texte silencieux mais livre quand même la pièce jointe multimédia.
Le token silencieux exact `NO_REPLY` / `no_reply` signifie « ne pas livrer de réponse visible par lutilisateur ».
Lorsquun tour contient aussi des médias doutil en attente, comme un audio TTS généré, OpenClaw
supprime le texte silencieux mais livre quand même la pièce jointe média.
OpenClaw résout ce comportement selon le type de conversation :
- Les conversations directes interdisent le silence par défaut et réécrivent une réponse silencieuse nue en une courte solution de repli visible.
- Les conversations directes interdisent le silence par défaut et réécrivent une réponse
silencieuse seule en un court repli visible.
- Les groupes/canaux autorisent le silence par défaut.
- Lorchestration interne autorise le silence par défaut.
OpenClaw utilise également les réponses silencieuses pour les échecs internes du runner qui se produisent avant toute réponse de lassistant dans les discussions non directes, afin que les groupes/canaux ne voient pas de texte derreur standard du Gateway. Les discussions directes affichent par défaut un texte déchec compact ; les détails bruts du runner ne sont affichés que lorsque `/verbose` est `on` ou `full`.
OpenClaw utilise aussi les réponses silencieuses pour les échecs internes dexécuteur qui surviennent
avant toute réponse dassistant dans les discussions non directes, afin que les groupes/canaux ne voient pas
de texte passe-partout derreur du Gateway. Les discussions directes affichent par défaut une copie déchec compacte ;
les détails bruts de lexécuteur ne sont affichés que lorsque `/verbose` est `on` ou `full`.
Les valeurs par défaut se trouvent sous `agents.defaults.silentReply` et `agents.defaults.silentReplyRewrite` ; `surfaces.<id>.silentReply` et `surfaces.<id>.silentReplyRewrite` peuvent les remplacer par surface.
Les valeurs par défaut résident sous `agents.defaults.silentReply` et
`agents.defaults.silentReplyRewrite` ; `surfaces.<id>.silentReply` et
`surfaces.<id>.silentReplyRewrite` peuvent les remplacer par surface.
Lorsque la session parente comporte une ou plusieurs exécutions de sous-agent lancé en attente, les réponses silencieuses nues sont supprimées sur toutes les surfaces au lieu dêtre réécrites, afin que le parent reste silencieux jusquà ce que lévénement de fin de lenfant livre la vraie réponse.
Lorsque la session parente possède une ou plusieurs exécutions de sous-agent engendrées en attente, les réponses
silencieuses seules sont supprimées sur toutes les surfaces au lieu dêtre réécrites, afin que le
parent reste silencieux jusquà ce que lévénement dachèvement enfant livre la vraie réponse.
## Connexe

View File

@ -1,23 +1,27 @@
---
read_when:
- Configurer les mises à jour de progression visibles pour les tours de conversation de longue durée
- Choisir entre les modes de diffusion partielle, par bloc et avec progression
- Explication de la manière dont OpenClaw met à jour un seul message de canal pendant que le travail est en cours
- Dépannage des brouillons de progression, des messages de progression autonomes ou du mécanisme de repli de finalisation
summary: 'Brouillons de progression : un seul message visible de travail en cours qui se met à jour pendant lexécution dun agent'
title: Brouillons davancement
- Configuration des mises à jour de progression visibles pour les tours de conversation de longue durée
- Choisir entre les modes de diffusion partielle, par bloc et de progression
- Explication de la manière dont OpenClaw met à jour un message de canal pendant que le travail est en cours
- Résolution des problèmes liés aux brouillons de progression, aux messages de progression autonomes ou à la solution de repli de finalisation
summary: 'Brouillons de progression : un message visible de travail en cours qui se met à jour pendant lexécution dun agent'
title: Avancer les brouillons
x-i18n:
generated_at: "2026-05-04T02:23:31Z"
generated_at: "2026-05-04T07:04:03Z"
model: gpt-5.5
provider: openai
source_hash: 8ce19262800f1c3c3e505a3cf1d41ed5c3dffcbca168ad7b7afabdce62eee8fe
source_hash: f78c07866cd7f613012a80a40413e5866c1dd2edd477088f9fc141347f5f3788
source_path: concepts/progress-drafts.md
workflow: 16
---
Les brouillons de progression donnent vie aux longues interactions dagent dans le chat sans transformer la conversation en pile de réponses détat temporaires.
Les brouillons de progression donnent de la vie aux tours dagent longs dans le chat sans transformer
la conversation en pile de réponses détat temporaires.
Lorsque les brouillons de progression sont activés, OpenClaw crée un seul message visible de travail en cours uniquement après que linteraction a prouvé quelle effectue un vrai travail, le met à jour pendant que lagent lit, planifie, appelle des outils ou attend une approbation, puis transforme ce brouillon en réponse finale lorsque le canal peut le faire en toute sécurité.
Lorsque les brouillons de progression sont activés, OpenClaw crée un seul message visible
de travail en cours seulement une fois que le tour prouve quil effectue un vrai travail,
le met à jour pendant que lagent lit, planifie, appelle des outils ou attend une approbation,
puis transforme ce brouillon en réponse finale lorsque le canal peut le faire en toute sécurité.
```text
Shelling...
@ -26,7 +30,8 @@ Shelling...
🛠️ Exec: run tests
```
Utilisez les brouillons de progression lorsque vous voulez un seul message détat propre pendant un travail intensif en outils, puis la réponse finale une fois linteraction terminée.
Utilisez les brouillons de progression lorsque vous voulez un seul message détat bien rangé
pendant un travail intensif en outils, puis la réponse finale une fois le tour terminé.
## Démarrage rapide
@ -44,42 +49,59 @@ Activez les brouillons de progression par canal avec `streaming.mode: "progress"
}
```
Cela suffit généralement. OpenClaw choisira une étiquette automatique dun mot, attendra que le travail dure au moins cinq secondes ou émette un deuxième événement de travail, ajoutera des lignes de progression compactes pendant lexécution dun travail utile, et supprimera les bavardages de progression autonomes en double pour cette interaction.
Cest généralement suffisant. OpenClaw choisira automatiquement un libellé dun mot,
attendra que le travail dure au moins cinq secondes ou émette un second événement de travail,
ajoutera des lignes de progression compactes pendant que du travail utile a lieu,
et supprimera les messages de progression autonomes en double pour ce tour.
## Ce que voient les utilisateurs
Un brouillon de progression comporte deux parties :
| Partie | Objectif |
| --------------------- | ----------------------------------------------------------------------------------------- |
| Étiquette | Un titre court comme `Thinking...` ou `Shelling...`. |
| Partie | Objectif |
| --------------------- | ----------------------------------------------------------------------------------- |
| Libellé | Un court titre comme `Thinking...` ou `Shelling...`. |
| Lignes de progression | Des mises à jour dexécution compactes utilisant les mêmes libellés et icônes doutils que la sortie détaillée. |
Létiquette apparaît après que lagent commence un travail significatif et reste occupé pendant cinq secondes ou émet un deuxième événement de travail. Les réponses en texte brut uniquement naffichent pas de brouillon de progression. Les lignes de progression ne sont ajoutées que lorsque lagent émet des mises à jour de travail utiles, par exemple `🛠️ Exec`, `🔎 Web Search` ou `✍️ Write: to /tmp/file`. Par défaut, elles utilisent le même mode dexplication compact que `/verbose` ; définissez `agents.defaults.toolProgressDetail: "raw"` lors du débogage si vous voulez aussi ajouter les commandes/détails bruts.
La réponse finale remplace le brouillon lorsque cest possible ; sinon, OpenClaw envoie normalement la réponse finale et nettoie le brouillon ou cesse de le mettre à jour selon le transport du canal.
Le libellé apparaît lorsque lagent commence un travail significatif et reste occupé
pendant cinq secondes ou émet un second événement de travail. Les réponses en texte seul
naffichent pas de brouillon de progression. Les lignes de progression ne sont ajoutées
que lorsque lagent émet des mises à jour de travail utiles, par exemple `🛠️ Exec`,
`🔎 Web Search` ou `✍️ Write: to /tmp/file`.
Par défaut, elles utilisent le même mode dexplication compact que `/verbose` ; définissez
`agents.defaults.toolProgressDetail: "raw"` lors du débogage si vous voulez aussi ajouter
les commandes/détails bruts.
La réponse finale remplace le brouillon lorsque cest possible ; sinon
OpenClaw envoie la réponse finale normalement et nettoie le brouillon ou arrête de le mettre
à jour selon le transport du canal.
## Choisir un mode
`channels.<channel>.streaming.mode` contrôle le comportement visible en cours :
| Mode | Idéal pour | Ce qui apparaît dans le chat |
| ---------- | ---------------------------------------------- | --------------------------------------------------------- |
| `off` | Canaux silencieux | Uniquement la réponse finale. |
| `partial` | Observer lapparition du texte de la réponse | Un brouillon modifié avec le texte de réponse le plus récent. |
| `block` | Morceaux daperçu de réponse plus grands | Un aperçu mis à jour ou ajouté en morceaux plus grands. |
| `progress` | Interactions longues ou intensives en outils | Un brouillon détat, puis la réponse finale. |
| Mode | Idéal pour | Ce qui apparaît dans le chat |
| ---------- | ------------------------------------------ | ---------------------------------------------------- |
| `off` | Canaux silencieux | Uniquement la réponse finale. |
| `partial` | Regarder le texte de réponse apparaître | Un brouillon modifié avec le dernier texte de réponse. |
| `block` | Morceaux daperçu de réponse plus grands | Un aperçu mis à jour ou ajouté par gros morceaux. |
| `progress` | Tours longs ou avec beaucoup doutils | Un brouillon détat, puis la réponse finale. |
Choisissez `progress` lorsque les utilisateurs sintéressent davantage à « ce qui se passe » quà voir le texte de réponse défiler jeton par jeton.
Choisissez `progress` lorsque les utilisateurs se soucient davantage de « ce qui se passe »
que de voir le texte de la réponse défiler jeton par jeton.
Choisissez `partial` lorsque la réponse elle-même est le signal de progression.
Choisissez `block` lorsque vous voulez des mises à jour de brouillon daperçu en morceaux de texte plus grands. Sur Discord et Telegram, `streaming.mode: "block"` reste du streaming daperçu, pas une livraison normale par blocs. Utilisez `streaming.block.enabled` ou lancien `blockStreaming` lorsque vous voulez des réponses normales par blocs.
Choisissez `block` lorsque vous voulez des mises à jour daperçu du brouillon en morceaux
de texte plus grands. Sur Discord et Telegram, `streaming.mode: "block"` reste une diffusion
daperçu, pas une livraison normale par blocs. Utilisez `streaming.block.enabled` ou lancien
`blockStreaming` lorsque vous voulez des réponses normales par blocs.
## Configurer les étiquettes
## Configurer les libellés
Les étiquettes de progression se trouvent sous `channels.<channel>.streaming.progress`.
Les libellés de progression se trouvent sous `channels.<channel>.streaming.progress`.
Létiquette par défaut est `auto`, qui choisit dans le groupe détiquettes intégrées dOpenClaw, composées dun seul mot avec points de suspension :
Le libellé par défaut est `auto`, qui choisit dans le groupe intégré de libellés
OpenClaw dun seul mot avec points de suspension :
```text
Thinking...
@ -104,7 +126,7 @@ Snapping...
Surfacing...
```
Utilisez une étiquette fixe :
Utilisez un libellé fixe :
```json5
{
@ -121,7 +143,7 @@ Utilisez une étiquette fixe :
}
```
Utilisez votre propre groupe détiquettes automatiques :
Utilisez votre propre groupe de libellés automatiques :
```json5
{
@ -139,7 +161,7 @@ Utilisez votre propre groupe détiquettes automatiques :
}
```
Masquez létiquette et naffichez que les lignes de progression :
Masquez le libellé et affichez uniquement les lignes de progression :
```json5
{
@ -158,7 +180,9 @@ Masquez létiquette et naffichez que les lignes de progression :
## Contrôler les lignes de progression
Les lignes de progression sont activées par défaut en mode progression. Elles proviennent dévénements dexécution réels : démarrages doutils, mises à jour déléments, plans de tâche, approbations, sortie de commande, résumés de correctifs et activités similaires de lagent.
Les lignes de progression sont activées par défaut en mode progression. Elles proviennent
dévénements dexécution réels : démarrages doutils, mises à jour déléments, plans de tâche,
approbations, sortie de commande, résumés de correctifs et activité dagent similaire.
OpenClaw utilise le même formateur pour les brouillons de progression et `/verbose` :
@ -172,13 +196,16 @@ OpenClaw utilise le même formateur pour les brouillons de progression et `/verb
}
```
`"explain"` est la valeur par défaut et maintient les brouillons stables avec des libellés concis comme `🛠️ Exec: check JS syntax for /tmp/app.js`. `"raw"` ajoute la commande ou le détail sous-jacent lorsque disponible, ce qui est utile pendant le débogage mais plus bruyant dans le chat.
`"explain"` est la valeur par défaut et garde les brouillons stables avec des libellés concis
comme `🛠️ Exec: check JS syntax for /tmp/app.js`. `"raw"` ajoute la commande ou le détail
sous-jacent lorsquil est disponible, ce qui est utile pendant le débogage mais plus bruyant
dans le chat.
Par exemple, la même commande apparaît différemment selon le mode de détail :
| Mode | Ligne de progression |
| --------- | ---------------------------------------------------------------- |
| `explain` | `🛠️ Exec: check JS syntax for /tmp/app.js` |
| Mode | Ligne de progression |
| --------- | ----------------------------------------------------------------- |
| `explain` | `🛠️ Exec: check JS syntax for /tmp/app.js` |
| `raw` | `🛠️ Exec: check JS syntax for /tmp/app.js, node --check /tmp/app.js` |
Limitez le nombre de lignes qui restent visibles :
@ -198,7 +225,37 @@ Limitez le nombre de lignes qui restent visibles :
}
```
Conservez le brouillon de progression unique, mais masquez les lignes doutils et de tâches :
Les lignes de progression sont compactées automatiquement afin de réduire les redispositions
des bulles de chat pendant la modification du brouillon.
OpenClaw tronque par défaut les longues lignes de progression afin que les modifications
répétées du brouillon ne passent pas à la ligne différemment à chaque mise à jour. Le préfixe
reste lisible, et les longs détails comme les chemins ou les commandes brutes sont raccourcis
avec des points de suspension.
Slack peut rendre les lignes de progression sous forme de champs Block Kit structurés au lieu
dun seul corps de texte :
```json5
{
channels: {
slack: {
streaming: {
mode: "progress",
progress: {
render: "rich",
},
},
},
},
}
```
Le rendu riche conserve le même repli en texte brut afin que les canaux et clients qui ne
prennent pas en charge la forme plus riche puissent tout de même afficher le texte de progression
compact.
Conservez le brouillon de progression unique mais masquez les lignes doutils et de tâches :
```json5
{
@ -215,58 +272,79 @@ Conservez le brouillon de progression unique, mais masquez les lignes doutils
}
```
Avec `toolProgress: false`, OpenClaw supprime toujours les anciens messages autonomes de progression doutils pour cette interaction. Le canal reste visuellement discret jusquà la réponse finale, sauf pour létiquette si elle est configurée.
Avec `toolProgress: false`, OpenClaw supprime toujours les anciens messages autonomes de
progression des outils pour ce tour. Le canal reste visuellement silencieux jusquà la réponse
finale, sauf pour le libellé si lun est configuré.
## Comportement des canaux
Chaque canal utilise le transport le plus propre quil prend en charge :
| Canal | Transport de progression | Remarques |
| --------------- | ---------------------------------------- | ------------------------------------------------------------------------------ |
| Discord | Envoyer un message, puis le modifier. | Le texte final est modifié sur place lorsquil tient dans un seul message daperçu sûr. |
| Matrix | Envoyer un événement, puis le modifier. | La configuration de streaming au niveau du compte contrôle les brouillons au niveau du compte. |
| Microsoft Teams | Flux Teams natif dans les chats personnels. | `streaming.mode: "block"` correspond à la livraison par blocs de Teams. |
| Canal | Transport de progression | Notes |
| --------------- | ----------------------------------------- | ---------------------------------------------------------------------- |
| Discord | Envoyer un message, puis le modifier. | Le texte final est modifié sur place lorsquil tient dans un message daperçu sûr. |
| Matrix | Envoyer un événement, puis le modifier. | La configuration de streaming au niveau du compte contrôle les brouillons au niveau du compte. |
| Microsoft Teams | Flux Teams natif dans les conversations personnelles. | `streaming.mode: "block"` correspond à la livraison par blocs Teams. |
| Slack | Flux natif ou publication de brouillon modifiable. | La disponibilité du fil affecte la possibilité dutiliser le streaming natif. |
| Telegram | Envoyer un message, puis le modifier. | Les anciens brouillons visibles peuvent être remplacés pour que les horodatages finaux restent utiles. |
| Mattermost | Publication de brouillon modifiable. | Lactivité des outils est intégrée dans la même publication de type brouillon. |
| Telegram | Envoyer un message, puis le modifier. | Les anciens brouillons visibles peuvent être remplacés pour que les horodatages finaux restent utiles. |
| Mattermost | Publication de brouillon modifiable. | Lactivité des outils est intégrée à la même publication de style brouillon. |
Les canaux sans prise en charge sûre de la modification reviennent généralement aux indicateurs de saisie ou à une livraison uniquement finale.
Les canaux sans prise en charge sûre de la modification se replient généralement sur les
indicateurs de saisie ou la livraison finale uniquement.
## Finalisation
Lorsque la réponse finale est prête, OpenClaw essaie de garder le chat propre :
Lorsque la réponse finale est prête, OpenClaw tente de garder le chat propre :
- Si le brouillon peut devenir la réponse finale en toute sécurité, OpenClaw le modifie sur place.
- Si le canal utilise le streaming de progression natif, OpenClaw finalise ce flux lorsque le transport natif accepte le texte final.
- Si la réponse finale contient des médias, une invite dapprobation, une cible de réponse explicite, trop de morceaux, ou une modification/un envoi échoué, OpenClaw envoie la réponse finale par le chemin de livraison normal du canal.
- Si le canal utilise un streaming de progression natif, OpenClaw finalise ce flux
lorsque le transport natif accepte le texte final.
- Si la réponse finale contient des médias, une demande dapprobation, une cible de réponse explicite,
trop de morceaux, ou un échec de modification/envoi, OpenClaw envoie la réponse finale via
le chemin normal de livraison du canal.
Le chemin de repli est intentionnel. Il vaut mieux envoyer une nouvelle réponse finale que perdre du texte, mal placer une réponse dans un fil, ou écraser un brouillon avec une charge utile que le canal ne peut pas représenter en toute sécurité.
Le chemin de repli est intentionnel. Il vaut mieux envoyer une nouvelle réponse finale que
perdre du texte, envoyer une réponse dans le mauvais fil ou remplacer un brouillon par une charge utile
que le canal ne peut pas représenter en toute sécurité.
## Dépannage
**Je ne vois que la réponse finale.**
Vérifiez que `channels.<channel>.streaming.mode` est défini sur `progress` pour le compte ou le canal qui a traité le message. Certains chemins de groupe ou de réponse avec citation peuvent désactiver les aperçus de brouillon pour une interaction lorsque le canal ne peut pas modifier en toute sécurité le bon message.
Vérifiez que `channels.<channel>.streaming.mode` est défini sur `progress` pour le compte
ou le canal qui a traité le message. Certains chemins de groupe ou de réponse avec citation
peuvent désactiver les aperçus de brouillon pour un tour lorsque le canal ne peut pas modifier
en toute sécurité le bon message.
**Je vois létiquette, mais aucune ligne doutil.**
**Je vois le libellé mais aucune ligne doutil.**
Vérifiez `streaming.progress.toolProgress`. Si la valeur est `false`, OpenClaw conserve le comportement de brouillon unique, mais masque les lignes de progression doutils et de tâches.
Vérifiez `streaming.progress.toolProgress`. Sil vaut `false`, OpenClaw conserve le
comportement de brouillon unique mais masque les lignes de progression des outils et des tâches.
**Je vois un nouveau message final au lieu dun brouillon modifié.**
Il sagit dun repli de sécurité. Cela peut se produire pour les réponses avec médias, les réponses longues, les cibles de réponse explicites, les anciens brouillons Telegram, les cibles de fil Slack manquantes, les messages daperçu supprimés ou léchec de la finalisation dun flux natif.
Il sagit dun repli de sécurité. Cela peut se produire pour les réponses avec médias,
les longues réponses, les cibles de réponse explicites, les anciens brouillons Telegram,
les cibles de fil Slack manquantes, les messages daperçu supprimés ou léchec de finalisation
dun flux natif.
**Je vois encore des messages de progression autonomes.**
Le mode progression supprime les messages autonomes de progression doutils par défaut lorsquun brouillon est actif. Si des messages autonomes apparaissent encore, vérifiez que linteraction utilise réellement le mode progression et non `streaming.mode: "off"` ou un chemin de canal qui ne peut pas créer de brouillon pour ce message.
Le mode progression supprime les messages de progression doutils autonomes par défaut lorsquun
brouillon est actif. Si des messages autonomes apparaissent encore, vérifiez que le tour utilise
bien le mode progression et non `streaming.mode: "off"` ou un chemin de canal qui ne peut pas
créer de brouillon pour ce message.
**Teams se comporte différemment de Discord ou Telegram.**
Microsoft Teams utilise un flux natif dans les chats personnels au lieu du transport générique daperçu par envoi puis modification. Teams traite aussi `streaming.mode: "block"` comme une livraison par blocs Teams, car il ne dispose pas du même mode de blocs daperçu de brouillon utilisé par Discord et Telegram.
Microsoft Teams utilise un flux natif dans les conversations personnelles au lieu du transport
générique daperçu par envoi puis modification. Teams traite également `streaming.mode: "block"`
comme une livraison par blocs Teams, car il ne dispose pas du même mode de blocs daperçu de brouillon
utilisé par Discord et Telegram.
## Associé
## Articles connexes
- [Streaming et découpage en morceaux](/fr/concepts/streaming)
- [Streaming et découpage](/fr/concepts/streaming)
- [Messages](/fr/concepts/messages)
- [Configuration des canaux](/fr/gateway/config-channels)
- [Discord](/fr/channels/discord)

View File

@ -3,65 +3,66 @@ read_when:
- Comprendre comment la pile dassurance qualité sarticule
- Étendre qa-lab, qa-channel ou un adaptateur de transport
- Ajout de scénarios dassurance qualité adossés au dépôt
- Créer une automatisation dassurance qualité plus réaliste autour du tableau de bord Gateway
summary: 'Vue densemble de la pile QA : qa-lab, qa-channel, scénarios adossés au dépôt, voies de transport en direct, adaptateurs de transport et rapports.'
title: Vue densemble de lassurance qualité
- Créer une automatisation de lassurance qualité plus réaliste autour du tableau de bord Gateway
summary: 'Présentation de la pile QA : qa-lab, qa-channel, scénarios adossés au dépôt, voies de transport en direct, adaptateurs de transport et rapports.'
title: Présentation de lassurance qualité
x-i18n:
generated_at: "2026-05-04T02:23:55Z"
generated_at: "2026-05-04T07:04:39Z"
model: gpt-5.5
provider: openai
source_hash: 0b376767b967a51cc8a45ca5ce420f78067b52e6368d2abe921ffed533f6f9ba
source_hash: 067f5aa0831724659ae36d548ef2e7bd28b40aad9cef45f325a01a2748003b29
source_path: concepts/qa-e2e-automation.md
workflow: 16
---
La stack QA privée sert à exercer OpenClaw dune manière plus réaliste,
structurée comme un canal, quun simple test unitaire ne peut le faire.
La pile QA privée vise à exercer OpenClaw dune manière plus réaliste,
façonnée par les canaux, que ne le peut un seul test unitaire.
Éléments actuels :
- `extensions/qa-channel` : canal de messages synthétique avec surfaces de DM, canal, fil,
- `extensions/qa-channel` : canal de messages synthétique avec surfaces de MP, canal, thread,
réaction, modification et suppression.
- `extensions/qa-lab` : interface de débogage et bus QA pour observer la transcription,
- `extensions/qa-lab` : UI de débogage et bus QA pour observer la transcription,
injecter des messages entrants et exporter un rapport Markdown.
- `extensions/qa-matrix`, futurs plugins de runner : adaptateurs de transport live qui
- `extensions/qa-matrix`, futurs plugins de runner : adaptateurs de transport en direct qui
pilotent un vrai canal dans un Gateway QA enfant.
- `qa/` : ressources initiales adossées au dépôt pour la tâche de lancement et les scénarios
QA de référence.
- [Mantis](/fr/concepts/mantis) : vérification live avant et après pour les bugs qui
nécessitent de vrais transports, des captures décran de navigateur, un état de VM et des preuves de PR.
- `qa/` : ressources damorçage adossées au dépôt pour la tâche de lancement et les scénarios QA
de référence.
- [Mantis](/fr/concepts/mantis) : vérification en direct avant et après pour les bugs qui
nécessitent de vrais transports, des captures décran de navigateur, létat dune VM et des preuves de PR.
## Surface de commande
Chaque flux QA sexécute sous `pnpm openclaw qa <subcommand>`. Beaucoup ont des alias de scripts `pnpm qa:*` ; les deux formes sont prises en charge.
Chaque flux QA sexécute sous `pnpm openclaw qa <subcommand>`. Beaucoup ont des alias de script `pnpm qa:*` ;
les deux formes sont prises en charge.
| Commande | Objectif |
| --------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `qa run` | Auto-vérification QA intégrée ; écrit un rapport Markdown. |
| `qa suite` | Exécuter les scénarios adossés au dépôt contre la lane Gateway QA. Alias : `pnpm openclaw qa suite --runner multipass` pour une VM Linux jetable. |
| `qa coverage` | Afficher linventaire Markdown de couverture des scénarios (`--json` pour une sortie machine). |
| `qa parity-report` | Comparer deux fichiers `qa-suite-summary.json` et écrire le rapport de parité agentique. |
| `qa character-eval` | Exécuter le scénario QA de caractère sur plusieurs modèles live avec un rapport jugé. Voir [Rapports](#reporting). |
| `qa manual` | Exécuter une invite ponctuelle contre la lane du fournisseur/modèle sélectionné. |
| `qa ui` | Démarrer linterface de débogage QA et le bus QA local (alias : `pnpm qa:lab:ui`). |
| `qa docker-build-image` | Construire limage Docker QA préintégrée. |
| `qa docker-scaffold` | Écrire un échafaudage docker-compose pour le tableau de bord QA + la lane Gateway. |
| `qa up` | Construire le site QA, démarrer la stack adossée à Docker, afficher lURL (alias : `pnpm qa:lab:up` ; la variante `:fast` ajoute `--use-prebuilt-image --bind-ui-dist --skip-ui-build`). |
| `qa aimock` | Démarrer uniquement le serveur fournisseur AIMock. |
| `qa mock-openai` | Démarrer uniquement le serveur fournisseur `mock-openai` sensible aux scénarios. |
| `qa credentials doctor` / `add` / `list` / `remove` | Gérer le pool partagé didentifiants Convex. |
| `qa matrix` | Lane de transport live contre un homeserver Tuwunel jetable. Voir [QA Matrix](/fr/concepts/qa-matrix). |
| `qa telegram` | Lane de transport live contre un vrai groupe Telegram privé. |
| `qa discord` | Lane de transport live contre un vrai canal de guilde Discord privé. |
| `qa slack` | Lane de transport live contre un vrai canal Slack privé. |
| `qa mantis` | Runner de vérification avant et après pour les bugs de transport live, avec preuves de réactions de statut Discord et smoke Crabbox desktop/navigateur. Voir [Mantis](/fr/concepts/mantis). |
| Commande | Objectif |
| --------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `qa run` | Auto-vérification QA intégrée ; écrit un rapport Markdown. |
| `qa suite` | Exécuter les scénarios adossés au dépôt contre la voie du Gateway QA. Alias : `pnpm openclaw qa suite --runner multipass` pour une VM Linux jetable. |
| `qa coverage` | Afficher linventaire Markdown de couverture des scénarios (`--json` pour une sortie machine). |
| `qa parity-report` | Comparer deux fichiers `qa-suite-summary.json` et écrire le rapport de parité agentique. |
| `qa character-eval` | Exécuter le scénario QA de caractère sur plusieurs modèles en direct avec un rapport évalué. Voir [Rapports](#reporting). |
| `qa manual` | Exécuter une invite ponctuelle contre la voie fournisseur/modèle sélectionnée. |
| `qa ui` | Démarrer lUI de débogage QA et le bus QA local (alias : `pnpm qa:lab:ui`). |
| `qa docker-build-image` | Construire limage Docker QA précuite. |
| `qa docker-scaffold` | Écrire un échafaudage docker-compose pour le tableau de bord QA + la voie Gateway. |
| `qa up` | Construire le site QA, démarrer la pile adossée à Docker, afficher lURL (alias : `pnpm qa:lab:up` ; la variante `:fast` ajoute `--use-prebuilt-image --bind-ui-dist --skip-ui-build`). |
| `qa aimock` | Démarrer uniquement le serveur fournisseur AIMock. |
| `qa mock-openai` | Démarrer uniquement le serveur fournisseur `mock-openai` sensible aux scénarios. |
| `qa credentials doctor` / `add` / `list` / `remove` | Gérer le pool partagé didentifiants Convex. |
| `qa matrix` | Voie de transport en direct contre un homeserver Tuwunel jetable. Voir [Matrix QA](/fr/concepts/qa-matrix). |
| `qa telegram` | Voie de transport en direct contre un vrai groupe Telegram privé. |
| `qa discord` | Voie de transport en direct contre un vrai canal de guilde Discord privé. |
| `qa slack` | Voie de transport en direct contre un vrai canal Slack privé. |
| `qa mantis` | Runner de vérification avant et après pour les bugs de transport en direct, avec preuves de réactions de statut Discord, smoke desktop/navigateur Crabbox et smoke Slack-dans-VNC. Voir [Mantis](/fr/concepts/mantis). |
## Flux opérateur
Le flux opérateur QA actuel est un site QA à deux panneaux :
- Gauche : tableau de bord Gateway (Control UI) avec lagent.
- Droite : QA Lab, affichant la transcription de style Slack et le plan de scénario.
- Droite : QA Lab, affichant la transcription façon Slack et le plan de scénario.
Exécutez-le avec :
@ -69,13 +70,13 @@ Exécutez-le avec :
pnpm qa:lab:up
```
Cela construit le site QA, démarre la lane Gateway adossée à Docker et expose la
page QA Lab où un opérateur ou une boucle dautomatisation peut donner une mission
QA à lagent, observer le vrai comportement du canal et enregistrer ce qui a fonctionné,
échoué ou est resté bloqué.
Cela construit le site QA, démarre la voie Gateway adossée à Docker et expose la
page QA Lab où un opérateur ou une boucle dautomatisation peut donner à lagent une mission
QA, observer le vrai comportement du canal et consigner ce qui a fonctionné, échoué ou
est resté bloqué.
Pour une itération plus rapide de linterface QA Lab sans reconstruire limage Docker à chaque fois,
démarrez la stack avec un bundle QA Lab monté en bind :
Pour itérer plus rapidement sur lUI QA Lab sans reconstruire limage Docker à chaque fois,
démarrez la pile avec un paquet QA Lab monté en bind :
```bash
pnpm openclaw qa docker-build-image
@ -84,40 +85,40 @@ pnpm qa:lab:up:fast
pnpm qa:lab:watch
```
`qa:lab:up:fast` garde les services Docker sur une image préconstruite et monte en bind
`qa:lab:up:fast` conserve les services Docker sur une image préconstruite et monte en bind
`extensions/qa-lab/web/dist` dans le conteneur `qa-lab`. `qa:lab:watch`
reconstruit ce bundle lors des changements, et le navigateur se recharge automatiquement lorsque le hash des ressources QA Lab
reconstruit ce paquet à chaque changement, et le navigateur se recharge automatiquement lorsque le hash des ressources QA Lab
change.
Pour un smoke de trace OpenTelemetry local, exécutez :
Pour un smoke local de trace OpenTelemetry, exécutez :
```bash
pnpm qa:otel:smoke
```
Ce script démarre un récepteur de traces OTLP/HTTP local, exécute le scénario QA
`otel-trace-smoke` avec le plugin `diagnostics-otel` activé, puis
Ce script démarre un récepteur local de traces OTLP/HTTP, exécute le scénario QA
`otel-trace-smoke` avec le Plugin `diagnostics-otel` activé, puis
décode les spans protobuf exportés et vérifie la forme critique pour la release :
`openclaw.run`, `openclaw.harness.run`, `openclaw.model.call`,
`openclaw.context.assembled` et `openclaw.message.delivery` doivent être présents ;
les appels de modèle ne doivent pas exporter `StreamAbandoned` lors des tours réussis ; les ID de diagnostic bruts et les attributs
`openclaw.content.*` doivent rester hors de la trace. Il écrit
les appels de modèle ne doivent pas exporter `StreamAbandoned` sur les tours réussis ; les ID de diagnostic bruts et les
attributs `openclaw.content.*` doivent rester hors de la trace. Il écrit
`otel-smoke-summary.json` à côté des artefacts de la suite QA.
La QA dobservabilité reste réservée aux checkouts source. Le tarball npm omet volontairement
QA Lab, donc les lanes de release Docker de package nexécutent pas de commandes `qa`. Utilisez
`pnpm qa:otel:smoke` depuis un checkout source construit lorsque vous modifiez linstrumentation
La QA dobservabilité reste réservée au checkout source. Le tarball npm omet volontairement
QA Lab, donc les voies de release Docker du package nexécutent pas de commandes `qa`. Utilisez
`pnpm qa:otel:smoke` depuis un checkout source construit lors de modifications de linstrumentation
de diagnostic.
Pour une lane smoke Matrix avec transport réel, exécutez :
Pour une voie smoke Matrix avec transport réel, exécutez :
```bash
pnpm openclaw qa matrix --profile fast --fail-fast
```
La référence CLI complète, le catalogue des profils/scénarios, les variables denvironnement et la disposition des artefacts de cette lane se trouvent dans [QA Matrix](/fr/concepts/qa-matrix). En bref : elle provisionne un homeserver Tuwunel jetable dans Docker, enregistre des utilisateurs temporaires driver/SUT/observateur, exécute le vrai plugin Matrix dans un Gateway QA enfant limité à ce transport (sans `qa-channel`), puis écrit un rapport Markdown, un résumé JSON, un artefact dévénements observés et un journal de sortie combiné sous `.artifacts/qa-e2e/matrix-<timestamp>/`.
La référence CLI complète, le catalogue de profils/scénarios, les variables denvironnement et lagencement des artefacts de cette voie se trouvent dans [Matrix QA](/fr/concepts/qa-matrix). En bref : elle provisionne un homeserver Tuwunel jetable dans Docker, enregistre des utilisateurs temporaires driver/SUT/observer, exécute le vrai Plugin Matrix dans un Gateway QA enfant limité à ce transport (pas de `qa-channel`), puis écrit un rapport Markdown, un résumé JSON, un artefact dévénements observés et un journal de sortie combiné sous `.artifacts/qa-e2e/matrix-<timestamp>/`.
Pour les lanes smoke Telegram, Discord et Slack avec transport réel :
Pour les voies smoke à transport réel Telegram, Discord et Slack :
```bash
pnpm openclaw qa telegram
@ -125,73 +126,89 @@ pnpm openclaw qa discord
pnpm openclaw qa slack
```
Elles ciblent un vrai canal préexistant avec deux bots (driver + SUT). Les variables denvironnement requises, les listes de scénarios, les artefacts de sortie et le pool didentifiants Convex sont documentés dans la [référence QA Telegram, Discord et Slack](#telegram-discord-and-slack-qa-reference) ci-dessous.
Elles ciblent un vrai canal préexistant avec deux bots (driver + SUT). Les variables denvironnement requises, listes de scénarios, artefacts de sortie et le pool didentifiants Convex sont documentés dans la [référence QA Telegram, Discord et Slack](#telegram-discord-and-slack-qa-reference) ci-dessous.
Avant dutiliser des identifiants live mutualisés, exécutez :
Pour une exécution complète de VM desktop Slack avec secours VNC, exécutez :
```bash
pnpm openclaw qa mantis slack-desktop-smoke \
--gateway-setup \
--scenario slack-canary \
--keep-lease
```
Cette commande loue une machine desktop/navigateur Crabbox, exécute la voie live Slack
dans la VM, ouvre Slack Web dans le navigateur VNC, capture le bureau et
copie `slack-qa/` ainsi que `slack-desktop-smoke.png` dans le répertoire dartefacts
Mantis. Réutilisez `--lease-id <cbx_...>` après vous être connecté manuellement à Slack Web
via VNC. Avec `--gateway-setup`, Mantis laisse un Gateway Slack OpenClaw persistant
en cours dexécution dans la VM sur le port `38973` ; sans cette option, la commande exécute la
voie QA Slack bot-à-bot normale et quitte après la capture des artefacts.
Avant dutiliser les identifiants live mutualisés, exécutez :
```bash
pnpm openclaw qa credentials doctor
```
Le doctor vérifie lenvironnement du broker Convex, valide les réglages dendpoint et vérifie laccessibilité admin/liste lorsque le secret mainteneur est présent. Il ne signale que létat défini/manquant des secrets.
Le doctor vérifie lenvironnement du broker Convex, valide les paramètres dendpoint et vérifie laccessibilité admin/list lorsque le secret mainteneur est présent. Il ne signale que létat défini/manquant des secrets.
## Couverture du transport live
## Couverture des transports en direct
Les lanes de transport live partagent un seul contrat au lieu dinventer chacune leur propre forme de liste de scénarios. `qa-channel` est la suite large de comportements produit synthétiques et ne fait pas partie de la matrice de couverture du transport live.
Les voies de transport en direct partagent un seul contrat au lieu dinventer chacune leur propre forme de liste de scénarios. `qa-channel` est la large suite synthétique de comportement produit et ne fait pas partie de la matrice de couverture des transports en direct.
| Lane | Canary | Filtrage des mentions | Bot-à-bot | Blocage par allowlist | Réponse de premier niveau | Reprise après redémarrage | Suivi de fil | Isolation de fil | Observation des réactions | Commande daide | Enregistrement de commande native |
| -------- | ------ | --------------------- | ---------- | --------------------- | ------------------------- | ------------------------- | ------------ | ---------------- | ------------------------- | --------------- | ---------------------------------- |
| Matrix | x | x | x | x | x | x | x | x | x | | |
| Telegram | x | x | x | | | | | | | x | |
| Discord | x | x | x | | | | | | | | x |
| Slack | x | x | x | | | | | | | | |
| Voie | Canary | Filtrage des mentions | Bot-à-bot | Blocage par liste dautorisation | Réponse de premier niveau | Reprise après redémarrage | Suivi de thread | Isolation de thread | Observation des réactions | Commande daide | Enregistrement de commande native |
| -------- | ------ | --------------------- | ---------- | -------------------------------- | ------------------------- | ------------------------- | ---------------- | ------------------- | -------------------------- | --------------- | --------------------------------- |
| Matrix | x | x | x | x | x | x | x | x | x | | |
| Telegram | x | x | x | | | | | | | x | |
| Discord | x | x | x | | | | | | | | x |
| Slack | x | x | x | | | | | | | | |
Cela garde `qa-channel` comme suite large de comportements produit tandis que Matrix,
Telegram et les futurs transports live partagent une checklist explicite de contrat
de transport.
Cela conserve `qa-channel` comme large suite de comportement produit tandis que Matrix,
Telegram et les futurs transports en direct partagent une checklist explicite de contrat de transport.
Pour une lane VM Linux jetable sans introduire Docker dans le chemin QA, exécutez :
Pour une voie VM Linux jetable sans intégrer Docker dans le chemin QA, exécutez :
```bash
pnpm openclaw qa suite --runner multipass --scenario channel-chat-baseline
```
Cela démarre un invité Multipass neuf, installe les dépendances, construit OpenClaw
Cela démarre un nouvel invité Multipass, installe les dépendances, construit OpenClaw
dans linvité, exécute `qa suite`, puis recopie le rapport QA normal et le
résumé dans `.artifacts/qa-e2e/...` sur lhôte.
Il réutilise le même comportement de sélection de scénarios que `qa suite` sur lhôte.
Les exécutions de suite sur lhôte et Multipass exécutent par défaut plusieurs scénarios sélectionnés en parallèle
avec des workers Gateway isolés. `qa-channel` utilise une concurrence par défaut de
4, plafonnée par le nombre de scénarios sélectionnés. Utilisez `--concurrency <count>` pour ajuster
le nombre de workers, ou `--concurrency 1` pour une exécution série.
Les exécutions de suites hôte et Multipass exécutent plusieurs scénarios sélectionnés en parallèle
avec des workers Gateway isolés par défaut. `qa-channel` utilise par défaut une concurrence
de 4, limitée par le nombre de scénarios sélectionnés. Utilisez `--concurrency <count>` pour ajuster
le nombre de workers, ou `--concurrency 1` pour une exécution en série.
La commande se termine avec un code non nul lorsquun scénario échoue. Utilisez `--allow-failures` lorsque
vous voulez des artefacts sans code de sortie en échec.
vous voulez obtenir des artefacts sans code de sortie déchec.
Les exécutions live transmettent les entrées dauthentification QA prises en charge et pratiques pour
linvité : clés de fournisseur basées sur lenvironnement, chemin de configuration du fournisseur live QA et
linvité : clés de fournisseur basées sur lenvironnement, chemin de configuration du fournisseur live QA, et
`CODEX_HOME` lorsquil est présent. Gardez `--output-dir` sous la racine du dépôt afin que linvité
puisse réécrire via lespace de travail monté.
## Référence QA Telegram, Discord et Slack
## Référence QA pour Telegram, Discord et Slack
Matrix a une [page dédiée](/fr/concepts/qa-matrix) en raison de son nombre de scénarios et du provisionnement de homeserver adossé à Docker. Telegram, Discord et Slack sont plus petits — une poignée de scénarios chacun, sans système de profil, contre des canaux réels préexistants — leur référence se trouve donc ici.
Matrix dispose dune [page dédiée](/fr/concepts/qa-matrix) en raison de son nombre de scénarios et du provisionnement de homeserver appuyé par Docker. Telegram, Discord et Slack sont plus petits — quelques scénarios chacun, aucun système de profil, contre des canaux réels préexistants — leur référence se trouve donc ici.
### Flags CLI partagés
### Options CLI partagées
Ces lanes senregistrent via `extensions/qa-lab/src/live-transports/shared/live-transport-cli.ts` et acceptent les mêmes flags :
Ces lanes senregistrent via `extensions/qa-lab/src/live-transports/shared/live-transport-cli.ts` et acceptent les mêmes options :
| Option | Par défaut | Description |
| ------------------------------------- | --------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------- |
| `--scenario <id>` | — | Exécute uniquement ce scénario. Peut être répétée. |
| `--output-dir <path>` | `<repo>/.artifacts/qa-e2e/{telegram,discord,slack}-<timestamp>` | Emplacement où sont écrits les rapports, le résumé, les messages observés et le journal de sortie. Les chemins relatifs sont résolus par rapport à `--repo-root`. |
| `--repo-root <path>` | `process.cwd()` | Racine du dépôt lors dun appel depuis un cwd neutre. |
| `--sut-account <id>` | `sut` | ID de compte temporaire dans la configuration du Gateway QA. |
| `--provider-mode <mode>` | `live-frontier` | `mock-openai` ou `live-frontier` (`live-openai` hérité fonctionne encore). |
| `--model <ref>` / `--alt-model <ref>` | modèle par défaut du fournisseur | Références des modèles principal et secondaire. |
| `--fast` | désactivé | Mode rapide du fournisseur, lorsque pris en charge. |
| `--credential-source <env\|convex>` | `env` | Consultez [pool didentifiants Convex](#convex-credential-pool). |
| `--credential-role <maintainer\|ci>` | `ci` dans CI, sinon `maintainer` | Rôle utilisé lorsque `--credential-source convex`. |
| Option | Par défaut | Description |
| ------------------------------------- | --------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------- |
| `--scenario <id>` | — | Exécute uniquement ce scénario. Répétable. |
| `--output-dir <path>` | `<repo>/.artifacts/qa-e2e/{telegram,discord,slack}-<timestamp>` | Emplacement où les rapports, résumés, messages observés et le journal de sortie sont écrits. Les chemins relatifs sont résolus par rapport à `--repo-root`. |
| `--repo-root <path>` | `process.cwd()` | Racine du dépôt lors dun appel depuis un cwd neutre. |
| `--sut-account <id>` | `sut` | Id de compte temporaire dans la configuration QA Gateway. |
| `--provider-mode <mode>` | `live-frontier` | `mock-openai` ou `live-frontier` (lancien `live-openai` fonctionne toujours). |
| `--model <ref>` / `--alt-model <ref>` | valeur par défaut du fournisseur | Réfs de modèle primaire/alternatif. |
| `--fast` | désactivé | Mode rapide du fournisseur lorsque pris en charge. |
| `--credential-source <env\|convex>` | `env` | Voir [Pool didentifiants Convex](#convex-credential-pool). |
| `--credential-role <maintainer\|ci>` | `ci` en CI, sinon `maintainer` | Rôle utilisé lorsque `--credential-source convex`. |
Chaque voie se termine avec un code non nul en cas déchec dun scénario. `--allow-failures` écrit les artefacts sans définir de code de sortie déchec.
Chaque lane se termine avec un code non nul en cas de scénario échoué. `--allow-failures` écrit les artefacts sans définir de code de sortie déchec.
### QA Telegram
@ -199,17 +216,17 @@ Chaque voie se termine avec un code non nul en cas déchec dun scénario.
pnpm openclaw qa telegram
```
Cible un vrai groupe privé Telegram avec deux bots distincts (pilote + SUT). Le bot SUT doit avoir un nom dutilisateur Telegram ; lobservation bot-à-bot fonctionne mieux lorsque les deux bots ont **Bot-to-Bot Communication Mode** activé dans `@BotFather`.
Cible un vrai groupe privé Telegram avec deux bots distincts (pilote + SUT). Le bot SUT doit avoir un nom dutilisateur Telegram ; lobservation bot-à-bot fonctionne mieux lorsque les deux bots ont le **Bot-to-Bot Communication Mode** activé dans `@BotFather`.
Variables denvironnement requises lorsque `--credential-source env` :
Env requis lorsque `--credential-source env` :
- `OPENCLAW_QA_TELEGRAM_GROUP_ID`ID de discussion numérique (chaîne).
- `OPENCLAW_QA_TELEGRAM_GROUP_ID`id numérique du chat (chaîne).
- `OPENCLAW_QA_TELEGRAM_DRIVER_BOT_TOKEN`
- `OPENCLAW_QA_TELEGRAM_SUT_BOT_TOKEN`
Optionnel :
Facultatif :
- `OPENCLAW_QA_TELEGRAM_CAPTURE_CONTENT=1` conserve le corps des messages dans les artefacts de messages observés (masqués par défaut).
- `OPENCLAW_QA_TELEGRAM_CAPTURE_CONTENT=1` conserve les corps de messages dans les artefacts de messages observés (masqués par défaut).
Scénarios (`extensions/qa-lab/src/live-transports/telegram/telegram-live.runtime.ts:44`) :
@ -225,7 +242,7 @@ Scénarios (`extensions/qa-lab/src/live-transports/telegram/telegram-live.runtim
Artefacts de sortie :
- `telegram-qa-report.md`
- `telegram-qa-summary.json` — inclut le RTT par réponse (envoi par le pilote → réponse SUT observée) en commençant par le canary.
- `telegram-qa-summary.json` — inclut le RTT par réponse (envoi par le pilote → réponse SUT observée) à partir du canari.
- `telegram-qa-observed-messages.json` — corps masqués sauf si `OPENCLAW_QA_TELEGRAM_CAPTURE_CONTENT=1`.
### QA Discord
@ -234,26 +251,26 @@ Artefacts de sortie :
pnpm openclaw qa discord
```
Cible un vrai canal de guilde privé Discord avec deux bots : un bot pilote contrôlé par le harnais et un bot SUT démarré par le Gateway OpenClaw enfant via le Plugin Discord intégré. Vérifie la gestion des mentions de canal, que le bot SUT a enregistré la commande native `/help` auprès de Discord, ainsi que les scénarios déléments de preuve Mantis à activation explicite.
Cible un vrai canal de guilde privée Discord avec deux bots : un bot pilote contrôlé par le harnais et un bot SUT démarré par le Gateway OpenClaw enfant via le Plugin Discord groupé. Vérifie la gestion des mentions de canal, que le bot SUT a enregistré la commande native `/help` auprès de Discord, ainsi que les scénarios déléments probants Mantis avec inscription explicite.
Variables denvironnement requises lorsque `--credential-source env` :
Env requis lorsque `--credential-source env` :
- `OPENCLAW_QA_DISCORD_GUILD_ID`
- `OPENCLAW_QA_DISCORD_CHANNEL_ID`
- `OPENCLAW_QA_DISCORD_DRIVER_BOT_TOKEN`
- `OPENCLAW_QA_DISCORD_SUT_BOT_TOKEN`
- `OPENCLAW_QA_DISCORD_SUT_APPLICATION_ID` — doit correspondre à lID utilisateur du bot SUT renvoyé par Discord (sinon la voie échoue rapidement).
- `OPENCLAW_QA_DISCORD_SUT_APPLICATION_ID` — doit correspondre à lid utilisateur du bot SUT renvoyé par Discord (sinon la lane échoue rapidement).
Optionnel :
Facultatif :
- `OPENCLAW_QA_DISCORD_CAPTURE_CONTENT=1` conserve le corps des messages dans les artefacts de messages observés.
- `OPENCLAW_QA_DISCORD_CAPTURE_CONTENT=1` conserve les corps de messages dans les artefacts de messages observés.
Scénarios (`extensions/qa-lab/src/live-transports/discord/discord-live.runtime.ts:36`) :
- `discord-canary`
- `discord-mention-gating`
- `discord-native-help-command-registration`
- `discord-status-reactions-tool-only` — scénario Mantis à activation explicite. Sexécute seul parce quil bascule le SUT en réponses de guilde toujours actives et uniquement via outils avec `messages.statusReactions.enabled=true`, puis capture une chronologie de réactions REST ainsi quun artefact visuel HTML/PNG.
- `discord-status-reactions-tool-only` — scénario Mantis avec inscription explicite. Sexécute seul car il bascule le SUT en réponses de guilde toujours actives et uniquement par outil avec `messages.statusReactions.enabled=true`, puis capture une chronologie de réactions REST plus un artefact visuel HTML/PNG.
Exécutez explicitement le scénario de réactions de statut Mantis :
@ -279,18 +296,18 @@ Artefacts de sortie :
pnpm openclaw qa slack
```
Cible un vrai canal privé Slack avec deux bots distincts : un bot pilote contrôlé par le harnais et un bot SUT démarré par le Gateway OpenClaw enfant via le Plugin Slack intégré.
Cible un vrai canal privé Slack avec deux bots distincts : un bot pilote contrôlé par le harnais et un bot SUT démarré par le Gateway OpenClaw enfant via le Plugin Slack groupé.
Variables denvironnement requises lorsque `--credential-source env` :
Env requis lorsque `--credential-source env` :
- `OPENCLAW_QA_SLACK_CHANNEL_ID`
- `OPENCLAW_QA_SLACK_DRIVER_BOT_TOKEN`
- `OPENCLAW_QA_SLACK_SUT_BOT_TOKEN`
- `OPENCLAW_QA_SLACK_SUT_APP_TOKEN`
Optionnel :
Facultatif :
- `OPENCLAW_QA_SLACK_CAPTURE_CONTENT=1` conserve le corps des messages dans les artefacts de messages observés.
- `OPENCLAW_QA_SLACK_CAPTURE_CONTENT=1` conserve les corps de messages dans les artefacts de messages observés.
Scénarios (`extensions/qa-lab/src/live-transports/slack/slack-live.runtime.ts:39`) :
@ -305,114 +322,128 @@ Artefacts de sortie :
### Pool didentifiants Convex
Les voies Telegram, Discord et Slack peuvent louer des identifiants depuis un pool Convex partagé au lieu de lire les variables denvironnement ci-dessus. Passez `--credential-source convex` (ou définissez `OPENCLAW_QA_CREDENTIAL_SOURCE=convex`) ; QA Lab acquiert un bail exclusif, lui envoie des Heartbeats pendant toute la durée de lexécution, puis le libère à larrêt. Les types de pool sont `"telegram"`, `"discord"` et `"slack"`.
Les lanes Telegram, Discord et Slack peuvent louer des identifiants depuis un pool Convex partagé au lieu de lire les variables denvironnement ci-dessus. Passez `--credential-source convex` (ou définissez `OPENCLAW_QA_CREDENTIAL_SOURCE=convex`) ; QA Lab acquiert un bail exclusif, lui envoie des Heartbeats pendant toute la durée de lexécution, puis le libère à larrêt. Les types de pool sont `"telegram"`, `"discord"` et `"slack"`.
Formes de charge utile validées par le courtier sur `admin/add` :
Formes de payload que le broker valide sur `admin/add` :
- Telegram (`kind: "telegram"`) : `{ groupId: string, driverToken: string, sutToken: string }``groupId` doit être une chaîne dID de discussion numérique.
- Telegram (`kind: "telegram"`) : `{ groupId: string, driverToken: string, sutToken: string }``groupId` doit être une chaîne de chat-id numérique.
- Discord (`kind: "discord"`) : `{ guildId: string, channelId: string, driverBotToken: string, sutBotToken: string, sutApplicationId: string }`.
Les variables denvironnement opérationnelles et le contrat de point de terminaison du courtier Convex se trouvent dans [Tests → Identifiants Telegram partagés via Convex](/fr/help/testing#shared-telegram-credentials-via-convex-v1) (le nom de la section est antérieur à la prise en charge de Discord ; la sémantique du courtier est identique pour les deux types).
Les variables denvironnement opérationnelles et le contrat dendpoint du broker Convex se trouvent dans [Tests → Identifiants Telegram partagés via Convex](/fr/help/testing#shared-telegram-credentials-via-convex-v1) (le nom de la section est antérieur à la prise en charge de Discord ; les sémantiques du broker sont identiques pour les deux types).
## Graines basées sur le dépôt
## Seeds appuyés par le dépôt
Les ressources de graines se trouvent dans `qa/` :
Les ressources de seed se trouvent dans `qa/` :
- `qa/scenarios/index.md`
- `qa/scenarios/<theme>/*.md`
Elles sont intentionnellement dans git afin que le plan QA soit visible à la fois par les humains et par lagent.
Elles sont volontairement dans git afin que le plan QA soit visible à la fois pour les humains et pour
lagent.
`qa-lab` doit rester un exécuteur markdown générique. Chaque fichier markdown de scénario est la source de vérité dune exécution de test et doit définir :
`qa-lab` doit rester un runner Markdown générique. Chaque fichier Markdown de scénario est
la source de vérité pour une exécution de test et doit définir :
- les métadonnées du scénario
- les métadonnées optionnelles de catégorie, capacité, voie et risque
- les références de documentation et de code
- les exigences optionnelles de Plugin
- le correctif optionnel de configuration du Gateway
- les métadonnées de scénario
- des métadonnées facultatives de catégorie, capacité, lane et risque
- les références de docs et de code
- les exigences facultatives de Plugin
- un patch facultatif de configuration Gateway
- le `qa-flow` exécutable
La surface dexécution réutilisable qui sous-tend `qa-flow` peut rester générique et transversale. Par exemple, les scénarios markdown peuvent combiner des helpers côté transport avec des helpers côté navigateur qui pilotent linterface Control UI embarquée via la jonction Gateway `browser.request` sans ajouter dexécuteur spécial.
La surface runtime réutilisable qui soutient `qa-flow` est autorisée à rester générique
et transversale. Par exemple, les scénarios Markdown peuvent combiner des helpers côté transport
avec des helpers côté navigateur qui pilotent la Control UI intégrée via le
seam Gateway `browser.request` sans ajouter de runner spécial.
Les fichiers de scénario doivent être regroupés par capacité produit plutôt que par dossier de larborescence source. Gardez les ID de scénario stables lorsque les fichiers sont déplacés ; utilisez `docsRefs` et `codeRefs` pour la traçabilité de limplémentation.
Les fichiers de scénario doivent être regroupés par capacité produit plutôt que par dossier
de larborescence source. Gardez les IDs de scénario stables lorsque les fichiers sont déplacés ; utilisez `docsRefs` et `codeRefs`
pour la traçabilité de limplémentation.
La liste de référence doit rester assez large pour couvrir :
La liste de référence doit rester suffisamment large pour couvrir :
- les discussions en DM et en canal
- le comportement des fils
- les chats DM et canal
- le comportement des threads
- le cycle de vie des actions de message
- les rappels cron
- le rappel de mémoire
- les rappels Cron
- le rappel mémoire
- le changement de modèle
- le transfert à un sous-agent
- la lecture du dépôt et la lecture de la documentation
- une petite tâche de build telle que Lobster Invaders
- la lecture du dépôt et de la documentation
- une petite tâche de build comme Lobster Invaders
## Voies de simulation de fournisseur
## Lanes de mock de fournisseur
`qa suite` dispose de deux voies locales de simulation de fournisseur :
`qa suite` dispose de deux lanes locales de mock de fournisseur :
- `mock-openai` est le mock OpenClaw conscient des scénarios. Il reste la voie de mock déterministe par défaut pour la QA basée sur le dépôt et les portes de parité.
- `aimock` démarre un serveur fournisseur basé sur AIMock pour la couverture expérimentale du protocole, des fixtures, de lenregistrement/relecture et du chaos. Il est additif et ne remplace pas le répartiteur de scénarios `mock-openai`.
- `mock-openai` est le mock OpenClaw sensible aux scénarios. Il reste la lane de mock
déterministe par défaut pour la QA appuyée par le dépôt et les gates de parité.
- `aimock` démarre un serveur fournisseur appuyé par AIMock pour la couverture expérimentale de protocole,
fixtures, enregistrement/relecture et chaos. Il est additif et ne
remplace pas le répartiteur de scénarios `mock-openai`.
Limplémentation des voies de fournisseur se trouve sous `extensions/qa-lab/src/providers/`. Chaque fournisseur possède ses valeurs par défaut, le démarrage de son serveur local, la configuration de modèle du Gateway, ses besoins de préparation de profil dauthentification et ses indicateurs de capacité live/mock. Le code partagé de suite et de Gateway doit passer par le registre des fournisseurs au lieu de créer des branches sur les noms de fournisseurs.
Limplémentation des lanes de fournisseur se trouve sous `extensions/qa-lab/src/providers/`.
Chaque fournisseur possède ses valeurs par défaut, le démarrage de serveur local, la configuration de modèle Gateway,
les besoins de staging des profils dauthentification, ainsi que les flags de capacité live/mock. Le code de suite partagée et
de Gateway doit passer par le registre des fournisseurs au lieu de bifurquer sur
les noms de fournisseurs.
## Adaptateurs de transport
`qa-lab` possède une jonction de transport générique pour les scénarios QA markdown. `qa-channel` est le premier adaptateur sur cette jonction, mais la cible de conception est plus large : les futurs canaux réels ou synthétiques doivent se brancher dans le même exécuteur de suite au lieu dajouter un exécuteur QA propre au transport.
`qa-lab` possède un seam de transport générique pour les scénarios QA Markdown. `qa-channel` est le premier adaptateur sur ce seam, mais la cible de conception est plus large : les futurs canaux réels ou synthétiques doivent se brancher sur le même runner de suite au lieu dajouter un runner QA spécifique au transport.
Au niveau de larchitecture, la séparation est la suivante :
Au niveau de larchitecture, la séparation est :
- `qa-lab` possède lexécution générique des scénarios, la concurrence des workers, lécriture des artefacts et les rapports.
- Ladaptateur de transport possède la configuration du Gateway, létat prêt, lobservation entrante et sortante, les actions de transport et létat de transport normalisé.
- Les fichiers de scénario markdown sous `qa/scenarios/` définissent lexécution de test ; `qa-lab` fournit la surface dexécution réutilisable qui les exécute.
- `qa-lab` possède lexécution générique des scénarios, la concurrence des workers, lécriture des artefacts et le reporting.
- Ladaptateur de transport possède la configuration Gateway, létat prêt, lobservation entrante et sortante, les actions de transport et létat de transport normalisé.
- Les fichiers de scénarios Markdown sous `qa/scenarios/` définissent lexécution de test ; `qa-lab` fournit la surface runtime réutilisable qui les exécute.
### Ajouter un canal
Ajouter un canal au système QA markdown exige exactement deux éléments :
Lajout dun canal au système QA Markdown nécessite exactement deux choses :
1. Un adaptateur de transport pour le canal.
2. Un pack de scénarios qui exerce le contrat du canal.
Najoutez pas une nouvelle racine de commande QA de premier niveau lorsque lhôte partagé `qa-lab` peut posséder le flux.
Najoutez pas de nouvelle racine de commande QA de premier niveau lorsque lhôte partagé `qa-lab` peut posséder le flux.
`qa-lab` possède les mécanismes dhôte partagés :
- la racine de commande `openclaw qa`
- le démarrage et larrêt de la suite
- le démarrage et larrêt des suites
- la concurrence des workers
- lécriture des artefacts
- la génération de rapports
- la génération des rapports
- lexécution des scénarios
- les alias de compatibilité pour les anciens scénarios `qa-channel`
Les Plugins dexécuteur possèdent le contrat de transport :
Les plugins de runner possèdent le contrat de transport :
- la façon dont `openclaw qa <runner>` est monté sous la racine partagée `qa`
- la façon dont `openclaw qa <runner>` est monté sous la racine `qa` partagée
- la façon dont le Gateway est configuré pour ce transport
- la façon dont létat prêt est vérifié
- la façon dont les événements entrants sont injectés
- la façon dont les messages sortants sont observés
- la façon dont les transcriptions et létat de transport normalisé sont exposés
- la façon dont les actions appuyées par le transport sont exécutées
- la façon dont les actions adossées au transport sont exécutées
- la façon dont la réinitialisation ou le nettoyage propre au transport est géré
La barre minimale dadoption pour un nouveau canal :
Le seuil minimal dadoption pour un nouveau canal :
1. Gardez `qa-lab` comme propriétaire de la racine `qa` partagée.
2. Implémentez le runner de transport sur la jointure dhôte `qa-lab` partagée.
3. Gardez les mécaniques propres au transport dans le Plugin runner ou le harnais de canal.
4. Montez le runner sous `openclaw qa <runner>` au lieu denregistrer une commande racine concurrente. Les Plugins runners doivent déclarer `qaRunners` dans `openclaw.plugin.json` et exporter un tableau `qaRunnerCliRegistrations` correspondant depuis `runtime-api.ts`. Gardez `runtime-api.ts` léger ; la CLI paresseuse et lexécution du runner doivent rester derrière des points dentrée séparés.
5. Rédigez ou adaptez des scénarios Markdown dans les répertoires thématiques `qa/scenarios/`.
6. Utilisez les helpers de scénario génériques pour les nouveaux scénarios.
7. Gardez les alias de compatibilité existants fonctionnels, sauf si le dépôt effectue une migration intentionnelle.
1. Conserver `qa-lab` comme propriétaire de la racine `qa` partagée.
2. Implémenter le runner de transport sur la jonction dhôte `qa-lab` partagée.
3. Garder les mécanismes propres au transport dans le plugin de runner ou le harness de canal.
4. Monter le runner sous la forme `openclaw qa <runner>` au lieu denregistrer une commande racine concurrente. Les plugins de runner doivent déclarer `qaRunners` dans `openclaw.plugin.json` et exporter un tableau `qaRunnerCliRegistrations` correspondant depuis `runtime-api.ts`. Garder `runtime-api.ts` léger ; la CLI paresseuse et lexécution du runner doivent rester derrière des points dentrée séparés.
5. Rédiger ou adapter les scénarios Markdown sous les répertoires thématiques `qa/scenarios/`.
6. Utiliser les helpers de scénario génériques pour les nouveaux scénarios.
7. Garder les alias de compatibilité existants fonctionnels, sauf si le dépôt effectue une migration intentionnelle.
La règle de décision est stricte :
- Si un comportement peut être exprimé une seule fois dans `qa-lab`, mettez-le dans `qa-lab`.
- Si un comportement dépend dun transport de canal, gardez-le dans ce Plugin runner ou ce harnais de Plugin.
- Si un scénario a besoin dune nouvelle capacité utilisable par plus dun canal, ajoutez un helper générique au lieu dune branche spécifique au canal dans `suite.ts`.
- Si un comportement na de sens que pour un seul transport, gardez le scénario spécifique au transport et rendez-le explicite dans le contrat du scénario.
- Si un comportement peut être exprimé une seule fois dans `qa-lab`, le mettre dans `qa-lab`.
- Si un comportement dépend dun seul transport de canal, le garder dans ce plugin de runner ou harness de plugin.
- Si un scénario a besoin dune nouvelle capacité utilisable par plusieurs canaux, ajouter un helper générique plutôt quune branche propre à un canal dans `suite.ts`.
- Si un comportement na de sens que pour un seul transport, garder le scénario propre au transport et lexpliciter dans le contrat du scénario.
### Noms des helpers de scénario
@ -431,21 +462,21 @@ Helpers génériques préférés pour les nouveaux scénarios :
- `formatTransportTranscript`
- `resetTransport`
Les alias de compatibilité restent disponibles pour les scénarios existants — `waitForQaChannelReady`, `waitForOutboundMessage`, `waitForNoOutbound`, `formatConversationTranscript`, `resetBus` — mais la rédaction de nouveaux scénarios doit utiliser les noms génériques. Les alias existent pour éviter une migration basculée dun seul coup, pas comme modèle à suivre.
Les alias de compatibilité restent disponibles pour les scénarios existants — `waitForQaChannelReady`, `waitForOutboundMessage`, `waitForNoOutbound`, `formatConversationTranscript`, `resetBus` — mais les nouveaux scénarios doivent utiliser les noms génériques. Les alias existent pour éviter une migration à date unique, pas comme modèle à suivre à lavenir.
## Rapports
`qa-lab` exporte un rapport de protocole Markdown à partir de la chronologie de bus observée.
Le rapport doit répondre à :
`qa-lab` exporte un rapport de protocole Markdown à partir de la chronologie du bus observée.
Le rapport doit répondre à ces questions :
- Ce qui a fonctionné
- Ce qui a échoué
- Ce qui est resté bloqué
- Les scénarios de suivi quil vaut la peine dajouter
- Quels scénarios de suivi méritent dêtre ajoutés
Pour linventaire des scénarios disponibles — utile pour dimensionner le travail de suivi ou câbler un nouveau transport — exécutez `pnpm openclaw qa coverage` (ajoutez `--json` pour une sortie lisible par machine).
Pour linventaire des scénarios disponibles — utile pour dimensionner le travail de suivi ou raccorder un nouveau transport — exécuter `pnpm openclaw qa coverage` (ajouter `--json` pour une sortie lisible par machine).
Pour les vérifications de caractère et de style, exécutez le même scénario sur plusieurs refs de modèles live et rédigez un rapport Markdown évalué :
Pour les vérifications de caractère et de style, exécuter le même scénario sur plusieurs refs de modèles live et écrire un rapport Markdown évalué :
```bash
pnpm openclaw qa character-eval \
@ -464,17 +495,21 @@ pnpm openclaw qa character-eval \
--judge-concurrency 16
```
La commande exécute des processus enfants du Gateway QA local, pas Docker. Les scénarios dévaluation de caractère doivent définir la persona via `SOUL.md`, puis exécuter des tours utilisateur ordinaires comme du chat, de laide sur lespace de travail et de petites tâches de fichiers. Le modèle candidat ne doit pas être informé quil est évalué. La commande préserve chaque transcription complète, enregistre des statistiques dexécution de base, puis demande aux modèles juges en mode rapide avec un raisonnement `xhigh`, lorsque pris en charge, de classer les exécutions selon le naturel, lambiance et lhumour.
Utilisez `--blind-judge-models` lors de la comparaison de fournisseurs : le prompt du juge reçoit toujours chaque transcription et statut dexécution, mais les refs candidates sont remplacées par des libellés neutres comme `candidate-01` ; le rapport remappe les classements vers les vraies refs après lanalyse.
Les exécutions candidates utilisent par défaut le raisonnement `high`, avec `medium` pour GPT-5.5 et `xhigh` pour les anciennes refs dévaluation OpenAI qui le prennent en charge. Remplacez un candidat précis en ligne avec `--model provider/model,thinking=<level>`. `--thinking <level>` définit toujours une valeur de repli globale, et lancienne forme `--model-thinking <provider/model=level>` est conservée pour compatibilité.
Les refs candidates OpenAI utilisent par défaut le mode rapide afin que le traitement prioritaire soit utilisé lorsque le fournisseur le prend en charge. Ajoutez `,fast`, `,no-fast` ou `,fast=false` en ligne lorsquun seul candidat ou juge nécessite une surcharge. Passez `--fast` uniquement lorsque vous voulez forcer le mode rapide pour tous les modèles candidats. Les durées des candidats et des juges sont enregistrées dans le rapport pour lanalyse de benchmark, mais les prompts des juges indiquent explicitement de ne pas classer selon la vitesse.
Les exécutions des modèles candidats et juges utilisent toutes deux par défaut une concurrence de 16. Réduisez `--concurrency` ou `--judge-concurrency` lorsque les limites du fournisseur ou la pression du Gateway local rendent une exécution trop bruitée.
Lorsquaucun candidat `--model` nest passé, lévaluation de caractère utilise par défaut `openai/gpt-5.5`, `openai/gpt-5.2`, `openai/gpt-5`, `anthropic/claude-opus-4-6`, `anthropic/claude-sonnet-4-6`, `zai/glm-5.1`, `moonshot/kimi-k2.5` et `google/gemini-3.1-pro-preview` lorsquaucun `--model` nest passé.
Lorsquaucun `--judge-model` nest passé, les juges utilisent par défaut `openai/gpt-5.5,thinking=xhigh,fast` et `anthropic/claude-opus-4-6,thinking=high`.
La commande lance des processus enfants locaux de Gateway QA, pas Docker. Les scénarios dévaluation de caractère doivent définir la persona via `SOUL.md`, puis exécuter des tours utilisateur ordinaires comme la discussion, laide dans lespace de travail et de petites tâches sur les fichiers. Le modèle candidat ne doit pas être informé quil est évalué. La commande conserve chaque transcription complète, enregistre les statistiques de base de lexécution, puis demande aux modèles juges en mode rapide avec un raisonnement `xhigh` lorsque pris en charge de classer les exécutions selon le naturel, le ton et lhumour.
Utiliser `--blind-judge-models` lors de la comparaison de fournisseurs : le prompt du juge reçoit toujours chaque transcription et chaque statut dexécution, mais les refs candidates sont remplacées par des libellés neutres comme `candidate-01` ; le rapport rattache les classements aux refs réelles après lanalyse.
Les exécutions candidates utilisent par défaut une réflexion `high`, avec `medium` pour GPT-5.5 et `xhigh` pour les anciennes refs dévaluation OpenAI qui le prennent en charge. Remplacer un candidat précis en ligne avec `--model provider/model,thinking=<level>`. `--thinking <level>` définit toujours un repli global, et lancienne forme `--model-thinking <provider/model=level>` est conservée pour compatibilité.
Les refs candidates OpenAI utilisent par défaut le mode rapide afin que le traitement prioritaire soit utilisé lorsque le fournisseur le prend en charge. Ajouter `,fast`, `,no-fast` ou `,fast=false` en ligne lorsquun candidat ou juge unique nécessite un remplacement. Passer `--fast` uniquement pour forcer lactivation du mode rapide pour chaque modèle candidat. Les durées des candidats et des juges sont enregistrées dans le rapport pour lanalyse comparative, mais les prompts des juges indiquent explicitement de ne pas classer selon la vitesse.
Les exécutions de modèles candidats et juges utilisent toutes deux une concurrence par défaut de 16. Réduire `--concurrency` ou `--judge-concurrency` lorsque les limites du fournisseur ou la pression sur le Gateway local rendent une exécution trop bruitée.
Lorsquaucun `--model` candidat nest passé, lévaluation de caractère utilise par défaut `openai/gpt-5.5`, `openai/gpt-5.2`, `openai/gpt-5`, `anthropic/claude-opus-4-6`, `anthropic/claude-sonnet-4-6`, `zai/glm-5.1`,
`moonshot/kimi-k2.5` et
`google/gemini-3.1-pro-preview` lorsquaucun `--model` nest passé.
Lorsquaucun `--judge-model` nest passé, les juges utilisent par défaut
`openai/gpt-5.5,thinking=xhigh,fast` et
`anthropic/claude-opus-4-6,thinking=high`.
## Docs associées
## Docs connexes
- [QA matricielle](/fr/concepts/qa-matrix)
- [QA Matrix](/fr/concepts/qa-matrix)
- [Canal QA](/fr/channels/qa-channel)
- [Tests](/fr/help/testing)
- [Tableau de bord](/fr/web/dashboard)

View File

@ -1,29 +1,29 @@
---
read_when:
- Expliquer le fonctionnement de la diffusion en continu ou du découpage en segments dans les canaux
- Modification du comportement de diffusion en continu par blocs ou du découpage en fragments des canaux
- Débogage des réponses de bloc en double/prématurées ou de la diffusion en continu de laperçu du canal
summary: Comportement du streaming et du découpage en fragments (réponses par blocs, streaming daperçu de canal, correspondance des modes)
title: Diffusion en continu et segmentation
- Expliquer le fonctionnement de la diffusion en continu ou du découpage en fragments sur les canaux
- Modification du comportement de diffusion en continu des blocs ou de segmentation des canaux
- Débogage des réponses de bloc dupliquées/précoces ou du streaming de prévisualisation du canal
summary: Comportement de diffusion en continu et de découpage en fragments (réponses par blocs, diffusion en continu de laperçu du canal, correspondance des modes)
title: Diffusion en continu et découpage en segments
x-i18n:
generated_at: "2026-05-03T21:30:55Z"
generated_at: "2026-05-04T07:04:44Z"
model: gpt-5.5
provider: openai
source_hash: 1335f4f5532060bd8bf839683a2b1fbab38f38887c5583135652b4753e0f6a50
source_hash: ff7b6cd8127255352fe16fb746469e9828e7d5aea183d3799ab10cc768515bd1
source_path: concepts/streaming.md
workflow: 16
---
OpenClaw possède deux couches de diffusion distinctes :
OpenClaw dispose de deux couches de streaming distinctes :
- **Diffusion par blocs (canaux) :** émet des **blocs** terminés pendant que lassistant écrit. Ce sont des messages de canal normaux (pas des deltas de jetons).
- **Diffusion daperçu (Telegram/Discord/Slack) :** met à jour un **message daperçu** temporaire pendant la génération.
- **Streaming par blocs (canaux) :** émet des **blocs** terminés pendant que lassistant écrit. Ce sont des messages de canal normaux (pas des deltas de jetons).
- **Streaming daperçu (Telegram/Discord/Slack) :** met à jour un **message daperçu** temporaire pendant la génération.
Il nexiste aujourdhui **aucune véritable diffusion de deltas de jetons** vers les messages de canal. La diffusion daperçu est basée sur des messages (envoi + modifications/ajouts).
Il nexiste aujourdhui **aucun véritable streaming de deltas de jetons** vers les messages de canal. Le streaming daperçu repose sur des messages (envoi + modifications/ajouts).
## Diffusion par blocs (messages de canal)
## Streaming par blocs (messages de canal)
La diffusion par blocs envoie la sortie de lassistant en morceaux grossiers à mesure quelle devient disponible.
Le streaming par blocs envoie la sortie de lassistant sous forme de morceaux grossiers à mesure quelle devient disponible.
```
Model output
@ -37,8 +37,8 @@ Model output
Légende :
- `text_delta/events` : événements de flux du modèle (peuvent être rares pour les modèles sans diffusion).
- `chunker` : `EmbeddedBlockChunker` appliquant les limites min/max + la préférence de coupure.
- `text_delta/events` : événements de flux du modèle (peuvent être rares pour les modèles sans streaming).
- `chunker` : `EmbeddedBlockChunker` appliquant des bornes min/max + une préférence de rupture.
- `channel send` : messages sortants réels (réponses par blocs).
**Contrôles :**
@ -47,93 +47,97 @@ Légende :
- Remplacements par canal : `*.blockStreaming` (et variantes par compte) pour forcer `"on"`/`"off"` par canal.
- `agents.defaults.blockStreamingBreak` : `"text_end"` ou `"message_end"`.
- `agents.defaults.blockStreamingChunk` : `{ minChars, maxChars, breakPreference? }`.
- `agents.defaults.blockStreamingCoalesce` : `{ minChars?, maxChars?, idleMs? }` (fusionne les blocs diffusés avant lenvoi).
- Plafond strict du canal : `*.textChunkLimit` (par exemple, `channels.whatsapp.textChunkLimit`).
- Mode de découpage du canal : `*.chunkMode` (`length` par défaut, `newline` découpe sur les lignes vides (limites de paragraphes) avant le découpage par longueur).
- Plafond souple Discord : `channels.discord.maxLinesPerMessage` (17 par défaut) découpe les réponses hautes pour éviter le rognage dans linterface.
- `agents.defaults.blockStreamingCoalesce` : `{ minChars?, maxChars?, idleMs? }` (fusionne les blocs streamés avant lenvoi).
- Limite stricte du canal : `*.textChunkLimit` (par exemple, `channels.whatsapp.textChunkLimit`).
- Mode de découpage du canal : `*.chunkMode` (`length` par défaut, `newline` découpe sur les lignes vides (limites de paragraphe) avant le découpage par longueur).
- Limite souple Discord : `channels.discord.maxLinesPerMessage` (17 par défaut) découpe les réponses hautes pour éviter le rognage dans linterface.
**Sémantique des limites :**
- `text_end` : diffuse les blocs dès que le découpeur les émet ; vide le tampon à chaque `text_end`.
- `text_end` : streame les blocs dès que le découpeur les émet ; vide le tampon à chaque `text_end`.
- `message_end` : attend que le message de lassistant soit terminé, puis vide la sortie mise en tampon.
`message_end` utilise toujours le découpeur si le texte mis en tampon dépasse `maxChars`, il peut donc émettre plusieurs morceaux à la fin.
### Livraison des médias avec la diffusion par blocs
### Livraison des médias avec le streaming par blocs
Les directives `MEDIA:` sont des métadonnées de livraison normales. Lorsque la diffusion par blocs envoie tôt un bloc média, OpenClaw mémorise cette livraison pour le tour. Si la charge utile finale de lassistant répète la même URL de média, la livraison finale retire le média dupliqué au lieu denvoyer à nouveau la pièce jointe.
Les directives `MEDIA:` sont des métadonnées de livraison normales. Quand le streaming par blocs envoie tôt un bloc média, OpenClaw mémorise cette livraison pour le tour. Si la charge utile finale de lassistant répète la même URL de média, la livraison finale supprime le média dupliqué au lieu de renvoyer la pièce jointe.
Les charges utiles finales exactement dupliquées sont supprimées. Si la charge utile finale ajoute du texte distinct autour dun média déjà diffusé, OpenClaw envoie tout de même le nouveau texte tout en conservant une livraison unique du média. Cela évite les notes vocales ou fichiers en double sur des canaux comme Telegram lorsquun agent émet `MEDIA:` pendant la diffusion et que le fournisseur linclut aussi dans la réponse terminée.
Les charges utiles finales exactement dupliquées sont supprimées. Si la charge utile finale ajoute un texte distinct autour dun média déjà streamé, OpenClaw envoie quand même le nouveau texte tout en conservant une livraison unique du média. Cela évite les notes vocales ou fichiers en double sur des canaux comme Telegram lorsquun agent émet `MEDIA:` pendant le streaming et que le fournisseur linclut aussi dans la réponse terminée.
## Algorithme de découpage (limites basse/haute)
## Algorithme de découpage (bornes basse/haute)
Le découpage par blocs est implémenté par `EmbeddedBlockChunker` :
Le découpage en blocs est implémenté par `EmbeddedBlockChunker` :
- **Limite basse :** német pas tant que le tampon >= `minChars` (sauf si forcé).
- **Limite haute :** privilégie les coupures avant `maxChars` ; si forcé, coupe à `maxChars`.
- **Préférence de coupure :** `paragraph``newline``sentence``whitespace`coupure dure.
- **Blocs de code :** ne coupe jamais à lintérieur des blocs ; lorsquune coupure est forcée à `maxChars`, ferme puis rouvre le bloc pour garder un Markdown valide.
- **Borne basse :** német rien tant que le tampon >= `minChars` (sauf si forcé).
- **Borne haute :** préfère les ruptures avant `maxChars` ; si forcé, découpe à `maxChars`.
- **Préférence de rupture :** `paragraph``newline``sentence``whitespace`rupture forcée.
- **Blocs de code :** ne découpe jamais à lintérieur des blocs ; quand un découpage est forcé à `maxChars`, ferme puis rouvre le bloc pour conserver un Markdown valide.
`maxChars` est plafonné à la valeur `textChunkLimit` du canal, vous ne pouvez donc pas dépasser les limites par canal.
`maxChars` est plafonné à la valeur `textChunkLimit` du canal, vous ne pouvez donc pas dépasser les plafonds propres à chaque canal.
## Coalescence (fusion des blocs diffusés)
## Coalescence (fusion des blocs streamés)
Lorsque la diffusion par blocs est activée, OpenClaw peut **fusionner les morceaux de blocs consécutifs** avant de les envoyer. Cela réduit le « spam sur une seule ligne » tout en fournissant une sortie progressive.
Lorsque le streaming par blocs est activé, OpenClaw peut **fusionner des morceaux de blocs consécutifs** avant de les envoyer. Cela réduit le « spam dune seule ligne » tout en fournissant une sortie progressive.
- La coalescence attend des **pauses dinactivité** (`idleMs`) avant de vider le tampon.
- La coalescence attend des **intervalles dinactivité** (`idleMs`) avant de vider le tampon.
- Les tampons sont plafonnés par `maxChars` et seront vidés sils le dépassent.
- `minChars` empêche lenvoi de fragments minuscules tant quassez de texte ne sest pas accumulé (le vidage final envoie toujours le texte restant).
- Le séparateur est dérivé de `blockStreamingChunk.breakPreference` (`paragraph` → `\n\n`, `newline``\n`, `sentence` → espace).
- Des remplacements par canal sont disponibles via `*.blockStreamingCoalesce` (y compris les configurations par compte).
- La valeur `minChars` de coalescence par défaut est portée à 1500 pour Signal/Slack/Discord, sauf remplacement.
- Le séparateur est dérivé de `blockStreamingChunk.breakPreference`
(`paragraph` → `\n\n`, `newline``\n`, `sentence` → espace).
- Des remplacements par canal sont disponibles via `*.blockStreamingCoalesce` (y compris les configs par compte).
- La valeur par défaut de coalescence `minChars` est portée à 1500 pour Signal/Slack/Discord sauf remplacement.
## Rythme humain entre les blocs
Lorsque la diffusion par blocs est activée, vous pouvez ajouter une **pause aléatoire** entre les réponses par blocs (après le premier bloc). Cela rend les réponses en plusieurs bulles plus naturelles.
Lorsque le streaming par blocs est activé, vous pouvez ajouter une **pause aléatoire** entre les réponses par blocs (après le premier bloc). Cela rend les réponses en plusieurs bulles plus naturelles.
- Configuration : `agents.defaults.humanDelay` (remplacement par agent via `agents.list[].humanDelay`).
- Config : `agents.defaults.humanDelay` (remplacement par agent via `agents.list[].humanDelay`).
- Modes : `off` (par défaut), `natural` (8002500 ms), `custom` (`minMs`/`maxMs`).
- Sapplique uniquement aux **réponses par blocs**, pas aux réponses finales ni aux résumés doutils.
## « Diffuser les morceaux ou tout »
## « Streamer les morceaux ou tout »
Cela correspond à :
- **Diffuser les morceaux :** `blockStreamingDefault: "on"` + `blockStreamingBreak: "text_end"` (émettre au fil de leau). Les canaux hors Telegram nécessitent aussi `*.blockStreaming: true`.
- **Tout diffuser à la fin :** `blockStreamingBreak: "message_end"` (vider une fois, éventuellement en plusieurs morceaux si très long).
- **Aucune diffusion par blocs :** `blockStreamingDefault: "off"` (réponse finale uniquement).
- **Streamer les morceaux :** `blockStreamingDefault: "on"` + `blockStreamingBreak: "text_end"` (émettre au fil de leau). Les canaux autres que Telegram ont aussi besoin de `*.blockStreaming: true`.
- **Streamer tout à la fin :** `blockStreamingBreak: "message_end"` (vider une fois, avec éventuellement plusieurs morceaux si cest très long).
- **Pas de streaming par blocs :** `blockStreamingDefault: "off"` (réponse finale seulement).
**Note sur les canaux :** la diffusion par blocs est **désactivée sauf si** `*.blockStreaming` est explicitement défini sur `true`. Les canaux peuvent diffuser un aperçu en direct (`channels.<channel>.streaming`) sans réponses par blocs.
**Note sur les canaux :** le streaming par blocs est **désactivé sauf si**
`*.blockStreaming` est explicitement défini sur `true`. Les canaux peuvent streamer un aperçu en direct
(`channels.<channel>.streaming`) sans réponses par blocs.
Rappel demplacement de configuration : les valeurs par défaut `blockStreaming*` se trouvent sous `agents.defaults`, pas dans la configuration racine.
Rappel sur lemplacement de la config : les valeurs par défaut `blockStreaming*` se trouvent sous
`agents.defaults`, pas à la racine de la config.
## Modes de diffusion daperçu
## Modes de streaming daperçu
Clé canonique : `channels.<channel>.streaming`
Modes :
- `off` : désactive la diffusion daperçu.
- `off` : désactive le streaming daperçu.
- `partial` : aperçu unique remplacé par le dernier texte.
- `block` : mises à jour daperçu par étapes découpées/ajoutées.
- `block` : mises à jour de laperçu par étapes découpées/ajoutées.
- `progress` : aperçu de progression/statut pendant la génération, réponse finale à la fin.
`streaming.mode: "block"` est un mode de diffusion daperçu pour les canaux modifiables comme Discord et Telegram. Il nactive pas la livraison par blocs du canal à cet endroit. Utilisez `streaming.block.enabled` ou lancienne clé de canal `blockStreaming` lorsque vous voulez des réponses par blocs normales. Microsoft Teams est lexception : il na pas de transport de bloc pour aperçu de brouillon, donc `streaming.mode: "block"` correspond à la livraison par blocs Teams au lieu de la diffusion partielle/progression native.
`streaming.mode: "block"` est un mode de streaming daperçu pour les canaux pouvant être modifiés, comme Discord et Telegram. Il nactive pas la livraison de blocs du canal à cet endroit. Utilisez `streaming.block.enabled` ou lancienne clé de canal `blockStreaming` lorsque vous voulez des réponses par blocs normales. Microsoft Teams est lexception : il ne dispose pas de transport de blocs daperçu brouillon, donc `streaming.mode: "block"` correspond à la livraison de blocs Teams au lieu du streaming partiel/de progression natif.
### Correspondance des canaux
| Canal | `off` | `partial` | `block` | `progress` |
| ---------- | ----- | --------- | ------- | ------------------------ |
| Canal | `off` | `partial` | `block` | `progress` |
| ---------- | ----- | --------- | ------- | ------------------------- |
| Telegram | ✅ | ✅ | ✅ | brouillon de progression modifiable |
| Discord | ✅ | ✅ | ✅ | brouillon de progression modifiable |
| Slack | ✅ | ✅ | ✅ | ✅ |
| Mattermost | ✅ | ✅ | ✅ | ✅ |
| Slack | ✅ | ✅ | ✅ | ✅ |
| Mattermost | ✅ | ✅ | ✅ | ✅ |
| MS Teams | ✅ | ✅ | ✅ | flux de progression natif |
Slack uniquement :
- `channels.slack.streaming.nativeTransport` active/désactive les appels à lAPI de diffusion native Slack lorsque `channels.slack.streaming.mode="partial"` (par défaut : `true`).
- La diffusion native Slack et le statut de fil dassistant Slack nécessitent une cible de fil de réponse. Les messages privés de premier niveau naffichent pas cet aperçu de style fil, mais ils peuvent tout de même utiliser les publications et modifications daperçu de brouillon Slack.
- `channels.slack.streaming.nativeTransport` bascule les appels à lAPI de streaming native Slack lorsque `channels.slack.streaming.mode="partial"` (par défaut : `true`).
- Le streaming natif Slack et le statut de fil dassistant Slack nécessitent une cible de fil de réponse. Les DM de premier niveau naffichent pas cet aperçu de style fil, mais ils peuvent toujours utiliser les publications et modifications daperçu brouillon Slack.
Migration des anciennes clés :
@ -145,52 +149,52 @@ Migration des anciennes clés :
Telegram :
- Utilise `sendMessage` + `editMessageText` pour les mises à jour daperçu dans les messages privés et les groupes/sujets.
- Envoie un nouveau message final au lieu de modifier sur place lorsquun aperçu est visible depuis environ une minute, puis nettoie laperçu afin que lhorodatage de Telegram reflète la fin de la réponse.
- La diffusion daperçu est ignorée lorsque la diffusion par blocs Telegram est explicitement activée (pour éviter une double diffusion).
- `/reasoning stream` peut écrire le raisonnement dans laperçu.
- Utilise `sendMessage` + `editMessageText` pour les mises à jour daperçu dans les DM et les groupes/sujets.
- Envoie un nouveau message final au lieu de modifier sur place lorsquun aperçu est visible depuis environ une minute, puis nettoie laperçu afin que lhorodatage Telegram reflète la fin de la réponse.
- Le streaming daperçu est ignoré lorsque le streaming par blocs Telegram est explicitement activé (pour éviter un double streaming).
- `/reasoning stream` peut écrire le raisonnement dans un aperçu transitoire supprimé après la livraison finale.
Discord :
- Utilise lenvoi + la modification des messages daperçu.
- Utilise lenvoi + la modification de messages daperçu.
- Le mode `block` utilise le découpage de brouillon (`draftChunk`).
- La diffusion daperçu est ignorée lorsque la diffusion par blocs Discord est explicitement activée.
- Les médias finaux, erreurs et charges utiles de réponse explicite annulent les aperçus en attente sans vider un nouveau brouillon, puis utilisent la livraison normale.
- Le streaming daperçu est ignoré lorsque le streaming par blocs Discord est explicitement activé.
- Les charges utiles finales de média, derreur et de réponse explicite annulent les aperçus en attente sans vider un nouveau brouillon, puis utilisent la livraison normale.
Slack :
- `partial` peut utiliser la diffusion native Slack (`chat.startStream`/`append`/`stop`) lorsquelle est disponible.
- `block` utilise des aperçus de brouillon de type ajout.
- `progress` utilise du texte daperçu de statut, puis la réponse finale.
- Les messages privés de premier niveau sans fil de réponse utilisent des publications et modifications daperçu de brouillon au lieu de la diffusion native Slack.
- Les diffusions daperçu native et de brouillon suppriment les réponses par blocs pour ce tour, afin quune réponse Slack soit diffusée par un seul chemin de livraison.
- Les charges utiles finales de média/erreur et les finals de progression ne créent pas de messages de brouillon jetables ; seuls les finals texte/bloc pouvant modifier laperçu vident le texte de brouillon en attente.
- `partial` peut utiliser le streaming natif Slack (`chat.startStream`/`append`/`stop`) lorsquil est disponible.
- `block` utilise des aperçus brouillon par ajouts successifs.
- `progress` utilise le texte daperçu de statut, puis la réponse finale.
- Les DM de premier niveau sans fil de réponse utilisent des publications et modifications daperçu brouillon au lieu du streaming natif Slack.
- Le streaming daperçu natif et brouillon supprime les réponses par blocs pour ce tour, afin quune réponse Slack soit streamée par un seul chemin de livraison.
- Les charges utiles finales de média/erreur et les finales de progression ne créent pas de messages brouillon jetables ; seuls les finals de texte/bloc pouvant modifier laperçu vident le texte de brouillon en attente.
Mattermost :
- Diffuse la réflexion, lactivité des outils et le texte de réponse partiel dans une seule publication daperçu de brouillon, qui est finalisée sur place lorsque la réponse finale peut être envoyée en toute sécurité.
- Revient à lenvoi dune nouvelle publication finale si la publication daperçu a été supprimée ou est indisponible au moment de la finalisation.
- Streame la réflexion, lactivité des outils et le texte partiel de réponse dans une seule publication daperçu brouillon qui se finalise sur place lorsque la réponse finale peut être envoyée en toute sécurité.
- Revient à lenvoi dune nouvelle publication finale si la publication daperçu a été supprimée ou nest pas disponible au moment de la finalisation.
- Les charges utiles finales de média/erreur annulent les mises à jour daperçu en attente avant la livraison normale au lieu de vider une publication daperçu temporaire.
Matrix :
- Les aperçus de brouillon sont finalisés sur place lorsque le texte final peut réutiliser lévénement daperçu.
- Les finals média seuls, erreur et incompatibles avec la cible de réponse annulent les mises à jour daperçu en attente avant la livraison normale ; un aperçu obsolète déjà visible est masqué.
- Les aperçus brouillon se finalisent sur place lorsque le texte final peut réutiliser lévénement daperçu.
- Les finals média seuls, erreur et avec cible de réponse non correspondante annulent les mises à jour daperçu en attente avant la livraison normale ; un aperçu périmé déjà visible est supprimé.
### Mises à jour daperçu de progression des outils
La diffusion daperçu peut aussi inclure des mises à jour de **progression des outils** — de courtes lignes de statut comme « recherche sur le web », « lecture du fichier » ou « appel de loutil » — qui apparaissent dans le même message daperçu pendant lexécution des outils, avant la réponse finale. Cela garde les tours doutils en plusieurs étapes visuellement actifs plutôt que silencieux entre le premier aperçu de réflexion et la réponse finale.
Le streaming daperçu peut aussi inclure des mises à jour de **progression des outils** — de courtes lignes de statut comme « recherche sur le Web », « lecture du fichier » ou « appel de loutil » — qui apparaissent dans le même message daperçu pendant lexécution des outils, avant la réponse finale. Cela garde les tours doutils en plusieurs étapes visuellement actifs plutôt que silencieux entre le premier aperçu de réflexion et la réponse finale.
Surfaces prises en charge :
- **Discord**, **Slack**, **Telegram** et **Matrix** diffusent par défaut la progression des outils dans la modification daperçu en direct lorsque la diffusion daperçu est active. Microsoft Teams utilise son flux de progression natif dans les conversations personnelles.
- Telegram est livré avec les mises à jour daperçu de progression des outils activées depuis `v2026.4.22` ; les conserver activées préserve ce comportement publié.
- **Mattermost** intègre déjà lactivité des outils dans sa seule publication daperçu de brouillon (voir ci-dessus).
- Les modifications de progression des outils suivent le mode de diffusion daperçu actif ; elles sont ignorées lorsque la diffusion daperçu est `off` ou lorsque la diffusion par blocs a pris le relais du message. Sur Telegram, `streaming.mode: "off"` signifie final uniquement : le bavardage de progression générique est aussi supprimé au lieu dêtre livré comme messages de statut autonomes, tandis que les invites dapprobation, les charges utiles de média et les erreurs sont toujours routées normalement.
- Pour conserver la diffusion daperçu mais masquer les lignes de progression des outils, définissez `streaming.preview.toolProgress` sur `false` pour ce canal. Pour désactiver entièrement les modifications daperçu, définissez `streaming.mode` sur `off`.
- Les réponses à une citation sélectionnée Telegram sont une exception : lorsque `replyToMode` nest pas `"off"` et quun texte de citation sélectionné est présent, OpenClaw ignore le flux daperçu de réponse pour ce tour, donc les lignes daperçu de progression des outils ne peuvent pas safficher. Les réponses au message actuel sans texte de citation sélectionné conservent la diffusion daperçu. Consultez la [documentation du canal Telegram](/fr/channels/telegram) pour plus de détails.
- **Discord**, **Slack**, **Telegram** et **Matrix** streament par défaut la progression des outils dans la modification daperçu en direct lorsque le streaming daperçu est actif. Microsoft Teams utilise son flux de progression natif dans les conversations personnelles.
- Telegram est livré avec les mises à jour daperçu de progression des outils activées depuis `v2026.4.22` ; les garder activées préserve ce comportement publié.
- **Mattermost** intègre déjà lactivité des outils dans sa publication daperçu brouillon unique (voir ci-dessus).
- Les modifications de progression des outils suivent le mode de streaming daperçu actif ; elles sont ignorées lorsque le streaming daperçu est `off` ou lorsque le streaming par blocs a pris le contrôle du message. Sur Telegram, `streaming.mode: "off"` signifie final seulement : les messages génériques de progression sont aussi supprimés au lieu dêtre livrés comme messages de statut autonomes, tandis que les invites dapprobation, les charges utiles média et les erreurs continuent dêtre routées normalement.
- Pour conserver le streaming daperçu mais masquer les lignes de progression des outils, définissez `streaming.preview.toolProgress` sur `false` pour ce canal. Pour garder les lignes de progression des outils visibles tout en masquant le texte de commande/exec, définissez `streaming.preview.commandText` sur `"status"` ou `streaming.progress.commandText` sur `"status"` ; la valeur par défaut est `"raw"` afin de préserver le comportement publié. Cette politique est partagée par les canaux de brouillon/progression qui utilisent le moteur de rendu de progression compact dOpenClaw, notamment Discord, Matrix, Microsoft Teams, Mattermost, les aperçus brouillon Slack et Telegram. Pour désactiver entièrement les modifications daperçu, définissez `streaming.mode` sur `off`.
- Les réponses à une citation sélectionnée Telegram sont une exception : lorsque `replyToMode` nest pas `"off"` et quun texte de citation sélectionnée est présent, OpenClaw ignore le flux daperçu de réponse pour ce tour, si bien que les lignes daperçu de progression des outils ne peuvent pas safficher. Les réponses au message actuel sans texte de citation sélectionnée conservent le streaming daperçu. Consultez la [documentation du canal Telegram](/fr/channels/telegram) pour plus de détails.
Exemple :
Gardez les lignes de progression visibles, mais masquez le texte brut des commandes/exécutions :
```json
{
@ -199,7 +203,26 @@ Exemple :
"streaming": {
"mode": "partial",
"preview": {
"toolProgress": false
"toolProgress": true,
"commandText": "status"
}
}
}
}
}
```
Utilisez la même structure sous une autre clé de canal de progression compact, par exemple `channels.discord`, `channels.matrix`, `channels.msteams`, `channels.mattermost`, ou les aperçus de brouillons Slack. Pour le mode brouillon de progression, placez la même politique sous `streaming.progress` :
```json
{
"channels": {
"telegram": {
"streaming": {
"mode": "progress",
"progress": {
"toolProgress": true,
"commandText": "status"
}
}
}
@ -209,7 +232,7 @@ Exemple :
## Connexe
- [Brouillons de progression](/fr/concepts/progress-drafts) — messages visibles de travail en cours qui se mettent à jour pendant les longs tours
- [Brouillons de progression](/fr/concepts/progress-drafts) — messages de travail en cours visibles qui se mettent à jour pendant les longs tours
- [Messages](/fr/concepts/messages) — cycle de vie et livraison des messages
- [Nouvelle tentative](/fr/concepts/retry) — comportement de nouvelle tentative en cas déchec de livraison
- [Canaux](/fr/channels) — prise en charge de la diffusion par canal
- [Réessayer](/fr/concepts/retry) — comportement de nouvelle tentative en cas déchec de livraison
- [Canaux](/fr/channels) — prise en charge du streaming par canal

File diff suppressed because it is too large Load Diff

View File

@ -2,22 +2,22 @@
read_when:
- Mise à jour dOpenClaw
- Quelque chose ne fonctionne plus après une mise à jour
summary: Mettre à jour OpenClaw en toute sécurité (installation globale ou depuis les sources), avec stratégie de restauration
summary: Mettre à jour OpenClaw en toute sécurité (installation globale ou depuis les sources), avec une stratégie de restauration
title: Mise à jour
x-i18n:
generated_at: "2026-05-03T21:35:29Z"
generated_at: "2026-05-04T07:04:52Z"
model: gpt-5.5
provider: openai
source_hash: f9e26ea71748dfd1573cdca01126bf29ebc56be56eac604e2b6a009b463820d1
source_hash: 3c9ff1d70d74f45efea3c148718e5cbc74001ce3d924b760edc4d68622d23714
source_path: install/updating.md
workflow: 16
---
Gardez OpenClaw à jour.
Maintenez OpenClaw à jour.
## Recommandé : `openclaw update`
La méthode la plus rapide pour effectuer une mise à jour. Elle détecte votre type dinstallation (npm ou git), récupère la dernière version, exécute `openclaw doctor` et redémarre le Gateway.
Le moyen le plus rapide de mettre à jour. Il détecte votre type dinstallation (npm ou git), récupère la dernière version, exécute `openclaw doctor` et redémarre le Gateway.
```bash
openclaw update
@ -32,21 +32,21 @@ openclaw update --tag main
openclaw update --dry-run # preview without applying
```
`openclaw update` naccepte pas `--verbose`. Pour diagnostiquer une mise à jour, utilisez
`--dry-run` afin de prévisualiser les actions prévues, `--json` pour obtenir des résultats structurés, ou
`openclaw update status --json` pour examiner létat du canal et de la disponibilité. Le
`openclaw update` naccepte pas `--verbose`. Pour les diagnostics de mise à jour, utilisez
`--dry-run` pour prévisualiser les actions prévues, `--json` pour des résultats structurés, ou
`openclaw update status --json` pour inspecter létat du canal et de la disponibilité. Le
programme dinstallation possède son propre indicateur `--verbose`, mais cet indicateur ne fait pas partie de
`openclaw update`.
`--channel beta` privilégie la bêta, mais lenvironnement dexécution revient à la version stable/latest lorsque
le tag bêta est absent ou plus ancien que la dernière version stable. Utilisez `--tag beta`
si vous voulez le dist-tag npm bêta brut pour une mise à jour ponctuelle de paquet.
`--channel beta` privilégie beta, mais le runtime se rabat sur stable/latest lorsque
le tag beta est absent ou plus ancien que la dernière version stable. Utilisez `--tag beta`
si vous voulez le dist-tag npm beta brut pour une mise à jour de paquet ponctuelle.
Consultez [Canaux de développement](/fr/install/development-channels) pour la sémantique des canaux.
## Basculer entre les installations npm et git
Utilisez les canaux lorsque vous voulez changer de type dinstallation. Le programme de mise à jour conserve votre
Utilisez les canaux lorsque vous voulez changer le type dinstallation. Le programme de mise à jour conserve votre
état, votre configuration, vos identifiants et votre espace de travail dans `~/.openclaw` ; il ne change que
linstallation du code OpenClaw utilisée par la CLI et le Gateway.
@ -65,12 +65,12 @@ openclaw update --channel dev --dry-run
openclaw update --channel stable --dry-run
```
Le canal `dev` garantit un checkout git, le compile et installe la CLI globale
Le canal `dev` garantit un checkout git, le construit et installe la CLI globale
depuis ce checkout. Les canaux `stable` et `beta` utilisent des installations de paquets. Si le
Gateway est déjà installé, `openclaw update` actualise les métadonnées du service
et le redémarre, sauf si vous passez `--no-restart`.
## Alternative : réexécuter le programme dinstallation
## Alternative : relancer le programme dinstallation
```bash
curl -fsSL https://openclaw.ai/install.sh | bash
@ -80,32 +80,37 @@ Ajoutez `--no-onboard` pour ignorer lintégration. Pour forcer un type din
le programme dinstallation, passez `--install-method git --no-onboard` ou
`--install-method npm --no-onboard`.
Si `openclaw update` échoue après la phase dinstallation du paquet npm, réexécutez le
programme dinstallation. Le programme dinstallation nappelle pas lancien programme de mise à jour ; il exécute directement
linstallation du paquet global et peut récupérer une installation npm partiellement mise à jour.
Si `openclaw update` échoue après la phase dinstallation du paquet npm, relancez le
programme dinstallation. Le programme dinstallation nappelle pas lancien programme de mise à jour ; il exécute directement linstallation du
paquet global et peut récupérer une installation npm partiellement mise à jour.
```bash
curl -fsSL https://openclaw.ai/install.sh | bash -s -- --install-method npm
```
Pour limiter la récupération à une version ou un dist-tag spécifique, ajoutez `--version` :
Pour épingler la récupération à une version ou un dist-tag spécifique, ajoutez `--version` :
```bash
curl -fsSL https://openclaw.ai/install.sh | bash -s -- --install-method npm --version <version-or-dist-tag>
```
## Alternative : npm, pnpm ou bun manuel
## Alternative : npm, pnpm ou bun manuels
```bash
npm i -g openclaw@latest
```
Préférez `openclaw update` pour les installations supervisées, car il peut coordonner le
remplacement du paquet avec le service Gateway en cours dexécution. Si vous effectuez une mise à jour manuelle pendant quun
Gateway géré est en cours dexécution, redémarrez le Gateway immédiatement après la fin du gestionnaire de
paquets afin que lancien processus ne continue pas à servir depuis des fichiers de paquet remplacés.
Lorsque `openclaw update` gère une installation npm globale, il installe dabord la cible dans
un préfixe npm temporaire, vérifie linventaire `dist` empaqueté, puis remplace
larborescence propre du paquet dans le véritable préfixe global. Cela évite que npm superpose un
nouveau paquet à des fichiers obsolètes de lancien paquet. Si la commande dinstallation échoue,
un préfixe npm temporaire, vérifie linventaire `dist` du paquet, puis remplace
larborescence propre du paquet dans le préfixe global réel. Cela évite que npm superpose un
nouveau paquet sur des fichiers obsolètes de lancien paquet. Si la commande dinstallation échoue,
OpenClaw réessaie une fois avec `--omit=optional`. Cette nouvelle tentative aide les hôtes où les
dépendances optionnelles natives ne peuvent pas être compilées, tout en gardant léchec initial visible
dépendances optionnelles natives ne peuvent pas compiler, tout en gardant léchec initial visible
si le repli échoue également.
```bash
@ -119,28 +124,28 @@ bun add -g openclaw@latest
### Sujets avancés dinstallation npm
<AccordionGroup>
<Accordion title="Read-only package tree">
OpenClaw traite les installations globales empaquetées comme étant en lecture seule à lexécution, même lorsque le répertoire global du paquet est accessible en écriture par lutilisateur actuel. Les installations de paquets Plugin résident dans des racines npm/git appartenant à OpenClaw sous le répertoire de configuration utilisateur, et le démarrage du Gateway ne modifie pas larborescence du paquet OpenClaw.
<Accordion title="Arborescence de paquets en lecture seule">
OpenClaw traite les installations globales empaquetées comme étant en lecture seule à lexécution, même lorsque le répertoire global du paquet est accessible en écriture par lutilisateur courant. Les installations de paquets Plugin résident dans des racines npm/git appartenant à OpenClaw sous le répertoire de configuration de lutilisateur, et le démarrage du Gateway ne modifie pas larborescence du paquet OpenClaw.
Certaines configurations npm Linux installent les paquets globaux sous des répertoires appartenant à root, comme `/usr/lib/node_modules/openclaw`. OpenClaw prend en charge cette disposition, car les commandes dinstallation/mise à jour de Plugin écrivent en dehors de ce répertoire global de paquet.
Certaines configurations npm Linux installent les paquets globaux dans des répertoires appartenant à root, tels que `/usr/lib/node_modules/openclaw`. OpenClaw prend en charge cette disposition, car les commandes dinstallation/mise à jour de Plugin écrivent en dehors de ce répertoire global de paquet.
</Accordion>
<Accordion title="Hardened systemd units">
Donnez à OpenClaw un accès en écriture à ses racines de configuration/état afin que les installations explicites de Plugin, les mises à jour de Plugin et le nettoyage par doctor puissent persister leurs changements :
<Accordion title="Unités systemd renforcées">
Accordez à OpenClaw un accès en écriture à ses racines de configuration/état afin que les installations explicites de Plugin, les mises à jour de Plugin et le nettoyage par doctor puissent conserver leurs changements :
```ini
ReadWritePaths=/var/lib/openclaw /home/openclaw/.openclaw /tmp
```
</Accordion>
<Accordion title="Disk-space preflight">
Avant les mises à jour de paquets et les installations explicites de Plugin, OpenClaw tente une vérification opportuniste de lespace disque pour le volume cible. Un espace faible produit un avertissement avec le chemin vérifié, mais ne bloque pas la mise à jour, car les quotas de système de fichiers, les instantanés et les volumes réseau peuvent changer après la vérification. Linstallation réelle par le gestionnaire de paquets et la vérification post-installation restent lautorité.
<Accordion title="Vérification préalable de lespace disque">
Avant les mises à jour de paquets et les installations explicites de Plugin, OpenClaw tente une vérification despace disque au mieux pour le volume cible. Un espace insuffisant produit un avertissement avec le chemin vérifié, mais ne bloque pas la mise à jour, car les quotas de système de fichiers, les instantanés et les volumes réseau peuvent changer après la vérification. Linstallation réelle par le gestionnaire de paquets et la vérification après installation restent déterminantes.
</Accordion>
</AccordionGroup>
## Mise à jour automatique
## Programme de mise à jour automatique
La mise à jour automatique est désactivée par défaut. Activez-la dans `~/.openclaw/openclaw.json` :
Le programme de mise à jour automatique est désactivé par défaut. Activez-le dans `~/.openclaw/openclaw.json` :
```json5
{
@ -156,20 +161,20 @@ La mise à jour automatique est désactivée par défaut. Activez-la dans `~/.op
}
```
| Canal | Comportement |
| Canal | Comportement |
| -------- | ------------------------------------------------------------------------------------------------------------- |
| `stable` | Attend `stableDelayHours`, puis applique avec un décalage déterministe sur `stableJitterHours` (déploiement réparti). |
| `beta` | Vérifie toutes les `betaCheckIntervalHours` (par défaut : toutes les heures) et applique immédiatement. |
| `dev` | Aucune application automatique. Utilisez `openclaw update` manuellement. |
| `stable` | Attend `stableDelayHours`, puis applique avec une gigue déterministe sur `stableJitterHours` (déploiement étalé). |
| `beta` | Vérifie toutes les `betaCheckIntervalHours` (par défaut : toutes les heures) et applique immédiatement. |
| `dev` | Aucune application automatique. Utilisez `openclaw update` manuellement. |
Le Gateway journalise également une indication de mise à jour au démarrage (désactivez avec `update.checkOnStart: false`).
Le Gateway journalise aussi une indication de mise à jour au démarrage (désactivez avec `update.checkOnStart: false`).
Pour une rétrogradation ou une récupération après incident, définissez `OPENCLAW_NO_AUTO_UPDATE=1` dans lenvironnement du Gateway afin de bloquer les applications automatiques même lorsque `update.auto.enabled` est configuré. Les indications de mise à jour au démarrage peuvent toujours sexécuter, sauf si `update.checkOnStart` est également désactivé.
Les mises à jour du gestionnaire de paquets demandées via le gestionnaire actif du plan de contrôle du Gateway
forcent un redémarrage de mise à jour non différé, sans délai de récupération, après le remplacement du paquet. Cela
évite de conserver un ancien processus en mémoire assez longtemps pour charger paresseusement des morceaux
depuis une arborescence de paquet qui a déjà été remplacée. La commande shell `openclaw update`
reste le chemin privilégié pour les installations supervisées, car elle peut arrêter et
Les mises à jour par gestionnaire de paquets demandées via le gestionnaire du plan de contrôle live du Gateway
forcent un redémarrage de mise à jour non différé et sans période de refroidissement après le remplacement du paquet. Cela
évite de laisser un ancien processus en mémoire assez longtemps pour charger paresseusement des fragments
depuis une arborescence de paquets qui a déjà été remplacée. La commande shell `openclaw update`
reste le chemin recommandé pour les installations supervisées, car elle peut arrêter et
redémarrer le service autour de la mise à jour.
## Après la mise à jour
@ -182,7 +187,7 @@ redémarrer le service autour de la mise à jour.
openclaw doctor
```
Migre la configuration, audite les politiques de messages privés et vérifie létat du Gateway. Détails : [Doctor](/fr/gateway/doctor)
Migre la configuration, audite les politiques de DM et vérifie la santé du Gateway. Détails : [Doctor](/fr/gateway/doctor)
### Redémarrer le Gateway
@ -209,7 +214,7 @@ openclaw gateway restart
```
<Tip>
`npm view openclaw version` affiche la version actuellement publiée.
`npm view openclaw version` affiche la version publiée actuelle.
</Tip>
### Épingler un commit (source)
@ -225,13 +230,13 @@ Pour revenir à la dernière version : `git checkout main && git pull`.
## Si vous êtes bloqué
- Exécutez `openclaw doctor` à nouveau et lisez attentivement la sortie.
- Pour `openclaw update --channel dev` sur les checkouts source, le programme de mise à jour initialise automatiquement `pnpm` si nécessaire. Si vous voyez une erreur damorçage pnpm/corepack, installez `pnpm` manuellement (ou réactivez `corepack`) et relancez la mise à jour.
- Vérifiez : [Dépannage](/fr/gateway/troubleshooting)
- Demandez sur Discord : [https://discord.gg/clawd](https://discord.gg/clawd)
- Exécutez de nouveau `openclaw doctor` et lisez attentivement la sortie.
- Pour `openclaw update --channel dev` sur des checkouts source, le programme de mise à jour auto-initialise `pnpm` si nécessaire. Si vous voyez une erreur dinitialisation pnpm/corepack, installez `pnpm` manuellement (ou réactivez `corepack`) et relancez la mise à jour.
- Consultez : [Dépannage](/fr/gateway/troubleshooting)
- Demandez de laide sur Discord : [https://discord.gg/clawd](https://discord.gg/clawd)
## Associé
## Connexe
- [Vue densemble de linstallation](/fr/install) : toutes les méthodes dinstallation.
- [Doctor](/fr/gateway/doctor) : vérifications détat après les mises à jour.
- [Migration](/fr/install/migrating) : guides de migration des versions majeures.
- [Doctor](/fr/gateway/doctor) : vérifications de santé après les mises à jour.
- [Migration](/fr/install/migrating) : guides de migration de versions majeures.

File diff suppressed because it is too large Load Diff

View File

@ -1,45 +1,45 @@
---
read_when:
- Vous souhaitez passer un appel vocal sortant depuis OpenClaw
- Vous configurez ou développez le Plugin dappel vocal
- Vous configurez ou développez le Plugin dappels vocaux
- Vous avez besoin de voix en temps réel ou de transcription en continu pour la téléphonie
sidebarTitle: Voice call
summary: Passez des appels vocaux sortants et acceptez des appels vocaux entrants via Twilio, Telnyx ou Plivo, avec prise en charge facultative de la voix en temps réel et de la transcription en streaming
title: Plugin dappel vocal
summary: Passez des appels vocaux sortants et acceptez des appels vocaux entrants via Twilio, Telnyx ou Plivo, avec voix en temps réel et transcription en streaming facultatives
title: Plugin d'appel vocal
x-i18n:
generated_at: "2026-05-02T22:21:43Z"
generated_at: "2026-05-04T07:05:38Z"
model: gpt-5.5
provider: openai
source_hash: 18a9a0d7095ec92036b516cc26c69219a0a2fd9bb8e0cb2e7509123bb4f3f65a
source_hash: 8ec2c22dcc9073572963744685a432328787bcedb14025e0326c20d9d842f857
source_path: plugins/voice-call.md
workflow: 16
---
Appels vocaux pour OpenClaw via un Plugin. Prend en charge les notifications sortantes,
les conversations à plusieurs tours, la voix temps réel en duplex intégral, la transcription
en streaming et les appels entrants avec des politiques de liste dautorisation.
Appels vocaux pour OpenClaw via un plugin. Prend en charge les notifications sortantes,
les conversations multi-tours, la voix en temps réel full-duplex, la
transcription en streaming et les appels entrants avec des politiques de liste d'autorisation.
**Fournisseurs actuels :** `twilio` (Programmable Voice + Media Streams),
`telnyx` (Call Control v2), `plivo` (Voice API + XML transfer + GetInput
speech), `mock` (développement/sans réseau).
<Note>
Le Plugin Voice Call sexécute **dans le processus Gateway**. Si vous utilisez un
Gateway distant, installez et configurez le Plugin sur la machine qui exécute
Le plugin Voice Call s'exécute **dans le processus Gateway**. Si vous utilisez un
Gateway distant, installez et configurez le plugin sur la machine qui exécute
le Gateway, puis redémarrez le Gateway pour le charger.
</Note>
## Démarrage rapide
<Steps>
<Step title="Install the plugin">
<Step title="Installer le plugin">
<Tabs>
<Tab title="From npm">
<Tab title="Depuis npm">
```bash
openclaw plugins install @openclaw/voice-call
```
</Tab>
<Tab title="From a local folder (dev)">
<Tab title="Depuis un dossier local (développement)">
```bash
PLUGIN_SRC=./path/to/local/voice-call-plugin
openclaw plugins install "$PLUGIN_SRC"
@ -48,30 +48,30 @@ le Gateway, puis redémarrez le Gateway pour le charger.
</Tab>
</Tabs>
Utilisez le paquet nu pour suivre le tag de publication officiel actuel. Épinglez une
version exacte uniquement lorsque vous avez besoin dune installation reproductible.
Utilisez le package nu pour suivre l'étiquette de version officielle actuelle. Épinglez une
version exacte uniquement lorsque vous avez besoin d'une installation reproductible.
Redémarrez ensuite le Gateway afin que le Plugin se charge.
Redémarrez ensuite le Gateway afin que le plugin se charge.
</Step>
<Step title="Configure provider and webhook">
<Step title="Configurer le fournisseur et le Webhook">
Définissez la configuration sous `plugins.entries.voice-call.config` (voir
[Configuration](#configuration) ci-dessous pour la structure complète). Au minimum :
[Configuration](#configuration) ci-dessous pour la forme complète). Au minimum :
`provider`, les identifiants du fournisseur, `fromNumber` et une URL de Webhook
accessible publiquement.
</Step>
<Step title="Verify setup">
<Step title="Vérifier la configuration">
```bash
openclaw voicecall setup
```
La sortie par défaut est lisible dans les journaux de chat et les terminaux. Elle vérifie
lactivation du Plugin, les identifiants du fournisseur, lexposition du Webhook et le fait
quun seul mode audio (`streaming` ou `realtime`) est actif. Utilisez
l'activation du plugin, les identifiants du fournisseur, l'exposition du Webhook et que
seul un mode audio (`streaming` ou `realtime`) est actif. Utilisez
`--json` pour les scripts.
</Step>
<Step title="Smoke test">
<Step title="Test fumigatoire">
```bash
openclaw voicecall smoke
openclaw voicecall smoke --to "+15555550123"
@ -88,21 +88,21 @@ le Gateway, puis redémarrez le Gateway pour le charger.
</Steps>
<Warning>
Pour Twilio, Telnyx et Plivo, la configuration doit aboutir à une **URL de Webhook publique**.
Si `publicUrl`, lURL du tunnel, lURL Tailscale ou le repli de service
résout vers le loopback ou un espace réseau privé, la configuration échoue au lieu de
démarrer un fournisseur qui ne peut pas recevoir les Webhooks de lopérateur.
Pour Twilio, Telnyx et Plivo, la configuration doit se résoudre en une **URL de Webhook publique**.
Si `publicUrl`, l'URL du tunnel, l'URL Tailscale ou le repli de service
se résout vers l'espace réseau loopback ou privé, la configuration échoue au lieu de
démarrer un fournisseur qui ne peut pas recevoir les Webhooks des opérateurs.
</Warning>
## Configuration
Si `enabled: true` mais que les identifiants du fournisseur sélectionné manquent,
Si `enabled: true` mais que les identifiants du fournisseur sélectionné sont manquants,
le démarrage du Gateway consigne un avertissement de configuration incomplète avec les clés manquantes et
ignore le démarrage du runtime. Les commandes, les appels RPC et les outils dagent renvoient tout de même
la configuration exacte du fournisseur manquante lorsquils sont utilisés.
ignore le démarrage de l'exécution. Les commandes, les appels RPC et les outils d'agent renvoient toujours
la configuration exacte du fournisseur manquante lorsqu'ils sont utilisés.
<Note>
Les identifiants Voice Call acceptent les SecretRefs. `plugins.entries.voice-call.config.twilio.authToken`, `plugins.entries.voice-call.config.realtime.providers.*.apiKey`, `plugins.entries.voice-call.config.streaming.providers.*.apiKey` et `plugins.entries.voice-call.config.tts.providers.*.apiKey` sont résolus via la surface SecretRef standard ; consultez [Surface des identifiants SecretRef](/fr/reference/secretref-credential-surface).
Les identifiants voice-call acceptent les SecretRefs. `plugins.entries.voice-call.config.twilio.authToken`, `plugins.entries.voice-call.config.realtime.providers.*.apiKey`, `plugins.entries.voice-call.config.streaming.providers.*.apiKey` et `plugins.entries.voice-call.config.tts.providers.*.apiKey` sont résolus via la surface SecretRef standard ; voir [surface d'identifiants SecretRef](/fr/reference/secretref-credential-surface).
</Note>
```json5
@ -175,28 +175,28 @@ Les identifiants Voice Call acceptent les SecretRefs. `plugins.entries.voice-cal
```
<AccordionGroup>
<Accordion title="Provider exposure and security notes">
- Twilio, Telnyx et Plivo nécessitent tous une URL de Webhook **accessible publiquement**.
<Accordion title="Notes sur l'exposition et la sécurité des fournisseurs">
- Twilio, Telnyx et Plivo exigent tous une URL de Webhook **accessible publiquement**.
- `mock` est un fournisseur de développement local (aucun appel réseau).
- Telnyx nécessite `telnyx.publicKey` (ou `TELNYX_PUBLIC_KEY`), sauf si `skipSignatureVerification` vaut true.
- Telnyx nécessite `telnyx.publicKey` (ou `TELNYX_PUBLIC_KEY`) sauf si `skipSignatureVerification` vaut true.
- `skipSignatureVerification` est réservé aux tests locaux.
- Sur loffre gratuite de ngrok, définissez `publicUrl` sur lURL ngrok exacte ; la vérification de signature est toujours appliquée.
- `tunnel.allowNgrokFreeTierLoopbackBypass: true` autorise les Webhooks Twilio avec des signatures non valides **uniquement** lorsque `tunnel.provider="ngrok"` et que `serve.bind` est le loopback (agent local ngrok). Développement local uniquement.
- Les URL de loffre gratuite ngrok peuvent changer ou ajouter un comportement interstitiel ; si `publicUrl` dérive, les signatures Twilio échouent. Production : privilégiez un domaine stable ou un funnel Tailscale.
- Sur l'offre gratuite de ngrok, définissez `publicUrl` sur l'URL ngrok exacte ; la vérification de signature est toujours appliquée.
- `tunnel.allowNgrokFreeTierLoopbackBypass: true` autorise les Webhooks Twilio avec des signatures invalides **uniquement** lorsque `tunnel.provider="ngrok"` et que `serve.bind` est loopback (agent local ngrok). Développement local uniquement.
- Les URL de l'offre gratuite de Ngrok peuvent changer ou ajouter un comportement interstitiel ; si `publicUrl` dérive, les signatures Twilio échouent. Production : privilégiez un domaine stable ou un funnel Tailscale.
</Accordion>
<Accordion title="Streaming connection caps">
- `streaming.preStartTimeoutMs` ferme les sockets qui nenvoient jamais de trame `start` valide.
- `streaming.maxPendingConnections` limite le nombre total de sockets pré-démarrage non authentifiées.
- `streaming.maxPendingConnectionsPerIp` limite les sockets pré-démarrage non authentifiées par adresse IP source.
- `streaming.maxConnections` limite le nombre total de sockets de flux multimédia ouvertes (en attente + actives).
<Accordion title="Limites de connexions en streaming">
- `streaming.preStartTimeoutMs` ferme les sockets qui n'envoient jamais de trame `start` valide.
- `streaming.maxPendingConnections` limite le nombre total de sockets pré-démarrage non authentifiés.
- `streaming.maxPendingConnectionsPerIp` limite les sockets pré-démarrage non authentifiés par IP source.
- `streaming.maxConnections` limite le nombre total de sockets de flux multimédia ouverts (en attente + actifs).
</Accordion>
<Accordion title="Legacy config migrations">
Les anciennes configurations utilisant `provider: "log"`, `twilio.from` ou les anciennes clés OpenAI
`streaming.*` sont réécrites par `openclaw doctor --fix`.
Le repli runtime accepte encore les anciennes clés voice-call pour le moment, mais
le chemin de réécriture est `openclaw doctor --fix` et le shim de compatibilité est
<Accordion title="Migrations de configuration héritée">
Les anciennes configurations utilisant `provider: "log"`, `twilio.from` ou les clés OpenAI
`streaming.*` héritées sont réécrites par `openclaw doctor --fix`.
Le repli d'exécution accepte encore les anciennes clés voice-call pour le moment, mais
le chemin de réécriture est `openclaw doctor --fix` et la couche de compatibilité est
temporaire.
Clés de streaming migrées automatiquement :
@ -214,49 +214,52 @@ Les identifiants Voice Call acceptent les SecretRefs. `plugins.entries.voice-cal
Par défaut, Voice Call utilise `sessionScope: "per-phone"` afin que les appels répétés du
même appelant conservent la mémoire de conversation. Définissez `sessionScope: "per-call"` lorsque
chaque appel opérateur doit démarrer avec un contexte vierge, par exemple pour les flux de réception,
de réservation, dIVR ou de pont Google Meet où le même numéro de téléphone peut
chaque appel opérateur doit commencer avec un contexte neuf, par exemple pour les flux de réception,
de réservation, IVR ou de passerelle Google Meet où le même numéro de téléphone peut
représenter différentes réunions.
## Conversations vocales temps réel
## Conversations vocales en temps réel
`realtime` sélectionne un fournisseur vocal temps réel en duplex intégral pour laudio
dappel en direct. Il est distinct de `streaming`, qui transmet uniquement laudio aux
fournisseurs de transcription temps réel.
`realtime` sélectionne un fournisseur de voix en temps réel full-duplex pour l'audio
d'appel en direct. Il est distinct de `streaming`, qui transmet uniquement l'audio aux
fournisseurs de transcription en temps réel.
<Warning>
`realtime.enabled` ne peut pas être combiné avec `streaming.enabled`. Choisissez un seul
`realtime.enabled` ne peut pas être combiné avec `streaming.enabled`. Choisissez un
mode audio par appel.
</Warning>
Comportement runtime actuel :
Comportement d'exécution actuel :
- `realtime.enabled` est pris en charge pour Twilio Media Streams.
- `realtime.provider` est facultatif. Sil nest pas défini, Voice Call utilise le premier fournisseur vocal temps réel enregistré.
- Fournisseurs vocaux temps réel inclus : Google Gemini Live (`google`) et OpenAI (`openai`), enregistrés par leurs Plugins de fournisseur.
- La configuration brute appartenant au fournisseur se trouve sous `realtime.providers.<providerId>`.
- Voice Call expose par défaut loutil temps réel partagé `openclaw_agent_consult`. Le modèle temps réel peut lappeler lorsque lappelant demande un raisonnement plus approfondi, des informations actuelles ou des outils OpenClaw normaux.
- `realtime.fastContext.enabled` est désactivé par défaut. Lorsquil est activé, Voice Call recherche dabord dans la mémoire indexée/le contexte de session pour la question de consultation et renvoie ces extraits au modèle temps réel dans le délai `realtime.fastContext.timeoutMs`, avant de revenir à lagent de consultation complet uniquement si `realtime.fastContext.fallbackToConsult` vaut true.
- Si `realtime.provider` pointe vers un fournisseur non enregistré, ou si aucun fournisseur vocal temps réel nest enregistré, Voice Call consigne un avertissement et ignore le média temps réel au lieu de faire échouer tout le Plugin.
- Les clés de session de consultation réutilisent la session dappel stockée lorsquelle est disponible, puis reviennent à la configuration `sessionScope` (`per-phone` par défaut, ou `per-call` pour les appels isolés).
- `realtime.provider` est facultatif. S'il n'est pas défini, Voice Call utilise le premier fournisseur de voix en temps réel enregistré.
- Fournisseurs de voix en temps réel groupés : Google Gemini Live (`google`) et OpenAI (`openai`), enregistrés par leurs plugins fournisseurs.
- La configuration brute détenue par le fournisseur se trouve sous `realtime.providers.<providerId>`.
- Voice Call expose par défaut l'outil temps réel partagé `openclaw_agent_consult`. Le modèle temps réel peut l'appeler lorsque l'appelant demande un raisonnement plus approfondi, des informations actuelles ou des outils OpenClaw normaux.
- `realtime.fastContext.enabled` est désactivé par défaut. Lorsqu'il est activé, Voice Call recherche d'abord dans le contexte mémoire/session indexé pour la question de consultation et renvoie ces extraits au modèle temps réel dans `realtime.fastContext.timeoutMs` avant de revenir à l'agent de consultation complet uniquement si `realtime.fastContext.fallbackToConsult` vaut true.
- Si `realtime.provider` pointe vers un fournisseur non enregistré, ou si aucun fournisseur de voix en temps réel n'est enregistré, Voice Call consigne un avertissement et ignore le média temps réel au lieu de faire échouer tout le plugin.
- Les clés de session de consultation réutilisent la session d'appel stockée lorsqu'elle est disponible, puis reviennent à la `sessionScope` configurée (`per-phone` par défaut, ou `per-call` pour les appels isolés).
### Politique doutils
### Politique d'outils
`realtime.toolPolicy` contrôle lexécution de la consultation :
`realtime.toolPolicy` contrôle l'exécution de consultation :
| Politique | Comportement |
| ---------------- | ---------------------------------------------------------------------------------------------------------------------------------------- |
| `safe-read-only` | Expose loutil de consultation et limite lagent standard à `read`, `web_search`, `web_fetch`, `x_search`, `memory_search` et `memory_get`. |
| `owner` | Expose loutil de consultation et laisse lagent standard utiliser la politique doutils normale de lagent. |
| `none` | Nexpose pas loutil de consultation. Les `realtime.tools` personnalisés sont tout de même transmis au fournisseur temps réel. |
| `safe-read-only` | Expose l'outil de consultation et limite l'agent standard à `read`, `web_search`, `web_fetch`, `x_search`, `memory_search` et `memory_get`. |
| `owner` | Expose l'outil de consultation et laisse l'agent standard utiliser la politique normale d'outils d'agent. |
| `none` | N'expose pas l'outil de consultation. Les `realtime.tools` personnalisés sont toujours transmis au fournisseur temps réel. |
### Exemples de fournisseurs temps réel
<Tabs>
<Tab title="Google Gemini Live">
Valeurs par défaut : clé API depuis `realtime.providers.google.apiKey`,
Valeurs par défaut : clé d'API depuis `realtime.providers.google.apiKey`,
`GEMINI_API_KEY` ou `GOOGLE_GENERATIVE_AI_API_KEY` ; modèle
`gemini-2.5-flash-native-audio-preview-12-2025` ; voix `Kore`.
`sessionResumption` et `contextWindowCompression` sont activés par défaut pour les appels plus longs,
reconnectables. Utilisez `silenceDurationMs`, `startSensitivity` et
`endSensitivity` pour ajuster une alternance de parole plus rapide sur l'audio téléphonique.
```json5
{
@ -277,6 +280,8 @@ Comportement runtime actuel :
apiKey: "${GEMINI_API_KEY}",
model: "gemini-2.5-flash-native-audio-preview-12-2025",
voice: "Kore",
silenceDurationMs: 500,
startSensitivity: "high",
},
},
},
@ -311,27 +316,27 @@ Comportement runtime actuel :
</Tab>
</Tabs>
Consultez [Fournisseur Google](/fr/providers/google) et
[Fournisseur OpenAI](/fr/providers/openai) pour les options vocales temps réel
propres à chaque fournisseur.
Voir [fournisseur Google](/fr/providers/google) et
[fournisseur OpenAI](/fr/providers/openai) pour les options de voix en temps réel
propres au fournisseur.
## Transcription en streaming
`streaming` sélectionne un fournisseur de transcription temps réel pour laudio dappel en direct.
`streaming` sélectionne un fournisseur de transcription en temps réel pour laudio des appels en direct.
Comportement runtime actuel :
Comportement actuel à lexécution :
- `streaming.provider` est facultatif. Sil nest pas défini, Appels vocaux utilise le premier fournisseur de transcription en temps réel enregistré.
- Fournisseurs de transcription en temps réel groupés : Deepgram (`deepgram`), ElevenLabs (`elevenlabs`), Mistral (`mistral`), OpenAI (`openai`) et xAI (`xai`), enregistrés par leurs plugins fournisseurs.
- La configuration brute détenue par le fournisseur se trouve sous `streaming.providers.<providerId>`.
- Après que Twilio a envoyé un message `start` de flux accepté, Appels vocaux enregistre immédiatement le flux, met en file dattente les médias entrants via le fournisseur de transcription pendant que celui-ci se connecte, et lance le message daccueil initial seulement lorsque la transcription en temps réel est prête.
- Si `streaming.provider` pointe vers un fournisseur non enregistré, ou si aucun fournisseur nest enregistré, Appels vocaux journalise un avertissement et ignore le streaming média au lieu de faire échouer tout le plugin.
- `streaming.provider` est facultatif. Sil nest pas défini, Voice Call utilise le premier fournisseur de transcription en temps réel enregistré.
- Fournisseurs de transcription en temps réel intégrés : Deepgram (`deepgram`), ElevenLabs (`elevenlabs`), Mistral (`mistral`), OpenAI (`openai`) et xAI (`xai`), enregistrés par leurs plugins fournisseurs.
- La configuration brute propre au fournisseur se trouve sous `streaming.providers.<providerId>`.
- Après que Twilio a envoyé un message `start` de flux accepté, Voice Call enregistre immédiatement le flux, met en file dattente les médias entrants via le fournisseur de transcription pendant que celui-ci se connecte, et ne lance le message daccueil initial quune fois la transcription en temps réel prête.
- Si `streaming.provider` pointe vers un fournisseur non enregistré, ou si aucun fournisseur nest enregistré, Voice Call consigne un avertissement et ignore le streaming multimédia au lieu de faire échouer tout le plugin.
### Exemples de fournisseurs de streaming
<Tabs>
<Tab title="OpenAI">
Valeurs par défaut : clé dAPI `streaming.providers.openai.apiKey` ou
Valeurs par défaut : clé API `streaming.providers.openai.apiKey` ou
`OPENAI_API_KEY` ; modèle `gpt-4o-transcribe` ; `silenceDurationMs: 800` ;
`vadThreshold: 0.5`.
@ -363,8 +368,8 @@ Comportement runtime actuel :
</Tab>
<Tab title="xAI">
Valeurs par défaut : clé dAPI `streaming.providers.xai.apiKey` ou `XAI_API_KEY` ;
endpoint `wss://api.x.ai/v1/stt` ; encodage `mulaw` ; fréquence déchantillonnage `8000` ;
Valeurs par défaut : clé API `streaming.providers.xai.apiKey` ou `XAI_API_KEY` ;
point de terminaison `wss://api.x.ai/v1/stt` ; encodage `mulaw` ; fréquence déchantillonnage `8000` ;
`endpointingMs: 800` ; `interimResults: true`.
```json5
@ -397,8 +402,8 @@ Comportement runtime actuel :
## TTS pour les appels
Appels vocaux utilise la configuration principale `messages.tts` pour le streaming
vocal sur les appels. Vous pouvez la remplacer dans la configuration du plugin avec la
Voice Call utilise la configuration principale `messages.tts` pour la parole en streaming
lors des appels. Vous pouvez la remplacer dans la configuration du plugin avec la
**même forme** — elle est fusionnée en profondeur avec `messages.tts`.
```json5
@ -416,22 +421,22 @@ vocal sur les appels. Vous pouvez la remplacer dans la configuration du plugin a
```
<Warning>
**Microsoft speech est ignoré pour les appels vocaux.** Laudio de téléphonie nécessite du PCM ;
le transport Microsoft actuel nexpose pas de sortie PCM de téléphonie.
**Microsoft speech est ignoré pour les appels vocaux.** Laudio téléphonique nécessite du PCM ;
le transport Microsoft actuel nexpose pas de sortie PCM téléphonique.
</Warning>
Notes de comportement :
- Les anciennes clés `tts.<provider>` dans la configuration du plugin (`openai`, `elevenlabs`, `microsoft`, `edge`) sont réparées par `openclaw doctor --fix` ; la configuration validée doit utiliser `tts.providers.<provider>`.
- Le TTS principal est utilisé lorsque le streaming média Twilio est activé ; sinon, les appels reviennent aux voix natives du fournisseur.
- Si un flux média Twilio est déjà actif, Appels vocaux ne revient pas à TwiML `<Say>`. Si le TTS de téléphonie nest pas disponible dans cet état, la demande de lecture échoue au lieu de mélanger deux chemins de lecture.
- Lorsque le TTS de téléphonie bascule vers un fournisseur secondaire, Appels vocaux journalise un avertissement avec la chaîne de fournisseurs (`from`, `to`, `attempts`) pour le débogage.
- Lorsque linterruption vocale Twilio ou le démontage du flux vide la file TTS en attente, les demandes de lecture mises en file se résolvent au lieu de laisser les appelants attendre indéfiniment la fin de la lecture.
- Les anciennes clés `tts.<provider>` dans la configuration du plugin (`openai`, `elevenlabs`, `microsoft`, `edge`) sont réparées par `openclaw doctor --fix` ; la configuration validée devrait utiliser `tts.providers.<provider>`.
- Le TTS principal est utilisé lorsque le streaming multimédia Twilio est activé ; sinon les appels reviennent aux voix natives du fournisseur.
- Si un flux multimédia Twilio est déjà actif, Voice Call ne revient pas à TwiML `<Say>`. Si le TTS téléphonique nest pas disponible dans cet état, la requête de lecture échoue au lieu de mélanger deux chemins de lecture.
- Lorsque le TTS téléphonique revient à un fournisseur secondaire, Voice Call consigne un avertissement avec la chaîne de fournisseurs (`from`, `to`, `attempts`) pour le débogage.
- Lorsque linterruption Twilio ou le démontage du flux vide la file TTS en attente, les requêtes de lecture en file se règlent au lieu de laisser les appelants attendre indéfiniment la fin de la lecture.
### Exemples de TTS
### Exemples TTS
<Tabs>
<Tab title="TTS principal uniquement">
<Tab title="Core TTS only">
```json5
{
messages: {
@ -445,7 +450,7 @@ Notes de comportement :
}
```
</Tab>
<Tab title="Remplacer par ElevenLabs (appels uniquement)">
<Tab title="Override to ElevenLabs (calls only)">
```json5
{
plugins: {
@ -469,7 +474,7 @@ Notes de comportement :
}
```
</Tab>
<Tab title="Remplacement du modèle OpenAI (fusion en profondeur)">
<Tab title="OpenAI model override (deep-merge)">
```json5
{
plugins: {
@ -495,7 +500,7 @@ Notes de comportement :
## Appels entrants
La stratégie entrante vaut `disabled` par défaut. Pour activer les appels entrants, définissez :
La politique dentrée est définie par défaut sur `disabled`. Pour activer les appels entrants, définissez :
```json5
{
@ -506,31 +511,31 @@ La stratégie entrante vaut `disabled` par défaut. Pour activer les appels entr
```
<Warning>
`inboundPolicy: "allowlist"` est un filtrage de lidentification de lappelant à faible assurance. Le
`inboundPolicy: "allowlist"` est un filtrage de lidentifiant dappelant à faible assurance. Le
plugin normalise la valeur `From` fournie par le fournisseur et la compare à
`allowFrom`. La vérification du Webhook authentifie la livraison par le fournisseur et
`allowFrom`. La vérification Webhook authentifie la livraison par le fournisseur et
lintégrité de la charge utile, mais elle ne prouve **pas** la propriété du numéro
dappelant PSTN/VoIP. Traitez `allowFrom` comme un filtrage didentification de lappelant, et non comme une identité
forte de lappelant.
dappelant PSTN/VoIP. Traitez `allowFrom` comme un filtrage de lidentifiant dappelant, et non comme une identité
dappelant forte.
</Warning>
Les réponses automatiques utilisent le système dagents. Ajustez avec `responseModel`,
Les réponses automatiques utilisent le système dagents. Ajustez-les avec `responseModel`,
`responseSystemPrompt` et `responseTimeoutMs`.
### Routage par numéro
Utilisez `numbers` lorsquun plugin Appels vocaux reçoit des appels pour plusieurs numéros de téléphone
Utilisez `numbers` lorsquun même plugin Voice Call reçoit des appels pour plusieurs numéros de téléphone
et que chaque numéro doit se comporter comme une ligne différente. Par exemple, un
numéro peut utiliser un assistant personnel décontracté tandis quun autre utilise une persona
professionnelle, un agent de réponse différent et une voix TTS différente.
numéro peut utiliser un assistant personnel décontracté tandis quun autre utilise une personnalité professionnelle,
un agent de réponse différent et une voix TTS différente.
Les routes sont sélectionnées à partir du numéro `To` composé fourni par le fournisseur. Les clés doivent être des
numéros E.164. Lorsquun appel arrive, Appels vocaux résout une seule fois la route correspondante,
stocke la route correspondante sur lenregistrement dappel et réutilise cette configuration effective
pour le message daccueil, le chemin de réponse automatique classique, le chemin de consultation en temps réel et la lecture
TTS. Si aucune route ne correspond, la configuration globale dAppels vocaux est utilisée.
Les appels sortants nutilisent pas `numbers` ; transmettez explicitement la cible sortante, le message et
la session lors du lancement de lappel.
Les routes sont sélectionnées à partir du numéro composé `To` fourni par le fournisseur. Les clés doivent être
des numéros E.164. Lorsquun appel arrive, Voice Call résout une fois la route correspondante,
stocke la route correspondante dans lenregistrement dappel et réutilise cette configuration effective
pour le message daccueil, le chemin classique de réponse automatique, le chemin de consultation en temps réel et la lecture
TTS. Si aucune route ne correspond, la configuration globale de Voice Call est utilisée.
Les appels sortants nutilisent pas `numbers` ; transmettez explicitement la cible sortante, le message et la
session lors de linitiation de lappel.
Les remplacements de route prennent actuellement en charge :
@ -541,8 +546,7 @@ Les remplacements de route prennent actuellement en charge :
- `responseSystemPrompt`
- `responseTimeoutMs`
La valeur de route `tts` est fusionnée en profondeur par-dessus la configuration `tts` globale dAppels vocaux, vous pouvez donc
généralement remplacer uniquement la voix du fournisseur :
La valeur de route `tts` est fusionnée en profondeur avec la configuration `tts` globale de Voice Call, ce qui vous permet généralement de remplacer uniquement la voix du fournisseur :
```json5
{
@ -570,51 +574,45 @@ généralement remplacer uniquement la voix du fournisseur :
### Contrat de sortie vocale
Pour les réponses automatiques, Appels vocaux ajoute un contrat strict de sortie vocale à
linvite système :
Pour les réponses automatiques, Voice Call ajoute un contrat strict de sortie vocale à linvite système :
```text
{"spoken":"..."}
```
Appels vocaux extrait le texte à prononcer de manière défensive :
Voice Call extrait le texte à prononcer de manière défensive :
- Ignore les charges utiles marquées comme contenu de raisonnement/erreur.
- Analyse le JSON direct, le JSON clôturé ou les clés `"spoken"` en ligne.
- Revient au texte brut et supprime les paragraphes dintroduction probablement liés à la planification ou aux métadonnées.
- Ignore les charges utiles marquées comme contenu de raisonnement ou derreur.
- Analyse le JSON direct, le JSON balisé ou les clés `"spoken"` en ligne.
- Se rabat sur du texte brut et supprime les paragraphes dintroduction qui ressemblent à de la planification ou à des métadonnées.
Cela maintient la lecture vocale centrée sur le texte destiné à lappelant et évite
la fuite de texte de planification dans laudio.
Cela maintient la lecture vocale centrée sur le texte destiné à lappelant et évite de divulguer du texte de planification dans laudio.
### Comportement au démarrage de la conversation
Pour les appels `conversation` sortants, la gestion du premier message est liée à létat de lecture
en direct :
Pour les appels `conversation` sortants, la gestion du premier message est liée à létat de lecture en direct :
- Le vidage de la file dinterruption vocale et la réponse automatique ne sont supprimés que pendant que le message daccueil initial est activement prononcé.
- Si la lecture initiale échoue, lappel repasse à `listening` et le message initial reste en file dattente pour une nouvelle tentative.
- Leffacement de la file dattente lors dune interruption et la réponse automatique ne sont supprimés que pendant que le message daccueil initial est en cours de lecture.
- Si la lecture initiale échoue, lappel revient à létat `listening` et le message initial reste en file dattente pour une nouvelle tentative.
- La lecture initiale pour le streaming Twilio démarre à la connexion du flux, sans délai supplémentaire.
- Linterruption vocale abandonne la lecture active et vide les entrées TTS Twilio mises en file mais pas encore en lecture. Les entrées vidées sont résolues comme ignorées, afin que la logique de réponse de suivi puisse continuer sans attendre un audio qui ne sera jamais lu.
- Les conversations vocales en temps réel utilisent le premier tour propre au flux en temps réel. Appels vocaux ne publie **pas** de mise à jour TwiML `<Say>` héritée pour ce message initial, afin que les sessions `<Connect><Stream>` sortantes restent attachées.
- Linterruption annule la lecture active et efface les entrées TTS Twilio en file dattente mais pas encore en cours de lecture. Les entrées effacées sont résolues comme ignorées, afin que la logique de réponse de suivi puisse continuer sans attendre un audio qui ne sera jamais lu.
- Les conversations vocales en temps réel utilisent le premier tour propre au flux temps réel. Voice Call ne publie **pas** de mise à jour TwiML `<Say>` héritée pour ce message initial, de sorte que les sessions `<Connect><Stream>` sortantes restent attachées.
### Délai de grâce de déconnexion du flux Twilio
### Délai de grâce lors de la déconnexion dun flux Twilio
Lorsquun flux média Twilio se déconnecte, Appels vocaux attend **2000 ms** avant
de terminer automatiquement lappel :
Lorsquun flux média Twilio se déconnecte, Voice Call attend **2000 ms** avant de mettre automatiquement fin à lappel :
- Si le flux se reconnecte pendant cette fenêtre, la fin automatique est annulée.
- Si aucun flux ne se réenregistre après la période de grâce, lappel est terminé pour éviter les appels actifs bloqués.
- Si aucun flux ne se réenregistre après le délai de grâce, lappel est terminé afin déviter les appels actifs bloqués.
## Nettoyeur dappels obsolètes
Utilisez `staleCallReaperSeconds` pour terminer les appels qui ne reçoivent jamais de Webhook
terminal (par exemple, les appels en mode notification qui ne se terminent jamais). La valeur par défaut
est `0` (désactivé).
Utilisez `staleCallReaperSeconds` pour terminer les appels qui ne reçoivent jamais de Webhook terminal (par exemple, les appels en mode notification qui ne se terminent jamais). La valeur par défaut est `0` (désactivé).
Plages recommandées :
- **Production :** `120` à `300` secondes pour les flux de type notification.
- Gardez cette valeur **supérieure à `maxDurationSeconds`** afin que les appels normaux puissent se terminer. Un bon point de départ est `maxDurationSeconds + 3060` secondes.
- Conservez cette valeur **supérieure à `maxDurationSeconds`** afin que les appels normaux puissent se terminer. Un bon point de départ est `maxDurationSeconds + 3060` secondes.
```json5
{
@ -633,26 +631,24 @@ Plages recommandées :
## Sécurité des Webhooks
Lorsquun proxy ou un tunnel se trouve devant le Gateway, le plugin
reconstruit lURL publique pour la vérification de signature. Ces options
contrôlent quels en-têtes transférés sont approuvés :
Lorsquun proxy ou un tunnel se trouve devant le Gateway, le plugin reconstruit lURL publique pour la vérification de signature. Ces options contrôlent les en-têtes transférés qui sont approuvés :
<ParamField path="webhookSecurity.allowedHosts" type="string[]">
Liste dautorisation des hôtes provenant des en-têtes de transfert.
Autorisez les hôtes issus des en-têtes de transfert.
</ParamField>
<ParamField path="webhookSecurity.trustForwardingHeaders" type="boolean">
Approuver les en-têtes transférés sans liste dautorisation.
Approuvez les en-têtes transférés sans liste dautorisation.
</ParamField>
<ParamField path="webhookSecurity.trustedProxyIPs" type="string[]">
Napprouver les en-têtes transférés que lorsque lIP distante de la requête correspond à la liste.
Napprouvez les en-têtes transférés que lorsque lIP distante de la requête correspond à la liste.
</ParamField>
Protections supplémentaires :
- La **protection contre la relecture** des Webhooks est activée pour Twilio et Plivo. Les requêtes Webhook valides rejouées sont accusées réception, mais ignorées pour les effets de bord.
- Les tours de conversation Twilio incluent un jeton par tour dans les rappels `<Gather>`, afin que les rappels vocaux obsolètes/rejoués ne puissent pas satisfaire un tour de transcription en attente plus récent.
- Les requêtes Webhook non authentifiées sont rejetées avant la lecture du corps lorsque les en-têtes de signature requis par le fournisseur sont absents.
- Le Webhook voice-call utilise le profil de corps partagé avant authentification (64 Ko / 5 secondes) plus une limite par IP des requêtes en cours avant la vérification de signature.
- La **protection contre la relecture** des Webhooks est activée pour Twilio et Plivo. Les requêtes Webhook valides rejouées sont acquittées mais ignorées pour les effets de bord.
- Les tours de conversation Twilio incluent un jeton par tour dans les callbacks `<Gather>`, afin que les callbacks vocaux obsolètes ou rejoués ne puissent pas satisfaire un tour de transcription en attente plus récent.
- Les requêtes Webhook non authentifiées sont rejetées avant la lecture du corps lorsque les en-têtes de signature requis du fournisseur sont absents.
- Le Webhook voice-call utilise le profil de corps pré-authentification partagé (64 Ko / 5 secondes) ainsi quun plafond par IP sur les requêtes en cours avant la vérification de signature.
Exemple avec un hôte public stable :
@ -689,14 +685,14 @@ openclaw voicecall expose --mode funnel
```
Lorsque le Gateway est déjà en cours dexécution, les commandes opérationnelles `voicecall` délèguent
au runtime voice-call détenu par le Gateway afin que la CLI ne lie pas un second
serveur Webhook. Si aucun Gateway nest joignable, les commandes reviennent à un
au runtime dappels vocaux détenu par le Gateway afin que la CLI ne lie pas un second
serveur Webhook. Si aucun Gateway nest joignable, les commandes se rabattent sur un
runtime CLI autonome.
`latency` lit `calls.jsonl` depuis le chemin de stockage par défaut des appels vocaux.
Utilisez `--file <path>` pour pointer vers un journal différent et `--last <n>` pour limiter
`latency` lit `calls.jsonl` depuis le chemin de stockage dappels vocaux par défaut.
Utilisez `--file <path>` pour pointer vers un autre journal et `--last <n>` pour limiter
lanalyse aux N derniers enregistrements (200 par défaut). La sortie inclut p50/p90/p99
pour la latence des tours et les temps dattente découte.
pour la latence de tour et les temps dattente découte.
## Outil dagent
@ -711,7 +707,7 @@ Nom de loutil : `voice_call`.
| `end_call` | `callId` |
| `get_status` | `callId` |
Ce dépôt inclut une documentation Skill correspondante à `skills/voice-call/SKILL.md`.
Ce dépôt fournit une documentation de skill correspondante dans `skills/voice-call/SKILL.md`.
## RPC Gateway
@ -725,12 +721,12 @@ Ce dépôt inclut une documentation Skill correspondante à `skills/voice-call/S
| `voicecall.status` | `callId` |
`dtmfSequence` nest valide quavec `mode: "conversation"`. Les appels en mode notification
doivent utiliser `voicecall.dtmf` après lexistence de lappel sils ont besoin de chiffres
après la connexion.
doivent utiliser `voicecall.dtmf` après la création de lappel sils ont besoin de chiffres
après connexion.
## Dépannage
### La configuration échoue lors de lexposition du webhook
### Lexposition du Webhook échoue pendant la configuration
Exécutez la configuration depuis le même environnement que celui qui exécute le Gateway :
@ -739,19 +735,19 @@ openclaw voicecall setup
openclaw voicecall setup --json
```
Pour `twilio`, `telnyx` et `plivo`, `webhook-exposure` doit être au vert. Une
configuration de `publicUrl` échoue toujours lorsquelle pointe vers un espace réseau local
ou privé, car lopérateur ne peut pas rappeler ces adresses. Nutilisez pas
Pour `twilio`, `telnyx` et `plivo`, `webhook-exposure` doit être au vert. Un
`publicUrl` configuré échoue quand même sil pointe vers un espace réseau local ou privé,
car lopérateur ne peut pas rappeler ces adresses. Nutilisez pas
`localhost`, `127.0.0.1`, `0.0.0.0`, `10.x`, `172.16.x`-`172.31.x`,
`192.168.x`, `169.254.x`, `fc00::/7` ou `fd00::/8` comme `publicUrl`.
Les appels sortants Twilio en mode notification envoient leur TwiML `<Say>` initial directement dans
la requête de création dappel ; le premier message prononcé ne dépend donc pas de Twilio
récupérant le TwiML du webhook. Un webhook public reste requis pour les rappels détat,
les appels conversationnels, le DTMF avant connexion, les flux en temps réel et le contrôle dappel
après connexion.
la requête de création dappel ; le premier message parlé ne dépend donc pas de la récupération
du TwiML de Webhook par Twilio. Un Webhook public reste requis pour les rappels de statut,
les appels conversationnels, le DTMF avant connexion, les flux temps réel et le contrôle
dappel après connexion.
Utilisez une méthode dexposition publique :
Utilisez un chemin dexposition public :
```json5
{
@ -778,7 +774,7 @@ openclaw voicecall setup
openclaw voicecall smoke
```
`voicecall smoke` est une simulation, sauf si vous passez `--yes`.
`voicecall smoke` est une exécution à blanc sauf si vous passez `--yes`.
### Les identifiants du fournisseur échouent
@ -791,18 +787,18 @@ Vérifiez le fournisseur sélectionné et les champs didentifiants requis :
- Plivo : `plivo.authId`, `plivo.authToken` et `fromNumber`.
Les identifiants doivent exister sur lhôte du Gateway. Modifier un profil shell local
naffecte pas un Gateway déjà en cours dexécution tant quil na pas redémarré ou rechargé son
environnement.
naffecte pas un Gateway déjà en cours dexécution tant quil ne redémarre pas ou ne recharge pas
son environnement.
### Les appels démarrent mais les webhooks du fournisseur narrivent pas
### Les appels démarrent mais les Webhooks du fournisseur narrivent pas
Confirmez que la console du fournisseur pointe vers lURL exacte du webhook public :
Confirmez que la console du fournisseur pointe vers lURL exacte du Webhook public :
```text
https://voice.example.com/voice/webhook
```
Inspectez ensuite létat à lexécution :
Puis inspectez létat du runtime :
```bash
openclaw voicecall status --call-id <id>
@ -815,13 +811,13 @@ Causes courantes :
- `publicUrl` pointe vers un chemin différent de `serve.path`.
- LURL du tunnel a changé après le démarrage du Gateway.
- Un proxy transfère la requête mais supprime ou réécrit les en-têtes dhôte/protocole.
- Le pare-feu ou le DNS achemine le nom dhôte public ailleurs que vers le Gateway.
- Le pare-feu ou le DNS route le nom dhôte public ailleurs que vers le Gateway.
- Le Gateway a été redémarré sans que le Plugin Voice Call soit activé.
Lorsquun proxy inverse ou un tunnel se trouve devant le Gateway, définissez
`webhookSecurity.allowedHosts` sur le nom dhôte public, ou utilisez
`webhookSecurity.trustedProxyIPs` pour une adresse de proxy connue. Utilisez
`webhookSecurity.trustForwardingHeaders` uniquement lorsque la limite du proxy est sous
`webhookSecurity.trustForwardingHeaders` uniquement lorsque la frontière du proxy est sous
votre contrôle.
### La vérification de signature échoue
@ -829,14 +825,14 @@ votre contrôle.
Les signatures du fournisseur sont vérifiées par rapport à lURL publique quOpenClaw reconstruit
à partir de la requête entrante. Si les signatures échouent :
- Confirmez que lURL du webhook du fournisseur correspond exactement à `publicUrl`, y compris
- Confirmez que lURL du Webhook du fournisseur correspond exactement à `publicUrl`, y compris
le schéma, lhôte et le chemin.
- Pour les URL ngrok de loffre gratuite, mettez à jour `publicUrl` lorsque le nom dhôte du tunnel change.
- Pour les URL ngrok en offre gratuite, mettez à jour `publicUrl` lorsque le nom dhôte du tunnel change.
- Assurez-vous que le proxy préserve les en-têtes dhôte et de protocole dorigine, ou configurez
`webhookSecurity.allowedHosts`.
- Nactivez pas `skipSignatureVerification` en dehors des tests locaux.
### Les connexions Google Meet Twilio échouent
### Les connexions Google Meet via Twilio échouent
Google Meet utilise ce Plugin pour les connexions par appel Twilio. Vérifiez dabord Voice Call :
@ -845,19 +841,19 @@ openclaw voicecall setup
openclaw voicecall smoke --to "+15555550123"
```
Vérifiez ensuite explicitement le transport Google Meet :
Puis vérifiez explicitement le transport Google Meet :
```bash
openclaw googlemeet setup --transport twilio
```
Si Voice Call est au vert mais que le participant Meet ne rejoint jamais la réunion, vérifiez le
numéro dappel Meet, le PIN et `--dtmf-sequence`. Lappel téléphonique peut être sain alors que
la réunion rejette ou ignore une séquence DTMF incorrecte.
Si Voice Call est au vert mais que le participant Meet ne rejoint jamais, vérifiez le numéro
dappel entrant Meet, le code PIN et `--dtmf-sequence`. Lappel téléphonique peut être sain tandis
que la réunion rejette ou ignore une séquence DTMF incorrecte.
Google Meet transmet la séquence DTMF Meet et le texte dintroduction à `voicecall.start`.
Pour les appels Twilio, Voice Call sert dabord le TwiML DTMF, redirige vers le
webhook, puis ouvre le flux multimédia en temps réel afin que lintroduction enregistrée soit générée
Webhook, puis ouvre le flux média temps réel afin que lintroduction enregistrée soit générée
après que le participant téléphonique a rejoint la réunion.
Utilisez `openclaw logs --follow` pour la trace en direct de la phase. Une connexion Twilio Meet
@ -865,28 +861,28 @@ saine journalise cet ordre :
- Google Meet délègue la connexion Twilio à Voice Call.
- Voice Call stocke le TwiML DTMF avant connexion.
- Le TwiML initial de Twilio est consommé et servi avant le traitement en temps réel.
- Voice Call sert le TwiML en temps réel pour lappel Twilio.
- Le pont en temps réel démarre avec le message daccueil initial en file dattente.
- Le TwiML initial Twilio est consommé et servi avant la gestion temps réel.
- Voice Call sert le TwiML temps réel pour lappel Twilio.
- Le pont temps réel démarre avec le message daccueil initial en file dattente.
`openclaw voicecall tail` affiche toujours les enregistrements dappel persistés ; il est utile pour
létat des appels et les transcriptions, mais toutes les transitions webhook/en temps réel ny
létat des appels et les transcriptions, mais toutes les transitions Webhook/temps réel ny
apparaissent pas.
### Lappel en temps réel na pas de parole
### Lappel temps réel na pas de parole
Confirmez quun seul mode audio est activé. `realtime.enabled` et
`streaming.enabled` ne peuvent pas tous deux être vrais.
`streaming.enabled` ne peuvent pas tous les deux être `true`.
Pour les appels Twilio en temps réel, vérifiez également :
Pour les appels Twilio temps réel, vérifiez aussi :
- Un Plugin fournisseur en temps réel est chargé et enregistré.
- Un Plugin fournisseur temps réel est chargé et enregistré.
- `realtime.provider` nest pas défini ou nomme un fournisseur enregistré.
- La clé API du fournisseur est disponible pour le processus Gateway.
- `openclaw logs --follow` affiche le TwiML en temps réel servi, le pont en temps réel
démarré et le message daccueil initial mis en file dattente.
- `openclaw logs --follow` montre que le TwiML temps réel a été servi, que le pont temps réel
a démarré et que le message daccueil initial a été mis en file dattente.
## Liens associés
## Associé
- [Mode conversation](/fr/nodes/talk)
- [Synthèse vocale](/fr/tools/tts)

View File

@ -1,32 +1,32 @@
---
read_when:
- Vous souhaitez utiliser la synthèse vocale ElevenLabs dans OpenClaw
- Vous souhaitez utiliser la reconnaissance vocale ElevenLabs Scribe pour les pièces jointes audio
- Vous souhaitez utiliser la transcription en temps réel ElevenLabs pour les appels vocaux
summary: Utilisez la parole ElevenLabs, Scribe STT et la transcription en temps réel avec OpenClaw
- Vous voulez la synthèse vocale ElevenLabs dans OpenClaw
- Vous souhaitez utiliser la transcription vocale ElevenLabs Scribe pour les pièces jointes audio
- Vous souhaitez la transcription en temps réel dElevenLabs pour Appel vocal ou Google Meet
summary: Utiliser la synthèse vocale ElevenLabs, Scribe STT et la transcription en temps réel avec OpenClaw
title: ElevenLabs
x-i18n:
generated_at: "2026-04-25T13:55:38Z"
model: gpt-5.4
generated_at: "2026-05-04T07:05:38Z"
model: gpt-5.5
provider: openai
source_hash: 1f858a344228c6355cd5fdc3775cddac39e0075f2e9fcf7683271f11be03a31a
source_hash: 4c880bf9dcab01ef70779c74576c70ea5d0203b96b5f739291842fafcb4bdb4b
source_path: providers/elevenlabs.md
workflow: 15
workflow: 16
---
OpenClaw utilise ElevenLabs pour la synthèse vocale, la reconnaissance vocale par lot avec Scribe
v2, et la reconnaissance vocale en streaming Voice Call avec Scribe v2 Realtime.
OpenClaw utilise ElevenLabs pour la synthèse vocale, la transcription vocale par lots avec Scribe
v2 et la STT en streaming avec Scribe v2 Realtime.
| Fonctionnalité | Surface OpenClaw | Valeur par défaut |
| ------------------------- | ---------------------------------------------- | ------------------------- |
| Synthèse vocale | `messages.tts` / `talk` | `eleven_multilingual_v2` |
| Reconnaissance vocale par lot | `tools.media.audio` | `scribe_v2` |
| Reconnaissance vocale en streaming | Voice Call `streaming.provider: "elevenlabs"` | `scribe_v2_realtime` |
| Capacité | Surface OpenClaw | Par défaut |
| ----------------------- | ---------------------------------------------------------------------- | ------------------------ |
| Synthèse vocale | `messages.tts` / `talk` | `eleven_multilingual_v2` |
| Transcription vocale par lots | `tools.media.audio` | `scribe_v2` |
| Transcription vocale en streaming | streaming dappel vocal ou Google Meet `realtime.transcriptionProvider` | `scribe_v2_realtime` |
## Authentification
Définissez `ELEVENLABS_API_KEY` dans lenvironnement. `XI_API_KEY` est également accepté pour
la compatibilité avec les outils ElevenLabs existants.
assurer la compatibilité avec les outils ElevenLabs existants.
```bash
export ELEVENLABS_API_KEY="..."
@ -50,10 +50,10 @@ export ELEVENLABS_API_KEY="..."
}
```
Définissez `modelId` sur `eleven_v3` pour utiliser la synthèse vocale ElevenLabs v3. OpenClaw conserve
Définissez `modelId` sur `eleven_v3` pour utiliser la TTS ElevenLabs v3. OpenClaw conserve
`eleven_multilingual_v2` comme valeur par défaut pour les installations existantes.
## Reconnaissance vocale
## Transcription vocale
Utilisez Scribe v2 pour les pièces jointes audio entrantes et les courts segments vocaux enregistrés :
@ -73,19 +73,19 @@ Utilisez Scribe v2 pour les pièces jointes audio entrantes et les courts segmen
OpenClaw envoie laudio multipart à ElevenLabs `/v1/speech-to-text` avec
`model_id: "scribe_v2"`. Les indications de langue sont mappées vers `language_code` lorsquelles sont présentes.
## Reconnaissance vocale en streaming Voice Call
## STT en streaming
Le Plugin `elevenlabs` intégré enregistre Scribe v2 Realtime pour la transcription
en streaming Voice Call.
Le Plugin `elevenlabs` fourni enregistre Scribe v2 Realtime pour lappel vocal et
la transcription en streaming en mode agent Google Meet.
| Paramètre | Chemin de config | Valeur par défaut |
| --------------- | ----------------------------------------------------------------------- | -------------------------------------------------- |
| Clé API | `plugins.entries.voice-call.config.streaming.providers.elevenlabs.apiKey` | Revient à `ELEVENLABS_API_KEY` / `XI_API_KEY` |
| Modèle | `...elevenlabs.modelId` | `scribe_v2_realtime` |
| Format audio | `...elevenlabs.audioFormat` | `ulaw_8000` |
| Fréquence déchantillonnage | `...elevenlabs.sampleRate` | `8000` |
| Stratégie de validation | `...elevenlabs.commitStrategy` | `vad` |
| Langue | `...elevenlabs.languageCode` | (non défini) |
| Paramètre | Chemin de configuration | Par défaut |
| --------------- | ------------------------------------------------------------------------- | ------------------------------------------------- |
| Clé API | `plugins.entries.voice-call.config.streaming.providers.elevenlabs.apiKey` | Se rabat sur `ELEVENLABS_API_KEY` / `XI_API_KEY` |
| Modèle | `...elevenlabs.modelId` | `scribe_v2_realtime` |
| Format audio | `...elevenlabs.audioFormat` | `ulaw_8000` |
| Fréquence déchantillonnage | `...elevenlabs.sampleRate` | `8000` |
| Stratégie de commit | `...elevenlabs.commitStrategy` | `vad` |
| Langue | `...elevenlabs.languageCode` | (non défini) |
```json5
{
@ -113,12 +113,18 @@ en streaming Voice Call.
```
<Note>
Voice Call reçoit les médias Twilio en G.711 u-law à 8 kHz. Le fournisseur temps réel ElevenLabs
utilise par défaut `ulaw_8000`, ce qui permet de transférer les trames de téléphonie sans
Lappel vocal reçoit les médias Twilio en u-law G.711 à 8 kHz. Le fournisseur temps réel ElevenLabs
utilise `ulaw_8000` par défaut, ce qui permet de transférer les trames téléphoniques sans
transcodage.
</Note>
## Liens connexes
Pour le mode agent Google Meet, définissez
`plugins.entries.google-meet.config.realtime.transcriptionProvider` sur
`"elevenlabs"` et configurez le même bloc de fournisseur sous
`plugins.entries.google-meet.config.realtime.providers.elevenlabs`.
## Connexe
- [Synthèse vocale](/fr/tools/tts)
- [Google Meet](/fr/plugins/google-meet)
- [Sélection de modèle](/fr/concepts/model-providers)

View File

@ -5,25 +5,25 @@ read_when:
summary: Configuration de Google Gemini (clé API + OAuth, génération dimages, compréhension des médias, TTS, recherche web)
title: Google (Gemini)
x-i18n:
generated_at: "2026-05-02T07:16:26Z"
generated_at: "2026-05-04T07:05:35Z"
model: gpt-5.5
provider: openai
source_hash: 14605b88f0d1d7e01796d429113a73b2b52a48fde6443565dcb3db47653be5e7
source_hash: 3e45627f5d5cd57e858c7590a90435b7fc0e9381509f3312a16fc9e9a4cbd908
source_path: providers/google.md
workflow: 16
---
Le Plugin Google donne accès aux modèles Gemini via Google AI Studio, ainsi quà
la génération dimages, à la compréhension des médias (image/audio/vidéo), à la synthèse vocale et à la recherche web via
Le Plugin Google fournit laccès aux modèles Gemini via Google AI Studio, ainsi que
la génération dimages, la compréhension des médias (image/audio/vidéo), la synthèse vocale et la recherche web via
Gemini Grounding.
- Fournisseur : `google`
- Authentification : `GEMINI_API_KEY` ou `GOOGLE_API_KEY`
- API : API Google Gemini
- Option dexécution : `agents.defaults.agentRuntime.id: "google-gemini-cli"`
réutilise lOAuth Gemini CLI tout en conservant les références de modèle canoniques sous la forme `google/*`.
réutilise lOAuth de Gemini CLI tout en conservant les références de modèles canoniques sous la forme `google/*`.
## Premiers pas
## Bien démarrer
Choisissez votre méthode dauthentification préférée et suivez les étapes de configuration.
@ -32,7 +32,7 @@ Choisissez votre méthode dauthentification préférée et suivez les étapes
**Idéal pour :** laccès standard à lAPI Gemini via Google AI Studio.
<Steps>
<Step title="Exécuter lintégration">
<Step title="Lancer lintégration">
```bash
openclaw onboard --auth-choice gemini-api-key
```
@ -75,7 +75,7 @@ Choisissez votre méthode dauthentification préférée et suivez les étapes
<Warning>
Le fournisseur `google-gemini-cli` est une intégration non officielle. Certains utilisateurs
signalent des restrictions de compte lorsquils utilisent OAuth de cette façon. Utilisez-le à vos propres risques.
signalent des restrictions de compte lors de lutilisation dOAuth de cette manière. Utilisez-le à vos propres risques.
</Warning>
<Steps>
@ -90,7 +90,7 @@ Choisissez votre méthode dauthentification préférée et suivez les étapes
npm install -g @google/gemini-cli
```
OpenClaw prend en charge les installations Homebrew et les installations npm globales, y compris
OpenClaw prend en charge les installations Homebrew ainsi que les installations npm globales, y compris
les dispositions Windows/npm courantes.
</Step>
<Step title="Se connecter via OAuth">
@ -109,7 +109,7 @@ Choisissez votre méthode dauthentification préférée et suivez les étapes
- Runtime : `google-gemini-cli`
- Alias : `gemini-cli`
Lidentifiant de modèle Gemini API de Gemini 3.1 Pro est `gemini-3.1-pro-preview`. OpenClaw accepte le plus court `google/gemini-3.1-pro` comme alias pratique et le normalise avant les appels au fournisseur.
Lidentifiant de modèle de Gemini 3.1 Pro dans lAPI Gemini est `gemini-3.1-pro-preview`. OpenClaw accepte la forme plus courte `google/gemini-3.1-pro` comme alias pratique et la normalise avant les appels au fournisseur.
**Variables denvironnement :**
@ -119,8 +119,8 @@ Choisissez votre méthode dauthentification préférée et suivez les étapes
(Ou les variantes `GEMINI_CLI_*`.)
<Note>
Si les requêtes OAuth Gemini CLI échouent après la connexion, définissez `GOOGLE_CLOUD_PROJECT` ou
`GOOGLE_CLOUD_PROJECT_ID` sur lhôte Gateway puis réessayez.
Si les requêtes OAuth de Gemini CLI échouent après la connexion, définissez `GOOGLE_CLOUD_PROJECT` ou
`GOOGLE_CLOUD_PROJECT_ID` sur lhôte du Gateway et réessayez.
</Note>
<Note>
@ -128,32 +128,32 @@ Choisissez votre méthode dauthentification préférée et suivez les étapes
est installée et présente dans `PATH`.
</Note>
Les références de modèle `google-gemini-cli/*` sont des alias de compatibilité hérités. Les nouvelles
configurations doivent utiliser des références de modèle `google/*` avec le runtime `google-gemini-cli`
lorsquelles veulent une exécution locale avec Gemini CLI.
Les références de modèles `google-gemini-cli/*` sont des alias de compatibilité hérités. Les nouvelles
configurations doivent utiliser les références de modèles `google/*`, ainsi que le runtime `google-gemini-cli`
lorsquelles souhaitent une exécution locale de Gemini CLI.
</Tab>
</Tabs>
## Fonctionnalités
| Fonctionnalité | Pris en charge |
| ------------------------------ | ------------------------------ |
| Complétions de chat | Oui |
| Génération dimages | Oui |
| Génération de musique | Oui |
| Synthèse vocale | Oui |
| Voix en temps réel | Oui (API Google Live) |
| Compréhension dimages | Oui |
| Transcription audio | Oui |
| Compréhension de vidéos | Oui |
| Recherche web (Grounding) | Oui |
| Pensée/raisonnement | Oui (Gemini 2.5+ / Gemini 3+) |
| Modèles Gemma 4 | Oui |
| Fonctionnalité | Pris en charge |
| ---------------------- | ----------------------------- |
| Complétions de chat | Oui |
| Génération dimages | Oui |
| Génération de musique | Oui |
| Synthèse vocale | Oui |
| Voix en temps réel | Oui (Google Live API) |
| Compréhension des images | Oui |
| Transcription audio | Oui |
| Compréhension vidéo | Oui |
| Recherche web (Grounding) | Oui |
| Réflexion/raisonnement | Oui (Gemini 2.5+ / Gemini 3+) |
| Modèles Gemma 4 | Oui |
## Recherche web
Le fournisseur de recherche web `gemini` intégré utilise le grounding de Google Search de Gemini.
Le fournisseur de recherche web `gemini` intégré utilise le grounding de Gemini Google Search.
Configurez une clé de recherche dédiée sous `plugins.entries.google.config.webSearch`,
ou laissez-le réutiliser `models.providers.google.apiKey` après `GEMINI_API_KEY` :
@ -177,24 +177,24 @@ ou laissez-le réutiliser `models.providers.google.apiKey` après `GEMINI_API_KE
Lordre de priorité des identifiants est `webSearch.apiKey` dédié, puis `GEMINI_API_KEY`,
puis `models.providers.google.apiKey`. `webSearch.baseUrl` est facultatif et
existe pour les proxys dopérateur ou les points de terminaison compatibles avec lAPI Gemini ; lorsquil est omis,
existe pour les proxys dopérateurs ou les points de terminaison compatibles avec lAPI Gemini ; lorsquil est omis,
la recherche web Gemini réutilise `models.providers.google.baseUrl`. Consultez
[Recherche Gemini](/fr/tools/gemini-search) pour le comportement doutil propre à ce fournisseur.
[Recherche Gemini](/fr/tools/gemini-search) pour le comportement de loutil propre à ce fournisseur.
<Tip>
Les modèles Gemini 3 utilisent `thinkingLevel` plutôt que `thinkingBudget`. OpenClaw mappe
les contrôles de raisonnement des alias Gemini 3, Gemini 3.1 et `gemini-*-latest` vers
`thinkingLevel`, afin que les exécutions par défaut/à faible latence nenvoient pas de valeurs
`thinkingLevel` afin que les exécutions par défaut/à faible latence nenvoient pas de valeurs
`thinkingBudget` désactivées.
`/think adaptive` conserve la sémantique de pensée dynamique de Google au lieu de choisir
`/think adaptive` conserve la sémantique de réflexion dynamique de Google au lieu de choisir
un niveau OpenClaw fixe. Gemini 3 et Gemini 3.1 omettent un `thinkingLevel` fixe afin que
Google puisse choisir le niveau ; Gemini 2.5 envoie la sentinelle dynamique de Google
`thinkingBudget: -1`.
Les modèles Gemma 4 (par exemple `gemma-4-26b-a4b-it`) prennent en charge le mode pensée. OpenClaw
réécrit `thinkingBudget` vers un `thinkingLevel` Google pris en charge pour Gemma 4.
Définir la pensée sur `off` conserve la pensée désactivée au lieu de la mapper vers
Les modèles Gemma 4 (par exemple `gemma-4-26b-a4b-it`) prennent en charge le mode réflexion. OpenClaw
réécrit `thinkingBudget` en un `thinkingLevel` Google pris en charge pour Gemma 4.
Définir la réflexion sur `off` conserve la réflexion désactivée au lieu de la mapper vers
`MINIMAL`.
</Tip>
@ -206,7 +206,7 @@ Le fournisseur de génération dimages `google` intégré utilise par défaut
- Prend également en charge `google/gemini-3-pro-image-preview`
- Génération : jusquà 4 images par requête
- Mode édition : activé, jusquà 5 images dentrée
- Contrôles de géométrie : `size`, `aspectRatio` et `resolution`
- Contrôles géométriques : `size`, `aspectRatio` et `resolution`
Pour utiliser Google comme fournisseur dimages par défaut :
@ -223,16 +223,16 @@ Pour utiliser Google comme fournisseur dimages par défaut :
```
<Note>
Consultez [Génération dimages](/fr/tools/image-generation) pour les paramètres doutil partagés, la sélection du fournisseur et le comportement de basculement.
Consultez [Génération dimages](/fr/tools/image-generation) pour les paramètres partagés de loutil, la sélection du fournisseur et le comportement de basculement.
</Note>
## Génération de vidéos
## Génération vidéo
Le Plugin `google` intégré enregistre aussi la génération de vidéos via loutil partagé
Le Plugin `google` intégré enregistre également la génération vidéo via loutil partagé
`video_generate`.
- Modèle vidéo par défaut : `google/veo-3.1-fast-generate-preview`
- Modes : texte-vers-vidéo, image-vers-vidéo et flux de référence à une seule vidéo
- Modes : texte vers vidéo, image vers vidéo et flux de référence à vidéo unique
- Prend en charge `aspectRatio`, `resolution` et `audio`
- Limite de durée actuelle : **4 à 8 secondes**
@ -251,20 +251,20 @@ Pour utiliser Google comme fournisseur vidéo par défaut :
```
<Note>
Consultez [Génération de vidéos](/fr/tools/video-generation) pour les paramètres doutil partagés, la sélection du fournisseur et le comportement de basculement.
Consultez [Génération vidéo](/fr/tools/video-generation) pour les paramètres partagés de loutil, la sélection du fournisseur et le comportement de basculement.
</Note>
## Génération de musique
Le Plugin `google` intégré enregistre aussi la génération de musique via loutil partagé
Le Plugin `google` intégré enregistre également la génération de musique via loutil partagé
`music_generate`.
- Modèle musical par défaut : `google/lyria-3-clip-preview`
- Modèle de musique par défaut : `google/lyria-3-clip-preview`
- Prend également en charge `google/lyria-3-pro-preview`
- Contrôles de prompt : `lyrics` et `instrumental`
- Format de sortie : `mp3` par défaut, plus `wav` sur `google/lyria-3-pro-preview`
- Entrées de référence : jusquà 10 images
- Les exécutions adossées à une session se détachent via le flux partagé tâche/statut, y compris `action: "status"`
- Les exécutions appuyées par une session se détachent via le flux partagé de tâche/état, y compris `action: "status"`
Pour utiliser Google comme fournisseur de musique par défaut :
@ -281,18 +281,18 @@ Pour utiliser Google comme fournisseur de musique par défaut :
```
<Note>
Consultez [Génération de musique](/fr/tools/music-generation) pour les paramètres doutil partagés, la sélection du fournisseur et le comportement de basculement.
Consultez [Génération de musique](/fr/tools/music-generation) pour les paramètres partagés de loutil, la sélection du fournisseur et le comportement de basculement.
</Note>
## Synthèse vocale
Le fournisseur vocal `google` intégré utilise le chemin TTS de lAPI Gemini avec
Le fournisseur de parole `google` intégré utilise le chemin TTS de lAPI Gemini avec
`gemini-3.1-flash-tts-preview`.
- Voix par défaut : `Kore`
- Authentification : `messages.tts.providers.google.apiKey`, `models.providers.google.apiKey`, `GEMINI_API_KEY` ou `GOOGLE_API_KEY`
- Sortie : WAV pour les pièces jointes TTS classiques, Opus pour les cibles de note vocale, PCM pour Talk/téléphonie
- Sortie note vocale : le PCM Google est encapsulé en WAV et transcodé en Opus 48 kHz avec `ffmpeg`
- Sortie : WAV pour les pièces jointes TTS classiques, Opus pour les cibles de notes vocales, PCM pour Talk/téléphonie
- Sortie de note vocale : le PCM Google est encapsulé en WAV et transcodé en Opus 48 kHz avec `ffmpeg`
Pour utiliser Google comme fournisseur TTS par défaut :
@ -314,12 +314,12 @@ Pour utiliser Google comme fournisseur TTS par défaut :
}
```
Gemini API TTS utilise des prompts en langage naturel pour contrôler le style. Définissez
`audioProfile` pour préfixer le texte à prononcer avec un prompt de style réutilisable. Définissez
`speakerName` lorsque votre texte de prompt fait référence à un locuteur nommé.
Le TTS de lAPI Gemini utilise des prompts en langage naturel pour contrôler le style. Définissez
`audioProfile` pour préfixer le texte prononcé avec un prompt de style réutilisable. Définissez
`speakerName` lorsque le texte de votre prompt fait référence à un locuteur nommé.
Gemini API TTS accepte aussi des balises audio expressives entre crochets dans le texte,
comme `[whispers]` ou `[laughs]`. Pour éviter que ces balises apparaissent dans la réponse de chat visible
Le TTS de lAPI Gemini accepte également des balises audio expressives entre crochets dans le texte,
comme `[whispers]` ou `[laughs]`. Pour exclure les balises de la réponse de chat visible
tout en les envoyant au TTS, placez-les dans un bloc `[[tts:text]]...[[/tts:text]]` :
```text
@ -330,7 +330,7 @@ Here is the clean reply text.
<Note>
Une clé API Google Cloud Console limitée à lAPI Gemini est valide pour ce
fournisseur. Il ne sagit pas du chemin distinct de lAPI Cloud Text-to-Speech.
fournisseur. Il ne sagit pas du chemin séparé de lAPI Cloud Text-to-Speech.
</Note>
## Voix en temps réel
@ -338,20 +338,22 @@ fournisseur. Il ne sagit pas du chemin distinct de lAPI Cloud Text-to-Spee
Le Plugin `google` intégré enregistre un fournisseur de voix en temps réel adossé à
lAPI Gemini Live pour les ponts audio backend tels que Voice Call et Google Meet.
| Paramètre | Chemin de configuration | Valeur par défaut |
| -------------------------- | ------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------ |
| Modèle | `plugins.entries.voice-call.config.realtime.providers.google.model` | `gemini-2.5-flash-native-audio-preview-12-2025` |
| Voix | `...google.voice` | `Kore` |
| Température | `...google.temperature` | (non défini) |
| Sensibilité de début VAD | `...google.startSensitivity` | (non défini) |
| Sensibilité de fin VAD | `...google.endSensitivity` | (non défini) |
| Durée de silence | `...google.silenceDurationMs` | (non défini) |
| Gestion de lactivité | `...google.activityHandling` | Valeur par défaut de Google, `start-of-activity-interrupts` |
| Couverture du tour | `...google.turnCoverage` | Valeur par défaut de Google, `only-activity` |
| Désactiver VAD automatique | `...google.automaticActivityDetectionDisabled` | `false` |
| Clé API | `...google.apiKey` | Se rabat sur `models.providers.google.apiKey`, `GEMINI_API_KEY` ou `GOOGLE_API_KEY` |
| Paramètre | Chemin de configuration | Valeur par défaut |
| --------------------- | ------------------------------------------------------------------- | ------------------------------------------------------------------------------------- |
| Modèle | `plugins.entries.voice-call.config.realtime.providers.google.model` | `gemini-2.5-flash-native-audio-preview-12-2025` |
| Voix | `...google.voice` | `Kore` |
| Température | `...google.temperature` | (non défini) |
| Sensibilité de début VAD | `...google.startSensitivity` | (non défini) |
| Sensibilité de fin VAD | `...google.endSensitivity` | (non défini) |
| Durée du silence | `...google.silenceDurationMs` | (non défini) |
| Gestion de lactivité | `...google.activityHandling` | Valeur par défaut de Google, `start-of-activity-interrupts` |
| Couverture du tour | `...google.turnCoverage` | Valeur par défaut de Google, `only-activity` |
| Désactiver la VAD automatique | `...google.automaticActivityDetectionDisabled` | `false` |
| Reprise de session | `...google.sessionResumption` | `true` |
| Compression du contexte | `...google.contextWindowCompression` | `true` |
| Clé API | `...google.apiKey` | Se replie sur `models.providers.google.apiKey`, `GEMINI_API_KEY` ou `GOOGLE_API_KEY` |
Exemple de configuration en temps réel de Voice Call :
Exemple de configuration temps réel Voice Call :
```json5
{
@ -380,24 +382,25 @@ Exemple de configuration en temps réel de Voice Call :
```
<Note>
Google Live API utilise laudio bidirectionnel et les appels de fonctions via un WebSocket.
OpenClaw adapte laudio du pont téléphonie/Meet au flux Gemini PCM Live API et
Google Live API utilise laudio bidirectionnel et lappel de fonctions via un WebSocket.
OpenClaw adapte laudio de téléphonie/pont Meet au flux PCM Live API de Gemini et
conserve les appels doutils sur le contrat vocal temps réel partagé. Laissez `temperature`
non défini sauf si vous devez modifier léchantillonnage ; OpenClaw omet les valeurs non positives
non défini, sauf si vous devez modifier léchantillonnage ; OpenClaw omet les valeurs non positives,
car Google Live peut renvoyer des transcriptions sans audio pour `temperature: 0`.
La transcription Gemini API est activée sans `languageCodes` ; le SDK Google actuel
rejette les indications de code de langue sur ce chemin dAPI.
</Note>
<Note>
Control UI Talk prend en charge les sessions navigateur Google Live avec des jetons à usage unique contraints.
Les fournisseurs de voix temps réel côté backend uniquement peuvent aussi passer par le transport relais générique
du Gateway, qui conserve les identifiants du fournisseur sur le Gateway.
Control UI Talk prend en charge les sessions Google Live dans le navigateur avec des
jetons contraints à usage unique. Les fournisseurs vocaux temps réel côté backend uniquement
peuvent aussi passer par le transport de relais générique du Gateway, qui conserve
les identifiants du fournisseur sur le Gateway.
</Note>
Pour la vérification en direct par les mainteneurs, exécutez
Pour la vérification live par les mainteneurs, exécutez
`OPENAI_API_KEY=... GEMINI_API_KEY=... node --import tsx scripts/dev/realtime-talk-live-smoke.ts`.
La partie Google émet la même forme de jeton Live API contraint que celle utilisée par Control
Le segment Google émet la même forme de jeton contraint Live API que celle utilisée par Control
UI Talk, ouvre le point de terminaison WebSocket du navigateur, envoie la charge utile de configuration initiale
et attend `setupComplete`.
@ -412,8 +415,8 @@ et attend `setupComplete`.
`cachedContent` ou lancien `cached_content`
- Si les deux sont présents, `cachedContent` lemporte
- Exemple de valeur : `cachedContents/prebuilt-context`
- Lutilisation dun cache hit Gemini est normalisée dans OpenClaw `cacheRead` depuis
le champ amont `cachedContentTokenCount`
- Lutilisation des succès de cache Gemini est normalisée dans `cacheRead` OpenClaw à partir de
`cachedContentTokenCount` en amont
```json5
{
@ -438,33 +441,33 @@ et attend `setupComplete`.
la sortie JSON de la CLI comme suit :
- Le texte de réponse provient du champ `response` du JSON de la CLI.
- Lutilisation se rabat sur `stats` lorsque la CLI laisse `usage` vide.
- `stats.cached` est normalisé dans OpenClaw `cacheRead`.
- Si `stats.input` est absent, OpenClaw déduit les jetons dentrée depuis
- Lutilisation se replie sur `stats` lorsque la CLI laisse `usage` vide.
- `stats.cached` est normalisé dans `cacheRead` OpenClaw.
- Si `stats.input` est absent, OpenClaw déduit les jetons dentrée de
`stats.input_tokens - stats.cached`.
</Accordion>
<Accordion title="Configuration de lenvironnement et du démon">
Si le Gateway sexécute comme démon (launchd/systemd), assurez-vous que `GEMINI_API_KEY`
est disponible pour ce processus (par exemple dans `~/.openclaw/.env` ou via
<Accordion title="Configuration de lenvironnement et du daemon">
Si le Gateway sexécute comme daemon (launchd/systemd), assurez-vous que `GEMINI_API_KEY`
est disponible pour ce processus (par exemple, dans `~/.openclaw/.env` ou via
`env.shellEnv`).
</Accordion>
</AccordionGroup>
## Associé
## Associés
<CardGroup cols={2}>
<Card title="Sélection du modèle" href="/fr/concepts/model-providers" icon="layers">
Choix des fournisseurs, des références de modèles et du comportement de bascule.
Choix des fournisseurs, des références de modèle et du comportement de basculement.
</Card>
<Card title="Génération dimages" href="/fr/tools/image-generation" icon="image">
Paramètres doutil dimage partagés et sélection du fournisseur.
<Card title="Génération dimage" href="/fr/tools/image-generation" icon="image">
Paramètres partagés de loutil image et sélection du fournisseur.
</Card>
<Card title="Génération de vidéos" href="/fr/tools/video-generation" icon="video">
Paramètres doutil vidéo partagés et sélection du fournisseur.
<Card title="Génération de vidéo" href="/fr/tools/video-generation" icon="video">
Paramètres partagés de loutil vidéo et sélection du fournisseur.
</Card>
<Card title="Génération de musique" href="/fr/tools/music-generation" icon="music">
Paramètres doutil musical partagés et sélection du fournisseur.
Paramètres partagés de loutil musique et sélection du fournisseur.
</Card>
</CardGroup>

View File

@ -1,181 +1,283 @@
---
read_when:
- Recherche des définitions des canaux de publication publics
- Exécution de la validation de version ou de lacceptation du package
- Recherche de la nomenclature et de la cadence des versions
summary: Voies de publication, liste de contrôle opérateur, boîtes de validation, nommage des versions et cadence
- Exécuter la validation de version ou lacceptation de package
- Recherche de la nomenclature des versions et de la cadence
summary: Voies de publication, liste de contrôle de lopérateur, boîtes de validation, nommage des versions et cadence
title: Politique de publication
x-i18n:
generated_at: "2026-05-03T21:37:55Z"
generated_at: "2026-05-04T07:06:00Z"
model: gpt-5.5
provider: openai
source_hash: 566088d826e1e2bac21b11443b82b62cb73ed1fd9c508c3fb865149cf8a428ba
source_hash: ef50d3ef5d1e23b4e2c2b097fc4ca9f6d46bf8acb9aea0c9bca6d14e213b88b6
source_path: reference/RELEASING.md
workflow: 16
---
OpenClaw comporte trois canaux de publication publics :
OpenClaw propose trois canaux de publication publics :
- stable : versions balisées publiées sur npm `beta` par défaut, ou sur npm `latest` sur demande explicite
- beta : balises de préversion publiées sur npm `beta`
- dev : tête mouvante de `main`
- stable : versions étiquetées qui publient vers npm `beta` par défaut, ou vers npm `latest` lorsque cela est explicitement demandé
- beta : balises de préversion qui publient vers npm `beta`
- dev : la tête mobile de `main`
## Nommage des versions
- Version de publication stable : `YYYY.M.D`
- Balise Git : `vYYYY.M.D`
- Version corrective stable : `YYYY.M.D-N`
- Version de publication corrective stable : `YYYY.M.D-N`
- Balise Git : `vYYYY.M.D-N`
- Version de préversion bêta : `YYYY.M.D-beta.N`
- Version de prépublication beta : `YYYY.M.D-beta.N`
- Balise Git : `vYYYY.M.D-beta.N`
- Ne pas ajouter de zéro initial au mois ni au jour
- Ne pas compléter le mois ou le jour avec un zéro initial
- `latest` désigne la version stable npm actuellement promue
- `beta` désigne la cible dinstallation bêta actuelle
- Les publications stables et correctives stables sont publiées sur npm `beta` par défaut ; les opérateurs de publication peuvent cibler explicitement `latest`, ou promouvoir ultérieurement une build bêta validée
- `beta` désigne la cible dinstallation beta actuelle
- Les publications stables et correctives stables publient vers npm `beta` par défaut ; les opérateurs de publication peuvent cibler explicitement `latest`, ou promouvoir ultérieurement une build beta validée
- Chaque publication stable dOpenClaw livre ensemble le paquet npm et lapplication macOS ;
les publications bêta valident et publient normalement dabord le chemin npm/paquet, la
build/signature/notarisation de lapplication mac étant réservée aux versions stables sauf demande explicite
les publications beta valident et publient normalement dabord le chemin npm/paquet, la
compilation/signature/notarisation de lapplication Mac étant réservée aux versions stables sauf demande explicite
## Cadence de publication
- Les publications passent dabord par la bêta
- La stable ne suit quaprès validation de la dernière bêta
- Les mainteneurs créent normalement les publications depuis une branche `release/YYYY.M.D` créée
à partir de `main` courant, afin que la validation de publication et les correctifs ne bloquent pas le nouveau
- Les publications passent dabord par beta
- Stable suit seulement après validation de la dernière beta
- Les mainteneurs créent normalement les publications à partir dune branche `release/YYYY.M.D` créée
depuis le `main` actuel, afin que la validation et les correctifs de publication ne bloquent pas le nouveau
développement sur `main`
- Si une balise bêta a été poussée ou publiée et nécessite un correctif, les mainteneurs créent
la balise `-beta.N` suivante au lieu de supprimer ou recréer lancienne balise bêta
- Si une balise beta a été poussée ou publiée et nécessite un correctif, les mainteneurs créent
la balise `-beta.N` suivante au lieu de supprimer ou recréer lancienne balise beta
- La procédure de publication détaillée, les approbations, les identifiants et les notes de récupération sont
réservés aux mainteneurs
## Liste de contrôle de lopérateur de publication
Cette liste de contrôle décrit publiquement la structure du flux de publication. Les identifiants privés,
la signature, la notarisation, la récupération des dist-tags et les détails de rollback durgence restent dans
le runbook de publication réservé aux mainteneurs.
Cette liste de contrôle présente la forme publique du flux de publication. Les identifiants privés,
la signature, la notarisation, la récupération des dist-tags et les détails de restauration durgence restent dans
le guide de publication réservé aux mainteneurs.
1. Partir de `main` courant : récupérer la dernière version, confirmer que le commit cible est poussé,
et confirmer que la CI de `main` courant est suffisamment verte pour créer une branche depuis celui-ci.
1. Partir du `main` actuel : récupérer la dernière version, confirmer que le commit cible est poussé,
et confirmer que la CI du `main` actuel est suffisamment verte pour créer une branche depuis celui-ci.
2. Réécrire la section supérieure de `CHANGELOG.md` à partir de lhistorique réel des commits avec
`/changelog`, garder des entrées destinées aux utilisateurs, la commiter, la pousser, puis rebaser/récupérer
`/changelog`, garder les entrées orientées utilisateur, la commiter, la pousser, puis rebaser/récupérer
une fois de plus avant de créer la branche.
3. Examiner les enregistrements de compatibilité de publication dans
`src/plugins/compat/registry.ts` et
`src/commands/doctor/shared/deprecation-compat.ts`. Supprimer la compatibilité expirée
uniquement lorsque le chemin de mise à niveau reste couvert, ou consigner pourquoi elle est
intentionnellement conservée.
4. Créer `release/YYYY.M.D` depuis `main` courant ; ne pas effectuer le travail de publication normal
4. Créer `release/YYYY.M.D` depuis le `main` actuel ; ne pas effectuer le travail de publication normal
directement sur `main`.
5. Mettre à jour chaque emplacement de version requis pour la balise prévue, exécuter
`pnpm plugins:sync` afin que les paquets de Plugin publiables partagent la version de publication
et les métadonnées de compatibilité, puis exécuter le prévol déterministe local :
`pnpm plugins:sync` afin que les paquets Plugin publiables partagent la version de publication
et les métadonnées de compatibilité, puis exécuter la prévalidation déterministe locale :
`pnpm check:test-types`, `pnpm check:architecture`,
`pnpm build && pnpm ui:build`, `pnpm plugins:sync:check` et
`pnpm build && pnpm ui:build`, `pnpm plugins:sync:check`, et
`pnpm release:check`.
6. Exécuter `OpenClaw NPM Release` avec `preflight_only=true`. Avant lexistence dune balise,
un SHA complet de 40 caractères de la branche de publication est autorisé pour le prévol
de validation uniquement. Enregistrer le `preflight_run_id` réussi.
6. Exécuter `OpenClaw NPM Release` avec `preflight_only=true`. Avant quune balise existe,
un SHA complet de 40 caractères de la branche de publication est autorisé pour une prévalidation
uniquement destinée à la validation. Enregistrer le `preflight_run_id` réussi.
7. Lancer tous les tests de prépublication avec `Full Release Validation` pour la
branche de publication, la balise ou le SHA complet du commit. Cest le point dentrée manuel unique
pour les quatre grandes boîtes de tests de publication : Vitest, Docker, QA Lab et Package.
8. Si la validation échoue, corriger sur la branche de publication et réexécuter le plus petit
fichier, canal, job de workflow, profil de paquet, fournisseur ou allowlist de modèles en échec qui
prouve le correctif. Réexécuter lenveloppe complète uniquement lorsque la surface modifiée rend
pour les quatre grandes boîtes de test de publication : Vitest, Docker, QA Lab et Package.
8. Si la validation échoue, corriger sur la branche de publication et relancer le plus petit
fichier, canal, job de workflow, profil de paquet, fournisseur ou allowlist de modèle en échec qui
prouve le correctif. Relancer lumbrella complète uniquement lorsque la surface modifiée rend
les preuves antérieures obsolètes.
9. Pour la bêta, baliser `vYYYY.M.D-beta.N`, puis exécuter `OpenClaw Release Publish` depuis
9. Pour beta, étiqueter `vYYYY.M.D-beta.N`, puis exécuter `OpenClaw Release Publish` depuis
la branche `release/YYYY.M.D` correspondante. Il vérifie `pnpm plugins:sync:check`,
publie dabord tous les paquets de Plugin publiables sur npm, publie ensuite le même
ensemble sur ClawHub sous forme de tarballs npm-pack ClawPack, puis promeut lartefact
de prévol npm OpenClaw préparé avec le dist-tag correspondant. Après publication, exécuter lacceptation
post-publication du paquet contre le paquet publié `openclaw@YYYY.M.D-beta.N` ou
`openclaw@beta`. Si une préversion poussée ou publiée nécessite un correctif,
créer le numéro de préversion correspondant suivant ; ne pas supprimer ni réécrire lancienne
préversion.
10. Pour la stable, continuer uniquement après que la bêta validée ou la release candidate dispose des
publie dabord tous les paquets Plugin publiables vers npm, publie ensuite le même
ensemble vers ClawHub sous forme de tarballs npm-pack ClawPack, puis promeut
lartefact de prévalidation npm OpenClaw préparé avec le dist-tag correspondant. Après
publication, exécuter lacceptation du paquet post-publication
contre le paquet publié `openclaw@YYYY.M.D-beta.N` ou
`openclaw@beta`. Si une prépublication poussée ou publiée nécessite un correctif,
créer le numéro de prépublication correspondant suivant ; ne pas supprimer ni réécrire lancienne
prépublication.
10. Pour stable, continuer uniquement après que la beta validée ou la version candidate dispose des
preuves de validation requises. La publication npm stable passe aussi par
`OpenClaw Release Publish`, en réutilisant lartefact de prévol réussi via
`preflight_run_id` ; la préparation de la publication macOS stable nécessite également les
fichiers empaquetés `.zip`, `.dmg`, `.dSYM.zip`, ainsi que le fichier `appcast.xml` mis à jour sur `main`.
11. Après publication, exécuter le vérificateur npm post-publication, lE2E Telegram
publié-npm autonome facultatif lorsque vous avez besoin dune preuve de canal post-publication,
la promotion de dist-tag si nécessaire, les notes de publication/préversion GitHub depuis la
section `CHANGELOG.md` correspondante complète, ainsi que les étapes dannonce de publication.
`OpenClaw Release Publish`, en réutilisant lartefact de prévalidation réussi via
`preflight_run_id` ; létat prêt pour la publication macOS stable exige également le
`.zip`, le `.dmg`, le `.dSYM.zip` empaquetés, ainsi que le `appcast.xml` mis à jour sur `main`.
11. Après publication, exécuter le vérificateur npm post-publication, lE2E Telegram npm publié
autonome facultatif lorsque vous avez besoin dune preuve de canal post-publication,
la promotion de dist-tag si nécessaire, les notes de publication/prépublication GitHub depuis la
section complète correspondante de `CHANGELOG.md`, et les étapes dannonce de publication.
## Prévol de publication
## Prévalidation de publication
- Exécutez `pnpm check:test-types` avant la préparation de release afin que le TypeScript des tests reste couvert en dehors du gate local plus rapide `pnpm check`
- Exécutez `pnpm check:architecture` avant la préparation de release afin que les vérifications plus larges des cycles dimport et des limites darchitecture soient vertes en dehors du gate local plus rapide
- Exécutez `pnpm build && pnpm ui:build` avant `pnpm release:check` afin que les artefacts de release `dist/*` attendus et le bundle de Control UI existent pour létape de validation du pack
- Exécutez `pnpm plugins:sync` après lincrément de version racine et avant le tag. Il met à jour les versions des paquets Plugin publiables, les métadonnées de compatibilité peer/API dOpenClaw, les métadonnées de build et les ébauches de journaux de modifications des plugins pour correspondre à la version de release du cœur. `pnpm plugins:sync:check` est le garde-fou de release non modifiant ; le workflow de publication échoue avant toute mutation du registre si cette étape a été oubliée.
- Exécutez le workflow manuel `Full Release Validation` avant lapprobation de release pour lancer toutes les boîtes de test pré-release depuis un point dentrée unique. Il accepte une branche, un tag ou un SHA de commit complet, déclenche le `CI` manuel et déclenche `OpenClaw Release Checks` pour les suites de smoke dinstallation, dacceptation de paquet, de chemins de release Docker, live/E2E, OpenWebUI, parité QA Lab, Matrix et Telegram. Avec `release_profile=full` et `rerun_group=all`, il exécute aussi lE2E Telegram de paquet contre lartefact `release-package-under-test` provenant des contrôles de release. Fournissez `npm_telegram_package_spec` après la publication lorsque le même E2E Telegram doit aussi valider le paquet npm publié. Fournissez `package_acceptance_package_spec` après la publication lorsque Package Acceptance doit exécuter sa matrice paquet/mise à jour contre le paquet npm livré au lieu de lartefact construit depuis le SHA. Fournissez `evidence_package_spec` lorsque le rapport de preuve privé doit démontrer que la validation correspond à un paquet npm publié sans forcer lE2E Telegram.
- Exécutez `pnpm check:test-types` avant la prévalidation de release afin que le TypeScript des tests reste
couvert en dehors de la gate locale plus rapide `pnpm check`
- Exécutez `pnpm check:architecture` avant la prévalidation de release afin que les vérifications plus larges des
cycles dimportation et des limites darchitecture soient vertes en dehors de la gate locale plus rapide
- Exécutez `pnpm build && pnpm ui:build` avant `pnpm release:check` afin que les artefacts de release attendus
`dist/*` et le bundle Control UI existent pour létape de validation du pack
- Exécutez `pnpm plugins:sync` après lincrément de version racine et avant le marquage. Cette commande
met à jour les versions des packages Plugin publiables, les métadonnées de compatibilité pair/API OpenClaw,
les métadonnées de build et les ébauches de changelog Plugin pour quelles correspondent à la version de
release du cœur. `pnpm plugins:sync:check` est la garde de release non mutante ;
le workflow de publication échoue avant toute mutation du registre si cette étape a été
oubliée.
- Exécutez le workflow manuel `Full Release Validation` avant lapprobation de release pour
lancer toutes les boîtes de test de pré-release depuis un seul point dentrée. Il accepte une branche,
une balise ou un SHA de commit complet, déclenche manuellement `CI` et déclenche
`OpenClaw Release Checks` pour la fumée dinstallation, lacceptation de package, les suites de chemin de release Docker,
le live/E2E, OpenWebUI, la parité QA Lab, Matrix et les
voies Telegram. Avec `release_profile=full` et `rerun_group=all`, il exécute aussi lE2E Telegram de package
contre lartefact `release-package-under-test` issu des vérifications de release. Fournissez `npm_telegram_package_spec` après publication lorsque le même
E2E Telegram doit aussi prouver le package npm publié. Fournissez
`package_acceptance_package_spec` après publication lorsque Package Acceptance
doit exécuter sa matrice package/mise à jour contre le package npm livré au lieu
de lartefact construit depuis le SHA. Fournissez
`evidence_package_spec` lorsque le rapport privé de preuves doit démontrer que la
validation correspond à un package npm publié sans forcer lE2E Telegram.
Exemple :
`gh workflow run full-release-validation.yml --ref main -f ref=release/YYYY.M.D`
- Exécutez le workflow manuel `Package Acceptance` lorsque vous voulez une preuve latérale pour un candidat de paquet pendant que le travail de release continue. Utilisez `source=npm` pour `openclaw@beta`, `openclaw@latest` ou une version de release exacte ; `source=ref` pour empaqueter une branche/un tag/un SHA `package_ref` fiable avec le harnais `workflow_ref` actuel ; `source=url` pour une archive tar HTTPS avec un SHA-256 requis ; ou `source=artifact` pour une archive tar téléversée par une autre exécution GitHub Actions. Le workflow résout le candidat en `package-under-test`, réutilise le planificateur de release Docker E2E contre cette archive tar, et peut exécuter la QA Telegram contre la même archive tar avec `telegram_mode=mock-openai` ou `telegram_mode=live-frontier`. Lorsque les lanes Docker sélectionnées incluent `published-upgrade-survivor`, lartefact de paquet est le candidat et `published_upgrade_survivor_baseline` sélectionne la base publiée.
- Exécutez le workflow manuel `Package Acceptance` lorsque vous voulez une preuve par canal latéral
pour un candidat package pendant que le travail de release continue. Utilisez `source=npm` pour
`openclaw@beta`, `openclaw@latest` ou une version de release exacte ; `source=ref`
pour empaqueter une branche/balise/SHA `package_ref` de confiance avec le harnais
`workflow_ref` actuel ; `source=url` pour une archive tar HTTPS avec un
SHA-256 requis ; ou `source=artifact` pour une archive tar téléversée par un autre run GitHub
Actions. Le workflow résout le candidat en
`package-under-test`, réutilise le planificateur de release Docker E2E contre cette
archive tar, et peut exécuter la QA Telegram contre la même archive tar avec
`telegram_mode=mock-openai` ou `telegram_mode=live-frontier`. Lorsque les
voies Docker sélectionnées incluent `published-upgrade-survivor`, lartefact package
est le candidat et `published_upgrade_survivor_baseline` sélectionne
la base publiée.
Exemple : `gh workflow run package-acceptance.yml --ref main -f workflow_ref=main -f source=npm -f package_spec=openclaw@beta -f suite_profile=product -f published_upgrade_survivor_baseline=openclaw@2026.4.26 -f telegram_mode=mock-openai`
Profils courants :
- `smoke` : lanes dinstallation/canal/agent, réseau Gateway et rechargement de configuration
- `package` : lanes paquet/mise à jour/Plugin natives de lartefact sans OpenWebUI ni ClawHub live
- `product` : profil package plus canaux MCP, nettoyage cron/sous-agent, recherche web OpenAI et OpenWebUI
- `full` : segments de chemin de release Docker avec OpenWebUI
- `smoke` : voies installation/canal/agent, réseau Gateway et rechargement de config
- `package` : voies package/mise à jour/Plugin natives de lartefact, sans OpenWebUI ni ClawHub live
- `product` : profil package plus canaux MCP, nettoyage cron/sous-agent,
recherche web OpenAI et OpenWebUI
- `full` : fragments de chemin de release Docker avec OpenWebUI
- `custom` : sélection exacte de `docker_lanes` pour une réexécution ciblée
- Exécutez directement le workflow manuel `CI` lorsque vous avez seulement besoin dune couverture CI normale complète pour le candidat de release. Les déclenchements CI manuels contournent la portée basée sur les changements et forcent les shards Linux Node, les shards de plugins groupés, les contrats de canal, la compatibilité Node 22, `check`, `check-additional`, le smoke de build, les contrôles docs, les skills Python, Windows, macOS, Android et les lanes i18n Control UI.
- Exécutez directement le workflow manuel `CI` lorsque vous avez seulement besoin de la couverture CI normale complète
pour le candidat de release. Les déclenchements CI manuels contournent la portée par changements
et forcent les shards Linux Node, les shards de Plugin groupé, les contrats de canal,
la compatibilité Node 22, `check`, `check-additional`, la fumée de build,
les vérifications docs, les Skills Python, Windows, macOS, Android et les voies i18n Control UI.
Exemple : `gh workflow run ci.yml --ref release/YYYY.M.D`
- Exécutez `pnpm qa:otel:smoke` lors de la validation de la télémétrie de release. Il exerce QA-lab via un récepteur OTLP/HTTP local et vérifie les noms des spans de trace exportés, les attributs bornés et la rédaction du contenu/des identifiants sans nécessiter Opik, Langfuse ni un autre collecteur externe.
- Exécutez `pnpm release:check` avant chaque release taguée
- Exécutez `OpenClaw Release Publish` pour la séquence de publication modifiante après lexistence du tag. Déclenchez-le depuis `release/YYYY.M.D` (ou `main` lors de la publication dun tag atteignable depuis main), transmettez le tag de release et le `preflight_run_id` npm OpenClaw réussi, et conservez la portée de publication Plugin par défaut `all-publishable` sauf si vous exécutez délibérément une réparation ciblée. Le workflow sérialise la publication npm des plugins, la publication ClawHub des plugins et la publication npm dOpenClaw afin que le paquet cœur ne soit pas publié avant ses plugins externalisés.
- Les contrôles de release sexécutent maintenant dans un workflow manuel séparé :
- Exécutez `pnpm qa:otel:smoke` lors de la validation de la télémétrie de release. Cette commande exerce
QA-lab via un récepteur OTLP/HTTP local et vérifie les noms de spans de trace exportés,
les attributs bornés et la rédaction du contenu/des identifiants sans
nécessiter Opik, Langfuse ou un autre collecteur externe.
- Exécutez `pnpm release:check` avant chaque release balisée
- Exécutez `OpenClaw Release Publish` pour la séquence de publication mutante après que la
balise existe. Déclenchez-la depuis `release/YYYY.M.D` (ou `main` lors de la publication dune
balise accessible depuis main), transmettez la balise de release et le
`preflight_run_id` npm OpenClaw réussi, et gardez la portée de publication Plugin par défaut
`all-publishable` sauf si vous exécutez délibérément une réparation ciblée. Le
workflow sérialise la publication npm Plugin, la publication ClawHub Plugin et la publication npm OpenClaw,
afin que le package cœur ne soit pas publié avant ses
plugins externalisés.
- Les vérifications de release sexécutent désormais dans un workflow manuel séparé :
`OpenClaw Release Checks`
- `OpenClaw Release Checks` exécute aussi la lane de parité mock QA Lab ainsi que le profil Matrix live rapide et la lane QA Telegram avant lapprobation de release. Les lanes live utilisent lenvironnement `qa-live-shared` ; Telegram utilise aussi les baux didentifiants Convex CI. Exécutez le workflow manuel `QA-Lab - All Lanes` avec `matrix_profile=all` et `matrix_shards=true` lorsque vous voulez linventaire complet du transport Matrix, des médias et de lE2EE en parallèle.
- La validation dinstallation et de mise à niveau cross-OS fait partie des workflows publics `OpenClaw Release Checks` et `Full Release Validation`, qui appellent directement le workflow réutilisable `.github/workflows/openclaw-cross-os-release-checks-reusable.yml`
- Cette séparation est intentionnelle : garder le vrai chemin de release npm court, déterministe et centré sur les artefacts, tandis que les contrôles live plus lents restent dans leur propre lane pour ne pas retarder ni bloquer la publication
- Les contrôles de release contenant des secrets doivent être déclenchés via `Full Release Validation` ou depuis la référence de workflow `main`/release afin que la logique du workflow et les secrets restent contrôlés
- `OpenClaw Release Checks` accepte une branche, un tag ou un SHA de commit complet tant que le commit résolu est atteignable depuis une branche OpenClaw ou un tag de release
- La préparation de validation seule `OpenClaw NPM Release` accepte aussi le SHA de commit complet de 40 caractères de la branche de workflow actuelle sans exiger de tag poussé
- Ce chemin SHA est uniquement destiné à la validation et ne peut pas être promu en vraie publication
- En mode SHA, le workflow synthétise `v<package.json version>` uniquement pour le contrôle des métadonnées de paquet ; la vraie publication exige toujours un vrai tag de release
- Les deux workflows conservent le vrai chemin de publication et de promotion sur les runners hébergés par GitHub, tandis que le chemin de validation non modifiant peut utiliser les runners Linux Blacksmith plus grands
- `OpenClaw Release Checks` exécute aussi la voie de parité mock QA Lab ainsi que le profil Matrix live rapide
et la voie QA Telegram avant lapprobation de release. Les voies live
utilisent lenvironnement `qa-live-shared` ; Telegram utilise aussi les baux didentifiants Convex CI.
Exécutez le workflow manuel `QA-Lab - All Lanes` avec
`matrix_profile=all` et `matrix_shards=true` lorsque vous voulez linventaire complet Matrix
transport, média et E2EE en parallèle.
- La validation runtime dinstallation et de mise à niveau multi-OS fait partie des workflows publics
`OpenClaw Release Checks` et `Full Release Validation`, qui appellent directement le
workflow réutilisable
`.github/workflows/openclaw-cross-os-release-checks-reusable.yml`
- Cette séparation est intentionnelle : garder le vrai chemin de release npm court,
déterministe et centré sur les artefacts, tandis que les vérifications live plus lentes restent dans leur
propre voie afin de ne pas retarder ou bloquer la publication
- Les vérifications de release portant des secrets doivent être déclenchées via `Full Release
Validation` ou depuis la réf de workflow `main`/release afin que la logique de workflow et les
secrets restent contrôlés
- `OpenClaw Release Checks` accepte une branche, une balise ou un SHA de commit complet tant que
le commit résolu est accessible depuis une branche OpenClaw ou une balise de release
- La prévalidation en validation seule `OpenClaw NPM Release` accepte aussi le SHA complet actuel
de 40 caractères du commit de branche de workflow sans exiger de balise poussée
- Ce chemin SHA sert uniquement à la validation et ne peut pas être promu en vraie publication
- En mode SHA, le workflow synthétise `v<package.json version>` uniquement pour la
vérification des métadonnées de package ; la vraie publication exige toujours une vraie balise de release
- Les deux workflows gardent le vrai chemin de publication et de promotion sur des runners hébergés par GitHub,
tandis que le chemin de validation non mutant peut utiliser les runners Linux Blacksmith plus grands
- Ce workflow exécute
`OPENCLAW_LIVE_TEST=1 OPENCLAW_LIVE_CACHE_TEST=1 pnpm test:live:cache`
en utilisant les secrets de workflow `OPENAI_API_KEY` et `ANTHROPIC_API_KEY`
- La préparation de release npm nattend plus la lane séparée des contrôles de release
en utilisant les deux secrets de workflow `OPENAI_API_KEY` et `ANTHROPIC_API_KEY`
- La prévalidation de release npm nattend plus la voie séparée des vérifications de release
- Exécutez `RELEASE_TAG=vYYYY.M.D node --import tsx scripts/openclaw-npm-release-check.ts`
(ou le tag beta/correction correspondant) avant lapprobation
(ou la balise beta/correction correspondante) avant lapprobation
- Après la publication npm, exécutez
`node --import tsx scripts/openclaw-npm-postpublish-verify.ts YYYY.M.D`
(ou la version beta/correction correspondante) pour vérifier le chemin dinstallation du registre publié dans un nouveau préfixe temporaire
(ou la version beta/correction correspondante) pour vérifier le chemin dinstallation du registre publié
dans un préfixe temporaire frais
- Après une publication beta, exécutez `OPENCLAW_NPM_TELEGRAM_PACKAGE_SPEC=openclaw@YYYY.M.D-beta.N OPENCLAW_NPM_TELEGRAM_CREDENTIAL_SOURCE=convex OPENCLAW_NPM_TELEGRAM_CREDENTIAL_ROLE=ci pnpm test:docker:npm-telegram-live`
pour vérifier lonboarding du paquet installé, la configuration Telegram et le vrai E2E Telegram contre le paquet npm publié en utilisant le pool partagé didentifiants Telegram loués. Les exécutions ponctuelles locales des mainteneurs peuvent omettre les variables Convex et transmettre directement les trois identifiants denvironnement `OPENCLAW_QA_TELEGRAM_*`.
- Les mainteneurs peuvent exécuter le même contrôle post-publication depuis GitHub Actions via le workflow manuel `NPM Telegram Beta E2E`. Il est intentionnellement uniquement manuel et ne sexécute pas à chaque merge.
- Lautomatisation de release des mainteneurs utilise maintenant préparation puis promotion :
pour vérifier lonboarding du package installé, la configuration Telegram et lE2E Telegram réel
contre le package npm publié en utilisant le pool partagé didentifiants Telegram loués.
Les exécutions ponctuelles locales par les mainteneurs peuvent omettre les vars Convex et transmettre directement les trois
identifiants denv `OPENCLAW_QA_TELEGRAM_*`.
- Pour exécuter la fumée beta post-publication complète depuis une machine de mainteneur, utilisez `pnpm release:beta-smoke -- --beta betaN`. Lassistant exécute la validation Parallels de mise à jour npm/cible fraîche, déclenche `NPM Telegram Beta E2E`, interroge le run de workflow exact, télécharge lartefact et imprime le rapport Telegram.
- Les mainteneurs peuvent exécuter la même vérification post-publication depuis GitHub Actions via le
workflow manuel `NPM Telegram Beta E2E`. Il est intentionnellement uniquement manuel et
ne sexécute pas à chaque merge.
- Lautomatisation de release des mainteneurs utilise désormais prévalidation puis promotion :
- la vraie publication npm doit passer un `preflight_run_id` npm réussi
- la vraie publication npm doit être déclenchée depuis la même branche `main` ou `release/YYYY.M.D` que lexécution de préparation réussie
- les releases npm stables ciblent par défaut `beta`
- la vraie publication npm doit être déclenchée depuis la même branche `main` ou
`release/YYYY.M.D` que le run de prévalidation réussi
- les releases npm stables ciblent `beta` par défaut
- la publication npm stable peut cibler explicitement `latest` via lentrée de workflow
- la mutation de dist-tag npm basée sur un token vit désormais dans `openclaw/releases-private/.github/workflows/openclaw-npm-dist-tags.yml` pour des raisons de sécurité, car `npm dist-tag add` nécessite toujours `NPM_TOKEN` tandis que le dépôt public conserve une publication uniquement OIDC
- la release publique `macOS Release` est uniquement de validation ; lorsquun tag nexiste que sur une branche de release mais que le workflow est déclenché depuis `main`, définissez `public_release_branch=release/YYYY.M.D`
- la vraie publication mac privée doit passer un `preflight_run_id` mac privé et un `validate_run_id` réussis
- la mutation de dist-tag npm basée sur jeton vit désormais dans
`openclaw/releases-private/.github/workflows/openclaw-npm-dist-tags.yml`
pour la sécurité, car `npm dist-tag add` nécessite toujours `NPM_TOKEN` alors que le
dépôt public garde une publication uniquement OIDC
- le `macOS Release` public est uniquement de la validation ; lorsquune balise vit seulement sur une
branche de release mais que le workflow est déclenché depuis `main`, définissez
`public_release_branch=release/YYYY.M.D`
- la vraie publication privée mac doit passer un
`preflight_run_id` et un `validate_run_id` mac privés réussis
- les vrais chemins de publication promeuvent les artefacts préparés au lieu de les reconstruire
- Pour les releases de correction stables comme `YYYY.M.D-N`, le vérificateur post-publication contrôle aussi le même chemin de mise à niveau en préfixe temporaire de `YYYY.M.D` vers `YYYY.M.D-N`, afin que les corrections de release ne puissent pas laisser silencieusement danciennes installations globales sur la charge utile stable de base
- La préparation de release npm échoue fermée sauf si larchive tar contient à la fois `dist/control-ui/index.html` et une charge utile `dist/control-ui/assets/` non vide, afin déviter de livrer à nouveau un tableau de bord navigateur vide
- La vérification post-publication contrôle aussi que les points dentrée Plugin publiés et les métadonnées de paquet sont présents dans lagencement du registre installé. Une release qui livre des charges utiles dexécution Plugin manquantes échoue au vérificateur postpublish et ne peut pas être promue en `latest`.
- `pnpm test:install:smoke` impose aussi le budget npm pack `unpackedSize` sur larchive tar candidate de mise à jour, afin que le2e dinstallation détecte les gonflements accidentels de pack avant le chemin de publication de release
- Si le travail de release a touché la planification CI, les manifestes de timing des extensions ou les matrices de test des extensions, régénérez et relisez les sorties de matrice `plugin-prerelease-extension-shard` détenues par le planificateur depuis `.github/workflows/plugin-prerelease.yml` avant lapprobation, afin que les notes de release ne décrivent pas une disposition CI obsolète
à nouveau
- Pour les releases de correction stables comme `YYYY.M.D-N`, le vérificateur post-publication
vérifie aussi le même chemin de mise à niveau avec préfixe temporaire de `YYYY.M.D` à `YYYY.M.D-N`
afin que les corrections de release ne puissent pas laisser silencieusement danciennes installations globales sur le
payload stable de base
- La prévalidation de release npm échoue fermée sauf si larchive tar inclut à la fois
`dist/control-ui/index.html` et un payload `dist/control-ui/assets/` non vide
afin de ne pas livrer à nouveau un tableau de bord navigateur vide
- La vérification post-publication vérifie aussi que les points dentrée Plugin publiés et
les métadonnées de package sont présents dans lagencement du registre installé. Une release qui
livre des payloads runtime Plugin manquants échoue au vérificateur post-publication et
ne peut pas être promue vers `latest`.
- `pnpm test:install:smoke` impose aussi le budget `unpackedSize` du pack npm sur
larchive tar de mise à jour candidate, afin que le2e dinstallation détecte le gonflement accidentel du pack
avant le chemin de publication de release
- Si le travail de release a touché la planification CI, les manifestes de timing dextension ou
les matrices de tests dextension, régénérez et examinez les sorties de matrice
`plugin-prerelease-extension-shard` détenues par le planificateur depuis
`.github/workflows/plugin-prerelease.yml` avant lapprobation afin que les notes de release ne
décrivent pas une disposition CI obsolète
- La préparation dune release macOS stable inclut aussi les surfaces de mise à jour :
- la release GitHub doit finir avec les paquets `.zip`, `.dmg` et `.dSYM.zip`
- la release GitHub doit finir avec les fichiers `.zip`, `.dmg` et `.dSYM.zip` empaquetés
- `appcast.xml` sur `main` doit pointer vers le nouveau zip stable après publication
- lapp empaquetée doit conserver un identifiant de bundle non debug, une URL de flux Sparkle non vide et un `CFBundleVersion` supérieur ou égal au plancher canonique de build Sparkle pour cette version de release
- lapp empaquetée doit conserver un bundle id non debug, une URL de flux Sparkle
non vide et une `CFBundleVersion` au moins égale au plancher de build Sparkle canonique
pour cette version de release
## Boîtes de test de release
`Full Release Validation` est la manière dont les opérateurs lancent tous les tests pré-release depuis un point dentrée unique. Pour une preuve de commit épinglé sur une branche qui évolue rapidement, utilisez lassistant afin que chaque workflow enfant sexécute depuis une branche temporaire fixée sur le SHA cible :
`Full Release Validation` est la manière dont les opérateurs lancent tous les tests de pré-release depuis
un seul point dentrée. Pour une preuve de commit épinglé sur une branche qui avance vite, utilisez
lassistant afin que chaque workflow enfant sexécute depuis une branche temporaire fixée au
SHA cible :
```bash
pnpm ci:full-release --sha <full-sha>
```
Lassistant pousse `release-ci/<sha>-...`, déclenche `Full Release Validation` depuis cette branche avec `ref=<sha>`, vérifie que chaque `headSha` de workflow enfant correspond à la cible, puis supprime la branche temporaire. Cela évite de prouver par accident une exécution enfant plus récente de `main`.
Lassistant pousse `release-ci/<sha>-...`, déclenche `Full Release Validation`
depuis cette branche avec `ref=<sha>`, vérifie que chaque `headSha` de workflow enfant
correspond à la cible, puis supprime la branche temporaire. Cela évite de prouver accidentellement un run enfant
`main` plus récent.
Pour la validation dune branche ou dun tag de release, exécutez-la depuis la référence de workflow fiable `main` et transmettez la branche ou le tag de release comme `ref` :
Pour la validation dune branche ou dune balise de release, exécutez-la depuis la réf de workflow
`main` de confiance et transmettez la branche ou la balise de release comme `ref` :
```bash
gh workflow run full-release-validation.yml \
@ -187,54 +289,54 @@ gh workflow run full-release-validation.yml \
-f evidence_package_spec=openclaw@YYYY.M.D-beta.N
```
Le workflow résout la référence cible, déclenche manuellement `CI` avec
Le workflow résout la ref cible, déclenche manuellement `CI` avec
`target_ref=<release-ref>`, déclenche `OpenClaw Release Checks`, prépare un
artefact parent `release-package-under-test` pour les vérifications côté package,
et déclenche lE2E Telegram autonome du package lorsque `release_profile=full`
avec `rerun_group=all` ou lorsque `npm_telegram_package_spec` est défini.
`OpenClaw Release Checks` lance ensuite en éventail le smoke test dinstallation,
les vérifications de version cross-OS, la couverture live/E2E Docker du chemin de
version, Package Acceptance avec QA du package Telegram, la parité QA Lab, Matrix
live et Telegram live. Une exécution complète nest acceptable que lorsque le
résumé `Full Release Validation` indique que `normal_ci` et `release_checks` ont
réussi. En mode full/all, lenfant `npm_telegram` doit également réussir ; hors
artefact parent `release-package-under-test` pour les vérifications côté paquet,
et déclenche lE2E Telegram de paquet autonome lorsque `release_profile=full` avec
`rerun_group=all` ou lorsque `npm_telegram_package_spec` est défini. `OpenClaw Release
Checks` déploie ensuite en éventail le smoke test dinstallation, les vérifications
de release multiplateformes, la couverture live/E2E Docker du chemin de release,
Package Acceptance avec la QA du paquet Telegram, la parité QA Lab, Matrix en
direct et Telegram en direct. Une exécution complète nest acceptable que lorsque
le résumé `Full Release Validation` indique que `normal_ci` et `release_checks`
ont réussi. En mode full/all, lenfant `npm_telegram` doit aussi réussir ; hors
full/all, il est ignoré sauf si un `npm_telegram_package_spec` publié a été
fourni. Le résumé final du vérificateur inclut les tableaux des jobs les plus
lents pour chaque exécution enfant, afin que le responsable de version puisse
fourni. Le résumé final du vérificateur inclut les tableaux des tâches les plus
lentes pour chaque exécution enfant, afin que le responsable de release puisse
voir le chemin critique actuel sans télécharger les journaux.
Consultez [Validation complète de version](/fr/reference/full-release-validation)
pour la matrice complète des étapes, les noms exacts des jobs de workflow, les
différences entre profils stable et full, les artefacts et les poignées de
réexécution ciblée.
Les workflows enfants sont déclenchés depuis la référence de confiance qui
exécute `Full Release Validation`, normalement `--ref main`, même lorsque la
référence cible `ref` pointe vers une branche ou une balise de version plus
ancienne. Il nexiste pas dentrée séparée de référence de workflow pour Full
Release Validation ; choisissez le harnais de confiance en choisissant la
référence dexécution du workflow. Nutilisez pas `--ref main -f ref=<sha>` pour
prouver un commit exact sur une branche `main` mouvante ; les SHA de commits
bruts ne peuvent pas être des références de déclenchement de workflow, utilisez
donc `pnpm ci:full-release --sha <sha>` pour créer la branche temporaire épinglée.
Consultez [Validation complète de release](/fr/reference/full-release-validation) pour
la matrice complète des étapes, les noms exacts des tâches de workflow, les
différences entre les profils stable et full, les artefacts et les identifiants
de relance ciblée.
Les workflows enfants sont déclenchés depuis la ref approuvée qui exécute
`Full Release Validation`, normalement `--ref main`, même lorsque la `ref` cible
pointe vers une branche ou une balise de release plus ancienne. Il nexiste pas
dentrée workflow-ref séparée pour Full Release Validation ; choisissez le
harnais approuvé en choisissant la ref dexécution du workflow.
Nutilisez pas `--ref main -f ref=<sha>` pour une preuve exacte de commit sur
`main` mouvant ; les SHA de commit bruts ne peuvent pas être des refs de
déclenchement de workflow, utilisez donc `pnpm ci:full-release --sha <sha>` pour
créer la branche temporaire épinglée.
Utilisez `release_profile` pour sélectionner létendue live/fournisseur :
Utilisez `release_profile` pour sélectionner létendue live/provider :
- `minimum` : chemin OpenAI/core live et Docker le plus rapide et critique pour la version
- `stable` : minimum plus couverture stable des fournisseurs/backends pour lapprobation de version
- `full` : stable plus couverture large des fournisseurs/médias consultatifs
- `minimum` : chemin OpenAI/core live et Docker le plus rapide et critique pour la release
- `stable` : minimum plus couverture stable provider/backend pour lapprobation de release
- `full` : stable plus large couverture provider/médias consultative
`OpenClaw Release Checks` utilise la référence de workflow de confiance pour
résoudre une seule fois la référence cible en tant que
`release-package-under-test` et réutilise cet artefact dans les vérifications
Docker du chemin de version comme dans Package Acceptance. Cela garde toutes les
machines côté package sur les mêmes octets et évite les builds répétés de
package. Le smoke test dinstallation OpenAI cross-OS utilise
`OPENCLAW_CROSS_OS_OPENAI_MODEL` lorsque la variable de dépôt/organisation est
définie, sinon `openai/gpt-5.4`, car cette voie prouve linstallation du
package, lonboarding, le démarrage du Gateway et un tour dagent live, plutôt
que de mesurer le modèle par défaut le plus lent. La matrice plus large des
fournisseurs live reste lendroit prévu pour la couverture propre aux modèles.
`OpenClaw Release Checks` utilise la ref de workflow approuvée pour résoudre une
seule fois la ref cible en tant que `release-package-under-test` et réutilise cet
artefact dans les vérifications Docker du chemin de release et Package
Acceptance. Cela maintient toutes les machines côté paquet sur les mêmes octets
et évite les builds de paquet répétés.
Le smoke test dinstallation OpenAI multiplateforme utilise
`OPENCLAW_CROSS_OS_OPENAI_MODEL` lorsque la variable repo/org est définie, sinon
`openai/gpt-5.4`, car cette voie prouve linstallation du paquet, lonboarding,
le démarrage du Gateway et un tour dagent live, plutôt que de mesurer le modèle
par défaut le plus lent. La matrice plus large de providers live reste lendroit
pour la couverture propre aux modèles.
Utilisez ces variantes selon létape de version :
Utilisez ces variantes selon létape de release :
```bash
# Validate an unpublished release candidate branch.
@ -264,46 +366,47 @@ gh workflow run full-release-validation.yml \
-f npm_telegram_provider_mode=mock-openai
```
Nutilisez pas lombrelle complète comme première réexécution après un correctif
ciblé. Si une machine échoue, utilisez le workflow enfant, le job, la voie Docker,
le profil de package, le fournisseur de modèle ou la voie QA en échec pour la
preuve suivante. Réexécutez lombrelle complète seulement lorsque le correctif a
modifié lorchestration partagée de la version ou a rendu obsolètes les preuves
précédentes de toutes les machines. Le vérificateur final de lombrelle revérifie
les identifiants enregistrés des exécutions de workflows enfants ; ainsi, après
la réexécution réussie dun workflow enfant, ne réexécutez que le job parent
Nutilisez pas lombrelle complète comme première relance après un correctif
ciblé. Si une machine échoue, utilisez le workflow enfant, la tâche, la voie
Docker, le profil de paquet, le provider de modèle ou la voie QA en échec pour
la preuve suivante. Relancez lombrelle complète uniquement lorsque le correctif
a modifié lorchestration partagée de release ou a rendu obsolètes les preuves
toutes machines précédentes. Le vérificateur final de lombrelle revérifie les
identifiants enregistrés des exécutions de workflows enfants ; après la relance
réussie dun workflow enfant, relancez uniquement la tâche parente
`Verify full validation` en échec.
Pour une récupération bornée, passez `rerun_group` à lombrelle. `all` est la
vraie exécution de candidat de version, `ci` exécute seulement lenfant CI normal,
`plugin-prerelease` exécute seulement lenfant Plugin propre à la version,
`release-checks` exécute toutes les machines de version, et les groupes de
version plus étroits sont `install-smoke`, `cross-os`, `live-e2e`, `package`,
`qa`, `qa-parity`, `qa-live` et `npm-telegram`. Les réexécutions ciblées
`npm-telegram` nécessitent `npm_telegram_package_spec` ; les exécutions full/all
avec `release_profile=full` utilisent lartefact de package de release-checks.
véritable exécution de release candidate, `ci` exécute uniquement lenfant CI
normal, `plugin-prerelease` exécute uniquement lenfant Plugin réservé à la
release, `release-checks` exécute toutes les machines de release, et les groupes
de release plus étroits sont `install-smoke`, `cross-os`, `live-e2e`, `package`,
`qa`, `qa-parity`, `qa-live` et `npm-telegram`.
Les relances ciblées `npm-telegram` nécessitent `npm_telegram_package_spec` ; les
exécutions full/all avec `release_profile=full` utilisent lartefact de paquet
release-checks.
### Vitest
La machine Vitest est le workflow enfant manuel `CI`. Le CI manuel contourne
intentionnellement le périmètre des changements et force le graphe de tests
normal pour le candidat de version : shards Linux Node, shards de plugins
intégrés, contrats de canaux, compatibilité Node 22, `check`, `check-additional`,
smoke test de build, vérifications de documentation, Skills Python, Windows,
macOS, Android et i18n de Control UI.
La machine Vitest est le workflow enfant manuel `CI`. La CI manuelle contourne
intentionnellement le périmétrage des changements et force le graphe de tests
normal pour la release candidate : shards Linux Node, shards de plugins groupés,
contrats de canaux, compatibilité Node 22, `check`, `check-additional`, smoke
test de build, vérifications de docs, Skills Python, Windows, macOS, Android et
i18n Control UI.
Utilisez cette machine pour répondre à « larbre source a-t-il passé toute la
suite de tests normale ? ». Ce nest pas la même chose que la validation produit
du chemin de version. Preuves à conserver :
Utilisez cette machine pour répondre à « larborescence source a-t-elle réussi
la suite de tests normale complète ? ». Ce nest pas la même chose que la
validation produit du chemin de release. Preuves à conserver :
- résumé `Full Release Validation` indiquant lURL de lexécution `CI` déclenchée
- exécution `CI` verte sur le SHA cible exact
- noms des shards échoués ou lents des jobs CI lors de linvestigation de régressions
- noms des shards en échec ou lents des tâches CI lors de lanalyse de régressions
- artefacts de chronométrage Vitest comme `.artifacts/vitest-shard-timings.json` lorsquune exécution nécessite une analyse de performance
Exécutez le CI manuel directement seulement lorsque la version nécessite un CI
normal déterministe, mais pas les machines Docker, QA Lab, live, cross-OS ou
package :
Exécutez la CI manuelle directement uniquement lorsque la release a besoin dune
CI normale déterministe, mais pas des machines Docker, QA Lab, live,
multiplateformes ou de paquet :
```bash
gh workflow run ci.yml --ref main -f target_ref=release/YYYY.M.D
@ -313,115 +416,114 @@ gh workflow run ci.yml --ref main -f target_ref=release/YYYY.M.D
La machine Docker se trouve dans `OpenClaw Release Checks` via
`openclaw-live-and-e2e-checks-reusable.yml`, plus le workflow `install-smoke` en
mode version. Elle valide le candidat de version au moyen denvironnements Docker
packagés, et pas seulement de tests au niveau source.
mode release. Elle valide la release candidate via des environnements Docker
empaquetés au lieu de se limiter aux tests au niveau source.
La couverture Docker de version inclut :
La couverture Docker de release inclut :
- smoke test dinstallation complet avec le smoke test lent dinstallation globale Bun activé
- préparation/réutilisation de limage de smoke test du Dockerfile racine par SHA cible, avec les jobs QR, racine/Gateway et smoke installer/Bun exécutés comme shards install-smoke séparés
- préparation/réutilisation de limage de smoke test du Dockerfile racine par SHA cible, avec les tâches de smoke test QR, root/gateway et installer/Bun exécutées comme shards install-smoke séparés
- voies E2E du dépôt
- morceaux Docker du chemin de version : `core`, `package-update-openai`,
- fragments Docker du chemin de release : `core`, `package-update-openai`,
`package-update-anthropic`, `package-update-core`, `plugins-runtime-plugins`,
`plugins-runtime-services`,
`plugins-runtime-install-a`, `plugins-runtime-install-b`,
`plugins-runtime-install-c`, `plugins-runtime-install-d`,
`plugins-runtime-install-e`, `plugins-runtime-install-f`,
`plugins-runtime-install-g` et `plugins-runtime-install-h`
- couverture OpenWebUI dans le morceau `plugins-runtime-services` lorsquelle est demandée
- voies séparées dinstallation/désinstallation des plugins intégrés
- couverture OpenWebUI dans le fragment `plugins-runtime-services` lorsque demandé
- voies dinstallation/désinstallation de plugins groupés séparées
`bundled-plugin-install-uninstall-0` à
`bundled-plugin-install-uninstall-23`
- suites fournisseurs live/E2E et couverture des modèles live Docker lorsque les vérifications de version incluent les suites live
- suites providers live/E2E et couverture de modèles live Docker lorsque les vérifications de release incluent les suites live
Utilisez les artefacts Docker avant de réexécuter. Le planificateur du chemin de
version téléverse `.artifacts/docker-tests/` avec les journaux de voies,
`summary.json`, `failures.json`, les chronométrages de phase, le JSON du plan du
planificateur et les commandes de réexécution. Pour une récupération ciblée,
Utilisez les artefacts Docker avant de relancer. Le planificateur du chemin de
release téléverse `.artifacts/docker-tests/` avec les journaux de voies,
`summary.json`, `failures.json`, les chronométrages de phases, le JSON du plan
du planificateur et les commandes de relance. Pour une récupération ciblée,
utilisez `docker_lanes=<lane[,lane]>` sur le workflow live/E2E réutilisable au
lieu de réexécuter tous les morceaux de version. Les commandes de réexécution
générées incluent le `package_artifact_run_id` précédent et les entrées dimage
Docker préparée lorsquelles sont disponibles, afin quune voie en échec puisse
lieu de relancer tous les fragments de release. Les commandes de relance
générées incluent lancien `package_artifact_run_id` et les entrées dimage
Docker préparées lorsquelles sont disponibles, afin quune voie en échec puisse
réutiliser le même tarball et les mêmes images GHCR.
### QA Lab
La machine QA Lab fait également partie de `OpenClaw Release Checks`. Cest la
barrière de version pour le comportement agentique et le niveau canal, séparée
de Vitest et de la mécanique de package Docker.
La machine QA Lab fait aussi partie de `OpenClaw Release Checks`. Cest la porte
de release pour le comportement agentique et le niveau canal, séparée de Vitest
et des mécaniques de paquet Docker.
La couverture QA Lab de version inclut :
La couverture QA Lab de release inclut :
- voie de parité simulée comparant la voie candidate OpenAI à la référence Opus 4.6 avec le pack de parité agentique
- voie de parité mock comparant la voie candidate OpenAI à la référence Opus 4.6 avec le pack de parité agentique
- profil QA Matrix live rapide utilisant lenvironnement `qa-live-shared`
- voie QA Telegram live utilisant les locations didentifiants Convex CI
- `pnpm qa:otel:smoke` lorsque la télémétrie de version nécessite une preuve locale explicite
- voie QA Telegram live utilisant des baux didentifiants Convex CI
- `pnpm qa:otel:smoke` lorsque la télémétrie de release nécessite une preuve locale explicite
Utilisez cette machine pour répondre à « la version se comporte-t-elle
Utilisez cette machine pour répondre à « la release se comporte-t-elle
correctement dans les scénarios QA et les flux de canaux live ? ». Conservez les
URL dartefacts des voies de parité, Matrix et Telegram lors de lapprobation de
la version. La couverture Matrix complète reste disponible comme exécution QA-Lab
manuelle shardée, plutôt que comme voie critique par défaut pour la version.
URL dartefacts pour les voies parité, Matrix et Telegram lors de lapprobation
de la release. La couverture Matrix complète reste disponible comme exécution
QA-Lab manuelle shardée, plutôt que comme voie critique par défaut pour la
release.
### Package
### Paquet
La machine Package est la barrière du produit installable. Elle sappuie sur
La machine Paquet est la porte du produit installable. Elle sappuie sur
`Package Acceptance` et le résolveur
`scripts/resolve-openclaw-package-candidate.mjs`. Le résolveur normalise un
candidat en tarball `package-under-test` consommé par Docker E2E, valide
linventaire du package, enregistre la version du package et son SHA-256, et
garde la référence du harnais de workflow séparée de la référence source du
package.
candidat dans le tarball `package-under-test` consommé par Docker E2E, valide
linventaire du paquet, enregistre la version du paquet et le SHA-256, et garde
la ref du harnais de workflow séparée de la ref source du paquet.
Sources de candidats prises en charge :
Sources candidates prises en charge :
- `source=npm` : `openclaw@beta`, `openclaw@latest` ou une version exacte de release OpenClaw
- `source=ref` : empaqueter une branche, une balise ou un SHA de commit complet `package_ref` de confiance avec le harnais `workflow_ref` sélectionné
- `source=url` : télécharger un `.tgz` HTTPS avec `package_sha256` obligatoire
- `source=ref` : empaqueter une branche, balise ou SHA de commit complet `package_ref` approuvé avec le harnais `workflow_ref` sélectionné
- `source=url` : télécharger un `.tgz` HTTPS avec `package_sha256` requis
- `source=artifact` : réutiliser un `.tgz` téléversé par une autre exécution GitHub Actions
`OpenClaw Release Checks` exécute Package Acceptance avec `source=artifact`,
lartefact de package de version préparé, `suite_profile=custom`,
lartefact de paquet de release préparé, `suite_profile=custom`,
`docker_lanes=doctor-switch update-channel-switch upgrade-survivor published-upgrade-survivor plugins-offline plugin-update`,
`published_upgrade_survivor_baselines=all-since-2026.4.23`,
`published_upgrade_survivor_scenarios=reported-issues` et
`telegram_mode=mock-openai`. Package Acceptance garde la migration, la mise à
jour, le nettoyage des dépendances obsolètes de Plugin, les fixtures de Plugin
hors ligne, la mise à jour de Plugin et la QA du package Telegram contre le même
jour, le nettoyage des dépendances de Plugin obsolètes, les fixtures de Plugin
hors ligne, la mise à jour de Plugin et la QA du paquet Telegram sur le même
tarball résolu. La matrice de mise à niveau couvre chaque référence stable
publiée sur npm de `2026.4.23` à `latest` ; utilisez Package Acceptance avec
`source=npm` pour un candidat déjà livré, ou `source=ref`/`source=artifact` pour
un tarball npm local adossé à un SHA avant publication. Cest le remplacement
natif GitHub de la majeure partie de la couverture package/mise à jour qui
nécessitait auparavant Parallels. Les vérifications de version cross-OS restent
importantes pour lonboarding, linstallateur et le comportement de plateforme
propres à lOS, mais la validation produit package/mise à jour devrait préférer
natif GitHub de la majeure partie de la couverture paquet/mise à jour qui
nécessitait auparavant Parallels. Les vérifications de release multiplateformes
restent importantes pour lonboarding, linstallateur et le comportement propres
aux OS, mais la validation produit de paquet/mise à jour devrait préférer
Package Acceptance.
La checklist canonique pour la validation des mises à jour et des plugins est
[Tester les mises à jour et les plugins](/fr/help/testing-updates-plugins).
Utilisez-la pour décider quelle voie locale, Docker, Package Acceptance ou de
vérification de version prouve une installation/mise à jour de Plugin, un
nettoyage doctor ou un changement de migration de package publié. La migration
exhaustive de mise à jour publiée depuis chaque package stable `2026.4.23+` est
un workflow manuel `Update Migration` séparé, et ne fait pas partie du CI complet
de version.
Utilisez-la pour décider quelle voie locale, Docker, Package Acceptance ou
release-check prouve un changement dinstallation/mise à jour de Plugin, de
nettoyage doctor ou de migration de paquet publié. La migration exhaustive de
mise à jour publiée depuis chaque paquet stable `2026.4.23+` est un workflow
manuel `Update Migration` séparé, qui ne fait pas partie de Full Release CI.
Lindulgence héritée de package-acceptance est intentionnellement limitée dans
le temps. Les packages jusquà `2026.4.25` peuvent utiliser le chemin de
La tolérance historique de package-acceptance est intentionnellement limitée
dans le temps. Les paquets jusquà `2026.4.25` peuvent utiliser le chemin de
compatibilité pour les lacunes de métadonnées déjà publiées sur npm : entrées
privées dinventaire QA absentes du tarball, `gateway install --wrapper`
manquant, fichiers de patch manquants dans la fixture git dérivée du tarball,
`update.channel` persistant manquant, anciens emplacements denregistrements
dinstallation de Plugin, persistance manquante des enregistrements
dinstallation de marketplace, et migration des métadonnées de configuration
pendant `plugins update`. Le package `2026.4.26` publié peut émettre des
avertissements pour les fichiers dempreinte de métadonnées de build local déjà
livrés. Les packages ultérieurs doivent satisfaire les contrats de package
modernes ; ces mêmes lacunes font échouer la validation de version.
dinventaire QA privées absentes du tarball, `gateway install --wrapper` absent,
fichiers de correctif absents de la fixture git dérivée du tarball,
`update.channel` persisté absent, anciens emplacements denregistrement
dinstallation de Plugin, persistance denregistrement dinstallation de
marketplace absente, et migration de métadonnées de configuration pendant
`plugins update`. Le paquet publié `2026.4.26` peut avertir pour les fichiers
dhorodatage de métadonnées de build local qui ont déjà été livrés. Les paquets
ultérieurs doivent satisfaire les contrats modernes de paquet ; ces mêmes
lacunes font échouer la validation de release.
Utilisez des profils Package Acceptance plus larges lorsque la question de
version porte sur un package réellement installable :
release porte sur un véritable paquet installable :
```bash
gh workflow run package-acceptance.yml \
@ -433,26 +535,35 @@ gh workflow run package-acceptance.yml \
-f published_upgrade_survivor_baseline=openclaw@2026.4.26
```
Profils de package courants :
Profils de paquet courants :
- `smoke` : voies rapides dinstallation de package/canal/agent, de réseau Gateway et de rechargement de configuration
- `package` : contrats dinstallation/mise à jour/package Plugin sans ClawHub en direct ; cest la valeur par défaut du contrôle de version
- `product` : `package` plus les canaux MCP, le nettoyage cron/sous-agent, la recherche web OpenAI et OpenWebUI
- `full` : fragments de chemin de publication Docker avec OpenWebUI
- `custom` : liste exacte `docker_lanes` pour des réexécutions ciblées
- `smoke` : installation rapide du package/canal/agent, réseau Gateway et voies de
rechargement de configuration
- `package` : contrats dinstallation/mise à jour/package de plugin sans ClawHub en direct ; cest la valeur par défaut
de la vérification de release
- `product` : `package` plus canaux MCP, nettoyage cron/sous-agent, recherche web
OpenAI et OpenWebUI
- `full` : segments du chemin de release Docker avec OpenWebUI
- `custom` : liste `docker_lanes` exacte pour des relances ciblées
Pour la preuve Telegram du package candidat, activez `telegram_mode=mock-openai` ou `telegram_mode=live-frontier` dans Package Acceptance. Le workflow transmet larchive tarball `package-under-test` résolue à la voie Telegram ; le workflow Telegram autonome accepte toujours une spécification npm publiée pour les contrôles après publication.
Pour la preuve Telegram dun package candidat, activez `telegram_mode=mock-openai` ou
`telegram_mode=live-frontier` sur Package Acceptance. Le workflow transmet le tarball
`package-under-test` résolu à la voie Telegram ; le workflow Telegram autonome
accepte toujours une spécification npm publiée pour les vérifications post-publication.
## Automatisation de publication de version
## Automatisation de publication de release
`OpenClaw Release Publish` est le point dentrée normal de publication avec mutation. Il orchestre les workflows de publication fiable dans lordre requis par la version :
`OpenClaw Release Publish` est le point dentrée normal de publication mutante. Il
orchestre les workflows déditeur approuvé dans lordre requis par la release :
1. Extraire le tag de version et résoudre son SHA de commit.
2. Vérifier que le tag est accessible depuis `main` ou `release/*`.
1. Extraire le tag de release et résoudre son SHA de commit.
2. Vérifier que le tag est atteignable depuis `main` ou `release/*`.
3. Exécuter `pnpm plugins:sync:check`.
4. Déclencher `Plugin NPM Release` avec `publish_scope=all-publishable` et `ref=<release-sha>`.
5. Déclencher `Plugin ClawHub Release` avec la même portée et le même SHA.
6. Déclencher `OpenClaw NPM Release` avec le tag de version, le dist-tag npm et le `preflight_run_id` enregistré.
4. Déclencher `Plugin NPM Release` avec `publish_scope=all-publishable` et
`ref=<release-sha>`.
5. Déclencher `Plugin ClawHub Release` avec le même périmètre et le même SHA.
6. Déclencher `OpenClaw NPM Release` avec le tag de release, le dist-tag npm et
le `preflight_run_id` enregistré.
Exemple de publication bêta :
@ -484,57 +595,92 @@ gh workflow run openclaw-release-publish.yml \
-f npm_dist_tag=latest
```
Utilisez les workflows de plus bas niveau `Plugin NPM Release` et `Plugin ClawHub Release` uniquement pour une réparation ciblée ou un travail de republication. Pour une réparation de Plugin sélectionné, transmettez `plugin_publish_scope=selected` et `plugins=@openclaw/name` à `OpenClaw Release Publish`, ou déclenchez directement le workflow enfant lorsque le package OpenClaw ne doit pas être publié.
Utilisez les workflows de plus bas niveau `Plugin NPM Release` et `Plugin ClawHub Release`
uniquement pour une réparation ciblée ou une republication. Pour une réparation de plugin
sélectionné, transmettez `plugin_publish_scope=selected` et `plugins=@openclaw/name` à
`OpenClaw Release Publish`, ou déclenchez directement le workflow enfant lorsque le
package OpenClaw ne doit pas être publié.
## Entrées du workflow NPM
`OpenClaw NPM Release` accepte ces entrées contrôlées par lopérateur :
- `tag` : tag de version requis tel que `v2026.4.2`, `v2026.4.2-1` ou `v2026.4.2-beta.1` ; lorsque `preflight_only=true`, il peut aussi sagir du SHA de commit complet à 40 caractères de la branche de workflow actuelle pour un précontrôle uniquement de validation
- `preflight_only` : `true` pour la validation/construction/package uniquement, `false` pour le vrai chemin de publication
- `preflight_run_id` : requis sur le vrai chemin de publication afin que le workflow réutilise larchive tarball préparée depuis lexécution de précontrôle réussie
- `npm_dist_tag` : tag npm cible pour le chemin de publication ; valeur par défaut `beta`
- `tag` : tag de release requis, comme `v2026.4.2`, `v2026.4.2-1` ou
`v2026.4.2-beta.1` ; lorsque `preflight_only=true`, il peut aussi sagir du SHA de commit complet
de 40 caractères de la branche de workflow actuelle pour un preflight uniquement
de validation
- `preflight_only` : `true` pour validation/build/package uniquement, `false` pour le
véritable chemin de publication
- `preflight_run_id` : requis sur le véritable chemin de publication afin que le workflow réutilise
le tarball préparé par lexécution de preflight réussie
- `npm_dist_tag` : tag npm cible pour le chemin de publication ; vaut `beta` par défaut
`OpenClaw Release Publish` accepte ces entrées contrôlées par lopérateur :
- `tag` : tag de version requis ; il doit déjà exister
- `preflight_run_id` : identifiant dexécution de précontrôle `OpenClaw NPM Release` réussi ; requis lorsque `publish_openclaw_npm=true`
- `tag` : tag de release requis ; doit déjà exister
- `preflight_run_id` : identifiant dexécution de preflight `OpenClaw NPM Release` réussi ;
requis lorsque `publish_openclaw_npm=true`
- `npm_dist_tag` : tag npm cible pour le package OpenClaw
- `plugin_publish_scope` : valeur par défaut `all-publishable` ; utilisez `selected` uniquement pour un travail de réparation ciblé
- `plugins` : noms de packages `@openclaw/*` séparés par des virgules lorsque `plugin_publish_scope=selected`
- `publish_openclaw_npm` : valeur par défaut `true` ; définissez `false` uniquement lorsque vous utilisez le workflow comme orchestrateur de réparation limité aux Plugins
- `plugin_publish_scope` : vaut `all-publishable` par défaut ; utilisez `selected` uniquement
pour une réparation ciblée
- `plugins` : noms de packages `@openclaw/*` séparés par des virgules lorsque
`plugin_publish_scope=selected`
- `publish_openclaw_npm` : vaut `true` par défaut ; définissez `false` uniquement lorsque vous utilisez le
workflow comme orchestrateur de réparation limitée aux plugins
`OpenClaw Release Checks` accepte ces entrées contrôlées par lopérateur :
- `ref` : branche, tag ou SHA de commit complet à valider. Les contrôles contenant des secrets exigent que le commit résolu soit accessible depuis une branche OpenClaw ou un tag de version.
- `ref` : branche, tag ou SHA de commit complet à valider. Les vérifications portant des secrets
exigent que le commit résolu soit atteignable depuis une branche OpenClaw ou un
tag de release.
Règles :
- Les tags stables et de correction peuvent publier vers `beta` ou `latest`
- Les tags de préversion bêta peuvent publier uniquement vers `beta`
- Pour `OpenClaw NPM Release`, lentrée SHA de commit complet est autorisée uniquement lorsque `preflight_only=true`
- `OpenClaw Release Checks` et `Full Release Validation` sont toujours uniquement de validation
- Le vrai chemin de publication doit utiliser le même `npm_dist_tag` que celui utilisé pendant le précontrôle ; le workflow vérifie ces métadonnées avant de poursuivre la publication
- Les tags de prérelease bêta ne peuvent publier que vers `beta`
- Pour `OpenClaw NPM Release`, lentrée SHA de commit complet nest autorisée que lorsque
`preflight_only=true`
- `OpenClaw Release Checks` et `Full Release Validation` sont toujours
uniquement de validation
- Le véritable chemin de publication doit utiliser le même `npm_dist_tag` que celui utilisé pendant le preflight ;
le workflow vérifie ces métadonnées avant de poursuivre la publication
## Séquence de version npm stable
## Séquence de release npm stable
Lors de la préparation dune version npm stable :
Lors de la préparation dune release npm stable :
1. Exécutez `OpenClaw NPM Release` avec `preflight_only=true`
- Avant quun tag nexiste, vous pouvez utiliser le SHA de commit complet de la branche de workflow actuelle pour une répétition à blanc du workflow de précontrôle, uniquement de validation
2. Choisissez `npm_dist_tag=beta` pour le flux normal bêta dabord, ou `latest` uniquement lorsque vous souhaitez intentionnellement une publication stable directe
3. Exécutez `Full Release Validation` sur la branche de version, le tag de version ou le SHA de commit complet lorsque vous voulez la CI normale plus la couverture du cache dinvites en direct, de Docker, de QA Lab, de Matrix et de Telegram depuis un seul workflow manuel
4. Si vous navez intentionnellement besoin que du graphe de tests normal déterministe, exécutez plutôt le workflow manuel `CI` sur la ref de version
- Avant quun tag existe, vous pouvez utiliser le SHA de commit complet de la branche de workflow
actuelle pour un essai à blanc uniquement de validation du workflow de preflight
2. Choisissez `npm_dist_tag=beta` pour le flux normal bêta dabord, ou `latest` uniquement
lorsque vous voulez intentionnellement une publication stable directe
3. Exécutez `Full Release Validation` sur la branche de release, le tag de release ou le SHA de
commit complet lorsque vous voulez la CI normale plus la couverture cache de prompt en direct,
Docker, QA Lab, Matrix et Telegram depuis un seul workflow manuel
4. Si vous navez intentionnellement besoin que du graphe de tests normal déterministe, exécutez plutôt le
workflow manuel `CI` sur la référence de release
5. Enregistrez le `preflight_run_id` réussi
6. Exécutez `OpenClaw Release Publish` avec le même `tag`, le même `npm_dist_tag` et le `preflight_run_id` enregistré ; il publie les Plugins externalisés vers npm et ClawHub avant de promouvoir le package npm OpenClaw
7. Si la version a atterri sur `beta`, utilisez le workflow privé `openclaw/releases-private/.github/workflows/openclaw-npm-dist-tags.yml` pour promouvoir cette version stable de `beta` vers `latest`
8. Si la version a été intentionnellement publiée directement vers `latest` et que `beta` doit suivre immédiatement la même construction stable, utilisez ce même workflow privé pour faire pointer les deux dist-tags vers la version stable, ou laissez sa synchronisation planifiée dauto-réparation déplacer `beta` plus tard
6. Exécutez `OpenClaw Release Publish` avec le même `tag`, le même `npm_dist_tag`,
et le `preflight_run_id` enregistré ; il publie les plugins externalisés vers npm
et ClawHub avant de promouvoir le package npm OpenClaw
7. Si la release a atterri sur `beta`, utilisez le workflow privé
`openclaw/releases-private/.github/workflows/openclaw-npm-dist-tags.yml`
pour promouvoir cette version stable de `beta` vers `latest`
8. Si la release a intentionnellement été publiée directement vers `latest` et que `beta`
doit suivre immédiatement le même build stable, utilisez ce même workflow privé
pour faire pointer les deux dist-tags vers la version stable, ou laissez sa synchronisation
auto-réparatrice planifiée déplacer `beta` plus tard
La mutation du dist-tag réside dans le dépôt privé pour des raisons de sécurité, car elle nécessite toujours `NPM_TOKEN`, tandis que le dépôt public conserve une publication uniquement OIDC.
La mutation du dist-tag réside dans le dépôt privé pour des raisons de sécurité, car elle
requiert toujours `NPM_TOKEN`, tandis que le dépôt public conserve une publication uniquement OIDC.
Cela permet de garder le chemin de publication directe et le chemin de promotion bêta dabord tous deux documentés et visibles pour lopérateur.
Cela garde le chemin de publication directe et le chemin de promotion bêta dabord tous deux
documentés et visibles par lopérateur.
Si un mainteneur doit revenir à lauthentification npm locale, exécutez les commandes de la CLI 1Password (`op`) uniquement dans une session tmux dédiée. Nappelez pas `op` directement depuis le shell principal de lagent ; le garder dans tmux rend les invites, alertes et traitements OTP observables et évite les alertes hôte répétées.
Si un mainteneur doit revenir à lauthentification npm locale, exécutez toute commande CLI
1Password (`op`) uniquement dans une session tmux dédiée. Nappelez pas `op`
directement depuis le shell principal de lagent ; le conserver dans tmux rend les invites,
alertes et la gestion OTP observables et évite les alertes hôte répétées.
## Références publiques
@ -548,8 +694,10 @@ Si un mainteneur doit revenir à lauthentification npm locale, exécutez les
- [`scripts/package-mac-dist.sh`](https://github.com/openclaw/openclaw/blob/main/scripts/package-mac-dist.sh)
- [`scripts/make_appcast.sh`](https://github.com/openclaw/openclaw/blob/main/scripts/make_appcast.sh)
Les mainteneurs utilisent la documentation de version privée dans [`openclaw/maintainers/release/README.md`](https://github.com/openclaw/maintainers/blob/main/release/README.md) pour le runbook réel.
Les mainteneurs utilisent la documentation de release privée dans
[`openclaw/maintainers/release/README.md`](https://github.com/openclaw/maintainers/blob/main/release/README.md)
pour le runbook réel.
## Connexe
- [Canaux de publication](/fr/install/development-channels)
- [Canaux de release](/fr/install/development-channels)

View File

@ -1,40 +1,40 @@
---
read_when:
- Vous souhaitez une défense en profondeur contre les attaques SSRF et de réassociation DNS
- Configuration dun proxy direct externe pour le trafic dexécution dOpenClaw
summary: Comment acheminer le trafic HTTP et WebSocket de lenvironnement dexécution OpenClaw via un proxy de filtrage géré par lopérateur
- Configuration d'un proxy direct externe pour le trafic d'exécution d'OpenClaw
summary: Comment acheminer le trafic HTTP et WebSocket dexécution dOpenClaw via un proxy de filtrage géré par lopérateur
title: Proxy réseau
x-i18n:
generated_at: "2026-05-04T02:25:50Z"
generated_at: "2026-05-04T07:06:16Z"
model: gpt-5.5
provider: openai
source_hash: cd5594324e8c6b7da51d903e98fda0feacb8970e0b15d980f7a249d6641461c9
source_hash: fc7140c5ced0e7454a6f85d1ea8f3256bbd28cc0cb42eeafe8e5e6439b90e3f0
source_path: security/network-proxy.md
workflow: 16
---
# Proxy réseau
OpenClaw peut acheminer le trafic HTTP et WebSocket dexécution via un proxy direct géré par lopérateur. Il sagit dune défense en profondeur facultative pour les déploiements qui veulent un contrôle central de la sortie réseau, une protection SSRF plus forte et une meilleure auditabilité réseau.
OpenClaw peut router le trafic HTTP et WebSocket dexécution via un proxy direct géré par lopérateur. Il sagit dune défense en profondeur facultative pour les déploiements qui veulent un contrôle centralisé de la sortie réseau, une protection SSRF renforcée et une meilleure auditabilité réseau.
OpenClaw ne fournit pas, ne télécharge pas, ne démarre pas, ne configure pas et ne certifie pas de proxy. Vous exécutez la technologie de proxy adaptée à votre environnement, et OpenClaw y achemine les clients HTTP et WebSocket normaux locaux au processus.
OpenClaw ne fournit pas, ne télécharge pas, ne démarre pas, ne configure pas et ne certifie pas de proxy. Vous exécutez la technologie de proxy adaptée à votre environnement, et OpenClaw y route les clients HTTP et WebSocket locaux au processus.
## Pourquoi utiliser un proxy ?
Un proxy donne aux opérateurs un point de contrôle réseau unique pour le trafic HTTP et WebSocket sortant. Cela peut être utile même en dehors du renforcement contre les SSRF :
Un proxy donne aux opérateurs un point de contrôle réseau unique pour le trafic HTTP et WebSocket sortant. Cela peut être utile même en dehors du durcissement SSRF :
- Politique centrale : maintenir une seule politique de sortie au lieu de compter sur chaque point dappel HTTP de lapplication pour appliquer correctement les règles réseau.
- Vérifications au moment de la connexion : évaluer la destination après la résolution DNS et juste avant que le proxy ouvre la connexion en amont.
- Défense contre le rebinding DNS : réduire lécart entre une vérification DNS au niveau de lapplication et la connexion sortante réelle.
- Couverture JavaScript plus large : acheminer les clients ordinaires `fetch`, `node:http`, `node:https`, WebSocket, axios, got, node-fetch et similaires via le même chemin.
- Politique centrale : maintenir une seule politique de sortie au lieu de compter sur chaque point dappel HTTP applicatif pour appliquer correctement les règles réseau.
- Vérifications à la connexion : évaluer la destination après la résolution DNS et juste avant que le proxy nouvre la connexion amont.
- Défense contre le rebinding DNS : réduire lécart entre une vérification DNS au niveau applicatif et la connexion sortante réelle.
- Couverture JavaScript plus large : router les clients ordinaires `fetch`, `node:http`, `node:https`, WebSocket, axios, got, node-fetch et clients similaires via le même chemin.
- Auditabilité : journaliser les destinations autorisées et refusées à la frontière de sortie.
- Contrôle opérationnel : appliquer des règles de destination, une segmentation réseau, des limites de débit ou des listes dautorisation sortantes sans reconstruire OpenClaw.
Lacheminement par proxy est un garde-fou au niveau du processus pour la sortie HTTP et WebSocket normale. Il donne aux opérateurs un chemin fermé en cas déchec pour acheminer les clients HTTP JavaScript pris en charge via leur propre proxy de filtrage, mais ce nest pas un bac à sable réseau au niveau de lOS et cela ne fait pas certifier par OpenClaw la politique de destination du proxy.
Le routage par proxy est un garde-fou au niveau du processus pour la sortie HTTP et WebSocket normale. Il donne aux opérateurs un chemin à échec fermé pour router les clients HTTP JavaScript pris en charge via leur propre proxy de filtrage, mais ce nest pas un bac à sable réseau au niveau du système dexploitation et il ne fait pas certifier par OpenClaw la politique de destination du proxy.
## Comment OpenClaw achemine le trafic
## Comment OpenClaw route le trafic
Quand `proxy.enabled=true` et quune URL de proxy est configurée, les processus dexécution protégés comme `openclaw gateway run`, `openclaw node run` et `openclaw agent --local` acheminent la sortie HTTP et WebSocket normale via le proxy configuré :
Lorsque `proxy.enabled=true` et quune URL de proxy est configurée, les processus dexécution protégés tels que `openclaw gateway run`, `openclaw node run` et `openclaw agent --local` routent la sortie HTTP et WebSocket normale via le proxy configuré :
```text
OpenClaw process
@ -43,27 +43,27 @@ OpenClaw process
WebSocket clients -> operator-managed filtering proxy -> public internet
```
Le contrat public est le comportement dacheminement, pas les hooks Node internes utilisés pour limplémenter. Les clients WebSocket du plan de contrôle dOpenClaw Gateway utilisent un chemin direct étroit pour le trafic RPC Gateway en local loopback lorsque lURL du Gateway utilise `localhost` ou une IP de loopback littérale comme `127.0.0.1` ou `[::1]`. Ce chemin du plan de contrôle doit pouvoir atteindre les Gateway en loopback même lorsque le proxy de lopérateur bloque les destinations de loopback. Les requêtes HTTP et WebSocket dexécution normales utilisent toujours le proxy configuré.
Le contrat public est le comportement de routage, pas les hooks Node internes utilisés pour limplémenter. Les clients WebSocket du plan de contrôle OpenClaw Gateway utilisent un chemin direct étroit pour le trafic RPC Gateway en local loopback lorsque lURL du Gateway utilise `localhost` ou une adresse IP de bouclage littérale telle que `127.0.0.1` ou `[::1]`. Ce chemin du plan de contrôle doit pouvoir atteindre les Gateways de bouclage même lorsque le proxy de lopérateur bloque les destinations de bouclage. Les requêtes HTTP et WebSocket dexécution normales utilisent toujours le proxy configuré.
En interne, OpenClaw utilise deux hooks dacheminement au niveau du processus pour cette fonctionnalité :
En interne, OpenClaw utilise deux hooks de routage au niveau du processus pour cette fonctionnalité :
- Lacheminement par répartiteur Undici couvre `fetch`, les clients basés sur undici et les transports qui fournissent leur propre répartiteur undici.
- Lacheminement `global-agent` couvre les appelants Node core `node:http` et `node:https`, y compris de nombreuses bibliothèques construites sur `http.request`, `https.request`, `http.get` et `https.get`. Le mode proxy géré force cet agent global afin que des agents HTTP Node explicites ne contournent pas accidentellement le proxy de lopérateur.
- Le routage du répartiteur Undici couvre `fetch`, les clients basés sur undici et les transports qui fournissent leur propre répartiteur undici.
- Le routage `global-agent` couvre les appelants Node core `node:http` et `node:https`, y compris de nombreuses bibliothèques construites sur `http.request`, `https.request`, `http.get` et `https.get`. Le mode proxy géré force cet agent global afin que les agents HTTP Node explicites ne contournent pas accidentellement le proxy de lopérateur.
Certains plugins possèdent des transports personnalisés qui nécessitent un câblage explicite du proxy même lorsquun acheminement au niveau du processus existe. Par exemple, le transport de lAPI Bot de Telegram utilise son propre répartiteur HTTP/1 undici et respecte donc lenvironnement de proxy du processus ainsi que le repli géré `OPENCLAW_PROXY_URL` dans ce chemin de transport propre au propriétaire.
Certains plugins possèdent des transports personnalisés qui nécessitent un câblage de proxy explicite même lorsquun routage au niveau du processus existe. Par exemple, le transport Bot API de Telegram utilise son propre répartiteur undici HTTP/1 et respecte donc lenvironnement de proxy du processus ainsi que le repli géré `OPENCLAW_PROXY_URL` dans ce chemin de transport propre à ce propriétaire.
LURL du proxy elle-même doit utiliser `http://`. Les destinations HTTPS restent prises en charge via le proxy avec HTTP `CONNECT` ; cela signifie seulement quOpenClaw attend un écouteur de proxy direct HTTP simple comme `http://127.0.0.1:3128`.
LURL du proxy elle-même doit utiliser `http://`. Les destinations HTTPS restent prises en charge via le proxy avec HTTP `CONNECT` ; cela signifie seulement quOpenClaw attend un écouteur de proxy direct HTTP en clair tel que `http://127.0.0.1:3128`.
Tant que le proxy est actif, OpenClaw efface `no_proxy`, `NO_PROXY` et `GLOBAL_AGENT_NO_PROXY`. Ces listes de contournement sont basées sur la destination ; laisser `localhost` ou `127.0.0.1` à cet endroit permettrait donc à des cibles SSRF à haut risque déviter le proxy de filtrage.
Pendant que le proxy est actif, OpenClaw efface `no_proxy`, `NO_PROXY` et `GLOBAL_AGENT_NO_PROXY`. Ces listes de contournement étant basées sur la destination, y laisser `localhost` ou `127.0.0.1` permettrait à des cibles SSRF à haut risque déviter le proxy de filtrage.
À larrêt, OpenClaw restaure lenvironnement de proxy précédent et réinitialise létat dacheminement de processus mis en cache.
À larrêt, OpenClaw restaure lenvironnement de proxy précédent et réinitialise létat de routage de processus mis en cache.
## Termes de proxy associés
## Termes de proxy connexes
- `proxy.enabled` / `proxy.proxyUrl` : acheminement par proxy direct sortant pour la sortie dexécution OpenClaw. Cette page documente cette fonctionnalité.
- `gateway.auth.mode: "trusted-proxy"` : authentification par proxy inverse sensible à lidentité pour laccès au Gateway. Consultez [Authentification par proxy de confiance](/fr/gateway/trusted-proxy-auth).
- `openclaw proxy` : proxy de débogage local et inspecteur de capture pour le développement et le support. Consultez [openclaw proxy](/fr/cli/proxy).
- Paramètres de proxy propres à un canal ou à un fournisseur : remplacements propres au propriétaire pour un transport particulier. Préférez le proxy réseau géré lorsque lobjectif est un contrôle central de la sortie sur toute lexécution.
- `proxy.enabled` / `proxy.proxyUrl` : routage par proxy direct sortant pour la sortie dexécution OpenClaw. Cette page documente cette fonctionnalité.
- `gateway.auth.mode: "trusted-proxy"` : authentification par proxy inverse entrant tenant compte de lidentité pour laccès au Gateway. Voir [Authentification par proxy approuvé](/fr/gateway/trusted-proxy-auth).
- `openclaw proxy` : proxy de débogage local et inspecteur de capture pour le développement et le support. Voir [openclaw proxy](/fr/cli/proxy).
- Paramètres de proxy propres à un canal ou à un fournisseur : remplacements propres au propriétaire pour un transport particulier. Préférez le proxy réseau géré lorsque lobjectif est un contrôle centralisé de la sortie sur lensemble de lexécution.
## Configuration
@ -73,13 +73,13 @@ proxy:
proxyUrl: http://127.0.0.1:3128
```
Vous pouvez également fournir lURL via lenvironnement, tout en gardant `proxy.enabled=true` dans la configuration :
Vous pouvez aussi fournir lURL via lenvironnement, tout en conservant `proxy.enabled=true` dans la configuration :
```bash
OPENCLAW_PROXY_URL=http://127.0.0.1:3128 openclaw gateway run
```
`proxy.proxyUrl` est prioritaire sur `OPENCLAW_PROXY_URL`.
`proxy.proxyUrl` a priorité sur `OPENCLAW_PROXY_URL`.
Si `enabled=true` mais quaucune URL de proxy valide nest configurée, les commandes protégées échouent au démarrage au lieu de revenir à un accès réseau direct.
@ -92,41 +92,41 @@ openclaw gateway install --force
openclaw gateway start
```
Le repli denvironnement convient surtout aux exécutions au premier plan. Si vous lutilisez avec un service installé, placez `OPENCLAW_PROXY_URL` dans lenvironnement durable du service, par exemple `$OPENCLAW_STATE_DIR/.env` ou `~/.openclaw/.env`, puis réinstallez le service afin que launchd, systemd ou Scheduled Tasks démarre le Gateway avec cette valeur.
Le repli par lenvironnement convient surtout aux exécutions au premier plan. Si vous lutilisez avec un service installé, placez `OPENCLAW_PROXY_URL` dans lenvironnement durable du service, par exemple `$OPENCLAW_STATE_DIR/.env` ou `~/.openclaw/.env`, puis réinstallez le service afin que launchd, systemd ou Scheduled Tasks démarre le gateway avec cette valeur.
Pour les commandes `openclaw --container ...`, OpenClaw transmet `OPENCLAW_PROXY_URL` à la CLI enfant ciblée conteneur lorsquelle est définie. LURL doit être accessible depuis lintérieur du conteneur ; `127.0.0.1` désigne le conteneur lui-même, pas lhôte. OpenClaw rejette les URL de proxy en loopback pour les commandes ciblées conteneur, sauf si vous remplacez explicitement cette vérification de sécurité.
Pour les commandes `openclaw --container ...`, OpenClaw transmet `OPENCLAW_PROXY_URL` à la CLI enfant ciblant le conteneur lorsquelle est définie. LURL doit être accessible depuis lintérieur du conteneur ; `127.0.0.1` désigne le conteneur lui-même, pas lhôte. OpenClaw rejette les URL de proxy en bouclage pour les commandes ciblant un conteneur, sauf si vous remplacez explicitement cette vérification de sécurité.
## Exigences du proxy
La politique du proxy constitue la frontière de sécurité. OpenClaw ne peut pas vérifier que le proxy bloque les bonnes cibles.
La politique du proxy est la frontière de sécurité. OpenClaw ne peut pas vérifier que le proxy bloque les bonnes cibles.
Configurez le proxy pour :
- Se lier uniquement au loopback ou à une interface privée de confiance.
- Restreindre laccès afin que seul le processus, lhôte, le conteneur ou le compte de service OpenClaw puisse lutiliser.
- Se lier uniquement au bouclage ou à une interface privée de confiance.
- Restreindre laccès afin que seuls le processus, lhôte, le conteneur ou le compte de service OpenClaw puissent lutiliser.
- Résoudre lui-même les destinations et bloquer les IP de destination après la résolution DNS.
- Appliquer la politique au moment de la connexion pour les requêtes HTTP simples comme pour les tunnels HTTPS `CONNECT`.
- Rejeter les contournements basés sur la destination pour les plages de loopback, privées, link-local, de métadonnées, multicast, réservées ou de documentation.
- Éviter les listes dautorisation de noms dhôte, sauf si vous faites pleinement confiance au chemin de résolution DNS.
- Journaliser la destination, la décision, le statut et la raison sans journaliser les corps de requête, les en-têtes dautorisation, les cookies ni dautres secrets.
- Garder la politique du proxy sous contrôle de version et examiner les changements comme une configuration sensible pour la sécurité.
- Appliquer la politique au moment de la connexion pour les requêtes HTTP en clair comme pour les tunnels HTTPS `CONNECT`.
- Rejeter les contournements basés sur la destination pour les plages de bouclage, privées, link-local, de métadonnées, multicast, réservées ou de documentation.
- Éviter les listes dautorisation de noms dhôte sauf si vous faites entièrement confiance au chemin de résolution DNS.
- Journaliser la destination, la décision, létat et le motif sans journaliser les corps de requête, les en-têtes dautorisation, les cookies ou dautres secrets.
- Conserver la politique du proxy sous contrôle de version et examiner les changements comme une configuration sensible pour la sécurité.
## Destinations bloquées recommandées
Utilisez cette liste de refus comme point de départ pour tout proxy direct, pare-feu ou politique de sortie.
La logique de classification au niveau de lapplication OpenClaw se trouve dans `src/infra/net/ssrf.ts` et `src/shared/net/ip.ts`. Les hooks de parité pertinents sont `BLOCKED_HOSTNAMES`, `BLOCKED_IPV4_SPECIAL_USE_RANGES`, `BLOCKED_IPV6_SPECIAL_USE_RANGES`, `RFC2544_BENCHMARK_PREFIX` et la gestion intégrée de la sentinelle IPv4 pour les formes NAT64, 6to4, Teredo, ISATAP et IPv4-mapped. Ces fichiers sont des références utiles pour maintenir une politique de proxy externe, mais OpenClaw nexporte ni napplique automatiquement ces règles dans votre proxy.
La logique de classification au niveau applicatif dOpenClaw se trouve dans `src/infra/net/ssrf.ts` et `src/shared/net/ip.ts`. Les hooks de parité pertinents sont `BLOCKED_HOSTNAMES`, `BLOCKED_IPV4_SPECIAL_USE_RANGES`, `BLOCKED_IPV6_SPECIAL_USE_RANGES`, `RFC2544_BENCHMARK_PREFIX` et la gestion intégrée des sentinelles IPv4 pour NAT64, 6to4, Teredo, ISATAP et les formes IPv4-mapped. Ces fichiers sont des références utiles lors de la maintenance dune politique de proxy externe, mais OpenClaw nexporte ni napplique automatiquement ces règles dans votre proxy.
| Plage ou hôte | Pourquoi bloquer |
| ------------------------------------------------------------------------------------ | --------------------------------------------------- |
| `127.0.0.0/8`, `localhost`, `localhost.localdomain` | Loopback IPv4 |
| `::1/128` | Loopback IPv6 |
| `0.0.0.0/8`, `::/128` | Adresses non spécifiées et de ce réseau |
| `127.0.0.0/8`, `localhost`, `localhost.localdomain` | Bouclage IPv4 |
| `::1/128` | Bouclage IPv6 |
| `0.0.0.0/8`, `::/128` | Adresses non spécifiées et du réseau courant |
| `10.0.0.0/8`, `172.16.0.0/12`, `192.168.0.0/16` | Réseaux privés RFC1918 |
| `169.254.0.0/16`, `fe80::/10` | Adresses link-local et chemins courants de métadonnées cloud |
| `169.254.0.0/16`, `fe80::/10` | Adresses link-local et chemins de métadonnées cloud courants |
| `169.254.169.254`, `metadata.google.internal` | Services de métadonnées cloud |
| `100.64.0.0/10` | Espace dadresses partagé NAT de grade opérateur |
| `198.18.0.0/15`, `2001:2::/48` | Plages de benchmarking |
| `100.64.0.0/10` | Espace dadressage partagé NAT de classe opérateur |
| `198.18.0.0/15`, `2001:2::/48` | Plages de benchmark |
| `192.0.0.0/24`, `192.0.2.0/24`, `198.51.100.0/24`, `203.0.113.0/24`, `2001:db8::/32` | Plages à usage spécial et de documentation |
| `224.0.0.0/4`, `ff00::/8` | Multicast |
| `240.0.0.0/4` | IPv4 réservé |
@ -136,7 +136,7 @@ La logique de classification au niveau de lapplication OpenClaw se trouve dan
| `2002::/16`, `2001::/32` | 6to4 et Teredo avec IPv4 intégrée |
| `::/96`, `::ffff:0:0/96` | IPv6 compatible IPv4 et IPv6 IPv4-mapped |
Si votre fournisseur cloud ou votre plateforme réseau documente dautres hôtes de métadonnées ou plages réservées, ajoutez-les également.
Si votre fournisseur cloud ou votre plateforme réseau documente des hôtes de métadonnées ou des plages réservées supplémentaires, ajoutez-les également.
## Validation
@ -146,9 +146,9 @@ Validez le proxy depuis le même hôte, conteneur ou compte de service qui exéc
openclaw proxy validate --proxy-url http://127.0.0.1:3128
```
Par défaut, lorsquaucune destination personnalisée nest fournie, la commande vérifie que `https://example.com/` réussit et démarre un canari temporaire en loopback que le proxy ne doit pas atteindre. La vérification refusée par défaut réussit lorsque le proxy renvoie une réponse de refus non-2xx ou bloque le canari avec un échec de transport ; elle échoue si une réponse réussie atteint le canari. Si aucun proxy nest activé et configuré, la validation signale un problème de configuration ; utilisez `--proxy-url` pour une prévalidation ponctuelle avant de changer la configuration. Utilisez `--allowed-url` et `--denied-url` pour tester les attentes propres au déploiement. Les destinations refusées personnalisées sont fermées en cas déchec : toute réponse HTTP signifie que la destination était accessible via le proxy, et toute erreur de transport est signalée comme non concluante, car OpenClaw ne peut pas prouver que le proxy a bloqué une origine accessible. En cas déchec de validation, la commande se termine avec le code 1.
Par défaut, lorsquaucune destination personnalisée nest fournie, la commande vérifie que `https://example.com/` réussit et démarre un canari de bouclage temporaire que le proxy ne doit pas atteindre. La vérification refusée par défaut réussit lorsque le proxy renvoie une réponse de refus non 2xx ou bloque le canari avec une défaillance de transport ; elle échoue si une réponse réussie atteint le canari. Si aucun proxy nest activé et configuré, la validation signale un problème de configuration ; utilisez `--proxy-url` pour une pré-vérification ponctuelle avant de modifier la configuration. Utilisez `--allowed-url` et `--denied-url` pour tester les attentes propres au déploiement. Les destinations refusées personnalisées sont à échec fermé : toute réponse HTTP signifie que la destination était accessible via le proxy, et toute erreur de transport est signalée comme non concluante, car OpenClaw ne peut pas prouver que le proxy a bloqué une origine accessible. En cas déchec de validation, la commande se termine avec le code 1.
Utilisez `--json` pour lautomatisation. La sortie JSON contient le résultat global, la source effective de la configuration du proxy, les éventuelles erreurs de configuration et chaque vérification de destination. Les identifiants de lURL du proxy sont expurgés dans la sortie texte et JSON :
Utilisez `--json` pour lautomatisation. La sortie JSON contient le résultat global, la source effective de la configuration du proxy, toute erreur de configuration et chaque vérification de destination. Les identifiants de lURL de proxy sont expurgés dans la sortie texte et JSON :
```json
{
@ -178,7 +178,7 @@ curl -x http://127.0.0.1:3128 http://127.0.0.1/
curl -x http://127.0.0.1:3128 http://169.254.169.254/
```
La requête publique devrait réussir. Les requêtes de bouclage et de métadonnées devraient être bloquées par le proxy. Pour `openclaw proxy validate`, le canari de bouclage intégré peut distinguer un refus du proxy dune origine joignable. Les vérifications personnalisées `--denied-url` nont pas ce canari ; considérez donc les réponses HTTP comme les échecs de transport ambigus comme des échecs de validation, sauf si votre proxy expose un signal de refus propre au déploiement que vous pouvez vérifier séparément.
La requête publique doit réussir. Les requêtes de bouclage et de métadonnées doivent être bloquées par le proxy. Pour `openclaw proxy validate`, le canari de bouclage intégré peut distinguer un refus du proxy dune origine accessible. Les vérifications `--denied-url` personnalisées ne disposent pas de ce canari ; traitez donc les réponses HTTP comme les échecs de transport ambigus comme des échecs de validation, sauf si votre proxy expose un signal de refus propre au déploiement que vous pouvez vérifier séparément.
Activez ensuite le routage proxy dOpenClaw :
@ -198,10 +198,11 @@ proxy:
## Limites
- Le proxy améliore la couverture pour les clients HTTP et WebSocket JavaScript locaux au processus, mais ce nest pas un bac à sable réseau au niveau du système dexploitation.
- Les sockets `net`, `tls` et `http2` bruts, les addons natifs et les processus enfants peuvent contourner le routage proxy au niveau Node, sauf sils héritent des variables denvironnement proxy et les respectent.
- IRC est un canal TCP/TLS brut en dehors du routage via proxy direct géré par lopérateur. Dans les déploiements qui exigent que tout le trafic sortant passe par ce proxy direct, définissez `channels.irc.enabled=false`, sauf si le trafic IRC direct sortant est explicitement approuvé.
- Les interfaces Web locales des utilisateurs et les serveurs de modèles locaux doivent être ajoutés à la liste dautorisation dans la stratégie de proxy de lopérateur lorsque nécessaire ; OpenClaw nexpose pas de contournement général du réseau local pour eux.
- Le contournement du proxy du plan de contrôle du Gateway est volontairement limité à `localhost` et aux URL IP de bouclage littérales. Utilisez `ws://127.0.0.1:18789`, `ws://[::1]:18789` ou `ws://localhost:18789` pour les connexions locales directes au plan de contrôle du Gateway ; les autres noms dhôte sont routés comme du trafic ordinaire basé sur le nom dhôte.
- OpenClaw ninspecte, ne teste ni ne certifie votre stratégie de proxy.
- Traitez les modifications de stratégie de proxy comme des changements opérationnels sensibles en matière de sécurité.
- Le proxy améliore la couverture pour les clients HTTP JavaScript locaux au processus et WebSocket, mais ce nest pas un bac à sable réseau au niveau du système dexploitation.
- Les sockets `net`, `tls` et `http2` brutes, les extensions natives et les processus enfants peuvent contourner le routage proxy au niveau de Node, sauf sils héritent des variables denvironnement de proxy et les respectent.
- IRC est un canal TCP/TLS brut en dehors du routage par proxy direct géré par lopérateur. Dans les déploiements qui exigent que toutes les sorties passent par ce proxy direct, définissez `channels.irc.enabled=false`, sauf si la sortie IRC directe est explicitement approuvée.
- Le proxy de débogage local est un outil de diagnostic, et son transfert direct en amont pour les requêtes proxy et les tunnels CONNECT est désactivé par défaut lorsque le mode proxy géré est actif ; nactivez le transfert direct que pour des diagnostics locaux approuvés.
- Les WebUIs locales des utilisateurs et les serveurs de modèles locaux doivent être ajoutés à la liste dautorisation dans la politique de proxy de lopérateur lorsque nécessaire ; OpenClaw nexpose pas de contournement général du réseau local pour eux.
- Le contournement du proxy du plan de contrôle Gateway est volontairement limité à `localhost` et aux URL avec adresses IP de bouclage littérales. Utilisez `ws://127.0.0.1:18789`, `ws://[::1]:18789` ou `ws://localhost:18789` pour les connexions locales directes au plan de contrôle Gateway ; les autres noms dhôte sont routés comme du trafic ordinaire basé sur un nom dhôte.
- OpenClaw ninspecte, ne teste ni ne certifie votre politique de proxy.
- Traitez les modifications de politique de proxy comme des changements opérationnels sensibles à la sécurité.

View File

@ -1,42 +1,41 @@
---
read_when:
- Vous souhaitez effectuer du travail en arrière-plan ou en parallèle via lagent
- Vous modifiez la politique des outils sessions_spawn ou de sous-agent
- Vous implémentez ou dépannez des sessions de sous-agent liées au fil
- Vous souhaitez lancer un travail en arrière-plan ou en parallèle via lagent
- Vous modifiez sessions_spawn ou la politique de loutil de sous-agent
- Vous implémentez ou dépannez des sessions de sous-agents liées à un fil de discussion
sidebarTitle: Sub-agents
summary: Lancer des exécutions isolées dagent en arrière-plan qui annoncent les résultats dans la conversation du demandeur
summary: Lancer des exécutions dagents isolées en arrière-plan qui annoncent les résultats dans la conversation du demandeur
title: Sous-agents
x-i18n:
generated_at: "2026-05-04T02:27:12Z"
generated_at: "2026-05-04T07:06:32Z"
model: gpt-5.5
provider: openai
source_hash: d0df39e06b952def3eb0b296f36c7dc8c0b0a115785d865236a970c5d453fc37
source_hash: 65d60bf6813d667b7311aa28109d4bd6be012a16e638c64cfff130831db88cd8
source_path: tools/subagents.md
workflow: 16
---
Les sous-agents sont des exécutions dagent en arrière-plan lancées depuis une exécution dagent existante.
Ils sexécutent dans leur propre session (`agent:<agentId>:subagent:<uuid>`) et,
une fois terminés, **annoncent** leur résultat au canal de chat du demandeur.
Chaque exécution de sous-agent est suivie comme une
une fois terminés, **annoncent** leur résultat au canal de discussion du
demandeur. Chaque exécution de sous-agent est suivie comme une
[tâche en arrière-plan](/fr/automation/tasks).
Objectifs principaux :
- Paralléliser les travaux de « recherche / tâche longue / outil lent » sans bloquer lexécution principale.
- Garder les sous-agents isolés par défaut (séparation des sessions + sandboxing facultatif).
- Garder la surface des outils difficile à mal utiliser : les sous-agents nobtiennent **pas** les outils de session par défaut.
- Prendre en charge une profondeur dimbrication configurable pour les motifs dorchestration.
- Paralléliser le travail de « recherche / tâche longue / outil lent » sans bloquer lexécution principale.
- Garder les sous-agents isolés par défaut (séparation de session + sandboxing facultatif).
- Garder la surface doutils difficile à mal utiliser : les sous-agents nobtiennent **pas** les outils de session par défaut.
- Prendre en charge une profondeur dimbrication configurable pour les schémas dorchestration.
<Note>
**Note sur les coûts :** chaque sous-agent possède par défaut son propre contexte
et sa propre consommation de tokens. Pour les tâches lourdes ou répétitives,
définissez un modèle moins coûteux pour les sous-agents et gardez votre agent
principal sur un modèle de meilleure qualité. Configurez cela via
`agents.defaults.subagents.model` ou avec des remplacements par agent. Lorsquun enfant
a réellement besoin de la transcription courante du demandeur, lagent peut demander
`context: "fork"` pour ce lancement précis. Les sessions de sous-agent liées à un fil utilisent par défaut
`context: "fork"` parce quelles dérivent la conversation courante dans un
**Note sur les coûts :** chaque sous-agent a son propre contexte et sa propre utilisation de tokens par
défaut. Pour les tâches lourdes ou répétitives, définissez un modèle moins coûteux pour les sous-agents
et gardez votre agent principal sur un modèle de meilleure qualité. Configurez via
`agents.defaults.subagents.model` ou des remplacements par agent. Lorsquun enfant
a réellement besoin de la transcription actuelle du demandeur, lagent peut demander
`context: "fork"` sur ce lancement précis. Les sessions de sous-agent liées à un fil utilisent par défaut
`context: "fork"` parce quelles dérivent la conversation actuelle dans un
fil de suivi.
</Note>
@ -55,17 +54,17 @@ actuelle** :
/subagents spawn <agentId> <task> [--model <model>] [--thinking <level>]
```
Utilisez la commande de niveau supérieur [`/steer <message>`](/fr/tools/steer) pour orienter lexécution active de la session demanderesse actuelle. Utilisez `/subagents steer <id|#> <message>` lorsque la cible est une exécution enfant.
Utilisez [`/steer <message>`](/fr/tools/steer) au niveau supérieur pour guider lexécution active de la session actuelle du demandeur. Utilisez `/subagents steer <id|#> <message>` lorsque la cible est une exécution enfant.
`/subagents info` affiche les métadonnées de lexécution (état, horodatages, identifiant de session,
chemin de transcription, nettoyage). Utilisez `sessions_history` pour une vue de rappel bornée
et filtrée pour la sécurité ; inspectez le chemin de transcription sur disque lorsque vous
`/subagents info` affiche les métadonnées dexécution (statut, horodatages, identifiant de session,
chemin de transcription, nettoyage). Utilisez `sessions_history` pour une vue de rappel bornée et
filtrée pour la sécurité ; inspectez le chemin de transcription sur le disque lorsque vous
avez besoin de la transcription brute complète.
### Contrôles de liaison aux fils
### Contrôles de liaison de fil
Ces commandes fonctionnent sur les canaux qui prennent en charge les liaisons de fil persistantes.
Consultez [Canaux prenant en charge les fils](#thread-supporting-channels) ci-dessous.
Voir [Canaux prenant en charge les fils](#thread-supporting-channels) ci-dessous.
```text
/focus <subagent-label|session-key|session-id|session-label>
@ -75,79 +74,80 @@ Consultez [Canaux prenant en charge les fils](#thread-supporting-channels) ci-de
/session max-age <duration|off>
```
### Comportement du lancement
### Comportement de lancement
`/subagents spawn` démarre un sous-agent en arrière-plan comme commande utilisateur (et non comme
relais interne) et renvoie une seule mise à jour finale dachèvement au
chat du demandeur lorsque lexécution se termine.
relais interne) et renvoie une dernière mise à jour dachèvement au canal de discussion du
demandeur lorsque lexécution se termine.
<AccordionGroup>
<Accordion title="Non-blocking, push-based completion">
- La commande de lancement est non bloquante ; elle renvoie immédiatement un identifiant dexécution.
- À lachèvement, le sous-agent annonce un message de résumé/résultat au canal de chat du demandeur.
- Lachèvement fonctionne par envoi actif. Une fois lancé, ne consultez **pas** `/subagents list`, `sessions_list` ou `sessions_history` en boucle simplement pour attendre la fin ; inspectez létat uniquement à la demande pour le débogage ou lintervention.
- À lachèvement, OpenClaw ferme au mieux les onglets/processus de navigateur suivis ouverts par cette session de sous-agent avant la poursuite du flux de nettoyage de lannonce.
- À lachèvement, le sous-agent annonce un message de résumé/résultat au canal de discussion du demandeur.
- Lachèvement est basé sur le push. Une fois lancé, ne sondez **pas** `/subagents list`, `sessions_list` ou `sessions_history` en boucle uniquement pour attendre quil se termine ; inspectez le statut seulement à la demande pour le débogage ou lintervention.
- À lachèvement, OpenClaw ferme au mieux les onglets/processus de navigateur suivis ouverts par cette session de sous-agent avant que le flux de nettoyage de lannonce continue.
</Accordion>
<Accordion title="Manual-spawn delivery resilience">
- OpenClaw tente dabord une remise directe `agent` avec une clé didempotence stable.
- Si la remise directe échoue, il se rabat sur le routage par file.
- OpenClaw tente dabord une livraison directe `agent` avec une clé didempotence stable.
- Si le tour dachèvement de lagent demandeur échoue, ne produit aucune sortie visible ou renvoie un préfixe manifestement incomplet du résultat enfant capturé, OpenClaw se rabat sur une livraison directe de lachèvement à partir du résultat enfant capturé.
- Si la livraison directe ne peut pas être utilisée, il se rabat sur le routage par file.
- Si le routage par file nest toujours pas disponible, lannonce est retentée avec un court backoff exponentiel avant labandon final.
- La remise dachèvement conserve la route résolue du demandeur : les routes dachèvement liées à un fil ou à une conversation lemportent lorsquelles sont disponibles ; si lorigine de lachèvement ne fournit quun canal, OpenClaw complète la cible/le compte manquant à partir de la route résolue de la session du demandeur (`lastChannel` / `lastTo` / `lastAccountId`) afin que la remise directe fonctionne quand même.
- La livraison de lachèvement conserve la route résolue du demandeur : les routes dachèvement liées au fil ou liées à la conversation lemportent lorsquelles sont disponibles ; si lorigine de lachèvement ne fournit quun canal, OpenClaw renseigne la cible/le compte manquant depuis la route résolue de la session du demandeur (`lastChannel` / `lastTo` / `lastAccountId`) afin que la livraison directe fonctionne encore.
</Accordion>
<Accordion title="Completion handoff metadata">
Le transfert dachèvement vers la session demanderesse est un contexte interne
généré à lexécution (et non un texte rédigé par lutilisateur) et inclut :
Le transfert dachèvement vers la session du demandeur est un contexte interne généré à lexécution
(pas un texte rédigé par lutilisateur) et inclut :
- `Result` — dernier texte visible de réponse `assistant`, sinon dernier texte assaini doutil/toolResult. Les exécutions terminales en échec ne réutilisent pas le texte de réponse capturé.
- `Result` — dernier texte de réponse `assistant` visible, sinon dernier texte tool/toolResult nettoyé. Les exécutions terminales échouées ne réutilisent pas le texte de réponse capturé.
- `Status``completed successfully` / `failed` / `timed out` / `unknown`.
- Statistiques compactes dexécution/tokens.
- Une instruction de remise demandant à lagent demandeur de reformuler avec une voix dassistant normale (sans transférer les métadonnées internes brutes).
- Une instruction de livraison indiquant à lagent demandeur de reformuler avec une voix dassistant normale (et non de transférer des métadonnées internes brutes).
</Accordion>
<Accordion title="Modes and ACP runtime">
- `--model` et `--thinking` remplacent les valeurs par défaut pour cette exécution précise.
- Utilisez `info`/`log` pour inspecter les détails et la sortie après lachèvement.
- `/subagents spawn` est un mode ponctuel (`mode: "run"`). Pour les sessions persistantes liées à un fil, utilisez `sessions_spawn` avec `thread: true` et `mode: "session"`.
- Pour les sessions de harnais ACP (Claude Code, Gemini CLI, OpenCode ou Codex ACP/acpx explicite), utilisez `sessions_spawn` avec `runtime: "acp"` lorsque loutil annonce cet environnement dexécution. Consultez le [modèle de remise ACP](/fr/tools/acp-agents#delivery-model) lors du débogage des achèvements ou des boucles agent-à-agent. Lorsque le Plugin `codex` est activé, le contrôle de chat/fil Codex doit préférer `/codex ...` à ACP, sauf si lutilisateur demande explicitement ACP/acpx.
- OpenClaw masque `runtime: "acp"` tant quACP nest pas activé, que le demandeur est sandboxé ou quun Plugin de backend tel que `acpx` nest pas chargé. `runtime: "acp"` attend un identifiant de harnais ACP externe, ou une entrée `agents.list[]` avec `runtime.type="acp"` ; utilisez lenvironnement dexécution de sous-agent par défaut pour les agents de configuration OpenClaw normaux provenant de `agents_list`.
- `/subagents spawn` est un mode à exécution unique (`mode: "run"`). Pour les sessions persistantes liées à un fil, utilisez `sessions_spawn` avec `thread: true` et `mode: "session"`.
- Pour les sessions de harnais ACP (Claude Code, Gemini CLI, OpenCode ou Codex ACP/acpx explicite), utilisez `sessions_spawn` avec `runtime: "acp"` lorsque loutil annonce ce runtime. Voir [Modèle de livraison ACP](/fr/tools/acp-agents#delivery-model) lors du débogage des achèvements ou des boucles agent-à-agent. Lorsque le Plugin `codex` est activé, le contrôle de discussion/fil Codex doit préférer `/codex ...` à ACP, sauf si lutilisateur demande explicitement ACP/acpx.
- OpenClaw masque `runtime: "acp"` jusquà ce quACP soit activé, que le demandeur ne soit pas sandboxé et quun Plugin backend tel que `acpx` soit chargé. `runtime: "acp"` attend un identifiant de harnais ACP externe, ou une entrée `agents.list[]` avec `runtime.type="acp"` ; utilisez le runtime de sous-agent par défaut pour les agents de configuration OpenClaw normaux issus de `agents_list`.
</Accordion>
</AccordionGroup>
## Modes de contexte
Les sous-agents natifs démarrent isolés, sauf si lappelant demande explicitement de dupliquer
la transcription courante.
Les sous-agents natifs démarrent isolés sauf si lappelant demande explicitement de dupliquer
la transcription actuelle.
| Mode | Quand lutiliser | Comportement |
| ---------- | --------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------- |
| `isolated` | Recherche nouvelle, implémentation indépendante, travail avec outil lent, ou tout ce qui peut être résumé dans le texte de la tâche | Crée une transcription enfant propre. Cest la valeur par défaut et elle réduit lutilisation des tokens. |
| `fork` | Travail qui dépend de la conversation courante, de résultats doutils précédents ou dinstructions nuancées déjà présentes dans la transcription du demandeur | Dérive la transcription du demandeur dans la session enfant avant le démarrage de lenfant. |
| Mode | Quand lutiliser | Comportement |
| ---------- | -------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------- |
| `isolated` | Recherche nouvelle, implémentation indépendante, travail doutil lent, ou tout ce qui peut être résumé dans le texte de la tâche | Crée une transcription enfant propre. Cest la valeur par défaut et cela réduit lutilisation de tokens. |
| `fork` | Travail qui dépend de la conversation actuelle, de résultats doutils antérieurs ou dinstructions nuancées déjà présentes dans la transcription du demandeur | Dérive la transcription du demandeur dans la session enfant avant le démarrage de lenfant. |
Utilisez `fork` avec parcimonie. Il est destiné à la délégation sensible au contexte, pas à
remplacer la rédaction dune invite de tâche claire.
Utilisez `fork` avec parcimonie. Il est destiné à la délégation sensible au contexte, et non à
remplacer une invite de tâche claire.
## Outil : `sessions_spawn`
Démarre une exécution de sous-agent avec `deliver: false` sur la voie globale `subagent`,
puis exécute une étape dannonce et publie la réponse dannonce dans le canal de
chat du demandeur.
puis exécute une étape dannonce et publie la réponse dannonce dans le canal de discussion
du demandeur.
La disponibilité dépend de la politique doutils effective de lappelant. Les profils `coding` et
`full` exposent `sessions_spawn` par défaut. Le profil `messaging`
ne le fait pas ; ajoutez `tools.alsoAllow: ["sessions_spawn", "sessions_yield",
"subagents"]` ou utilisez `tools.profile: "coding"` pour les agents qui doivent déléguer
du travail. Les politiques de canal/groupe, fournisseur, sandbox et autoriser/refuser par agent peuvent
du travail. Les politiques de canal/groupe, de fournisseur, de sandbox et les politiques allow/deny par agent peuvent
encore retirer loutil après létape de profil. Utilisez `/tools` depuis la même
session pour confirmer la liste effective des outils.
session pour confirmer la liste doutils effective.
**Valeurs par défaut :**
- **Modèle :** hérite de lappelant, sauf si vous définissez `agents.defaults.subagents.model` (ou `agents.list[].subagents.model` par agent) ; un `sessions_spawn.model` explicite lemporte toujours.
- **Thinking :** hérite de lappelant, sauf si vous définissez `agents.defaults.subagents.thinking` (ou `agents.list[].subagents.thinking` par agent) ; un `sessions_spawn.thinking` explicite lemporte toujours.
- **Délai dexécution :** si `sessions_spawn.runTimeoutSeconds` est omis, OpenClaw utilise `agents.defaults.subagents.runTimeoutSeconds` lorsquil est défini ; sinon, il se rabat sur `0` (aucun délai).
- **Modèle :** hérite de lappelant sauf si vous définissez `agents.defaults.subagents.model` (ou `agents.list[].subagents.model` par agent) ; un `sessions_spawn.model` explicite lemporte toujours.
- **Thinking :** hérite de lappelant sauf si vous définissez `agents.defaults.subagents.thinking` (ou `agents.list[].subagents.thinking` par agent) ; un `sessions_spawn.thinking` explicite lemporte toujours.
- **Délai dexécution :** si `sessions_spawn.runTimeoutSeconds` est omis, OpenClaw utilise `agents.defaults.subagents.runTimeoutSeconds` lorsquil est défini ; sinon, il se rabat sur `0` (pas de délai).
### Paramètres de loutil
@ -155,31 +155,31 @@ session pour confirmer la liste effective des outils.
La description de la tâche pour le sous-agent.
</ParamField>
<ParamField path="label" type="string">
Libellé lisible par lhumain facultatif.
Libellé facultatif lisible par lhumain.
</ParamField>
<ParamField path="agentId" type="string">
Lancer sous un autre identifiant dagent lorsque `subagents.allowAgents` lautorise.
</ParamField>
<ParamField path="runtime" type='"subagent" | "acp"' default="subagent">
`acp` est uniquement destiné aux harnais ACP externes (`claude`, `droid`, `gemini`, `opencode` ou Codex ACP/acpx explicitement demandé) et aux entrées `agents.list[]` dont `runtime.type` vaut `acp`.
`acp` est réservé aux harnais ACP externes (`claude`, `droid`, `gemini`, `opencode`, ou Codex ACP/acpx explicitement demandé) et aux entrées `agents.list[]` dont `runtime.type` vaut `acp`.
</ParamField>
<ParamField path="resumeSessionId" type="string">
ACP uniquement. Reprend une session de harnais ACP existante lorsque `runtime: "acp"` ; ignoré pour les lancements de sous-agents natifs.
ACP uniquement. Reprend une session de harnais ACP existante lorsque `runtime: "acp"` ; ignoré pour les lancements de sous-agent natifs.
</ParamField>
<ParamField path="streamTo" type='"parent"'>
ACP uniquement. Diffuse la sortie dexécution ACP vers la session parente lorsque `runtime: "acp"` ; à omettre pour les lancements de sous-agents natifs.
ACP uniquement. Diffuse la sortie dexécution ACP vers la session parente lorsque `runtime: "acp"` ; omettez pour les lancements de sous-agent natifs.
</ParamField>
<ParamField path="model" type="string">
Remplace le modèle du sous-agent. Les valeurs invalides sont ignorées et le sous-agent sexécute sur le modèle par défaut, avec un avertissement dans le résultat de loutil.
Remplace le modèle du sous-agent. Les valeurs non valides sont ignorées et le sous-agent sexécute sur le modèle par défaut avec un avertissement dans le résultat de loutil.
</ParamField>
<ParamField path="thinking" type="string">
Remplace le niveau de réflexion pour lexécution du sous-agent.
</ParamField>
<ParamField path="runTimeoutSeconds" type="number">
Par défaut, utilise `agents.defaults.subagents.runTimeoutSeconds` lorsquil est défini, sinon `0`. Lorsquil est défini, lexécution du sous-agent est interrompue après N secondes.
Vaut par défaut `agents.defaults.subagents.runTimeoutSeconds` lorsquil est défini, sinon `0`. Lorsquil est défini, lexécution du sous-agent est interrompue après N secondes.
</ParamField>
<ParamField path="thread" type="boolean" default="false">
Lorsque `true`, demande une liaison de fil de canal pour cette session de sous-agent.
Lorsque `true`, demande la liaison de fil de canal pour cette session de sous-agent.
</ParamField>
<ParamField path="mode" type='"run" | "session"' default="run">
Si `thread: true` et que `mode` est omis, la valeur par défaut devient `session`. `mode: "session"` nécessite `thread: true`.
@ -188,15 +188,15 @@ session pour confirmer la liste effective des outils.
`"delete"` archive immédiatement après lannonce (conserve tout de même la transcription via renommage).
</ParamField>
<ParamField path="sandbox" type='"inherit" | "require"' default="inherit">
`require` rejette le lancement sauf si lenvironnement dexécution enfant cible est sandboxé.
`require` rejette le lancement sauf si le runtime enfant cible est sandboxé.
</ParamField>
<ParamField path="context" type='"isolated" | "fork"' default="isolated">
`fork` dérive la transcription courante du demandeur dans la session enfant. Sous-agents natifs uniquement. Les lancements liés à un fil utilisent par défaut `fork` ; les lancements non liés à un fil utilisent par défaut `isolated`.
`fork` dérive la transcription actuelle du demandeur dans la session enfant. Sous-agents natifs uniquement. Les lancements liés à un fil utilisent par défaut `fork` ; les lancements non liés à un fil utilisent par défaut `isolated`.
</ParamField>
<Warning>
`sessions_spawn` naccepte **pas** les paramètres de remise par canal (`target`,
`channel`, `to`, `threadId`, `replyTo`, `transport`). Pour la remise, utilisez
`sessions_spawn` naccepte **pas** les paramètres de livraison par canal (`target`,
`channel`, `to`, `threadId`, `replyTo`, `transport`). Pour la livraison, utilisez
`message`/`sessions_send` depuis lexécution lancée.
</Warning>
@ -220,20 +220,20 @@ les sessions de sous-agent persistantes liées à un fil (`sessions_spawn` avec
### Flux rapide
<Steps>
<Step title="Spawn">
`sessions_spawn` avec `thread: true` (et facultativement `mode: "session"`).
<Step title="Créer">
`sessions_spawn` avec `thread: true` (et éventuellement `mode: "session"`).
</Step>
<Step title="Bind">
<Step title="Lier">
OpenClaw crée ou lie un fil à cette cible de session dans le canal actif.
</Step>
<Step title="Route follow-ups">
Les réponses et messages de suivi dans ce fil sont routés vers la session liée.
<Step title="Acheminer les suivis">
Les réponses et messages de suivi dans ce fil sont acheminés vers la session liée.
</Step>
<Step title="Inspect timeouts">
Utilisez `/session idle` pour inspecter/mettre à jour le défocus automatique en cas dinactivité et
<Step title="Inspecter les délais dexpiration">
Utilisez `/session idle` pour inspecter/mettre à jour le désancrage automatique après inactivité et
`/session max-age` pour contrôler la limite stricte.
</Step>
<Step title="Detach">
<Step title="Détacher">
Utilisez `/unfocus` pour détacher manuellement.
</Step>
</Steps>
@ -242,68 +242,68 @@ les sessions de sous-agent persistantes liées à un fil (`sessions_spawn` avec
| Commande | Effet |
| ------------------ | --------------------------------------------------------------------- |
| `/focus <target>` | Associe le fil actuel (ou en crée un) à une cible de sous-agent/session |
| `/unfocus` | Supprime lassociation pour le fil actuellement associé |
| `/agents` | Liste les exécutions actives et létat dassociation (`thread:<id>` ou `unbound`) |
| `/session idle` | Inspecte/met à jour la désactivation automatique de focus en cas dinactivité (fils associés avec focus uniquement) |
| `/session max-age` | Inspecte/met à jour la limite stricte (fils associés avec focus uniquement) |
| `/focus <target>` | Lie le fil actuel (ou en crée un) à une cible de sous-agent/session |
| `/unfocus` | Supprime la liaison du fil lié actuel |
| `/agents` | Liste les exécutions actives et létat de liaison (`thread:<id>` ou `unbound`) |
| `/session idle` | Inspecte/met à jour le désancrage automatique après inactivité (fils liés focalisés uniquement) |
| `/session max-age` | Inspecte/met à jour la limite stricte (fils liés focalisés uniquement) |
### Commutateurs de configuration
### Options de configuration
- **Valeur globale par défaut :** `session.threadBindings.enabled`, `session.threadBindings.idleHours`, `session.threadBindings.maxAgeHours`.
- Les **clés de remplacement par canal et dassociation automatique au spawn** sont propres à chaque adaptateur. Voir [Canaux prenant en charge les fils](#thread-supporting-channels) ci-dessus.
- **Valeur par défaut globale :** `session.threadBindings.enabled`, `session.threadBindings.idleHours`, `session.threadBindings.maxAgeHours`.
- **Les clés de remplacement par canal et de liaison automatique au spawn** sont propres à chaque adaptateur. Consultez [Canaux prenant en charge les fils](#thread-supporting-channels) ci-dessus.
Voir [Référence de configuration](/fr/gateway/configuration-reference) et
[Commandes slash](/fr/tools/slash-commands) pour les détails actuels des adaptateurs.
Consultez la [Référence de configuration](/fr/gateway/configuration-reference) et
les [commandes slash](/fr/tools/slash-commands) pour les détails actuels des adaptateurs.
### Liste dautorisation
<ParamField path="agents.list[].subagents.allowAgents" type="string[]">
Liste des ids dagents qui peuvent être ciblés via `agentId` explicite (`["*"]` autorise nimporte lequel). Par défaut : uniquement lagent demandeur. Si vous définissez une liste et souhaitez quand même que le demandeur puisse se lancer lui-même avec `agentId`, incluez lid du demandeur dans la liste.
Liste des ids dagents pouvant être ciblés via un `agentId` explicite (`["*"]` autorise nimporte lequel). Par défaut : uniquement lagent demandeur. Si vous définissez une liste et voulez toujours que le demandeur puisse se créer lui-même avec `agentId`, incluez lid du demandeur dans la liste.
</ParamField>
<ParamField path="agents.defaults.subagents.allowAgents" type="string[]">
Liste dautorisation dagents cibles par défaut utilisée lorsque lagent demandeur ne définit pas son propre `subagents.allowAgents`.
</ParamField>
<ParamField path="agents.defaults.subagents.requireAgentId" type="boolean" default="false">
Bloque les appels `sessions_spawn` qui omettent `agentId` (force la sélection explicite dun profil). Remplacement par agent : `agents.list[].subagents.requireAgentId`.
Bloque les appels `sessions_spawn` qui omettent `agentId` (force une sélection explicite de profil). Remplacement par agent : `agents.list[].subagents.requireAgentId`.
</ParamField>
Si la session demandeuse est sandboxée, `sessions_spawn` rejette les cibles
qui sexécuteraient sans sandbox.
qui sexécuteraient hors sandbox.
### Découverte
Utilisez `agents_list` pour voir quels ids dagents sont actuellement autorisés pour
`sessions_spawn`. La réponse inclut le modèle effectif de chaque agent listé
et les métadonnées de runtime intégrées afin que les appelants puissent distinguer PI, le serveur dapplication Codex
et les métadonnées dexécution intégrées afin que les appelants puissent distinguer PI, le serveur dapplication Codex
et les autres runtimes natifs configurés.
### Archivage automatique
- Les sessions de sous-agent sont automatiquement archivées après `agents.defaults.subagents.archiveAfterMinutes` (par défaut `60`).
- Les sessions de sous-agents sont automatiquement archivées après `agents.defaults.subagents.archiveAfterMinutes` (`60` par défaut).
- Larchivage utilise `sessions.delete` et renomme la transcription en `*.deleted.<timestamp>` (même dossier).
- `cleanup: "delete"` archive immédiatement après lannonce (conserve quand même la transcription via renommage).
- Larchivage automatique est fait au mieux ; les minuteurs en attente sont perdus si le Gateway redémarre.
- `cleanup: "delete"` archive immédiatement après lannonce (la transcription est tout de même conservée via renommage).
- Larchivage automatique est au mieux ; les minuteurs en attente sont perdus si le gateway redémarre.
- `runTimeoutSeconds` narchive **pas** automatiquement ; il arrête seulement lexécution. La session reste jusquà larchivage automatique.
- Larchivage automatique sapplique de la même façon aux sessions de profondeur 1 et de profondeur 2.
- Le nettoyage du navigateur est séparé du nettoyage darchivage : les onglets/processus de navigateur suivis sont fermés au mieux lorsque lexécution se termine, même si lenregistrement de transcription/session est conservé.
- Larchivage automatique sapplique de la même manière aux sessions de profondeur 1 et de profondeur 2.
- Le nettoyage du navigateur est distinct du nettoyage darchive : les onglets/processus de navigateur suivis sont fermés au mieux lorsque lexécution se termine, même si la transcription/lenregistrement de session est conservé.
## Sous-agents imbriqués
Par défaut, les sous-agents ne peuvent pas lancer leurs propres sous-agents
Par défaut, les sous-agents ne peuvent pas cer leurs propres sous-agents
(`maxSpawnDepth: 1`). Définissez `maxSpawnDepth: 2` pour activer un niveau
dimbrication — le **modèle orchestrateur** : principal → sous-agent orchestrateur →
sous-sous-agents workers.
sous-sous-agents travailleurs.
```json5
{
agents: {
defaults: {
subagents: {
maxSpawnDepth: 2, // allow sub-agents to spawn children (default: 1)
maxChildrenPerAgent: 5, // max active children per agent session (default: 5)
maxConcurrent: 8, // global concurrency lane cap (default: 8)
runTimeoutSeconds: 900, // default timeout for sessions_spawn when omitted (0 = no timeout)
maxSpawnDepth: 2, // autorise les sous-agents à créer des enfants (par défaut : 1)
maxChildrenPerAgent: 5, // nombre max denfants actifs par session dagent (par défaut : 5)
maxConcurrent: 8, // limite globale de voies de concurrence (par défaut : 8)
runTimeoutSeconds: 900, // délai dexpiration par défaut pour sessions_spawn quand il est omis (0 = aucun délai)
},
},
},
@ -312,31 +312,31 @@ sous-sous-agents workers.
### Niveaux de profondeur
| Profondeur | Forme de la clé de session | Rôle | Peut lancer ? |
| ----- | -------------------------------------------- | --------------------------------------------- | ---------------------------- |
| 0 | `agent:<id>:main` | Agent principal | Toujours |
| 1 | `agent:<id>:subagent:<uuid>` | Sous-agent (orchestrateur lorsque la profondeur 2 est autorisée) | Seulement si `maxSpawnDepth >= 2` |
| 2 | `agent:<id>:subagent:<uuid>:subagent:<uuid>` | Sous-sous-agent (worker feuille) | Jamais |
| Profondeur | Forme de la clé de session | Rôle | Peut cer ? |
| ---------- | -------------------------------------------- | --------------------------------------------- | ---------------------------- |
| 0 | `agent:<id>:main` | Agent principal | Toujours |
| 1 | `agent:<id>:subagent:<uuid>` | Sous-agent (orchestrateur quand la profondeur 2 est autorisée) | Uniquement si `maxSpawnDepth >= 2` |
| 2 | `agent:<id>:subagent:<uuid>:subagent:<uuid>` | Sous-sous-agent (travailleur feuille) | Jamais |
### Chaîne dannonce
Les résultats remontent la chaîne :
1. Le worker de profondeur 2 termine → annonce à son parent (orchestrateur de profondeur 1).
1. Le travailleur de profondeur 2 termine → annonce à son parent (orchestrateur de profondeur 1).
2. Lorchestrateur de profondeur 1 reçoit lannonce, synthétise les résultats, termine → annonce au principal.
3. Lagent principal reçoit lannonce et la livre à lutilisateur.
Chaque niveau ne voit que les annonces de ses enfants directs.
<Note>
**Conseil opérationnel :** démarrez le travail enfant une seule fois et attendez les événements
de fin au lieu de construire des boucles de sondage autour de `sessions_list`,
`sessions_history`, `/subagents list` ou des commandes de sommeil `exec`.
`sessions_list` et `/subagents list` maintiennent les relations de sessions enfant
centrées sur le travail actif — les enfants actifs restent attachés, les enfants terminés restent
visibles pendant une courte fenêtre récente, et les liens enfant périmés présents seulement dans le stockage sont
ignorés après leur fenêtre de fraîcheur. Cela empêche les anciennes métadonnées `spawnedBy` /
`parentSessionKey` de ressusciter des enfants fantômes après
**Consignes opérationnelles :** démarrez le travail enfant une seule fois et attendez les événements
de fin plutôt que de construire des boucles dinterrogation autour de `sessions_list`,
`sessions_history`, `/subagents list` ou de commandes `exec` avec sleep.
`sessions_list` et `/subagents list` gardent les relations de sessions enfants
centrées sur le travail en cours — les enfants actifs restent attachés, les enfants terminés restent
visibles pendant une courte fenêtre récente, et les liens enfants obsolètes uniquement stockés sont
ignorés après leur fenêtre de fraîcheur. Cela empêche danciennes métadonnées `spawnedBy` /
`parentSessionKey` de ressusciter des enfants fantômes après un
redémarrage. Si un événement de fin denfant arrive après que vous avez déjà envoyé la
réponse finale, le suivi correct est le jeton silencieux exact
`NO_REPLY` / `no_reply`.
@ -344,76 +344,77 @@ réponse finale, le suivi correct est le jeton silencieux exact
### Politique doutils par profondeur
- Le rôle et la portée de contrôle sont écrits dans les métadonnées de session au moment du spawn. Cela empêche les clés de session plates ou restaurées de récupérer accidentellement des privilèges dorchestrateur.
- **Profondeur 1 (orchestrateur, lorsque `maxSpawnDepth >= 2`) :** reçoit `sessions_spawn`, `subagents`, `sessions_list`, `sessions_history` afin de pouvoir gérer ses enfants. Les autres outils de session/système restent refusés.
- **Profondeur 1 (feuille, lorsque `maxSpawnDepth == 1`) :** aucun outil de session (comportement actuel par défaut).
- **Profondeur 2 (worker feuille) :** aucun outil de session — `sessions_spawn` est toujours refusé à la profondeur 2. Ne peut pas lancer dautres enfants.
- Le rôle et la portée de contrôle sont écrits dans les métadonnées de session au moment de la création. Cela empêche les clés de session plates ou restaurées de récupérer accidentellement des privilèges dorchestrateur.
- **Profondeur 1 (orchestrateur, quand `maxSpawnDepth >= 2`) :** reçoit `sessions_spawn`, `subagents`, `sessions_list`, `sessions_history` afin de pouvoir gérer ses enfants. Les autres outils de session/système restent refusés.
- **Profondeur 1 (feuille, quand `maxSpawnDepth == 1`) :** aucun outil de session (comportement actuel par défaut).
- **Profondeur 2 (travailleur feuille) :** aucun outil de session — `sessions_spawn` est toujours refusé à la profondeur 2. Ne peut pas cer dautres enfants.
### Limite de spawn par agent
### Limite de création par agent
Chaque session dagent (à nimporte quelle profondeur) peut avoir au plus `maxChildrenPerAgent`
(par défaut `5`) enfants actifs à la fois. Cela évite une démultiplication incontrôlée
(`5` par défaut) enfants actifs à la fois. Cela empêche un déploiement incontrôlé
depuis un seul orchestrateur.
### Arrêt en cascade
Arrêter un orchestrateur de profondeur 1 arrête automatiquement tous ses enfants de profondeur 2 :
Arrêter un orchestrateur de profondeur 1 arrête automatiquement tous ses enfants
de profondeur 2 :
- `/stop` dans le chat principal arrête tous les agents de profondeur 1 et cascade vers leurs enfants de profondeur 2.
- `/subagents kill <id>` arrête un sous-agent précis et cascade vers ses enfants.
- `/subagents kill all` arrête tous les sous-agents du demandeur et cascade.
- `/stop` dans le chat principal arrête tous les agents de profondeur 1 et se propage à leurs enfants de profondeur 2.
- `/subagents kill <id>` arrête un sous-agent précis et se propage à ses enfants.
- `/subagents kill all` arrête tous les sous-agents du demandeur et se propage.
## Authentification
Lauthentification des sous-agents est résolue par **id dagent**, pas par type de session :
Lauthentification des sous-agents est résolue par **id dagent**, et non par type de session :
- La clé de session du sous-agent est `agent:<agentId>:subagent:<uuid>`.
- Le magasin dauthentification est chargé depuis le `agentDir` de cet agent.
- Les profils dauthentification de lagent principal sont fusionnés comme **fallback** ; les profils dagent remplacent les profils principaux en cas de conflit.
- Le magasin dauthentification est chargé depuis l`agentDir` de cet agent.
- Les profils dauthentification de lagent principal sont fusionnés comme **repli** ; les profils dagent remplacent les profils principaux en cas de conflit.
La fusion est additive, donc les profils principaux sont toujours disponibles comme
fallbacks. Lauthentification entièrement isolée par agent nest pas encore prise en charge.
solutions de repli. Lauthentification entièrement isolée par agent nest pas encore prise en charge.
## Annonce
Les sous-agents rendent compte via une étape dannonce :
- Létape dannonce sexécute dans la session du sous-agent (pas dans la session du demandeur).
- Létape dannonce sexécute dans la session du sous-agent (pas dans la session demandeuse).
- Si le sous-agent répond exactement `ANNOUNCE_SKIP`, rien nest publié.
- Si le dernier texte assistant est le jeton silencieux exact `NO_REPLY` / `no_reply`, la sortie dannonce est supprimée même si une progression visible existait auparavant.
- Si le dernier texte assistant est le jeton silencieux exact `NO_REPLY` / `no_reply`, la sortie dannonce est supprimée même si une progression visible antérieure existait.
La livraison dépend de la profondeur du demandeur :
- Les sessions demandeuses de premier niveau utilisent un appel de suivi `agent` avec livraison externe (`deliver=true`).
- Les sessions de sous-agent demandeuses imbriquées reçoivent une injection de suivi interne (`deliver=false`) afin que lorchestrateur puisse synthétiser les résultats des enfants dans la session.
- Si une session de sous-agent demandeuse imbriquée a disparu, OpenClaw se rabat sur le demandeur de cette session lorsquil est disponible.
- Les sessions demandeuses de premier niveau utilisent un appel `agent` de suivi avec livraison externe (`deliver=true`).
- Les sessions de sous-agent demandeur imbriquées reçoivent une injection de suivi interne (`deliver=false`) afin que lorchestrateur puisse synthétiser les résultats enfants dans la session.
- Si une session de sous-agent demandeur imbriquée a disparu, OpenClaw revient au demandeur de cette session lorsquil est disponible.
Pour les sessions demandeuses de premier niveau, la livraison directe en mode achèvement
résout dabord toute route de conversation/fil associée et tout remplacement de hook, puis remplit
Pour les sessions demandeuses de premier niveau, la livraison directe en mode fin
résout dabord toute route de conversation/fil liée et tout remplacement de hook, puis remplit
les champs de cible de canal manquants depuis la route stockée de la session demandeuse.
Cela maintient les achèvements dans le bon chat/sujet même lorsque lorigine
de lachèvement identifie seulement le canal.
Cela garde les fins sur le bon chat/sujet même lorsque lorigine de la fin
nidentifie que le canal.
Lagrégation des achèvements denfants est limitée à lexécution demandeuse actuelle lors de
la construction des résultats dachèvement imbriqués, empêchant les sorties denfants
dexécutions précédentes obsolètes de fuiter dans lannonce actuelle. Les réponses dannonce préservent
Lagrégation des fins denfants est limitée à lexécution demandeuse actuelle lors de
la construction des résultats de fin imbriqués, empêchant les sorties denfants
dexécutions antérieures obsolètes de fuir dans lannonce actuelle. Les réponses dannonce préservent
le routage de fil/sujet lorsquil est disponible sur les adaptateurs de canal.
### Contexte dannonce
Le contexte dannonce est normalisé en un bloc dévénement interne stable :
| Champ | Source |
| -------------- | ------------------------------------------------------------------------------------------------------------- |
| Source | `subagent` ou `cron` |
| Ids de session | Clé/id de session enfant |
| Type | Type dannonce + libellé de tâche |
| Statut | Dérivé du résultat du runtime (`success`, `error`, `timeout` ou `unknown`) — **non** déduit du texte du modèle |
| Contenu du résultat | Dernier texte assistant visible, sinon dernier texte doutil/toolResult assaini |
| Suivi | Instruction décrivant quand répondre ou rester silencieux |
| Champ | Source |
| --------------- | ------------------------------------------------------------------------------------------------------------- |
| Source | `subagent` ou `cron` |
| Ids de session | Clé/id de session enfant |
| Type | Type dannonce + libellé de tâche |
| Statut | Dérivé du résultat dexécution (`success`, `error`, `timeout` ou `unknown`) — **pas** déduit du texte du modèle |
| Contenu du résultat | Dernier texte assistant visible, sinon dernier texte tool/toolResult assaini |
| Suivi | Instruction décrivant quand répondre ou rester silencieux |
Les exécutions terminales échouées signalent un statut déchec sans rejouer le texte
de réponse capturé. En cas de timeout, si lenfant na atteint que des appels doutils, lannonce
Les exécutions terminales échouées signalent un statut déchec sans rejouer le
texte de réponse capturé. En cas de délai expiré, si lenfant na progressé que jusquaux appels doutils, lannonce
peut condenser cet historique en un bref résumé de progression partielle au lieu
de rejouer la sortie brute des outils.
@ -421,8 +422,8 @@ de rejouer la sortie brute des outils.
Les charges utiles dannonce incluent une ligne de statistiques à la fin (même lorsquelles sont enveloppées) :
- Runtime (par exemple `runtime 5m12s`).
- Utilisation de tokens (entrée/sortie/total).
- Durée dexécution (par ex. `runtime 5m12s`).
- Utilisation des tokens (entrée/sortie/total).
- Coût estimé lorsque la tarification du modèle est configurée (`models.providers.*.models[].cost`).
- `sessionKey`, `sessionId` et chemin de transcription afin que lagent principal puisse récupérer lhistorique via `sessions_history` ou inspecter le fichier sur disque.
@ -433,34 +434,28 @@ doivent être réécrites avec une voix dassistant normale.
`sessions_history` est le chemin dorchestration le plus sûr :
- Le rappel assistant est dabord normalisé : balises de réflexion supprimées ; échafaudage `<relevant-memories>` / `<relevant_memories>` supprimé ; blocs de charge utile XML dappel doutil en texte brut (`<tool_call>`, `<function_call>`, `<tool_calls>`, `<function_calls>`) supprimés, y compris les charges utiles tronquées qui ne se ferment jamais proprement ; échafaudage dappel/résultat doutil rétrogradé et marqueurs de contexte historique supprimés ; tokens de contrôle de modèle divulgués (`<|assistant|>`, autres `<|...|>` ASCII, `<...>` pleine chasse) supprimés ; XML dappel doutil MiniMax mal formé supprimé.
- Le rappel assistant est dabord normalisé : balises de pensée supprimées ; échafaudages `<relevant-memories>` / `<relevant_memories>` supprimés ; blocs de charge utile XML dappels doutils en texte brut (`<tool_call>`, `<function_call>`, `<tool_calls>`, `<function_calls>`) supprimés, y compris les charges utiles tronquées qui ne se ferment jamais proprement ; échafaudages dappel/résultat doutil rétrogradés et marqueurs de contexte historique supprimés ; tokens de contrôle du modèle divulgués (`<|assistant|>`, autres ASCII `<|...|>`, pleine chasse `<...>`) supprimés ; XML dappel doutil MiniMax mal formé supprimé.
- Le texte ressemblant à des identifiants/tokens est expurgé.
- Les longs blocs peuvent être tronqués.
- Les très grands historiques peuvent supprimer les lignes plus anciennes ou remplacer une ligne surdimensionnée par `[sessions_history omitted: message too large]`.
- Linspection brute de la transcription sur disque est le fallback lorsque vous avez besoin de la transcription complète octet pour octet.
- Les très grands historiques peuvent supprimer les lignes plus anciennes ou remplacer une ligne trop volumineuse par `[sessions_history omitted: message too large]`.
- Linspection de la transcription brute sur disque est le repli lorsque vous avez besoin de la transcription complète octet pour octet.
## Politique doutils
Les sous-agents utilisent dabord le même profil et le même pipeline de politique doutils que le parent ou
lagent cible. Ensuite, OpenClaw applique la couche de restriction
des sous-agents.
Les sous-agents utilisent dabord le même profil et le même pipeline de politique des outils que lagent parent ou cible. Ensuite, OpenClaw applique la couche de restriction des sous-agents.
Sans `tools.profile` restrictif, les sous-agents reçoivent **tous les outils sauf
les outils de session** et les outils système :
Sans `tools.profile` restrictif, les sous-agents reçoivent **tous les outils sauf les outils de session** et les outils système :
- `sessions_list`
- `sessions_history`
- `sessions_send`
- `sessions_spawn`
`sessions_history` reste ici aussi une vue de rappel bornée et assainie — ce
nest pas un dump brut de transcription.
`sessions_history` reste ici aussi une vue de rappel bornée et assainie — ce nest pas un vidage brut de transcription.
Lorsque `maxSpawnDepth >= 2`, les sous-agents orchestrateurs de profondeur 1
reçoivent en plus `sessions_spawn`, `subagents`, `sessions_list` et
`sessions_history` afin de pouvoir gérer leurs enfants.
Quand `maxSpawnDepth >= 2`, les sous-agents orchestrateurs de profondeur 1 reçoivent en plus `sessions_spawn`, `subagents`, `sessions_list` et `sessions_history` afin de pouvoir gérer leurs enfants.
### Remplacement via la configuration
### Remplacer via la configuration
```json5
{
@ -484,12 +479,7 @@ reçoivent en plus `sessions_spawn`, `subagents`, `sessions_list` et
}
```
`tools.subagents.tools.allow` est un filtre final qui nautorise que ce qui est explicitement permis. Il peut restreindre
lensemble doutils déjà résolu, mais il ne peut pas **rajouter** un outil supprimé
par `tools.profile`. Par exemple, `tools.profile: "coding"` inclut
`web_search`/`web_fetch`, mais pas loutil `browser`. Pour permettre aux
sous-agents de profil coding dutiliser lautomatisation de navigateur, ajoutez browser à
létape du profil :
`tools.subagents.tools.allow` est un filtre final dautorisation seule. Il peut restreindre lensemble doutils déjà résolu, mais il ne peut pas **rajouter** un outil supprimé par `tools.profile`. Par exemple, `tools.profile: "coding"` inclut `web_search`/`web_fetch`, mais pas loutil `browser`. Pour permettre aux sous-agents avec le profil coding dutiliser lautomatisation de navigateur, ajoutez browser à létape du profil :
```json5
{
@ -500,65 +490,44 @@ létape du profil :
}
```
Utilisez `agents.list[].tools.alsoAllow: ["browser"]` par agent lorsque seul un
agent doit obtenir lautomatisation de navigateur.
Utilisez `agents.list[].tools.alsoAllow: ["browser"]` par agent lorsque seul un agent doit recevoir lautomatisation de navigateur.
## Concurrence
Les sous-agents utilisent une voie de file dattente dédiée dans le processus :
Les sous-agents utilisent une file dédiée en cours de processus :
- **Nom de la voie :** `subagent`
- **Concurrence :** `agents.defaults.subagents.maxConcurrent` (par défaut `8`)
## Vivacité et récupération
OpenClaw ne considère pas labsence de `endedAt` comme une preuve permanente quun
sous-agent est encore actif. Les exécutions non terminées plus anciennes que la fenêtre dexécution obsolète
cessent dêtre comptées comme actives/en attente dans `/subagents list`, les résumés de statut,
les contrôles de fin des descendants et les vérifications de concurrence par session.
OpenClaw ne considère pas labsence de `endedAt` comme une preuve permanente quun sous-agent est encore actif. Les exécutions non terminées plus anciennes que la fenêtre dexécution obsolète cessent dêtre comptabilisées comme actives/en attente dans `/subagents list`, les résumés détat, le contrôle de terminaison des descendants et les vérifications de concurrence par session.
Après un redémarrage du Gateway, les exécutions restaurées non terminées et obsolètes sont élaguées sauf si
leur session enfant est marquée `abortedLastRun: true`. Ces
sessions enfants interrompues par redémarrage restent récupérables via le flux de récupération dorphelin
de sous-agent, qui envoie un message synthétique de reprise avant
deffacer le marqueur dinterruption.
Après un redémarrage du Gateway, les exécutions restaurées non terminées et obsolètes sont élaguées, sauf si leur session enfant est marquée `abortedLastRun: true`. Ces sessions enfants interrompues par le redémarrage restent récupérables via le flux de récupération des sous-agents orphelins, qui envoie un message synthétique de reprise avant deffacer le marqueur dinterruption.
La récupération automatique après redémarrage est limitée par session enfant. Si le même
enfant de sous-agent est accepté à plusieurs reprises pour une récupération dorphelin dans la
fenêtre de reblocage rapide, OpenClaw persiste une pierre tombale de récupération sur cette
session et cesse de la reprendre automatiquement lors des redémarrages ultérieurs. Exécutez
`openclaw tasks maintenance --apply` pour réconcilier lenregistrement de tâche, ou
`openclaw doctor --fix` pour effacer les indicateurs de récupération interrompue obsolètes sur les
sessions avec pierre tombale.
La récupération automatique au redémarrage est bornée par session enfant. Si le même enfant de sous-agent est accepté plusieurs fois pour une récupération dorphelin dans la fenêtre de reblocage rapide, OpenClaw conserve une pierre tombale de récupération sur cette session et cesse de la reprendre automatiquement lors des redémarrages suivants. Exécutez `openclaw tasks maintenance --apply` pour réconcilier lenregistrement de tâche, ou `openclaw doctor --fix` pour effacer les indicateurs de récupération interrompue obsolètes sur les sessions avec pierre tombale.
<Note>
Si la création dun sous-agent échoue avec Gateway `PAIRING_REQUIRED` /
`scope-upgrade`, vérifiez lappelant RPC avant de modifier létat dassociation.
La coordination interne `sessions_spawn` doit se connecter en tant que
`client.id: "gateway-client"` avec `client.mode: "backend"` via une authentification directe
loopback par jeton partagé/mot de passe ; ce chemin ne dépend pas de la
base de portée des appareils associés de la CLI. Les appelants distants, les
`deviceIdentity` explicites, les chemins explicites par jeton dappareil et les clients
navigateur/node nécessitent toujours lapprobation normale de lappareil pour les mises à niveau de portée.
Si la création dun sous-agent échoue avec Gateway `PAIRING_REQUIRED` / `scope-upgrade`, vérifiez lappelant RPC avant de modifier létat dappairage. La coordination interne `sessions_spawn` doit se connecter comme `client.id: "gateway-client"` avec `client.mode: "backend"` sur une authentification directe par jeton partagé/mot de passe en local loopback ; ce chemin ne dépend pas de la base de portée dappareil appairé de la CLI. Les appelants distants, `deviceIdentity` explicite, les chemins explicites par jeton dappareil et les clients navigateur/node nécessitent toujours lapprobation normale de lappareil pour les montées de portée.
</Note>
## Arrêt
- Lenvoi de `/stop` dans la discussion du demandeur interrompt la session du demandeur et arrête toutes les exécutions de sous-agent actives créées depuis celle-ci, avec propagation aux enfants imbriqués.
- `/subagents kill <id>` arrête un sous-agent précis et propage larrêt à ses enfants.
- Envoyer `/stop` dans la discussion du demandeur interrompt la session du demandeur et arrête toutes les exécutions de sous-agents actives lancées depuis celle-ci, en cascade vers les enfants imbriqués.
- `/subagents kill <id>` arrête un sous-agent spécifique et se répercute en cascade sur ses enfants.
## Limites
## Limitations
- Lannonce du sous-agent est fournie **au mieux**. Si le Gateway redémarre, le travail « announce back » en attente est perdu.
- Les sous-agents partagent toujours les mêmes ressources du processus Gateway ; considérez `maxConcurrent` comme une soupape de sécurité.
- Lannonce des sous-agents est **best-effort**. Si le gateway redémarre, le travail en attente de « retour dannonce » est perdu.
- Les sous-agents partagent toujours les mêmes ressources du processus gateway ; considérez `maxConcurrent` comme une soupape de sécurité.
- `sessions_spawn` est toujours non bloquant : il renvoie `{ status: "accepted", runId, childSessionKey }` immédiatement.
- Le contexte de sous-agent injecte uniquement `AGENTS.md` + `TOOLS.md` (pas de `SOUL.md`, `IDENTITY.md`, `USER.md`, `HEARTBEAT.md` ni `BOOTSTRAP.md`).
- Le contexte des sous-agents injecte uniquement `AGENTS.md` + `TOOLS.md` (pas de `SOUL.md`, `IDENTITY.md`, `USER.md`, `HEARTBEAT.md` ni `BOOTSTRAP.md`).
- La profondeur maximale dimbrication est de 5 (plage de `maxSpawnDepth` : 15). La profondeur 2 est recommandée pour la plupart des cas dutilisation.
- `maxChildrenPerAgent` limite le nombre denfants actifs par session (par défaut `5`, plage `120`).
- `maxChildrenPerAgent` plafonne les enfants actifs par session (par défaut `5`, plage `120`).
## Connexe
- [Agents ACP](/fr/tools/acp-agents)
- [Envoi à lagent](/fr/tools/agent-send)
- [Tâches en arrière-plan](/fr/automation/tasks)
- [Outils de bac à sable multi-agent](/fr/tools/multi-agent-sandbox-tools)
- [Outils de sandbox multi-agent](/fr/tools/multi-agent-sandbox-tools)

View File

@ -1,23 +1,23 @@
---
read_when:
- Vous souhaitez gérer le Gateway depuis un navigateur
- Vous souhaitez accéder au Tailnet sans tunnels SSH
- Vous souhaitez utiliser le Gateway depuis un navigateur
- Vous voulez accéder au Tailnet sans tunnels SSH
sidebarTitle: Control UI
summary: Interface utilisateur de contrôle basée sur le navigateur pour le Gateway (chat, nœuds, configuration)
summary: Interface de contrôle basée sur navigateur pour le Gateway (discussion, nœuds, configuration)
title: Interface de contrôle
x-i18n:
generated_at: "2026-05-04T02:27:24Z"
generated_at: "2026-05-04T07:06:32Z"
model: gpt-5.5
provider: openai
source_hash: c890d83da2c296b600e4b5a00a538f37e6bd54da31fbe62113ecd6177b15626e
source_hash: 07fbbe1c7fec5f67a04a231e02bdf0f7d16be9c5fe188915674d71fcd69002a5
source_path: web/control-ui.md
workflow: 16
---
Linterface de contrôle est une petite application monopage **Vite + Lit** servie par le Gateway :
La Control UI est une petite application monopage **Vite + Lit** servie par le Gateway :
- par défaut : `http://<host>:18789/`
- préfixe facultatif : définissez `gateway.controlUi.basePath` (par ex. `/openclaw`)
- préfixe facultatif : définissez `gateway.controlUi.basePath` (p. ex. `/openclaw`)
Elle communique **directement avec le WebSocket du Gateway** sur le même port.
@ -29,20 +29,20 @@ Si le Gateway sexécute sur le même ordinateur, ouvrez :
Si la page ne se charge pas, démarrez dabord le Gateway : `openclaw gateway`.
Lauthentification est fournie pendant létablissement de la connexion WebSocket via :
Lauthentification est fournie pendant la négociation WebSocket via :
- `connect.params.auth.token`
- `connect.params.auth.password`
- les en-têtes didentité Tailscale Serve lorsque `gateway.auth.allowTailscale: true`
- les en-têtes didentité de proxy de confiance lorsque `gateway.auth.mode: "trusted-proxy"`
Le panneau des paramètres du tableau de bord conserve un jeton pour la session de longlet de navigateur actuel et lURL du Gateway sélectionnée ; les mots de passe ne sont pas persistés. Lonboarding génère généralement un jeton de Gateway pour lauthentification par secret partagé lors de la première connexion, mais lauthentification par mot de passe fonctionne aussi lorsque `gateway.auth.mode` vaut `"password"`.
Le panneau de paramètres du tableau de bord conserve un jeton pour la session de longlet de navigateur actuel et lURL de Gateway sélectionnée ; les mots de passe ne sont pas persistés. Lintégration génère généralement un jeton de Gateway pour lauthentification par secret partagé lors de la première connexion, mais lauthentification par mot de passe fonctionne aussi lorsque `gateway.auth.mode` vaut `"password"`.
## Appairage dappareil (première connexion)
Lorsque vous vous connectez à linterface de contrôle depuis un nouveau navigateur ou appareil, le Gateway exige généralement une **approbation dappairage unique**. Il sagit dune mesure de sécurité destinée à empêcher tout accès non autorisé.
Lorsque vous vous connectez à la Control UI depuis un nouveau navigateur ou appareil, le Gateway exige généralement une **approbation dappairage unique**. Il sagit dune mesure de sécurité destinée à empêcher les accès non autorisés.
**Ce que vous verrez :** « déconnecté (1008) : appairage requis »
**Ce que vous verrez :** « disconnected (1008): pairing required »
<Steps>
<Step title="Lister les demandes en attente">
@ -57,15 +57,15 @@ Lorsque vous vous connectez à linterface de contrôle depuis un nouveau navi
</Step>
</Steps>
Si le navigateur réessaie lappairage avec des détails dauthentification modifiés (rôle/portées/clé publique), la demande en attente précédente est remplacée et un nouveau `requestId` est créé. Relancez `openclaw devices list` avant lapprobation.
Si le navigateur retente lappairage avec des détails dauthentification modifiés (rôle/portées/clé publique), la demande en attente précédente est remplacée et un nouveau `requestId` est créé. Réexécutez `openclaw devices list` avant lapprobation.
Si le navigateur est déjà appairé et que vous le faites passer dun accès en lecture à un accès en écriture/admin, cela est traité comme une mise à niveau dapprobation, et non comme une reconnexion silencieuse. OpenClaw conserve lancienne approbation active, bloque la reconnexion plus large et vous demande dapprouver explicitement le nouvel ensemble de portées.
Si le navigateur est déjà appairé et que vous le faites passer dun accès en lecture à un accès en écriture/administration, cela est traité comme une mise à niveau dapprobation, et non comme une reconnexion silencieuse. OpenClaw conserve lancienne approbation active, bloque la reconnexion plus étendue et vous demande dapprouver explicitement le nouvel ensemble de portées.
Une fois approuvé, lappareil est mémorisé et ne nécessitera pas de nouvelle approbation, sauf si vous le révoquez avec `openclaw devices revoke --device <id> --role <role>`. Consultez [CLI des appareils](/fr/cli/devices) pour la rotation et la révocation des jetons.
Une fois approuvé, lappareil est mémorisé et ne demandera plus de nouvelle approbation, sauf si vous le révoquez avec `openclaw devices revoke --device <id> --role <role>`. Consultez [CLI des appareils](/fr/cli/devices) pour la rotation et la révocation des jetons.
<Note>
- Les connexions de navigateur directes en local loopback (`127.0.0.1` / `localhost`) sont approuvées automatiquement.
- Tailscale Serve peut éviter laller-retour dappairage pour les sessions dopérateur de linterface de contrôle lorsque `gateway.auth.allowTailscale: true`, que lidentité Tailscale est vérifiée et que le navigateur présente son identité dappareil.
- Les connexions directes de navigateur en local loopback (`127.0.0.1` / `localhost`) sont approuvées automatiquement.
- Tailscale Serve peut ignorer laller-retour dappairage pour les sessions opérateur de la Control UI lorsque `gateway.auth.allowTailscale: true`, que lidentité Tailscale est vérifiée et que le navigateur présente son identité dappareil.
- Les liaisons Tailnet directes, les connexions de navigateur sur le LAN et les profils de navigateur sans identité dappareil nécessitent toujours une approbation explicite.
- Chaque profil de navigateur génère un ID dappareil unique ; changer de navigateur ou effacer les données du navigateur nécessitera donc un nouvel appairage.
@ -73,144 +73,144 @@ Une fois approuvé, lappareil est mémorisé et ne nécessitera pas de nouvel
## Identité personnelle (locale au navigateur)
Linterface de contrôle prend en charge une identité personnelle propre à chaque navigateur (nom daffichage et avatar), attachée aux messages sortants pour lattribution dans les sessions partagées. Elle réside dans le stockage du navigateur, est limitée au profil de navigateur actuel et nest pas synchronisée avec dautres appareils ni persistée côté serveur au-delà des métadonnées normales dauteur de transcription sur les messages que vous envoyez réellement. Effacer les données du site ou changer de navigateur la réinitialise à vide.
La Control UI prend en charge une identité personnelle par navigateur (nom daffichage et avatar) attachée aux messages sortants pour lattribution dans les sessions partagées. Elle réside dans le stockage du navigateur, est limitée au profil de navigateur actuel et nest pas synchronisée avec dautres appareils ni persistée côté serveur au-delà des métadonnées normales dauteur de transcript sur les messages que vous envoyez réellement. Effacer les données du site ou changer de navigateur la réinitialise à une valeur vide.
Le même modèle local au navigateur sapplique au remplacement de lavatar de lassistant. Les avatars dassistant téléversés superposent lidentité résolue par le Gateway uniquement dans le navigateur local et ne transitent jamais via `config.patch`. Le champ de configuration partagé `ui.assistant.avatar` reste disponible pour les clients non-UI qui écrivent directement dans ce champ (comme des gateways scriptés ou des tableaux de bord personnalisés).
Le même modèle local au navigateur sapplique au remplacement de lavatar de lassistant. Les avatars dassistant téléversés superposent lidentité résolue par le Gateway dans le navigateur local uniquement et ne font jamais daller-retour via `config.patch`. Le champ de configuration partagé `ui.assistant.avatar` reste disponible pour les clients non-UI qui écrivent directement dans ce champ (comme les gateways scriptés ou les tableaux de bord personnalisés).
## Point de terminaison de configuration dexécution
Linterface de contrôle récupère ses paramètres dexécution depuis `/__openclaw/control-ui-config.json`. Ce point de terminaison est protégé par la même authentification de Gateway que le reste de la surface HTTP : les navigateurs non authentifiés ne peuvent pas le récupérer, et une récupération réussie nécessite soit un jeton/mot de passe de Gateway déjà valide, soit une identité Tailscale Serve, soit une identité de proxy de confiance.
La Control UI récupère ses paramètres dexécution depuis `/__openclaw/control-ui-config.json`. Ce point de terminaison est protégé par la même authentification de Gateway que le reste de la surface HTTP : les navigateurs non authentifiés ne peuvent pas le récupérer, et une récupération réussie nécessite soit un jeton/mot de passe de Gateway déjà valide, soit une identité Tailscale Serve, soit une identité de proxy de confiance.
## Prise en charge des langues
Linterface de contrôle peut se localiser au premier chargement en fonction de la locale de votre navigateur. Pour la remplacer plus tard, ouvrez **Vue densemble -> Accès au Gateway -> Langue**. Le sélecteur de locale se trouve dans la carte Accès au Gateway, pas sous Apparence.
La Control UI peut se localiser au premier chargement selon la locale de votre navigateur. Pour la remplacer plus tard, ouvrez **Vue densemble -> Accès au Gateway -> Langue**. Le sélecteur de locale se trouve dans la carte Accès au Gateway, pas sous Apparence.
- Locales prises en charge : `en`, `zh-CN`, `zh-TW`, `pt-BR`, `de`, `es`, `ja-JP`, `ko`, `fr`, `ar`, `it`, `tr`, `uk`, `id`, `pl`, `th`, `vi`, `nl`, `fa`
- Les traductions non anglaises sont chargées paresseusement dans le navigateur.
- La locale sélectionnée est enregistrée dans le stockage du navigateur et réutilisée lors des visites futures.
- Les clés de traduction manquantes se replient sur langlais.
- Les clés de traduction manquantes se rabattent sur langlais.
Les traductions de la documentation sont générées pour le même ensemble de locales non anglaises, mais le sélecteur de langue Mintlify intégré au site de documentation est limité aux codes de locale acceptés par Mintlify. Les documentations thaïes (`th`) et persanes (`fa`) sont toujours générées dans le dépôt de publication ; elles peuvent ne pas apparaître dans ce sélecteur tant que Mintlify ne prend pas en charge ces codes.
Les traductions de la documentation sont générées pour le même ensemble de locales non anglaises, mais le sélecteur de langue Mintlify intégré au site de documentation est limité aux codes de locale acceptés par Mintlify. Les docs en thaï (`th`) et en persan (`fa`) sont quand même générées dans le dépôt de publication ; elles peuvent ne pas apparaître dans ce sélecteur tant que Mintlify ne prend pas en charge ces codes.
## Thèmes dapparence
Le panneau Apparence conserve les thèmes intégrés Claw, Knot et Dash, ainsi quun emplacement dimport tweakcn local au navigateur. Pour importer un thème, ouvrez [thèmes tweakcn](https://tweakcn.com/themes), choisissez ou créez un thème, cliquez sur **Partager**, puis collez le lien de thème copié dans Apparence. Limportateur accepte aussi les URL de registre `https://tweakcn.com/r/themes/<id>`, les URL déditeur comme `https://tweakcn.com/editor/theme?theme=amethyst-haze`, les chemins relatifs `/themes/<id>`, les ID de thème bruts et les noms de thème par défaut tels que `amethyst-haze`.
Le panneau Apparence conserve les thèmes intégrés Claw, Knot et Dash, ainsi quun emplacement dimport tweakcn local au navigateur. Pour importer un thème, ouvrez [léditeur tweakcn](https://tweakcn.com/editor/theme), choisissez ou créez un thème, cliquez sur **Partager**, puis collez le lien de thème copié dans Apparence. Limportateur accepte aussi les URL de registre `https://tweakcn.com/r/themes/<id>`, les URL déditeur comme `https://tweakcn.com/editor/theme?theme=amethyst-haze`, les chemins relatifs `/themes/<id>`, les ID de thème bruts et les noms de thème par défaut comme `amethyst-haze`.
Les thèmes importés sont stockés uniquement dans le profil de navigateur actuel. Ils ne sont pas écrits dans la configuration du Gateway et ne se synchronisent pas entre appareils. Remplacer le thème importé met à jour lunique emplacement local ; leffacer fait revenir le thème actif à Claw si le thème importé était sélectionné.
## Ce quelle peut faire (aujourdhui)
<AccordionGroup>
<Accordion title="Discussion et parole">
- Discutez avec le modèle via Gateway WS (`chat.history`, `chat.send`, `chat.abort`, `chat.inject`).
- Parlez via des sessions temps réel du navigateur. OpenAI utilise WebRTC direct, Google Live utilise un jeton de navigateur contraint à usage unique sur WebSocket, et les plugins vocaux temps réel uniquement côté backend utilisent le transport relais du Gateway. Le relais conserve les identifiants du fournisseur sur le Gateway pendant que le navigateur diffuse le PCM du microphone via les RPC `talk.realtime.relay*` et renvoie les appels doutil `openclaw_agent_consult` via `chat.send` pour le modèle OpenClaw configuré plus grand.
- Diffusez les appels doutil + les cartes de sortie doutil en direct dans la discussion (événements dagent).
<Accordion title="Chat et conversation vocale">
- Discuter avec le modèle via le WS du Gateway (`chat.history`, `chat.send`, `chat.abort`, `chat.inject`).
- Parler via des sessions temps réel dans le navigateur. OpenAI utilise WebRTC direct, Google Live utilise un jeton de navigateur contraint à usage unique sur WebSocket, et les plugins de voix temps réel côté backend uniquement utilisent le transport de relais du Gateway. Le relais conserve les identifiants de fournisseur sur le Gateway pendant que le navigateur diffuse le PCM du microphone via les RPC `talk.realtime.relay*` et renvoie les appels doutil `openclaw_agent_consult` via `chat.send` pour le plus grand modèle OpenClaw configuré.
- Diffuser les appels doutil + les cartes de sortie doutil en direct dans Chat (événements dagent).
</Accordion>
<Accordion title="Canaux, instances, sessions, rêves">
- Canaux : état des canaux intégrés ainsi que des canaux de plugins groupés/externes, connexion par QR et configuration par canal (`channels.status`, `web.login.*`, `config.patch`).
- Canaux : statut des canaux intégrés et des canaux de plugins groupés/externes, connexion par QR code et configuration par canal (`channels.status`, `web.login.*`, `config.patch`).
- Instances : liste de présence + actualisation (`system-presence`).
- Sessions : liste + remplacements par session du modèle/de la réflexion/du mode rapide/du mode verbeux/de la trace/du raisonnement (`sessions.list`, `sessions.patch`).
- Rêves : état du Dreaming, bascule dactivation/désactivation et lecteur du journal des rêves (`doctor.memory.status`, `doctor.memory.dreamDiary`, `config.patch`).
- Sessions : liste + remplacements par session pour le modèle/la réflexion/le mode rapide/le mode verbeux/la trace/le raisonnement (`sessions.list`, `sessions.patch`).
- Rêves : statut de Dreaming, bascule dactivation/désactivation et lecteur du journal des rêves (`doctor.memory.status`, `doctor.memory.dreamDiary`, `config.patch`).
</Accordion>
<Accordion title="Cron, skills, nœuds, approbations dexécution">
<Accordion title="Cron, Skills, Nodes, approbations exec">
- Tâches Cron : lister/ajouter/modifier/exécuter/activer/désactiver + historique dexécution (`cron.*`).
- Skills : état, activer/désactiver, installer, mises à jour de clé API (`skills.*`).
- Nœuds : liste + capacités (`node.list`).
- Approbations dexécution : modifiez les listes dautorisation du Gateway ou des nœuds + la politique de demande pour `exec host=gateway/node` (`exec.approvals.*`).
- Skills : statut, activation/désactivation, installation, mises à jour de clé API (`skills.*`).
- Nodes : liste + capacités (`node.list`).
- Approbations exec : modifier les listes dautorisation du Gateway ou des Nodes + politique de demande pour `exec host=gateway/node` (`exec.approvals.*`).
</Accordion>
<Accordion title="Configuration">
- Affichez/modifiez `~/.openclaw/openclaw.json` (`config.get`, `config.set`).
- Appliquez + redémarrez avec validation (`config.apply`) et réveillez la dernière session active.
- Afficher/modifier `~/.openclaw/openclaw.json` (`config.get`, `config.set`).
- Appliquer + redémarrer avec validation (`config.apply`) et réveiller la dernière session active.
- Les écritures incluent une garde par hachage de base pour éviter décraser des modifications concurrentes.
- Les écritures (`config.set`/`config.apply`/`config.patch`) effectuent une vérification préalable de résolution des SecretRef actifs pour les références présentes dans la charge utile de configuration soumise ; les références soumises actives non résolues sont rejetées avant écriture.
- Schéma + rendu de formulaire (`config.schema` / `config.schema.lookup`, y compris les champs `title` / `description`, les indications dinterface correspondantes, les résumés des enfants immédiats, les métadonnées de documentation sur les nœuds imbriqués objet/joker/tableau/composition, ainsi que les schémas de Plugin + canal lorsquils sont disponibles) ; léditeur JSON brut est disponible uniquement lorsque linstantané dispose dun aller-retour brut sûr.
- Si un instantané ne peut pas effectuer en toute sécurité un aller-retour de texte brut, linterface de contrôle force le mode Formulaire et désactive le mode Brut pour cet instantané.
- Dans léditeur JSON brut, « Réinitialiser à la version enregistrée » préserve la forme rédigée en brut (formatage, commentaires, disposition `$include`) au lieu de restituer un instantané aplati, afin que les modifications externes survivent à une réinitialisation lorsque linstantané peut effectuer un aller-retour sûr.
- Les valeurs dobjet SecretRef structurées sont rendues en lecture seule dans les champs de texte du formulaire afin déviter toute corruption accidentelle dobjet en chaîne.
- Les écritures (`config.set`/`config.apply`/`config.patch`) prévalident la résolution des SecretRef actifs pour les références dans la charge utile de configuration soumise ; les références actives soumises non résolues sont rejetées avant lécriture.
- Schéma + rendu de formulaire (`config.schema` / `config.schema.lookup`, y compris les champs `title` / `description`, les indices dinterface correspondants, les résumés denfants immédiats, les métadonnées de documentation sur les nœuds objet imbriqué/joker/tableau/composition, ainsi que les schémas de plugin + canal lorsquils sont disponibles) ; léditeur JSON brut est disponible uniquement lorsque linstantané dispose dun aller-retour brut sûr.
- Si un instantané ne peut pas effectuer en toute sécurité laller-retour du texte brut, la Control UI force le mode Formulaire et désactive le mode Brut pour cet instantané.
- La commande « Réinitialiser à lenregistré » de léditeur JSON brut préserve la forme rédigée en brut (mise en forme, commentaires, disposition `$include`) au lieu de rerendre un instantané aplati, afin que les modifications externes survivent à une réinitialisation lorsque linstantané peut effectuer un aller-retour sûr.
- Les valeurs dobjet SecretRef structurées sont rendues en lecture seule dans les entrées de texte du formulaire pour éviter une corruption accidentelle dobjet vers chaîne.
</Accordion>
<Accordion title="Débogage, journaux, mise à jour">
- Débogage : instantanés détat/de santé/des modèles + journal dévénements + appels RPC manuels (`status`, `health`, `models.list`).
- Journaux : suivi en direct des journaux de fichier du Gateway avec filtrage/export (`logs.tail`).
- Mise à jour : exécutez une mise à jour de package/git + redémarrage (`update.run`) avec un rapport de redémarrage, puis interrogez `update.status` après la reconnexion pour vérifier la version du Gateway en cours dexécution.
- Débogage : instantanés de statut/santé/modèles + journal dévénements + appels RPC manuels (`status`, `health`, `models.list`).
- Journaux : suivi en direct des journaux de fichier du Gateway avec filtre/export (`logs.tail`).
- Mise à jour : exécuter une mise à jour de package/git + redémarrer (`update.run`) avec un rapport de redémarrage, puis interroger `update.status` après reconnexion pour vérifier la version du Gateway en cours dexécution.
</Accordion>
<Accordion title="Notes du panneau des tâches Cron">
- Pour les tâches isolées, la livraison utilise par défaut lannonce dun résumé. Vous pouvez passer à aucune si vous voulez des exécutions uniquement internes.
- Pour les tâches isolées, la livraison annonce un résumé par défaut. Vous pouvez passer à aucune si vous voulez des exécutions internes uniquement.
- Les champs canal/cible apparaissent lorsque lannonce est sélectionnée.
- Le mode Webhook utilise `delivery.mode = "webhook"` avec `delivery.to` défini sur une URL Webhook HTTP(S) valide.
- Pour les tâches de session principale, les modes de livraison Webhook et aucune sont disponibles.
- Les contrôles de modification avancés incluent supprimer après exécution, effacer le remplacement dagent, les options cron exactes/échelonnées, les remplacements de modèle/réflexion de lagent et les bascules de livraison au mieux.
- La validation du formulaire est en ligne avec des erreurs au niveau des champs ; les valeurs invalides désactivent le bouton denregistrement jusquà correction.
- Définissez `cron.webhookToken` pour envoyer un jeton porteur dédié ; sil est omis, le Webhook est envoyé sans en-tête dauthentification.
- Repli obsolète : les anciennes tâches stockées avec `notify: true` peuvent encore utiliser `cron.webhook` jusquà leur migration.
- Les contrôles dédition avancée incluent supprimer après exécution, effacer le remplacement dagent, options Cron exact/décalage, remplacements du modèle/de la réflexion de lagent et bascules de livraison au mieux.
- La validation du formulaire est intégrée avec des erreurs au niveau des champs ; les valeurs invalides désactivent le bouton denregistrement jusquà correction.
- Définissez `cron.webhookToken` pour envoyer un jeton bearer dédié ; sil est omis, le Webhook est envoyé sans en-tête dauthentification.
- Solution de repli obsolète : les anciennes tâches stockées avec `notify: true` peuvent encore utiliser `cron.webhook` jusquà migration.
</Accordion>
</AccordionGroup>
## Comportement de la discussion
## Comportement du chat
<AccordionGroup>
<Accordion title="Sémantique denvoi et dhistorique">
- `chat.send` est **non bloquant** : il accuse réception immédiatement avec `{ runId, status: "started" }` et la réponse est diffusée via les événements `chat`.
- Les téléversements de chat acceptent les images ainsi que les fichiers non vidéo. Les images conservent le chemin dimage natif ; les autres fichiers sont stockés comme médias gérés et affichés dans lhistorique sous forme de liens de pièce jointe.
- Renvoyer avec la même `idempotencyKey` renvoie `{ status: "in_flight" }` pendant lexécution, puis `{ status: "ok" }` après lachèvement.
- Les réponses `chat.history` sont limitées en taille pour la sécurité de lUI. Quand les entrées de transcription sont trop volumineuses, le Gateway peut tronquer les longs champs de texte, omettre les blocs de métadonnées lourds et remplacer les messages trop volumineux par un espace réservé (`[chat.history omitted: message too large]`).
- Les images de lassistant/générées sont conservées comme références de médias gérés et renvoyées via des URL de médias Gateway authentifiées, afin que les rechargements ne dépendent pas du maintien des charges utiles dimage base64 brutes dans la réponse dhistorique du chat.
- `chat.history` supprime aussi du texte visible de lassistant les balises de directive inline uniquement destinées à laffichage (par exemple `[[reply_to_*]]` et `[[audio_as_voice]]`), les charges utiles XML dappel doutil en texte brut (notamment `<tool_call>...</tool_call>`, `<function_call>...</function_call>`, `<tool_calls>...</tool_calls>`, `<function_calls>...</function_calls>` et les blocs dappel doutil tronqués), ainsi que les jetons de contrôle du modèle ASCII/pleine chasse divulgués, et omet les entrées dassistant dont tout le texte visible est uniquement le jeton silencieux exact `NO_REPLY` / `no_reply`.
- Pendant un envoi actif et le rafraîchissement final de lhistorique, la vue de chat garde visibles les messages utilisateur/assistant optimistes locaux si `chat.history` renvoie brièvement un instantané plus ancien ; la transcription canonique remplace ces messages locaux une fois que lhistorique du Gateway est à jour.
- Les événements `chat` en direct représentent létat de livraison, tandis que `chat.history` est reconstruit depuis la transcription de session durable. Après les événements finaux doutil, lUI de contrôle recharge lhistorique et ne fusionne quune petite fin optimiste ; la frontière de transcription est documentée dans [WebChat](/fr/web/webchat).
- `chat.inject` ajoute une note dassistant à la transcription de session et diffuse un événement `chat` pour des mises à jour limitées à lUI (pas dexécution dagent, pas de livraison de canal).
- Les sélecteurs de modèle et de réflexion de len-tête de chat modifient immédiatement la session active via `sessions.patch` ; ce sont des remplacements persistants de session, pas des options denvoi limitées à un seul tour.
- Saisir `/new` dans lUI de contrôle crée et bascule vers la même nouvelle session de tableau de bord que New Chat. Saisir `/reset` conserve la réinitialisation explicite sur place du Gateway pour la session actuelle.
- Le sélecteur de modèle de chat demande la vue de modèle configurée du Gateway. Si `agents.defaults.models` est présent, cette liste dautorisation alimente le sélecteur. Sinon, le sélecteur affiche les entrées explicites `models.providers.*.models` ainsi que les fournisseurs disposant dune authentification utilisable. Le catalogue complet reste disponible via le RPC de débogage `models.list` avec `view: "all"`.
- Quand de nouveaux rapports dutilisation de session Gateway indiquent une forte pression de contexte, la zone de composition du chat affiche un avis de contexte et, aux niveaux de compaction recommandés, un bouton compact qui exécute le chemin normal de Compaction de session. Les instantanés de jetons obsolètes sont masqués jusquà ce que le Gateway signale de nouveau une utilisation récente.
<Accordion title="Send and history semantics">
- `chat.send` est **non bloquant** : il accuse réception immédiatement avec `{ runId, status: "started" }` et la réponse est diffusée via des événements `chat`.
- Les téléversements de chat acceptent les images ainsi que les fichiers non vidéo. Les images conservent le chemin dimage natif ; les autres fichiers sont stockés comme médias gérés et affichés dans lhistorique sous forme de liens de pièces jointes.
- Un nouvel envoi avec le même `idempotencyKey` renvoie `{ status: "in_flight" }` pendant lexécution, puis `{ status: "ok" }` après la fin.
- Les réponses `chat.history` sont limitées en taille pour la sécurité de linterface utilisateur. Lorsque les entrées de transcription sont trop volumineuses, le Gateway peut tronquer les champs de texte longs, omettre les blocs de métadonnées lourds et remplacer les messages surdimensionnés par un espace réservé (`[chat.history omitted: message too large]`).
- Les images dassistant/générées sont conservées comme références de médias gérés et resservies via des URL de médias authentifiées du Gateway, afin que les rechargements ne dépendent pas de la présence durable des charges utiles dimage base64 brutes dans la réponse dhistorique du chat.
- `chat.history` supprime également les balises de directives en ligne uniquement destinées à laffichage du texte visible de lassistant (par exemple `[[reply_to_*]]` et `[[audio_as_voice]]`), les charges utiles XML dappels doutils en texte brut (y compris `<tool_call>...</tool_call>`, `<function_call>...</function_call>`, `<tool_calls>...</tool_calls>`, `<function_calls>...</function_calls>` et les blocs dappels doutils tronqués), ainsi que les jetons de contrôle de modèle ASCII/pleine chasse divulgués, et omet les entrées dassistant dont tout le texte visible est uniquement le jeton silencieux exact `NO_REPLY` / `no_reply`.
- Pendant un envoi actif et lactualisation finale de lhistorique, la vue de chat garde visibles les messages utilisateur/assistant optimistes locaux si `chat.history` renvoie brièvement un instantané plus ancien ; la transcription canonique remplace ces messages locaux une fois que lhistorique du Gateway a rattrapé son retard.
- Les événements `chat` en direct représentent létat de livraison, tandis que `chat.history` est reconstruit à partir de la transcription durable de la session. Après les événements finaux doutils, linterface Control recharge lhistorique et ne fusionne quune petite fin optimiste ; la limite de transcription est documentée dans [WebChat](/fr/web/webchat).
- `chat.inject` ajoute une note dassistant à la transcription de session et diffuse un événement `chat` pour les mises à jour uniquement destinées à linterface utilisateur (aucune exécution dagent, aucune livraison de canal).
- Le modèle den-tête du chat et les sélecteurs de réflexion modifient immédiatement la session active via `sessions.patch` ; ce sont des remplacements persistants de session, et non des options denvoi limitées à un seul tour.
- Saisir `/new` dans linterface Control crée et bascule vers la même nouvelle session de tableau de bord que Nouveau chat. Saisir `/reset` conserve la réinitialisation explicite en place du Gateway pour la session actuelle.
- Le sélecteur de modèle de chat demande la vue de modèle configurée du Gateway. Si `agents.defaults.models` est présent, cette liste dautorisation pilote le sélecteur. Sinon, le sélecteur affiche les entrées explicites `models.providers.*.models` ainsi que les fournisseurs avec une authentification utilisable. Le catalogue complet reste disponible via le RPC de débogage `models.list` avec `view: "all"`.
- Lorsque les rapports dutilisation dune session Gateway fraîche indiquent une forte pression de contexte, la zone de composition du chat affiche un avis de contexte et, aux niveaux de Compaction recommandés, un bouton compact qui exécute le chemin normal de Compaction de session. Les instantanés de jetons obsolètes sont masqués jusquà ce que le Gateway signale à nouveau une utilisation fraîche.
</Accordion>
<Accordion title="Mode conversation (temps réel du navigateur)">
Le mode conversation utilise un fournisseur vocal temps réel enregistré. Configurez OpenAI avec `talk.provider: "openai"` plus `talk.providers.openai.apiKey`, ou configurez Google avec `talk.provider: "google"` plus `talk.providers.google.apiKey` ; la configuration du fournisseur temps réel Voice Call peut toujours être réutilisée comme solution de repli. Le navigateur ne reçoit jamais de clé API de fournisseur standard. OpenAI reçoit un secret client Realtime éphémère pour WebRTC. Google Live reçoit un jeton dauthentification Live API à usage unique et contraint pour une session WebSocket de navigateur, avec les instructions et déclarations doutils verrouillées dans le jeton par le Gateway. Les fournisseurs qui nexposent quun pont temps réel backend passent par le transport relais du Gateway, afin que les identifiants et sockets fournisseur restent côté serveur pendant que laudio du navigateur circule via des RPC Gateway authentifiés. Linvite de session Realtime est assemblée par le Gateway ; `talk.realtime.session` naccepte pas de remplacements dinstructions fournis par lappelant.
<Accordion title="Talk mode (browser realtime)">
Le mode Parler utilise un fournisseur vocal temps réel enregistré. Configurez OpenAI avec `talk.provider: "openai"` plus `talk.providers.openai.apiKey`, ou configurez Google avec `talk.provider: "google"` plus `talk.providers.google.apiKey` ; la configuration du fournisseur temps réel Voice Call peut encore être réutilisée comme solution de repli. Le navigateur ne reçoit jamais de clé API de fournisseur standard. OpenAI reçoit un secret client Realtime éphémère pour WebRTC. Google Live reçoit un jeton dauthentification Live API contraint à usage unique pour une session WebSocket de navigateur, avec les instructions et déclarations doutils verrouillées dans le jeton par le Gateway. Les fournisseurs qui exposent uniquement un pont temps réel dorsal passent par le transport relais du Gateway, de sorte que les identifiants et les sockets fournisseur restent côté serveur tandis que laudio du navigateur transite par des RPC Gateway authentifiés. Linvite de session Realtime est assemblée par le Gateway ; `talk.realtime.session` naccepte pas les remplacements dinstructions fournis par lappelant.
Dans le compositeur de chat, le contrôle Talk est le bouton à vagues à côté du bouton de dictée par microphone. Quand Talk démarre, la ligne détat du compositeur affiche `Connecting Talk...`, puis `Talk live` pendant que laudio est connecté, ou `Asking OpenClaw...` pendant quun appel doutil temps réel consulte le modèle plus grand configuré via `chat.send`.
Dans le compositeur de Chat, le contrôle Parler est le bouton à vagues à côté du bouton de dictée au microphone. Lorsque Parler démarre, la ligne détat du compositeur affiche `Connecting Talk...`, puis `Talk live` pendant que laudio est connecté, ou `Asking OpenClaw...` pendant quun appel doutil temps réel consulte le modèle plus grand configuré via `chat.send`.
Smoke live mainteneur : `OPENAI_API_KEY=... GEMINI_API_KEY=... node --import tsx scripts/dev/realtime-talk-live-smoke.ts` vérifie léchange SDP WebRTC de navigateur OpenAI, la configuration WebSocket de navigateur avec jeton contraint Google Live, et ladaptateur de navigateur relais du Gateway avec un média de microphone factice. La commande imprime uniquement létat du fournisseur et ne journalise pas de secrets.
Smoke en direct pour mainteneur : `OPENAI_API_KEY=... GEMINI_API_KEY=... node --import tsx scripts/dev/realtime-talk-live-smoke.ts` vérifie léchange SDP WebRTC navigateur dOpenAI, la configuration WebSocket navigateur à jeton contraint de Google Live et ladaptateur navigateur relais du Gateway avec un média de microphone simulé. La commande naffiche que létat du fournisseur et ne journalise pas les secrets.
</Accordion>
<Accordion title="Arrêter et interrompre">
<Accordion title="Stop and abort">
- Cliquez sur **Arrêter** (appelle `chat.abort`).
- Pendant quune exécution est active, les suivis normaux sont mis en file dattente. Cliquez sur **Orienter** sur un message en file dattente pour injecter ce suivi dans le tour en cours.
- Saisissez `/stop` (ou des phrases dinterruption autonomes comme `stop`, `stop action`, `stop run`, `stop openclaw`, `please stop`) pour interrompre hors bande.
- `chat.abort` prend en charge `{ sessionKey }` (sans `runId`) pour interrompre toutes les exécutions actives de cette session.
- Saisissez `/stop` (ou des phrases dabandon autonomes comme `stop`, `stop action`, `stop run`, `stop openclaw`, `please stop`) pour abandonner hors bande.
- `chat.abort` prend en charge `{ sessionKey }` (sans `runId`) pour abandonner toutes les exécutions actives de cette session.
</Accordion>
<Accordion title="Conservation partielle après interruption">
- Quand une exécution est interrompue, le texte partiel de lassistant peut toujours être affiché dans lUI.
- Le Gateway conserve le texte partiel de lassistant interrompu dans lhistorique de transcription quand une sortie mise en tampon existe.
- Les entrées conservées incluent des métadonnées dinterruption afin que les consommateurs de transcription puissent distinguer les partiels interrompus de la sortie dachèvement normale.
<Accordion title="Abort partial retention">
- Lorsquune exécution est abandonnée, le texte partiel de lassistant peut tout de même être affiché dans linterface utilisateur.
- Le Gateway conserve le texte partiel dassistant abandonné dans lhistorique de transcription lorsquune sortie mise en mémoire tampon existe.
- Les entrées conservées incluent des métadonnées dabandon afin que les consommateurs de transcription puissent distinguer les fragments partiels abandonnés de la sortie dachèvement normale.
</Accordion>
</AccordionGroup>
## Installation PWA et Web Push
## Installation PWA et web push
LUI de contrôle fournit un `manifest.webmanifest` et un service worker, afin que les navigateurs modernes puissent linstaller comme PWA autonome. Web Push permet au Gateway de réveiller la PWA installée avec des notifications même lorsque longlet ou la fenêtre du navigateur nest pas ouvert.
Linterface Control fournit un `manifest.webmanifest` et un service worker, ce qui permet aux navigateurs modernes de linstaller comme PWA autonome. Web Push permet au Gateway de réveiller la PWA installée avec des notifications même lorsque longlet ou la fenêtre du navigateur nest pas ouvert.
| Surface | Ce que cela fait |
| Surface | Ce quelle fait |
| ----------------------------------------------------- | ------------------------------------------------------------------ |
| `ui/public/manifest.webmanifest` | Manifeste PWA. Les navigateurs proposent « Installer lapplication » s quil est accessible. |
| `ui/public/manifest.webmanifest` | Manifeste PWA. Les navigateurs proposent « Installer lapplication » une fois quil est accessible. |
| `ui/public/sw.js` | Service worker qui gère les événements `push` et les clics de notification. |
| `push/vapid-keys.json` (sous le répertoire détat OpenClaw) | Paire de clés VAPID générée automatiquement, utilisée pour signer les charges utiles Web Push. |
| `push/web-push-subscriptions.json` | Points de terminaison dabonnement du navigateur conservés. |
| `push/vapid-keys.json` (sous le répertoire détat OpenClaw) | Paire de clés VAPID générée automatiquement utilisée pour signer les charges utiles Web Push. |
| `push/web-push-subscriptions.json` | Points de terminaison dabonnement de navigateur conservés. |
Remplacez la paire de clés VAPID via des variables denvironnement sur le processus Gateway lorsque vous voulez figer les clés (pour des déploiements multi-hôtes, la rotation des secrets ou des tests) :
Remplacez la paire de clés VAPID via des variables denvironnement sur le processus Gateway lorsque vous voulez épingler les clés (pour les déploiements multi-hôtes, la rotation des secrets ou les tests) :
- `OPENCLAW_VAPID_PUBLIC_KEY`
- `OPENCLAW_VAPID_PRIVATE_KEY`
- `OPENCLAW_VAPID_SUBJECT` (par défaut `mailto:openclaw@localhost`)
LUI de contrôle utilise ces méthodes Gateway limitées par portée pour enregistrer et tester les abonnements du navigateur :
Linterface Control utilise ces méthodes Gateway limitées par portée pour enregistrer et tester les abonnements de navigateur :
- `push.web.vapidPublicKey` — récupère la clé publique VAPID active.
- `push.web.subscribe` — enregistre un `endpoint` plus `keys.p256dh`/`keys.auth`.
@ -218,18 +218,18 @@ LUI de contrôle utilise ces méthodes Gateway limitées par portée pour enr
- `push.web.test` — envoie une notification de test à labonnement de lappelant.
<Note>
Web Push est indépendant du chemin relais iOS APNS (voir [Configuration](/fr/gateway/configuration) pour le push adossé à un relais) et de la méthode existante `push.test`, qui ciblent lappairage mobile natif.
Web Push est indépendant du chemin relais APNS iOS (voir [Configuration](/fr/gateway/configuration) pour le push adossé à un relais) et de la méthode `push.test` existante, qui ciblent lappairage mobile natif.
</Note>
## Intégrations hébergées
Les messages de lassistant peuvent afficher du contenu web hébergé inline avec le shortcode `[embed ...]`. La politique sandbox de liframe est contrôlée par `gateway.controlUi.embedSandbox` :
Les messages dassistant peuvent afficher du contenu web hébergé en ligne avec le shortcode `[embed ...]`. La politique de sandbox iframe est contrôlée par `gateway.controlUi.embedSandbox` :
<Tabs>
<Tab title="strict">
Désactive lexécution de scripts dans les intégrations hébergées.
</Tab>
<Tab title="scripts (par défaut)">
<Tab title="scripts (default)">
Autorise les intégrations interactives tout en conservant lisolation dorigine ; cest la valeur par défaut et elle suffit généralement pour les jeux/widgets de navigateur autonomes.
</Tab>
<Tab title="trusted">
@ -250,14 +250,14 @@ Exemple :
```
<Warning>
Utilisez `trusted` uniquement quand le document intégré a réellement besoin dun comportement même origine. Pour la plupart des jeux et canevas interactifs générés par lagent, `scripts` est le choix le plus sûr.
Utilisez `trusted` uniquement lorsque le document intégré a réellement besoin du comportement même origine. Pour la plupart des jeux générés par agent et des canevas interactifs, `scripts` est le choix le plus sûr.
</Warning>
Les URL dintégration externes absolues `http(s)` restent bloquées par défaut. Si vous voulez intentionnellement que `[embed url="https://..."]` charge des pages tierces, définissez `gateway.controlUi.allowExternalEmbedUrls: true`.
## Largeur des messages de chat
Les messages de chat groupés utilisent une largeur maximale lisible par défaut. Les déploiements sur écrans larges peuvent la remplacer sans modifier le CSS groupé en définissant `gateway.controlUi.chatMessageMaxWidth` :
Les messages de chat groupés utilisent une largeur maximale lisible par défaut. Les déploiements sur grands écrans peuvent la remplacer sans modifier le CSS fourni en définissant `gateway.controlUi.chatMessageMaxWidth` :
```json5
{
@ -274,8 +274,8 @@ La valeur est validée avant datteindre le navigateur. Les valeurs prises en
## Accès tailnet (recommandé)
<Tabs>
<Tab title="Tailscale Serve intégré (préféré)">
Gardez le Gateway sur local loopback et laissez Tailscale Serve le mandater avec HTTPS :
<Tab title="Integrated Tailscale Serve (preferred)">
Gardez le Gateway sur loopback et laissez Tailscale Serve le relayer avec HTTPS :
```bash
openclaw gateway --tailscale serve
@ -285,46 +285,46 @@ La valeur est validée avant datteindre le navigateur. Les valeurs prises en
- `https://<magicdns>/` (ou votre `gateway.controlUi.basePath` configuré)
Par défaut, les requêtes Control UI/WebSocket Serve peuvent sauthentifier via les en-têtes didentité Tailscale (`tailscale-user-login`) quand `gateway.auth.allowTailscale` vaut `true`. OpenClaw vérifie lidentité en résolvant ladresse `x-forwarded-for` avec `tailscale whois` et en la faisant correspondre à len-tête, et naccepte ces requêtes que lorsquelles atteignent local loopback avec les en-têtes `x-forwarded-*` de Tailscale. Pour les sessions dopérateur de lUI de contrôle avec identité dappareil du navigateur, ce chemin Serve vérifié saute aussi laller-retour dappairage de lappareil ; les navigateurs sans appareil et les connexions de rôle de nœud suivent toujours les vérifications dappareil normales. Définissez `gateway.auth.allowTailscale: false` si vous voulez exiger des identifiants explicites à secret partagé même pour le trafic Serve. Utilisez ensuite `gateway.auth.mode: "token"` ou `"password"`.
Par défaut, les requêtes Serve de linterface Control/WebSocket peuvent sauthentifier via les en-têtes didentité Tailscale (`tailscale-user-login`) lorsque `gateway.auth.allowTailscale` est `true`. OpenClaw vérifie lidentité en résolvant ladresse `x-forwarded-for` avec `tailscale whois` et en la faisant correspondre à len-tête, et naccepte ces requêtes que lorsquelles atteignent loopback avec les en-têtes `x-forwarded-*` de Tailscale. Pour les sessions opérateur de linterface Control avec identité dappareil de navigateur, ce chemin Serve vérifié saute également laller-retour dappairage dappareil ; les navigateurs sans appareil et les connexions de rôle de nœud suivent toujours les vérifications dappareil normales. Définissez `gateway.auth.allowTailscale: false` si vous voulez exiger des identifiants explicites à secret partagé même pour le trafic Serve. Utilisez ensuite `gateway.auth.mode: "token"` ou `"password"`.
Pour ce chemin didentité Serve asynchrone, les tentatives dauthentification échouées pour la même IP client et la même portée dauthentification sont sérialisées avant les écritures de limitation de débit. Les nouvelles tentatives erronées simultanées depuis le même navigateur peuvent donc afficher `retry later` à la deuxième requête au lieu de deux incompatibilités simples en concurrence parallèle.
Pour ce chemin didentité Serve asynchrone, les tentatives dauthentification échouées pour la même IP cliente et la même portée dauthentification sont sérialisées avant les écritures de limitation de débit. Des nouvelles tentatives incorrectes simultanées depuis le même navigateur peuvent donc afficher `retry later` sur la deuxième requête au lieu de deux non-correspondances simples en concurrence parallèle.
<Warning>
Lauthentification Serve sans jeton suppose que lhôte gateway est fiable. Si du code local non fiable peut sexécuter sur cet hôte, exigez une authentification par jeton/mot de passe.
Lauthentification Serve sans jeton suppose que lhôte du Gateway est fiable. Si du code local non fiable peut sexécuter sur cet hôte, exigez une authentification par jeton/mot de passe.
</Warning>
</Tab>
<Tab title="Lier au tailnet + jeton">
<Tab title="Bind to tailnet + token">
```bash
openclaw gateway --bind tailnet --token "$(openssl rand -hex 32)"
```
Ouvrez ensuite :
Puis ouvrez :
- `http://<tailscale-ip>:18789/` (ou votre `gateway.controlUi.basePath` configuré)
Collez le secret partagé correspondant dans les paramètres de lUI (envoyé comme `connect.params.auth.token` ou `connect.params.auth.password`).
Collez le secret partagé correspondant dans les paramètres de linterface utilisateur (envoyé comme `connect.params.auth.token` ou `connect.params.auth.password`).
</Tab>
</Tabs>
## HTTP non sécurisé
Si vous ouvrez le tableau de bord via HTTP en clair (`http://<lan-ip>` ou `http://<tailscale-ip>`), le navigateur sexécute dans un **contexte non sécurisé** et bloque WebCrypto. Par défaut, OpenClaw **bloque** les connexions de lUI de contrôle sans identité dappareil.
Si vous ouvrez le tableau de bord via HTTP simple (`http://<lan-ip>` ou `http://<tailscale-ip>`), le navigateur sexécute dans un **contexte non sécurisé** et bloque WebCrypto. Par défaut, OpenClaw **bloque** les connexions de linterface Control sans identité dappareil.
Exceptions documentées :
- compatibilité HTTP non sécurisée limitée à localhost avec `gateway.controlUi.allowInsecureAuth=true`
- authentification réussie de lUI de contrôle opérateur via `gateway.auth.mode: "trusted-proxy"`
- option durgence `gateway.controlUi.dangerouslyDisableDeviceAuth=true`
- compatibilité HTTP non sécurisé limitée à localhost avec `gateway.controlUi.allowInsecureAuth=true`
- authentification opérateur réussie de linterface Control via `gateway.auth.mode: "trusted-proxy"`
- option de dernier recours `gateway.controlUi.dangerouslyDisableDeviceAuth=true`
**Correction recommandée :** utilisez HTTPS (Tailscale Serve) ou ouvrez lUI localement :
**Correctif recommandé :** utilisez HTTPS (Tailscale Serve) ou ouvrez linterface localement :
- `https://<magicdns>/` (Serve)
- `http://127.0.0.1:18789/` (sur lhôte du Gateway)
<AccordionGroup>
<Accordion title="Comportement du basculement dauthentification non sécurisée">
<Accordion title="Comportement du basculeur dauthentification non sécurisée">
```json5
{
gateway: {
@ -335,14 +335,14 @@ Exceptions documentées :
}
```
`allowInsecureAuth` est uniquement un basculement de compatibilité locale :
`allowInsecureAuth` est uniquement un basculeur de compatibilité locale :
- Il permet aux sessions Control UI localhost de continuer sans identité dappareil dans les contextes HTTP non sécurisés.
- Il permet aux sessions de linterface de contrôle localhost de continuer sans identité dappareil dans des contextes HTTP non sécurisés.
- Il ne contourne pas les vérifications dappairage.
- Il nassouplit pas les exigences didentité dappareil distant (non-localhost).
</Accordion>
<Accordion title="Utilisation durgence uniquement">
<Accordion title="Solution durgence uniquement">
```json5
{
gateway: {
@ -354,44 +354,54 @@ Exceptions documentées :
```
<Warning>
`dangerouslyDisableDeviceAuth` désactive les vérifications didentité dappareil de la Control UI et constitue une dégradation sévère de la sécurité. Rétablissez rapidement la configuration après une utilisation durgence.
`dangerouslyDisableDeviceAuth` désactive les vérifications didentité dappareil de linterface de contrôle et constitue une forte dégradation de la sécurité. Rétablissez rapidement le réglage après une utilisation durgence.
</Warning>
</Accordion>
<Accordion title="Note sur le proxy de confiance">
- Une authentification par proxy de confiance réussie peut admettre des sessions Control UI **opérateur** sans identité dappareil.
- Cela ne sétend **pas** aux sessions Control UI avec rôle de nœud.
- Les proxys inverses loopback sur le même hôte ne satisfont toujours pas lauthentification par proxy de confiance ; consultez [Authentification par proxy de confiance](/fr/gateway/trusted-proxy-auth).
- Une authentification de proxy de confiance réussie peut autoriser des sessions dinterface de contrôle **opérateur** sans identité dappareil.
- Cela ne sétend **pas** aux sessions dinterface de contrôle avec rôle de nœud.
- Les proxys inverses local loopback sur le même hôte ne satisfont toujours pas lauthentification de proxy de confiance ; consultez [Authentification par proxy de confiance](/fr/gateway/trusted-proxy-auth).
</Accordion>
</AccordionGroup>
Consultez [Tailscale](/fr/gateway/tailscale) pour des conseils de configuration HTTPS.
Consultez [Tailscale](/fr/gateway/tailscale) pour les instructions de configuration HTTPS.
## Politique de sécurité du contenu
La Control UI est fournie avec une politique `img-src` stricte : seuls les éléments **same-origin**, les URL `data:` et les URL `blob:` générées localement sont autorisés. Les URL dimages distantes `http(s)` et relatives au protocole sont rejetées par le navigateur et ne déclenchent aucune requête réseau.
Linterface de contrôle est livrée avec une politique `img-src` stricte : seuls les ressources de **même origine**, les URL `data:` et les URL `blob:` générées localement sont autorisées. Les URL dimages distantes `http(s)` et relatives au protocole sont rejetées par le navigateur et ne déclenchent aucune requête réseau.
Ce que cela signifie en pratique :
- Les avatars et images servis sous des chemins relatifs (par exemple `/avatars/<id>`) saffichent toujours, y compris les routes davatars authentifiées que lUI récupère et convertit en URL `blob:` locales.
- Les URL inline `data:image/...` saffichent toujours (utile pour les charges utiles intégrées au protocole).
- Les URL `blob:` locales créées par la Control UI saffichent toujours.
- Les URL davatars distantes émises par les métadonnées de canal sont supprimées par les helpers davatar de la Control UI et remplacées par le logo/badge intégré, afin quun canal compromis ou malveillant ne puisse pas forcer des récupérations dimages distantes arbitraires depuis le navigateur dun opérateur.
- Les avatars et les images servis sous des chemins relatifs (par exemple `/avatars/<id>`) saffichent toujours, y compris les routes davatars authentifiées que linterface récupère et convertit en URL `blob:` locales.
- Les URL inline `data:image/...` saffichent toujours (utile pour les charges utiles dans le protocole).
- Les URL `blob:` locales créées par linterface de contrôle saffichent toujours.
- Les URL davatar distantes émises par les métadonnées de canal sont retirées par les assistants davatar de linterface de contrôle et remplacées par le logo/badge intégré, de sorte quun canal compromis ou malveillant ne puisse pas forcer des récupérations dimages distantes arbitraires depuis le navigateur dun opérateur.
Vous navez rien à changer pour obtenir ce comportement il est toujours activé et nest pas configurable.
Vous navez rien à changer pour obtenir ce comportement : il est toujours activé et nest pas configurable.
## Authentification de la route davatar
Lorsque lauthentification du Gateway est configurée, le point de terminaison davatar de la Control UI exige le même jeton de Gateway que le reste de lAPI :
Lorsque lauthentification du Gateway est configurée, le point de terminaison davatar de linterface de contrôle exige le même jeton Gateway que le reste de lAPI :
- `GET /avatar/<agentId>` renvoie limage davatar uniquement aux appelants authentifiés. `GET /avatar/<agentId>?meta=1` renvoie les métadonnées de lavatar selon la même règle.
- Les requêtes non authentifiées vers lune ou lautre route sont rejetées (comme pour la route sœur assistant-media). Cela empêche la route davatar de divulguer lidentité de lagent sur des hôtes autrement protégés.
- La Control UI elle-même transmet le jeton du Gateway comme en-tête bearer lors de la récupération des avatars, et utilise des URL blob authentifiées afin que limage saffiche toujours dans les tableaux de bord.
- Les requêtes non authentifiées vers lune ou lautre route sont rejetées (comme la route sœur assistant-media). Cela empêche la route davatar de divulguer lidentité de lagent sur des hôtes qui sont autrement protégés.
- Linterface de contrôle transmet elle-même le jeton Gateway comme en-tête bearer lors de la récupération des avatars, et utilise des URL blob authentifiées afin que limage saffiche toujours dans les tableaux de bord.
Si vous désactivez lauthentification du Gateway (ce qui est déconseillé sur les hôtes partagés), la route davatar devient également non authentifiée, comme le reste du Gateway.
Si vous désactivez lauthentification du Gateway (non recommandé sur les hôtes partagés), la route davatar devient également non authentifiée, conformément au reste du Gateway.
## Construction de lUI
## Authentification de la route des médias de lassistant
Lorsque lauthentification du Gateway est configurée, les aperçus de médias locaux de lassistant utilisent une route en deux étapes :
- `GET /__openclaw__/assistant-media?meta=1&source=<path>` exige lauthentification opérateur normale de linterface de contrôle. Le navigateur envoie le jeton Gateway comme en-tête bearer lors de la vérification de disponibilité.
- Les réponses de métadonnées réussies incluent un `mediaTicket` de courte durée limité à ce chemin source exact.
- Les URL dimage, daudio, de vidéo et de document rendues par le navigateur utilisent `mediaTicket=<ticket>` au lieu du jeton Gateway actif ou du mot de passe. Le ticket expire rapidement et ne peut pas autoriser une source différente.
Cela rend le rendu normal des médias compatible avec les éléments multimédias natifs du navigateur sans placer didentifiants Gateway réutilisables dans des URL de médias visibles.
## Construction de linterface
Le Gateway sert les fichiers statiques depuis `dist/control-ui`. Construisez-les avec :
@ -399,7 +409,7 @@ Le Gateway sert les fichiers statiques depuis `dist/control-ui`. Construisez-les
pnpm ui:build
```
Base absolue facultative (lorsque vous voulez des URL dassets fixes) :
Base absolue facultative (lorsque vous voulez des URL de ressources fixes) :
```bash
OPENCLAW_CONTROL_UI_BASE_PATH=/openclaw/ pnpm ui:build
@ -411,14 +421,14 @@ Pour le développement local (serveur de développement séparé) :
pnpm ui:dev
```
Pointez ensuite lUI vers lURL WS de votre Gateway (par exemple `ws://127.0.0.1:18789`).
Pointez ensuite linterface vers votre URL WS du Gateway (par exemple `ws://127.0.0.1:18789`).
## Débogage/test : serveur de développement + Gateway distant
## Débogage/tests : serveur de développement + Gateway distant
La Control UI est composée de fichiers statiques ; la cible WebSocket est configurable et peut être différente de lorigine HTTP. Cest pratique lorsque vous voulez utiliser le serveur de développement Vite localement, mais que le Gateway sexécute ailleurs.
Linterface de contrôle est constituée de fichiers statiques ; la cible WebSocket est configurable et peut être différente de lorigine HTTP. Cest pratique lorsque vous voulez le serveur de développement Vite localement, mais que le Gateway sexécute ailleurs.
<Steps>
<Step title="Démarrer le serveur de développement de lUI">
<Step title="Démarrer le serveur de développement de linterface">
```bash
pnpm ui:dev
```
@ -439,17 +449,17 @@ La Control UI est composée de fichiers statiques ; la cible WebSocket est confi
<AccordionGroup>
<Accordion title="Notes">
- `gatewayUrl` est stocké dans localStorage après le chargement et retiré de lURL.
- Si vous transmettez un point de terminaison `ws://` ou `wss://` complet via `gatewayUrl`, encodez en URL la valeur de `gatewayUrl` afin que le navigateur analyse correctement la chaîne de requête.
- `token` doit être transmis via le fragment dURL (`#token=...`) chaque fois que possible. Les fragments ne sont pas envoyés au serveur, ce qui évite les fuites dans les journaux de requêtes et le Referer. Les anciens paramètres de requête `?token=` sont encore importés une fois pour compatibilité, mais uniquement comme solution de repli, et sont supprimés immédiatement après lamorçage.
- `gatewayUrl` est stocké dans localStorage après le chargement et supprimé de lURL.
- Si vous transmettez un point de terminaison complet `ws://` ou `wss://` via `gatewayUrl`, encodez en URL la valeur `gatewayUrl` afin que le navigateur analyse correctement la chaîne de requête.
- `token` doit être transmis via le fragment dURL (`#token=...`) chaque fois que possible. Les fragments ne sont pas envoyés au serveur, ce qui évite les fuites dans les journaux de requêtes et le Referer. Les paramètres de requête hérités `?token=` sont encore importés une fois par compatibilité, mais uniquement comme solution de repli, et sont supprimés immédiatement après lamorçage.
- `password` est conservé uniquement en mémoire.
- Lorsque `gatewayUrl` est défini, lUI ne se rabat pas sur les identifiants de configuration ou denvironnement. Fournissez explicitement `token` (ou `password`). Labsence didentifiants explicites est une erreur.
- Lorsque `gatewayUrl` est défini, linterface ne se rabat pas sur les identifiants de configuration ou denvironnement. Fournissez explicitement `token` (ou `password`). Labsence didentifiants explicites est une erreur.
- Utilisez `wss://` lorsque le Gateway est derrière TLS (Tailscale Serve, proxy HTTPS, etc.).
- `gatewayUrl` nest accepté que dans une fenêtre de premier niveau (non intégrée) afin dempêcher le clickjacking.
- Les déploiements Control UI non-loopback doivent définir explicitement `gateway.controlUi.allowedOrigins` (origines complètes). Cela inclut les configurations de développement distantes.
- Le démarrage du Gateway peut initialiser des origines locales telles que `http://localhost:<port>` et `http://127.0.0.1:<port>` à partir du bind et du port effectifs à lexécution, mais les origines de navigateurs distants nécessitent toujours des entrées explicites.
- Nutilisez pas `gateway.controlUi.allowedOrigins: ["*"]` sauf pour des tests locaux strictement contrôlés. Cela signifie autoriser nimporte quelle origine de navigateur, pas « correspondre à lhôte que jutilise ».
- `gateway.controlUi.dangerouslyAllowHostHeaderOriginFallback=true` active le mode de repli dorigine basé sur len-tête Host, mais cest un mode de sécurité dangereux.
- Les déploiements non-loopback de linterface de contrôle doivent définir explicitement `gateway.controlUi.allowedOrigins` (origines complètes). Cela inclut les configurations de développement distantes.
- Le démarrage du Gateway peut initialiser des origines locales comme `http://localhost:<port>` et `http://127.0.0.1:<port>` à partir de ladresse de liaison et du port dexécution effectifs, mais les origines de navigateurs distants nécessitent toujours des entrées explicites.
- Nutilisez pas `gateway.controlUi.allowedOrigins: ["*"]` sauf pour des tests locaux strictement contrôlés. Cela signifie autoriser nimporte quelle origine de navigateur, et non « correspondre à lhôte que jutilise ».
- `gateway.controlUi.dangerouslyAllowHostHeaderOriginFallback=true` active le mode de repli dorigine par en-tête Host, mais cest un mode de sécurité dangereux.
</Accordion>
</AccordionGroup>
@ -468,9 +478,9 @@ Exemple :
Détails de configuration de laccès distant : [Accès distant](/fr/gateway/remote).
## Associés
## Liens connexes
- [Tableau de bord](/fr/web/dashboard) — tableau de bord du Gateway
- [Contrôles de santé](/fr/gateway/health) — surveillance de la santé du Gateway
- [TUI](/fr/web/tui) — interface utilisateur de terminal
- [WebChat](/fr/web/webchat) — interface de chat basée sur le navigateur
- [Contrôles détat](/fr/gateway/health) — surveillance de létat du Gateway
- [TUI](/fr/web/tui) — interface utilisateur en terminal
- [WebChat](/fr/web/webchat) — interface de chat dans le navigateur