chore(i18n): refresh fr translations

This commit is contained in:
openclaw-docs-i18n[bot] 2026-05-05 06:21:30 +00:00
parent 928636fa07
commit 788cb0ba2c
22 changed files with 3455 additions and 3223 deletions

View File

@ -1,42 +1,42 @@
---
read_when:
- Inspection des tâches en arrière-plan en cours ou récemment terminées
- Débogage des échecs de livraison pour les exécutions dagent détachées
- Inspection des travaux en arrière-plan en cours ou récemment terminés
- Débogage des échecs de remise pour les exécutions dagent détachées
- Comprendre comment les exécutions en arrière-plan sarticulent avec les sessions, Cron et Heartbeat
sidebarTitle: Background tasks
summary: Suivi des tâches en arrière-plan pour les exécutions ACP, les sous-agents, les tâches Cron isolées et les opérations CLI
title: Tâches en arrière-plan
x-i18n:
generated_at: "2026-05-05T01:44:37Z"
generated_at: "2026-05-05T06:16:18Z"
model: gpt-5.5
provider: openai
source_hash: 60d6ea6178535b19b95d761b8e8b05a665234584ae69852fd21097988aa32991
source_hash: bafd959feaf2e220820ec56bf1ef144207d05757418e9971ebf427844cf30c46
source_path: automation/tasks.md
workflow: 16
---
<Note>
Vous cherchez la planification ? Consultez [Automatisation et tâches](/fr/automation) pour choisir le bon mécanisme. Cette page est le registre d'activité du travail en arrière-plan, pas le planificateur.
Vous cherchez la planification ? Consultez [Automatisation et tâches](/fr/automation) pour choisir le bon mécanisme. Cette page est le journal dactivité du travail en arrière-plan, pas le planificateur.
</Note>
Les tâches en arrière-plan suivent le travail qui s'exécute **en dehors de votre session de conversation principale** : exécutions ACP, lancements de sous-agents, exécutions de tâches Cron isolées et opérations lancées par la CLI.
Les tâches en arrière-plan suivent le travail qui sexécute **en dehors de votre session de conversation principale** : exécutions ACP, lancements de sous-agents, exécutions isolées de tâches Cron et opérations lancées par la CLI.
Les tâches ne remplacent **pas** les sessions, les tâches Cron ni les Heartbeats — elles sont le **registre d'activité** qui consigne quel travail détaché a eu lieu, quand, et s'il a réussi.
Les tâches ne remplacent **pas** les sessions, les tâches Cron ni les Heartbeats : elles sont le **journal dactivité** qui consigne quel travail détaché a eu lieu, quand, et sil a réussi.
<Note>
Toutes les exécutions d'agent ne créent pas de tâche. Les tours Heartbeat et la discussion interactive normale n'en créent pas. Toutes les exécutions Cron, les lancements ACP, les lancements de sous-agents et les commandes d'agent CLI en créent.
Toutes les exécutions dagent ne créent pas une tâche. Les tours Heartbeat et la conversation interactive normale nen créent pas. Toutes les exécutions Cron, les lancements ACP, les lancements de sous-agents et les commandes dagent CLI en créent.
</Note>
## En bref
## TL;DR
- Les tâches sont des **enregistrements**, pas des planificateurs — Cron et Heartbeat décident _quand_ le travail s'exécute, les tâches suivent _ce qui s'est passé_.
- ACP, les sous-agents, toutes les tâches Cron et les opérations CLI créent des tâches. Les tours Heartbeat n'en créent pas.
- Chaque tâche passe par `queued → running → terminal` (succeeded, failed, timed_out, cancelled ou lost).
- Les tâches Cron restent actives tant que l'environnement d'exécution Cron possède toujours la tâche ; si l'état d'exécution en mémoire a disparu, la maintenance des tâches vérifie d'abord l'historique durable des exécutions Cron avant de marquer une tâche comme perdue.
- La finalisation est pilotée par notification : le travail détaché peut notifier directement ou réveiller la session/le Heartbeat du demandeur lorsqu'il se termine ; les boucles d'interrogation de l'état sont donc généralement la mauvaise approche.
- Les exécutions Cron isolées et les finalisations de sous-agents nettoient au mieux les onglets/processus de navigateur suivis pour leur session enfant avant la comptabilité finale du nettoyage.
- La livraison Cron isolée supprime les réponses parent intermédiaires obsolètes pendant que le travail de sous-agents descendants est encore en train de se terminer, et elle privilégie la sortie finale des descendants lorsqu'elle arrive avant la livraison.
- Les notifications de finalisation sont livrées directement à un canal ou mises en file d'attente pour le prochain Heartbeat.
- Les tâches sont des **enregistrements**, pas des planificateurs : Cron et Heartbeat décident _quand_ le travail sexécute, les tâches suivent _ce qui sest passé_.
- ACP, les sous-agents, toutes les tâches Cron et les opérations CLI créent des tâches. Les tours Heartbeat nen créent pas.
- Chaque tâche passe par `queued → running → terminal` (réussie, échouée, expirée, annulée ou perdue).
- Les tâches Cron restent actives tant que le runtime Cron possède encore la tâche ; si létat du runtime en mémoire a disparu, la maintenance des tâches vérifie dabord lhistorique durable des exécutions Cron avant de marquer une tâche comme perdue.
- Lachèvement est piloté par notification : le travail détaché peut notifier directement ou réveiller la session/le Heartbeat demandeur lorsquil se termine, donc les boucles de sondage détat sont généralement la mauvaise approche.
- Les exécutions Cron isolées et les achèvements de sous-agents nettoient au mieux les onglets/processus de navigateur suivis pour leur session enfant avant la comptabilité finale de nettoyage.
- La livraison Cron isolée supprime les réponses parentes intermédiaires obsolètes pendant que le travail des sous-agents descendants est encore en cours découlement, et elle préfère la sortie finale descendante lorsquelle arrive avant la livraison.
- Les notifications dachèvement sont livrées directement à un canal ou mises en file dattente pour le prochain Heartbeat.
- `openclaw tasks list` affiche toutes les tâches ; `openclaw tasks audit` fait remonter les problèmes.
- Les enregistrements terminaux sont conservés pendant 7 jours, puis automatiquement purgés.
@ -93,33 +93,33 @@ Toutes les exécutions d'agent ne créent pas de tâche. Les tours Heartbeat et
## Ce qui crée une tâche
| Source | Type d'exécution | Moment où un enregistrement de tâche est créé | Politique de notification par défaut |
| ---------------------- | ------------ | ------------------------------------------------------ | --------------------- |
| Exécutions ACP en arrière-plan | `acp` | Lancement d'une session enfant ACP | `done_only` |
| Orchestration des sous-agents | `subagent` | Lancement d'un sous-agent via `sessions_spawn` | `done_only` |
| Tâches Cron (tous types) | `cron` | Chaque exécution Cron (session principale et isolée) | `silent` |
| Opérations CLI | `cli` | Commandes `openclaw agent` qui passent par le Gateway | `silent` |
| Tâches média d'agent | `cli` | Exécutions `music_generate`/`video_generate` adossées à une session | `silent` |
| Source | Type de runtime | Quand un enregistrement de tâche est créé | Politique de notification par défaut |
| ---------------------- | --------------- | --------------------------------------------------------- | ------------------------------------ |
| Exécutions ACP en arrière-plan | `acp` | Lancement dune session ACP enfant | `done_only` |
| Orchestration de sous-agent | `subagent` | Lancement dun sous-agent via `sessions_spawn` | `done_only` |
| Tâches Cron (tous types) | `cron` | Chaque exécution Cron (session principale et isolée) | `silent` |
| Opérations CLI | `cli` | Commandes `openclaw agent` qui passent par le Gateway | `silent` |
| Tâches média dagent | `cli` | Exécutions `music_generate`/`video_generate` adossées à une session | `silent` |
<AccordionGroup>
<Accordion title="Valeurs de notification par défaut pour Cron et les médias">
Les tâches Cron de session principale utilisent par défaut la politique de notification `silent` — elles créent des enregistrements pour le suivi, mais ne génèrent pas de notifications. Les tâches Cron isolées utilisent aussi `silent` par défaut, mais elles sont plus visibles parce qu'elles s'exécutent dans leur propre session.
<Accordion title="Valeurs par défaut de notification pour Cron et les médias">
Les tâches Cron de session principale utilisent la politique de notification `silent` par défaut : elles créent des enregistrements pour le suivi mais ne génèrent pas de notifications. Les tâches Cron isolées utilisent aussi `silent` par défaut, mais sont plus visibles parce quelles sexécutent dans leur propre session.
Les exécutions `music_generate` et `video_generate` adossées à une session utilisent aussi la politique de notification `silent`. Elles créent quand même des enregistrements de tâche, mais la finalisation est renvoyée à la session d'agent d'origine sous forme de réveil interne, afin que l'agent puisse écrire le message de suivi et joindre lui-même le média terminé. Les finalisations de groupe/canal suivent la politique normale de réponse visible ; l'agent utilise donc l'outil de message lorsque la remise d'origine l'exige.
Les exécutions `music_generate` et `video_generate` adossées à une session utilisent aussi la politique de notification `silent`. Elles créent tout de même des enregistrements de tâche, mais lachèvement est renvoyé à la session dagent dorigine sous forme de réveil interne afin que lagent puisse écrire le message de suivi et joindre lui-même le média terminé. Les achèvements de groupe/canal suivent la politique normale de réponse visible, donc lagent utilise loutil de messagerie lorsque la livraison source lexige. Si lagent dachèvement ne produit pas de preuve de livraison par outil de messagerie dans une route uniquement par outil, OpenClaw envoie la solution de repli dachèvement directement au canal dorigine au lieu de laisser le média privé.
</Accordion>
<Accordion title="Garde-fou de concurrence de video_generate">
Tant qu'une tâche `video_generate` adossée à une session est encore active, l'outil agit aussi comme garde-fou : les appels `video_generate` répétés dans cette même session renvoient l'état de la tâche active au lieu de démarrer une deuxième génération concurrente. Utilisez `action: "status"` lorsque vous voulez une recherche explicite de progression/d'état depuis le côté agent.
<Accordion title="Garde-fou video_generate concurrent">
Tant quune tâche `video_generate` adossée à une session est encore active, loutil agit aussi comme garde-fou : les appels `video_generate` répétés dans cette même session renvoient létat de la tâche active au lieu de démarrer une deuxième génération concurrente. Utilisez `action: "status"` lorsque vous voulez une consultation explicite de progression/détat côté agent.
</Accordion>
<Accordion title="Ce qui ne crée pas de tâches">
- Tours Heartbeat — session principale ; voir [Heartbeat](/fr/gateway/heartbeat)
- Tours de discussion interactive normaux
- Réponses directes à `/command`
- Tours de conversation interactive normale
- Réponses directes `/command`
</Accordion>
</AccordionGroup>
## Cycle de vie des tâches
## Cycle de vie dune tâche
```mermaid
stateDiagram-v2
@ -135,50 +135,50 @@ stateDiagram-v2
| État | Signification |
| ----------- | -------------------------------------------------------------------------- |
| `queued` | Créée, en attente du démarrage de l'agent |
| `running` | Le tour d'agent est en cours d'exécution active |
| `queued` | Créée, en attente du démarrage de lagent |
| `running` | Le tour dagent est en cours dexécution active |
| `succeeded` | Terminée avec succès |
| `failed` | Terminée avec une erreur |
| `timed_out` | A dépassé le délai d'expiration configuré |
| `cancelled` | Arrêtée par l'opérateur via `openclaw tasks cancel` |
| `lost` | L'environnement d'exécution a perdu l'état de support faisant autorité après une période de grâce de 5 minutes |
| `timed_out` | A dépassé le délai dexpiration configuré |
| `cancelled` | Arrêtée par lopérateur via `openclaw tasks cancel` |
| `lost` | Le runtime a perdu létat de référence faisant autorité après un délai de grâce de 5 minutes |
Les transitions se produisent automatiquement — lorsque l'exécution d'agent associée se termine, l'état de la tâche est mis à jour en conséquence.
Les transitions se produisent automatiquement : lorsque lexécution dagent associée se termine, létat de la tâche est mis à jour en conséquence.
La fin de l'exécution d'agent fait autorité pour les enregistrements de tâches actifs. Une exécution détachée réussie se finalise en `succeeded`, les erreurs d'exécution ordinaires se finalisent en `failed`, et les résultats de délai expiré ou d'abandon se finalisent en `timed_out`. Si un opérateur a déjà annulé la tâche, ou si l'environnement d'exécution a déjà enregistré un état terminal plus fort comme `failed`, `timed_out` ou `lost`, un signal de réussite ultérieur ne rétrograde pas cet état terminal.
Lachèvement dexécution dagent fait autorité pour les enregistrements de tâche actifs. Une exécution détachée réussie se finalise en `succeeded`, les erreurs dexécution ordinaires se finalisent en `failed`, et les résultats dexpiration ou dabandon se finalisent en `timed_out`. Si un opérateur a déjà annulé la tâche, ou si le runtime a déjà enregistré un état terminal plus fort comme `failed`, `timed_out` ou `lost`, un signal de réussite ultérieur ne rétrograde pas cet état terminal.
`lost` tient compte de l'environnement d'exécution :
`lost` tient compte du runtime :
- Tâches ACP : les métadonnées de session enfant ACP de support ont disparu.
- Tâches de sous-agent : la session enfant de support a disparu du stockage de l'agent cible.
- Tâches Cron : l'environnement d'exécution Cron ne suit plus la tâche comme active et l'historique durable des exécutions Cron n'indique pas de résultat terminal pour cette exécution. L'audit CLI hors ligne ne considère pas son propre état d'exécution Cron en processus vide comme faisant autorité.
- Tâches CLI : les tâches de session enfant isolée utilisent la session enfant ; les tâches CLI adossées au chat utilisent plutôt le contexte d'exécution actif, de sorte que les lignes de session persistantes de canal/groupe/direct ne les maintiennent pas en vie. Les exécutions `openclaw agent` adossées au Gateway se finalisent aussi à partir de leur résultat d'exécution, de sorte que les exécutions terminées ne restent pas actives jusqu'à ce que le processus de nettoyage les marque `lost`.
- Tâches ACP : les métadonnées de session ACP enfant sous-jacentes ont disparu.
- Tâches de sous-agent : la session enfant sous-jacente a disparu du magasin de lagent cible.
- Tâches Cron : le runtime Cron ne suit plus la tâche comme active et lhistorique durable des exécutions Cron nindique pas de résultat terminal pour cette exécution. Laudit CLI hors ligne ne traite pas son propre état vide de runtime Cron en cours de processus comme faisant autorité.
- Tâches CLI : les tâches de session enfant isolée utilisent la session enfant ; les tâches CLI adossées au chat utilisent plutôt le contexte dexécution actif, donc les lignes persistantes de session canal/groupe/direct ne les maintiennent pas en vie. Les exécutions `openclaw agent` adossées au Gateway se finalisent aussi à partir de leur résultat dexécution, donc les exécutions terminées ne restent pas actives jusquà ce que le balayeur les marque `lost`.
## Livraison et notifications
Lorsqu'une tâche atteint un état terminal, OpenClaw vous notifie. Il existe deux chemins de livraison :
Lorsquune tâche atteint un état terminal, OpenClaw vous notifie. Il existe deux chemins de livraison :
**Livraison directe** — si la tâche a une cible de canal (le `requesterOrigin`), le message de finalisation va directement à ce canal (Telegram, Discord, Slack, etc.). Pour les finalisations de sous-agents, OpenClaw préserve aussi le routage de fil/sujet lié lorsqu'il est disponible et peut renseigner un `to` / compte manquant à partir de la route stockée dans la session du demandeur (`lastChannel` / `lastTo` / `lastAccountId`) avant d'abandonner la livraison directe.
**Livraison directe** — si la tâche a une cible de canal (le `requesterOrigin`), le message dachèvement va directement à ce canal (Telegram, Discord, Slack, etc.). Pour les achèvements de sous-agents, OpenClaw préserve aussi le routage lié au fil/sujet lorsquil est disponible et peut renseigner un `to` / compte manquant depuis la route stockée de la session demandeuse (`lastChannel` / `lastTo` / `lastAccountId`) avant dabandonner la livraison directe.
**Livraison mise en file d'attente de session** — si la livraison directe échoue ou si aucune origine n'est définie, la mise à jour est mise en file d'attente comme événement système dans la session du demandeur et apparaît au prochain Heartbeat.
**Livraison mise en file dattente de session** — si la livraison directe échoue ou quaucune origine nest définie, la mise à jour est mise en file dattente comme événement système dans la session du demandeur et apparaît au prochain Heartbeat.
<Tip>
La finalisation d'une tâche déclenche un réveil Heartbeat immédiat, afin que vous voyiez rapidement le résultat — vous n'avez pas besoin d'attendre la prochaine impulsion Heartbeat planifiée.
Lachèvement de tâche déclenche un réveil Heartbeat immédiat afin que vous voyiez rapidement le résultat : vous navez pas à attendre le prochain tick Heartbeat planifié.
</Tip>
Cela signifie que le flux de travail habituel repose sur les notifications : démarrez le travail détaché une fois, puis laissez l'environnement d'exécution vous réveiller ou vous notifier à la fin. Interrogez l'état des tâches uniquement lorsque vous avez besoin de débogage, d'intervention ou d'un audit explicite.
Cela signifie que le flux de travail habituel est fondé sur des notifications : démarrez le travail détaché une fois, puis laissez le runtime vous réveiller ou vous notifier à lachèvement. Sondez létat de la tâche uniquement lorsque vous avez besoin de débogage, dintervention ou dun audit explicite.
### Politiques de notification
Contrôlez la quantité d'informations que vous recevez pour chaque tâche :
Contrôlez le volume dinformations que vous recevez pour chaque tâche :
| Politique | Ce qui est livré |
| Politique | Ce qui est livré |
| --------------------- | ----------------------------------------------------------------------- |
| `done_only` (par défaut) | Seul l'état terminal (succeeded, failed, etc.) — **c'est la valeur par défaut** |
| `state_changes` | Chaque transition d'état et mise à jour de progression |
| `done_only` (par défaut) | Uniquement létat terminal (réussie, échouée, etc.) — **cest la valeur par défaut** |
| `state_changes` | Chaque transition détat et mise à jour de progression |
| `silent` | Rien du tout |
Modifiez la politique pendant qu'une tâche est en cours d'exécution :
Changez la politique pendant quune tâche sexécute :
```bash
openclaw tasks notify <lookup> state_changes
@ -192,7 +192,7 @@ openclaw tasks notify <lookup> state_changes
openclaw tasks list [--runtime <acp|subagent|cron|cli>] [--status <status>] [--json]
```
Colonnes de sortie : ID de tâche, Type, État, Livraison, ID d'exécution, Session enfant, Résumé.
Colonnes de sortie : ID de tâche, Type, État, Livraison, ID dexécution, Session enfant, Résumé.
</Accordion>
<Accordion title="tasks show">
@ -200,7 +200,7 @@ openclaw tasks notify <lookup> state_changes
openclaw tasks show <lookup>
```
Le jeton de recherche accepte un ID de tâche, un ID d'exécution ou une clé de session. Affiche l'enregistrement complet, notamment le minutage, l'état de livraison, l'erreur et le résumé terminal.
Le jeton de recherche accepte un ID de tâche, un ID dexécution ou une clé de session. Affiche lenregistrement complet, notamment la temporisation, létat de livraison, lerreur et le résumé terminal.
</Accordion>
<Accordion title="tasks cancel">
@ -208,7 +208,7 @@ openclaw tasks notify <lookup> state_changes
openclaw tasks cancel <lookup>
```
Pour les tâches ACP et de sous-agent, cela tue la session enfant. Pour les tâches suivies par la CLI, l'annulation est enregistrée dans le registre des tâches (il n'existe pas de handle d'exécution enfant séparé). L'état passe à `cancelled` et une notification de livraison est envoyée le cas échéant.
Pour les tâches ACP et de sous-agent, cela tue la session enfant. Pour les tâches suivies par la CLI, lannulation est enregistrée dans le registre des tâches (il nexiste pas de handle de runtime enfant séparé). Létat passe à `cancelled` et une notification de livraison est envoyée le cas échéant.
</Accordion>
<Accordion title="tasks notify">
@ -223,14 +223,14 @@ openclaw tasks notify <lookup> state_changes
Fait remonter les problèmes opérationnels. Les constats apparaissent aussi dans `openclaw status` lorsque des problèmes sont détectés.
| Finding | Severity | Trigger |
| Constat | Gravité | Déclencheur |
| ------------------------- | ---------- | ------------------------------------------------------------------------------------------------------------ |
| `stale_queued` | warn | En file d'attente depuis plus de 10 minutes |
| `stale_running` | error | En cours depuis plus de 30 minutes |
| `lost` | warn/error | La propriété de la tâche adossée au runtime a disparu ; les tâches perdues conservées émettent un avertissement jusqu'à `cleanupAfter`, puis deviennent des erreurs |
| `delivery_failed` | warn | La livraison a échoué et la politique de notification n'est pas `silent` |
| `missing_cleanup` | warn | Tâche terminale sans horodatage de nettoyage |
| `inconsistent_timestamps` | warn | Violation de chronologie (par exemple terminée avant d'avoir commencé) |
| `stale_queued` | warn | En file dattente depuis plus de 10 minutes |
| `stale_running` | error | En cours dexécution depuis plus de 30 minutes |
| `lost` | warn/error | La propriété de la tâche adossée à lexécution a disparu ; les tâches perdues conservées émettent un avertissement jusquà `cleanupAfter`, puis deviennent des erreurs |
| `delivery_failed` | warn | La livraison a échoué et la stratégie de notification nest pas `silent` |
| `missing_cleanup` | warn | Tâche terminale sans horodatage de nettoyage |
| `inconsistent_timestamps` | warn | Violation de la chronologie (par exemple, terminée avant davoir commencé) |
</Accordion>
<Accordion title="maintenance des tâches">
@ -239,47 +239,47 @@ openclaw tasks notify <lookup> state_changes
openclaw tasks maintenance --apply [--json]
```
Utilisez ceci pour prévisualiser ou appliquer la réconciliation, l'horodatage de nettoyage et l'élagage pour les tâches et l'état Task Flow.
Utilisez cette commande pour prévisualiser ou appliquer la réconciliation, lhorodatage du nettoyage et lélagage des tâches et de létat Task Flow.
La réconciliation tient compte du runtime :
La réconciliation tient compte de lexécution :
- Les tâches ACP/subagent vérifient leur session enfant sous-jacente.
- Les tâches de subagent dont la session enfant possède une tombe de récupération après redémarrage sont marquées comme perdues au lieu d'être traitées comme des sessions sous-jacentes récupérables.
- Les tâches Cron vérifient si le runtime cron possède toujours la tâche, puis récupèrent l'état terminal depuis les journaux d'exécution cron persistés/l'état de tâche avant de revenir à `lost`. Seul le processus Gateway fait autorité pour l'ensemble en mémoire des tâches cron actives ; l'audit CLI hors ligne utilise l'historique durable mais ne marque pas une tâche cron comme perdue uniquement parce que ce Set local est vide.
- Les tâches CLI adossées au chat vérifient le contexte d'exécution actif propriétaire, pas seulement la ligne de session de chat.
- Les tâches ACP/sous-agent vérifient leur session enfant sous-jacente.
- Les tâches de sous-agent dont la session enfant possède une pierre tombale de récupération après redémarrage sont marquées comme perdues au lieu dêtre traitées comme des sessions sous-jacentes récupérables.
- Les tâches Cron vérifient si lexécution cron possède toujours la tâche, puis récupèrent létat terminal depuis les journaux persistés des exécutions cron/létat de la tâche avant de basculer vers `lost`. Seul le processus Gateway fait autorité pour lensemble en mémoire des tâches actives cron ; laudit CLI hors ligne utilise lhistorique durable, mais ne marque pas une tâche cron comme perdue uniquement parce que ce Set local est vide.
- Les tâches CLI adossées au chat vérifient le contexte dexécution actif propriétaire, pas seulement la ligne de session de chat.
Le nettoyage d'achèvement tient aussi compte du runtime :
Le nettoyage de fin tient également compte de lexécution :
- L'achèvement d'un subagent ferme, au mieux, les onglets/processus de navigateur suivis pour la session enfant avant la poursuite du nettoyage d'annonce.
- L'achèvement d'un cron isolé ferme, au mieux, les onglets/processus de navigateur suivis pour la session cron avant que l'exécution ne se termine complètement.
- La livraison cron isolée attend le suivi des subagents descendants lorsque nécessaire et supprime le texte d'accusé de réception parent obsolète au lieu de l'annoncer.
- La livraison d'achèvement d'un subagent préfère le dernier texte d'assistant visible ; s'il est vide, elle se rabat sur le dernier texte d'outil/toolResult assaini, et les exécutions d'appels d'outil terminées uniquement par délai d'attente peuvent être réduites à un bref résumé de progression partielle. Les exécutions terminales échouées annoncent l'état d'échec sans rejouer le texte de réponse capturé.
- La fin dun sous-agent ferme au mieux les onglets de navigateur/processus suivis pour la session enfant avant la poursuite du nettoyage dannonce.
- La fin dun Cron isolé ferme au mieux les onglets de navigateur/processus suivis pour la session cron avant le démontage complet de lexécution.
- La livraison Cron isolée attend la suite dun sous-agent descendant si nécessaire et supprime le texte daccusé de réception parent obsolète au lieu de lannoncer.
- La livraison de fin dun sous-agent privilégie le dernier texte dassistant visible ; sil est vide, elle se rabat sur le dernier texte doutil/toolResult assaini, et les exécutions avec appels doutils uniquement interrompues par expiration peuvent être réduites à un court résumé de progression partielle. Les exécutions terminales en échec annoncent létat déchec sans rejouer le texte de réponse capturé.
- Les échecs de nettoyage ne masquent pas le résultat réel de la tâche.
</Accordion>
<Accordion title="tasks flow list | show | cancel">
<Accordion title="lister | afficher | annuler le flux de tâches">
```bash
openclaw tasks flow list [--status <status>] [--json]
openclaw tasks flow show <lookup> [--json]
openclaw tasks flow cancel <lookup>
```
Utilisez ces commandes lorsque le Task Flow orchestrateur est ce qui vous intéresse, plutôt qu'un enregistrement individuel de tâche en arrière-plan.
Utilisez ces commandes lorsque le Task Flow orchestrateur est ce qui vous intéresse, plutôt quun enregistrement individuel de tâche en arrière-plan.
</Accordion>
</AccordionGroup>
## Tableau des tâches de chat (`/tasks`)
## Tableau de tâches du chat (`/tasks`)
Utilisez `/tasks` dans n'importe quelle session de chat pour voir les tâches en arrière-plan liées à cette session. Le tableau affiche les tâches actives et récemment terminées avec le runtime, l'état, les informations de durée, et les détails de progression ou d'erreur.
Utilisez `/tasks` dans nimporte quelle session de chat pour voir les tâches en arrière-plan liées à cette session. Le tableau affiche les tâches actives et récemment terminées avec lexécution, létat, le minutage et les détails de progression ou derreur.
Lorsque la session actuelle n'a aucune tâche liée visible, `/tasks` se rabat sur les compteurs de tâches locaux à l'agent afin que vous obteniez tout de même une vue d'ensemble sans divulguer les détails d'autres sessions.
Lorsque la session actuelle na aucune tâche liée visible, `/tasks` se rabat sur les nombres de tâches locales à lagent afin de vous donner tout de même une vue densemble sans divulguer les détails dautres sessions.
Pour le registre opérateur complet, utilisez la CLI : `openclaw tasks list`.
## Intégration de l'état (pression des tâches)
## Intégration de létat (pression des tâches)
`openclaw status` inclut un résumé rapide des tâches :
`openclaw status` inclut un résumé des tâches en un coup dœil :
```
Tasks: 3 queued · 2 running · 1 issues
@ -289,80 +289,79 @@ Le résumé indique :
- **actives** — nombre de `queued` + `running`
- **échecs** — nombre de `failed` + `timed_out` + `lost`
- **byRuntime**répartition par `acp`, `subagent`, `cron`, `cli`
- **byRuntime**ventilation par `acp`, `subagent`, `cron`, `cli`
`/status` et l'outil `session_status` utilisent tous deux un instantané des tâches tenant compte du nettoyage : les tâches actives sont privilégiées, les lignes terminées obsolètes sont masquées, et les échecs récents ne s'affichent que lorsqu'aucun travail actif ne reste. Cela garde la carte d'état concentrée sur ce qui compte maintenant.
`/status` et loutil `session_status` utilisent tous deux un instantané des tâches tenant compte du nettoyage : les tâches actives sont privilégiées, les lignes terminées obsolètes sont masquées et les échecs récents napparaissent que lorsquil ne reste aucun travail actif. Cela garde la carte détat centrée sur ce qui compte maintenant.
## Stockage et maintenance
### Où résident les tâches
### Où vivent les tâches
Les enregistrements de tâches persistent dans SQLite à :
Les enregistrements de tâches persistent dans SQLite à lemplacement suivant :
```
$OPENCLAW_STATE_DIR/tasks/runs.sqlite
```
Le registre est chargé en mémoire au démarrage du Gateway et synchronise les écritures vers SQLite pour assurer la durabilité entre les redémarrages.
Le Gateway maintient le journal write-ahead log de SQLite borné en utilisant le seuil
d'autocheckpoint par défaut de SQLite ainsi que des points de contrôle `TRUNCATE` périodiques et à l'arrêt.
Le Gateway maintient le journal décriture anticipée SQLite dans des limites définies en utilisant le seuil dautocheckpoint par défaut de SQLite, plus des points de contrôle `TRUNCATE` périodiques et à larrêt.
### Maintenance automatique
Un balayeur s'exécute toutes les **60 secondes** et gère quatre choses :
Un balayeur sexécute toutes les **60 secondes** et gère quatre éléments :
<Steps>
<Step title="Réconciliation">
Vérifie si les tâches actives ont toujours un support runtime faisant autorité. Les tâches ACP/subagent utilisent l'état de session enfant, les tâches cron utilisent la propriété des tâches actives, et les tâches CLI adossées au chat utilisent le contexte d'exécution propriétaire. Si cet état sous-jacent a disparu depuis plus de 5 minutes, la tâche est marquée `lost`.
Vérifie si les tâches actives disposent toujours dun support dexécution faisant autorité. Les tâches ACP/sous-agent utilisent létat de session enfant, les tâches cron utilisent la propriété des tâches actives, et les tâches CLI adossées au chat utilisent le contexte dexécution propriétaire. Si cet état sous-jacent a disparu depuis plus de 5 minutes, la tâche est marquée `lost`.
</Step>
<Step title="Réparation de session ACP">
Ferme les sessions ACP terminales ou orphelines à exécution unique appartenant au parent, et ferme les sessions ACP persistantes terminales ou orphelines obsolètes uniquement lorsqu'aucune liaison de conversation active ne reste.
<Step title="Réparation des sessions ACP">
Ferme les sessions ACP ponctuelles terminales ou orphelines appartenant au parent, et ferme les sessions ACP persistantes terminales ou orphelines obsolètes uniquement lorsquil ne reste aucune liaison de conversation active.
</Step>
<Step title="Horodatage de nettoyage">
Définit un horodatage `cleanupAfter` sur les tâches terminales (endedAt + 7 jours). Pendant la rétention, les tâches perdues apparaissent encore dans l'audit comme avertissements ; après l'expiration de `cleanupAfter` ou lorsque les métadonnées de nettoyage manquent, ce sont des erreurs.
<Step title="Horodatage du nettoyage">
Définit un horodatage `cleanupAfter` sur les tâches terminales (endedAt + 7 jours). Pendant la rétention, les tâches perdues apparaissent encore dans laudit comme avertissements ; après lexpiration de `cleanupAfter` ou lorsque les métadonnées de nettoyage sont manquantes, elles sont des erreurs.
</Step>
<Step title="Élagage">
Supprime les enregistrements après leur date `cleanupAfter`.
Supprime les enregistrements dont la date `cleanupAfter` est dépassée.
</Step>
</Steps>
<Note>
**Rétention :** les enregistrements de tâches terminales sont conservés pendant **7 jours**, puis automatiquement élagués. Aucune configuration nécessaire.
**Rétention :** les enregistrements de tâches terminales sont conservés pendant **7 jours**, puis automatiquement élagués. Aucune configuration requise.
</Note>
## Relation des tâches avec les autres systèmes
<AccordionGroup>
<Accordion title="Tâches et Task Flow">
[Task Flow](/fr/automation/taskflow) est la couche d'orchestration de flux au-dessus des tâches en arrière-plan. Un flux unique peut coordonner plusieurs tâches au cours de sa durée de vie à l'aide de modes de synchronisation gérés ou en miroir. Utilisez `openclaw tasks` pour inspecter les enregistrements de tâches individuels et `openclaw tasks flow` pour inspecter le flux orchestrateur.
[Task Flow](/fr/automation/taskflow) est la couche dorchestration de flux au-dessus des tâches en arrière-plan. Un même flux peut coordonner plusieurs tâches au cours de sa durée de vie au moyen de modes de synchronisation gérés ou miroir. Utilisez `openclaw tasks` pour inspecter les enregistrements de tâches individuels et `openclaw tasks flow` pour inspecter le flux orchestrateur.
Consultez [Task Flow](/fr/automation/taskflow) pour plus de détails.
</Accordion>
<Accordion title="Tâches et cron">
Une **définition** de tâche cron réside dans `~/.openclaw/cron/jobs.json` ; l'état d'exécution runtime réside à côté, dans `~/.openclaw/cron/jobs-state.json`. **Chaque** exécution cron crée un enregistrement de tâche — à la fois pour les sessions principales et isolées. Les tâches cron de session principale utilisent par défaut la politique de notification `silent` afin d'être suivies sans générer de notifications.
Une **définition** de tâche cron se trouve dans `~/.openclaw/cron/jobs.json` ; létat dexécution à lexécution se trouve à côté, dans `~/.openclaw/cron/jobs-state.json`. **Chaque** exécution cron crée un enregistrement de tâche, quelle soit en session principale ou isolée. Les tâches cron en session principale utilisent par défaut la stratégie de notification `silent`, ce qui leur permet dêtre suivies sans générer de notifications.
Consultez [Tâches Cron](/fr/automation/cron-jobs).
</Accordion>
<Accordion title="Tâches et Heartbeat">
Les exécutions Heartbeat sont des tours de session principale — elles ne créent pas d'enregistrements de tâches. Lorsqu'une tâche se termine, elle peut déclencher un réveil Heartbeat afin que vous voyiez rapidement le résultat.
Les exécutions Heartbeat sont des tours de session principale ; elles ne créent pas denregistrements de tâches. Lorsquune tâche se termine, elle peut déclencher un réveil Heartbeat afin que vous voyiez rapidement le résultat.
Consultez [Heartbeat](/fr/gateway/heartbeat).
</Accordion>
<Accordion title="Tâches et sessions">
Une tâche peut référencer une `childSessionKey` (où le travail s'exécute) et une `requesterSessionKey` (qui l'a démarrée). Les sessions sont le contexte de conversation ; les tâches sont le suivi d'activité par-dessus.
Une tâche peut référencer un `childSessionKey` (où le travail sexécute) et un `requesterSessionKey` (qui la démarrée). Les sessions constituent le contexte de conversation ; les tâches ajoutent un suivi dactivité par-dessus.
</Accordion>
<Accordion title="Tâches et exécutions d'agent">
Le `runId` d'une tâche établit un lien vers l'exécution d'agent qui effectue le travail. Les événements du cycle de vie de l'agent (début, fin, erreur) mettent automatiquement à jour l'état de la tâche — vous n'avez pas besoin de gérer le cycle de vie manuellement.
<Accordion title="Tâches et exécutions dagent">
Le `runId` dune tâche pointe vers lexécution dagent qui effectue le travail. Les événements de cycle de vie de lagent (début, fin, erreur) mettent automatiquement à jour létat de la tâche ; vous navez pas besoin de gérer le cycle de vie manuellement.
</Accordion>
</AccordionGroup>
## Connexe
- [Automatisation et tâches](/fr/automation) — tous les mécanismes d'automatisation en un coup d'œil
- [Automatisation et tâches](/fr/automation) — tous les mécanismes dautomatisation en un coup dœil
- [CLI : tâches](/fr/cli/tasks) — référence des commandes CLI
- [Heartbeat](/fr/gateway/heartbeat) — tours périodiques de session principale
- [Tâches planifiées](/fr/automation/cron-jobs) — planifier du travail en arrière-plan
- [Heartbeat](/fr/gateway/heartbeat) — tours périodiques en session principale
- [Tâches planifiées](/fr/automation/cron-jobs) — planification du travail en arrière-plan
- [Task Flow](/fr/automation/taskflow) — orchestration de flux au-dessus des tâches

View File

@ -1,25 +1,25 @@
---
read_when:
- Travailler sur les fonctionnalités Telegram ou les Webhooks
summary: État de la prise en charge, fonctionnalités et configuration du bot Telegram
summary: État de prise en charge du bot Telegram, capacités et configuration
title: Telegram
x-i18n:
generated_at: "2026-05-04T09:37:03Z"
generated_at: "2026-05-05T06:16:04Z"
model: gpt-5.5
provider: openai
source_hash: 5711d53cf908a14024bc5a94f7d590bb4bcb6963a1d78049d7782871f4eae932
source_hash: 03c75169335378482b80f1ceb669cefaa034ad3e589cf5f1d14c8252608ee46a
source_path: channels/telegram.md
workflow: 16
---
Prêt pour la production pour les messages privés et les groupes de bots via grammY. Linterrogation longue est le mode par défaut ; le mode Webhook est facultatif.
Prêt pour la production pour les MP de bots et les groupes via grammY. Le mode par défaut est le long polling ; le mode Webhook est facultatif.
<CardGroup cols={3}>
<Card title="Appairage" icon="link" href="/fr/channels/pairing">
La politique de messages privés par défaut pour Telegram est lappairage.
La politique de MP 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.
Diagnostics multicanaux et guides de réparation.
</Card>
<Card title="Configuration du Gateway" icon="settings" href="/fr/gateway/configuration">
Modèles et exemples complets de configuration de canal.
@ -30,13 +30,13 @@ Prêt pour la production pour les messages privés et les groupes de bots via gr
<Steps>
<Step title="Créer le jeton du bot dans BotFather">
Ouvrez Telegram et discutez avec **@BotFather** (confirmez que lidentifiant est exactement `@BotFather`).
Ouvrez Telegram et discutez avec **@BotFather** (vérifiez que lidentifiant est exactement `@BotFather`).
Exécutez `/newbot`, suivez les invites et enregistrez le jeton.
</Step>
<Step title="Configurer le jeton et la politique de messages privés">
<Step title="Configurer le jeton et la politique de MP">
```json5
{
@ -51,12 +51,12 @@ Prêt pour la production pour les messages privés et les groupes de bots via gr
}
```
Solution de repli par env : `TELEGRAM_BOT_TOKEN=...` (compte par défaut uniquement).
Repli env : `TELEGRAM_BOT_TOKEN=...` (compte par défaut uniquement).
Telegram nutilise **pas** `openclaw channels login telegram` ; configurez le jeton dans la config/lenv, 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 MP">
```bash
openclaw gateway
@ -69,26 +69,26 @@ openclaw pairing approve telegram <CODE>
</Step>
<Step title="Ajouter le bot à un groupe">
Ajoutez le bot à votre groupe, puis définissez `channels.telegram.groups` et `groupPolicy` pour correspondre à votre modèle daccès.
Ajoutez le bot à votre groupe, puis définissez `channels.telegram.groups` et `groupPolicy` selon votre modèle daccès.
</Step>
</Steps>
<Note>
Lordre de résolution du jeton tient compte du compte. En pratique, les valeurs de configuration lemportent sur la solution de repli par env, 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 config priment sur le repli env, et `TELEGRAM_BOT_TOKEN` sapplique uniquement au compte par défaut.
</Note>
## Paramètres côté Telegram
<AccordionGroup>
<Accordion title="Mode confidentialité et visibilité des groupes">
Les bots Telegram utilisent par défaut le **mode confidentialité**, qui limite les messages de groupe quils reçoivent.
Les bots Telegram utilisent par défaut le **Mode confidentialité**, qui limite les messages de groupe quils reçoivent.
Si le bot doit voir tous les messages de groupe, vous pouvez soit :
Si le bot doit voir tous les messages de groupe, vous pouvez :
- désactiver le mode confidentialité via `/setprivacy`, soit
- désactiver le mode confidentialité via `/setprivacy`, ou
- faire du bot un administrateur du groupe.
Lorsque vous activez ou désactivez le mode confidentialité, supprimez puis rajoutez le bot dans chaque groupe afin que Telegram applique le changement.
Lorsque vous changez le mode confidentialité, supprimez puis rajoutez le bot dans chaque groupe pour que Telegram applique le changement.
</Accordion>
@ -101,8 +101,8 @@ Lordre de résolution du jeton tient compte du compte. En pratique, les valeu
<Accordion title="Options BotFather utiles">
- `/setjoingroups` pour autoriser/refuser les ajouts à des groupes
- `/setprivacy` pour le comportement de visibilité dans les groupes
- `/setjoingroups` pour autoriser/refuser les ajouts aux groupes
- `/setprivacy` pour le comportement de visibilité en groupe
</Accordion>
</AccordionGroup>
@ -110,7 +110,7 @@ Lordre de résolution du jeton tient compte du compte. En pratique, les valeu
## Contrôle daccès et activation
<Tabs>
<Tab title="Politique de messages privés">
<Tab title="Politique de MP">
`channels.telegram.dmPolicy` contrôle laccès aux messages directs :
- `pairing` (par défaut)
@ -118,27 +118,27 @@ Lordre de résolution du jeton tient compte du compte. En pratique, les valeu
- `open` (nécessite que `allowFrom` inclue `"*"`)
- `disabled`
`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 devraient utiliser `allowlist` avec des ID utilisateur numériques.
`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 multicompte, un `channels.telegram.allowFrom` restrictif au niveau supérieur 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 joker explicite après fusion.
`dmPolicy: "allowlist"` avec `allowFrom` vide bloque tous les messages privés et est rejeté par la validation de configuration.
Dans les configurations multicomptes, un `channels.telegram.allowFrom` restrictif au niveau supérieur 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 encore un joker explicite après fusion.
`dmPolicy: "allowlist"` avec `allowFrom` vide bloque tous les MP et est rejeté par la validation de config.
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 vous appuyiez précédemment 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).
Si vous avez effectué une mise à niveau et que votre config contient des entrées de liste dautorisation `@username`, exécutez `openclaw doctor --fix` pour les résoudre (meilleur effort ; nécessite un jeton de bot Telegram).
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 `allowFrom` explicites afin de conserver une politique daccès durable dans la configuration (plutôt que de dépendre des approbations dappairage précédentes).
Pour les bots à propriétaire unique, préférez `dmPolicy: "allowlist"` avec des ID `allowFrom` numériques explicites afin de conserver une politique daccès durable dans la config (au lieu de dépendre dapprobations dappairage précédentes).
Confusion fréquente : lapprobation dappairage des messages privés ne signifie pas « cet expéditeur est autorisé partout ».
Lappairage accorde laccès aux messages privés. 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 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 fréquente : lapprobation dappairage en MP ne signifie pas « cet expéditeur est autorisé partout ».
Lappairage accorde laccès aux MP. Si aucun propriétaire de commandes 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 disposent dun compte opérateur explicite.
Lautorisation des expéditeurs de groupe provient toujours des listes dautorisation explicites de la config.
Si vous voulez « je suis autorisé une fois et les MP 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, vérifiez que `commands.ownerAllowFrom` contient `telegram:<your user id>`.
### Trouver votre ID utilisateur Telegram
Plus sûr (sans bot tiers) :
1. Envoyez un message privé à votre bot.
1. Envoyez un MP à votre bot.
2. Exécutez `openclaw logs --follow`.
3. Lisez `from.id`.
@ -157,7 +157,7 @@ curl "https://api.telegram.org/bot<bot_token>/getUpdates"
1. **Quels groupes sont autorisés** (`channels.telegram.groups`)
- aucune config `groups` :
- avec `groupPolicy: "open"` : tout groupe peut réussir les contrôles dID de groupe
- 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 liste dautorisation (ID explicites ou `"*"`)
@ -168,13 +168,13 @@ curl "https://api.telegram.org/bot<bot_token>/getUpdates"
`groupAllowFrom` est utilisé pour le filtrage des 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 chat de groupe ou de supergroupe Telegram dans `groupAllowFrom`. Les ID de chat négatifs appartiennent à `channels.telegram.groups`.
Les entrées non numériques sont ignorées pour lautorisation des expéditeurs.
Limite de sécurité (`2026.2.25+`) : lauthentification des expéditeurs de groupe nhérite **pas** des approbations du magasin dappairage de messages privés.
Lappairage reste limité aux messages privés. Pour les groupes, définissez `groupAllowFrom` ou `allowFrom` par groupe/par sujet.
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 dexpéditeur.
Limite de sécurité (`2026.2.25+`) : lauthentification des expéditeurs de groupe nhérite **pas** des approbations du magasin dappairage en MP.
Lappairage reste limité aux MP. Pour les groupes, définissez `groupAllowFrom` ou `allowFrom` par groupe/par sujet.
Si `groupAllowFrom` nest pas défini, Telegram se rabat sur la config `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 complètement absent, lexécution utilise par défaut `groupPolicy="allowlist"` en échec fermé, sauf si `channels.defaults.groupPolicy` est explicitement défini.
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 utilise par défaut `groupPolicy="allowlist"` avec échec fermé, sauf si `channels.defaults.groupPolicy` est explicitement défini.
Exemple : autoriser nimporte quel membre dans un groupe spécifique :
@ -214,8 +214,8 @@ curl "https://api.telegram.org/bot<bot_token>/getUpdates"
Erreur fréquente : `groupAllowFrom` nest pas une liste dautorisation de groupes Telegram.
- 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 qui, dans un groupe autorisé, peuvent déclencher le bot.
- Utilisez `groupAllowFrom: ["*"]` uniquement lorsque vous voulez que tout membre dun groupe autorisé puisse parler au bot.
- Placez les ID utilisateur Telegram comme `8734062810` sous `groupAllowFrom` lorsque vous voulez limiter les personnes qui peuvent déclencher le bot dans un groupe autorisé.
- Utilisez `groupAllowFrom: ["*"]` uniquement lorsque vous voulez que nimporte quel membre dun groupe autorisé puisse parler au bot.
</Warning>
@ -224,10 +224,10 @@ curl "https://api.telegram.org/bot<bot_token>/getUpdates"
<Tab title="Comportement des mentions">
Les réponses de groupe nécessitent 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`
@ -236,9 +236,9 @@ curl "https://api.telegram.org/bot<bot_token>/getUpdates"
- `/activation always`
- `/activation mention`
Celles-ci ne mettent à jour que létat de la session. Utilisez la configuration pour la persistance.
Elles mettent uniquement à jour létat de session. Utilisez la config pour la persistance.
Exemple de configuration persistante :
Exemple de config persistante :
```json5
{
@ -252,7 +252,7 @@ curl "https://api.telegram.org/bot<bot_token>/getUpdates"
}
```
Obtenir lID du chat de groupe :
Obtenir lID de chat du groupe :
- transférer un message de groupe à `@userinfobot` / `@getidsbot`
- ou lire `chat.id` depuis `openclaw logs --follow`
@ -261,16 +261,16 @@ curl "https://api.telegram.org/bot<bot_token>/getUpdates"
</Tab>
</Tabs>
## Comportement à lexécution
## Comportement dexécution
- Telegram est géré par le processus Gateway.
- Le routage est déterministe : les réponses entrantes de 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 conserve lID de fil pour les réponses mais garde par défaut les messages privés 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 sujets en messages privés.
- Linterrogation longue utilise grammY runner avec un séquençage par chat/par fil. La concurrence globale du récepteur du runner utilise `agents.defaults.maxConcurrent`.
- Linterrogation longue est protégée dans chaque processus Gateway afin quun seul poller actif puisse utiliser un jeton de bot à la fois. Si vous voyez toujours des conflits `getUpdates` 409, un autre Gateway OpenClaw, script ou poller externe utilise probablement le même jeton.
- Les redémarrages de surveillance de linterrogation longue se déclenchent par défaut après 120 secondes sans liveness `getUpdates` terminée. Augmentez `channels.telegram.pollingStallThresholdMs` uniquement si votre déploiement voit encore de faux redémarrages pour blocage dinterrogation pendant des travaux de longue durée. La valeur est en millisecondes et est autorisée de `30000` à `600000` ; les remplacements par compte sont pris en charge.
- Telegram appartient au processus Gateway.
- Le routage est déterministe : les entrées Telegram répondent 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édia.
- Les sessions de groupe sont isolées par ID de groupe. Les sujets de forum ajoutent `:topic:<threadId>` pour maintenir lisolation des sujets.
- Les messages MP peuvent transporter `message_thread_id` ; OpenClaw préserve lID de fil pour les réponses, mais conserve les MP sur la session plate par défaut. Configurez `channels.telegram.dm.threadReplies: "inbound"`, `channels.telegram.direct.<chatId>.threadReplies: "inbound"`, `requireTopic: true`, ou une config de sujet correspondante lorsque vous voulez intentionnellement isoler les sessions par sujet de MP.
- Le long polling utilise le runner grammY avec séquencement par chat/par fil. La concurrence globale du collecteur 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, script ou poller externe utilise probablement le même jeton.
- Les redémarrages du chien de garde de long polling 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 de polling 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
@ -285,12 +285,12 @@ curl "https://api.telegram.org/bot<bot_token>/getUpdates"
Exigence :
- `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
- `progress` conserve un brouillon de statut modifiable et le met à jour avec la progression des outils jusquà la livraison finale
- `streaming.preview.toolProgress` contrôle si les mises à jour doutil/de progression réutilisent le même message daperçu modifié (par défaut : `true` lorsque le streaming daperçu est actif)
- `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` (libellé doutil uniquement)
- `streaming.preview.commandText` contrôle le détail de commande/dexécution dans ces lignes de progression doutil : `raw` (par défaut, préserve le comportement publié) ou `status` (étiquette doutil 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 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 patch. Telegram les garde activées par défaut pour 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 doutil, définissez :
Les mises à jour daperçu de progression doutil sont les courtes lignes de statut affichées pendant lexécution des outils, par exemple lexécution de commandes, la lecture 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 les versions ultérieures. Pour conserver laperçu modifié pour le texte de réponse tout en masquant les lignes de progression doutil, définissez :
```json
{
@ -307,7 +307,7 @@ curl "https://api.telegram.org/bot<bot_token>/getUpdates"
}
```
Pour garder la progression des outils visible mais masquer le texte de commande/dexécution, définissez :
Pour garder la progression doutil visible mais masquer le texte de commande/dexécution, définissez :
```json
{
@ -324,7 +324,7 @@ curl "https://api.telegram.org/bot<bot_token>/getUpdates"
}
```
Pour le mode brouillon de progression, placez la même stratégie de texte de commande sous `streaming.progress`:
Pour le mode brouillon de progression, placez la même politique de texte de commande sous `streaming.progress` :
```json
{
@ -342,26 +342,27 @@ curl "https://api.telegram.org/bot<bot_token>/getUpdates"
}
```
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 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.
Utilisez `streaming.mode: "off"` uniquement lorsque vous voulez une livraison finale seulement : les modifications daperçu Telegram sont désactivées et les bavardages génériques doutil/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 de loutil.
<Note>
Les réponses à 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 natives avec citation, ou définissez `streaming.preview.toolProgress: false` pour accepter ce compromis.
Les réponses Telegram à citation sélectionnée sont lexception. Lorsque `replyToMode` vaut `"first"`, `"all"` ou `"batched"` et que le message entrant inclut un 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 ; `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.
</Note>
Pour les réponses texte uniquement:
Pour les réponses en texte uniquement :
- 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, afin que la réponse finale apparaisse après la sortie intermédiaire
- aperçus datant de plus denviron une minute: OpenClaw envoie la réponse terminée comme nouveau message final puis nettoie laperçu, afin que lhorodatage visible de Telegram reflète lheure dachèvement plutôt que lheure de création de laperçu
- aperçus courts de DM/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
- les textes finaux longs qui se divisent en plusieurs messages Telegram réutilisent si possible laperçu existant comme premier fragment final, puis envoient uniquement les fragments restants
- 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, afin 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, afin 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 séparé du streaming par blocs. Lorsque le streaming par blocs est explicitement activé pour Telegram, OpenClaw ignore le flux daperçu afin déviter un double streaming.
Flux de raisonnement propre à Telegram:
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
- `/reasoning stream` envoie le raisonnement dans laperçu en direct pendant la génération
- laperçu de 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>
@ -370,7 +371,7 @@ curl "https://api.telegram.org/bot<bot_token>/getUpdates"
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é pour réduire les échecs danalyse Telegram.
- Le HTML brut du modèle est échappé afin de 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`.
@ -378,13 +379,13 @@ curl "https://api.telegram.org/bot<bot_token>/getUpdates"
</Accordion>
<Accordion title="Commandes natives et commandes personnalisées">
Linscription du menu de commandes Telegram est gérée 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:
Valeurs par défaut des commandes natives :
- `commands.native: "auto"` active les commandes natives pour Telegram
Ajoutez des entrées de menu de commandes personnalisées:
Ajoutez des entrées de menu de commandes personnalisées :
```json5
{
@ -399,49 +400,49 @@ curl "https://api.telegram.org/bot<bot_token>/getUpdates"
}
```
Règles:
Règles :
- les noms sont normalisés (suppression du `/` initial, minuscules)
- motif valide: `a-z`, `0-9`, `_`, longueur `1..32`
- 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 journalisés
- les conflits/doublons sont ignorés et consignés
Notes:
Notes :
- les commandes personnalisées ne sont que des entrées de menu; elles nimplémentent pas automatiquement un comportement
- les commandes de plugin/skill peuvent toujours fonctionner lorsquelles sont saisies, même si elles ne sont pas affichées dans le menu Telegram
- les commandes personnalisées sont uniquement des entrées de menu ; elles nimplémentent pas automatiquement un comportement
- 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 sinscrire 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:
Échecs de configuration courants :
- `setMyCommands failed` avec `BOT_COMMANDS_TOO_MUCH` signifie que le menu Telegram dépassait encore la limite 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 suffixe accidentel `/bot<TOKEN>`.
- `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, donc ce nest pas signalé comme un échec de nettoyage de Webhook.
- `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/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 la Bot API 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 la Bot API, 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 nest donc pas 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é.
### Commandes dassociation 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
2. collez le code dans lapplication iOS
3. `/pair pending` liste les demandes en attente (y compris rôle/portées)
4. approuvez la demande:
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 de courte durée. 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, donc 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.
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 opé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 ; cette liste dautorisation dopérateur ne satisfait donc que les demandes dopérateur, et 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 précédente en attente est remplacée et la nouvelle demande utilise un autre `requestId`. Relancez `/pair pending` avant dapprouver.
Si un appareil réessaie avec des détails dauthentification modifiés (par exemple rôle/portées/clé publique), la demande précédente en attente est remplacée et la nouvelle demande utilise un `requestId` différent. Relancez `/pair pending` avant dapprouver.
Plus de détails: [Association](/fr/channels/pairing#pair-via-telegram-recommended-for-ios).
Plus de détails : [Appairage](/fr/channels/pairing#pair-via-telegram-recommended-for-ios).
</Accordion>
<Accordion title="Boutons intégrés">
Configurez la portée du clavier intégré:
<Accordion title="Boutons en ligne">
Configurez la portée du clavier en ligne :
```json5
{
@ -455,7 +456,7 @@ curl "https://api.telegram.org/bot<bot_token>/getUpdates"
}
```
Remplacement par compte:
Remplacement par compte :
```json5
{
@ -473,7 +474,7 @@ curl "https://api.telegram.org/bot<bot_token>/getUpdates"
}
```
Portées:
Portées :
- `off`
- `dm`
@ -483,7 +484,7 @@ curl "https://api.telegram.org/bot<bot_token>/getUpdates"
Lancien `capabilities: ["inlineButtons"]` correspond à `inlineButtons: "all"`.
Exemple daction de message:
Exemple daction de message :
```json5
{
@ -501,71 +502,71 @@ curl "https://api.telegram.org/bot<bot_token>/getUpdates"
}
```
Les clics de rappel sont transmis à lagent comme texte:
Les clics de rappel sont transmis à lagent sous forme de texte :
`callback_data: <value>`
</Accordion>
<Accordion title="Actions de message Telegram pour agents et automatisation">
Les actions doutil Telegram incluent:
<Accordion title="Actions de message Telegram pour les agents et lautomatisation">
Les actions doutil Telegram incluent :
- `sendMessage` (`to`, `content`, optionnel `mediaUrl`, `replyToMessageId`, `messageThreadId`)
- `sendMessage` (`to`, `content`, `mediaUrl` facultatif, `replyToMessageId`, `messageThreadId`)
- `react` (`chatId`, `messageId`, `emoji`)
- `deleteMessage` (`chatId`, `messageId`)
- `editMessage` (`chatId`, `messageId`, `content`)
- `createForumTopic` (`chatId`, `name`, optionnel `iconColor`, `iconCustomEmojiId`)
- `createForumTopic` (`chatId`, `name`, `iconColor` facultatif, `iconCustomEmojiId`)
Les actions de message de canal exposent des alias ergonomiques (`send`, `react`, `delete`, `edit`, `sticker`, `sticker-search`, `topic-create`).
Contrôles de garde:
Contrôles de verrouillage :
- `channels.telegram.actions.sendMessage`
- `channels.telegram.actions.deleteMessage`
- `channels.telegram.actions.reactions`
- `channels.telegram.actions.sticker` (par défaut: désactivé)
- `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 à lexécution utilisent linstantané actif de configuration/secrets (démarrage/rechargement), donc les chemins daction ne réévaluent pas les SecretRef ad hoc à chaque envoi.
Remarque : `edit` et `topic-create` sont actuellement activés par défaut et nont pas de bascules `channels.telegram.actions.*` séparées.
Les envois à lexécution utilisent linstantané actif de configuration/secrets (démarrage/rechargement), les chemins daction ne réeffectuent donc pas de résolution SecretRef ad hoc à chaque envoi.
Sémantique de suppression des réactions: [/tools/reactions](/fr/tools/reactions)
Sémantique de suppression des réactions : [/tools/reactions](/fr/tools/reactions)
</Accordion>
<Accordion title="Balises de fils 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éponse">
Telegram prend en charge des balises explicites de fil de réponse 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 la gestion :
- `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éponse 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 ; les messages plus longs sont donc 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_*]]` sont toujours respectées.
Remarque : `off` désactive le fil de réponse implicite. Les balises explicites `[[reply_to_*]]` sont toujours honorées.
</Accordion>
<Accordion title="Sujets de forum et comportement des fils">
Supergroupes de forum:
Supergroupes de forum :
- les clés de session de sujet ajoutent `:topic:<threadId>`
- les réponses et lindication de saisie ciblent le fil du sujet
- chemin de configuration du sujet:
- les réponses et la saisie ciblent le fil du sujet
- chemin de configuration du sujet :
`channels.telegram.groups.<chatId>.topics.<threadId>`
Cas particulier du sujet général (`threadId=1`):
Cas particulier du sujet général (`threadId=1`) :
- 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 de sujet: les entrées de sujet héritent des paramètres de groupe sauf remplacement (`requireMention`, `allowFrom`, `skills`, `systemPrompt`, `enabled`, `groupPolicy`).
Héritage de sujet : 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 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 propre mémoire et sa propre session isolés. Exemple:
**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 :
```json5
{
@ -585,13 +586,13 @@ curl "https://api.telegram.org/bot<bot_token>/getUpdates"
}
```
Chaque sujet a ensuite sa propre clé de session: `agent:zu:telegram:group:-1001234567890:topic:3`
Chaque sujet possède alors sa propre clé de session : `agent:zu:telegram:group:-1001234567890:topic:3`
**Liaison persistante de sujet ACP**: les sujets de forum peuvent épingler les sessions de harnais ACP au moyen de liaisons ACP typées de premier niveau (`bindings[]` avec `type: "acp"` et `match.channel: "telegram"`, `peer.kind: "group"`, et un id qualifié par sujet comme `-1001234567890:topic:42`). Actuellement limité aux sujets de forum dans les groupes/supergroupes. Consultez [Agents ACP](/fr/tools/acp-agents).
**Liaison persistante de sujet ACP** : Les sujets de forum peuvent épingler les sessions de harnais ACP via des liaisons ACP typées de niveau supérieur (`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. Voir [Agents ACP](/fr/tools/acp-agents).
**Création ACP liée au fil depuis la discussion**: `/acp spawn <agent> --thread here|auto` lie le sujet courant à une nouvelle session ACP; les messages suivants y sont routés directement. OpenClaw épingle la confirmation de création dans le sujet. Nécessite que `channels.telegram.threadBindings.spawnSessions` reste activé (par défaut: `true`).
**Création ACP liée 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 création dans le sujet. Nécessite que `channels.telegram.threadBindings.spawnSessions` reste activé (par défaut : `true`).
Le contexte du modèle expose `MessageThreadId` et `IsForum`. Les discussions en 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.
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 les 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>
@ -601,10 +602,10 @@ curl "https://api.telegram.org/bot<bot_token>/getUpdates"
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
- balise `[[audio_as_voice]]` dans la réponse de lagent pour forcer lenvoi dune note vocale
- 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 afin que les messages vocaux soumis à mention continuent de fonctionner.
non fiable, dans le contexte de lagent ; la détection de mention utilise toujours la transcription
brute, de sorte que les messages vocaux soumis à mention continuent de fonctionner.
Exemple daction de message :
@ -644,7 +645,7 @@ curl "https://api.telegram.org/bot<bot_token>/getUpdates"
- TGS animé : ignoré
- WEBM vidéo : ignoré
Champs de contexte de sticker :
Champs de contexte des stickers :
- `Sticker.emoji`
- `Sticker.setName`
@ -656,7 +657,7 @@ curl "https://api.telegram.org/bot<bot_token>/getUpdates"
- `~/.openclaw/telegram/sticker-cache.json`
Les stickers sont décrits une fois (lorsque possible) et mis en cache afin de réduire les appels de vision répétés.
Les stickers sont décrits une fois (lorsque cest possible) et mis en cache afin de réduire les appels de vision répétés.
Activer les actions de sticker :
@ -672,7 +673,7 @@ curl "https://api.telegram.org/bot<bot_token>/getUpdates"
}
```
Action denvoi de sticker :
Envoyer une action de sticker :
```json5
{
@ -683,7 +684,7 @@ curl "https://api.telegram.org/bot<bot_token>/getUpdates"
}
```
Rechercher des stickers en cache :
Rechercher des stickers mis en cache :
```json5
{
@ -697,47 +698,47 @@ curl "https://api.telegram.org/bot<bot_token>/getUpdates"
</Accordion>
<Accordion title="Notifications de réactions">
Les réactions Telegram arrivent sous forme de mises à jour `message_reaction` (séparées des charges utiles de message).
Les réactions Telegram arrivent sous forme de mises à jour `message_reaction` (séparées des payloads de message).
Lorsquelles sont activées, OpenClaw met en file des événements système comme :
Lorsquelles sont activées, OpenClaw met en file dattente des événements système comme :
- `Telegram reaction added: 👍 by Alice (@alice) on msg 42`
Configuration :
Config :
- `channels.telegram.reactionNotifications` : `off | own | all` (par défaut : `own`)
- `channels.telegram.reactionLevel` : `off | ack | minimal | extensive` (par défaut : `minimal`)
- `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 utilisateur aux messages envoyés par le bot (au mieux via le cache des messages envoyés).
- `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 ignorés.
- Telegram ne fournit pas dID de fil dans les mises à jour de réaction.
- les groupes non-forum sont routés vers la session de discussion de 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
- les groupes non-forum sont routés vers la session de discussion du groupe
- les groupes de 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`.
`allowed_updates` pour le polling/webhook inclut automatiquement `message_reaction`.
</Accordion>
<Accordion title="Réactions daccusé de réception">
`ackReaction` envoie un emoji daccusé de réception pendant quOpenClaw traite un message entrant.
`ackReaction` envoie un émoji daccusé de réception pendant quOpenClaw traite un message entrant.
Ordre de résolution :
- `channels.telegram.accounts.<accountId>.ackReaction`
- `channels.telegram.ackReaction`
- `messages.ackReaction`
- solution de secours avec lemoji didentité de lagent (`agents.list[].identity.emoji`, sinon "👀")
- repli sur lémoji didentité de lagent (`agents.list[].identity.emoji`, sinon "👀")
Notes :
- Telegram attend un emoji unicode (par exemple "👀").
- Telegram attend un émoji unicode (par exemple "👀").
- Utilisez `""` pour désactiver la réaction pour un canal ou un compte.
</Accordion>
<Accordion title="Écritures de configuration depuis les événements et commandes Telegram">
<Accordion title="Écritures de configuration depuis des é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 :
@ -759,32 +760,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 comportement 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`).
Lécouteur 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 jeton 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 files bot par discussion/par sujet que celles utilisées par le long polling, de sorte que les tours dagent lents ne bloquent pas lACK de livraison de Telegram.
Le mode webhook valide les gardes de requête, le jeton secret Telegram et le corps JSON avant de retourner `200` à Telegram.
OpenClaw traite ensuite la mise à jour de manière asynchrone via les mêmes voies de bot par discussion/par sujet que celles utilisées par le long polling, de sorte que les tours dagent lents ne bloquent pas lACK de livraison de Telegram.
</Accordion>
<Accordion title="Limites, nouvelle tentative et cibles CLI">
- La valeur par défaut de `channels.telegram.textChunkLimit` est 4000.
- `channels.telegram.chunkMode="newline"` privilégie les limites de paragraphes (lignes vides) avant le découpage par longueur.
- `channels.telegram.mediaMaxMb` (par défaut 100) limite la taille des médias Telegram entrants et sortants.
- `channels.telegram.mediaGroupFlushMs` (par défaut 500) contrôle la durée pendant laquelle les albums/groupes de médias Telegram sont mis en tampon avant quOpenClaw les envoie comme un seul message entrant. Augmentez-la si les 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 bot bornent les valeurs configurées sous la protection de 60 secondes des requêtes de texte/saisie sortantes afin que grammY ninterrompe pas la livraison visible des réponses avant que la protection de transport et la solution de secours 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 ; réglez-la 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` (par défaut 50) ; `0` le désactive.
- 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 ne constituent pas une frontière complète de caviardage du contexte supplémentaire.
- Contrôles de lhistorique des DM :
- `channels.telegram.textChunkLimit` vaut 4000 par défaut.
- `channels.telegram.chunkMode="newline"` privilégie les limites de paragraphe (lignes vides) avant le découpage par longueur.
- `channels.telegram.mediaMaxMb` (par défaut 100) plafonne la taille des médias Telegram entrants et sortants.
- `channels.telegram.mediaGroupFlushMs` (par défaut 500) 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 cette valeur si les parties dalbum arrivent tard ; réduisez-la pour diminuer 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 bot limitent les valeurs configurées sous le garde de requête de texte/saisie sortante de 60 secondes, afin que grammY ninterrompe pas la livraison visible de la réponse avant que le garde de transport et le repli dOpenClaw puissent sexécuter. Le long polling utilise toujours un garde de requête `getUpdates` de 45 secondes afin que les polls inactifs ne soient pas abandonnés indéfiniment.
- `channels.telegram.pollingStallThresholdMs` vaut par défaut `120000` ; ajustez entre `30000` et `600000` uniquement pour les redémarrages de polling bloqué faux positifs.
- lhistorique du contexte de groupe utilise `channels.telegram.historyLimit` ou `messages.groupChat.historyLimit` (par défaut 50) ; `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, et non une frontière complète de caviardage du contexte supplémentaire.
- Contrôles de lhistorique DM :
- `channels.telegram.dmHistoryLimit`
- `channels.telegram.dms["<user_id>"].historyLimit`
- La configuration `channels.telegram.retry` sapplique aux assistants 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écurisé bornée pour les échecs Telegram avant connexion, mais elle ne retente pas les enveloppes réseau ambiguës après envoi qui pourraient dupliquer des messages visibles.
- 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 également 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 les messages visibles.
Les cibles denvoi CLI et doutil de message peuvent être un ID de discussion numérique, un nom dutilisateur, ou une cible de sujet forum :
Les cibles denvoi CLI et doutil de message peuvent être un ID de discussion numérique, un nom dutilisateur ou une cible de sujet de forum :
```bash
openclaw message send --channel telegram --target 123456789 --message "hi"
@ -792,7 +793,7 @@ openclaw message send --channel telegram --target @name --message "hi"
openclaw message send --channel telegram --target -1001234567890:topic:42 --message "hi topic"
```
Les polls Telegram utilisent `openclaw message poll` et prennent en charge les sujets forum :
Les polls Telegram utilisent `openclaw message poll` et prennent en charge les sujets de forum :
```bash
openclaw message poll --channel telegram --target 123456789 \
@ -802,18 +803,18 @@ openclaw message poll --channel telegram --target -1001234567890:topic:42 \
--poll-duration-seconds 300 --poll-public
```
Indicateurs de poll propres à Telegram :
Flags de poll propres à Telegram :
- `--poll-duration-seconds` (5-600)
- `--poll-anonymous`
- `--poll-public`
- `--thread-id` pour les sujets forum (ou utilisez une cible `:topic:`)
- `--thread-id` pour les sujets de forum (ou utilisez une cible `:topic:`)
Lenvoi Telegram prend aussi en charge :
Lenvoi Telegram prend également en charge :
- `--presentation` avec des blocs `buttons` pour les claviers inline lorsque `channels.telegram.capabilities.inlineButtons` lautorise
- `--presentation` avec des blocs `buttons` pour les claviers en ligne lorsque `channels.telegram.capabilities.inlineButtons` lautorise
- `--pin` ou `--delivery '{"pin":true}'` pour demander une livraison épinglée lorsque le bot peut épingler dans cette discussion
- `--force-document` pour envoyer les images et GIF sortants comme documents plutôt que comme photos compressées ou téléversements de médias animés
- `--force-document` pour envoyer les images sortantes et les GIF comme documents plutôt que comme photos compressées ou téléversements de médias animés
Contrôle des actions :
@ -823,20 +824,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 facultativement publier les prompts dans la discussion ou le sujet dorigine. Les approbateurs doivent être des ID utilisateur Telegram numériques.
Telegram prend en charge les approbations exec dans les DM des approbateurs et peut éventuellement publier des invites dans la discussion ou le sujet dorigine. Les approbateurs doivent être des ID dutilisateur Telegram numériques.
Chemin de configuration :
Chemin de config :
- `channels.telegram.execApprovals.enabled` (sactive automatiquement lorsquau moins un approbateur peut être résolu)
- `channels.telegram.execApprovals.approvers` (revient aux ID propriétaires numériques de `commands.ownerAllowFrom`)
- `channels.telegram.execApprovals.target` : `dm` (par défaut) | `channel` | `both`
- `channels.telegram.execApprovals.approvers` (se rabat sur les ID 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 pas de quelquun un approbateur exec. Le premier appairage DM approuvé initialise `commands.ownerAllowFrom` lorsquaucun propriétaire de commande nexiste encore, de sorte que la configuration à propriétaire unique fonctionne toujours sans dupliquer les ID sous `execApprovals.approvers`.
`channels.telegram.allowFrom`, `groupAllowFrom` et `defaultTo` contrôlent qui peut parler au bot et où il envoie les réponses normales. Ils ne font pas de quelquun un approbateur exec. Le premier appairage DM approuvé amorce `commands.ownerAllowFrom` lorsquaucun propriétaire de commande nexiste encore, de sorte que la configuration à propriétaire unique fonctionne toujours sans dupliquer les ID sous `execApprovals.approvers`.
La livraison au canal affiche le texte de la commande dans la discussion ; nactivez `channel` ou `both` que dans des groupes/sujets de confiance. Lorsque le prompt arrive dans un sujet forum, OpenClaw conserve le sujet pour le prompt dapprobation et le suivi. Les approbations exec expirent par défaut après 30 minutes.
La livraison au canal affiche le texte de la commande dans la discussion ; 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 au bout de 30 minutes par défaut.
Les boutons dapprobation inline nécessitent aussi 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 de plugin ; les autres sont dabord résolus via les approbations exec.
Les boutons dapprobation en ligne exigent é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 de plugins ; les autres sont dabord résolus via les approbations exec.
Voir [Approbations exec](/fr/tools/exec-approvals).
@ -845,14 +846,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 le supprimer. Deux clés de configuration contrôlent ce comportement :
Lorsque lagent rencontre une erreur de livraison ou de fournisseur, Telegram peut soit répondre avec le texte de lerreur, soit le supprimer. Deux clés de config contrôlent ce comportement :
| Clé | Valeurs | Par défaut | Description |
| ----------------------------------- | ----------------- | ---------- | ---------------------------------------------------------------------------------------------------------------- |
| `channels.telegram.errorPolicy` | `reply`, `silent` | `reply` | `reply` envoie un message derreur convivial dans la discussion. `silent` supprime entièrement les réponses derreur. |
| `channels.telegram.errorCooldownMs` | nombre (ms) | `60000` | Temps minimal entre les réponses derreur à la même discussion. Empêche le spam derreurs pendant les pannes. |
| Clé | Valeurs | Par défaut | Description |
| ----------------------------------- | ----------------- | ---------- | -------------------------------------------------------------------------------------------------------- |
| `channels.telegram.errorPolicy` | `reply`, `silent` | `reply` | `reply` envoie un message derreur convivial à la discussion. `silent` supprime entièrement les réponses derreur. |
| `channels.telegram.errorCooldownMs` | number (ms) | `60000` | Temps minimal entre les réponses derreur à la même discussion. Empêche le spam derreurs pendant les interruptions. |
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).
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).
```json5
{
@ -875,11 +876,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é de Telegram doit autoriser une visibilité complète.
- BotFather : `/setprivacy` -> Disable
- puis supprimez et ajoutez de nouveau le bot au groupe
- `openclaw channels status` avertit quand la configuration attend des messages de groupe sans mention.
- `openclaw channels status --probe` peut vérifier les ID de groupe numériques explicites ; le caractère générique `"*"` ne peut pas faire lobjet dune vérification dappartenance.
- Si `requireMention=false`, le mode confidentialité de Telegram doit permettre une visibilité complète.
- BotFather : `/setprivacy` -> Désactiver
- 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 les identifiants numériques explicites de groupes ; le joker `"*"` ne peut pas faire l'objet d'une vérification d'appartenance.
- test rapide de session : `/activation always`.
</Accordion>
@ -887,42 +888,42 @@ Les remplacements par compte, par groupe et par sujet sont pris en charge (même
<Accordion title="Le bot ne voit aucun message de groupe">
- 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 connaître les raisons de lignorance
- vérifiez l'appartenance du bot au groupe
- consultez les journaux : `openclaw logs --follow` pour les raisons d'omission
</Accordion>
<Accordion title="Les commandes fonctionnent partiellement ou pas du tout">
- autorisez votre identité dexpéditeur (jumelage et/ou `allowFrom` numérique)
- lautorisation des commandes 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 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 repli de transport de Telegram en cas dexpiration de la requête. Les erreurs réseau/fetch persistantes indiquent généralement des problèmes de joignabilité DNS/HTTPS vers `api.telegram.org`
- autorisez l'identité de votre expéditeur (appariement et/ou `allowFrom` numérique)
- l'autorisation des commandes s'applique toujours même lorsque la stratégie de groupe est `open`
- `setMyCommands failed` avec `BOT_COMMANDS_TOO_MUCH` signifie que le menu natif comporte trop d'entré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 repli de transport de Telegram en cas d'expiration de requête. Les erreurs réseau/fetch persistantes indiquent généralement des problèmes d'accessibilité DNS/HTTPS vers `api.telegram.org`
</Accordion>
<Accordion title="Le démarrage signale un jeton non autorisé">
- `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` pendant le démarrage est également un échec dauthentification ; le traiter comme « aucun Webhook nexiste » ne ferait que reporter le même échec de mauvais jeton aux appels API ultérieurs.
- `getMe returned 401` est un échec d'authentification Telegram pour le jeton de bot configuré.
- Recopiez ou régénérez le jeton de 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` pendant le démarrage est aussi un échec d'authentification ; le traiter comme « aucun webhook n'existe » ne ferait que reporter le même échec de mauvais jeton à des appels API ultérieurs.
</Accordion>
<Accordion title="Instabilité du polling ou du réseau">
<Accordion title="Polling ou instabilité réseau">
- Node 22+ + un 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éfectueuse peut provoquer des échecs intermittents de lAPI Telegram.
- Node 22+ + fetch/proxy personnalisé peuvent déclencher un comportement d'abandon immédiat si les types AbortSignal ne correspondent pas.
- Certains hôtes résolvent d'abord `api.telegram.org` en IPv6 ; une sortie IPv6 défaillante peut provoquer des échecs intermittents de l'API 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` de démarrage réussie 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 se recyclent selon une cadence fixe courte, vérifiez si `channels.telegram.timeoutSeconds` est bas ; les clients de bot plafonnent les valeurs configurées sous les protections 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 protections.
- 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é par défaut.
- `openclaw channels status --probe` et `openclaw doctor` avertissent lorsquun compte en polling actif na pas terminé `getUpdates` après la période de grâce de démarrage, lorsquun compte Webhook actif na pas terminé `setWebhook` après la période de grâce de 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` de longue durée sont sains mais que votre hôte signale encore à tort des redémarrages pour blocage du polling. Les 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 également les variables denvironnement de proxy du processus pour le transport de lAPI Bot, y compris `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 avec une sortie directe/TLS instable, routez les appels de lAPI Telegram via `channels.telegram.proxy` :
- Pendant le démarrage du polling, OpenClaw réutilise la sonde `getMe` de démarrage réussie pour grammY afin que l'exécuteur n'ait pas besoin d'un second `getMe` avant le premier `getUpdates`.
- Si `deleteWebhook` échoue avec une erreur réseau transitoire pendant le démarrage du polling, OpenClaw poursuit en long polling au lieu d'effectuer un autre appel de plan de contrôle avant 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ées selon une cadence fixe courte, vérifiez si `channels.telegram.timeoutSeconds` est faible ; les clients de bot bornent les valeurs configurées sous les gardes 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 gardes.
- Si les journaux incluent `Polling stall detected`, OpenClaw redémarre le polling et reconstruit le transport Telegram après 120 secondes sans vivacité de long polling terminée par défaut.
- `openclaw channels status --probe` et `openclaw doctor` avertissent lorsqu'un compte de polling en cours d'exécution n'a pas terminé `getUpdates` après le délai de grâce de démarrage, lorsqu'un compte webhook en cours d'exécution n'a pas terminé `setWebhook` après le délai de grâce de 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` longue durée sont sains mais que votre hôte signale encore de faux redémarrages pour blocage de polling. Les blocages persistants indiquent généralement des problèmes de proxy, DNS, IPv6 ou sortie TLS entre l'hôte et `api.telegram.org`.
- Telegram respecte également les variables d'environnement de proxy du processus pour le transport de l'API 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 qu'aucune variable d'environnement de proxy standard n'est présente, Telegram utilise aussi cette URL pour le transport de l'API Bot.
- Sur les hôtes VPS avec une sortie directe/TLS instable, acheminez les appels à l'API Telegram via `channels.telegram.proxy` :
```yaml
channels:
@ -930,8 +931,8 @@ channels:
proxy: socks5://<user>:<password>@proxy-host:1080
```
- 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 :
- Node 22+ utilise par défaut `autoSelectFamily=true` (sauf WSL2). L'ordre 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 aucun ne s'applique, Node 22+ se replie sur `ipv4first`.
- Si votre hôte est WSL2 ou fonctionne explicitement mieux avec un comportement IPv4 seul, forcez la sélection de famille :
```yaml
channels:
@ -940,11 +941,11 @@ channels:
autoSelectFamily: false
```
- Les réponses de plage de benchmark 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 proxy fake-IP ou
transparent de confiance 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 propre à Telegram :
- Les réponses de plage de banc d'essai 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 fiable 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 :
```yaml
channels:
@ -955,19 +956,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 en `198.18.x.x`, laissez dabord le
drapeau dangereux désactivé. Les médias Telegram autorisent déjà par défaut la plage de
benchmark RFC 2544.
- Si votre proxy résout les hôtes de médias Telegram en `198.18.x.x`, laissez d'abord
l'indicateur dangereux désactivé. Les médias Telegram autorisent déjà la plage
de banc d'essai 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 contrôlés par un opérateur
de confiance, tels que 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
RFC 2544. Laissez-le désactivé pour un accès Telegram normal via linternet public.
`channels.telegram.network.dangerouslyAllowPrivateNetwork` affaiblit les protections
SSRF des médias Telegram. Utilisez-le uniquement pour les environnements de proxy
fiables contrôlés par l'opérateur comme Clash, Mihomo ou le routage faux IP de Surge lorsqu'ils
synthétisent des réponses privées ou à usage spécial hors de la plage de banc d'essai
RFC 2544. Laissez-le désactivé pour un accès Telegram normal à l'internet public.
</Warning>
- Remplacements denvironnement (temporaires) :
- Surcharges d'environnement (temporaires) :
- `OPENCLAW_TELEGRAM_DISABLE_AUTO_SELECT_FAMILY=1`
- `OPENCLAW_TELEGRAM_ENABLE_AUTO_SELECT_FAMILY=1`
- `OPENCLAW_TELEGRAM_DNS_RESULT_ORDER=ipv4first`
@ -981,24 +982,24 @@ dig +short api.telegram.org AAAA
</Accordion>
</AccordionGroup>
Aide supplémentaire : [Dépannage des canaux](/fr/channels/troubleshooting).
Plus d'aide : [Dépannage des canaux](/fr/channels/troubleshooting).
## Référence de configuration
Référence principale : [Référence de configuration - Telegram](/fr/gateway/config-channels#telegram).
<Accordion title="Champs Telegram à fort signal">
<Accordion title="Champs Telegram à signal fort">
- démarrage/authentification : `enabled`, `botToken`, `tokenFile`, `accounts.*` (`tokenFile` doit pointer vers un fichier standard ; 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`
- démarrage/authentification : `enabled`, `botToken`, `tokenFile`, `accounts.*` (`tokenFile` doit pointer vers un fichier normal ; les liens symboliques sont rejetés)
- contrôle d'accès : `dmPolicy`, `allowFrom`, `groupPolicy`, `groupAllowFrom`, `groups`, `groups.*.topics.*`, `bindings[]` de niveau supérieur (`type: "acp"`)
- approbations d'exécution : `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`
- formatage/livraison : `textChunkLimit`, `chunkMode`, `linkPreview`, `responsePrefix`
- 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>`)
- Webhook : `webhookUrl`, `webhookSecret`, `webhookPath`, `webhookHost`
- racine d'API personnalisée : `apiRoot` (racine de l'API Bot uniquement ; n'incluez pas `/bot<TOKEN>`)
- webhook : `webhookUrl`, `webhookSecret`, `webhookPath`, `webhookHost`
- actions/capacités : `capabilities.inlineButtons`, `actions.sendMessage|editMessage|deleteMessage|reactions|sticker`
- réactions : `reactionNotifications`, `reactionLevel`
- erreurs : `errorPolicy`, `errorCooldownMs`
@ -1007,26 +1008,26 @@ Référence principale : [Référence de configuration - Telegram](/fr/gateway/c
</Accordion>
<Note>
Priorité multi-compte : lorsque deux ID 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 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.*`.
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 explicite le routage par défaut. Sinon, OpenClaw se replie sur le premier identifiant de compte normalisé et `openclaw doctor` avertit. Les comptes nommés héritent de `channels.telegram.allowFrom` / `groupAllowFrom`, mais pas des valeurs `accounts.default.*`.
</Note>
## Associé
## Connexe
<CardGroup cols={2}>
<Card title="Jumelage" icon="link" href="/fr/channels/pairing">
Jumelez un utilisateur Telegram au Gateway.
<Card title="Appariement" icon="link" href="/fr/channels/pairing">
Appariez un utilisateur Telegram au Gateway.
</Card>
<Card title="Groupes" icon="users" href="/fr/channels/groups">
Comportement des listes dautorisation de groupes et de sujets.
Comportement de liste d'autorisation des groupes et des sujets.
</Card>
<Card title="Routage des canaux" icon="route" href="/fr/channels/channel-routing">
Routez les messages entrants vers les agents.
Routez les messages entrants vers des agents.
</Card>
<Card title="Sécurité" icon="shield" href="/fr/gateway/security">
Modèle de menace et durcissement.
</Card>
<Card title="Routage multi-agent" icon="sitemap" href="/fr/concepts/multi-agent">
Associez les groupes et les sujets aux agents.
Associez des groupes et des sujets à des agents.
</Card>
<Card title="Dépannage" icon="wrench" href="/fr/channels/troubleshooting">
Diagnostics inter-canaux.

View File

@ -4,25 +4,25 @@ read_when:
summary: Prise en charge du canal WhatsApp, contrôles daccès, comportement de livraison et opérations
title: WhatsApp
x-i18n:
generated_at: "2026-05-03T07:08:25Z"
generated_at: "2026-05-05T06:15:59Z"
model: gpt-5.5
provider: openai
source_hash: 2f12709fc8ecb45e1b060647daf9a4624485d52b7b6436c3d07f171e6807babf
source_hash: 52a81fc323568e06d11606931e34465fe5a823a0699d8e0638195b8667c3ebee
source_path: channels/whatsapp.md
workflow: 16
---
Statut : prêt pour la production via WhatsApp Web (Baileys). Le Gateway possède les sessions liées.
Statut : prêt pour la production via WhatsApp Web (Baileys). Gateway gère les sessions liées.
## Installation (à la demande)
- Lintégration (`openclaw onboard`) et `openclaw channels add --channel whatsapp`
- Lonboarding (`openclaw onboard`) et `openclaw channels add --channel whatsapp`
proposent dinstaller le Plugin WhatsApp la première fois que vous le sélectionnez.
- `openclaw channels login --channel whatsapp` propose également le flux dinstallation lorsque
- `openclaw channels login --channel whatsapp` propose aussi le flux dinstallation lorsque
le Plugin nest pas encore présent.
- Canal de développement + checkout git : utilise par défaut le chemin du Plugin local.
- Stable/Bêta : utilise le paquet npm `@openclaw/whatsapp` sur létiquette de version officielle
actuelle.
- Canal de développement + dépôt git extrait : utilise par défaut le chemin du Plugin local.
- Stable/Bêta : utilise le package npm `@openclaw/whatsapp` sur létiquette de version
officielle actuelle.
Linstallation manuelle reste disponible :
@ -30,17 +30,27 @@ Linstallation manuelle reste disponible :
openclaw plugins install @openclaw/whatsapp
```
Utilisez le paquet nu pour suivre létiquette de version officielle actuelle. Épinglez une version
Utilisez le package nu pour suivre létiquette de version officielle actuelle. Épinglez une version
exacte uniquement lorsque vous avez besoin dune installation reproductible.
Sous Windows, le Plugin WhatsApp a besoin de Git sur `PATH` pendant linstallation npm, car
lune de ses dépendances Baileys/libsignal est récupérée depuis une URL git. Installez
Git for Windows, puis redémarrez le shell et relancez linstallation :
```powershell
winget install --id Git.Git -e
```
Portable Git fonctionne aussi si son répertoire `bin` est sur `PATH`.
<CardGroup cols={3}>
<Card title="Appairage" icon="link" href="/fr/channels/pairing">
La politique par défaut pour les messages directs consiste à utiliser lappairage pour les expéditeurs inconnus.
<Card title="Pairing" icon="link" href="/fr/channels/pairing">
La politique de MP par défaut est lappairage pour les expéditeurs inconnus.
</Card>
<Card title="Dépannage des canaux" icon="wrench" href="/fr/channels/troubleshooting">
Diagnostics et guides de réparation intercanaux.
<Card title="Channel troubleshooting" icon="wrench" href="/fr/channels/troubleshooting">
Diagnostics intercanaux et procédures de réparation.
</Card>
<Card title="Configuration du Gateway" icon="settings" href="/fr/gateway/configuration">
<Card title="Gateway configuration" icon="settings" href="/fr/gateway/configuration">
Modèles et exemples complets de configuration de canal.
</Card>
</CardGroup>
@ -48,7 +58,7 @@ exacte uniquement lorsque vous avez besoin dune installation reproductible.
## Configuration rapide
<Steps>
<Step title="Configurer la politique daccès WhatsApp">
<Step title="Configure WhatsApp access policy">
```json5
{
@ -65,19 +75,19 @@ exacte uniquement lorsque vous avez besoin dune installation reproductible.
</Step>
<Step title="Lier WhatsApp (QR)">
<Step title="Link WhatsApp (QR)">
```bash
openclaw channels login --channel whatsapp
```
Pour un compte précis :
Pour un compte spécifique :
```bash
openclaw channels login --channel whatsapp --account work
```
Pour attacher un répertoire dauthentification WhatsApp Web existant/personnalisé avant la connexion :
Pour joindre un répertoire dauthentification WhatsApp Web existant/personnalisé avant la connexion :
```bash
openclaw channels add --channel whatsapp --account work --auth-dir /path/to/wa-auth
@ -86,7 +96,7 @@ openclaw channels login --channel whatsapp --account work
</Step>
<Step title="Démarrer le Gateway">
<Step title="Start the gateway">
```bash
openclaw gateway
@ -94,7 +104,7 @@ openclaw gateway
</Step>
<Step title="Approuver la première demande dappairage (si le mode dappairage est utilisé)">
<Step title="Approve first pairing request (if using pairing mode)">
```bash
openclaw pairing list whatsapp
@ -107,18 +117,18 @@ openclaw pairing approve whatsapp <CODE>
</Steps>
<Note>
OpenClaw recommande dexécuter WhatsApp sur un numéro séparé lorsque cest possible. (Les métadonnées du canal et le flux de configuration sont optimisés pour cette configuration, mais les configurations avec numéro personnel sont également prises en charge.)
OpenClaw recommande dexécuter WhatsApp sur un numéro séparé lorsque cest possible. (Les métadonnées du canal et le flux de configuration sont optimisés pour cette configuration, mais les configurations avec numéro personnel sont aussi prises en charge.)
</Note>
## Modèles de déploiement
<AccordionGroup>
<Accordion title="Numéro dédié (recommandé)">
<Accordion title="Dedicated number (recommended)">
Cest le mode opérationnel le plus propre :
- identité WhatsApp séparée pour OpenClaw
- listes dautorisation de messages directs et limites de routage plus claires
- risque plus faible de confusion avec les messages à soi-même
- listes dautorisation de MP et limites de routage plus claires
- risque plus faible de confusion avec les conversations avec soi-même
Modèle de politique minimal :
@ -135,45 +145,45 @@ OpenClaw recommande dexécuter WhatsApp sur un numéro séparé lorsque ce
</Accordion>
<Accordion title="Solution de repli avec numéro personnel">
Lintégration prend en charge le mode numéro personnel et écrit une base compatible avec les messages à soi-même :
<Accordion title="Personal-number fallback">
Lonboarding prend en charge le mode numéro personnel et écrit une base compatible avec les conversations avec soi-même :
- `dmPolicy: "allowlist"`
- `allowFrom` inclut votre numéro personnel
- `selfChatMode: true`
À lexécution, les protections contre les messages à soi-même sappuient sur le numéro lié à soi-même et sur `allowFrom`.
À lexécution, les protections de conversation avec soi-même sappuient sur le numéro propre lié et sur `allowFrom`.
</Accordion>
<Accordion title="Portée du canal uniquement WhatsApp Web">
Le canal de plateforme de messagerie est basé sur WhatsApp Web (`Baileys`) dans larchitecture actuelle des canaux OpenClaw.
<Accordion title="WhatsApp Web-only channel scope">
Le canal de la plateforme de messagerie est basé sur WhatsApp Web (`Baileys`) dans larchitecture actuelle des canaux OpenClaw.
Il nexiste pas de canal de messagerie WhatsApp Twilio distinct dans le registre intégré des canaux de discussion.
Il nexiste pas de canal de messagerie WhatsApp Twilio séparé dans le registre intégré des canaux de chat.
</Accordion>
</AccordionGroup>
## Modèle dexécution
- Le Gateway possède le socket WhatsApp et la boucle de reconnexion.
- Le mécanisme de surveillance de reconnexion utilise lactivité de transport WhatsApp Web, et pas seulement le volume de messages applicatifs entrants, de sorte quune session dappareil lié silencieuse nest pas redémarrée uniquement parce que personne na envoyé de message récemment. Un plafond plus long de silence applicatif force toujours une reconnexion si les trames de transport continuent darriver mais quaucun message applicatif nest traité pendant la fenêtre de surveillance ; après une reconnexion transitoire pour une session récemment active, cette vérification du silence applicatif utilise le délai dexpiration normal des messages pour la première fenêtre de récupération.
- Les délais du socket Baileys sont explicites sous `web.whatsapp.*` : `keepAliveIntervalMs` contrôle les pings applicatifs WhatsApp Web, `connectTimeoutMs` contrôle le délai dexpiration de la poignée de main douverture, et `defaultQueryTimeoutMs` contrôle les délais dexpiration des requêtes Baileys.
- Gateway gère la socket WhatsApp et la boucle de reconnexion.
- Le chien de garde de reconnexion utilise lactivité de transport WhatsApp Web, pas seulement le volume de messages applicatifs entrants, de sorte quune session dappareil lié silencieuse nest pas redémarrée uniquement parce que personne na envoyé de message récemment. Une limite plus longue de silence applicatif force tout de même une reconnexion si des trames de transport continuent darriver, mais quaucun message applicatif nest traité pendant la fenêtre du chien de garde ; après une reconnexion transitoire pour une session récemment active, cette vérification de silence applicatif utilise le délai normal des messages pour la première fenêtre de récupération.
- Les temporisations de socket Baileys sont explicites sous `web.whatsapp.*` : `keepAliveIntervalMs` contrôle les pings applicatifs WhatsApp Web, `connectTimeoutMs` contrôle le délai dexpiration de la poignée de main douverture, et `defaultQueryTimeoutMs` contrôle les délais dexpiration des requêtes Baileys.
- Les envois sortants nécessitent un écouteur WhatsApp actif pour le compte cible.
- Les envois de groupe attachent les métadonnées de mention natives pour les jetons `@+<digits>` et `@<digits>` dans le texte et les légendes de médias lorsque le jeton correspond aux métadonnées actuelles des participants WhatsApp, y compris les groupes adossés à un LID.
- Les discussions de statut et de diffusion sont ignorées (`@status`, `@broadcast`).
- Le mécanisme de surveillance de reconnexion suit lactivité de transport WhatsApp Web, et pas seulement le volume de messages applicatifs entrants : les sessions dappareils liés silencieuses restent actives tant que les trames de transport continuent, mais un blocage du transport force une reconnexion bien avant le chemin ultérieur de déconnexion distante.
- Les discussions directes utilisent les règles de session de messages directs (`session.dmScope` ; la valeur par défaut `main` regroupe les messages directs dans la session principale de lagent).
- Les envois de groupe joignent les métadonnées de mention natives pour les jetons `@+<digits>` et `@<digits>` dans le texte et les légendes de médias lorsque le jeton correspond aux métadonnées de participant WhatsApp actuelles, y compris les groupes adossés à LID.
- Les chats de statut et de diffusion sont ignorés (`@status`, `@broadcast`).
- Le chien de garde de reconnexion suit lactivité de transport WhatsApp Web, pas seulement le volume de messages applicatifs entrants : les sessions dappareil lié silencieuses restent actives tant que les trames de transport continuent, mais un blocage du transport force une reconnexion bien avant le chemin ultérieur de déconnexion distante.
- Les chats directs utilisent les règles de session de MP (`session.dmScope` ; la valeur par défaut `main` regroupe les MP dans la session principale de lagent).
- Les sessions de groupe sont isolées (`agent:<agentId>:whatsapp:group:<jid>`).
- Les canaux/newsletters WhatsApp peuvent être des cibles sortantes explicites avec leur JID natif `@newsletter`. Les envois sortants de newsletter utilisent les métadonnées de session de canal (`agent:<agentId>:whatsapp:channel:<jid>`) plutôt que la sémantique des sessions de messages directs.
- Les canaux/newsletters WhatsApp peuvent être des cibles sortantes explicites avec leur JID natif `@newsletter`. Les envois sortants de newsletter utilisent les métadonnées de session de canal (`agent:<agentId>:whatsapp:channel:<jid>`) plutôt que la sémantique de session de MP.
- Le transport WhatsApp Web respecte les variables denvironnement de proxy standard sur lhôte du Gateway (`HTTPS_PROXY`, `HTTP_PROXY`, `NO_PROXY` / variantes en minuscules). Préférez la configuration de proxy au niveau de lhôte aux paramètres de proxy WhatsApp propres au canal.
- Lorsque `messages.removeAckAfterReply` est activé, OpenClaw efface la réaction daccusé de réception WhatsApp après la livraison dune réponse visible.
- Lorsque `messages.removeAckAfterReply` est activé, OpenClaw efface la réaction daccusé de réception WhatsApp après la remise dune réponse visible.
## Hooks de Plugin et confidentialité
Les messages entrants WhatsApp peuvent contenir du contenu de message personnel, des numéros de téléphone,
des identifiants de groupe, des noms dexpéditeur et des champs de corrélation de session. Pour cette raison,
WhatsApp ne diffuse pas les charges utiles du hook entrant `message_received` aux Plugins
Les messages entrants WhatsApp peuvent contenir le contenu de messages personnels, des numéros de téléphone,
des identifiants de groupe, des noms dexpéditeurs et des champs de corrélation de session. Pour cette raison,
WhatsApp ne diffuse pas les charges utiles de hook `message_received` entrant aux plugins
sauf si vous lactivez explicitement :
```json5
@ -206,92 +216,93 @@ Vous pouvez limiter lactivation à un seul compte :
}
```
Nactivez ceci que pour les plugins auxquels vous faites confiance pour recevoir le contenu et les identifiants des messages WhatsApp entrants.
Activez cette option uniquement pour les plugins auxquels vous faites confiance pour recevoir le contenu
et les identifiants des messages WhatsApp entrants.
## Contrôle daccès et activation
<Tabs>
<Tab title="Politique de DM">
`channels.whatsapp.dmPolicy` contrôle laccès aux discussions directes :
<Tab title="DM policy">
`channels.whatsapp.dmPolicy` contrôle laccès aux chats directs :
- `pairing` (par défaut)
- `allowlist`
- `open` (nécessite que `allowFrom` inclue `"*"`)
- `disabled`
`allowFrom` accepte les numéros au format E.164 (normalisés en interne).
`allowFrom` accepte les numéros au style E.164 (normalisés en interne).
`allowFrom` est une liste de contrôle daccès des expéditeurs en DM. Elle ne filtre pas les envois sortants explicites vers des JID de groupes WhatsApp ou des JID de canaux `@newsletter`.
`allowFrom` est une liste de contrôle daccès des expéditeurs de MP. Elle ne filtre pas les envois sortants explicites vers des JID de groupe WhatsApp ou des JID de canal `@newsletter`.
Remplacement multi-compte : `channels.whatsapp.accounts.<id>.dmPolicy` (et `allowFrom`) ont priorité sur les valeurs par défaut au niveau du canal pour ce compte.
Remplacement multicomptes : `channels.whatsapp.accounts.<id>.dmPolicy` (et `allowFrom`) prennent le pas sur les valeurs par défaut au niveau du canal pour ce compte.
Détails du comportement à lexécution :
- les associations sont conservées dans le magasin dautorisations du canal et fusionnées avec `allowFrom` configuré
- lautomatisation planifiée et le repli des destinataires Heartbeat utilisent des cibles de livraison explicites ou `allowFrom` configuré ; les approbations dassociation DM ne sont pas implicitement des destinataires Cron ou Heartbeat
- si aucune liste dautorisation nest configurée, le numéro personnel lié est autorisé par défaut
- OpenClaw nassocie jamais automatiquement les DM sortants `fromMe` (messages que vous vous envoyez à vous-même depuis lappareil lié)
- les appairages sont conservés dans le magasin dautorisations du canal et fusionnés avec `allowFrom` configuré
- lautomatisation planifiée et le repli de destinataire Heartbeat utilisent des cibles de livraison explicites ou `allowFrom` configuré ; les approbations dappairage de MP ne sont pas des destinataires Cron ou Heartbeat implicites
- si aucune liste dautorisation nest configurée, le numéro propre lié est autorisé par défaut
- OpenClaw nappaire jamais automatiquement les MP sortants `fromMe` (messages que vous vous envoyez depuis lappareil lié)
</Tab>
<Tab title="Politique de groupe + listes dautorisation">
<Tab title="Group policy + allowlists">
Laccès aux groupes comporte deux couches :
1. **Liste dautorisation dappartenance aux groupes** (`channels.whatsapp.groups`)
- si `groups` est omis, tous les groupes sont éligibles
- si `groups` est présent, il agit comme une liste dautorisation de groupes (`"*"` autorisé)
- si `groups` est présent, il agit comme liste dautorisation de groupes (`"*"` autorisé)
2. **Politique des expéditeurs de groupe** (`channels.whatsapp.groupPolicy` + `groupAllowFrom`)
2. **Politique dexpéditeur de groupe** (`channels.whatsapp.groupPolicy` + `groupAllowFrom`)
- `open` : liste dautorisation des expéditeurs contournée
- `allowlist` : lexpéditeur doit correspondre à `groupAllowFrom` (ou `*`)
- `disabled` : bloquer tous les entrants de groupe
- `disabled` : bloque tous les entrants de groupe
Repli de la liste dautorisation des expéditeurs :
Repli de liste dautorisation des expéditeurs :
- si `groupAllowFrom` nest pas défini, lexécution se replie sur `allowFrom` lorsquil est disponible
- les listes dautorisation des expéditeurs sont évaluées avant lactivation par mention/réponse
- si `groupAllowFrom` nest pas défini, lexécution se rabat sur `allowFrom` lorsquil est disponible
- les listes dautorisation dexpéditeurs sont évaluées avant lactivation par mention/réponse
Remarque : si aucun bloc `channels.whatsapp` nexiste, le repli de la politique de groupe à lexécution est `allowlist` (avec un journal davertissement), même si `channels.defaults.groupPolicy` est défini.
Remarque : si aucun bloc `channels.whatsapp` nexiste, le repli de politique de groupe à lexécution est `allowlist` (avec un journal davertissement), même si `channels.defaults.groupPolicy` est défini.
</Tab>
<Tab title="Mentions + /activation">
Les réponses de groupe exigent une mention par défaut.
Les réponses de groupe nécessitent une mention par défaut.
La détection des mentions inclut :
La détection de mentions inclut :
- les mentions WhatsApp explicites de lidentité du bot
- les modèles regex de mention configurés (`agents.list[].groupChat.mentionPatterns`, repli `messages.groupChat.mentionPatterns`)
- les motifs regex de mention configurés (`agents.list[].groupChat.mentionPatterns`, repli `messages.groupChat.mentionPatterns`)
- les transcriptions de notes vocales entrantes pour les messages de groupe autorisés
- la détection implicite des réponses au bot (lexpéditeur de la réponse correspond à lidentité du bot)
- la détection implicite de réponse au bot (lexpéditeur de la réponse correspond à lidentité du bot)
Note de sécurité :
- la citation/réponse ne satisfait que le filtrage par mention ; elle naccorde **pas** lautorisation à lexpéditeur
- avec `groupPolicy: "allowlist"`, les expéditeurs non présents dans la liste dautorisation restent bloqués, même sils répondent au message dun utilisateur présent dans la liste dautorisation
- la citation/réponse ne satisfait que le filtrage par mention ; elle naccorde **pas** lautorisation de lexpéditeur
- avec `groupPolicy: "allowlist"`, les expéditeurs absents de la liste dautorisation restent bloqués même sils répondent au message dun utilisateur autorisé
Commande dactivation au niveau de la session :
- `/activation mention`
- `/activation always`
`activation` met à jour létat de la session (pas la configuration globale). Elle est restreinte au propriétaire.
`activation` met à jour létat de session (pas la configuration globale). Elle est limitée au propriétaire.
</Tab>
</Tabs>
## Comportement du numéro personnel et de lauto-discussion
## Comportement avec numéro personnel et conversation avec soi-même
Lorsque le numéro personnel lié est également présent dans `allowFrom`, les garde-fous dauto-discussion WhatsApp sactivent :
Lorsque le numéro propre lié est aussi présent dans `allowFrom`, les protections WhatsApp de conversation avec soi-même sactivent :
- ignorer les accusés de lecture pour les tours dauto-discussion
- ignorer le comportement de déclenchement automatique par JID de mention qui vous pinguerait autrement vous-même
- si `messages.responsePrefix` nest pas défini, les réponses dauto-discussion utilisent par défaut `[{identity.name}]` ou `[openclaw]`
- ignorer les accusés de lecture pour les tours de conversation avec soi-même
- ignorer le comportement de déclenchement automatique par JID de mention qui vous notifierait autrement vous-même
- si `messages.responsePrefix` nest pas défini, les réponses de conversation avec soi-même utilisent par défaut `[{identity.name}]` ou `[openclaw]`
## Normalisation des messages et contexte
<AccordionGroup>
<Accordion title="Enveloppe entrante + contexte de réponse">
<Accordion title="Inbound envelope + reply context">
Les messages WhatsApp entrants sont enveloppés dans lenveloppe entrante partagée.
Si une réponse citée existe, le contexte est ajouté sous cette forme :
@ -302,16 +313,16 @@ Lorsque le numéro personnel lié est également présent dans `allowFrom`, les
[/Replying]
```
Les champs de métadonnées de réponse sont également renseignés lorsquils sont disponibles (`ReplyToId`, `ReplyToBody`, `ReplyToSender`, JID/E.164 de lexpéditeur).
Lorsque la cible de réponse citée est un média téléchargeable, OpenClaw lenregistre via
le magasin de médias entrants normal et lexpose sous forme de `MediaPath`/`MediaType` afin que
Les champs de métadonnées de réponse sont aussi renseignés lorsquils sont disponibles (`ReplyToId`, `ReplyToBody`, `ReplyToSender`, JID/E.164 de lexpéditeur).
Lorsque la cible de la réponse citée est un média téléchargeable, OpenClaw lenregistre via
le magasin normal de médias entrants et lexpose comme `MediaPath`/`MediaType` afin que
lagent puisse inspecter limage référencée au lieu de voir uniquement
`<media:image>`.
</Accordion>
<Accordion title="Espaces réservés de médias et extraction de localisation/contact">
Les messages entrants contenant uniquement des médias sont normalisés avec des espaces réservés tels que :
<Accordion title="Media placeholders and location/contact extraction">
Les messages entrants ne contenant que des médias sont normalisés avec des espaces réservés tels que :
- `<media:image>`
- `<media:video>`
@ -320,15 +331,15 @@ Lorsque le numéro personnel lié est également présent dans `allowFrom`, les
- `<media:sticker>`
Les notes vocales de groupe autorisées sont transcrites avant le filtrage par mention lorsque le
corps est uniquement `<media:audio>`, de sorte que prononcer la mention du bot dans la note vocale peut
déclencher la réponse. Si la transcription ne mentionne toujours pas le bot, la
transcription est conservée dans lhistorique de groupe en attente au lieu de lespace réservé brut.
corps est uniquement `<media:audio>`, donc prononcer la mention du bot dans la note vocale peut
déclencher la réponse. Si la transcription ne mentionne toujours pas le bot, elle est
conservée dans lhistorique de groupe en attente au lieu de lespace réservé brut.
Les corps de localisation utilisent un texte concis de coordonnées. Les libellés/commentaires de localisation et les détails de contact/vCard sont rendus sous forme de métadonnées non fiables dans un bloc clôturé, et non comme texte de prompt en ligne.
Les corps de localisation utilisent un texte de coordonnées concis. Les libellés/commentaires de localisation et les détails de contact/vCard sont rendus comme des métadonnées non fiables clôturées, pas comme du texte dinvite en ligne.
</Accordion>
<Accordion title="Injection de lhistorique de groupe en attente">
<Accordion title="Pending group history injection">
Pour les groupes, les messages non traités peuvent être mis en mémoire tampon et injectés comme contexte lorsque le bot est enfin déclenché.
- limite par défaut : `50`
@ -374,31 +385,31 @@ Lorsque le numéro personnel lié est également présent dans `allowFrom`, les
}
```
Les tours de conversation avec soi-même ignorent les accusés de lecture, même lorsquils sont activés globalement.
Les tours en auto-discussion ignorent les accusés de lecture, même lorsquils sont activés globalement.
</Accordion>
</AccordionGroup>
## Livraison, segmentation et médias
## Livraison, découpage et médias
<AccordionGroup>
<Accordion title="Segmentation du texte">
- limite de segment par défaut : `channels.whatsapp.textChunkLimit = 4000`
<Accordion title="Découpage du texte">
- limite de découpage par défaut : `channels.whatsapp.textChunkLimit = 4000`
- `channels.whatsapp.chunkMode = "length" | "newline"`
- le mode `newline` privilégie les limites de paragraphe (lignes vides), puis revient à une segmentation sûre par longueur
- le mode `newline` privilégie les limites de paragraphe (lignes vides), puis revient à un découpage sûr par longueur
</Accordion>
<Accordion title="Comportement des médias sortants">
- prend en charge les charges utiles dimage, de vidéo, daudio (note vocale PTT) et de document
- les médias audio sont envoyés via la charge utile `audio` de Baileys avec `ptt: true`, afin que les clients WhatsApp les affichent comme une note vocale push-to-talk
- les charges utiles de réponse conservent `audioAsVoice` ; la sortie de note vocale TTS pour WhatsApp reste sur ce chemin PTT même lorsque le fournisseur renvoie du MP3 ou du WebM
- laudio Ogg/Opus natif est envoyé comme `audio/ogg; codecs=opus` pour la compatibilité avec les notes vocales
- laudio non Ogg, y compris la sortie MP3/WebM TTS de Microsoft Edge, est transcodé avec `ffmpeg` en Ogg/Opus mono 48 kHz avant la livraison PTT
- les médias audio sont envoyés via la charge utile `audio` de Baileys avec `ptt: true`, afin que les clients WhatsApp les affichent comme une note vocale en mode pression pour parler
- les charges utiles de réponse préservent `audioAsVoice` ; la sortie de note vocale TTS pour WhatsApp reste sur ce chemin PTT, même lorsque le fournisseur renvoie du MP3 ou du WebM
- laudio Ogg/Opus natif est envoyé sous la forme `audio/ogg; codecs=opus` pour la compatibilité avec les notes vocales
- laudio non Ogg, y compris la sortie MP3/WebM de Microsoft Edge TTS, est transcodé avec `ffmpeg` en Ogg/Opus mono 48 kHz avant la livraison PTT
- `/tts latest` envoie la dernière réponse de lassistant comme une seule note vocale et supprime les envois répétés pour la même réponse ; `/tts chat on|off|default` contrôle le TTS automatique pour la discussion WhatsApp actuelle
- la lecture des GIF animés est prise en charge via `gifPlayback: true` sur les envois vidéo
- les légendes sont appliquées au premier élément média lors de lenvoi de charges utiles de réponse multimédia, sauf que les notes vocales PTT envoient dabord laudio puis le texte visible séparément, car les clients WhatsApp naffichent pas les légendes de notes vocales de façon cohérente
- la source média peut être HTTP(S), `file://` ou des chemins locaux
- la lecture des GIF animés est prise en charge via `gifPlayback: true` lors des envois vidéo
- les légendes sont appliquées au premier élément multimédia lors de lenvoi de charges utiles de réponse multimédias, sauf pour les notes vocales PTT, qui envoient dabord laudio puis le texte visible séparément, car les clients WhatsApp naffichent pas toujours les légendes de notes vocales
- la source du média peut être HTTP(S), `file://` ou des chemins locaux
</Accordion>
@ -406,21 +417,21 @@ Lorsque le numéro personnel lié est également présent dans `allowFrom`, les
- plafond denregistrement des médias entrants : `channels.whatsapp.mediaMaxMb` (par défaut `50`)
- plafond denvoi des médias sortants : `channels.whatsapp.mediaMaxMb` (par défaut `50`)
- les remplacements par compte utilisent `channels.whatsapp.accounts.<accountId>.mediaMaxMb`
- les images sont automatiquement optimisées (redimensionnement/balayage de qualité) pour respecter les limites
- en cas déchec denvoi de média, le repli sur le premier élément envoie un avertissement textuel au lieu de supprimer silencieusement la réponse
- les images sont optimisées automatiquement (redimensionnement/balayage de qualité) pour respecter les limites
- en cas déchec denvoi de média, le repli du premier élément envoie un avertissement textuel au lieu de supprimer silencieusement la réponse
</Accordion>
</AccordionGroup>
## Citation de réponse
## Citation des réponses
WhatsApp prend en charge la citation de réponse native, où les réponses sortantes citent visiblement le message entrant. Contrôlez-la avec `channels.whatsapp.replyToMode`.
WhatsApp prend en charge la citation native des réponses, où les réponses sortantes citent visiblement le message entrant. Contrôlez-la avec `channels.whatsapp.replyToMode`.
| Valeur | Comportement |
| ----------- | --------------------------------------------------------------------- |
| `"off"` | Ne jamais citer ; envoyer comme un message simple |
| `"first"` | Ne citer que le premier segment de réponse sortante |
| `"all"` | Citer chaque segment de réponse sortante |
| ----------- | -------------------------------------------------------------------- |
| `"off"` | Ne jamais citer ; envoyer comme un message simple |
| `"first"` | Citer uniquement le premier fragment de réponse sortante |
| `"all"` | Citer chaque fragment de réponse sortante |
| `"batched"` | Citer les réponses groupées en file dattente tout en laissant les réponses immédiates sans citation |
La valeur par défaut est `"off"`. Les remplacements par compte utilisent `channels.whatsapp.accounts.<id>.replyToMode`.
@ -437,14 +448,14 @@ La valeur par défaut est `"off"`. Les remplacements par compte utilisent `chann
## Niveau de réaction
`channels.whatsapp.reactionLevel` contrôle létendue avec laquelle lagent utilise les réactions emoji sur WhatsApp :
`channels.whatsapp.reactionLevel` contrôle létendue de lutilisation des réactions emoji par lagent sur WhatsApp :
| Niveau | Réactions daccusé | Réactions initiées par lagent | Description |
| ------------- | ------------------ | ------------------------------ | ------------------------------------------------ |
| `"off"` | Non | Non | Aucune réaction |
| `"ack"` | Oui | Non | Réactions daccusé uniquement (réception avant réponse) |
| `"minimal"` | Oui | Oui (conservateur) | Accusé + réactions dagent avec consignes conservatrices |
| `"extensive"` | Oui | Oui (encouragé) | Accusé + réactions dagent avec consignes encouragées |
| Niveau | Réactions daccusé de réception | Réactions initiées par lagent | Description |
| ------------- | ------------------------------- | ------------------------------ | --------------------------------------------------------------------------- |
| `"off"` | Non | Non | Aucune réaction |
| `"ack"` | Oui | Non | Réactions daccusé de réception uniquement (accusé avant réponse) |
| `"minimal"` | Oui | Oui (conservateur) | Accusé de réception + réactions de lagent avec consignes conservatrices |
| `"extensive"` | Oui | Oui (encouragé) | Accusé de réception + réactions de lagent avec consignes encourageantes |
Par défaut : `"minimal"`.
@ -462,8 +473,8 @@ Les remplacements par compte utilisent `channels.whatsapp.accounts.<id>.reaction
## Réactions daccusé de réception
WhatsApp prend en charge les réactions daccusé immédiates à la réception entrante via `channels.whatsapp.ackReaction`.
Les réactions daccusé sont contrôlées par `reactionLevel` — elles sont supprimées lorsque `reactionLevel` vaut `"off"`.
WhatsApp prend en charge les réactions daccusé de réception immédiates à la réception entrante via `channels.whatsapp.ackReaction`.
Les réactions daccusé de réception sont contrôlées par `reactionLevel` — elles sont supprimées lorsque `reactionLevel` vaut `"off"`.
```json5
{
@ -481,17 +492,17 @@ Les réactions daccusé sont contrôlées par `reactionLevel` — elles sont
Notes de comportement :
- envoyées immédiatement après lacceptation de lentrée (avant réponse)
- les échecs sont journalisés mais ne bloquent pas la livraison normale de la réponse
- le mode de groupe `mentions` réagit sur les tours déclenchés par mention ; lactivation de groupe `always` sert de contournement pour cette vérification
- envoyées immédiatement après lacceptation du message entrant (avant la réponse)
- les échecs sont journalisés, mais ne bloquent pas la livraison normale de la réponse
- le mode de groupe `mentions` réagit sur les tours déclenchés par une mention ; lactivation de groupe `always` agit comme contournement pour cette vérification
- WhatsApp utilise `channels.whatsapp.ackReaction` (lancien `messages.ackReaction` nest pas utilisé ici)
## Comptes multiples et identifiants
<AccordionGroup>
<Accordion title="Sélection de compte et valeurs par défaut">
<Accordion title="Sélection du compte et valeurs par défaut">
- les identifiants de compte proviennent de `channels.whatsapp.accounts`
- sélection de compte par défaut : `default` sil est présent, sinon le premier identifiant de compte configuré (trié)
- sélection du compte par défaut : `default` sil est présent, sinon le premier identifiant de compte configuré (trié)
- les identifiants de compte sont normalisés en interne pour la recherche
</Accordion>
@ -499,16 +510,16 @@ Notes de comportement :
<Accordion title="Chemins des identifiants et compatibilité héritée">
- chemin dauthentification actuel : `~/.openclaw/credentials/whatsapp/<accountId>/creds.json`
- fichier de sauvegarde : `creds.json.bak`
- lauthentification par défaut héritée dans `~/.openclaw/credentials/` est toujours reconnue/migrée pour les flux de compte par défaut
- lauthentification par défaut héritée dans `~/.openclaw/credentials/` est encore reconnue/migrée pour les flux de compte par défaut
</Accordion>
<Accordion title="Comportement de déconnexion">
`openclaw channels logout --channel whatsapp [--account <id>]` efface létat dauthentification WhatsApp pour ce compte.
Lorsquun Gateway est joignable, la déconnexion arrête dabord lécouteur WhatsApp actif pour le compte sélectionné afin que la session liée ne continue pas à recevoir des messages jusquau prochain redémarrage. `openclaw channels remove --channel whatsapp` arrête aussi lécouteur actif avant de désactiver ou supprimer la configuration du compte.
Lorsquun Gateway est joignable, la déconnexion arrête dabord lécouteur WhatsApp actif pour le compte sélectionné afin que la session liée ne continue pas à recevoir des messages jusquau prochain redémarrage. `openclaw channels remove --channel whatsapp` arrête également lécouteur actif avant de désactiver ou de supprimer la configuration du compte.
Dans les répertoires dauthentification hérités, `oauth.json` est conservé tandis que les fichiers dauthentification Baileys sont supprimés.
Dans les répertoires dauthentification hérités, `oauth.json` est préservé tandis que les fichiers dauthentification Baileys sont supprimés.
</Accordion>
</AccordionGroup>
@ -527,7 +538,7 @@ Notes de comportement :
<Accordion title="Non lié (QR requis)">
Symptôme : létat du canal indique quil nest pas lié.
Correctif :
Correction :
```bash
openclaw channels login --channel whatsapp
@ -539,14 +550,9 @@ Notes de comportement :
<Accordion title="Lié mais déconnecté / boucle de reconnexion">
Symptôme : compte lié avec déconnexions répétées ou tentatives de reconnexion.
Les comptes silencieux peuvent rester connectés au-delà du délai normal de message ; le chien de garde
redémarre lorsque lactivité de transport WhatsApp Web sarrête, que le socket se ferme ou que
lactivité au niveau de lapplication reste silencieuse au-delà de la fenêtre de sécurité plus longue.
Les comptes peu actifs peuvent rester connectés au-delà du délai normal des messages ; le chien de garde redémarre lorsque lactivité du transport WhatsApp Web sarrête, que le socket se ferme ou que lactivité au niveau de lapplication reste silencieuse au-delà de la fenêtre de sécurité plus longue.
Si les journaux affichent des `status=408 Request Time-out Connection was lost` répétés, ajustez
les minutages du socket Baileys sous `web.whatsapp`. Commencez par raccourcir
`keepAliveIntervalMs` sous le délai dinactivité de votre réseau et augmenter
`connectTimeoutMs` sur les liaisons lentes ou avec pertes :
Si les journaux affichent des occurrences répétées de `status=408 Request Time-out Connection was lost`, ajustez les temporisations de socket Baileys sous `web.whatsapp`. Commencez par raccourcir `keepAliveIntervalMs` sous le délai dinactivité de votre réseau et par augmenter `connectTimeoutMs` sur les liens lents ou avec pertes :
```json5
{
@ -560,29 +566,23 @@ Notes de comportement :
}
```
Correctif :
Correction :
```bash
openclaw doctor
openclaw logs --follow
```
Si `~/.openclaw/logs/whatsapp-health.log` indique `Gateway inactive` mais que
`openclaw gateway status` et `openclaw channels status --probe` montrent que le
Gateway et WhatsApp sont sains, exécutez `openclaw doctor`. Sur Linux, le doctor
avertit à propos des entrées crontab héritées qui invoquent encore
`~/.openclaw/bin/ensure-whatsapp.sh` ; supprimez ces entrées obsolètes avec
`crontab -e`, car cron peut ne pas disposer de lenvironnement du bus utilisateur systemd et
faire en sorte que cet ancien script signale à tort létat de santé du Gateway.
Si `~/.openclaw/logs/whatsapp-health.log` indique `Gateway inactive`, mais que `openclaw gateway status` et `openclaw channels status --probe` montrent que le Gateway et WhatsApp sont sains, exécutez `openclaw doctor`. Sous Linux, le diagnostic avertit au sujet dentrées crontab héritées qui invoquent encore `~/.openclaw/bin/ensure-whatsapp.sh` ; supprimez ces entrées obsolètes avec `crontab -e`, car cron peut ne pas disposer de lenvironnement du bus utilisateur systemd et faire en sorte que cet ancien script signale à tort létat du Gateway.
Si nécessaire, liez à nouveau avec `channels login`.
Si nécessaire, reliez avec `channels login`.
</Accordion>
<Accordion title="La connexion QR expire derrière un proxy">
Symptôme : `openclaw channels login --channel whatsapp` échoue avant dafficher un code QR utilisable avec `status=408 Request Time-out` ou une déconnexion de socket TLS.
La connexion WhatsApp Web utilise lenvironnement proxy standard de lhôte Gateway (`HTTPS_PROXY`, `HTTP_PROXY`, variantes en minuscules et `NO_PROXY`). Vérifiez que le processus Gateway hérite de lenvironnement proxy et que `NO_PROXY` ne correspond pas à `mmg.whatsapp.net`.
La connexion WhatsApp Web utilise lenvironnement proxy standard de lhôte du Gateway (`HTTPS_PROXY`, `HTTP_PROXY`, variantes en minuscules et `NO_PROXY`). Vérifiez que le processus Gateway hérite de lenvironnement proxy et que `NO_PROXY` ne correspond pas à `mmg.whatsapp.net`.
</Accordion>
@ -596,25 +596,25 @@ Notes de comportement :
<Accordion title="La réponse apparaît dans la transcription mais pas dans WhatsApp">
Les lignes de transcription enregistrent ce que lagent a généré. La livraison WhatsApp est vérifiée séparément : OpenClaw ne considère une réponse automatique comme envoyée quaprès que Baileys a renvoyé un identifiant de message sortant pour au moins un envoi de texte visible ou de média.
Les réactions daccusé sont des accusés de réception indépendants avant réponse. Une réaction réussie ne prouve pas que la réponse texte ou média ultérieure a été acceptée par WhatsApp.
Les réactions daccusé de réception sont des accusés indépendants avant réponse. Une réaction réussie ne prouve pas que la réponse texte ou média ultérieure a été acceptée par WhatsApp.
Vérifiez les journaux Gateway pour `auto-reply delivery failed` ou `auto-reply was not accepted by WhatsApp provider`.
Consultez les journaux du Gateway pour `auto-reply delivery failed` ou `auto-reply was not accepted by WhatsApp provider`.
</Accordion>
<Accordion title="Messages de groupe ignorés de façon inattendue">
<Accordion title="Messages de groupe ignorés de manière inattendue">
Vérifiez dans cet ordre :
- `groupPolicy`
- `groupAllowFrom` / `allowFrom`
- entrées de liste dautorisation `groups`
- filtrage par mention (`requireMention` + motifs de mention)
- clés en double dans `openclaw.json` (JSON5) : les entrées ultérieures remplacent les précédentes, donc conservez un seul `groupPolicy` par portée
- filtrage par mention (`requireMention` + modèles de mention)
- clés en double dans `openclaw.json` (JSON5) : les entrées ultérieures remplacent les précédentes, conservez donc un seul `groupPolicy` par portée
</Accordion>
<Accordion title="Avertissement dexécution Bun">
Lexécution Gateway de WhatsApp doit utiliser Node. Bun est signalé comme incompatible avec un fonctionnement Gateway WhatsApp/Telegram stable.
Lenvironnement dexécution du Gateway WhatsApp doit utiliser Node. Bun est signalé comme incompatible avec un fonctionnement stable du Gateway WhatsApp/Telegram.
</Accordion>
</AccordionGroup>
@ -624,30 +624,30 @@ WhatsApp prend en charge les prompts système de style Telegram pour les groupes
Hiérarchie de résolution pour les messages de groupe :
La carte `groups` effective est déterminée en premier : si le compte définit ses propres `groups`, elle remplace entièrement la carte `groups` racine (pas de fusion profonde). La recherche de prompt sexécute ensuite sur la carte unique résultante :
La carte effective `groups` est déterminée en premier : si le compte définit ses propres `groups`, elle remplace entièrement la carte racine `groups` (pas de fusion profonde). La recherche de prompt sexécute ensuite sur la carte unique résultante :
1. **Prompt système propre au groupe** (`groups["<groupId>"].systemPrompt`) : utilisé lorsque lentrée de groupe spécifique existe dans la carte **et** que sa clé `systemPrompt` est définie. Si `systemPrompt` est une chaîne vide (`""`), le caractère générique est supprimé et aucun prompt système nest appliqué.
2. **Prompt système générique de groupe** (`groups["*"].systemPrompt`) : utilisé lorsque lentrée de groupe spécifique est entièrement absente de la carte, ou lorsquelle existe mais ne définit aucune clé `systemPrompt`.
1. **Prompt système propre au groupe** (`groups["<groupId>"].systemPrompt`) : utilisé lorsque lentrée du groupe spécifique existe dans la carte **et** que sa clé `systemPrompt` est définie. Si `systemPrompt` est une chaîne vide (`""`), le caractère générique est supprimé et aucun prompt système nest appliqué.
2. **Prompt système générique de groupe** (`groups["*"].systemPrompt`) : utilisé lorsque lentrée du groupe spécifique est entièrement absente de la carte, ou lorsquelle existe mais ne définit aucune clé `systemPrompt`.
Hiérarchie de résolution pour les messages directs :
La carte `direct` effective est déterminée en premier : si le compte définit son propre `direct`, elle remplace entièrement la carte `direct` racine (pas de fusion profonde). La recherche de prompt sexécute ensuite sur la carte unique résultante :
La carte effective `direct` est déterminée en premier : si le compte définit sa propre carte `direct`, elle remplace entièrement la carte racine `direct` (pas de fusion profonde). La recherche de prompt sexécute ensuite sur la carte unique résultante :
1. **Prompt système propre au direct** (`direct["<peerId>"].systemPrompt`) : utilisé lorsque lentrée de pair spécifique existe dans la carte **et** que sa clé `systemPrompt` est définie. Si `systemPrompt` est une chaîne vide (`""`), le caractère générique est supprimé et aucun prompt système nest appliqué.
2. **Prompt système générique direct** (`direct["*"].systemPrompt`) : utilisé lorsque lentrée de pair spécifique est entièrement absente de la carte, ou lorsquelle existe mais ne définit aucune clé `systemPrompt`.
1. **Invite système spécifique au direct** (`direct["<peerId>"].systemPrompt`) : utilisée lorsque lentrée du pair spécifique existe dans la map **et** que sa clé `systemPrompt` est définie. Si `systemPrompt` est une chaîne vide (`""`), le joker est supprimé et aucune invite système nest appliquée.
2. **Invite système joker du direct** (`direct["*"].systemPrompt`) : utilisée lorsque lentrée du pair spécifique est totalement absente de la map, ou lorsquelle existe mais ne définit aucune clé `systemPrompt`.
<Note>
`dms` reste le compartiment léger de remplacement dhistorique par DM (`dms.<id>.historyLimit`). Les remplacements de prompt vivent sous `direct`.
`dms` reste le bucket léger de remplacement dhistorique par DM (`dms.<id>.historyLimit`). Les remplacements dinvites se trouvent sous `direct`.
</Note>
**Différence avec le comportement multi-compte de Telegram :** Dans Telegram, la clé racine `groups` est volontairement supprimée pour tous les comptes dans une configuration multi-compte, même les comptes qui ne définissent aucun `groups` propre, afin déviter quun bot reçoive des messages de groupes auxquels il nappartient pas. WhatsApp napplique pas cette protection : les clés racine `groups` et `direct` sont toujours héritées par les comptes qui ne définissent aucune substitution au niveau du compte, quel que soit le nombre de comptes configurés. Dans une configuration WhatsApp multi-compte, si vous voulez des prompts de groupe ou directs par compte, définissez explicitement la carte complète sous chaque compte plutôt que de vous appuyer sur les valeurs par défaut au niveau racine.
**Différence avec le comportement multi-compte de Telegram :** Dans Telegram, `groups` à la racine est volontairement supprimé pour tous les comptes dans une configuration multi-compte, même les comptes qui ne définissent pas leurs propres `groups`, afin dempêcher un bot de recevoir des messages de groupes auxquels il nappartient pas. WhatsApp napplique pas cette protection : `groups` et `direct` à la racine sont toujours hérités par les comptes qui ne définissent aucun remplacement au niveau du compte, quel que soit le nombre de comptes configurés. Dans une configuration WhatsApp multi-compte, si vous voulez des invites de groupe ou de direct par compte, définissez explicitement la map complète sous chaque compte plutôt que de vous appuyer sur les valeurs par défaut au niveau racine.
Comportement important :
- `channels.whatsapp.groups` est à la fois une carte de configuration par groupe et la liste dautorisation des groupes au niveau du chat. À la portée racine ou compte, `groups["*"]` signifie « tous les groupes sont admis » pour cette portée.
- Najoutez un `systemPrompt` de groupe générique que si vous voulez déjà que cette portée admette tous les groupes. Si vous voulez toujours que seul un ensemble fixe dID de groupes soit éligible, nutilisez pas `groups["*"]` pour la valeur par défaut du prompt. Répétez plutôt le prompt sur chaque entrée de groupe explicitement autorisée.
- Ladmission des groupes et lautorisation de lexpéditeur sont des vérifications distinctes. `groups["*"]` élargit lensemble des groupes qui peuvent atteindre le traitement des groupes, mais nautorise pas à lui seul tous les expéditeurs de ces groupes. Laccès des expéditeurs reste contrôlé séparément par `channels.whatsapp.groupPolicy` et `channels.whatsapp.groupAllowFrom`.
- `channels.whatsapp.direct` na pas le même effet de bord pour les DM. `direct["*"]` fournit uniquement une configuration par défaut pour les chats directs après quun DM a déjà été admis par `dmPolicy` plus `allowFrom` ou les règles du magasin dappairage.
- `channels.whatsapp.groups` est à la fois une map de configuration par groupe et la liste dautorisation des groupes au niveau du chat. À la racine comme au niveau du compte, `groups["*"]` signifie « tous les groupes sont admis » pour cette portée.
- Najoutez un `systemPrompt` de groupe joker que si vous voulez déjà que cette portée admette tous les groupes. Si vous voulez toujours que seul un ensemble fixe dID de groupes soit éligible, nutilisez pas `groups["*"]` comme valeur par défaut de linvite. Répétez plutôt linvite sur chaque entrée de groupe explicitement autorisée.
- Ladmission des groupes et lautorisation des expéditeurs sont deux vérifications distinctes. `groups["*"]` élargit lensemble des groupes pouvant atteindre le traitement des groupes, mais nautorise pas à lui seul chaque expéditeur dans ces groupes. Laccès des expéditeurs reste contrôlé séparément par `channels.whatsapp.groupPolicy` et `channels.whatsapp.groupAllowFrom`.
- `channels.whatsapp.direct` na pas le même effet secondaire pour les DM. `direct["*"]` fournit seulement une configuration de chat direct par défaut après quun DM a déjà été admis par `dmPolicy` plus `allowFrom` ou les règles du stockage dappairage.
Exemple :
@ -699,12 +699,12 @@ Champs WhatsApp à fort signal :
- accès : `dmPolicy`, `allowFrom`, `groupPolicy`, `groupAllowFrom`, `groups`
- livraison : `textChunkLimit`, `chunkMode`, `mediaMaxMb`, `sendReadReceipts`, `ackReaction`, `reactionLevel`
- multi-compte : `accounts.<id>.enabled`, `accounts.<id>.authDir`, substitutions au niveau du compte
- multi-compte : `accounts.<id>.enabled`, `accounts.<id>.authDir`, remplacements au niveau du compte
- opérations : `configWrites`, `debounceMs`, `web.enabled`, `web.heartbeatSeconds`, `web.reconnect.*`, `web.whatsapp.*`
- comportement de session : `session.dmScope`, `historyLimit`, `dmHistoryLimit`, `dms.<id>.historyLimit`
- prompts : `groups.<id>.systemPrompt`, `groups["*"].systemPrompt`, `direct.<id>.systemPrompt`, `direct["*"].systemPrompt`
- invites : `groups.<id>.systemPrompt`, `groups["*"].systemPrompt`, `direct.<id>.systemPrompt`, `direct["*"].systemPrompt`
## Associé
## Connexe
- [Appairage](/fr/channels/pairing)
- [Groupes](/fr/channels/groups)

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 routage de ClawSweeper ou le transfert de lactivité GitHub
summary: Graphe des tâches CI, contrôles de périmètre, regroupements de publication et équivalents de commandes locales
- Vous modifiez lenvoi ClawSweeper ou le transfert de lactivité GitHub
summary: Graphe des tâches CI, contrôles de périmètre, validations globales de release et équivalents des commandes locales
title: Pipeline CI
x-i18n:
generated_at: "2026-05-05T01:44:41Z"
generated_at: "2026-05-05T06:16:22Z"
model: gpt-5.5
provider: openai
source_hash: 16771940889d1fa944a5bfafe1152a033d96625595a2d89ff2cedbd3022cee66
source_hash: 31fe6704e18f9efc519a1a73fc3aa8ae3909d6a27553874eb477e73979a94af2
source_path: ci.md
workflow: 16
---
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 lorsque seules des zones sans rapport ont changé. Les exécutions manuelles `workflow_dispatch` contournent intentionnellement le périmétrage intelligent et déploient le graphe complet pour les candidats de release et la validation large. Les lanes Android restent opt-in via `include_android`. La couverture des Plugins réservée aux releases se trouve dans le workflow séparé [`Prépublication de Plugin`](#plugin-prerelease) et ne sexécute quà partir de [`Validation complète de release`](#full-release-validation) ou dun déclenchement manuel explicite.
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 lien ont changé. Les exécutions manuelles `workflow_dispatch` contournent intentionnellement le cadrage intelligent et déploient tout le graphe pour les release candidates et la validation large. Les lanes Android restent optionnelles 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 que depuis [`Full Release Validation`](#full-release-validation) ou un déclenchement manuel explicite.
## Vue densemble du pipeline
| Job | Objectif | Quand il sexécute |
| -------------------------------- | ------------------------------------------------------------------------------------------------------------- | ----------------------------------------------- |
| `preflight` | Détecter les changements docs-only, les périmètres modifiés, les extensions modifiées et construire le manifeste CI | Toujours sur les pushs non brouillons et les PR |
| `security-scm-fast` | Détection de clés privées et audit des workflows via `zizmor` | Toujours sur les pushs non brouillons et les PR |
| `security-dependency-audit` | Audit du lockfile de production sans dépendances par rapport aux avis npm | Toujours sur les pushs non brouillons et les PR |
| `security-fast` | Agrégat requis pour les jobs de sécurité rapides | Toujours sur les pushs non brouillons et les PR |
| `check-dependencies` | Passe Knip de production limitée aux dépendances, plus garde allowlist des fichiers inutilisés | Changements pertinents pour Node |
| `build-artifacts` | Construire `dist/`, la Control UI, les vérifications dartefacts construits et les artefacts aval réutilisables | Changements pertinents pour Node |
| `checks-fast-core` | Lanes de correction Linux rapides, comme les vérifications bundled/plugin-contract/protocol | Changements pertinents pour Node |
| `checks-fast-contracts-channels` | Vérifications sharded des contrats de canaux 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 canaux, bundled, contrats et extensions | Changements pertinents pour Node |
| `check` | Équivalent sharded de la porte locale principale : types prod, lint, gardes, types de test et smoke strict | Changements pertinents pour Node |
| `check-additional` | Architecture, drift sharded des frontières/prompts, gardes dextension, frontière de package et Gateway watch | Changements pertinents pour Node |
| `build-smoke` | Tests smoke de la CLI construite et smoke de mémoire au démarrage | Changements pertinents pour Node |
| `checks` | Vérificateur pour les tests de canaux sur artefacts construits | Changements pertinents pour Node |
| `checks-node-compat-node22` | Lane de build et smoke de compatibilité Node 22 | Déclenchement CI manuel pour les releases |
| `check-docs` | Formatage, lint et vérifications de liens brisés de la documentation | Docs modifiées |
| `skills-python` | Ruff + pytest pour les skills adossées à Python | Changements pertinents pour les skills Python |
| `checks-windows` | Tests de processus/chemins propres à Windows, plus régressions partagées des spécificateurs dimport runtime | Changements pertinents pour Windows |
| `macos-node` | Lane de tests TypeScript macOS utilisant les artefacts construits 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 APK debug | Changements pertinents pour Android |
| `test-performance-agent` | Optimisation quotidienne par Codex des tests lents 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 | Dispatch planifié et manuel |
| Job | Objectif | Quand il sexécute |
| -------------------------------- | --------------------------------------------------------------------------------------------------------- | ------------------------------------------- |
| `preflight` | Détecter les changements limités aux docs, les scopes modifiés, les extensions modifiées et construire le manifeste CI | Toujours sur les pushes et PR non brouillons |
| `security-scm-fast` | Détection de clés privées et audit de workflow via `zizmor` | Toujours sur les pushes et PR non brouillons |
| `security-dependency-audit` | Audit du lockfile de production, sans dépendances, par rapport aux advisories npm | Toujours sur les pushes et PR non brouillons |
| `security-fast` | Agrégat requis pour les jobs de sécurité rapides | Toujours sur les pushes et PR non brouillons |
| `check-dependencies` | Passe Knip de production limitée aux dépendances, plus garde de la liste dautorisation des fichiers inutilisés | Changements liés à Node |
| `build-artifacts` | Construire `dist/`, lUI de contrôle, les vérifications dartefacts construits et les artefacts réutilisables en aval | Changements liés à Node |
| `checks-fast-core` | Lanes rapides de correction Linux, comme les vérifications groupées/contrat Plugin/protocole | Changements liés à Node |
| `checks-fast-contracts-channels` | Vérifications fragmentées des contrats de canaux avec un résultat agrégé stable | Changements liés à Node |
| `checks-node-core-test` | Fragments de tests Core Node, hors lanes canal, groupées, contrat et extension | Changements liés à Node |
| `check` | Équivalent fragmenté de la gate locale principale : types prod, lint, gardes, types de test et smoke strict | Changements liés à Node |
| `check-additional` | Architecture, dérive fragmentée des limites/prompts, gardes dextension, limite de package et surveillance Gateway | Changements liés à Node |
| `build-smoke` | Tests smoke de la CLI construite et smoke mémoire au démarrage | Changements liés à Node |
| `checks` | Vérificateur pour les tests de canaux sur artefacts construits | Changements liés à Node |
| `checks-node-compat-node22` | Build de compatibilité Node 22 et lane smoke | Déclenchement manuel CI 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ées à Python | Changements liés aux Skills Python |
| `checks-windows` | Tests spécifiques à Windows sur processus/chemins, plus régressions partagées de spécificateurs dimport runtime | Changements liés à Windows |
| `macos-node` | Lane de tests TypeScript macOS utilisant les artefacts construits partagés | Changements liés à macOS |
| `macos-swift` | Lint, build et tests Swift pour lapp macOS | Changements liés à macOS |
| `android` | Tests unitaires Android pour les deux saveurs, plus un build APK de debug | Changements liés à Android |
| `test-performance-agent` | Optimisation quotidienne des tests lents Codex après activité fiable | Succès CI principal ou déclenchement manuel |
| `openclaw-performance` | Rapports quotidiens/à la demande de performance runtime Kova avec lanes fournisseur mock, profil profond et GPT 5.4 live | Déclenchement planifié et manuel |
## Ordre fail-fast
## Ordre déchec rapide
1. `preflight` décide quelles lanes existent réellement. Les logiques `docs-scope` et `changed-scope` sont des étapes dans 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 de matrice dartefacts et 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`.
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 de matrice artefacts et 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.
4. Les lanes plus lourdes de plateforme 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 les 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 lexécution la plus récente pour la même ref échoue aussi. Les vérifications agrégées des shards utilisent `!cancelled() && always()` afin de toujours signaler les échecs normaux de shards, mais 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 plus récentes sur main. Les exécutions manuelles de suite complète utilisent `CI-manual-v1-*` et nannulent pas les exécutions en cours.
GitHub peut marquer les jobs supplantés comme `cancelled` lorsquun push plus récent arrive sur la même PR ou référence `main`. Traitez cela comme du bruit CI, sauf si lexécution la plus récente pour la même référence échoue aussi. Les vérifications agrégées de fragments utilisent `!cancelled() && always()` afin de signaler quand même les échecs normaux de fragments, 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 nouvelles exécutions main. Les exécutions manuelles de suite complète utilisent `CI-manual-v1-*` et nannulent pas les exécutions en cours.
## Périmètre et routage
## Scope et routage
La logique de périmètre 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 périmétrée avait changé.
La logique de scope se trouve dans `scripts/ci-changed-scope.mjs` et est couverte par des tests unitaires dans `src/scripts/ci-changed-scope.test.ts`. Le déclenchement manuel ignore la détection changed-scope et fait agir le manifeste preflight comme si chaque zone scopée avait changé.
- **Les modifications de workflows CI** valident le graphe CI Node plus le linting de 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 de fixtures de tests cœur peu coûteuses, et les modifications étroites daides/tests de routage des contrats de Plugin** utilisent un chemin de manifeste rapide limité à Node : `preflight`, sécurité et une seule tâche `checks-fast-core`. Ce chemin ignore les artefacts de build, la compatibilité Node 22, les contrats de canaux, les shards complets du cœur, les shards de Plugins bundled et les matrices de gardes additionnelles lorsque le changement est limité aux surfaces de routage ou daides que la tâche rapide exerce directement.
- **Les vérifications Windows Node** sont limitées aux wrappers de processus/chemins propres à Windows, aux aides de runners npm/pnpm/UI, à la configuration de gestionnaire de packages et aux surfaces de workflows CI qui exécutent cette lane ; les changements sans rapport de sources, de Plugins, dinstall-smoke et de tests seuls restent sur les lanes Linux Node.
- **Les modifications des workflows CI** valident le graphe CI Node et 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 daides/tests de routage de contrats Plugin** utilisent un chemin de manifeste rapide limité à Node : `preflight`, sécurité et une seule tâche `checks-fast-core`. Ce chemin ignore les artefacts de build, la compatibilité Node 22, les contrats de canaux, les fragments core complets, les fragments de Plugins groupés et les matrices de gardes additionnelles lorsque le changement se limite aux surfaces de routage ou daides que la tâche rapide exerce directement.
- **Les vérifications Node Windows** sont limitées aux wrappers processus/chemins spécifiques à Windows, aux aides npm/pnpm/runner UI, à la config de gestionnaire de packages et aux surfaces de workflow CI qui exécutent cette lane ; les changements de sources, Plugin, install-smoke et tests seuls sans lien restent sur les lanes Linux Node.
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 canaux sexécutent en trois shards pondérés, les lanes rapides/support dunités cœur sexécutent séparément, linfrastructure runtime cœur est divisée entre shards détat et de processus/config, auto-reply sexécute avec des workers équilibrés (avec le sous-arbre reply divisé en shards agent-runner, dispatch et commands/state-routing), et les configurations agentiques Gateway/server sont divisées entre lanes chat/auth/model/http-plugin/runtime/startup au lieu dattendre les artefacts construits. Les tests larges de navigateur, QA, médias et Plugins divers utilisent leurs configurations Vitest dédiées plutôt que le catch-all partagé des Plugins. Les shards par motifs dinclusion enregistrent les entrées de timing avec le nom de shard CI, afin que `.artifacts/vitest-shard-timings.json` puisse distinguer une configuration complète 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 Gateway watch ; la liste des gardes de frontière est répartie sur quatre shards de matrice, chacun exécutant des gardes indépendantes sélectionnées en parallèle et affichant les timings par vérification, y compris `pnpm prompt:snapshots:check`, afin que le drift des prompts du chemin heureux du runtime Codex soit rattaché à la PR qui la causé. Gateway watch, les tests de canaux et le shard de frontière de support du cœur sexécutent en parallèle dans `build-artifacts` après que `dist/` et `dist-runtime/` ont déjà été construits.
Les familles de tests Node les plus lentes sont découpées ou équilibrées afin que chaque job reste petit sans sur-réserver les runners : les contrats de canaux sexécutent en trois fragments pondérés, les lanes core unit fast/support sexécutent séparément, linfrastructure runtime core est répartie entre des fragments state et process/config, auto-reply sexécute en workers équilibrés (avec le sous-arbre reply découpé en fragments agent-runner, dispatch et commands/state-routing), et les configs agentic gateway/server sont réparties entre les lanes chat/auth/model/http-plugin/runtime/startup au lieu dattendre les artefacts 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 fragments par motifs dinclusion enregistrent les entrées de timing avec le nom de fragment CI, afin que `.artifacts/vitest-shard-timings.json` puisse distinguer une config entière dun fragment filtré. `check-additional` regroupe le travail de compilation/canary package-boundary et sépare larchitecture de topologie runtime de la couverture de surveillance Gateway ; la liste des gardes de limites est répartie sur quatre fragments de matrice, chacun exécutant des gardes indépendants sélectionnés en parallèle et imprimant les timings par vérification, y compris `pnpm prompt:snapshots:check` afin que la dérive du prompt du chemin heureux runtime Codex soit rattachée à la PR qui la causée. La surveillance Gateway, les tests de canaux et le fragment support-boundary core sexécutent en parallèle dans `build-artifacts` une fois `dist/` et `dist-runtime/` déjà construits.
La CI Android exécute à la fois `testPlayDebugUnitTest` et `testThirdPartyDebugUnitTest`, puis construit lAPK debug Play. Le flavor third-party na pas de source set ni de manifeste séparés ; sa lane de tests unitaires compile tout de même le flavor avec les indicateurs BuildConfig SMS/call-log, tout en évitant un job de packaging APK debug dupliqué à chaque push pertinent pour Android.
Android CI exécute à la fois `testPlayDebugUnitTest` et `testThirdPartyDebugUnitTest`, puis construit lAPK de debug Play. La saveur tierce na pas de source set ni de manifeste séparé ; sa lane de tests unitaires compile quand même la saveur avec les indicateurs BuildConfig SMS/journal dappels, tout en évitant un job de packaging APK de debug en double à chaque push lié à 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 avec `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 Plugins dynamiques, générées, de build, de live-test et de pont de packages que Knip ne peut pas résoudre statiquement.
Le fragment `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 constats de fichiers de production inutilisés de Knip à `scripts/deadcode-unused-files.allowlist.mjs`. La garde unused-file échoue lorsquune PR ajoute un nouveau fichier inutilisé non révisé ou laisse une entrée obsolète dans la liste dautorisation, tout en préservant les surfaces intentionnelles de Plugins dynamiques, générées, de build, de tests live et de ponts de packages que Knip ne peut pas résoudre statiquement.
## Transfert de lactivité 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 jeton GitHub App à partir de `CLAWSWEEPER_APP_PRIVATE_KEY`, puis envoie des payloads `repository_dispatch` compacts à `openclaw/clawsweeper`.
`.github/workflows/clawsweeper-dispatch.yml` est le pont côté cible depuis lactivité du dépôt OpenClaw vers ClawSweeper. Il ne checkout pas et nexécute pas de code de pull request non fiable. Le workflow crée un jeton 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 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` ;
- `clawsweeper_commit_review` pour les demandes de revue au niveau commit sur les pushes 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 ditem, URL, titre, état et courts extraits pour les commentaires ou revues lorsquils sont présents. Elle évite intentionnellement 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 les 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 revues lorsquils sont présents. Elle évite intentionnellement 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é dans 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 doit publier dans `#clawsweeper` que lorsque lévénement est surprenant, actionnable, risqué ou utile opérationnellement. Les ouvertures, modifications, bruit de bots, bruit de Webhooks dupliqués et trafic normal de revue doivent produire `NO_REPLY`.
Lactivité générale relève de lobservation, pas de la 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, bruit de bots, bruit de Webhook dupliqué et trafic de revue normal doivent produire `NO_REPLY`.
Traitez les titres, commentaires, corps, textes de revue, noms de branches et messages de commit GitHub comme des données non fiables sur tout 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.
Traitez les titres, commentaires, corps, textes de revue, 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.
## Dispatches manuels
## Déclenchements manuels
Les dispatches CI manuels exécutent le même graphe de jobs que la CI normale, mais activent de force chaque lane à portée non Android : shards Linux Node, shards de plugins groupés, contrats de canaux, compatibilité Node 22, `check`, `check-additional`, smoke de build, vérifications de docs, Skills Python, Windows, macOS et i18n de Control UI. Les dispatches CI manuels autonomes exécutent uniquement Android avec `include_android=true`; lumbrella de version complète active Android en passant `include_android=true`. Les vérifications statiques de préversion de Plugin, le shard `agentic-plugins` réservé aux releases, le balayage complet par lots des extensions et les lanes Docker de préversion de Plugin sont exclus de la CI. La suite de préversion Docker sexécute uniquement lorsque `Full Release Validation` dispatche le workflow `Plugin Prerelease` séparé avec la gate de validation de release activée.
Les dispatchs CI manuels exécutent le même graphe de tâches que la CI normale, mais forcent lactivation de chaque lane à portée non Android : shards Linux Node, shards de plugins intégrés, contrats de canaux, compatibilité Node 22, `check`, `check-additional`, smoke de build, vérifications docs, Skills Python, Windows, macOS et i18n Control UI. Les dispatchs CI manuels autonomes exécutent uniquement Android avec `include_android=true` ; lombrelle de release complète active Android en passant `include_android=true`. Les vérifications statiques de prérelease Plugin, le shard `agentic-plugins` réservé aux releases, le balayage complet par lot des extensions et les lanes Docker de prérelease Plugin sont exclus de la CI. La suite Docker de prérelease sexécute uniquement lorsque `Full Release Validation` dispatche le workflow `Plugin Prerelease` distinct 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 version candidate ne soit pas annulée par une autre exécution de push ou de PR sur la même ref. Lentrée facultative `target_ref` permet à un appelant de confiance dexécuter ce graphe contre une branche, un tag ou un SHA de commit complet tout en utilisant le fichier de workflow de 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 une autre exécution de push ou de PR sur la même ref. Lentrée facultative `target_ref` permet à un appelant de confiance dexécuter ce graphe sur une branche, une balise ou un SHA de commit complet tout en utilisant le fichier de workflow de 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 |
| Runner | Tâches |
| -------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `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/plugins groupés, 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 de 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 |
| `ubuntu-24.04` | `preflight`, tâches de sécurité rapides et agrégats (`security-scm-fast`, `security-dependency-audit`, `security-fast`), vérifications rapides de protocole/contrat/intégrés, vérifications de contrats de canaux en shards, 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 dattente 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 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 dattente de file 32 vCPU coûtait plus quil néconomisait) |
| `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économisaient) ; 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 se rabattent sur `macos-latest` |
| `blacksmith-12vcpu-macos-latest` | `macos-swift` sur `openclaw/openclaw` ; les forks se rabattent sur `macos-latest` |
| `blacksmith-6vcpu-macos-latest` | `macos-node` sur `openclaw/openclaw` ; les forks se rabattent sur `macos-latest` |
| `blacksmith-12vcpu-macos-latest` | `macos-swift` sur `openclaw/openclaw` ; les forks se rabattent sur `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
```
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 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.
Le dispatch manuel benchmarke normalement la ref du workflow. Définissez `target_ref` pour benchmarker une balise de release ou une autre branche avec limplémentation actuelle du workflow. Les chemins de rapports publiés et les pointeurs latest sont indexés par la ref testée, et chaque `index.md` consigne 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énario.
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 contre un runtime buildé localement avec une fausse authentification déterministe compatible OpenAI.
- `mock-deep-profile` : profilage CPU/tas/trace pour les points chauds au démarrage, dans le Gateway et lors dun tour dagent.
- `live-gpt54` : un vrai tour dagent OpenAI `openai/gpt-5.4`, ignoré quand `OPENAI_API_KEY` nest pas disponible.
- `mock-provider` : scénarios de diagnostic Kova contre un runtime de build local avec une authentification compatible OpenAI factice et déterministe.
- `mock-deep-profile` : profilage CPU/heap/trace pour les points chauds de démarrage, Gateway et tour 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 de source natives OpenClaw après le passage Kova : timing de démarrage du Gateway et mémoire dans les cas de démarrage par défaut, avec hook et avec 50 plugins ; boucles répétées de salutations `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é.
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 des sondes 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. Quand `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`.
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 sonde source dans `openclaw/clawgrit-reports` sous `openclaw-performance/<tested-ref>/<run-id>-<attempt>/<lane>/`. Le pointeur actuel de la ref testée est écrit comme `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, dispatche le workflow `CI` manuel avec cette cible, dispatche `Plugin Prerelease` pour les preuves réservées aux releases de Plugin/package/statique/Docker, et dispatche `OpenClaw Release Checks` pour le smoke dinstallation, lacceptation de package, les vérifications de package multi-OS, la parité QA Lab, Matrix et les lanes Telegram. Les exécutions stables/par défaut gardent la couverture exhaustive live/E2E et du chemin de release Docker derrière `run_release_soak=true` ; `release_profile=full` force lactivation de cette couverture soak afin que la validation large des avis reste large. 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, 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, une balise ou un SHA de commit complet, dispatche le workflow manuel `CI` avec cette cible, dispatche `Plugin Prerelease` pour la preuve plugins/packages/statique/Docker réservée aux releases, et dispatche `OpenClaw Release Checks` pour le smoke dinstallation, lacceptation de package, les vérifications de package cross-OS, la parité QA Lab, Matrix et les lanes Telegram. Les exécutions stables/par défaut gardent la couverture live/E2E exhaustive et le chemin de release Docker derrière `run_release_soak=true` ; `release_profile=full` force cette couverture soak afin que la validation dadvisory large reste large. 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, passez `npm_telegram_package_spec` pour relancer la même lane de package Telegram contre le package npm publié.
Voir [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.
Consultez [Validation complète de release](/fr/reference/full-release-validation) pour la
matrice détapes, les noms exacts des tâches de workflow, les différences de profils, les artefacts et
les handles de relance ciblés.
`OpenClaw Release Publish` est le workflow de release manuel et mutateur. Dispatchez-le
depuis `release/YYYY.M.D` ou `main` après lexistence du tag de release et après la
depuis `release/YYYY.M.D` ou `main` après lexistence de la balise de release et après la
réussite du preflight npm OpenClaw. Il vérifie `pnpm plugins:sync:check`,
dispatche `Plugin NPM Release` pour tous les packages de Plugin publiables, dispatche
dispatche `Plugin NPM Release` pour tous les packages Plugin publiables, dispatche
`Plugin ClawHub Release` pour le même SHA de release, puis seulement ensuite dispatche
`OpenClaw NPM Release` avec le `preflight_run_id` enregistré.
@ -180,39 +180,39 @@ gh workflow run openclaw-release-publish.yml \
-f npm_dist_tag=beta
```
Pour une preuve par commit épinglé sur une branche qui évolue vite, utilisez laide au lieu de
Pour une preuve de commit épinglé sur une branche qui évolue vite, utilisez lassistant au lieu de
`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. Laide pousse une branche temporaire `release-ci/<sha>-...` au SHA cible,
Les refs de dispatch de workflow GitHub doivent être des branches ou des balises, pas des SHA de commit bruts. Lassistant pousse une branche temporaire `release-ci/<sha>-...` au SHA cible,
dispatche `Full Release Validation` depuis cette ref épinglée, vérifie que chaque
workflow enfant a un `headSha` qui correspond à la cible, et supprime la branche temporaire quand
lexécution se termine. Le vérificateur umbrella échoue aussi si un workflow enfant sest exécuté à un
workflow enfant `headSha` 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 publication. Les workflows de publication manuels utilisent `stable` par défaut ; utilisez `full` uniquement lorsque vous voulez intentionnellement la large matrice consultative de fournisseurs/médias. `run_release_soak` contrôle si les vérifications de publication stables/par défaut exécutent le soak exhaustif live/E2E et Docker du chemin de publication ; `full` force lactivation du soak.
`release_profile` contrôle létendue live/fournisseur transmise aux vérifications de publication. Les workflows de publication manuelle utilisent `stable` par défaut ; utilisez `full` seulement lorsque vous voulez intentionnellement la large matrice consultative de fournisseurs/médias. `run_release_soak` contrôle si les vérifications de publication stables/par défaut exécutent le soak exhaustif live/E2E et Docker du chemin de publication ; `full` force lactivation du soak.
- `minimum` conserve les lanes OpenAI/core critiques pour la publication les plus rapides.
- `stable` ajoute lensemble stable de fournisseurs/backends.
- `minimum` conserve les lanes critiques de publication OpenAI/core les plus rapides.
- `stable` ajoute lensemble stable de fournisseurs/back-ends.
- `full` exécute la large matrice consultative de fournisseurs/médias.
Lumbrella 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 afin dactualiser le résultat umbrella et le récapitulatif des timings.
Le workflow parapluie 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 parapluie et le résumé des timings.
Pour la récupération, `Full Release Validation` et `OpenClaw Release Checks` acceptent tous deux `rerun_group`. Utilisez `all` pour un candidat de publication, `ci` uniquement pour lenfant CI complet normal, `plugin-prerelease` uniquement pour lenfant de prépublication de Plugin, `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 lumbrella. Cela permet de borner la relance dune boîte de publication échouée après un correctif ciblé. Pour une lane cross-OS échouée, combinez `rerun_group=cross-os` avec `cross_os_suite_filter`, par exemple `windows/packaged-upgrade` ; les longues commandes cross-OS émettent des lignes Heartbeat et les récapitulatifs packaged-upgrade incluent les timings par phase. Les lanes QA des release-checks sont consultatives, donc les échecs QA uniquement avertissent, mais ne bloquent pas le vérificateur des release-checks.
Pour la récupération, `Full Release Validation` et `OpenClaw Release Checks` acceptent tous deux `rerun_group`. Utilisez `all` pour un candidat de publication, `ci` uniquement pour lenfant CI complet normal, `plugin-prerelease` uniquement pour lenfant de prépublication de Plugin, `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 parapluie. Cela permet de borner la relance dune boîte de publication échouée après une correction ciblée. Pour une seule lane cross-OS échouée, combinez `rerun_group=cross-os` avec `cross_os_suite_filter`, par exemple `windows/packaged-upgrade` ; les longues commandes cross-OS émettent des lignes de heartbeat et les résumés packaged-upgrade incluent les timings par phase. Les lanes QA des vérifications de publication sont consultatives ; les échecs uniquement QA avertissent donc sans bloquer le vérificateur des vérifications de publication.
`OpenClaw Release Checks` utilise la référence de workflow de confiance pour résoudre la référence sélectionnée une fois en une archive `release-package-under-test`, puis transmet cet artefact aux vérifications cross-OS et à Package Acceptance, ainsi quau workflow Docker live/E2E du chemin de publication lorsque la couverture de soak sexécute. Cela garde les octets du package cohérents entre les boîtes de publication et évite de reconditionner le même candidat dans plusieurs tâches enfants.
`OpenClaw Release Checks` utilise la ref de workflow approuvée pour résoudre la ref sélectionnée une fois en une archive tar `release-package-under-test`, puis transmet cet artefact aux vérifications cross-OS et à lacceptation du package, ainsi quau workflow Docker live/E2E du chemin de publication lorsque la couverture de soak sexécute. Cela garde les octets du package cohérents entre les boîtes de publication et évite de reconditionner le même candidat dans plusieurs tâches enfants.
Les exécutions `Full Release Validation` dupliquées pour `ref=main` et `rerun_group=all`
remplacent lumbrella plus ancien. Le moniteur parent annule tout workflow enfant
quil a déjà déclenché lorsque le parent est annulé, afin que la validation main
plus récente ne reste pas derrière une ancienne exécution de release-check de deux heures. La validation de branche/tag de publication et les groupes de relance ciblés conservent `cancel-in-progress: false`.
Les exécutions `Full Release Validation` en double pour `ref=main` et `rerun_group=all`
remplacent le workflow parapluie plus ancien. Le moniteur parent annule tout workflow enfant
quil a déjà déclenché lorsque le parent est annulé, de sorte quune validation main plus récente
ne reste pas bloquée derrière une exécution obsolète de vérifications de publication de deux heures. La validation de branche/tag de publication et les groupes de relance ciblés conservent `cancel-in-progress: false`.
## Shards live et E2E
## Fragments live et E2E
Lenfant live/E2E de publication conserve une large couverture native `pnpm test:live`, mais lexécute sous forme de 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 sous forme de fragments nommés via `scripts/test-live-shard.mjs` au lieu dune seule tâche sérielle :
- `native-live-src-agents`
- `native-live-src-gateway-core`
@ -224,61 +224,61 @@ Lenfant live/E2E de publication conserve une large couverture native `pnpm te
- `native-live-extensions-openai`
- `native-live-extensions-o-z-other`
- `native-live-extensions-xai`
- shards média audio/vidéo séparés et shards musique filtrés par fournisseur
- fragments audio/vidéo média séparés et fragments musique filtrés par fournisseur
Cela conserve 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 les relances manuelles ponctuelles.
Cela conserve la même couverture de fichiers tout en rendant les échecs lents de fournisseurs live plus faciles à relancer et à diagnostiquer. Les noms de fragments 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 vérifient seulement les binaires avant la configuration. Gardez les suites live adossées à Docker sur des runners Blacksmith normaux — les tâches conteneurisées ne sont pas le bon endroit pour lancer des tests Docker imbriqués.
Les fragments 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 vérifient seulement les binaires avant la configuration. Gardez les suites live adossées à Docker sur des runners Blacksmith normaux : les tâches conteneurisées ne sont pas lendroit approprié pour lancer des tests Docker imbriqués.
Les shards live modèle/backend adossés à Docker utilisent une image partagée distincte `ghcr.io/openclaw/openclaw-live-test:<sha>` par commit sélectionné. Le workflow de publication live construit et pousse cette image une seule fois, puis les shards modèle live Docker, Gateway segmenté par fournisseur, backend CLI, liaison ACP et harnais Codex sexécutent avec `OPENCLAW_SKIP_DOCKER_BUILD=1`. Les shards Docker Gateway portent des plafonds explicites de `timeout` au niveau du script, inférieurs au délai dexpiration de la tâche du workflow, afin quun conteneur bloqué ou un chemin de nettoyage échoue rapidement au lieu de consommer tout le budget des release-checks. 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 constructions dimage dupliquées.
Les fragments live de modèles/back-ends adossés à Docker utilisent une image partagée distincte `ghcr.io/openclaw/openclaw-live-test:<sha>` pour chaque commit sélectionné. Le workflow de publication live construit et pousse cette image une fois, puis les fragments Docker live de modèles, Gateway par fournisseur, back-end CLI, liaison ACP et harnais Codex sexécutent avec `OPENCLAW_SKIP_DOCKER_BUILD=1`. Les fragments Gateway Docker portent des limites `timeout` explicites au niveau du script, inférieures au délai dexpiration de la tâche du workflow, afin quun conteneur bloqué ou un chemin de nettoyage échoue rapidement au lieu de consommer tout le budget des vérifications de publication. Si ces fragments reconstruisent indépendamment la cible Docker source complète, lexécution de publication est mal configurée et gaspillera du temps réel en constructions dimages dupliquées.
## Package Acceptance
## Acceptation du package
Utilisez `Package Acceptance` lorsque la question est : « ce package OpenClaw installable fonctionne-t-il comme produit ? » Cest différent de la CI normale : la CI normale valide larborescence source, tandis que Package Acceptance valide une seule archive via le même harnais Docker E2E que les utilisateurs exercent après une installation ou une mise à jour.
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 source, tandis que lacceptation du package valide une seule archive tar via le même harnais Docker E2E que les utilisateurs exercent après installation ou mise à jour.
### Tâches
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, prépare les images Docker package-digest si nécessaire, et exécute les lanes Docker sélectionnées contre ce package au lieu de packager 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 fois, puis distribue ces lanes en 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` lorsque Package Acceptance en a résolu un ; un déclenchement Telegram autonome peut toujours installer une spec 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 un candidat package unique, é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 ref de workflow, la ref 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 à résumé de package si nécessaire, et exécute les lanes Docker sélectionnées contre ce package au lieu de conditionner 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 fois, puis diffuse ces lanes en 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` lorsque lacceptation du package 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 facultative a échoué.
### Sources de candidats
- `source=npm` accepte uniquement `openclaw@beta`, `openclaw@latest` ou une version de publication OpenClaw exacte telle que `openclaw@2026.4.27-beta.2`. Utilisez cela pour lacceptation de prépublication/stable publiée.
- `source=ref` package 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é, puis le package avec `scripts/package-openclaw-for-docker.mjs`.
- `source=npm` accepte uniquement `openclaw@beta`, `openclaw@latest` ou une version de publication OpenClaw exacte telle que `openclaw@2026.4.27-beta.2`. Utilisez cela pour lacceptation de prépublication/publication stable publiée.
- `source=ref` conditionne 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 depuis un tag de publication, installe les dépendances dans un worktree détaché, puis le conditionne 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 optionnel, mais devrait être fourni pour les artefacts partagés en externe.
- `source=artifact` télécharge un seul `.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 de confiance qui exécute le test. `package_ref` est le commit source qui est packagé lorsque `source=ref`. Cela permet au harnais de test actuel de valider danciens commits source de confiance sans exécuter lancienne logique de workflow.
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 conditionné lorsque `source=ref`. Cela permet au harnais de test actuel de valider danciens commits source approuvés sans exécuter une ancienne 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 du chemin de publication avec OpenWebUI
- `full`fragments Docker complets du chemin de publication avec OpenWebUI
- `custom``docker_lanes` exactes ; requis lorsque `suite_profile=custom`
Le profil `package` utilise une couverture Plugin hors ligne afin que la validation du 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 spec npm publiée conservé pour les déclenchements autonomes.
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 facultative réutilise lartefact `package-under-test` dans `NPM Telegram Beta E2E`, tandis que le chemin de spécification npm publiée est conservé pour les déclenchements autonomes.
Pour la politique dédiée de test des mises à jour et des Plugins, y compris les commandes locales,
les lanes Docker, les entrées Package Acceptance, les valeurs par défaut de publication et le triage des échecs,
Pour la politique dédiée de mise à jour et de test des Plugins, y compris les commandes locales,
les lanes Docker, les entrées dacceptation du package, 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 release checks appellent Package Acceptance avec `source=artifact`, lartefact de package de publication préparé, `suite_profile=custom`, `docker_lanes='doctor-switch update-channel-switch upgrade-survivor published-upgrade-survivor plugins-offline plugin-update'` et `telegram_mode=mock-openai`. Cela garde la preuve de migration de package, mise à jour, nettoyage de dépendances de Plugin obsolètes, réparation dinstallation de Plugin configuré, Plugin hors ligne, mise à jour de Plugin et Telegram sur la même archive 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é plutôt que lartefact construit depuis le SHA. Les release checks cross-OS couvrent toujours lonboarding, linstalleur et le comportement de plateforme propres à lOS ; la validation produit package/mise à jour devrait commencer par Package Acceptance. La lane Docker `published-upgrade-survivor` valide une base de référence de package publié par exécution dans le chemin de publication bloquant. Dans Package Acceptance, larchive `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. Full Release Validation avec `run_release_soak=true` ou `release_profile=full` définit `published_upgrade_survivor_baselines=all-since-2026.4.23` et `published_upgrade_survivor_scenarios=reported-issues` pour étendre la couverture à chaque publication npm stable de `2026.4.23` à `latest` et à des fixtures calquées sur les issues pour la configuration Feishu, les fichiers bootstrap/persona préservés, les installations de Plugin OpenClaw configurées, les chemins de journaux avec tilde et les racines de dépendances de Plugin héritées obsolètes. Le workflow distinct `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 specs de package exactes avec `OPENCLAW_UPGRADE_SURVIVOR_BASELINE_SPECS`, conserver 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 Windows fresh packagées et installeur vérifient également quun package installé peut importer un remplacement browser-control depuis un chemin Windows absolu brut. Le smoke agent-turn cross-OS 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.
Les vérifications de publication appellent lacceptation du package avec `source=artifact`, lartefact de package de publication préparé, `suite_profile=custom`, `docker_lanes='doctor-switch update-channel-switch upgrade-survivor published-upgrade-survivor plugins-offline plugin-update'` et `telegram_mode=mock-openai`. Cela garde la migration de package, la mise à jour, le nettoyage de dépendances de Plugins obsolètes, la réparation dinstallation de Plugins configurés, le Plugin hors ligne, la mise à jour de Plugins 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 publié au lieu de lartefact construit depuis le SHA. Les vérifications de publication cross-OS couvrent toujours lintégration, linstalleur et le comportement de plateforme propres à lOS ; la validation produit du package/de la mise à jour devrait commencer par lacceptation du package. La lane Docker `published-upgrade-survivor` valide une ligne de base de package publié par exécution dans le chemin de publication bloquant. Dans lacceptation du package, larchive tar `package-under-test` résolue est toujours le candidat et `published_upgrade_survivor_baseline` sélectionne la ligne de base publiée de repli, par défaut `openclaw@latest` ; les commandes de relance de lane échouée préservent cette ligne de base. Full Release Validation avec `run_release_soak=true` ou `release_profile=full` définit `published_upgrade_survivor_baselines='last-stable-4 2026.4.23 2026.5.2 2026.4.15'` et `published_upgrade_survivor_scenarios=reported-issues` afin délargir aux quatre dernières publications npm stables plus des publications de frontière de compatibilité Plugin épinglées et des fixtures en forme de problèmes pour la configuration Feishu, les fichiers bootstrap/persona préservés, les installations de Plugins OpenClaw configurées, les chemins de journaux avec tilde et les racines de dépendances de Plugins héritées obsolètes. Les sélections published-upgrade survivor multi-lignes de base sont fragmentées par ligne de base en tâches runner Docker ciblées séparées. Le workflow distinct `Update Migration` utilise la lane Docker `update-migration` avec `all-since-2026.4.23` et `plugin-deps-cleanup` lorsque la question est le nettoyage exhaustif des mises à jour publiées, et non létendue normale de la CI Full Release. Les exécutions agrégées locales peuvent transmettre des spécifications de package exactes avec `OPENCLAW_UPGRADE_SURVIVOR_BASELINE_SPECS`, conserver 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 ligne de base 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 packagées et installeur vérifient aussi quun package installé peut importer une surcharge browser-control depuis un chemin Windows absolu brut. Le smoke de tour dagent OpenAI cross-OS 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 bornées de compatibilité héritée 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 package 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é :
- 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 package nexpose pas cet indicateur ;
- `update-channel-switch` peut élaguer les `pnpm.patchedDependencies` manquantes depuis la fixture fake git dérivée de larchive et peut journaliser labsence de `update.channel` persisté ;
- les smokes de Plugin peuvent lire danciens emplacements denregistrements dinstallation ou accepter labsence de persistance de lenregistrement dinstallation 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 tar ;
- `doctor-switch` peut ignorer le sous-cas de persistance `gateway install --wrapper` lorsque le package nexpose pas ce flag ;
- `update-channel-switch` peut retirer les `pnpm.patchedDependencies` manquantes de la fixture git factice dérivée de larchive tar et peut journaliser labsence de `update.channel` persisté ;
- les smokes de Plugin peuvent lire les emplacements hérités des enregistrements 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 que lenregistrement dinstallation et le comportement sans réinstallation restent inchangés.
Le package publié `2026.4.26` peut aussi avertir pour les fichiers dempreinte de métadonnées de build locales qui avaient 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 émettre un avertissement pour des fichiers dhorodatage de métadonnées de build local qui avaient déjà été livrés. Les paquets ultérieurs doivent satisfaire aux contrats modernes ; les mêmes conditions échouent au lieu davertir ou dêtre ignorées.
### Exemples
@ -321,151 +321,151 @@ gh workflow run package-acceptance.yml \
-f docker_lanes='install-e2e plugin-update'
```
Lorsque vous déboguez une exécution dacceptation de package échouée, commencez par le récapitulatif `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 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 release.
Lors du débogage dune exécution dacceptation de paquet échouée, commencez par le résumé `resolve_package` pour confirmer la source du paquet, sa version et son SHA-256. Inspectez ensuite lexécution enfant `docker_acceptance` et ses artefacts Docker : `.artifacts/docker-tests/**/summary.json`, `failures.json`, les journaux des lanes, les minutages des phases et les commandes de réexécution. Préférez réexécuter le profil de paquet échoué ou les lanes Docker exactes plutôt que de relancer toute la validation de release.
## Vérification dinstallation
## Test de fumée dinstallation
Le workflow séparé `Install Smoke` réutilise le même script de périmètre via son propre job `preflight`. Il répartit la couverture de vérification entre `run_fast_install_smoke` et `run_full_install_smoke`.
Le workflow séparé `Install Smoke` réutilise le même script de portée via son propre job `preflight`. Il divise la couverture de fumée en `run_fast_install_smoke` et `run_full_install_smoke`.
- **Chemin rapide** sexécute pour les pull requests touchant les surfaces Docker/package, les changements de package/manifeste de plugins groupés, ou les surfaces de Plugin SDK, Gateway, channel ou plugin cœur que les jobs de vérification Docker exercent. Les changements de plugins groupés limités aux sources, les modifications limitées aux tests et les modifications limitées à la documentation ne réservent pas de workers Docker. Le chemin rapide construit limage du Dockerfile racine une seule fois, vérifie la CLI, exécute la vérification CLI de suppression dagents dans lespace de travail partagé, exécute le2e du réseau Gateway en conteneur, vérifie un argument de build dextension groupée, et exécute le profil Docker borné des plugins groupés avec 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 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 de vérification du Dockerfile racine GHCR au SHA cible, puis exécute linstallation de package QR, les vérifications du Dockerfile racine/Gateway, les vérifications dinstallation/mise à jour, et lE2E Docker rapide des plugins groupés comme jobs séparés afin que le travail dinstallation nattende pas derrière les vérifications de limage racine.
- **Chemin rapide** sexécute pour les pull requests qui touchent les surfaces Docker/paquet, les changements de paquet/manifeste de plugins intégrés, ou les surfaces centrales plugin/canal/gateway/Plugin SDK exercées par les jobs de fumée Docker. Les changements de plugins intégrés 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 du Dockerfile racine, vérifie la CLI, exécute le test de fumée CLI de suppression dagents avec espace de travail partagé, exécute le2e du réseau de Gateway en conteneur, vérifie un argument de build dextension intégrée et exécute le profil Docker borné de plugin intégré avec un délai dexpiration agrégé de commande de 240 secondes (chaque exécution Docker de scénario étant plafonnée séparément).
- **Chemin complet** conserve la couverture dinstallation de paquet QR et Docker/update de linstallateur pour les exécutions planifiées nocturnes, les déclenchements manuels, les vérifications de release par workflow-call et les pull requests qui touchent réellement les surfaces installateur/paquet/Docker. En mode complet, install-smoke prépare ou réutilise une image de fumée Dockerfile racine GHCR pour le SHA cible, puis exécute linstallation de paquet QR, les fumées Dockerfile racine/Gateway, les fumées installateur/update et lE2E Docker rapide des plugins intégrés comme des jobs séparés afin que le travail de linstallateur nattende pas derrière les fumées de limage racine.
Les pushes sur `main` (y compris les commits de fusion) 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 la vérification Docker rapide et laisse la vérification complète dinstallation aux validations nocturnes ou de release.
Les poussées 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 une poussée, le workflow conserve la fumée Docker rapide et laisse la fumée dinstallation complète à la validation nocturne ou de release.
La vérification lente du fournisseur dimages avec installation globale Bun est contrôlée séparément par `run_bun_global_install_smoke`. Elle sexécute selon 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 centrés sur linstallation.
La fumée lente dinstallation globale Bun pour image-provider est contrôlée séparément par `run_bun_global_install_smoke`. Elle sexécute selon 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 poussées sur `main` ne le font pas. Les tests Docker QR et installateur conservent leurs propres Dockerfiles axés sur linstallation.
## E2E Docker local
`pnpm test:docker:all` préconstruit une image de test live partagée, emballe OpenClaw une seule fois sous forme darchive tar npm, et construit deux images `scripts/e2e/Dockerfile` partagées :
`pnpm test:docker:all` préconstruit une image de test live partagée, empaquette OpenClaw une fois comme archive npm, et construit deux images `scripts/e2e/Dockerfile` partagées :
- un runner Node/Git minimal pour les lanes installateur/mise à jour/dépendance de plugin ;
- une image fonctionnelle qui installe la même archive tar dans `/app` pour les lanes de fonctionnalité normale.
- un exécuteur Node/Git nu pour les lanes installateur/update/dépendance de plugin ;
- une image fonctionnelle qui installe la même archive dans `/app` pour les lanes de fonctionnalité normale.
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 nexécute que 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 résident dans `scripts/lib/docker-e2e-scenarios.mjs`, la logique du planificateur réside dans `scripts/lib/docker-e2e-plan.mjs`, et lexécuteur nexécute que 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`.
### Paramètres réglables
### Paramètres ajustables
| Variable | Valeur par défaut | Objectif |
| -------------------------------------- | ----------------- | --------------------------------------------------------------------------------------------- |
| `OPENCLAW_DOCKER_ALL_PARALLELISM` | 10 | Nombre demplacements du pool principal pour les lanes normales. |
| `OPENCLAW_DOCKER_ALL_TAIL_PARALLELISM` | 10 | Nombre demplacements du pool de fin 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 multiservices concurrentes. |
| `OPENCLAW_DOCKER_ALL_START_STAGGER_MS` | 2000 | Décalage entre les démarrages de lanes pour éviter des rafales de création du daemon Docker ; définissez `0` pour aucun décalage. |
| `OPENCLAW_DOCKER_ALL_LANE_TIMEOUT_MS` | 7200000 | Délai de secours par lane (120 minutes) ; les lanes live/de fin sélectionnées 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 la vérification de nettoyage afin que les agents puissent reproduire une lane échouée. |
| Variable | Par défaut | Objectif |
| -------------------------------------- | ---------- | ---------------------------------------------------------------------------------------------- |
| `OPENCLAW_DOCKER_ALL_PARALLELISM` | 10 | Nombre de créneaux du pool principal pour les lanes normales. |
| `OPENCLAW_DOCKER_ALL_TAIL_PARALLELISM` | 10 | Nombre de créneaux 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 daemon Docker ; définissez `0` pour aucun décalage. |
| `OPENCLAW_DOCKER_ALL_LANE_TIMEOUT_MS` | 7200000 | Délai dexpiration de repli 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 la fumée 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écute seule jusquà libérer de la capacité. Le prévol agrégé local vérifie Docker, supprime les conteneurs OpenClaw E2E obsolètes, émet létat des lanes actives, persiste les timings de lanes pour lordonnancement du plus long au plus court, et cesse par défaut de planifier de nouvelles lanes mises en pool 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écuter seule jusquà libérer sa capacité. Les précontrôles agrégés locaux vérifient Docker, suppriment les conteneurs E2E OpenClaw obsolètes, émettent le statut des lanes actives, persistent les minutages de lanes pour lordre du plus long au plus court, et cessent par défaut de planifier de nouvelles lanes groupées 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, de type dimage, dimage live, de lane et didentifiants est requise. `scripts/docker-e2e.mjs` convertit ensuite ce plan en sorties et récapitulatifs GitHub. Il emballe 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 de larchive tar ; construit et pousse des images Docker E2E GHCR nues/fonctionnelles étiquetées avec le digest du 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 pulls dimages Docker sont retentés avec un délai borné de 180 secondes par tentative afin quun flux de registre/cache bloqué soit réessayé 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` quels paquet, type dimage, image live, lane et couverture didentifiants sont requis. `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 paquet de lexécution courante, ou télécharge un artefact de paquet depuis `package_artifact_run_id` ; valide linventaire de larchive ; construit et pousse des images E2E Docker GHCR nues/fonctionnelles taguées par digest de paquet via le cache de couches Docker de Blacksmith lorsque le plan nécessite des lanes avec paquet installé ; et réutilise les entrées `docker_e2e_bare_image`/`docker_e2e_functional_image` fournies ou les images existantes taguées par digest de paquet au lieu de reconstruire. Les extractions dimages Docker sont retentées avec un délai dexpiration borné de 180 secondes par tentative afin quun flux registry/cache bloqué réessaie rapidement au lieu de consommer la majeure partie du chemin critique CI.
### Fragments du chemin de release
### Morceaux du chemin de release
La couverture Docker de release exécute des jobs fragmentés plus petits avec `OPENCLAW_SKIP_DOCKER_BUILD=1`, afin que chaque fragment ne tire que le type dimage dont il a besoin et exécute plusieurs lanes via le même planificateur pondéré :
La couverture Docker de release 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 planificateur 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 fragments 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ée pour les deux lanes dinstallation fournisseur.
Les morceaux 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 agrégé de réexécution manuelle pour les deux lanes dinstallateur de fournisseurs.
OpenWebUI est intégré à `plugins-runtime-services` lorsque la couverture complète du chemin de release le demande, et conserve un fragment autonome `openwebui` uniquement pour les déclenchements propres à OpenWebUI. Les lanes de mise à jour de channels groupés réessaient une fois en cas déchecs réseau npm transitoires.
OpenWebUI est intégré à `plugins-runtime-services` lorsque la couverture complète release-path le demande, et conserve un morceau autonome `openwebui` uniquement pour les déclenchements limités à OpenWebUI. Les lanes de mise à jour des canaux intégrés réessaient une fois en cas de défaillances réseau npm transitoires.
Chaque fragment téléverse `.artifacts/docker-tests/` avec les journaux de lanes, timings, `summary.json`, `failures.json`, timings de phases, JSON du plan du planificateur, tableaux des lanes lentes et 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 fragments, 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 de réexécution GitHub 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.
Chaque morceau téléverse `.artifacts/docker-tests/` avec les journaux de lanes, les minutages, `summary.json`, `failures.json`, les minutages des 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 contre les images préparées au lieu des jobs de morceaux, 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 paquet 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 de réexécution GitHub 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 paquet 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 chaque jour la suite Docker release-path complète.
## Prérelease Plugin
## Prérelease 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 équilibre les tests de plugins groupés sur huit workers dextension ; ces jobs de shards dextension exécutent jusquà deux groupes de configuration de plugins à 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érelease Docker réservé à la release 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/paquet plus coûteuse ; cest donc un workflow séparé déclenché par `Full Release Validation` ou par un opérateur explicite. Les pull requests normales, les poussées sur `main` et les déclenchements CI manuels autonomes gardent cette suite désactivée. Il équilibre les tests de plugins intégrés sur huit workers dextension ; ces jobs de fragments dextension exécutent jusquà deux groupes de configuration de plugins à la fois avec un worker Vitest par groupe et un tas Node plus grand afin que les lots de plugins riches en imports ne créent pas de jobs CI supplémentaires. Le chemin de prérelease Docker réservé aux releases regroupe les lanes Docker ciblées en petits groupes pour éviter de réserver des dizaines dexécuteurs pour des jobs dune à trois minutes.
## Laboratoire QA
## QA Lab
Le laboratoire 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 grands harnais QA et release, et non dans un workflow PR autonome. Utilisez `Full Release Validation` avec `rerun_group=qa-parity` lorsque la parité doit accompagner une large exécution de validation.
- Le workflow `QA-Lab - All Lanes` sexécute chaque nuit sur `main` et sur déclenchement manuel ; il déploie en éventail la lane de parité mock, la lane Matrix live, et les lanes Telegram et Discord live en 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 éventail la lane de parité simulée, la lane Matrix live et 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.
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 channel 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èle live, de fournisseur natif et de fournisseur Docker.
Les vérifications de release exécutent les lanes de transport live Matrix et Telegram avec le fournisseur simulé 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 de fournisseurs. Le Gateway de transport live désactive la recherche en mémoire parce que la parité QA couvre séparément le comportement mémoire ; la connectivité des fournisseurs est couverte par les suites séparées de modèle live, fournisseur natif et fournisseur 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 de workflow manuelle restent `all` ; un déclenchement manuel `matrix_profile=all` répartit toujours la couverture Matrix complète en jobs `transport`, `media`, `e2ee-smoke`, `e2ee-deep` et `e2ee-cli`.
Matrix utilise `--profile fast` pour les portes planifiées 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` divise toujours la couverture Matrix complète en jobs `transport`, `media`, `e2ee-smoke`, `e2ee-deep` et `e2ee-cli`.
`OpenClaw Release Checks` exécute aussi les lanes QA Lab critiques pour la release avant lapprobation de release ; son gate de parité QA exécute les packages candidats 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 release avant lapprobation de release ; sa porte 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 état requis.
Pour les PR normales, suivez les preuves de CI/vérification ciblées au lieu de traiter la parité comme un statut requis.
## CodeQL
Le workflow `CodeQL` est volontairement un analyseur de sécurité de première passe étroit, et non un balayage complet du dépôt. Les exécutions de garde quotidiennes, manuelles et sur demandes dextraction 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 valeurs `security-severity` élevées/critiques.
Le workflow `CodeQL` est volontairement un scanner de sécurité étroit de première passe, et non un balayage complet du dépôt. Les exécutions de garde quotidiennes, manuelles et de pull request 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 une `security-severity` élevée/critique.
La garde des demandes dextraction reste légère : elle ne démarre que pour les modifications sous `.github/actions`, `.github/codeql`, `.github/workflows`, `packages` ou `src`, et 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 demandes dextraction.
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é. 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, bac à sable, cron et socle Gateway |
| `/codeql-security-high/channel-runtime-boundary` | Contrats dimplémentation des canaux cœur, ainsi que lexécution du plugin de canal, le Gateway, le SDK Plugin, les secrets et les points de contact daudit |
| `/codeql-security-high/network-ssrf-boundary` | Surfaces cœur de politique SSRF, analyse dIP, garde réseau, récupération web et SSRF du SDK Plugin |
| `/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 pour linstallation de Plugin, le chargeur, le manifeste, le registre, linstallation par gestionnaire de paquets, le chargement de source et le contrat de paquet du SDK Plugin |
| Catégorie | Surface |
| ------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------ |
| `/codeql-security-high/core-auth-secrets` | Authentification, secrets, bac à sable, Cron et base de référence du Gateway |
| `/codeql-security-high/channel-runtime-boundary` | Contrats dimplémentation des canaux du cœur plus le runtime de Plugin de canal, le Gateway, le Plugin SDK, les secrets, les points daudit |
| `/codeql-security-high/network-ssrf-boundary` | Surfaces SSRF du cœur, analyse IP, garde réseau, récupération web et politique SSRF du Plugin SDK |
| `/codeql-security-high/mcp-process-tool-boundary` | Serveurs MCP, helpers 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, du chargeur, du manifeste, du registre, de linstallation par gestionnaire de packages, du chargement de source et du contrat de package du Plugin SDK |
### Fragments de sécurité propres aux plateformes
- `CodeQL Android Critical Security` — fragment de sécurité Android planifié. Compile lapplication Android manuellement pour CodeQL sur le plus petit exécuteur Blacksmith Linux accepté par le contrôle de cohérence du workflow. Téléverse sous `/codeql-critical-security/android`.
- `CodeQL macOS Critical Security` — fragment de sécurité macOS hebdomadaire/manuel. Compile lapplication macOS manuellement pour CodeQL sur Blacksmith macOS, filtre les résultats de compilation 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 la compilation macOS domine le temps dexécution même lorsquelle est propre.
- `CodeQL Android Critical Security` — fragment de sécurité Android planifié. Construit manuellement lapplication Android pour CodeQL sur le plus petit runner 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 de 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, car le build macOS domine le temps dexécution même quand il est propre.
### Catégories de qualité critique
`CodeQL Critical Quality` est le fragment non lié à la sécurité correspondant. Il exécute uniquement des requêtes de qualité JavaScript/TypeScript sans sécurité et de sévérité erreur, sur des surfaces étroites à forte valeur, sur le plus petit exécuteur Blacksmith Linux. Sa garde des demandes dextraction est volontairement plus petite que le profil planifié : les demandes dextraction 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 touchant le code dexécution de commandes/modèles/outils dagent et de distribution de réponses, le code de schéma/migration/E/S de configuration, le code dauthentification/secrets/bac à sable/sécurité, lexécution cœur des canaux et des plugins de canal intégrés, le protocole Gateway/la méthode serveur, la colle dexécution mémoire/SDK, MCP/processus/livraison sortante, le catalogue dexécution/modèles de fournisseurs, les diagnostics de session/files de livraison, le chargeur de Plugin, le contrat SDK Plugin/paquet, ou lexécution de réponse du SDK Plugin. Les changements de configuration CodeQL et de workflow qualité exécutent les douze fragments de qualité des demandes dextraction.
`CodeQL Critical Quality` est le fragment non sécurité correspondant. Il exécute uniquement des requêtes de qualité JavaScript/TypeScript sans sécurité, de sévérité erreur, sur des surfaces étroites à forte valeur sur le plus petit runner Blacksmith Linux. Sa garde de pull request est volontairement plus petite 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 denvoi de réponses, de schéma/migration/E/S de config, dauthentification/secrets/bac à sable/sécurité, de runtime du canal du cœur et du Plugin de canal groupé, de protocole/méthode serveur du Gateway, de runtime mémoire/glue SDK, de livraison MCP/processus/sortante, de runtime fournisseur/catalogue de modèles, de diagnostics de session/files de livraison, de chargeur de Plugin, de contrat Plugin SDK/package ou de runtime de réponse du Plugin SDK. Les changements de config CodeQL et de workflow qualité exécutent les douze fragments qualité de PR.
Le déclenchement manuel accepte :
Le dispatch manuel 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 étroits sont des points daccroche dapprentissage/itération pour exécuter un fragment de qualité isolément.
Les profils étroits sont des hooks pédagogiques/ditération pour exécuter un fragment qualité isolément.
| Catégorie | Surface |
| ------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `/codeql-critical-quality/core-auth-secrets` | Authentification, secrets, bac à sable, cron et code de frontière de sécurité 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 de protocole Gateway et contrats de méthodes serveur |
| `/codeql-critical-quality/channel-runtime-boundary` | Contrats dimplémentation des canaux cœur et des plugins de canal intégrés |
| `/codeql-critical-quality/agent-runtime-boundary` | Exécution de commandes, distribution modèles/fournisseurs, 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 de lhôte mémoire, façades dexécution mémoire, alias mémoire du SDK Plugin, 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 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 SDK Plugin, assistants de payload/fragmentation/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 de fournisseurs, enregistrement dexécution de fournisseurs, valeurs par défaut/catalogues de fournisseurs 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` | Contrats dexécution cœur de récupération/recherche web, E/S médias, compréhension média, génération dimages et génération de médias |
| `/codeql-critical-quality/plugin-boundary` | Contrats de chargeur, registre, surface publique et points dentrée du SDK Plugin |
| `/codeql-critical-quality/plugin-sdk-package-contract` | Source SDK Plugin côté paquet publié et assistants de contrat de paquet plugin |
| Catégorie | Surface |
| ------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `/codeql-critical-quality/core-auth-secrets` | Code de frontière de sécurité pour lauthentification, les secrets, le bac à sable, Cron et le Gateway |
| `/codeql-critical-quality/config-boundary` | Contrats de schéma de config, migration, normalisation et E/S |
| `/codeql-critical-quality/gateway-runtime-boundary` | Schémas de protocole du Gateway et contrats de méthodes serveur |
| `/codeql-critical-quality/channel-runtime-boundary` | Contrats dimplémentation du canal du cœur et du Plugin de canal groupé |
| `/codeql-critical-quality/agent-runtime-boundary` | Exécution de commandes, dispatch modèle/fournisseur, dispatch et files de réponse automatique, et contrats de runtime du plan de contrôle ACP |
| `/codeql-critical-quality/mcp-process-runtime-boundary` | Serveurs MCP et ponts doutils, helpers 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, helpers de liaison/livraison de session sortante, surfaces dévénements de diagnostic/bundles de logs et contrats CLI doctor de session |
| `/codeql-critical-quality/plugin-sdk-reply-runtime` | Dispatch de réponse entrante du Plugin SDK, helpers de charge utile/découpage/runtime de réponse, options de réponse de canal, files de livraison et helpers de liaison session/thread |
| `/codeql-critical-quality/provider-runtime-boundary` | Normalisation du catalogue de modèles, authentification et découverte fournisseur, 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 du 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 des médias, génération dimages et génération de médias |
| `/codeql-critical-quality/plugin-boundary` | Contrats du chargeur, du registre, de la surface publique et des points dentrée du Plugin SDK |
| `/codeql-critical-quality/plugin-sdk-package-contract` | Source du Plugin SDK côté package publié et helpers de contrat de package 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 masquer le signal de sécurité. Lextension CodeQL à Swift, Python et aux plugins intégrés devrait être réajoutée uniquement comme travail de suivi borné ou fragmenté, une fois que les profils étroits ont un temps dexécution et un signal stables.
La qualité reste séparée de la sécurité afin que les résultats qualité puissent être planifiés, mesurés, désactivés ou étendus sans masquer le signal de sécurité. Lextension CodeQL pour Swift, Python et les Plugins groupés ne doit être réajoutée comme travail de suivi ciblé ou fragmenté quaprès stabilisation du runtime et du signal des profils étroits.
## Workflows de maintenance
### Agent Docs
### Docs Agent
Le workflow `Docs Agent` est une voie de maintenance Codex pilotée par événements pour garder la documentation existante alignée avec les changements récemment intégrés. Il na pas de planification pure : une exécution CI réussie sur `main` après un push non-bot 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 dans 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é jusquà `main` actuel, de sorte quune exécution horaire peut couvrir tous les changements de main accumulés depuis le dernier passage documentaire.
Le workflow `Docs Agent` est une voie de maintenance Codex pilotée par événements pour garder la documentation existante alignée sur 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 dispatch manuel peut lexécuter directement. Les invocations par workflow-run sont ignorées lorsque `main` a avancé ou lorsquune autre exécution non ignorée de Docs Agent a été créée dans la dernière heure. Lorsquil sexécute, il passe en revue 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 documentation.
### Agent de performance des tests
### 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 sur `main` après un push non-bot peut le déclencher, mais il sarrête 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 produit un rapport de performance Vitest groupé de suite complète, laisse Codex faire seulement de petites corrections de performance de tests qui préservent la couverture au lieu de larges refactorisations, puis réexécute le rapport de suite complète et rejette les changements qui réduisent le nombre de tests réussis dans la référence. Si la référence contient des tests en échec, Codex ne peut corriger que les échecs évidents, et le rapport de suite complète après agent doit passer avant tout commit. Lorsque `main` avance avant que le push du bot naboutisse, la voie rebase le patch validé, réexécute `pnpm check:changed` et retente 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é sans 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 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 dispatch manuel contourne cette garde dactivité quotidienne. La voie construit un rapport de performance Vitest groupé de suite complète, permet à Codex de napporter que de petites corrections de performance de test préservant la couverture au lieu de refontes larges, puis réexécute le rapport de suite complète et rejette les changements qui réduisent le nombre de tests passants de la ligne de base. Si la ligne de base contient des tests en échec, Codex ne peut corriger que les échecs évidents et le rapport de suite complète après agent doit réussir avant tout commit. Lorsque `main` avance avant que le push du bot arrive, la voie rebase le patch validé, réexécute `pnpm check:changed` et retente 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é sans sudo que lagent de documentation.
### Demandes dextraction dupliquées après fusion
### PR dupliquées après merge
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 mode simulation et ne ferme les demandes dextraction explicitement listées que lorsque `apply=true`. Avant de modifier GitHub, il vérifie que la demande dextraction 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.
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 les PR explicitement listées que lorsque `apply=true`. Avant de modifier GitHub, il vérifie que la PR intégrée est mergée et que chaque doublon a soit une issue référencée partagée, soit des hunks modifiés qui se chevauchent.
```bash
gh workflow run duplicate-after-merge.yml \
@ -474,29 +474,29 @@ gh workflow run duplicate-after-merge.yml \
-f apply=true
```
## Gardes de vérification locale et routage des changements
## Garde-fous de vérification locale et routage des changements
La logique locale des voies de changements se trouve dans `scripts/changed-lanes.mjs` et est exécutée par `scripts/check-changed.mjs`. Cette garde 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 de voies de changements réside dans `scripts/changed-lanes.mjs` et est exécutée par `scripts/check-changed.mjs`. Cette garde 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 cœur exécutent la vérification de types cœur prod et cœur test, ainsi que le lint/les gardes cœur ;
- les changements cœur uniquement de test exécutent seulement la vérification de types cœur test, ainsi que le lint cœur ;
- les changements de production dextension exécutent la vérification de types extension prod et extension test, ainsi que le lint extension ;
- les changements dextension uniquement de test exécutent la vérification de types extension test, ainsi que le lint extension ;
- les changements du SDK Plugin public ou du contrat de plugin sétendent à la vérification de types des extensions parce que les extensions dépendent de ces contrats cœur (les balayages dextensions Vitest restent un travail de test explicite) ;
- les montées de version uniquement de métadonnées de publication exécutent des vérifications ciblées de version/configuration/dépendances racine ;
- les changements racine/configuration inconnus échouent prudemment vers toutes les voies de vérification.
- les changements de production du cœur exécutent la vérification de types prod du cœur et tests du cœur plus lint/gardes du cœur ;
- les changements seulement de tests du cœur exécutent uniquement la vérification de types des tests du cœur plus lint du cœur ;
- les changements de production dextension exécutent la vérification de types prod dextension et tests dextension plus lint dextension ;
- les changements seulement de tests dextension exécutent la vérification de types des tests dextension plus lint dextension ;
- les changements publics du Plugin SDK ou de contrat de Plugin sétendent à la vérification de types dextension parce que les extensions dépendent de ces contrats du cœur (les balayages dextensions Vitest restent un travail de test explicite) ;
- les augmentations de version limitées aux métadonnées de release exécutent des vérifications ciblées de version/config/dépendances racine ;
- les changements racine/config inconnus échouent prudemment vers toutes les voies de vérification.
Le routage local des tests modifiés se trouve dans `scripts/test-projects.test-support.mjs` et est volontairement moins coûteux que `check:changed` : les modifications directes de tests exécutent ces tests, les modifications de source privilégient les correspondances explicites, puis les tests frères et les dépendants du graphe dimport. La configuration de livraison partagée des salles de groupe fait partie des correspondances explicites : les changements de la configuration de réponse visible au 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 cœur ainsi que les régressions de livraison Discord et Slack afin quun changement de valeur par défaut partagée échoue avant le premier push de demande dextraction. Utilisez `OPENCLAW_TEST_CHANGED_BROAD=1 pnpm test:changed` uniquement lorsque le changement est assez large au niveau du harnais pour que lensemble mappé peu coûteux ne soit pas un substitut fiable.
Le routage local des tests modifiés réside 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 mappages explicites, puis les tests voisins et les dépendants du graphe dimports. La config partagée de livraison de salon de groupe fait partie des mappages explicites : les changements de la config de réponse visible par le 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 touche assez largement le harnais pour que lensemble mappé léger ne soit pas un proxy fiable.
## Validation Testbox
Exécutez Testbox depuis la racine du dépôt et privilégiez une nouvelle box préchauffée pour une preuve large. Avant de lancer une gate lente 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.
Exécutez Testbox depuis la racine du dépôt et privilégiez une boîte fraîchement préparée pour les preuves larges. Avant de lancer une porte lente sur une boîte réutilisée, expirée ou qui vient de signaler une synchronisation anormalement volumineuse, exécutez dabord `pnpm testbox:sanity` dans la boîte.
Le contrôle 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 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 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 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 suivies. Cela signifie généralement que létat de synchronisation distant nest pas une copie fiable de la PR ; arrêtez cette boîte et préparez-en une fraîche au lieu de déboguer léchec du test produit. Pour les PR avec de nombreuses suppressions intentionnelles, définissez `OPENCLAW_TESTBOX_ALLOW_MASS_DELETIONS=1` pour cette exécution de cohérence.
`pnpm testbox:run` met également fin à une invocation locale de la Blacksmith CLI 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 garde, ou utilisez une valeur plus élevée en millisecondes pour les diffs locaux exceptionnellement volumineux.
Crabbox est le wrapper de box distante détenu par le dépôt pour les preuves Linux des mainteneurs. Utilisez-le lorsquun contrôle est trop large pour une boucle dédition locale, lorsque la parité CI compte, ou lorsque la preuve nécessite des secrets, Docker, des lanes de paquets, 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 en cas de pannes Blacksmith, de problèmes de quota ou de tests explicites sur capacité détenue.
Crabbox est le wrapper de boîte distante appartenant au dépôt pour les preuves Linux des mainteneurs. Utilisez-le lorsquun contrôle est trop large pour une boucle dédition locale, lorsque la parité CI compte, ou lorsque la preuve nécessite des secrets, Docker, des voies de paquets, des boîtes réutilisables ou des journaux distants. Le backend OpenClaw normal est `blacksmith-testbox` ; la capacité AWS/Hetzner possédée est une solution de repli pour les pannes Blacksmith, les problèmes de quota ou les tests explicites sur capacité possédée.
Avant une première exécution, vérifiez le wrapper depuis la racine du dépôt :
@ -504,9 +504,9 @@ Avant une première exécution, vérifiez le wrapper depuis la racine du dépôt
pnpm crabbox:run -- --help | sed -n '1,120p'
```
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 pour le cloud détenu.
Le wrapper du dépôt refuse un binaire Crabbox obsolète qui nannonce pas `blacksmith-testbox`. Passez explicitement le fournisseur même si `.crabbox.yaml` contient des valeurs par défaut de cloud possédé.
Gate des changements :
Porte des changements :
```bash
pnpm crabbox:run -- --provider blacksmith-testbox \
@ -521,7 +521,7 @@ pnpm crabbox:run -- --provider blacksmith-testbox \
"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"
```
Réexécution de test ciblée :
Relance de test ciblée :
```bash
pnpm crabbox:run -- --provider blacksmith-testbox \
@ -551,21 +551,21 @@ pnpm crabbox:run -- --provider blacksmith-testbox \
"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 Crabbox ponctuelles adossées à Blacksmith devraient arrêter la Testbox automatiquement ; si une exécution est interrompue ou si le nettoyage est incertain, inspectez les boxes actives et arrêtez uniquement celles que vous avez créées :
Lisez le résumé JSON final. Les champs utiles sont `provider`, `leaseId`, `syncDelegated`, `exitCode`, `commandMs` et `totalMs`. Les exécutions Crabbox ponctuelles appuyées par Blacksmith devraient arrêter automatiquement le Testbox ; si une exécution est interrompue ou si le nettoyage nest pas clair, inspectez les boîtes 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 :
Nutilisez la réutilisation que lorsque vous avez intentionnellement besoin de plusieurs commandes sur la même boîte 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 Blacksmith directement comme solution de repli étroite :
Si Crabbox est la couche défectueuse mais que Blacksmith lui-même fonctionne, utilisez Blacksmith directement comme solution de repli étroite :
```bash
blacksmith testbox warmup ci-check-testbox.yml --ref main --idle-timeout 90
@ -573,7 +573,7 @@ blacksmith testbox run --id <tbx_id> "env CI=1 NODE_OPTIONS=--max-old-space-size
blacksmith testbox stop --id <tbx_id>
```
Ne passez à la capacité Crabbox détenue que lorsque Blacksmith est indisponible, limité par quota, dépourvu de lenvironnement nécessaire, ou lorsque la capacité détenue est explicitement lobjectif :
Nescaladez vers la capacité Crabbox possédée que lorsque Blacksmith est indisponible, limité par quota, ne fournit pas lenvironnement requis, ou que la capacité possédée est explicitement lobjectif :
```bash
pnpm crabbox:warmup -- --provider aws --class beast --market on-demand --idle-timeout 90m
@ -582,9 +582,9 @@ pnpm crabbox:run -- --id <cbx_id-or-slug> --timing-json --shell -- "env NODE_OPT
pnpm crabbox:stop -- <cbx_id-or-slug>
```
`.crabbox.yaml` définit les valeurs par défaut du fournisseur, de la synchronisation et de lhydratation GitHub Actions pour les lanes de cloud détenu. 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éfinit le checkout, la configuration Node/pnpm, la récupération de `origin/main` et la transmission denvironnement non secret pour les commandes `crabbox run --id <cbx_id>` sur cloud détenu.
`.crabbox.yaml` possède les valeurs par défaut du fournisseur, de la synchronisation et de lhydratation GitHub Actions pour les voies de cloud possédé. 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` possède le checkout, la configuration Node/pnpm, la récupération de `origin/main` et la transmission denvironnement non secret pour les commandes de cloud possédé `crabbox run --id <cbx_id>`.
## Connexe
## Associé
- [Vue densemble de linstallation](/fr/install)
- [Canaux de développement](/fr/install/development-channels)

View File

@ -1,21 +1,21 @@
---
read_when:
- Vous souhaitez des tâches planifiées et des réveils
- Vous voulez des tâches planifiées et des réveils
- Vous déboguez lexécution de Cron et les journaux
summary: Référence CLI pour `openclaw cron` (planifier et exécuter des tâches en arrière-plan)
title: Cron
x-i18n:
generated_at: "2026-05-02T07:01:24Z"
generated_at: "2026-05-05T06:16:13Z"
model: gpt-5.5
provider: openai
source_hash: 298ac3fc868462eb301febbc1aa5296d8087cad7fdc466870487081444c5856f
source_hash: 804efac75b8653b03cec197247be847498e084b50b00fb7bd3fbd94067ef25d4
source_path: cli/cron.md
workflow: 16
---
# `openclaw cron`
Gérez les tâches Cron pour le planificateur du Gateway.
Gérez les tâches Cron du planificateur Gateway.
<Tip>
Exécutez `openclaw cron --help` pour voir toute la surface de commande. Consultez [Tâches Cron](/fr/automation/cron-jobs) pour le guide conceptuel.
@ -28,38 +28,38 @@ Exécutez `openclaw cron --help` pour voir toute la surface de commande. Consult
<AccordionGroup>
<Accordion title="Clés de session">
- `main` se lie à la session principale de lagent.
- `isolated` crée une transcription et un identifiant de session neufs pour chaque exécution.
- `isolated` crée une nouvelle transcription et un nouvel identifiant de session pour chaque exécution.
- `current` se lie à la session active au moment de la création.
- `session:<id>` épingle une clé de session persistante explicite.
</Accordion>
<Accordion title="Sémantique des sessions isolées">
Les exécutions isolées réinitialisent le contexte de conversation ambiant. Le routage des canaux et des groupes, la politique denvoi/de file dattente, lélévation, lorigine et la liaison dexécution ACP sont réinitialisés pour la nouvelle exécution. Les préférences sûres et les remplacements explicites du modèle ou de lauthentification sélectionnés par lutilisateur peuvent être conservés entre les exécutions.
Les exécutions isolées réinitialisent le contexte de conversation ambiant. Le routage des canaux et des groupes, la politique denvoi/de mise en file, lélévation, lorigine et la liaison dexécution ACP sont réinitialisés pour la nouvelle exécution. Les préférences sûres et les substitutions explicites de modèle ou dauthentification sélectionnées par lutilisateur peuvent être conservées entre les exécutions.
</Accordion>
</AccordionGroup>
## Livraison
`openclaw cron list` et `openclaw cron show <job-id>` prévisualisent la route de livraison résolue. Pour `channel: "last"`, laperçu indique si la route est résolue depuis la session principale ou actuelle, ou si elle échouera fermée.
`openclaw cron list` et `openclaw cron show <job-id>` affichent un aperçu de la route de livraison résolue. Pour `channel: "last"`, laperçu indique si la route a été résolue depuis la session principale ou actuelle, ou si elle échouera de manière fermée.
Les cibles préfixées par un fournisseur peuvent lever lambiguïté des canaux dannonce non résolus. Par exemple, `to: "telegram:123"` sélectionne Telegram lorsque `delivery.channel` est omis ou vaut `last`. Seuls les préfixes annoncés par le Plugin chargé sont des sélecteurs de fournisseur. Si `delivery.channel` est explicite, le préfixe doit correspondre à ce canal ; `channel: "whatsapp"` avec `to: "telegram:123"` est rejeté. Les préfixes de service tels que `imessage:` et `sms:` restent une syntaxe de cible propre au canal.
Les cibles préfixées par un fournisseur peuvent lever lambiguïté des canaux dannonce non résolus. Par exemple, `to: "telegram:123"` sélectionne Telegram lorsque `delivery.channel` est omis ou vaut `last`. Seuls les préfixes annoncés par le Plugin chargé sont des sélecteurs de fournisseur. Si `delivery.channel` est explicite, le préfixe doit correspondre à ce canal ; `channel: "whatsapp"` avec `to: "telegram:123"` est rejeté. Les préfixes de service comme `imessage:` et `sms:` restent une syntaxe de cible propre au canal.
<Note>
Les tâches `cron add` isolées utilisent par défaut la livraison `--announce`. Utilisez `--no-deliver` pour garder la sortie interne. `--deliver` reste disponible comme alias obsolète de `--announce`.
Les tâches `cron add` isolées utilisent par défaut la livraison `--announce`. Utilisez `--no-deliver` pour garder la sortie interne. `--deliver` reste un alias obsolète de `--announce`.
</Note>
### Propriété de la livraison
La livraison de chat Cron isolée est partagée entre lagent et le runner :
La livraison de chat Cron isolée est partagée entre lagent et le lanceur :
- Lagent peut envoyer directement avec loutil `message` lorsquune route de chat est disponible.
- `announce` livre en secours la réponse finale uniquement lorsque lagent na pas envoyé directement vers la cible résolue.
- `announce` livre la réponse finale en secours uniquement lorsque lagent na pas envoyé directement vers la cible résolue.
- `webhook` publie la charge utile terminée vers une URL.
- `none` désactive la livraison de secours du runner.
- `none` désactive la livraison de secours par le lanceur.
`--announce` est la livraison de secours du runner pour la réponse finale. `--no-deliver` désactive ce secours, mais ne supprime pas loutil `message` de lagent lorsquune route de chat est disponible.
`--announce` est la livraison de secours par le lanceur pour la réponse finale. `--no-deliver` désactive ce secours, mais ne retire pas loutil `message` de lagent lorsquune route de chat est disponible.
Les rappels créés depuis un chat actif conservent la cible de livraison du chat en direct pour la livraison dannonce de secours. Les clés de session internes peuvent être en minuscules ; ne les utilisez pas comme source de vérité pour des identifiants de fournisseur sensibles à la casse, tels que les identifiants de salons Matrix.
Les rappels créés depuis un chat actif conservent la cible de livraison du chat en direct pour la livraison dannonce de secours. Les clés de session internes peuvent être en minuscules ; ne les utilisez pas comme source de vérité pour des identifiants de fournisseur sensibles à la casse, comme les identifiants de salle Matrix.
### Livraison des échecs
@ -67,13 +67,13 @@ Les notifications déchec sont résolues dans cet ordre :
1. `delivery.failureDestination` sur la tâche.
2. `cron.failureDestination` global.
3. La cible dannonce principale de la tâche (lorsquaucune destination déchec explicite nest définie).
3. La cible dannonce principale de la tâche, lorsquaucune destination déchec explicite nest définie.
<Note>
Les tâches de session principale ne peuvent utiliser `delivery.failureDestination` que lorsque le mode de livraison principal est `webhook`. Les tâches isolées lacceptent dans tous les modes.
</Note>
Remarque : les exécutions Cron isolées traitent les échecs dagent au niveau de lexécution comme des erreurs de tâche, même lorsquaucune charge utile de réponse nest produite ; les échecs de modèle/fournisseur incrémentent donc quand même les compteurs derreurs et déclenchent les notifications déchec.
Remarque : les exécutions Cron isolées traitent les échecs dagent au niveau de lexécution comme des erreurs de tâche même quand aucune charge utile de réponse nest produite, afin que les échecs de modèle/fournisseur incrémentent quand même les compteurs derreurs et déclenchent les notifications déchec.
## Planification
@ -87,20 +87,20 @@ Les tâches ponctuelles sont supprimées après réussite par défaut. Utilisez
### Tâches récurrentes
Les tâches récurrentes utilisent un intervalle de nouvelle tentative exponentiel après des erreurs consécutives : 30 s, 1 min, 5 min, 15 min, 60 min. La planification revient à la normale après la prochaine exécution réussie.
Les tâches récurrentes utilisent un délai de nouvelle tentative exponentiel après des erreurs consécutives : 30 s, 1 min, 5 min, 15 min, 60 min. La planification revient à la normale après la prochaine exécution réussie.
Les exécutions ignorées sont suivies séparément des erreurs dexécution. Elles naffectent pas lintervalle de nouvelle tentative, mais `openclaw cron edit <job-id> --failure-alert-include-skipped` peut inclure les exécutions ignorées répétées dans les alertes déchec.
Les exécutions ignorées sont suivies séparément des erreurs dexécution. Elles naffectent pas le délai de nouvelle tentative, mais `openclaw cron edit <job-id> --failure-alert-include-skipped` permet dinclure les notifications répétées dexécutions ignorées dans les alertes déchec.
Pour les tâches isolées qui ciblent un fournisseur de modèles local configuré, Cron exécute une vérification préalable légère du fournisseur avant de démarrer le tour de lagent. Les fournisseurs `api: "ollama"` en loopback, réseau privé et `.local` sont interrogés sur `/api/tags` ; les fournisseurs locaux compatibles OpenAI, tels que vLLM, SGLang et LM Studio, sont interrogés sur `/models`. Si le point de terminaison est injoignable, lexécution est enregistrée comme `skipped` et réessayée lors dune planification ultérieure ; les points de terminaison morts correspondants sont mis en cache pendant 5 minutes afin déviter que de nombreuses tâches martèlent le même serveur local.
Pour les tâches isolées qui ciblent un fournisseur de modèle local configuré, Cron exécute un précontrôle léger du fournisseur avant de démarrer le tour dagent. Les fournisseurs `api: "ollama"` en local loopback, sur réseau privé et `.local` sont sondés sur `/api/tags` ; les fournisseurs locaux compatibles OpenAI comme vLLM, SGLang et LM Studio sont sondés sur `/models`. Si le point de terminaison est injoignable, lexécution est enregistrée comme `skipped` et réessayée lors dune planification ultérieure ; les points de terminaison morts correspondants sont mis en cache pendant 5 minutes pour éviter que de nombreuses tâches ne martèlent le même serveur local.
Remarque : les définitions des tâches Cron se trouvent dans `jobs.json`, tandis que létat dexécution en attente se trouve dans `jobs-state.json`. Si `jobs.json` est modifié de lextérieur, le Gateway recharge les planifications modifiées et efface les créneaux en attente obsolètes ; les réécritures de formatage uniquement neffacent pas le créneau en attente.
Remarque : les définitions de tâches Cron vivent dans `jobs.json`, tandis que létat dexécution en attente vit dans `jobs-state.json`. Si `jobs.json` est modifié extérieurement, le Gateway recharge les planifications modifiées et efface les créneaux en attente obsolètes ; les réécritures limitées au formatage neffacent pas le créneau en attente.
### Exécutions manuelles
`openclaw cron run` retourne dès que lexécution manuelle est mise en file dattente. Les réponses réussies incluent `{ ok: true, enqueued: true, runId }`. Utilisez `openclaw cron runs --id <job-id>` pour suivre le résultat final.
`openclaw cron run` retourne dès que lexécution manuelle est mise en file. Les réponses réussies incluent `{ ok: true, enqueued: true, runId }`. Utilisez `openclaw cron runs --id <job-id>` pour suivre le résultat final.
<Note>
`openclaw cron run <job-id>` force lexécution par défaut. Utilisez `--due` pour conserver lancien comportement « exécuter seulement si dû ».
`openclaw cron run <job-id>` force lexécution par défaut. Utilisez `--due` pour conserver lancien comportement « exécuter uniquement si léchéance est atteinte ».
</Note>
## Modèles
@ -111,43 +111,43 @@ Remarque : les définitions des tâches Cron se trouvent dans `jobs.json`, tandi
Si le modèle nest pas autorisé ou ne peut pas être résolu, Cron fait échouer lexécution avec une erreur de validation explicite au lieu de se rabattre sur lagent de la tâche ou sur la sélection de modèle par défaut.
</Warning>
Le `--model` de Cron est un **modèle principal de tâche**, pas un remplacement `/model` de session de chat. Cela signifie que :
Cron `--model` est un **principal de tâche**, pas une substitution `/model` de session de chat. Cela signifie que :
- Les modèles de secours configurés sappliquent toujours lorsque le modèle de tâche sélectionné échoue.
- La charge utile `fallbacks` propre à la tâche remplace la liste de secours configurée lorsquelle est présente.
- Une liste de secours propre à la tâche vide (`fallbacks: []` dans la charge utile/API de la tâche) rend lexécution Cron stricte.
- Lorsquune tâche a `--model` mais quaucune liste de secours nest configurée, OpenClaw transmet un remplacement de secours vide explicite afin que le modèle principal de lagent ne soit pas ajouté comme cible de nouvelle tentative cachée.
- Le champ `fallbacks` de la charge utile par tâche remplace la liste de secours configurée lorsquil est présent.
- Une liste de secours par tâche vide (`fallbacks: []` dans la charge utile/API de la tâche) rend lexécution Cron stricte.
- Lorsquune tâche a `--model` mais quaucune liste de secours nest configurée, OpenClaw transmet une substitution de secours vide explicite afin que le principal de lagent ne soit pas ajouté comme cible de nouvelle tentative masquée.
### Précédence des modèles Cron isolés
### Priorité des modèles Cron isolés
Cron isolé résout le modèle actif dans cet ordre :
1. Remplacement du hook Gmail.
2. `--model` propre à la tâche.
3. Remplacement de modèle stocké dans la session Cron (lorsque lutilisateur en a sélectionné un).
4. Sélection du modèle de lagent ou du modèle par défaut.
1. Substitution du hook Gmail.
2. `--model` par tâche.
3. Substitution de modèle de session Cron stockée, lorsque lutilisateur en a sélectionné une.
4. Sélection du modèle de lagent ou par défaut.
### Mode rapide
Le mode rapide de Cron isolé suit la sélection de modèle en direct résolue. La configuration de modèle `params.fastMode` sapplique par défaut, mais un remplacement de session `fastMode` stocké lemporte toujours sur la configuration.
Le mode rapide Cron isolé suit la sélection de modèle en direct résolue. La configuration de modèle `params.fastMode` sapplique par défaut, mais une substitution `fastMode` de session stockée prime toujours sur la configuration.
### Nouvelles tentatives après changement de modèle en direct
Si une exécution isolée lève `LiveSessionModelSwitchError`, Cron persiste le fournisseur et le modèle basculés (ainsi que le remplacement de profil dauthentification basculé, lorsquil est présent) pour lexécution active avant de réessayer. La boucle externe de nouvelle tentative est limitée à deux nouvelles tentatives de bascule après la tentative initiale, puis abandonne au lieu de boucler indéfiniment.
Si une exécution isolée lève `LiveSessionModelSwitchError`, Cron persiste le fournisseur et le modèle changés, ainsi que la substitution de profil dauthentification changée lorsquelle est présente, pour lexécution active avant de réessayer. La boucle externe de nouvelle tentative est limitée à deux nouvelles tentatives de changement après la tentative initiale, puis abandonne au lieu de boucler indéfiniment.
## Sortie dexécution et refus
### Suppression des accusés de réception obsolètes
Les tours Cron isolés suppriment les réponses obsolètes qui ne sont que des accusés de réception. Si le premier résultat nest quune mise à jour détat intermédiaire et quaucune exécution de sous-agent descendante nest responsable de la réponse finale, Cron relance une seule fois la demande pour obtenir le résultat réel avant livraison.
Les tours Cron isolés suppriment les réponses obsolètes ne contenant quun accusé de réception. Si le premier résultat nest quune mise à jour détat intermédiaire et quaucune exécution de sous-agent descendant nest responsable de la réponse finale, Cron relance une fois la demande pour obtenir le vrai résultat avant livraison.
### Suppression du jeton silencieux
### Suppression des jetons silencieux
Si une exécution Cron isolée retourne uniquement le jeton silencieux (`NO_REPLY` ou `no_reply`), Cron supprime à la fois la livraison sortante directe et le chemin de résumé mis en file dattente de secours, de sorte que rien nest republié dans le chat.
Si une exécution Cron isolée retourne uniquement le jeton silencieux (`NO_REPLY` ou `no_reply`), Cron supprime à la fois la livraison sortante directe et le chemin de résumé mis en file de secours ; rien nest donc publié en retour dans le chat.
### Refus structurés
Les exécutions Cron isolées privilégient les métadonnées structurées de refus dexécution provenant de lexécution intégrée, puis se rabattent sur les marqueurs de refus connus dans la sortie finale, tels que `SYSTEM_RUN_DENIED`, `INVALID_REQUEST` et les formules de refus liées à lapprobation.
Les exécutions Cron isolées privilégient les métadonnées structurées de refus dexécution depuis lexécution intégrée, puis se rabattent sur les marqueurs de refus connus dans la sortie finale, comme `SYSTEM_RUN_DENIED`, `INVALID_REQUEST` et les formulations de refus liées aux approbations.
`cron list` et lhistorique des exécutions affichent la raison du refus au lieu de signaler une commande bloquée comme `ok`.
@ -155,18 +155,18 @@ Les exécutions Cron isolées privilégient les métadonnées structurées de re
La rétention et lélagage sont contrôlés dans la configuration :
- `cron.sessionRetention` (`24h` par défaut) élague les sessions dexécution isolées terminées.
- `cron.sessionRetention` (par défaut `24h`) élague les sessions dexécution isolée terminées.
- `cron.runLog.maxBytes` et `cron.runLog.keepLines` élaguent `~/.openclaw/cron/runs/<jobId>.jsonl`.
## Migration danciennes tâches
## Migration des anciennes tâches
<Note>
Si vous avez des tâches Cron antérieures au format actuel de livraison et de stockage, exécutez `openclaw doctor --fix`. Doctor normalise les anciens champs Cron (`jobId`, `schedule.cron`, les champs de livraison de premier niveau, y compris lancien `threadId`, et les alias de livraison `provider` de la charge utile) et migre les tâches simples de secours Webhook `notify: true` vers une livraison Webhook explicite lorsque `cron.webhook` est configuré.
Si vous avez des tâches Cron créées avant le format actuel de livraison et de stockage, exécutez `openclaw doctor --fix`. Doctor normalise les anciens champs Cron (`jobId`, `schedule.cron`, champs de livraison de premier niveau dont lancien `threadId`, alias de livraison `provider` dans la charge utile) et migre les tâches de secours Webhook simples `notify: true` vers une livraison Webhook explicite lorsque `cron.webhook` est configuré.
</Note>
## Modifications courantes
Mettre à jour les paramètres de livraison sans modifier le message :
Mettre à jour les paramètres de livraison sans changer le message :
```bash
openclaw cron edit <job-id> --announce --channel telegram --to "123456789"
@ -178,13 +178,13 @@ Désactiver la livraison pour une tâche isolée :
openclaw cron edit <job-id> --no-deliver
```
Activer le contexte damorçage léger pour une tâche isolée :
Activer un contexte de bootstrap léger pour une tâche isolée :
```bash
openclaw cron edit <job-id> --light-context
```
Annoncer sur un canal spécifique :
Annoncer vers un canal spécifique :
```bash
openclaw cron edit <job-id> --announce --channel slack --to "channel:C1234567890"
@ -196,7 +196,7 @@ Annoncer vers un sujet de forum Telegram :
openclaw cron edit <job-id> --announce --channel telegram --to "-1001234567890" --thread-id 42
```
Créer une tâche isolée avec un contexte damorçage léger :
Créer une tâche isolée avec un contexte de bootstrap léger :
```bash
openclaw cron add \
@ -208,7 +208,7 @@ openclaw cron add \
--no-deliver
```
`--light-context` sapplique uniquement aux tâches de tour dagent isolées. Pour les exécutions Cron, le mode léger garde le contexte damorçage vide au lieu dinjecter lensemble complet damorçage de lespace de travail.
`--light-context` sapplique uniquement aux tâches de tour dagent isolées. Pour les exécutions Cron, le mode léger garde le contexte de bootstrap vide au lieu dinjecter lensemble complet de bootstrap de lespace de travail.
## Commandes dadministration courantes
@ -216,13 +216,16 @@ Exécution manuelle et inspection :
```bash
openclaw cron list
openclaw cron list --agent ops
openclaw cron show <job-id>
openclaw cron run <job-id>
openclaw cron run <job-id> --due
openclaw cron runs --id <job-id> --limit 50
```
Les entrées de `cron runs` incluent des diagnostics de livraison avec la cible Cron prévue, la cible résolue, les envois par loutil de message, lutilisation du secours et létat de livraison.
`openclaw cron list` affiche toutes les tâches correspondantes par défaut. Passez `--agent <id>` pour afficher uniquement les tâches dont lidentifiant dagent normalisé effectif correspond ; les tâches sans identifiant dagent stocké comptent comme lagent par défaut configuré.
Les entrées `cron runs` incluent des diagnostics de livraison avec la cible Cron prévue, la cible résolue, les envois par loutil de message, lutilisation du secours et létat livré.
Reciblage de lagent et de la session :
@ -233,7 +236,7 @@ openclaw cron edit <job-id> --session current
openclaw cron edit <job-id> --session "session:daily-brief"
```
`openclaw cron add` avertit lorsque `--agent` est omis sur les tâches de tour dagent et se rabat sur lagent par défaut (`main`). Passez `--agent <id>` au moment de la création pour épingler un agent spécifique.
`openclaw cron add` avertit lorsque `--agent` est omis sur les tâches de tour dagent et se rabat sur lagent par défaut (`main`). Passez `--agent <id>` à la création pour épingler un agent spécifique.
Ajustements de livraison :

View File

@ -1,21 +1,21 @@
---
read_when:
- Vous souhaitez un diagnostic rapide de létat des canaux + des destinataires des sessions récentes
- Vous souhaitez un état « all » prêt à coller pour le débogage
- Vous voulez un diagnostic rapide de létat de santé des canaux + des destinataires des sessions récentes
- Vous voulez un statut « all » prêt à coller pour le débogage
summary: Référence CLI pour `openclaw status` (diagnostics, sondes, instantanés dutilisation)
title: Statut
x-i18n:
generated_at: "2026-04-30T07:20:09Z"
generated_at: "2026-05-05T06:16:20Z"
model: gpt-5.5
provider: openai
source_hash: a85613e1830dc24253847e6517d3e155c175bb39ff6b01031ac5cb4291e276fa
source_hash: 5025ed99d351a43adc60b6896349366b225fd7ecb8ab422dba376f2d157f0033
source_path: cli/status.md
workflow: 16
---
# `openclaw status`
Diagnostics pour les canaux + les sessions.
Diagnostics des canaux et des sessions.
```bash
openclaw status
@ -24,27 +24,28 @@ openclaw status --deep
openclaw status --usage
```
Notes :
Remarques :
- `--deep` exécute des sondes en direct (WhatsApp Web + Telegram + Discord + Slack + Signal).
- `openclaw status` simple reste sur le chemin rapide en lecture seule et marque la mémoire comme `not checked` au lieu de non disponible lorsquil ignore linspection de la mémoire. Laudit de sécurité lourd, la compatibilité des plugins et les sondes de vecteurs mémoire sont laissés à `openclaw status --all`, `openclaw status --deep`, `openclaw security audit` et `openclaw memory status --deep`.
- `status --json --all` signale les détails de mémoire depuis le runtime du plugin de mémoire active sélectionné par `plugins.slots.memory`. Les plugins de mémoire personnalisés peuvent laisser `agents.defaults.memorySearch.enabled` intégré désactivé tout en signalant leurs propres fichiers, segments, vecteurs et état FTS.
- `--usage` affiche les fenêtres dutilisation normalisées des fournisseurs sous la forme `X% left`.
- La sortie de statut de session sépare `Execution:` de `Runtime:`. `Execution` correspond au chemin du bac à sable (`direct`, `docker/*`), tandis que `Runtime` indique si la session utilise `OpenClaw Pi Default`, `OpenAI Codex`, un backend CLI ou un backend ACP tel que `codex (acp/acpx)`. Consultez [Runtimes dagent](/fr/concepts/agent-runtimes) pour la distinction entre fournisseur, modèle et runtime.
- Les champs bruts `usage_percent` / `usagePercent` de MiniMax représentent le quota restant ; OpenClaw les inverse donc avant laffichage. Les champs basés sur le comptage lemportent lorsquils sont présents. Les réponses `model_remains` privilégient lentrée du modèle de chat, dérivent létiquette de fenêtre à partir des horodatages si nécessaire et incluent le nom du modèle dans létiquette du plan.
- Lorsque linstantané de session actuel est fragmentaire, `/status` peut compléter les compteurs de tokens et de cache à partir du journal dutilisation de transcript le plus récent. Les valeurs en direct non nulles existantes lemportent toujours sur les valeurs de repli du transcript.
- Le repli sur transcript peut aussi récupérer létiquette du modèle de runtime actif lorsquelle manque dans lentrée de session en direct. Si ce modèle de transcript diffère du modèle sélectionné, le statut résout la fenêtre de contexte daprès le modèle de runtime récupéré au lieu du modèle sélectionné.
- Pour la comptabilisation de la taille dinvite, le repli sur transcript privilégie le total orienté invite le plus élevé lorsque les métadonnées de session sont absentes ou inférieures, afin que les sessions de fournisseurs personnalisés ne retombent pas sur des affichages à `0` token.
- `openclaw status` simple reste sur le chemin rapide en lecture seule et marque la mémoire comme `not checked` au lieu dindisponible lorsquil ignore linspection de la mémoire. Laudit de sécurité lourd, la compatibilité des plugins et les sondes de vecteurs mémoire sont réservés à `openclaw status --all`, `openclaw status --deep`, `openclaw security audit` et `openclaw memory status --deep`.
- `status --json --all` signale les détails de mémoire depuis lenvironnement dexécution du plugin de mémoire actif sélectionné par `plugins.slots.memory`. Les plugins de mémoire personnalisés peuvent laisser le réglage intégré `agents.defaults.memorySearch.enabled` désactivé tout en signalant leurs propres fichiers, fragments, vecteurs et état FTS.
- `--usage` affiche les fenêtres dutilisation normalisées du fournisseur sous la forme `X% left`.
- La sortie détat de session sépare `Execution:` de `Runtime:`. `Execution` est le chemin du bac à sable (`direct`, `docker/*`), tandis que `Runtime` indique si la session utilise `OpenClaw Pi Default`, `OpenAI Codex`, un backend CLI ou un backend ACP tel que `codex (acp/acpx)`. Consultez [Environnements dexécution des agents](/fr/concepts/agent-runtimes) pour la distinction entre fournisseur, modèle et environnement dexécution.
- Les champs bruts `usage_percent` / `usagePercent` de MiniMax correspondent au quota restant ; OpenClaw les inverse donc avant laffichage. Les champs basés sur le nombre lemportent lorsquils sont présents. Les réponses `model_remains` privilégient lentrée du modèle de chat, déduisent létiquette de fenêtre à partir des horodatages si nécessaire et incluent le nom du modèle dans létiquette du forfait.
- Lorsque linstantané de la session actuelle est clairsemé, `/status` peut compléter les compteurs de jetons et de cache depuis le journal dutilisation de transcript le plus récent. Les valeurs en direct non nulles existantes lemportent toujours sur les valeurs de repli du transcript.
- `/status` inclut la disponibilité compacte du processus Gateway et la disponibilité du système hôte.
- Le repli sur transcript peut aussi récupérer létiquette du modèle denvironnement dexécution actif lorsque lentrée de session en direct ne linclut pas. Si ce modèle de transcript diffère du modèle sélectionné, létat résout la fenêtre de contexte par rapport au modèle denvironnement dexécution récupéré plutôt quau modèle sélectionné.
- Pour la comptabilisation de la taille dinvite, le repli sur transcript privilégie le total orienté invite le plus élevé lorsque les métadonnées de session sont absentes ou inférieures, afin que les sessions de fournisseurs personnalisés ne seffondrent pas vers des affichages à `0` jeton.
- La sortie inclut les magasins de sessions par agent lorsque plusieurs agents sont configurés.
- La vue densemble inclut le statut dinstallation et de runtime du Gateway + service hôte Node lorsquil est disponible.
- La vue densemble inclut le canal de mise à jour + le SHA git (pour les checkouts source).
- Les informations de mise à jour apparaissent dans la vue densemble ; si une mise à jour est disponible, le statut affiche une indication invitant à exécuter `openclaw update` (voir [Mise à jour](/fr/install/updating)).
- Les surfaces de statut en lecture seule (`status`, `status --json`, `status --all`) résolvent les SecretRefs pris en charge pour leurs chemins de configuration ciblés lorsque cest possible.
- Si un SecretRef de canal pris en charge est configuré mais indisponible dans le chemin de commande actuel, le statut reste en lecture seule et signale une sortie dégradée au lieu de planter. La sortie humaine affiche des avertissements tels que « jeton configuré indisponible dans ce chemin de commande », et la sortie JSON inclut `secretDiagnostics`.
- Lorsque la résolution de SecretRef locale à la commande réussit, le statut privilégie linstantané résolu et efface les marqueurs transitoires « secret unavailable » des canaux dans la sortie finale.
- La vue densemble inclut létat dinstallation et dexécution du service hôte Gateway + node lorsquil est disponible.
- La vue densemble inclut le canal de mise à jour + le SHA git (pour les extractions source).
- Les informations de mise à jour apparaissent dans la vue densemble ; si une mise à jour est disponible, létat affiche une indication pour exécuter `openclaw update` (voir [Mise à jour](/fr/install/updating)).
- Les surfaces détat en lecture seule (`status`, `status --json`, `status --all`) résolvent les SecretRefs pris en charge pour leurs chemins de configuration ciblés lorsque cest possible.
- Si un SecretRef de canal pris en charge est configuré mais indisponible dans le chemin de commande actuel, létat reste en lecture seule et signale une sortie dégradée au lieu de planter. La sortie destinée aux humains affiche des avertissements tels que « jeton configuré indisponible dans ce chemin de commande », et la sortie JSON inclut `secretDiagnostics`.
- Lorsque la résolution command-local de SecretRef réussit, létat privilégie linstantané résolu et efface les marqueurs transitoires « secret indisponible » du canal dans la sortie finale.
- `status --all` inclut une ligne de vue densemble des secrets et une section de diagnostic qui résume les diagnostics de secrets (tronqués pour la lisibilité) sans arrêter la génération du rapport.
## Associé
## Voir aussi
- [Référence CLI](/fr/cli)
- [Doctor](/fr/gateway/doctor)

View File

@ -1,24 +1,24 @@
---
read_when:
- Vous avez besoin dune procédure pas à pas précise de la boucle de lagent ou des événements du cycle de vie
- Vous avez besoin dun guide pas à pas précis de la boucle de lagent ou des événements du cycle de vie
- Vous modifiez la mise en file dattente des sessions, les écritures de transcription ou le comportement du verrou décriture de session
summary: Cycle de vie de la boucle dagent, flux et sémantique dattente
title: Boucle dagent
title: Boucle de lagent
x-i18n:
generated_at: "2026-05-03T21:29:42Z"
generated_at: "2026-05-05T06:16:16Z"
model: gpt-5.5
provider: openai
source_hash: 1bdd8e98710dce6412f499c37d2d74445f44f93142364c30993de517fdea6c56
source_hash: 1c7031a2b70e7a891f51fa127df6f04663db81400715717f50dd840a3fa5b745
source_path: concepts/agent-loop.md
workflow: 16
---
Une boucle agentique est lexécution complète « réelle » dun agent : réception → assemblage du contexte → inférence du modèle →
exécution des outils → réponses en streaming → persistance. Cest le chemin faisant autorité qui transforme un message
en actions et en réponse finale, tout en gardant létat de session cohérent.
Une boucle agentique correspond à lexécution « réelle » complète dun agent : réception → assemblage du contexte → inférence du modèle →
exécution doutils → réponses en streaming → persistance. Cest le chemin de référence qui transforme un message
en actions et en réponse finale, tout en maintenant la cohérence de létat de session.
Dans OpenClaw, une boucle est une exécution unique et sérialisée par session, qui émet des événements de cycle de vie et de flux
pendant que le modèle réfléchit, appelle des outils et diffuse la sortie. Cette documentation explique comment cette boucle authentique est
pendant que le modèle réfléchit, appelle des outils et diffuse la sortie. Ce document explique comment cette boucle authentique est
câblée de bout en bout.
## Points dentrée
@ -28,117 +28,117 @@ câblée de bout en bout.
## Fonctionnement (vue densemble)
1. La RPC `agent` valide les paramètres, résout la session (sessionKey/sessionId), persiste les métadonnées de session, retourne immédiatement `{ runId, acceptedAt }`.
1. Le RPC `agent` valide les paramètres, résout la session (sessionKey/sessionId), persiste les métadonnées de session, renvoie immédiatement `{ runId, acceptedAt }`.
2. `agentCommand` exécute lagent :
- résout les valeurs par défaut du modèle + thinking/verbose/trace
- charge linstantané des skills
- charge linstantané des Skills
- appelle `runEmbeddedPiAgent` (runtime pi-agent-core)
- émet **fin/erreur de cycle de vie** si la boucle intégrée nen émet pas
3. `runEmbeddedPiAgent` :
- sérialise les exécutions via des files dattente par session + globales
- sérialise les exécutions via des files par session + globale
- résout le modèle + le profil dauthentification et construit la session pi
- sabonne aux événements pi et diffuse les deltas dassistant/doutil
- applique le délai dexpiration -> abandonne lexécution sil est dépassé
- pour les tours du serveur dapplication Codex, abandonne un tour accepté qui cesse de produire de la progression côté serveur dapplication avant un événement terminal
- retourne les charges utiles + les métadonnées dutilisation
- sabonne aux événements pi et diffuse les deltas assistant/outil
- impose un délai dexpiration -> interrompt lexécution si celui-ci est dépassé
- pour les tours du serveur dapplication Codex, interrompt un tour accepté qui cesse de produire de la progression du serveur dapplication avant un événement terminal
- renvoie les charges utiles + les métadonnées dutilisation
4. `subscribeEmbeddedPiSession` relie les événements pi-agent-core au flux `agent` dOpenClaw :
- événements doutil => `stream: "tool"`
- deltas dassistant => `stream: "assistant"`
- deltas de lassistant => `stream: "assistant"`
- événements de cycle de vie => `stream: "lifecycle"` (`phase: "start" | "end" | "error"`)
5. `agent.wait` utilise `waitForAgentRun` :
- attend **fin/erreur de cycle de vie** pour `runId`
- retourne `{ status: ok|error|timeout, startedAt, endedAt, error? }`
- renvoie `{ status: ok|error|timeout, startedAt, endedAt, error? }`
## Mise en file dattente + concurrence
## Mise en file + concurrence
- Les exécutions sont sérialisées par clé de session (voie de session) et, éventuellement, via une voie globale.
- Cela évite les courses entre outils/sessions et garde lhistorique de session cohérent.
- Les canaux de messagerie peuvent choisir des modes de file dattente (collect/steer/followup) qui alimentent ce système de voies.
Voir [File dattente des commandes](/fr/concepts/queue).
- Les écritures de transcription sont également protégées par un verrou décriture de session sur le fichier de session. Le verrou est
conscient du processus et basé sur fichier ; il détecte donc les rédacteurs qui contournent la file dattente en processus ou proviennent
dun autre processus. Les rédacteurs de transcription de session attendent jusquà `session.writeLock.acquireTimeoutMs`
- Les exécutions sont sérialisées par clé de session (voie de session) et éventuellement via une voie globale.
- Cela évite les courses entre outils/sessions et maintient la cohérence de lhistorique de session.
- Les canaux de messagerie peuvent choisir des modes de file (collect/steer/followup) qui alimentent ce système de voies.
Voir [File de commandes](/fr/concepts/queue).
- Les écritures de transcript sont également protégées par un verrou décriture de session sur le fichier de session. Le verrou est
conscient du processus et basé sur un fichier, ce qui lui permet de détecter les rédacteurs qui contournent la file en processus ou proviennent
dun autre processus. Les rédacteurs de transcripts de session attendent jusquà `session.writeLock.acquireTimeoutMs`
avant de signaler que la session est occupée ; la valeur par défaut est `60000` ms.
- Les verrous décriture de session sont non réentrants par défaut. Si un assistant imbrique intentionnellement lacquisition du
même verrou tout en préservant un rédacteur logique unique, il doit sy inscrire explicitement avec
- Les verrous décriture de session ne sont pas réentrants par défaut. Si un helper imbrique intentionnellement lacquisition du
même verrou tout en préservant un seul rédacteur logique, il doit lactiver explicitement avec
`allowReentrant: true`.
## Préparation de la session + de lespace de travail
- Lespace de travail est résolu et créé ; les exécutions en bac à sable peuvent être redirigées vers une racine despace de travail en bac à sable.
- Lespace de travail est résolu et créé ; les exécutions en bac à sable peuvent être redirigées vers une racine despace de travail de bac à sable.
- Les Skills sont chargés (ou réutilisés depuis un instantané) et injectés dans lenvironnement et le prompt.
- Les fichiers de bootstrap/contexte sont résolus et injectés dans le rapport du prompt système.
- Les fichiers de bootstrap/contexte sont résolus et injectés dans le rapport de prompt système.
- Un verrou décriture de session est acquis ; `SessionManager` est ouvert et préparé avant le streaming. Tout
chemin ultérieur de réécriture de transcription, Compaction ou troncature doit prendre le même verrou avant douvrir ou
de modifier le fichier de transcription.
chemin ultérieur de réécriture, compaction ou troncature du transcript doit prendre le même verrou avant douvrir ou
de modifier le fichier de transcript.
## Assemblage du prompt + prompt système
- Le prompt système est construit à partir du prompt de base dOpenClaw, du prompt des Skills, du contexte de bootstrap et des remplacements par exécution.
- Les limites propres au modèle et les jetons de réserve de Compaction sont appliqués.
- Voir [Prompt système](/fr/concepts/system-prompt) pour savoir ce que voit le modèle.
- Les limites propres au modèle et les jetons réservés à la Compaction sont appliqués.
- Voir [Prompt système](/fr/concepts/system-prompt) pour ce que le modèle voit.
## Points daccroche (où vous pouvez intercepter)
## Points de hook (où vous pouvez intercepter)
OpenClaw dispose de deux systèmes de hooks :
OpenClaw possède deux systèmes de hooks :
- **Hooks internes** (hooks Gateway) : scripts pilotés par événements pour les commandes et événements de cycle de vie.
- **Hooks Plugin** : points dextension dans le cycle de vie de lagent/outil et le pipeline Gateway.
- **Hooks internes** (hooks Gateway) : scripts pilotés par événements pour les commandes et les événements de cycle de vie.
- **Hooks de Plugin** : points dextension dans le cycle de vie de lagent/outil et le pipeline Gateway.
### Hooks internes (hooks Gateway)
- **`agent:bootstrap`** : sexécute lors de la construction des fichiers de bootstrap avant la finalisation du prompt système.
- **`agent:bootstrap`** : sexécute pendant la construction des fichiers de bootstrap avant la finalisation du prompt système.
Utilisez-le pour ajouter/supprimer des fichiers de contexte de bootstrap.
- **Hooks de commande** : `/new`, `/reset`, `/stop` et autres événements de commande (voir la documentation Hooks).
Voir [Hooks](/fr/automation/hooks) pour la configuration et des exemples.
### Hooks Plugin (cycle de vie de lagent + Gateway)
### Hooks de Plugin (cycle de vie agent + Gateway)
Ils sexécutent dans la boucle dagent ou le pipeline Gateway :
Ils sexécutent dans la boucle agent ou le pipeline Gateway :
- **`before_model_resolve`** : sexécute avant la session (sans `messages`) pour remplacer déterministiquement le fournisseur/modèle avant la résolution du modèle.
- **`before_prompt_build`** : sexécute après le chargement de la session (avec `messages`) pour injecter `prependContext`, `systemPrompt`, `prependSystemContext` ou `appendSystemContext` avant la soumission du prompt. Utilisez `prependContext` pour le texte dynamique par tour et les champs de contexte système pour les consignes stables qui doivent résider dans lespace du prompt système.
- **`before_model_resolve`** : sexécute avant la session (sans `messages`) pour remplacer de manière déterministe le fournisseur/modèle avant la résolution du modèle.
- **`before_prompt_build`** : sexécute après le chargement de session (avec `messages`) pour injecter `prependContext`, `systemPrompt`, `prependSystemContext` ou `appendSystemContext` avant la soumission du prompt. Utilisez `prependContext` pour le texte dynamique par tour et les champs de contexte système pour les consignes stables qui doivent rester dans lespace du prompt système.
- **`before_agent_start`** : hook de compatibilité hérité qui peut sexécuter dans lune ou lautre phase ; préférez les hooks explicites ci-dessus.
- **`before_agent_reply`** : sexécute après les actions en ligne et avant lappel au LLM, permettant à un Plugin de revendiquer le tour et de retourner une réponse synthétique ou de rendre le tour entièrement silencieux.
- **`agent_end`** : inspecte la liste finale des messages et les métadonnées dexécution après achèvement.
- **`before_agent_reply`** : sexécute après les actions en ligne et avant lappel au LLM, ce qui permet à un Plugin de prendre en charge le tour et de renvoyer une réponse synthétique ou de rendre le tour entièrement silencieux.
- **`agent_end`** : inspecte la liste finale des messages et les métadonnées dexécution après lachèvement.
- **`before_compaction` / `after_compaction`** : observe ou annote les cycles de Compaction.
- **`before_tool_call` / `after_tool_call`** : intercepte les paramètres/résultats doutil.
- **`before_install`** : inspecte les résultats de scan intégrés et peut éventuellement bloquer les installations de skill ou de Plugin.
- **`tool_result_persist`** : transforme de façon synchrone les résultats doutil avant leur écriture dans une transcription de session appartenant à OpenClaw.
- **`before_install`** : inspecte les résultats de scan intégrés et peut bloquer les installations de Skills ou de plugins.
- **`tool_result_persist`** : transforme de manière synchrone les résultats doutil avant leur écriture dans un transcript de session détenu par OpenClaw.
- **`message_received` / `message_sending` / `message_sent`** : hooks de messages entrants + sortants.
- **`session_start` / `session_end`** : limites de cycle de vie de session.
- **`session_start` / `session_end`** : limites du cycle de vie de session.
- **`gateway_start` / `gateway_stop`** : événements de cycle de vie Gateway.
Règles de décision des hooks pour les garde-fous sortants/doutils :
Règles de décision des hooks pour les protections sortantes/doutil :
- `before_tool_call` : `{ block: true }` est terminal et arrête les gestionnaires de priorité inférieure.
- `before_tool_call` : `{ block: false }` est sans effet et nefface pas un blocage antérieur.
- `before_tool_call` : `{ block: false }` est un no-op et nefface pas un blocage précédent.
- `before_install` : `{ block: true }` est terminal et arrête les gestionnaires de priorité inférieure.
- `before_install` : `{ block: false }` est sans effet et nefface pas un blocage antérieur.
- `before_install` : `{ block: false }` est un no-op et nefface pas un blocage précédent.
- `message_sending` : `{ cancel: true }` est terminal et arrête les gestionnaires de priorité inférieure.
- `message_sending` : `{ cancel: false }` est sans effet et nefface pas une annulation antérieure.
- `message_sending` : `{ cancel: false }` est un no-op et nefface pas une annulation précédente.
Voir [Hooks Plugin](/fr/plugins/hooks) pour lAPI des hooks et les détails dinscription.
Voir [Hooks de Plugin](/fr/plugins/hooks) pour lAPI de hooks et les détails denregistrement.
Les harnais peuvent adapter ces hooks différemment. Le harnais du serveur dapplication Codex conserve
les hooks Plugin OpenClaw comme contrat de compatibilité pour les surfaces miroir documentées,
les hooks de Plugin OpenClaw comme contrat de compatibilité pour les surfaces documentées en miroir,
tandis que les hooks natifs Codex restent un mécanisme Codex distinct de plus bas niveau.
## Streaming + réponses partielles
- Les deltas dassistant sont diffusés depuis pi-agent-core et émis comme événements `assistant`.
- Le streaming par bloc peut émettre des réponses partielles soit sur `text_end`, soit sur `message_end`.
- Les deltas de lassistant sont diffusés depuis pi-agent-core et émis comme événements `assistant`.
- Le streaming par blocs peut émettre des réponses partielles soit sur `text_end`, soit sur `message_end`.
- Le streaming de raisonnement peut être émis comme flux séparé ou comme réponses par blocs.
- Voir [Streaming](/fr/concepts/streaming) pour le comportement de découpage et de réponse par bloc.
- Voir [Streaming](/fr/concepts/streaming) pour le comportement de découpage et de réponse par blocs.
## Exécution doutils + outils de messagerie
- Les événements de début/mise à jour/fin doutil sont émis sur le flux `tool`.
- Les résultats doutil sont assainis pour la taille et les charges utiles dimage avant journalisation/émission.
- Les envois doutil de messagerie sont suivis pour supprimer les confirmations dassistant dupliquées.
- Les résultats doutil sont nettoyés en taille et en charges utiles dimage avant journalisation/émission.
- Les envois par outil de messagerie sont suivis pour supprimer les confirmations dassistant en double.
## Mise en forme + suppression des réponses
## Façonnage + suppression des réponses
- Les charges utiles finales sont assemblées à partir de :
- texte de lassistant (et raisonnement facultatif)
@ -146,44 +146,44 @@ tandis que les hooks natifs Codex restent un mécanisme Codex distinct de plus b
- texte derreur de lassistant lorsque le modèle échoue
- Le jeton silencieux exact `NO_REPLY` / `no_reply` est filtré des charges utiles
sortantes.
- Les doublons doutil de messagerie sont retirés de la liste finale des charges utiles.
- Les doublons doutils de messagerie sont retirés de la liste finale des charges utiles.
- Sil ne reste aucune charge utile affichable et quun outil a échoué, une réponse de secours derreur doutil est émise
(sauf si un outil de messagerie a déjà envoyé une réponse visible par lutilisateur).
## Compaction + nouvelles tentatives
- La Compaction automatique émet des événements de flux `compaction` et peut déclencher une nouvelle tentative.
- Lors dune nouvelle tentative, les tampons en mémoire et les résumés doutils sont réinitialisés pour éviter une sortie dupliquée.
- Lors dune nouvelle tentative, les tampons en mémoire et les résumés doutils sont réinitialisés afin déviter les sorties en double.
- Voir [Compaction](/fr/concepts/compaction) pour le pipeline de Compaction.
## Flux dévénements (aujourdhui)
- `lifecycle` : émis par `subscribeEmbeddedPiSession` (et en solution de repli par `agentCommand`)
- `lifecycle` : émis par `subscribeEmbeddedPiSession` (et en secours par `agentCommand`)
- `assistant` : deltas diffusés depuis pi-agent-core
- `tool` : événements doutil diffusés depuis pi-agent-core
## Gestion des canaux de chat
- Les deltas dassistant sont mis en tampon dans des messages de chat `delta`.
- Un `final` de chat est émis lors de **fin/erreur de cycle de vie**.
- Les deltas de lassistant sont mis en tampon dans des messages de chat `delta`.
- Un `final` de chat est émis sur **fin/erreur de cycle de vie**.
## Délais dexpiration
- Valeur par défaut de `agent.wait` : 30 s (uniquement lattente). Le paramètre `timeoutMs` remplace cette valeur.
- Runtime de lagent : `agents.defaults.timeoutSeconds` vaut par défaut 172800 s (48 heures) ; appliqué dans le minuteur dabandon de `runEmbeddedPiAgent`.
- Runtime Cron : le `timeoutSeconds` dun tour dagent isolé appartient à cron. Le planificateur démarre ce minuteur lorsque lexécution commence, abandonne lexécution sous-jacente à léchéance configurée, puis exécute un nettoyage borné avant denregistrer le délai dexpiration afin quune session enfant obsolète ne puisse pas bloquer la voie.
- Diagnostics de vivacité de session : lorsque les diagnostics sont activés, `diagnostics.stuckSessionWarnMs` classe les longues sessions `processing` qui nont aucune réponse, outil, statut, bloc ou progression ACP observés. Les exécutions intégrées actives, appels de modèle et appels doutil sont signalés comme `session.long_running` ; le travail actif sans progression récente est signalé comme `session.stalled` ; `session.stuck` est réservé à la comptabilité de session obsolète sans travail actif. La comptabilité de session obsolète libère immédiatement la voie de session concernée ; les exécutions intégrées bloquées ne sont abandonnées et drainées quaprès une fenêtre prolongée sans progression (au moins 10 minutes et 5x le seuil davertissement), afin que le travail en file puisse reprendre sans interrompre des exécutions simplement lentes. Les diagnostics `session.stuck` répétés appliquent un délai progressif tant que la session reste inchangée.
- Délai dinactivité du modèle : OpenClaw abandonne une requête de modèle lorsquaucun fragment de réponse narrive avant la fenêtre dinactivité. `models.providers.<id>.timeoutSeconds` étend ce chien de garde dinactivité pour les fournisseurs locaux/auto-hébergés lents ; sinon OpenClaw utilise `agents.defaults.timeoutSeconds` lorsquil est configuré, plafonné à 120 s par défaut. Les exécutions déclenchées par Cron sans délai dexpiration explicite de modèle ou dagent désactivent le chien de garde dinactivité et sappuient sur le délai dexpiration externe de Cron.
- Délai dexpiration des requêtes HTTP du fournisseur : `models.providers.<id>.timeoutSeconds` sapplique aux récupérations HTTP de modèle de ce fournisseur, y compris la connexion, les en-têtes, le corps, le délai dexpiration de requête du SDK, la gestion dabandon guarded-fetch totale et le chien de garde dinactivité du flux de modèle. Utilisez-le pour les fournisseurs locaux/auto-hébergés lents comme Ollama avant daugmenter le délai dexpiration de tout le runtime de lagent.
- Runtime agent : `agents.defaults.timeoutSeconds` vaut par défaut 172800 s (48 heures) ; appliqué dans le minuteur dinterruption de `runEmbeddedPiAgent`.
- Runtime Cron : le `timeoutSeconds` des tours agent isolés appartient à Cron. Le planificateur démarre ce minuteur lorsque lexécution commence, interrompt lexécution sous-jacente à léchéance configurée, puis exécute un nettoyage borné avant denregistrer le délai dexpiration afin quune session enfant obsolète ne puisse pas bloquer la voie.
- Diagnostics de vivacité de session : avec les diagnostics activés, `diagnostics.stuckSessionWarnMs` classe les longues sessions `processing` qui nont pas de réponse, outil, statut, bloc ou progression ACP observés. Les exécutions intégrées, appels de modèle et appels doutil actifs sont signalés comme `session.long_running` ; le travail actif sans progression récente est signalé comme `session.stalled` ; `session.stuck` est réservé à la comptabilité de session obsolète sans travail actif. La comptabilité de session obsolète libère immédiatement la voie de session affectée ; les exécutions intégrées bloquées ne sont interrompues puis drainées quaprès `diagnostics.stuckSessionAbortMs` (par défaut : au moins 10 minutes et 5x le seuil davertissement), afin que le travail en file puisse reprendre sans interrompre de simples exécutions lentes. La récupération émet des résultats structurés demandés/terminés, et létat de diagnostic nest marqué inactif que si la même génération de traitement est toujours courante. Les diagnostics `session.stuck` répétés appliquent un backoff tant que la session reste inchangée.
- Délai dinactivité du modèle : OpenClaw interrompt une requête de modèle lorsquaucun fragment de réponse narrive avant la fenêtre dinactivité. `models.providers.<id>.timeoutSeconds` étend ce chien de garde dinactivité pour les fournisseurs locaux/auto-hébergés lents ; sinon OpenClaw utilise `agents.defaults.timeoutSeconds` lorsquil est configuré, plafonné à 120 s par défaut. Les exécutions déclenchées par Cron sans délai dexpiration explicite de modèle ou dagent désactivent le chien de garde dinactivité et sappuient sur le délai dexpiration externe de Cron.
- Délai dexpiration des requêtes HTTP du fournisseur : `models.providers.<id>.timeoutSeconds` sapplique aux fetches HTTP du modèle de ce fournisseur, y compris la connexion, les en-têtes, le corps, le délai dexpiration des requêtes SDK, la gestion dinterruption de fetch gardé total et le chien de garde dinactivité du flux de modèle. Utilisez-le pour les fournisseurs locaux/auto-hébergés lents comme Ollama avant daugmenter le délai dexpiration global du runtime agent.
## Où les choses peuvent se terminer plus tôt
## Où les choses peuvent se terminer tôt
- Délai dexpiration de lagent (abandon)
- Délai dexpiration de lagent (interruption)
- AbortSignal (annulation)
- Déconnexion Gateway ou délai dexpiration RPC
- Délai dexpiration `agent.wait` (attente uniquement, narrête pas lagent)
## Associé
## Associés
- [Outils](/fr/tools) — outils dagent disponibles
- [Hooks](/fr/automation/hooks) — scripts pilotés par événements déclenchés par les événements de cycle de vie de lagent

View File

@ -1,65 +1,65 @@
---
read_when:
- Mettre en place ou exécuter un contrôle qualité visuel en direct pour les bogues OpenClaw
- Créer ou exécuter une assurance qualité visuelle 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 autres
- Débogage des exécutions QA nécessitant des captures décran, lautomatisation du navigateur ou un accès VNC
- Ajout de scénarios de transport en direct Discord, Slack, WhatsApp ou autres
- Débogage des exécutions dassurance qualité 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 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-04T07:03:09Z"
generated_at: "2026-05-05T06:16:29Z"
model: gpt-5.5
provider: openai
source_hash: 9d3f3fa3db111b1b5c85f8efeccd749fbd5885cee6b7843ca4c8d049acfd9164
source_hash: 26a9671135e38bf82d3627364f691f8d91cc8649ffc2e5fa782ebef474a44fa1
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 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 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 contre une référence connue comme défectueuse, capture les éléments de preuve, exécute le même scénario contre une référence candidate et publie la comparaison sous forme dartefacts quun mainteneur peut inspecter depuis une PR ou depuis une commande locale.
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é.
Mantis commence avec Discord parce que Discord nous donne une première voie à forte valeur : authentification réelle du bot, vrais canaux de guilde, réactions, fils, commandes natives et une UI de navigateur où les humains peuvent confirmer visuellement ce que le transport a montré.
## Objectifs
- 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.
- 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.
- Reproduire un bug depuis une issue GitHub ou une PR avec la même forme de transport que celle que voient 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.
- 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 canal.
- Capturer des captures décran lorsque le bug a une surface UI visible.
- Exécuter localement depuis une CLI contrôlée par un 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.
- Publier un statut concis dans un canal 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 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 remplace pas les tests unitaires. Une exécution Mantis doit généralement devenir un test de régression plus petit une fois le correctif compris.
- Mantis nest pas le gate CI rapide normal. Il est plus lent, utilise des identifiants live et est réservé aux bugs où lenvironnement live compte.
- Mantis ne doit 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 pile QA dOpenClaw.
- 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.
- 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`.
- QA Lab possède les pièces du harnais de transport live, les assistants de capture du 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 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.
- ClawSweeper possède le routage des commentaires GitHub : analyse des commandes de mainteneur, déclenchement du workflow et publication du commentaire final de 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 limite garde la connaissance du transport dans OpenClaw, la planification des machines dans Crabbox et la colle du workflow mainteneur dans ClawSweeper.
Cette limite conserve la connaissance du transport dans OpenClaw, la planification des machines dans Crabbox et la glue du workflow mainteneur dans ClawSweeper.
## Forme de commande
## Forme des commandes
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 :
La première commande locale vérifie le bot Discord, la guilde, le canal, lenvoi de message, lenvoi de réaction et le chemin des artefacts :
```bash
pnpm openclaw qa mantis discord-smoke \
--output-dir .artifacts/qa-e2e/mantis/discord-smoke
```
Lexécuteur local avant et après accepte cette forme :
Le lanceur local avant et après accepte cette forme :
```bash
pnpm openclaw qa mantis run \
@ -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 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`.
Le lanceur crée des worktrees détachés pour la référence de base et la candidate 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`.
La première primitive VM/navigateur est le smoke desktop :
@ -79,14 +79,14 @@ 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 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.
Elle loue ou réutilise une machine desktop Crabbox, démarre un navigateur visible dans la session VNC, capture le bureau, récupère 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.
Options utiles du smoke desktop :
Indicateurs utiles pour le 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>` 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.
- `--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` conserve ouverte une location nouvellement créée et réussie pour inspection VNC. Les exécutions échouées conservent 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.
La première primitive complète de transport desktop est le smoke desktop Slack :
@ -99,9 +99,9 @@ pnpm openclaw qa mantis slack-desktop-smoke \
--keep-lease
```
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.
Elle loue ou réutilise une machine desktop Crabbox, synchronise le checkout actuel dans la VM, exécute `pnpm openclaw qa slack` dans cette VM, ouvre Slack Web dans le navigateur VNC, capture le bureau visible et copie à 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 du SUT et le navigateur vivent tous deux dans la même VM desktop Linux.
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.
Avec `--gateway-setup`, la commande prépare un home OpenClaw jetable persistant à `$HOME/.openclaw-mantis/slack-openclaw`, patche la configuration Slack Socket Mode pour le canal 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 « laissez-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` :
@ -109,32 +109,32 @@ Entrées requises pour `--credential-source env` :
- `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.
- `OPENCLAW_LIVE_OPENAI_KEY` pour la voie de 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 la transmission des variables denvironnement `OPENCLAW_*` de Crabbox puisse lacheminer dans la VM.
Options utiles du desktop Slack :
Indicateurs utiles pour le desktop Slack :
- `--lease-id <cbx_...>` réexécute contre une machine où un opérateur sest déjà connecté à Slack Web via VNC.
- `--lease-id <cbx_...>` relance 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.
- `--slack-url <url>` ouvre une URL Slack Web spécifique. Sans cela, 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 canaux 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`, donc une connexion manuelle à Slack Web survit aux relances sur la même location.
- `--credential-source convex --credential-role ci` utilise le pool didentifiants partagé au lieu de jetons denvironnement Slack directs.
- `--provider-mode`, `--model`, `--alt-model` et `--fast` sont transmis à la voie live Slack.
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 :
Le workflow smoke GitHub est `Mantis Discord Smoke`. Le workflow GitHub avant et après pour le premier scénario réel 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`.
- `baseline_ref` : la référence censée reproduire le comportement uniquement en file dattente.
- `candidate_ref` : la référence censée afficher `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.
Il checkout la référence du harnais de workflow, construit des worktrees séparés pour la référence de base et la candidate, 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 également 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 même commentaire de PR pointe vers les enregistrements MP4 du desktop capturés pendant le rendu du navigateur VNC, tandis que les captures décran restent intégrées pour une revue rapide. Le workflow construit la CLI Crabbox depuis `openclaw/crabbox` main afin de pouvoir utiliser les indicateurs actuels de location desktop/navigateur 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 :
Vous pouvez aussi déclencher lexécution status-reactions directement depuis un commentaire de PR :
```text
@Mantis discord status reactions
```
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 :
Le déclencheur par commentaire est volontairement étroit. Il ne sexécute que sur les commentaires de pull request provenant dutilisateurs disposant dun accès 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 référence de base connue comme défectueuse et le SHA de tête de la PR actuelle comme candidat. Les mainteneurs peuvent remplacer lune ou lautre référence :
```text
@Mantis discord status reactions baseline=origin/main candidate=HEAD
@ -147,42 +147,42 @@ 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 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.
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 conclusions de revue ClawSweeper.
## Cycle de vie de lexécution
## Cycle de vie dexé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 ref de référence.
3. Préparer le profil desktop/navigateur lorsque le scénario nécessite une preuve UI.
4. Préparer un checkout propre pour la référence de base.
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 référence.
7. Configurer le transport live, le fournisseur, le modèle et le profil navigateur.
8. Exécuter le scénario et capturer les preuves de base.
9. Arrêter le Gateway et préserver les journaux.
10. Préparer la ref candidate dans la même VM.
10. Préparer la référence 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 le Markdown, le JSON, les journaux, les captures décran et les artefacts de trace facultatifs.
13. Écrire Markdown, JSON, journaux, captures décran et artefacts de trace facultatifs.
14. Téléverser les artefacts GitHub Actions.
15. Publier un message de statut concis sur la PR ou Discord.
15. Publier un message de statut concis dans une PR ou Discord.
Le scénario devrait pouvoir échouer de deux façons différentes :
Le scénario doit pouvoir échouer de deux façons différentes :
- **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.
- **Bug reproduit** : la référence de base a échoué de la manière attendue.
- **Échec du harnais** : la configuration de lenvironnement, les identifiants, lAPI Discord, le navigateur ou le fournisseur ont échoué avant que loracle du bug soit significatif.
Le rapport final doit séparer ces cas afin que les mainteneurs ne confondent pas un environnement flaky avec le comportement du produit.
Le rapport final doit séparer ces cas afin que les mainteneurs ne confondent pas un environnement instable avec le comportement du produit.
## MVP Discord
Le premier scénario devrait cibler les réactions de statut Discord dans les salons de guilde où le mode de livraison de réponse source est `message_tool_only`.
Le premier scénario doit cibler les réactions de statut Discord dans les canaux de guilde où le mode de livraison de réponse source est `message_tool_only`.
Pourquoi cest une bonne graine Mantis :
- 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 dispose dun oracle REST solide via létat des réactions de 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 dun tour de modèle.
- Il est assez étroit pour garder la première implémentation honnête.
Forme de scénario attendue :
@ -216,9 +216,9 @@ evidence:
screenshotMessageRow: 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`.
Les preuves de base doivent 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 doivent montrer les réactions de statut du cycle de vie en cours dexécution lorsque `messages.statusReactions.enabled` est explicitement `true`.
La première tranche exécutable est le scénario QA Discord réel opt-in :
La première tranche exécutable est le scénario QA live Discord opt-in :
```bash
pnpm openclaw qa discord \
@ -230,22 +230,33 @@ pnpm openclaw qa discord \
--output-dir .artifacts/qa-e2e/mantis/discord-status-reactions-candidate
```
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`.
Il configure le SUT avec la gestion des guildes toujours activée, `visibleReplies:
"message_tool"`, `ackReaction: "👀"`, et des réactions détat 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`.
## Composants QA existants
## Éléments QA existants
Mantis doit sappuyer sur la pile 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 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.
- `pnpm openclaw qa discord` exécute déjà une voie Discord en direct avec des bots
pilote et SUT.
- Lexécuteur de transport en direct écrit déjà des rapports et des 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
en forme de transport.
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.
La première implémentation de Mantis peut être un mince exécuteur avant/après par-dessus ces
éléments, avec une couche de preuve visuelle.
## Modèle de preuves
## Modèle de preuve
Chaque exécution écrit un répertoire dartefacts stable :
@ -267,63 +278,77 @@ Chaque exécution écrit un répertoire dartefacts stable :
run.log
```
`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.
`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 refs et les SHA testés
- le transport et lid du scénario
- les refs et SHA testés
- le transport et lid de 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 la baseline
- le résultat du candidat
- si le bug sest reproduit sur la baseline
- si le candidat la corrigé
- les chemins des artefacts
- les problèmes de configuration ou de nettoyage nettoyés
- les chemins dartefacts
- les problèmes de configuration ou de nettoyage assainis
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.
Les captures décran sont des preuves, pas des secrets. Elles nécessitent quand même une discipline de
masquage : des noms de canaux privés, des noms dutilisateurs ou le contenu de messages peuvent apparaître. Pour les PR publiques,
préférer les liens dartefacts GitHub Actions aux images intégrées tant que la stratégie de masquage
nest pas plus solide.
## Navigateur et VNC
La voie navigateur dispose de deux modes :
La voie navigateur a deux modes :
- **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.
- **Automatisation headless** : valeur par défaut pour 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, la MFA, lanti-automatisation Discord
ou le débogage visuel nécessite une intervention humaine.
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.
Le profil de navigateur observateur Discord doit être assez 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 à lordinateur portable dun développeur.
Quand Mantis se bloque, il publie un message de statut Discord avec :
Quand Mantis se bloque, il publie un message détat Discord avec :
- lid dexécution
- lid du scénario
- lid de 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
- un court texte de blocage
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é.
Le premier déploiement privé peut publier ces messages dans le canal opérateur
existant, puis 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 donne 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, ajouter un fournisseur Hetzner
derrière la même interface de machine.
Exigences minimales pour la VM :
Exigences minimales de VM :
- Linux avec une installation Chrome ou Chromium capable dexécuter un bureau
- Linux avec une installation Chrome ou Chromium capable dafficher un bureau
- accès CDP pour lautomatisation du navigateur
- VNC ou noVNC pour le secours
- Node 22 et pnpm
- checkout OpenClaw et cache des dépendances
- 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
- checkout OpenClaw et cache de dépendances
- cache du navigateur Playwright Chromium lorsque Playwright est utilisé
- assez de CPU et de mémoire pour un Gateway OpenClaw, un navigateur, et une exécution de modèle
- accès sortant à Discord, GitHub, aux fournisseurs de modèles, et au courtier didentifiants
La VM ne doit pas conserver de secrets bruts de longue durée en dehors des magasins didentifiants ou de profils de navigateur attendus.
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.
## 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 vivent 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 :
@ -339,26 +364,43 @@ Noms de secrets recommandés :
- `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 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é.
À long terme, le pool didentifiants Convex doit rester la source normale pour les
identifiants de transport en direct. Les secrets GitHub amorcent le courtier et les voies de secours.
Le workflow des réactions détat 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 simples `CRABBOX_*` restent
acceptés comme solution de compatibilité.
Le runner Mantis ne doit jamais afficher :
Lexécuteur Mantis ne doit jamais imprimer :
- les tokens de bot Discord
- les clés API de fournisseur
- les tokens de bots Discord
- les clés dAPI de fournisseurs
- les cookies de navigateur
- le contenu des profils dauthentification
- les mots de passe VNC
- les charges utiles didentifiants bruts
- les charges utiles didentifiants brutes
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.
Les téléversements dartefacts publics doivent aussi masquer les métadonnées de cible Discord telles que les ids de bot,
de guilde, de canal, et de message. Le workflow de smoke GitHub active
`OPENCLAW_QA_REDACT_PUBLIC_METADATA=1` pour cette raison.
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.
Si un token est collé accidentellement dans une issue, une PR, un chat, ou un journal, le faire tourner
après le stockage du nouveau secret.
## Artefacts GitHub et commentaires de PR
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 Mantis doivent téléverser lensemble complet de preuves comme artefact Actions
à courte durée de vie. Lorsque le workflow est exécuté pour un rapport de bug ou une PR de correction, il doit aussi
publier les captures décran PNG masquées sur la branche `qa-artifacts` et mettre à jour ou créer un
commentaire sur ce bug ou cette PR de correction avec des captures décran avant/après intégrées. Ne pas publier
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 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é.
Les workflows de production doivent publier ces commentaires avec la GitHub App Mantis, et non
avec `github-actions[bot]`. Stocker lid dapp 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é de mise à jour,
met à jour ce commentaire lorsque le token peut le modifier, et crée un nouveau commentaire possédé par Mantis lorsque
un ancien marqueur possédé par un bot ne peut pas être modifié.
Le commentaire de PR doit être court et visuel :
@ -380,60 +422,73 @@ candidate showed the expected queued -> thinking -> done sequence.
| <inline screenshot> | <inline screenshot> |
```
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é.
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 de créer une autre application lorsquelle dispose des bonnes autorisations de bot et peut être tournée en toute sécurité.
Un déploiement privé peut déjà avoir une application Discord Mantis. Réutiliser cette
application au lieu de créer une autre app lorsquelle dispose des bonnes
autorisations de bot et peut être tournée en sécurité.
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.
Définir le canal initial de notification des opérateurs via des secrets ou la configuration de déploiement.
Il peut pointer dabord vers un canal existant de mainteneurs ou dopérations,
puis migrer vers un canal Mantis dédié une fois quil existe.
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.
Ne pas mettre dids de guilde, dids de canal, de tokens de bot, de cookies de navigateur, ou de mots de passe VNC
dans ce document. Les stocker dans des 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 :
- 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
- id et titre
- transport
- identifiants requis
- politique de ref de baseline
- politique de ref de candidat
- correctif de configuration OpenClaw
- étapes de configuration
- stimulus
- oracle de baseline attendu
- oracle de candidat attendu
- cibles de capture visuelle
- budget de délai dexpiration
- étapes de nettoyage
Les scénarios doivent privilégier de petits oracles typés :
- 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
- état des réactions Discord pour les bugs de réactions
- références de messages Discord pour les bugs de fils
- ts de fil Slack et état de lAPI de réactions pour les bugs Slack
- ids et en-têtes de messages e-mail pour les bugs de-mail
- captures décran de navigateur lorsque lUI est le seul observable fiable
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.
Les vérifications par vision doivent être additives. Si une API de plateforme peut prouver le bug, utiliser
lAPI comme oracle de réussite/échec et conserver les captures décran pour renforcer la confiance humaine.
## Extension des fournisseurs
Après Discord, le même runner peut ajouter :
Après Discord, le même exécuteur peut ajouter :
- 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.
- Slack : réactions, fils, mentions dapp, modales, téléversements de fichiers.
- E-mail : authentification Gmail et fils de messages avec `gog` lorsque les connecteurs ne sont pas
suffisants.
- WhatsApp : connexion QR, ré-identification, livraison de messages, médias, réactions.
- Telegram : filtrage 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 bugs. Les scénarios visuels coûteux doivent rester opt-in.
Chaque transport doit avoir un scénario de smoke peu coûteux et un ou plusieurs scénarios par classe de bug.
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, 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 ?
- 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 uniquement 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 dun mainteneur ?
- Les captures décran doivent-elles être caviardées ou recadrées avant le téléversement pour les PR publiques ?
- Quand ClawSweeper doit-il recommander automatiquement Mantis au lieu dattendre une
commande de mainteneur ?
- Les captures décran doivent-elles être masquées ou recadrées avant téléversement pour les PR publiques ?

View File

@ -1,80 +1,81 @@
---
read_when:
- Comprendre comment la pile dassurance qualité sarticule
- Étendre qa-lab, qa-channel ou un adaptateur de transport
- Ajout de scénarios de QA adossés au dépôt
- Extension de qa-lab, qa-channel ou dun adaptateur de transport
- Ajout de scénarios QA 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é
title: Aperçu de lassurance qualité
x-i18n:
generated_at: "2026-05-05T01:45:26Z"
generated_at: "2026-05-05T06:17:12Z"
model: gpt-5.5
provider: openai
source_hash: 83adbe934d73265a1b47ee463c98fdd3eddfb1cd063d3a46a83dfc7568df0a96
source_hash: d313abf9e0f13a159ce28c023e2a1c4c1518529da1354a130e9f495e65faac19
source_path: concepts/qa-e2e-automation.md
workflow: 16
---
La pile QA privée vise à exercer OpenClaw dune façon plus réaliste,
proche dun canal, quun seul 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 permet un simple test unitaire.
Éléments actuels :
Composants actuels :
- `extensions/qa-channel` : canal de messages synthétique avec surfaces de DM,
canal, fil, réaction, modification et suppression.
- `extensions/qa-lab` : UI de débogage et bus QA pour observer la transcription,
- `extensions/qa-channel` : canal de messages synthétique avec surfaces de DM, canal, fil,
réaction, modification et suppression.
- `extensions/qa-lab` : interface de débogage et bus QA pour observer la transcription,
injecter des messages entrants et exporter un rapport Markdown.
- `extensions/qa-matrix`, futurs plugins dexécution : adaptateurs de transport réel qui
pilotent un vrai canal dans un Gateway QA enfant.
- `qa/` : ressources damorçage appuyées par le dépôt pour la tâche de lancement et les
scénarios QA de référence.
- [Mantis](/fr/concepts/mantis) : vérification réelle avant et après pour les bogues qui
nécessitent de vrais transports, des captures décran de navigateur, létat de VM et des preuves de PR.
- `extensions/qa-matrix`, futurs plugins de runner : adaptateurs de transports en direct qui
pilotent un vrai canal à lintérieur dun Gateway QA enfant.
- `qa/` : ressources damorçage adossées au dépôt pour la tâche de démarrage et les scénarios QA
de référence.
- [Mantis](/fr/concepts/mantis) : vérification en direct avant et après pour les bogues 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 groupée ; écrit un rapport Markdown. |
| `qa suite` | Exécuter les scénarios appuyés par le 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 personnage sur plusieurs modèles réels avec un rapport évalué. Voir [Rapports](#reporting). |
| `qa manual` | Exécuter un prompt ponctuel contre la voie du fournisseur/modèle sélectionné. |
| `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éintégrée. |
| `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 appuyée par 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 de fournisseur AIMock. |
| `qa mock-openai` | Démarrer uniquement le serveur de fournisseur `mock-openai` conscient des scénarios. |
| `qa credentials doctor` / `add` / `list` / `remove` | Gérer le pool partagé didentifiants Convex. |
| `qa matrix` | Voie de transport réel contre un homeserver Tuwunel jetable. Voir [Matrix QA](/fr/concepts/qa-matrix). |
| `qa telegram` | Voie de transport réel contre un vrai groupe privé Telegram. |
| `qa discord` | Voie de transport réel contre un vrai canal de guilde privé Discord. |
| `qa slack` | Voie de transport réel contre un vrai canal privé Slack. |
| `qa mantis` | Exécuteur de vérification avant et après pour les bogues de transport réel, avec preuves de réactions de statut Discord, smoke desktop/navigateur Crabbox et smoke Slack dans VNC. Voir [Mantis](/fr/concepts/mantis). |
| `qa run` | Auto-vérification QA intégrée ; écrit un rapport Markdown. |
| `qa suite` | Exécute les scénarios adossés au dépôt contre la voie Gateway QA. Alias : `pnpm openclaw qa suite --runner multipass` pour une VM Linux jetable. |
| `qa coverage` | Affiche linventaire Markdown de couverture des scénarios (`--json` pour une sortie machine). |
| `qa parity-report` | Compare deux fichiers `qa-suite-summary.json` et écrit le rapport de parité agentique. |
| `qa character-eval` | Exécute le scénario QA de personnage sur plusieurs modèles en direct avec un rapport jugé. Voir [Rapports](#reporting). |
| `qa manual` | Exécute une invite ponctuelle contre la voie fournisseur/modèle sélectionnée. |
| `qa ui` | Démarre linterface de débogage QA et le bus QA local (alias : `pnpm qa:lab:ui`). |
| `qa docker-build-image` | Construit limage Docker QA préassemblée. |
| `qa docker-scaffold` | Écrit un échafaudage docker-compose pour le tableau de bord QA + la voie Gateway. |
| `qa up` | Construit le site QA, démarre la pile adossée à Docker, affiche lURL (alias : `pnpm qa:lab:up` ; la variante `:fast` ajoute `--use-prebuilt-image --bind-ui-dist --skip-ui-build`). |
| `qa aimock` | Démarre uniquement le serveur fournisseur AIMock. |
| `qa mock-openai` | Démarre uniquement le serveur fournisseur `mock-openai` conscient des scénarios. |
| `qa credentials doctor` / `add` / `list` / `remove` | Gère le pool didentifiants Convex partagé. |
| `qa matrix` | Voie de transport en direct contre un homeserver Tuwunel jetable. Voir [QA Matrix](/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 bogues 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 volets :
- 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 de type Slack et le plan de scénario.
Exécutez-le avec :
Lancez-le avec :
```bash
pnpm qa:lab:up
```
Cela construit le site QA, démarre la voie Gateway appuyée par Docker et expose la
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 comportement réel du canal et consigner ce qui a fonctionné, échoué ou
QA, observer le comportement réel du canal et enregistrer ce qui a fonctionné, échoué ou
est resté bloqué.
Pour itérer plus vite sur lUI QA Lab locale sans reconstruire limage Docker à chaque fois,
Pour une itération plus rapide sur linterface QA Lab sans reconstruire limage Docker à chaque fois,
démarrez la pile avec un bundle QA Lab monté par liaison :
```bash
@ -86,8 +87,7 @@ pnpm qa:lab:watch
`qa:lab:up:fast` garde les services Docker sur une image préconstruite et monte par liaison
`extensions/qa-lab/web/dist` dans le conteneur `qa-lab`. `qa:lab:watch`
reconstruit ce bundle à chaque changement, et le navigateur se recharge automatiquement lorsque le hachage des ressources QA Lab
change.
reconstruit ce bundle à chaque modification, et le navigateur se recharge automatiquement quand le hachage des ressources QA Lab change.
Pour un smoke local de trace OpenTelemetry, exécutez :
@ -97,16 +97,16 @@ pnpm qa:otel:smoke
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 :
décode les spans protobuf exportés et vérifie la forme critique pour la publication :
`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 absents 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. La tarball npm omet intentionnellement
QA Lab, donc les voies de release Docker de package nexécutent pas les commandes `qa`. Utilisez
`pnpm qa:otel:smoke` depuis un checkout source construit lors des changements de linstrumentation
La QA dobservabilité reste réservée aux extractions de source. Le tarball npm omet intentionnellement
QA Lab, donc les voies de publication Docker de package nexécutent pas les commandes `qa`. Utilisez
`pnpm qa:otel:smoke` depuis une extraction de source construite lorsque vous modifiez linstrumentation
de diagnostic.
Pour une voie smoke Matrix avec transport réel, exécutez :
@ -115,9 +115,9 @@ Pour une voie smoke Matrix avec transport réel, exécutez :
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 pour 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>/`.
La référence CLI complète, le catalogue des profils/scénarios, les variables denvironnement et lorganisation des artefacts pour cette voie 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/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 voies smoke à transport réel Telegram, Discord et Slack :
Pour les voies smoke Telegram, Discord et Slack avec transport réel :
```bash
pnpm openclaw qa telegram
@ -136,78 +136,105 @@ pnpm openclaw qa mantis slack-desktop-smoke \
--keep-lease
```
Cette commande loue une machine desktop/navigateur Crabbox, exécute la voie live Slack
Cette commande loue une machine desktop/navigateur Crabbox, exécute la voie Slack en direct
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
copie `slack-qa/`, `slack-desktop-smoke.png` et `slack-desktop-smoke.mp4`
lorsque la capture vidéo est disponible, vers 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 cela, la commande exécute la
voie QA Slack bot-à-bot normale et quitte après la capture des artefacts.
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 se termine après la capture des artefacts.
Avant dutiliser des identifiants réels mutualisés, exécutez :
Pour une tâche desktop de style agent/CV, exécutez :
```bash
pnpm openclaw qa mantis visual-task \
--browser-url https://example.net \
--expect-text "Example Domain" \
--vision-model openai/gpt-5.4
```
`visual-task` loue ou réutilise une machine desktop/navigateur Crabbox, démarre
`crabbox record --while`, pilote le navigateur visible via un
`visual-driver` imbriqué, capture `visual-task.png`, exécute `openclaw infer image describe`
sur la capture décran lorsque `--vision-mode image-describe` est sélectionné, et
écrit `visual-task.mp4`, `mantis-visual-task-summary.json`,
`mantis-visual-task-driver-result.json` et `mantis-visual-task-report.md`.
Lorsque `--expect-text` est défini, linvite de vision demande un verdict JSON structuré
et ne réussit que lorsque le modèle signale une preuve visible positive ; une
réponse négative qui se contente de citer le texte cible échoue à lassertion.
Utilisez `--vision-mode metadata` pour un smoke sans modèle qui prouve la plomberie
du bureau, du navigateur, de la capture décran et de la vidéo sans appeler de fournisseur de compréhension dimage. Lenregistrement est un artefact obligatoire pour `visual-task` ; si Crabbox nenregistre
aucun `visual-task.mp4` non vide, la tâche échoue même si le driver visuel
a réussi. En cas déchec, Mantis conserve la location pour VNC sauf si la tâche avait déjà
réussi et que `--keep-lease` nétait pas défini.
Avant dutiliser des identifiants en direct mis en pool, exécutez :
```bash
pnpm openclaw qa credentials doctor
```
Le doctor vérifie lenvironnement du courtier 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.
Le doctor vérifie lenvironnement du broker Convex, valide les paramètres de point de terminaison 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 des transports réels
## Couverture des transports en direct
Les voies de transport réel partagent un contrat unique au lieu que chacune invente sa propre forme de liste de scénarios. `qa-channel` est la suite synthétique large de comportements produit et ne fait pas partie de la matrice de couverture des transports réels.
Les voies de transport en direct partagent un contrat unique au lieu dinventer chacune leur propre forme de liste de scénarios. `qa-channel` est la vaste suite synthétique de comportement produit et ne fait pas partie de la matrice de couverture des transports en direct.
| Voie | Canary | Contrôle des mentions | Bot-à-bot | Blocage par liste dautorisation | 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 | Canari | Filtrage par mention | Bot à bot | Blocage par liste dautorisation | Réponse de niveau supérieur | Reprise après redémarrage | Suivi de fil | Isolation du 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 | | | | | | | | |
Cela garde `qa-channel` comme suite large de comportements produit, tandis que Matrix,
Telegram et les futurs transports réels partagent une checklist explicite de contrat de transport.
Cela conserve `qa-channel` comme suite large de comportement produit, tandis que Matrix,
Telegram et les futurs transports live partagent une même liste de contrôle
explicite de contrat de transport.
Pour une voie de VM Linux jetable sans faire entrer Docker dans le chemin QA, exécutez :
Pour une voie de VM Linux jetable sans introduire Docker dans le chemin QA, exécutez :
```bash
pnpm openclaw qa suite --runner multipass --scenario channel-chat-baseline
```
Cela démarre un nouvel invité Multipass, installe les dépendances, compile OpenClaw
dans linvité, exécute `qa suite`, puis recopie le rapport QA normal et le
Cela démarre un nouvel invité Multipass, installe les dépendances, construit OpenClaw
dans linvité, exécute `qa suite`, puis copie 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 avec Multipass exécutent par défaut plusieurs scénarios sélectionnés en parallèle
avec des workers Gateway isolés. `qa-channel` utilise par défaut une concurrence
de 4, limitée au 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.
La commande se termine avec un code non nul lorsquun scénario échoue. Utilisez `--allow-failures` lorsque
vous voulez obtenir les artefacts sans code de sortie en é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
`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é.
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 par défaut une concurrence 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 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 déchec.
Les exécutions live transmettent les entrées dauthentification QA prises en charge
qui sont pratiques pour 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 pour Telegram, Discord et Slack
## Référence QA Telegram, Discord et Slack
Matrix dispose dune [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 profils, 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 de son provisionnement de serveur domestique basé sur 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.
### Options CLI partagées
### Indicateurs CLI partagés
Ces voies senregistrent via `extensions/qa-lab/src/live-transports/shared/live-transport-cli.ts` et acceptent les mêmes options :
Ces voies senregistrent via `extensions/qa-lab/src/live-transports/shared/live-transport-cli.ts` et acceptent les mêmes indicateurs :
| 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, le résumé, les 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 du Gateway QA. |
| `--provider-mode <mode>` | `live-frontier` | `mock-openai` ou `live-frontier` (`live-openai` hérité fonctionne toujours). |
| `--model <ref>` / `--alt-model <ref>` | valeur par défaut du fournisseur | Références du modèle principal/secondaire. |
| `--fast` | désactivé | Mode rapide du fournisseur lorsquil est pris en charge. |
| `--credential-source <env\|convex>` | `env` | Voir [Pool didentifiants Convex](#convex-credential-pool). |
| `--credential-role <maintainer\|ci>` | `ci` en CI, `maintainer` sinon | Rôle utilisé lorsque `--credential-source convex`. |
| Indicateur | Par défaut | Description |
| ------------------------------------ | --------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------- |
| `--scenario <id>` | — | Exécuter 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 de lappel depuis un cwd neutre. |
| `--sut-account <id>` | `sut` | Identifiant de compte temporaire dans la configuration Gateway QA. |
| `--provider-mode <mode>` | `live-frontier` | `mock-openai` ou `live-frontier` (`live-openai` hérité fonctionne toujours). |
| `--model <ref>` / `--alt-model <ref>` | valeur par défaut du fournisseur | Références du modèle principal/alternatif. |
| `--fast` | désactivé | Mode rapide du fournisseur lorsquil est pris en charge. |
| `--credential-source <env\|convex>` | `env` | Voir [pool didentifiants Convex](#convex-credential-pool). |
| `--credential-role <maintainer\|ci>` | `ci` dans CI, `maintainer` sinon | 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 en échec.
Chaque voie se termine avec un code non nul si un scénario échoue. `--allow-failures` écrit les artefacts sans définir de code de sortie déchec.
### QA Telegram
@ -215,17 +242,17 @@ Chaque voie se termine avec un code non nul en cas déchec dun scénario.
pnpm openclaw qa telegram
```
Cible un groupe Telegram privé réel avec deux bots distincts (driver + SUT). Le bot SUT doit avoir un nom dutilisateur Telegram ; lobservation bot-à-bot fonctionne mieux lorsque les deux bots ont activé le **Bot-to-Bot Communication Mode** dans `@BotFather`.
Cible un groupe Telegram privé réel 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`.
Environnement requis lorsque `--credential-source env` :
- `OPENCLAW_QA_TELEGRAM_GROUP_ID` — id de discussion numérique (chaîne).
- `OPENCLAW_QA_TELEGRAM_GROUP_ID` — identifiant numérique du chat (chaîne).
- `OPENCLAW_QA_TELEGRAM_DRIVER_BOT_TOKEN`
- `OPENCLAW_QA_TELEGRAM_SUT_BOT_TOKEN`
Facultatif :
- `OPENCLAW_QA_TELEGRAM_CAPTURE_CONTENT=1` conserve les corps des messages dans les artefacts de messages observés (masqués par défaut).
- `OPENCLAW_QA_TELEGRAM_CAPTURE_CONTENT=1` conserve le corps des messages dans les artefacts de messages observés (masqué par défaut).
Scénarios (`extensions/qa-lab/src/live-transports/telegram/telegram-live.runtime.ts:44`) :
@ -237,11 +264,13 @@ Scénarios (`extensions/qa-lab/src/live-transports/telegram/telegram-live.runtim
- `telegram-tools-compact-command`
- `telegram-whoami-command`
- `telegram-context-command`
- `telegram-long-final-reuses-preview`
- `telegram-long-final-three-chunks`
Artefacts de sortie :
- `telegram-qa-report.md`
- `telegram-qa-summary.json` — inclut le RTT par réponse (envoi du driver → réponse SUT observée) à partir du canary.
- `telegram-qa-summary.json` — inclut le RTT par réponse (envoi du 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
@ -250,7 +279,7 @@ Artefacts de sortie :
pnpm openclaw qa discord
```
Cible un canal de guilde Discord privé réel avec deux bots : un bot driver contrôlé par le harness 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 de preuves Mantis opt-in.
Cible un canal de guilde Discord privé réel 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, et les scénarios de preuves Mantis avec consentement explicite.
Environnement requis lorsque `--credential-source env` :
@ -258,18 +287,18 @@ Environnement requis lorsque `--credential-source env` :
- `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 à lidentifiant utilisateur du bot SUT renvoyé par Discord (sinon la voie échoue rapidement).
Facultatif :
- `OPENCLAW_QA_DISCORD_CAPTURE_CONTENT=1` conserve les corps des messages dans les artefacts de messages observés.
- `OPENCLAW_QA_DISCORD_CAPTURE_CONTENT=1` conserve le corps des 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 opt-in. Sexécute seul, car il fait passer le SUT en mode toujours actif, réponses de guilde uniquement par outil 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 consentement explicite. Sexécute seul, car il bascule le SUT vers des réponses de guilde toujours actives et uniquement via outils avec `messages.statusReactions.enabled=true`, puis capture une chronologie de réactions REST ainsi que des artefacts visuels HTML/PNG. Les rapports Mantis avant/après préservent également les artefacts MP4 fournis par le scénario sous forme de `baseline.mp4` et `candidate.mp4`.
Exécutez explicitement le scénario de réactions de statut Mantis :
@ -295,7 +324,7 @@ Artefacts de sortie :
pnpm openclaw qa slack
```
Cible un canal Slack privé réel avec deux bots distincts : un bot driver contrôlé par le harness et un bot SUT démarré par le Gateway OpenClaw enfant via le Plugin Slack groupé.
Cible un canal Slack privé réel 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é.
Environnement requis lorsque `--credential-source env` :
@ -306,7 +335,7 @@ Environnement requis lorsque `--credential-source env` :
Facultatif :
- `OPENCLAW_QA_SLACK_CAPTURE_CONTENT=1` conserve les corps des messages dans les artefacts de messages observés.
- `OPENCLAW_QA_SLACK_CAPTURE_CONTENT=1` conserve le corps des messages dans les artefacts de messages observés.
Scénarios (`extensions/qa-lab/src/live-transports/slack/slack-live.runtime.ts:39`) :
@ -319,18 +348,18 @@ Artefacts de sortie :
- `slack-qa-summary.json`
- `slack-qa-observed-messages.json` — corps masqués sauf si `OPENCLAW_QA_SLACK_CAPTURE_CONTENT=1`.
#### Configurer lespace de travail Slack
#### Configuration de lespace de travail Slack
La voie nécessite deux applications Slack distinctes dans un même espace de travail, ainsi quun canal dont les deux bots sont membres :
- `channelId` — lid `Cxxxxxxxxxx` dun canal auquel les deux bots ont été invités. Utilisez un canal dédié ; la voie publie à chaque exécution.
- `channelId` — lidentifiant `Cxxxxxxxxxx` dun canal auquel les deux bots ont été invités. Utilisez un canal dédié ; la voie publie à chaque exécution.
- `driverBotToken` — jeton de bot (`xoxb-...`) de lapplication **Driver**.
- `sutBotToken` — jeton de bot (`xoxb-...`) de lapplication **SUT**, qui doit être une application Slack séparée du driver afin que son id utilisateur de bot soit distinct.
- `sutAppToken` — jeton de niveau application (`xapp-...`) de lapplication SUT avec `connections:write`, utilisé par Socket Mode afin que lapplication SUT puisse recevoir des événements.
- `sutBotToken` — jeton de bot (`xoxb-...`) de lapplication **SUT**, qui doit être une application Slack séparée du pilote afin que son identifiant utilisateur de bot soit distinct.
- `sutAppToken` — jeton de niveau application (`xapp-...`) de lapplication SUT avec `connections:write`, utilisé par Socket Mode afin que lapplication SUT puisse recevoir les événements.
Préférez un espace de travail Slack dédié à la QA plutôt que de réutiliser un espace de travail de production.
Préférez un espace de travail Slack dédié à la QA plutôt que la réutilisation dun espace de travail de production.
Le manifeste SUT ci-dessous reflète linstallation de production du Plugin Slack groupé (`extensions/slack/src/setup-shared.ts:10`). Pour la configuration du canal de production telle que les utilisateurs la voient, consultez [Configuration rapide du canal Slack](/fr/channels/slack#quick-setup) ; la paire Driver/SUT QA est volontairement séparée, car la voie a besoin de deux ids utilisateur de bot distincts dans un même espace de travail.
Le manifeste SUT ci-dessous reflète linstallation de production du Plugin Slack groupé (`extensions/slack/src/setup-shared.ts:10`). Pour la configuration du canal de production telle que les utilisateurs la voient, consultez [configuration rapide du canal Slack](/fr/channels/slack#quick-setup) ; la paire QA Driver/SUT est intentionnellement séparée, car la voie nécessite deux identifiants utilisateur de bot distincts dans un même espace de travail.
**1. Créer lapplication Driver**
@ -359,11 +388,11 @@ Accédez à [api.slack.com/apps](https://api.slack.com/apps) → _Create New App
}
```
Copiez le _Bot User OAuth Token_ (`xoxb-...`) — il devient `driverBotToken`. Le driver a seulement besoin de publier des messages et de sidentifier ; pas dévénements, pas de Socket Mode.
Copiez le _Bot User OAuth Token_ (`xoxb-...`) — il devient `driverBotToken`. Le pilote a seulement besoin de publier des messages et de sidentifier ; aucun événement, aucun Socket Mode.
**2. Créer lapplication SUT**
Répétez _Create New App → From a manifest_ dans le même espace de travail. Lensemble de portées reflète linstallation de production du Plugin Slack groupé (`extensions/slack/src/setup-shared.ts:10`) :
Répétez _Create New App → From a manifest_ dans le même espace de travail. Lensemble des portées reflète linstallation de production du Plugin Slack groupé (`extensions/slack/src/setup-shared.ts:10`) :
```json
{
@ -434,12 +463,12 @@ Répétez _Create New App → From a manifest_ dans le même espace de travail.
}
```
Après que Slack a créé lapplication, effectuez deux actions sur sa page de paramètres :
Une fois que Slack a créé lapp, effectuez deux actions sur sa page de paramètres :
- _Install to Workspace_ → copiez le _Bot User OAuth Token_ → il devient `sutBotToken`.
- _Basic Information → App-Level Tokens → Generate Token and Scopes_ → ajoutez la portée `connections:write` → enregistrez → copiez la valeur `xapp-...` → elle devient `sutAppToken`.
- _Basic Information → App-Level Tokens → Generate Token and Scopes_ → ajoutez le scope `connections:write` → enregistrez → copiez la valeur `xapp-...` → elle devient `sutAppToken`.
Vérifiez que les deux bots ont des identifiants utilisateur distincts en appelant `auth.test` sur chaque jeton. Le runtime distingue le pilote et le SUT par identifiant utilisateur ; réutiliser une seule application pour les deux fera échouer immédiatement le filtrage des mentions.
Vérifiez que les deux bots ont des identifiants utilisateur distincts en appelant `auth.test` sur chaque token. Le runtime distingue le pilote et le SUT par identifiant utilisateur ; réutiliser une seule app pour les deux fera échouer immédiatement le filtrage des mentions.
**3. Créer le canal**
@ -450,11 +479,11 @@ Dans lespace de travail QA, créez un canal (par exemple `#openclaw-qa`) et i
/invite @OpenClaw QA SUT
```
Copiez lidentifiant `Cxxxxxxxxxx` depuis _infos du canal → À propos → ID du canal_ — il devient `channelId`. Un canal public fonctionne ; si vous utilisez un canal privé, les deux applications disposent déjà de `groups:history`, donc les lectures dhistorique du harnais réussiront quand même.
Copiez lidentifiant `Cxxxxxxxxxx` depuis _channel info → About → Channel ID_ : il devient `channelId`. Un canal public fonctionne ; si vous utilisez un canal privé, les deux apps disposent déjà de `groups:history`, donc les lectures dhistorique du harnais réussiront tout de même.
**4. Enregistrer les identifiants**
Deux options. Utilisez des variables denvironnement pour le débogage sur une seule machine (définissez les quatre variables `OPENCLAW_QA_SLACK_*` et passez `--credential-source env`), ou alimentez le pool Convex partagé afin que CI et les autres mainteneurs puissent les réserver.
Deux options. Utilisez des variables denvironnement pour le débogage sur une seule machine (définissez les quatre variables `OPENCLAW_QA_SLACK_*` et passez `--credential-source env`), ou alimentez le pool Convex partagé afin que CI et les autres mainteneurs puissent les louer.
Pour le pool Convex, écrivez les quatre champs dans un fichier JSON :
@ -482,7 +511,7 @@ Attendez-vous à `count: 1`, `status: "active"`, sans champ `lease`.
**5. Vérifier de bout en bout**
Exécutez la lane localement pour confirmer que les deux bots peuvent communiquer entre eux via le broker :
Exécutez le lane localement pour confirmer que les deux bots peuvent communiquer entre eux via le broker :
```bash
pnpm openclaw qa slack \
@ -491,76 +520,76 @@ pnpm openclaw qa slack \
--output-dir .artifacts/qa-e2e/slack-local
```
Une exécution réussie se termine largement en moins de 30 secondes et `slack-qa-report.md` affiche `slack-canary` et `slack-mention-gating` avec le statut `pass`. Si la lane se bloque pendant environ 90 secondes puis se termine avec `Convex credential pool exhausted for kind "slack"`, soit le pool est vide, soit chaque ligne est réservée — `qa credentials list --kind slack --status all --json` vous indiquera lequel de ces cas sapplique.
Une exécution verte se termine en bien moins de 30 secondes, et `slack-qa-report.md` affiche `slack-canary` et `slack-mention-gating` avec le statut `pass`. Si le lane reste bloqué pendant environ 90 secondes puis se termine avec `Convex credential pool exhausted for kind "slack"`, soit le pool est vide, soit toutes les lignes sont louées : `qa credentials list --kind slack --status all --json` vous indiquera laquelle de ces situations sapplique.
### Pool didentifiants Convex
Les lanes Telegram, Discord et Slack peuvent réserver 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 une réservation exclusive, maintient son Heartbeat pendant toute la durée de lexécution, puis la 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, envoie des heartbeats pendant toute la durée de lexécution et le libère à larrêt. Les types de pool sont `"telegram"`, `"discord"` et `"slack"`.
Formes de payload que le broker valide sur `admin/add` :
Formes de payload validées par le broker sur `admin/add` :
- Telegram (`kind: "telegram"`) : `{ groupId: string, driverToken: string, sutToken: string }``groupId` doit être une chaîne didentifiant de discussion numérique.
- Discord (`kind: "discord"`) : `{ guildId: string, channelId: string, driverBotToken: string, sutBotToken: string, sutApplicationId: string }`.
- Slack (`kind: "slack"`) : `{ channelId: string, driverBotToken: string, sutBotToken: string, sutAppToken: string }``channelId` doit correspondre à `^[A-Z][A-Z0-9]+$` (un identifiant Slack comme `Cxxxxxxxxxx`). Consultez [Configurer lespace de travail Slack](#setting-up-the-slack-workspace) pour le provisionnement de lapplication et des portées.
- Telegram (`kind: "telegram"`): `{ groupId: string, driverToken: string, sutToken: string }``groupId` doit être une chaîne didentifiant de chat numérique.
- Discord (`kind: "discord"`): `{ guildId: string, channelId: string, driverBotToken: string, sutBotToken: string, sutApplicationId: string }`.
- Slack (`kind: "slack"`): `{ channelId: string, driverBotToken: string, sutBotToken: string, sutAppToken: string }``channelId` doit correspondre à `^[A-Z][A-Z0-9]+$` (un identifiant Slack comme `Cxxxxxxxxxx`). Consultez [Configurer lespace de travail Slack](#setting-up-the-slack-workspace) pour le provisionnement de lapp et des scopes.
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 ; la sémantique du broker est identique pour les deux types).
## Seeds adossés au dépôt
Les ressources de seed se trouvent dans `qa/` :
Les assets 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.
Ils sont intentionnellement versionnés dans git afin que le plan QA soit visible à la fois par les humains et par lagent.
`qa-lab` doit rester un exécuteur 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 :
`qa-lab` doit rester un runner Markdown générique. Chaque fichier de scénario Markdown 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 facultatives de catégorie, capacité, lane et risque
- les références de documentation et de code
- les références de docs et de code
- les exigences facultatives de Plugin
- le correctif facultatif de configuration du Gateway
- le correctif facultatif de configuration Gateway
- le `qa-flow` exécutable
La surface de runtime réutilisable qui sous-tend `qa-flow` peut rester générique et transversale. Par exemple, les scénarios Markdown peuvent combiner des assistants côté transport avec des assistants côté navigateur qui pilotent la Control UI intégrée via la jonction `browser.request` du Gateway, sans ajouter dexécuteur de cas particulier.
La surface de runtime réutilisable qui soutient `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 intégrée via la jointure 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 identifiants 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 identifiants de scénario stables lorsque les fichiers changent demplacement ; utilisez `docsRefs` et `codeRefs` pour la traçabilité de limplémentation.
La liste de référence doit rester suffisamment large pour couvrir :
La liste de base doit rester assez large pour couvrir :
- les messages directs et la discussion de canal
- le comportement des fils
- les discussions DM et de canal
- le comportement des threads
- le cycle de vie des actions de message
- les callbacks cron
- le rappel de mémoire
- le rappel mémoire
- le changement de modèle
- le transfert vers un sous-agent
- la lecture du dépôt et de la documentation
- une petite tâche de build comme Lobster Invaders
## Lanes de mocks de fournisseur
## Lanes de mocks fournisseur
`qa suite` possède deux lanes locales de mock de fournisseur :
`qa suite` comporte deux lanes locales de mocks fournisseur :
- `mock-openai` est le mock OpenClaw conscient des scénarios. Il reste la lane de mock déterministe par défaut pour la QA adossée au 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 conscient des scénarios. Il reste le lane de mock déterministe par défaut pour la QA adossée au dépôt et les portes de parité.
- `aimock` démarre un serveur fournisseur adossé à 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`.
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 son serveur local, la configuration de modèle du Gateway, les besoins de préparation de profils dauthentification et les 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 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 du modèle Gateway, ses besoins de préparation dauth-profile 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 brancher 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 sur le même exécuteur de suite au lieu dajouter un exécuteur QA spécifique au transport.
`qa-lab` possède une jointure de transport générique pour les scénarios QA Markdown. `qa-channel` est le premier adaptateur sur cette jointure, mais la cible de conception est plus large : les futurs canaux réels ou synthétiques doivent se brancher au même runner de suite plutôt que dajouter un runner QA spécifique au transport.
Au niveau architectural, la séparation est la suivante :
Au niveau de larchitecture, la séparation est la suivante :
- `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 du Gateway, létat prêt, lobservation entrante et sortante, les actions de transport et létat de transport normalisé.
- Ladaptateur de transport possède la configuration Gateway, la disponibilité, 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 de runtime réutilisable qui les exécute.
### Ajouter un canal
Ajouter un canal au système QA Markdown nécessite exactement deux éléments :
Ajouter un canal au système QA Markdown exige exactement deux choses :
1. Un adaptateur de transport pour le canal.
2. Un pack de scénarios qui exerce le contrat du canal.
@ -577,37 +606,37 @@ Najoutez pas de nouvelle racine de commande QA de premier niveau lorsque l
- 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 runner possèdent le contrat de transport :
- comment `openclaw qa <runner>` est monté sous la racine partagée `qa`
- comment le Gateway est configuré pour ce transport
- comment létat prêt est vérifié
- comment les événements entrants sont injectés
- comment les messages sortants sont observés
- comment les transcriptions et létat de transport normalisé sont exposés
- comment les actions adossées au transport sont exécutées
- comment la réinitialisation ou le nettoyage spécifique au transport est géré
- la manière dont `openclaw qa <runner>` est monté sous la racine partagée `qa`
- la manière dont le Gateway est configuré pour ce transport
- la manière dont la disponibilité est vérifiée
- la manière dont les événements entrants sont injectés
- la manière dont les messages sortants sont observés
- la manière dont les transcripts et létat de transport normalisé sont exposés
- la manière dont les actions adossées au transport sont exécutées
- la manière dont la réinitialisation ou le nettoyage spécifique au transport est géré
Le seuil minimal dadoption pour un nouveau canal :
Le seuil minimum dadoption pour un nouveau canal :
1. Garder `qa-lab` comme propriétaire de la racine partagée `qa`.
2. Implémenter lexécuteur de transport sur la jonction dhôte partagée de `qa-lab`.
3. Garder les mécanismes propres au transport dans le Plugin dexécuteur ou le harnais de canal.
4. Monter lexécuteur comme `openclaw qa <runner>` au lieu denregistrer une racine de commande concurrente. Les Plugins dexécuteur 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 de lexécuteur doivent rester derrière des points dentrée séparés.
2. Implémenter le runner de transport sur la jointure dhôte partagée `qa-lab`.
3. Garder les mécanismes spécifiques au transport dans le Plugin runner ou le harnais de canal.
4. Monter le runner comme `openclaw qa <runner>` au lieu denregistrer une commande racine concurrente. Les plugins runner 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édiger ou adapter des scénarios Markdown sous les répertoires thématiques `qa/scenarios/`.
6. Utiliser les assistants de scénario génériques pour les nouveaux scénarios.
7. Garder les alias de compatibilité existants opérationnels, sauf si le dépôt effectue une migration intentionnelle.
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 le comportement peut être exprimé une seule fois dans `qa-lab`, placez-le dans `qa-lab`.
- Si le comportement dépend dun seul transport de canal, gardez-le dans ce Plugin dexécuteur ou dans le harnais du Plugin.
- Si un scénario a besoin dune nouvelle capacité que plusieurs canaux peuvent utiliser, ajoutez un assistant 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`, mettez-le dans `qa-lab`.
- Si un comportement dépend dun transport de canal, gardez-le dans ce Plugin runner ou dans le harnais de Plugin.
- Si un scénario a besoin dune nouvelle capacité que plusieurs canaux peuvent utiliser, 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 cela explicite dans le contrat du scénario.
### Noms des assistants de scénario
### Noms des helpers de scénario
Assistants génériques recommandés pour les nouveaux scénarios :
Helpers génériques préférés pour les nouveaux scénarios :
- `waitForTransportReady`
- `waitForChannelReady`
@ -622,21 +651,21 @@ Assistants génériques recommandé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 à date fixe, pas comme modèle pour lavenir.
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 instantanée, pas comme modèle pour la suite.
## Reporting
`qa-lab` exporte un rapport de protocole Markdown à partir de la chronologie du bus observée.
Le rapport doit répondre à :
`qa-lab` exporte un rapport de protocole Markdown depuis la chronologie de 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
Pour linventaire des scénarios disponibles — utile pour dimensionner les travaux 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 câbler un nouveau transport — exécutez `pnpm openclaw qa coverage` (ajoutez `--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 références de modèle live et écrivez un rapport Markdown évalué :
Pour les contrôles de caractère et de style, exécutez le même scénario sur plusieurs refs de modèle live et écrivez un rapport Markdown jugé :
```bash
pnpm openclaw qa character-eval \
@ -655,47 +684,23 @@ pnpm openclaw qa character-eval \
--judge-concurrency 16
```
La commande exécute des processus enfants QA gateway locaux, pas Docker. Les scénarios
dévaluation de personnage doivent définir la persona via `SOUL.md`, puis exécuter
des tours utilisateur ordinaires comme le chat, laide sur lespace de travail et de
petites tâches sur des fichiers. Le modèle candidat ne doit pas être informé quil
est en cours dévaluation. La commande préserve chaque transcription complète,
enregistre les statistiques dexécution de base, puis demande aux modèles juges en
mode rapide, avec un raisonnement `xhigh` lorsque cest pris en charge, de classer
les exécutions selon leur naturel, leur vibe et leur humour. Utilisez
`--blind-judge-models` lorsque vous comparez des fournisseurs : le prompt du juge
reçoit toujours chaque transcription et état dexécution, mais les références des
candidats sont remplacées par des libellés neutres comme `candidate-01` ; le rapport
associe de nouveau les classements aux références 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 références 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
solution de repli globale, et lancienne forme `--model-thinking <provider/model=level>`
est conservée pour compatibilité.
Les références 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 un remplacement. Passez `--fast` uniquement lorsque vous voulez forcer le
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 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 sur le gateway local rendent une exécution
trop bruitée.
Lorsquaucun candidat `--model` nest transmis, lévaluation de personnage utilise par défaut
La commande exécute des processus enfants du Gateway QA local, pas Docker. Les scénarios dévaluation de personnage 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 sur les fichiers. Le modèle candidat ne doit pas être informé quil est évalué. La commande conserve 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 cest pris en charge, de classer les exécutions selon le naturel, lambiance et lhumour.
Utilisez `--blind-judge-models` lorsque vous comparez des fournisseurs : le prompt du juge reçoit toujours chaque transcription et statut dexécution, mais les références des candidats sont remplacées par des libellés neutres comme `candidate-01` ; le rapport associe de nouveau les classements aux références réelles après lanalyse.
Les exécutions candidates utilisent par défaut un raisonnement `high`, avec `medium` pour GPT-5.5 et `xhigh` pour les anciennes références 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 un repli global, et lancienne forme `--model-thinking <provider/model=level>` est conservée pour la compatibilité.
Les références 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 candidat ou juge unique a besoin dun remplacement. Passez `--fast` uniquement lorsque vous voulez forcer le 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 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 des fournisseurs ou la pression sur le Gateway local rendent une exécution trop bruyante.
Lorsquaucun candidat `--model` nest passé, lévaluation de personnage 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 transmis.
Lorsquaucun `--judge-model` nest transmis, les juges utilisent par défaut
`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)
- [Matrice QA](/fr/concepts/qa-matrix)
- [Canal QA](/fr/channels/qa-channel)
- [Tests](/fr/help/testing)
- [Tableau de bord](/fr/web/dashboard)

View File

@ -2,37 +2,37 @@
read_when:
- Vous avez besoin de la sémantique exacte de la configuration au niveau des champs ou des valeurs par défaut
- Vous validez des blocs de configuration de canal, de modèle, de Gateway ou doutil
summary: Référence de configuration du Gateway pour les clés OpenClaw principales, les valeurs par défaut et les liens vers les références dédiées des sous-systèmes
summary: Référence de configuration du Gateway pour les clés principales dOpenClaw, les valeurs par défaut et les liens vers les références dédiées des sous-systèmes
title: Référence de configuration
x-i18n:
generated_at: "2026-05-05T01:46:23Z"
generated_at: "2026-05-05T06:17:08Z"
model: gpt-5.5
provider: openai
source_hash: 82164a3ea7592f667573b643ee9e0ec840b9b622c9d86c382a3feaf192e75684
source_hash: fd0b6bf9a77d91bcc240088e4be92e44b6e70910efe00f7ed99534fb70983479
source_path: gateway/configuration-reference.md
workflow: 16
---
Référence de configuration principale pour `~/.openclaw/openclaw.json`. Pour une vue densemble orientée tâche, consultez [Configuration](/fr/gateway/configuration).
Référence de configuration principale pour `~/.openclaw/openclaw.json`. Pour une vue densemble orientée tâches, consultez [Configuration](/fr/gateway/configuration).
Couvre les principales surfaces de configuration dOpenClaw et renvoie vers dautres pages lorsquun sous-système dispose de sa propre référence plus approfondie. Les catalogues de commandes appartenant aux canaux et aux plugins, ainsi que les réglages avancés de mémoire/QMD, se trouvent sur leurs propres pages plutôt que sur celle-ci.
Couvre les principales surfaces de configuration dOpenClaw et fournit des liens lorsquun sous-système dispose de sa propre référence plus détaillée. Les catalogues de commandes propres aux canaux et aux Plugins, ainsi que les réglages avancés de mémoire/QMD, se trouvent sur leurs propres pages plutôt que sur celle-ci.
Vérité du code :
- `openclaw config schema` affiche le JSON Schema actif utilisé pour la validation et la Control UI, avec les métadonnées intégrées/plugin/canal fusionnées lorsquelles sont disponibles
- `openclaw config schema` affiche le JSON Schema actif utilisé pour la validation et linterface utilisateur de contrôle, avec les métadonnées groupées/des Plugins/des canaux fusionnées lorsquelles sont disponibles
- `config.schema.lookup` renvoie un nœud de schéma limité à un chemin pour les outils dexploration détaillée
- `pnpm config:docs:check` / `pnpm config:docs:gen` valident le hachage de référence de la documentation de configuration par rapport à la surface de schéma actuelle
- `pnpm config:docs:check` / `pnpm config:docs:gen` valident le hash de référence de la documentation de configuration par rapport à la surface de schéma actuelle
Chemin de recherche de lagent : utilisez laction doutil `gateway` `config.schema.lookup` pour
obtenir la documentation et les contraintes exactes au niveau des champs avant toute modification. Utilisez
[Configuration](/fr/gateway/configuration) pour des conseils orientés tâche et cette page
pour la carte plus générale des champs, les valeurs par défaut et les liens vers les références des sous-systèmes.
Chemin de recherche dagent : utilisez laction doutil `gateway` `config.schema.lookup` pour
obtenir la documentation et les contraintes exactes au niveau des champs avant les modifications. Utilisez
[Configuration](/fr/gateway/configuration) pour des conseils orientés tâches et cette page
pour la cartographie plus large des champs, les valeurs par défaut et les liens vers les références des sous-systèmes.
Références approfondies dédiées :
Références détaillées dédiées :
- [Référence de configuration de la mémoire](/fr/reference/memory-config) pour `agents.defaults.memorySearch.*`, `memory.qmd.*`, `memory.citations` et la configuration de Dreaming sous `plugins.entries.memory-core.config.dreaming`
- [Commandes slash](/fr/tools/slash-commands) pour le catalogue actuel des commandes intégrées + incluses
- pages des canaux/plugins propriétaires pour les surfaces de commandes propres aux canaux
- [Référence de configuration de la mémoire](/fr/reference/memory-config) pour `agents.defaults.memorySearch.*`, `memory.qmd.*`, `memory.citations` et la configuration Dreaming sous `plugins.entries.memory-core.config.dreaming`
- [Commandes slash](/fr/tools/slash-commands) pour le catalogue actuel des commandes intégrées + groupées
- pages propriétaires des canaux/Plugins pour les surfaces de commandes propres aux canaux
Le format de configuration est **JSON5** (commentaires + virgules finales autorisés). Tous les champs sont facultatifs — OpenClaw utilise des valeurs par défaut sûres lorsquils sont omis.
@ -40,35 +40,35 @@ Le format de configuration est **JSON5** (commentaires + virgules finales autori
## Canaux
Les clés de configuration par canal ont été déplacées vers une page dédiée — consultez
Les clés de configuration par canal ont été déplacées vers une page dédiée — voir
[Configuration — canaux](/fr/gateway/config-channels) pour `channels.*`,
notamment Slack, Discord, Telegram, WhatsApp, Matrix, iMessage et les autres
canaux inclus (authentification, contrôle daccès, multi-compte, filtrage des mentions).
canaux groupés (authentification, contrôle daccès, multi-compte, filtrage des mentions).
## Valeurs par défaut des agents, multi-agent, sessions et messages
Déplacé vers une page dédiée — consultez
Déplacé vers une page dédiée — voir
[Configuration — agents](/fr/gateway/config-agents) pour :
- `agents.defaults.*` (espace de travail, modèle, raisonnement, Heartbeat, mémoire, médias, Skills, bac à sable)
- `agents.defaults.*` (espace de travail, modèle, réflexion, Heartbeat, mémoire, médias, Skills, bac à sable)
- `multiAgent.*` (routage et liaisons multi-agent)
- `session.*` (cycle de vie des sessions, Compaction, élagage)
- `messages.*` (livraison des messages, TTS, rendu markdown)
- `messages.*` (livraison des messages, TTS, rendu Markdown)
- `talk.*` (mode Talk)
- `talk.speechLocale` : identifiant de locale BCP 47 facultatif pour la reconnaissance vocale Talk sur iOS/macOS
- `talk.silenceTimeoutMs` : lorsquil nest pas défini, Talk conserve la fenêtre de pause par défaut de la plateforme avant denvoyer la transcription (`700 ms on macOS and Android, 900 ms on iOS`)
- `talk.silenceTimeoutMs` : lorsque non défini, Talk conserve la fenêtre de pause par défaut de la plateforme avant denvoyer la transcription (`700 ms on macOS and Android, 900 ms on iOS`)
## Outils et fournisseurs personnalisés
La politique doutils, les bascules expérimentales, la configuration doutils adossés à des fournisseurs et la configuration de
fournisseur personnalisé / URL de base ont été déplacées vers une page dédiée — consultez
La politique doutils, les bascules expérimentales, la configuration doutils adossée à des fournisseurs et la configuration de
fournisseur / URL de base personnalisée ont été déplacées vers une page dédiée — voir
[Configuration — outils et fournisseurs personnalisés](/fr/gateway/config-tools).
## Modèles
Les définitions de fournisseurs, les listes dautorisation de modèles et la configuration de fournisseurs personnalisés se trouvent dans
[Configuration — outils et fournisseurs personnalisés](/fr/gateway/config-tools#custom-providers-and-base-urls).
La racine `models` possède également le comportement global du catalogue de modèles.
La racine `models` possède aussi le comportement global du catalogue de modèles.
```json5
{
@ -80,16 +80,16 @@ La racine `models` possède également le comportement global du catalogue de mo
```
- `models.mode` : comportement du catalogue de fournisseurs (`merge` ou `replace`).
- `models.providers` : carte des fournisseurs personnalisés indexée par identifiant de fournisseur.
- `models.pricing.enabled` : contrôle lamorçage de tarification en arrière-plan qui
démarre après que les sidecars et les canaux atteignent le chemin prêt du Gateway. Lorsquil vaut `false`,
le Gateway ignore les récupérations de catalogues de tarification OpenRouter et LiteLLM ; les valeurs
`models.providers.*.models[].cost` configurées fonctionnent toujours pour les estimations de coût locales.
- `models.providers` : carte de fournisseurs personnalisés indexée par identifiant de fournisseur.
- `models.pricing.enabled` : contrôle lamorçage en arrière-plan de la tarification qui
démarre après que les sidecars et les canaux atteignent le chemin Gateway prêt. Lorsque `false`,
le Gateway ignore les récupérations des catalogues de tarification OpenRouter et LiteLLM ; les valeurs
`models.providers.*.models[].cost` configurées continuent de fonctionner pour les estimations de coût locales.
## MCP
Les définitions de serveurs MCP gérées par OpenClaw se trouvent sous `mcp.servers` et sont
consommées par Pi intégré et les autres adaptateurs dexécution. Les commandes `openclaw mcp list`,
Les définitions de serveurs MCP gérés par OpenClaw se trouvent sous `mcp.servers` et sont
consommées par Pi intégré et dautres adaptateurs dexécution. Les commandes `openclaw mcp list`,
`show`, `set` et `unset` gèrent ce bloc sans se connecter au
serveur cible pendant les modifications de configuration.
@ -115,20 +115,20 @@ serveur cible pendant les modifications de configuration.
}
```
- `mcp.servers` : définitions de serveurs MCP stdio ou distants nommées pour les environnements dexécution qui
- `mcp.servers` : définitions nommées de serveurs MCP stdio ou distants pour les environnements dexécution qui
exposent les outils MCP configurés.
Les entrées distantes utilisent `transport: "streamable-http"` ou `transport: "sse"` ;
`type: "http"` est un alias natif de la CLI que `openclaw mcp set` et
`openclaw doctor --fix` normalisent dans le champ canonique `transport`.
- `mcp.sessionIdleTtlMs` : TTL dinactivité pour les environnements dexécution MCP inclus à portée de session.
Les exécutions intégrées ponctuelles demandent un nettoyage en fin dexécution ; ce TTL sert de filet de sécurité pour
les sessions de longue durée et les futurs appelants.
- `mcp.sessionIdleTtlMs` : TTL dinactivité pour les environnements dexécution MCP groupés à portée de session.
Les exécutions intégrées ponctuelles demandent un nettoyage de fin dexécution ; ce TTL est le garde-fou pour
les sessions longues et les futurs appelants.
- Les modifications sous `mcp.*` sappliquent à chaud en supprimant les environnements dexécution MCP de session en cache.
La découverte/utilisation suivante des outils les recrée à partir de la nouvelle configuration, de sorte que les entrées
`mcp.servers` supprimées sont récupérées immédiatement au lieu dattendre le TTL dinactivité.
La prochaine découverte/utilisation doutil les recrée à partir de la nouvelle configuration, de sorte que les entrées
`mcp.servers` supprimées sont collectées immédiatement au lieu dattendre le TTL dinactivité.
Consultez [MCP](/fr/cli/mcp#openclaw-as-an-mcp-client-registry) et
[Backends CLI](/fr/gateway/cli-backends#bundle-mcp-overlays) pour le comportement à lexécution.
[Backends CLI](/fr/gateway/cli-backends#bundle-mcp-overlays) pour le comportement dexécution.
## Skills
@ -155,14 +155,14 @@ Consultez [MCP](/fr/cli/mcp#openclaw-as-an-mcp-client-registry) et
}
```
- `allowBundled` : liste dautorisation facultative pour les Skills inclus uniquement (les Skills gérées/de lespace de travail ne sont pas affectées).
- `load.extraDirs` : racines de Skills partagées supplémentaires (priorité la plus basse).
- `install.preferBrew` : lorsquil vaut true, privilégie les installateurs Homebrew lorsque `brew` est
disponible avant de revenir aux autres types dinstallateurs.
- `install.nodeManager` : préférence dinstallateur node pour les spécifications `metadata.openclaw.install`
- `allowBundled` : liste dautorisation facultative pour les Skills groupées uniquement (Skills gérées/de lespace de travail non affectées).
- `load.extraDirs` : racines de Skills partagées supplémentaires (priorité la plus faible).
- `install.preferBrew` : lorsque vrai, privilégie les installateurs Homebrew lorsque `brew` est
disponible avant de revenir à dautres types dinstallateurs.
- `install.nodeManager` : préférence dinstallateur Node pour les spécifications `metadata.openclaw.install`
(`npm` | `pnpm` | `yarn` | `bun`).
- `entries.<skillKey>.enabled: false` désactive une Skill même si elle est incluse/installée.
- `entries.<skillKey>.apiKey` : raccourci pour les Skills déclarant une variable denvironnement principale (chaîne en clair ou objet SecretRef).
- `entries.<skillKey>.enabled: false` désactive une Skill même si elle est groupée/installée.
- `entries.<skillKey>.apiKey` : commodité pour les Skills déclarant une variable denvironnement principale (chaîne en texte clair ou objet SecretRef).
---
@ -192,44 +192,44 @@ Consultez [MCP](/fr/cli/mcp#openclaw-as-an-mcp-client-registry) et
```
- Chargés depuis `~/.openclaw/extensions`, `<workspace>/.openclaw/extensions`, plus `plugins.load.paths`.
- La découverte accepte les plugins OpenClaw natifs ainsi que les bundles Codex compatibles et les bundles Claude, y compris les bundles Claude sans manifeste à disposition par défaut.
- **Les changements de configuration nécessitent un redémarrage du gateway.**
- `allow` : liste dautorisation facultative (seuls les plugins listés se chargent). `deny` prévaut.
- La découverte accepte les Plugins OpenClaw natifs ainsi que les bundles Codex compatibles et les bundles Claude, y compris les bundles Claude de disposition par défaut sans manifeste.
- **Les modifications de configuration nécessitent un redémarrage du Gateway.**
- `allow` : liste dautorisation facultative (seuls les Plugins listés se chargent). `deny` lemporte.
- `bundledDiscovery` : vaut par défaut `"allowlist"` pour les nouvelles configurations, de sorte quun
`plugins.allow` non vide filtre aussi les plugins fournisseurs inclus, y compris les fournisseurs dexécution
`plugins.allow` non vide filtre aussi les Plugins de fournisseurs groupés, y compris les fournisseurs dexécution
de recherche web. Doctor écrit `"compat"` pour les configurations de liste dautorisation héritées migrées
afin de préserver le comportement existant des fournisseurs inclus jusquà votre activation explicite.
- `plugins.entries.<id>.apiKey` : champ pratique de clé API au niveau du plugin (lorsquil est pris en charge par le plugin).
- `plugins.entries.<id>.env` : carte de variables denvironnement limitée au plugin.
- `plugins.entries.<id>.hooks.allowPromptInjection` : lorsquil vaut `false`, le cœur bloque `before_prompt_build` et ignore les champs modifiant le prompt issus de lancien `before_agent_start`, tout en préservant les anciens `modelOverride` et `providerOverride`. Sapplique aux hooks de plugins natifs et aux répertoires de hooks fournis par des bundles pris en charge.
- `plugins.entries.<id>.hooks.allowConversationAccess` : lorsquil vaut `true`, les plugins non inclus approuvés peuvent lire le contenu brut des conversations depuis des hooks typés comme `llm_input`, `llm_output`, `before_agent_finalize` et `agent_end`.
- `plugins.entries.<id>.subagent.allowModelOverride` : approuve explicitement ce plugin pour demander des remplacements `provider` et `model` par exécution pour les exécutions de sous-agents en arrière-plan.
- `plugins.entries.<id>.subagent.allowedModels` : liste dautorisation facultative de cibles canoniques `provider/model` pour les remplacements de sous-agents approuvés. Utilisez `"*"` uniquement lorsque vous voulez intentionnellement autoriser nimporte quel modèle.
- `plugins.entries.<id>.config` : objet de configuration défini par le plugin (validé par le schéma du plugin OpenClaw natif lorsquil est disponible).
- Les paramètres de compte/dexécution des plugins de canal se trouvent sous `channels.<id>` et doivent être décrits par les métadonnées `channelConfigs` du manifeste du plugin propriétaire, et non par un registre central doptions OpenClaw.
afin de préserver le comportement existant des fournisseurs groupés jusquà votre adhésion.
- `plugins.entries.<id>.apiKey` : champ pratique de clé API au niveau du Plugin (lorsque pris en charge par le Plugin).
- `plugins.entries.<id>.env` : carte de variables denvironnement limitée au Plugin.
- `plugins.entries.<id>.hooks.allowPromptInjection` : lorsque `false`, le cœur bloque `before_prompt_build` et ignore les champs qui modifient le prompt issus de lancien `before_agent_start`, tout en préservant les anciens `modelOverride` et `providerOverride`. Sapplique aux hooks de Plugins natifs et aux répertoires de hooks fournis par bundle pris en charge.
- `plugins.entries.<id>.hooks.allowConversationAccess` : lorsque `true`, les Plugins non groupés de confiance peuvent lire le contenu brut des conversations depuis des hooks typés tels que `llm_input`, `llm_output`, `before_agent_finalize` et `agent_end`.
- `plugins.entries.<id>.subagent.allowModelOverride` : faire explicitement confiance à ce Plugin pour demander des substitutions `provider` et `model` par exécution pour les exécutions de sous-agents en arrière-plan.
- `plugins.entries.<id>.subagent.allowedModels` : liste dautorisation facultative de cibles canoniques `provider/model` pour les substitutions de sous-agents de confiance. Utilisez `"*"` uniquement lorsque vous voulez intentionnellement autoriser nimporte quel modèle.
- `plugins.entries.<id>.config` : objet de configuration défini par le Plugin (validé par le schéma de Plugin OpenClaw natif lorsquil est disponible).
- Les paramètres de compte/dexécution des Plugins de canal se trouvent sous `channels.<id>` et doivent être décrits par les métadonnées `channelConfigs` du manifeste du Plugin propriétaire, et non par un registre central doptions OpenClaw.
- `plugins.entries.firecrawl.config.webFetch` : paramètres du fournisseur de récupération web Firecrawl.
- `apiKey` : clé API Firecrawl (accepte SecretRef). Se rabat sur `plugins.entries.firecrawl.config.webSearch.apiKey`, lancien `tools.web.fetch.firecrawl.apiKey` ou la variable denvironnement `FIRECRAWL_API_KEY`.
- `baseUrl` : URL de base de lAPI Firecrawl (par défaut : `https://api.firecrawl.dev` ; les remplacements auto-hébergés doivent cibler des points de terminaison privés/internes).
- `onlyMainContent` : extrait uniquement le contenu principal des pages (par défaut : `true`).
- `baseUrl` : URL de base de lAPI Firecrawl (par défaut : `https://api.firecrawl.dev` ; les substitutions auto-hébergées doivent cibler des points de terminaison privés/internes).
- `onlyMainContent` : extraire uniquement le contenu principal des pages (par défaut : `true`).
- `maxAgeMs` : âge maximal du cache en millisecondes (par défaut : `172800000` / 2 jours).
- `timeoutSeconds` : délai dexpiration de la requête de scraping en secondes (par défaut : `60`).
- `timeoutSeconds` : délai dexpiration des requêtes de scraping en secondes (par défaut : `60`).
- `plugins.entries.xai.config.xSearch` : paramètres xAI X Search (recherche web Grok).
- `enabled` : active le fournisseur X Search.
- `enabled` : activer le fournisseur X Search.
- `model` : modèle Grok à utiliser pour la recherche (par ex. `"grok-4-1-fast"`).
- `plugins.entries.memory-core.config.dreaming` : paramètres de Dreaming mémoire. Consultez [Dreaming](/fr/concepts/dreaming) pour les phases et les seuils.
- `enabled` : interrupteur principal de Dreaming (par défaut `false`).
- `frequency` : cadence Cron pour chaque balayage complet de Dreaming (`"0 3 * * *"` par défaut).
- `model` : remplacement facultatif du modèle de sous-agent Dream Diary. Nécessite `plugins.entries.memory-core.subagent.allowModelOverride: true` ; associez-le à `allowedModels` pour restreindre les cibles. Les erreurs de modèle indisponible réessaient une fois avec le modèle par défaut de la session ; les échecs de confiance ou de liste dautorisation ne se rabattent pas silencieusement.
- la politique des phases et les seuils sont des détails dimplémentation (pas des clés de configuration exposées à lutilisateur).
- `plugins.entries.memory-core.config.dreaming` : paramètres de Dreaming de la mémoire. Consultez [Dreaming](/fr/concepts/dreaming) pour les phases et les seuils.
- `enabled` : commutateur maître Dreaming (par défaut `false`).
- `frequency` : cadence Cron pour chaque balayage Dreaming complet (`"0 3 * * *"` par défaut).
- `model` : substitution facultative du modèle de sous-agent Dream Diary. Nécessite `plugins.entries.memory-core.subagent.allowModelOverride: true` ; associez-le à `allowedModels` pour restreindre les cibles. Les erreurs de modèle indisponible réessaient une fois avec le modèle par défaut de la session ; les échecs de confiance ou de liste dautorisation ne se rabattent pas silencieusement.
- la politique des phases et les seuils sont des détails dimplémentation (pas des clés de configuration destinées aux utilisateurs).
- La configuration complète de la mémoire se trouve dans [Référence de configuration de la mémoire](/fr/reference/memory-config) :
- `agents.defaults.memorySearch.*`
- `memory.backend`
- `memory.citations`
- `memory.qmd.*`
- `plugins.entries.memory-core.config.dreaming`
- Les plugins de bundle Claude activés peuvent aussi contribuer des valeurs par défaut Pi intégrées depuis `settings.json` ; OpenClaw les applique comme paramètres dagent assainis, pas comme correctifs bruts de configuration OpenClaw.
- `plugins.slots.memory` : choisit lidentifiant du plugin de mémoire actif, ou `"none"` pour désactiver les plugins de mémoire.
- `plugins.slots.contextEngine` : choisit lidentifiant du plugin de moteur de contexte actif ; vaut par défaut `"legacy"` sauf si vous installez et sélectionnez un autre moteur.
- Les Plugins de bundle Claude activés peuvent aussi contribuer des valeurs par défaut Pi intégrées depuis `settings.json` ; OpenClaw les applique comme paramètres dagent assainis, et non comme correctifs bruts de configuration OpenClaw.
- `plugins.slots.memory` : choisir lidentifiant du Plugin de mémoire actif, ou `"none"` pour désactiver les Plugins de mémoire.
- `plugins.slots.contextEngine` : choisir lidentifiant du Plugin de moteur de contexte actif ; vaut par défaut `"legacy"` sauf si vous installez et sélectionnez un autre moteur.
Consultez [Plugins](/fr/tools/plugin).
@ -237,9 +237,9 @@ Consultez [Plugins](/fr/tools/plugin).
## Engagements
`commitments` contrôle la mémoire de suivi inférée : OpenClaw peut détecter les points de suivi à partir des tours de conversation et les livrer via les exécutions Heartbeat.
`commitments` contrôle la mémoire de suivi inférée : OpenClaw peut détecter des points de suivi depuis les tours de conversation et les livrer via des exécutions Heartbeat.
- `commitments.enabled` : active lextraction LLM masquée, le stockage et la livraison par Heartbeat des engagements de suivi inférés. Par défaut : `false`.
- `commitments.enabled` : activer lextraction LLM masquée, le stockage et la livraison Heartbeat des engagements de suivi inférés. Par défaut : `false`.
- `commitments.maxPerDay` : nombre maximal dengagements de suivi inférés livrés par session dagent sur une journée glissante. Par défaut : `3`.
Consultez [Engagements inférés](/fr/concepts/commitments).
@ -293,49 +293,47 @@ Consultez [Engagements inférés](/fr/concepts/commitments).
```
- `evaluateEnabled: false` désactive `act:evaluate` et `wait --fn`.
- `tabCleanup` récupère les onglets suivis de lagent principal après le délai dinactivité ou lorsquune
session dépasse son plafond. Définissez `idleMinutes: 0` ou `maxTabsPerSession: 0` pour
désactiver ces modes de nettoyage individuels.
- `ssrfPolicy.dangerouslyAllowPrivateNetwork` est désactivé lorsquil nest pas défini ; la navigation du navigateur reste donc stricte par défaut.
- `tabCleanup` récupère les onglets suivis de lagent principal après une période dinactivité ou lorsquune session dépasse sa limite. Définissez `idleMinutes: 0` ou `maxTabsPerSession: 0` pour désactiver ces modes de nettoyage individuellement.
- `ssrfPolicy.dangerouslyAllowPrivateNetwork` est désactivé lorsquil nest pas défini, de sorte que la navigation du navigateur reste stricte par défaut.
- Définissez `ssrfPolicy.dangerouslyAllowPrivateNetwork: true` uniquement lorsque vous faites intentionnellement confiance à la navigation du navigateur sur le réseau privé.
- En mode strict, les points de terminaison des profils CDP distants (`profiles.*.cdpUrl`) sont soumis au même blocage des réseaux privés pendant les contrôles daccessibilité/découverte.
- En mode strict, les points de terminaison des profils CDP distants (`profiles.*.cdpUrl`) sont soumis au même blocage du réseau privé lors des contrôles daccessibilité/de découverte.
- `ssrfPolicy.allowPrivateNetwork` reste pris en charge comme alias hérité.
- En mode strict, utilisez `ssrfPolicy.hostnameAllowlist` et `ssrfPolicy.allowedHostnames` pour les exceptions explicites.
- Les profils distants sont en attachement uniquement (démarrage/arrêt/réinitialisation désactivés).
- Les profils distants sont uniquement en attachement (démarrage/arrêt/réinitialisation désactivés).
- `profiles.*.cdpUrl` accepte `http://`, `https://`, `ws://` et `wss://`.
Utilisez HTTP(S) lorsque vous voulez quOpenClaw découvre `/json/version` ; utilisez WS(S)
Utilisez HTTP(S) lorsque vous voulez quOpenClaw découvre `/json/version`; utilisez WS(S)
lorsque votre fournisseur vous donne une URL WebSocket DevTools directe.
- `remoteCdpTimeoutMs` et `remoteCdpHandshakeTimeoutMs` sappliquent à laccessibilité CDP distante et
`attachOnly`, ainsi quaux requêtes douverture donglets. Les profils gérés en loopback
conservent les valeurs CDP locales par défaut.
`attachOnly`, ainsi quaux demandes douverture donglets. Les profils local loopback
gérés conservent les valeurs CDP locales par défaut.
- Si un service CDP géré en externe est accessible via loopback, définissez
`attachOnly: true` pour ce profil ; sinon OpenClaw traite le port loopback comme un
profil de navigateur local géré et peut signaler des erreurs de propriété de port local.
`attachOnly: true` pour ce profil ; sinon, OpenClaw traite le port loopback comme un
profil de navigateur géré localement et peut signaler des erreurs de propriété de port local.
- Les profils `existing-session` utilisent Chrome MCP au lieu de CDP et peuvent sattacher sur
lhôte sélectionné ou via un nœud de navigateur connecté.
- Les profils `existing-session` peuvent définir `userDataDir` pour cibler un profil de navigateur
basé sur Chromium spécifique, comme Brave ou Edge.
- Les profils `existing-session` peuvent définir `userDataDir` pour cibler un profil
de navigateur basé sur Chromium spécifique, comme Brave ou Edge.
- Les profils `existing-session` conservent les limites de routage Chrome MCP actuelles :
actions pilotées par instantané/référence au lieu du ciblage par sélecteur CSS, hooks de téléversement
dun fichier, aucune substitution de délai dexpiration des boîtes de dialogue, pas de
`wait --load networkidle`, et pas de `responsebody`, dexport PDF, dinterception des téléchargements ni dactions par lot.
- Les profils `openclaw` gérés localement attribuent automatiquement `cdpPort` et `cdpUrl` ; ne
définissez explicitement `cdpUrl` que pour le CDP distant.
actions pilotées par instantané/référence au lieu du ciblage par sélecteur CSS, hooks
denvoi dun seul fichier, aucune surcharge des délais dexpiration de dialogue, pas de
`wait --load networkidle`, et pas de `responsebody`, dexport PDF, dinterception des téléchargements ni dactions par lots.
- Les profils `openclaw` gérés localement attribuent automatiquement `cdpPort` et `cdpUrl` ; définissez
`cdpUrl` explicitement uniquement pour le CDP distant.
- Les profils gérés localement peuvent définir `executablePath` pour remplacer le
`browser.executablePath` global pour ce profil. Utilisez-le pour exécuter un profil dans
`browser.executablePath` global pour ce profil. Utilisez cela pour exécuter un profil dans
Chrome et un autre dans Brave.
- Les profils gérés localement utilisent `browser.localLaunchTimeoutMs` pour la découverte HTTP Chrome CDP
après le démarrage du processus et `browser.localCdpReadyTimeoutMs` pour
létat prêt du websocket CDP après le lancement. Augmentez-les sur les hôtes plus lents où Chrome
démarre correctement mais où les contrôles de disponibilité entrent en concurrence avec le démarrage. Les deux valeurs doivent être
des entiers positifs jusquà `120000` ms ; les valeurs de configuration invalides sont rejetées.
- Les profils gérés localement utilisent `browser.localLaunchTimeoutMs` pour la découverte HTTP CDP de Chrome
après le démarrage du processus et `browser.localCdpReadyTimeoutMs` pour la disponibilité
WebSocket CDP après le lancement. Augmentez ces valeurs sur les hôtes plus lents où Chrome
démarre correctement, mais où les contrôles de disponibilité devancent le démarrage. Les deux valeurs doivent être
des entiers positifs jusquà `120000` ms ; les valeurs de configuration non valides sont rejetées.
- Ordre de détection automatique : navigateur par défaut sil est basé sur Chromium → Chrome → Brave → Edge → Chromium → Chrome Canary.
- `browser.executablePath` et `browser.profiles.<name>.executablePath` acceptent tous deux
`~` et `~/...` pour le répertoire personnel de votre OS avant le lancement de Chromium.
`userDataDir` par profil sur les profils `existing-session` fait aussi lobjet dune expansion du tilde.
`~` et `~/...` pour le répertoire personnel de votre système dexploitation avant le lancement de Chromium.
`userDataDir` par profil sur les profils `existing-session` est également développé à partir du tilde.
- Service de contrôle : loopback uniquement (port dérivé de `gateway.port`, valeur par défaut `18791`).
- `extraArgs` ajoute des indicateurs de lancement supplémentaires au démarrage local de Chromium (par exemple
`--disable-gpu`, le dimensionnement de fenêtre ou les indicateurs de débogage).
`--disable-gpu`, le dimensionnement de fenêtre ou des indicateurs de débogage).
---
@ -353,8 +351,8 @@ Consultez [Engagements inférés](/fr/concepts/commitments).
}
```
- `seamColor` : couleur daccentuation pour le chrome de linterface utilisateur de lapplication native (teinte de la bulle du mode Talk, etc.).
- `assistant` : remplacement de lidentité de Control UI. Se rabat sur lidentité de lagent actif.
- `seamColor` : couleur daccentuation pour le chrome de linterface utilisateur de lapplication native (teinte de bulle du mode Conversation, etc.).
- `assistant` : remplacement de lidentité de linterface de contrôle. Reprend lidentité de lagent actif par défaut.
---
@ -432,54 +430,54 @@ Consultez [Engagements inférés](/fr/concepts/commitments).
<Accordion title="Gateway field details">
- `mode` : `local` (lancer le Gateway) ou `remote` (se connecter au Gateway distant). Le Gateway refuse de démarrer sauf si la valeur est `local`.
- `mode` : `local` (exécuter le Gateway) ou `remote` (se connecter au Gateway distant). Le Gateway refuse de démarrer sauf si la valeur est `local`.
- `port` : port multiplexé unique pour WS + HTTP. Priorité : `--port` > `OPENCLAW_GATEWAY_PORT` > `gateway.port` > `18789`.
- `bind` : `auto`, `loopback` (par défaut), `lan` (`0.0.0.0`), `tailnet` (IP Tailscale uniquement), ou `custom`.
- **Alias bind hérités** : utilisez les valeurs de mode bind dans `gateway.bind` (`auto`, `loopback`, `lan`, `tailnet`, `custom`), pas les alias dhôte (`0.0.0.0`, `127.0.0.1`, `localhost`, `::`, `::1`).
- **Note Docker** : le bind `loopback` par défaut écoute sur `127.0.0.1` à lintérieur du conteneur. Avec le réseau bridge Docker (`-p 18789:18789`), le trafic arrive sur `eth0`, donc le Gateway est inaccessible. Utilisez `--network host`, ou définissez `bind: "lan"` (ou `bind: "custom"` avec `customBindHost: "0.0.0.0"`) pour écouter sur toutes les interfaces.
- **Auth** : requise par défaut. Les binds non-loopback exigent lauthentification du Gateway. En pratique, cela signifie un jeton/mot de passe partagé ou un proxy inverse sensible à lidentité avec `gateway.auth.mode: "trusted-proxy"`. Lassistant donboarding génère un jeton par défaut.
- Si `gateway.auth.token` et `gateway.auth.password` sont tous deux configurés (y compris via SecretRefs), définissez explicitement `gateway.auth.mode` sur `token` ou `password`. Les flux de démarrage et dinstallation/réparation du service échouent lorsque les deux sont configurés et que le mode nest pas défini.
- `gateway.auth.mode: "none"` : mode explicite sans auth. À utiliser uniquement pour les configurations local loopback de confiance ; ce mode nest intentionnellement pas proposé par les invites donboarding.
- `gateway.auth.mode: "trusted-proxy"` : délègue lauthentification navigateur/utilisateur à un proxy inverse sensible à lidentité et fait confiance aux en-têtes didentité provenant de `gateway.trustedProxies` (voir [Auth par proxy de confiance](/fr/gateway/trusted-proxy-auth)). Ce mode attend par défaut une source de proxy **non-loopback** ; les proxys inverses loopback sur le même hôte nécessitent `gateway.auth.trustedProxy.allowLoopback = true` explicite. Les appelants internes sur le même hôte peuvent utiliser `gateway.auth.password` comme solution de repli directe locale ; `gateway.auth.token` reste mutuellement exclusif avec le mode trusted-proxy.
- `gateway.auth.allowTailscale` : lorsque `true`, les en-têtes didentité Tailscale Serve peuvent satisfaire lauthentification de la Control UI/WebSocket (vérifiée via `tailscale whois`). Les points de terminaison de lAPI HTTP nutilisent **pas** cette authentification par en-tête Tailscale ; ils suivent plutôt le mode dauthentification HTTP normal du Gateway. Ce flux sans jeton suppose que lhôte du Gateway est fiable. La valeur par défaut est `true` lorsque `tailscale.mode = "serve"`.
- `gateway.auth.rateLimit` : limiteur optionnel des échecs dauthentification. Sapplique par IP client et par périmètre dauthentification (shared-secret et device-token sont suivis indépendamment). Les tentatives bloquées renvoient `429` + `Retry-After`.
- Sur le chemin asynchrone Tailscale Serve Control UI, les tentatives échouées pour le même `{scope, clientIp}` sont sérialisées avant lécriture de léchec. Des tentatives incorrectes concurrentes depuis le même client peuvent donc déclencher le limiteur dès la deuxième requête au lieu de toutes passer simultanément comme de simples non-correspondances.
- `gateway.auth.rateLimit.exemptLoopback` vaut `true` par défaut ; définissez `false` lorsque vous voulez intentionnellement limiter aussi le trafic localhost (pour des configurations de test ou des déploiements de proxy stricts).
- Les tentatives dauth WS provenant dune origine navigateur sont toujours limitées, avec lexemption loopback désactivée (défense en profondeur contre la force brute localhost depuis le navigateur).
- Sur loopback, ces verrouillages provenant dune origine navigateur sont isolés par valeur
`Origin` normalisée, de sorte que les échecs répétés depuis une origine localhost ne verrouillent pas automatiquement
une autre origine.
- `tailscale.mode` : `serve` (tailnet uniquement, bind loopback) ou `funnel` (public, nécessite une auth).
- `controlUi.allowedOrigins` : liste dautorisation explicite des origines navigateur pour les connexions WebSocket au Gateway. Requise lorsque des clients navigateur sont attendus depuis des origines non-loopback.
- `controlUi.chatMessageMaxWidth` : largeur maximale optionnelle pour les messages de chat groupés de la Control UI. Accepte des valeurs de largeur CSS contraintes telles que `960px`, `82%`, `min(1280px, 82%)` et `calc(100% - 2rem)`.
- `controlUi.dangerouslyAllowHostHeaderOriginFallback` : mode dangereux qui active la solution de repli dorigine basée sur len-tête Host pour les déploiements qui sappuient intentionnellement sur une politique dorigine fondée sur len-tête Host.
- `bind` : `auto`, `loopback` (par défaut), `lan` (`0.0.0.0`), `tailnet` (IP Tailscale uniquement) ou `custom`.
- **Alias bind hérités** : utilisez les valeurs du mode bind dans `gateway.bind` (`auto`, `loopback`, `lan`, `tailnet`, `custom`), pas les alias dhôte (`0.0.0.0`, `127.0.0.1`, `localhost`, `::`, `::1`).
- **Note Docker** : le bind `loopback` par défaut écoute sur `127.0.0.1` à lintérieur du conteneur. Avec le réseau bridge de Docker (`-p 18789:18789`), le trafic arrive sur `eth0`, donc le Gateway est inaccessible. Utilisez `--network host`, ou définissez `bind: "lan"` (ou `bind: "custom"` avec `customBindHost: "0.0.0.0"`) pour écouter sur toutes les interfaces.
- **Auth** : requise par défaut. Les binds hors loopback nécessitent lauthentification du Gateway. En pratique, cela signifie un jeton/mot de passe partagé ou un reverse proxy sensible à lidentité avec `gateway.auth.mode: "trusted-proxy"`. Lassistant donboarding génère un jeton par défaut.
- Si `gateway.auth.token` et `gateway.auth.password` sont tous deux configurés (y compris avec SecretRefs), définissez explicitement `gateway.auth.mode` sur `token` ou `password`. Les flux de démarrage et dinstallation/réparation du service échouent lorsque les deux sont configurés et que le mode nest pas défini.
- `gateway.auth.mode: "none"` : mode explicite sans auth. À utiliser uniquement pour les configurations local loopback de confiance ; il nest volontairement pas proposé par les invites donboarding.
- `gateway.auth.mode: "trusted-proxy"` : déléguez lauth navigateur/utilisateur à un reverse proxy sensible à lidentité et faites confiance aux en-têtes didentité provenant de `gateway.trustedProxies` (voir [Auth par proxy de confiance](/fr/gateway/trusted-proxy-auth)). Ce mode attend par défaut une source de proxy **hors loopback** ; les reverse proxies loopback sur le même hôte nécessitent `gateway.auth.trustedProxy.allowLoopback = true` explicite. Les appelants internes sur le même hôte peuvent utiliser `gateway.auth.password` comme repli direct local ; `gateway.auth.token` reste mutuellement exclusif avec le mode trusted-proxy.
- `gateway.auth.allowTailscale` : lorsque `true`, les en-têtes didentité Tailscale Serve peuvent satisfaire lauth de Control UI/WebSocket (vérifiée via `tailscale whois`). Les points de terminaison de lAPI HTTP nutilisent **pas** cette auth par en-tête Tailscale ; ils suivent à la place le mode dauth HTTP normal du Gateway. Ce flux sans jeton suppose que lhôte du Gateway est fiable. Par défaut à `true` lorsque `tailscale.mode = "serve"`.
- `gateway.auth.rateLimit` : limiteur facultatif des échecs dauth. Sapplique par IP client et par portée dauth (shared-secret et device-token sont suivis indépendamment). Les tentatives bloquées renvoient `429` + `Retry-After`.
- Sur le chemin async Control UI Tailscale Serve, les tentatives échouées pour le même `{scope, clientIp}` sont sérialisées avant lécriture de léchec. Des tentatives incorrectes simultanées depuis le même client peuvent donc déclencher le limiteur dès la deuxième requête au lieu de passer toutes deux comme de simples incompatibilités.
- `gateway.auth.rateLimit.exemptLoopback` vaut `true` par défaut ; définissez `false` lorsque vous voulez intentionnellement limiter aussi le trafic localhost (pour des configurations de test ou des déploiements proxy stricts).
- Les tentatives dauth WS dorigine navigateur sont toujours limitées avec lexemption loopback désactivée (défense en profondeur contre la force brute localhost depuis le navigateur).
- Sur loopback, ces blocages dorigine navigateur sont isolés par valeur `Origin`
normalisée, de sorte que des échecs répétés depuis une origine localhost ne verrouillent pas automatiquement
une origine différente.
- `tailscale.mode` : `serve` (tailnet uniquement, bind loopback) ou `funnel` (public, nécessite auth).
- `controlUi.allowedOrigins` : liste dautorisation explicite des origines navigateur pour les connexions WebSocket au Gateway. Requis lorsque des clients navigateur sont attendus depuis des origines hors loopback.
- `controlUi.chatMessageMaxWidth` : largeur maximale facultative pour les messages de chat Control UI groupés. Accepte des valeurs de largeur CSS contraintes comme `960px`, `82%`, `min(1280px, 82%)` et `calc(100% - 2rem)`.
- `controlUi.dangerouslyAllowHostHeaderOriginFallback` : mode dangereux qui active le repli dorigine par en-tête Host pour les déploiements qui sappuient intentionnellement sur une politique dorigine fondée sur len-tête Host.
- `remote.transport` : `ssh` (par défaut) ou `direct` (ws/wss). Pour `direct`, `remote.url` doit être `ws://` ou `wss://`.
- `OPENCLAW_ALLOW_INSECURE_PRIVATE_WS=1` : dérogation durgence côté client via lenvironnement de processus
qui autorise `ws://` en clair vers des IPs de réseau privé de confiance ;
la valeur par défaut reste loopback-only pour le texte en clair. Il nexiste pas déquivalent
`openclaw.json`, et la configuration de réseau privé navigateur telle que
- `OPENCLAW_ALLOW_INSECURE_PRIVATE_WS=1` : échappatoire côté client dans lenvironnement du processus
qui autorise le `ws://` en texte clair vers des IPs de réseau privé
de confiance ; la valeur par défaut reste limitée au loopback pour le texte clair. Il nexiste pas déquivalent dans `openclaw.json`,
et la configuration de réseau privé du navigateur comme
`browser.ssrfPolicy.dangerouslyAllowPrivateNetwork` naffecte pas les clients WebSocket
du Gateway.
- `gateway.remote.token` / `.password` sont des champs didentifiants du client distant. Ils ne configurent pas lauthentification du Gateway à eux seuls.
- `gateway.push.apns.relay.baseUrl` : URL HTTPS de base du relais APNs externe utilisé par les builds iOS officiels/TestFlight après quils publient des enregistrements adossés au relais vers le Gateway. Cette URL doit correspondre à lURL de relais compilée dans le build iOS.
- `gateway.push.apns.relay.timeoutMs` : délai dexpiration denvoi Gateway-vers-relais en millisecondes. Valeur par défaut : `10000`.
- Les enregistrements adossés au relais sont délégués à une identité de Gateway spécifique. Lapp iOS appairée récupère `gateway.identity.get`, inclut cette identité dans lenregistrement de relais et transmet au Gateway une autorisation denvoi limitée à lenregistrement. Un autre Gateway ne peut pas réutiliser cet enregistrement stocké.
- `OPENCLAW_APNS_RELAY_BASE_URL` / `OPENCLAW_APNS_RELAY_TIMEOUT_MS` : remplacements env temporaires pour la configuration de relais ci-dessus.
- `gateway.remote.token` / `.password` sont des champs didentifiants client distant. Ils ne configurent pas lauth du Gateway à eux seuls.
- `gateway.push.apns.relay.baseUrl` : URL HTTPS de base du relais APNs externe utilisé par les builds iOS officiels/TestFlight après publication des enregistrements adossés au relais vers le Gateway. Cette URL doit correspondre à lURL du relais compilée dans le build iOS.
- `gateway.push.apns.relay.timeoutMs` : délai dexpiration denvoi Gateway-vers-relais en millisecondes. Par défaut à `10000`.
- Les enregistrements adossés au relais sont délégués à une identité Gateway spécifique. Lapp iOS appairée récupère `gateway.identity.get`, inclut cette identité dans lenregistrement du relais et transmet au Gateway une autorisation denvoi limitée à lenregistrement. Un autre Gateway ne peut pas réutiliser cet enregistrement stocké.
- `OPENCLAW_APNS_RELAY_BASE_URL` / `OPENCLAW_APNS_RELAY_TIMEOUT_MS` : surcharges temporaires denv pour la configuration du relais ci-dessus.
- `OPENCLAW_APNS_RELAY_ALLOW_HTTP=true` : échappatoire réservée au développement pour les URL de relais HTTP loopback. Les URL de relais de production doivent rester en HTTPS.
- `gateway.handshakeTimeoutMs` : délai dexpiration de la négociation WebSocket pré-auth du Gateway en millisecondes. Par défaut : `15000`. `OPENCLAW_HANDSHAKE_TIMEOUT_MS` est prioritaire lorsquil est défini. Augmentez cette valeur sur les hôtes chargés ou peu puissants où les clients locaux peuvent se connecter alors que le préchauffage du démarrage est encore en cours de stabilisation.
- `gateway.handshakeTimeoutMs` : délai dexpiration de la négociation WebSocket pré-auth du Gateway, en millisecondes. Par défaut : `15000`. `OPENCLAW_HANDSHAKE_TIMEOUT_MS` est prioritaire lorsquil est défini. Augmentez cette valeur sur des hôtes chargés ou peu puissants lorsque les clients locaux peuvent se connecter alors que le préchauffage du démarrage est encore en cours.
- `gateway.channelHealthCheckMinutes` : intervalle du moniteur de santé des canaux en minutes. Définissez `0` pour désactiver globalement les redémarrages du moniteur de santé. Par défaut : `5`.
- `gateway.channelStaleEventThresholdMinutes` : seuil de socket obsolète en minutes. Gardez cette valeur supérieure ou égale à `gateway.channelHealthCheckMinutes`. Par défaut : `30`.
- `gateway.channelMaxRestartsPerHour` : nombre maximal de redémarrages du moniteur de santé par canal/compte sur une heure glissante. Par défaut : `10`.
- `channels.<provider>.healthMonitor.enabled` : désactivation par canal des redémarrages du moniteur de santé tout en gardant le moniteur global activé.
- `channels.<provider>.accounts.<accountId>.healthMonitor.enabled` : remplacement par compte pour les canaux multi-comptes. Lorsquil est défini, il est prioritaire sur le remplacement au niveau du canal.
- Les chemins dappel du Gateway local peuvent utiliser `gateway.remote.*` comme solution de repli uniquement lorsque `gateway.auth.*` nest pas défini.
- Si `gateway.auth.token` / `gateway.auth.password` est explicitement configuré via SecretRef et non résolu, la résolution échoue en mode fermé (aucune solution de repli distante ne masque léchec).
- `trustedProxies` : IPs de proxy inverse qui terminent TLS ou injectent des en-têtes de client transféré. Ne listez que les proxys que vous contrôlez. Les entrées loopback restent valides pour les configurations de proxy/détection locale sur le même hôte (par exemple Tailscale Serve ou un proxy inverse local), mais elles ne rendent **pas** les requêtes loopback éligibles à `gateway.auth.mode: "trusted-proxy"`.
- `allowRealIpFallback` : lorsque `true`, le Gateway accepte `X-Real-IP` si `X-Forwarded-For` est absent. Valeur par défaut `false` pour un comportement fail-closed.
- `gateway.nodes.pairing.autoApproveCidrs` : liste dautorisation CIDR/IP optionnelle pour approuver automatiquement le premier appairage dappareil de nœud sans périmètres demandés. Elle est désactivée lorsquelle nest pas définie. Cela napprouve pas automatiquement lappairage opérateur/navigateur/Control UI/WebChat, ni les mises à niveau de rôle, de périmètre, de métadonnées ou de clé publique.
- `gateway.nodes.allowCommands` / `gateway.nodes.denyCommands` : façonnage global allow/deny pour les commandes de nœud déclarées après lappairage et lévaluation de la liste dautorisation de plateforme. Utilisez `allowCommands` pour activer explicitement des commandes de nœud dangereuses telles que `camera.snap`, `camera.clip` et `screen.record` ; `denyCommands` supprime une commande même si une valeur par défaut de plateforme ou une autorisation explicite linclurait autrement. Après quun nœud a modifié sa liste de commandes déclarées, rejetez puis réapprouvez cet appairage dappareil afin que le Gateway stocke linstantané de commandes mis à jour.
- `gateway.channelMaxRestartsPerHour` : nombre maximal de redémarrages par moniteur de santé, par canal/compte, sur une heure glissante. Par défaut : `10`.
- `channels.<provider>.healthMonitor.enabled` : désactivation par canal des redémarrages du moniteur de santé tout en conservant le moniteur global activé.
- `channels.<provider>.accounts.<accountId>.healthMonitor.enabled` : surcharge par compte pour les canaux multi-comptes. Lorsquelle est définie, elle prend le pas sur la surcharge au niveau du canal.
- Les chemins dappel Gateway locaux peuvent utiliser `gateway.remote.*` comme repli uniquement lorsque `gateway.auth.*` nest pas défini.
- Si `gateway.auth.token` / `gateway.auth.password` est explicitement configuré via SecretRef et non résolu, la résolution échoue en fermeture sécurisée (aucun masquage par repli distant).
- `trustedProxies` : IPs de reverse proxy qui terminent TLS ou injectent des en-têtes de client transférés. Ne listez que les proxies que vous contrôlez. Les entrées loopback restent valides pour les configurations proxy/détection locale sur le même hôte (par exemple Tailscale Serve ou un reverse proxy local), mais elles ne rendent **pas** les requêtes loopback éligibles à `gateway.auth.mode: "trusted-proxy"`.
- `allowRealIpFallback` : lorsque `true`, le Gateway accepte `X-Real-IP` si `X-Forwarded-For` est absent. Valeur par défaut `false` pour un comportement fermé en cas déchec.
- `gateway.nodes.pairing.autoApproveCidrs` : liste dautorisation CIDR/IP facultative pour approuver automatiquement le premier appairage dun appareil Node sans portées demandées. Elle est désactivée lorsquelle nest pas définie. Cela napprouve pas automatiquement lappairage opérateur/navigateur/Control UI/WebChat, ni les mises à niveau de rôle, de portée, de métadonnées ou de clé publique.
- `gateway.nodes.allowCommands` / `gateway.nodes.denyCommands` : façonnage global autoriser/refuser pour les commandes Node déclarées après lappairage et lévaluation de la liste dautorisation de plateforme. Utilisez `allowCommands` pour opter pour des commandes Node dangereuses comme `camera.snap`, `camera.clip` et `screen.record` ; `denyCommands` supprime une commande même si une valeur par défaut de plateforme ou une autorisation explicite linclurait autrement. Après quun Node modifie sa liste de commandes déclarées, rejetez puis réapprouvez lappairage de cet appareil afin que le Gateway stocke linstantané de commandes mis à jour.
- `gateway.tools.deny` : noms doutils supplémentaires bloqués pour HTTP `POST /tools/invoke` (étend la liste de refus par défaut).
- `gateway.tools.allow` : supprime des noms doutils de la liste de refus HTTP par défaut.
- `gateway.tools.allow` : retire des noms doutils de la liste de refus HTTP par défaut.
</Accordion>
@ -487,18 +485,18 @@ Consultez [Engagements inférés](/fr/concepts/commitments).
- Chat Completions : désactivé par défaut. Activez avec `gateway.http.endpoints.chatCompletions.enabled: true`.
- Responses API : `gateway.http.endpoints.responses.enabled`.
- Renforcement des entrées URL de Responses :
- Durcissement des entrées URL Responses :
- `gateway.http.endpoints.responses.maxUrlParts`
- `gateway.http.endpoints.responses.files.urlAllowlist`
- `gateway.http.endpoints.responses.images.urlAllowlist`
Les listes dautorisation vides sont traitées comme non définies ; utilisez `gateway.http.endpoints.responses.files.allowUrl=false`
et/ou `gateway.http.endpoints.responses.images.allowUrl=false` pour désactiver la récupération dURL.
- En-tête optionnel de renforcement des réponses :
- En-tête facultatif de durcissement des réponses :
- `gateway.http.securityHeaders.strictTransportSecurity` (à définir uniquement pour les origines HTTPS que vous contrôlez ; voir [Auth par proxy de confiance](/fr/gateway/trusted-proxy-auth#tls-termination-and-hsts))
### Isolation multi-instance
Exécutez plusieurs Gateways sur un même hôte avec des ports et répertoires détat uniques :
Exécutez plusieurs Gateway sur un même hôte avec des ports et répertoires détat uniques :
```bash
OPENCLAW_CONFIG_PATH=~/.openclaw/a.json \
@ -506,9 +504,9 @@ OPENCLAW_STATE_DIR=~/.openclaw-a \
openclaw gateway --port 19001
```
Indicateurs pratiques : `--dev` (utilise `~/.openclaw-dev` + port `19001`), `--profile <name>` (utilise `~/.openclaw-<name>`).
Indicateurs pratiques : `--dev` (utilise `~/.openclaw-dev` + le port `19001`), `--profile <name>` (utilise `~/.openclaw-<name>`).
Voir [Gateways multiples](/fr/gateway/multiple-gateways).
Voir [Plusieurs Gateway](/fr/gateway/multiple-gateways).
### `gateway.tls`
@ -526,11 +524,11 @@ Voir [Gateways multiples](/fr/gateway/multiple-gateways).
}
```
- `enabled` : active la terminaison TLS au niveau de lécouteur du Gateway (HTTPS/WSS) (par défaut : `false`).
- `autoGenerate` : génère automatiquement une paire cert/key locale auto-signée lorsque les fichiers explicites ne sont pas configurés ; à utiliser uniquement en local/dev.
- `enabled` : active la terminaison TLS sur lécouteur du Gateway (HTTPS/WSS) (par défaut : `false`).
- `autoGenerate` : génère automatiquement une paire cert/key locale auto-signée lorsque des fichiers explicites ne sont pas configurés ; réservé à un usage local/dev.
- `certPath` : chemin du système de fichiers vers le fichier de certificat TLS.
- `keyPath` : chemin du système de fichiers vers le fichier de clé privée TLS ; gardez des permissions restreintes.
- `caPath` : chemin optionnel vers le bundle CA pour la vérification client ou les chaînes de confiance personnalisées.
- `keyPath` : chemin du système de fichiers vers le fichier de clé privée TLS ; gardez les permissions restreintes.
- `caPath` : chemin facultatif vers le bundle CA pour la vérification client ou les chaînes de confiance personnalisées.
### `gateway.reload`
@ -546,13 +544,13 @@ Voir [Gateways multiples](/fr/gateway/multiple-gateways).
}
```
- `mode` : contrôle la manière dont les modifications de configuration sont appliquées à lexécution.
- `mode` : contrôle la façon dont les modifications de configuration sont appliquées à lexécution.
- `"off"` : ignore les modifications live ; les changements nécessitent un redémarrage explicite.
- `"restart"` : redémarre toujours le processus Gateway lors dun changement de configuration.
- `"hot"` : applique les changements dans le processus sans redémarrer.
- `"hybrid"` (par défaut) : essaie dabord le rechargement à chaud ; revient au redémarrage si nécessaire.
- `debounceMs` : fenêtre de debounce en ms avant application des changements de configuration (entier non négatif).
- `deferralTimeoutMs` : temps maximal optionnel en ms à attendre pour les opérations en cours avant de forcer un redémarrage. Omettez-le pour utiliser lattente bornée par défaut (`300000`) ; définissez `0` pour attendre indéfiniment et journaliser périodiquement des avertissements indiquant que des opérations sont encore en attente.
- `"hot"` : applique les changements dans le processus sans redémarrage.
- `"hybrid"` (par défaut) : essaie dabord le rechargement à chaud ; se rabat sur un redémarrage si nécessaire.
- `debounceMs` : fenêtre de debounce en ms avant lapplication des changements de configuration (entier non négatif).
- `deferralTimeoutMs` : durée maximale facultative en ms à attendre pour les opérations en cours avant de forcer un redémarrage. Omettez-la pour utiliser lattente bornée par défaut (`300000`) ; définissez `0` pour attendre indéfiniment et journaliser périodiquement des avertissements encore en attente.
---
@ -589,39 +587,39 @@ Voir [Gateways multiples](/fr/gateway/multiple-gateways).
}
```
Auth : `Authorization: Bearer <token>` ou `x-openclaw-token: <token>`.
Authentification : `Authorization: Bearer <token>` ou `x-openclaw-token: <token>`.
Les jetons de hook dans la chaîne de requête sont rejetés.
Notes de validation et de sécurité :
- `hooks.enabled=true` nécessite un `hooks.token` non vide.
- `hooks.token` doit être **distinct** de `gateway.auth.token` ; la réutilisation du jeton du Gateway est rejetée.
- `hooks.path` ne peut pas être `/` ; utilisez un sous-chemin dédié tel que `/hooks`.
- `hooks.path` ne peut pas être `/` ; utilisez un sous-chemin dédié comme `/hooks`.
- Si `hooks.allowRequestSessionKey=true`, limitez `hooks.allowedSessionKeyPrefixes` (par exemple `["hook:"]`).
- Si un mappage ou un préréglage utilise une `sessionKey` basée sur un modèle, définissez `hooks.allowedSessionKeyPrefixes` et `hooks.allowRequestSessionKey=true`. Les clés de mappage statiques ne nécessitent pas cette activation explicite.
- Si un mappage ou un préréglage utilise un `sessionKey` à modèle, définissez `hooks.allowedSessionKeyPrefixes` et `hooks.allowRequestSessionKey=true`. Les clés de mappage statiques ne nécessitent pas cette activation explicite.
**Points de terminaison :**
- `POST /hooks/wake``{ text, mode?: "now"|"next-heartbeat" }`
- `POST /hooks/agent``{ message, name?, agentId?, sessionKey?, wakeMode?, deliver?, channel?, to?, model?, thinking?, timeoutSeconds? }`
- `sessionKey` issue de la charge utile de la requête nest acceptée que lorsque `hooks.allowRequestSessionKey=true` (par défaut : `false`).
- Le `sessionKey` de la charge utile de la requête nest accepté que lorsque `hooks.allowRequestSessionKey=true` (valeur par défaut : `false`).
- `POST /hooks/<name>` → résolu via `hooks.mappings`
- Les valeurs `sessionKey` de mappage rendues par modèle sont traitées comme fournies de lextérieur et nécessitent aussi `hooks.allowRequestSessionKey=true`.
- Les valeurs de `sessionKey` de mappage rendues à partir dun modèle sont traitées comme fournies de lextérieur et nécessitent aussi `hooks.allowRequestSessionKey=true`.
<Accordion title="Mapping details">
- `match.path` correspond au sous-chemin après `/hooks` (par ex. `/hooks/gmail``gmail`).
- `match.path` correspond au sous-chemin après `/hooks` (p. ex. `/hooks/gmail``gmail`).
- `match.source` correspond à un champ de charge utile pour les chemins génériques.
- Les modèles comme `{{messages[0].subject}}` lisent depuis la charge utile.
- `transform` peut pointer vers un module JS/TS qui renvoie une action de hook.
- `transform.module` doit être un chemin relatif et rester dans `hooks.transformsDir` (les chemins absolus et les traversées sont rejetés).
- Gardez `hooks.transformsDir` sous `~/.openclaw/hooks/transforms` ; les répertoires de Skills de lespace de travail sont rejetés. Si `openclaw doctor` signale ce chemin comme invalide, déplacez le module de transformation dans le répertoire des transformations de hooks ou supprimez `hooks.transformsDir`.
- `agentId` achemine vers un agent spécifique ; les identifiants inconnus reviennent à la valeur par défaut.
- `allowedAgentIds` : restreint le routage explicite (`*` ou omis = tout autoriser, `[]` = tout refuser).
- `transform.module` doit être un chemin relatif et rester dans `hooks.transformsDir` (les chemins absolus et la traversée sont rejetés).
- Gardez `hooks.transformsDir` sous `~/.openclaw/hooks/transforms` ; les répertoires Skills de lespace de travail sont rejetés. Si `openclaw doctor` signale ce chemin comme invalide, déplacez le module de transformation dans le répertoire des transformations de hooks ou supprimez `hooks.transformsDir`.
- `agentId` route vers un agent spécifique ; les ID inconnus reviennent à la valeur par défaut.
- `allowedAgentIds` : limite le routage explicite (`*` ou omis = tout autoriser, `[]` = tout refuser).
- `defaultSessionKey` : clé de session fixe facultative pour les exécutions dagent de hook sans `sessionKey` explicite.
- `allowRequestSessionKey` : autorise les appelants de `/hooks/agent` et les clés de session de mappage pilotées par modèle à définir `sessionKey` (par défaut : `false`).
- `allowedSessionKeyPrefixes` : liste dautorisation facultative de préfixes pour les valeurs `sessionKey` explicites (requête + mappage), par ex. `["hook:"]`. Elle devient obligatoire lorsquun mappage ou un préréglage utilise une `sessionKey` basée sur un modèle.
- `deliver: true` envoie la réponse finale à un canal ; `channel` vaut `last` par défaut.
- `allowRequestSessionKey` : autorise les appelants de `/hooks/agent` et les clés de session de mappage pilotées par modèle à définir `sessionKey` (valeur par défaut : `false`).
- `allowedSessionKeyPrefixes` : liste dautorisation facultative de préfixes pour les valeurs explicites de `sessionKey` (requête + mappage), p. ex. `["hook:"]`. Elle devient obligatoire lorsquun mappage ou un préréglage utilise un `sessionKey` à modèle.
- `deliver: true` envoie la réponse finale à un canal ; `channel` utilise `last` par défaut.
- `model` remplace le LLM pour cette exécution de hook (doit être autorisé si le catalogue de modèles est défini).
</Accordion>
@ -630,7 +628,7 @@ Notes de validation et de sécurité :
- Le préréglage Gmail intégré utilise `sessionKey: "hook:gmail:{{messages[0].id}}"`.
- Si vous conservez ce routage par message, définissez `hooks.allowRequestSessionKey: true` et limitez `hooks.allowedSessionKeyPrefixes` pour correspondre à lespace de noms Gmail, par exemple `["hook:", "hook:gmail:"]`.
- Si vous avez besoin de `hooks.allowRequestSessionKey: false`, remplacez le préréglage par une `sessionKey` statique au lieu de la valeur par défaut basée sur un modèle.
- Si vous avez besoin de `hooks.allowRequestSessionKey: false`, remplacez le préréglage par un `sessionKey` statique au lieu de la valeur par défaut à modèle.
```json5
{
@ -658,7 +656,7 @@ Notes de validation et de sécurité :
---
## Hôte de canevas
## Hôte Canvas
```json5
{
@ -673,13 +671,13 @@ Notes de validation et de sécurité :
- Sert les fichiers HTML/CSS/JS modifiables par lagent et A2UI via HTTP sous le port du Gateway :
- `http://<gateway-host>:<gateway.port>/__openclaw__/canvas/`
- `http://<gateway-host>:<gateway.port>/__openclaw__/a2ui/`
- Local uniquement : conservez `gateway.bind: "loopback"` (par défaut).
- Liaisons non loopback : les routes du canevas nécessitent lauthentification du Gateway (jeton/mot de passe/proxy de confiance), comme les autres surfaces HTTP du Gateway.
- Les WebViews Node nenvoient généralement pas den-têtes dauthentification ; une fois quun Node est appairé et connecté, le Gateway annonce des URL de capacité propres au Node pour laccès au canevas/A2UI.
- Local uniquement : gardez `gateway.bind: "loopback"` (valeur par défaut).
- Liaisons non loopback : les routes canvas nécessitent lauthentification Gateway (jeton/mot de passe/proxy de confiance), comme les autres surfaces HTTP du Gateway.
- Les WebViews Node nenvoient généralement pas den-têtes dauthentification ; après lappairage et la connexion dun Node, le Gateway annonce des URL de capacité limitées au Node pour laccès canvas/A2UI.
- Les URL de capacité sont liées à la session WS active du Node et expirent rapidement. Aucun repli fondé sur ladresse IP nest utilisé.
- Injecte le client de rechargement à chaud dans le HTML servi.
- Crée automatiquement un `index.html` de départ lorsquil est vide.
- Sert également A2UI à lemplacement `/__openclaw__/a2ui/`.
- Crée automatiquement un `index.html` de démarrage lorsquil est vide.
- Sert aussi A2UI à `/__openclaw__/a2ui/`.
- Les changements nécessitent un redémarrage du Gateway.
- Désactivez le rechargement à chaud pour les grands répertoires ou les erreurs `EMFILE`.
@ -699,11 +697,11 @@ Notes de validation et de sécurité :
}
```
- `minimal` (par défaut lorsque le Plugin `bonjour` fourni est activé) : omettre `cliPath` + `sshPort` des enregistrements TXT.
- `full` : inclure `cliPath` + `sshPort` ; lannonce multicast LAN nécessite toujours que le Plugin `bonjour` fourni soit activé.
- `off` : supprime lannonce multicast LAN sans modifier lactivation du Plugin.
- Le Plugin `bonjour` fourni démarre automatiquement sur les hôtes macOS et est optionnel sur Linux, Windows et les déploiements Gateway conteneurisés.
- Le nom dhôte utilise par défaut le nom dhôte du système lorsquil sagit dune étiquette DNS valide, avec repli sur `openclaw`. Remplacez-le avec `OPENCLAW_MDNS_HOSTNAME`.
- `minimal` (valeur par défaut lorsque le plugin `bonjour` intégré est activé) : omet `cliPath` + `sshPort` des enregistrements TXT.
- `full` : inclut `cliPath` + `sshPort` ; lannonce multicast LAN nécessite toujours que le plugin `bonjour` intégré soit activé.
- `off` : supprime lannonce multicast LAN sans changer lactivation du plugin.
- Le plugin `bonjour` intégré démarre automatiquement sur les hôtes macOS et est optionnel sur Linux, Windows et les déploiements Gateway conteneurisés.
- Le nom dhôte utilise par défaut le nom dhôte système lorsquil sagit dune étiquette DNS valide, avec repli sur `openclaw`. Remplacez-le avec `OPENCLAW_MDNS_HOSTNAME`.
### Zone étendue (DNS-SD)
@ -741,7 +739,7 @@ Configuration : `openclaw dns setup --apply`.
```
- Les variables denvironnement en ligne ne sont appliquées que si lenvironnement du processus ne contient pas la clé.
- Fichiers `.env` : `.env` du CWD + `~/.openclaw/.env` (aucun des deux ne remplace les variables existantes).
- Fichiers `.env` : `.env` du CWD + `~/.openclaw/.env` (aucun ne remplace les variables existantes).
- `shellEnv` : importe les clés attendues manquantes depuis le profil de votre shell de connexion.
- Consultez [Environnement](/fr/help/environment) pour la précédence complète.
@ -758,15 +756,15 @@ Référencez des variables denvironnement dans nimporte quelle chaîne de
```
- Seuls les noms en majuscules correspondent : `[A-Z_][A-Z0-9_]*`.
- Les variables manquantes ou vides déclenchent une erreur au chargement de la configuration.
- Échappez avec `$${VAR}` pour un `${VAR}` littéral.
- Les variables manquantes/vides déclenchent une erreur au chargement de la configuration.
- Échappez avec `$${VAR}` pour obtenir un `${VAR}` littéral.
- Fonctionne avec `$include`.
---
## Secrets
Les références de secret sont additives : les valeurs en texte brut fonctionnent toujours.
Les références de secrets sont additives : les valeurs en texte brut fonctionnent toujours.
### `SecretRef`
@ -778,11 +776,11 @@ Utilisez une forme dobjet :
Validation :
- motif `provider` : `^[a-z][a-z0-9_-]{0,63}$`
- motif did pour `source: "env"` : `^[A-Z][A-Z0-9_]{0,127}$`
- id pour `source: "file"` : pointeur JSON absolu (par exemple `"/providers/openai/apiKey"`)
- motif did pour `source: "exec"` : `^[A-Za-z0-9][A-Za-z0-9._:/-]{0,255}$`
- les ids `source: "exec"` ne doivent pas contenir de segments de chemin délimités par des barres obliques `.` ou `..` (par exemple, `a/../b` est rejeté)
- motif de `provider` : `^[a-z][a-z0-9_-]{0,63}$`
- motif didentifiant pour `source: "env"` : `^[A-Z][A-Z0-9_]{0,127}$`
- identifiant pour `source: "file"` : pointeur JSON absolu (par exemple `"/providers/openai/apiKey"`)
- motif didentifiant pour `source: "exec"` : `^[A-Za-z0-9][A-Za-z0-9._:/-]{0,255}$`
- les identifiants `source: "exec"` ne doivent pas contenir de segments de chemin délimités par des barres obliques `.` ou `..` (par exemple `a/../b` est rejeté)
### Surface didentifiants prise en charge
@ -821,13 +819,13 @@ Validation :
Notes :
- Le fournisseur `file` prend en charge `mode: "json"` et `mode: "singleValue"` (`id` doit être `"value"` en mode singleValue).
- Les chemins des fournisseurs file et exec échouent de manière fermée lorsque la vérification des ACL Windows nest pas disponible. Définissez `allowInsecurePath: true` uniquement pour les chemins de confiance qui ne peuvent pas être vérifiés.
- Les chemins des fournisseurs file et exec échouent de manière fermée lorsque la vérification ACL Windows nest pas disponible. Définissez `allowInsecurePath: true` uniquement pour les chemins de confiance qui ne peuvent pas être vérifiés.
- Le fournisseur `exec` exige un chemin `command` absolu et utilise des charges utiles de protocole sur stdin/stdout.
- Par défaut, les chemins de commande sous forme de lien symbolique sont rejetés. Définissez `allowSymlinkCommand: true` pour autoriser les chemins de lien symbolique tout en validant le chemin cible résolu.
- Si `trustedDirs` est configuré, la vérification du répertoire de confiance sapplique au chemin cible résolu.
- Par défaut, les chemins de commande symboliques sont rejetés. Définissez `allowSymlinkCommand: true` pour autoriser les chemins symboliques tout en validant le chemin cible résolu.
- Si `trustedDirs` est configuré, la vérification des répertoires de confiance sapplique au chemin cible résolu.
- Lenvironnement enfant `exec` est minimal par défaut ; transmettez explicitement les variables requises avec `passEnv`.
- Les références de secret sont résolues au moment de lactivation dans un instantané en mémoire, puis les chemins de requête lisent uniquement cet instantané.
- Le filtrage de surface active sapplique pendant lactivation : les références non résolues sur les surfaces activées font échouer le démarrage ou le rechargement, tandis que les surfaces inactives sont ignorées avec des diagnostics.
- Les références de secrets sont résolues au moment de lactivation dans un instantané en mémoire, puis les chemins de requête ne lisent que cet instantané.
- Le filtrage de la surface active sapplique pendant lactivation : les références non résolues sur les surfaces activées font échouer le démarrage/rechargement, tandis que les surfaces inactives sont ignorées avec des diagnostics.
---
@ -851,12 +849,12 @@ Notes :
- Les profils par agent sont stockés dans `<agentDir>/auth-profiles.json`.
- `auth-profiles.json` prend en charge les références au niveau des valeurs (`keyRef` pour `api_key`, `tokenRef` pour `token`) pour les modes didentifiants statiques.
- Les anciens mappages plats `auth-profiles.json`, tels que `{ "provider": { "apiKey": "..." } }`, ne sont pas un format dexécution ; `openclaw doctor --fix` les réécrit en profils de clé API canoniques `provider:default` avec une sauvegarde `.legacy-flat.*.bak`.
- Les profils en mode OAuth (`auth.profiles.<id>.mode = "oauth"`) ne prennent pas en charge les identifiants de profil dauthentification basés sur SecretRef.
- Les identifiants statiques dexécution proviennent dinstantanés résolus en mémoire ; les anciennes entrées statiques `auth.json` sont nettoyées lorsquelles sont découvertes.
- Les anciennes cartes plates `auth-profiles.json`, telles que `{ "provider": { "apiKey": "..." } }`, ne sont pas un format dexécution ; `openclaw doctor --fix` les réécrit en profils de clé API canoniques `provider:default` avec une sauvegarde `.legacy-flat.*.bak`.
- Les profils en mode OAuth (`auth.profiles.<id>.mode = "oauth"`) ne prennent pas en charge les identifiants de profil dauthentification adossés à SecretRef.
- Les identifiants dexécution statiques proviennent dinstantanés résolus en mémoire ; les anciennes entrées statiques `auth.json` sont nettoyées lorsquelles sont découvertes.
- Les anciens imports OAuth proviennent de `~/.openclaw/credentials/oauth.json`.
- Consultez [OAuth](/fr/concepts/oauth).
- Comportement dexécution des secrets et outillage `audit/configure/apply` : [Gestion des secrets](/fr/gateway/secrets).
- Comportement dexécution des secrets et outils `audit/configure/apply` : [Gestion des secrets](/fr/gateway/secrets).
### `auth.cooldowns`
@ -878,15 +876,15 @@ Notes :
}
```
- `billingBackoffHours` : délai dattente de base en heures lorsquun profil échoue en raison de véritables erreurs de facturation/crédit insuffisant (par défaut : `5`). Un texte explicite de facturation peut tout de même arriver ici même sur des réponses `401`/`403`, mais les correspondances de texte propres à un fournisseur restent limitées au fournisseur qui les possède (par exemple OpenRouter `Key limit exceeded`). Les messages HTTP `402` réessayables de fenêtre dusage ou de limite de dépenses dorganisation/espace de travail restent plutôt dans le chemin `rate_limit`.
- `billingBackoffHours` : délai dattente exponentiel de base en heures lorsquun profil échoue à cause de véritables erreurs de facturation/crédit insuffisant (par défaut : `5`). Le texte explicite de facturation peut toujours arriver ici, même sur les réponses `401`/`403`, mais les correspondances de texte propres au fournisseur restent limitées au fournisseur qui les possède (par exemple OpenRouter `Key limit exceeded`). Les messages HTTP `402` réessayables liés à la fenêtre dutilisation ou aux limites de dépenses de lorganisation/de lespace de travail restent plutôt dans le chemin `rate_limit`.
- `billingBackoffHoursByProvider` : remplacements facultatifs par fournisseur pour les heures de délai dattente de facturation.
- `billingMaxHours` : plafond en heures pour la croissance exponentielle du délai dattente de facturation (par défaut : `24`).
- `authPermanentBackoffMinutes` : délai dattente de base en minutes pour les échecs `auth_permanent` à forte confiance (par défaut : `10`).
- `authPermanentBackoffMinutes` : délai dattente de base en minutes pour les échecs `auth_permanent` à haut niveau de confiance (par défaut : `10`).
- `authPermanentMaxMinutes` : plafond en minutes pour la croissance du délai dattente `auth_permanent` (par défaut : `60`).
- `failureWindowHours` : fenêtre glissante en heures utilisée pour les compteurs de délai dattente (par défaut : `24`).
- `overloadedProfileRotations` : nombre maximal de rotations de profils dauthentification du même fournisseur pour les erreurs de surcharge avant de basculer vers le repli de modèle (par défaut : `1`). Les formes indiquant un fournisseur occupé, comme `ModelNotReadyException`, arrivent ici.
- `overloadedBackoffMs` : délai fixe avant de réessayer une rotation de fournisseur/profil surchargé (par défaut : `0`).
- `rateLimitedProfileRotations` : nombre maximal de rotations de profils dauthentification du même fournisseur pour les erreurs de limite de débit avant de basculer vers le repli de modèle (par défaut : `1`). Ce compartiment de limite de débit inclut du texte façonné par les fournisseurs, comme `Too many concurrent requests`, `ThrottlingException`, `concurrency limit reached`, `workers_ai ... quota limit exceeded` et `resource exhausted`.
- `rateLimitedProfileRotations` : nombre maximal de rotations de profils dauthentification du même fournisseur pour les erreurs de limite de débit avant de basculer vers le repli de modèle (par défaut : `1`). Ce compartiment de limite de débit inclut du texte façonné par le fournisseur comme `Too many concurrent requests`, `ThrottlingException`, `concurrency limit reached`, `workers_ai ... quota limit exceeded` et `resource exhausted`.
---
@ -909,7 +907,7 @@ Notes :
- Définissez `logging.file` pour un chemin stable.
- `consoleLevel` passe à `debug` avec `--verbose`.
- `maxFileBytes` : taille maximale du fichier journal actif en octets avant rotation (entier positif ; par défaut : `104857600` = 100 Mo). OpenClaw conserve jusquà cinq archives numérotées à côté du fichier actif.
- `redactSensitive` / `redactPatterns` : masquage au mieux pour la sortie console, les journaux de fichiers, les enregistrements de journaux OTLP et le texte persistant des transcriptions de session. `redactSensitive: "off"` ne désactive que cette politique générale de journaux/transcriptions ; les surfaces de sécurité de linterface, des outils et des diagnostics continuent de masquer les secrets avant émission.
- `redactSensitive` / `redactPatterns` : masquage au mieux pour la sortie console, les journaux de fichier, les enregistrements de journal OTLP et le texte persistant des transcriptions de session. `redactSensitive: "off"` désactive uniquement cette politique générale de journaux/transcriptions ; les surfaces de sécurité UI/outils/diagnostics masquent toujours les secrets avant émission.
---
@ -921,6 +919,7 @@ Notes :
enabled: true,
flags: ["telegram.*"],
stuckSessionWarnMs: 30000,
stuckSessionAbortMs: 600000,
otel: {
enabled: false,
@ -959,21 +958,22 @@ Notes :
- `enabled` : interrupteur principal pour la sortie dinstrumentation (par défaut : `true`).
- `flags` : tableau de chaînes dindicateurs activant une sortie de journal ciblée (prend en charge les jokers comme `"telegram.*"` ou `"*"`).
- `stuckSessionWarnMs` : seuil dâge sans progression en ms pour classer les sessions de traitement de longue durée comme `session.long_running`, `session.stalled` ou `session.stuck`. Les réponses, outils, statuts, blocs et la progression ACP réinitialisent le minuteur ; les diagnostics `session.stuck` répétés augmentent leur délai tant quils restent inchangés.
- `stuckSessionWarnMs` : seuil dâge sans progression en ms pour classer les sessions de traitement longues comme `session.long_running`, `session.stalled` ou `session.stuck`. Les réponses, outils, statuts, blocs et la progression ACP réinitialisent le minuteur ; les diagnostics `session.stuck` répétés reculent tant que rien ne change.
- `stuckSessionAbortMs` : seuil dâge sans progression en ms avant que le travail actif bloqué admissible puisse être vidé par abandon pour récupération. Sil nest pas défini, OpenClaw utilise la fenêtre dexécution intégrée étendue plus sûre dau moins 10 minutes et 5 fois `stuckSessionWarnMs`.
- `otel.enabled` : active le pipeline dexport OpenTelemetry (par défaut : `false`). Pour la configuration complète, le catalogue des signaux et le modèle de confidentialité, consultez [Export OpenTelemetry](/fr/gateway/opentelemetry).
- `otel.endpoint` : URL du collecteur pour lexport OTel.
- `otel.tracesEndpoint` / `otel.metricsEndpoint` / `otel.logsEndpoint` : points de terminaison OTLP facultatifs propres à un signal. Lorsquils sont définis, ils remplacent `otel.endpoint` uniquement pour ce signal.
- `otel.tracesEndpoint` / `otel.metricsEndpoint` / `otel.logsEndpoint` : points de terminaison OTLP facultatifs propres au signal. Lorsquils sont définis, ils remplacent `otel.endpoint` uniquement pour ce signal.
- `otel.protocol` : `"http/protobuf"` (par défaut) ou `"grpc"`.
- `otel.headers` : en-têtes de métadonnées HTTP/gRPC supplémentaires envoyés avec les requêtes dexport OTel.
- `otel.serviceName` : nom du service pour les attributs de ressource.
- `otel.traces` / `otel.metrics` / `otel.logs` : active lexport des traces, métriques ou journaux.
- `otel.traces` / `otel.metrics` / `otel.logs` : active lexport de traces, de métriques ou de journaux.
- `otel.sampleRate` : taux déchantillonnage des traces `0``1`.
- `otel.flushIntervalMs` : intervalle périodique de vidage de la télémétrie en ms.
- `otel.captureContent` : capture de contenu brut avec consentement explicite pour les attributs de spans OTEL. Désactivé par défaut. Le booléen `true` capture le contenu non système des messages/outils ; la forme objet permet dactiver explicitement `inputMessages`, `outputMessages`, `toolInputs`, `toolOutputs` et `systemPrompt`.
- `OTEL_SEMCONV_STABILITY_OPT_IN=gen_ai_latest_experimental` : interrupteur denvironnement pour les derniers attributs expérimentaux de fournisseur de spans GenAI. Par défaut, les spans conservent lattribut historique `gen_ai.system` pour la compatibilité ; les métriques GenAI utilisent des attributs sémantiques bornés.
- `otel.flushIntervalMs` : intervalle de vidage périodique de la télémétrie en ms.
- `otel.captureContent` : capture optionnelle du contenu brut pour les attributs détendue OTEL. Désactivée par défaut. Le booléen `true` capture le contenu non système des messages/outils ; la forme objet vous permet dactiver explicitement `inputMessages`, `outputMessages`, `toolInputs`, `toolOutputs` et `systemPrompt`.
- `OTEL_SEMCONV_STABILITY_OPT_IN=gen_ai_latest_experimental` : interrupteur denvironnement pour les derniers attributs expérimentaux de fournisseur détendues GenAI. Par défaut, les étendues conservent lattribut hérité `gen_ai.system` pour la compatibilité ; les métriques GenAI utilisent des attributs sémantiques bornés.
- `OPENCLAW_OTEL_PRELOADED=1` : interrupteur denvironnement pour les hôtes qui ont déjà enregistré un SDK OpenTelemetry global. OpenClaw ignore alors le démarrage/larrêt du SDK possédé par le plugin tout en gardant les écouteurs de diagnostics actifs.
- `OTEL_EXPORTER_OTLP_TRACES_ENDPOINT`, `OTEL_EXPORTER_OTLP_METRICS_ENDPOINT` et `OTEL_EXPORTER_OTLP_LOGS_ENDPOINT` : variables denvironnement de points de terminaison propres à un signal, utilisées lorsque la clé de configuration correspondante nest pas définie.
- `cacheTrace.enabled` : journalise des instantanés de trace de cache pour les exécutions intégrées (par défaut : `false`).
- `OTEL_EXPORTER_OTLP_TRACES_ENDPOINT`, `OTEL_EXPORTER_OTLP_METRICS_ENDPOINT` et `OTEL_EXPORTER_OTLP_LOGS_ENDPOINT` : variables denvironnement de point de terminaison propres au signal, utilisées lorsque la clé de configuration correspondante nest pas définie.
- `cacheTrace.enabled` : journalise les instantanés de trace de cache pour les exécutions intégrées (par défaut : `false`).
- `cacheTrace.filePath` : chemin de sortie pour le JSONL de trace de cache (par défaut : `$OPENCLAW_STATE_DIR/logs/cache-trace.jsonl`).
- `cacheTrace.includeMessages` / `includePrompt` / `includeSystem` : contrôlent ce qui est inclus dans la sortie de trace de cache (tous par défaut : `true`).
@ -998,11 +998,11 @@ Notes :
```
- `channel` : canal de publication pour les installations npm/git — `"stable"`, `"beta"` ou `"dev"`.
- `checkOnStart` : vérifie les mises à jour npm au démarrage du Gateway (par défaut : `true`).
- `auto.enabled` : active la mise à jour automatique en arrière-plan pour les installations de packages (par défaut : `false`).
- `auto.stableDelayHours` : délai minimal en heures avant application automatique sur le canal stable (par défaut : `6` ; max. : `168`).
- `checkOnStart` : recherche les mises à jour npm au démarrage du Gateway (par défaut : `true`).
- `auto.enabled` : active la mise à jour automatique en arrière-plan pour les installations de paquet (par défaut : `false`).
- `auto.stableDelayHours` : délai minimal en heures avant lapplication automatique sur le canal stable (par défaut : `6` ; max. : `168`).
- `auto.stableJitterHours` : fenêtre supplémentaire de répartition du déploiement du canal stable en heures (par défaut : `12` ; max. : `168`).
- `auto.betaCheckIntervalHours` : fréquence des vérifications du canal bêta, en heures (par défaut : `1` ; max. : `24`).
- `auto.betaCheckIntervalHours` : fréquence des vérifications du canal bêta en heures (par défaut : `1` ; max. : `24`).
---
@ -1035,22 +1035,22 @@ Notes :
}
```
- `enabled` : garde-fou global de la fonctionnalité ACP (par défaut : `true` ; définissez `false` pour masquer les possibilités de dispatch et de spawn ACP).
- `dispatch.enabled` : garde-fou indépendant pour le dispatch des tours de session ACP (par défaut : `true`). Définissez `false` pour garder les commandes ACP disponibles tout en bloquant lexécution.
- `backend` : id du backend dexécution ACP par défaut (doit correspondre à un plugin dexécution ACP enregistré).
Installez dabord le plugin de backend et, si `plugins.allow` est défini, incluez lid du plugin de backend (par exemple `acpx`), sinon le backend ACP ne se chargera pas.
- `defaultAgent` : id dagent cible ACP de repli lorsque les spawns ne spécifient pas de cible explicite.
- `allowedAgents` : liste dautorisation des ids dagents permis pour les sessions dexécution ACP ; vide signifie aucune restriction supplémentaire.
- `enabled` : garde globale de fonctionnalité ACP (par défaut : `true` ; définissez `false` pour masquer la répartition ACP et les affordances de création).
- `dispatch.enabled` : garde indépendante pour la répartition des tours de session ACP (par défaut : `true`). Définissez `false` pour garder les commandes ACP disponibles tout en bloquant lexécution.
- `backend` : identifiant du backend dexécution ACP par défaut (doit correspondre à un plugin dexécution ACP enregistré).
Installez dabord le plugin backend et, si `plugins.allow` est défini, incluez lidentifiant du plugin backend (par exemple `acpx`) ou le backend ACP ne se chargera pas.
- `defaultAgent` : identifiant dagent cible ACP de repli lorsque les créations ne spécifient pas de cible explicite.
- `allowedAgents` : liste dautorisation des identifiants dagents permis pour les sessions dexécution ACP ; vide signifie aucune restriction supplémentaire.
- `maxConcurrentSessions` : nombre maximal de sessions ACP actives simultanément.
- `stream.coalesceIdleMs` : fenêtre de vidage en cas dinactivité, en ms, pour le texte diffusé.
- `stream.maxChunkChars` : taille maximale dun segment avant découpage de la projection de bloc diffusée.
- `stream.coalesceIdleMs` : fenêtre de vidage au repos en ms pour le texte diffusé.
- `stream.maxChunkChars` : taille maximale de fragment avant découpage de la projection de bloc diffusé.
- `stream.repeatSuppression` : supprime les lignes de statut/outil répétées par tour (par défaut : `true`).
- `stream.deliveryMode` : `"live"` diffuse incrémentalement ; `"final_only"` met en mémoire tampon jusquaux événements terminaux du tour.
- `stream.hiddenBoundarySeparator` : séparateur avant le texte visible après des événements doutils masqués (par défaut : `"paragraph"`).
- `stream.maxOutputChars` : nombre maximal de caractères de sortie dassistant projetés par tour ACP.
- `stream.maxSessionUpdateChars` : nombre maximal de caractères pour les lignes projetées de statut/mise à jour ACP.
- `stream.deliveryMode` : `"live"` diffuse progressivement ; `"final_only"` met en mémoire tampon jusquaux événements terminaux du tour.
- `stream.hiddenBoundarySeparator` : séparateur avant le texte visible après des événements doutil masqués (par défaut : `"paragraph"`).
- `stream.maxOutputChars` : nombre maximal de caractères de sortie assistant projetés par tour ACP.
- `stream.maxSessionUpdateChars` : nombre maximal de caractères pour les lignes de statut/mise à jour ACP projetées.
- `stream.tagVisibility` : enregistrement des noms de balises vers des remplacements booléens de visibilité pour les événements diffusés.
- `runtime.ttlMinutes` : TTL dinactivité en minutes pour les workers de session ACP avant quils soient éligibles au nettoyage.
- `runtime.ttlMinutes` : TTL dinactivité en minutes pour les workers de session ACP avant nettoyage admissible.
- `runtime.installCommand` : commande dinstallation facultative à exécuter lors de lamorçage dun environnement dexécution ACP.
---
@ -1067,11 +1067,11 @@ Notes :
}
```
- `cli.banner.taglineMode` contrôle le style du slogan de bannière :
- `"random"` (par défaut) : slogans amusants/saisonniers en rotation.
- `cli.banner.taglineMode` contrôle le style de slogan de la bannière :
- `"random"` (par défaut) : slogans tournants amusants/saisonniers.
- `"default"` : slogan neutre fixe (`All your chats, one OpenClaw.`).
- `"off"` : aucun texte de slogan (le titre/la version de la bannière restent affichés).
- Pour masquer toute la bannière (pas seulement les slogans), définissez lenvironnement `OPENCLAW_HIDE_BANNER=1`.
- Pour masquer toute la bannière (pas seulement les slogans), définissez lenv `OPENCLAW_HIDE_BANNER=1`.
---
@ -1095,7 +1095,7 @@ Métadonnées écrites par les flux de configuration guidée de la CLI (`onboard
## Identité
Voir les champs didentité `agents.list` sous [Valeurs par défaut des agents](/fr/gateway/config-agents#agent-defaults).
Consultez les champs didentité `agents.list` sous [Valeurs par défaut de lagent](/fr/gateway/config-agents#agent-defaults).
---
@ -1103,7 +1103,7 @@ Voir les champs didentité `agents.list` sous [Valeurs par défaut des agents
Les builds actuels nincluent plus le pont TCP. Les Nodes se connectent via le WebSocket du Gateway. Les clés `bridge.*` ne font plus partie du schéma de configuration (la validation échoue jusquà leur suppression ; `openclaw doctor --fix` peut retirer les clés inconnues).
<Accordion title="Configuration du pont héritée (référence historique)">
<Accordion title="Configuration du pont hérité (référence historique)">
```json
{
@ -1141,11 +1141,11 @@ Les builds actuels nincluent plus le pont TCP. Les Nodes se connectent via le
}
```
- `sessionRetention` : durée de conservation des sessions dexécutions cron isolées terminées avant élagage depuis `sessions.json`. Contrôle aussi le nettoyage des transcriptions cron supprimées archivées. Par défaut : `24h` ; définissez `false` pour désactiver.
- `runLog.maxBytes` : taille maximale par fichier journal dexécution (`cron/runs/<jobId>.jsonl`) avant élagage. Par défaut : `2_000_000` octets.
- `runLog.keepLines` : lignes les plus récentes conservées lorsque lélagage du journal dexécution est déclenché. Par défaut : `2000`.
- `webhookToken` : jeton bearer utilisé pour la livraison POST du Webhook Cron (`delivery.mode = "webhook"`), si omis aucun en-tête dauthentification nest envoyé.
- `webhook` : URL Webhook héritée de repli obsolète (http/https) utilisée uniquement pour les tâches stockées qui ont encore `notify: true`.
- `sessionRetention`: durée pendant laquelle conserver les sessions dexécution Cron isolées terminées avant leur suppression de `sessions.json`. Contrôle aussi le nettoyage des transcriptions Cron supprimées archivées. Par défaut : `24h`; définissez sur `false` pour désactiver.
- `runLog.maxBytes`: taille maximale par fichier de journal dexécution (`cron/runs/<jobId>.jsonl`) avant suppression. Par défaut : `2_000_000` octets.
- `runLog.keepLines`: lignes les plus récentes conservées lorsque la suppression du journal dexécution est déclenchée. Par défaut : `2000`.
- `webhookToken`: jeton bearer utilisé pour la livraison POST du Webhook Cron (`delivery.mode = "webhook"`); sil est omis, aucun en-tête dauthentification nest envoyé.
- `webhook`: URL Webhook de secours héritée obsolète (http/https) utilisée uniquement pour les tâches stockées qui ont encore `notify: true`.
### `cron.retry`
@ -1161,9 +1161,9 @@ Les builds actuels nincluent plus le pont TCP. Les Nodes se connectent via le
}
```
- `maxAttempts` : nombre maximal de nouvelles tentatives pour les tâches ponctuelles en cas derreurs transitoires (par défaut : `3` ; plage : `0``10`).
- `backoffMs` : tableau des délais dattente en ms pour chaque nouvelle tentative (par défaut : `[30000, 60000, 300000]` ; 1 à 10 entrées).
- `retryOn` : types derreurs qui déclenchent de nouvelles tentatives — `"rate_limit"`, `"overloaded"`, `"network"`, `"timeout"`, `"server_error"`. Omettez ce champ pour réessayer tous les types transitoires.
- `maxAttempts`: nombre maximal de nouvelles tentatives pour les tâches ponctuelles en cas derreurs transitoires (par défaut : `3`; plage : `0``10`).
- `backoffMs`: tableau de délais dattente en ms pour chaque nouvelle tentative (par défaut : `[30000, 60000, 300000]`; 1 à 10 entrées).
- `retryOn`: types derreurs qui déclenchent de nouvelles tentatives — `"rate_limit"`, `"overloaded"`, `"network"`, `"timeout"`, `"server_error"`. Omettez ce champ pour réessayer tous les types transitoires.
Sapplique uniquement aux tâches Cron ponctuelles. Les tâches récurrentes utilisent une gestion des échecs distincte.
@ -1184,12 +1184,12 @@ Sapplique uniquement aux tâches Cron ponctuelles. Les tâches récurrentes u
}
```
- `enabled` : active les alertes déchec pour les tâches Cron (par défaut : `false`).
- `after` : nombre déchecs consécutifs avant le déclenchement dune alerte (entier positif, min. : `1`).
- `cooldownMs` : nombre minimal de millisecondes entre des alertes répétées pour la même tâche (entier non négatif).
- `includeSkipped` : compte les exécutions ignorées consécutives dans le seuil dalerte (par défaut : `false`). Les exécutions ignorées sont suivies séparément et naffectent pas le délai dattente après erreur dexécution.
- `mode` : mode de livraison — `"announce"` envoie via un message de canal ; `"webhook"` publie vers le webhook configuré.
- `accountId` : compte ou ID de canal facultatif pour limiter la portée de la livraison des alertes.
- `enabled`: active les alertes déchec pour les tâches Cron (par défaut : `false`).
- `after`: nombre déchecs consécutifs avant le déclenchement dune alerte (entier positif, min. : `1`).
- `cooldownMs`: délai minimal en millisecondes entre les alertes répétées pour la même tâche (entier non négatif).
- `includeSkipped`: comptabilise les exécutions ignorées consécutives dans le seuil dalerte (par défaut : `false`). Les exécutions ignorées sont suivies séparément et naffectent pas le délai dattente après erreur dexécution.
- `mode`: mode de livraison — `"announce"` envoie via un message de canal; `"webhook"` publie vers le Webhook configuré.
- `accountId`: compte ou identifiant de canal facultatif pour limiter la portée de la livraison des alertes.
### `cron.failureDestination`
@ -1206,51 +1206,51 @@ Sapplique uniquement aux tâches Cron ponctuelles. Les tâches récurrentes u
}
```
- Destination par défaut des notifications déchec Cron pour toutes les tâches.
- `mode` : `"announce"` ou `"webhook"` ; utilise `"announce"` par défaut lorsque les données de cible suffisantes existent.
- `channel` : remplacement du canal pour la livraison par annonce. `"last"` réutilise le dernier canal de livraison connu.
- `to` : cible dannonce explicite ou URL de webhook. Obligatoire en mode webhook.
- `accountId` : remplacement facultatif du compte pour la livraison.
- `delivery.failureDestination` propre à la tâche remplace cette valeur globale par défaut.
- Lorsque ni la destination déchec globale ni celle propre à la tâche nest définie, les tâches qui livrent déjà via `announce` reviennent à cette cible dannonce principale en cas déchec.
- Destination par défaut pour les notifications déchec Cron sur toutes les tâches.
- `mode`: `"announce"` ou `"webhook"`; utilise par défaut `"announce"` lorsque les données de cible sont suffisantes.
- `channel`: remplacement du canal pour la livraison par annonce. `"last"` réutilise le dernier canal de livraison connu.
- `to`: cible dannonce explicite ou URL Webhook. Obligatoire pour le mode Webhook.
- `accountId`: remplacement facultatif du compte pour la livraison.
- Le `delivery.failureDestination` propre à une tâche remplace cette valeur globale par défaut.
- Lorsque ni la destination déchec globale ni celle propre à la tâche nest définie, les tâches qui livrent déjà via `announce` se rabattent sur cette cible dannonce principale en cas déchec.
- `delivery.failureDestination` nest pris en charge que pour les tâches `sessionTarget="isolated"`, sauf si le `delivery.mode` principal de la tâche est `"webhook"`.
Voir [Tâches Cron](/fr/automation/cron-jobs). Les exécutions Cron isolées sont suivies comme des [tâches en arrière-plan](/fr/automation/tasks).
---
## Variables de modèle pour les modèles média
## Variables de modèle de média
Variables demplacement développées dans `tools.media.models[].args` :
Espaces réservés de modèle développés dans `tools.media.models[].args`:
| Variable | Description |
| ------------------ | ------------------------------------------------- |
| `{{Body}}` | Corps complet du message entrant |
| `{{RawBody}}` | Corps brut (sans enveloppes dhistorique/expéditeur) |
| `{{BodyStripped}}` | Corps dont les mentions de groupe ont été supprimées |
| `{{From}}` | Identifiant de lexpéditeur |
| `{{To}}` | Identifiant de destination |
| `{{MessageSid}}` | ID du message de canal |
| `{{SessionId}}` | UUID de la session actuelle |
| `{{IsNewSession}}` | `"true"` lorsquune nouvelle session est créée |
| `{{MediaUrl}}` | Pseudo-URL du média entrant |
| `{{MediaPath}}` | Chemin local du média |
| `{{MediaType}}` | Type de média (image/audio/document/…) |
| `{{Transcript}}` | Transcription audio |
| `{{Prompt}}` | Invite média résolue pour les entrées CLI |
| Variable | Description |
| ------------------ | --------------------------------------------------------------- |
| `{{Body}}` | Corps complet du message entrant |
| `{{RawBody}}` | Corps brut (sans enveloppes dhistorique/dexpéditeur) |
| `{{BodyStripped}}` | Corps avec les mentions de groupe supprimées |
| `{{From}}` | Identifiant de lexpéditeur |
| `{{To}}` | Identifiant de destination |
| `{{MessageSid}}` | Identifiant du message du canal |
| `{{SessionId}}` | UUID de la session actuelle |
| `{{IsNewSession}}` | `"true"` lorsquune nouvelle session est créée |
| `{{MediaUrl}}` | Pseudo-URL du média entrant |
| `{{MediaPath}}` | Chemin local du média |
| `{{MediaType}}` | Type de média (image/audio/document/…) |
| `{{Transcript}}` | Transcription audio |
| `{{Prompt}}` | Invite média résolue pour les entrées CLI |
| `{{MaxChars}}` | Nombre maximal de caractères de sortie résolu pour les entrées CLI |
| `{{ChatType}}` | `"direct"` ou `"group"` |
| `{{GroupSubject}}` | Sujet du groupe (au mieux) |
| `{{GroupMembers}}` | Aperçu des membres du groupe (au mieux) |
| `{{SenderName}}` | Nom daffichage de lexpéditeur (au mieux) |
| `{{SenderE164}}` | Numéro de téléphone de lexpéditeur (au mieux) |
| `{{Provider}}` | Indication de fournisseur (whatsapp, telegram, discord, etc.) |
| `{{ChatType}}` | `"direct"` ou `"group"` |
| `{{GroupSubject}}` | Sujet du groupe (au mieux) |
| `{{GroupMembers}}` | Aperçu des membres du groupe (au mieux) |
| `{{SenderName}}` | Nom daffichage de lexpéditeur (au mieux) |
| `{{SenderE164}}` | Numéro de téléphone de lexpéditeur (au mieux) |
| `{{Provider}}` | Indice de fournisseur (whatsapp, telegram, discord, etc.) |
---
## Inclusions de configuration (`$include`)
Divisez la configuration en plusieurs fichiers :
Divisez la configuration en plusieurs fichiers:
```json5
// ~/.openclaw/openclaw.json
@ -1263,20 +1263,20 @@ Divisez la configuration en plusieurs fichiers :
}
```
**Comportement de fusion :**
**Comportement de fusion:**
- Fichier unique : remplace lobjet contenant.
- Tableau de fichiers : fusion profonde dans lordre (les fichiers ultérieurs remplacent les précédents).
- Clés sœurs : fusionnées après les inclusions (remplacent les valeurs incluses).
- Inclusions imbriquées : jusquà 10 niveaux de profondeur.
- Chemins : résolus relativement au fichier incluant, mais doivent rester dans le répertoire de configuration de plus haut niveau (`dirname` de `openclaw.json`). Les formes absolues/`../` ne sont autorisées que lorsquelles se résolvent toujours à lintérieur de cette limite.
- Les écritures appartenant à OpenClaw qui ne modifient quune seule section de plus haut niveau appuyée par une inclusion de fichier unique écrivent directement dans ce fichier inclus. Par exemple, `plugins install` met à jour `plugins: { $include: "./plugins.json5" }` dans `plugins.json5` et laisse `openclaw.json` intact.
- Les inclusions racine, les tableaux dinclusions et les inclusions avec remplacements par clés sœurs sont en lecture seule pour les écritures appartenant à OpenClaw ; ces écritures échouent de manière fermée au lieu daplatir la configuration.
- Erreurs : messages clairs pour les fichiers manquants, les erreurs danalyse et les inclusions circulaires.
- Fichier unique: remplace lobjet conteneur.
- Tableau de fichiers: fusion profonde dans lordre (les suivants remplacent les précédents).
- Clés voisines: fusionnées après les inclusions (remplacent les valeurs incluses).
- Inclusions imbriquées: jusquà 10 niveaux de profondeur.
- Chemins: résolus par rapport au fichier qui inclut, mais doivent rester dans le répertoire de configuration de niveau supérieur (`dirname` de `openclaw.json`). Les formes absolues/`../` ne sont autorisées que lorsquelles se résolvent toujours à lintérieur de cette limite.
- Les écritures appartenant à OpenClaw qui ne modifient quune seule section de niveau supérieur adossée à une inclusion de fichier unique écrivent directement dans ce fichier inclus. Par exemple, `plugins install` met à jour `plugins: { $include: "./plugins.json5" }` dans `plugins.json5` et laisse `openclaw.json` intact.
- Les inclusions racine, les tableaux dinclusions et les inclusions avec remplacements par clés voisines sont en lecture seule pour les écritures appartenant à OpenClaw; ces écritures échouent de manière fermée au lieu daplatir la configuration.
- Erreurs: messages clairs pour les fichiers manquants, les erreurs danalyse et les inclusions circulaires.
---
_Connexe : [Configuration](/fr/gateway/configuration) · [Exemples de configuration](/fr/gateway/configuration-examples) · [Doctor](/fr/gateway/doctor)_
_Related: [Configuration](/fr/gateway/configuration) · [Exemples de configuration](/fr/gateway/configuration-examples) · [Doctor](/fr/gateway/doctor)_
## Connexe

View File

@ -1,42 +1,40 @@
---
read_when:
- Vous souhaitez envoyer lutilisation des modèles OpenClaw, le flux des messages ou les métriques de session à un collecteur OpenTelemetry
- Vous raccordez des traces, des métriques ou des journaux à Grafana, Datadog, Honeycomb, New Relic, Tempo ou à un autre backend OTLP
- Vous avez besoin des noms exacts des métriques, des noms des segments ou des structures des attributs pour créer des tableaux de bord ou des alertes
summary: Exporter les diagnostics dOpenClaw vers nimporte quel collecteur OpenTelemetry via le Plugin diagnostics-otel (OTLP/HTTP)
- Vous souhaitez envoyer lutilisation des modèles dOpenClaw, le flux de messages ou les métriques de session à un collecteur OpenTelemetry
- Vous connectez des traces, des métriques ou des journaux à Grafana, Datadog, Honeycomb, New Relic, Tempo ou un autre backend OTLP
- Vous avez besoin des noms exacts des métriques, des noms des étendues ou de la structure des attributs pour créer des tableaux de bord ou des alertes
summary: Exportez les diagnostics OpenClaw vers nimporte quel collecteur OpenTelemetry via le plugin diagnostics-otel (OTLP/HTTP)
title: Export OpenTelemetry
x-i18n:
generated_at: "2026-05-04T02:24:48Z"
generated_at: "2026-05-05T06:17:23Z"
model: gpt-5.5
provider: openai
source_hash: d0b5be99b29fe5f13132b03cfeaf3ce978ee16f29e307aa76769bc414b5ca35f
source_hash: b5030b8b16624f114e31838d3a055c24e8a23a6c77d63495a445cb9f2e227b6a
source_path: gateway/opentelemetry.md
workflow: 16
---
OpenClaw exporte les diagnostics via le plugin officiel `diagnostics-otel`
avec **OTLP/HTTP (protobuf)**. Tout collecteur ou backend qui accepte OTLP/HTTP
fonctionne sans modification du code. Pour les journaux de fichiers locaux et la
façon de les lire, consultez [Journalisation](/fr/logging).
en utilisant **OTLP/HTTP (protobuf)**. Tout collecteur ou backend qui accepte OTLP/HTTP
fonctionne sans modification du code. Pour les journaux de fichiers locaux et la façon de les lire, consultez
[Journalisation](/fr/logging).
## Comment lensemble sarticule
## Fonctionnement densemble
- Les **événements de diagnostic** sont des enregistrements structurés, en cours
de processus, émis par le Gateway et les plugins groupés pour les exécutions
de modèles, le flux de messages, les sessions, les files dattente et exec.
- Le **plugin `diagnostics-otel`** sabonne à ces événements et les exporte sous
forme de **métriques**, **traces** et **journaux** OpenTelemetry via OTLP/HTTP.
- Les **appels de fournisseur** reçoivent un en-tête W3C `traceparent` depuis le
contexte de span dappel de modèle approuvé dOpenClaw lorsque le transport du
fournisseur accepte les en-têtes personnalisés. Le contexte de trace émis par
un plugin nest pas propagé.
- Les exportateurs ne sattachent que lorsque la surface de diagnostics et le
plugin sont tous deux activés, de sorte que le coût en cours de processus
reste proche de zéro par défaut.
- Les **événements de diagnostic** sont des enregistrements structurés, internes au processus, émis par le
Gateway et les plugins groupés pour les exécutions de modèle, le flux de messages, les sessions, les files dattente
et exec.
- Le **plugin `diagnostics-otel`** sabonne à ces événements et les exporte sous forme de
**métriques**, **traces** et **journaux** OpenTelemetry via OTLP/HTTP.
- Les **appels de fournisseur** reçoivent un en-tête W3C `traceparent` depuis le contexte de span
dappel de modèle de confiance dOpenClaw lorsque le transport du fournisseur accepte les en-têtes
personnalisés. Le contexte de trace émis par les plugins nest pas propagé.
- Les exporters ne sattachent que lorsque la surface de diagnostic et le plugin sont tous deux
activés, de sorte que le coût interne au processus reste proche de zéro par défaut.
## Démarrage rapide
Pour les installations empaquetées, installez dabord le plugin :
Pour les installations packagées, installez dabord le plugin :
```bash
openclaw plugins install clawhub:@openclaw/diagnostics-otel
@ -67,26 +65,26 @@ openclaw plugins install clawhub:@openclaw/diagnostics-otel
}
```
Vous pouvez également activer le plugin depuis la CLI :
Vous pouvez aussi activer le plugin depuis la CLI :
```bash
openclaw plugins enable diagnostics-otel
```
<Note>
`protocol` ne prend actuellement en charge que `http/protobuf`. `grpc` est ignoré.
`protocol` prend actuellement en charge uniquement `http/protobuf`. `grpc` est ignoré.
</Note>
## Signaux exportés
| Signal | Ce quil contient |
| ------------- | ----------------------------------------------------------------------------------------------------------------------------------------------- |
| Signal | Ce quil contient |
| ------------- | -------------------------------------------------------------------------------------------------------------------------------------------- |
| **Métriques** | Compteurs et histogrammes pour lutilisation des tokens, le coût, la durée dexécution, le flux de messages, les voies de file dattente, létat de session, exec et la pression mémoire. |
| **Traces** | Spans pour lutilisation des modèles, les appels de modèles, le cycle de vie du harnais, lexécution doutils, exec, le traitement Webhook/message, lassemblage du contexte et les boucles doutils. |
| **Journaux** | Enregistrements structurés `logging.file` exportés via OTLP lorsque `diagnostics.otel.logs` est activé. |
| **Traces** | Spans pour lutilisation du modèle, les appels de modèle, le cycle de vie du harness, lexécution doutils, exec, le traitement webhook/message, lassemblage du contexte et les boucles doutils. |
| **Journaux** | Enregistrements structurés `logging.file` exportés via OTLP lorsque `diagnostics.otel.logs` est activé. |
Activez ou désactivez `traces`, `metrics` et `logs` indépendamment. Les trois
sont activés par défaut lorsque `diagnostics.otel.enabled` vaut true.
Activez ou désactivez `traces`, `metrics` et `logs` indépendamment. Les trois sont activés par défaut
lorsque `diagnostics.otel.enabled` vaut true.
## Référence de configuration
@ -123,139 +121,136 @@ sont activés par défaut lorsque `diagnostics.otel.enabled` vaut true.
### Variables denvironnement
| Variable | Objectif |
| ----------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `OTEL_EXPORTER_OTLP_ENDPOINT` | Remplace `diagnostics.otel.endpoint`. Si la valeur contient déjà `/v1/traces`, `/v1/metrics` ou `/v1/logs`, elle est utilisée telle quelle. |
| `OTEL_EXPORTER_OTLP_TRACES_ENDPOINT` / `OTEL_EXPORTER_OTLP_METRICS_ENDPOINT` / `OTEL_EXPORTER_OTLP_LOGS_ENDPOINT` | Remplacements de point de terminaison propres au signal, utilisés lorsque la clé de configuration `diagnostics.otel.*Endpoint` correspondante nest pas définie. La configuration propre au signal prime sur lenvironnement propre au signal, qui prime sur le point de terminaison partagé. |
| `OTEL_SERVICE_NAME` | Remplace `diagnostics.otel.serviceName`. |
| `OTEL_EXPORTER_OTLP_PROTOCOL` | Remplace le protocole filaire (seul `http/protobuf` est honoré aujourdhui). |
| `OTEL_SEMCONV_STABILITY_OPT_IN` | Définissez sur `gen_ai_latest_experimental` pour émettre le dernier attribut expérimental de span GenAI (`gen_ai.provider.name`) au lieu de lancien `gen_ai.system`. Les métriques GenAI utilisent toujours des attributs sémantiques bornés et de faible cardinalité, quoi quil en soit. |
| `OPENCLAW_OTEL_PRELOADED` | Définissez sur `1` lorsquun autre préchargement ou processus hôte a déjà enregistré le SDK OpenTelemetry global. Le plugin ignore alors son propre cycle de vie NodeSDK, mais connecte tout de même les écouteurs de diagnostic et respecte `traces`/`metrics`/`logs`. |
| Variable | Objectif |
| ----------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
| `OTEL_EXPORTER_OTLP_ENDPOINT` | Remplace `diagnostics.otel.endpoint`. Si la valeur contient déjà `/v1/traces`, `/v1/metrics` ou `/v1/logs`, elle est utilisée telle quelle. |
| `OTEL_EXPORTER_OTLP_TRACES_ENDPOINT` / `OTEL_EXPORTER_OTLP_METRICS_ENDPOINT` / `OTEL_EXPORTER_OTLP_LOGS_ENDPOINT` | Remplacements dendpoint propres au signal, utilisés lorsque la clé de configuration `diagnostics.otel.*Endpoint` correspondante nest pas définie. La configuration propre au signal prime sur lenv propre au signal, qui prime sur lendpoint partagé. |
| `OTEL_SERVICE_NAME` | Remplace `diagnostics.otel.serviceName`. |
| `OTEL_EXPORTER_OTLP_PROTOCOL` | Remplace le protocole de transport (seul `http/protobuf` est pris en compte aujourdhui). |
| `OTEL_SEMCONV_STABILITY_OPT_IN` | Définissez sur `gen_ai_latest_experimental` pour émettre le dernier attribut de span GenAI expérimental (`gen_ai.provider.name`) au lieu de lancien `gen_ai.system`. Les métriques GenAI utilisent toujours des attributs sémantiques bornés et à faible cardinalité. |
| `OPENCLAW_OTEL_PRELOADED` | Définissez sur `1` lorsquun autre préchargement ou processus hôte a déjà enregistré le SDK OpenTelemetry global. Le plugin ignore alors son propre cycle de vie NodeSDK, mais câble tout de même les écouteurs de diagnostic et respecte `traces`/`metrics`/`logs`. |
## Confidentialité et capture du contenu
Le contenu brut des modèles/outils nest **pas** exporté par défaut. Les spans
transportent des identifiants bornés (canal, fournisseur, modèle, catégorie
derreur, identifiants de requête sous forme de hachage uniquement) et
nincluent jamais le texte de prompt, le texte de réponse, les entrées doutil,
les sorties doutil ni les clés de session.
Le contenu brut de modèle/outil nest **pas** exporté par défaut. Les spans transportent des
identifiants bornés (canal, fournisseur, modèle, catégorie derreur, identifiants de requête avec hachage uniquement)
et nincluent jamais le texte du prompt, le texte de réponse, les entrées doutil, les sorties doutil ni
les clés de session.
Les requêtes de modèle sortantes peuvent inclure un en-tête W3C `traceparent`.
Cet en-tête est généré uniquement à partir du contexte de trace de diagnostic
appartenant à OpenClaw pour lappel de modèle actif. Les en-têtes `traceparent`
fournis par lappelant existant sont remplacés, de sorte que les plugins ou les
options de fournisseur personnalisées ne peuvent pas usurper lascendance de
trace entre services.
Les requêtes de modèle sortantes peuvent inclure un en-tête W3C `traceparent`. Cet en-tête est
généré uniquement à partir du contexte de trace de diagnostic appartenant à OpenClaw pour lappel de modèle
actif. Les en-têtes `traceparent` existants fournis par lappelant sont remplacés, de sorte que les plugins ou
options de fournisseur personnalisées ne peuvent pas usurper lascendance de trace interservices.
Définissez `diagnostics.otel.captureContent.*` sur `true` uniquement lorsque
votre collecteur et votre politique de rétention sont approuvés pour le texte de
prompt, de réponse, doutil ou de prompt système. Chaque sous-clé est activée
indépendamment :
Définissez `diagnostics.otel.captureContent.*` sur `true` uniquement lorsque votre collecteur et votre
politique de rétention sont approuvés pour le texte de prompt, de réponse, doutil ou de prompt système.
Chaque sous-clé est optionnelle indépendamment :
- `inputMessages` — contenu de prompt utilisateur.
- `outputMessages` — contenu de réponse du modèle.
- `toolInputs` — charges utiles darguments doutil.
- `toolOutputs` — charges utiles de résultats doutil.
- `inputMessages` — contenu du prompt utilisateur.
- `outputMessages` — contenu de la réponse du modèle.
- `toolInputs` — charges utiles des arguments doutil.
- `toolOutputs` — charges utiles des résultats doutil.
- `systemPrompt` — prompt système/développeur assemblé.
Lorsquune sous-clé est activée, les spans de modèle et doutil reçoivent des
attributs `openclaw.content.*` bornés et expurgés pour cette classe uniquement.
Lorsquune sous-clé est activée, les spans de modèle et doutil reçoivent des attributs
`openclaw.content.*` bornés et expurgés pour cette classe uniquement.
## Échantillonnage et vidage
- **Traces :** `diagnostics.otel.sampleRate` (span racine uniquement, `0.0`
abandonne tout, `1.0` conserve tout).
- **Traces :** `diagnostics.otel.sampleRate` (span racine uniquement, `0.0` supprime tout,
`1.0` conserve tout).
- **Métriques :** `diagnostics.otel.flushIntervalMs` (minimum `1000`).
- **Journaux :** les journaux OTLP respectent `logging.level` (niveau de journal
de fichier). Ils utilisent le chemin dexpurgation des enregistrements de
journal de diagnostic, et non le formatage console. Les installations à volume
élevé devraient préférer léchantillonnage/filtrage du collecteur OTLP à
léchantillonnage local.
- **Corrélation des journaux de fichiers :** les journaux de fichiers JSONL
incluent les champs de niveau supérieur `traceId`, `spanId`, `parentSpanId` et
`traceFlags` lorsque lappel de journal porte un contexte de trace de
diagnostic valide, ce qui permet aux processeurs de journaux de joindre les
lignes de journal locales aux spans exportés.
- **Corrélation des requêtes :** les requêtes HTTP du Gateway et les trames
WebSocket créent une portée de trace de requête interne. Les journaux et les
événements de diagnostic dans cette portée héritent de la trace de requête par
défaut, tandis que les spans dexécution dagent et dappel de modèle sont
créés comme enfants afin que les en-têtes `traceparent` du fournisseur restent
sur la même trace.
- **Journaux :** les journaux OTLP respectent `logging.level` (niveau de journal de fichier). Ils utilisent le
chemin dexpurgation des enregistrements de journal de diagnostic, pas le formatage de la console. Les installations
à fort volume doivent préférer léchantillonnage/filtrage du collecteur OTLP à léchantillonnage local.
- **Corrélation des journaux de fichiers :** les journaux de fichiers JSONL incluent `traceId`,
`spanId`, `parentSpanId` et `traceFlags` au niveau supérieur lorsque lappel de journal contient un contexte de trace
de diagnostic valide, ce qui permet aux processeurs de journaux de joindre les lignes de journal locales aux
spans exportés.
- **Corrélation des requêtes :** les requêtes HTTP du Gateway et les trames WebSocket créent une
portée de trace de requête interne. Les journaux et événements de diagnostic dans cette portée
héritent par défaut de la trace de requête, tandis que les spans dexécution dagent et dappel de modèle sont
créés comme enfants, afin que les en-têtes `traceparent` du fournisseur restent sur la même trace.
## Métriques exportées
### Utilisation des modèles
### Utilisation du modèle
- `openclaw.tokens` (compteur, attrs : `openclaw.token`, `openclaw.channel`, `openclaw.provider`, `openclaw.model`, `openclaw.agent`)
- `openclaw.cost.usd` (compteur, attrs : `openclaw.channel`, `openclaw.provider`, `openclaw.model`)
- `openclaw.run.duration_ms` (histogramme, attrs : `openclaw.channel`, `openclaw.provider`, `openclaw.model`)
- `openclaw.context.tokens` (histogramme, attrs : `openclaw.context`, `openclaw.channel`, `openclaw.provider`, `openclaw.model`)
- `gen_ai.client.token.usage` (histogramme, métrique de conventions sémantiques GenAI, attrs : `gen_ai.token.type` = `input`/`output`, `gen_ai.provider.name`, `gen_ai.operation.name`, `gen_ai.request.model`)
- `gen_ai.client.operation.duration` (histogramme, secondes, métrique de conventions sémantiques GenAI, attrs : `gen_ai.provider.name`, `gen_ai.operation.name`, `gen_ai.request.model`, `error.type` facultatif)
- `openclaw.model_call.duration_ms` (histogramme, attrs : `openclaw.provider`, `openclaw.model`, `openclaw.api`, `openclaw.transport`, plus `openclaw.errorCategory` et `openclaw.failureKind` sur les erreurs classifiées)
- `openclaw.model_call.request_bytes` (histogramme, taille en octets UTF-8 de la charge utile finale de requête de modèle ; aucun contenu brut de charge utile)
- `openclaw.model_call.response_bytes` (histogramme, taille en octets UTF-8 des événements de réponse de modèle diffusés ; aucun contenu brut de réponse)
- `openclaw.model_call.time_to_first_byte_ms` (histogramme, temps écoulé avant le premier événement de réponse diffusé)
- `openclaw.tokens` (counter, attrs: `openclaw.token`, `openclaw.channel`, `openclaw.provider`, `openclaw.model`, `openclaw.agent`)
- `openclaw.cost.usd` (counter, attrs: `openclaw.channel`, `openclaw.provider`, `openclaw.model`)
- `openclaw.run.duration_ms` (histogram, attrs: `openclaw.channel`, `openclaw.provider`, `openclaw.model`)
- `openclaw.context.tokens` (histogram, attrs: `openclaw.context`, `openclaw.channel`, `openclaw.provider`, `openclaw.model`)
- `gen_ai.client.token.usage` (histogram, GenAI semantic-conventions metric, attrs: `gen_ai.token.type` = `input`/`output`, `gen_ai.provider.name`, `gen_ai.operation.name`, `gen_ai.request.model`)
- `gen_ai.client.operation.duration` (histogram, seconds, GenAI semantic-conventions metric, attrs: `gen_ai.provider.name`, `gen_ai.operation.name`, `gen_ai.request.model`, optional `error.type`)
- `openclaw.model_call.duration_ms` (histogram, attrs: `openclaw.provider`, `openclaw.model`, `openclaw.api`, `openclaw.transport`, plus `openclaw.errorCategory` and `openclaw.failureKind` on classified errors)
- `openclaw.model_call.request_bytes` (histogram, taille en octets UTF-8 de la charge utile finale de la requête de modèle ; aucun contenu brut de charge utile)
- `openclaw.model_call.response_bytes` (histogram, taille en octets UTF-8 des événements de réponse de modèle diffusés ; aucun contenu brut de réponse)
- `openclaw.model_call.time_to_first_byte_ms` (histogram, temps écoulé avant le premier événement de réponse diffusé)
### Flux de messages
- `openclaw.webhook.received` (compteur, attrs : `openclaw.channel`, `openclaw.webhook`)
- `openclaw.webhook.error` (compteur, attrs : `openclaw.channel`, `openclaw.webhook`)
- `openclaw.webhook.duration_ms` (histogramme, attrs : `openclaw.channel`, `openclaw.webhook`)
- `openclaw.message.queued` (compteur, attrs : `openclaw.channel`, `openclaw.source`)
- `openclaw.message.processed` (compteur, attrs : `openclaw.channel`, `openclaw.outcome`)
- `openclaw.message.duration_ms` (histogramme, attrs : `openclaw.channel`, `openclaw.outcome`)
- `openclaw.message.delivery.started` (compteur, attrs : `openclaw.channel`, `openclaw.delivery.kind`)
- `openclaw.message.delivery.duration_ms` (histogramme, attrs : `openclaw.channel`, `openclaw.delivery.kind`, `openclaw.outcome`, `openclaw.errorCategory`)
- `openclaw.webhook.received` (counter, attrs: `openclaw.channel`, `openclaw.webhook`)
- `openclaw.webhook.error` (counter, attrs: `openclaw.channel`, `openclaw.webhook`)
- `openclaw.webhook.duration_ms` (histogram, attrs: `openclaw.channel`, `openclaw.webhook`)
- `openclaw.message.queued` (counter, attrs: `openclaw.channel`, `openclaw.source`)
- `openclaw.message.processed` (counter, attrs: `openclaw.channel`, `openclaw.outcome`)
- `openclaw.message.duration_ms` (histogram, attrs: `openclaw.channel`, `openclaw.outcome`)
- `openclaw.message.delivery.started` (counter, attrs: `openclaw.channel`, `openclaw.delivery.kind`)
- `openclaw.message.delivery.duration_ms` (histogram, attrs: `openclaw.channel`, `openclaw.delivery.kind`, `openclaw.outcome`, `openclaw.errorCategory`)
### Files dattente et sessions
- `openclaw.queue.lane.enqueue` (compteur, attrs : `openclaw.lane`)
- `openclaw.queue.lane.dequeue` (compteur, attrs : `openclaw.lane`)
- `openclaw.queue.depth` (histogramme, attrs : `openclaw.lane` ou `openclaw.channel=heartbeat`)
- `openclaw.queue.wait_ms` (histogramme, attrs : `openclaw.lane`)
- `openclaw.session.state` (compteur, attrs : `openclaw.state`, `openclaw.reason`)
- `openclaw.session.stuck` (compteur, attrs : `openclaw.state` ; émis uniquement pour la comptabilité des sessions obsolètes sans travail actif)
- `openclaw.session.stuck_age_ms` (histogramme, attrs : `openclaw.state` ; émis uniquement pour la comptabilité des sessions obsolètes sans travail actif)
- `openclaw.run.attempt` (compteur, attrs : `openclaw.attempt`)
- `openclaw.queue.lane.enqueue` (counter, attrs: `openclaw.lane`)
- `openclaw.queue.lane.dequeue` (counter, attrs: `openclaw.lane`)
- `openclaw.queue.depth` (histogram, attrs: `openclaw.lane` or `openclaw.channel=heartbeat`)
- `openclaw.queue.wait_ms` (histogram, attrs: `openclaw.lane`)
- `openclaw.session.state` (counter, attrs: `openclaw.state`, `openclaw.reason`)
- `openclaw.session.stuck` (counter, attrs: `openclaw.state`; émis uniquement pour la comptabilité des sessions obsolètes sans travail actif)
- `openclaw.session.stuck_age_ms` (histogram, attrs: `openclaw.state`; émis uniquement pour la comptabilité des sessions obsolètes sans travail actif)
- `openclaw.run.attempt` (counter, attrs: `openclaw.attempt`)
### Télémétrie de vivacité des sessions
`diagnostics.stuckSessionWarnMs` est le seuil dâge sans progression pour les
diagnostics de vivacité des sessions. Une session `processing` ne vieillit pas
vers ce seuil tant quOpenClaw observe une progression dexécution de réponse,
doutil, de statut, de bloc ou dACP. Les keepalives de saisie ne sont pas
comptés comme une progression, de sorte quun modèle ou un harnais silencieux
peut tout de même être détecté.
`diagnostics.stuckSessionWarnMs` est le seuil dâge sans progression pour les diagnostics de
vivacité des sessions. Une session `processing` ne vieillit pas vers ce seuil
tant quOpenClaw observe une progression dexécution via réponse, outil, statut, bloc ou ACP.
Les keepalives de saisie ne sont pas comptés comme progression, de sorte quun modèle ou harness silencieux peut
tout de même être détecté.
OpenClaw classe les sessions selon le travail quil peut encore observer :
- `session.long_running` : travaux intégrés actifs, appels de modèle ou appels doutils
toujours en progression.
- `session.stalled` : des travaux actifs existent, mais lexécution active na pas signalé
- `session.long_running` : travail intégré actif, appels au modèle ou appels doutil
encore en progression.
- `session.stalled` : un travail actif existe, mais lexécution active na pas signalé
de progression récente. Les exécutions intégrées bloquées restent dabord en observation seule, puis
passent en arrêt-drain après au moins 10 minutes et 5x `diagnostics.stuckSessionWarnMs`
sans progression, afin que les tours en file dattente derrière la voie puissent reprendre.
- `session.stuck` : comptabilité de session obsolète sans travaux actifs. Cela libère
immédiatement la voie de session affectée.
passent en abandon avec vidage après `diagnostics.stuckSessionAbortMs` sans progression afin que les tours
en file dattente derrière la voie puissent reprendre. Quand la valeur nest pas définie, le seuil dabandon utilise par défaut
la fenêtre étendue plus sûre dau moins 10 minutes et 5x
`diagnostics.stuckSessionWarnMs`.
- `session.stuck` : suivi de session obsolète sans travail actif. Cela libère
immédiatement la voie de session concernée.
La récupération émet des événements structurés `session.recovery.requested` et
`session.recovery.completed`. Létat de session de diagnostic nest marqué comme inactif
quaprès un résultat de récupération modificateur (`aborted` ou `released`) et uniquement si la
même génération de traitement est encore actuelle.
Seul `session.stuck` émet le compteur `openclaw.session.stuck`, lhistogramme
`openclaw.session.stuck_age_ms` et le span `openclaw.session.stuck`.
Les diagnostics `session.stuck` répétés appliquent un backoff tant que la session reste
inchangée ; les tableaux de bord devraient donc alerter sur des augmentations soutenues plutôt quà chaque
tick de Heartbeat. Pour le paramètre de configuration et les valeurs par défaut, consultez
`openclaw.session.stuck_age_ms` et le span `openclaw.session.stuck`. Les diagnostics
`session.stuck` répétés appliquent un délai exponentiel tant que la session reste
inchangée ; les tableaux de bord doivent donc alerter sur des augmentations soutenues plutôt quà chaque
tick de Heartbeat. Pour le réglage de configuration et les valeurs par défaut, consultez
[Référence de configuration](/fr/gateway/configuration-reference#diagnostics).
### Cycle de vie du harnais
- `openclaw.harness.duration_ms` (histogramme, attrs : `openclaw.harness.id`, `openclaw.harness.plugin`, `openclaw.outcome`, `openclaw.harness.phase` en cas derreurs)
### Exec
### Exécution
- `openclaw.exec.duration_ms` (histogramme, attrs : `openclaw.exec.target`, `openclaw.exec.mode`, `openclaw.outcome`, `openclaw.failureKind`)
### Internes de diagnostic (mémoire et boucle doutils)
### Internes de diagnostic (mémoire et boucle doutil)
- `openclaw.memory.heap_used_bytes` (histogramme, attrs : `openclaw.memory.kind`)
- `openclaw.memory.rss_bytes` (histogramme)
@ -280,7 +275,7 @@ tick de Heartbeat. Pour le paramètre de configuration et les valeurs par défau
- `openclaw.provider.request_id_hash` (hachage borné basé sur SHA de lidentifiant de requête du fournisseur amont ; les identifiants bruts ne sont pas exportés)
- `openclaw.harness.run`
- `openclaw.harness.id`, `openclaw.harness.plugin`, `openclaw.outcome`, `openclaw.provider`, `openclaw.model`, `openclaw.channel`
- À la fin : `openclaw.harness.result_classification`, `openclaw.harness.yield_detected`, `openclaw.harness.items.started`, `openclaw.harness.items.completed`, `openclaw.harness.items.active`
- À lachèvement : `openclaw.harness.result_classification`, `openclaw.harness.yield_detected`, `openclaw.harness.items.started`, `openclaw.harness.items.completed`, `openclaw.harness.items.active`
- En cas derreur : `openclaw.harness.phase`, `openclaw.errorCategory`, `openclaw.harness.cleanup_failed` facultatif
- `openclaw.tool.execution`
- `gen_ai.tool.name`, `openclaw.toolName`, `openclaw.errorCategory`, `openclaw.tool.params.*`
@ -297,26 +292,26 @@ tick de Heartbeat. Pour le paramètre de configuration et les valeurs par défau
- `openclaw.session.stuck`
- `openclaw.state`, `openclaw.ageMs`, `openclaw.queueDepth`
- `openclaw.context.assembled`
- `openclaw.prompt.size`, `openclaw.history.size`, `openclaw.context.tokens`, `openclaw.errorCategory` (aucun prompt, historique, réponse ni contenu de clé de session)
- `openclaw.prompt.size`, `openclaw.history.size`, `openclaw.context.tokens`, `openclaw.errorCategory` (aucun contenu dinvite, dhistorique, de réponse ou de clé de session)
- `openclaw.tool.loop`
- `openclaw.toolName`, `openclaw.outcome`, `openclaw.iterations`, `openclaw.errorCategory` (aucun message de boucle, paramètre ni sortie doutil)
- `openclaw.toolName`, `openclaw.outcome`, `openclaw.iterations`, `openclaw.errorCategory` (aucun message de boucle, paramètre ou sortie doutil)
- `openclaw.memory.pressure`
- `openclaw.memory.level`, `openclaw.memory.heap_used_bytes`, `openclaw.memory.rss_bytes`
Lorsque la capture de contenu est explicitement activée, les spans de modèle et doutil peuvent aussi
inclure des attributs `openclaw.content.*` bornés et expurgés pour les classes de
contenu spécifiques auxquelles vous avez souscrit.
inclure des attributs bornés et expurgés `openclaw.content.*` pour les classes de contenu
spécifiques auxquelles vous avez souscrit.
## Catalogue des événements de diagnostic
Les événements ci-dessous alimentent les métriques et les spans ci-dessus. Les Plugins peuvent aussi sy abonner
Les événements ci-dessous alimentent les métriques et spans ci-dessus. Les Plugins peuvent aussi sy abonner
directement sans export OTLP.
**Utilisation du modèle**
- `model.usage` — tokens, coût, durée, contexte, fournisseur/modèle/canal,
identifiants de session. `usage` correspond à la comptabilité fournisseur/tour pour le coût et la télémétrie ;
`context.used` est linstantané courant du prompt/contexte et peut être inférieur au
- `model.usage`jetons, coût, durée, contexte, fournisseur/modèle/canal,
identifiants de session. `usage` est la comptabilisation fournisseur/tour pour le coût et la télémétrie ;
`context.used` est linstantané actuel de linvite/contexte et peut être inférieur à
`usage.total` du fournisseur lorsque des entrées mises en cache ou des appels de boucle doutils sont impliqués.
**Flux de messages**
@ -330,27 +325,26 @@ directement sans export OTLP.
- `queue.lane.enqueue` / `queue.lane.dequeue`
- `session.state` / `session.long_running` / `session.stalled` / `session.stuck`
- `run.attempt` / `run.progress`
- `diagnostic.heartbeat` (compteurs agrégés : Webhooks/file dattente/session)
- `diagnostic.heartbeat` (compteurs agrégés : webhooks/file dattente/session)
**Cycle de vie du harnais**
- `harness.run.started` / `harness.run.completed` / `harness.run.error`
cycle de vie par exécution pour le harnais dagent. Inclut `harnessId`, `pluginId`
facultatif, fournisseur/modèle/canal et identifiant dexécution. La fin ajoute
`durationMs`, `outcome`, `resultClassification` facultatif, `yieldDetected`,
et les décomptes `itemLifecycle`. Les erreurs ajoutent `phase`
cycle de vie par exécution pour le harnais dagent. Inclut `harnessId`, `pluginId` facultatif, fournisseur/modèle/canal et identifiant dexécution. Lachèvement ajoute
`durationMs`, `outcome`, `resultClassification` facultatif, `yieldDetected`
et les compteurs `itemLifecycle`. Les erreurs ajoutent `phase`
(`prepare`/`start`/`send`/`resolve`/`cleanup`), `errorCategory` et
`cleanupFailed` facultatif.
**Exec**
**Exécution**
- `exec.process.completed` — résultat terminal, durée, cible, mode, code de sortie
et type déchec. Le texte de la commande et les répertoires de travail ne sont pas
- `exec.process.completed` — résultat du terminal, durée, cible, mode, code de sortie
et type déchec. Le texte de commande et les répertoires de travail ne sont pas
inclus.
## Sans exportateur
Vous pouvez garder les événements de diagnostic disponibles pour les Plugins ou les collecteurs personnalisés sans
Vous pouvez garder les événements de diagnostic disponibles pour les Plugins ou les récepteurs personnalisés sans
exécuter `diagnostics-otel` :
```json5
@ -359,8 +353,7 @@ exécuter `diagnostics-otel` :
}
```
Pour une sortie de débogage ciblée sans augmenter `logging.level`, utilisez les indicateurs de diagnostic.
Les indicateurs sont insensibles à la casse et prennent en charge les caractères génériques (par exemple `telegram.*` ou
Pour une sortie de débogage ciblée sans augmenter `logging.level`, utilisez les indicateurs de diagnostic. Les indicateurs sont insensibles à la casse et prennent en charge les caractères génériques (par exemple `telegram.*` ou
`*`) :
```json5
@ -369,13 +362,13 @@ Les indicateurs sont insensibles à la casse et prennent en charge les caractèr
}
```
Ou sous forme de surcharge denvironnement ponctuelle :
Ou comme surcharge denvironnement ponctuelle :
```bash
OPENCLAW_DIAGNOSTICS=telegram.http,telegram.payload openclaw gateway
```
La sortie des indicateurs est envoyée au fichier journal standard (`logging.file`) et reste
La sortie des indicateurs va dans le fichier journal standard (`logging.file`) et reste
expurgée par `logging.redactSensitive`. Guide complet :
[Indicateurs de diagnostic](/fr/diagnostics/flags).
@ -392,8 +385,8 @@ Vous pouvez aussi omettre `diagnostics-otel` de `plugins.allow`, ou exécuter
## Connexe
- [Journalisation](/fr/logging) — journaux de fichiers, sortie console, suivi CLI et onglet Logs de linterface Control
- [Journalisation](/fr/logging) — journaux de fichiers, sortie console, suivi CLI et onglet Logs de linterface Control UI
- [Internes de journalisation du Gateway](/fr/gateway/logging) — styles de journaux WS, préfixes de sous-systèmes et capture de console
- [Indicateurs de diagnostic](/fr/diagnostics/flags) — indicateurs de journal de débogage ciblés
- [Export de diagnostic](/fr/gateway/diagnostics) — outil de support bundle pour opérateurs (distinct de lexport OTEL)
- [Indicateurs de diagnostic](/fr/diagnostics/flags) — indicateurs de journal de débogage ciblé
- [Export de diagnostic](/fr/gateway/diagnostics) — outil de bundle de support opérateur (distinct de lexport OTEL)
- [Référence de configuration](/fr/gateway/configuration-reference#diagnostics) — référence complète des champs `diagnostics.*`

View File

@ -2,46 +2,46 @@
read_when:
- Modification du comportement de mise à jour, de doctor, dacceptation des packages ou dinstallation de Plugin dOpenClaw
- Préparer ou approuver une version candidate
- Débogage des régressions de mise à jour de package, de nettoyage des dépendances de Plugin ou dinstallation de Plugin
- Débogage de la mise à jour de packages, du nettoyage des dépendances de Plugin ou des régressions dinstallation de Plugin
sidebarTitle: Update and plugin tests
summary: Comment OpenClaw valide les chemins de mise à jour, les migrations de paquets et le comportement dinstallation/mise à jour des Plugins
title: 'Tests : mises à jour et Plugins'
summary: Comment OpenClaw valide les chemins de mise à jour, les migrations de paquets et le comportement dinstallation/mise à jour du Plugin
title: 'Tests : mises à jour et plugins'
x-i18n:
generated_at: "2026-05-05T01:47:53Z"
generated_at: "2026-05-05T06:17:52Z"
model: gpt-5.5
provider: openai
source_hash: e83a847c76f424199b5fccbd9a2b30d0bf01e4f466c4f9822bf7693d1c2ad286
source_hash: 19ae526d3daa8a1b67cb2f74225138b3e1fa192c9f956c9dd6d0e407581b9ed9
source_path: help/testing-updates-plugins.md
workflow: 16
---
Ceci est la checklist dédiée à la validation des mises à jour et des Plugins. Lobjectif est
simple : prouver que le paquet installable peut mettre à jour un état utilisateur réel, réparer
létat hérité obsolète via `doctor`, et continuer à installer, charger, mettre à jour et désinstaller
des Plugins depuis les sources prises en charge.
Voici la checklist dédiée à la validation des mises à jour et des plugins. Lobjectif est
simple : prouver que le package installable peut mettre à jour un état utilisateur réel,
réparer un état hérité obsolète via `doctor`, et toujours installer, charger, mettre à jour
et désinstaller des plugins depuis les sources prises en charge.
Pour la cartographie plus large de lexécuteur de tests, consultez [Tests](/fr/help/testing). Pour les clés
des fournisseurs live et les suites qui touchent au réseau, consultez [Tests live](/fr/help/testing-live).
Pour la carte plus large du lanceur de tests, consultez [Tests](/fr/help/testing). Pour les
clés de fournisseurs en direct et les suites qui touchent au réseau, consultez [Tests en direct](/fr/help/testing-live).
## Ce que nous protégeons
Les tests de mise à jour et de Plugins protègent ces contrats :
Les tests de mise à jour et de plugins protègent ces contrats :
- Une archive tarball de paquet est complète, possède un `dist/postinstall-inventory.json`
valide, et ne dépend pas de fichiers de dépôt non empaquetés.
- Un utilisateur peut passer dun paquet publié plus ancien au paquet candidat
sans perdre la configuration, les agents, les sessions, les espaces de travail, les listes dautorisation de Plugins, ni
la configuration de canal.
- Une archive tarball de package est complète, possède un `dist/postinstall-inventory.json` valide,
et ne dépend pas de fichiers de dépôt non empaquetés.
- Un utilisateur peut passer dun package publié plus ancien au package candidat
sans perdre la configuration, les agents, les sessions, les espaces de travail, les listes dautorisation de plugins ou
la configuration des canaux.
- `openclaw doctor --fix --non-interactive` possède les chemins de nettoyage et de réparation
hérités. Le démarrage ne doit pas accumuler de migrations de compatibilité cachées pour létat
obsolète des Plugins.
- Les installations de Plugins fonctionnent depuis des répertoires locaux, des dépôts git, des paquets npm et le
chemin du registre ClawHub.
- Les dépendances npm des Plugins sont installées dans la racine npm gérée, analysées avant
confiance, et supprimées via npm pendant la désinstallation afin que les dépendances hissées ne
obsolète des plugins.
- Les installations de plugins fonctionnent depuis des répertoires locaux, des dépôts git, des packages npm et le
chemin de registre ClawHub.
- Les dépendances npm de plugins sont installées dans la racine npm gérée, analysées avant
la confiance, et supprimées via npm pendant la désinstallation afin que les dépendances hissées ne
persistent pas.
- La mise à jour des Plugins est stable quand rien na changé : les enregistrements dinstallation, la source
résolue, lagencement des dépendances installées et létat activé restent intacts.
- La mise à jour des plugins est stable lorsque rien na changé : les enregistrements dinstallation, la source
résolue, lorganisation des dépendances installées et létat activé restent intacts.
## Preuve locale pendant le développement
@ -53,31 +53,31 @@ pnpm check:changed
pnpm test:changed
```
Pour les changements dinstallation, de désinstallation, de dépendances ou dinventaire de paquet de Plugins, exécutez aussi
Pour les changements dinstallation, de désinstallation, de dépendances ou dinventaire de package de plugins, exécutez aussi
les tests ciblés qui couvrent la jonction modifiée :
```bash
pnpm test src/plugins/uninstall.test.ts src/infra/package-dist-inventory.test.ts test/scripts/package-acceptance-workflow.test.ts
```
Avant quune voie Docker de paquet ne consomme une tarball, prouvez lartefact de paquet :
Avant quune lane Docker de package ne consomme une tarball, prouvez lartefact de package :
```bash
pnpm release:check
```
`release:check` exécute les vérifications de dérive configuration/docs/API, écrit linventaire de distribution
du paquet, exécute `npm pack --dry-run`, rejette les fichiers empaquetés interdits, installe
la tarball dans un préfixe temporaire, exécute postinstall, et effectue un smoke test des points dentrée
des canaux groupés.
`release:check` exécute les contrôles de dérive config/docs/API, écrit linventaire dist du package,
exécute `npm pack --dry-run`, rejette les fichiers empaquetés interdits, installe
la tarball dans un préfixe temporaire, exécute postinstall et teste rapidement les points dentrée
des canaux intégrés.
## Voies Docker
## Lanes Docker
Les voies Docker constituent la preuve au niveau produit. Elles installent ou mettent à jour un vrai
paquet dans des conteneurs Linux et valident le comportement via des commandes CLI,
Les lanes Docker sont la preuve au niveau produit. Elles installent ou mettent à jour un vrai
package dans des conteneurs Linux et vérifient le comportement via des commandes CLI,
le démarrage du Gateway, des sondes HTTP, létat RPC et létat du système de fichiers.
Utilisez les voies ciblées pendant litération :
Utilisez les lanes ciblées pendant litération :
```bash
pnpm test:docker:plugins
@ -85,39 +85,44 @@ pnpm test:docker:plugin-lifecycle-matrix
pnpm test:docker:plugin-update
pnpm test:docker:upgrade-survivor
pnpm test:docker:published-upgrade-survivor
pnpm test:docker:update-restart-auth
pnpm test:docker:update-migration
```
Voies importantes :
Lanes importantes :
- `test:docker:plugins` valide le smoke test dinstallation de Plugins, les installations de dossiers locaux,
le comportement de saut de mise à jour des dossiers locaux, les dossiers locaux avec des
dépendances préinstallées, les installations de paquets `file:`, les installations git avec exécution CLI, les mises à jour
de références mobiles git, les installations de registre npm avec dépendances transitives
hissées, les no-ops de mise à jour npm, les installations de fixtures ClawHub locales et les
no-ops de mise à jour, le comportement de mise à jour de la marketplace, ainsi que lactivation/inspection du bundle Claude. Définissez
- `test:docker:plugins` valide le smoke test dinstallation de plugin, les installations de dossiers locaux,
le comportement domission des mises à jour de dossiers locaux, les dossiers locaux avec dépendances
préinstallées, les installations de packages `file:`, les installations git avec exécution CLI, les mises à jour
de refs git mobiles, les installations depuis le registre npm avec dépendances transitives
hissées, les no-op de mise à jour npm, les installations depuis fixture ClawHub locale et les no-op
de mise à jour, le comportement de mise à jour de marketplace, et lactivation/inspection du bundle Claude. Définissez
`OPENCLAW_PLUGINS_E2E_CLAWHUB=0` pour garder le bloc ClawHub hermétique/hors ligne.
- `test:docker:plugin-lifecycle-matrix` installe le paquet candidat dans un conteneur
nu, fait passer un Plugin npm par linstallation, linspection, la désactivation, lactivation,
la mise à niveau explicite, le retour à une version antérieure explicite et la désinstallation après suppression du code du Plugin.
Il journalise les métriques RSS et CPU pour chaque phase.
- `test:docker:plugin-update` valide quun Plugin installé inchangé ne
se réinstalle pas et ne perd pas ses métadonnées dinstallation pendant `openclaw plugins update`.
- `test:docker:plugin-lifecycle-matrix` installe le package candidat dans un conteneur nu,
fait passer un plugin npm par installation, inspection, désactivation, activation,
mise à niveau explicite, rétrogradation explicite et désinstallation après suppression du code
du plugin. Il journalise les métriques RSS et CPU pour chaque phase.
- `test:docker:plugin-update` vérifie quun plugin installé inchangé ne se
réinstalle pas et ne perd pas ses métadonnées dinstallation pendant `openclaw plugins update`.
- `test:docker:upgrade-survivor` installe la tarball candidate par-dessus une fixture
dancien utilisateur sale, exécute la mise à jour du paquet plus un doctor non interactif, puis démarre
un Gateway local loopback et vérifie la préservation de létat.
dancien utilisateur sale, exécute la mise à jour du package plus doctor non interactif, puis démarre
un Gateway loopback et vérifie la préservation de létat.
- `test:docker:published-upgrade-survivor` installe dabord une base publiée,
la configure via une recette `openclaw config set` intégrée, la met à jour vers la
tarball candidate, exécute doctor, vérifie le nettoyage hérité, démarre le Gateway, et
tarball candidate, exécute doctor, vérifie le nettoyage hérité, démarre le Gateway et
sonde `/healthz`, `/readyz` et létat RPC.
- `test:docker:update-migration` est la voie de mise à jour publiée centrée sur le nettoyage. Elle
part dun état utilisateur configuré de style Discord/Telegram, exécute le doctor
de base afin que les dépendances de Plugins configurées aient une chance de se matérialiser, injecte
des débris de dépendances de Plugins hérités pour un Plugin empaqueté configuré, met à jour vers
la tarball candidate, et exige que le doctor post-mise à jour supprime les racines
de dépendances héritées.
- `test:docker:update-restart-auth` installe le package candidat, démarre un
Gateway géré avec auth par jeton, supprime lenv dauth gateway de lappelant pour
`openclaw update --yes --json`, et exige que la commande de mise à jour candidate
redémarre le Gateway avant les sondes normales.
- `test:docker:update-migration` est la lane de mise à jour publiée axée sur le nettoyage. Elle
part dun état utilisateur configuré de style Discord/Telegram, exécute le doctor de base
afin que les dépendances de plugins configurées aient une chance de se matérialiser, ensemence
des débris hérités de dépendances de plugins pour un plugin packagé configuré, met à jour vers
la tarball candidate, et exige que le doctor post-mise à jour supprime les racines de dépendances
héritées.
Variantes utiles du survivor de mise à niveau publiée :
Variantes utiles de published-upgrade survivor :
```bash
OPENCLAW_UPGRADE_SURVIVOR_BASELINE_SPEC=openclaw@2026.4.23 \
@ -132,13 +137,13 @@ pnpm test:docker:published-upgrade-survivor
Les scénarios disponibles sont `base`, `feishu-channel`, `bootstrap-persona`,
`plugin-deps-cleanup`, `configured-plugin-installs`,
`stale-source-plugin-shadow`, `tilde-log-path` et `versioned-runtime-deps`. Dans les exécutions agrégées,
`OPENCLAW_UPGRADE_SURVIVOR_SCENARIOS=reported-issues` sétend à tous les scénarios ayant la forme
dincidents signalés, y compris la migration dinstallation de Plugins configurés.
`OPENCLAW_UPGRADE_SURVIVOR_SCENARIOS=reported-issues` sétend à tous les scénarios
en forme de problèmes signalés, y compris la migration dinstallation de plugins configurés.
La migration complète de mise à jour est intentionnellement séparée de Full Release CI. Utilisez le
workflow manuel `Update Migration` quand la question de release est « chaque
release stable publiée à partir de 2026.4.23 peut-elle se mettre à jour vers ce candidat et
nettoyer les débris de dépendances de Plugins ? » :
La migration complète de mise à jour est intentionnellement séparée de la CI Full Release. Utilisez le
workflow manuel `Update Migration` lorsque la question de release est « chaque
release stable publiée depuis 2026.4.23 peut-elle être mise à jour vers ce candidat et
nettoyer les débris de dépendances de plugins ? » :
```bash
gh workflow run update-migration.yml \
@ -149,53 +154,64 @@ gh workflow run update-migration.yml \
-f scenarios=plugin-deps-cleanup
```
## Acceptation du paquet
## Package Acceptance
Package Acceptance est le garde-fou de paquet natif GitHub. Il résout un paquet
candidat en tarball `package-under-test`, enregistre la version et le SHA-256, puis
exécute des voies Docker E2E réutilisables contre cette tarball exacte. La référence du harnais
de workflow est séparée de la référence source du paquet, afin que la logique de test actuelle puisse valider
danciennes releases fiables.
Package Acceptance est la gate de package native GitHub. Elle résout un package
candidat en une tarball `package-under-test`, enregistre la version et le SHA-256, puis
exécute des lanes Docker E2E réutilisables contre cette tarball exacte. La ref du harnais de workflow
est séparée de la ref source du package, afin que la logique de test actuelle puisse valider
des releases de confiance plus anciennes.
Sources candidates :
- `source=npm` : valider `openclaw@beta`, `openclaw@latest` ou une version
publiée exacte.
- `source=ref` : empaqueter une branche, une balise ou un commit fiable avec le harnais actuel
- `source=ref` : empaqueter une branche, un tag ou un commit de confiance avec le harnais actuel
sélectionné.
- `source=url` : valider une tarball HTTPS avec `package_sha256` obligatoire.
- `source=url` : valider une tarball HTTPS avec `package_sha256` requis.
- `source=artifact` : réutiliser une tarball téléversée par une autre exécution Actions.
Full Release Validation utilise `source=artifact` par défaut, construite depuis le
Full Release Validation utilise `source=artifact` par défaut, construit depuis le
SHA de release résolu. Pour une preuve post-publication, passez
`package_acceptance_package_spec=openclaw@YYYY.M.D` afin que la même matrice de mise à niveau
cible plutôt le paquet npm livré.
cible plutôt le package npm livré.
Les vérifications de release appellent Package Acceptance avec lensemble paquet/mise à jour/Plugin :
Les contrôles de release appellent Package Acceptance avec lensemble package/update/restart/plugin :
```text
doctor-switch update-channel-switch upgrade-survivor published-upgrade-survivor plugins-offline plugin-update
doctor-switch update-channel-switch upgrade-survivor published-upgrade-survivor update-restart-auth plugins-offline plugin-update
```
Elles passent aussi :
Lorsque le soak de release est activé, ils passent aussi :
```text
published_upgrade_survivor_baselines=all-since-2026.4.23
published_upgrade_survivor_baselines=last-stable-4 2026.4.23 2026.5.2 2026.4.15
published_upgrade_survivor_scenarios=reported-issues
telegram_mode=mock-openai
```
Cela garde la migration de paquet, le changement de canal de mise à jour, le nettoyage des dépendances
obsolètes de Plugins, la couverture hors ligne des Plugins, le comportement de mise à jour des Plugins et la QA de paquet
Telegram sur le même artefact résolu.
Cela garde la migration de package, le changement de canal de mise à jour, le nettoyage des dépendances
de plugins obsolètes, la couverture de plugins hors ligne, le comportement de mise à jour de plugins et la QA du package
Telegram sur le même artefact résolu, sans faire parcourir chaque release publiée
à la gate de package de release par défaut.
`all-since-2026.4.23` est léchantillon de mise à niveau Full Release CI : chaque release stable publiée sur npm de `2026.4.23` jusquà `latest`. Pour une couverture exhaustive de migration
de mise à jour publiée, utilisez `all-since-2026.4.23` dans le workflow Update
Migration séparé au lieu de Full Release CI. `release-history` reste
disponible pour un échantillonnage manuel plus large quand vous voulez aussi lancre héritée
`last-stable-4` se résout aux quatre dernières releases OpenClaw stables publiées sur npm.
Lacceptation du package de release épingle `2026.4.23` comme première limite de compatibilité
de mise à jour des plugins, `2026.5.2` comme limite de turbulence darchitecture de plugins, et
`2026.4.15` comme base de mise à jour publiée 2026.4.1x plus ancienne ; le résolveur
déduplique les épingles déjà présentes dans les quatre dernières. Pour une couverture exhaustive de migration de
mise à jour publiée, utilisez `all-since-2026.4.23` dans le workflow Update Migration
séparé au lieu de la CI Full Release. `release-history` reste
disponible pour un échantillonnage manuel plus large lorsque vous voulez aussi lancre héritée
antérieure à la date.
Exécutez manuellement un profil de paquet lors de la validation dun candidat avant release :
Lorsque plusieurs bases published-upgrade survivor sont sélectionnées, le workflow Docker
réutilisable répartit chaque base dans son propre job de runner ciblé. Chaque
fragment de base exécute toujours lensemble de scénarios sélectionné, mais les journaux et artefacts restent
par base et le temps total est borné par le fragment le plus lent au lieu dun gros
job sériel.
Exécutez manuellement un profil de package lors de la validation dun candidat avant release :
```bash
gh workflow run package-acceptance.yml \
@ -204,73 +220,77 @@ gh workflow run package-acceptance.yml \
-f source=npm \
-f package_spec=openclaw@beta \
-f suite_profile=package \
-f published_upgrade_survivor_baselines=all-since-2026.4.23 \
-f published_upgrade_survivor_baselines="last-stable-4 2026.4.23 2026.5.2 2026.4.15" \
-f published_upgrade_survivor_scenarios=reported-issues \
-f telegram_mode=mock-openai
```
Utilisez `suite_profile=product` quand la question de release inclut les canaux MCP,
Utilisez `suite_profile=product` lorsque la question de release inclut les canaux MCP,
le nettoyage cron/sous-agent, la recherche web OpenAI ou OpenWebUI. Utilisez `suite_profile=full`
uniquement quand vous avez besoin dune couverture Docker complète du chemin de release.
uniquement lorsque vous avez besoin dune couverture Docker complète du chemin de release.
## Valeur par défaut de release
Pour les candidats de release, la pile de preuves par défaut est :
Pour les candidats de release, la pile de preuve par défaut est :
1. `pnpm check:changed` et `pnpm test:changed` pour les régressions au niveau source.
2. `pnpm release:check` pour lintégrité de lartefact de paquet.
3. Le profil `package` de Package Acceptance ou les voies de paquet personnalisées de release-check
pour les contrats dinstallation/mise à jour/Plugin.
4. Les vérifications de release multi-OS pour le comportement propre aux installateurs, à lonboarding et à la plateforme.
5. Les suites live uniquement lorsque la surface modifiée touche au comportement dun fournisseur ou dun service hébergé.
2. `pnpm release:check` pour lintégrité de lartefact de package.
3. Le profil `package` de Package Acceptance ou les lanes de package personnalisées des contrôles de release
pour les contrats dinstallation/mise à jour/redémarrage/plugin.
4. Les contrôles de release inter-OS pour le comportement spécifique à lOS de linstallateur,
de lonboarding et de la plateforme.
5. Les suites live uniquement lorsque la surface modifiée touche au comportement dun fournisseur ou dun service
hébergé.
Sur les machines des mainteneurs, les grands garde-fous et les preuves produit Docker/paquet doivent sexécuter
dans Testbox, sauf en cas de preuve locale explicite.
Sur les machines de mainteneurs, les gates larges et la preuve produit Docker/package doivent sexécuter
dans Testbox sauf en cas de preuve locale explicite.
## Compatibilité héritée
La tolérance de compatibilité est étroite et limitée dans le temps :
- Les paquets jusquà `2026.4.25`, y compris `2026.4.25-beta.*`, peuvent tolérer
les lacunes de métadonnées de paquet déjà livrées dans Package Acceptance.
- Le paquet publié `2026.4.26` peut 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 lacunes échouent au lieu
davertir ou de sauter.
- Les packages jusquà `2026.4.25`, y compris `2026.4.25-beta.*`, peuvent tolérer
les lacunes de métadonnées de package déjà livrées dans Package Acceptance.
- Le package publié `2026.4.26` peut avertir pour les fichiers dhorodatage de métadonnées
de build local déjà livrés.
- Les packages ultérieurs doivent satisfaire les contrats modernes. Les mêmes lacunes échouent au lieu
davertir ou de passer.
Najoutez pas de nouvelles migrations au démarrage pour ces anciennes formes. Ajoutez ou étendez une réparation
doctor, puis prouvez-la avec `upgrade-survivor` ou `published-upgrade-survivor`.
doctor, puis prouvez-la avec `upgrade-survivor`, `published-upgrade-survivor` ou
`update-restart-auth` lorsque la commande de mise à jour possède le redémarrage.
## Ajouter de la couverture
Lorsque vous modifiez le comportement de mise à jour ou de Plugin, ajoutez une couverture à la couche la plus basse qui
Lorsque vous changez le comportement de mise à jour ou de plugins, ajoutez de la couverture à la couche la plus basse qui
peut échouer pour la bonne raison :
- Logique pure de chemin ou de métadonnées : test unitaire à côté de la source.
- Inventaire de paquet ou comportement de fichiers empaquetés : test `package-dist-inventory` ou
vérificateur de tarball.
- Comportement CLI dinstallation/mise à jour : assertion ou fixture de voie Docker.
- Comportement dinventaire de package ou de fichiers empaquetés : `package-dist-inventory` ou test de vérificateur
de tarball.
- Comportement CLI dinstallation/mise à jour : assertion ou fixture de lane Docker.
- Comportement de migration de release publiée : scénario `published-upgrade-survivor`.
- Comportement de registre/source de paquet : fixture `test:docker:plugins` ou serveur de fixture ClawHub.
- Comportement dagencement ou de nettoyage des dépendances : affirmer à la fois lexécution runtime et la
frontière du système de fichiers. Les dépendances npm peuvent être hissées sous la racine npm
gérée ; les tests doivent donc prouver que la racine est analysée/nettoyée au lieu de supposer une
arborescence `node_modules` locale au paquet.
- Comportement de redémarrage possédé par la mise à jour : `update-restart-auth`.
- Comportement de source registre/package : fixture `test:docker:plugins` ou serveur de fixture ClawHub.
- Comportement dorganisation ou de nettoyage des dépendances : vérifiez à la fois lexécution runtime et la
limite du système de fichiers. Les dépendances npm peuvent être hissées sous la racine npm
gérée, les tests doivent donc prouver que la racine est analysée/nettoyée au lieu de supposer une
arborescence `node_modules` locale au package.
Gardez les nouvelles fixtures Docker hermétiques par défaut. Utilisez des registres de fixtures locaux et
de faux paquets, sauf si le but du test est le comportement du registre live.
de faux packages, sauf si lobjectif du test est le comportement dun registre live.
## Triage des échecs
Commencez par lidentité de lartefact :
- Résumé `resolve_package` de Package Acceptance : source, version, SHA-256 et
- Résumé `resolve_package` de lacceptation du paquet : source, version, SHA-256 et
nom de lartefact.
- Artefacts Docker : `.artifacts/docker-tests/**/summary.json`,
`failures.json`, journaux de voie et commandes de réexécution.
- Résumé upgrade survivor : `.artifacts/upgrade-survivor/summary.json`,
incluant la version de base, la version candidate, le scénario, les timings de phase et
les étapes de recette.
`failures.json`, journaux de voie dexécution et commandes de relance.
- Résumé des éléments survivants à la mise à niveau : `.artifacts/upgrade-survivor/summary.json`,
comprenant la version de référence, la version candidate, le scénario, les durées
des phases et les étapes de la recette.
Préférez relancer la voie exacte échouée avec le même artefact de paquet plutôt que
relancer tout le parapluie de release.
Préférez relancer la voie dexécution exacte qui a échoué avec le même artefact
de paquet plutôt que relancer toute lombrelle de publication.

File diff suppressed because it is too large Load Diff

View File

@ -1,78 +1,78 @@
---
read_when:
- Installer OpenClaw sur Windows
- Installation dOpenClaw sur Windows
- Choisir entre Windows natif et WSL2
- À la recherche du statut de lapp compagnon Windows
summary: 'Prise en charge de Windows : parcours dinstallation natifs et WSL2, daemon et limites actuelles'
- Recherche de létat de lapplication compagnon pour Windows
summary: 'Prise en charge de Windows : parcours dinstallation natif et WSL2, démon et limitations actuelles'
title: Windows
x-i18n:
generated_at: "2026-04-24T07:21:51Z"
model: gpt-5.4
generated_at: "2026-05-05T06:17:58Z"
model: gpt-5.5
provider: openai
source_hash: dc147a9da97ab911ba7529c2170526c50c86711efe6fdf4854e6e0370e4d64ea
source_hash: adf885747e3a897cb4ee57f6494805468d38c4595c0ab7582b063153a1134d18
source_path: platforms/windows.md
workflow: 15
workflow: 16
---
OpenClaw prend en charge à la fois **Windows natif** et **WSL2**. WSL2 est la voie la plus
stable et recommandée pour lexpérience complète — la CLI, le Gateway et
OpenClaw prend en charge à la fois **Windows natif** et **WSL2**. WSL2 est le chemin le plus
stable et recommandé pour lexpérience complète : la CLI, le Gateway et
loutillage sexécutent dans Linux avec une compatibilité totale. Windows natif fonctionne pour
lusage principal de la CLI et du Gateway, avec certaines limites indiquées ci-dessous.
lutilisation de base de la CLI et du Gateway, avec certaines réserves indiquées ci-dessous.
Des apps compagnons natives pour Windows sont prévues.
Les applications compagnon Windows natives sont prévues.
## WSL2 (recommandé)
- [Premiers pas](/fr/start/getting-started) (à utiliser dans WSL)
- [Installation et mises à jour](/fr/install/updating)
- Guide officiel WSL2 (Microsoft) : [https://learn.microsoft.com/windows/wsl/install](https://learn.microsoft.com/windows/wsl/install)
- Guide officiel de WSL2 (Microsoft) : [https://learn.microsoft.com/windows/wsl/install](https://learn.microsoft.com/windows/wsl/install)
## Statut de Windows natif
## État de Windows natif
Les flux CLI natifs Windows saméliorent, mais WSL2 reste la voie recommandée.
Les flux CLI Windows natifs saméliorent, mais WSL2 reste le chemin recommandé.
Ce qui fonctionne bien sur Windows natif aujourdhui :
- installateur du site via `install.ps1`
- usage local de la CLI comme `openclaw --version`, `openclaw doctor`, et `openclaw plugins list --json`
- smoke embarqué local-agent/provider tel que :
- programme dinstallation du site web via `install.ps1`
- utilisation locale de la CLI, comme `openclaw --version`, `openclaw doctor` et `openclaw plugins list --json`
- test de validation rapide de lagent/fournisseur local intégré, comme :
```powershell
openclaw agent --local --agent main --thinking low -m "Reply with exactly WINDOWS-HATCH-OK."
```
Limites actuelles :
Réserves actuelles :
- `openclaw onboard --non-interactive` attend toujours un gateway local joignable sauf si vous passez `--skip-health`
- `openclaw onboard --non-interactive --install-daemon` et `openclaw gateway install` tentent dabord les tâches planifiées Windows
- si la création de tâche planifiée est refusée, OpenClaw revient à un élément de connexion du dossier Startup par utilisateur et démarre immédiatement le gateway
- si `schtasks` lui-même se bloque ou cesse de répondre, OpenClaw abandonne désormais rapidement ce chemin et revient au repli au lieu de rester bloqué indéfiniment
- les tâches planifiées restent préférées lorsquelles sont disponibles car elles fournissent un meilleur état du superviseur
- `openclaw onboard --non-interactive` attend toujours un Gateway local accessible, sauf si vous passez `--skip-health`
- `openclaw onboard --non-interactive --install-daemon` et `openclaw gateway install` essaient dabord les tâches planifiées Windows
- si la création de tâche planifiée est refusée, OpenClaw se rabat sur un élément de connexion par utilisateur dans le dossier de démarrage et démarre immédiatement le Gateway
- si `schtasks` lui-même se bloque ou cesse de répondre, OpenClaw abandonne désormais rapidement ce chemin et se rabat au lieu de rester suspendu indéfiniment
- les tâches planifiées restent privilégiées lorsquelles sont disponibles, car elles fournissent un meilleur état de supervision
Si vous voulez uniquement la CLI native, sans installation du service gateway, utilisez lune de ces commandes :
Si vous voulez uniquement la CLI native, sans installation du service Gateway, utilisez lune de ces commandes :
```powershell
openclaw onboard --non-interactive --skip-health
openclaw gateway run
```
Si vous voulez un démarrage géré sur Windows natif :
Si vous voulez bien un démarrage géré sur Windows natif :
```powershell
openclaw gateway install
openclaw gateway status --json
```
Si la création de tâche planifiée est bloquée, le mode de service de repli démarre quand même automatiquement après connexion via le dossier Startup de lutilisateur courant.
Si la création de tâche planifiée est bloquée, le mode de service de secours démarre tout de même automatiquement après la connexion via le dossier de démarrage de lutilisateur actuel.
## Gateway
- [Guide dexploitation du Gateway](/fr/gateway)
- [Runbook Gateway](/fr/gateway)
- [Configuration](/fr/gateway/configuration)
## Installation du service Gateway (CLI)
À lintérieur de WSL2 :
Dans WSL2 :
```
openclaw onboard --install-daemon
@ -90,7 +90,7 @@ Ou :
openclaw configure
```
Sélectionnez **Gateway service** lorsque cela vous est demandé.
Sélectionnez **Service Gateway** lorsque linvite saffiche.
Réparer/migrer :
@ -98,11 +98,12 @@ Réparer/migrer :
openclaw doctor
```
## Démarrage automatique du Gateway avant connexion Windows
## Démarrage automatique du Gateway avant la connexion Windows
Pour les configurations headless, assurez-vous que toute la chaîne de démarrage sexécute même si personne ne se connecte à Windows.
Pour les configurations sans interface, assurez-vous que toute la chaîne de démarrage sexécute même lorsque personne ne se connecte à
Windows.
### 1) Garder les services utilisateur actifs sans connexion
### 1) Maintenir les services utilisateur en cours dexécution sans connexion
Dans WSL :
@ -110,7 +111,7 @@ Dans WSL :
sudo loginctl enable-linger "$(whoami)"
```
### 2) Installer le service utilisateur Gateway OpenClaw
### 2) Installer le service utilisateur du Gateway OpenClaw
Dans WSL :
@ -118,7 +119,7 @@ Dans WSL :
openclaw gateway install
```
### 3) Démarrer WSL automatiquement au boot Windows
### 3) Démarrer WSL automatiquement au démarrage de Windows
Dans PowerShell en tant quadministrateur :
@ -145,7 +146,7 @@ systemctl --user status openclaw-gateway.service --no-pager
WSL possède son propre réseau virtuel. Si une autre machine doit atteindre un service
sexécutant **dans WSL** (SSH, un serveur TTS local ou le Gateway), vous devez
transférer un port Windows vers lIP WSL courante. LIP WSL change après les redémarrages,
transférer un port Windows vers lIP WSL actuelle. LIP WSL change après les redémarrages,
vous devrez donc peut-être actualiser la règle de transfert.
Exemple (PowerShell **en tant quadministrateur**) :
@ -169,7 +170,7 @@ New-NetFirewallRule -DisplayName "WSL SSH $ListenPort" -Direction Inbound `
-Protocol TCP -LocalPort $ListenPort -Action Allow
```
Actualisez le portproxy après le redémarrage de WSL :
Actualisez le portproxy après les redémarrages de WSL :
```powershell
netsh interface portproxy delete v4tov4 listenport=$ListenPort listenaddress=0.0.0.0 | Out-Null
@ -177,31 +178,31 @@ netsh interface portproxy add v4tov4 listenport=$ListenPort listenaddress=0.0.0.
connectaddress=$WslIp connectport=$TargetPort | Out-Null
```
Remarques :
Notes :
- Le SSH depuis une autre machine cible l**IP de lhôte Windows** (exemple : `ssh user@windows-host -p 2222`).
- Les nodes distants doivent pointer vers une URL Gateway **joignable** (pas `127.0.0.1`) ; utilisez
- SSH depuis une autre machine cible l**IP de lhôte Windows** (exemple : `ssh user@windows-host -p 2222`).
- Les nœuds distants doivent pointer vers une URL de Gateway **accessible** (pas `127.0.0.1`) ; utilisez
`openclaw status --all` pour confirmer.
- Utilisez `listenaddress=0.0.0.0` pour laccès LAN ; `127.0.0.1` le garde local uniquement.
- Si vous voulez automatiser cela, enregistrez une tâche planifiée pour exécuter létape
- Utilisez `listenaddress=0.0.0.0` pour laccès LAN ; `127.0.0.1` le garde uniquement local.
- Si vous voulez que cela soit automatique, enregistrez une tâche planifiée pour exécuter létape
dactualisation à la connexion.
## Installation WSL2 étape par étape
### 1) Installer WSL2 + Ubuntu
Ouvrez PowerShell (Admin) :
Ouvrez PowerShell (administrateur) :
```powershell
wsl --install
# Ou choisissez explicitement une distribution :
# Or pick a distro explicitly:
wsl --list --online
wsl --install -d Ubuntu-24.04
```
Redémarrez si Windows le demande.
### 2) Activer systemd (requis pour linstallation du gateway)
### 2) Activer systemd (requis pour linstallation du Gateway)
Dans votre terminal WSL :
@ -212,7 +213,7 @@ systemd=true
EOF
```
Puis, depuis PowerShell :
Puis depuis PowerShell :
```powershell
wsl --shutdown
@ -226,7 +227,7 @@ systemctl --user status
### 3) Installer OpenClaw (dans WSL)
Pour une configuration normale initiale dans WSL, suivez le flux Linux Premiers pas :
Pour une configuration initiale normale dans WSL, suivez le flux Linux Premiers pas :
```bash
git clone https://github.com/openclaw/openclaw.git
@ -237,24 +238,56 @@ pnpm ui:build
pnpm openclaw onboard --install-daemon
```
Si vous développez depuis les sources au lieu de faire un onboarding initial, utilisez la
boucle de développement source de [Setup](/fr/start/setup) :
Si vous développez depuis les sources au lieu deffectuer une configuration initiale, utilisez la
boucle de développement source de [Configuration](/fr/start/setup) :
```bash
pnpm install
# Premier lancement uniquement (ou après réinitialisation de la config/de lespace de travail OpenClaw locaux)
# First run only (or after resetting local OpenClaw config/workspace)
pnpm openclaw setup
pnpm gateway:watch
```
Guide complet : [Premiers pas](/fr/start/getting-started)
## App compagnon Windows
## Application compagnon Windows
Nous navons pas encore dapp compagnon Windows. Les contributions sont les bienvenues si vous voulez
aider à la rendre possible.
Nous navons pas encore dapplication compagnon Windows. Les contributions sont les bienvenues si vous voulez
aider à la concrétiser.
## Articles connexes
## Connectivité Git et GitHub (contributeurs)
Certains réseaux bloquent ou limitent HTTPS vers GitHub. Si `git clone` échoue avec des délais dattente
ou des réinitialisations de connexion, essayez un autre réseau, un VPN ou un proxy HTTP/HTTPS fourni par votre
organisation.
Si `gh auth login` échoue pendant le flux dappareil du navigateur (par exemple avec un délai dattente
pour atteindre `github.com:443`), authentifiez-vous plutôt avec un jeton daccès personnel :
1. Créez un jeton avec au moins la portée `repo` (PAT classique) ou un accès
finement granulaire équivalent.
2. Dans PowerShell pour la session actuelle :
```powershell
$env:GH_TOKEN="<your-token>"
gh auth status
gh auth setup-git
```
3. Si `gh auth status` avertit que `read:org` est manquant, créez un jeton qui inclut
cette portée et réaffectez la variable :
```powershell
$env:GH_TOKEN="<your-token-with-repo-and-read:org>"
gh auth status
```
`gh auth refresh -s read:org` sapplique uniquement lorsque vous vous êtes authentifié via `gh auth login`
et que vous avez des identifiants stockés à actualiser (pas lorsque vous utilisez `GH_TOKEN`).
Ne commettez jamais de jetons et ne les collez jamais dans des issues ou des pull requests.
## Connexe
- [Vue densemble de linstallation](/fr/install)
- [Plateformes](/fr/platforms)

View File

@ -1,13 +1,13 @@
---
read_when:
- Vous installez, configurez ou auditez le plugin WhatsApp
summary: Ajoute linterface du canal WhatsApp pour envoyer et recevoir des messages OpenClaw.
- Vous installez, configurez ou auditez le Plugin WhatsApp
summary: Ajoute la surface de canal WhatsApp pour envoyer et recevoir des messages OpenClaw.
title: Plugin WhatsApp
x-i18n:
generated_at: "2026-05-03T07:14:37Z"
generated_at: "2026-05-05T06:18:18Z"
model: gpt-5.5
provider: openai
source_hash: 3ff038ce3afd0285e5cfca9ca1b0e89deed582cff4f2e9c257f29a4848f397fa
source_hash: a0fa274f7e937894a070abd9307aa12eed17b27275bc7e5cfc432f8a41373c54
source_path: plugins/reference/whatsapp.md
workflow: 16
---
@ -19,11 +19,21 @@ Ajoute la surface de canal WhatsApp pour lenvoi et la réception de messages
## Distribution
- Paquet : `@openclaw/whatsapp`
- Méthode dinstallation : npm ; ClawHub
- Mode dinstallation : npm ; ClawHub
## Surface
canaux : whatsapp
channels: whatsapp
## Note dinstallation sous Windows
Sous Windows, le Plugin WhatsApp a besoin que Git soit dans le `PATH` pendant linstallation npm, car lune de ses dépendances Baileys/libsignal est récupérée depuis une URL git. Installez Git for Windows, puis redémarrez le shell et relancez linstallation :
```powershell
winget install --id Git.Git -e
```
Portable Git fonctionne également si son répertoire `bin` est dans le `PATH`.
## Documentation associée

View File

@ -1,50 +1,50 @@
---
read_when:
- Recherche des définitions des canaux de publication publics
- Exécution de la validation de publication ou de lacceptation de paquet
- 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
- Exécution de la validation de version ou de lacceptation de package
- Recherche des conventions de nommage des versions et de la cadence
summary: Voies de publication, liste de contrôle opérateur, boîtes de validation, nommage des versions et cadence
title: Politique de publication
x-i18n:
generated_at: "2026-05-05T01:49:23Z"
generated_at: "2026-05-05T06:18:55Z"
model: gpt-5.5
provider: openai
source_hash: 41886d3bb2f970e6a86944e5ff207b1b29b1b64b1f234d45f626fed19cf032b3
source_hash: 9980265c30c6a6571db5512749ec173cca79ac70494fd09968add793be9717a5
source_path: reference/RELEASING.md
workflow: 16
---
OpenClaw comporte trois canaux de publication publics :
OpenClaw comporte trois canaux publics de publication :
- stable : publications étiquetées publiées sur npm `beta` par défaut, ou sur npm `latest` lorsquelles sont explicitement demandées
- beta : étiquettes de prépublication publiées sur npm `beta`
- dev : la tête mobile de `main`
- stable : publications étiquetées qui publient vers npm `beta` par défaut, ou vers npm `latest` lorsque cela est explicitement demandé
- beta : tags de préversion qui publient vers npm `beta`
- dev : tête mouvante de `main`
## Nommage des versions
- Version de publication stable : `YYYY.M.D`
- Étiquette Git : `vYYYY.M.D`
- Version de publication corrective stable : `YYYY.M.D-N`
- Étiquette Git : `vYYYY.M.D-N`
- Version de prépublication beta : `YYYY.M.D-beta.N`
- Étiquette Git : `vYYYY.M.D-beta.N`
- Ne mettez pas de zéro initial au mois ni au jour
- Tag Git : `vYYYY.M.D`
- Version de correction stable : `YYYY.M.D-N`
- Tag Git : `vYYYY.M.D-N`
- Version de préversion bêta : `YYYY.M.D-beta.N`
- Tag Git : `vYYYY.M.D-beta.N`
- Ne pas ajouter de zéro initial au mois ni au jour
- `latest` désigne la publication npm stable actuellement promue
- `beta` désigne la cible dinstallation beta 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 plus tard une build beta validée
- `beta` désigne la cible actuelle dinstallation bêta
- Les publications stables et les publications de correction stables publient vers npm `beta` par défaut ; les opérateurs de publication peuvent cibler explicitement `latest`, ou promouvoir ultérieurement une version bêta validée
- Chaque publication stable dOpenClaw livre ensemble le package npm et lapplication macOS ;
les publications beta valident et publient normalement dabord le chemin npm/package, avec
la build/signature/notarisation de lapp Mac réservée au stable sauf demande explicite
les publications bêta valident et publient normalement dabord le chemin npm/package, la
compilation/signature/notarisation de lapplication Mac étant réservée aux versions stables sauf demande explicite
## Cadence de publication
- Les publications avancent dabord par la beta
- Le stable ne suit quaprès validation de la dernière beta
- Les mainteneurs découpent normalement les publications depuis une branche `release/YYYY.M.D` créée
depuis le `main` courant, afin que la validation et les correctifs de publication ne bloquent pas le nouveau
- Les publications passent dabord par la bêta
- La version 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 du `main` actuel, afin que la validation de publication et les correctifs ne bloquent pas le nouveau
développement sur `main`
- Si une étiquette beta a été poussée ou publiée et nécessite un correctif, les mainteneurs découpent
létiquette `-beta.N` suivante au lieu de supprimer ou recréer lancienne étiquette beta
- Si un tag bêta a été poussé ou publié et nécessite un correctif, les mainteneurs créent
le tag `-beta.N` suivant au lieu de supprimer ou recréer lancien tag bêta
- 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
@ -54,130 +54,235 @@ Cette liste de contrôle décrit la forme publique du flux de publication. Les i
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.
1. Partez du `main` courant : récupérez les dernières modifications, confirmez que le commit cible est poussé,
et confirmez que la CI actuelle de `main` est suffisamment verte pour créer une branche depuis celui-ci.
2. Réécrivez la section supérieure de `CHANGELOG.md` depuis lhistorique réel des commits avec
`/changelog`, gardez des entrées orientées utilisateur, commitez-la, poussez-la, puis rebasez/récupérez
1. Partir du `main` actuel : récupérer la dernière version, confirmer que le commit cible est poussé,
et confirmer que la CI actuelle de `main` est suffisamment verte pour créer une branche à partir de celui-ci.
2. Réécrire la section supérieure de `CHANGELOG.md` à partir de lhistorique réel des commits avec
`/changelog`, garder les entrées orientées utilisateur, la committer, la pousser, puis rebaser/récupérer
une fois de plus avant de créer la branche.
3. Passez en revue les enregistrements de compatibilité de publication dans
3. Examiner les enregistrements de compatibilité de publication dans
`src/plugins/compat/registry.ts` et
`src/commands/doctor/shared/deprecation-compat.ts`. Supprimez la compatibilité expirée
uniquement lorsque le chemin de mise à niveau reste couvert, ou consignez pourquoi elle est
intentionnellement conservée.
4. Créez `release/YYYY.M.D` depuis le `main` courant ; neffectuez pas le travail normal de publication
`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
volontairement conservée.
4. Créer `release/YYYY.M.D` depuis le `main` actuel ; ne pas effectuer le travail normal de publication
directement sur `main`.
5. Incrémentez chaque emplacement de version requis pour létiquette prévue, exécutez
5. Incrémenter chaque emplacement de version requis pour le tag prévu, exécuter
`pnpm plugins:sync` afin que les packages Plugin publiables partagent la version de publication
et les métadonnées de compatibilité, puis exécutez le prévol déterministe local :
et les métadonnées de compatibilité, puis exécuter le prévol déterministe local :
`pnpm check:test-types`, `pnpm check:architecture`,
`pnpm build && pnpm ui:build`, `pnpm plugins:sync:check`, et
`pnpm release:check`.
6. Exécutez `OpenClaw NPM Release` avec `preflight_only=true`. Avant quune étiquette existe,
un SHA complet de branche de publication à 40 caractères est autorisé pour un prévol
de validation uniquement. Enregistrez le `preflight_run_id` réussi.
7. Lancez tous les tests de prépublication avec `Full Release Validation` pour la
branche de publication, létiquette ou le SHA complet du commit. Cest le seul point dentrée manuel
6. Exécuter `OpenClaw NPM Release` avec `preflight_only=true`. Avant quun tag existe,
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.
7. Lancer tous les tests de prépublication avec `Full Release Validation` pour la
branche de publication, le tag ou le SHA complet du commit. Cest le seul point dentrée manuel
pour les quatre grandes boîtes de test de publication : Vitest, Docker, QA Lab et Package.
8. Si la validation échoue, corrigez sur la branche de publication et relancez le plus petit
fichier, canal, job de workflow, profil de package, fournisseur ou allowlist de modèles ayant échoué qui
prouve le correctif. Ne relancez lensemble complet que lorsque la surface modifiée rend
8. Si la validation échoue, corriger sur la branche de publication et relancer le plus petit
fichier, canal, job de workflow, profil de package, fournisseur ou liste dautorisation de modèles en échec qui
prouve le correctif. Relancer lensemble complet uniquement lorsque la surface modifiée rend
les preuves précédentes obsolètes.
9. Pour beta, étiquetez `vYYYY.M.D-beta.N`, puis exécutez `OpenClaw Release Publish` depuis
9. Pour la bêta, taguer `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 packages 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 la publication,
exécutez lacceptation de package post-publication
publie dabord tous les packages Plugin publiables vers npm, publie ensuite le même
ensemble vers ClawHub sous forme de tarballs ClawPack npm-pack, puis promeut
lartifact de prévol npm OpenClaw préparé avec le dist-tag correspondant. Après
publication, exécuter lacceptation de package post-publication
contre le package publié `openclaw@YYYY.M.D-beta.N` ou
`openclaw@beta`. Si une prépublication poussée ou publiée nécessite un correctif,
découpez le numéro de prépublication correspondant suivant ; ne supprimez pas et ne réécrivez pas lancienne
prépublication.
10. Pour stable, continuez uniquement après que la beta validée ou la release 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 exige aussi les
`.zip`, `.dmg`, `.dSYM.zip` packagés, ainsi que `appcast.xml` mis à jour sur `main`.
11. Après la publication, exécutez le vérificateur npm post-publication, lE2E Telegram npm publié
autonome optionnel 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 `CHANGELOG.md` correspondante complète, et les étapes dannonce de publication.
`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 version stable, continuer uniquement après que la bêta validée ou la release candidate dispose des
preuves de validation requises. La publication npm stable passe également par
`OpenClaw Release Publish`, en réutilisant lartifact de prévol réussi via
`preflight_run_id` ; létat prêt pour la publication macOS stable exige également les
fichiers empaquetés `.zip`, `.dmg`, `.dSYM.zip`, et le fichier `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 des dist-tags si nécessaire, les notes de publication/préversion GitHub à partir de la
section complète correspondante de `CHANGELOG.md`, et les étapes dannonce de publication.
## Prévol de publication
- Exécutez `pnpm check:test-types` avant le contrôle préliminaire de publication afin que le TypeScript des tests reste couvert en dehors de la porte locale plus rapide `pnpm check`
- Exécutez `pnpm check:architecture` avant le contrôle préliminaire de publication afin que les vérifications plus larges des cycles dimportation et des limites darchitecture soient au vert en dehors de la porte locale plus rapide
- Exécutez `pnpm build && pnpm ui:build` avant `pnpm release:check` afin que les artefacts de publication attendus `dist/*` et le bundle de linterface utilisateur de contrôle existent pour létape de validation du paquet
- Exécutez `pnpm plugins:sync` après laugmentation de version racine et avant le marquage. Il met à jour les versions des packages de plugins publiables, les métadonnées de compatibilité pair/API OpenClaw, les métadonnées de build et les ébauches de journaux des modifications des plugins afin quils correspondent à la version de publication du cœur. `pnpm plugins:sync:check` est la garde de publication 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 la publication pour lancer toutes les boîtes de test de prépublication depuis un seul point dentrée. Il accepte une branche, une étiquette 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 vérifications de package multiplateformes, la parité QA Lab, Matrix et les voies Telegram. Les exécutions stables/par défaut gardent les tests live/E2E exhaustifs et lendurance du chemin de publication Docker derrière `run_release_soak=true` ; `release_profile=full` force lactivation de lendurance. 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 publication. Fournissez `npm_telegram_package_spec` après publication lorsque le même E2E Telegram doit aussi valider 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 de preuve privé doit démontrer que la validation correspond à un package npm publié sans forcer lE2E Telegram. Exemple :
- Exécutez `pnpm check:test-types` avant la vérification préliminaire de publication afin que le TypeScript des tests reste
couvert en dehors du garde-fou local plus rapide `pnpm check`
- Exécutez `pnpm check:architecture` avant la vérification préliminaire de publication afin que les vérifications plus larges des
cycles dimportation et des frontières darchitecture soient au vert en dehors du garde-fou local plus rapide
- Exécutez `pnpm build && pnpm ui:build` avant `pnpm release:check` afin que les artefacts de publication
`dist/*` attendus et le bundle de linterface utilisateur de contrôle existent pour létape de validation
du paquet
- Exécutez `pnpm plugins:sync` après lincrément de version racine et avant le taggage. Il
met à jour les versions des packages de plugins publiables, les métadonnées de compatibilité
pair/API OpenClaw, les métadonnées de build et les ébauches de changelog des plugins pour correspondre à la version de publication
du cœur. `pnpm plugins:sync:check` est le garde-fou de publication non mutant ;
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 la publication pour
lancer toutes les boîtes de test de prépublication depuis un seul point dentrée. Il accepte une branche,
un tag ou un SHA de commit complet, déclenche manuellement `CI`, et déclenche
`OpenClaw Release Checks` pour le smoke test dinstallation, lacceptation de package, les vérifications de package
inter-OS, la parité QA Lab, Matrix et les voies Telegram. Les exécutions stables/par défaut
gardent les live/E2E exhaustifs et le soak du chemin de publication Docker derrière
`run_release_soak=true` ; `release_profile=full` force lactivation du soak. Avec
`release_profile=full` et `rerun_group=all`, il exécute aussi lE2E Telegram du package
contre lartefact `release-package-under-test` issu des vérifications de publication.
Fournissez `npm_telegram_package_spec` après publication lorsque le même
E2E Telegram doit aussi valider 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 à partir du SHA. Fournissez
`evidence_package_spec` lorsque le rapport de preuve privé 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 par canal auxiliaire pour un candidat package pendant que le travail de publication continue. Utilisez `source=npm` pour `openclaw@beta`, `openclaw@latest` ou une version de publication exacte ; `source=ref` pour empaqueter une branche/étiquette/SHA `package_ref` de confiance avec le harnais `workflow_ref` actuel ; `source=url` pour une archive tar HTTPS avec un SHA-256 obligatoire ; ou `source=artifact` pour une archive tar téléversée par une autre exécution GitHub Actions. Le workflow résout le candidat vers `package-under-test`, réutilise le planificateur de publication 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 de package 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 auxiliaire
pour un candidat de package pendant que le travail de publication continue. Utilisez `source=npm` pour
`openclaw@beta`, `openclaw@latest` ou une version de publication exacte ; `source=ref`
pour empaqueter une branche/un tag/un SHA `package_ref` de confiance avec le harnais
`workflow_ref` actuel ; `source=url` pour une archive tarball HTTPS avec un
SHA-256 obligatoire ; ou `source=artifact` pour une archive tarball téléversée par une autre exécution
GitHub Actions. Le workflow résout le candidat vers
`package-under-test`, réutilise le planificateur de publication Docker E2E contre cette
archive tarball, et peut exécuter la QA Telegram contre la même archive avec
`telegram_mode=mock-openai` ou `telegram_mode=live-frontier`. Lorsque les
voies Docker sélectionnées incluent `published-upgrade-survivor`, lartefact de package
est le candidat et `published_upgrade_survivor_baseline` sélectionne
la référence publiée. `update-restart-auth` utilise le package candidat comme
CLI installé et comme package-under-test afin dexercer le chemin de redémarrage géré
de la commande de mise à jour du candidat.
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` : voies dinstallation/canal/agent, réseau Gateway et rechargement de configuration
- `package` : voies natives dartefact pour package/mise à jour/plugin sans OpenWebUI ni ClawHub live
- `product` : profil package plus canaux MCP, nettoyage cron/sous-agent, recherche web OpenAI et OpenWebUI
- `full` : segments du chemin de publication 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 publication. Les déclenchements manuels de CI contournent le périmétrage des changements et forcent les shards Linux Node, les shards de plugins groupés, les contrats de canaux, la compatibilité Node 22, `check`, `check-additional`, la fumée de build, les vérifications de docs, les Skills Python, Windows, macOS, Android et les voies dinternationalisation de linterface utilisateur de contrôle.
- `package` : voies package/mise à jour/redémarrage/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 du chemin de publication Docker avec OpenWebUI
- `custom` : sélection exacte de `docker_lanes` pour une relance ciblée
- Exécutez directement le workflow manuel `CI` lorsque vous navez besoin que dune couverture CI normale complète
pour le candidat de publication. Les déclenchements manuels de CI contournent la portée par changements
et forcent les shards Linux Node, les shards de plugins groupés, les contrats de canaux,
la compatibilité Node 22, `check`, `check-additional`, le smoke test de build,
les vérifications de docs, les Skills Python, Windows, macOS, Android et les voies i18n de linterface utilisateur de contrôle.
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 publication. Il 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 ni un autre collecteur externe.
- Exécutez `pnpm release:check` avant chaque publication étiquetée
- Exécutez `OpenClaw Release Publish` pour la séquence de publication mutante après lexistence de létiquette. Déclenchez-le depuis `release/YYYY.M.D` (ou `main` lors de la publication dune étiquette accessible depuis main), passez létiquette de publication et le `preflight_run_id` npm OpenClaw réussi, et conservez la portée de publication de plugins 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 OpenClaw afin que le package cœur ne soit pas publié avant ses plugins externalisés.
- Les vérifications de publication 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 publication. Cela 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 ou un autre collecteur externe.
- Exécutez `pnpm release:check` avant chaque publication taggée
- Exécutez `OpenClaw Release Publish` pour la séquence de publication mutante après lexistence du
tag. Déclenchez-la depuis `release/YYYY.M.D` (ou `main` lors de la publication dun
tag atteignable depuis main), transmettez le tag de publication et le `preflight_run_id`
npm OpenClaw réussi, et conservez la portée de publication des plugins 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 OpenClaw
afin que le package cœur ne soit pas publié avant ses plugins externalisés.
- Les vérifications de publication sexécutent désormais dans un workflow manuel séparé :
`OpenClaw Release Checks`
- `OpenClaw Release Checks` exécute aussi la voie de parité fictive QA Lab ainsi que le profil Matrix live rapide et la voie QA Telegram avant lapprobation de publication. 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 des transports Matrix, des médias et de lE2EE en parallèle.
- La validation dexécution dinstallation et de mise à niveau multiplateforme 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 véritable chemin de publication 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 ni bloquer la publication
- Les vérifications de publication porteuses de secrets doivent être déclenchées 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, une étiquette ou un SHA de commit complet tant que le commit résolu est accessible depuis une branche OpenClaw ou une étiquette de publication
- Le contrôle préliminaire 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 détiquette poussée
- Ce chemin SHA est réservé à la validation et ne peut pas être promu en véritable publication
- En mode SHA, le workflow synthétise `v<package.json version>` uniquement pour la vérification des métadonnées du package ; une véritable publication exige toujours une véritable étiquette de publication
- Les deux workflows gardent le véritable chemin de publication et de promotion sur les exécuteurs hébergés par GitHub, tandis que le chemin de validation non mutant peut utiliser les exécuteurs Linux Blacksmith plus grands
- `OpenClaw Release Checks` exécute aussi la voie de parité mock QA Lab plus le profil Matrix
live rapide et la voie QA Telegram avant lapprobation de publication. 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
du transport, des médias et de lE2EE en parallèle.
- La validation dexécution dinstallation et de mise à niveau inter-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 véritable chemin de publication 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 ni bloquer la publication
- Les vérifications de publication portant des secrets doivent être déclenchées via `Full Release
Validation` ou depuis la référence de workflow `main`/release afin que la logique de 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 publication
- La vérification préliminaire en mode validation seule de `OpenClaw NPM Release` accepte aussi le SHA de commit complet
de 40 caractères de la branche de workflow actuelle sans nécessiter de tag poussé
- Ce chemin SHA est uniquement destiné à la validation et ne peut pas être promu en véritable 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 nécessite toujours un vrai tag de publication
- Les deux workflows conservent 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`
- Le contrôle préliminaire de publication npm nattend plus la voie séparée des vérifications de publication
- La vérification préliminaire de publication npm nattend plus la voie de vérifications de publication séparée
- Exécutez `RELEASE_TAG=vYYYY.M.D node --import tsx scripts/openclaw-npm-release-check.ts`
(ou létiquette bêta/correction correspondante) avant lapprobation
(ou le tag bêta/correctif correspondant) avant lapprobation
- Après la publication npm, exécutez
`node --import tsx scripts/openclaw-npm-postpublish-verify.ts YYYY.M.D`
(ou la version bêta/correction correspondante) pour vérifier le chemin dinstallation du registre publié dans un préfixe temporaire neuf
(ou la version bêta/correctif correspondante) pour vérifier le chemin dinstallation du registre publié
dans un préfixe temporaire frais
- Après une publication bêta, 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 lintégration du package installé, la configuration Telegram et le véritable E2E Telegram contre le package npm publié en utilisant le pool partagé didentifiants Telegram loués. Les exécutions ponctuelles locales des mainteneurs peuvent omettre les variables Convex et passer directement les trois identifiants denvironnement `OPENCLAW_QA_TELEGRAM_*`.
- Pour exécuter la fumée bêta complète après publication 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 lexécution exacte du workflow, télécharge lartefact et affiche 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 volontairement uniquement manuel et ne sexécute pas à chaque fusion.
- Lautomatisation de publication des mainteneurs utilise maintenant le modèle contrôle préliminaire puis promotion :
- la véritable publication npm doit réussir un `preflight_run_id` npm réussi
- la véritable publication npm doit être déclenchée depuis la même branche `main` ou `release/YYYY.M.D` que lexécution de contrôle préliminaire réussie
- les publications 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 jeton vit maintenant dans `openclaw/releases-private/.github/workflows/openclaw-npm-dist-tags.yml` pour la sécurité, car `npm dist-tag add` a toujours besoin de `NPM_TOKEN` tandis que le dépôt public conserve une publication OIDC seule
- la publication publique `macOS Release` est uniquement de validation ; lorsquune étiquette nexiste que sur une branche de publication mais que le workflow est déclenché depuis `main`, définissez `public_release_branch=release/YYYY.M.D`
- la véritable publication mac privée doit réussir le `preflight_run_id` mac privé et `validate_run_id`
- les véritables chemins de publication promeuvent les artefacts préparés au lieu de les reconstruire à nouveau
- Pour les publications de correction stables comme `YYYY.M.D-N`, le vérificateur post-publication vérifie aussi le même chemin de mise à niveau à préfixe temporaire de `YYYY.M.D` vers `YYYY.M.D-N` afin que les corrections de publication ne puissent pas laisser silencieusement danciennes installations globales sur la charge utile stable de base
- Le contrôle préliminaire de publication npm échoue fermé sauf si larchive tar inclut à la fois `dist/control-ui/index.html` et une charge utile non vide `dist/control-ui/assets/` afin de ne pas livrer à nouveau un tableau de bord de navigateur vide
- La vérification post-publication vérifie aussi que les points dentrée des plugins publiés et les métadonnées de package sont présents dans lagencement de registre installé. Une publication qui livre des charges utiles dexécution de plugins manquantes échoue au vérificateur postpublication et ne peut pas être promue vers `latest`.
- `pnpm test:install:smoke` applique aussi le budget npm pack `unpackedSize` sur larchive tar de mise à jour candidate, afin que le2e dinstallation détecte le gonflement accidentel du paquet avant le chemin de publication
- Si le travail de publication a touché la planification CI, les manifestes de minutage des extensions ou les matrices de tests dextensions, régénérez et révisez les sorties de matrice `plugin-prerelease-extension-shard` détenues par le planificateur depuis `.github/workflows/plugin-prerelease.yml` avant approbation afin que les notes de publication ne décrivent pas une disposition CI obsolète
- La préparation dune publication stable macOS inclut aussi les surfaces du système de mise à jour :
- la publication GitHub doit finir avec les fichiers packagés `.zip`, `.dmg` et `.dSYM.zip`
pour vérifier lonboarding du package installé, la configuration Telegram et le vrai E2E Telegram
contre le package npm publié en utilisant le pool partagé loué didentifiants Telegram.
Les exécutions ponctuelles locales de mainteneurs peuvent omettre les variables Convex et transmettre directement les trois
identifiants denvironnement `OPENCLAW_QA_TELEGRAM_*`.
- Pour exécuter le smoke test bêta complet après publication 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 lexécution exacte du workflow, télécharge lartefact et affiche le rapport Telegram.
- Les mainteneurs peuvent exécuter la même vérification après publication depuis GitHub Actions via le
workflow manuel `NPM Telegram Beta E2E`. Il est intentionnellement manuel uniquement et
ne sexécute pas à chaque merge.
- Lautomatisation de publication des mainteneurs utilise désormais préflight-puis-promotion :
- la vraie publication npm doit réussir un `preflight_run_id` npm
- la vraie publication npm doit être déclenchée depuis la même branche `main` ou
`release/YYYY.M.D` que lexécution préliminaire réussie
- les publications npm stables ciblent par défaut `beta`
- la publication npm stable peut cibler explicitement `latest` via lentrée du workflow
- la mutation de dist-tag npm basée sur jeton réside 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 OIDC uniquement
- le workflow public `macOS Release` est uniquement destiné à la validation ; lorsquun tag nexiste que sur une
branche de publication 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 réussir les `preflight_run_id` et
`validate_run_id` mac privés
- les vrais chemins de publication promeuvent les artefacts préparés au lieu de les reconstruire
à nouveau
- Pour les publications correctives stables comme `YYYY.M.D-N`, le vérificateur après publication
vérifie aussi le même chemin de mise à niveau avec préfixe temporaire de `YYYY.M.D` vers `YYYY.M.D-N`
afin que les corrections de publication ne puissent pas laisser silencieusement les anciennes installations globales sur la
charge utile stable de base
- La vérification préliminaire de publication npm échoue de manière fermée sauf si larchive tarball inclut à la fois
`dist/control-ui/index.html` et une charge utile non vide `dist/control-ui/assets/`
afin que nous ne livrions plus de tableau de bord navigateur vide
- La vérification après publication vérifie aussi que les points dentrée des plugins publiés et
les métadonnées de package sont présents dans lagencement de registre installé. Une publication qui
livre des charges utiles dexécution de plugins manquantes échoue au vérificateur postpublish et
ne peut pas être promue vers `latest`.
- `pnpm test:install:smoke` impose aussi le budget npm pack `unpackedSize` sur
larchive tarball de mise à jour candidate, afin que le2e de linstallateur détecte le gonflement accidentel du pack
avant le chemin de publication
- Si le travail de publication a touché la planification CI, les manifestes de timing des plugins ou
les matrices de tests de plugins, régénérez et révisez 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 publication ne
décrivent pas une disposition CI obsolète
- La préparation dune publication macOS stable inclut aussi les surfaces de mise à jour :
- la publication GitHub doit finir avec les packages `.zip`, `.dmg` et `.dSYM.zip`
- `appcast.xml` sur `main` doit pointer vers le nouveau zip stable après publication
- lapplication packagée doit conserver un identifiant de bundle non débogage, une URL de flux Sparkle non vide et un `CFBundleVersion` supérieur ou égal au plancher de build Sparkle canonique pour cette version de publication
- lapp packagée doit conserver un identifiant de bundle non debug, une URL de flux Sparkle
non vide et un `CFBundleVersion` égal ou supérieur au seuil de build Sparkle canonique
pour cette version de publication
## Boîtes de test de publication
`Full Release Validation` est la manière dont les opérateurs lancent tous les tests de prépublication depuis un seul point dentrée. Pour une preuve sur commit épinglé sur une branche évoluant rapidement, utilisez lassistant afin que chaque workflow enfant sexécute depuis une branche temporaire fixée au SHA cible :
`Full Release Validation` est la manière dont les opérateurs lancent tous les tests de prépublication depuis
un seul point dentrée. 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 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 accidentellement 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 valider
par accident une exécution enfant plus récente de `main`.
Pour la validation dune branche ou dune étiquette de publication, exécutez-le depuis la référence de workflow `main` de confiance et passez la branche ou létiquette de publication comme `ref` :
Pour la validation dune branche ou dun tag de publication, exécutez-le depuis la référence de workflow `main`
de confiance et transmettez la branche ou le tag de publication comme `ref` :
```bash
gh workflow run full-release-validation.yml \
@ -189,53 +294,57 @@ gh workflow run full-release-validation.yml \
-f evidence_package_spec=openclaw@YYYY.M.D-beta.N
```
Le workflow résout la ref cible, déclenche manuellement `CI` avec
`target_ref=<release-ref>`, déclenche `OpenClaw Release Checks`, prépare un
Le workflow résout la réf cible, déclenche le `CI` manuel avec
`target_ref=<release-ref>`, déclenche les `OpenClaw Release Checks`, prépare un
artefact parent `release-package-under-test` pour les vérifications orientées
package, et déclenche lE2E Telegram package autonome lorsque `release_profile=full` avec
`rerun_group=all` ou lorsque `npm_telegram_package_spec` est défini. `OpenClaw Release
Checks` déploie ensuite les smokes dinstallation, les vérifications de release inter-OS, la
couverture live/E2E du chemin de release Docker lorsque le soak est activé, Package Acceptance avec lAQ du package Telegram, la parité QA Lab, Matrix live et Telegram live. Une exécution complète nest acceptable que lorsque le
package, et déclenche le package Telegram E2E autonome quand `release_profile=full` avec
`rerun_group=all` ou quand `npm_telegram_package_spec` est défini. `OpenClaw Release
Checks` distribue ensuite la fumée dinstallation, les vérifications de release
multi-OS, la couverture live/E2E Docker du chemin de release quand le soak est activé, Package Acceptance avec la 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 aussi réussir ; hors full/all, il est ignoré
affiche `normal_ci` et `release_checks` comme réussis. En mode full/all,
lenfant `npm_telegram` doit aussi réussir ; en dehors de full/all, il est ignoré
sauf si un `npm_telegram_package_spec` publié a été fourni. Le résumé final du
vérificateur inclut des tableaux des jobs les plus lents 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 release](/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 identifiants de relance ciblée.
Les workflows enfants sont déclenchés depuis la ref de confiance 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 de confiance en choisissant la ref dexécution du workflow.
Nutilisez pas `--ref main -f ref=<sha>` pour une preuve de commit exacte sur `main` mouvant ;
Voir [Validation complète de release](/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 relance ciblées.
Les workflows enfants sont déclenchés depuis la réf de confiance qui exécute `Full Release
Validation`, normalement `--ref main`, même quand la `ref` cible pointe vers une
branche ou une balise de release plus ancienne. Il nexiste pas dentrée workflow-ref
distincte pour Full Release Validation ; choisissez le harnais de confiance en choisissant la réf dexécution du workflow.
Nutilisez pas `--ref main -f ref=<sha>` pour une preuve de commit exact 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 critique pour la release, le plus rapide
- `stable` : minimum plus couverture fournisseur/backend stable pour lapprobation de release
- `full` : stable plus large couverture consultative fournisseur/média
- `minimum` : chemin OpenAI/core live et Docker critique pour la release le plus rapide
- `stable` : minimum plus couverture provider/backend stable pour lapprobation de release
- `full` : stable plus large couverture consultative provider/médias
Utilisez `run_release_soak=true` avec `stable` lorsque les lanes bloquantes pour la release sont
Utilisez `run_release_soak=true` avec `stable` quand les lanes bloquantes pour la release sont
vertes et que vous voulez le balayage exhaustif live/E2E, du chemin de release Docker et
des survivants de mise à niveau all-since-2026.4.23 avant promotion. `full` implique
borné de survie aux mises à niveau publiées avant la promotion. Ce balayage couvre
les quatre derniers packages stables plus les baselines épinglées `2026.4.23` et `2026.5.2`
plus une couverture plus ancienne `2026.4.15`, avec suppression des baselines dupliquées et
chaque baseline fragmentée dans son propre job de runner Docker. `full` implique
`run_release_soak=true`.
`OpenClaw Release Checks` utilise la ref de workflow de confiance pour résoudre une seule fois la ref cible
comme `release-package-under-test` et réutilise cet artefact dans les vérifications inter-OS,
Package Acceptance et Docker du chemin de release lorsque le soak sexécute. Cela garde
`OpenClaw Release Checks` utilise la réf de workflow de confiance pour résoudre une fois la réf
cible sous forme de `release-package-under-test` et réutilise cet artefact dans les vérifications multi-OS,
Package Acceptance et Docker de chemin de release quand le soak sexécute. Cela garde
toutes les machines orientées package sur les mêmes octets et évite les builds de package répétés.
Le smoke dinstallation OpenAI inter-OS utilise `OPENCLAW_CROSS_OS_OPENAI_MODEL` lorsque la
variable repo/org est définie, sinon `openai/gpt-5.4`, car cette lane
La fumée dinstallation OpenAI multi-OS utilise `OPENCLAW_CROSS_OS_OPENAI_MODEL` quand la
variable repo/org est définie, sinon `openai/gpt-5.4`, parce que cette lane
prouve linstallation du package, lonboarding, le démarrage du Gateway et un tour dagent live
plutôt que de benchmarker le modèle par défaut le plus lent. La matrice live plus large des fournisseurs
reste lendroit pour la couverture propre à chaque modèle.
plutôt que de mesurer le modèle par défaut le plus lent. La matrice live provider
plus large reste lendroit prévu pour la couverture propre aux modèles.
Utilisez ces variantes selon létape de release :
```bash
# Valider une branche candidate de release non publiée.
# Validate an unpublished release candidate branch.
gh workflow run full-release-validation.yml \
--ref main \
-f ref=release/YYYY.M.D \
@ -243,14 +352,14 @@ gh workflow run full-release-validation.yml \
-f mode=both \
-f release_profile=stable
# Valider un commit poussé exact.
# Validate an exact pushed commit.
gh workflow run full-release-validation.yml \
--ref main \
-f ref=<40-char-sha> \
-f provider=openai \
-f mode=both
# Après la publication dune bêta, ajouter lE2E Telegram du package publié.
# After publishing a beta, add published-package Telegram E2E.
gh workflow run full-release-validation.yml \
--ref main \
-f ref=release/YYYY.M.D \
@ -262,42 +371,43 @@ gh workflow run full-release-validation.yml \
-f npm_telegram_provider_mode=mock-openai
```
Nutilisez pas le parapluie complet comme première relance après un correctif ciblé. Si une machine
échoue, utilisez le workflow enfant échoué, le job, la lane Docker, le profil de package, le fournisseur
de modèle ou la lane QA pour la preuve suivante. Relancez le parapluie complet uniquement lorsque
le correctif a modifié lorchestration de release partagée ou a rendu obsolètes les preuves antérieures de toutes les machines.
Le vérificateur final du parapluie revérifie les identifiants dexécution de workflow enfant enregistrés ;
ainsi, après la relance réussie dun workflow enfant, relancez uniquement le job parent échoué
`Verify full validation`.
Nutilisez pas le parapluie complet comme première relance après une correction ciblée. Si une machine
échoue, utilisez le workflow enfant, le job, la lane Docker, le profil de package, le provider
de modèle ou la lane QA en échec pour la preuve suivante. Relancez le parapluie complet seulement quand
la correction a modifié lorchestration de release partagée ou a rendu obsolète la preuve
précédente de toutes les machines. Le vérificateur final du parapluie revérifie les identifiants
enregistrés des exécutions de workflow enfants ; ainsi, après la relance réussie dun workflow enfant,
relancez uniquement le job parent `Verify full validation` en échec.
Pour une récupération bornée, passez `rerun_group` au parapluie. `all` est la véritable
exécution candidate de release, `ci` exécute seulement lenfant CI normal, `plugin-prerelease`
exécute seulement lenfant Plugin propre à la release, `release-checks` exécute chaque machine de release,
et les groupes de release plus étroits sont `install-smoke`, `cross-os`,
Pour une récupération bornée, passez `rerun_group` au parapluie. `all` est la vraie
exécution de release candidate, `ci` exécute seulement lenfant CI normal, `plugin-prerelease`
exécute seulement lenfant Plugin propre à la release, `release-checks` exécute chaque machine
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 package release-checks. Les relances
inter-OS ciblées peuvent ajouter `cross_os_suite_filter=windows/packaged-upgrade` ou
un autre filtre OS/suite. Les échecs QA de release-checks sont consultatifs ; un échec uniquement QA
ne bloque pas la validation de release.
avec `release_profile=full` utilisent lartefact de package des release-checks. Les relances
multi-OS ciblées peuvent ajouter `cross_os_suite_filter=windows/packaged-upgrade` ou
un autre filtre OS/suite. Les échecs QA des release-checks sont consultatifs ; un échec uniquement
QA ne bloque pas la validation de release.
### Vitest
La machine Vitest est le workflow enfant manuel `CI`. La CI manuelle contourne
intentionnellement le scoping des changements et force le graphe de tests normal pour le candidat de release :
shards Linux Node, shards de plugins groupés, contrats de canaux, compatibilité Node 22,
`check`, `check-additional`, smoke de build, vérifications docs, Skills Python, Windows, macOS, Android et i18n Control UI.
La machine Vitest est le workflow enfant `CI` manuel. Le CI manuel contourne
intentionnellement le périmètre des changements et force le graphe de tests normal pour la release
candidate : fragments Linux Node, fragments de plugins groupés, contrats de canaux, compatibilité Node 22,
`check`, `check-additional`, fumée de build, vérifications docs, Skills Python, Windows, macOS, Android et i18n Control UI.
Utilisez cette machine pour répondre à « larborescence source a-t-elle réussi la suite de tests normale complète ? »
Utilisez cette machine pour répondre à « larborescence source a-t-elle passé 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
- résumé `Full Release Validation` affichant lURL de lexécution `CI` déclenchée
- exécution `CI` verte sur le SHA cible exact
- noms des shards échoués ou lents depuis les jobs CI lors de linvestigation de régressions
- artefacts de chronométrage Vitest tels que `.artifacts/vitest-shard-timings.json` lorsquune exécution nécessite une analyse des performances
- noms des fragments en échec ou lents depuis les jobs CI lors de linvestigation de régressions
- artefacts de temps Vitest comme `.artifacts/vitest-shard-timings.json` quand
une exécution nécessite une analyse de performance
Exécutez la CI manuelle directement uniquement lorsque la release nécessite une CI normale déterministe mais
pas les machines Docker, QA Lab, live, inter-OS ou package :
Exécutez le CI manuel directement uniquement quand la release nécessite un CI normal déterministe mais
pas les machines Docker, QA Lab, live, multi-OS ou package :
```bash
gh workflow run ci.yml --ref main -f target_ref=release/YYYY.M.D
@ -307,14 +417,14 @@ gh workflow run ci.yml --ref main -f target_ref=release/YYYY.M.D
La machine Docker vit dans `OpenClaw Release Checks` via
`openclaw-live-and-e2e-checks-reusable.yml`, plus le workflow `install-smoke`
en mode release. Elle valide le candidat de release via des environnements Docker
packagés au lieu de se limiter aux tests au niveau source.
en mode release. Elle valide la release candidate via des environnements Docker
packagés plutôt que seulement des tests au niveau source.
La couverture Docker de release inclut :
- smoke dinstallation complet avec le smoke dinstallation globale Bun lent activé
- préparation/réutilisation de limage de smoke du Dockerfile racine par SHA cible, avec les jobs smoke QR,
root/gateway et installer/Bun exécutés comme shards install-smoke séparés
- fumée dinstallation complète avec la fumée dinstallation globale Bun lente activée
- préparation/réutilisation de limage de fumée Dockerfile racine par SHA cible, avec les jobs de fumée QR,
root/gateway et installer/Bun sexécutant comme fragments install-smoke séparés
- lanes E2E du dépôt
- morceaux Docker du chemin de release : `core`, `package-update-openai`,
`package-update-anthropic`, `package-update-core`, `plugins-runtime-plugins`,
@ -323,87 +433,92 @@ La couverture Docker de release inclut :
`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` lorsque demandée
- lanes divisées dinstallation/désinstallation de plugins groupés
- couverture OpenWebUI dans le morceau `plugins-runtime-services` quand elle est demandée
- lanes dinstallation/désinstallation de plugins groupés séparées
`bundled-plugin-install-uninstall-0` à
`bundled-plugin-install-uninstall-23`
- suites fournisseur live/E2E et couverture de modèle Docker live lorsque les vérifications de release
- suites provider live/E2E et couverture de modèles live Docker quand les vérifications de release
incluent des suites live
Utilisez les artefacts Docker avant de relancer. Le planificateur du chemin de release téléverse
`.artifacts/docker-tests/` avec les journaux de lane, `summary.json`, `failures.json`,
les timings 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 réutilisable live/E2E au lieu de
relancer tous les morceaux de release. Les commandes de relance générées incluent les entrées
`package_artifact_run_id` précédentes et les images Docker préparées lorsquelles sont disponibles, afin quune
lane échouée puisse réutiliser la même archive tar et les mêmes images GHCR.
les durées de phase, 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 plutôt que
de relancer tous les morceaux de release. Les commandes de relance générées incluent le
`package_artifact_run_id` précédent et les entrées dimage Docker préparée quand elles sont disponibles, afin quune
lane en échec puisse réutiliser le même tarball et les mêmes images GHCR.
### QA Lab
La machine QA Lab fait aussi partie de `OpenClaw Release Checks`. Cest le gate de release
du comportement agentique et au niveau des canaux, séparé de Vitest et de la mécanique des packages Docker.
La machine QA Lab fait aussi partie de `OpenClaw Release Checks`. Cest la porte de release
du comportement agentique et au niveau des canaux, séparée de Vitest et de la mécanique
des packages Docker.
La couverture QA Lab de release inclut :
- lane de parité mock comparant la lane candidate OpenAI à la référence Opus 4.6
à laide du pack de parité agentique
- lane de parité simulée comparant la lane candidate OpenAI à la baseline Opus 4.6
avec le pack de parité agentique
- profil QA Matrix live rapide utilisant lenvironnement `qa-live-shared`
- lane QA Telegram live utilisant les baux didentifiants Convex CI
- `pnpm qa:otel:smoke` lorsque la télémétrie de release nécessite une preuve locale explicite
- `pnpm qa:otel:smoke` quand la télémétrie de release nécessite une preuve locale explicite
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 pour les lanes parité, Matrix et Telegram
lors de lapprobation de la release. La couverture Matrix complète reste disponible sous forme dexécution QA-Lab
fragmentée manuelle plutôt que comme lane critique de release par défaut.
les flux de canaux live ? » Conservez les URL dartefacts pour les lanes de parité, Matrix et Telegram
lors de lapprobation de la release. La couverture Matrix complète reste disponible sous forme
dexécution QA-Lab fragmentée manuelle plutôt que comme lane critique par défaut pour la release.
### Package
La machine Package est le gate de produit installable. Elle est appuyée par
La machine Package 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 archive tar `package-under-test` consommée par Docker E2E, valide
candidat dans le tarball `package-under-test` consommé par Docker E2E, valide
linventaire du package, enregistre la version du package et le SHA-256, et garde la
ref du harnais de workflow séparée de la ref source du package.
réf du harnais de workflow séparée de la réf source du package.
Sources de candidats prises en charge :
Sources de candidat prises en charge :
- `source=npm` : `openclaw@beta`, `openclaw@latest` ou une version exacte de release OpenClaw
- `source=ref` : empaqueter une branche, balise ou SHA de commit complet `package_ref` de confiance
- `source=npm` : `openclaw@beta`, `openclaw@latest` ou une version de release OpenClaw exacte
- `source=ref` : packager 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=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 release préparé, `suite_profile=custom`,
`docker_lanes=doctor-switch update-channel-switch upgrade-survivor published-upgrade-survivor plugins-offline plugin-update`,
`telegram_mode=mock-openai`. Package Acceptance garde la migration, la mise à jour, le nettoyage des dépendances de plugins obsolètes, les fixtures de plugins hors ligne, la mise à jour de plugins et lAQ du package Telegram sur la même archive tar résolue. Les vérifications de release bloquantes utilisent la référence de package publié latest par défaut ; `run_release_soak=true` ou
`release_profile=full` étend à chaque référence stable publiée sur npm depuis
`2026.4.23` jusquà `latest`, plus les fixtures dissues signalées. Utilisez
`OpenClaw Release Checks` exécute 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 update-restart-auth plugins-offline plugin-update`,
`telegram_mode=mock-openai`. Package Acceptance conserve la migration, la mise à jour,
le redémarrage de mise à jour avec auth configurée, le nettoyage des dépendances de Plugin obsolètes, les fixtures de Plugin hors ligne, la mise à jour de Plugin et la QA du package Telegram contre le même tarball
résolu. Les vérifications de release bloquantes utilisent la baseline du dernier package publié par défaut ;
`run_release_soak=true` ou
`release_profile=full` sétend à chaque baseline stable publiée sur npm depuis
`2026.4.23` jusquà `latest` plus les fixtures dincidents signalés. Utilisez
Package Acceptance avec `source=npm` pour un candidat déjà livré, ou
`source=ref`/`source=artifact` pour une archive tar npm locale adossée à un SHA avant
publication. Cest le remplacement natif GitHub
pour la majeure partie de la couverture package/mise à jour qui nécessitait auparavant
Parallels. Les vérifications de release inter-OS restent importantes pour lonboarding,
linstallateur et le comportement propres aux OS, mais la validation produit package/mise à jour devrait
`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 release multi-OS restent importantes pour lonboarding,
linstallateur et le comportement propres aux OS, mais la validation produit package/mise à jour doit
privilégier 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 lane locale, Docker, Package Acceptance ou release-check prouve un
changement dinstallation/mise à jour de plugin, de nettoyage doctor ou de migration de package publié.
[Test des mises à jour et des plugins](/fr/help/testing-updates-plugins). Utilisez-la pour
décider quelle lane locale, Docker, Package Acceptance ou release-check prouve une
installation/mise à jour de Plugin, un nettoyage doctor ou un changement de migration de package publié.
La migration exhaustive des mises à jour publiées depuis chaque package stable `2026.4.23+` est
un workflow manuel `Update Migration` séparé, qui ne fait pas partie de Full Release CI.
un workflow manuel `Update Migration` distinct, et non une partie de Full Release CI.
La tolérance historique de package-acceptance est volontairement limitée dans le temps. Les packages jusquà
La tolérance historique de lacceptation de packages est volontairement limitée dans le temps. Les packages 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 dinventaire QA privées absentes de larchive tar, absence de
`gateway install --wrapper`, fichiers de patch absents de la fixture git dérivée de larchive tar,
absence de `update.channel` persisté, emplacements historiques des enregistrements dinstallation de plugins,
absence de persistance des enregistrements dinstallation de marketplace et migration des métadonnées de configuration
pendant `plugins update`. Le package publié `2026.4.26` peut avertir
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 release.
sur npm : entrées dinventaire QA privées absentes du tarball, absence de
`gateway install --wrapper`, fichiers de correctif absents du fixture git dérivé du tarball, absence de
`update.channel` persisté, emplacements historiques des enregistrements dinstallation de Plugin,
absence de persistance des enregistrements dinstallation de marketplace, et migration des métadonnées de
configuration pendant `plugins update`. Le package publié `2026.4.26` peut émettre un avertissement
pour les fichiers dhorodatage de métadonnées de build local qui avaient déjà été livrés. Les packages ultérieurs
doivent satisfaire les contrats de package modernes ; ces mêmes lacunes font échouer la validation de
publication.
Utilisez des profils Package Acceptance plus larges lorsque la question de release concerne un
Utilisez des profils Package Acceptance plus larges lorsque la question de publication concerne un
package réellement installable :
```bash
@ -418,26 +533,26 @@ gh workflow run package-acceptance.yml \
Profils de package courants :
- `smoke` : voies rapides d'installation de package/canal/agent, réseau Gateway et
rechargement de configuration
- `package` : contrats d'installation/mise à jour/package de Plugin sans ClawHub en direct ; c'est la valeur par défaut
du contrôle de release
- `smoke` : voies rapides dinstallation de package/canal/agent, réseau Gateway et rechargement de
configuration
- `package` : contrats dinstallation/mise à jour/redémarrage/package de Plugin sans
ClawHub en direct ; cest la valeur par défaut de la vérification de publication
- `product` : `package` plus canaux MCP, nettoyage cron/sous-agent, recherche web OpenAI
et OpenWebUI
- `full` : segments de chemin de release Docker avec OpenWebUI
- `custom` : liste exacte `docker_lanes` pour des relances ciblées
- `full` : segments du chemin de publication Docker avec OpenWebUI
- `custom` : liste exacte de `docker_lanes` pour des relances ciblées
Pour une preuve Telegram de package candidat, activez `telegram_mode=mock-openai` ou
`telegram_mode=live-frontier` sur Package Acceptance. Le workflow transmet l'archive tar
`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.
`telegram_mode=live-frontier` sur Package Acceptance. Le workflow transmet le tarball
`package-under-test` résolu dans 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 release
`OpenClaw Release Publish` est le point d'entrée de publication modifiant normal. Il
orchestre les workflows d'éditeur de confiance dans l'ordre requis par la release :
`OpenClaw Release Publish` est le point dentrée normal de publication mutante. Il
orchestre les workflows déditeur de confiance dans lordre requis par la release :
1. Extraire le tag de release et résoudre son SHA de commit.
1. Extraire le tag de release et résoudre son commit SHA.
2. Vérifier que le tag est accessible depuis `main` ou `release/*`.
3. Exécuter `pnpm plugins:sync:check`.
4. Déclencher `Plugin NPM Release` avec `publish_scope=all-publishable` et
@ -477,29 +592,28 @@ gh workflow run openclaw-release-publish.yml \
```
Utilisez les workflows de niveau inférieur `Plugin NPM Release` et `Plugin ClawHub Release`
uniquement pour des travaux de réparation ou de republication ciblés. Pour une réparation de Plugin sélectionné, transmettez
uniquement pour des travaux ciblés de réparation ou 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é.
## Entrées du workflow NPM
`OpenClaw NPM Release` accepte ces entrées contrôlées par l'opérateur :
`OpenClaw NPM Release` accepte ces entrées contrôlées par lopérateur :
- `tag` : tag de release requis tel que `v2026.4.2`, `v2026.4.2-1` ou
`v2026.4.2-beta.1` ; lorsque `preflight_only=true`, il peut aussi être le SHA de commit
complet de 40 caractères de la branche de workflow actuelle pour une pré-vérification
de validation uniquement
- `preflight_only` : `true` pour validation/build/package seulement, `false` pour le
vrai chemin de publication
- `preflight_run_id` : requis sur le vrai chemin de publication afin que le workflow réutilise
l'archive tar préparée par l'exécution de pré-vérification réussie
- `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 une prévalidation uniquement
- `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é depuis lexécution de prévalidation 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 l'opérateur :
`OpenClaw Release Publish` accepte ces entrées contrôlées par lopérateur :
- `tag` : tag de release requis ; il doit déjà exister
- `preflight_run_id` : identifiant d'exécution de pré-vérification `OpenClaw NPM Release` réussie ;
- `preflight_run_id` : id dexécution de prévalidation `OpenClaw NPM Release` réussie ;
requis lorsque `publish_openclaw_npm=true`
- `npm_dist_tag` : tag npm cible pour le package OpenClaw
- `plugin_publish_scope` : vaut `all-publishable` par défaut ; utilisez `selected` uniquement
@ -507,42 +621,42 @@ package OpenClaw ne doit pas être publié.
- `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
workflow comme orchestrateur de réparation limité aux Plugins
`OpenClaw Release Checks` accepte ces entrées contrôlées par l'opérateur :
`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 avec secrets
exigent que le commit résolu soit accessible depuis une branche OpenClaw ou
un tag de release.
- `run_release_soak` : active le soak exhaustif en direct/E2E, chemin de release Docker et
survivor de mise à niveau all-since sur les contrôles de release stables/par défaut. Il est forcé
- `ref` : branche, tag ou SHA de commit complet à valider. Les vérifications portant des secrets
exigent que le commit résolu soit accessible depuis une branche OpenClaw ou un
tag de release.
- `run_release_soak` : activer le test dendurance exhaustif en direct/E2E, chemin de publication Docker et
survivant de mise à niveau depuis toutes les versions sur les vérifications de release stable/par défaut. Il est forcé
par `release_profile=full`.
Règles :
- Les tags stables et de correction peuvent publier vers `beta` ou `latest`
- Les tags de prérelease bêta peuvent publier uniquement vers `beta`
- Pour `OpenClaw NPM Release`, l'entrée SHA de commit complet n'est autorisée que lorsque
- Les tags de préversion bêta ne peuvent publier que 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
en validation uniquement
- Le vrai chemin de publication doit utiliser le même `npm_dist_tag` que celui utilisé pendant la pré-vérification ;
uniquement de validation
- Le véritable chemin de publication doit utiliser le même `npm_dist_tag` que celui utilisé pendant la prévalidation ;
le workflow vérifie ces métadonnées avant de poursuivre la publication
## Séquence de release npm stable
Lors de la création d'une release npm stable :
Lors de la préparation dune release npm stable :
1. Exécutez `OpenClaw NPM Release` avec `preflight_only=true`
- Avant qu'un tag existe, vous pouvez utiliser le SHA de commit complet de la branche de workflow actuelle
pour une répétition de validation uniquement du workflow de pré-vérification
2. Choisissez `npm_dist_tag=beta` pour le flux normal bêta d'abord, ou `latest` uniquement
- Avant quun tag existe, vous pouvez utiliser le SHA de commit complet de la branche de workflow actuelle
pour une simulation à blanc de validation uniquement du workflow de prévalidation
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 du cache de prompts en direct, Docker, QA Lab,
3. Exécutez `Full Release Validation` sur la branche de release, le tag de release ou le SHA de
commit complet lorsque vous voulez une CI normale plus une couverture cache de prompts en direct, Docker, QA Lab,
Matrix et Telegram depuis un seul workflow manuel
4. Si vous n'avez intentionnellement besoin que du graphe de tests normal déterministe, exécutez plutôt le
workflow manuel `CI` sur la ref de release
4. Si vous navez intentionnellement besoin que du graphe de tests normal déterministe, exécutez le
workflow manuel `CI` sur la ref de release à la place
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
@ -551,20 +665,20 @@ Lors de la création d'une release npm stable :
`openclaw/releases-private/.github/workflows/openclaw-npm-dist-tags.yml`
pour promouvoir cette version stable de `beta` vers `latest`
8. Si la release a été intentionnellement 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
d'auto-réparation planifiée déplacer `beta` plus tard
doit suivre immédiatement le même build stable, utilisez le 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
La mutation de dist-tag se trouve 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.
La mutation du dist-tag réside dans le dépôt privé pour des raisons de sécurité, car elle nécessite encore
`NPM_TOKEN`, tandis que le dépôt public conserve une publication uniquement OIDC.
Cela garde à la fois le chemin de publication directe et le chemin de promotion bêta d'abord
documentés et visibles par l'opérateur.
Cela garde le chemin de publication directe et le chemin de promotion bêta dabord à la fois
documentés et visibles pour lopérateur.
Si un mainteneur doit revenir à l'authentification npm locale, exécutez toutes les commandes
CLI 1Password (`op`) uniquement dans une session tmux dédiée. N'appelez pas `op`
directement depuis le shell principal de l'agent ; le garder dans tmux rend les invites,
alertes et la gestion OTP observables et évite les alertes hôte répétées.
Si un mainteneur doit se rabattre sur lauthentification npm locale, exécutez toutes 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 prompts,
alertes et traitements OTP observables et empêche les alertes hôte répétées.
## Références publiques
@ -578,10 +692,10 @@ alertes et la gestion OTP observables et évite les alertes hôte répétées.
- [`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 release privée dans
Les mainteneurs utilisent la documentation privée de release dans
[`openclaw/maintainers/release/README.md`](https://github.com/openclaw/maintainers/blob/main/release/README.md)
pour le runbook réel.
## Connexe
## Associé
- [Canaux de release](/fr/install/development-channels)
- [Canaux de publication](/fr/install/development-channels)

View File

@ -4,60 +4,60 @@ read_when:
summary: Comment exécuter les tests localement (vitest) et quand utiliser les modes force/couverture
title: Tests
x-i18n:
generated_at: "2026-05-05T01:49:26Z"
generated_at: "2026-05-05T06:18:37Z"
model: gpt-5.5
provider: openai
source_hash: 7e8421518d63cade24ce8c2a08fa10538b66d2332b1eb5744e47c6d5a5e84605
source_hash: cc31ab27a63607ec5134306a0129bd164e4235f26631da4f691f657adda70eed
source_path: reference/test.md
workflow: 16
---
- Kit de test complet (suites, tests en direct, Docker) : [Tests](/fr/help/testing)
- Validation des mises à jour et des packages Plugin : [Tester les mises à jour et les plugins](/fr/help/testing-updates-plugins)
- Kit de test complet (suites, live, Docker) : [Tests](/fr/help/testing)
- Validation des mises à jour et du package Plugin : [Tester les mises à jour et les plugins](/fr/help/testing-updates-plugins)
- `pnpm test:force` : tue tout processus Gateway persistant qui occupe le port de contrôle par défaut, puis exécute la suite Vitest complète avec un port Gateway isolé afin que les tests serveur nentrent pas en conflit avec une instance en cours dexécution. Utilisez cette commande lorsquune exécution précédente du Gateway a laissé le port 18789 occupé.
- `pnpm test:coverage` : exécute la suite unitaire avec la couverture V8 (via `vitest.unit.config.ts`). Il sagit dune barrière de couverture unitaire des fichiers chargés, et non dune couverture de tous les fichiers de tout le dépôt. Les seuils sont de 70 % pour les lignes/fonctions/instructions et de 55 % pour les branches. Comme `coverage.all` est false, la barrière mesure les fichiers chargés par la suite de couverture unitaire au lieu de traiter chaque fichier source de voie fractionnée comme non couvert.
- `pnpm test:force` : tue tout processus Gateway restant qui occupe le port de contrôle par défaut, puis exécute toute la suite Vitest avec un port Gateway isolé afin que les tests serveur nentrent pas en conflit avec une instance en cours dexécution. Utilisez ceci lorsquune exécution Gateway précédente a laissé le port 18789 occupé.
- `pnpm test:coverage` : exécute la suite unitaire avec la couverture V8 (via `vitest.unit.config.ts`). Il sagit dun seuil de couverture unitaire des fichiers chargés, pas dune couverture de tous les fichiers de tout le dépôt. Les seuils sont de 70 % pour les lignes/fonctions/instructions et de 55 % pour les branches. Comme `coverage.all` vaut false, le seuil mesure les fichiers chargés par la suite de couverture unitaire au lieu de considérer chaque fichier source des lanes séparées comme non couvert.
- `pnpm test:coverage:changed` : exécute la couverture unitaire uniquement pour les fichiers modifiés depuis `origin/main`.
- `pnpm test:changed` : exécution de tests modifiés intelligente et peu coûteuse. Elle exécute des cibles précises à partir des modifications directes de tests, des fichiers frères `*.test.ts`, des mappages source explicites et du graphe dimport local. Les changements larges/config/package sont ignorés sauf sils correspondent à des tests précis.
- `pnpm test:changed` : exécution bon marché et intelligente des tests modifiés. Elle exécute des cibles précises à partir des modifications directes de tests, des fichiers frères `*.test.ts`, des correspondances source explicites et du graphe dimport local. Les modifications larges/config/package sont ignorées sauf si elles correspondent à des tests précis.
- `OPENCLAW_TEST_CHANGED_BROAD=1 pnpm test:changed` : exécution large explicite des tests modifiés. Utilisez-la lorsquune modification du harnais de test/de la config/du package doit revenir au comportement plus large de tests modifiés de Vitest.
- `pnpm changed:lanes` : affiche les voies architecturales déclenchées par le diff par rapport à `origin/main`.
- `pnpm check:changed` : exécute la barrière de vérification intelligente des changements pour le diff par rapport à `origin/main`. Elle exécute les commandes de typecheck, lint et garde pour les voies architecturales concernées, mais nexécute pas les tests Vitest. Utilisez `pnpm test:changed` ou `pnpm test <target>` explicite comme preuve de test.
- `pnpm test` : achemine les cibles explicites de fichiers/répertoires vers des voies Vitest ciblées. Les exécutions sans cible utilisent des groupes de fragments fixes et sétendent aux configs feuilles pour lexécution parallèle locale ; le groupe dextensions sétend toujours aux configs de fragments par extension au lieu dun unique énorme processus de projet racine.
- Les exécutions du wrapper de test se terminent par un bref résumé `[test] passed|failed|skipped ... in ...`. La propre ligne de durée de Vitest reste le détail par fragment.
- État de test OpenClaw partagé : utilisez `src/test-utils/openclaw-test-state.ts` depuis Vitest lorsquun test a besoin dun `HOME`, `OPENCLAW_STATE_DIR`, `OPENCLAW_CONFIG_PATH`, dun fixture de config, dun espace de travail, dun répertoire dagent ou dun magasin de profils dauth isolé.
- Helpers E2E de processus : utilisez `test/helpers/openclaw-test-instance.ts` lorsquun test E2E au niveau processus Vitest a besoin dun Gateway en cours dexécution, dun env CLI, dune capture de logs et dun nettoyage au même endroit.
- Helpers E2E Docker/Bash : les voies qui sourcent `scripts/lib/docker-e2e-image.sh` peuvent passer `docker_e2e_test_state_shell_b64 <label> <scenario>` dans le conteneur et le décoder avec `scripts/lib/openclaw-e2e-instance.sh` ; les scripts multi-home peuvent passer `docker_e2e_test_state_function_b64` et appeler `openclaw_test_state_create <label> <scenario>` dans chaque flux. Les appelants de plus bas niveau peuvent utiliser `scripts/lib/openclaw-test-state.mjs shell --label <name> --scenario <name>` pour un extrait shell dans le conteneur, ou `node scripts/lib/openclaw-test-state.mjs -- create --label <name> --scenario <name> --env-file <path> --json` pour un fichier env hôte sourçable. Le `--` avant `create` empêche les runtimes Node récents de traiter `--env-file` comme un flag Node. Les voies Docker/Bash qui lancent un Gateway peuvent sourcer `scripts/lib/openclaw-e2e-instance.sh` dans le conteneur pour la résolution du point dentrée, le démarrage OpenAI simulé, le lancement Gateway au premier plan/en arrière-plan, les probes de disponibilité, lexport denv détat, les dumps de logs et le nettoyage des processus.
- Les exécutions de fragments complètes, dextensions et à motif dinclusion mettent à jour les données de temps locales dans `.artifacts/vitest-shard-timings.json` ; les exécutions ultérieures de config entière utilisent ces temps pour équilibrer les fragments lents et rapides. Les fragments CI à motif dinclusion ajoutent le nom du fragment à la clé de temps, ce qui garde les temps de fragments filtrés visibles sans remplacer les données de temps de config entière. Définissez `OPENCLAW_TEST_PROJECTS_TIMINGS=0` pour ignorer lartéfact de temps local.
- Certains fichiers de test `plugin-sdk` et `commands` passent désormais par des voies légères dédiées qui ne conservent que `test/setup.ts`, en laissant les cas lourds en runtime sur leurs voies existantes.
- Les fichiers source avec des tests frères correspondent à ce frère avant de revenir à des globs de répertoire plus larges. Les modifications de helpers sous `src/channels/plugins/contracts/test-helpers`, `src/plugin-sdk/test-helpers` et `src/plugins/contracts` utilisent un graphe dimport local pour exécuter les tests importeurs au lieu dexécuter largement chaque fragment lorsque le chemin de dépendance est précis.
- `auto-reply` se divise désormais aussi en trois configs dédiées (`core`, `top-level`, `reply`) afin que le harnais de réponse ne domine pas les tests plus légers de statut/token/helper au niveau supérieur.
- `pnpm changed:lanes` : affiche les lanes architecturales déclenchées par le diff par rapport à `origin/main`.
- `pnpm check:changed` : exécute le seuil intelligent de vérification des modifications pour le diff par rapport à `origin/main`. Il exécute les commandes de typecheck, de lint et de garde pour les lanes architecturales affectées, mais nexécute pas les tests Vitest. Utilisez `pnpm test:changed` ou `pnpm test <target>` explicite pour une preuve par les tests.
- `pnpm test` : route les cibles explicites fichier/répertoire via des lanes Vitest ciblées. Les exécutions sans cible utilisent des groupes de shards fixes et sétendent aux configs feuilles pour lexécution parallèle locale ; le groupe dextensions sétend toujours aux configs de shards par extension plutôt quà un seul énorme processus de projet racine.
- Les exécutions du wrapper de test se terminent par un court résumé `[test] passed|failed|skipped ... in ...`. La ligne de durée propre à Vitest reste le détail par shard.
- État de test OpenClaw partagé : utilisez `src/test-utils/openclaw-test-state.ts` depuis Vitest lorsquun test a besoin dun `HOME`, `OPENCLAW_STATE_DIR`, `OPENCLAW_CONFIG_PATH`, dun fixture de config, dun espace de travail, dun répertoire agent ou dun magasin de profils dauthentification isolés.
- Helpers E2E de processus : utilisez `test/helpers/openclaw-test-instance.ts` lorsquun test E2E au niveau processus Vitest a besoin dun Gateway en cours dexécution, dun environnement CLI, de la capture des logs et du nettoyage au même endroit.
- Helpers E2E Docker/Bash : les lanes qui sourcent `scripts/lib/docker-e2e-image.sh` peuvent passer `docker_e2e_test_state_shell_b64 <label> <scenario>` dans le conteneur et le décoder avec `scripts/lib/openclaw-e2e-instance.sh` ; les scripts multi-home peuvent passer `docker_e2e_test_state_function_b64` et appeler `openclaw_test_state_create <label> <scenario>` dans chaque flux. Les appelants de plus bas niveau peuvent utiliser `scripts/lib/openclaw-test-state.mjs shell --label <name> --scenario <name>` pour un extrait shell dans le conteneur, ou `node scripts/lib/openclaw-test-state.mjs -- create --label <name> --scenario <name> --env-file <path> --json` pour un fichier denvironnement hôte sourçable. Le `--` avant `create` empêche les runtimes Node plus récents de traiter `--env-file` comme un flag Node. Les lanes Docker/Bash qui lancent un Gateway peuvent sourcer `scripts/lib/openclaw-e2e-instance.sh` dans le conteneur pour la résolution de lentrypoint, le démarrage OpenAI simulé, le lancement Gateway au premier plan/en arrière-plan, les sondes de disponibilité, lexport de lenvironnement détat, les dumps de logs et le nettoyage des processus.
- Les exécutions de shards complètes, dextensions et à motif dinclusion mettent à jour les données de timings locales dans `.artifacts/vitest-shard-timings.json` ; les exécutions ultérieures de configs complètes utilisent ces timings pour équilibrer les shards lents et rapides. Les shards CI à motif dinclusion ajoutent le nom du shard à la clé de timing, ce qui garde les timings de shards filtrés visibles sans remplacer les données de timing de config complète. Définissez `OPENCLAW_TEST_PROJECTS_TIMINGS=0` pour ignorer lartefact de timing local.
- Certains fichiers de test `plugin-sdk` et `commands` sont désormais routés via des lanes légères dédiées qui ne conservent que `test/setup.ts`, en laissant les cas lourds en runtime sur leurs lanes existantes.
- Les fichiers source avec tests frères correspondent dabord à ce frère avant de revenir à des globs de répertoire plus larges. Les modifications de helpers sous `src/channels/plugins/contracts/test-helpers`, `src/plugin-sdk/test-helpers` et `src/plugins/contracts` utilisent un graphe dimport local pour exécuter les tests importeurs au lieu de lancer largement tous les shards lorsque le chemin de dépendance est précis.
- `auto-reply` est maintenant aussi séparé en trois configs dédiées (`core`, `top-level`, `reply`) afin que le harnais de réponse ne domine pas les tests plus légers de statut/token/helpers de premier niveau.
- La config Vitest de base utilise désormais par défaut `pool: "threads"` et `isolate: false`, avec le runner non isolé partagé activé dans les configs du dépôt.
- `pnpm test:channels` exécute `vitest.channels.config.ts`.
- `pnpm test:extensions` et `pnpm test extensions` exécutent tous les fragments dextensions/plugins. Les plugins de canaux lourds, le plugin de navigateur et OpenAI sexécutent comme fragments dédiés ; les autres groupes de plugins restent regroupés. Utilisez `pnpm test extensions/<id>` pour une voie de plugin groupé.
- `pnpm test:perf:imports` : active les rapports de durée dimport Vitest et de ventilation des imports, tout en continuant à utiliser le routage de voies ciblées pour les cibles explicites de fichiers/répertoires.
- `pnpm test:perf:imports:changed` : même profilage dimport, mais uniquement pour les fichiers modifiés depuis `origin/main`.
- `pnpm test:perf:changed:bench -- --ref <git-ref>` compare les performances du chemin routé en mode changed avec lexécution native du projet racine pour le même diff git commité.
- `pnpm test:perf:changed:bench -- --worktree` compare les performances de lensemble de changements de larbre de travail actuel sans commit préalable.
- `pnpm test:perf:profile:main` : écrit un profil CPU pour le thread principal Vitest (`.artifacts/vitest-main-profile`).
- `pnpm test:perf:profile:runner` : écrit des profils CPU + heap pour le runner unitaire (`.artifacts/vitest-runner-profile`).
- `pnpm test:perf:groups --full-suite --allow-failures --output .artifacts/test-perf/baseline-before.json` : exécute chaque config feuille Vitest de suite complète en série et écrit des données de durée groupées ainsi que des artéfacts JSON/log par config. Le Test Performance Agent lutilise comme baseline avant de tenter des corrections de tests lents.
- `pnpm test:perf:groups:compare .artifacts/test-perf/baseline-before.json .artifacts/test-perf/after-agent.json` : compare les rapports groupés après une modification axée sur les performances.
- `pnpm test:extensions` et `pnpm test extensions` exécutent tous les shards dextensions/plugins. Les plugins de canaux lourds, le plugin navigateur et OpenAI sexécutent comme des shards dédiés ; les autres groupes de plugins restent regroupés. Utilisez `pnpm test extensions/<id>` pour une lane dun seul plugin groupé.
- `pnpm test:perf:imports` : active le reporting de durée dimport et de répartition des imports Vitest, tout en utilisant encore le routage par lane ciblée pour les cibles explicites fichier/répertoire.
- `pnpm test:perf:imports:changed` : même profilage des imports, mais uniquement pour les fichiers modifiés depuis `origin/main`.
- `pnpm test:perf:changed:bench -- --ref <git-ref>` compare en benchmark le chemin routé en mode modifié à lexécution native du projet racine pour le même diff git committé.
- `pnpm test:perf:changed:bench -- --worktree` compare en benchmark lensemble de modifications de larbre de travail actuel sans commit préalable.
- `pnpm test:perf:profile:main` : écrit un profil CPU pour le thread principal de Vitest (`.artifacts/vitest-main-profile`).
- `pnpm test:perf:profile:runner` : écrit des profils CPU + tas pour le runner unitaire (`.artifacts/vitest-runner-profile`).
- `pnpm test:perf:groups --full-suite --allow-failures --output .artifacts/test-perf/baseline-before.json` : exécute en série chaque config feuille Vitest de suite complète et écrit les données de durée groupées ainsi que les artefacts JSON/log par config. Le Test Performance Agent lutilise comme référence avant de tenter des correctifs de tests lents.
- `pnpm test:perf:groups:compare .artifacts/test-perf/baseline-before.json .artifacts/test-perf/after-agent.json` : compare les rapports groupés après une modification axée sur la performance.
- Intégration Gateway : activation explicite via `OPENCLAW_TEST_INCLUDE_GATEWAY=1 pnpm test` ou `pnpm test:gateway`.
- `pnpm test:e2e` : exécute les tests smoke Gateway end-to-end (appariement multi-instance WS/HTTP/node). Par défaut, utilise `threads` + `isolate: false` avec des workers adaptatifs dans `vitest.e2e.config.ts` ; ajustez avec `OPENCLAW_E2E_WORKERS=<n>` et définissez `OPENCLAW_E2E_VERBOSE=1` pour des logs verbeux.
- `pnpm test:live` : exécute les tests live de fournisseurs (minimax/zai). Nécessite des clés API et `LIVE=1` (ou `*_LIVE_TEST=1` spécifique au fournisseur) pour ne pas être ignoré.
- `pnpm test:docker:all` : construit limage de test live partagée, empaquette OpenClaw une fois comme tarball npm, construit/réutilise une image runner Node/Git minimale ainsi quune image fonctionnelle qui installe ce tarball dans `/app`, puis exécute les voies smoke Docker avec `OPENCLAW_SKIP_DOCKER_BUILD=1` via un ordonnanceur pondéré. Limage minimale (`OPENCLAW_DOCKER_E2E_BARE_IMAGE`) est utilisée pour les voies dinstallation/mise à jour/dépendance de plugin ; ces voies montent le tarball préconstruit au lieu dutiliser des sources de dépôt copiées. Limage fonctionnelle (`OPENCLAW_DOCKER_E2E_FUNCTIONAL_IMAGE`) est utilisée pour les voies de fonctionnalité normale de lapplication construite. `scripts/package-openclaw-for-docker.mjs` est lunique packer de package local/CI et valide le tarball ainsi que `dist/postinstall-inventory.json` avant que Docker ne le consomme. Les définitions de voies Docker se trouvent dans `scripts/lib/docker-e2e-scenarios.mjs` ; la logique du planificateur se trouve dans `scripts/lib/docker-e2e-plan.mjs` ; `scripts/test-docker-all.mjs` exécute le plan sélectionné. `node scripts/test-docker-all.mjs --plan-json` émet le plan CI détenu par lordonnanceur pour les voies sélectionnées, les types dimages, les besoins en package/image live, les scénarios détat et les vérifications didentifiants sans construire ni exécuter Docker. `OPENCLAW_DOCKER_ALL_PARALLELISM=<n>` contrôle les slots de processus et vaut 10 par défaut ; `OPENCLAW_DOCKER_ALL_TAIL_PARALLELISM=<n>` contrôle le pool de fin sensible aux fournisseurs et vaut 10 par défaut. Les plafonds de voies lourdes valent par défaut `OPENCLAW_DOCKER_ALL_LIVE_LIMIT=9`, `OPENCLAW_DOCKER_ALL_NPM_LIMIT=10` et `OPENCLAW_DOCKER_ALL_SERVICE_LIMIT=7` ; les plafonds de fournisseurs valent par défaut une voie lourde par fournisseur via `OPENCLAW_DOCKER_ALL_LIVE_CLAUDE_LIMIT=4`, `OPENCLAW_DOCKER_ALL_LIVE_CODEX_LIMIT=4` et `OPENCLAW_DOCKER_ALL_LIVE_GEMINI_LIMIT=4`. Utilisez `OPENCLAW_DOCKER_ALL_WEIGHT_LIMIT` ou `OPENCLAW_DOCKER_ALL_DOCKER_LIMIT` pour les hôtes plus grands. Si une voie dépasse le poids effectif ou le plafond de ressources sur un hôte à faible parallélisme, elle peut quand même démarrer depuis un pool vide et sexécutera seule jusquà libérer la capacité. Les démarrages de voies sont espacés de 2 secondes par défaut afin déviter des tempêtes de création du daemon Docker local ; surchargez avec `OPENCLAW_DOCKER_ALL_START_STAGGER_MS=<ms>`. Le runner pré-vérifie Docker par défaut, nettoie les conteneurs E2E OpenClaw obsolètes, émet le statut des voies actives toutes les 30 secondes, partage les caches doutils CLI de fournisseurs entre les voies compatibles, réessaie une fois par défaut les échecs transitoires de fournisseurs live (`OPENCLAW_DOCKER_ALL_LIVE_RETRIES=<n>`) et stocke les temps de voies dans `.artifacts/docker-tests/lane-timings.json` pour un tri du plus long au plus court lors des exécutions ultérieures. Utilisez `OPENCLAW_DOCKER_ALL_DRY_RUN=1` pour imprimer le manifeste des voies sans exécuter Docker, `OPENCLAW_DOCKER_ALL_STATUS_INTERVAL_MS=<ms>` pour ajuster la sortie de statut, ou `OPENCLAW_DOCKER_ALL_TIMINGS=0` pour désactiver la réutilisation des temps. Utilisez `OPENCLAW_DOCKER_ALL_LIVE_MODE=skip` pour les voies déterministes/locales uniquement ou `OPENCLAW_DOCKER_ALL_LIVE_MODE=only` pour les voies de fournisseurs live uniquement ; les alias de package sont `pnpm test:docker:local:all` et `pnpm test:docker:live:all`. Le mode live-only fusionne les voies live principales et de fin dans un seul pool du plus long au plus court afin que les buckets de fournisseurs puissent regrouper le travail Claude, Codex et Gemini. Le runner cesse de planifier de nouvelles voies groupées après le premier échec sauf si `OPENCLAW_DOCKER_ALL_FAIL_FAST=0` est défini, et chaque voie dispose dun timeout de secours de 120 minutes surchargeable avec `OPENCLAW_DOCKER_ALL_LANE_TIMEOUT_MS` ; certaines voies live/de fin sélectionnées utilisent des plafonds par voie plus stricts. Les commandes de configuration Docker de backend CLI ont leur propre timeout via `OPENCLAW_LIVE_CLI_BACKEND_SETUP_TIMEOUT_SECONDS` (par défaut 180). Les logs par voie, `summary.json`, `failures.json` et les temps de phase sont écrits sous `.artifacts/docker-tests/<run-id>/` ; utilisez `pnpm test:docker:timings <summary.json>` pour inspecter les voies lentes et `pnpm test:docker:rerun <run-id|summary.json|failures.json>` pour imprimer des commandes de réexécution ciblées peu coûteuses.
- `pnpm test:docker:browser-cdp-snapshot` : construit un conteneur E2E source basé sur Chromium, démarre un CDP brut ainsi quun Gateway isolé, exécute `browser doctor --deep` et vérifie que les instantanés de rôles CDP incluent les URL de liens, les éléments cliquables promus par le curseur, les refs diframe et les métadonnées de frame.
- Les probes Docker live de backend CLI peuvent être exécutées comme voies ciblées, par exemple `pnpm test:docker:live-cli-backend:codex`, `pnpm test:docker:live-cli-backend:codex:resume` ou `pnpm test:docker:live-cli-backend:codex:mcp`. Claude et Gemini ont des alias `:resume` et `:mcp` correspondants.
- `pnpm test:docker:openwebui` : démarre OpenClaw + Open WebUI dockerisés, se connecte via Open WebUI, vérifie `/api/models`, puis exécute un vrai chat proxifié via `/api/chat/completions`. Nécessite une clé de modèle live utilisable (par exemple OpenAI dans `~/.profile`), récupère une image Open WebUI externe et nest pas censé être stable en CI comme les suites unitaires/e2e normales.
- `pnpm test:docker:mcp-channels` : démarre un conteneur Gateway prérempli et un second conteneur client qui lance `openclaw mcp serve`, puis vérifie la découverte des conversations routées, les lectures de transcripts, les métadonnées de pièces jointes, le comportement de file dévénements live, le routage des envois sortants et les notifications de canal + permission au style Claude via le vrai pont stdio. Lassertion de notification Claude lit directement les frames MCP stdio brutes afin que le smoke reflète ce que le pont émet réellement.
- `pnpm test:docker:upgrade-survivor` : installe le tarball OpenClaw empaqueté sur un fixture dancien utilisateur non vierge, exécute la mise à jour du package ainsi que `doctor` en mode non interactif sans clés de fournisseur ou de canal live, puis démarre un Gateway en boucle locale et vérifie que les agents, la configuration des canaux, les listes dautorisation de plugins, les fichiers despace de travail/de session, létat obsolète des dépendances de plugins héritées, le démarrage et létat RPC survivent.
- `pnpm test:docker:published-upgrade-survivor` : installe `openclaw@latest` par défaut, injecte des fichiers réalistes dutilisateur existant sans clés de fournisseur ou de canal live, configure cette base avec une recette de commande `openclaw config set` intégrée, met à jour cette installation publiée vers le tarball OpenClaw empaqueté, exécute `doctor` en mode non interactif, écrit `.artifacts/upgrade-survivor/summary.json`, puis démarre un Gateway en boucle locale et vérifie que les intents configurés, les fichiers despace de travail/de session, la configuration obsolète des plugins et létat hérité des dépendances, le démarrage, `/healthz`, `/readyz` et létat RPC survivent ou sont réparés proprement. Remplacez une base avec `OPENCLAW_UPGRADE_SURVIVOR_BASELINE_SPEC`, développez une matrice exacte avec `OPENCLAW_UPGRADE_SURVIVOR_BASELINE_SPECS` comme `all-since-2026.4.23`, ou ajoutez des fixtures de scénario avec `OPENCLAW_UPGRADE_SURVIVOR_SCENARIOS=reported-issues` ; lensemble `reported-issues` inclut `configured-plugin-installs` pour vérifier que les plugins OpenClaw externes configurés sinstallent automatiquement pendant la mise à niveau, et `stale-source-plugin-shadow` pour empêcher les ombres de plugins source uniquement de casser le démarrage. Package Acceptance les expose sous les noms `published_upgrade_survivor_baseline`, `published_upgrade_survivor_baselines` et `published_upgrade_survivor_scenarios`.
- `pnpm test:docker:update-migration` : exécute le harness `published-upgrade survivor` dans le scénario `plugin-deps-cleanup`, qui met fortement laccent sur le nettoyage, en commençant à `openclaw@2026.4.23` par défaut. Le workflow séparé `Update Migration` développe cette voie avec `baselines=all-since-2026.4.23` afin que chaque package stable publié à partir de `.23` soit mis à jour vers le candidat et prouve le nettoyage des dépendances des plugins configurés en dehors de Full Release CI.
- `pnpm test:docker:plugins` : exécute un smoke test dinstallation/mise à jour pour le chemin local, `file:`, les packages de registre npm avec dépendances hissées, les références git mobiles, les fixtures ClawHub, les mises à jour du marketplace et lactivation/linspection du bundle Claude.
- `pnpm test:e2e` : exécute les smoke tests Gateway de bout en bout (appariement multi-instance WS/HTTP/node). Utilise par défaut `threads` + `isolate: false` avec des workers adaptatifs dans `vitest.e2e.config.ts` ; ajustez avec `OPENCLAW_E2E_WORKERS=<n>` et définissez `OPENCLAW_E2E_VERBOSE=1` pour des logs verbeux.
- `pnpm test:live` : exécute les tests live de fournisseurs (minimax/zai). Nécessite des clés API et `LIVE=1` (ou `*_LIVE_TEST=1` spécifique au fournisseur) pour ne plus être ignoré.
- `pnpm test:docker:all` : construit limage de test live partagée, package OpenClaw une fois comme tarball npm, construit/réutilise une image runner Node/Git nue ainsi quune image fonctionnelle qui installe ce tarball dans `/app`, puis exécute les lanes de smoke Docker avec `OPENCLAW_SKIP_DOCKER_BUILD=1` via un ordonnanceur pondéré. Limage nue (`OPENCLAW_DOCKER_E2E_BARE_IMAGE`) est utilisée pour les lanes dinstallation/mise à jour/dépendances de plugin ; ces lanes montent le tarball préconstruit au lieu dutiliser les sources du dépôt copiées. Limage fonctionnelle (`OPENCLAW_DOCKER_E2E_FUNCTIONAL_IMAGE`) est utilisée pour les lanes normales de fonctionnalité dapplication construite. `scripts/package-openclaw-for-docker.mjs` est lunique packager de package local/CI et valide le tarball ainsi que `dist/postinstall-inventory.json` avant consommation par Docker. Les définitions de lanes Docker vivent dans `scripts/lib/docker-e2e-scenarios.mjs` ; la logique du planificateur vit dans `scripts/lib/docker-e2e-plan.mjs` ; `scripts/test-docker-all.mjs` exécute le plan sélectionné. `node scripts/test-docker-all.mjs --plan-json` émet le plan CI possédé par lordonnanceur pour les lanes sélectionnées, les types dimages, les besoins package/image live, les scénarios détat et les vérifications didentifiants, sans construire ni exécuter Docker. `OPENCLAW_DOCKER_ALL_PARALLELISM=<n>` contrôle les slots de processus et vaut 10 par défaut ; `OPENCLAW_DOCKER_ALL_TAIL_PARALLELISM=<n>` contrôle le pool de queue sensible aux fournisseurs et vaut 10 par défaut. Les plafonds des lanes lourdes valent par défaut `OPENCLAW_DOCKER_ALL_LIVE_LIMIT=9`, `OPENCLAW_DOCKER_ALL_NPM_LIMIT=10` et `OPENCLAW_DOCKER_ALL_SERVICE_LIMIT=7` ; les plafonds de fournisseurs valent par défaut une lane lourde par fournisseur via `OPENCLAW_DOCKER_ALL_LIVE_CLAUDE_LIMIT=4`, `OPENCLAW_DOCKER_ALL_LIVE_CODEX_LIMIT=4` et `OPENCLAW_DOCKER_ALL_LIVE_GEMINI_LIMIT=4`. Utilisez `OPENCLAW_DOCKER_ALL_WEIGHT_LIMIT` ou `OPENCLAW_DOCKER_ALL_DOCKER_LIMIT` pour des hôtes plus grands. Si une lane dépasse le plafond effectif de poids ou de ressources sur un hôte à faible parallélisme, elle peut quand même démarrer depuis un pool vide et sexécutera seule jusquà libérer de la capacité. Les démarrages de lanes sont espacés de 2 secondes par défaut pour éviter les tempêtes de création du démon Docker local ; remplacez avec `OPENCLAW_DOCKER_ALL_START_STAGGER_MS=<ms>`. Le runner effectue par défaut des vérifications préalables Docker, nettoie les conteneurs E2E OpenClaw obsolètes, émet létat des lanes actives toutes les 30 secondes, partage les caches doutils CLI de fournisseurs entre lanes compatibles, réessaie par défaut une fois les échecs transitoires de fournisseurs live (`OPENCLAW_DOCKER_ALL_LIVE_RETRIES=<n>`) et stocke les timings de lanes dans `.artifacts/docker-tests/lane-timings.json` pour un ordre du plus long au plus court lors des exécutions ultérieures. Utilisez `OPENCLAW_DOCKER_ALL_DRY_RUN=1` pour afficher le manifeste des lanes sans exécuter Docker, `OPENCLAW_DOCKER_ALL_STATUS_INTERVAL_MS=<ms>` pour ajuster la sortie détat, ou `OPENCLAW_DOCKER_ALL_TIMINGS=0` pour désactiver la réutilisation des timings. Utilisez `OPENCLAW_DOCKER_ALL_LIVE_MODE=skip` pour les lanes déterministes/locales uniquement ou `OPENCLAW_DOCKER_ALL_LIVE_MODE=only` pour les lanes de fournisseurs live uniquement ; les alias de package sont `pnpm test:docker:local:all` et `pnpm test:docker:live:all`. Le mode live-only fusionne les lanes live principales et de queue dans un pool unique du plus long au plus court afin que les compartiments de fournisseurs puissent regrouper le travail Claude, Codex et Gemini. Le runner cesse de planifier de nouvelles lanes groupées après le premier échec sauf si `OPENCLAW_DOCKER_ALL_FAIL_FAST=0` est défini, et chaque lane dispose dun timeout de repli de 120 minutes, remplaçable avec `OPENCLAW_DOCKER_ALL_LANE_TIMEOUT_MS` ; certaines lanes live/de queue sélectionnées utilisent des plafonds par lane plus stricts. Les commandes de configuration Docker du backend CLI ont leur propre timeout via `OPENCLAW_LIVE_CLI_BACKEND_SETUP_TIMEOUT_SECONDS` (par défaut 180). Les logs par lane, `summary.json`, `failures.json` et les timings de phase sont écrits sous `.artifacts/docker-tests/<run-id>/` ; utilisez `pnpm test:docker:timings <summary.json>` pour inspecter les lanes lentes et `pnpm test:docker:rerun <run-id|summary.json|failures.json>` pour afficher des commandes de relance ciblées bon marché.
- `pnpm test:docker:browser-cdp-snapshot` : construit un conteneur E2E source adossé à Chromium, démarre CDP brut ainsi quun Gateway isolé, exécute `browser doctor --deep`, et vérifie que les instantanés de rôle CDP incluent les URL de liens, les éléments cliquables promus par le curseur, les références diframe et les métadonnées de frame.
- Les sondes Docker live du backend CLI peuvent être exécutées comme lanes ciblées, par exemple `pnpm test:docker:live-cli-backend:codex`, `pnpm test:docker:live-cli-backend:codex:resume` ou `pnpm test:docker:live-cli-backend:codex:mcp`. Claude et Gemini disposent dalias `:resume` et `:mcp` correspondants.
- `pnpm test:docker:openwebui` : démarre OpenClaw + Open WebUI dockerisés, se connecte via Open WebUI, vérifie `/api/models`, puis exécute un vrai chat proxifié via `/api/chat/completions`. Nécessite une clé de modèle live utilisable (par exemple OpenAI dans `~/.profile`), télécharge une image Open WebUI externe et nest pas censé être stable en CI comme les suites unitaires/e2e normales.
- `pnpm test:docker:mcp-channels` : démarre un conteneur Gateway prérempli et un second conteneur client qui lance `openclaw mcp serve`, puis vérifie la découverte des conversations routées, les lectures de transcripts, les métadonnées de pièces jointes, le comportement de la file dévénements live, le routage des envois sortants et les notifications de canal + permission de style Claude sur le vrai pont stdio. Lassertion de notification Claude lit directement les trames MCP stdio brutes afin que le smoke reflète ce que le pont émet réellement.
- `pnpm test:docker:upgrade-survivor` : installe larchive tar OpenClaw empaquetée par-dessus un fixture dancien utilisateur non nettoyé, exécute la mise à jour du paquet ainsi que doctor en mode non interactif sans clés de fournisseur ou de canal live, puis démarre un Gateway en loopback et vérifie que les agents, la configuration des canaux, les listes dautorisation de Plugin, les fichiers despace de travail/session, létat obsolète des dépendances de Plugin héritées, le démarrage et létat RPC survivent.
- `pnpm test:docker:published-upgrade-survivor` : installe `openclaw@latest` par défaut, prépare des fichiers réalistes dutilisateur existant sans clés de fournisseur ou de canal live, configure cette base avec une recette de commande `openclaw config set` intégrée, met à jour cette installation publiée vers larchive tar OpenClaw empaquetée, exécute doctor en mode non interactif, écrit `.artifacts/upgrade-survivor/summary.json`, puis démarre un Gateway en loopback et vérifie que les intents configurés, les fichiers despace de travail/session, la configuration de Plugin obsolète et létat des dépendances héritées, le démarrage, `/healthz`, `/readyz` et létat RPC survivent ou se réparent proprement. Remplacez une base avec `OPENCLAW_UPGRADE_SURVIVOR_BASELINE_SPEC`, étendez une matrice locale exacte avec `OPENCLAW_UPGRADE_SURVIVOR_BASELINE_SPECS` comme `openclaw@2026.5.2 openclaw@2026.4.23 openclaw@2026.4.15`, ou ajoutez des fixtures de scénario avec `OPENCLAW_UPGRADE_SURVIVOR_SCENARIOS=reported-issues` ; lensemble reported-issues inclut `configured-plugin-installs` pour vérifier que les plugins OpenClaw externes configurés sinstallent automatiquement pendant la mise à niveau et `stale-source-plugin-shadow` pour empêcher les ombres de Plugin uniquement source de casser le démarrage. Package Acceptance expose ces options sous forme de `published_upgrade_survivor_baseline`, `published_upgrade_survivor_baselines` et `published_upgrade_survivor_scenarios`, et résout les jetons de base méta tels que `last-stable-4` ou `all-since-2026.4.23` avant de transmettre les spécifications exactes de paquet aux lanes Docker.
- `pnpm test:docker:update-migration` : exécute le harnais published-upgrade survivor dans le scénario `plugin-deps-cleanup`, qui privilégie fortement le nettoyage, en commençant à `openclaw@2026.4.23` par défaut. Le workflow distinct `Update Migration` étend cette lane avec `baselines=all-since-2026.4.23` afin que chaque paquet stable publié depuis `.23` mette à jour vers le candidat et prouve le nettoyage des dépendances de Plugin configurées en dehors de Full Release CI.
- `pnpm test:docker:plugins` : exécute un smoke test dinstallation/mise à jour pour les chemins locaux, `file:`, les paquets de registre npm avec dépendances hissées, les refs git mobiles, les fixtures ClawHub, les mises à jour marketplace et lactivation/inspection du bundle Claude.
## Contrôle PR local
## Gate PR local
Pour les vérifications locales de fusion/contrôle de PR, exécutez :
Pour les vérifications locales de landing/gate de PR, exécutez :
- `pnpm check:changed`
- `pnpm check`
@ -66,7 +66,7 @@ Pour les vérifications locales de fusion/contrôle de PR, exécutez :
- `pnpm test`
- `pnpm check:docs`
Si `pnpm test` échoue de façon intermittente sur un hôte chargé, relancez-le une fois avant de considérer cela comme une régression, puis isolez avec `pnpm test <path/to/test>`. Pour les hôtes à mémoire contrainte, utilisez :
Si `pnpm test` échoue de façon intermittente sur un hôte chargé, relancez-le une fois avant de considérer cela comme une régression, puis isolez avec `pnpm test <path/to/test>`. Pour les hôtes limités en mémoire, utilisez :
- `OPENCLAW_VITEST_MAX_WORKERS=1 pnpm test`
- `OPENCLAW_VITEST_FS_MODULE_CACHE_PATH=/tmp/openclaw-vitest-cache pnpm test:changed`
@ -78,13 +78,13 @@ Script : [`scripts/bench-model.ts`](https://github.com/openclaw/openclaw/blob/ma
Utilisation :
- `source ~/.profile && pnpm tsx scripts/bench-model.ts --runs 10`
- Env facultatif : `MINIMAX_API_KEY`, `MINIMAX_BASE_URL`, `MINIMAX_MODEL`, `ANTHROPIC_API_KEY`
- Invite par défaut : “Répondez par un seul mot : ok. Sans ponctuation ni texte supplémentaire.”
- Env optionnel : `MINIMAX_API_KEY`, `MINIMAX_BASE_URL`, `MINIMAX_MODEL`, `ANTHROPIC_API_KEY`
- Prompt par défaut : « Réponds avec un seul mot : ok. Pas de ponctuation ni de texte supplémentaire. »
Dernière exécution (2025-12-31, 20 exécutions) :
- médiane minimax 1279 ms (min 1114, max 2431)
- médiane opus 2454 ms (min 1224, max 3170)
- minimax médiane 1279 ms (min 1114, max 2431)
- opus médiane 2454 ms (min 1224, max 3170)
## Banc de démarrage CLI
@ -114,12 +114,12 @@ Préréglages :
- `real` : `health`, `status`, `status --json`, `sessions`, `sessions --json`, `tasks --json`, `tasks list --json`, `tasks audit --json`, `agents list --json`, `gateway status`, `gateway status --json`, `gateway health --json`, `config get gateway.port`
- `all` : les deux préréglages
La sortie inclut `sampleCount`, la moyenne, p50, p95, min/max, la distribution des codes de sortie/signaux, ainsi que des résumés du RSS maximal pour chaque commande. Les options facultatives `--cpu-prof-dir` / `--heap-prof-dir` écrivent des profils V8 pour chaque exécution afin que le chronométrage et la capture de profils utilisent le même harnais.
La sortie inclut `sampleCount`, avg, p50, p95, min/max, la distribution exit-code/signal et les résumés RSS max pour chaque commande. Les options `--cpu-prof-dir` / `--heap-prof-dir` écrivent des profils V8 pour chaque exécution, afin que le chronométrage et la capture de profils utilisent le même harnais.
Conventions des sorties enregistrées :
Conventions de sortie enregistrée :
- `pnpm test:startup:bench:smoke` écrit lartefact de smoke ciblé dans `.artifacts/cli-startup-bench-smoke.json`
- `pnpm test:startup:bench:save` écrit lartefact de la suite complète dans `.artifacts/cli-startup-bench-all.json` avec `runs=5` et `warmup=1`
- `pnpm test:startup:bench:save` écrit lartefact de suite complète dans `.artifacts/cli-startup-bench-all.json` avec `runs=5` et `warmup=1`
- `pnpm test:startup:bench:update` actualise le fixture de référence archivé dans `test/fixtures/cli-startup-bench.json` avec `runs=5` et `warmup=1`
Fixture archivé :
@ -130,7 +130,7 @@ Fixture archivé :
## E2E donboarding (Docker)
Docker est facultatif ; ceci nest nécessaire que pour les smoke tests donboarding conteneurisés.
Docker est optionnel ; ceci nest nécessaire que pour les smoke tests donboarding conteneurisés.
Flux complet de démarrage à froid dans un conteneur Linux propre :
@ -138,18 +138,18 @@ Flux complet de démarrage à froid dans un conteneur Linux propre :
scripts/e2e/onboard-docker.sh
```
Ce script pilote lassistant interactif via un pseudo-tty, vérifie les fichiers de configuration/despace de travail/de session, puis démarre le Gateway et exécute `openclaw health`.
Ce script pilote lassistant interactif via un pseudo-tty, vérifie les fichiers de configuration, despace de travail et de session, puis démarre le Gateway et exécute `openclaw health`.
## Smoke dimport QR (Docker)
Garantit que lassistant dexécution QR maintenu se charge sous les runtimes Docker Node pris en charge (Node 24 par défaut, Node 22 compatible) :
Garantit que lauxiliaire dexécution QR maintenu se charge sous les runtimes Docker Node pris en charge (Node 24 par défaut, Node 22 compatible) :
```bash
pnpm test:docker:qr
```
## Liens connexes
## Associé
- [Tests](/fr/help/testing)
- [Tests en direct](/fr/help/testing-live)
- [Tests live](/fr/help/testing-live)
- [Tests des mises à jour et des plugins](/fr/help/testing-updates-plugins)

View File

@ -1,22 +1,22 @@
---
read_when:
- Recherche dun aperçu des capacités multimédias dOpenClaw
- Vous cherchez un aperçu des capacités multimédias dOpenClaw
- Choisir le fournisseur de médias à configurer
- Comprendre le fonctionnement de la génération asynchrone de médias
sidebarTitle: Media overview
summary: Aperçu des capacités dimage, de vidéo, de musique, de parole et de compréhension des médias
title: Présentation des médias
summary: Fonctionnalités dimage, de vidéo, de musique, de parole et de compréhension des médias en un coup dœil
title: Vue densemble des médias
x-i18n:
generated_at: "2026-05-05T01:50:55Z"
generated_at: "2026-05-05T06:19:02Z"
model: gpt-5.5
provider: openai
source_hash: 1bd6b93fd79897001d24f3ba5a5c8cb9bd17281116fad17262a6389214db7059
source_hash: fd02d4418fe294fda5f1437dd3a07c4aeb4de3b46a1b70bfe36914bc27123cc4
source_path: tools/media-overview.md
workflow: 16
---
OpenClaw génère des images, des vidéos et de la musique, comprend les médias entrants
(images, audio, vidéo) et énonce les réponses à voix haute avec la synthèse vocale. Toutes
(images, audio, vidéo) et prononce les réponses à voix haute avec la synthèse vocale. Toutes
les capacités multimédias sont pilotées par des outils : lagent décide quand les utiliser en fonction
de la conversation, et chaque outil napparaît que lorsquau moins un fournisseur sous-jacent
est configuré.
@ -24,35 +24,35 @@ est configuré.
## Capacités
<CardGroup cols={2}>
<Card title="Image generation" href="/fr/tools/image-generation" icon="image">
Créez et modifiez des images à partir dinvites textuelles ou dimages de référence via
`image_generate`. Synchrone — se termine dans le flux de la réponse.
<Card title="Génération dimages" href="/fr/tools/image-generation" icon="image">
Créez et modifiez des images à partir de prompts textuels ou dimages de référence via
`image_generate`. Synchrone — se termine directement dans la réponse.
</Card>
<Card title="Video generation" href="/fr/tools/video-generation" icon="video">
<Card title="Génération de vidéos" href="/fr/tools/video-generation" icon="video">
Texte-vers-vidéo, image-vers-vidéo et vidéo-vers-vidéo via `video_generate`.
Asynchrone — sexécute en arrière-plan et publie le résultat lorsquil est prêt.
</Card>
<Card title="Music generation" href="/fr/tools/music-generation" icon="music">
<Card title="Génération de musique" href="/fr/tools/music-generation" icon="music">
Générez de la musique ou des pistes audio via `music_generate`. Asynchrone sur les
fournisseurs partagés ; le chemin de workflow ComfyUI sexécute de manière synchrone.
</Card>
<Card title="Text-to-speech" href="/fr/tools/tts" icon="microphone">
<Card title="Synthèse vocale" href="/fr/tools/tts" icon="microphone">
Convertissez les réponses sortantes en audio parlé via loutil `tts` et la configuration
`messages.tts`. Synchrone.
</Card>
<Card title="Media understanding" href="/fr/nodes/media-understanding" icon="eye">
Résumez les images, laudio et la vidéo entrants à laide de fournisseurs de modèles
compatibles avec la vision et de plugins dédiés à la compréhension des médias.
<Card title="Compréhension multimédia" href="/fr/nodes/media-understanding" icon="eye">
Résumez les images, laudio et les vidéos entrants à laide de fournisseurs de modèles
capables de vision et de plugins dédiés à la compréhension multimédia.
</Card>
<Card title="Speech-to-text" href="/fr/nodes/audio" icon="ear-listen">
Transcrivez les messages vocaux entrants via des fournisseurs STT par lots ou STT
<Card title="Reconnaissance vocale" href="/fr/nodes/audio" icon="ear-listen">
Transcrivez les messages vocaux entrants via des fournisseurs de STT par lot ou de STT
en streaming pour Voice Call.
</Card>
</CardGroup>
## Matrice des capacités des fournisseurs
| Fournisseur | Image | Vidéo | Musique | TTS | STT | Voix en temps réel | Compréhension des médias |
| Fournisseur | Image | Vidéo | Musique | TTS | STT | Voix en temps réel | Compréhension multimédia |
| ----------- | :---: | :---: | :-----: | :-: | :-: | :----------------: | :----------------------: |
| Alibaba | | ✓ | | | | | |
| BytePlus | | ✓ | | | | | |
@ -78,74 +78,76 @@ est configuré.
| Xiaomi MiMo | ✓ | | | ✓ | | | ✓ |
<Note>
La compréhension des médias utilise tout modèle compatible avec la vision ou laudio enregistré
dans votre configuration de fournisseur. La matrice ci-dessus liste les fournisseurs avec une prise en charge
dédiée de la compréhension des médias ; la plupart des fournisseurs de LLM multimodaux (Anthropic, Google,
OpenAI, etc.) peuvent aussi comprendre les médias entrants lorsquils sont configurés comme modèle de
La compréhension multimédia utilise tout modèle capable de vision ou daudio enregistré
dans votre configuration de fournisseur. La matrice ci-dessus liste les fournisseurs disposant dune prise en charge dédiée
de la compréhension multimédia ; la plupart des fournisseurs de LLM multimodaux (Anthropic, Google,
OpenAI, etc.) peuvent également comprendre les médias entrants lorsquils sont configurés comme modèle de
réponse actif.
</Note>
## Asynchrone ou synchrone
| Capacité | Mode | Pourquoi |
| ---------------- | ------------ | ----------------------------------------------------------------- |
| Image | Synchrone | Les réponses du fournisseur arrivent en quelques secondes ; se termine dans le flux de la réponse. |
| Synthèse vocale | Synchrone | Les réponses du fournisseur arrivent en quelques secondes ; jointes à laudio de la réponse. |
| Vidéo | Asynchrone | Le traitement par le fournisseur prend de 30 s à plusieurs minutes. |
| Musique (partagée) | Asynchrone | Même caractéristique de traitement fournisseur que la vidéo. |
| Musique (ComfyUI) | Synchrone | Le workflow local sexécute en ligne contre le serveur ComfyUI configuré. |
| Capacité | Mode | Pourquoi |
| --------------- | ------------ | -------------------------------------------------------------------------------------------------- |
| Image | Synchrone | Les réponses du fournisseur reviennent en quelques secondes ; se termine directement dans la réponse. |
| Synthèse vocale | Synchrone | Les réponses du fournisseur reviennent en quelques secondes ; jointes à laudio de la réponse. |
| Vidéo | Asynchrone | Le traitement par le fournisseur prend de 30 s à plusieurs minutes ; les files lentes peuvent aller jusquau délai dexpiration configuré. |
| Musique (partagée) | Asynchrone | Même caractéristique de traitement par le fournisseur que pour la vidéo. |
| Musique (ComfyUI) | Synchrone | Le workflow local sexécute directement sur le serveur ComfyUI configuré. |
Pour les outils asynchrones, OpenClaw soumet la demande au fournisseur, renvoie immédiatement un identifiant
de tâche et suit le job dans le registre des tâches. Lagent continue de répondre
aux autres messages pendant lexécution du job. Lorsque le fournisseur termine,
OpenClaw réveille lagent avec les chemins des médias générés afin quil puisse prévenir
Pour les outils asynchrones, OpenClaw soumet la demande au fournisseur, renvoie immédiatement un identifiant de tâche
et suit le travail dans le registre des tâches. Lagent continue
de répondre aux autres messages pendant que le travail sexécute. Lorsque le fournisseur a terminé,
OpenClaw réveille lagent avec les chemins des médias générés afin quil puisse informer
lutilisateur et, lorsque la politique de livraison de la source lexige, relayer le résultat via
loutil de message.
loutil de message. Pour les routes de groupe/canal qui utilisent uniquement loutil de message, OpenClaw considère
labsence de preuve de livraison par loutil de message comme une tentative dachèvement échouée et envoie
le média généré de secours directement au canal dorigine.
## Speech-to-text et Voice Call
## Reconnaissance vocale et Voice Call
Deepgram, DeepInfra, ElevenLabs, Mistral, OpenAI, SenseAudio et xAI peuvent tous transcrire
laudio entrant via le chemin par lots `tools.media.audio` lorsquils sont configurés.
Les plugins de canal qui prévalident une note vocale pour le filtrage des mentions ou lanalyse
des commandes marquent la pièce jointe transcrite sur le contexte entrant, afin que la passe partagée
de compréhension des médias réutilise cette transcription au lieu deffectuer un second appel
laudio entrant via le chemin par lot `tools.media.audio` lorsquils sont configurés.
Les plugins de canal qui précontrôlent une note vocale pour le filtrage des mentions ou lanalyse des commandes
marquent la pièce jointe transcrite sur le contexte entrant, afin que la passe partagée de
compréhension multimédia réutilise cette transcription au lieu de lancer un second appel
STT pour le même audio.
Deepgram, ElevenLabs, Mistral, OpenAI et xAI enregistrent également des fournisseurs STT
en streaming pour Voice Call, afin que laudio téléphonique en direct puisse être transmis au fournisseur
sélectionné sans attendre un enregistrement terminé.
Deepgram, ElevenLabs, Mistral, OpenAI et xAI enregistrent également des fournisseurs de STT
en streaming pour Voice Call, afin que laudio téléphonique en direct puisse être transmis au fournisseur sélectionné
sans attendre un enregistrement terminé.
## Correspondances des fournisseurs (comment les fournisseurs se répartissent entre les surfaces)
## Correspondances des fournisseurs (répartition des vendeurs entre les surfaces)
<AccordionGroup>
<Accordion title="Google">
Surfaces image, vidéo, musique, TTS par lots, voix en temps réel côté backend et
compréhension des médias.
Surfaces dimage, de vidéo, de musique, de TTS par lot, de voix temps réel côté backend et de
compréhension multimédia.
</Accordion>
<Accordion title="OpenAI">
Surfaces image, vidéo, TTS par lots, STT par lots, STT en streaming pour Voice Call, voix
en temps réel côté backend et embeddings de mémoire.
Surfaces dimage, de vidéo, de TTS par lot, de STT par lot, de STT en streaming pour Voice Call, de voix
temps réel côté backend et dembeddings de mémoire.
</Accordion>
<Accordion title="DeepInfra">
Surfaces routage chat/modèle, génération/édition dimages, texte-vers-vidéo, TTS par lots,
STT par lots, compréhension des médias image et embeddings de mémoire.
Les modèles natifs DeepInfra de rerank/classification/détection dobjets ne sont pas
enregistrés tant quOpenClaw ne dispose pas de contrats de fournisseur dédiés pour ces
Routage chat/modèle, génération/modification dimages, texte-vers-vidéo, TTS par lot,
STT par lot, compréhension multimédia dimages et surfaces dembeddings de mémoire.
Les modèles de rerank/classification/détection dobjets natifs de DeepInfra ne sont pas
enregistrés tant quOpenClaw ne dispose pas de contrats fournisseur dédiés à ces
catégories.
</Accordion>
<Accordion title="xAI">
Image, vidéo, recherche, exécution de code, TTS par lots, STT par lots et STT en streaming pour Voice
Call. La voix en temps réel xAI est une capacité amont, mais elle nest
pas enregistrée dans OpenClaw tant que le contrat partagé de voix en temps réel ne peut pas
Image, vidéo, recherche, exécution de code, TTS par lot, STT par lot et STT en streaming pour Voice
Call. La voix en temps réel de xAI est une capacité amont, mais elle nest
pas enregistrée dans OpenClaw tant que le contrat partagé de voix temps réel ne peut pas
la représenter.
</Accordion>
</AccordionGroup>
## Connexe
## Associés
- [Génération dimages](/fr/tools/image-generation)
- [Génération de vidéos](/fr/tools/video-generation)
- [Génération de musique](/fr/tools/music-generation)
- [Synthèse vocale](/fr/tools/tts)
- [Compréhension des médias](/fr/nodes/media-understanding)
- [Compréhension multimédia](/fr/nodes/media-understanding)
- [Nœuds audio](/fr/nodes/audio)

View File

@ -1,47 +1,38 @@
---
read_when:
- Générer de la musique ou de laudio avec lagent
- Configuration des fournisseurs et modèles de génération musicale
- Générer de la musique ou de laudio via lagent
- Configuration des fournisseurs et des modèles de génération musicale
- Comprendre les paramètres de loutil music_generate
sidebarTitle: Music generation
summary: Générer de la musique via music_generate avec les flux de travail Google Lyria, MiniMax et ComfyUI
summary: Générer de la musique avec music_generate dans les flux de travail Google Lyria, MiniMax et ComfyUI
title: Génération de musique
x-i18n:
generated_at: "2026-05-05T01:51:10Z"
generated_at: "2026-05-05T06:19:03Z"
model: gpt-5.5
provider: openai
source_hash: 0e14a5a10dd485c2d3dbbd23a0fc2c12de500d9f7bfb7db471c27ed2a99ad650
source_hash: f5e74aa7d43ffe00adb6d6c170d36dbc107f2baf0069243733c5dd6e4582175a
source_path: tools/music-generation.md
workflow: 16
---
Loutil `music_generate` permet à lagent de créer de la musique ou de laudio via la
capacité partagée de génération musicale avec les fournisseurs configurés — Google,
MiniMax et ComfyUI configuré par workflow aujourdhui.
Loutil `music_generate` permet à lagent de créer de la musique ou de laudio via la fonctionnalité partagée de génération musicale avec des fournisseurs configurés : Google, MiniMax et, aujourdhui, ComfyUI configuré par workflow.
Pour les exécutions dagent adossées à une session, OpenClaw démarre la génération musicale comme une
tâche darrière-plan, la suit dans le registre des tâches, puis réveille à nouveau lagent
quand la piste est prête afin que lagent puisse informer lutilisateur et joindre laudio
finalisé. Dans les discussions de groupe/canal qui utilisent une diffusion visible
uniquement via loutil de messagerie, lagent relaie le résultat via loutil de messagerie.
Pour les exécutions dagent adossées à une session, OpenClaw démarre la génération musicale comme une tâche en arrière-plan, la suit dans le registre des tâches, puis réveille de nouveau lagent lorsque la piste est prête afin quil puisse prévenir lutilisateur et joindre laudio terminé. Dans les discussions de groupe/canal qui utilisent une livraison visible uniquement par loutil de message, lagent relaie le résultat via loutil de message. Si lagent de complétion écrit uniquement une réponse finale privée, OpenClaw utilise en recours un envoi direct au canal avec le média généré. Le réveil de complétion avertit explicitement lagent que les réponses finales normales sont privées dans ces routes.
<Note>
Loutil partagé intégré napparaît que lorsquau moins un fournisseur de génération musicale
est disponible. Si vous ne voyez pas `music_generate` dans les outils de votre agent,
configurez `agents.defaults.musicGenerationModel` ou définissez une clé dAPI de
fournisseur.
Loutil partagé intégré apparaît uniquement lorsquau moins un fournisseur de génération musicale est disponible. Si vous ne voyez pas `music_generate` dans les outils de votre agent, configurez `agents.defaults.musicGenerationModel` ou définissez une clé dAPI de fournisseur.
</Note>
## Démarrage rapide
<Tabs>
<Tab title="Shared provider-backed">
<Tab title="Adossé à un fournisseur partagé">
<Steps>
<Step title="Configure auth">
Définissez une clé dAPI pour au moins un fournisseur par exemple
<Step title="Configurer lauthentification">
Définissez une clé dAPI pour au moins un fournisseur, par exemple
`GEMINI_API_KEY` ou `MINIMAX_API_KEY`.
</Step>
<Step title="Pick a default model (optional)">
<Step title="Choisir un modèle par défaut (facultatif)">
```json5
{
agents: {
@ -54,30 +45,30 @@ fournisseur.
}
```
</Step>
<Step title="Ask the agent">
_"Generate an upbeat synthpop track about a night drive through a
neon city."_
<Step title="Demander à lagent">
_« Génère une piste synthpop entraînante sur une virée de nuit dans une
ville néon. »_
Lagent appelle automatiquement `music_generate`. Aucune liste dautorisation
doutils nest nécessaire.
Lagent appelle `music_generate` automatiquement. Aucune liste
dautorisation doutil nest nécessaire.
</Step>
</Steps>
Pour les contextes synchrones directs sans exécution dagent adossée à une session,
loutil intégré bascule tout de même vers la génération en ligne et renvoie
loutil intégré utilise toujours en recours une génération en ligne et renvoie
le chemin du média final dans le résultat de loutil.
</Tab>
<Tab title="ComfyUI workflow">
<Tab title="Workflow ComfyUI">
<Steps>
<Step title="Configure the workflow">
<Step title="Configurer le workflow">
Configurez `plugins.entries.comfy.config.music` avec un workflow
JSON et des nœuds dinvite/sortie.
JSON et des nœuds de prompt/sortie.
</Step>
<Step title="Cloud auth (optional)">
<Step title="Authentification cloud (facultative)">
Pour Comfy Cloud, définissez `COMFY_API_KEY` ou `COMFY_CLOUD_API_KEY`.
</Step>
<Step title="Call the tool">
<Step title="Appeler loutil">
```text
/tool music_generate prompt="Warm ambient synth loop with soft tape texture"
```
@ -86,7 +77,7 @@ fournisseur.
</Tab>
</Tabs>
Exemples dinvites :
Exemples de prompts :
```text
Generate a cinematic piano track with soft strings and no vocals.
@ -98,13 +89,13 @@ Generate an energetic chiptune loop about launching a rocket at sunrise.
## Fournisseurs pris en charge
| Fournisseur | Modèle par défaut | Entrées de référence | Contrôles pris en charge | Auth |
| Fournisseur | Modèle par défaut | Entrées de référence | Contrôles pris en charge | Authentification |
| -------- | ---------------------- | ---------------- | --------------------------------------------------------- | -------------------------------------- |
| ComfyUI | `workflow` | Jusquà 1 image | Musique ou audio définis par workflow | `COMFY_API_KEY`, `COMFY_CLOUD_API_KEY` |
| ComfyUI | `workflow` | Jusquà 1 image | Musique ou audio défini par le workflow | `COMFY_API_KEY`, `COMFY_CLOUD_API_KEY` |
| Google | `lyria-3-clip-preview` | Jusquà 10 images | `lyrics`, `instrumental`, `format` | `GEMINI_API_KEY`, `GOOGLE_API_KEY` |
| MiniMax | `music-2.6` | Aucune | `lyrics`, `instrumental`, `durationSeconds`, `format=mp3` | `MINIMAX_API_KEY` ou OAuth MiniMax |
### Matrice de capacités
### Matrice des fonctionnalités
Le contrat de mode explicite utilisé par `music_generate`, les tests de contrat et le
balayage live partagé :
@ -115,14 +106,14 @@ balayage live partagé :
| Google | ✓ | ✓ | 10 images | `generate`, `edit` |
| MiniMax | ✓ | — | Aucune | `generate` |
Utilisez `action: "list"` pour inspecter les fournisseurs et modèles partagés disponibles à
Utilisez `action: "list"` pour inspecter les fournisseurs partagés et modèles disponibles à
lexécution :
```text
/tool music_generate action=list
```
Utilisez `action: "status"` pour inspecter la tâche musicale active adossée à une session :
Utilisez `action: "status"` pour inspecter la tâche musicale active adossée à la session :
```text
/tool music_generate action=status
@ -137,20 +128,20 @@ Exemple de génération directe :
## Paramètres de loutil
<ParamField path="prompt" type="string" required>
Invite de génération musicale. Obligatoire pour `action: "generate"`.
Prompt de génération musicale. Obligatoire pour `action: "generate"`.
</ParamField>
<ParamField path="action" type='"generate" | "status" | "list"' default="generate">
`"status"` renvoie la tâche de session actuelle ; `"list"` inspecte les fournisseurs.
</ParamField>
<ParamField path="model" type="string">
Remplacement du fournisseur/modèle (par exemple `google/lyria-3-pro-preview`,
Remplacement du fournisseur/modèle (par ex. `google/lyria-3-pro-preview`,
`comfy/workflow`).
</ParamField>
<ParamField path="lyrics" type="string">
Paroles facultatives lorsque le fournisseur prend en charge une entrée explicite de paroles.
Paroles facultatives lorsque le fournisseur prend en charge lentrée explicite de paroles.
</ParamField>
<ParamField path="instrumental" type="boolean">
Demande une sortie uniquement instrumentale lorsque le fournisseur la prend en charge.
Demander une sortie uniquement instrumentale lorsque le fournisseur la prend en charge.
</ParamField>
<ParamField path="image" type="string">
Chemin ou URL dune seule image de référence.
@ -168,45 +159,30 @@ Exemple de génération directe :
<ParamField path="timeoutMs" type="number">Délai dexpiration facultatif de la requête fournisseur en millisecondes. Les valeurs inférieures à 10000ms sont relevées à 10000ms et signalées dans le résultat de loutil.</ParamField>
<Note>
Tous les fournisseurs ne prennent pas en charge tous les paramètres. OpenClaw valide tout de même les
limites strictes, comme le nombre dentrées, avant la soumission. Lorsquun fournisseur prend en charge
la durée mais utilise un maximum plus court que la valeur demandée, OpenClaw
ramène la durée à la valeur prise en charge la plus proche. Les indications facultatives vraiment non prises en charge
sont ignorées avec un avertissement lorsque le fournisseur ou le modèle sélectionné ne peut pas les honorer.
Les résultats doutil indiquent les paramètres appliqués ; `details.normalization`
capture toute correspondance entre la demande et lapplication.
Tous les fournisseurs ne prennent pas en charge tous les paramètres. OpenClaw valide tout de même les limites strictes, comme le nombre dentrées, avant lenvoi. Lorsquun fournisseur prend en charge la durée mais utilise un maximum plus court que la valeur demandée, OpenClaw limite à la durée prise en charge la plus proche. Les indications facultatives réellement non prises en charge sont ignorées avec un avertissement lorsque le fournisseur ou le modèle sélectionné ne peut pas les respecter. Les résultats doutil signalent les paramètres appliqués ; `details.normalization` capture toute correspondance entre la valeur demandée et la valeur appliquée.
</Note>
## Comportement asynchrone
La génération musicale adossée à une session sexécute comme une tâche darrière-plan :
La génération musicale adossée à une session sexécute comme une tâche en arrière-plan :
- **Tâche darrière-plan :** `music_generate` crée une tâche darrière-plan, renvoie
immédiatement une réponse de démarrage/tâche, puis publie la piste finalisée plus tard dans
un message dagent de suivi.
- **Prévention des doublons :** tant quune tâche est `queued` ou `running`, les appels
`music_generate` ultérieurs dans la même session renvoient le statut de la tâche au lieu de
démarrer une autre génération. Utilisez `action: "status"` pour vérifier explicitement.
- **Consultation du statut :** `openclaw tasks list` ou `openclaw tasks show <taskId>`
inspecte les statuts en file dattente, en cours dexécution et terminaux.
- **Réveil à la fin :** OpenClaw réinjecte un événement interne de fin
dans la même session afin que le modèle puisse rédiger lui-même le suivi destiné à lutilisateur.
- **Indication dinvite :** les tours utilisateur/manuels ultérieurs dans la même session reçoivent une petite
indication dexécution lorsquune tâche musicale est déjà en cours, afin que le modèle
nappelle pas aveuglément `music_generate` à nouveau.
- **Repli sans session :** les contextes directs/locaux sans vraie session dagent
sexécutent en ligne et renvoient le résultat audio final dans le même tour.
- **Tâche en arrière-plan :** `music_generate` crée une tâche en arrière-plan, renvoie immédiatement une réponse de démarrage/tâche et publie plus tard la piste terminée dans un message de suivi de lagent.
- **Prévention des doublons :** tant quune tâche est `queued` ou `running`, les appels ultérieurs à `music_generate` dans la même session renvoient létat de la tâche au lieu de démarrer une autre génération. Utilisez `action: "status"` pour vérifier explicitement.
- **Consultation de létat :** `openclaw tasks list` ou `openclaw tasks show <taskId>` inspecte les états en attente, en cours et terminaux.
- **Réveil de complétion :** OpenClaw injecte un événement de complétion interne dans la même session afin que le modèle puisse écrire lui-même le suivi destiné à lutilisateur.
- **Indication de prompt :** les tours utilisateur/manuels ultérieurs dans la même session reçoivent une petite indication dexécution lorsquune tâche musicale est déjà en cours, afin que le modèle nappelle pas aveuglément `music_generate` de nouveau.
- **Recours sans session :** les contextes directs/locaux sans véritable session dagent sexécutent en ligne et renvoient le résultat audio final dans le même tour.
### Cycle de vie des tâches
| État | Signification |
| ----------- | ---------------------------------------------------------------------------------------------- |
| `queued` | Tâche créée, en attente dacceptation par le fournisseur. |
| `running` | Le fournisseur traite la demande (généralement de 30 secondes à 3 minutes selon le fournisseur et la durée). |
| `running` | Le fournisseur traite la tâche (généralement 30 secondes à 3 minutes selon le fournisseur et la durée). |
| `succeeded` | Piste prête ; lagent se réveille et la publie dans la conversation. |
| `failed` | Erreur ou délai dexpiration du fournisseur ; lagent se réveille avec les détails de lerreur. |
Vérifiez le statut depuis la CLI :
Vérifiez létat depuis la CLI :
```bash
openclaw tasks list
@ -235,15 +211,15 @@ openclaw tasks cancel <taskId>
OpenClaw essaie les fournisseurs dans cet ordre :
1. Paramètre `model` de lappel doutil (si lagent en précise un).
1. Paramètre `model` de lappel doutil (si lagent en spécifie un).
2. `musicGenerationModel.primary` depuis la configuration.
3. `musicGenerationModel.fallbacks` dans lordre.
4. Détection automatique utilisant uniquement les valeurs par défaut des fournisseurs adossés à lauthentification :
4. Détection automatique utilisant uniquement les valeurs par défaut des fournisseurs appuyées par lauthentification :
- fournisseur par défaut actuel en premier ;
- autres fournisseurs de génération musicale enregistrés dans lordre de leur identifiant de fournisseur.
- autres fournisseurs de génération musicale enregistrés par ordre didentifiant de fournisseur.
Si un fournisseur échoue, le candidat suivant est essayé automatiquement. Sils
échouent tous, lerreur inclut les détails de chaque tentative.
Si un fournisseur échoue, le candidat suivant est essayé automatiquement. Si tous
échouent, lerreur inclut les détails de chaque tentative.
Définissez `agents.defaults.mediaGenerationAutoProviderFallback: false` pour utiliser uniquement
les entrées explicites `model`, `primary` et `fallbacks`.
@ -252,42 +228,41 @@ les entrées explicites `model`, `primary` et `fallbacks`.
<AccordionGroup>
<Accordion title="ComfyUI">
Piloté par workflow et dépend du graphe configuré ainsi que du mappage des nœuds
pour les champs dinvite/sortie. Le plugin `comfy` intégré se branche sur
loutil partagé `music_generate` via le registre des fournisseurs de
génération musicale.
Piloté par le workflow et dépend du graphe configuré ainsi que du mappage des nœuds
pour les champs dinvite/de sortie. Le plugin `comfy` fourni sintègre à loutil
partagé `music_generate` via le registre des fournisseurs de génération musicale.
</Accordion>
<Accordion title="Google (Lyria 3)">
Utilise la génération par lot Lyria 3. Le flux intégré actuel prend en charge
linvite, un texte de paroles facultatif et des images de référence facultatives.
Utilise la génération par lots de Lyria 3. Le flux fourni actuel prend en charge
linvite, le texte de paroles facultatif et les images de référence facultatives.
</Accordion>
<Accordion title="MiniMax">
Utilise lendpoint par lot `music_generation`. Prend en charge linvite, les
paroles facultatives, le mode instrumental, le pilotage de durée et la sortie mp3 via
lauthentification par clé dAPI `minimax` ou OAuth `minimax-portal`.
Utilise le point de terminaison par lots `music_generation`. Prend en charge linvite, les
paroles facultatives, le mode instrumental, le pilotage de la durée et la sortie mp3 via
lauthentification par clé API `minimax` ou OAuth `minimax-portal`.
</Accordion>
</AccordionGroup>
## Choisir le bon chemin
- **Adossé à un fournisseur partagé** lorsque vous voulez la sélection de modèle, le basculement
de fournisseur et le flux intégré asynchrone de tâche/statut.
- **Appuyé par un fournisseur partagé** lorsque vous voulez la sélection de modèle, le basculement
entre fournisseurs et le flux asynchrone intégré de tâches/états.
- **Chemin Plugin (ComfyUI)** lorsque vous avez besoin dun graphe de workflow personnalisé ou dun
fournisseur qui ne fait pas partie de la capacité musicale intégrée partagée.
fournisseur qui ne fait pas partie de la capacité musicale partagée fournie.
Si vous déboguez un comportement propre à ComfyUI, consultez
[ComfyUI](/fr/providers/comfy). Si vous déboguez un comportement de fournisseur partagé,
[ComfyUI](/fr/providers/comfy). Si vous déboguez le comportement dun fournisseur partagé,
commencez par [Google (Gemini)](/fr/providers/google) ou
[MiniMax](/fr/providers/minimax).
## Modes de capacité des fournisseurs
Le contrat partagé de génération musicale prend en charge des déclarations de mode explicites :
Le contrat partagé de génération musicale prend en charge les déclarations de mode explicites :
- `generate` pour la génération uniquement par invite.
- `generate` pour la génération à partir dune invite seule.
- `edit` lorsque la requête inclut une ou plusieurs images de référence.
Les nouvelles implémentations de fournisseurs doivent privilégier des blocs de mode explicites :
Les nouvelles implémentations de fournisseurs doivent préférer les blocs de mode explicites :
```typescript
capabilities: {
@ -313,7 +288,7 @@ de manière déterministe.
## Tests live
Couverture live à activer explicitement pour les fournisseurs intégrés partagés :
Couverture live à activation explicite pour les fournisseurs partagés inclus :
```bash
OPENCLAW_LIVE_TEST=1 pnpm test:live -- extensions/music-generation-providers.live.test.ts
@ -326,26 +301,26 @@ pnpm test:live:media music
```
Ce fichier live charge les variables denvironnement de fournisseur manquantes depuis `~/.profile`, préfère
par défaut les clés dAPI live/env aux profils dauthentification stockés, et exécute à la fois
la couverture `generate` et la couverture `edit` déclarée lorsque le fournisseur active le mode
par défaut les clés API live/env aux profils dauthentification stockés, et exécute la couverture
`generate` ainsi que la couverture `edit` déclarée lorsque le fournisseur active le mode
édition. Couverture actuelle :
- `google` : `generate` plus `edit`
- `minimax` : `generate` uniquement
- `comfy` : couverture live Comfy séparée, pas le balayage partagé des fournisseurs
- `comfy` : couverture live Comfy distincte, pas le balayage partagé des fournisseurs
Couverture live à activer explicitement pour le chemin musical ComfyUI intégré :
Couverture live facultative pour le parcours musical ComfyUI intégré :
```bash
OPENCLAW_LIVE_TEST=1 COMFY_LIVE_TEST=1 pnpm test:live -- extensions/comfy/comfy.live.test.ts
```
Le fichier live de Comfy couvre également les workflows dimage et de vidéo Comfy lorsque ces
Le fichier live Comfy couvre également les flux de travail dimage et de vidéo comfy lorsque ces
sections sont configurées.
## Connexe
## Articles connexes
- [Tâches en arrière-plan](/fr/automation/tasks) — suivi des tâches pour les exécutions détachées de `music_generate`
- [Tâches en arrière-plan](/fr/automation/tasks) — suivi des tâches pour les exécutions `music_generate` détachées
- [ComfyUI](/fr/providers/comfy)
- [Référence de configuration](/fr/gateway/config-agents#agent-defaults) — configuration `musicGenerationModel`
- [Google (Gemini)](/fr/providers/google)

View File

@ -1,47 +1,47 @@
---
read_when:
- Utiliser ou configurer les commandes de chat
- Utilisation ou configuration des commandes de chat
- Débogage du routage des commandes ou des autorisations
sidebarTitle: Slash commands
summary: 'Commandes slash : texte ou natives, configuration et commandes prises en charge'
title: Commandes slash
x-i18n:
generated_at: "2026-05-04T02:26:46Z"
generated_at: "2026-05-05T06:19:19Z"
model: gpt-5.5
provider: openai
source_hash: 49eb41674c8d0a01dbd28a2df783eb9aba3dde18d8425951a266cede825e9a84
source_hash: 8a0234bd94cafe242fc692a5b9d457047e483e2a434cc92ab26046e6ddec55ce
source_path: tools/slash-commands.md
workflow: 16
---
Les commandes sont gérées par le Gateway. La plupart des commandes doivent être envoyées comme un message **autonome** qui commence par `/`. La commande de chat bash réservée à lhôte utilise `! <cmd>` (avec `/bash <cmd>` comme alias).
Commands are handled by the Gateway. Most commands must be sent as a **standalone** message that starts with `/`. The host-only bash chat command uses `! <cmd>` (with `/bash <cmd>` as an alias).
Lorsquune conversation ou un fil est lié à une session ACP, le texte de suivi normal est routé vers ce harnais ACP. Les commandes de gestion du Gateway restent locales : `/acp ...` atteint toujours le gestionnaire de commandes ACP dOpenClaw, et `/status` ainsi que `/unfocus` restent locaux chaque fois que la gestion des commandes est activée pour la surface.
When a conversation or thread is bound to an ACP session, normal follow-up text routes to that ACP harness. Gateway management commands still stay local: `/acp ...` always reaches the OpenClaw ACP command handler, and `/status` plus `/unfocus` stay local whenever command handling is enabled for the surface.
Il existe deux systèmes liés :
There are two related systems:
<AccordionGroup>
<Accordion title="Commandes">
Messages `/...` autonomes.
<Accordion title="Commands">
Standalone `/...` messages.
</Accordion>
<Accordion title="Directives">
`/think`, `/fast`, `/verbose`, `/trace`, `/reasoning`, `/elevated`, `/exec`, `/model`, `/queue`.
- Les directives sont retirées du message avant que le modèle ne le voie.
- Dans les messages de chat normaux (qui ne contiennent pas uniquement des directives), elles sont traitées comme des « indices en ligne » et ne conservent **pas** les paramètres de session.
- Dans les messages contenant uniquement des directives (le message ne contient que des directives), elles sont conservées dans la session et reçoivent une réponse daccusé de réception.
- Les directives ne sont appliquées que pour les **expéditeurs autorisés**. Si `commands.allowFrom` est défini, cest la seule liste dautorisation utilisée ; sinon, lautorisation vient des listes dautorisation/appairage du canal plus `commands.useAccessGroups`. Les expéditeurs non autorisés voient les directives traitées comme du texte brut.
- Directives are stripped from the message before the model sees it.
- In normal chat messages (not directive-only), they are treated as "inline hints" and do **not** persist session settings.
- In directive-only messages (the message contains only directives), they persist to the session and reply with an acknowledgement.
- Directives are only applied for **authorized senders**. If `commands.allowFrom` is set, it is the only allowlist used; otherwise authorization comes from channel allowlists/pairing plus `commands.useAccessGroups`. Unauthorized senders see directives treated as plain text.
</Accordion>
<Accordion title="Raccourcis en ligne">
Expéditeurs présents sur liste dautorisation/autorisés uniquement : `/help`, `/commands`, `/status`, `/whoami` (`/id`).
<Accordion title="Inline shortcuts">
Allowlisted/authorized senders only: `/help`, `/commands`, `/status`, `/whoami` (`/id`).
Ils sexécutent immédiatement, sont retirés avant que le modèle ne voie le message, et le texte restant continue dans le flux normal.
They run immediately, are stripped before the model sees the message, and the remaining text continues through the normal flow.
</Accordion>
</AccordionGroup>
## Configuration
## Config
```json5
{
@ -69,238 +69,238 @@ Il existe deux systèmes liés :
```
<ParamField path="commands.text" type="boolean" default="true">
Active lanalyse de `/...` dans les messages de chat. Sur les surfaces sans commandes natives (WhatsApp/WebChat/Signal/iMessage/Google Chat/Microsoft Teams), les commandes textuelles fonctionnent toujours même si vous définissez cette valeur sur `false`.
Enables parsing `/...` in chat messages. On surfaces without native commands (WhatsApp/WebChat/Signal/iMessage/Google Chat/Microsoft Teams), text commands still work even if you set this to `false`.
</ParamField>
<ParamField path="commands.native" type='boolean | "auto"' default='"auto"'>
Enregistre les commandes natives. Automatique : activé pour Discord/Telegram ; désactivé pour Slack (jusquà ce que vous ajoutiez des commandes slash) ; ignoré pour les fournisseurs sans prise en charge native. Définissez `channels.discord.commands.native`, `channels.telegram.commands.native` ou `channels.slack.commands.native` pour remplacer par fournisseur (booléen ou `"auto"`). Sur Discord, `false` ignore lenregistrement et le nettoyage des commandes slash au démarrage ; les commandes précédemment enregistrées peuvent rester visibles jusquà ce que vous les supprimiez de lapplication Discord. Les commandes Slack sont gérées dans lapplication Slack et ne sont pas supprimées automatiquement.
Registers native commands. Auto: on for Discord/Telegram; off for Slack (until you add slash commands); ignored for providers without native support. Set `channels.discord.commands.native`, `channels.telegram.commands.native`, or `channels.slack.commands.native` to override per provider (bool or `"auto"`). On Discord, `false` skips slash-command registration and cleanup during startup; previously registered commands may remain visible until you remove them from the Discord app. Slack commands are managed in the Slack app and are not removed automatically.
</ParamField>
Sur Discord, les spécifications de commandes natives peuvent inclure `descriptionLocalizations`, quOpenClaw publie comme `description_localizations` Discord et inclut dans les comparaisons de rapprochement.
On Discord, native command specs may include `descriptionLocalizations`, which OpenClaw publishes as Discord `description_localizations` and includes in reconcile comparisons.
<ParamField path="commands.nativeSkills" type='boolean | "auto"' default='"auto"'>
Enregistre nativement les commandes **skill** lorsque cest pris en charge. Automatique : activé pour Discord/Telegram ; désactivé pour Slack (Slack nécessite de créer une commande slash par skill). Définissez `channels.discord.commands.nativeSkills`, `channels.telegram.commands.nativeSkills` ou `channels.slack.commands.nativeSkills` pour remplacer par fournisseur (booléen ou `"auto"`).
Registers **skill** commands natively when supported. Auto: on for Discord/Telegram; off for Slack (Slack requires creating a slash command per skill). Set `channels.discord.commands.nativeSkills`, `channels.telegram.commands.nativeSkills`, or `channels.slack.commands.nativeSkills` to override per provider (bool or `"auto"`).
</ParamField>
<ParamField path="commands.bash" type="boolean" default="false">
Active `! <cmd>` pour exécuter des commandes shell de lhôte (`/bash <cmd>` est un alias ; nécessite les listes dautorisation `tools.elevated`).
Enables `! <cmd>` to run host shell commands (`/bash <cmd>` is an alias; requires `tools.elevated` allowlists).
</ParamField>
<ParamField path="commands.bashForegroundMs" type="number" default="2000">
Contrôle combien de temps bash attend avant de passer en mode arrière-plan (`0` lance immédiatement en arrière-plan).
Controls how long bash waits before switching to background mode (`0` backgrounds immediately).
</ParamField>
<ParamField path="commands.config" type="boolean" default="false">
Active `/config` (lit/écrit `openclaw.json`).
Enables `/config` (reads/writes `openclaw.json`).
</ParamField>
<ParamField path="commands.mcp" type="boolean" default="false">
Active `/mcp` (lit/écrit la configuration MCP gérée par OpenClaw sous `mcp.servers`).
Enables `/mcp` (reads/writes OpenClaw-managed MCP config under `mcp.servers`).
</ParamField>
<ParamField path="commands.plugins" type="boolean" default="false">
Active `/plugins` (découverte/état des plugins plus contrôles dinstallation et dactivation/désactivation).
Enables `/plugins` (plugin discovery/status plus install + enable/disable controls).
</ParamField>
<ParamField path="commands.debug" type="boolean" default="false">
Active `/debug` (remplacements uniquement à lexécution).
Enables `/debug` (runtime-only overrides).
</ParamField>
<ParamField path="commands.restart" type="boolean" default="true">
Active `/restart` plus les actions doutil de redémarrage du gateway.
Enables `/restart` plus gateway restart tool actions.
</ParamField>
<ParamField path="commands.ownerAllowFrom" type="string[]">
Définit la liste dautorisation explicite du propriétaire pour les surfaces de commandes/outils réservées au propriétaire. Il sagit du compte opérateur humain qui peut approuver les actions dangereuses et exécuter des commandes telles que `/diagnostics`, `/export-trajectory` et `/config`. Elle est distincte de `commands.allowFrom` et de laccès par appairage en DM.
Sets the explicit owner allowlist for owner-only command/tool surfaces. This is the human operator account that can approve dangerous actions and run commands such as `/diagnostics`, `/export-trajectory`, and `/config`. It is separate from `commands.allowFrom` and from DM pairing access.
</ParamField>
<ParamField path="channels.<channel>.commands.enforceOwnerForCommands" type="boolean" default="false">
Par canal : impose que les commandes réservées au propriétaire nécessitent **lidentité du propriétaire** pour sexécuter sur cette surface. Lorsque la valeur est `true`, lexpéditeur doit soit correspondre à un candidat propriétaire résolu (par exemple une entrée dans `commands.ownerAllowFrom` ou des métadonnées de propriétaire natives du fournisseur), soit disposer de la portée interne `operator.admin` sur un canal de messages interne. Une entrée générique dans `allowFrom` du canal, ou une liste de candidats propriétaires vide/non résolue, nest **pas** suffisante — les commandes réservées au propriétaire échouent fermées sur ce canal. Laissez cette option désactivée si vous voulez que les commandes réservées au propriétaire soient limitées uniquement par `ownerAllowFrom` et les listes dautorisation de commandes standard.
Per-channel: makes owner-only commands require **owner identity** to run on that surface. When `true`, the sender must either match a resolved owner candidate (for example an entry in `commands.ownerAllowFrom` or provider-native owner metadata) or hold internal `operator.admin` scope on an internal message channel. A wildcard entry in channel `allowFrom`, or an empty/unresolved owner-candidate list, is **not** sufficient — owner-only commands fail closed on that channel. Leave this off if you want owner-only commands gated only by `ownerAllowFrom` and the standard command allowlists.
</ParamField>
<ParamField path="commands.ownerDisplay" type='"raw" | "hash"'>
Contrôle la façon dont les identifiants de propriétaire apparaissent dans linvite système.
Controls how owner ids appear in the system prompt.
</ParamField>
<ParamField path="commands.ownerDisplaySecret" type="string">
Définit éventuellement le secret HMAC utilisé lorsque `commands.ownerDisplay="hash"`.
Optionally sets the HMAC secret used when `commands.ownerDisplay="hash"`.
</ParamField>
<ParamField path="commands.allowFrom" type="object">
Liste dautorisation par fournisseur pour lautorisation des commandes. Lorsquelle est configurée, elle est la seule source dautorisation pour les commandes et les directives (les listes dautorisation/appairage du canal et `commands.useAccessGroups` sont ignorés). Utilisez `"*"` comme valeur globale par défaut ; les clés propres au fournisseur la remplacent.
Per-provider allowlist for command authorization. When configured, it is the only authorization source for commands and directives (channel allowlists/pairing and `commands.useAccessGroups` are ignored). Use `"*"` for a global default; provider-specific keys override it.
</ParamField>
<ParamField path="commands.useAccessGroups" type="boolean" default="true">
Applique les listes dautorisation/politiques pour les commandes lorsque `commands.allowFrom` nest pas défini.
Enforces allowlists/policies for commands when `commands.allowFrom` is not set.
</ParamField>
## Liste des commandes
## Command list
Source de vérité actuelle :
Current source-of-truth:
- les commandes intégrées au noyau proviennent de `src/auto-reply/commands-registry.shared.ts`
- les commandes dock générées proviennent de `src/auto-reply/commands-registry.data.ts`
- les commandes plugin proviennent des appels plugin `registerCommand()`
- la disponibilité réelle sur votre gateway dépend toujours des indicateurs de configuration, de la surface du canal et des plugins installés/activés
- core built-ins come from `src/auto-reply/commands-registry.shared.ts`
- generated dock commands come from `src/auto-reply/commands-registry.data.ts`
- plugin commands come from plugin `registerCommand()` calls
- actual availability on your gateway still depends on config flags, channel surface, and installed/enabled plugins
### Commandes intégrées au noyau
### Core built-in commands
<AccordionGroup>
<Accordion title="Sessions et exécutions">
- `/new [model]` démarre une nouvelle session ; `/reset` est lalias de réinitialisation.
- Control UI intercepte `/new` saisi pour créer une nouvelle session de tableau de bord et y basculer ; `/reset` saisi exécute toujours la réinitialisation sur place du Gateway.
- `/reset soft [message]` conserve la transcription actuelle, supprime les identifiants de session du backend CLI réutilisés et relance sur place le chargement du démarrage/de linvite système.
- `/compact [instructions]` compacte le contexte de session. Voir [Compaction](/fr/concepts/compaction).
- `/stop` interrompt lexécution actuelle.
- `/session idle <duration|off>` et `/session max-age <duration|off>` gèrent lexpiration de la liaison de fil.
- `/export-session [path]` exporte la session actuelle en HTML. Alias : `/export`.
- `/export-trajectory [path]` demande une approbation dexécution, puis exporte un [lot de trajectoire](/fr/tools/trajectory) JSONL pour la session actuelle. Utilisez-le lorsque vous avez besoin de la chronologie des invites, des outils et de la transcription pour une session OpenClaw. Dans les chats de groupe, linvite dapprobation et le résultat dexportation sont envoyés au propriétaire en privé. Alias : `/trajectory`.
<Accordion title="Sessions and runs">
- `/new [model]` starts a new session; `/reset` is the reset alias.
- Control UI intercepts typed `/new` to create and switch to a fresh dashboard session; typed `/reset` still runs the Gateway's in-place reset.
- `/reset soft [message]` keeps the current transcript, drops reused CLI backend session ids, and reruns startup/system-prompt loading in-place.
- `/compact [instructions]` compacts the session context. See [Compaction](/fr/concepts/compaction).
- `/stop` aborts the current run.
- `/session idle <duration|off>` and `/session max-age <duration|off>` manage thread-binding expiry.
- `/export-session [path]` exports the current session to HTML. Alias: `/export`.
- `/export-trajectory [path]` asks for exec approval, then exports a JSONL [trajectory bundle](/fr/tools/trajectory) for the current session. Use it when you need the prompt, tool, and transcript timeline for one OpenClaw session. In group chats, the approval prompt and export result go to the owner privately. Alias: `/trajectory`.
</Accordion>
<Accordion title="Contrôles du modèle et de lexécution">
- `/think <level>` définit le niveau de réflexion. Les options proviennent du profil fournisseur du modèle actif ; les niveaux courants sont `off`, `minimal`, `low`, `medium` et `high`, avec des niveaux personnalisés tels que `xhigh`, `adaptive`, `max`, ou le binaire `on` uniquement lorsquils sont pris en charge. Alias : `/thinking`, `/t`.
- `/verbose on|off|full` active ou désactive la sortie détaillée. Alias : `/v`.
- `/trace on|off` active ou désactive la sortie de trace plugin pour la session actuelle.
- `/fast [status|on|off]` affiche ou définit le mode rapide.
- `/reasoning [on|off|stream]` active ou désactive la visibilité du raisonnement. Alias : `/reason`.
- `/elevated [on|off|ask|full]` active ou désactive le mode élevé. Alias : `/elev`.
- `/exec host=<auto|sandbox|gateway|node> security=<deny|allowlist|full> ask=<off|on-miss|always> node=<id>` affiche ou définit les valeurs par défaut dexécution.
- `/model [name|#|status]` affiche ou définit le modèle.
- `/models [provider] [page] [limit=<n>|size=<n>|all]` liste les fournisseurs configurés/disponibles avec authentification ou les modèles dun fournisseur ; ajoutez `all` pour parcourir le catalogue complet de ce fournisseur.
- `/queue <mode>` gère le comportement de la file (`steer`, ancien `queue`, `followup`, `collect`, `steer-backlog`, `interrupt`) plus des options comme `debounce:0.5s cap:25 drop:summarize` ; `/queue default` ou `/queue reset` efface le remplacement de session. Voir [File de commandes](/fr/concepts/queue) et [File de pilotage](/fr/concepts/queue-steering).
- `/steer <message>` injecte des consignes dans lexécution active pour la session actuelle, indépendamment du mode `/queue`. Cela ne démarre pas une nouvelle exécution lorsque la session est inactive. Alias : `/tell`. Voir [Piloter](/fr/tools/steer).
<Accordion title="Model and run controls">
- `/think <level>` sets the thinking level. Options come from the active model's provider profile; common levels are `off`, `minimal`, `low`, `medium`, and `high`, with custom levels such as `xhigh`, `adaptive`, `max`, or binary `on` only where supported. Aliases: `/thinking`, `/t`.
- `/verbose on|off|full` toggles verbose output. Alias: `/v`.
- `/trace on|off` toggles plugin trace output for the current session.
- `/fast [status|on|off]` shows or sets fast mode.
- `/reasoning [on|off|stream]` toggles reasoning visibility. Alias: `/reason`.
- `/elevated [on|off|ask|full]` toggles elevated mode. Alias: `/elev`.
- `/exec host=<auto|sandbox|gateway|node> security=<deny|allowlist|full> ask=<off|on-miss|always> node=<id>` shows or sets exec defaults.
- `/model [name|#|status]` shows or sets the model.
- `/models [provider] [page] [limit=<n>|size=<n>|all]` lists configured/auth-available providers or models for a provider; add `all` to browse that provider's full catalog.
- `/queue <mode>` manages queue behavior (`steer`, legacy `queue`, `followup`, `collect`, `steer-backlog`, `interrupt`) plus options like `debounce:0.5s cap:25 drop:summarize`; `/queue default` or `/queue reset` clears the session override. See [Command queue](/fr/concepts/queue) and [Steering queue](/fr/concepts/queue-steering).
- `/steer <message>` injects guidance into the active run for the current session, independent of `/queue` mode. It does not start a new run when the session is idle. Alias: `/tell`. See [Steer](/fr/tools/steer).
</Accordion>
<Accordion title="Découverte et état">
- `/help` affiche le résumé daide court.
- `/commands` affiche le catalogue de commandes généré.
- `/tools [compact|verbose]` affiche ce que lagent actuel peut utiliser maintenant.
- `/status` affiche létat dexécution/dexécution runtime, y compris les libellés `Execution`/`Runtime` et lutilisation/quota du fournisseur lorsquils sont disponibles.
- `/diagnostics [note]` est le flux de rapport de support réservé au propriétaire pour les bugs du Gateway et les exécutions du harnais Codex. Il demande une approbation dexécution explicite à chaque fois avant dexécuter `openclaw gateway diagnostics export --json` ; napprouvez pas les diagnostics avec une règle dautorisation globale. Après approbation, il envoie un rapport prêt à coller avec le chemin du lot local, le résumé du manifeste, les notes de confidentialité et les identifiants de session pertinents. Dans les chats de groupe, linvite dapprobation et le rapport sont envoyés au propriétaire en privé. Lorsque la session active utilise le harnais OpenAI Codex, la même approbation envoie également les retours Codex pertinents aux serveurs OpenAI, et la réponse terminée liste les identifiants de session OpenClaw, les identifiants de fil Codex et les commandes `codex resume <thread-id>`. Voir [Exportation des diagnostics](/fr/gateway/diagnostics).
- `/crestodian <request>` exécute lassistant de configuration et de réparation Crestodian depuis un DM propriétaire.
- `/tasks` liste les tâches en arrière-plan actives/récentes pour la session actuelle.
- `/context [list|detail|json]` explique comment le contexte est assemblé.
- `/whoami` affiche votre identifiant dexpéditeur. Alias : `/id`.
- `/usage off|tokens|full|cost` contrôle le pied de page dutilisation par réponse ou imprime un résumé local des coûts.
<Accordion title="Discovery and status">
- `/help` shows the short help summary.
- `/commands` shows the generated command catalog.
- `/tools [compact|verbose]` shows what the current agent can use right now.
- `/status` shows execution/runtime status, Gateway and system uptime, plus provider usage/quota when available.
- `/diagnostics [note]` is the owner-only support-report flow for Gateway bugs and Codex harness runs. It asks for explicit exec approval every time before running `openclaw gateway diagnostics export --json`; do not approve diagnostics with an allow-all rule. After approval, it sends a pasteable report with the local bundle path, manifest summary, privacy notes, and relevant session ids. In group chats, the approval prompt and report go to the owner privately. When the active session uses the OpenAI Codex harness, the same approval also sends relevant Codex feedback to OpenAI servers and the completed reply lists the OpenClaw session ids, Codex thread ids, and `codex resume <thread-id>` commands. See [Diagnostics Export](/fr/gateway/diagnostics).
- `/crestodian <request>` runs the Crestodian setup and repair helper from an owner DM.
- `/tasks` lists active/recent background tasks for the current session.
- `/context [list|detail|json]` explains how context is assembled.
- `/whoami` shows your sender id. Alias: `/id`.
- `/usage off|tokens|full|cost` controls the per-response usage footer or prints a local cost summary.
</Accordion>
<Accordion title="Skills, listes dautorisation, approbations">
- `/skill <name> [input]` exécute un skill par nom.
- `/allowlist [list|add|remove] ...` gère les entrées de liste dautorisation. Texte uniquement.
- `/approve <id> <decision>` résout les invites dapprobation dexécution.
- `/btw <question>` pose une question secondaire sans modifier le contexte futur de la session. Alias : `/side`. Voir [BTW](/fr/tools/btw).
<Accordion title="Skills, allowlists, approvals">
- `/skill <name> [input]` runs a skill by name.
- `/allowlist [list|add|remove] ...` manages allowlist entries. Text-only.
- `/approve <id> <decision>` resolves exec approval prompts.
- `/btw <question>` asks a side question without changing future session context. Alias: `/side`. See [BTW](/fr/tools/btw).
</Accordion>
<Accordion title="Sous-agents et ACP">
- `/subagents list|kill|log|info|send|steer|spawn` gère les exécutions de sous-agents pour la session actuelle.
- `/acp spawn|cancel|steer|close|sessions|status|set-mode|set|cwd|permissions|timeout|model|reset-options|doctor|install|help` gère les sessions ACP et les options dexécution.
- `/focus <target>` lie le fil Discord actuel ou le sujet/la conversation Telegram à une cible de session.
- `/unfocus` supprime la liaison actuelle.
- `/focus <target>` associe le fil Discord actuel ou le sujet/la conversation Telegram à une cible de session.
- `/unfocus` supprime lassociation actuelle.
- `/agents` liste les agents liés au fil pour la session actuelle.
- `/kill <id|#|all>` interrompt un sous-agent en cours dexécution ou tous les sous-agents.
- `/subagents steer <id|#> <message>` envoie des instructions à un sous-agent en cours dexécution. Voir [Piloter](/fr/tools/steer).
- `/kill <id|#|all>` interrompt un sous-agent en cours dexécution, ou tous.
- `/subagents steer <id|#> <message>` envoie une directive à un sous-agent en cours dexécution. Voir [Orienter](/fr/tools/steer).
</Accordion>
<Accordion title="Écritures réservées au propriétaire et administration">
- `/config show|get|set|unset` lit ou écrit `openclaw.json`. Réservé au propriétaire. Nécessite `commands.config: true`.
- `/mcp show|get|set|unset` lit ou écrit la configuration de serveur MCP gérée par OpenClaw sous `mcp.servers`. Réservé au propriétaire. Nécessite `commands.mcp: true`.
- `/plugins list|inspect|show|get|install|enable|disable` inspecte ou modifie létat des plugins. `/plugin` est un alias. Les écritures sont réservées au propriétaire. Nécessite `commands.plugins: true`.
- `/debug show|set|unset|reset` gère les remplacements de configuration valables uniquement à lexécution. Réservé au propriétaire. Nécessite `commands.debug: true`.
- `/restart` redémarre OpenClaw lorsque cette option est activée. Par défaut : activé ; définissez `commands.restart: false` pour la désactiver.
- `/mcp show|get|set|unset` lit ou écrit la configuration des serveurs MCP gérés par OpenClaw sous `mcp.servers`. Réservé au propriétaire. Nécessite `commands.mcp: true`.
- `/plugins list|inspect|show|get|install|enable|disable` inspecte ou modifie létat des plugins. `/plugin` est un alias. Écritures réservées au propriétaire. Nécessite `commands.plugins: true`.
- `/debug show|set|unset|reset` gère les remplacements de configuration uniquement à lexécution. Réservé au propriétaire. Nécessite `commands.debug: true`.
- `/restart` redémarre OpenClaw lorsque cette option est activée. Par défaut : activé ; définissez `commands.restart: false` pour le désactiver.
- `/send on|off|inherit` définit la politique denvoi. Réservé au propriétaire.
</Accordion>
<Accordion title="Voix, TTS, contrôle du canal">
- `/tts on|off|status|chat|latest|provider|limit|summary|audio|help` contrôle TTS. Voir [TTS](/fr/tools/tts).
- `/activation mention|always` définit le mode dactivation de groupe.
- `/bash <command>` exécute une commande shell sur lhôte. Texte uniquement. Alias : `! <command>`. Nécessite `commands.bash: true` plus les listes dautorisation `tools.elevated`.
- `/bash <command>` exécute une commande shell hôte. Texte uniquement. Alias : `! <command>`. Nécessite `commands.bash: true` ainsi que les listes dautorisation `tools.elevated`.
- `!poll [sessionId]` vérifie une tâche bash en arrière-plan.
- `!stop [sessionId]` arrête une tâche bash en arrière-plan.
</Accordion>
</AccordionGroup>
### Commandes de dock générées
### Commandes dancrage générées
Les commandes de dock basculent la route de réponse de la session actuelle vers un autre
Les commandes dancrage basculent la route de réponse de la session actuelle vers un autre
canal lié. Voir [Ancrage de canal](/fr/concepts/channel-docking) pour la configuration,
des exemples et le dépannage.
Les commandes de dock sont générées à partir des plugins de canal prenant en charge les commandes natives. Ensemble intégré actuel :
Les commandes dancrage sont générées à partir de plugins de canal prenant en charge les commandes natives. Ensemble actuellement intégré :
- `/dock-discord` (alias : `/dock_discord`)
- `/dock-mattermost` (alias : `/dock_mattermost`)
- `/dock-slack` (alias : `/dock_slack`)
- `/dock-telegram` (alias : `/dock_telegram`)
Utilisez les commandes de dock depuis une conversation directe pour basculer la route de réponse de la session actuelle vers un autre canal lié. Lagent conserve le même contexte de session, mais les réponses futures pour cette session sont envoyées au pair de canal sélectionné.
Utilisez les commandes dancrage depuis une conversation directe pour basculer la route de réponse de la session actuelle vers un autre canal lié. Lagent conserve le même contexte de session, mais les réponses futures de cette session sont transmises au pair de canal sélectionné.
Les commandes de dock nécessitent `session.identityLinks`. Lexpéditeur source et le pair cible doivent appartenir au même groupe didentité, par exemple `["telegram:123", "discord:456"]`. Si un utilisateur Telegram avec lidentifiant `123` envoie `/dock_discord`, OpenClaw stocke `lastChannel: "discord"` et `lastTo: "456"` sur la session active. Si lexpéditeur nest pas lié à un pair Discord, la commande répond avec une indication de configuration au lieu de basculer vers la conversation normale.
Les commandes dancrage nécessitent `session.identityLinks`. Lexpéditeur source et le pair cible doivent se trouver dans le même groupe didentité, par exemple `["telegram:123", "discord:456"]`. Si un utilisateur Telegram avec lid `123` envoie `/dock_discord`, OpenClaw stocke `lastChannel: "discord"` et `lastTo: "456"` sur la session active. Si lexpéditeur nest lié à aucun pair Discord, la commande répond avec une indication de configuration au lieu de revenir à la discussion normale.
Lancrage modifie uniquement la route de session active. Il ne crée pas de comptes de canal, naccorde pas daccès, ne contourne pas les listes dautorisation de canal et ne déplace pas lhistorique de transcription vers une autre session. Utilisez `/dock-telegram`, `/dock-slack`, `/dock-mattermost` ou une autre commande de dock générée pour changer de nouveau la route.
Lancrage modifie uniquement la route de session active. Il ne crée pas de comptes de canal, naccorde pas daccès, ne contourne pas les listes dautorisation de canal et ne déplace pas lhistorique de transcription vers une autre session. Utilisez `/dock-telegram`, `/dock-slack`, `/dock-mattermost` ou une autre commande dancrage générée pour changer à nouveau de route.
### Commandes des plugins intégrés
### Commandes de plugins intégrés
Les plugins intégrés peuvent ajouter davantage de commandes slash. Commandes intégrées actuelles dans ce dépôt :
Les plugins intégrés peuvent ajouter davantage de commandes slash. Commandes actuellement intégrées dans ce dépôt :
- `/dreaming [on|off|status|help]` active ou désactive Dreaming de mémoire. Voir [Dreaming](/fr/concepts/dreaming).
- `/pair [qr|status|pending|approve|cleanup|notify]` gère le flux dassociation/configuration dappareil. Voir [Association](/fr/channels/pairing).
- `/phone status|arm <camera|screen|writes|all> [duration]|disarm` arme temporairement les commandes de nœud téléphone à haut risque.
- `/voice status|list [limit]|set <voiceId|name>` gère la configuration de voix Talk. Sur Discord, le nom de commande native est `/talkvoice`.
- `/dreaming [on|off|status|help]` active ou désactive le Dreaming de mémoire. Voir [Dreaming](/fr/concepts/dreaming).
- `/pair [qr|status|pending|approve|cleanup|notify]` gère le flux dappairage/de configuration de lappareil. Voir [Appairage](/fr/channels/pairing).
- `/phone status|arm <camera|screen|writes|all> [duration]|disarm` arme temporairement les commandes de nœud de téléphone à haut risque.
- `/voice status|list [limit]|set <voiceId|name>` gère la configuration de voix Talk. Sur Discord, le nom de commande natif est `/talkvoice`.
- `/card ...` envoie des préréglages de cartes enrichies LINE. Voir [LINE](/fr/channels/line).
- `/codex status|models|threads|resume|compact|review|diagnostics|account|mcp|skills` inspecte et contrôle le harnais de serveur dapplication Codex intégré. Voir [Harnais Codex](/fr/plugins/codex-harness).
- Commandes réservées à QQBot :
- `/codex status|models|threads|resume|compact|review|diagnostics|account|mcp|skills` inspecte et contrôle le harnais de serveur dapp Codex intégré. Voir [Harnais Codex](/fr/plugins/codex-harness).
- Commandes propres à QQBot :
- `/bot-ping`
- `/bot-version`
- `/bot-help`
- `/bot-upgrade`
- `/bot-logs`
### Commandes de Skills dynamiques
### Commandes dynamiques de Skills
Les Skills invocables par lutilisateur sont également exposées comme commandes slash :
- `/skill <name> [input]` fonctionne toujours comme point dentrée générique.
- Les Skills peuvent également apparaître comme commandes directes, par exemple `/prose`, lorsque la Skill/le Plugin les enregistre.
- Lenregistrement des commandes de Skill natives est contrôlé par `commands.nativeSkills` et `channels.<provider>.commands.nativeSkills`.
- Les spécifications de commande peuvent fournir `descriptionLocalizations` pour les surfaces natives prenant en charge les descriptions localisées, y compris Discord.
- Les Skills peuvent aussi apparaître comme commandes directes telles que `/prose` lorsque la compétence/le plugin les enregistre.
- Lenregistrement natif des commandes de Skills est contrôlé par `commands.nativeSkills` et `channels.<provider>.commands.nativeSkills`.
- Les spécifications de commande peuvent fournir `descriptionLocalizations` pour les surfaces natives qui prennent en charge les descriptions localisées, y compris Discord.
<AccordionGroup>
<Accordion title="Notes sur les arguments et lanalyseur">
- Les commandes acceptent un `:` facultatif entre la commande et les arguments (par ex. `/think: high`, `/send: on`, `/help:`).
- Les commandes acceptent un `:` facultatif entre la commande et les arguments (par exemple `/think: high`, `/send: on`, `/help:`).
- `/new <model>` accepte un alias de modèle, `provider/model` ou un nom de fournisseur (correspondance approximative) ; en labsence de correspondance, le texte est traité comme le corps du message.
- Pour une ventilation complète de lutilisation par fournisseur, utilisez `openclaw status --usage`.
- Pour une répartition complète de lutilisation par fournisseur, utilisez `openclaw status --usage`.
- `/allowlist add|remove` nécessite `commands.config=true` et respecte `configWrites` du canal.
- Dans les canaux multicomptes, `/allowlist --account <id>` ciblant la configuration et `/config set channels.<provider>.accounts.<id>...` respectent également `configWrites` du compte cible.
- `/usage` contrôle le pied de page dutilisation par réponse ; `/usage cost` affiche un récapitulatif local des coûts à partir des journaux de session OpenClaw.
- Dans les canaux multi-comptes, `/allowlist --account <id>` ciblé sur la configuration et `/config set channels.<provider>.accounts.<id>...` respectent aussi `configWrites` du compte cible.
- `/usage` contrôle le pied de page dutilisation par réponse ; `/usage cost` affiche un résumé local des coûts à partir des journaux de session OpenClaw.
- `/restart` est activé par défaut ; définissez `commands.restart: false` pour le désactiver.
- `/plugins install <spec>` accepte les mêmes spécifications de Plugin que `openclaw plugins install` : chemin/archive local(e), package npm, `git:<repo>` ou `clawhub:<pkg>`, puis demande un redémarrage du Gateway, car les modules sources du Plugin ont changé.
- `/plugins install <spec>` accepte les mêmes spécifications de Plugin que `openclaw plugins install` : chemin/archive local, package npm, `git:<repo>` ou `clawhub:<pkg>`, puis demande un redémarrage du Gateway, car les modules source du Plugin ont changé.
- `/plugins enable|disable` met à jour la configuration du Plugin et déclenche le rechargement des plugins du Gateway pour les nouveaux tours dagent.
</Accordion>
<Accordion title="Comportement propre au canal">
- Commande native réservée à Discord : `/vc join|leave|status` contrôle les canaux vocaux (non disponible sous forme de texte). `join` nécessite une guilde et un canal vocal/scène sélectionné. Nécessite `channels.discord.voice` et les commandes natives.
- Les commandes de liaison de fil Discord (`/focus`, `/unfocus`, `/agents`, `/session idle`, `/session max-age`) nécessitent lactivation effective des liaisons de fil (`session.threadBindings.enabled` et/ou `channels.discord.threadBindings.enabled`).
- Référence des commandes ACP et comportement à lexécution : [Agents ACP](/fr/tools/acp-agents).
- Commande native propre à Discord : `/vc join|leave|status` contrôle les canaux vocaux (non disponible sous forme de texte). `join` nécessite un serveur et un canal vocal/de scène sélectionné. Nécessite `channels.discord.voice` et les commandes natives.
- Les commandes Discord de liaison aux fils (`/focus`, `/unfocus`, `/agents`, `/session idle`, `/session max-age`) nécessitent lactivation effective des liaisons de fil (`session.threadBindings.enabled` et/ou `channels.discord.threadBindings.enabled`).
- Référence des commandes ACP et comportement dexécution : [agents ACP](/fr/tools/acp-agents).
</Accordion>
<Accordion title="Sécurité verbose / trace / fast / reasoning">
- `/verbose` est destiné au débogage et à une visibilité accrue ; gardez-le **désactivé** en usage normal.
- `/trace` est plus restreint que `/verbose` : il révèle uniquement les lignes de trace/débogage appartenant au Plugin et laisse désactivé le bavardage verbeux normal des outils.
- `/fast on|off` conserve un remplacement de session. Utilisez loption `inherit` de linterface Sessions pour leffacer et revenir aux valeurs par défaut de configuration.
- `/fast` dépend du fournisseur : OpenAI/OpenAI Codex le mappe vers `service_tier=priority` sur les points de terminaison Responses natifs, tandis que les requêtes Anthropic publiques directes, y compris le trafic authentifié par OAuth envoyé à `api.anthropic.com`, le mappent vers `service_tier=auto` ou `standard_only`. Voir [OpenAI](/fr/providers/openai) et [Anthropic](/fr/providers/anthropic).
- Les résumés déchec doutil restent affichés lorsquils sont pertinents, mais le texte détaillé de léchec nest inclus que lorsque `/verbose` vaut `on` ou `full`.
- `/reasoning`, `/verbose` et `/trace` sont risqués dans les contextes de groupe : ils peuvent révéler un raisonnement interne, une sortie doutil ou des diagnostics de Plugin que vous naviez pas lintention dexposer. Préférez les laisser désactivés, surtout dans les conversations de groupe.
- `/verbose` est destiné au débogage et à une visibilité supplémentaire ; gardez-le **désactivé** en utilisation normale.
- `/trace` est plus restreint que `/verbose` : il révèle uniquement les lignes de trace/débogage appartenant aux plugins et garde désactivé le bavardage verbose normal des outils.
- `/fast on|off` conserve un remplacement de session. Utilisez loption `inherit` de linterface Sessions pour leffacer et revenir aux valeurs par défaut de la configuration.
- `/fast` est propre au fournisseur : OpenAI/OpenAI Codex le mappe à `service_tier=priority` sur les points de terminaison Responses natifs, tandis que les requêtes Anthropic publiques directes, y compris le trafic authentifié par OAuth envoyé à `api.anthropic.com`, le mappent à `service_tier=auto` ou `standard_only`. Voir [OpenAI](/fr/providers/openai) et [Anthropic](/fr/providers/anthropic).
- Les résumés déchec des outils restent affichés lorsquils sont pertinents, mais le texte détaillé de léchec nest inclus que lorsque `/verbose` vaut `on` ou `full`.
- `/reasoning`, `/verbose` et `/trace` sont risqués dans les contextes de groupe : ils peuvent révéler un raisonnement interne, une sortie doutil ou des diagnostics de Plugin que vous naviez pas lintention dexposer. Préférez les laisser désactivés, en particulier dans les discussions de groupe.
</Accordion>
<Accordion title="Changement de modèle">
- `/model` conserve immédiatement le nouveau modèle de session.
- Si lagent est inactif, la prochaine exécution lutilise tout de suite.
- Si une exécution est déjà active, OpenClaw marque un changement à chaud comme en attente et ne redémarre dans le nouveau modèle quà un point de nouvelle tentative propre.
- Si lactivité doutil ou la sortie de réponse a déjà commencé, le changement en attente peut rester en file jusquà une opportunité de nouvelle tentative ultérieure ou jusquau prochain tour utilisateur.
- Dans la TUI locale, `/crestodian [request]` revient de la TUI dagent normale à Crestodian. Cest distinct du mode de secours des canaux de messages et cela naccorde pas dautorité de configuration à distance.
- Si lagent est inactif, la prochaine exécution lutilise immédiatement.
- Si une exécution est déjà active, OpenClaw marque un changement en direct comme en attente et ne redémarre dans le nouveau modèle quà un point de nouvelle tentative propre.
- Si lactivité des outils ou la sortie de réponse a déjà commencé, le changement en attente peut rester en file jusquà une occasion de nouvelle tentative ultérieure ou jusquau prochain tour utilisateur.
- Dans la TUI locale, `/crestodian [request]` revient de la TUI dagent normale à Crestodian. Cest distinct du mode de secours des canaux de message et cela naccorde pas dautorité distante sur la configuration.
</Accordion>
<Accordion title="Chemin rapide et raccourcis en ligne">
- **Chemin rapide :** les messages contenant uniquement une commande provenant dexpéditeurs autorisés sont traités immédiatement (contournement de la file + du modèle).
- **Garde par mention de groupe :** les messages contenant uniquement une commande provenant dexpéditeurs autorisés contournent les exigences de mention.
- **Raccourcis en ligne (expéditeurs autorisés uniquement) :** certaines commandes fonctionnent également lorsquelles sont intégrées dans un message normal et sont supprimées avant que le modèle voie le texte restant.
<Accordion title="Chemin rapide et raccourcis intégrés">
- **Chemin rapide :** les messages contenant uniquement une commande envoyés par des expéditeurs sur liste dautorisation sont traités immédiatement (contournement de la file + modèle).
- **Garde par mention de groupe :** les messages contenant uniquement une commande envoyés par des expéditeurs sur liste dautorisation contournent les exigences de mention.
- **Raccourcis intégrés (expéditeurs sur liste dautorisation uniquement) :** certaines commandes fonctionnent aussi lorsquelles sont intégrées dans un message normal et sont supprimées avant que le modèle voie le texte restant.
- Exemple : `hey /status` déclenche une réponse détat, et le texte restant poursuit le flux normal.
- Actuellement : `/help`, `/commands`, `/status`, `/whoami` (`/id`).
- Les messages non autorisés contenant uniquement une commande sont ignorés silencieusement, et les jetons `/...` en ligne sont traités comme du texte brut.
- Les messages non autorisés contenant uniquement une commande sont ignorés silencieusement, et les jetons `/...` intégrés sont traités comme du texte brut.
</Accordion>
<Accordion title="Commandes de Skills et arguments natifs">
- **Commandes de Skills :** les Skills `user-invocable` sont exposées comme commandes slash. Les noms sont normalisés en `a-z0-9_` (32 caractères max) ; les collisions reçoivent des suffixes numériques (par ex. `_2`).
- **Commandes de Skills :** les Skills `user-invocable` sont exposées comme commandes slash. Les noms sont assainis en `a-z0-9_` (32 caractères max) ; les collisions reçoivent des suffixes numériques (par exemple `_2`).
- `/skill <name> [input]` exécute une Skill par nom (utile lorsque les limites des commandes natives empêchent les commandes par Skill).
- Par défaut, les commandes de Skill sont transmises au modèle comme une requête normale.
- Les Skills peuvent éventuellement déclarer `command-dispatch: tool` pour acheminer la commande directement vers un outil (déterministe, sans modèle).
- Par défaut, les commandes de Skills sont transmises au modèle comme une requête normale.
- Les Skills peuvent éventuellement déclarer `command-dispatch: tool` pour router la commande directement vers un outil (déterministe, sans modèle).
- Exemple : `/prose` (Plugin OpenProse) — voir [OpenProse](/fr/prose).
- **Arguments de commande native :** Discord utilise la saisie semi-automatique pour les options dynamiques (et des menus de boutons lorsque vous omettez des arguments requis). Telegram et Slack affichent un menu de boutons lorsquune commande prend en charge des choix et que vous omettez largument. Les choix dynamiques sont résolus par rapport au modèle de session cible, de sorte que les options propres au modèle, comme les niveaux `/think`, suivent le remplacement `/model` de cette session.
- **Arguments de commande natifs :** Discord utilise lautocomplétion pour les options dynamiques (et des menus de boutons lorsque vous omettez des arguments requis). Telegram et Slack affichent un menu de boutons lorsquune commande prend en charge des choix et que vous omettez largument. Les choix dynamiques sont résolus par rapport au modèle de session cible ; les options propres au modèle, telles que les niveaux `/think`, suivent donc le remplacement `/model` de cette session.
</Accordion>
</AccordionGroup>
@ -312,18 +312,18 @@ Les Skills invocables par lutilisateur sont également exposées comme comman
- `/tools` par défaut est compact et optimisé pour un balayage rapide.
- `/tools verbose` ajoute de courtes descriptions.
- Les surfaces de commandes natives qui prennent en charge les arguments exposent le même commutateur de mode que `compact|verbose`.
- Les résultats sont propres à la session ; changer dagent, de canal, de fil, dautorisation dexpéditeur ou de modèle peut donc modifier la sortie.
- `/tools` inclut les outils réellement accessibles à lexécution, y compris les outils de base, les outils de plugins connectés et les outils appartenant au canal.
- Les résultats sont limités à la session ; changer dagent, de canal, de fil, dautorisation dexpéditeur ou de modèle peut donc modifier la sortie.
- `/tools` inclut les outils réellement accessibles à lexécution, y compris les outils du cœur, les outils de plugins connectés et les outils appartenant au canal.
Pour modifier les profils et les remplacements, utilisez le panneau Tools de linterface Control UI ou les surfaces de configuration/catalogue, au lieu de traiter `/tools` comme un catalogue statique.
Pour modifier les profils et les remplacements, utilisez le panneau Outils de linterface de contrôle ou les surfaces de configuration/catalogue au lieu de traiter `/tools` comme un catalogue statique.
## Surfaces dutilisation (ce qui saffiche où)
- **Utilisation/quota du fournisseur** (exemple : « Claude 80 % restants ») apparaît dans `/status` pour le fournisseur de modèle actuel lorsque le suivi de lutilisation est activé. OpenClaw normalise les fenêtres des fournisseurs en `% restant` ; pour MiniMax, les champs de pourcentage indiquant uniquement le restant sont inversés avant laffichage, et les réponses `model_remains` privilégient lentrée du modèle de chat plus une étiquette dabonnement marquée par modèle.
- **Lignes de jetons/cache** dans `/status` peuvent se replier sur la dernière entrée dutilisation de transcript lorsque linstantané de session en direct est peu fourni. Les valeurs en direct non nulles existantes restent prioritaires, et le repli sur le transcript peut aussi récupérer létiquette du modèle dexécution actif ainsi quun total plus élevé orienté prompt lorsque les totaux stockés sont absents ou plus petits.
- **Exécution vs runtime :** `/status` indique `Execution` pour le chemin de sandbox effectif et `Runtime` pour ce qui exécute réellement la session : `OpenClaw Pi Default`, `OpenAI Codex`, un backend CLI ou un backend ACP.
- **Jetons/coût par réponse** est contrôlé par `/usage off|tokens|full` (ajouté aux réponses normales).
- `/model status` concerne les **modèles/authentification/points de terminaison**, pas lutilisation.
- **Utilisation/quota du fournisseur** (exemple : "Claude 80% left") apparaît dans `/status` pour le fournisseur de modèle actuel lorsque le suivi de lutilisation est activé. OpenClaw normalise les fenêtres fournisseur en `% left` ; pour MiniMax, les champs de pourcentage indiquant uniquement le reste sont inversés avant laffichage, et les réponses `model_remains` privilégient lentrée du modèle de chat plus une étiquette de forfait marquée par modèle.
- **Lignes de tokens/cache** dans `/status` peuvent se rabattre sur la dernière entrée dutilisation de la transcription lorsque linstantané de session en direct est pauvre. Les valeurs en direct non nulles existantes restent prioritaires, et le repli sur la transcription peut aussi récupérer létiquette du modèle dexécution actif ainsi quun total plus grand orienté prompt lorsque les totaux stockés sont absents ou plus petits.
- **Exécution vs Runtime :** `/status` signale `Execution` pour le chemin de sandbox effectif et `Runtime` pour ce qui exécute réellement la session : `OpenClaw Pi Default`, `OpenAI Codex`, un backend CLI ou un backend ACP.
- **Tokens/coût par réponse** est contrôlé par `/usage off|tokens|full` (ajouté aux réponses normales).
- `/model status` concerne les **modèles/lauthentification/les endpoints**, pas lutilisation.
## Sélection de modèle (`/model`)
@ -340,16 +340,16 @@ Exemples :
/model status
```
Notes :
Remarques :
- `/model` et `/model list` affichent un sélecteur compact et numéroté (famille de modèles + fournisseurs disponibles).
- Sur Discord, `/model` et `/models` ouvrent un sélecteur interactif avec des listes déroulantes de fournisseur et de modèle, plus une étape Envoyer.
- `/model` et `/model list` affichent un sélecteur compact numéroté (famille de modèles + fournisseurs disponibles).
- Sur Discord, `/model` et `/models` ouvrent un sélecteur interactif avec des menus déroulants de fournisseur et de modèle, plus une étape Submit.
- `/model <#>` sélectionne depuis ce sélecteur (et privilégie le fournisseur actuel lorsque cest possible).
- `/model status` affiche la vue détaillée, y compris le point de terminaison du fournisseur configuré (`baseUrl`) et le mode dAPI (`api`) lorsquils sont disponibles.
- `/model status` affiche la vue détaillée, y compris lendpoint du fournisseur configuré (`baseUrl`) et le mode API (`api`) lorsquils sont disponibles.
## Overrides de débogage
## Remplacements de débogage
`/debug` vous permet de définir des overrides de configuration **uniquement pour le runtime** (mémoire, pas disque). Réservé au propriétaire. Désactivé par défaut ; activez avec `commands.debug: true`.
`/debug` vous permet de définir des remplacements de configuration **uniquement à lexécution** (mémoire, pas disque). Réservé au propriétaire. Désactivé par défaut ; activez avec `commands.debug: true`.
Exemples :
@ -362,12 +362,12 @@ Exemples :
```
<Note>
Les overrides sappliquent immédiatement aux nouvelles lectures de configuration, mais ne sont **pas** écrits dans `openclaw.json`. Utilisez `/debug reset` pour effacer tous les overrides et revenir à la configuration sur disque.
Les remplacements sappliquent immédiatement aux nouvelles lectures de configuration, mais nécrivent **pas** dans `openclaw.json`. Utilisez `/debug reset` pour effacer tous les remplacements et revenir à la configuration sur disque.
</Note>
## Sortie de trace Plugin
`/trace` vous permet dactiver ou de désactiver les **lignes de trace/débogage des plugins limitées à la session** sans activer le mode verbeux complet.
`/trace` vous permet dactiver ou de désactiver des **lignes de trace/débogage Plugin limitées à la session** sans activer le mode verbeux complet.
Exemples :
@ -377,14 +377,14 @@ Exemples :
/trace off
```
Notes :
Remarques :
- `/trace` sans argument affiche létat actuel de la trace de session.
- `/trace on` active les lignes de trace des plugins pour la session actuelle.
- `/trace` sans argument affiche létat de trace actuel de la session.
- `/trace on` active les lignes de trace Plugin pour la session actuelle.
- `/trace off` les désactive à nouveau.
- Les lignes de trace des plugins peuvent apparaître dans `/status` et sous forme de message de diagnostic de suivi après la réponse normale de lassistant.
- `/trace` ne remplace pas `/debug` ; `/debug` gère toujours les overrides de configuration uniquement pour le runtime.
- `/trace` ne remplace pas `/verbose` ; la sortie verbeuse normale des outils/statuts relève toujours de `/verbose`.
- Les lignes de trace Plugin peuvent apparaître dans `/status` et comme message de diagnostic de suivi après la réponse normale de lassistant.
- `/trace` ne remplace pas `/debug` ; `/debug` gère toujours les remplacements de configuration uniquement à lexécution.
- `/trace` ne remplace pas `/verbose` ; la sortie verbeuse normale des outils/états relève toujours de `/verbose`.
## Mises à jour de configuration
@ -401,7 +401,7 @@ Exemples :
```
<Note>
La configuration est validée avant écriture ; les changements invalides sont rejetés. Les mises à jour `/config` persistent après les redémarrages.
La configuration est validée avant lécriture ; les modifications invalides sont rejetées. Les mises à jour `/config` persistent entre les redémarrages.
</Note>
## Mises à jour MCP
@ -418,12 +418,12 @@ Exemples :
```
<Note>
`/mcp` stocke la configuration dans la configuration OpenClaw, pas dans les paramètres de projet détenus par Pi. Les adaptateurs runtime décident quels transports sont réellement exécutables.
`/mcp` stocke la configuration dans la configuration OpenClaw, pas dans les paramètres de projet appartenant à Pi. Les adaptateurs dexécution décident quels transports sont réellement exécutables.
</Note>
## Mises à jour des plugins
## Mises à jour Plugin
`/plugins` permet aux opérateurs dinspecter les plugins découverts et de basculer leur activation dans la configuration. Les flux en lecture seule peuvent utiliser `/plugin` comme alias. Désactivé par défaut ; activez avec `commands.plugins: true`.
`/plugins` permet aux opérateurs dinspecter les Plugins découverts et dactiver ou désactiver leur activation dans la configuration. Les flux en lecture seule peuvent utiliser `/plugin` comme alias. Désactivé par défaut ; activez avec `commands.plugins: true`.
Exemples :
@ -436,10 +436,10 @@ Exemples :
```
<Note>
- `/plugins list` et `/plugins show` utilisent la découverte réelle des plugins dans lespace de travail actuel plus la configuration sur disque.
- `/plugins list` et `/plugins show` utilisent la vraie découverte de Plugins sur lespace de travail actuel plus la configuration sur disque.
- `/plugins install` installe depuis ClawHub, npm, git, des répertoires locaux et des archives.
- `/plugins enable|disable` met uniquement à jour la configuration des plugins ; il ninstalle ni ne désinstalle les plugins.
- Les changements dactivation et de désactivation rechargent à chaud les surfaces runtime des plugins du Gateway pour les nouveaux tours dagent ; linstallation demande un redémarrage du Gateway, car les modules source des plugins ont changé.
- `/plugins enable|disable` met uniquement à jour la configuration Plugin ; cela ninstalle ni ne désinstalle les Plugins.
- Les changements dactivation et de désactivation rechargent à chaud les surfaces dexécution Plugin du Gateway pour les nouveaux tours dagent ; linstallation demande un redémarrage du Gateway parce que les modules sources Plugin ont changé.
</Note>
@ -447,7 +447,7 @@ Exemples :
<AccordionGroup>
<Accordion title="Sessions par surface">
- **Commandes textuelles** sexécutent dans la session de chat normale (les messages privés partagent `main`, les groupes ont leur propre session).
- **Commandes texte** sexécutent dans la session de chat normale (les DM partagent `main`, les groupes ont leur propre session).
- **Commandes natives** utilisent des sessions isolées :
- Discord : `agent:<agentId>:discord:slash:<userId>`
- Slack : `agent:<agentId>:slack:slash:<userId>` (préfixe configurable via `channels.slack.slashCommand.sessionPrefix`)
@ -458,7 +458,7 @@ Exemples :
<Accordion title="Spécificités Slack">
`channels.slack.slashCommand` reste pris en charge pour une seule commande de style `/openclaw`. Si vous activez `commands.native`, vous devez créer une commande slash Slack par commande intégrée (mêmes noms que `/help`). Les menus darguments de commande pour Slack sont fournis sous forme de boutons Block Kit éphémères.
Exception native Slack : enregistrez `/agentstatus` (pas `/status`) car Slack réserve `/status`. Le texte `/status` fonctionne toujours dans les messages Slack.
Exception native Slack : enregistrez `/agentstatus` (pas `/status`) parce que Slack réserve `/status`. Le texte `/status` fonctionne toujours dans les messages Slack.
</Accordion>
</AccordionGroup>
@ -471,9 +471,9 @@ Contrairement au chat normal :
- elle utilise la session actuelle comme contexte darrière-plan,
- elle sexécute comme un appel ponctuel séparé **sans outil**,
- elle ne modifie pas le contexte futur de la session,
- elle nest pas écrite dans lhistorique du transcript,
- elle est fournie comme résultat secondaire en direct au lieu dun message dassistant normal.
- elle ne modifie pas le futur contexte de session,
- elle nest pas écrite dans lhistorique de transcription,
- elle est fournie comme résultat secondaire en direct plutôt que comme message dassistant normal.
Cela rend `/btw` utile lorsque vous voulez une clarification temporaire pendant que la tâche principale continue.
@ -484,7 +484,7 @@ Exemple :
/side what changed while the main run continued?
```
Consultez [Questions secondaires BTW](/fr/tools/btw) pour le comportement complet et les détails de lUX client.
Voir [Questions secondaires BTW](/fr/tools/btw) pour le comportement complet et les détails dUX client.
## Connexe

View File

@ -1,46 +1,46 @@
---
read_when:
- Générer des vidéos via lagent
- Génération de vidéos via lagent
- Configuration des fournisseurs et des modèles de génération vidéo
- Comprendre les paramètres de loutil video_generate
sidebarTitle: Video generation
summary: Générez des vidéos via video_generate à partir de références textuelles, dimages ou de vidéos sur 16 moteurs de fournisseurs.
title: Génération de vidéo
summary: Générez des vidéos via video_generate à partir de références textuelles, dimages ou de vidéos sur 16 backends de fournisseurs
title: Génération de vidéos
x-i18n:
generated_at: "2026-05-05T01:51:24Z"
generated_at: "2026-05-05T06:19:40Z"
model: gpt-5.5
provider: openai
source_hash: 6edce39c3006b748d512fec935b81566ae1a121c280248e9e9439edd1f052d83
source_hash: a86a820cc9f27baf4b17954d7ded7c2b7ff9eb456e7e75c3b2e7a7653cd675fd
source_path: tools/video-generation.md
workflow: 16
---
Les agents OpenClaw peuvent générer des vidéos à partir de prompts textuels, dimages de référence ou de
vidéos existantes. Seize backends fournisseurs sont pris en charge, chacun avec
différentes options de modèles, modes dentrée et ensembles de fonctionnalités. Lagent choisit
automatiquement le bon fournisseur en fonction de votre configuration et des clés API
Les agents OpenClaw peuvent générer des vidéos à partir dinvites textuelles, dimages de référence ou de
vidéos existantes. Seize backends de fournisseurs sont pris en charge, chacun avec
différentes options de modèles, différents modes dentrée et différents ensembles de fonctionnalités. Lagent choisit le
bon fournisseur automatiquement selon votre configuration et les clés dAPI
disponibles.
<Note>
Loutil `video_generate` apparaît uniquement lorsquau moins un fournisseur de génération
vidéo est disponible. Si vous ne le voyez pas dans les outils de votre agent, définissez une
clé API de fournisseur ou configurez `agents.defaults.videoGenerationModel`.
clé dAPI de fournisseur ou configurez `agents.defaults.videoGenerationModel`.
</Note>
OpenClaw traite la génération vidéo comme trois modes dexécution :
OpenClaw traite la génération vidéo selon trois modes dexécution :
- `generate` — requêtes texte-vers-vidéo sans média de référence.
- `imageToVideo` — la requête inclut une ou plusieurs images de référence.
- `videoToVideo` — la requête inclut une ou plusieurs vidéos de référence.
Les fournisseurs peuvent prendre en charge nimporte quel sous-ensemble de ces modes. Loutil valide le
mode actif avant lenvoi et indique les modes pris en charge dans `action=list`.
mode actif avant lenvoi et signale les modes pris en charge dans `action=list`.
## Démarrage rapide
<Steps>
<Step title="Configurer lauthentification">
Définissez une clé API pour nimporte quel fournisseur pris en charge :
Définissez une clé dAPI pour nimporte quel fournisseur pris en charge :
```bash
export GEMINI_API_KEY="your-key"
@ -53,10 +53,10 @@ mode actif avant lenvoi et indique les modes pris en charge dans `action=list
```
</Step>
<Step title="Demander à lagent">
> Générez une vidéo cinématographique de 5 secondes montrant un homard sympathique surfant au coucher du soleil.
> Générez une vidéo cinématographique de 5 secondes dun homard amical qui surfe au coucher du soleil.
Lagent appelle `video_generate` automatiquement. Aucune liste dautorisation doutil
nest nécessaire.
Lagent appelle `video_generate` automatiquement. Aucune liste dautorisation
doutil nest nécessaire.
</Step>
</Steps>
@ -66,37 +66,37 @@ mode actif avant lenvoi et indique les modes pris en charge dans `action=list
La génération vidéo est asynchrone. Lorsque lagent appelle `video_generate` dans une
session :
1. OpenClaw soumet la requête au fournisseur et renvoie immédiatement un identifiant de tâche.
2. Le fournisseur traite la tâche en arrière-plan (généralement de 30 secondes à 5 minutes selon le fournisseur et la résolution).
3. Lorsque la vidéo est prête, OpenClaw réveille la même session avec un événement interne de fin dexécution.
1. OpenClaw envoie la requête au fournisseur et renvoie immédiatement un identifiant de tâche.
2. Le fournisseur traite la tâche en arrière-plan (généralement de 30 secondes à plusieurs minutes selon le fournisseur et la résolution ; les fournisseurs lents adossés à une file dattente peuvent sexécuter jusquau délai dexpiration configuré).
3. Lorsque la vidéo est prête, OpenClaw réveille la même session avec un événement interne dachèvement.
4. Lagent informe lutilisateur et joint la vidéo terminée. Dans les discussions de groupe/canal
qui utilisent une livraison visible uniquement via loutil de messagerie, lagent relaie le
résultat par loutil de messagerie au lieu de laisser OpenClaw le publier directement.
qui utilisent une livraison visible uniquement via loutil de message, lagent relaie le
résultat via loutil de message au lieu quOpenClaw le publie directement.
Lorsquune tâche est en cours, les appels `video_generate` en double dans la même
Pendant quune tâche est en cours, les appels `video_generate` en double dans la même
session renvoient létat actuel de la tâche au lieu de démarrer une autre
génération. Utilisez `openclaw tasks list` ou `openclaw tasks show <taskId>` pour
vérifier la progression depuis la CLI.
En dehors des exécutions dagent adossées à une session (par exemple, les appels directs doutils),
loutil revient à la génération en ligne et renvoie le chemin du média final
loutil revient à la génération en ligne et renvoie le chemin final du média
dans le même tour.
Les fichiers vidéo générés sont enregistrés dans le stockage média géré par OpenClaw lorsque
le fournisseur renvoie des octets. La limite denregistrement par défaut des vidéos générées suit
Les fichiers vidéo générés sont enregistrés dans le stockage multimédia géré par OpenClaw lorsque
le fournisseur renvoie des octets. Le plafond denregistrement par défaut des vidéos générées suit
la limite des médias vidéo, et `agents.defaults.mediaMaxMb` laugmente pour
les rendus plus volumineux. Lorsquun fournisseur renvoie aussi une URL de sortie hébergée, OpenClaw
les rendus plus volumineux. Lorsquun fournisseur renvoie également une URL de sortie hébergée, OpenClaw
peut livrer cette URL au lieu de faire échouer la tâche si la persistance locale
rejette un fichier trop volumineux.
### Cycle de vie des tâches
### Cycle de vie dune tâche
| État | Signification |
| ----------- | ------------------------------------------------------------------------------------------------- |
| `queued` | Tâche créée, en attente dacceptation par le fournisseur. |
| `running` | Le fournisseur traite la tâche (généralement de 30 secondes à 5 minutes selon le fournisseur et la résolution). |
| `succeeded` | Vidéo prête ; lagent se réveille et la publie dans la conversation. |
| `failed` | Erreur ou expiration de délai du fournisseur ; lagent se réveille avec les détails de lerreur. |
| État | Signification |
| ----------- | ------------------------------------------------------------------------------------------------------ |
| `queued` | Tâche créée, en attente dacceptation par le fournisseur. |
| `running` | Le fournisseur traite la tâche (généralement de 30 secondes à plusieurs minutes selon le fournisseur et la résolution). |
| `succeeded` | Vidéo prête ; lagent se réveille et la publie dans la conversation. |
| `failed` | Erreur du fournisseur ou délai dexpiration ; lagent se réveille avec les détails de lerreur. |
Vérifiez létat depuis la CLI :
@ -107,36 +107,36 @@ openclaw tasks cancel <taskId>
```
Si une tâche vidéo est déjà `queued` ou `running` pour la session actuelle,
`video_generate` renvoie létat de la tâche existante au lieu den démarrer une
nouvelle. Utilisez `action: "status"` pour vérifier explicitement sans déclencher une nouvelle
`video_generate` renvoie létat de la tâche existante au lieu den démarrer une nouvelle.
Utilisez `action: "status"` pour vérifier explicitement sans déclencher une nouvelle
génération.
## Fournisseurs pris en charge
| Fournisseur | Modèle par défaut | Texte | Réf. image | Réf. vidéo | Authentification |
| --------------------- | ------------------------------- | :---: | --------------------------------------------------- | ---------------------------------------------- | ---------------------------------------- |
| Alibaba | `wan2.6-t2v` | ✓ | Oui (URL distante) | Oui (URL distante) | `MODELSTUDIO_API_KEY` |
| BytePlus (1.0) | `seedance-1-0-pro-250528` | ✓ | Jusquà 2 images (modèles I2V uniquement ; première + dernière image) | — | `BYTEPLUS_API_KEY` |
| BytePlus Seedance 1.5 | `seedance-1-5-pro-251215` | ✓ | Jusquà 2 images (première + dernière image via le rôle) | — | `BYTEPLUS_API_KEY` |
| BytePlus Seedance 2.0 | `dreamina-seedance-2-0-260128` | ✓ | Jusquà 9 images de référence | Jusquà 3 vidéos | `BYTEPLUS_API_KEY` |
| ComfyUI | `workflow` | ✓ | 1 image | — | `COMFY_API_KEY` ou `COMFY_CLOUD_API_KEY` |
| DeepInfra | `Pixverse/Pixverse-T2V` | ✓ | — | — | `DEEPINFRA_API_KEY` |
| fal | `fal-ai/minimax/video-01-live` | ✓ | 1 image ; jusquà 9 avec Seedance reference-to-video | Jusquà 3 vidéos avec Seedance reference-to-video | `FAL_KEY` |
| Google | `veo-3.1-fast-generate-preview` | ✓ | 1 image | 1 vidéo | `GEMINI_API_KEY` |
| MiniMax | `MiniMax-Hailuo-2.3` | ✓ | 1 image | — | `MINIMAX_API_KEY` ou MiniMax OAuth |
| OpenAI | `sora-2` | ✓ | 1 image | 1 vidéo | `OPENAI_API_KEY` |
| OpenRouter | `google/veo-3.1-fast` | ✓ | Jusquà 4 images (première/dernière image ou références) | — | `OPENROUTER_API_KEY` |
| Qwen | `wan2.6-t2v` | ✓ | Oui (URL distante) | Oui (URL distante) | `QWEN_API_KEY` |
| Runway | `gen4.5` | ✓ | 1 image | 1 vidéo | `RUNWAYML_API_SECRET` |
| Together | `Wan-AI/Wan2.2-T2V-A14B` | ✓ | 1 image | — | `TOGETHER_API_KEY` |
| Vydra | `veo3` | ✓ | 1 image (`kling`) | — | `VYDRA_API_KEY` |
| xAI | `grok-imagine-video` | ✓ | 1 image de première frame ou jusquà 7 `reference_image`s | 1 vidéo | `XAI_API_KEY` |
| Fournisseur | Modèle par défaut | Texte | Réf. image | Réf. vidéo | Authentification |
| --------------------- | --------------------------------- | :---: | --------------------------------------------------- | --------------------------------------------- | ---------------------------------------- |
| Alibaba | `wan2.6-t2v` | ✓ | Oui (URL distante) | Oui (URL distante) | `MODELSTUDIO_API_KEY` |
| BytePlus (1.0) | `seedance-1-0-pro-250528` | ✓ | Jusquà 2 images (modèles I2V uniquement ; première + dernière image) | — | `BYTEPLUS_API_KEY` |
| BytePlus Seedance 1.5 | `seedance-1-5-pro-251215` | ✓ | Jusquà 2 images (première + dernière image via le rôle) | — | `BYTEPLUS_API_KEY` |
| BytePlus Seedance 2.0 | `dreamina-seedance-2-0-260128` | ✓ | Jusquà 9 images de référence | Jusquà 3 vidéos | `BYTEPLUS_API_KEY` |
| ComfyUI | `workflow` | ✓ | 1 image | — | `COMFY_API_KEY` ou `COMFY_CLOUD_API_KEY` |
| DeepInfra | `Pixverse/Pixverse-T2V` | ✓ | — | — | `DEEPINFRA_API_KEY` |
| fal | `fal-ai/minimax/video-01-live` | ✓ | 1 image ; jusquà 9 avec Seedance reference-to-video | Jusquà 3 vidéos avec Seedance reference-to-video | `FAL_KEY` |
| Google | `veo-3.1-fast-generate-preview` | ✓ | 1 image | 1 vidéo | `GEMINI_API_KEY` |
| MiniMax | `MiniMax-Hailuo-2.3` | ✓ | 1 image | — | `MINIMAX_API_KEY` ou OAuth MiniMax |
| OpenAI | `sora-2` | ✓ | 1 image | 1 vidéo | `OPENAI_API_KEY` |
| OpenRouter | `google/veo-3.1-fast` | ✓ | Jusquà 4 images (première/dernière image ou références) | — | `OPENROUTER_API_KEY` |
| Qwen | `wan2.6-t2v` | ✓ | Oui (URL distante) | Oui (URL distante) | `QWEN_API_KEY` |
| Runway | `gen4.5` | ✓ | 1 image | 1 vidéo | `RUNWAYML_API_SECRET` |
| Together | `Wan-AI/Wan2.2-T2V-A14B` | ✓ | 1 image | — | `TOGETHER_API_KEY` |
| Vydra | `veo3` | ✓ | 1 image (`kling`) | — | `VYDRA_API_KEY` |
| xAI | `grok-imagine-video` | ✓ | 1 image de première image ou jusquà 7 `reference_image`s | 1 vidéo | `XAI_API_KEY` |
Certains fournisseurs acceptent des variables denvironnement de clé API supplémentaires ou alternatives. Consultez
Certains fournisseurs acceptent des variables denvironnement de clé dAPI supplémentaires ou alternatives. Consultez
les [pages des fournisseurs](#related) individuelles pour plus de détails.
Exécutez `video_generate action=list` pour inspecter les fournisseurs, modèles et
modes dexécution disponibles au moment de lexécution.
Exécutez `video_generate action=list` pour inspecter les fournisseurs, les modèles et
les modes dexécution disponibles au moment de lexécution.
### Matrice des capacités
@ -145,167 +145,166 @@ le balayage live partagé :
| Fournisseur | `generate` | `imageToVideo` | `videoToVideo` | Voies live partagées aujourdhui |
| ----------- | :--------: | :------------: | :------------: | ---------------------------------------------------------------------------------------------------------------------------------------- |
| Alibaba | ✓ | ✓ | ✓ | `generate`, `imageToVideo` ; `videoToVideo` ignoré car ce fournisseur nécessite des URL vidéo `http(s)` distantes |
| Alibaba | ✓ | ✓ | ✓ | `generate`, `imageToVideo` ; `videoToVideo` ignoré parce que ce fournisseur nécessite des URL vidéo `http(s)` distantes |
| BytePlus | ✓ | ✓ | — | `generate`, `imageToVideo` |
| ComfyUI | ✓ | ✓ | — | Non inclus dans le balayage partagé ; la couverture propre aux workflows se trouve dans les tests Comfy |
| DeepInfra | ✓ | — | — | `generate` ; les schémas vidéo DeepInfra natifs sont texte-vers-vidéo dans le contrat groupé |
| ComfyUI | ✓ | ✓ | — | Non inclus dans le balayage partagé ; la couverture propre au workflow réside avec les tests Comfy |
| DeepInfra | ✓ | — | — | `generate` ; les schémas vidéo DeepInfra natifs sont texte-vers-vidéo dans le contrat intégré |
| fal | ✓ | ✓ | ✓ | `generate`, `imageToVideo` ; `videoToVideo` uniquement lors de lutilisation de Seedance reference-to-video |
| Google | ✓ | ✓ | ✓ | `generate`, `imageToVideo` ; `videoToVideo` partagé ignoré car le balayage Gemini/Veo actuel adossé à un tampon naccepte pas cette entrée |
| Google | ✓ | ✓ | ✓ | `generate`, `imageToVideo` ; `videoToVideo` partagé ignoré parce que le balayage Gemini/Veo actuel adossé à des tampons naccepte pas cette entrée |
| MiniMax | ✓ | ✓ | — | `generate`, `imageToVideo` |
| OpenAI | ✓ | ✓ | ✓ | `generate`, `imageToVideo` ; `videoToVideo` partagé ignoré car ce chemin dorganisation/dentrée nécessite actuellement un accès inpaint/remix côté fournisseur |
| OpenAI | ✓ | ✓ | ✓ | `generate`, `imageToVideo` ; `videoToVideo` partagé ignoré parce que cette organisation/ce chemin dentrée nécessite actuellement un accès inpaint/remix côté fournisseur |
| OpenRouter | ✓ | ✓ | — | `generate`, `imageToVideo` |
| Qwen | ✓ | ✓ | ✓ | `generate`, `imageToVideo` ; `videoToVideo` ignoré car ce fournisseur nécessite des URL vidéo `http(s)` distantes |
| Qwen | ✓ | ✓ | ✓ | `generate`, `imageToVideo` ; `videoToVideo` ignoré parce que ce fournisseur nécessite des URL vidéo `http(s)` distantes |
| Runway | ✓ | ✓ | ✓ | `generate`, `imageToVideo` ; `videoToVideo` sexécute uniquement lorsque le modèle sélectionné est `runway/gen4_aleph` |
| Together | ✓ | ✓ | — | `generate`, `imageToVideo` |
| Vydra | ✓ | ✓ | — | `generate` ; `imageToVideo` partagé ignoré car le `veo3` groupé est texte uniquement et le `kling` groupé nécessite une URL dimage distante |
| xAI | ✓ | ✓ | ✓ | `generate`, `imageToVideo` ; `videoToVideo` ignoré car ce fournisseur nécessite actuellement une URL MP4 distante |
| Vydra | ✓ | ✓ | — | `generate` ; `imageToVideo` partagé ignoré parce que `veo3` intégré est texte uniquement et que `kling` intégré nécessite une URL dimage distante |
| xAI | ✓ | ✓ | ✓ | `generate`, `imageToVideo` ; `videoToVideo` ignoré parce que ce fournisseur nécessite actuellement une URL MP4 distante |
## Paramètres de loutil
### Obligatoire
### Requis
<ParamField path="prompt" type="string" required>
Description textuelle de la vidéo à générer. Obligatoire pour `action: "generate"`.
Description textuelle de la vidéo à générer. Requis pour `action: "generate"`.
</ParamField>
### Entrées de contenu
<ParamField path="image" type="string">Image de référence unique (chemin ou URL).</ParamField>
<ParamField path="images" type="string[]">Plusieurs images de référence (jusquà 9).</ParamField>
<ParamField path="images" type="string[]">Images de référence multiples (jusqu'à 9).</ParamField>
<ParamField path="imageRoles" type="string[]">
Indications de rôle optionnelles par position, parallèles à la liste dimages combinée.
Indications facultatives de rôle par position, parallèles à la liste d'images combinée.
Valeurs canoniques : `first_frame`, `last_frame`, `reference_image`.
</ParamField>
<ParamField path="video" type="string">Vidéo de référence unique (chemin ou URL).</ParamField>
<ParamField path="videos" type="string[]">Plusieurs vidéos de référence (jusquà 4).</ParamField>
<ParamField path="videos" type="string[]">Vidéos de référence multiples (jusqu'à 4).</ParamField>
<ParamField path="videoRoles" type="string[]">
Indications de rôle optionnelles par position, parallèles à la liste de vidéos combinée.
Indications facultatives de rôle par position, parallèles à la liste de vidéos combinée.
Valeur canonique : `reference_video`.
</ParamField>
<ParamField path="audioRef" type="string">
Audio de référence unique (chemin ou URL). Utilisé pour la musique de fond ou comme
Audio de référence unique (chemin ou URL). Utilisé pour la musique de fond ou la
référence vocale lorsque le fournisseur prend en charge les entrées audio.
</ParamField>
<ParamField path="audioRefs" type="string[]">Plusieurs audios de référence (jusquà 3).</ParamField>
<ParamField path="audioRefs" type="string[]">Audios de référence multiples (jusqu'à 3).</ParamField>
<ParamField path="audioRoles" type="string[]">
Indications de rôle optionnelles par position, parallèles à la liste audio combinée.
Indications facultatives de rôle par position, parallèles à la liste audio combinée.
Valeur canonique : `reference_audio`.
</ParamField>
<Note>
Les indications de rôle sont transmises telles quelles au fournisseur. Les valeurs canoniques proviennent de
lunion `VideoGenerationAssetRole`, mais les fournisseurs peuvent accepter des chaînes
de rôle supplémentaires. Les tableaux `*Roles` ne doivent pas contenir plus dentrées que la
liste de références correspondante ; les erreurs de décalage dune position échouent avec une erreur claire.
Utilisez une chaîne vide pour laisser un emplacement non défini. Pour xAI, définissez chaque rôle dimage sur
`reference_image` pour utiliser son mode de génération `reference_images` ; omettez le
rôle ou utilisez `first_frame` pour une image-vers-vidéo avec une seule image.
Les indications de rôle sont transmises au fournisseur telles quelles. Les valeurs canoniques proviennent de
l'union `VideoGenerationAssetRole`, mais les fournisseurs peuvent accepter d'autres
chaînes de rôle. Les tableaux `*Roles` ne doivent pas comporter plus d'entrées que la
liste de références correspondante ; les erreurs de décalage d'une position échouent avec un message clair.
Utilisez une chaîne vide pour laisser un emplacement non défini. Pour xAI, définissez chaque rôle d'image sur
`reference_image` afin d'utiliser son mode de génération `reference_images` ; omettez le
rôle ou utilisez `first_frame` pour la conversion image-vers-vidéo à image unique.
</Note>
### Contrôles de style
<ParamField path="aspectRatio" type="string">
`1:1`, `2:3`, `3:2`, `3:4`, `4:3`, `4:5`, `5:4`, `9:16`, `16:9`, `21:9` ou `adaptive`.
Indication de rapport d'aspect telle que `1:1`, `16:9`, `9:16`, `adaptive`, ou une valeur propre au fournisseur. OpenClaw normalise ou ignore les valeurs non prises en charge selon le fournisseur.
</ParamField>
<ParamField path="resolution" type="string">`480P`, `720P`, `768P` ou `1080P`.</ParamField>
<ParamField path="resolution" type="string">Indication de résolution telle que `480P`, `720P`, `768P`, `1080P`, `4K`, ou une valeur propre au fournisseur. OpenClaw normalise ou ignore les valeurs non prises en charge selon le fournisseur.</ParamField>
<ParamField path="durationSeconds" type="number">
Durée cible en secondes (arrondie à la valeur prise en charge la plus proche par le fournisseur).
Durée cible en secondes (arrondie à la valeur prise en charge la plus proche du fournisseur).
</ParamField>
<ParamField path="size" type="string">Indication de taille lorsque le fournisseur la prend en charge.</ParamField>
<ParamField path="audio" type="boolean">
Active laudio généré dans la sortie lorsque cest pris en charge. Distinct de `audioRef*` (entrées).
Active l'audio généré dans la sortie lorsque cela est pris en charge. Distinct de `audioRef*` (entrées).
</ParamField>
<ParamField path="watermark" type="boolean">Active ou désactive le filigrane du fournisseur lorsque cest pris en charge.</ParamField>
<ParamField path="watermark" type="boolean">Active ou désactive le filigrane du fournisseur lorsque cela est pris en charge.</ParamField>
`adaptive` est une sentinelle propre au fournisseur : elle est transmise telle quelle aux
fournisseurs qui déclarent `adaptive` dans leurs capacités (par exemple, BytePlus
Seedance lutilise pour détecter automatiquement le ratio à partir des dimensions
de limage dentrée). Les fournisseurs qui ne la déclarent pas exposent la valeur via
`details.ignoredOverrides` dans le résultat de loutil afin que labandon soit visible.
Seedance l'utilise pour détecter automatiquement le rapport à partir des dimensions
de l'image d'entrée). Les fournisseurs qui ne la déclarent pas exposent la valeur via
`details.ignoredOverrides` dans le résultat de l'outil afin que l'abandon soit visible.
### Avancé
<ParamField path="action" type='"generate" | "status" | "list"' default="generate">
`"status"` renvoie la tâche de session actuelle ; `"list"` inspecte les fournisseurs.
</ParamField>
<ParamField path="model" type="string">Remplacement du fournisseur/modèle (par exemple `runway/gen4.5`).</ParamField>
<ParamField path="model" type="string">Remplacement de fournisseur/modèle (par exemple `runway/gen4.5`).</ParamField>
<ParamField path="filename" type="string">Indication de nom de fichier de sortie.</ParamField>
<ParamField path="timeoutMs" type="number">Délai dexpiration optionnel de la requête fournisseur, en millisecondes.</ParamField>
<ParamField path="timeoutMs" type="number">Délai d'expiration facultatif de l'opération du fournisseur, en millisecondes.</ParamField>
<ParamField path="providerOptions" type="object">
Options propres au fournisseur sous forme dobjet JSON (par exemple `{"seed": 42, "draft": true}`).
Options propres au fournisseur sous forme d'objet JSON (par exemple `{"seed": 42, "draft": true}`).
Les fournisseurs qui déclarent un schéma typé valident les clés et les types ; les clés
inconnues ou les incompatibilités ignorent le candidat pendant le repli. Les fournisseurs sans
inconnues ou les incompatibilités ignorent le candidat pendant le fallback. Les fournisseurs sans
schéma déclaré reçoivent les options telles quelles. Exécutez `video_generate action=list`
pour voir ce que chaque fournisseur accepte.
</ParamField>
<Note>
Tous les fournisseurs ne prennent pas en charge tous les paramètres. OpenClaw normalise la durée à
la valeur prise en charge la plus proche par le fournisseur, et remappe les indications de géométrie traduites
comme taille-vers-ratio daspect lorsquun fournisseur de repli expose une surface de contrôle
différente. Les remplacements réellement non pris en charge sont ignorés au mieux
et signalés comme avertissements dans le résultat de loutil. Les limites strictes de capacité
(comme un trop grand nombre dentrées de référence) échouent avant la soumission. Les résultats de loutil
Tous les fournisseurs ne prennent pas en charge tous les paramètres. OpenClaw normalise la durée sur
la valeur prise en charge par le fournisseur la plus proche, et remappe les indications de géométrie traduites
comme la taille vers le rapport d'aspect lorsqu'un fournisseur de fallback expose une surface de contrôle
différente. Les remplacements réellement non pris en charge sont ignorés dans la mesure du possible
et signalés comme avertissements dans le résultat de l'outil. Les limites strictes de capacité
(comme un nombre excessif d'entrées de référence) échouent avant la soumission. Les résultats de l'outil
signalent les paramètres appliqués ; `details.normalization` capture toute traduction
demandée-vers-appliquée.
</Note>
Les entrées de référence sélectionnent le mode dexécution :
Les entrées de référence sélectionnent le mode d'exécution :
- Aucun média de référence → `generate`
- Toute référence image → `imageToVideo`
- Toute référence d'image → `imageToVideo`
- Toute référence vidéo → `videoToVideo`
- Les entrées audio de référence **ne** changent pas le mode résolu ; elles sappliquent
- Les entrées audio de référence **ne** modifient **pas** le mode résolu ; elles s'appliquent
par-dessus le mode sélectionné par les références image/vidéo, et fonctionnent uniquement
avec les fournisseurs qui déclarent `maxInputAudios`.
Les références mixtes image et vidéo ne constituent pas une surface de capacité partagée stable.
Préférez un seul type de référence par requête.
#### Repli et options typées
#### Fallback et options typées
Certaines vérifications de capacité sont appliquées au niveau de la couche de repli plutôt quà la
frontière de loutil, de sorte quune requête dépassant les limites du fournisseur principal peut
toujours sexécuter sur un repli capable :
Certaines vérifications de capacité sont appliquées à la couche de fallback plutôt qu'à la
frontière de l'outil, de sorte qu'une requête dépassant les limites du fournisseur principal peut
tout de même s'exécuter sur un fallback capable :
- Le candidat actif ne déclarant aucun `maxInputAudios` (ou `0`) est ignoré lorsque
- Un candidat actif ne déclarant aucun `maxInputAudios` (ou `0`) est ignoré lorsque
la requête contient des références audio ; le candidat suivant est essayé.
- Le `maxDurationSeconds` du candidat actif est inférieur au `durationSeconds` demandé
sans liste `supportedDurationSeconds` déclarée → ignoré.
- La requête contient `providerOptions` et le candidat actif déclare explicitement
un schéma `providerOptions` typé → ignoré si les clés fournies ne sont
pas dans le schéma ou si les types de valeurs ne correspondent pas. Les fournisseurs sans
schéma déclaré reçoivent les options telles quelles (transmission
rétrocompatible). Un fournisseur peut refuser toutes les options fournisseur en
déclarant un schéma vide (`capabilities.providerOptions: {}`), ce qui
provoque le même saut quune incompatibilité de type.
un schéma `providerOptions` typé → ignoré si les clés fournies ne figurent
pas dans le schéma ou si les types de valeur ne correspondent pas. Les fournisseurs sans
schéma déclaré reçoivent les options telles quelles (transmission rétrocompatible).
Un fournisseur peut refuser toutes les options de fournisseur en déclarant un schéma vide
(`capabilities.providerOptions: {}`), ce qui provoque le même saut qu'une incompatibilité de type.
La première raison dignorance dans une requête est journalisée au niveau `warn` afin que les opérateurs voient quand
leur fournisseur principal a été contourné ; les ignorances suivantes sont journalisées au niveau `debug` pour
garder les longues chaînes de repli silencieuses. Si chaque candidat est ignoré, lerreur
agrégée inclut la raison dignorance pour chacun.
La première raison d'ignorance dans une requête est journalisée au niveau `warn` afin que les opérateurs voient quand
leur fournisseur principal a été écarté ; les ignorances suivantes sont journalisées au niveau `debug` afin de
garder les longues chaînes de fallback silencieuses. Si chaque candidat est ignoré, l'erreur
agrégée inclut la raison d'ignorance pour chacun.
## Actions
| Action | Ce quelle fait |
| Action | Ce qu'elle fait |
| ---------- | -------------------------------------------------------------------------------------------------------- |
| `generate` | Par défaut. Crée une vidéo à partir du prompt fourni et des entrées de référence optionnelles. |
| `status` | Vérifie létat de la tâche vidéo en cours pour la session actuelle sans lancer une autre génération. |
| `list` | Affiche les fournisseurs, modèles et leurs capacités disponibles. |
| `generate` | Par défaut. Crée une vidéo à partir du prompt donné et des entrées de référence facultatives. |
| `status` | Vérifie l'état de la tâche vidéo en cours pour la session actuelle sans démarrer une autre génération. |
| `list` | Affiche les fournisseurs, les modèles et leurs capacités disponibles. |
## Sélection du modèle
OpenClaw résout le modèle dans cet ordre :
1. **Paramètre doutil `model`** — si lagent en spécifie un dans lappel.
1. **Paramètre d'outil `model`** — si l'agent en spécifie un dans l'appel.
2. **`videoGenerationModel.primary`** depuis la configuration.
3. **`videoGenerationModel.fallbacks`** dans lordre.
4. **Détection automatique** — fournisseurs disposant dune authentification valide, en commençant par le
fournisseur par défaut actuel, puis les fournisseurs restants dans lordre
3. **`videoGenerationModel.fallbacks`** dans l'ordre.
4. **Détection automatique** — fournisseurs disposant d'une authentification valide, en commençant par le
fournisseur par défaut actuel, puis les fournisseurs restants dans l'ordre
alphabétique.
Si un fournisseur échoue, le candidat suivant est essayé automatiquement. Si tous les
candidats échouent, lerreur inclut les détails de chaque tentative.
candidats échouent, l'erreur inclut les détails de chaque tentative.
Définissez `agents.defaults.mediaGenerationAutoProviderFallback: false` pour utiliser
uniquement les entrées explicites `model`, `primary` et `fallbacks`.
@ -327,21 +326,21 @@ uniquement les entrées explicites `model`, `primary` et `fallbacks`.
<AccordionGroup>
<Accordion title="Alibaba">
Utilise le point de terminaison asynchrone DashScope / Model Studio. Les images et
vidéos de référence doivent être des URL distantes `http(s)`.
Utilise l'endpoint asynchrone DashScope / Model Studio. Les images et
vidéos de référence doivent être des URL `http(s)` distantes.
</Accordion>
<Accordion title="BytePlus (1.0)">
ID fournisseur : `byteplus`.
ID du fournisseur : `byteplus`.
Modèles : `seedance-1-0-pro-250528` (par défaut),
`seedance-1-0-pro-t2v-250528`, `seedance-1-0-pro-fast-251015`,
`seedance-1-0-lite-t2v-250428`, `seedance-1-0-lite-i2v-250428`.
Les modèles T2V (`*-t2v-*`) nacceptent pas les entrées image ; les modèles I2V et
Les modèles T2V (`*-t2v-*`) n'acceptent pas les entrées image ; les modèles I2V et
les modèles généraux `*-pro-*` prennent en charge une seule image de référence (première
image). Passez limage positionnellement ou définissez `role: "first_frame"`.
image). Passez l'image positionnellement ou définissez `role: "first_frame"`.
Les ID de modèle T2V sont automatiquement basculés vers la variante I2V
correspondante lorsquune image est fournie.
correspondante lorsqu'une image est fournie.
Clés `providerOptions` prises en charge : `seed` (nombre), `draft` (booléen —
force 480p), `camera_fixed` (booléen).
@ -349,93 +348,102 @@ uniquement les entrées explicites `model`, `primary` et `fallbacks`.
</Accordion>
<Accordion title="BytePlus Seedance 1.5">
Nécessite le Plugin [`@openclaw/byteplus-modelark`](https://www.npmjs.com/package/@openclaw/byteplus-modelark).
ID fournisseur : `byteplus-seedance15`. Modèle :
ID du fournisseur : `byteplus-seedance15`. Modèle :
`seedance-1-5-pro-251215`.
Utilise lAPI unifiée `content[]`. Prend en charge au plus 2 images dentrée
(`first_frame` + `last_frame`). Toutes les entrées doivent être des URL distantes `https://`.
Définissez `role: "first_frame"` / `"last_frame"` sur chaque image, ou
Utilise l'API unifiée `content[]`. Prend en charge au maximum 2 images d'entrée
(`first_frame` + `last_frame`). Toutes les entrées doivent être des URL `https://`
distantes. Définissez `role: "first_frame"` / `"last_frame"` sur chaque image, ou
passez les images positionnellement.
`aspectRatio: "adaptive"` détecte automatiquement le ratio à partir de limage dentrée.
`aspectRatio: "adaptive"` détecte automatiquement le rapport à partir de l'image d'entrée.
`audio: true` correspond à `generate_audio`. `providerOptions.seed`
(nombre) est transmis.
</Accordion>
<Accordion title="BytePlus Seedance 2.0">
Nécessite le Plugin [`@openclaw/byteplus-modelark`](https://www.npmjs.com/package/@openclaw/byteplus-modelark).
ID fournisseur : `byteplus-seedance2`. Modèles :
ID du fournisseur : `byteplus-seedance2`. Modèles :
`dreamina-seedance-2-0-260128`,
`dreamina-seedance-2-0-fast-260128`.
Utilise lAPI unifiée `content[]`. Prend en charge jusquà 9 images de référence,
3 vidéos de référence et 3 audios de référence. Toutes les entrées doivent être des URL distantes
`https://`. Définissez `role` sur chaque ressource — valeurs prises en charge :
Utilise l'API unifiée `content[]`. Prend en charge jusqu'à 9 images de référence,
3 vidéos de référence et 3 audios de référence. Toutes les entrées doivent être des URL
`https://` distantes. Définissez `role` sur chaque ressource — valeurs prises en charge :
`"first_frame"`, `"last_frame"`, `"reference_image"`,
`"reference_video"`, `"reference_audio"`.
`aspectRatio: "adaptive"` détecte automatiquement le ratio à partir de limage dentrée.
`aspectRatio: "adaptive"` détecte automatiquement le rapport à partir de l'image d'entrée.
`audio: true` correspond à `generate_audio`. `providerOptions.seed`
(nombre) est transmis.
</Accordion>
<Accordion title="ComfyUI">
Exécution locale ou cloud pilotée par workflow. Prend en charge texte-vers-vidéo et
image-vers-vidéo via le graphe configuré.
Exécution locale ou dans le cloud pilotée par des workflows. Prend en
charge le texte vers vidéo et limage vers vidéo via le graphe configuré.
</Accordion>
<Accordion title="fal">
Utilise un flux basé sur une file dattente pour les tâches longues. La plupart des modèles vidéo fal
acceptent une seule référence image. Les modèles référence-vers-vidéo Seedance 2.0
acceptent jusquà 9 images, 3 vidéos et 3 références audio, avec
au plus 12 fichiers de référence au total.
Utilise un flux adossé à une file dattente pour les tâches longues.
OpenClaw attend jusquà 20 minutes par défaut avant de considérer une
tâche de file dattente fal en cours comme expirée. La plupart des modèles
vidéo fal acceptent une seule référence dimage. Les modèles Seedance 2.0
référence vers vidéo acceptent jusquà 9 images, 3 vidéos et 3 références
audio, avec au plus 12 fichiers de référence au total.
</Accordion>
<Accordion title="Google (Gemini / Veo)">
Prend en charge une référence image ou une référence vidéo.
Prend en charge une référence dimage ou une référence vidéo. Les requêtes
daudio généré sont ignorées avec un avertissement sur le chemin de lAPI
Gemini, car cette API rejette le paramètre `generateAudio` pour la
génération vidéo Veo actuelle.
</Accordion>
<Accordion title="MiniMax">
Référence image unique uniquement.
Une seule référence dimage. MiniMax accepte les résolutions `768P` et
`1080P` ; les requêtes comme `720P` sont normalisées vers la valeur prise
en charge la plus proche avant lenvoi.
</Accordion>
<Accordion title="OpenAI">
Seul le remplacement `size` est transmis. Les autres remplacements de style
(`aspectRatio`, `resolution`, `audio`, `watermark`) sont ignorés avec
un avertissement.
Seule la substitution `size` est transmise. Les autres substitutions de
style (`aspectRatio`, `resolution`, `audio`, `watermark`) sont ignorées
avec un avertissement.
</Accordion>
<Accordion title="OpenRouter">
Utilise lAPI asynchrone `/videos` dOpenRouter. OpenClaw soumet la
tâche, interroge `polling_url` et télécharge soit `unsigned_urls`, soit le
point de terminaison de contenu de tâche documenté. Le défaut groupé `google/veo-3.1-fast`
annonce des durées de 4/6/8 secondes, des résolutions `720P`/`1080P` et des
ratios daspect `16:9`/`9:16`.
tâche, interroge `polling_url`, puis télécharge soit `unsigned_urls`, soit
lendpoint de contenu de tâche documenté. La valeur par défaut groupée
`google/veo-3.1-fast` annonce des durées de 4/6/8 secondes, des résolutions
`720P`/`1080P` et des formats dimage `16:9`/`9:16`.
</Accordion>
<Accordion title="Qwen">
Même backend DashScope quAlibaba. Les entrées de référence doivent être des URL distantes
`http(s)` ; les fichiers locaux sont rejetés en amont.
Même backend DashScope quAlibaba. Les entrées de référence doivent être
des URL distantes `http(s)` ; les fichiers locaux sont rejetés demblée.
</Accordion>
<Accordion title="Runway">
Prend en charge les fichiers locaux via des URI de données. Vidéo-vers-vidéo nécessite
`runway/gen4_aleph`. Les exécutions texte uniquement exposent les ratios daspect
`16:9` et `9:16`.
Prend en charge les fichiers locaux via des URI de données. Le vidéo vers
vidéo nécessite `runway/gen4_aleph`. Les exécutions texte seul exposent les
formats dimage `16:9` et `9:16`.
</Accordion>
<Accordion title="Together">
Référence image unique uniquement.
Une seule référence dimage.
</Accordion>
<Accordion title="Vydra">
Utilise directement `https://www.vydra.ai/api/v1` pour éviter les redirections
qui supprimeraient lauthentification. `veo3` est fourni uniquement pour texte-vers-vidéo ; `kling` nécessite
une URL dimage distante.
Utilise directement `https://www.vydra.ai/api/v1` pour éviter les
redirections qui abandonnent lauthentification. `veo3` est groupé en
texte vers vidéo uniquement ; `kling` nécessite une URL dimage distante.
</Accordion>
<Accordion title="xAI">
Prend en charge texte-vers-vidéo, image-vers-vidéo avec une seule image de première trame, jusquà 7
entrées `reference_image` via les `reference_images` de xAI, ainsi que les flux distants
de modification/extension de vidéo.
Prend en charge le texte vers vidéo, limage vers vidéo avec une seule
image de première frame, jusquà 7 entrées `reference_image` via
`reference_images` de xAI, ainsi que les flux distants de modification et
dextension vidéo.
</Accordion>
</AccordionGroup>
## Modes de capacité des fournisseurs
## Modes de capacités des fournisseurs
Le contrat partagé de génération vidéo prend en charge des capacités propres à chaque mode
au lieu de simples limites agrégées plates. Les nouvelles implémentations de fournisseurs
devraient privilégier des blocs de mode explicites :
Le contrat partagé de génération vidéo prend en charge les capacités propres
au mode plutôt que de simples limites agrégées plates. Les nouvelles
implémentations de fournisseurs doivent privilégier des blocs de mode
explicites :
```typescript
capabilities: {
@ -460,19 +468,21 @@ capabilities: {
}
```
Les champs agrégés plats tels que `maxInputImages` et `maxInputVideos` ne sont
**pas** suffisants pour annoncer la prise en charge du mode de transformation. Les fournisseurs devraient
déclarer explicitement `generate`, `imageToVideo` et `videoToVideo` afin que les tests en direct,
les tests de contrat et loutil partagé `video_generate` puissent valider
la prise en charge des modes de manière déterministe.
Les champs agrégés plats comme `maxInputImages` et `maxInputVideos` ne
suffisent **pas** pour annoncer la prise en charge des modes de transformation.
Les fournisseurs doivent déclarer explicitement `generate`, `imageToVideo` et
`videoToVideo` afin que les tests live, les tests de contrat et loutil partagé
`video_generate` puissent valider la prise en charge des modes de manière
déterministe.
Lorsquun modèle dun fournisseur prend en charge davantage dentrées de référence que les
autres, utilisez `maxInputImagesByModel`, `maxInputVideosByModel` ou
`maxInputAudiosByModel` au lieu daugmenter la limite globale du mode.
Lorsquun modèle dun fournisseur prend en charge plus largement les entrées de
référence que les autres, utilisez `maxInputImagesByModel`,
`maxInputVideosByModel` ou `maxInputAudiosByModel` au lieu daugmenter la
limite à léchelle du mode.
## Tests en direct
## Tests live
Couverture en direct facultative pour les fournisseurs partagés intégrés :
Couverture live opt-in pour les fournisseurs groupés partagés :
```bash
OPENCLAW_LIVE_TEST=1 pnpm test:live -- extensions/video-generation-providers.live.test.ts
@ -484,35 +494,39 @@ Wrapper du dépôt :
pnpm test:live:media video
```
Ce fichier en direct charge les variables denvironnement manquantes des fournisseurs depuis `~/.profile`, privilégie
par défaut les clés dAPI en direct/denvironnement avant les profils dauthentification stockés, et exécute un
test de fumée sûr pour la publication par défaut :
Ce fichier live charge les variables denvironnement de fournisseur manquantes
depuis `~/.profile`, privilégie par défaut les clés dAPI live/env avant les
profils dauthentification stockés, et exécute par défaut un smoke test sûr
pour les releases :
- `generate` pour chaque fournisseur non FAL de la passe.
- `generate` pour chaque fournisseur non-FAL de la passe.
- Prompt de homard dune seconde.
- Limite dopérations par fournisseur depuis
- Plafond dopération par fournisseur depuis
`OPENCLAW_LIVE_VIDEO_GENERATION_TIMEOUT_MS` (`180000` par défaut).
FAL est facultatif, car la latence de file dattente côté fournisseur peut dominer le temps de publication :
FAL est opt-in, car la latence de file dattente côté fournisseur peut dominer
le temps de release :
```bash
pnpm test:live:media video --video-providers fal
```
Définissez `OPENCLAW_LIVE_VIDEO_GENERATION_FULL_MODES=1` pour exécuter aussi les
modes de transformation déclarés que la passe partagée peut exercer en toute sécurité avec des médias locaux :
Définissez `OPENCLAW_LIVE_VIDEO_GENERATION_FULL_MODES=1` pour exécuter aussi
les modes de transformation déclarés que la passe partagée peut exercer en
sécurité avec des médias locaux :
- `imageToVideo` lorsque `capabilities.imageToVideo.enabled`.
- `videoToVideo` lorsque `capabilities.videoToVideo.enabled` et que le
fournisseur/modèle accepte une entrée vidéo locale adossée à un tampon dans la passe
partagée.
fournisseur/modèle accepte lentrée vidéo locale adossée à un buffer dans la
passe partagée.
Aujourdhui, la voie en direct partagée `videoToVideo` couvre `runway` uniquement lorsque vous
sélectionnez `runway/gen4_aleph`.
Aujourdhui, la voie live partagée `videoToVideo` couvre `runway` uniquement
lorsque vous sélectionnez `runway/gen4_aleph`.
## Configuration
Définissez le modèle de génération vidéo par défaut dans votre configuration OpenClaw :
Définissez le modèle de génération vidéo par défaut dans votre configuration
OpenClaw :
```json5
{
@ -533,7 +547,7 @@ Ou via la CLI :
openclaw config set agents.defaults.videoGenerationModel.primary "qwen/wan2.6-t2v"
```
## Connexe
## Liens associés
- [Alibaba Model Studio](/fr/providers/alibaba)
- [Tâches en arrière-plan](/fr/automation/tasks) — suivi des tâches pour la génération vidéo asynchrone

View File

@ -1,48 +1,48 @@
---
read_when:
- Vous voulez utiliser le Gateway depuis un navigateur
- Vous souhaitez utiliser le Gateway depuis un navigateur
- Vous voulez un accès au Tailnet sans tunnels SSH
sidebarTitle: Control UI
summary: Interface de contrôle dans le navigateur pour le Gateway (discussion, nœuds, configuration)
summary: Interface de contrôle basée sur le navigateur pour le Gateway (chat, nœuds, configuration)
title: Interface de contrôle
x-i18n:
generated_at: "2026-05-04T09:37:07Z"
generated_at: "2026-05-05T06:19:51Z"
model: gpt-5.5
provider: openai
source_hash: 4b68b5203b369de6a3354a7e7442ee38ee790875b2d7054b0c8ec997098fd9de
source_hash: d249559d26ef8d257a14b104a797442e9fbb67a8ab31c7fcc9eaa4127f29c933
source_path: web/control-ui.md
workflow: 16
---
Linterface utilisateur de contrôle est une petite application monopage **Vite + Lit** servie par le Gateway:
Linterface de contrôle 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`)
- par défaut : `http://<host>:18789/`
- préfixe facultatif : définissez `gateway.controlUi.basePath` (par exemple `/openclaw`)
Elle communique **directement avec le WebSocket du Gateway** sur le même port.
## Ouverture rapide (locale)
Si le Gateway est en cours dexécution sur le même ordinateur, ouvrez:
Si le Gateway fonctionne sur le même ordinateur, ouvrez :
- [http://127.0.0.1:18789/](http://127.0.0.1:18789/) (ou [http://localhost:18789/](http://localhost:18789/))
Si la page ne se charge pas, démarrez dabord le Gateway: `openclaw gateway`.
Si la page ne se charge pas, démarrez dabord le Gateway : `openclaw gateway`.
Lauthentification est fournie pendant la négociation 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"`
- les en-têtes didentité Tailscale Serve quand `gateway.auth.allowTailscale: true`
- les en-têtes didentité de proxy de confiance quand `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 de Gateway sélectionnée; les mots de passe ne sont pas conservé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 des paramètres du tableau de bord conserve un jeton pour la session donglet de navigateur actuelle et lURL de 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é à la première connexion, mais lauthentification par mot de passe fonctionne aussi quand `gateway.auth.mode` vaut `"password"`.
## Appairage dappareil (première connexion)
Lorsque vous vous connectez à linterface utilisateur 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 les accès non autorisés.
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é pour 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,97 +57,97 @@ Lorsque vous vous connectez à linterface utilisateur de contrôle depuis un
</Step>
</Steps>
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 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éé. Relancez `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 montée 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.
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 nouveau jeu 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 directes depuis un navigateur en local loopback (`127.0.0.1` / `localhost`) sont approuvées automatiquement.
- Tailscale Serve peut éviter laller-retour dappairage pour les sessions opérateur de linterface utilisateur de contrôle lorsque `gateway.auth.allowTailscale: true`, que lidentité Tailscale est vérifiée et que le navigateur présente son identité dappareil.
- Tailscale Serve peut éviter laller-retour dappairage pour les sessions dopérateur de linterface de contrôle quand `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.
- 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.
</Note>
## Identité personnelle (locale au navigateur)
Linterface utilisateur 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 conservé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.
Linterface de contrôle prend en charge une identité personnelle par navigateur (nom daffichage et avatar) jointe aux messages sortants pour lattribution dans les sessions partagées. Elle vit 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.
Le même modèle local au navigateur sapplique au remplacement de lavatar de lassistant. Les avatars dassistant téléversés se superposent à lidentité résolue par le gateway uniquement dans le navigateur local et ne transitent jamais par `config.patch`. Le champ de configuration partagé `ui.assistant.avatar` reste disponible pour les clients non UI qui écrivent directement dans ce champ (par exemple les gateways scriptés ou les 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 se superposent à lidentité résolue par le gateway uniquement dans le navigateur local 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 le champ (comme des gateways scriptés ou des tableaux de bord personnalisés).
## Point de terminaison de configuration dexécution
Linterface utilisateur 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.
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 exige 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
## Prise en charge linguistique
Linterface utilisateur de contrôle peut se localiser au premier chargement selon la langue de votre navigateur. Pour la remplacer plus tard, ouvrez **Vue densemble -> Accès Gateway -> Langue**. Le sélecteur de langue se trouve dans la carte Accès Gateway, pas sous Apparence.
Linterface de contrôle peut se localiser au premier chargement selon la locale de votre navigateur. Pour la modifier 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.
- Langues 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 autres que langlais sont chargées paresseusement dans le navigateur.
- La langue sélectionnée est enregistrée dans le stockage du navigateur et réutilisée lors des visites ultérieures.
- Les clés de traduction manquantes reviennent à langlais.
- 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 suivantes.
- 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 langues non anglaises, mais le sélecteur de langue Mintlify intégré au site de documentation est limité aux codes de langue acceptés par Mintlify. La documentation en thaï (`th`) et en persan (`fa`) est tout de même générée dans le dépôt de publication; elle peut 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 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.
## Thèmes dapparence
Le panneau Apparence conserve les thèmes intégrés Claw, Knot et Dash, plus un 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 du 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 les appareils. Remplacer le thème importé met à jour lunique emplacement local; leffacer rétablit le thème actif sur Claw si le thème importé était sélectionné.
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 les appareils. Remplacer le thème importé met à jour lunique emplacement local ; leffacer rebascule le thème actif sur Claw si le thème importé était sélectionné.
## Ce quelle peut faire (aujourdhui)
<AccordionGroup>
<Accordion title="Chat et parole">
- Discutez avec le modèle via le WS du Gateway (`chat.history`, `chat.send`, `chat.abort`, `chat.inject`).
- Parlez au moyen de sessions temps réel dans le navigateur. OpenAI utilise WebRTC directement, Google Live utilise un jeton de navigateur à usage unique contraint via WebSocket, et les Plugins vocaux temps réel uniquement backend utilisent le transport relais du Gateway. Le relais conserve les identifiants 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é.
- Diffusez les appels doutil + les cartes de sortie doutil en direct dans Chat (é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 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.
- Diffuser les appels doutils + les cartes de sortie doutil en direct dans Chat (événements dagent).
</Accordion>
<Accordion title="Canaux, instances, sessions, rêves">
- Canaux: statut des canaux intégrés et des canaux Plugin 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 et du raisonnement (`sessions.list`, `sessions.patch`).
- Rêves: statut Dreaming, bascule dactivation/désactivation et lecteur de journal des rêves (`doctor.memory.status`, `doctor.memory.dreamDiary`, `config.patch`).
- 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`).
- Instances : liste de présence + actualisation (`system-presence`).
- Sessions : liste + remplacements par session pour modèle/thinking/rapide/verbeux/trace/reasoning (`sessions.list`, `sessions.patch`).
- Rêves : état de dreaming, bouton activer/désactiver et lecteur de journal Dream Diary (`doctor.memory.status`, `doctor.memory.dreamDiary`, `config.patch`).
</Accordion>
<Accordion title="Cron, Skills, nœuds, approbations exec">
- Tâches Cron: lister/ajouter/modifier/exécuter/activer/désactiver + historique dexécution (`cron.*`).
- Skills: statut, activer/désactiver, installer, mises à jour de clé dAPI (`skills.*`).
- Nœuds: liste + capacités (`node.list`).
- Approbations exec: modifier les listes dautorisation du gateway ou des nœuds + politique de demande pour `exec host=gateway/node` (`exec.approvals.*`).
- Tâches Cron : liste/ajout/modification/exécution/activation/désactivation + historique dexécution (`cron.*`).
- Skills : état, activation/désactivation, installation, mises à jour de clés API (`skills.*`).
- Nœuds : liste + capacités (`node.list`).
- Approbations exec : modifier les listes dautorisation du gateway ou des nœuds + politique de demande pour `exec host=gateway/node` (`exec.approvals.*`).
</Accordion>
<Accordion title="Configuration">
- 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 protection par hachage de base pour éviter décraser des modifications concurrentes.
- Les écritures (`config.set`/`config.apply`/`config.patch`) effectuent une prévalidation de la résolution des SecretRef actifs pour les références présentes 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 imbriqués objet/joker/tableau/composition, ainsi que les schémas Plugin + canal lorsquils sont disponibles); léditeur JSON brut nest disponible que lorsque linstantané permet un aller-retour brut sûr.
- Si un instantané ne peut pas effectuer un aller-retour sûr du texte brut, linterface utilisateur de contrôle force le mode Formulaire et désactive le mode Brut pour cet instantané.
- Dans léditeur JSON brut, "Réinitialiser à lenregistrement" 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 texte du formulaire afin déviter toute corruption accidentelle dobjet en chaîne.
- Les écritures (`config.set`/`config.apply`/`config.patch`) pré-vérifient la résolution active des SecretRef pour les refs présentes dans la charge utile de configuration soumise ; les refs actives soumises non résolues sont rejetées avant lécriture.
- Rendu du schéma + formulaire (`config.schema` / `config.schema.lookup`, incluant les champs `title` / `description`, les indices UI correspondants, les résumés denfants immédiats, les métadonnées de docs sur les nœuds objet imbriqué/joker/tableau/composition, ainsi que les schémas de plugin + canal lorsquils sont disponibles) ; léditeur JSON brut nest disponible que lorsque linstantané permet un aller-retour brut sûr.
- Si un instantané ne peut pas faire un aller-retour de texte brut en toute sécurité, linterface de contrôle force le mode Formulaire et désactive le mode Brut pour cet instantané.
- Le bouton "Reset to saved" de léditeur JSON brut préserve la forme rédigée en brut (mise en forme, commentaires, disposition `$include`) au lieu de restituer un instantané aplati ; les modifications externes survivent donc à une réinitialisation quand linstantané peut faire un aller-retour sûr.
- Les valeurs dobjet SecretRef structurées sont rendues en lecture seule dans les champs de texte de formulaire afin déviter une corruption accidentelle dobjet en chaîne.
</Accordion>
<Accordion title="Débogage, journaux, mise à jour">
- Débogage: instantanés de statut/santé/modèles + journal dévénements + appels RPC manuels (`status`, `health`, `models.list`).
- Le journal dévénements inclut les temps dactualisation/RPC de linterface utilisateur de contrôle ainsi que les entrées de réactivité du navigateur pour les longues images danimation ou les tâches longues lorsque le navigateur expose ces types dentrées PerformanceObserver.
- Journaux: suivi en direct des journaux de fichiers du gateway avec filtre/export (`logs.tail`).
- Mise à jour: exécuter une mise à jour package/git + redémarrage (`update.run`) avec un rapport de redémarrage, puis interroger `update.status` après la reconnexion pour vérifier la version du gateway en cours dexécution.
- Débogage : instantanés détat/santé/modèles + journal dévénements + appels RPC manuels (`status`, `health`, `models.list`).
- Le journal dévénements inclut les timings dactualisation/RPC de linterface de contrôle ainsi que les entrées de réactivité du navigateur pour les longues images danimation ou les tâches longues lorsque le navigateur expose ces types dentrées PerformanceObserver.
- Journaux : suivi en direct des journaux de fichiers du gateway avec filtre/export (`logs.tail`).
- Mise à jour : exécuter une mise à jour package/git + redémarrage (`update.run`) avec un rapport de redémarrage, puis interroger `update.status` après la 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 diffusion est par défaut lannonce dun résumé. Vous pouvez passer à aucune si vous voulez des exécutions purement internes.
- 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 diffusion webhook et aucune sont disponibles.
- Les contrôles dédition avancés incluent suppression après exécution, effacer le remplacement dagent, options cron exactes/échelonnées, remplacements du modèle/de la réflexion de lagent, et bascules de diffusion 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 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 toujours utiliser `cron.webhook` jusquà migration.
- Pour les tâches isolées, la livraison utilise par défaut lannonce du résumé. Vous pouvez choisir aucune si vous voulez des exécutions uniquement internes.
- Les champs canal/cible apparaissent quand lannonce est sélectionnée.
- Le mode Webhook utilise `delivery.mode = "webhook"` avec `delivery.to` défini sur une URL de 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, options cron exact/stagger, remplacements du modèle/thinking 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 toujours utiliser `cron.webhook` jusquà migration.
</Accordion>
</AccordionGroup>
@ -156,65 +156,65 @@ Les thèmes importés sont stockés uniquement dans le profil de navigateur actu
<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`.
- `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 renvoi avec le même `idempotencyKey` retourne `{ status: "in_flight" }` pendant lexécution, et `{ status: "ok" }` après lachèvement.
- Les réponses `chat.history` sont limitées en taille pour la sécurité de linterface utilisateur. 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 surdimensionnés 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 resservies via des URL de médias authentifiées du Gateway, afin que les rechargements ne dépendent pas du maintien de charges utiles dimages brutes en base64 dans la réponse dhistorique du chat.
- `chat.history` supprime aussi du texte visible de lassistant les balises de directives inline uniquement destinées à laffichage (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 tokens de contrôle de modèle ASCII/pleine chasse qui ont fuité, et omet les entrées de lassistant dont tout le texte visible est uniquement le token 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 de contrôle recharge lhistorique et ne fusionne quune petite queue optimiste ; la limite de transcription est documentée dans [WebChat](/fr/web/webchat).
- `chat.inject` ajoute une note de lassistant à 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).
- Un nouvel envoi avec le même `idempotencyKey` renvoie `{ status: "in_flight" }` pendant lexécution, puis `{ status: "ok" }` une fois terminé.
- Les réponses de `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 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 média authentifiées du Gateway, de sorte que les rechargements ne dépendent pas de la présence de charges utiles dimage base64 brutes dans la réponse dhistorique du chat.
- Lors du rendu de `chat.history`, linterface Control UI supprime du texte visible de lassistant les balises de directives en ligne uniquement destinées à laffichage (par exemple `[[reply_to_*]]` et `[[audio_as_voice]]`), les charges utiles XML dappels doutils en texte brut (notamment `<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 de lassistant dont tout le texte visible est uniquement le jeton silencieux exact `NO_REPLY` / `no_reply` ou le jeton daccusé de réception Heartbeat `HEARTBEAT_OK`.
- Pendant un envoi actif et lactualisation finale de lhistorique, la vue de chat garde visibles les messages utilisateur/assistant locaux optimistes 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 à partir de la transcription durable de session. Après les événements finaux doutil, linterface Control UI recharge lhistorique et fusionne seulement une 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).
- Len-tête du chat affiche le filtre dagent avant le sélecteur de session, et le sélecteur de session est limité à lagent sélectionné. Changer dagent affiche uniquement les sessions liées à cet agent et revient à la session principale de cet agent lorsquil na pas encore de sessions de tableau de bord enregistrées.
- Sur les largeurs de bureau, les contrôles de chat restent sur une ligne compacte et se replient lors du défilement vers le bas de la transcription ; faire défiler vers le haut, revenir au début ou atteindre le bas restaure les contrôles.
- Les messages consécutifs dupliqués contenant uniquement du texte sont rendus comme une seule bulle avec un badge de nombre. Les messages qui contiennent des images, des pièces jointes, une sortie doutil ou des aperçus de canvas ne sont pas regroupés.
- Les sélecteurs de modèle et de raisonnement de len-tête du chat corrigent 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 linterface de contrôle 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 du chat demande la vue de modèle configurée du Gateway. Si `agents.defaults.models` est présent, cette liste autorisée 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"`.
- Quand les rapports récents dutilisation de session du Gateway indiquent une forte pression de contexte, la zone du composeur de 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 tokens périmés sont masqués jusquà ce que le Gateway signale à nouveau une utilisation récente.
- Sur les largeurs de bureau, les contrôles de chat restent sur une seule ligne compacte et se replient lors du défilement vers le bas de la transcription ; faire défiler vers le haut, revenir en haut ou atteindre le bas restaure les contrôles.
- Les messages consécutifs en double contenant uniquement du texte sont rendus comme une seule bulle avec un badge de compteur. Les messages qui contiennent des images, des pièces jointes, une sortie doutil ou des aperçus de canevas ne sont pas regroupés.
- Les sélecteurs de modèle et de réflexion dans len-tête du chat corrigent 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 linterface Control UI crée et sélectionne 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 du chat demande la vue de modèles 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 de session frais du Gateway indiquent une forte pression de contexte, la zone du compositeur de 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 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 standard de fournisseur. OpenAI reçoit un secret client Realtime éphémère pour WebRTC. Google Live reçoit un token dauthentification Live API contraint à usage unique pour une session WebSocket de navigateur, avec les instructions et déclarations doutils verrouillées dans le token par le Gateway. Les fournisseurs qui exposent uniquement un pont temps réel backend passent par le transport relais du Gateway, afin que les identifiants et les sockets fournisseur restent côté serveur pendant que laudio du navigateur transite par des RPC authentifiés du Gateway. Le prompt de session Realtime est assemblé par le Gateway ; `talk.realtime.session` naccepte pas les remplacements dinstructions fournis par lappelant.
<Accordion title="Mode conversation (temps réel dans le 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 de fournisseur temps réel Voice Call peut toujours être réutilisée comme solution de repli. Le navigateur ne reçoit jamais de clé dAPI 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 nexposent quun pont temps réel côté serveur 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 authentifiés du Gateway. Le prompt de session Realtime est assemblé par le Gateway ; `talk.realtime.session` naccepte pas les remplacements dinstructions fournis par lappelant.
Dans le composeur de chat, le contrôle de conversation est le bouton en forme dondes à côté du bouton de dictée au microphone. Quand la conversation démarre, la ligne détat du composeur 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 Conversation est le bouton à ondes à côté du bouton de dictée au microphone. Lorsque Conversation 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 navigateur dOpenAI, la configuration WebSocket navigateur à token contraint Google Live, et ladaptateur navigateur de relais Gateway avec un média de microphone factice. La commande imprime uniquement létat du fournisseur et ne journalise aucun secret.
Smoke test 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 du navigateur OpenAI, la configuration WebSocket de navigateur avec jeton contraint Google Live, et ladaptateur navigateur de relais Gateway avec de faux médias de microphone. La commande affiche uniquement létat du fournisseur et ne journalise aucun secret.
</Accordion>
<Accordion title="Arrêt et abandon">
- 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.
- Cliquez sur **Stop** (appelle `chat.abort`).
- Pendant quune exécution est active, les suivis normaux sont mis en file dattente. Cliquez sur **Steer** sur un message en file dattente pour injecter ce suivi dans le tour en cours.
- 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 abandon">
- Quand une exécution est abandonnée, le texte partiel de lassistant peut encore être affiché dans linterface utilisateur.
- Lorsquune exécution est abandonnée, le texte partiel de lassistant peut toujours être affiché dans linterface utilisateur.
- Le Gateway conserve le texte partiel abandonné de lassistant dans lhistorique de transcription lorsquune sortie mise en tampon existe.
- Les entrées conservées incluent des métadonnées dabandon afin que les consommateurs de transcription puissent distinguer les fragments partiels dabandon de la sortie dachèvement normale.
- 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 de complétion normale.
</Accordion>
</AccordionGroup>
## Installation PWA et Web Push
Linterface 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 UI 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.
| Surface | Ce que cela fait |
| ----------------------------------------------------- | ------------------------------------------------------------------ |
| `ui/public/manifest.webmanifest` | Manifeste PWA. Les navigateurs proposent « Installer lapplication » une fois quil est accessible. |
| `ui/public/manifest.webmanifest` | Manifeste PWA. Les navigateurs proposent "Install app" une fois quil est accessible. |
| `ui/public/sw.js` | Service worker qui gère les événements `push` et les clics sur les notifications. |
| `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 dabonnements navigateur persisté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 persistés. |
Remplacez la paire de clés VAPID via les variables denvironnement sur le processus Gateway lorsque vous voulez épingler des clés (pour les déploiements multi-hôtes, la rotation des secrets ou les 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 de secrets ou les tests) :
- `OPENCLAW_VAPID_PUBLIC_KEY`
- `OPENCLAW_VAPID_PRIVATE_KEY`
- `OPENCLAW_VAPID_SUBJECT` (par défaut `mailto:openclaw@localhost`)
Linterface de contrôle utilise ces méthodes Gateway limitées par portée pour enregistrer et tester les abonnements navigateur :
Linterface Control UI 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`.
@ -222,22 +222,22 @@ Linterface de contrôle utilise ces méthodes Gateway limitées par portée p
- `push.web.test` — envoie une notification de test à labonnement de lappelant.
<Note>
Web Push est indépendant du chemin de 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.
Web Push est indépendant du chemin de relais iOS APNS (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 stratégie sandbox de liframe est contrôlée par `gateway.controlUi.embedSandbox` :
Les messages de lassistant 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.
Désactive lexécution de scripts à lintérieur des intégrations hébergées.
</Tab>
<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">
Ajoute `allow-same-origin` en plus de `allow-scripts` pour les documents du même site qui ont intentionnellement besoin de privilèges plus forts.
Ajoute `allow-same-origin` en plus de `allow-scripts` pour les documents du même site qui ont intentionnellement besoin de privilèges plus élevés.
</Tab>
</Tabs>
@ -254,14 +254,14 @@ Exemple :
```
<Warning>
Utilisez `trusted` uniquement lorsque le document intégré a réellement besoin dun comportement de même origine. Pour la plupart des jeux générés par agent et des canvas interactifs, `scripts` est le choix le plus sûr.
Utilisez `trusted` uniquement lorsque le document intégré a réellement besoin dun 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 corriger 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 écrans larges peuvent la remplacer sans modifier le CSS groupé en définissant `gateway.controlUi.chatMessageMaxWidth` :
```json5
{
@ -273,13 +273,13 @@ Les messages de chat groupés utilisent une largeur maximale lisible par défaut
}
```
La valeur est validée avant datteindre le navigateur. Les valeurs prises en charge incluent les longueurs simples et les pourcentages comme `960px` ou `82%`, ainsi que les expressions de largeur contraintes `min(...)`, `max(...)`, `clamp(...)`, `calc(...)` et `fit-content(...)`.
La valeur est validée avant datteindre le navigateur. Les valeurs prises en charge incluent les longueurs et pourcentages simples comme `960px` ou `82%`, ainsi que les expressions de largeur contraintes `min(...)`, `max(...)`, `clamp(...)`, `calc(...)` et `fit-content(...)`.
## 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 proxyfier avec HTTPS :
<Tab title="Integrated Tailscale Serve (preferred)">
Gardez le Gateway sur local loopback et laissez Tailscale Serve le proxifier en HTTPS :
```bash
openclaw gateway --tailscale serve
@ -289,46 +289,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`) lorsque `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 le local loopback avec les en-têtes `x-forwarded-*` de Tailscale. Pour les sessions opérateur de linterface de contrôle avec identité dappareil navigateur, ce chemin Serve vérifié ignore aussi laller-retour dappairage dappareil ; les navigateurs sans appareil et les connexions avec 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 par secret partagé même pour le trafic Serve. Utilisez ensuite `gateway.auth.mode: "token"` ou `"password"`.
Par défaut, les requêtes Control UI/WebSocket Serve peuvent sauthentifier via les en-têtes didentité Tailscale (`tailscale-user-login`) lorsque `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 arrivent sur local loopback avec les en-têtes `x-forwarded-*` de Tailscale. Pour les sessions opérateur Control UI avec identité dappareil de navigateur, ce chemin Serve vérifié saute aussi laller-retour dappairage dappareil ; les navigateurs sans appareil et les connexions de rôle 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 cliente et la même portée dauthentification sont sérialisées avant les écritures de limitation de débit. Des nouvelles tentatives incorrectes concurrentes depuis le même navigateur peuvent donc afficher `retry later` sur la deuxième requête au lieu de deux simples non-correspondances 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 simples incompatibilités en concurrence parallèle.
<Warning>
Lauthentification Serve sans token suppose que lhôte gateway est approuvé. Si du code local non approuvé peut sexécuter sur cet hôte, exigez une authentification par token/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 + token">
<Tab title="Bind to tailnet + token">
```bash
openclaw gateway --bind tailnet --token "$(openssl rand -hex 32)"
```
Ouvrez ensuite :
Ouvrez :
- `http://<tailscale-ip>:18789/` (ou votre `gateway.controlUi.basePath` configuré)
Collez le secret partagé correspondant dans les paramètres de linterface utilisateur (envoyé comme `connect.params.auth.token` ou `connect.params.auth.password`).
Collez le secret partagé correspondant dans les paramètres de lUI (envoyé comme `connect.params.auth.token` ou `connect.params.auth.password`).
</Tab>
</Tabs>
## HTTP non sécurisé
Si vous ouvrez le tableau de bord en 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 à Control UI sans identité dappareil.
Si vous ouvrez le tableau de bord en 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 lUI de contrôle sans identité dappareil.
Exceptions documentées :
- compatibilité HTTP non sécurisé limitée à localhost avec `gateway.controlUi.allowInsecureAuth=true`
- authentification Control UI opérateur réussie via `gateway.auth.mode: "trusted-proxy"`
- authentification réussie de lopérateur dans lUI de contrôle via `gateway.auth.mode: "trusted-proxy"`
- option durgence `gateway.controlUi.dangerouslyDisableDeviceAuth=true`
**Correction recommandée :** utilisez HTTPS (Tailscale Serve) ou ouvrez linterface utilisateur localement :
**Correctif recommandé :** utilisez HTTPS (Tailscale Serve) ou ouvrez lUI localement :
- `https://<magicdns>/` (Serve)
- `http://127.0.0.1:18789/` (sur lhôte du gateway)
<AccordionGroup>
<Accordion title="Comportement du commutateur dauthentification non sécurisée">
<Accordion title="Comportement de loption dauthentification non sécurisée">
```json5
{
gateway: {
@ -339,11 +339,11 @@ Exceptions documentées :
}
```
`allowInsecureAuth` est uniquement un commutateur de compatibilité locale :
`allowInsecureAuth` est uniquement une option de compatibilité locale :
- Il permet aux sessions Control UI 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).
- Elle permet aux sessions localhost de lUI de contrôle de continuer sans identité dappareil dans les contextes HTTP non sécurisés.
- Elle ne contourne pas les vérifications dappairage.
- Elle nassouplit pas les exigences didentité dappareil distant (non-localhost).
</Accordion>
<Accordion title="Urgence uniquement">
@ -358,14 +358,14 @@ Exceptions documentées :
```
<Warning>
`dangerouslyDisableDeviceAuth` désactive les vérifications didentité dappareil de Control UI et constitue une forte dégradation de la sécurité. Rétablissez rapidement la configuration après une utilisation durgence.
`dangerouslyDisableDeviceAuth` désactive les vérifications didentité dappareil de lUI de contrôle et constitue une dégradation de sécurité majeure. Rétablissez rapidement la configuration après une utilisation durgence.
</Warning>
</Accordion>
<Accordion title="Note sur le proxy de confiance">
- Une authentification trusted-proxy réussie peut autoriser des sessions Control UI **opérateur** sans identité dappareil.
- Cela ne sétend **pas** aux sessions Control UI avec rôle de node.
- Les proxies inverses loopback sur le même hôte ne satisfont toujours pas lauthentification trusted-proxy ; consultez [Authentification par proxy de confiance](/fr/gateway/trusted-proxy-auth).
- Une authentification trusted-proxy réussie peut autoriser des sessions **opérateur** de lUI de contrôle sans identité dappareil.
- Cela ne sétend **pas** aux sessions de lUI de contrôle avec rôle de nœud.
- Les proxys inverses loopback sur le même hôte ne satisfont toujours pas lauthentification trusted-proxy ; consultez [Authentification par proxy de confiance](/fr/gateway/trusted-proxy-auth).
</Accordion>
</AccordionGroup>
@ -374,38 +374,38 @@ Consultez [Tailscale](/fr/gateway/tailscale) pour des conseils de configuration
## Politique de sécurité du contenu
Control UI est livré 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 dimage distantes `http(s)` et relatives au protocole sont rejetées par le navigateur et ne déclenchent pas de requêtes réseau.
LUI de contrôle 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 récupération 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 davatar authentifiées que linterface utilisateur récupère et convertit en URL `blob:` locales.
- 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 `data:image/...` en ligne saffichent toujours (utile pour les charges utiles intégrées au protocole).
- Les URL `blob:` locales créées par Control UI saffichent toujours.
- Les URL davatar distantes émises par les métadonnées de canal sont supprimées par les assistants davatar de 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 URL `blob:` locales créées par lUI de contrôle saffichent toujours.
- Les URL davatars distantes émises par les métadonnées de canal sont supprimées par les assistants davatar de lUI de contrôle et remplacées par le logo/badge intégré ; ainsi, un canal compromis ou malveillant ne peut pas forcer des récupérations arbitraires dimages distantes depuis le navigateur dun opérateur.
Vous navez rien à modifier pour obtenir ce comportement : il est toujours activé et nest pas configurable.
Vous navez rien à modifier pour obtenir ce comportement il est toujours activé et nest pas configurable.
## Authentification de la route davatar
Lorsque lauthentification Gateway est configurée, le point de terminaison davatar de Control UI exige le même jeton Gateway que le reste de lAPI :
Lorsque lauthentification du gateway est configurée, le point de terminaison davatar de lUI de contrôle exige le même jeton de 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 davatar selon la même règle.
- 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 par ailleurs protégés.
- Control UI transmet lui-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.
- Les requêtes non authentifiées vers lune ou lautre route sont rejetées (comme pour la route sœur des médias dassistant). Cela empêche la route davatar de divulguer lidentité dun agent sur des hôtes qui sont autrement protégés.
- LUI de contrôle elle-même transmet le jeton de 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 Gateway (non recommandé 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 (déconseillé sur les hôtes partagés), la route davatar devient elle aussi non authentifiée, conformément au reste du gateway.
## Authentification de la route média de lassistant
## Authentification de la route des médias dassistant
Lorsque lauthentification Gateway est configurée, les aperçus de médias locaux de lassistant utilisent une route en deux étapes :
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 Control UI normale. 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 ou du mot de passe Gateway actif. Le ticket expire rapidement et ne peut pas autoriser une autre source.
- `GET /__openclaw__/assistant-media?meta=1&source=<path>` exige lauthentification opérateur normale de lUI de contrôle. Le navigateur envoie le jeton de 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 dimages, daudio, de vidéo et de documents rendues par le navigateur utilisent `mediaTicket=<ticket>` au lieu du jeton ou mot de passe de gateway actif. Le ticket expire rapidement et ne peut pas autoriser une autre source.
Cela permet au rendu média normal de rester compatible avec les éléments multimédias natifs du navigateur sans placer didentifiants Gateway réutilisables dans des URL média visibles.
Cela maintient la compatibilité du rendu normal des médias avec les éléments multimédias natifs du navigateur, sans placer didentifiants réutilisables du gateway dans des URL de médias visibles.
## Construire linterface utilisateur
## Construire lUI
Le Gateway sert les fichiers statiques depuis `dist/control-ui`. Construisez-les avec :
@ -413,7 +413,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
@ -425,14 +425,14 @@ Pour le développement local (serveur de développement séparé) :
pnpm ui:dev
```
Pointez ensuite linterface utilisateur vers votre URL WS du Gateway (par ex. `ws://127.0.0.1:18789`).
Pointez ensuite lUI vers votre URL WS de Gateway (par exemple `ws://127.0.0.1:18789`).
## Débogage/tests : serveur de développement + Gateway distant
Control UI est composé de fichiers statiques ; la cible WebSocket est configurable et peut différer de lorigine HTTP. Cest pratique lorsque vous voulez utiliser le serveur de développement Vite localement alors que le Gateway sexécute ailleurs.
LUI 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 utiliser le serveur de développement Vite localement, tandis que le Gateway sexécute ailleurs.
<Steps>
<Step title="Démarrer le serveur de développement de linterface utilisateur">
<Step title="Démarrer le serveur de développement de lUI">
```bash
pnpm ui:dev
```
@ -455,14 +455,14 @@ Control UI est composé de fichiers statiques ; la cible WebSocket est configura
<Accordion title="Notes">
- `gatewayUrl` est stocké dans localStorage après le chargement, puis supprimé de lURL.
- Si vous transmettez un point de terminaison complet `ws://` ou `wss://` 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 paramètres de requête hérités `?token=` sont toujours importés une fois pour compatibilité, mais uniquement comme solution de repli, et sont supprimés immédiatement après le bootstrap.
- `password` est conservé en mémoire uniquement.
- Lorsque `gatewayUrl` est défini, linterface utilisateur ne se rabat pas sur les identifiants de configuration ou denvironnement. Fournissez explicitement `token` (ou `password`). Labsence didentifiants explicites est une erreur.
- `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 toujours importés une fois pour compatibilité, mais uniquement comme solution de secours, 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.
- 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 préremplir des origines locales telles que `http://localhost:<port>` et `http://127.0.0.1:<port>` à partir de ladresse et du port effectifs liés à 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 toute origine de navigateur, et non « correspondre à lhôte que jutilise ».
- Les déploiements non-loopback de lUI 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 du bind et du port effectifs à lexécution, mais les origines de navigateur distantes nécessitent toujours des entrées explicites.
- Nutilisez pas `gateway.controlUi.allowedOrigins: ["*"]`, sauf pour des tests locaux très contrôlés. Cela signifie autoriser toute origine de navigateur, et non « faire 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.
</Accordion>
@ -484,7 +484,7 @@ Détails de configuration de laccès distant : [Accès distant](/fr/gateway/r
## Connexe
- [Tableau de bord](/fr/web/dashboard) — tableau de bord Gateway
- [Contrôles de santé](/fr/gateway/health) — surveillance de létat du gateway
- [Tableau de bord](/fr/web/dashboard) — tableau de bord du gateway
- [Vérifications détat](/fr/gateway/health) — surveillance de létat du gateway
- [TUI](/fr/web/tui) — interface utilisateur de terminal
- [WebChat](/fr/web/webchat) — interface de chat basée sur le navigateur
- [WebChat](/fr/web/webchat) — interface de discussion basée sur le navigateur