chore(i18n): refresh fr translations

This commit is contained in:
openclaw-docs-i18n[bot] 2026-04-24 09:00:02 +00:00
parent 33c6672312
commit ddf26b79d5
14 changed files with 2216 additions and 2168 deletions

View File

@ -5,19 +5,19 @@ read_when:
summary: 'Hooks : automatisation pilotée par événements pour les commandes et les événements du cycle de vie'
title: Hooks
x-i18n:
generated_at: "2026-04-24T06:59:06Z"
generated_at: "2026-04-24T08:57:06Z"
model: gpt-5.4
provider: openai
source_hash: 9e24d5a95748151059e34f8c9ff9910dbcd7a32e7cadb44d1fa25352ef3a09a6
source_hash: 4e6246f25272208d9a9ff2f186bcd3a463c78ea24b833f0259174d0f7f0cbea6
source_path: automation/hooks.md
workflow: 15
---
Les hooks sont de petits scripts qui sexécutent lorsquun événement se produit dans le Gateway. Ils peuvent être découverts à partir de répertoires et inspectés avec `openclaw hooks`. Le Gateway ne charge les hooks internes quaprès lactivation des hooks ou la configuration dau moins une entrée de hook, dun pack de hooks, dun gestionnaire hérité ou dun répertoire de hooks supplémentaire.
Les hooks sont de petits scripts qui sexécutent lorsquun événement se produit dans le Gateway. Ils peuvent être découverts à partir de répertoires et inspectés avec `openclaw hooks`. Le Gateway charge les hooks internes uniquement après lactivation des hooks ou la configuration dau moins une entrée de hook, dun pack de hooks, dun gestionnaire hérité ou dun répertoire de hooks supplémentaire.
Il existe deux types de hooks dans OpenClaw :
- **Hooks internes** (cette page) : sexécutent dans le Gateway lorsque des événements dagent se déclenchent, comme `/new`, `/reset`, `/stop` ou des événements du cycle de vie.
- **Hooks internes** (cette page) : sexécutent dans le Gateway lorsque des événements de lagent se déclenchent, comme `/new`, `/reset`, `/stop` ou des événements du cycle de vie.
- **Webhooks** : points de terminaison HTTP externes qui permettent à dautres systèmes de déclencher du travail dans OpenClaw. Voir [Webhooks](/fr/automation/cron-jobs#webhooks).
Les hooks peuvent aussi être inclus dans des plugins. `openclaw hooks list` affiche à la fois les hooks autonomes et les hooks gérés par des plugins.
@ -40,21 +40,21 @@ openclaw hooks info session-memory
## Types dévénements
| Event | Quand il se déclenche |
| ------------------------ | ----------------------------------------------- |
| `command:new` | Commande `/new` émise |
| `command:reset` | Commande `/reset` émise |
| `command:stop` | Commande `/stop` émise |
| `command` | Tout événement de commande (écouteur général) |
| `session:compact:before` | Avant que Compaction résume lhistorique |
| `session:compact:after` | Après la fin de la compaction |
| Event | Quand il se déclenche |
| ------------------------ | ---------------------------------------------- |
| `command:new` | Commande `/new` émise |
| `command:reset` | Commande `/reset` émise |
| `command:stop` | Commande `/stop` émise |
| `command` | Tout événement de commande (écoute générale) |
| `session:compact:before` | Avant que la Compaction résume lhistorique |
| `session:compact:after` | Après la fin de la Compaction |
| `session:patch` | Lorsque les propriétés de session sont modifiées |
| `agent:bootstrap` | Avant linjection des fichiers bootstrap de lespace de travail |
| `agent:bootstrap` | Avant linjection des fichiers bootstrap du workspace |
| `gateway:startup` | Après le démarrage des canaux et le chargement des hooks |
| `message:received` | Message entrant depuis nimporte quel canal |
| `message:transcribed` | Après la fin de la transcription audio |
| `message:preprocessed` | Après la fin de tout le traitement des médias et de la compréhension des liens |
| `message:sent` | Message sortant remis |
| `message:received` | Message entrant depuis nimporte quel canal |
| `message:transcribed` | Après la fin de la transcription audio |
| `message:preprocessed` | Après la fin du traitement de tous les médias et liens |
| `message:sent` | Message sortant remis |
## Écriture de hooks
@ -62,7 +62,7 @@ openclaw hooks info session-memory
Chaque hook est un répertoire contenant deux fichiers :
```text
```
my-hook/
├── HOOK.md # Métadonnées + documentation
└── handler.ts # Implémentation du gestionnaire
@ -78,21 +78,21 @@ metadata:
{ "openclaw": { "emoji": "🔗", "events": ["command:new"], "requires": { "bins": ["node"] } } }
---
# Mon hook
# My Hook
La documentation détaillée va ici.
```
**Champs de métadonnées** (`metadata.openclaw`) :
| Field | Description |
| Champ | Description |
| ---------- | ---------------------------------------------------- |
| `emoji` | Emoji affiché dans la CLI |
| `emoji` | Emoji daffichage pour la CLI |
| `events` | Tableau des événements à écouter |
| `export` | Export nommé à utiliser (par défaut `"default"`) |
| `os` | Plateformes requises (par ex. `["darwin", "linux"]`) |
| `requires` | `bins`, `anyBins`, `env` ou chemins `config` requis |
| `always` | Contourner les vérifications déligibilité (booléen) |
| `always` | Ignore les vérifications déligibilité (booléen) |
| `install` | Méthodes dinstallation |
### Implémentation du gestionnaire
@ -104,22 +104,22 @@ const handler = async (event) => {
}
console.log(`[my-hook] New command triggered`);
// Votre logique ici
// Your logic here
// Facultatif : envoyer un message à lutilisateur
// Optionally send message to user
event.messages.push("Hook executed!");
};
export default handler;
```
Chaque événement inclut : `type`, `action`, `sessionKey`, `timestamp`, `messages` (ajouter pour envoyer à lutilisateur) et `context` (données spécifiques à lévénement).
Chaque événement inclut : `type`, `action`, `sessionKey`, `timestamp`, `messages` (ajouter avec `push` pour envoyer à lutilisateur) et `context` (données spécifiques à lévénement). Les contextes de hooks des plugins dagent et doutil peuvent aussi inclure `trace`, un contexte de trace diagnostique compatible W3C en lecture seule que les plugins peuvent transmettre dans des journaux structurés pour la corrélation OTEL.
### Points importants sur le contexte des événements
### Points clés du contexte dévénement
**Événements de commande** (`command:new`, `command:reset`) : `context.sessionEntry`, `context.previousSessionEntry`, `context.commandSource`, `context.workspaceDir`, `context.cfg`.
**Événements de message** (`message:received`) : `context.from`, `context.content`, `context.channelId`, `context.metadata` (données spécifiques au fournisseur, y compris `senderId`, `senderName`, `guildId`).
**Événements de message** (`message:received`) : `context.from`, `context.content`, `context.channelId`, `context.metadata` (données spécifiques au fournisseur, notamment `senderId`, `senderName`, `guildId`).
**Événements de message** (`message:sent`) : `context.to`, `context.content`, `context.success`, `context.channelId`.
@ -127,24 +127,24 @@ Chaque événement inclut : `type`, `action`, `sessionKey`, `timestamp`, `messa
**Événements de message** (`message:preprocessed`) : `context.bodyForAgent` (corps final enrichi), `context.from`, `context.channelId`.
**Événements bootstrap** (`agent:bootstrap`) : `context.bootstrapFiles` (tableau modifiable), `context.agentId`.
**Événements de bootstrap** (`agent:bootstrap`) : `context.bootstrapFiles` (tableau mutable), `context.agentId`.
**Événements de modification de session** (`session:patch`) : `context.sessionEntry`, `context.patch` (uniquement les champs modifiés), `context.cfg`. Seuls les clients privilégiés peuvent déclencher des événements de modification.
**Événements de patch de session** (`session:patch`) : `context.sessionEntry`, `context.patch` (champs modifiés uniquement), `context.cfg`. Seuls les clients privilégiés peuvent déclencher des événements de patch.
**Événements de compaction** : `session:compact:before` inclut `messageCount`, `tokenCount`. `session:compact:after` ajoute `compactedCount`, `summaryLength`, `tokensBefore`, `tokensAfter`.
**Événements de Compaction** : `session:compact:before` inclut `messageCount`, `tokenCount`. `session:compact:after` ajoute `compactedCount`, `summaryLength`, `tokensBefore`, `tokensAfter`.
## Découverte des hooks
Les hooks sont découverts à partir de ces répertoires, dans lordre de priorité décrasement croissante :
Les hooks sont découverts à partir de ces répertoires, dans lordre de priorité croissante pour les remplacements :
1. **Hooks intégrés** : livrés avec OpenClaw
2. **Hooks de plugin** : hooks inclus dans les plugins installés
3. **Hooks gérés** : `~/.openclaw/hooks/` (installés par lutilisateur, partagés entre les espaces de travail). Les répertoires supplémentaires de `hooks.internal.load.extraDirs` partagent cette même priorité.
4. **Hooks despace de travail** : `<workspace>/hooks/` (par agent, désactivés par défaut jusquà activation explicite)
1. **Hooks inclus** : livrés avec OpenClaw
2. **Hooks de plugins** : hooks inclus dans les plugins installés
3. **Hooks gérés** : `~/.openclaw/hooks/` (installés par lutilisateur, partagés entre workspaces). Les répertoires supplémentaires de `hooks.internal.load.extraDirs` partagent cette priorité.
4. **Hooks du workspace** : `<workspace>/hooks/` (par agent, désactivés par défaut jusquà activation explicite)
Les hooks despace de travail peuvent ajouter de nouveaux noms de hooks, mais ne peuvent pas remplacer des hooks intégrés, gérés ou fournis par un plugin portant le même nom.
Les hooks du workspace peuvent ajouter de nouveaux noms de hooks, mais ne peuvent pas remplacer des hooks inclus, gérés ou fournis par un plugin portant le même nom.
Le Gateway ignore la découverte des hooks internes au démarrage tant que les hooks internes ne sont pas configurés. Activez un hook intégré ou géré avec `openclaw hooks enable <name>`, installez un pack de hooks ou définissez `hooks.internal.enabled=true` pour participer explicitement. Lorsque vous activez un hook nommé, le Gateway ne charge que le gestionnaire de ce hook ; `hooks.internal.enabled=true`, les répertoires de hooks supplémentaires et les gestionnaires hérités activent une découverte étendue.
Le Gateway ignore la découverte des hooks internes au démarrage tant que les hooks internes ne sont pas configurés. Activez un hook inclus ou géré avec `openclaw hooks enable <name>`, installez un pack de hooks ou définissez `hooks.internal.enabled=true` pour lactiver explicitement. Lorsque vous activez un hook nommé, le Gateway charge uniquement le gestionnaire de ce hook ; `hooks.internal.enabled=true`, les répertoires de hooks supplémentaires et les gestionnaires hérités activent une découverte large.
### Packs de hooks
@ -154,9 +154,9 @@ Les packs de hooks sont des packages npm qui exportent des hooks via `openclaw.h
openclaw plugins install <path-or-spec>
```
Les spécifications npm sont limitées au registre (nom du package + version exacte facultative ou dist-tag). Les spécifications Git/URL/fichier et les plages semver sont rejetées.
Les spécifications npm sont limitées au registre (nom du package + éventuellement version exacte ou dist-tag). Les spécifications Git/URL/fichier et les plages semver sont rejetées.
## Hooks intégrés
## Hooks inclus
| Hook | Events | Ce quil fait |
| --------------------- | ------------------------------ | ----------------------------------------------------- |
@ -165,7 +165,7 @@ Les spécifications npm sont limitées au registre (nom du package + version exa
| command-logger | `command` | Journalise toutes les commandes dans `~/.openclaw/logs/commands.log` |
| boot-md | `gateway:startup` | Exécute `BOOT.md` au démarrage du gateway |
Activez nimporte quel hook intégré :
Activez nimporte quel hook inclus :
```bash
openclaw hooks enable <hook-name>
@ -175,7 +175,7 @@ openclaw hooks enable <hook-name>
### Détails de session-memory
Extrait les 15 derniers messages utilisateur/assistant, génère un slug de nom de fichier descriptif via LLM et lenregistre dans `<workspace>/memory/YYYY-MM-DD-slug.md`. Nécessite que `workspace.dir` soit configuré.
Extrait les 15 derniers messages utilisateur/assistant, génère un slug de nom de fichier descriptif via LLM, puis lenregistre dans `<workspace>/memory/YYYY-MM-DD-slug.md`. Nécessite que `workspace.dir` soit configuré.
<a id="bootstrap-extra-files"></a>
@ -196,7 +196,7 @@ Extrait les 15 derniers messages utilisateur/assistant, génère un slug de nom
}
```
Les chemins sont résolus relativement à lespace de travail. Seuls les noms de base bootstrap reconnus sont chargés (`AGENTS.md`, `SOUL.md`, `TOOLS.md`, `IDENTITY.md`, `USER.md`, `HEARTBEAT.md`, `BOOTSTRAP.md`, `MEMORY.md`).
Les chemins sont résolus par rapport au workspace. Seuls les noms de base bootstrap reconnus sont chargés (`AGENTS.md`, `SOUL.md`, `TOOLS.md`, `IDENTITY.md`, `USER.md`, `HEARTBEAT.md`, `BOOTSTRAP.md`, `MEMORY.md`).
<a id="command-logger"></a>
@ -208,13 +208,13 @@ Journalise chaque commande slash dans `~/.openclaw/logs/commands.log`.
### Détails de boot-md
Exécute `BOOT.md` depuis lespace de travail actif au démarrage du gateway.
Exécute `BOOT.md` depuis le workspace actif au démarrage du gateway.
## Hooks de plugin
## Hooks de plugins
Les plugins peuvent enregistrer des hooks via le SDK de Plugin pour une intégration plus poussée : interception des appels doutils, modification des prompts, contrôle du flux de messages, et plus encore. Le SDK de Plugin expose 28 hooks couvrant la résolution de modèle, le cycle de vie de lagent, le flux de messages, lexécution doutils, la coordination des sous-agents et le cycle de vie du gateway.
Les plugins peuvent enregistrer des hooks via le Plugin SDK pour une intégration plus profonde : interception des appels doutils, modification des prompts, contrôle du flux de messages, et plus encore. Le Plugin SDK expose 28 hooks couvrant la résolution de modèle, le cycle de vie de lagent, le flux de messages, lexécution doutils, la coordination de sous-agents et le cycle de vie du gateway.
Pour la référence complète des hooks de plugin, y compris `before_tool_call`, `before_agent_reply`, `before_install` et tous les autres hooks de plugin, voir [Plugin Architecture](/fr/plugins/architecture-internals#provider-runtime-hooks).
Pour la référence complète des hooks de plugins, y compris `before_tool_call`, `before_agent_reply`, `before_install` et tous les autres hooks de plugins, voir [Plugin Architecture](/fr/plugins/architecture-internals#provider-runtime-hooks).
## Configuration
@ -264,19 +264,19 @@ Répertoires de hooks supplémentaires :
```
<Note>
Lancien format de configuration en tableau `hooks.internal.handlers` est toujours pris en charge pour la rétrocompatibilité, mais les nouveaux hooks doivent utiliser le système basé sur la découverte.
Le format de configuration hérité `hooks.internal.handlers` sous forme de tableau est toujours pris en charge pour la rétrocompatibilité, mais les nouveaux hooks doivent utiliser le système basé sur la découverte.
</Note>
## Référence CLI
```bash
# Lister tous les hooks (ajoutez --eligible, --verbose ou --json)
# Lister tous les hooks (ajouter --eligible, --verbose ou --json)
openclaw hooks list
# Afficher les informations détaillées sur un hook
# Afficher les informations détaillées dun hook
openclaw hooks info <hook-name>
# Afficher le résumé déligibilité
# Afficher un résumé déligibilité
openclaw hooks check
# Activer/désactiver
@ -286,7 +286,7 @@ openclaw hooks disable <hook-name>
## Bonnes pratiques
- **Gardez des gestionnaires rapides.** Les hooks sexécutent pendant le traitement des commandes. Lancez les tâches lourdes en arrière-plan avec `void processInBackground(event)`.
- **Gardez les gestionnaires rapides.** Les hooks sexécutent pendant le traitement des commandes. Déclenchez les travaux lourds en arrière-plan avec `void processInBackground(event)`.
- **Gérez les erreurs proprement.** Encadrez les opérations risquées avec try/catch ; ne lancez pas dexception afin que les autres gestionnaires puissent sexécuter.
- **Filtrez les événements tôt.** Retournez immédiatement si le type/laction dévénement nest pas pertinent.
- **Utilisez des clés dévénement spécifiques.** Préférez `"events": ["command:new"]` à `"events": ["command"]` pour réduire la surcharge.
@ -310,7 +310,7 @@ openclaw hooks list
openclaw hooks info my-hook
```
Vérifiez la présence des binaires requis (PATH), des variables denvironnement, des valeurs de configuration ou de la compatibilité du système dexploitation.
Vérifiez labsence de binaires requis (PATH), de variables denvironnement, de valeurs de configuration ou la compatibilité du système dexploitation.
### Hook non exécuté
@ -322,5 +322,5 @@ Vérifiez la présence des binaires requis (PATH), des variables denvironneme
- [Référence CLI : hooks](/fr/cli/hooks)
- [Webhooks](/fr/automation/cron-jobs#webhooks)
- [Plugin Architecture](/fr/plugins/architecture-internals#provider-runtime-hooks) — référence complète des hooks de plugin
- [Plugin Architecture](/fr/plugins/architecture-internals#provider-runtime-hooks) — référence complète des hooks de plugins
- [Configuration](/fr/gateway/configuration-reference#hooks)

View File

@ -1,27 +1,57 @@
---
read_when:
- Vous devez comprendre pourquoi un job CI sest ou ne sest pas exécuté
- Vous déboguez des vérifications GitHub Actions en échec
summary: Graphe des jobs CI, barrières de portée et équivalents des commandes locales
- Vous devez comprendre pourquoi un job CI sest exécuté ou non.
- Vous déboguez des vérifications GitHub Actions en échec.
summary: Graphe des jobs CI, portes de portée et équivalents des commandes locales
title: Pipeline CI
x-i18n:
generated_at: "2026-04-24T07:02:49Z"
generated_at: "2026-04-24T08:57:06Z"
model: gpt-5.4
provider: openai
source_hash: 8e24efec145ff144b007e248ef0f9c56287619eb9af204d45d49984909a6136b
source_hash: 489ac05725a316b25f56f7f754d6a8652abbd60481fbe6e692572b81581fe405
source_path: ci.md
workflow: 15
---
La CI sexécute à chaque push vers `main` et sur chaque pull request. Elle utilise un ciblage intelligent pour ignorer les jobs coûteux lorsque seules des zones sans rapport ont changé.
Le CI sexécute sur chaque push vers `main` et sur chaque pull request. Il utilise une portée intelligente pour ignorer les jobs coûteux lorsque seules des zones sans rapport ont changé.
QA Lab dispose de voies CI dédiées en dehors du workflow principal à portée intelligente. Le workflow `Parity gate` sexécute sur les changements de PR correspondants et par déclenchement manuel ; il construit le runtime QA privé et compare les packs agentiques mock GPT-5.4 et Opus 4.6. Le workflow `QA-Lab - All Lanes` sexécute chaque nuit sur `main` et par déclenchement manuel ; il distribue en parallèle le parity gate mock, la voie Matrix en direct et la voie Telegram en direct. Les jobs en direct utilisent lenvironnement `qa-live-shared`, et la voie Telegram utilise des baux Convex. `OpenClaw Release Checks` exécute également les mêmes voies QA Lab avant lapprobation dune release.
QA Lab dispose de lanes CI dédiées en dehors du workflow principal à portée intelligente. Le
workflow `Parity gate` sexécute sur les modifications de PR correspondantes et sur déclenchement manuel ; il
construit le runtime QA privé et compare les packs agentiques simulés GPT-5.4 et Opus 4.6.
Le workflow `QA-Lab - All Lanes` sexécute chaque nuit sur `main` et sur
déclenchement manuel ; il répartit en jobs parallèles la parity gate simulée, la lane Matrix live et la lane Telegram live.
Les jobs live utilisent lenvironnement `qa-live-shared`,
et la lane Telegram utilise des baux Convex. `OpenClaw Release
Checks` exécute également les mêmes lanes QA Lab avant lapprobation de la release.
Le workflow `Duplicate PRs After Merge` est un workflow manuel de maintenance pour le nettoyage des doublons après intégration. Il utilise par défaut le mode dry-run et ne ferme que les PR explicitement listées lorsque `apply=true`. Avant de modifier GitHub, il vérifie que la PR intégrée est fusionnée et que chaque doublon a soit une issue référencée partagée, soit des hunks modifiés qui se chevauchent.
Le workflow `Duplicate PRs After Merge` est un workflow manuel de maintenance pour
le nettoyage des doublons après intégration. Il utilise le mode dry-run par défaut et ne ferme
que les PR explicitement listées lorsque `apply=true`. Avant de modifier GitHub,
il vérifie que la PR intégrée est bien fusionnée et que chaque doublon a soit une issue référencée commune,
soit des hunks modifiés qui se chevauchent.
Le workflow `Docs Agent` est une voie de maintenance Codex pilotée par événements pour maintenir 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 sur `main` après un push non effectué par un bot peut le déclencher, et un déclenchement manuel peut lexécuter directement. Les invocations par workflow-run sont ignorées si `main` a déjà avancé ou si une 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é jusquau `main` actuel, de sorte quune exécution horaire puisse couvrir tous les changements accumulés sur main depuis le dernier passage documentation.
Le workflow `Docs Agent` est une lane de maintenance Codex pilotée par événements pour maintenir
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` issue dun push non-bot peut le déclencher,
et un déclenchement manuel peut lexécuter directement. Les invocations via workflow-run sont ignorées si
`main` a déjà avancé ou si une 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é jusquau
`main` actuel ; ainsi, une exécution horaire peut couvrir tous les changements de `main`
accumulés depuis le dernier passage docs.
Le workflow `Test Performance Agent` est une voie de maintenance Codex pilotée par événements pour les tests lents. Il na pas de planification pure : une exécution CI réussie sur `main` après un push non effectué par un bot peut le déclencher, mais il est ignoré si une autre invocation par workflow-run a déjà été exécutée ou est en cours ce jour UTC. Le déclenchement manuel contourne cette barrière dactivité quotidienne. Cette voie construit un rapport complet des performances Vitest groupées, laisse Codex effectuer uniquement de petites corrections de performance de test préservant la couverture plutôt que de larges refactorings, puis relance le rapport complet et rejette les changements qui réduisent le nombre de tests de référence réussis. Si la référence comporte des tests en échec, Codex ne peut corriger que les échecs évidents et le rapport complet après intervention de lagent doit réussir avant quun quelconque commit soit effectué. Lorsque `main` avance avant que le push du bot validé natterrisse, la voie rebase le correctif validé, relance `pnpm check:changed` et réessaie le push ; les correctifs 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 lane 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`
issue dun push non-bot peut le déclencher, mais il est ignoré si une autre invocation workflow-run
sest déjà exécutée ou est en cours ce jour UTC. Un déclenchement manuel contourne cette
porte dactivité quotidienne. La lane construit un rapport de performance Vitest groupé de la suite complète,
laisse Codex apporter uniquement de petites corrections de performance des tests préservant la couverture plutôt que de larges
refactorings, puis relance le rapport de suite complète et rejette les changements qui réduisent
le nombre de tests de référence réussis. Si la référence comporte des tests en échec, Codex
ne peut corriger que les échecs évidents et le rapport complet après intervention de lagent doit réussir avant
quun quelconque commit soit effectué. Lorsque `main` avance avant que le push du bot natterrisse,
la lane rebase le patch validé, relance `pnpm check:changed`, puis réessaie le push ;
les patchs obsolètes en conflit sont ignorés. Elle utilise Ubuntu hébergé par GitHub afin que laction Codex
puisse conserver la même posture de sécurité sans sudo que lagent docs.
```bash
gh workflow run duplicate-after-merge.yml \
@ -32,90 +62,89 @@ gh workflow run duplicate-after-merge.yml \
## Vue densemble des jobs
| Job | But | Quand il sexécute |
| Job | Objectif | Quand il sexécute |
| -------------------------------- | -------------------------------------------------------------------------------------------- | ------------------------------------- |
| `preflight` | Détecter les changements docs-only, les portées modifiées, les extensions modifiées, et construire le manifeste CI | Toujours sur les pushes et PR non brouillon |
| `security-scm-fast` | Détection de clés privées et audit des workflows via `zizmor` | Toujours sur les pushes et PR non brouillon |
| `security-dependency-audit` | Audit sans dépendances du lockfile de production par rapport aux avis npm | Toujours sur les pushes et PR non brouillon |
| `security-fast` | Agrégat requis pour les jobs de sécurité rapides | Toujours sur les pushes et PR non brouillon |
| `build-artifacts` | Construire `dist/`, la Control UI, les vérifications dartefacts construits, et les artefacts réutilisables en aval | Changements pertinents pour Node |
| `checks-fast-core` | Voies rapides de correction Linux, comme les vérifications bundled/plugin-contract/protocol | Changements pertinents pour Node |
| `checks-fast-contracts-channels` | Vérifications shardées des contrats de canaux avec un résultat de vérification agrégé stable | Changements pertinents pour Node |
| `checks-node-extensions` | Shards complets de tests de plugins inclus sur toute la suite dextensions | Changements pertinents pour Node |
| `checks-node-core-test` | Shards de tests Node du cœur, hors canaux, plugins inclus, contrats et voies dextensions | Changements pertinents pour Node |
| `extension-fast` | Tests ciblés uniquement pour les plugins inclus modifiés | Pull requests avec changements dextensions |
| `check` | Équivalent local principal shardé : types prod, lint, gardes, types de test et smoke strict | Changements pertinents pour Node |
| `check-additional` | Architecture, limites, gardes de surface dextension, limites de package, et shards 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 dartefacts construits plus compatibilité Node 22 uniquement sur push | Changements pertinents pour Node |
| `check-docs` | Formatage docs, lint et vérifications de liens cassés | Documentation modifiée |
| `skills-python` | Ruff + pytest pour les Skills adossées à Python | Changements pertinents pour les Skills Python |
| `checks-windows` | Voies de test spécifiques à Windows | Changements pertinents pour Windows |
| `macos-node` | Voie de test TypeScript macOS utilisant les artefacts construits partagés | Changements pertinents pour macOS |
| `preflight` | Détecter les changements docs-only, les portées modifiées, les extensions modifiées et construire le manifeste CI | Toujours sur les pushs et PR non brouillons |
| `security-scm-fast` | Détection de clés privées et audit des workflows via `zizmor` | Toujours sur les pushs et PR non brouillons |
| `security-dependency-audit` | Audit du lockfile de production sans dépendances contre les avis npm | Toujours sur les pushs et PR non brouillons |
| `security-fast` | Agrégat requis pour les jobs de sécurité rapides | Toujours sur les pushs et PR non brouillons |
| `build-artifacts` | Construire `dist/`, linterface Control UI, les vérifications dartefacts construits et les artefacts réutilisables en aval | 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 shardées des contrats de canaux avec un résultat agrégé stable | Changements pertinents pour Node |
| `checks-node-extensions` | Shards de tests complets des plugins groupés sur toute la suite dextensions | Changements pertinents pour Node |
| `checks-node-core-test` | Shards de tests Node du cœur, hors lanes canal, groupées, contrat et extension | Changements pertinents pour Node |
| `extension-fast` | Tests ciblés pour les seuls plugins groupés modifiés | Pull requests avec changements dextension |
| `check` | Équivalent de la porte locale principale shardée : types prod, lint, gardes, types de test et smoke strict | Changements pertinents pour Node |
| `check-additional` | Shards architecture, limites, gardes de surface dextension, limites de package et gateway-watch | Changements pertinents pour Node |
| `build-smoke` | Tests smoke de la CLI construite et smoke mémoire au démarrage | Changements pertinents pour Node |
| `checks` | Vérificateur pour les tests de canaux sur artefacts construits plus compatibilité Node 22 uniquement sur push | Changements pertinents pour Node |
| `check-docs` | Vérifications de formatage docs, lint et liens cassés | Docs modifiées |
| `skills-python` | Ruff + pytest pour les Skills basées sur Python | Changements pertinents pour les Skills Python |
| `checks-windows` | Lanes de tests spécifiques à Windows | 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 variantes plus un build APK debug | Changements pertinents pour Android |
| `test-performance-agent` | Optimisation quotidienne des tests lents par Codex après activité de confiance | Succès CI sur main ou déclenchement manuel |
| `test-performance-agent` | Optimisation quotidienne des tests lents par Codex après activité de confiance | Succès du CI principal ou déclenchement manuel |
## Ordre fail-fast
Les jobs sont ordonnés de sorte que les vérifications peu coûteuses échouent avant que les plus coûteuses ne sexécutent :
Les jobs sont ordonnés de façon à ce que les vérifications peu coûteuses échouent avant le lancement des jobs plus coûteux :
1. `preflight` décide quelles voies existent réellement. La logique `docs-scope` et `changed-scope` correspond à des étapes dans ce job, et non à 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` se chevauche avec les voies Linux rapides afin que les consommateurs en aval puissent démarrer dès que le build partagé est prêt.
4. Les voies de plateforme et de runtime plus lourdes se distribuent ensuite : `checks-fast-core`, `checks-fast-contracts-channels`, `checks-node-extensions`, `checks-node-core-test`, `extension-fast` réservé aux PR, `checks`, `checks-windows`, `macos-node`, `macos-swift` et `android`.
1. `preflight` décide quelles lanes existent réellement. La logique `docs-scope` et `changed-scope` correspond à des étapes à lintérieur de ce job, pas à des jobs autonomes.
2. `security-scm-fast`, `security-dependency-audit`, `security-fast`, `check`, `check-additional`, `check-docs` et `skills-python` échouent rapidement sans attendre les jobs plus lourds de matrice artefacts et plateformes.
3. `build-artifacts` se chevauche avec les lanes Linux rapides afin que les consommateurs en aval puissent démarrer dès que le build partagé est prêt.
4. Ensuite, les lanes plus lourdes de plateforme et de runtime se répartissent : `checks-fast-core`, `checks-fast-contracts-channels`, `checks-node-extensions`, `checks-node-core-test`, `extension-fast` réservé aux PR, `checks`, `checks-windows`, `macos-node`, `macos-swift` et `android`.
La logique de portée se trouve dans `scripts/ci-changed-scope.mjs` et est couverte par des tests unitaires dans `src/scripts/ci-changed-scope.test.ts`.
Les modifications du workflow CI valident le graphe CI Node ainsi que le lint des workflows, mais nimposent pas à elles seules les builds natifs Windows, Android ou macOS ; ces voies de plateforme restent limitées aux changements du code source de la plateforme.
Les vérifications Node Windows sont limitées aux wrappers Windows spécifiques aux processus/chemins, aux helpers dexécution npm/pnpm/UI, à la configuration du gestionnaire de packages, et aux surfaces de workflow CI qui exécutent cette voie ; les changements sans rapport dans le code source, les plugins, linstall-smoke et les tests seuls restent sur les voies Linux Node afin de ne pas réserver un worker Windows 16 vCPU pour une couverture déjà exercée par les shards de test normaux.
Le workflow séparé `install-smoke` réutilise le même script de portée via son propre job `preflight`. Il répartit la couverture smoke entre `run_fast_install_smoke` et `run_full_install_smoke`. Les pull requests exécutent le chemin rapide pour les surfaces Docker/package, les changements de package/manifeste de plugins inclus, et les surfaces cœur plugin/canal/gateway/Plugin SDK que les jobs Docker smoke exercent. Les changements uniquement de code source dans les plugins inclus, les modifications de tests seules et les modifications docs-only ne réservent pas de workers Docker. Le chemin rapide construit une fois limage du Dockerfile racine, vérifie la CLI, exécute le2e gateway-network en conteneur, vérifie un argument de build dextension incluse, et exécute le profil Docker de plugin inclus borné avec un délai de commande de 120 secondes. Le chemin complet conserve la couverture dinstallation par QR package ainsi que la couverture installateur Docker/update pour les exécutions nocturnes planifiées, les déclenchements manuels, les vérifications de release par workflow-call et les pull requests qui touchent réellement les surfaces installateur/package/Docker. Les pushes sur `main`, y compris les commits de fusion, nimposent pas le chemin complet ; lorsque la logique changed-scope demanderait une couverture complète sur un push, le workflow conserve le smoke Docker rapide et laisse le smoke dinstallation complet à la validation nocturne ou de release. Le smoke lent dinstallation globale Bun image-provider est contrôlé séparément par `run_bun_global_install_smoke` ; il sexécute sur la planification nocturne et depuis le workflow de vérifications de release, et les déclenchements manuels de `install-smoke` peuvent linclure, mais les pull requests et les pushes sur `main` ne lexécutent pas. Les tests Docker QR et installateur conservent leurs propres Dockerfiles centrés installation. En local, `test:docker:all` préconstruit une image partagée de test live et une image partagée dapplication construite `scripts/e2e/Dockerfile`, puis exécute en parallèle les voies smoke live/E2E avec `OPENCLAW_SKIP_DOCKER_BUILD=1` ; ajustez le parallélisme par défaut du pool principal de 8 avec `OPENCLAW_DOCKER_ALL_PARALLELISM` et le parallélisme du pool de fin sensible au fournisseur de 8 avec `OPENCLAW_DOCKER_ALL_TAIL_PARALLELISM`. Lagrégat local arrête par défaut de planifier de nouvelles voies mutualisées après le premier échec, et chaque voie dispose dun délai de 120 minutes, modifiable via `OPENCLAW_DOCKER_ALL_LANE_TIMEOUT_MS`. Le workflow live/E2E réutilisable reproduit le modèle à image partagée en construisant et publiant une image Docker E2E GHCR taguée par SHA avant la matrice Docker, puis en exécutant la matrice avec `OPENCLAW_SKIP_DOCKER_BUILD=1`. Le workflow live/E2E planifié exécute chaque jour la suite Docker complète du chemin de release. La matrice complète dupdate/canal inclus reste manuelle/full-suite car elle effectue des passes répétées réelles de mise à jour npm et de réparation doctor.
Les modifications du workflow CI valident le graphe CI Node ainsi que le lint des workflows, mais ne forcent pas à elles seules les builds natifs Windows, Android ou macOS ; ces lanes de plateforme restent limitées aux changements de sources propres à la plateforme.
Les vérifications Node Windows sont limitées aux wrappers spécifiques à Windows pour les processus et chemins, aux helpers npm/pnpm/UI runner, à la configuration du gestionnaire de paquets et aux surfaces de workflow CI qui exécutent cette lane ; les changements sans rapport dans le code source, les plugins, le smoke dinstallation et les tests uniquement restent sur les lanes Node Linux afin de ne pas réserver un worker Windows 16 vCPU pour une couverture déjà exercée par les shards de tests normaux.
Le workflow séparé `install-smoke` réutilise le même script de portée via son propre job `preflight`. Il scinde la couverture smoke entre `run_fast_install_smoke` et `run_full_install_smoke`. Les pull requests exécutent le chemin rapide pour les surfaces Docker/package, les changements de package/manifeste de plugins groupés et les surfaces cœur plugin/channel/gateway/Plugin SDK que les jobs Docker smoke exercent. Les changements limités au code source de plugins groupés, les modifications de tests uniquement et les modifications de documentation uniquement ne réservent pas de workers Docker. Le chemin rapide construit une seule fois limage du Dockerfile racine, vérifie la CLI, exécute le2e container gateway-network, vérifie un build arg dextension groupée et exécute le profil Docker de plugin groupé borné avec un timeout de commande de 120 secondes. Le chemin complet conserve linstallation du package QR ainsi que la couverture installer Docker/update 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 installer/package/Docker. Les pushs sur `main`, y compris les merge commits, ne forcent pas le chemin complet ; lorsque la logique changed-scope demanderait une couverture complète sur un push, le workflow conserve le Docker smoke rapide et laisse le smoke dinstallation complet à la validation nocturne ou de release. Le smoke lent du fournisseur dimages dinstallation globale Bun est contrôlé séparément par `run_bun_global_install_smoke` ; il sexécute selon la planification nocturne et depuis le workflow de vérifications de release, et les déclenchements manuels de `install-smoke` peuvent lactiver, mais les pull requests et les pushs sur `main` ne lexécutent pas. Les tests Docker QR et installer conservent leurs propres Dockerfiles orientés installation. En local, `test:docker:all` préconstruit une image partagée pour les tests live et une image applicative partagée construite depuis `scripts/e2e/Dockerfile`, puis exécute en parallèle les lanes smoke live/E2E avec `OPENCLAW_SKIP_DOCKER_BUILD=1` ; réglez la concurrence par défaut du pool principal de 8 avec `OPENCLAW_DOCKER_ALL_PARALLELISM` et la concurrence du pool final sensible au fournisseur de 8 avec `OPENCLAW_DOCKER_ALL_TAIL_PARALLELISM`. Le démarrage des lanes est échelonné de 2 secondes par défaut pour éviter les tempêtes locales de création du daemon Docker ; remplacez cela avec `OPENCLAW_DOCKER_ALL_START_STAGGER_MS=0` ou une autre valeur en millisecondes. Lagrégat local cesse de planifier de nouvelles lanes groupées après le premier échec par défaut, et chaque lane a un timeout de 120 minutes remplaçable via `OPENCLAW_DOCKER_ALL_LANE_TIMEOUT_MS`. Le workflow réutilisable live/E2E reproduit le modèle dimage partagée en construisant et en poussant une image Docker E2E GHCR taguée par SHA avant la matrice Docker, puis en exécutant la matrice avec `OPENCLAW_SKIP_DOCKER_BUILD=1`. Le workflow planifié live/E2E exécute chaque jour la suite Docker complète du chemin de release. La matrice complète de mise à jour groupée/canal reste manuelle/suite complète, car elle effectue des passages répétés réels de mise à jour npm et de réparation doctor.
La logique locale des voies modifiées se trouve dans `scripts/changed-lanes.mjs` et est exécutée par `scripts/check-changed.mjs`. Cette barrière locale est plus stricte sur les limites darchitecture que la large portée de plateforme en CI : les changements de production du cœur exécutent le typecheck prod du cœur plus les tests du cœur, les changements uniquement de tests du cœur nexécutent que le typecheck/tests du cœur, les changements de production dextension exécutent le typecheck prod des extensions plus les tests dextensions, et les changements uniquement de tests dextensions nexécutent que le typecheck/tests dextensions. Les changements du Plugin SDK public ou du plugin-contract étendent la validation aux extensions car celles-ci dépendent de ces contrats du cœur. Les hausses de version limitées aux métadonnées de release exécutent des vérifications ciblées de version/configuration/dépendances racine. Les changements inconnus de racine/configuration échouent prudemment vers toutes les voies.
La logique locale des lanes modifiées se trouve dans `scripts/changed-lanes.mjs` et est exécutée par `scripts/check-changed.mjs`. Cette porte locale est plus stricte sur les limites darchitecture que la large portée CI par plateforme : les changements de production du cœur exécutent le typecheck prod du cœur plus les tests du cœur, les changements limités aux tests du cœur nexécutent que le typecheck/tests du cœur, les changements de production des extensions exécutent le typecheck prod des extensions plus les tests des extensions, et les changements limités aux tests des extensions nexécutent que le typecheck/tests des extensions. Les changements du Plugin SDK public ou du plugin-contract étendent la validation aux extensions, car les extensions dépendent de ces contrats du cœur. Les incréments de version limités aux métadonnées de release exécutent des vérifications ciblées de version/configuration/dépendances racine. Les changements inconnus à la racine ou dans la configuration échouent de manière sécurisée vers toutes les lanes.
Sur les pushes, la matrice `checks` ajoute la voie `compat-node22`, réservée aux pushes. Sur les pull requests, cette voie est ignorée et la matrice reste focalisée sur les voies normales de test/canal.
Sur les pushs, la matrice `checks` ajoute la lane `compat-node22`, uniquement sur push. Sur les pull requests, cette lane est ignorée et la matrice reste concentrée sur les lanes normales de test/canal.
Les familles de tests Node les plus lentes sont fractionnées ou équilibrées afin que chaque job reste compact sans sur-réserver les runners : les contrats de canal sexécutent en trois shards pondérés, les tests de plugins inclus sont équilibrés sur six workers dextension, les petites voies unitaires du cœur sont appariées, auto-reply sexécute sur trois workers équilibrés au lieu de six minuscules workers, et les configurations agentiques gateway/plugin sont réparties sur les jobs Node agentiques existants réservés au code source au lieu dattendre les artefacts construits. Les tests généraux de navigateur, QA, médias et plugins divers utilisent leurs configurations Vitest dédiées plutôt que le fourre-tout partagé des plugins. Les jobs de shards dextensions exécutent les groupes de configuration de plugins en série avec un seul worker Vitest et un heap Node plus grand afin que les lots de plugins lourds en imports ne surchargent pas les petits runners CI. La large voie agents utilise lordonnanceur parallèle par fichiers Vitest partagé, car elle est dominée par les imports/la planification plutôt que par un seul fichier de test lent. `runtime-config` sexécute avec le shard infra core-runtime pour éviter que le shard runtime partagé ne porte la fin de queue. `check-additional` conserve ensemble le travail de compilation/canary des limites de package et sépare larchitecture de topologie runtime de la couverture gateway watch ; le shard des gardes de limites exécute ses petits gardes indépendants en concurrence dans un seul job. Gateway watch, les tests de canaux et le shard core support-boundary sexécutent en concurrence dans `build-artifacts` après que `dist/` et `dist-runtime/` sont déjà construits, ce qui conserve leurs anciens noms de vérification comme jobs légers de vérification tout en évitant deux workers Blacksmith supplémentaires et une seconde file dattente de consommateurs dartefacts.
Les familles de tests Node les plus lentes sont divisées ou équilibrées afin que chaque job reste petit sans sur-réserver les runners : les contrats de canaux sexécutent en trois shards pondérés, les tests de plugins groupés sont équilibrés sur six workers dextension, les petites lanes unitaires du cœur sont appariées, auto-reply sexécute sur trois workers équilibrés au lieu de six petits workers, et les configurations agentiques gateway/plugin sont réparties sur les jobs Node agentiques existants limités au code source au lieu dattendre les artefacts construits. Les tests larges de navigateur, QA, médias et plugins divers utilisent leurs configurations Vitest dédiées au lieu du fourre-tout partagé pour plugins. Les jobs de shards dextension exécutent les groupes de configuration de plugins en série avec un seul worker Vitest et un tas Node plus grand afin que les lots de plugins lourds à limport ne surchargent pas les petits runners CI. La large lane agents utilise le planificateur parallèle par fichier Vitest partagé, car elle est dominée par les imports et lordonnancement plutôt que par un seul fichier de test lent. `runtime-config` sexécute avec le shard infra core-runtime afin déviter que le shard runtime partagé ne porte la traîne. `check-additional` conserve ensemble le travail de compilation/canary sur les limites de package et sépare larchitecture de topologie du runtime de la couverture gateway watch ; le shard boundary guard exécute ses petits gardes indépendants en concurrence à lintérieur dun même job. Gateway watch, les tests de canaux et le shard core support-boundary sexécutent en concurrence dans `build-artifacts` une fois que `dist/` et `dist-runtime/` sont déjà construits, en conservant leurs anciens noms de vérification comme jobs vérificateurs légers tout en évitant deux workers Blacksmith supplémentaires et une seconde file dattente de consommateurs dartefacts.
Le CI Android exécute à la fois `testPlayDebugUnitTest` et `testThirdPartyDebugUnitTest`, puis construit lAPK debug Play. La variante third-party na ni source set ni manifeste séparés ; sa lane de tests unitaires compile tout de même cette variante avec les flags BuildConfig SMS/call-log, tout en évitant un job de packaging APK debug dupliqué sur chaque push pertinent pour Android.
`extension-fast` est réservé aux PR car les exécutions sur push exécutent déjà les shards complets de plugins groupés. Cela permet de conserver un retour rapide sur les plugins modifiés pendant les revues sans réserver un worker Blacksmith supplémentaire sur `main` pour une couverture déjà présente dans `checks-node-extensions`.
La CI Android exécute `testPlayDebugUnitTest` et `testThirdPartyDebugUnitTest`, puis construit lAPK debug Play. La variante third-party na ni source set ni manifeste séparés ; sa voie de tests unitaires compile tout de même cette variante avec les drapeaux BuildConfig SMS/journal dappels, tout en évitant un job de packaging APK debug dupliqué à chaque push pertinent pour Android.
`extension-fast` est réservé aux PR, car les exécutions sur push exécutent déjà les shards complets des plugins inclus. Cela permet un retour rapide sur les plugins modifiés pendant les revues sans réserver un worker Blacksmith supplémentaire sur `main` pour une couverture déjà présente dans `checks-node-extensions`.
GitHub peut marquer les jobs remplacés comme `cancelled` lorsquun push plus récent arrive sur la même PR ou la même ref `main`. Considérez cela comme du bruit CI, sauf si lexécution la plus récente pour cette même ref échoue également. Les vérifications agrégées de shards utilisent `!cancelled() && always()` afin quelles signalent toujours les échecs normaux de shards, sans toutefois se mettre en file dattente après que lensemble du workflow a déjà été remplacé.
La clé de concurrence CI est versionnée (`CI-v7-*`) afin quun zombie côté GitHub dans un ancien groupe de file dattente ne puisse pas bloquer indéfiniment les nouvelles exécutions sur main.
GitHub peut marquer les jobs remplacés comme `cancelled` lorsquun push plus récent arrive sur la même PR ou la même référence `main`. Considérez cela comme du bruit CI, sauf si lexécution la plus récente pour cette même référence échoue également. Les vérifications agrégées de shards utilisent `!cancelled() && always()` afin de continuer à signaler les échecs normaux des shards, sans toutefois se mettre en file dattente lorsque lensemble du workflow a déjà été remplacé.
La clé de concurrence CI est versionnée (`CI-v7-*`) afin quun zombie côté GitHub dans un ancien groupe de file dattente ne puisse pas bloquer indéfiniment les nouvelles exécutions sur `main`.
## Runners
| Runner | Jobs |
| -------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `ubuntu-24.04` | `preflight`, jobs de sécurité rapides et agrégats (`security-scm-fast`, `security-dependency-audit`, `security-fast`), vérifications rapides de protocole/contrat/plugins inclus, vérifications shardées des contrats de canaux, shards `check` sauf lint, shards et agrégats `check-additional`, vérificateurs agrégés des 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 entrer en file plus tôt |
| `blacksmith-8vcpu-ubuntu-2404` | `build-artifacts`, build-smoke, shards de tests Node Linux, shards de tests de plugins inclus, `android` |
| `blacksmith-16vcpu-ubuntu-2404` | `check-lint`, qui reste suffisamment sensible au CPU pour que 8 vCPU coûtent plus quils ne rapportent ; builds Docker install-smoke, où le coût en temps de file dattente de 32 vCPU dépassait le gain |
| `ubuntu-24.04` | `preflight`, jobs et agrégats de sécurité rapides (`security-scm-fast`, `security-dependency-audit`, `security-fast`), vérifications rapides protocol/contract/groupées, vérifications shardées des contrats de canaux, shards `check` sauf lint, shards et agrégats `check-additional`, vérificateurs agrégés des tests Node, vérifications docs, Skills Python, workflow-sanity, labeler, auto-response ; le preflight dinstall-smoke utilise également Ubuntu hébergé par GitHub afin que la matrice Blacksmith puisse se mettre en file dattente plus tôt |
| `blacksmith-8vcpu-ubuntu-2404` | `build-artifacts`, build-smoke, shards de tests Node Linux, shards de tests de plugins groupés, `android` |
| `blacksmith-16vcpu-ubuntu-2404` | `check-lint`, qui reste suffisamment sensible au CPU pour que 8 vCPU coûtent plus quils ne font gagner ; builds Docker dinstall-smoke, où le coût en temps de file dattente de 32 vCPU dépassait le gain obtenu |
| `blacksmith-16vcpu-windows-2025` | `checks-windows` |
| `blacksmith-6vcpu-macos-latest` | `macos-node` sur `openclaw/openclaw` ; les forks reviennent à `macos-latest` |
| `blacksmith-12vcpu-macos-latest` | `macos-swift` sur `openclaw/openclaw` ; les forks reviennent à `macos-latest` |
| `blacksmith-6vcpu-macos-latest` | `macos-node` sur `openclaw/openclaw` ; les forks reviennent sur `macos-latest` |
| `blacksmith-12vcpu-macos-latest` | `macos-swift` sur `openclaw/openclaw` ; les forks reviennent sur `macos-latest` |
## Équivalents locaux
```bash
pnpm changed:lanes # inspecter le classificateur local des voies modifiées pour origin/main...HEAD
pnpm check:changed # barrière locale intelligente : typecheck/lint/tests modifiés par voie de limite
pnpm check # barrière locale rapide : tsgo production + lint shardé + gardes rapides en parallèle
pnpm changed:lanes # inspecter le classificateur local des lanes modifiées pour origin/main...HEAD
pnpm check:changed # porte locale intelligente : typecheck/lint/tests modifiés par lane de limite
pnpm check # porte locale rapide : tsgo de production + lint shardé + gardes rapides en parallèle
pnpm check:test-types
pnpm check:timed # même barrière avec temps par étape
pnpm check:timed # même porte avec minutage par étape
pnpm build:strict-smoke
pnpm check:architecture
pnpm test:gateway:watch-regression
pnpm test # tests vitest
pnpm test:channels
pnpm test:contracts:channels
pnpm check:docs # format + lint docs + liens cassés
pnpm build # construire dist lorsque les voies CI artifact/build-smoke comptent
node scripts/ci-run-timings.mjs <run-id> # résumer le temps mur, le temps de file dattente et les jobs les plus lents
node scripts/ci-run-timings.mjs --recent 10 # comparer les exécutions CI réussies récentes sur main
pnpm check:docs # format docs + lint + liens cassés
pnpm build # construire dist lorsque les lanes CI artifact/build-smoke sont pertinentes
node scripts/ci-run-timings.mjs <run-id> # résumer le temps total, le temps de file dattente et les jobs les plus lents
node scripts/ci-run-timings.mjs --recent 10 # comparer les exécutions CI récentes réussies sur main
pnpm test:perf:groups --full-suite --allow-failures --output .artifacts/test-perf/baseline-before.json
pnpm test:perf:groups:compare .artifacts/test-perf/baseline-before.json .artifacts/test-perf/after-agent.json
```
## Articles connexes
## Liens connexes
- [Vue densemble de linstallation](/fr/install)
- [Canaux de release](/fr/install/development-channels)

View File

@ -1,26 +1,26 @@
---
read_when:
- Le hub de dépannage vous a orienté ici pour un diagnostic plus approfondi
- Le hub de dépannage vous a dirigé ici pour un diagnostic plus approfondi
- Vous avez besoin de sections de runbook stables basées sur les symptômes avec des commandes exactes
summary: Runbook de dépannage approfondi pour le gateway, les canaux, lautomatisation, les Node et le navigateur
summary: Guide de dépannage approfondi pour Gateway, les canaux, lautomatisation, les nœuds et le navigateur
title: Dépannage
x-i18n:
generated_at: "2026-04-24T07:13:18Z"
generated_at: "2026-04-24T08:57:12Z"
model: gpt-5.4
provider: openai
source_hash: 32c4cbbbe8b1cd5eaca34503f4a363d3fa2650e491f83455958eb5725f9d50c5
source_hash: 20066bdab03f05304b3a620fbadc38e4dc74b740da151c58673dcf5196e5f1e1
source_path: gateway/troubleshooting.md
workflow: 15
---
# Dépannage Gateway
# Dépannage de Gateway
Cette page est le runbook approfondi.
Commencez par [/help/troubleshooting](/fr/help/troubleshooting) si vous souhaitez dabord le flux de tri rapide.
Commencez par [/help/troubleshooting](/fr/help/troubleshooting) si vous voulez dabord le flux de triage rapide.
## Échelle de commandes
Exécutez dabord celles-ci, dans cet ordre :
Exécutez dabord celles-ci, dans cet ordre :
```bash
openclaw status
@ -30,16 +30,16 @@ openclaw doctor
openclaw channels status --probe
```
Signaux attendus en bonne santé :
Signaux attendus en bonne santé :
- `openclaw gateway status` affiche `Runtime: running`, `Connectivity probe: ok`, et une ligne `Capability: ...`.
- `openclaw doctor` ne signale aucun problème bloquant de configuration/service.
- `openclaw gateway status` affiche `Runtime: running`, `Connectivity probe: ok` et une ligne `Capability: ...`.
- `openclaw doctor` ne signale aucun problème bloquant de configuration ou de service.
- `openclaw channels status --probe` affiche létat de transport en direct par compte et,
lorsque pris en charge, des résultats de sonde/audit tels que `works` ou `audit ok`.
là où cest pris en charge, des résultats de sonde/audit tels que `works` ou `audit ok`.
## Anthropic 429 usage supplémentaire requis pour un contexte long
## Utilisation supplémentaire Anthropic 429 requise pour le contexte long
Utilisez cette section lorsque les journaux/erreurs incluent :
Utilisez ceci lorsque les journaux/erreurs incluent :
`HTTP 429: rate_limit_error: Extra usage is required for long context requests`.
```bash
@ -48,19 +48,19 @@ openclaw models status
openclaw config get agents.defaults.models
```
Recherchez :
Recherchez :
- Le modèle Anthropic Opus/Sonnet sélectionné a `params.context1m: true`.
- Lidentifiant Anthropic actuel nest pas éligible à lutilisation en contexte long.
- Lidentifiant Anthropic actuel nest pas éligible à lutilisation du contexte long.
- Les requêtes échouent uniquement sur les longues sessions/exécutions de modèle qui nécessitent le chemin bêta 1M.
Options de correction :
Options de correction :
1. Désactivez `context1m` pour ce modèle afin de revenir à la fenêtre de contexte normale.
2. Utilisez un identifiant Anthropic éligible aux requêtes en contexte long, ou passez à une clé API Anthropic.
3. Configurez des modèles de repli afin que les exécutions se poursuivent lorsque les requêtes Anthropic en contexte long sont rejetées.
2. Utilisez un identifiant Anthropic éligible aux requêtes de contexte long, ou passez à une clé API Anthropic.
3. Configurez des modèles de secours afin que les exécutions continuent lorsque les requêtes Anthropic de contexte long sont rejetées.
Lié :
Liens associés :
- [/providers/anthropic](/fr/providers/anthropic)
- [/reference/token-use](/fr/reference/token-use)
@ -68,11 +68,11 @@ Lié :
## Le backend local compatible OpenAI réussit les sondes directes mais les exécutions dagent échouent
Utilisez cette section lorsque :
Utilisez ceci lorsque :
- `curl ... /v1/models` fonctionne
- les petits appels directs `/v1/chat/completions` fonctionnent
- les exécutions de modèle OpenClaw échouent uniquement sur des tours dagent normaux
- les petits appels directs à `/v1/chat/completions` fonctionnent
- les exécutions de modèle OpenClaw échouent uniquement lors des tours normaux de lagent
```bash
curl http://127.0.0.1:1234/v1/models
@ -83,36 +83,38 @@ openclaw infer model run --model <provider/model> --prompt "hi" --json
openclaw logs --follow
```
Recherchez :
Recherchez :
- les petits appels directs réussissent, mais les exécutions OpenClaw échouent uniquement sur les prompts plus volumineux
- des erreurs backend concernant `messages[].content` qui attend une chaîne
- des plantages backend qui apparaissent uniquement avec des nombres plus élevés de jetons de prompt ou des prompts complets du runtime dagent
- les petits appels directs réussissent, mais les exécutions OpenClaw échouent uniquement sur des prompts plus volumineux
- des erreurs du backend indiquant que `messages[].content` attend une chaîne
- des plantages du backend qui apparaissent uniquement avec un plus grand nombre de tokens de prompt ou avec les prompts complets du runtime de lagent
Signatures courantes :
Signatures courantes :
- `messages[...].content: invalid type: sequence, expected a string` → le backend
rejette les parties de contenu structurées de Chat Completions. Correction : définissez
rejette les parties de contenu structurées de Chat Completions. Correctif : définissez
`models.providers.<provider>.models[].compat.requiresStringContent: true`.
- les petites requêtes directes réussissent, mais les exécutions dagent OpenClaw échouent avec des plantages backend/modèle
(par exemple Gemma sur certaines builds `inferrs`) → le transport OpenClaw est
probablement déjà correct ; cest le backend qui échoue sur la forme plus volumineuse du prompt
du runtime dagent.
- les échecs diminuent après désactivation des outils mais ne disparaissent pas → les schémas doutils
participaient à la pression, mais le problème restant est toujours une limitation de capacité du modèle/serveur en amont ou un bogue du backend.
- les petites requêtes directes réussissent, mais les exécutions de lagent OpenClaw échouent avec des plantages du backend/modèle
(par exemple Gemma sur certaines versions de `inferrs`) → le transport OpenClaw est
probablement déjà correct ; cest le backend qui échoue sur la forme du prompt
plus volumineux du runtime de lagent.
- les échecs diminuent après désactivation des outils mais ne disparaissent pas → les schémas doutils faisaient
partie de la pression, mais le problème restant est toujours en amont : capacité du modèle/serveur
ou bug du backend.
Options de correction :
Options de correction :
1. Définissez `compat.requiresStringContent: true` pour les backends Chat Completions qui nacceptent que des chaînes.
2. Définissez `compat.supportsTools: false` pour les modèles/backends qui ne peuvent pas gérer
de manière fiable la surface de schéma doutils dOpenClaw.
3. Réduisez autant que possible la pression du prompt : bootstrap despace de travail plus petit, historique
de session plus court, modèle local plus léger ou backend avec meilleure prise en charge du contexte long.
4. Si les petites requêtes directes continuent de réussir alors que les tours dagent OpenClaw plantent toujours
dans le backend, traitez cela comme une limitation du serveur/modèle en amont et déposez
une reproduction là-bas avec la forme de charge utile acceptée.
3. Réduisez la pression du prompt quand cest possible : initialisation despace de travail plus petite, historique
de session plus court, modèle local plus léger, ou backend avec un meilleur support
du contexte long.
4. Si les petites requêtes directes continuent de réussir tandis que les tours de lagent OpenClaw plantent encore
dans le backend, traitez cela comme une limitation du serveur/modèle en amont et ouvrez
un rapport reproductible là-bas avec la forme de payload acceptée.
Lié :
Liens associés :
- [/gateway/local-models](/fr/gateway/local-models)
- [/gateway/configuration](/fr/gateway/configuration)
@ -120,7 +122,7 @@ Lié :
## Aucune réponse
Si les canaux sont actifs mais que rien ne répond, vérifiez le routage et la politique avant de reconnecter quoi que ce soit.
Si les canaux sont actifs mais que rien ne répond, vérifiez le routage et la stratégie avant de reconnecter quoi que ce soit.
```bash
openclaw status
@ -130,27 +132,27 @@ openclaw config get channels
openclaw logs --follow
```
Recherchez :
Recherchez :
- Appairage en attente pour les expéditeurs de messages privés.
- Contrôle des mentions de groupe (`requireMention`, `mentionPatterns`).
- Incohérences de liste dautorisation canal/groupe.
- Pairing en attente pour les expéditeurs de message direct.
- Filtrage des mentions de groupe (`requireMention`, `mentionPatterns`).
- Incohérences dallowlist de canal/groupe.
Signatures courantes :
Signatures courantes :
- `drop guild message (mention required` → message de groupe ignoré jusquà mention.
- `pairing request` → lexpéditeur doit être approuvé.
- `blocked` / `allowlist` → lexpéditeur/le canal a été filtré par la politique.
- `pairing request` → lexpéditeur a besoin dune approbation.
- `blocked` / `allowlist` → lexpéditeur/canal a été filtré par la stratégie.
Lié :
Liens associés :
- [/channels/troubleshooting](/fr/channels/troubleshooting)
- [/channels/pairing](/fr/channels/pairing)
- [/channels/groups](/fr/channels/groups)
## Connectivité de linterface de contrôle du tableau de bord
## Connectivité de linterface dashboard/control UI
Lorsque le tableau de bord/linterface de contrôle ne se connecte pas, validez lURL, le mode dauthentification et les hypothèses de contexte sécurisé.
Lorsque linterface dashboard/control UI ne se connecte pas, validez lURL, le mode dauthentification et les hypothèses de contexte sécurisé.
```bash
openclaw gateway status
@ -160,48 +162,51 @@ openclaw doctor
openclaw gateway status --json
```
Recherchez :
Recherchez :
- URL de sonde et URL du tableau de bord correctes.
- Incompatibilité de mode dauthentification/jeton entre le client et le gateway.
- Utilisation HTTP là où une identité dappareil est requise.
- URL de sonde et URL du dashboard correctes.
- Incohérence de mode dauthentification/de jeton entre le client et Gateway.
- Utilisation de HTTP là où lidentité de lappareil est requise.
Signatures courantes :
Signatures courantes :
- `device identity required` → contexte non sécurisé ou authentification dappareil manquante.
- `origin not allowed``Origin` du navigateur nest pas dans `gateway.controlUi.allowedOrigins`
(ou vous vous connectez depuis une origine navigateur non-loopback sans liste dautorisation
explicite).
- `device nonce required` / `device nonce mismatch` → le client nachève pas le
flux dauthentification dappareil basé sur challenge (`connect.challenge` + `device.nonce`).
- `device signature invalid` / `device signature expired` → le client a signé la mauvaise
charge utile (ou un horodatage périmé) pour la poignée de main actuelle.
- `AUTH_TOKEN_MISMATCH` avec `canRetryWithDeviceToken=true` → le client peut effectuer une nouvelle tentative de confiance avec un jeton dappareil mis en cache.
- Cette nouvelle tentative avec jeton mis en cache réutilise lensemble de scopes mis en cache stocké avec le jeton dappareil appairé. Les appelants avec `deviceToken` explicite / `scopes` explicites conservent à la place lensemble de scopes demandé.
(ou vous vous connectez depuis une origine de navigateur non loopback sans
allowlist explicite).
- `device nonce required` / `device nonce mismatch` → le client ne termine pas
le flux dauthentification dappareil basé sur challenge (`connect.challenge` + `device.nonce`).
- `device signature invalid` / `device signature expired` → le client a signé le mauvais
payload (ou un horodatage obsolète) pour la négociation en cours.
- `AUTH_TOKEN_MISMATCH` avec `canRetryWithDeviceToken=true` → le client peut faire une nouvelle tentative approuvée avec le jeton dappareil en cache.
- Cette nouvelle tentative avec jeton en cache réutilise lensemble des portées en cache stocké avec le
jeton dappareil appairé. Les appelants avec `deviceToken` explicite / `scopes` explicites conservent
à la place lensemble de portées quils ont demandé.
- En dehors de ce chemin de nouvelle tentative, la priorité dauthentification de connexion est dabord
jeton/mot de passe partagé explicite, puis `deviceToken` explicite, puis jeton dappareil stocké,
puis jeton bootstrap.
le jeton partagé/mot de passe explicite, puis `deviceToken` explicite, puis le jeton dappareil stocké,
puis le jeton damorçage.
- Sur le chemin asynchrone Tailscale Serve Control UI, les tentatives échouées pour le même
`{scope, ip}` sont sérialisées avant que le limiteur nenregistre léchec. Deux mauvaises nouvelles tentatives concurrentes du même client peuvent donc produire `retry later`
sur la seconde tentative au lieu de deux incompatibilités simples.
`{scope, ip}` sont sérialisées avant que le limiteur nenregistre léchec. Deux mauvaises
tentatives concurrentes du même client peuvent donc produire `retry later`
sur la seconde tentative au lieu de deux simples incohérences.
- `too many failed authentication attempts (retry later)` depuis un client loopback dorigine navigateur
→ les échecs répétés depuis cette même `Origin` normalisée sont temporairement
bloqués ; une autre origine localhost utilise un compartiment distinct.
- `unauthorized` répété après cette nouvelle tentative → dérive du jeton partagé/jeton dappareil ; actualisez la configuration du jeton et réapprouvez/faites tourner le jeton dappareil si nécessaire.
- `gateway connect failed:`mauvaise cible hôte/port/url.
→ les échecs répétés depuis cette même `Origin` normalisée sont temporairement bloqués ;
une autre origine localhost utilise un compartiment distinct.
- `unauthorized` répété après cette nouvelle tentative → dérive du jeton partagé/du jeton dappareil ; actualisez la configuration du jeton et réapprouvez/faites pivoter le jeton dappareil si nécessaire.
- `gateway connect failed:`cible dhôte/port/URL incorrecte.
### Correspondance rapide des codes de détail dauthentification
### Carte rapide des codes de détail dauthentification
Utilisez `error.details.code` de la réponse `connect` en échec pour choisir laction suivante :
Utilisez `error.details.code` de la réponse `connect` en échec pour choisir laction suivante :
| Detail code | Signification | Action recommandée |
| ---------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `AUTH_TOKEN_MISSING` | Le client na pas envoyé un jeton partagé requis. | Collez/définissez le jeton dans le client et réessayez. Pour les chemins du tableau de bord : `openclaw config get gateway.auth.token` puis collez-le dans les réglages de linterface de contrôle. |
| `AUTH_TOKEN_MISMATCH` | Le jeton partagé ne correspond pas au jeton dauthentification du gateway. | Si `canRetryWithDeviceToken=true`, autorisez une nouvelle tentative de confiance. Les nouvelles tentatives avec jeton mis en cache réutilisent les scopes approuvés stockés ; les appelants avec `deviceToken` / `scopes` explicites conservent les scopes demandés. Si cela échoue encore, exécutez la [liste de contrôle de récupération de dérive de jeton](/fr/cli/devices#token-drift-recovery-checklist). |
| `AUTH_DEVICE_TOKEN_MISMATCH` | Le jeton par appareil mis en cache est obsolète ou révoqué. | Faites tourner/réapprouvez le jeton dappareil à laide de la [CLI devices](/fr/cli/devices), puis reconnectez-vous. |
| `PAIRING_REQUIRED` | Lidentité dappareil nécessite une approbation. Vérifiez `error.details.reason` pour `not-paired`, `scope-upgrade`, `role-upgrade`, ou `metadata-upgrade`, et utilisez `requestId` / `remediationHint` lorsquils sont présents. | Approuvez la demande en attente : `openclaw devices list` puis `openclaw devices approve <requestId>`. Les montées de niveau de scope/rôle utilisent le même flux après examen de laccès demandé. |
| Code de détail | Signification | Action recommandée |
| ---------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `AUTH_TOKEN_MISSING` | Le client na pas envoyé de jeton partagé requis. | Collez/définissez le jeton dans le client et réessayez. Pour les chemins dashboard : `openclaw config get gateway.auth.token` puis collez-le dans les paramètres de Control UI. |
| `AUTH_TOKEN_MISMATCH` | Le jeton partagé ne correspond pas au jeton dauthentification de Gateway. | Si `canRetryWithDeviceToken=true`, autorisez une nouvelle tentative approuvée. Les nouvelles tentatives avec jeton en cache réutilisent les portées approuvées stockées ; les appelants avec `deviceToken` / `scopes` explicites conservent les portées demandées. Si léchec persiste, exécutez la [checklist de récupération de dérive de jeton](/fr/cli/devices#token-drift-recovery-checklist). |
| `AUTH_DEVICE_TOKEN_MISMATCH` | Le jeton par appareil en cache est obsolète ou révoqué. | Faites pivoter/réapprouvez le jeton dappareil avec la [CLI des appareils](/fr/cli/devices), puis reconnectez-vous. |
| `PAIRING_REQUIRED` | Lidentité de lappareil nécessite une approbation. Vérifiez `error.details.reason` pour `not-paired`, `scope-upgrade`, `role-upgrade` ou `metadata-upgrade`, et utilisez `requestId` / `remediationHint` lorsquils sont présents. | Approuvez la demande en attente : `openclaw devices list` puis `openclaw devices approve <requestId>`. Les mises à niveau de portée/rôle utilisent le même flux après examen de laccès demandé. |
Vérification de migration de lauthentification dappareil v2 :
Vérification de migration auth appareil v2 :
```bash
openclaw --version
@ -209,29 +214,30 @@ openclaw doctor
openclaw gateway status
```
Si les journaux montrent des erreurs de nonce/signature, mettez à jour le client qui se connecte et vérifiez quil :
Si les journaux affichent des erreurs de nonce/signature, mettez à jour le client qui se connecte et vérifiez quil :
1. attend `connect.challenge`
2. signe la charge utile liée au challenge
2. signe le payload lié au challenge
3. envoie `connect.params.device.nonce` avec le même nonce de challenge
Si `openclaw devices rotate` / `revoke` / `remove` est refusé de manière inattendue :
Si `openclaw devices rotate` / `revoke` / `remove` est refusé de façon inattendue :
- les sessions avec jeton dappareil appairé ne peuvent gérer que **leur propre** appareil, sauf si lappelant possède aussi `operator.admin`
- `openclaw devices rotate --scope ...` ne peut demander que des scopes operator
que la session appelante détient déjà
- les sessions de jeton dappareil appairé peuvent gérer uniquement **leur propre** appareil sauf si
lappelant possède aussi `operator.admin`
- `openclaw devices rotate --scope ...` peut uniquement demander des portées opérateur que
la session appelante détient déjà
Lié :
Liens associés :
- [/web/control-ui](/fr/web/control-ui)
- [/gateway/configuration](/fr/gateway/configuration) (modes dauthentification du gateway)
- [/gateway/configuration](/fr/gateway/configuration) (modes dauthentification de Gateway)
- [/gateway/trusted-proxy-auth](/fr/gateway/trusted-proxy-auth)
- [/gateway/remote](/fr/gateway/remote)
- [/cli/devices](/fr/cli/devices)
## Service Gateway non exécuté
## Le service Gateway nest pas en cours dexécution
Utilisez cette section lorsque le service est installé mais que le processus ne reste pas actif.
Utilisez ceci lorsque le service est installé mais que le processus ne reste pas actif.
```bash
openclaw gateway status
@ -241,30 +247,30 @@ openclaw doctor
openclaw gateway status --deep # analyse aussi les services au niveau système
```
Recherchez :
Recherchez :
- `Runtime: stopped` avec des indications de sortie.
- Incompatibilité de configuration du service (`Config (cli)` vs `Config (service)`).
- Conflits de port/écouteur.
- `Runtime: stopped` avec des indices de sortie.
- Incohérence de configuration du service (`Config (cli)` vs `Config (service)`).
- Conflits de port/découte.
- Installations launchd/systemd/schtasks supplémentaires lorsque `--deep` est utilisé.
- Indications de nettoyage `Other gateway-like services detected (best effort)`.
- Indices de nettoyage `Other gateway-like services detected (best effort)`.
Signatures courantes :
Signatures courantes :
- `Gateway start blocked: set gateway.mode=local` ou `existing config is missing gateway.mode` → le mode gateway local nest pas activé, ou le fichier de configuration a été écrasé et a perdu `gateway.mode`. Correction : définissez `gateway.mode="local"` dans votre configuration, ou relancez `openclaw onboard --mode local` / `openclaw setup` pour réappliquer la configuration attendue du mode local. Si vous exécutez OpenClaw via Podman, le chemin de configuration par défaut est `~/.openclaw/openclaw.json`.
- `refusing to bind gateway ... without auth` → liaison non-loopback sans chemin dauthentification gateway valide (jeton/mot de passe, ou trusted-proxy là où il est configuré).
- `Gateway start blocked: set gateway.mode=local` ou `existing config is missing gateway.mode` → le mode Gateway local nest pas activé, ou le fichier de configuration a été écrasé et a perdu `gateway.mode`. Correctif : définissez `gateway.mode="local"` dans votre configuration, ou relancez `openclaw onboard --mode local` / `openclaw setup` pour réappliquer la configuration attendue en mode local. Si vous exécutez OpenClaw via Podman, le chemin de configuration par défaut est `~/.openclaw/openclaw.json`.
- `refusing to bind gateway ... without auth` → liaison non loopback sans chemin dauthentification Gateway valide (jeton/mot de passe, ou trusted-proxy lorsquil est configuré).
- `another gateway instance is already listening` / `EADDRINUSE` → conflit de port.
- `Other gateway-like services detected (best effort)` → des unités launchd/systemd/schtasks obsolètes ou parallèles existent. La plupart des configurations devraient conserver un seul gateway par machine ; si vous avez réellement besoin de plus dun, isolez ports + configuration/état/espace de travail. Voir [/gateway#multiple-gateways-same-host](/fr/gateway#multiple-gateways-same-host).
- `Other gateway-like services detected (best effort)` → des unités launchd/systemd/schtasks obsolètes ou parallèles existent. La plupart des configurations doivent conserver une seule Gateway par machine ; si vous en avez vraiment besoin de plusieurs, isolez les ports + la configuration/létat/lespace de travail. Voir [/gateway#multiple-gateways-same-host](/fr/gateway#multiple-gateways-same-host).
Lié :
Liens associés :
- [/gateway/background-process](/fr/gateway/background-process)
- [/gateway/configuration](/fr/gateway/configuration)
- [/gateway/doctor](/fr/gateway/doctor)
## Le Gateway a restauré la dernière configuration valide connue
## Gateway a restauré la configuration du dernier état valide connu
Utilisez cette section lorsque le Gateway démarre, mais que les journaux indiquent quil a restauré `openclaw.json`.
Utilisez ceci lorsque Gateway démarre, mais que les journaux indiquent quelle a restauré `openclaw.json`.
```bash
openclaw logs --follow
@ -273,22 +279,22 @@ openclaw config validate
openclaw doctor
```
Recherchez :
Recherchez :
- `Config auto-restored from last-known-good`
- `gateway: invalid config was restored from last-known-good backup`
- `config reload restored last-known-good config after invalid-config`
- Un fichier horodaté `openclaw.json.clobbered.*` à côté de la configuration active
- Un événement système de lagent principal qui commence par `Config recovery warning`
- Un événement système du main-agent qui commence par `Config recovery warning`
Ce qui sest passé :
Ce qui sest passé :
- La configuration rejetée na pas passé la validation au démarrage ou lors dun rechargement à chaud.
- La configuration rejetée na pas passé la validation au démarrage ou lors du rechargement à chaud.
- OpenClaw a conservé la charge utile rejetée sous `.clobbered.*`.
- La configuration active a été restaurée à partir de la dernière copie valide connue.
- Le prochain tour de lagent principal reçoit un avertissement lui indiquant de ne pas réécrire aveuglément la configuration rejetée.
- Le prochain tour du main-agent reçoit un avertissement pour ne pas réécrire aveuglément la configuration rejetée.
Inspecter et réparer :
Inspecter et corriger :
```bash
CONFIG="$(openclaw config file)"
@ -298,31 +304,31 @@ openclaw config validate
openclaw doctor
```
Signatures courantes :
Signatures courantes :
- `.clobbered.*` existe → une modification directe externe ou une lecture au démarrage a été restaurée.
- `.rejected.*` existe → une écriture de configuration gérée par OpenClaw a échoué aux vérifications de schéma ou décrasement avant validation.
- `Config write rejected:` → lécriture a tenté de supprimer une forme requise, de réduire brutalement la taille du fichier, ou de persister une configuration invalide.
- `missing-meta-vs-last-good`, `gateway-mode-missing-vs-last-good`, ou `size-drop-vs-last-good:*` → le démarrage a traité le fichier actuel comme écrasé parce quil avait perdu des champs ou de la taille par rapport à la dernière sauvegarde valide connue.
- `Config last-known-good promotion skipped` → le candidat contenait des espaces réservés de secrets expurgés tels que `***`.
- `.rejected.*` existe → une écriture de configuration gérée par OpenClaw a échoué aux contrôles de schéma ou décrasement avant validation.
- `Config write rejected:` → lécriture a tenté de supprimer une structure requise, de réduire fortement la taille du fichier, ou de persister une configuration invalide.
- `missing-meta-vs-last-good`, `gateway-mode-missing-vs-last-good` ou `size-drop-vs-last-good:*` → au démarrage, le fichier actuel a été traité comme écrasé car il avait perdu des champs ou de la taille par rapport à la sauvegarde du dernier état valide connu.
- `Config last-known-good promotion skipped` → le candidat contenait des espaces réservés de secrets masqués tels que `***`.
Options de correction :
Options de correction :
1. Conservez la configuration active restaurée si elle est correcte.
2. Copiez uniquement les clés souhaitées depuis `.clobbered.*` ou `.rejected.*`, puis appliquez-les avec `openclaw config set` ou `config.patch`.
2. Copiez uniquement les clés prévues depuis `.clobbered.*` ou `.rejected.*`, puis appliquez-les avec `openclaw config set` ou `config.patch`.
3. Exécutez `openclaw config validate` avant de redémarrer.
4. Si vous modifiez à la main, conservez la configuration JSON5 complète, et non seulement lobjet partiel que vous vouliez changer.
4. Si vous modifiez à la main, conservez la configuration JSON5 complète, pas seulement lobjet partiel que vous vouliez modifier.
Lié :
Liens associés :
- [/gateway/configuration#strict-validation](/fr/gateway/configuration#strict-validation)
- [/gateway/configuration#config-hot-reload](/fr/gateway/configuration#config-hot-reload)
- [/cli/config](/fr/cli/config)
- [/gateway/doctor](/fr/gateway/doctor)
## Avertissements de gateway probe
## Avertissements de sonde Gateway
Utilisez cette section lorsque `openclaw gateway probe` atteint bien quelque chose, mais affiche tout de même un bloc davertissement.
Utilisez ceci lorsque `openclaw gateway probe` atteint bien quelque chose, mais affiche quand même un bloc davertissement.
```bash
openclaw gateway probe
@ -330,28 +336,28 @@ openclaw gateway probe --json
openclaw gateway probe --ssh user@gateway-host
```
Recherchez :
Recherchez :
- `warnings[].code` et `primaryTargetId` dans la sortie JSON.
- Si lavertissement concerne le repli SSH, plusieurs gateways, des scopes manquants, ou des références dauthentification non résolues.
- Si lavertissement concerne un repli SSH, plusieurs Gateways, des portées manquantes, ou des références dauthentification non résolues.
Signatures courantes :
Signatures courantes :
- `SSH tunnel failed to start; falling back to direct probes.` → la mise en place du tunnel SSH a échoué, mais la commande a quand même essayé les cibles directes configurées/loopback.
- `multiple reachable gateways detected` → plus dune cible a répondu. En général, cela signifie une configuration multi-gateway intentionnelle ou des écouteurs obsolètes/dupliqués.
- `Read-probe diagnostics are limited by gateway scopes (missing operator.read)` → la connexion a fonctionné, mais le RPC détaillé est limité par les scopes ; appairez lidentité de lappareil ou utilisez des identifiants disposant de `operator.read`.
- `Capability: pairing-pending` ou `gateway closed (1008): pairing required` → le gateway a répondu, mais ce client nécessite encore un appairage/une approbation avant un accès opérateur normal.
- texte davertissement de SecretRef non résolu pour `gateway.auth.*` / `gateway.remote.*` → le matériel dauthentification nétait pas disponible dans ce chemin de commande pour la cible en échec.
- `SSH tunnel failed to start; falling back to direct probes.` → la configuration SSH a échoué, mais la commande a quand même tenté les cibles directes configurées/en loopback.
- `multiple reachable gateways detected` → plus dune cible a répondu. En général, cela signifie une configuration multi-Gateway intentionnelle ou des écouteurs obsolètes/dupliqués.
- `Read-probe diagnostics are limited by gateway scopes (missing operator.read)` → la connexion a fonctionné, mais le RPC de détail est limité par la portée ; appairez lidentité de lappareil ou utilisez des identifiants avec `operator.read`.
- `Capability: pairing-pending` ou `gateway closed (1008): pairing required` → la Gateway a répondu, mais ce client a encore besoin dun appairage/dune approbation avant laccès opérateur normal.
- texte davertissement SecretRef non résolu `gateway.auth.*` / `gateway.remote.*` → le matériel dauthentification nétait pas disponible dans ce chemin de commande pour la cible en échec.
Lié :
Liens associés :
- [/cli/gateway](/fr/cli/gateway)
- [/gateway#multiple-gateways-same-host](/fr/gateway#multiple-gateways-same-host)
- [/gateway/remote](/fr/gateway/remote)
## Canal connecté mais messages non transmis
## Canal connecté mais messages non distribués
Si létat du canal est connecté mais que le flux de messages est mort, concentrez-vous sur la politique, les permissions et les règles de livraison spécifiques au canal.
Si létat du canal est connecté mais que le flux de messages est interrompu, concentrez-vous sur la stratégie, les autorisations et les règles de livraison spécifiques au canal.
```bash
openclaw channels status --probe
@ -361,19 +367,19 @@ openclaw logs --follow
openclaw config get channels
```
Recherchez :
Recherchez :
- Politique de message privé (`pairing`, `allowlist`, `open`, `disabled`).
- Liste dautorisation de groupe et exigences de mention.
- Permissions/scopes API du canal manquants.
- Stratégie DM (`pairing`, `allowlist`, `open`, `disabled`).
- Allowlist de groupe et exigences de mention.
- Permissions/portées API du canal manquantes.
Signatures courantes :
Signatures courantes :
- `mention required` → message ignoré par la politique de mention de groupe.
- `mention required` → message ignoré par la stratégie de mention de groupe.
- traces `pairing` / approbation en attente → lexpéditeur nest pas approuvé.
- `missing_scope`, `not_in_channel`, `Forbidden`, `401/403` → problème dauthentification/permissions du canal.
- `missing_scope`, `not_in_channel`, `Forbidden`, `401/403` → problème dauthentification/autorisations du canal.
Lié :
Liens associés :
- [/channels/troubleshooting](/fr/channels/troubleshooting)
- [/channels/whatsapp](/fr/channels/whatsapp)
@ -392,31 +398,31 @@ openclaw system heartbeat last
openclaw logs --follow
```
Recherchez :
Recherchez :
- Cron activé et prochain réveil présent.
- État de lhistorique dexécution des tâches (`ok`, `skipped`, `error`).
- Raisons dignorance du Heartbeat (`quiet-hours`, `requests-in-flight`, `alerts-disabled`, `empty-heartbeat-file`, `no-tasks-due`).
- Cron activé et prochaine activation présente.
- État de lhistorique des exécutions de tâche (`ok`, `skipped`, `error`).
- Raisons dignorance de Heartbeat (`quiet-hours`, `requests-in-flight`, `alerts-disabled`, `empty-heartbeat-file`, `no-tasks-due`).
Signatures courantes :
Signatures courantes :
- `cron: scheduler disabled; jobs will not run automatically` → Cron désactivé.
- `cron: timer tick failed` → échec du tick du planificateur ; vérifiez les erreurs de fichier/journal/runtime.
- `cron: timer tick failed` → échec du tick du planificateur ; vérifiez les erreurs de fichier/journal/runtime.
- `heartbeat skipped` avec `reason=quiet-hours` → en dehors de la fenêtre dheures actives.
- `heartbeat skipped` avec `reason=empty-heartbeat-file``HEARTBEAT.md` existe mais ne contient que des lignes vides / en-têtes markdown, donc OpenClaw ignore lappel au modèle.
- `heartbeat skipped` avec `reason=no-tasks-due``HEARTBEAT.md` contient un bloc `tasks:`, mais aucune des tâches nest due à ce tick.
- `heartbeat: unknown accountId` → identifiant de compte invalide pour la cible de livraison Heartbeat.
- `heartbeat skipped` avec `reason=dm-blocked` → la cible Heartbeat sest résolue en destination de type message privé alors que `agents.defaults.heartbeat.directPolicy` (ou le remplacement par agent) est défini sur `block`.
- `heartbeat skipped` avec `reason=empty-heartbeat-file``HEARTBEAT.md` existe mais ne contient que des lignes vides / en-têtes markdown ; OpenClaw ignore donc lappel au modèle.
- `heartbeat skipped` avec `reason=no-tasks-due``HEARTBEAT.md` contient un bloc `tasks:`, mais aucune tâche nest due sur ce tick.
- `heartbeat: unknown accountId` → identifiant de compte invalide pour la cible de livraison de Heartbeat.
- `heartbeat skipped` avec `reason=dm-blocked` → la cible de Heartbeat a été résolue vers une destination de type DM alors que `agents.defaults.heartbeat.directPolicy` (ou la surcharge par agent) est défini sur `block`.
Lié :
Liens associés :
- [/automation/cron-jobs#troubleshooting](/fr/automation/cron-jobs#troubleshooting)
- [/automation/cron-jobs](/fr/automation/cron-jobs)
- [/gateway/heartbeat](/fr/gateway/heartbeat)
## Échec dun outil sur un Node appairé
## Échec doutil Node appairé
Si un Node est appairé mais que les outils échouent, isolez létat de premier plan, de permission et dapprobation.
Si un Node est appairé mais que les outils échouent, isolez létat de premier plan, les autorisations et létat dapprobation.
```bash
openclaw nodes status
@ -426,20 +432,20 @@ openclaw logs --follow
openclaw status
```
Recherchez :
Recherchez :
- Node en ligne avec les capacités attendues.
- Permissions système accordées pour caméra/micro/localisation/écran.
- Approbations dexécution et état de la liste dautorisation.
- Autorisations OS accordées pour caméra/micro/localisation/écran.
- État des approbations exec et de lallowlist.
Signatures courantes :
Signatures courantes :
- `NODE_BACKGROUND_UNAVAILABLE` → lapp Node doit être au premier plan.
- `*_PERMISSION_REQUIRED` / `LOCATION_PERMISSION_REQUIRED`permission système manquante.
- `SYSTEM_RUN_DENIED: approval required` → approbation dexécution en attente.
- `SYSTEM_RUN_DENIED: allowlist miss` → commande bloquée par la liste dautorisation.
- `NODE_BACKGROUND_UNAVAILABLE` → lapplication Node doit être au premier plan.
- `*_PERMISSION_REQUIRED` / `LOCATION_PERMISSION_REQUIRED`autorisation OS manquante.
- `SYSTEM_RUN_DENIED: approval required` → approbation exec en attente.
- `SYSTEM_RUN_DENIED: allowlist miss` → commande bloquée par lallowlist.
Lié :
Liens associés :
- [/nodes/troubleshooting](/fr/nodes/troubleshooting)
- [/nodes/index](/fr/nodes/index)
@ -447,7 +453,7 @@ Lié :
## Échec de loutil navigateur
Utilisez cette section lorsque les actions de loutil navigateur échouent alors que le gateway lui-même est sain.
Utilisez ceci lorsque les actions de loutil navigateur échouent même si la Gateway elle-même est saine.
```bash
openclaw browser status
@ -457,44 +463,46 @@ openclaw logs --follow
openclaw doctor
```
Recherchez :
Recherchez :
- Si `plugins.allow` est défini et inclut `browser`.
- Un chemin dexécutable navigateur valide.
- Un chemin dexécutable du navigateur valide.
- Laccessibilité du profil CDP.
- La disponibilité de Chrome local pour les profils `existing-session` / `user`.
Signatures courantes :
Signatures courantes :
- `unknown command "browser"` ou `unknown command 'browser'` → le plugin navigateur inclus est exclu par `plugins.allow`.
- outil navigateur manquant / indisponible alors que `browser.enabled=true``plugins.allow` exclut `browser`, donc le plugin na jamais été chargé.
- `Failed to start Chrome CDP on port` → le processus navigateur na pas réussi à se lancer.
- `unknown command "browser"` ou `unknown command 'browser'` → le Plugin navigateur intégré est exclu par `plugins.allow`.
- outil navigateur manquant / indisponible alors que `browser.enabled=true``plugins.allow` exclut `browser`, donc le Plugin ne sest jamais chargé.
- `Failed to start Chrome CDP on port` → le processus du navigateur na pas réussi à se lancer.
- `browser.executablePath not found` → le chemin configuré est invalide.
- `browser.cdpUrl must be http(s) or ws(s)` → lURL CDP configurée utilise un schéma non pris en charge comme `file:` ou `ftp:`.
- `browser.cdpUrl has invalid port` → lURL CDP configurée a un port mauvais ou hors plage.
- `Could not find DevToolsActivePort for chrome` → la session existante Chrome MCP na pas encore pu sattacher au répertoire de données navigateur sélectionné. Ouvrez la page dinspection du navigateur, activez le débogage à distance, gardez le navigateur ouvert, approuvez la première demande dattachement, puis réessayez. Si létat connecté nest pas requis, préférez le profil géré `openclaw`.
- `No Chrome tabs found for profile="user"` → le profil dattachement Chrome MCP na aucun onglet Chrome local ouvert.
- `Remote CDP for profile "<name>" is not reachable` → le point de terminaison CDP distant configuré nest pas accessible depuis lhôte gateway.
- `Browser attachOnly is enabled ... not reachable` ou `Browser attachOnly is enabled and CDP websocket ... is not reachable` → le profil attach-only na aucune cible accessible, ou le point de terminaison HTTP a répondu mais le WebSocket CDP na toujours pas pu être ouvert.
- `Playwright is not available in this gateway build; '<feature>' is unsupported.` → linstallation actuelle du gateway ne dispose pas de la dépendance dexécution `playwright-core` du plugin navigateur inclus ; exécutez `openclaw doctor --fix`, puis redémarrez le gateway. Les instantanés ARIA et les captures décran de page de base peuvent encore fonctionner, mais la navigation, les instantanés IA, les captures décran déléments par sélecteur CSS et lexport PDF restent indisponibles.
- `fullPage is not supported for element screenshots` → la demande de capture décran mélange `--full-page` avec `--ref` ou `--element`.
- `element screenshots are not supported for existing-session profiles; use ref from snapshot.` → les appels de capture décran Chrome MCP / `existing-session` doivent utiliser une capture de page ou un `--ref` issu dun instantané, pas un `--element` CSS.
- `existing-session file uploads do not support element selectors; use ref/inputRef.` → les hooks denvoi de fichiers Chrome MCP nécessitent des refs dinstantané, pas des sélecteurs CSS.
- `browser.cdpUrl must be http(s) or ws(s)` → lURL CDP configurée utilise un schéma non pris en charge tel que `file:` ou `ftp:`.
- `browser.cdpUrl has invalid port` → lURL CDP configurée a un port incorrect ou hors plage.
- `Could not find DevToolsActivePort for chrome` → la session existante Chrome MCP na pas encore pu se rattacher au répertoire de données navigateur sélectionné. Ouvrez la page dinspection du navigateur, activez le débogage à distance, gardez le navigateur ouvert, approuvez la première invite de rattachement, puis réessayez. Si létat connecté nest pas requis, préférez le profil géré `openclaw`.
- `No Chrome tabs found for profile="user"` → le profil de rattachement Chrome MCP na aucun onglet Chrome local ouvert.
- `Remote CDP for profile "<name>" is not reachable` → le point de terminaison CDP distant configuré nest pas joignable depuis lhôte Gateway.
- `Browser attachOnly is enabled ... not reachable` ou `Browser attachOnly is enabled and CDP websocket ... is not reachable` → le profil attach-only na aucune cible joignable, ou le point de terminaison HTTP a répondu mais le WebSocket CDP na quand même pas pu être ouvert.
- `Playwright is not available in this gateway build; '<feature>' is unsupported.` → linstallation actuelle de Gateway na pas la dépendance runtime `playwright-core` du Plugin navigateur intégré ; exécutez `openclaw doctor --fix`, puis redémarrez Gateway. Les instantanés ARIA et les captures décran de page de base peuvent toujours fonctionner, mais la navigation, les instantanés IA, les captures décran délément par sélecteur CSS et lexport PDF restent indisponibles.
- `fullPage is not supported for element screenshots` → la requête de capture décran mélangeait `--full-page` avec `--ref` ou `--element`.
- `element screenshots are not supported for existing-session profiles; use ref from snapshot.` → les appels de capture décran Chrome MCP / `existing-session` doivent utiliser une capture de page ou un `--ref` dinstantané, pas un `--element` CSS.
- `existing-session file uploads do not support element selectors; use ref/inputRef.` → les hooks de téléversement Chrome MCP nécessitent des refs dinstantané, pas des sélecteurs CSS.
- `existing-session file uploads currently support one file at a time.` → envoyez un seul téléversement par appel sur les profils Chrome MCP.
- `existing-session dialog handling does not support timeoutMs.` → les hooks de dialogue sur les profils Chrome MCP ne prennent pas en charge les remplacements de délai.
- `existing-session dialog handling does not support timeoutMs.` → les hooks de boîte de dialogue sur les profils Chrome MCP ne prennent pas en charge les remplacements de délai dexpiration.
- `existing-session type does not support timeoutMs overrides.` → omettez `timeoutMs` pour `act:type` sur `profile="user"` / profils Chrome MCP `existing-session`, ou utilisez un profil navigateur géré/CDP lorsquun délai dexpiration personnalisé est requis.
- `existing-session evaluate does not support timeoutMs overrides.` → omettez `timeoutMs` pour `act:evaluate` sur `profile="user"` / profils Chrome MCP `existing-session`, ou utilisez un profil navigateur géré/CDP lorsquun délai dexpiration personnalisé est requis.
- `response body is not supported for existing-session profiles yet.``responsebody` nécessite encore un navigateur géré ou un profil CDP brut.
- remplacements obsolètes de viewport / mode sombre / locale / hors ligne sur des profils attach-only ou CDP distants → exécutez `openclaw browser stop --browser-profile <name>` pour fermer la session de contrôle active et libérer létat démulation Playwright/CDP sans redémarrer tout le gateway.
- remplacements persistants de viewport / mode sombre / paramètres régionaux / hors ligne sur les profils attach-only ou CDP distants → exécutez `openclaw browser stop --browser-profile <name>` pour fermer la session de contrôle active et libérer létat démulation Playwright/CDP sans redémarrer toute la Gateway.
Lié :
Liens associés :
- [/tools/browser-linux-troubleshooting](/fr/tools/browser-linux-troubleshooting)
- [/tools/browser](/fr/tools/browser)
## Si vous avez mis à niveau et que quelque chose sest soudainement cassé
La plupart des régressions après mise à niveau sont dues à une dérive de configuration ou à des valeurs par défaut plus strictes désormais appliquées.
La plupart des problèmes après mise à niveau viennent dune dérive de configuration ou de valeurs par défaut plus strictes désormais appliquées.
### 1) Le comportement dauthentification et de remplacement dURL a changé
### 1) Le comportement dauthentification et de surcharge dURL a changé
```bash
openclaw gateway status
@ -503,15 +511,15 @@ openclaw config get gateway.remote.url
openclaw config get gateway.auth.mode
```
Points à vérifier :
Ce quil faut vérifier :
- Si `gateway.mode=remote`, les appels CLI peuvent viser un service distant alors que votre service local fonctionne très bien.
- Les appels explicites avec `--url` ne retombent pas sur les identifiants stockés.
- Si `gateway.mode=remote`, les appels CLI peuvent cibler le distant alors que votre service local fonctionne bien.
- Les appels explicites `--url` ne reviennent pas aux identifiants stockés.
Signatures courantes :
Signatures courantes :
- `gateway connect failed:`mauvaise URL cible.
- `unauthorized` → point de terminaison accessible mais mauvaise authentification.
- `gateway connect failed:`cible URL incorrecte.
- `unauthorized` → point de terminaison joignable mais authentification incorrecte.
### 2) Les garde-fous de liaison et dauthentification sont plus stricts
@ -523,15 +531,15 @@ openclaw gateway status
openclaw logs --follow
```
Points à vérifier :
Ce quil faut vérifier :
- Les liaisons non loopback (`lan`, `tailnet`, `custom`) nécessitent un chemin dauthentification gateway valide : authentification par jeton/mot de passe partagé, ou déploiement `trusted-proxy` non-loopback correctement configuré.
- Les liaisons non loopback (`lan`, `tailnet`, `custom`) nécessitent un chemin dauthentification Gateway valide : authentification par jeton partagé/mot de passe, ou déploiement `trusted-proxy` non loopback correctement configuré.
- Les anciennes clés comme `gateway.token` ne remplacent pas `gateway.auth.token`.
Signatures courantes :
Signatures courantes :
- `refusing to bind gateway ... without auth` → liaison non-loopback sans chemin dauthentification gateway valide.
- `Connectivity probe: failed` alors que le runtime est actif → le gateway est vivant mais inaccessible avec lauthentification/lURL actuelles.
- `refusing to bind gateway ... without auth` → liaison non loopback sans chemin dauthentification Gateway valide.
- `Connectivity probe: failed` alors que le runtime est en cours dexécution → Gateway est active mais inaccessible avec lauthentification/lURL actuelle.
### 3) Létat dappairage et didentité dappareil a changé
@ -542,30 +550,30 @@ openclaw logs --follow
openclaw doctor
```
Points à vérifier :
Ce quil faut vérifier :
- Approbations dappareil en attente pour le tableau de bord/les Node.
- Approbations dappairage de message privé en attente après des changements de politique ou didentité.
- Approbations dappareil en attente pour dashboard/nodes.
- Approbations dappairage DM en attente après des changements de stratégie ou didentité.
Signatures courantes :
Signatures courantes :
- `device identity required`lauthentification de lappareil nest pas satisfaite.
- `device identity required`authentification dappareil non satisfaite.
- `pairing required` → lexpéditeur/lappareil doit être approuvé.
Si la configuration du service et le runtime sont toujours en désaccord après ces vérifications, réinstallez les métadonnées du service à partir du même répertoire profil/état :
Si la configuration du service et le runtime sont toujours en désaccord après les vérifications, réinstallez les métadonnées du service à partir du même répertoire de profil/détat :
```bash
openclaw gateway install --force
openclaw gateway restart
```
Lié :
Liens associés :
- [/gateway/pairing](/fr/gateway/pairing)
- [/gateway/authentication](/fr/gateway/authentication)
- [/gateway/background-process](/fr/gateway/background-process)
## Lié
## Liens associés
- [Runbook Gateway](/fr/gateway)
- [Doctor](/fr/gateway/doctor)

File diff suppressed because it is too large Load Diff

View File

@ -1,103 +1,111 @@
---
read_when:
- Vous voulez utiliser le harnais app-server Codex intégré
- Vous avez besoin de références de modèles Codex et dexemples de configuration
- Vous voulez désactiver le repli PI pour les déploiements Codex uniquement
summary: Exécuter des tours dagent embarqué OpenClaw via le harnais app-server Codex intégré
title: Harnais Codex
- Vous souhaitez utiliser le harnais app-server Codex groupé
- Vous avez besoin de références de modèle Codex et dexemples de configuration
- Vous souhaitez désactiver le repli Pi pour les déploiements Codex uniquement
summary: Exécutez les tours de lagent intégré OpenClaw via le harnais app-server Codex groupé
title: harnais Codex
x-i18n:
generated_at: "2026-04-24T07:22:05Z"
generated_at: "2026-04-24T08:57:10Z"
model: gpt-5.4
provider: openai
source_hash: 095933d2c32df302c312c67fdc266d2f01b552dddb1607d6e4ecc4f3c3326acf
source_hash: c02b1e6cbaaefee858db7ebd7e306261683278ed9375bca6fe74855ca84eabd8
source_path: plugins/codex-harness.md
workflow: 15
---
Le Plugin `codex` intégré permet à OpenClaw dexécuter des tours dagent embarqué via le
serveur dapplication Codex au lieu du harnais PI intégré.
Le Plugin `codex` groupé permet à OpenClaw dexécuter des tours dagent intégrés via lapp-server Codex au lieu du harnais PI intégré.
Utilisez cela lorsque vous voulez que Codex possède la session dagent de bas niveau : découverte de modèles, reprise native de fil, Compaction native et exécution du serveur dapplication.
OpenClaw reste responsable des canaux de chat, des fichiers de session, de la sélection de modèle, des outils,
des approbations, de la livraison des médias et du miroir de transcription visible.
Utilisez ceci lorsque vous souhaitez que Codex prenne en charge la session dagent de bas niveau : découverte des modèles, reprise native de thread, Compaction native et exécution par app-server.
OpenClaw continue de gérer les canaux de chat, les fichiers de session, la sélection de modèle, les outils,
les approbations, la livraison des médias et le miroir visible de la transcription.
Les tours Codex natifs conservent les hooks de Plugin OpenClaw comme couche publique de compatibilité.
Il sagit de hooks OpenClaw en processus, pas des hooks de commande `hooks.json` de Codex :
Les tours Codex natifs conservent les hooks de Plugin OpenClaw comme couche de compatibilité publique.
Il sagit de hooks OpenClaw en cours de processus, et non de hooks de commande `hooks.json` de Codex :
- `before_prompt_build`
- `before_compaction`, `after_compaction`
- `llm_input`, `llm_output`
- `after_tool_call`
- `before_message_write` pour les enregistrements miroir de transcription
- `before_message_write` pour les enregistrements de transcription en miroir
- `agent_end`
Les plugins intégrés peuvent aussi enregistrer une fabrique dextension de serveur dapplication Codex pour ajouter un middleware asynchrone `tool_result`. Ce middleware sexécute pour les outils dynamiques OpenClaw après quOpenClaw a exécuté loutil et avant que le résultat ne soit renvoyé à Codex. Il est distinct du hook public de Plugin `tool_result_persist`, qui transforme les écritures de résultats doutils détenues par OpenClaw dans la transcription.
Les plugins groupés peuvent également enregistrer une fabrique dextension dapp-server Codex pour ajouter
un middleware asynchrone `tool_result`. Ce middleware sexécute pour les outils dynamiques OpenClaw
après quOpenClaw a exécuté loutil et avant que le résultat ne soit renvoyé à Codex. Il
est distinct du hook de Plugin public `tool_result_persist`, qui transforme les écritures de résultat doutil dans la transcription gérée par OpenClaw.
Le harnais est désactivé par défaut. Les nouvelles configurations doivent conserver les références de modèles OpenAI sous la forme canonique `openai/gpt-*` et forcer explicitement
Le harnais est désactivé par défaut. Les nouvelles configurations doivent conserver les références de modèle OpenAI
canoniques sous la forme `openai/gpt-*` et forcer explicitement
`embeddedHarness.runtime: "codex"` ou `OPENCLAW_AGENT_RUNTIME=codex` lorsquelles
veulent une exécution native du serveur dapplication. Les anciennes références de modèles `codex/*` sélectionnent encore automatiquement le harnais pour compatibilité.
souhaitent une exécution native par app-server. Les anciennes références de modèle `codex/*` sélectionnent toujours automatiquement
le harnais pour des raisons de compatibilité.
## Choisir le bon préfixe de modèle
Les routes de la famille OpenAI dépendent du préfixe. Utilisez `openai-codex/*` lorsque vous voulez
lOAuth Codex via PI ; utilisez `openai/*` lorsque vous voulez un accès direct à lAPI OpenAI ou
lorsque vous forcez le harnais natif du serveur dapplication Codex :
lauthentification OAuth Codex via PI ; utilisez `openai/*` lorsque vous voulez un accès direct à lAPI OpenAI ou
lorsque vous forcez le harnais app-server Codex natif :
| Réf. de modèle | Chemin dexécution | Utiliser lorsque |
| ------------------------------------------------------ | -------------------------------------------- | -------------------------------------------------------------------------- |
| `openai/gpt-5.4` | Fournisseur OpenAI via la plomberie OpenClaw/PI | Vous voulez laccès direct actuel à lAPI OpenAI Platform avec `OPENAI_API_KEY`. |
| `openai-codex/gpt-5.5` | OAuth OpenAI Codex via OpenClaw/PI | Vous voulez lauthentification par abonnement ChatGPT/Codex avec lexécuteur PI par défaut. |
| `openai/gpt-5.5` + `embeddedHarness.runtime: "codex"` | Harnais serveur dapplication Codex | Vous voulez une exécution native du serveur dapplication Codex pour le tour dagent embarqué. |
| Référence de modèle | Chemin dexécution | À utiliser lorsque |
| ---------------------------------------------------- | --------------------------------------------- | ------------------------------------------------------------------------- |
| `openai/gpt-5.4` | Fournisseur OpenAI via le pipeline OpenClaw/PI | Vous voulez laccès direct actuel à lAPI OpenAI Platform avec `OPENAI_API_KEY`. |
| `openai-codex/gpt-5.5` | OAuth OpenAI Codex via OpenClaw/PI | Vous voulez lauthentification par abonnement ChatGPT/Codex avec lexécuteur PI par défaut. |
| `openai/gpt-5.5` + `embeddedHarness.runtime: "codex"` | Harnais app-server Codex | Vous voulez une exécution native par app-server Codex pour le tour dagent intégré. |
GPT-5.5 est actuellement uniquement disponible via abonnement/OAuth dans OpenClaw. Utilisez
`openai-codex/gpt-5.5` pour lOAuth PI, ou `openai/gpt-5.5` avec le harnais du
serveur dapplication Codex. Laccès direct par clé API à `openai/gpt-5.5` est pris en charge
GPT-5.5 est actuellement disponible dans OpenClaw uniquement via abonnement/OAuth. Utilisez
`openai-codex/gpt-5.5` pour lOAuth PI, ou `openai/gpt-5.5` avec le harnais
app-server Codex. Laccès direct par clé API pour `openai/gpt-5.5` est pris en charge
une fois quOpenAI active GPT-5.5 sur lAPI publique.
Les anciennes références `codex/gpt-*` restent acceptées comme alias de compatibilité. Les nouvelles configurations PI
Codex OAuth doivent utiliser `openai-codex/gpt-*` ; les nouvelles configurations du harnais natif du serveur dapplication
doivent utiliser `openai/gpt-*` plus `embeddedHarness.runtime:
Les anciennes références `codex/gpt-*` restent acceptées comme alias de compatibilité. Les nouvelles configurations
dOAuth PI Codex doivent utiliser `openai-codex/gpt-*` ; les nouvelles configurations de harnais app-server
natif doivent utiliser `openai/gpt-*` avec `embeddedHarness.runtime:
"codex"`.
`agents.defaults.imageModel` suit la même séparation par préfixe. Utilisez
`openai-codex/gpt-*` lorsque la compréhension dimage doit passer par le chemin du fournisseur OpenAI
Codex OAuth. Utilisez `codex/gpt-*` lorsque la compréhension dimage doit passer
par un tour borné du serveur dapplication Codex. Le modèle Codex du serveur dapplication doit
annoncer la prise en charge des entrées image ; les modèles Codex texte uniquement échouent avant le début du tour média.
`openai-codex/gpt-*` lorsque lanalyse dimage doit passer par le chemin du fournisseur OAuth OpenAI
Codex. Utilisez `codex/gpt-*` lorsque lanalyse dimage doit sexécuter
dans un tour dapp-server Codex borné. Le modèle app-server Codex doit
annoncer la prise en charge des entrées image ; les modèles Codex texte seul échouent avant le début
du tour média.
Utilisez `/status` pour confirmer le harnais effectif de la session actuelle. Si la
sélection est surprenante, activez la journalisation de débogage pour le sous-système `agents/harness`
et inspectez lenregistrement structuré `agent harness selected` du gateway. Il
inclut lID du harnais sélectionné, la raison de sélection, la politique dexécution/de repli, et,
sélection vous surprend, activez la journalisation de débogage pour le sous-système `agents/harness`
et inspectez lenregistrement structuré `agent harness selected` de la Gateway. Il
inclut lidentifiant du harnais sélectionné, la raison de la sélection, la politique dexécution/repli et,
en mode `auto`, le résultat de prise en charge de chaque candidat Plugin.
La sélection de harnais nest pas un contrôle dynamique de session active. Lorsquun tour embarqué sexécute,
OpenClaw enregistre lID du harnais sélectionné sur cette session et continue à lutiliser pour les
tours ultérieurs du même ID de session. Modifiez la configuration `embeddedHarness` ou
La sélection du harnais nest pas un contrôle de session en direct. Lorsquun tour intégré sexécute,
OpenClaw enregistre lidentifiant du harnais sélectionné sur cette session et continue à lutiliser pour
les tours ultérieurs du même identifiant de session. Modifiez la configuration `embeddedHarness` ou
`OPENCLAW_AGENT_RUNTIME` lorsque vous voulez que les futures sessions utilisent un autre harnais ;
utilisez `/new` ou `/reset` pour démarrer une nouvelle session avant de basculer une conversation existante entre PI et Codex. Cela évite de relire une même transcription à travers deux systèmes natifs de session incompatibles.
utilisez `/new` ou `/reset` pour démarrer une nouvelle session avant de faire basculer une conversation existante entre PI et Codex. Cela évite de rejouer une même transcription dans
deux systèmes de session natifs incompatibles.
Les anciennes sessions créées avant lépinglage du harnais sont traitées comme épinglées PI une fois quelles ont un historique de transcription. Utilisez `/new` ou `/reset` pour faire adhérer cette conversation à Codex après changement de configuration.
Les anciennes sessions créées avant lépinglage du harnais sont traitées comme épinglées à PI dès quelles
ont un historique de transcription. Utilisez `/new` ou `/reset` pour faire passer cette conversation à
Codex après avoir modifié la configuration.
`/status` affiche le harnais effectif non-PI à côté de `Fast`, par exemple
`Fast · codex`. Le harnais PI par défaut reste `Runner: pi (embedded)` et najoute
pas de badge de harnais séparé.
`Fast · codex`. Le harnais PI par défaut reste `Runner: pi (embedded)` et
najoute pas de badge de harnais séparé.
## Exigences
## Prérequis
- OpenClaw avec le Plugin `codex` intégré disponible.
- Serveur dapplication Codex `0.118.0` ou plus récent.
- Authentification Codex disponible pour le processus du serveur dapplication.
- OpenClaw avec le Plugin `codex` groupé disponible.
- App-server Codex `0.118.0` ou version ultérieure.
- Authentification Codex disponible pour le processus app-server.
Le Plugin bloque les handshakes de serveur dapplication plus anciens ou sans version. Cela permet à
OpenClaw de rester sur la surface de protocole avec laquelle il a été testé.
Le Plugin bloque les handshakes dapp-server plus anciens ou non versionnés. Cela permet de maintenir
OpenClaw sur la surface de protocole avec laquelle il a été testé.
Pour les tests smoke live et Docker, lauthentification provient généralement de `OPENAI_API_KEY`, plus des fichiers CLI Codex facultatifs comme `~/.codex/auth.json` et
`~/.codex/config.toml`. Utilisez les mêmes éléments dauthentification que ceux de votre serveur dapplication Codex local.
Pour les tests smoke en direct et dans Docker, lauthentification provient généralement de `OPENAI_API_KEY`, plus des fichiers optionnels de CLI Codex tels que `~/.codex/auth.json` et
`~/.codex/config.toml`. Utilisez les mêmes éléments dauthentification que votre app-server Codex locale.
## Configuration minimale
Utilisez `openai/gpt-5.5`, activez le Plugin intégré et forcez le harnais `codex` :
Utilisez `openai/gpt-5.5`, activez le Plugin groupé et forcez le harnais `codex` :
```json5
{
@ -120,7 +128,7 @@ Utilisez `openai/gpt-5.5`, activez le Plugin intégré et forcez le harnais `cod
}
```
Si votre configuration utilise `plugins.allow`, incluez-y aussi `codex` :
Si votre configuration utilise `plugins.allow`, incluez également `codex` :
```json5
{
@ -136,8 +144,8 @@ Si votre configuration utilise `plugins.allow`, incluez-y aussi `codex` :
```
Les anciennes configurations qui définissent `agents.defaults.model` ou un modèle dagent sur
`codex/<model>` activent encore automatiquement le Plugin `codex` intégré. Les nouvelles configurations doivent
préférer `openai/<model>` plus lentrée explicite `embeddedHarness` ci-dessus.
`codex/<model>` activent toujours automatiquement le Plugin `codex` groupé. Les nouvelles configurations doivent
préférer `openai/<model>` avec lentrée `embeddedHarness` explicite ci-dessus.
## Ajouter Codex sans remplacer les autres modèles
@ -173,15 +181,15 @@ les agents qui doivent utiliser le harnais.
}
```
Avec cette forme :
Avec cette structure :
- `/model gpt` ou `/model openai/gpt-5.5` utilise le harnais du serveur dapplication Codex pour cette configuration.
- `/model gpt` ou `/model openai/gpt-5.5` utilise le harnais app-server Codex pour cette configuration.
- `/model opus` utilise le chemin du fournisseur Anthropic.
- Si un modèle non-Codex est sélectionné, PI reste le harnais de compatibilité.
## Déploiements Codex uniquement
Désactivez le repli PI lorsque vous devez prouver que chaque tour dagent embarqué utilise
Désactivez le repli PI lorsque vous devez prouver que chaque tour dagent intégré utilise
le harnais Codex :
```json5
@ -198,7 +206,7 @@ le harnais Codex :
}
```
Remplacement par environnement :
Surcharge denvironnement :
```bash
OPENCLAW_AGENT_RUNTIME=codex \
@ -206,13 +214,13 @@ OPENCLAW_AGENT_HARNESS_FALLBACK=none \
openclaw gateway run
```
Avec le repli désactivé, OpenClaw échoue immédiatement si le Plugin Codex est désactivé,
si le serveur dapplication est trop ancien, ou sil ne peut pas démarrer.
Avec le repli désactivé, OpenClaw échoue rapidement si le Plugin Codex est désactivé,
si lapp-server est trop ancien ou si lapp-server ne peut pas démarrer.
## Codex par agent
Vous pouvez rendre un agent Codex-only tandis que lagent par défaut conserve la
sélection automatique normale :
Vous pouvez rendre un agent Codex uniquement tandis que lagent par défaut conserve
la sélection automatique normale :
```json5
{
@ -243,21 +251,21 @@ sélection automatique normale :
}
```
Utilisez les commandes de session et de modèle normales pour changer dagent et de modèle. `/new` crée une nouvelle
session OpenClaw et le harnais Codex crée ou reprend son fil sidecar de serveur dapplication
si nécessaire. `/reset` efface la liaison de session OpenClaw pour ce fil
et laisse le tour suivant résoudre de nouveau le harnais depuis la configuration actuelle.
Utilisez les commandes de session normales pour changer dagent et de modèle. `/new` crée une nouvelle
session OpenClaw et le harnais Codex crée ou reprend son thread app-server sidecar
selon les besoins. `/reset` efface lassociation de session OpenClaw pour ce thread
et permet au tour suivant de résoudre à nouveau le harnais à partir de la configuration actuelle.
## Discovery de modèle
## Découverte des modèles
Par défaut, le Plugin Codex interroge le serveur dapplication pour connaître les modèles disponibles. Si la
discovery échoue ou expire, il utilise un catalogue de repli intégré pour :
Par défaut, le Plugin Codex interroge lapp-server pour obtenir les modèles disponibles. Si
la découverte échoue ou expire, il utilise un catalogue de repli groupé pour :
- GPT-5.5
- GPT-5.4 mini
- GPT-5.2
Vous pouvez ajuster la discovery sous `plugins.entries.codex.config.discovery` :
Vous pouvez ajuster la découverte sous `plugins.entries.codex.config.discovery` :
```json5
{
@ -277,8 +285,8 @@ Vous pouvez ajuster la discovery sous `plugins.entries.codex.config.discovery` :
}
```
Désactivez la discovery lorsque vous voulez que le démarrage évite de sonder Codex et sen tienne au
catalogue de repli :
Désactivez la découverte lorsque vous voulez que le démarrage évite de sonder Codex et sen tienne
au catalogue de repli :
```json5
{
@ -297,7 +305,7 @@ catalogue de repli :
}
```
## Connexion au serveur dapplication et politique
## Connexion et politique de lapp-server
Par défaut, le Plugin démarre Codex localement avec :
@ -305,13 +313,13 @@ Par défaut, le Plugin démarre Codex localement avec :
codex app-server --listen stdio://
```
Par défaut, OpenClaw démarre les sessions locales du harnais Codex en mode YOLO :
`approvalPolicy: "never"`, `approvalsReviewer: "user"`, et
`sandbox: "danger-full-access"`. Il sagit de la posture locale dopérateur de confiance utilisée
pour les Heartbeats autonomes : Codex peut utiliser les outils shell et réseau sans
sarrêter sur des invites dapprobation natives auxquelles personne nest présent pour répondre.
Par défaut, OpenClaw démarre les sessions de harnais Codex locales en mode YOLO :
`approvalPolicy: "never"`, `approvalsReviewer: "user"` et
`sandbox: "danger-full-access"`. Il sagit de la posture dopérateur local de confiance utilisée
pour les Heartbeat autonomes : Codex peut utiliser les outils shell et réseau sans
sarrêter sur des invites dapprobation natives auxquelles personne nest pour répondre.
Pour adhérer explicitement aux approbations relues par guardian de Codex, définissez `appServer.mode:
Pour activer les approbations Codex relues par Guardian, définissez `appServer.mode:
"guardian"` :
```json5
@ -332,11 +340,11 @@ Pour adhérer explicitement aux approbations relues par guardian de Codex, défi
}
```
Guardian est un relecteur natif dapprobations Codex. Lorsque Codex demande à sortir du sandbox, écrire hors de lespace de travail, ou ajouter des permissions comme laccès réseau, Codex route cette demande dapprobation vers un sous-agent relecteur au lieu dun prompt humain. Le relecteur applique le cadre de risque de Codex et approuve ou refuse la demande spécifique. Utilisez Guardian lorsque vous voulez plus de garde-fous que le mode YOLO mais avez encore besoin que des agents non supervisés puissent progresser.
Guardian est un réviseur dapprobation natif Codex. Lorsque Codex demande à sortir de la sandbox, à écrire hors de lespace de travail ou à ajouter des autorisations comme laccès réseau, Codex achemine cette demande dapprobation vers un sous-agent réviseur au lieu dune invite humaine. Le réviseur applique le cadre de risque de Codex et approuve ou refuse la demande spécifique. Utilisez Guardian lorsque vous voulez davantage de garde-fous que le mode YOLO tout en ayant besoin que des agents sans supervision puissent continuer à progresser.
Le préréglage `guardian` se développe en `approvalPolicy: "on-request"`, `approvalsReviewer: "guardian_subagent"`, et `sandbox: "workspace-write"`. Les champs de politique individuels remplacent toujours `mode`, de sorte que les déploiements avancés peuvent combiner le préréglage avec des choix explicites.
Le préréglage `guardian` sétend à `approvalPolicy: "on-request"`, `approvalsReviewer: "guardian_subagent"` et `sandbox: "workspace-write"`. Les champs de politique individuels remplacent toujours `mode`, afin que les déploiements avancés puissent combiner le préréglage avec des choix explicites.
Pour un serveur dapplication déjà en cours dexécution, utilisez le transport WebSocket :
Pour un app-server déjà en cours dexécution, utilisez le transport WebSocket :
```json5
{
@ -360,22 +368,22 @@ Pour un serveur dapplication déjà en cours dexécution, utilisez le tran
Champs `appServer` pris en charge :
| Champ | Valeur par défaut | Signification |
| ------------------- | ------------------------------------------ | ----------------------------------------------------------------------------------------------------- |
| `transport` | `"stdio"` | `"stdio"` lance Codex ; `"websocket"` se connecte à `url`. |
| `command` | `"codex"` | Exécutable pour le transport stdio. |
| `args` | `["app-server", "--listen", "stdio://"]` | Arguments pour le transport stdio. |
| `url` | non défini | URL WebSocket du serveur dapplication. |
| `authToken` | non défini | Jeton Bearer pour le transport WebSocket. |
| `headers` | `{}` | En-têtes WebSocket supplémentaires. |
| `requestTimeoutMs` | `60000` | Délai dexpiration pour les appels de plan de contrôle au serveur dapplication. |
| `mode` | `"yolo"` | Préréglage pour exécution YOLO ou relue par guardian. |
| `approvalPolicy` | `"never"` | Politique native dapprobation Codex envoyée au démarrage/reprise/tour de fil. |
| `sandbox` | `"danger-full-access"` | Mode de sandbox Codex natif envoyé au démarrage/reprise de fil. |
| `approvalsReviewer` | `"user"` | Utilisez `"guardian_subagent"` pour laisser Codex Guardian relire les prompts. |
| `serviceTier` | non défini | Niveau de service facultatif du serveur dapplication Codex : `"fast"`, `"flex"`, ou `null`. Les anciennes valeurs invalides sont ignorées. |
| Champ | Valeur par défaut | Signification |
| ------------------- | ---------------------------------------- | --------------------------------------------------------------------------------------------------------- |
| `transport` | `"stdio"` | `"stdio"` lance Codex ; `"websocket"` se connecte à `url`. |
| `command` | `"codex"` | Exécutable pour le transport stdio. |
| `args` | `["app-server", "--listen", "stdio://"]` | Arguments pour le transport stdio. |
| `url` | non défini | URL WebSocket de lapp-server. |
| `authToken` | non défini | Jeton Bearer pour le transport WebSocket. |
| `headers` | `{}` | En-têtes WebSocket supplémentaires. |
| `requestTimeoutMs` | `60000` | Délai dexpiration pour les appels au plan de contrôle de lapp-server. |
| `mode` | `"yolo"` | Préréglage pour lexécution YOLO ou relue par Guardian. |
| `approvalPolicy` | `"never"` | Politique dapprobation Codex native envoyée au démarrage, à la reprise et au tour du thread. |
| `sandbox` | `"danger-full-access"` | Mode sandbox Codex natif envoyé au démarrage et à la reprise du thread. |
| `approvalsReviewer` | `"user"` | Utilisez `"guardian_subagent"` pour laisser Codex Guardian relire les invites. |
| `serviceTier` | non défini | Niveau de service optionnel de lapp-server Codex : `"fast"`, `"flex"` ou `null`. Les anciennes valeurs invalides sont ignorées. |
Les anciennes variables denvironnement fonctionnent toujours comme replis pour les tests locaux lorsque
Les anciennes variables denvironnement fonctionnent toujours comme solutions de repli pour les tests locaux lorsque
le champ de configuration correspondant nest pas défini :
- `OPENCLAW_CODEX_APP_SERVER_BIN`
@ -384,15 +392,15 @@ le champ de configuration correspondant nest pas défini :
- `OPENCLAW_CODEX_APP_SERVER_APPROVAL_POLICY`
- `OPENCLAW_CODEX_APP_SERVER_SANDBOX`
`OPENCLAW_CODEX_APP_SERVER_GUARDIAN=1` a été supprimé. Utilisez
`OPENCLAW_CODEX_APP_SERVER_GUARDIAN=1` a été supprimée. Utilisez
`plugins.entries.codex.config.appServer.mode: "guardian"` à la place, ou
`OPENCLAW_CODEX_APP_SERVER_MODE=guardian` pour un test local ponctuel. La configuration est
préférée pour les déploiements reproductibles car elle conserve le comportement du Plugin dans le
même fichier revu que le reste de la configuration du harnais Codex.
préférable pour les déploiements reproductibles, car elle conserve le comportement du Plugin dans le
même fichier relu que le reste de la configuration du harnais Codex.
## Recettes courantes
Codex local avec transport stdio par défaut :
Codex local avec le transport stdio par défaut :
```json5
{
@ -406,7 +414,7 @@ Codex local avec transport stdio par défaut :
}
```
Validation de harnais Codex-only, avec repli PI désactivé :
Validation du harnais Codex uniquement, avec repli PI désactivé :
```json5
{
@ -423,7 +431,7 @@ Validation de harnais Codex-only, avec repli PI désactivé :
}
```
Approbations Codex relues par guardian :
Approvals Codex relues par Guardian :
```json5
{
@ -445,7 +453,7 @@ Approbations Codex relues par guardian :
}
```
Serveur dapplication distant avec en-têtes explicites :
App-server distant avec en-têtes explicites :
```json5
{
@ -469,116 +477,126 @@ Serveur dapplication distant avec en-têtes explicites :
```
Le changement de modèle reste contrôlé par OpenClaw. Lorsquune session OpenClaw est attachée
à un fil Codex existant, le tour suivant envoie de nouveau au
serveur dapplication le modèle OpenAI actuellement sélectionné, le fournisseur, la politique dapprobation, le sandbox et le niveau de service.
Passer de `openai/gpt-5.5` à `openai/gpt-5.2` conserve la
liaison de fil mais demande à Codex de continuer avec le modèle nouvellement sélectionné.
à un thread Codex existant, le tour suivant renvoie le modèle
OpenAI actuellement sélectionné, le fournisseur, la politique dapprobation, la sandbox et le niveau de service à
lapp-server. Passer de `openai/gpt-5.5` à `openai/gpt-5.2` conserve
lassociation au thread mais demande à Codex de continuer avec le modèle nouvellement sélectionné.
## Commande Codex
Le Plugin intégré enregistre `/codex` comme commande slash autorisée. Elle est
générique et fonctionne sur tout canal prenant en charge les commandes texte OpenClaw.
Le Plugin groupé enregistre `/codex` comme commande slash autorisée. Elle est
générique et fonctionne sur nimporte quel canal prenant en charge les commandes texte OpenClaw.
Formes courantes :
- `/codex status` affiche la connectivité live du serveur dapplication, les modèles, le compte, les limites de débit, les serveurs MCP et les Skills.
- `/codex models` liste les modèles live du serveur dapplication Codex.
- `/codex threads [filter]` liste les fils Codex récents.
- `/codex resume <thread-id>` attache la session OpenClaw actuelle à un fil Codex existant.
- `/codex compact` demande au serveur dapplication Codex de compacter le fil attaché.
- `/codex review` démarre une revue native Codex pour le fil attaché.
- `/codex account` affiche le compte et létat des limites de débit.
- `/codex mcp` liste létat des serveurs MCP du serveur dapplication Codex.
- `/codex skills` liste les Skills du serveur dapplication Codex.
- `/codex status` affiche la connectivité en direct à lapp-server, les modèles, le compte, les limites de débit, les serveurs MCP et les Skills.
- `/codex models` liste les modèles de lapp-server Codex en direct.
- `/codex threads [filter]` liste les threads Codex récents.
- `/codex resume <thread-id>` attache la session OpenClaw actuelle à un thread Codex existant.
- `/codex compact` demande à lapp-server Codex de compacter le thread attaché.
- `/codex review` démarre la revue native Codex pour le thread attaché.
- `/codex account` affiche létat du compte et des limites de débit.
- `/codex mcp` liste létat des serveurs MCP de lapp-server Codex.
- `/codex skills` liste les Skills de lapp-server Codex.
`/codex resume` écrit le même fichier de liaison sidecar que celui utilisé par le harnais pour les
tours normaux. Au message suivant, OpenClaw reprend ce fil Codex, transmet le
modèle OpenClaw actuellement sélectionné au serveur dapplication, et garde lhistorique étendu
`/codex resume` écrit le même fichier dassociation sidecar que celui utilisé par le harnais pour
les tours normaux. Au message suivant, OpenClaw reprend ce thread Codex, transmet le
modèle OpenClaw actuellement sélectionné à lapp-server et conserve lhistorique étendu
activé.
La surface de commande exige un serveur dapplication Codex `0.118.0` ou plus récent. Les méthodes de
La surface de commande nécessite lapp-server Codex `0.118.0` ou version ultérieure. Les méthodes de
contrôle individuelles sont signalées comme `unsupported by this Codex app-server` si un
serveur dapplication futur ou personnalisé nexpose pas cette méthode JSON-RPC.
app-server futur ou personnalisé nexpose pas cette méthode JSON-RPC.
## Frontières des hooks
## Limites des hooks
Le harnais Codex comporte trois couches de hooks :
| Couche | Propriétaire | But |
| --------------------------------------- | ------------------------- | ------------------------------------------------------------------- |
| Hooks de Plugin OpenClaw | OpenClaw | Compatibilité produit/Plugin entre les harnais PI et Codex. |
| Middleware dextension du serveur dapplication Codex | Plugins intégrés OpenClaw | Comportement dadaptation par tour autour des outils dynamiques OpenClaw. |
| Hooks natifs Codex | Codex | Cycle de vie bas niveau de Codex et politique doutils natifs depuis la configuration Codex. |
| Couche | Propriétaire | But |
| ------------------------------------- | ------------------------ | ------------------------------------------------------------------- |
| Hooks de Plugin OpenClaw | OpenClaw | Compatibilité produit/plugin entre les harnais PI et Codex. |
| Middleware dextension dapp-server Codex | Plugins groupés OpenClaw | Comportement dadaptateur par tour autour des outils dynamiques OpenClaw. |
| Hooks natifs Codex | Codex | Cycle de vie Codex de bas niveau et politique doutil native depuis la configuration Codex. |
OpenClaw nutilise pas les fichiers de projet ou globaux `hooks.json` de Codex pour router le
comportement des plugins OpenClaw. Les hooks natifs Codex sont utiles pour les opérations
détenues par Codex telles que la politique shell, la revue native des résultats doutils, la gestion de larrêt, et le cycle de vie natif de Compaction/modèle, mais ils ne constituent pas lAPI de Plugin OpenClaw.
OpenClaw nutilise pas les fichiers `hooks.json` de projet ou globaux de Codex pour acheminer
le comportement des plugins OpenClaw. Les hooks natifs Codex sont utiles pour les opérations
gérées par Codex, telles que la politique shell, la revue native des résultats doutil, la gestion des arrêts et
le cycle de vie natif de Compaction/modèle, mais ils ne constituent pas lAPI de Plugin OpenClaw.
Pour les outils dynamiques OpenClaw, OpenClaw exécute loutil après que Codex a demandé
lappel, donc OpenClaw déclenche le comportement de Plugin et de middleware quil possède dans ladaptateur
de harnais. Pour les outils natifs Codex, Codex possède lenregistrement canonique de loutil.
OpenClaw peut refléter certains événements, mais il ne peut pas réécrire le fil natif Codex
à moins que Codex nexpose cette opération via le serveur dapplication ou des callbacks de hook natifs.
lappel ; OpenClaw déclenche donc le comportement de Plugin et de middleware quil possède dans
ladaptateur de harnais. Pour les outils natifs Codex, Codex possède lenregistrement canonique de loutil.
OpenClaw peut mettre en miroir certains événements, mais il ne peut pas réécrire le thread Codex natif
à moins que Codex nexpose cette opération via lapp-server ou des callbacks de hook natifs.
Lorsque de nouvelles versions du serveur dapplication Codex exposeront des événements natifs de hook pour la Compaction et le cycle de vie du modèle, OpenClaw devra version-garder cette prise en charge du protocole et mapper les
événements vers le contrat de hook OpenClaw existant lorsque la sémantique est honnête.
Jusquà alors, les événements `before_compaction`, `after_compaction`, `llm_input`, et
`llm_output` dOpenClaw sont des observations au niveau adaptateur, pas des captures octet pour octet
Lorsque de nouvelles versions de lapp-server Codex exposeront des événements de hook natifs pour le cycle de vie de Compaction et du modèle,
OpenClaw devra restreindre la prise en charge de ce protocole par version et mapper les
événements vers le contrat de hook OpenClaw existant lorsque la sémantique est fidèle.
Jusque-là, les événements `before_compaction`, `after_compaction`, `llm_input` et
`llm_output` dOpenClaw sont des observations au niveau de ladaptateur, et non des captures octet pour octet
de la requête interne de Codex ou de la charge utile de Compaction.
Les notifications dapp-server natives Codex `hook/started` et `hook/completed` sont
projetées en tant quévénements dagent `codex_app_server.hook` pour la trajectoire et le débogage.
Elles ninvoquent pas les hooks de Plugin OpenClaw.
## Outils, médias et Compaction
Le harnais Codex ne change que lexécuteur dagent embarqué de bas niveau.
Le harnais Codex modifie uniquement lexécuteur dagent intégré de bas niveau.
OpenClaw construit toujours la liste doutils et reçoit les résultats doutils dynamiques depuis le
harnais. Le texte, les images, la vidéo, la musique, le TTS, les approbations et la sortie des outils de messagerie
continuent de passer par le chemin normal de livraison OpenClaw.
OpenClaw continue de construire la liste doutils et de recevoir les résultats des outils dynamiques depuis le
harnais. Le texte, les images, la vidéo, la musique, la synthèse vocale, les approbations et la sortie des outils de messagerie
continuent de passer par le chemin de livraison OpenClaw normal.
Les sollicitations dapprobation doutil MCP Codex sont routées via le flux dapprobation de Plugin OpenClaw lorsque Codex marque `_meta.codex_approval_kind` comme
`"mcp_tool_call"`. Les prompts Codex `request_user_input` sont renvoyés dans le
chat dorigine, et le message de suivi suivant en file répond à cette demande native
du serveur au lieu dêtre orienté comme contexte supplémentaire. Les autres demandes de sollicitation MCP échouent toujours en mode fermé par défaut.
Les sollicitations dapprobation doutil MCP Codex sont acheminées via le flux dapprobation de Plugin dOpenClaw lorsque Codex marque `_meta.codex_approval_kind` comme
`"mcp_tool_call"`. Les invites Codex `request_user_input` sont renvoyées vers le
chat dorigine, et le message de suivi suivant dans la file répond à cette requête native du
serveur au lieu dêtre orienté comme contexte supplémentaire. Les autres requêtes de sollicitation MCP échouent toujours en mode fermé.
Lorsque le modèle sélectionné utilise le harnais Codex, la Compaction native de fil est déléguée au serveur dapplication Codex. OpenClaw conserve un miroir de transcription pour lhistorique de canal, la recherche, `/new`, `/reset`, et les futurs changements de modèle ou de harnais. Le
miroir inclut le prompt utilisateur, le texte final de lassistant, et des enregistrements légers de raisonnement ou de plan Codex lorsque le serveur dapplication les émet. Aujourdhui, OpenClaw enregistre uniquement les signaux natifs de début et de fin de Compaction. Il nexpose pas encore un résumé de Compaction lisible par lhumain ni une liste auditable des entrées que Codex a conservées après la Compaction.
Lorsque le modèle sélectionné utilise le harnais Codex, la Compaction native du thread est déléguée à lapp-server Codex. OpenClaw conserve un miroir de transcription pour lhistorique du canal,
la recherche, `/new`, `/reset` et les futurs changements de modèle ou de harnais. Le
miroir inclut linvite utilisateur, le texte final de lassistant et des enregistrements légers de raisonnement ou de plan Codex lorsque lapp-server les émet. Aujourdhui, OpenClaw nenregistre que les signaux de début et de fin de Compaction native. Il nexpose pas encore de
résumé de Compaction lisible par un humain ni de liste vérifiable des entrées que Codex
a conservées après la Compaction.
Parce que Codex possède le fil natif canonique, `tool_result_persist` ne
réécrit pas actuellement les enregistrements de résultats doutils natifs Codex. Il ne sapplique que lorsque
OpenClaw écrit un résultat doutil dans une transcription de session détenue par OpenClaw.
Comme Codex possède le thread natif canonique, `tool_result_persist` ne
réécrit pas actuellement les enregistrements de résultat doutil natifs Codex. Il ne sapplique que lorsque
OpenClaw écrit un résultat doutil dans une transcription de session gérée par OpenClaw.
La génération de médias nexige pas PI. Limage, la vidéo, la musique, le PDF, le TTS et la
La génération de médias ne nécessite pas PI. La génération dimages, de vidéo, de musique, de PDF, la synthèse vocale et la
compréhension des médias continuent dutiliser les paramètres de fournisseur/modèle correspondants tels que
`agents.defaults.imageGenerationModel`, `videoGenerationModel`, `pdfModel`, et
`agents.defaults.imageGenerationModel`, `videoGenerationModel`, `pdfModel` et
`messages.tts`.
## Dépannage
**Codex napparaît pas dans `/model` :** activez `plugins.entries.codex.enabled`,
sélectionnez un modèle `openai/gpt-*` avec `embeddedHarness.runtime: "codex"` (ou une
ancienne référence `codex/*`), et vérifiez si `plugins.allow` exclut `codex`.
ancienne référence `codex/*`) et vérifiez si `plugins.allow` exclut `codex`.
**OpenClaw utilise PI au lieu de Codex :** si aucun harnais Codex ne revendique lexécution,
OpenClaw peut utiliser PI comme backend de compatibilité. Définissez
`embeddedHarness.runtime: "codex"` pour forcer la sélection de Codex pendant les tests, ou
`embeddedHarness.fallback: "none"` pour échouer lorsquaucun harnais de Plugin ne correspond. Une fois
le serveur dapplication Codex sélectionné, ses échecs remontent directement sans configuration de repli supplémentaire.
lapp-server Codex sélectionné, ses échecs remontent directement sans configuration de
repli supplémentaire.
**Le serveur dapplication est rejeté :** mettez à jour Codex afin que le handshake du serveur dapplication
signale la version `0.118.0` ou plus récente.
**Lapp-server est rejeté :** mettez à niveau Codex afin que le handshake de lapp-server
signale la version `0.118.0` ou ultérieure.
**La discovery de modèles est lente :** réduisez `plugins.entries.codex.config.discovery.timeoutMs`
ou désactivez la discovery.
**La découverte des modèles est lente :** réduisez `plugins.entries.codex.config.discovery.timeoutMs`
ou désactivez la découverte.
**Le transport WebSocket échoue immédiatement :** vérifiez `appServer.url`, `authToken`,
et que le serveur dapplication distant parle la même version de protocole de serveur dapplication Codex.
et que lapp-server distant parle la même version du protocole app-server Codex.
**Un modèle non-Codex utilise PI :** cest attendu sauf si vous avez forcé
`embeddedHarness.runtime: "codex"` (ou sélectionné une ancienne référence `codex/*`). Les références simples
`openai/gpt-*` et les autres références fournisseurs restent sur leur chemin normal de fournisseur.
`openai/gpt-*` et celles des autres fournisseurs restent sur leur chemin fournisseur normal.
## Lié
## Liens connexes
- [Plugins de harnais dagent](/fr/plugins/sdk-agent-harness)
- [Fournisseurs de modèles](/fr/concepts/model-providers)
- [Référence de configuration](/fr/gateway/configuration-reference)
- [Testing](/fr/help/testing-live#live-codex-app-server-harness-smoke)
- [Tests](/fr/help/testing-live#live-codex-app-server-harness-smoke)

View File

@ -1,14 +1,14 @@
---
read_when:
- Vous souhaitez quun agent OpenClaw rejoigne un appel Google Meet
- Vous configurez Chrome, le node Chrome, ou Twilio comme transport Google Meet
summary: 'Plugin Google Meet : rejoindre des URL Meet explicites via Chrome ou Twilio avec des paramètres vocaux temps réel par défaut'
- Vous voulez quun agent OpenClaw rejoigne un appel Google Meet
- Vous configurez Chrome, le Node Chrome ou Twilio comme transport Google Meet
summary: 'Plugin Google Meet : rejoindre des URL Meet explicites via Chrome ou Twilio avec les valeurs par défaut de voix en temps réel'
title: Plugin Google Meet
x-i18n:
generated_at: "2026-04-24T07:22:23Z"
generated_at: "2026-04-24T08:57:23Z"
model: gpt-5.4
provider: openai
source_hash: f0bf06b7ab585bf2dc9dbf6d890e1954e89e4deea148380e350d2d7f4d954f5e
source_hash: 8d430a1f2d6ee7fc1d997ef388a2e0d2915a6475480343e7060edac799dfc027
source_path: plugins/google-meet.md
workflow: 15
---
@ -17,45 +17,41 @@ x-i18n:
Prise en charge des participants Google Meet pour OpenClaw.
Le plugin est explicite par conception :
Le Plugin est explicitement conçu ainsi :
- Il ne rejoint quune URL explicite `https://meet.google.com/...`.
- Il rejoint uniquement une URL explicite `https://meet.google.com/...`.
- La voix `realtime` est le mode par défaut.
- La voix temps réel peut rappeler lagent OpenClaw complet lorsque du
raisonnement plus approfondi ou des outils sont nécessaires.
- La voix en temps réel peut rappeler lagent OpenClaw complet lorsque des outils ou un raisonnement plus approfondi sont nécessaires.
- Lauthentification commence comme un OAuth Google personnel ou un profil Chrome déjà connecté.
- Il ny a pas dannonce automatique de consentement.
- Il ny a aucune annonce automatique de consentement.
- Le backend audio Chrome par défaut est `BlackHole 2ch`.
- Chrome peut sexécuter localement ou sur un hôte node appairé.
- Twilio accepte un numéro dappel ainsi quun PIN ou une séquence DTMF facultatifs.
- La commande CLI est `googlemeet` ; `meet` est réservée à des workflows plus larges
de téléconférence dagent.
- Chrome peut sexécuter localement ou sur un hôte Node appairé.
- Twilio accepte un numéro dappel entrant avec un code PIN ou une séquence DTMF facultatifs.
- La commande CLI est `googlemeet` ; `meet` est réservé aux flux de téléconférence dagent plus larges.
## Démarrage rapide
Installez les dépendances audio locales et assurez-vous que le fournisseur temps réel peut utiliser
OpenAI :
Installez les dépendances audio locales et assurez-vous que le fournisseur en temps réel peut utiliser OpenAI :
```bash
brew install blackhole-2ch sox
export OPENAI_API_KEY=sk-...
```
`blackhole-2ch` installe le périphérique audio virtuel `BlackHole 2ch`. Linstallateur Homebrew
requiert un redémarrage avant que macOS nexpose le périphérique :
`blackhole-2ch` installe le périphérique audio virtuel `BlackHole 2ch`. Le programme dinstallation de Homebrew nécessite un redémarrage avant que macOS nexpose le périphérique :
```bash
sudo reboot
```
Après le redémarrage, vérifiez les deux éléments :
Après le redémarrage, vérifiez les deux éléments :
```bash
system_profiler SPAudioDataType | grep -i BlackHole
command -v rec play
```
Activez le plugin :
Activez le Plugin :
```json5
{
@ -70,19 +66,19 @@ Activez le plugin :
}
```
Vérifiez la configuration :
Vérifiez la configuration :
```bash
openclaw googlemeet setup
```
Rejoignez une réunion :
Rejoignez une réunion :
```bash
openclaw googlemeet join https://meet.google.com/abc-defg-hij
```
Ou laissez un agent rejoindre via loutil `google_meet` :
Ou laissez un agent rejoindre la réunion via loutil `google_meet` :
```json
{
@ -91,67 +87,57 @@ Ou laissez un agent rejoindre via loutil `google_meet` :
}
```
Chrome rejoint avec le profil Chrome connecté. Dans Meet, choisissez `BlackHole 2ch` pour
le chemin micro/haut-parleur utilisé par OpenClaw. Pour un duplex audio propre, utilisez
des périphériques virtuels distincts ou un graphe de type Loopback ; un seul périphérique BlackHole suffit
pour un premier smoke test mais peut provoquer de lécho.
Chrome rejoint la réunion en tant que profil Chrome connecté. Dans Meet, choisissez `BlackHole 2ch` pour le chemin microphone/haut-parleur utilisé par OpenClaw. Pour un audio duplex propre, utilisez des périphériques virtuels séparés ou un graphe de type Loopback ; un seul périphérique BlackHole suffit pour un premier test rapide, mais peut produire de lécho.
### Gateway local + Chrome sous Parallels
### Gateway local + Chrome Parallels
Vous navez **pas** besoin dun Gateway OpenClaw complet ni dune clé API de modèle à lintérieur dune VM macOS
simplement pour que la VM héberge Chrome. Exécutez le Gateway et lagent localement, puis exécutez un
hôte node dans la VM. Activez une fois le plugin inclus dans la VM pour que le node
annonce la commande Chrome :
Vous navez **pas** besoin dun Gateway OpenClaw complet ni dune clé API de modèle à lintérieur dune VM macOS uniquement pour faire de la VM lhôte de Chrome. Exécutez le Gateway et lagent localement, puis exécutez un hôte Node dans la VM. Activez une fois le Plugin intégré sur la VM afin que le Node annonce la commande Chrome :
Ce qui sexécute où :
Ce qui sexécute où :
- Hôte Gateway : Gateway OpenClaw, espace de travail agent, clés de modèle/API, fournisseur temps réel
et configuration du plugin Google Meet.
- VM macOS Parallels : CLI/node host OpenClaw, Google Chrome, SoX, BlackHole 2ch,
et un profil Chrome connecté à Google.
- Non nécessaire dans la VM : service Gateway, configuration dagent, clé OpenAI/GPT, ou configuration
de fournisseur de modèle.
- Hôte Gateway : Gateway OpenClaw, espace de travail de lagent, clés de modèle/API, fournisseur en temps réel et configuration du Plugin Google Meet.
- VM macOS Parallels : CLI/hôte Node OpenClaw, Google Chrome, SoX, BlackHole 2ch et un profil Chrome connecté à Google.
- Non requis dans la VM : service Gateway, configuration de lagent, clé OpenAI/GPT ou configuration du fournisseur de modèle.
Installez les dépendances de la VM :
Installez les dépendances de la VM :
```bash
brew install blackhole-2ch sox
```
Redémarrez la VM après linstallation de BlackHole afin que macOS expose `BlackHole 2ch` :
Redémarrez la VM après linstallation de BlackHole afin que macOS expose `BlackHole 2ch` :
```bash
sudo reboot
```
Après le redémarrage, vérifiez que la VM voit le périphérique audio et les commandes SoX :
Après le redémarrage, vérifiez que la VM peut voir le périphérique audio et les commandes SoX :
```bash
system_profiler SPAudioDataType | grep -i BlackHole
command -v rec play
```
Installez ou mettez à jour OpenClaw dans la VM, puis activez-y le plugin inclus :
Installez ou mettez à jour OpenClaw dans la VM, puis activez-y le Plugin intégré :
```bash
openclaw plugins enable google-meet
```
Démarrez lhôte node dans la VM :
Démarrez lhôte Node dans la VM :
```bash
openclaw node run --host <gateway-host> --port 18789 --display-name parallels-macos
```
Si `<gateway-host>` est une IP LAN et que vous nutilisez pas TLS, le node refuse le
WebSocket en clair sauf si vous activez explicitement ce réseau privé de confiance :
Si `<gateway-host>` est une IP LAN et que vous nutilisez pas TLS, le Node refuse le WebSocket en texte clair sauf si vous lautorisez explicitement pour ce réseau privé de confiance :
```bash
OPENCLAW_ALLOW_INSECURE_PRIVATE_WS=1 \
openclaw node run --host <gateway-lan-ip> --port 18789 --display-name parallels-macos
```
Utilisez la même variable denvironnement lorsque vous installez le node comme LaunchAgent :
Utilisez la même variable denvironnement lors de linstallation du Node comme LaunchAgent :
```bash
OPENCLAW_ALLOW_INSECURE_PRIVATE_WS=1 \
@ -159,24 +145,22 @@ OPENCLAW_ALLOW_INSECURE_PRIVATE_WS=1 \
openclaw node restart
```
`OPENCLAW_ALLOW_INSECURE_PRIVATE_WS=1` est une variable denvironnement de processus, pas un
paramètre `openclaw.json`. `openclaw node install` lenregistre dans lenvironnement du LaunchAgent
lorsquelle est présente sur la commande dinstallation.
`OPENCLAW_ALLOW_INSECURE_PRIVATE_WS=1` est un environnement de processus, pas un paramètre `openclaw.json`. `openclaw node install` lenregistre dans lenvironnement du LaunchAgent lorsquelle est présente sur la commande dinstallation.
Approuvez le node depuis lhôte Gateway :
Approuvez le Node depuis lhôte Gateway :
```bash
openclaw devices list
openclaw devices approve <requestId>
```
Confirmez que le Gateway voit le node et quil annonce `googlemeet.chrome` :
Confirmez que le Gateway voit le Node et quil annonce `googlemeet.chrome` :
```bash
openclaw nodes status
```
Faites passer Meet par ce node sur lhôte Gateway :
Acheminez Meet via ce Node sur lhôte Gateway :
```json5
{
@ -201,7 +185,7 @@ Faites passer Meet par ce node sur lhôte Gateway :
}
```
Vous pouvez maintenant rejoindre normalement depuis lhôte Gateway :
Vous pouvez maintenant rejoindre la réunion normalement depuis lhôte Gateway :
```bash
openclaw googlemeet join https://meet.google.com/abc-defg-hij
@ -209,62 +193,40 @@ openclaw googlemeet join https://meet.google.com/abc-defg-hij
ou demander à lagent dutiliser loutil `google_meet` avec `transport: "chrome-node"`.
Si `chromeNode.node` est omis, OpenClaw ne fait une sélection automatique que lorsquun seul
node connecté annonce `googlemeet.chrome`. Si plusieurs nodes capables sont
connectés, définissez `chromeNode.node` sur lidentifiant du node, le nom daffichage ou lIP distante.
Si `chromeNode.node` est omis, OpenClaw effectue une sélection automatique uniquement lorsquun seul Node connecté annonce `googlemeet.chrome`. Si plusieurs Nodes compatibles sont connectés, définissez `chromeNode.node` sur lidentifiant du Node, son nom daffichage ou son IP distante.
Vérifications courantes en cas déchec :
Vérifications courantes en cas déchec :
- `No connected Google Meet-capable node` : démarrez `openclaw node run` dans la VM,
approuvez le pairing, et assurez-vous que `openclaw plugins enable google-meet` a bien été exécuté
dans la VM. Confirmez aussi que lhôte Gateway autorise la commande node avec
`gateway.nodes.allowCommands: ["googlemeet.chrome"]`.
- `BlackHole 2ch audio device not found on the node` : installez `blackhole-2ch`
dans la VM puis redémarrez la VM.
- Chrome souvre mais ne peut pas rejoindre : connectez-vous à Chrome dans la VM et confirmez que
ce profil peut rejoindre manuellement lURL Meet.
- Pas de son : dans Meet, faites passer le micro/haut-parleur par le chemin du périphérique audio virtuel
utilisé par OpenClaw ; utilisez des périphériques virtuels séparés ou un routage de type Loopback
pour un duplex propre.
- `No connected Google Meet-capable node` : démarrez `openclaw node run` dans la VM, approuvez lappairage et assurez-vous que `openclaw plugins enable google-meet` a bien été exécuté dans la VM. Confirmez aussi que lhôte Gateway autorise la commande Node avec `gateway.nodes.allowCommands: ["googlemeet.chrome"]`.
- `BlackHole 2ch audio device not found on the node` : installez `blackhole-2ch` dans la VM et redémarrez la VM.
- Chrome souvre mais ne peut pas rejoindre la réunion : connectez-vous à Chrome dans la VM et confirmez que ce profil peut rejoindre manuellement lURL Meet.
- Pas daudio : dans Meet, acheminez le microphone et le haut-parleur via le chemin de périphérique audio virtuel utilisé par OpenClaw ; utilisez des périphériques virtuels séparés ou un routage de type Loopback pour un audio duplex propre.
## Notes dinstallation
Le mode par défaut Chrome realtime utilise deux outils externes :
Le mode Chrome en temps réel par défaut utilise deux outils externes :
- `sox` : utilitaire audio en ligne de commande. Le plugin utilise ses commandes `rec` et `play`
pour le pont audio G.711 mu-law 8 kHz par défaut.
- `blackhole-2ch` : pilote audio virtuel macOS. Il crée le périphérique audio `BlackHole 2ch`
par lequel Chrome/Meet peuvent être routés.
- `sox` : utilitaire audio en ligne de commande. Le Plugin utilise ses commandes `rec` et `play` pour le pont audio G.711 mu-law 8 kHz par défaut.
- `blackhole-2ch` : pilote audio virtuel macOS. Il crée le périphérique audio `BlackHole 2ch` par lequel Chrome/Meet peut être acheminé.
OpenClaw nintègre ni ne redistribue aucun de ces deux packages. La documentation demande aux utilisateurs de
les installer comme dépendances hôtes via Homebrew. SoX est sous licence
`LGPL-2.0-only AND GPL-2.0-only` ; BlackHole est GPL-3.0. Si vous construisez un
installateur ou une appliance qui intègre BlackHole avec OpenClaw, examinez les
conditions de licence amont de BlackHole ou obtenez une licence séparée auprès dExistential Audio.
OpenClaw ne fournit ni ne redistribue aucun de ces deux paquets. La documentation demande aux utilisateurs de les installer comme dépendances de lhôte via Homebrew. SoX est sous licence `LGPL-2.0-only AND GPL-2.0-only` ; BlackHole est sous licence GPL-3.0. Si vous créez un programme dinstallation ou une appliance qui intègre BlackHole avec OpenClaw, vérifiez les conditions de licence amont de BlackHole ou obtenez une licence distincte auprès de Existential Audio.
## Transports
### Chrome
Le transport Chrome ouvre lURL Meet dans Google Chrome et rejoint avec le profil
Chrome connecté. Sur macOS, le plugin vérifie la présence de `BlackHole 2ch` avant le lancement.
Sil est configuré, il exécute aussi une commande de contrôle de santé du pont audio et une commande de démarrage
avant douvrir Chrome. Utilisez `chrome` lorsque Chrome/laudio résident sur lhôte Gateway ;
utilisez `chrome-node` lorsque Chrome/laudio résident sur un node appairé comme une VM macOS Parallels.
Le transport Chrome ouvre lURL Meet dans Google Chrome et rejoint la réunion en tant que profil Chrome connecté. Sur macOS, le Plugin vérifie la présence de `BlackHole 2ch` avant le lancement. Si configuré, il exécute également une commande de vérification de santé du pont audio et une commande de démarrage avant douvrir Chrome. Utilisez `chrome` lorsque Chrome/laudio sexécutent sur lhôte Gateway ; utilisez `chrome-node` lorsque Chrome/laudio sexécutent sur un Node appairé, comme une VM macOS Parallels.
```bash
openclaw googlemeet join https://meet.google.com/abc-defg-hij --transport chrome
openclaw googlemeet join https://meet.google.com/abc-defg-hij --transport chrome-node
```
Faites passer laudio micro et haut-parleur de Chrome par le pont audio local OpenClaw.
Si `BlackHole 2ch` nest pas installé, la jonction échoue avec une erreur de configuration
au lieu de rejoindre silencieusement sans chemin audio.
Acheminez laudio microphone et haut-parleur de Chrome via le pont audio OpenClaw local. Si `BlackHole 2ch` nest pas installé, la connexion échoue avec une erreur de configuration au lieu de rejoindre silencieusement sans chemin audio.
### Twilio
Le transport Twilio est un plan dappel strict délégué au plugin Voice Call. Il
nanalyse pas les pages Meet pour extraire des numéros de téléphone.
Le transport Twilio est un plan de numérotation strict délégué au Plugin Voice Call. Il nanalyse pas les pages Meet pour y trouver des numéros de téléphone.
```bash
openclaw googlemeet join https://meet.google.com/abc-defg-hij \
@ -273,7 +235,7 @@ openclaw googlemeet join https://meet.google.com/abc-defg-hij \
--pin 123456
```
Utilisez `--dtmf-sequence` lorsque la réunion nécessite une séquence personnalisée :
Utilisez `--dtmf-sequence` lorsque la réunion nécessite une séquence personnalisée :
```bash
openclaw googlemeet join https://meet.google.com/abc-defg-hij \
@ -282,20 +244,17 @@ openclaw googlemeet join https://meet.google.com/abc-defg-hij \
--dtmf-sequence ww123456#
```
## OAuth et préflight
## OAuth et prévérification
Laccès à lAPI Google Meet Media utilise dabord un client OAuth personnel. Configurez
`oauth.clientId` et éventuellement `oauth.clientSecret`, puis exécutez :
Laccès à lAPI média Google Meet utilise dabord un client OAuth personnel. Configurez `oauth.clientId` et, facultativement, `oauth.clientSecret`, puis exécutez :
```bash
openclaw googlemeet auth login --json
```
La commande affiche un bloc de configuration `oauth` avec un jeton dactualisation. Elle utilise PKCE,
un callback localhost sur `http://localhost:8085/oauth2callback`, et un flux manuel
copier/coller avec `--manual`.
La commande affiche un bloc de configuration `oauth` avec un jeton dactualisation. Elle utilise PKCE, un rappel localhost sur `http://localhost:8085/oauth2callback` et un flux manuel de copier-coller avec `--manual`.
Ces variables denvironnement sont acceptées en repli :
Ces variables denvironnement sont acceptées comme solutions de secours :
- `OPENCLAW_GOOGLE_MEET_CLIENT_ID` ou `GOOGLE_MEET_CLIENT_ID`
- `OPENCLAW_GOOGLE_MEET_CLIENT_SECRET` ou `GOOGLE_MEET_CLIENT_SECRET`
@ -306,33 +265,30 @@ Ces variables denvironnement sont acceptées en repli :
- `OPENCLAW_GOOGLE_MEET_DEFAULT_MEETING` ou `GOOGLE_MEET_DEFAULT_MEETING`
- `OPENCLAW_GOOGLE_MEET_PREVIEW_ACK` ou `GOOGLE_MEET_PREVIEW_ACK`
Résolvez une URL Meet, un code, ou `spaces/{id}` via `spaces.get` :
Résolvez une URL Meet, un code ou `spaces/{id}` via `spaces.get` :
```bash
openclaw googlemeet resolve-space --meeting https://meet.google.com/abc-defg-hij
```
Exécutez le préflight avant tout travail média :
Exécutez la prévérification avant le travail média :
```bash
openclaw googlemeet preflight --meeting https://meet.google.com/abc-defg-hij
```
Définissez `preview.enrollmentAcknowledged: true` uniquement après avoir confirmé que votre
projet Cloud, le principal OAuth et les participants à la réunion sont inscrits au Google
Workspace Developer Preview Program pour les API média Meet.
Définissez `preview.enrollmentAcknowledged: true` uniquement après avoir confirmé que votre projet Cloud, le principal OAuth et les participants à la réunion sont inscrits au Google Workspace Developer Preview Program pour les API média Meet.
## Configuration
Le chemin Chrome realtime courant na besoin que du plugin activé, de BlackHole, de SoX,
et dune clé OpenAI :
Le chemin Chrome en temps réel courant nécessite seulement le Plugin activé, BlackHole, SoX et une clé OpenAI :
```bash
brew install blackhole-2ch sox
export OPENAI_API_KEY=sk-...
```
Définissez la configuration du plugin sous `plugins.entries.google-meet.config` :
Définissez la configuration du Plugin sous `plugins.entries.google-meet.config` :
```json5
{
@ -347,22 +303,21 @@ Définissez la configuration du plugin sous `plugins.entries.google-meet.config`
}
```
Valeurs par défaut :
Valeurs par défaut :
- `defaultTransport: "chrome"`
- `defaultMode: "realtime"`
- `chromeNode.node` : identifiant/nom/IP de node facultatif pour `chrome-node`
- `chromeNode.node` : identifiant/nom/IP du Node facultatif pour `chrome-node`
- `chrome.audioBackend: "blackhole-2ch"`
- `chrome.audioInputCommand` : commande SoX `rec` écrivant de laudio
G.711 mu-law 8 kHz sur stdout
- `chrome.audioOutputCommand` : commande SoX `play` lisant de laudio
G.711 mu-law 8 kHz depuis stdin
- `chrome.audioInputCommand` : commande SoX `rec` écrivant un audio G.711 mu-law 8 kHz vers stdout
- `chrome.audioOutputCommand` : commande SoX `play` lisant un audio G.711 mu-law 8 kHz depuis stdin
- `realtime.provider: "openai"`
- `realtime.toolPolicy: "safe-read-only"`
- `realtime.instructions` : réponses parlées brèves, avec
`openclaw_agent_consult` pour des réponses plus approfondies
- `realtime.instructions` : réponses parlées brèves, avec
`openclaw_agent_consult` pour les réponses plus approfondies
- `realtime.introMessage` : bref contrôle vocal de disponibilité lorsque le pont en temps réel se connecte ; définissez-le sur `""` pour rejoindre silencieusement
Surcharges facultatives :
Surcharges facultatives :
```json5
{
@ -377,11 +332,12 @@ Surcharges facultatives :
},
realtime: {
toolPolicy: "owner",
introMessage: "Say exactly: I'm here.",
},
}
```
Configuration Twilio uniquement :
Configuration Twilio uniquement :
```json5
{
@ -398,7 +354,7 @@ Configuration Twilio uniquement :
## Outil
Les agents peuvent utiliser loutil `google_meet` :
Les agents peuvent utiliser loutil `google_meet` :
```json
{
@ -409,61 +365,55 @@ Les agents peuvent utiliser loutil `google_meet` :
}
```
Utilisez `transport: "chrome"` lorsque Chrome sexécute sur lhôte Gateway. Utilisez
`transport: "chrome-node"` lorsque Chrome sexécute sur un node appairé comme une VM
Parallels. Dans les deux cas, le modèle temps réel et `openclaw_agent_consult` sexécutent sur lhôte
Gateway, donc les identifiants du modèle y restent.
Utilisez `transport: "chrome"` lorsque Chrome sexécute sur lhôte Gateway. Utilisez `transport: "chrome-node"` lorsque Chrome sexécute sur un Node appairé, comme une VM Parallels. Dans les deux cas, le modèle en temps réel et `openclaw_agent_consult` sexécutent sur lhôte Gateway, de sorte que les identifiants du modèle y restent.
Utilisez `action: "status"` pour lister les sessions actives ou inspecter un ID de session. Utilisez
`action: "leave"` pour marquer une session comme terminée.
Utilisez `action: "status"` pour lister les sessions actives ou inspecter un identifiant de session. Utilisez `action: "speak"` avec `sessionId` et `message` pour faire parler immédiatement lagent en temps réel. Utilisez `action: "leave"` pour marquer une session comme terminée.
```json
{
"action": "speak",
"sessionId": "meet_...",
"message": "Say exactly: I'm here and listening."
}
```
## Consultation dagent en temps réel
Le mode Chrome realtime est optimisé pour une boucle vocale en direct. Le fournisseur
vocal temps réel entend laudio de la réunion et parle via le pont audio configuré.
Lorsque le modèle temps réel a besoin dun raisonnement plus approfondi, dinformations à jour,
ou des outils OpenClaw normaux, il peut appeler `openclaw_agent_consult`.
Le mode Chrome en temps réel est optimisé pour une boucle vocale en direct. Le fournisseur vocal en temps réel entend laudio de la réunion et parle via le pont audio configuré. Lorsque le modèle en temps réel a besoin dun raisonnement plus approfondi, dinformations actuelles ou des outils OpenClaw normaux, il peut appeler `openclaw_agent_consult`.
Loutil de consultation exécute en coulisses lagent OpenClaw ordinaire avec le contexte
récent de transcription de réunion et renvoie une réponse concise parlée à la session
vocale temps réel. Le modèle vocal peut ensuite prononcer cette réponse dans la réunion.
Loutil de consultation exécute en arrière-plan lagent OpenClaw standard avec le contexte récent de la transcription de la réunion, puis renvoie une réponse orale concise à la session vocale en temps réel. Le modèle vocal peut ensuite restituer cette réponse dans la réunion.
`realtime.toolPolicy` contrôle lexécution de consultation :
`realtime.toolPolicy` contrôle lexécution de la consultation :
- `safe-read-only` : expose loutil de consultation et limite lagent ordinaire à
`read`, `web_search`, `web_fetch`, `x_search`, `memory_search`, et
- `safe-read-only` : expose loutil de consultation et limite lagent standard à
`read`, `web_search`, `web_fetch`, `x_search`, `memory_search` et
`memory_get`.
- `owner` : expose loutil de consultation et laisse lagent ordinaire utiliser la politique normale doutils de lagent.
- `none` : nexpose pas loutil de consultation au modèle vocal temps réel.
- `owner` : expose loutil de consultation et permet à lagent standard dutiliser la politique doutils normale de lagent.
- `none` : nexpose pas loutil de consultation au modèle vocal en temps réel.
La clé de session de consultation est limitée par session Meet, de sorte que les appels de consultation de suivi
puissent réutiliser le contexte des consultations précédentes pendant la même réunion.
La clé de session de consultation est limitée à chaque session Meet, afin que les appels de consultation de suivi puissent réutiliser le contexte de consultation précédent pendant la même réunion.
## Remarques
Pour forcer une vérification vocale de disponibilité après que Chrome a complètement rejoint lappel :
LAPI média officielle de Google Meet est orientée réception, donc parler dans un appel Meet
nécessite toujours un chemin de participant. Ce plugin garde cette frontière visible :
Chrome gère la participation via le navigateur et le routage audio local ; Twilio gère
la participation par appel téléphonique.
```bash
openclaw googlemeet speak meet_... "Say exactly: I'm here and listening."
```
Le mode Chrome realtime nécessite soit :
## Notes
- `chrome.audioInputCommand` plus `chrome.audioOutputCommand` : OpenClaw possède le
pont du modèle temps réel et fait passer laudio G.711 mu-law 8 kHz entre ces
commandes et le fournisseur vocal temps réel sélectionné.
- `chrome.audioBridgeCommand` : une commande de pont externe possède tout le chemin
audio local et doit se terminer après avoir démarré ou validé son démon.
LAPI média officielle de Google Meet est orientée réception, donc parler dans un appel Meet nécessite toujours un chemin de participation. Ce Plugin conserve cette limite visible : Chrome gère la participation via le navigateur et le routage audio local ; Twilio gère la participation par appel téléphonique.
Pour un duplex propre, faites passer la sortie Meet et le microphone Meet par des
périphériques virtuels séparés ou par un graphe de périphériques virtuels de type Loopback. Un seul périphérique
BlackHole partagé peut réinjecter les autres participants dans lappel.
Le mode Chrome en temps réel nécessite soit :
`googlemeet leave` arrête le pont audio temps réel par paire de commandes pour les sessions
Chrome. Pour les sessions Twilio déléguées via le plugin Voice Call, cela
raccroche aussi lappel vocal sous-jacent.
- `chrome.audioInputCommand` plus `chrome.audioOutputCommand` : OpenClaw gère le pont du modèle en temps réel et fait transiter laudio G.711 mu-law 8 kHz entre ces commandes et le fournisseur vocal en temps réel sélectionné.
- `chrome.audioBridgeCommand` : une commande de pont externe gère lensemble du chemin audio local et doit se terminer après avoir démarré ou validé son démon.
## Articles connexes
Pour un audio duplex propre, acheminez la sortie Meet et le microphone Meet via des périphériques virtuels séparés ou un graphe de périphériques virtuels de type Loopback. Un seul périphérique BlackHole partagé peut réinjecter laudio des autres participants dans lappel.
`googlemeet speak` déclenche le pont audio en temps réel actif pour une session Chrome. `googlemeet leave` arrête ce pont. Pour les sessions Twilio déléguées via le Plugin Voice Call, `leave` raccroche également lappel vocal sous-jacent.
## Liés
- [Plugin Voice Call](/fr/plugins/voice-call)
- [Mode Talk](/fr/nodes/talk)
- [Créer des plugins](/fr/plugins/building-plugins)
- [Mode conversation](/fr/nodes/talk)
- [Créer des Plugins](/fr/plugins/building-plugins)

View File

@ -1,147 +1,112 @@
---
read_when:
- Vous voyez lavertissement OPENCLAW_PLUGIN_SDK_COMPAT_DEPRECATED
- Vous voyez lavertissement OPENCLAW_EXTENSION_API_DEPRECATED
- Vous mettez à jour un Plugin vers larchitecture moderne de plugins
- Vous maintenez un Plugin OpenClaw externe
- Vous voyez lavertissement `OPENCLAW_PLUGIN_SDK_COMPAT_DEPRECATED`
- Vous voyez lavertissement `OPENCLAW_EXTENSION_API_DEPRECATED`
- Vous mettez à jour un plugin vers larchitecture de Plugin moderne
- Vous maintenez un plugin OpenClaw externe
sidebarTitle: Migrate to SDK
summary: Migrer de la couche de compatibilité descendante héritée vers le SDK Plugin moderne
title: Migration du SDK Plugin
summary: Migrez de la couche de rétrocompatibilité héritée vers le SDK de Plugin moderne
title: Migration du SDK de Plugin
x-i18n:
generated_at: "2026-04-24T07:23:50Z"
generated_at: "2026-04-24T08:57:09Z"
model: gpt-5.4
provider: openai
source_hash: d1612fbdc0e472a0ba1ae310ceeca9c672afa5a7eba77637b94726ef1fedee87
source_hash: d1461ae8a7de0a802c9deb59f843e7d93d9d73bea22c27d837ca2db8ae9d14b7
source_path: plugins/sdk-migration.md
workflow: 15
---
OpenClaw est passé dune couche large de compatibilité descendante à une architecture moderne de plugins
avec des imports ciblés et documentés. Si votre Plugin a été construit avant
la nouvelle architecture, ce guide vous aide à migrer.
OpenClaw est passé dune large couche de rétrocompatibilité à une architecture de Plugin moderne avec des imports ciblés et documentés. Si votre plugin a été conçu avant la nouvelle architecture, ce guide vous aide à effectuer la migration.
## Ce qui change
Lancien système de plugins fournissait deux surfaces très ouvertes qui permettaient aux plugins dimporter
tout ce dont ils avaient besoin depuis un seul point dentrée :
Lancien système de plugin fournissait deux surfaces très ouvertes qui permettaient aux plugins dimporter tout ce dont ils avaient besoin depuis un point dentrée unique :
- **`openclaw/plugin-sdk/compat`** — un import unique qui réexportait des dizaines de
helpers. Il a été introduit pour garder les anciens plugins basés sur hooks fonctionnels pendant la construction de la
nouvelle architecture de plugins.
- **`openclaw/extension-api`** — un pont qui donnait aux plugins un accès direct à
des helpers côté hôte comme lexécuteur dagent embarqué.
- **`openclaw/plugin-sdk/compat`** — un import unique qui réexportait des dizaines de helpers. Il a été introduit pour permettre aux anciens plugins basés sur des hooks de continuer à fonctionner pendant la mise en place de la nouvelle architecture de plugin.
- **`openclaw/extension-api`** — un pont qui donnait aux plugins un accès direct à des helpers côté hôte comme lexécuteur dagent embarqué.
Ces deux surfaces sont maintenant **obsolètes**. Elles fonctionnent encore à lexécution, mais les nouveaux
plugins ne doivent pas les utiliser, et les plugins existants doivent migrer avant que la prochaine
version majeure ne les supprime.
Ces deux surfaces sont désormais **obsolètes**. Elles fonctionnent encore à lexécution, mais les nouveaux plugins ne doivent pas les utiliser, et les plugins existants doivent migrer avant que la prochaine version majeure ne les supprime.
OpenClaw ne supprime ni ne réinterprète un comportement de Plugin documenté dans le même
changement qui introduit un remplacement. Les changements de contrat cassants doivent dabord passer
par un adaptateur de compatibilité, des diagnostics, de la documentation et une fenêtre de dépréciation.
Cela sapplique aux imports SDK, champs de manifest, API de configuration, hooks et au comportement denregistrement à lexécution.
OpenClaw ne supprime ni ne réinterprète un comportement de plugin documenté dans le même changement qui introduit un remplacement. Les changements cassants de contrat doivent dabord passer par un adaptateur de compatibilité, des diagnostics, de la documentation et une période de dépréciation. Cela sapplique aux imports du SDK, aux champs de manifeste, aux API de configuration, aux hooks et au comportement denregistrement à lexécution.
<Warning>
La couche de compatibilité descendante sera supprimée dans une future version majeure.
Les plugins qui importent encore depuis ces surfaces casseront lorsque cela arrivera.
La couche de rétrocompatibilité sera supprimée dans une future version majeure.
Les plugins qui importent encore depuis ces surfaces cesseront de fonctionner à ce moment-là.
</Warning>
## Pourquoi cela a changé
Lancienne approche posait problème :
Lancienne approche posait des problèmes :
- **Démarrage lent** — importer un helper chargeait des dizaines de modules sans rapport
- **Dépendances circulaires** — les réexportations larges facilitaient la création de cycles dimport
- **Surface API floue** — aucun moyen de savoir quelles exportations étaient stables ou internes
- **Surface dAPI peu claire** — aucun moyen de distinguer les exports stables des exports internes
Le SDK Plugin moderne corrige cela : chaque chemin dimport (`openclaw/plugin-sdk/\<subpath\>`)
est un petit module autonome avec un objectif clair et un contrat documenté.
Le SDK de Plugin moderne corrige cela : chaque chemin dimport (`openclaw/plugin-sdk/\<subpath\>`) est un module petit et autonome, avec un objectif clair et un contrat documenté.
Les couches de commodité héritées des fournisseurs pour les canaux intégrés ont également disparu. Les imports
tels que `openclaw/plugin-sdk/slack`, `openclaw/plugin-sdk/discord`,
`openclaw/plugin-sdk/signal`, `openclaw/plugin-sdk/whatsapp`,
les couches dassistance marquées au nom du canal, et
`openclaw/plugin-sdk/telegram-core` étaient des raccourcis privés du mono-repo, pas
des contrats stables de Plugin. Utilisez à la place des sous-chemins génériques étroits du SDK. À lintérieur de
lespace de travail du Plugin intégré, gardez les helpers détenus par le fournisseur dans le propre
`api.ts` ou `runtime-api.ts` de ce Plugin.
Les points dentrée de commodité hérités pour les fournisseurs des canaux intégrés ont également disparu. Les imports tels que `openclaw/plugin-sdk/slack`, `openclaw/plugin-sdk/discord`, `openclaw/plugin-sdk/signal`, `openclaw/plugin-sdk/whatsapp`, les points dentrée de helpers associés à une marque de canal, et `openclaw/plugin-sdk/telegram-core` étaient des raccourcis privés du mono-repo, et non des contrats de plugin stables. Utilisez à la place des sous-chemins génériques et ciblés du SDK. À lintérieur de lespace de travail dun plugin intégré, conservez les helpers appartenant au fournisseur dans le propre `api.ts` ou `runtime-api.ts` de ce plugin.
Exemples actuels de fournisseurs intégrés :
- Anthropic garde les helpers de flux spécifiques à Claude dans sa propre couche `api.ts` /
`contract-api.ts`
- OpenAI garde les constructeurs de fournisseur, les helpers de modèle par défaut, et les constructeurs
de fournisseur temps réel dans son propre `api.ts`
- OpenRouter garde le constructeur de fournisseur et les helpers donboarding/configuration dans son propre
`api.ts`
- Anthropic conserve les helpers de flux spécifiques à Claude dans son propre point dentrée `api.ts` / `contract-api.ts`
- OpenAI conserve les constructeurs de fournisseur, les helpers de modèle par défaut et les constructeurs de fournisseur temps réel dans son propre `api.ts`
- OpenRouter conserve le constructeur de fournisseur et les helpers dintégration/configuration dans son propre `api.ts`
## Politique de compatibilité
Pour les plugins externes, le travail de compatibilité suit cet ordre :
1. ajouter le nouveau contrat
2. garder lancien comportement câblé via un adaptateur de compatibilité
2. conserver lancien comportement via un adaptateur de compatibilité
3. émettre un diagnostic ou un avertissement qui nomme lancien chemin et son remplacement
4. couvrir les deux chemins dans les tests
5. documenter la dépréciation et le chemin de migration
6. supprimer seulement après la fenêtre de migration annoncée, généralement dans une version majeure
Si un champ de manifest est encore accepté, les auteurs de plugins peuvent continuer à lutiliser jusquà ce
que la documentation et les diagnostics indiquent le contraire. Le nouveau code doit préférer le remplacement documenté, mais les plugins existants ne doivent pas casser pendant les versions mineures ordinaires.
Si un champ de manifeste est encore accepté, les auteurs de plugins peuvent continuer à lutiliser jusquà ce que la documentation et les diagnostics indiquent le contraire. Le nouveau code doit privilégier le remplacement documenté, mais les plugins existants ne doivent pas cesser de fonctionner au cours de versions mineures ordinaires.
## Comment migrer
<Steps>
<Step title="Migrer les gestionnaires approval-native vers des faits de capacité">
Les plugins de canal capables dapprobation exposent maintenant le comportement dapprobation natif via
`approvalCapability.nativeRuntime` plus le registre partagé de contexte dexécution.
<Step title="Migrer les handlers approval-native vers des faits de capacité">
Les plugins de canal capables de gérer les approbations exposent désormais le comportement dapprobation natif via `approvalCapability.nativeRuntime` ainsi que le registre partagé de contexte dexécution.
Changements clés :
Principaux changements :
- Remplacer `approvalCapability.handler.loadRuntime(...)` par
`approvalCapability.nativeRuntime`
- Déplacer lauthentification/la livraison propres aux approbations hors du câblage hérité `plugin.auth` /
`plugin.approvals` vers `approvalCapability`
- `ChannelPlugin.approvals` a été supprimé du contrat public de plugin de canal ;
déplacez les champs delivery/native/render vers `approvalCapability`
- `plugin.auth` reste pour les flux de connexion/déconnexion du canal uniquement ; les
hooks dauthentification dapprobation à cet endroit ne sont plus lus par le cœur
- Enregistrer les objets dexécution détenus par le canal tels que clients, jetons ou apps
Bolt via `openclaw/plugin-sdk/channel-runtime-context`
- Nenvoyez pas davis de reroutage détenus par le Plugin depuis des gestionnaires dapprobation natifs ;
le cœur possède maintenant les avis routés ailleurs issus des résultats réels de livraison
- Lors du passage de `channelRuntime` à `createChannelManager(...)`, fournissez une
véritable surface `createPluginRuntime().channel`. Les stubs partiels sont rejetés.
- Remplacez `approvalCapability.handler.loadRuntime(...)` par `approvalCapability.nativeRuntime`
- Déplacez lauthentification/la livraison spécifiques aux approbations hors du câblage hérité `plugin.auth` / `plugin.approvals` vers `approvalCapability`
- `ChannelPlugin.approvals` a été supprimé du contrat public de plugin de canal ; déplacez les champs delivery/native/render vers `approvalCapability`
- `plugin.auth` reste utilisé uniquement pour les flux de connexion/déconnexion du canal ; les hooks dauthentification dapprobation à cet emplacement ne sont plus lus par le cœur
- Enregistrez les objets dexécution appartenant au canal, tels que les clients, les jetons ou les apps Bolt, via `openclaw/plugin-sdk/channel-runtime-context`
- Nenvoyez pas davis de redirection appartenant au plugin depuis les handlers dapprobation natifs ; le cœur gère désormais les avis routés ailleurs à partir des résultats réels de livraison
- Lors du passage de `channelRuntime` à `createChannelManager(...)`, fournissez une véritable surface `createPluginRuntime().channel`. Les stubs partiels sont rejetés.
Voir `/plugins/sdk-channel-plugins` pour la disposition actuelle de la
capacité dapprobation.
Consultez `/plugins/sdk-channel-plugins` pour la structure actuelle de la capacité dapprobation.
</Step>
<Step title="Auditer le comportement de repli du wrapper Windows">
Si votre Plugin utilise `openclaw/plugin-sdk/windows-spawn`, les wrappers Windows
`.cmd`/`.bat` non résolus échouent désormais en mode sécurisé par défaut, sauf si vous passez explicitement
`allowShellFallback: true`.
Si votre plugin utilise `openclaw/plugin-sdk/windows-spawn`, les wrappers Windows `.cmd`/`.bat` non résolus échouent désormais par défaut, sauf si vous passez explicitement `allowShellFallback: true`.
```typescript
// Avant
// Before
const program = applyWindowsSpawnProgramPolicy({ candidate });
// Après
// After
const program = applyWindowsSpawnProgramPolicy({
candidate,
// Ne définissez ceci que pour les appelants de compatibilité de confiance qui
// acceptent intentionnellement le repli médié par shell.
// Only set this for trusted compatibility callers that intentionally
// accept shell-mediated fallback.
allowShellFallback: true,
});
```
Si votre appelant ne dépend pas intentionnellement du repli shell, ne définissez pas
`allowShellFallback` et gérez lerreur levée à la place.
Si votre appelant ne dépend pas intentionnellement du repli vers le shell, ne définissez pas `allowShellFallback` et gérez plutôt lerreur levée.
</Step>
<Step title="Trouver les imports obsolètes">
Recherchez dans votre Plugin les imports depuis lune ou lautre des surfaces obsolètes :
<Step title="Rechercher les imports obsolètes">
Recherchez dans votre plugin les imports provenant de lune ou lautre surface obsolète :
```bash
grep -r "plugin-sdk/compat" my-plugin/
@ -154,32 +119,31 @@ que la documentation et les diagnostics indiquent le contraire. Le nouveau code
Chaque export de lancienne surface correspond à un chemin dimport moderne spécifique :
```typescript
// Avant (couche de compatibilité descendante obsolète)
// Before (deprecated backwards-compatibility layer)
import {
createChannelReplyPipeline,
createPluginRuntimeStore,
resolveControlCommandGate,
} from "openclaw/plugin-sdk/compat";
// Après (imports modernes ciblés)
// After (modern focused imports)
import { createChannelReplyPipeline } from "openclaw/plugin-sdk/channel-reply-pipeline";
import { createPluginRuntimeStore } from "openclaw/plugin-sdk/runtime-store";
import { resolveControlCommandGate } from "openclaw/plugin-sdk/command-auth";
```
Pour les helpers côté hôte, utilisez le runtime de Plugin injecté au lieu dimporter
directement :
Pour les helpers côté hôte, utilisez le runtime de plugin injecté au lieu dimporter directement :
```typescript
// Avant (pont extension-api obsolète)
// Before (deprecated extension-api bridge)
import { runEmbeddedPiAgent } from "openclaw/extension-api";
const result = await runEmbeddedPiAgent({ sessionId, prompt });
// Après (runtime injecté)
// After (injected runtime)
const result = await api.runtime.agent.runEmbeddedPiAgent({ sessionId, prompt });
```
Le même motif sapplique aux autres helpers de pont hérités :
Le même modèle sapplique aux autres helpers de pont hérités :
| Ancien import | Équivalent moderne |
| --- | --- |
@ -189,11 +153,11 @@ que la documentation et les diagnostics indiquent le contraire. Le nouveau code
| `resolveThinkingDefault` | `api.runtime.agent.resolveThinkingDefault` |
| `resolveAgentTimeoutMs` | `api.runtime.agent.resolveAgentTimeoutMs` |
| `ensureAgentWorkspace` | `api.runtime.agent.ensureAgentWorkspace` |
| helpers de stockage de session | `api.runtime.agent.session.*` |
| helpers de magasin de session | `api.runtime.agent.session.*` |
</Step>
<Step title="Construire et tester">
<Step title="Compiler et tester">
```bash
pnpm build
pnpm test -- my-plugin/
@ -203,227 +167,216 @@ que la documentation et les diagnostics indiquent le contraire. Le nouveau code
## Référence des chemins dimport
<Accordion title="Table commune des chemins dimport">
| Chemin dimport | But | Exportations clés |
<Accordion title="Tableau des chemins dimport courants">
| Import path | Objectif | Exports clés |
| --- | --- | --- |
| `plugin-sdk/plugin-entry` | Helper dentrée de Plugin canonique | `definePluginEntry` |
| `plugin-sdk/core` | Réexportation globale héritée pour les définitions/constructeurs dentrée de canal | `defineChannelPluginEntry`, `createChatChannelPlugin` |
| `plugin-sdk/config-schema` | Exportation du schéma de configuration racine | `OpenClawSchema` |
| `plugin-sdk/plugin-entry` | Helper dentrée de plugin canonique | `definePluginEntry` |
| `plugin-sdk/core` | Réexportation parapluie héritée pour les définitions/builders dentrée de canal | `defineChannelPluginEntry`, `createChatChannelPlugin` |
| `plugin-sdk/config-schema` | Export du schéma de configuration racine | `OpenClawSchema` |
| `plugin-sdk/provider-entry` | Helper dentrée à fournisseur unique | `defineSingleProviderPluginEntry` |
| `plugin-sdk/channel-core` | Définitions et constructeurs ciblés dentrée de canal | `defineChannelPluginEntry`, `defineSetupPluginEntry`, `createChatChannelPlugin`, `createChannelPluginBase` |
| `plugin-sdk/setup` | Helpers partagés dassistant de configuration | Prompts de liste blanche, constructeurs détat de configuration |
| `plugin-sdk/setup-runtime` | Helpers dexécution au moment de la configuration | Adaptateurs de patch de configuration sûrs à limport, helpers de lookup-note, `promptResolvedAllowFrom`, `splitSetupEntries`, proxys de configuration délégués |
| `plugin-sdk/channel-core` | Définitions et builders ciblés pour les entrées de canal | `defineChannelPluginEntry`, `defineSetupPluginEntry`, `createChatChannelPlugin`, `createChannelPluginBase` |
| `plugin-sdk/setup` | Helpers partagés dassistant de configuration | Prompts de liste dautorisation, builders détat de configuration |
| `plugin-sdk/setup-runtime` | Helpers dexécution au moment de la configuration | Adaptateurs de patch de configuration sûrs à importer, helpers de notes de recherche, `promptResolvedAllowFrom`, `splitSetupEntries`, proxys de configuration déléguée |
| `plugin-sdk/setup-adapter-runtime` | Helpers dadaptateur de configuration | `createEnvPatchedAccountSetupAdapter` |
| `plugin-sdk/setup-tools` | Helpers doutillage de configuration | `formatCliCommand`, `detectBinary`, `extractArchive`, `resolveBrewExecutable`, `formatDocsLink`, `CONFIG_DIR` |
| `plugin-sdk/account-core` | Helpers multi-compte | Helpers de liste/configuration/action-gate de compte |
| `plugin-sdk/account-id` | Helpers dID de compte | `DEFAULT_ACCOUNT_ID`, normalisation dID de compte |
| `plugin-sdk/account-core` | Helpers multi-comptes | Helpers de liste/configuration/action-gate de compte |
| `plugin-sdk/account-id` | Helpers didentifiant de compte | `DEFAULT_ACCOUNT_ID`, normalisation didentifiant de compte |
| `plugin-sdk/account-resolution` | Helpers de recherche de compte | Helpers de recherche de compte + repli par défaut |
| `plugin-sdk/account-helpers` | Helpers de compte étroits | Helpers de liste de compte/action de compte |
| `plugin-sdk/channel-setup` | Adaptateurs dassistant de configuration | `createOptionalChannelSetupSurface`, `createOptionalChannelSetupAdapter`, `createOptionalChannelSetupWizard`, plus `DEFAULT_ACCOUNT_ID`, `createTopLevelChannelDmPolicy`, `setSetupChannelEnabled`, `splitSetupEntries` |
| `plugin-sdk/account-helpers` | Helpers de compte ciblés | Helpers de liste de comptes/action de compte |
| `plugin-sdk/channel-setup` | Adaptateurs dassistant de configuration | `createOptionalChannelSetupSurface`, `createOptionalChannelSetupAdapter`, `createOptionalChannelSetupWizard`, ainsi que `DEFAULT_ACCOUNT_ID`, `createTopLevelChannelDmPolicy`, `setSetupChannelEnabled`, `splitSetupEntries` |
| `plugin-sdk/channel-pairing` | Primitives dappairage DM | `createChannelPairingController` |
| `plugin-sdk/channel-reply-pipeline` | Câblage du préfixe de réponse + typing | `createChannelReplyPipeline` |
| `plugin-sdk/channel-reply-pipeline` | Câblage du préfixe de réponse + saisie | `createChannelReplyPipeline` |
| `plugin-sdk/channel-config-helpers` | Fabriques dadaptateurs de configuration | `createHybridChannelConfigAdapter` |
| `plugin-sdk/channel-config-schema` | Constructeurs de schéma de configuration | Types de schéma de configuration de canal |
| `plugin-sdk/telegram-command-config` | Helpers de configuration de commande Telegram | Normalisation de nom de commande, troncature de description, validation de doublons/conflits |
| `plugin-sdk/channel-policy` | Résolution de politique groupe/DM | `resolveChannelGroupRequireMention` |
| `plugin-sdk/channel-lifecycle` | Helpers de cycle de vie détat de compte et de flux draft | `createAccountStatusSink`, helpers de finalisation daperçu de brouillon |
| `plugin-sdk/inbound-envelope` | Helpers denveloppe entrante | Helpers partagés de construction de route + enveloppe |
| `plugin-sdk/inbound-reply-dispatch` | Helpers de réponse entrante | Helpers partagés denregistrement et de dispatch |
| `plugin-sdk/messaging-targets` | Analyse de cible de messagerie | Helpers danalyse/correspondance de cible |
| `plugin-sdk/outbound-media` | Helpers de média sortant | Chargement partagé de médias sortants |
| `plugin-sdk/outbound-runtime` | Helpers dexécution sortante | Helpers didentité/de délégation denvoi sortants et de planification de charge utile |
| `plugin-sdk/thread-bindings-runtime` | Helpers de liaison de fil | Helpers de cycle de vie et dadaptateur de liaison de fil |
| `plugin-sdk/agent-media-payload` | Helpers hérités de charge utile média | Constructeur de charge utile média dagent pour dispositions de champs héritées |
| `plugin-sdk/channel-config-schema` | Builders de schéma de configuration | Types de schéma de configuration de canal |
| `plugin-sdk/telegram-command-config` | Helpers de configuration des commandes Telegram | Normalisation des noms de commande, raccourcissement des descriptions, validation des doublons/conflits |
| `plugin-sdk/channel-policy` | Résolution de stratégie groupe/DM | `resolveChannelGroupRequireMention` |
| `plugin-sdk/channel-lifecycle` | Helpers de cycle de vie du statut de compte et de flux de brouillon | `createAccountStatusSink`, helpers de finalisation daperçu de brouillon |
| `plugin-sdk/inbound-envelope` | Helpers denveloppe entrante | Helpers partagés de route + construction denveloppe |
| `plugin-sdk/inbound-reply-dispatch` | Helpers de réponse entrante | Helpers partagés denregistrement et denvoi |
| `plugin-sdk/messaging-targets` | Analyse des cibles de messagerie | Helpers danalyse/correspondance des cibles |
| `plugin-sdk/outbound-media` | Helpers de média sortant | Chargement partagé des médias sortants |
| `plugin-sdk/outbound-runtime` | Helpers dexécution sortante | Helpers didentité sortante/délégué denvoi et de planification de charge utile |
| `plugin-sdk/thread-bindings-runtime` | Helpers de liaison de thread | Helpers de cycle de vie et dadaptateur des liaisons de thread |
| `plugin-sdk/agent-media-payload` | Helpers hérités de charge utile média | Builder de charge utile média dagent pour des dispositions de champs héritées |
| `plugin-sdk/channel-runtime` | Shim de compatibilité obsolète | Utilitaires hérités dexécution de canal uniquement |
| `plugin-sdk/channel-send-result` | Types de résultat denvoi | Types de résultat de réponse |
| `plugin-sdk/runtime-store` | Stockage persistant de Plugin | `createPluginRuntimeStore` |
| `plugin-sdk/runtime` | Helpers larges dexécution | Helpers dexécution/journalisation/sauvegarde/installation de Plugin |
| `plugin-sdk/runtime-env` | Helpers étroits denvironnement dexécution | Helpers de logger/environnement dexécution, délai dexpiration, nouvelle tentative et backoff |
| `plugin-sdk/plugin-runtime` | Helpers partagés dexécution de Plugin | Helpers de commandes/hooks/http/interactif de Plugin |
| `plugin-sdk/hook-runtime` | Helpers de pipeline de hook | Helpers partagés de pipeline de webhook/hook interne |
| `plugin-sdk/runtime-store` | Stockage persistant du plugin | `createPluginRuntimeStore` |
| `plugin-sdk/runtime` | Helpers dexécution étendus | Helpers dexécution/journalisation/sauvegarde/installation de plugin |
| `plugin-sdk/runtime-env` | Helpers ciblés denvironnement dexécution | Helpers de logger/environnement dexécution, délai dexpiration, retry et backoff |
| `plugin-sdk/plugin-runtime` | Helpers partagés dexécution de plugin | Helpers de commandes/hooks/http/interactif de plugin |
| `plugin-sdk/hook-runtime` | Helpers de pipeline de hook | Helpers partagés de pipeline de Webhook/hook interne |
| `plugin-sdk/lazy-runtime` | Helpers dexécution paresseuse | `createLazyRuntimeModule`, `createLazyRuntimeMethod`, `createLazyRuntimeMethodBinder`, `createLazyRuntimeNamedExport`, `createLazyRuntimeSurface` |
| `plugin-sdk/process-runtime` | Helpers de processus | Helpers partagés dexécution |
| `plugin-sdk/cli-runtime` | Helpers dexécution CLI | Formatage de commandes, attentes, helpers de version |
| `plugin-sdk/gateway-runtime` | Helpers de Gateway | Helpers de client gateway et de patch détat de canal |
| `plugin-sdk/cli-runtime` | Helpers dexécution CLI | Formatage de commande, attentes, helpers de version |
| `plugin-sdk/gateway-runtime` | Helpers de Gateway | Helpers de client Gateway et de patch de statut de canal |
| `plugin-sdk/config-runtime` | Helpers de configuration | Helpers de chargement/écriture de configuration |
| `plugin-sdk/telegram-command-config` | Helpers de commande Telegram | Helpers de validation de commande Telegram à repli stable lorsque la surface de contrat Telegram intégrée nest pas disponible |
| `plugin-sdk/approval-runtime` | Helpers de prompt dapprobation | Charge utile dapprobation exec/plugin, helpers de capacité/profil dapprobation, helpers natifs de routage/exécution dapprobation |
| `plugin-sdk/approval-auth-runtime` | Helpers dauthentification dapprobation | Résolution des approbateurs, auth daction dans le même chat |
| `plugin-sdk/approval-client-runtime` | Helpers de client dapprobation | Helpers natifs de profil/filtre dapprobation exec |
| `plugin-sdk/telegram-command-config` | Helpers de commandes Telegram | Helpers de validation de commandes Telegram à repli stable lorsque la surface de contrat Telegram intégrée nest pas disponible |
| `plugin-sdk/approval-runtime` | Helpers de prompt dapprobation | Charge utile dapprobation exec/plugin, helpers de capacité/profil dapprobation, helpers de routage/dexécution dapprobation native |
| `plugin-sdk/approval-auth-runtime` | Helpers dauthentification dapprobation | Résolution de lapprobateur, authentification daction dans le même chat |
| `plugin-sdk/approval-client-runtime` | Helpers de client dapprobation | Helpers de profil/filtre dapprobation exec native |
| `plugin-sdk/approval-delivery-runtime` | Helpers de livraison dapprobation | Adaptateurs de capacité/livraison dapprobation native |
| `plugin-sdk/approval-gateway-runtime` | Helpers de gateway dapprobation | Helper partagé de résolution gateway dapprobation |
| `plugin-sdk/approval-handler-adapter-runtime` | Helpers dadaptateur dapprobation | Helpers légers de chargement dadaptateur dapprobation native pour points dentrée de canal chauds |
| `plugin-sdk/approval-handler-runtime` | Helpers de gestionnaire dapprobation | Helpers plus larges dexécution de gestionnaire dapprobation ; préférez les couches plus étroites adapter/gateway lorsquelles suffisent |
| `plugin-sdk/approval-native-runtime` | Helpers de cible dapprobation | Helpers natifs de cible dapprobation/liaison de compte |
| `plugin-sdk/approval-gateway-runtime` | Helpers Gateway dapprobation | Helper partagé de résolution Gateway dapprobation |
| `plugin-sdk/approval-handler-adapter-runtime` | Helpers dadaptateur dapprobation | Helpers légers de chargement dadaptateur dapprobation native pour les points dentrée de canal sensibles au temps de chargement |
| `plugin-sdk/approval-handler-runtime` | Helpers de handler dapprobation | Helpers plus larges dexécution de handler dapprobation ; préférez les points dentrée plus ciblés adapter/gateway lorsquils suffisent |
| `plugin-sdk/approval-native-runtime` | Helpers de cible dapprobation | Helpers de liaison cible/compte dapprobation native |
| `plugin-sdk/approval-reply-runtime` | Helpers de réponse dapprobation | Helpers de charge utile de réponse dapprobation exec/plugin |
| `plugin-sdk/channel-runtime-context` | Helpers de contexte dexécution de canal | Helpers génériques denregistrement/récupération/surveillance du contexte dexécution de canal |
| `plugin-sdk/channel-runtime-context` | Helpers de contexte dexécution de canal | Helpers génériques register/get/watch du contexte dexécution de canal |
| `plugin-sdk/security-runtime` | Helpers de sécurité | Helpers partagés de confiance, filtrage DM, contenu externe et collecte de secrets |
| `plugin-sdk/ssrf-policy` | Helpers de politique SSRF | Helpers de liste blanche dhôte et de politique de réseau privé |
| `plugin-sdk/ssrf-runtime` | Helpers dexécution SSRF | Helpers de pinned-dispatcher, récupération protégée, politique SSRF |
| `plugin-sdk/ssrf-policy` | Helpers de stratégie SSRF | Helpers de liste dautorisation dhôtes et de stratégie de réseau privé |
| `plugin-sdk/ssrf-runtime` | Helpers dexécution SSRF | Helpers de répartiteur épinglé, fetch protégé, stratégie SSRF |
| `plugin-sdk/collection-runtime` | Helpers de cache borné | `pruneMapToMaxSize` |
| `plugin-sdk/diagnostic-runtime` | Helpers de filtrage diagnostique | `isDiagnosticFlagEnabled`, `isDiagnosticsEnabled` |
| `plugin-sdk/error-runtime` | Helpers de formatage derreur | `formatUncaughtError`, `isApprovalNotFoundError`, helpers de graphe derreur |
| `plugin-sdk/diagnostic-runtime` | Helpers de filtrage des diagnostics | `isDiagnosticFlagEnabled`, `isDiagnosticsEnabled` |
| `plugin-sdk/error-runtime` | Helpers de formatage des erreurs | `formatUncaughtError`, `isApprovalNotFoundError`, helpers de graphe derreurs |
| `plugin-sdk/fetch-runtime` | Helpers de fetch/proxy encapsulés | `resolveFetch`, helpers de proxy |
| `plugin-sdk/host-runtime` | Helpers de normalisation dhôte | `normalizeHostname`, `normalizeScpRemoteHost` |
| `plugin-sdk/retry-runtime` | Helpers de nouvelle tentative | `RetryConfig`, `retryAsync`, exécuteurs de politique |
| `plugin-sdk/allow-from` | Formatage de liste blanche | `formatAllowFromLowercase` |
| `plugin-sdk/allowlist-resolution` | Mapping dentrée de liste blanche | `mapAllowlistResolutionInputs` |
| `plugin-sdk/command-auth` | Filtrage de commande et helpers de surface de commande | `resolveControlCommandGate`, helpers dautorisation dexpéditeur, helpers de registre de commandes |
| `plugin-sdk/command-status` | Moteurs de rendu détat/aide de commande | `buildCommandsMessage`, `buildCommandsMessagePaginated`, `buildHelpMessage` |
| `plugin-sdk/secret-input` | Analyse dentrée secrète | Helpers dentrée secrète |
| `plugin-sdk/webhook-ingress` | Helpers de requête webhook | Utilitaires de cible webhook |
| `plugin-sdk/webhook-request-guards` | Helpers de garde du corps de requête webhook | Helpers de lecture/limite du corps de requête |
| `plugin-sdk/reply-runtime` | Exécution partagée de réponse | Dispatch entrant, Heartbeat, planificateur de réponse, segmentation |
| `plugin-sdk/reply-dispatch-runtime` | Helpers étroits de dispatch de réponse | Helpers de finalisation + dispatch fournisseur |
| `plugin-sdk/reply-history` | Helpers dhistorique de réponse | `buildHistoryContext`, `buildPendingHistoryContextFromMap`, `recordPendingHistoryEntry`, `clearHistoryEntriesIfEnabled` |
| `plugin-sdk/reply-reference` | Planification de référence de réponse | `createReplyReferencePlanner` |
| `plugin-sdk/reply-chunking` | Helpers de segmentation de réponse | Helpers de segmentation texte/markdown |
| `plugin-sdk/session-store-runtime` | Helpers de stockage de session | Helpers de chemin de stockage + updated-at |
| `plugin-sdk/state-paths` | Helpers de chemins détat | Helpers de répertoire détat et dOAuth |
| `plugin-sdk/retry-runtime` | Helpers de retry | `RetryConfig`, `retryAsync`, exécuteurs de stratégie |
| `plugin-sdk/allow-from` | Formatage de liste dautorisation | `formatAllowFromLowercase` |
| `plugin-sdk/allowlist-resolution` | Mappage des entrées de liste dautorisation | `mapAllowlistResolutionInputs` |
| `plugin-sdk/command-auth` | Helpers de filtrage de commande et de surface de commande | `resolveControlCommandGate`, helpers dautorisation dexpéditeur, helpers de registre de commandes |
| `plugin-sdk/command-status` | Rendus de statut/aide des commandes | `buildCommandsMessage`, `buildCommandsMessagePaginated`, `buildHelpMessage` |
| `plugin-sdk/secret-input` | Analyse des entrées de secret | Helpers dentrée de secret |
| `plugin-sdk/webhook-ingress` | Helpers de requête Webhook | Utilitaires de cible Webhook |
| `plugin-sdk/webhook-request-guards` | Helpers de garde du corps de requête Webhook | Helpers de lecture/limitation du corps de requête |
| `plugin-sdk/reply-runtime` | Exécution partagée des réponses | Envoi entrant, Heartbeat, planificateur de réponse, fragmentation |
| `plugin-sdk/reply-dispatch-runtime` | Helpers ciblés denvoi de réponse | Finalisation, envoi au fournisseur et helpers de libellé de conversation |
| `plugin-sdk/reply-history` | Helpers dhistorique des réponses | `buildHistoryContext`, `buildPendingHistoryContextFromMap`, `recordPendingHistoryEntry`, `clearHistoryEntriesIfEnabled` |
| `plugin-sdk/reply-reference` | Planification des références de réponse | `createReplyReferencePlanner` |
| `plugin-sdk/reply-chunking` | Helpers de fragmentation des réponses | Helpers de fragmentation texte/markdown |
| `plugin-sdk/session-store-runtime` | Helpers de magasin de session | Helpers de chemin de magasin + date de mise à jour |
| `plugin-sdk/state-paths` | Helpers de chemins détat | Helpers de répertoire détat et OAuth |
| `plugin-sdk/routing` | Helpers de routage/clé de session | `resolveAgentRoute`, `buildAgentSessionKey`, `resolveDefaultAgentBoundAccountId`, helpers de normalisation de clé de session |
| `plugin-sdk/status-helpers` | Helpers détat de canal | Constructeurs de résumé détat de canal/compte, valeurs par défaut détat dexécution, helpers de métadonnées de problème |
| `plugin-sdk/target-resolver-runtime` | Helpers de résolveur de cible | Helpers partagés de résolveur de cible |
| `plugin-sdk/status-helpers` | Helpers de statut de canal | Builders de résumé de statut de canal/compte, valeurs par défaut détat dexécution, helpers de métadonnées de problème |
| `plugin-sdk/target-resolver-runtime` | Helpers de résolution de cible | Helpers partagés de résolution de cible |
| `plugin-sdk/string-normalization-runtime` | Helpers de normalisation de chaîne | Helpers de normalisation de slug/chaîne |
| `plugin-sdk/request-url` | Helpers dURL de requête | Extraire des URL chaîne à partir dentrées de type requête |
| `plugin-sdk/run-command` | Helpers de commande temporisée | Exécuteur de commande temporisée avec stdout/stderr normalisés |
| `plugin-sdk/param-readers` | Lecteurs de paramètres | Lecteurs de paramètres communs doutil/CLI |
| `plugin-sdk/tool-payload` | Extraction de charge utile doutil | Extraire des charges utiles normalisées dobjets résultat doutil |
| `plugin-sdk/tool-send` | Extraction denvoi doutil | Extraire les champs canoniques de cible denvoi à partir des arguments doutil |
| `plugin-sdk/request-url` | Helpers dURL de requête | Extraire des URL de chaîne depuis des entrées de type requête |
| `plugin-sdk/run-command` | Helpers de commande temporisée | Exécuteur de commande temporisée avec `stdout`/`stderr` normalisés |
| `plugin-sdk/param-readers` | Lecteurs de paramètres | Lecteurs de paramètres doutil/CLI communs |
| `plugin-sdk/tool-payload` | Extraction de charge utile doutil | Extraire des charges utiles normalisées depuis des objets de résultat doutil |
| `plugin-sdk/tool-send` | Extraction denvoi doutil | Extraire des champs de cible denvoi canoniques depuis les arguments doutil |
| `plugin-sdk/temp-path` | Helpers de chemin temporaire | Helpers partagés de chemin temporaire de téléchargement |
| `plugin-sdk/logging-core` | Helpers de journalisation | Logger de sous-système et helpers de caviardage |
| `plugin-sdk/markdown-table-runtime` | Helpers de tableau Markdown | Helpers de mode tableau Markdown |
| `plugin-sdk/logging-core` | Helpers de journalisation | Helpers de logger de sous-système et de masquage |
| `plugin-sdk/markdown-table-runtime` | Helpers de tableau Markdown | Helpers de mode de tableau Markdown |
| `plugin-sdk/reply-payload` | Types de réponse de message | Types de charge utile de réponse |
| `plugin-sdk/provider-setup` | Helpers ciblés de configuration de fournisseur local/auto-hébergé | Helpers de découverte/configuration de fournisseur auto-hébergé |
| `plugin-sdk/self-hosted-provider-setup` | Helpers ciblés de configuration de fournisseur auto-hébergé compatible OpenAI | Les mêmes helpers de découverte/configuration de fournisseur auto-hébergé |
| `plugin-sdk/provider-auth-runtime` | Helpers dauthentification fournisseur à lexécution | Helpers de résolution de clé API à lexécution |
| `plugin-sdk/provider-auth-api-key` | Helpers de configuration de clé API fournisseur | Helpers donboarding/écriture de profil de clé API |
| `plugin-sdk/provider-auth-result` | Helpers de résultat dauthentification fournisseur | Constructeur standard de résultat dauthentification OAuth |
| `plugin-sdk/provider-auth-login` | Helpers de connexion interactive fournisseur | Helpers partagés de connexion interactive |
| `plugin-sdk/provider-selection-runtime` | Helpers de sélection de fournisseur | Sélection de fournisseur configuré ou automatique et fusion de configuration brute de fournisseur |
| `plugin-sdk/provider-env-vars` | Helpers de variables denvironnement fournisseur | Helpers de recherche de variables denvironnement dauthentification fournisseur |
| `plugin-sdk/provider-model-shared` | Helpers partagés de modèle/relecture fournisseur | `ProviderReplayFamily`, `buildProviderReplayFamilyHooks`, `normalizeModelCompat`, constructeurs partagés de politique de relecture, helpers de point de terminaison fournisseur, et helpers de normalisation dID de modèle |
| `plugin-sdk/provider-catalog-shared` | Helpers partagés de catalogue fournisseur | `findCatalogTemplate`, `buildSingleProviderApiKeyCatalog`, `supportsNativeStreamingUsageCompat`, `applyProviderNativeStreamingUsageCompat` |
| `plugin-sdk/provider-onboard` | Patches donboarding fournisseur | Helpers de configuration donboarding |
| `plugin-sdk/provider-http` | Helpers HTTP fournisseur | Helpers génériques HTTP/capacités de point de terminaison fournisseur, y compris les helpers de formulaire multipart pour transcription audio |
| `plugin-sdk/provider-web-fetch` | Helpers web-fetch fournisseur | Helpers denregistrement/cache de fournisseur web-fetch |
| `plugin-sdk/provider-web-search-config-contract` | Helpers de configuration web-search fournisseur | Helpers étroits de configuration/web-search/identifiants pour les fournisseurs qui nont pas besoin du câblage dactivation de Plugin |
| `plugin-sdk/provider-web-search-contract` | Helpers de contrat web-search fournisseur | Helpers étroits de contrat de configuration/web-search/identifiants tels que `createWebSearchProviderContractFields`, `enablePluginInConfig`, `resolveProviderWebSearchPluginConfig`, et setters/getters didentifiants limités par périmètre |
| `plugin-sdk/provider-web-search` | Helpers web-search fournisseur | Helpers denregistrement/cache/exécution de fournisseur web-search |
| `plugin-sdk/provider-tools` | Helpers de compatibilité outil/schéma fournisseur | `ProviderToolCompatFamily`, `buildProviderToolCompatFamilyHooks`, nettoyage de schéma Gemini + diagnostics, et helpers de compatibilité xAI tels que `resolveXaiModelCompatPatch` / `applyXaiModelCompat` |
| `plugin-sdk/provider-usage` | Helpers dutilisation fournisseur | `fetchClaudeUsage`, `fetchGeminiUsage`, `fetchGithubCopilotUsage`, et autres helpers dutilisation fournisseur |
| `plugin-sdk/provider-stream` | Helpers denrobage de flux fournisseur | `ProviderStreamFamily`, `buildProviderStreamFamilyHooks`, `composeProviderStreamWrappers`, types denrobage de flux, et helpers partagés denrobage Anthropic/Bedrock/Google/Kilocode/Moonshot/OpenAI/OpenRouter/Z.A.I/MiniMax/Copilot |
| `plugin-sdk/provider-transport-runtime` | Helpers de transport fournisseur | Helpers natifs de transport fournisseur tels que récupération protégée, transformations de messages de transport, et flux dévénements de transport inscriptibles |
| `plugin-sdk/keyed-async-queue` | File asynchrone ordonnée | `KeyedAsyncQueue` |
| `plugin-sdk/media-runtime` | Helpers média partagés | Helpers de récupération/transformation/stockage média plus constructeurs de charge utile média |
| `plugin-sdk/media-generation-runtime` | Helpers partagés de génération média | Helpers partagés de basculement, sélection de candidats, et messagerie de modèle manquant pour la génération dimage/vidéo/musique |
| `plugin-sdk/media-understanding` | Helpers de compréhension média | Types de fournisseur de compréhension média plus exportations dhelpers image/audio orientées fournisseur |
| `plugin-sdk/text-runtime` | Helpers texte partagés | Retrait du texte visible par lassistant, helpers de rendu/segmentation/tableau Markdown, helpers de caviardage, helpers de balises de directive, utilitaires de texte sûr, et helpers associés de texte/journalisation |
| `plugin-sdk/text-chunking` | Helpers de segmentation de texte | Helper de segmentation de texte sortant |
| `plugin-sdk/speech` | Helpers de parole | Types de fournisseur de parole plus helpers orientés fournisseur pour directives, registre et validation |
| `plugin-sdk/speech-core` | Cœur partagé de parole | Types de fournisseur de parole, registre, directives, normalisation |
| `plugin-sdk/realtime-transcription` | Helpers de transcription temps réel | Types de fournisseur, helpers de registre, et helper partagé de session WebSocket |
| `plugin-sdk/realtime-voice` | Helpers de voix temps réel | Types de fournisseur, helpers de registre/résolution, et helpers de session bridge |
| `plugin-sdk/image-generation-core` | Cœur partagé de génération dimage | Types de génération dimage, helpers de basculement, dauthentification et de registre |
| `plugin-sdk/music-generation` | Helpers de génération musicale | Types de fournisseur/requête/résultat de génération musicale |
| `plugin-sdk/music-generation-core` | Cœur partagé de génération musicale | Types de génération musicale, helpers de basculement, recherche de fournisseur et analyse de référence de modèle |
| `plugin-sdk/video-generation` | Helpers de génération vidéo | Types de fournisseur/requête/résultat de génération vidéo |
| `plugin-sdk/video-generation-core` | Cœur partagé de génération vidéo | Types de génération vidéo, helpers de basculement, recherche de fournisseur et analyse de référence de modèle |
| `plugin-sdk/interactive-runtime` | Helpers de réponse interactive | Normalisation/réduction de charge utile de réponse interactive |
| `plugin-sdk/channel-config-primitives` | Primitives de configuration de canal | Primitives étroites de schéma de configuration de canal |
| `plugin-sdk/channel-config-writes` | Helpers décriture de configuration de canal | Helpers dautorisation décriture de configuration de canal |
| `plugin-sdk/channel-plugin-common` | Prélude partagé de canal | Exportations de prélude partagé de plugin de canal |
| `plugin-sdk/channel-status` | Helpers détat de canal | Helpers partagés dinstantané/résumé détat de canal |
| `plugin-sdk/allowlist-config-edit` | Helpers de configuration de liste blanche | Helpers dédition/lecture de configuration de liste blanche |
| `plugin-sdk/group-access` | Helpers daccès groupe | Helpers partagés de décision daccès groupe |
| `plugin-sdk/direct-dm` | Helpers de DM direct | Helpers partagés dauthentification/garde DM direct |
| `plugin-sdk/extension-shared` | Helpers partagés dextension | Primitives passives daide de canal/état et de proxy ambiant |
| `plugin-sdk/webhook-targets` | Helpers de cible webhook | Registre de cible webhook et helpers dinstallation de route |
| `plugin-sdk/webhook-path` | Helpers de chemin webhook | Helpers de normalisation de chemin webhook |
| `plugin-sdk/web-media` | Helpers média web partagés | Helpers de chargement média distant/local |
| `plugin-sdk/zod` | Réexportation Zod | `zod` réexporté pour les consommateurs du SDK Plugin |
| `plugin-sdk/memory-core` | Helpers intégrés memory-core | Surface dassistance memory manager/config/fichier/CLI |
| `plugin-sdk/memory-core-engine-runtime` | Façade dexécution du moteur mémoire | Façade dexécution index/search de mémoire |
| `plugin-sdk/memory-core-host-engine-foundation` | Moteur fondation hôte mémoire | Exportations du moteur fondation hôte mémoire |
| `plugin-sdk/memory-core-host-engine-embeddings` | Moteur embeddings hôte mémoire | Contrats dembedding mémoire, accès registre, fournisseur local, et helpers génériques batch/distants ; les fournisseurs distants concrets vivent dans leurs plugins propriétaires |
| `plugin-sdk/memory-core-host-engine-qmd` | Moteur QMD hôte mémoire | Exportations du moteur QMD hôte mémoire |
| `plugin-sdk/memory-core-host-engine-storage` | Moteur stockage hôte mémoire | Exportations du moteur stockage hôte mémoire |
| `plugin-sdk/memory-core-host-multimodal` | Helpers multimodaux hôte mémoire | Helpers multimodaux hôte mémoire |
| `plugin-sdk/memory-core-host-query` | Helpers de requête hôte mémoire | Helpers de requête hôte mémoire |
| `plugin-sdk/memory-core-host-secret` | Helpers de secret hôte mémoire | Helpers de secret hôte mémoire |
| `plugin-sdk/memory-core-host-events` | Helpers de journal dévénements hôte mémoire | Helpers de journal dévénements hôte mémoire |
| `plugin-sdk/memory-core-host-status` | Helpers détat hôte mémoire | Helpers détat hôte mémoire |
| `plugin-sdk/memory-core-host-runtime-cli` | Exécution CLI hôte mémoire | Helpers dexécution CLI hôte mémoire |
| `plugin-sdk/memory-core-host-runtime-core` | Exécution core hôte mémoire | Helpers dexécution core hôte mémoire |
| `plugin-sdk/memory-core-host-runtime-files` | Helpers de fichier/exécution hôte mémoire | Helpers de fichier/exécution hôte mémoire |
| `plugin-sdk/memory-host-core` | Alias dexécution core hôte mémoire | Alias neutre vis-à-vis du fournisseur pour les helpers dexécution core hôte mémoire |
| `plugin-sdk/memory-host-events` | Alias de journal dévénements hôte mémoire | Alias neutre vis-à-vis du fournisseur pour les helpers de journal dévénements hôte mémoire |
| `plugin-sdk/memory-host-files` | Alias de fichier/exécution hôte mémoire | Alias neutre vis-à-vis du fournisseur pour les helpers de fichier/exécution hôte mémoire |
| `plugin-sdk/memory-host-markdown` | Helpers Markdown gérés | Helpers partagés de markdown géré pour les plugins adjacents à la mémoire |
| `plugin-sdk/memory-host-search` | Façade de recherche Active Memory | Façade dexécution paresseuse du gestionnaire de recherche active-memory |
| `plugin-sdk/memory-host-status` | Alias détat hôte mémoire | Alias neutre vis-à-vis du fournisseur pour les helpers détat hôte mémoire |
| `plugin-sdk/memory-lancedb` | Helpers intégrés memory-lancedb | Surface dassistance memory-lancedb |
| `plugin-sdk/testing` | Utilitaires de test | Helpers de test et mocks |
| `plugin-sdk/provider-setup` | Helpers organisés de configuration de fournisseur local/autohébergé | Helpers de découverte/configuration de fournisseur autohébergé |
| `plugin-sdk/self-hosted-provider-setup` | Helpers ciblés de configuration de fournisseur autohébergé compatible OpenAI | Les mêmes helpers de découverte/configuration de fournisseur autohébergé |
| `plugin-sdk/provider-auth-runtime` | Helpers dauthentification dexécution du fournisseur | Helpers de résolution de clé API à lexécution |
| `plugin-sdk/provider-auth-api-key` | Helpers de configuration de clé API du fournisseur | Helpers dintégration/écriture de profil de clé API |
| `plugin-sdk/provider-auth-result` | Helpers de résultat dauthentification du fournisseur | Builder standard de résultat dauthentification OAuth |
| `plugin-sdk/provider-auth-login` | Helpers de connexion interactive du fournisseur | Helpers partagés de connexion interactive |
| `plugin-sdk/provider-selection-runtime` | Helpers de sélection de fournisseur | Sélection du fournisseur configuré ou automatique et fusion de configuration brute de fournisseur |
| `plugin-sdk/provider-env-vars` | Helpers de variables denvironnement du fournisseur | Helpers de recherche de variable denvironnement dauthentification du fournisseur |
| `plugin-sdk/provider-model-shared` | Helpers partagés de modèle/relecture du fournisseur | `ProviderReplayFamily`, `buildProviderReplayFamilyHooks`, `normalizeModelCompat`, builders partagés de stratégie de relecture, helpers de point de terminaison du fournisseur et helpers de normalisation didentifiant de modèle |
| `plugin-sdk/provider-catalog-shared` | Helpers partagés de catalogue de fournisseur | `findCatalogTemplate`, `buildSingleProviderApiKeyCatalog`, `supportsNativeStreamingUsageCompat`, `applyProviderNativeStreamingUsageCompat` |
| `plugin-sdk/provider-onboard` | Patches dintégration du fournisseur | Helpers de configuration dintégration |
| `plugin-sdk/provider-http` | Helpers HTTP du fournisseur | Helpers génériques de capacité HTTP/point de terminaison du fournisseur, y compris les helpers de formulaire multipart pour la transcription audio |
| `plugin-sdk/provider-web-fetch` | Helpers web-fetch du fournisseur | Helpers denregistrement/cache de fournisseur web-fetch |
| `plugin-sdk/provider-web-search-config-contract` | Helpers de configuration de recherche web du fournisseur | Helpers ciblés de configuration/identifiants de recherche web pour les fournisseurs qui nont pas besoin du câblage dactivation du plugin |
| `plugin-sdk/provider-web-search-contract` | Helpers de contrat de recherche web du fournisseur | Helpers ciblés de contrat de configuration/identifiants de recherche web tels que `createWebSearchProviderContractFields`, `enablePluginInConfig`, `resolveProviderWebSearchPluginConfig` et des setters/getters didentifiants à portée limitée |
| `plugin-sdk/provider-web-search` | Helpers de recherche web du fournisseur | Helpers denregistrement/cache/exécution de fournisseur de recherche web |
| `plugin-sdk/provider-tools` | Helpers de compatibilité outil/schéma du fournisseur | `ProviderToolCompatFamily`, `buildProviderToolCompatFamilyHooks`, nettoyage de schéma Gemini + diagnostics, et helpers de compatibilité xAI tels que `resolveXaiModelCompatPatch` / `applyXaiModelCompat` |
| `plugin-sdk/provider-usage` | Helpers dutilisation du fournisseur | `fetchClaudeUsage`, `fetchGeminiUsage`, `fetchGithubCopilotUsage` et autres helpers dutilisation du fournisseur |
| `plugin-sdk/provider-stream` | Helpers denveloppe de flux du fournisseur | `ProviderStreamFamily`, `buildProviderStreamFamilyHooks`, `composeProviderStreamWrappers`, types denveloppe de flux, et helpers partagés denveloppe Anthropic/Bedrock/Google/Kilocode/Moonshot/OpenAI/OpenRouter/Z.A.I/MiniMax/Copilot |
| `plugin-sdk/provider-transport-runtime` | Helpers de transport du fournisseur | Helpers de transport natif du fournisseur tels que fetch protégé, transformations de messages de transport et flux dévénements de transport inscriptibles |
| `plugin-sdk/keyed-async-queue` | File asynchrone ordonnée | `KeyedAsyncQueue` |
| `plugin-sdk/media-runtime` | Helpers média partagés | Helpers de récupération/transformation/stockage de média ainsi que builders de charge utile média |
| `plugin-sdk/media-generation-runtime` | Helpers partagés de génération de média | Helpers partagés de basculement, sélection de candidats et messages de modèle manquant pour la génération dimage/vidéo/musique |
| `plugin-sdk/media-understanding` | Helpers de compréhension des médias | Types de fournisseur de compréhension des médias ainsi quexports de helpers image/audio destinés aux fournisseurs |
| `plugin-sdk/text-runtime` | Helpers texte partagés | Suppression du texte visible par lassistant, helpers de rendu/fragmentation/tableau markdown, helpers de masquage, helpers de balise de directive, utilitaires de texte sûr et helpers associés de texte/journalisation |
| `plugin-sdk/text-chunking` | Helpers de fragmentation du texte | Helper de fragmentation de texte sortant |
| `plugin-sdk/speech` | Helpers de parole | Types de fournisseur de parole ainsi que helpers de directive, registre et validation destinés aux fournisseurs |
| `plugin-sdk/speech-core` | Cœur partagé de la parole | Types de fournisseur de parole, registre, directives, normalisation |
| `plugin-sdk/realtime-transcription` | Helpers de transcription temps réel | Types de fournisseur, helpers de registre et helper partagé de session WebSocket |
| `plugin-sdk/realtime-voice` | Helpers de voix temps réel | Types de fournisseur, helpers de registre/résolution et helpers de session de pont |
| `plugin-sdk/image-generation-core` | Cœur partagé de génération dimage | Types de génération dimage, helpers de basculement, dauthentification et de registre |
| `plugin-sdk/music-generation` | Helpers de génération musicale | Types de fournisseur/requête/résultat de génération musicale |
| `plugin-sdk/music-generation-core` | Cœur partagé de génération musicale | Types de génération musicale, helpers de basculement, recherche de fournisseur et analyse de model-ref |
| `plugin-sdk/video-generation` | Helpers de génération vidéo | Types de fournisseur/requête/résultat de génération vidéo |
| `plugin-sdk/video-generation-core` | Cœur partagé de génération vidéo | Types de génération vidéo, helpers de basculement, recherche de fournisseur et analyse de model-ref |
| `plugin-sdk/interactive-runtime` | Helpers de réponse interactive | Normalisation/réduction de charge utile de réponse interactive |
| `plugin-sdk/channel-config-primitives` | Primitives de configuration de canal | Primitives ciblées de config-schema de canal |
| `plugin-sdk/channel-config-writes` | Helpers décriture de configuration de canal | Helpers dautorisation décriture de configuration de canal |
| `plugin-sdk/channel-plugin-common` | Prélude de canal partagé | Exports de prélude de plugin de canal partagé |
| `plugin-sdk/channel-status` | Helpers de statut de canal | Helpers partagés dinstantané/résumé de statut de canal |
| `plugin-sdk/allowlist-config-edit` | Helpers de configuration de liste dautorisation | Helpers de lecture/édition de configuration de liste dautorisation |
| `plugin-sdk/group-access` | Helpers daccès de groupe | Helpers partagés de décision daccès de groupe |
| `plugin-sdk/direct-dm` | Helpers de DM direct | Helpers partagés dauthentification/garde de DM direct |
| `plugin-sdk/extension-shared` | Helpers partagés dextension | Primitives de helpers de canal passif/statut et de proxy ambiant |
| `plugin-sdk/webhook-targets` | Helpers de cible Webhook | Registre de cibles Webhook et helpers dinstallation de route |
| `plugin-sdk/webhook-path` | Helpers de chemin Webhook | Helpers de normalisation de chemin Webhook |
| `plugin-sdk/web-media` | Helpers web media partagés | Helpers de chargement de média distant/local |
| `plugin-sdk/zod` | Réexportation de Zod | `zod` réexporté pour les consommateurs du SDK de Plugin |
| `plugin-sdk/memory-core` | Helpers intégrés memory-core | Surface de helpers du gestionnaire/configuration/fichier/CLI de mémoire |
| `plugin-sdk/memory-core-engine-runtime` | Façade dexécution du moteur mémoire | Façade dexécution dindexation/recherche mémoire |
| `plugin-sdk/memory-core-host-engine-foundation` | Moteur de fondation de lhôte mémoire | Exports du moteur de fondation de lhôte mémoire |
| `plugin-sdk/memory-core-host-engine-embeddings` | Moteur dembeddings de lhôte mémoire | Contrats dembeddings mémoire, accès au registre, fournisseur local et helpers génériques de lot/distant ; les fournisseurs distants concrets vivent dans leurs plugins propriétaires |
| `plugin-sdk/memory-core-host-engine-qmd` | Moteur QMD de lhôte mémoire | Exports du moteur QMD de lhôte mémoire |
| `plugin-sdk/memory-core-host-engine-storage` | Moteur de stockage de lhôte mémoire | Exports du moteur de stockage de lhôte mémoire |
| `plugin-sdk/memory-core-host-multimodal` | Helpers multimodaux de lhôte mémoire | Helpers multimodaux de lhôte mémoire |
| `plugin-sdk/memory-core-host-query` | Helpers de requête de lhôte mémoire | Helpers de requête de lhôte mémoire |
| `plugin-sdk/memory-core-host-secret` | Helpers de secret de lhôte mémoire | Helpers de secret de lhôte mémoire |
| `plugin-sdk/memory-core-host-events` | Helpers de journal dévénements de lhôte mémoire | Helpers de journal dévénements de lhôte mémoire |
| `plugin-sdk/memory-core-host-status` | Helpers de statut de lhôte mémoire | Helpers de statut de lhôte mémoire |
| `plugin-sdk/memory-core-host-runtime-cli` | Exécution CLI de lhôte mémoire | Helpers dexécution CLI de lhôte mémoire |
| `plugin-sdk/memory-core-host-runtime-core` | Exécution cœur de lhôte mémoire | Helpers dexécution cœur de lhôte mémoire |
| `plugin-sdk/memory-core-host-runtime-files` | Helpers de fichier/exécution de lhôte mémoire | Helpers de fichier/exécution de lhôte mémoire |
| `plugin-sdk/memory-host-core` | Alias dexécution cœur de lhôte mémoire | Alias neutre vis-à-vis du fournisseur pour les helpers dexécution cœur de lhôte mémoire |
| `plugin-sdk/memory-host-events` | Alias de journal dévénements de lhôte mémoire | Alias neutre vis-à-vis du fournisseur pour les helpers de journal dévénements de lhôte mémoire |
| `plugin-sdk/memory-host-files` | Alias de fichier/exécution de lhôte mémoire | Alias neutre vis-à-vis du fournisseur pour les helpers de fichier/exécution de lhôte mémoire |
| `plugin-sdk/memory-host-markdown` | Helpers de markdown géré | Helpers partagés de markdown géré pour les plugins adjacents à la mémoire |
| `plugin-sdk/memory-host-search` | Façade de recherche Active Memory | Façade dexécution paresseuse du gestionnaire de recherche Active Memory |
| `plugin-sdk/memory-host-status` | Alias de statut de lhôte mémoire | Alias neutre vis-à-vis du fournisseur pour les helpers de statut de lhôte mémoire |
| `plugin-sdk/memory-lancedb` | Helpers intégrés memory-lancedb | Surface de helpers memory-lancedb |
| `plugin-sdk/testing` | Utilitaires de test | Helpers de test et mocks |
</Accordion>
Ce tableau est volontairement le sous-ensemble commun de migration, et non la surface complète du SDK.
La liste complète des plus de 200 points dentrée se trouve dans
`scripts/lib/plugin-sdk-entrypoints.json`.
Ce tableau représente volontairement le sous-ensemble courant pour la migration, et non la surface complète du SDK. La liste complète des plus de 200 points dentrée se trouve dans `scripts/lib/plugin-sdk-entrypoints.json`.
Cette liste inclut encore certaines couches dassistance pour plugins intégrés telles que
`plugin-sdk/feishu`, `plugin-sdk/feishu-setup`, `plugin-sdk/zalo`,
`plugin-sdk/zalo-setup`, et `plugin-sdk/matrix*`. Elles restent exportées pour la
maintenance et la compatibilité des plugins intégrés, mais sont volontairement
omises du tableau commun de migration et ne constituent pas la cible recommandée pour
du nouveau code de Plugin.
Cette liste inclut encore certains points dentrée de helpers pour plugins intégrés tels que `plugin-sdk/feishu`, `plugin-sdk/feishu-setup`, `plugin-sdk/zalo`, `plugin-sdk/zalo-setup` et `plugin-sdk/matrix*`. Ils restent exportés pour la maintenance et la compatibilité des plugins intégrés, mais ils sont volontairement omis du tableau de migration courant et ne constituent pas la cible recommandée pour le nouveau code de plugin.
La même règle sapplique aux autres familles de helpers intégrés telles que :
La même règle sapplique à dautres familles de helpers intégrés telles que :
- helpers de prise en charge navigateur : `plugin-sdk/browser-cdp`, `plugin-sdk/browser-config-runtime`, `plugin-sdk/browser-config-support`, `plugin-sdk/browser-control-auth`, `plugin-sdk/browser-node-runtime`, `plugin-sdk/browser-profiles`, `plugin-sdk/browser-security-runtime`, `plugin-sdk/browser-setup-tools`, `plugin-sdk/browser-support`
- helpers de prise en charge du navigateur : `plugin-sdk/browser-cdp`, `plugin-sdk/browser-config-runtime`, `plugin-sdk/browser-config-support`, `plugin-sdk/browser-control-auth`, `plugin-sdk/browser-node-runtime`, `plugin-sdk/browser-profiles`, `plugin-sdk/browser-security-runtime`, `plugin-sdk/browser-setup-tools`, `plugin-sdk/browser-support`
- Matrix : `plugin-sdk/matrix*`
- LINE : `plugin-sdk/line*`
- IRC : `plugin-sdk/irc*`
- surfaces dassistance/plugin intégrées telles que `plugin-sdk/googlechat`,
- surfaces de helper/plugin intégrées comme `plugin-sdk/googlechat`,
`plugin-sdk/zalouser`, `plugin-sdk/bluebubbles*`,
`plugin-sdk/mattermost*`, `plugin-sdk/msteams`,
`plugin-sdk/nextcloud-talk`, `plugin-sdk/nostr`, `plugin-sdk/tlon`,
`plugin-sdk/twitch`,
`plugin-sdk/github-copilot-login`, `plugin-sdk/github-copilot-token`,
`plugin-sdk/diagnostics-otel`, `plugin-sdk/diffs`, `plugin-sdk/llm-task`,
`plugin-sdk/thread-ownership`, et `plugin-sdk/voice-call`
`plugin-sdk/thread-ownership` et `plugin-sdk/voice-call`
`plugin-sdk/github-copilot-token` expose actuellement la surface étroite dassistance de jeton
`DEFAULT_COPILOT_API_BASE_URL`,
`deriveCopilotApiBaseUrlFromToken`, et `resolveCopilotApiToken`.
`plugin-sdk/github-copilot-token` expose actuellement la surface ciblée de helper de jeton `DEFAULT_COPILOT_API_BASE_URL`, `deriveCopilotApiBaseUrlFromToken` et `resolveCopilotApiToken`.
Utilisez limport le plus étroit qui corresponde à la tâche. Si vous ne trouvez pas un export,
vérifiez la source dans `src/plugin-sdk/` ou demandez sur Discord.
Utilisez limport le plus ciblé correspondant à la tâche. Si vous ne trouvez pas un export, consultez la source dans `src/plugin-sdk/` ou demandez dans Discord.
## Calendrier de suppression
| Quand | Ce qui se passe |
| ---------------------- | ---------------------------------------------------------------------- |
| **Maintenant** | Les surfaces obsolètes émettent des avertissements à lexécution |
| Quand | Ce qui se passe |
| ---------------------- | ----------------------------------------------------------------------- |
| **Maintenant** | Les surfaces obsolètes émettent des avertissements à lexécution |
| **Prochaine version majeure** | Les surfaces obsolètes seront supprimées ; les plugins qui les utilisent encore échoueront |
Tous les plugins core ont déjà été migrés. Les plugins externes doivent migrer
avant la prochaine version majeure.
Tous les plugins du cœur ont déjà été migrés. Les plugins externes doivent migrer avant la prochaine version majeure.
## Supprimer temporairement les avertissements
## Masquer temporairement les avertissements
Définissez ces variables denvironnement pendant que vous travaillez à la migration :
Définissez ces variables denvironnement pendant que vous travaillez sur la migration :
```bash
OPENCLAW_SUPPRESS_PLUGIN_SDK_COMPAT_WARNING=1 openclaw gateway run
OPENCLAW_SUPPRESS_EXTENSION_API_WARNING=1 openclaw gateway run
```
Il sagit dune échappatoire temporaire, pas dune solution permanente.
Il sagit dune échappatoire temporaire, et non dune solution permanente.
## Lié
- [Prise en main](/fr/plugins/building-plugins) — créer votre premier Plugin
- [Pour commencer](/fr/plugins/building-plugins) — créez votre premier plugin
- [Vue densemble du SDK](/fr/plugins/sdk-overview) — référence complète des imports par sous-chemin
- [Plugins de canal](/fr/plugins/sdk-channel-plugins) — créer des plugins de canal
- [Plugins fournisseur](/fr/plugins/sdk-provider-plugins) — créer des plugins fournisseur
- [Internals des plugins](/fr/plugins/architecture) — analyse approfondie de larchitecture
- [Manifest de Plugin](/fr/plugins/manifest) — référence du schéma de manifest
- [Plugins de fournisseur](/fr/plugins/sdk-provider-plugins) — créer des plugins de fournisseur
- [Internes des plugins](/fr/plugins/architecture) — analyse approfondie de larchitecture
- [Manifeste de plugin](/fr/plugins/manifest) — référence du schéma de manifeste

View File

@ -1,30 +1,30 @@
---
read_when:
- choix du bon sous-chemin plugin-sdk pour un import de plugin
- audit des sous-chemins de plugins intégrés et des surfaces de helpers
summary: 'catalogue des sous-chemins du SDK de plugin : où vivent les imports, groupés par domaine'
title: sous-chemins du SDK de plugin
- Choisir le bon sous-chemin de plugin-sdk pour une importation de Plugin
- Audit des sous-chemins de bundled-plugin et des surfaces dassistance
summary: 'Catalogue des sous-chemins du Plugin SDK : où se trouvent quelles importations, regroupées par domaine'
title: Sous-chemins du Plugin SDK
x-i18n:
generated_at: "2026-04-24T07:24:50Z"
generated_at: "2026-04-24T08:57:07Z"
model: gpt-5.4
provider: openai
source_hash: ff4b934501a3163e36b402db72dd75a260fe9f849b3823a7a05e4867a1a5e655
source_hash: 20b923e392b3ec65cfc958ccc7452b52d82bc372ae57cc9becad74a5085ed71b
source_path: plugins/sdk-subpaths.md
workflow: 15
---
Le SDK de plugin est exposé comme un ensemble de sous-chemins étroits sous `openclaw/plugin-sdk/`.
Cette page catalogue les sous-chemins les plus courants, groupés par usage. La
liste complète générée de plus de 200 sous-chemins se trouve dans `scripts/lib/plugin-sdk-entrypoints.json` ;
les sous-chemins réservés de helpers pour plugins intégrés y apparaissent mais restent des
détails dimplémentation sauf si une page de documentation les promeut explicitement.
Le Plugin SDK est exposé comme un ensemble de sous-chemins étroits sous `openclaw/plugin-sdk/`.
Cette page répertorie les sous-chemins couramment utilisés, regroupés par usage. La liste complète générée
de plus de 200 sous-chemins se trouve dans `scripts/lib/plugin-sdk-entrypoints.json` ;
les sous-chemins dassistance réservés à bundled-plugin y apparaissent, mais sont des détails
dimplémentation, sauf si une page de documentation les met explicitement en avant.
Pour le guide de création de plugins, voir [Vue densemble du SDK de plugin](/fr/plugins/sdk-overview).
Pour le guide de création de Plugin, voir [vue densemble du Plugin SDK](/fr/plugins/sdk-overview).
## Entrée de plugin
## Entrée de Plugin
| Sous-chemin | Exports clés |
| --------------------------- | -------------------------------------------------------------------------------------------------------------------------------------- |
| Sous-chemin | Exportations clés |
| -------------------------- | -------------------------------------------------------------------------------------------------------------------------------------- |
| `plugin-sdk/plugin-entry` | `definePluginEntry` |
| `plugin-sdk/core` | `defineChannelPluginEntry`, `createChatChannelPlugin`, `createChannelPluginBase`, `defineSetupPluginEntry`, `buildChannelConfigSchema` |
| `plugin-sdk/config-schema` | `OpenClawSchema` |
@ -32,256 +32,256 @@ x-i18n:
<AccordionGroup>
<Accordion title="Sous-chemins de canal">
| Sous-chemin | Exports clés |
| Sous-chemin | Exportations clés |
| --- | --- |
| `plugin-sdk/channel-core` | `defineChannelPluginEntry`, `defineSetupPluginEntry`, `createChatChannelPlugin`, `createChannelPluginBase` |
| `plugin-sdk/config-schema` | Export du schéma Zod racine `openclaw.json` (`OpenClawSchema`) |
| `plugin-sdk/channel-setup` | `createOptionalChannelSetupSurface`, `createOptionalChannelSetupAdapter`, `createOptionalChannelSetupWizard`, plus `DEFAULT_ACCOUNT_ID`, `createTopLevelChannelDmPolicy`, `setSetupChannelEnabled`, `splitSetupEntries` |
| `plugin-sdk/setup` | Helpers partagés dassistant de configuration, invites de liste dautorisation, constructeurs détat de configuration |
| `plugin-sdk/config-schema` | Exportation du schéma Zod racine `openclaw.json` (`OpenClawSchema`) |
| `plugin-sdk/channel-setup` | `createOptionalChannelSetupSurface`, `createOptionalChannelSetupAdapter`, `createOptionalChannelSetupWizard`, ainsi que `DEFAULT_ACCOUNT_ID`, `createTopLevelChannelDmPolicy`, `setSetupChannelEnabled`, `splitSetupEntries` |
| `plugin-sdk/setup` | Assistants partagés pour lassistant de configuration, invites de liste dautorisation, constructeurs détat de configuration |
| `plugin-sdk/setup-runtime` | `createPatchedAccountSetupAdapter`, `createEnvPatchedAccountSetupAdapter`, `createSetupInputPresenceValidator`, `noteChannelLookupFailure`, `noteChannelLookupSummary`, `promptResolvedAllowFrom`, `splitSetupEntries`, `createAllowlistSetupWizardProxy`, `createDelegatedSetupWizardProxy` |
| `plugin-sdk/setup-adapter-runtime` | `createEnvPatchedAccountSetupAdapter` |
| `plugin-sdk/setup-tools` | `formatCliCommand`, `detectBinary`, `extractArchive`, `resolveBrewExecutable`, `formatDocsLink`, `CONFIG_DIR` |
| `plugin-sdk/account-core` | Helpers multi-comptes de configuration/barrière daction, helpers de repli du compte par défaut |
| `plugin-sdk/account-id` | `DEFAULT_ACCOUNT_ID`, helpers de normalisation did de compte |
| `plugin-sdk/account-resolution` | Helpers de recherche de compte + repli par défaut |
| `plugin-sdk/account-helpers` | Helpers étroits de liste dactions/de comptes |
| `plugin-sdk/account-core` | Assistants de configuration multi-compte/contrôle dactions, assistants de repli vers le compte par défaut |
| `plugin-sdk/account-id` | `DEFAULT_ACCOUNT_ID`, assistants de normalisation didentifiant de compte |
| `plugin-sdk/account-resolution` | Assistants de recherche de compte + repli par défaut |
| `plugin-sdk/account-helpers` | Assistants ciblés pour les listes de comptes et les actions sur les comptes |
| `plugin-sdk/channel-pairing` | `createChannelPairingController` |
| `plugin-sdk/channel-reply-pipeline` | `createChannelReplyPipeline` |
| `plugin-sdk/channel-config-helpers` | `createHybridChannelConfigAdapter` |
| `plugin-sdk/channel-config-schema` | Types de schéma de configuration de canal |
| `plugin-sdk/telegram-command-config` | Helpers de normalisation/validation des commandes personnalisées Telegram avec repli vers contrat intégré |
| `plugin-sdk/command-gating` | Helpers étroits de barrière dautorisation de commande |
| `plugin-sdk/telegram-command-config` | Assistants de normalisation/validation des commandes personnalisées Telegram avec repli vers le contrat bundled |
| `plugin-sdk/command-gating` | Assistants ciblés de contrôle dautorisation des commandes |
| `plugin-sdk/channel-policy` | `resolveChannelGroupRequireMention` |
| `plugin-sdk/channel-lifecycle` | `createAccountStatusSink`, helpers de cycle de vie/finalisation de flux de brouillon |
| `plugin-sdk/inbound-envelope` | Helpers partagés de route entrante + construction denveloppe |
| `plugin-sdk/inbound-reply-dispatch` | Helpers partagés denregistrement et de répartition entrante |
| `plugin-sdk/messaging-targets` | Helpers danalyse/mise en correspondance des cibles |
| `plugin-sdk/outbound-media` | Helpers partagés de chargement de médias sortants |
| `plugin-sdk/outbound-runtime` | Helpers didentité sortante, de délégation denvoi et de planification de charge utile |
| `plugin-sdk/poll-runtime` | Helpers étroits de normalisation de sondage |
| `plugin-sdk/thread-bindings-runtime` | Helpers de cycle de vie dassociation de fil et dadaptateur |
| `plugin-sdk/channel-lifecycle` | `createAccountStatusSink`, assistants de cycle de vie/finalisation des flux de brouillons |
| `plugin-sdk/inbound-envelope` | Assistants partagés pour les routes entrantes + la construction denveloppes |
| `plugin-sdk/inbound-reply-dispatch` | Assistants partagés pour lenregistrement et la distribution des réponses entrantes |
| `plugin-sdk/messaging-targets` | Assistants danalyse/correspondance des cibles |
| `plugin-sdk/outbound-media` | Assistants partagés de chargement des médias sortants |
| `plugin-sdk/outbound-runtime` | Assistants pour lidentité sortante, le délégué denvoi et la planification de charge utile |
| `plugin-sdk/poll-runtime` | Assistants ciblés de normalisation des sondages |
| `plugin-sdk/thread-bindings-runtime` | Assistants pour le cycle de vie des liaisons de fils et les adaptateurs |
| `plugin-sdk/agent-media-payload` | Constructeur hérité de charge utile média dagent |
| `plugin-sdk/conversation-runtime` | Helpers de liaison conversation/fil, dassociation et de liaison configurée |
| `plugin-sdk/runtime-config-snapshot` | Helper dinstantané de configuration runtime |
| `plugin-sdk/runtime-group-policy` | Helpers runtime de résolution de politique de groupe |
| `plugin-sdk/channel-status` | Helpers partagés dinstantané/résumé détat de canal |
| `plugin-sdk/channel-config-primitives` | Primitifs étroits de schéma de configuration de canal |
| `plugin-sdk/channel-config-writes` | Helpers dautorisation des écritures de configuration de canal |
| `plugin-sdk/channel-plugin-common` | Exports de prélude partagés pour plugins de canal |
| `plugin-sdk/allowlist-config-edit` | Helpers de lecture/édition de configuration de liste dautorisation |
| `plugin-sdk/group-access` | Helpers partagés de décision daccès de groupe |
| `plugin-sdk/direct-dm` | Helpers partagés dauthentification/protection des DM directs |
| `plugin-sdk/interactive-runtime` | Présentation sémantique de message, livraison et helpers hérités de réponse interactive. Voir [Présentation de message](/fr/plugins/message-presentation) |
| `plugin-sdk/channel-inbound` | Barrel de compatibilité pour lanti-rebond entrant, la correspondance de mentions, les helpers de politique de mention et les helpers denveloppe |
| `plugin-sdk/channel-inbound-debounce` | Helpers étroits danti-rebond entrant |
| `plugin-sdk/channel-mention-gating` | Helpers étroits de politique de mention et de texte de mention sans la surface runtime entrante plus large |
| `plugin-sdk/channel-envelope` | Helpers étroits de formatage denveloppe entrante |
| `plugin-sdk/channel-location` | Helpers de contexte et de formatage de localisation de canal |
| `plugin-sdk/channel-logging` | Helpers de journalisation de canal pour suppressions entrantes et échecs de saisie/accusé de réception |
| `plugin-sdk/channel-send-result` | Types de résultats de réponse |
| `plugin-sdk/channel-actions` | Helpers dactions de message de canal, plus helpers de schéma natif obsolètes conservés pour la compatibilité des plugins |
| `plugin-sdk/channel-targets` | Helpers danalyse/mise en correspondance des cibles |
| `plugin-sdk/conversation-runtime` | Assistants pour les liaisons de conversation/fil, lappairage et les liaisons configurées |
| `plugin-sdk/runtime-config-snapshot` | Assistant dinstantané de configuration dexécution |
| `plugin-sdk/runtime-group-policy` | Assistants de résolution de politique de groupe à lexécution |
| `plugin-sdk/channel-status` | Assistants partagés dinstantané/résumé de létat du canal |
| `plugin-sdk/channel-config-primitives` | Primitives ciblées de schéma de configuration de canal |
| `plugin-sdk/channel-config-writes` | Assistants dautorisation décriture de configuration de canal |
| `plugin-sdk/channel-plugin-common` | Exportations de prélude partagées pour Plugin de canal |
| `plugin-sdk/allowlist-config-edit` | Assistants de lecture/modification de configuration de liste dautorisation |
| `plugin-sdk/group-access` | Assistants partagés de décision daccès de groupe |
| `plugin-sdk/direct-dm` | Assistants partagés dauthentification/garde-fou pour messages directs |
| `plugin-sdk/interactive-runtime` | Assistants pour la présentation sémantique des messages, la livraison et les réponses interactives héritées. Voir [Présentation des messages](/fr/plugins/message-presentation) |
| `plugin-sdk/channel-inbound` | Barrel de compatibilité pour lanti-rebond entrant, la correspondance de mention, les assistants de politique de mention et les assistants denveloppe |
| `plugin-sdk/channel-inbound-debounce` | Assistants ciblés danti-rebond entrant |
| `plugin-sdk/channel-mention-gating` | Assistants ciblés pour la politique de mention et le texte de mention, sans la surface dexécution entrante plus large |
| `plugin-sdk/channel-envelope` | Assistants ciblés de formatage des enveloppes entrantes |
| `plugin-sdk/channel-location` | Assistants de contexte et de formatage demplacement du canal |
| `plugin-sdk/channel-logging` | Assistants de journalisation de canal pour les abandons entrants et les échecs de saisie/accusé de réception |
| `plugin-sdk/channel-send-result` | Types de résultat de réponse |
| `plugin-sdk/channel-actions` | Assistants dactions sur les messages de canal, ainsi que des assistants de schéma natif obsolètes conservés pour la compatibilité des Plugin |
| `plugin-sdk/channel-targets` | Assistants danalyse/correspondance des cibles |
| `plugin-sdk/channel-contract` | Types de contrat de canal |
| `plugin-sdk/channel-feedback` | Câblage des retours/réactions |
| `plugin-sdk/channel-secret-runtime` | Helpers étroits de contrat de secret tels que `collectSimpleChannelFieldAssignments`, `getChannelSurface`, `pushAssignment`, et types de cibles de secret |
| `plugin-sdk/channel-secret-runtime` | Assistants ciblés de contrat de secret tels que `collectSimpleChannelFieldAssignments`, `getChannelSurface`, `pushAssignment` et les types de cible de secret |
</Accordion>
<Accordion title="Sous-chemins de fournisseur">
| Sous-chemin | Exports clés |
| Sous-chemin | Exportations clés |
| --- | --- |
| `plugin-sdk/provider-entry` | `defineSingleProviderPluginEntry` |
| `plugin-sdk/provider-setup` | Helpers soignés de configuration de fournisseur local/auto-hébergé |
| `plugin-sdk/self-hosted-provider-setup` | Helpers ciblés de configuration de fournisseur auto-hébergé compatible OpenAI |
| `plugin-sdk/cli-backend` | Valeurs par défaut de backend CLI + constantes watchdog |
| `plugin-sdk/provider-auth-runtime` | Helpers runtime de résolution de clé API pour les plugins de fournisseur |
| `plugin-sdk/provider-auth-api-key` | Helpers dintégration par clé API/écriture de profil tels que `upsertApiKeyProfile` |
| `plugin-sdk/provider-setup` | Assistants de configuration sélectionnés pour les fournisseurs locaux/autohébergés |
| `plugin-sdk/self-hosted-provider-setup` | Assistants ciblés de configuration de fournisseur autohébergé compatible OpenAI |
| `plugin-sdk/cli-backend` | Valeurs par défaut du backend CLI + constantes de surveillance |
| `plugin-sdk/provider-auth-runtime` | Assistants dexécution pour la résolution des clés API pour les Plugin de fournisseur |
| `plugin-sdk/provider-auth-api-key` | Assistants dintégration/écriture de profil de clé API tels que `upsertApiKeyProfile` |
| `plugin-sdk/provider-auth-result` | Constructeur standard de résultat dauthentification OAuth |
| `plugin-sdk/provider-auth-login` | Helpers interactifs partagés de connexion pour les plugins de fournisseur |
| `plugin-sdk/provider-env-vars` | Helpers de recherche des variables denvironnement dauthentification du fournisseur |
| `plugin-sdk/provider-auth-login` | Assistants partagés de connexion interactive pour les Plugin de fournisseur |
| `plugin-sdk/provider-env-vars` | Assistants de recherche des variables denvironnement dauthentification du fournisseur |
| `plugin-sdk/provider-auth` | `createProviderApiKeyAuthMethod`, `ensureApiKeyFromOptionEnvOrPrompt`, `upsertAuthProfile`, `upsertApiKeyProfile`, `writeOAuthCredentials` |
| `plugin-sdk/provider-model-shared` | `ProviderReplayFamily`, `buildProviderReplayFamilyHooks`, `normalizeModelCompat`, constructeurs partagés de politique de relecture, helpers de point de terminaison fournisseur et helpers de normalisation did de modèle tels que `normalizeNativeXaiModelId` |
| `plugin-sdk/provider-model-shared` | `ProviderReplayFamily`, `buildProviderReplayFamilyHooks`, `normalizeModelCompat`, constructeurs partagés de politique de relecture, assistants dendpoint fournisseur, et assistants de normalisation didentifiant de modèle tels que `normalizeNativeXaiModelId` |
| `plugin-sdk/provider-catalog-shared` | `findCatalogTemplate`, `buildSingleProviderApiKeyCatalog`, `supportsNativeStreamingUsageCompat`, `applyProviderNativeStreamingUsageCompat` |
| `plugin-sdk/provider-http` | Helpers génériques HTTP/capacité de point de terminaison fournisseur, y compris les helpers de formulaires multipart pour la transcription audio |
| `plugin-sdk/provider-web-fetch-contract` | Helpers étroits de contrat config/sélection web-fetch tels que `enablePluginInConfig` et `WebFetchProviderPlugin` |
| `plugin-sdk/provider-web-fetch` | Helpers denregistrement/cache des fournisseurs web-fetch |
| `plugin-sdk/provider-web-search-config-contract` | Helpers étroits config/identifiants de recherche web pour les fournisseurs qui nont pas besoin du câblage dactivation du plugin |
| `plugin-sdk/provider-web-search-contract` | Helpers étroits de contrat config/identifiants de recherche web tels que `createWebSearchProviderContractFields`, `enablePluginInConfig`, `resolveProviderWebSearchPluginConfig`, et setters/getters didentifiants limités par portée |
| `plugin-sdk/provider-web-search` | Helpers denregistrement/cache/runtime des fournisseurs de recherche web |
| `plugin-sdk/provider-tools` | `ProviderToolCompatFamily`, `buildProviderToolCompatFamilyHooks`, nettoyage + diagnostics de schéma Gemini, et helpers de compat xAI tels que `resolveXaiModelCompatPatch` / `applyXaiModelCompat` |
| `plugin-sdk/provider-http` | Assistants génériques de capacité HTTP/endpoint fournisseur, y compris les assistants de formulaire multipart pour la transcription audio |
| `plugin-sdk/provider-web-fetch-contract` | Assistants ciblés de contrat de configuration/sélection web-fetch tels que `enablePluginInConfig` et `WebFetchProviderPlugin` |
| `plugin-sdk/provider-web-fetch` | Assistants denregistrement/cache pour les fournisseurs web-fetch |
| `plugin-sdk/provider-web-search-config-contract` | Assistants ciblés de configuration/identifiants web-search pour les fournisseurs qui nont pas besoin du câblage dactivation de Plugin |
| `plugin-sdk/provider-web-search-contract` | Assistants ciblés de contrat de configuration/identifiants web-search tels que `createWebSearchProviderContractFields`, `enablePluginInConfig`, `resolveProviderWebSearchPluginConfig` et des accesseurs/mutateurs didentifiants à portée limitée |
| `plugin-sdk/provider-web-search` | Assistants denregistrement/cache/exécution pour les fournisseurs web-search |
| `plugin-sdk/provider-tools` | `ProviderToolCompatFamily`, `buildProviderToolCompatFamilyHooks`, nettoyage de schéma Gemini + diagnostics, et assistants de compatibilité xAI tels que `resolveXaiModelCompatPatch` / `applyXaiModelCompat` |
| `plugin-sdk/provider-usage` | `fetchClaudeUsage` et similaires |
| `plugin-sdk/provider-stream` | `ProviderStreamFamily`, `buildProviderStreamFamilyHooks`, `composeProviderStreamWrappers`, types de wrappers de flux, et helpers partagés de wrapper Anthropic/Bedrock/Google/Kilocode/Moonshot/OpenAI/OpenRouter/Z.A.I/MiniMax/Copilot |
| `plugin-sdk/provider-transport-runtime` | Helpers de transport fournisseur natif tels que fetch protégé, transformations de message de transport et flux dévénements de transport inscriptibles |
| `plugin-sdk/provider-onboard` | Helpers de patch de configuration donboarding |
| `plugin-sdk/global-singleton` | Helpers de singleton/map/cache locaux au processus |
| `plugin-sdk/group-activation` | Helpers étroits de mode dactivation de groupe et danalyse de commande |
| `plugin-sdk/provider-stream` | `ProviderStreamFamily`, `buildProviderStreamFamilyHooks`, `composeProviderStreamWrappers`, types denveloppes de flux, et assistants denveloppes partagés pour Anthropic/Bedrock/Google/Kilocode/Moonshot/OpenAI/OpenRouter/Z.A.I/MiniMax/Copilot |
| `plugin-sdk/provider-transport-runtime` | Assistants de transport natif fournisseur tels que fetch protégé, transformations de messages de transport et flux dévénements de transport inscriptibles |
| `plugin-sdk/provider-onboard` | Assistants de correctif de configuration dintégration |
| `plugin-sdk/global-singleton` | Assistants de singleton/map/cache locaux au processus |
| `plugin-sdk/group-activation` | Assistants ciblés pour le mode dactivation de groupe et lanalyse des commandes |
</Accordion>
<Accordion title="Sous-chemins auth et sécurité">
| Sous-chemin | Exports clés |
<Accordion title="Sous-chemins dauthentification et de sécurité">
| Sous-chemin | Exportations clés |
| --- | --- |
| `plugin-sdk/command-auth` | `resolveControlCommandGate`, helpers de registre de commandes, helpers dautorisation dexpéditeur |
| `plugin-sdk/command-auth` | `resolveControlCommandGate`, assistants de registre de commandes, assistants dautorisation dexpéditeur |
| `plugin-sdk/command-status` | Constructeurs de messages de commande/daide tels que `buildCommandsMessagePaginated` et `buildHelpMessage` |
| `plugin-sdk/approval-auth-runtime` | Résolution dapprobateur et helpers dauthentification daction dans le même chat |
| `plugin-sdk/approval-client-runtime` | Helpers de profil/filtre dapprobation exec native |
| `plugin-sdk/approval-delivery-runtime` | Adaptateurs de capacité/livraison dapprobation native |
| `plugin-sdk/approval-gateway-runtime` | Helper partagé de résolution gateway dapprobation |
| `plugin-sdk/approval-handler-adapter-runtime` | Helpers légers de chargement dadaptateur dapprobation native pour points dentrée de canal rapides |
| `plugin-sdk/approval-handler-runtime` | Helpers runtime plus larges de gestionnaire dapprobation ; préférez les coutures plus étroites adapter/gateway lorsquelles suffisent |
| `plugin-sdk/approval-native-runtime` | Helpers de cible dapprobation native + liaison de compte |
| `plugin-sdk/approval-reply-runtime` | Helpers de charge utile de réponse dapprobation exec/plugin |
| `plugin-sdk/reply-dedupe` | Helpers étroits de réinitialisation de déduplication de réponse entrante |
| `plugin-sdk/channel-contract-testing` | Helpers étroits de test de contrat de canal sans le barrel de test large |
| `plugin-sdk/command-auth-native` | Helpers dauthentification de commande native + cible de session native |
| `plugin-sdk/command-detection` | Helpers partagés de détection de commande |
| `plugin-sdk/command-primitives-runtime` | Prédicats légers sur le texte de commande pour chemins de canal rapides |
| `plugin-sdk/command-surface` | Helpers de normalisation de corps de commande et surface de commande |
| `plugin-sdk/approval-auth-runtime` | Résolution de lapprobateur et assistants dauthentification daction dans le même chat |
| `plugin-sdk/approval-client-runtime` | Assistants de profil/filtre dapprobation dexécution native |
| `plugin-sdk/approval-delivery-runtime` | Adaptateurs natifs de capacité/livraison dapprobation |
| `plugin-sdk/approval-gateway-runtime` | Assistant partagé de résolution de Gateway dapprobation |
| `plugin-sdk/approval-handler-adapter-runtime` | Assistants légers de chargement dadaptateur dapprobation native pour les points dentrée de canal à chaud |
| `plugin-sdk/approval-handler-runtime` | Assistants dexécution plus larges pour le gestionnaire dapprobation ; préférez les interfaces plus étroites dadaptateur/Gateway lorsquelles suffisent |
| `plugin-sdk/approval-native-runtime` | Assistants de cible dapprobation native + liaison de compte |
| `plugin-sdk/approval-reply-runtime` | Assistants de charge utile de réponse dapprobation exec/Plugin |
| `plugin-sdk/reply-dedupe` | Assistants étroits de réinitialisation de déduplication des réponses entrantes |
| `plugin-sdk/channel-contract-testing` | Assistants étroits de test de contrat de canal sans le barrel de test étendu |
| `plugin-sdk/command-auth-native` | Authentification de commande native + assistants natifs de cible de session |
| `plugin-sdk/command-detection` | Assistants partagés de détection de commande |
| `plugin-sdk/command-primitives-runtime` | Prédicats légers sur le texte de commande pour les chemins de canal à chaud |
| `plugin-sdk/command-surface` | Normalisation du corps de commande et assistants de surface de commande |
| `plugin-sdk/allow-from` | `formatAllowFromLowercase` |
| `plugin-sdk/channel-secret-runtime` | Helpers étroits de collecte de contrat de secret pour surfaces de secret de canal/plugin |
| `plugin-sdk/secret-ref-runtime` | Helpers étroits `coerceSecretRef` et de typage SecretRef pour lanalyse contrat de secret/configuration |
| `plugin-sdk/security-runtime` | Helpers partagés de confiance, filtrage DM, contenu externe et collecte de secrets |
| `plugin-sdk/ssrf-policy` | Helpers de liste dautorisation dhôte et de politique SSRF réseau privé |
| `plugin-sdk/ssrf-dispatcher` | Helpers étroits de dispatcher épinglé sans la surface runtime dinfrastructure large |
| `plugin-sdk/ssrf-runtime` | Helpers de dispatcher épinglé, fetch protégé contre SSRF et politique SSRF |
| `plugin-sdk/secret-input` | Helpers danalyse dentrée de secret |
| `plugin-sdk/webhook-ingress` | Helpers de requête/cible Webhook |
| `plugin-sdk/webhook-request-guards` | Helpers de taille de corps de requête/délai dexpiration |
| `plugin-sdk/channel-secret-runtime` | Assistants étroits de collecte de contrat de secret pour les surfaces de secret de canal/Plugin |
| `plugin-sdk/secret-ref-runtime` | Assistants étroits `coerceSecretRef` et de typage SecretRef pour lanalyse du contrat de secret/de la configuration |
| `plugin-sdk/security-runtime` | Assistants partagés de confiance, filtrage DM, contenu externe et collecte de secrets |
| `plugin-sdk/ssrf-policy` | Assistants de politique SSRF pour liste dautorisation dhôtes et réseau privé |
| `plugin-sdk/ssrf-dispatcher` | Assistants étroits de répartiteur épinglé sans la large surface dexécution dinfrastructure |
| `plugin-sdk/ssrf-runtime` | Répartiteur épinglé, fetch protégé contre SSRF et assistants de politique SSRF |
| `plugin-sdk/secret-input` | Assistants danalyse des entrées secrètes |
| `plugin-sdk/webhook-ingress` | Assistants de requête/cible Webhook |
| `plugin-sdk/webhook-request-guards` | Assistants de taille du corps de requête/délai dexpiration |
</Accordion>
<Accordion title="Sous-chemins runtime et stockage">
| Sous-chemin | Exports clés |
<Accordion title="Sous-chemins dexécution et de stockage">
| Sous-chemin | Exportations clés |
| --- | --- |
| `plugin-sdk/runtime` | Helpers larges de runtime/journalisation/sauvegarde/installation de plugin |
| `plugin-sdk/runtime-env` | Helpers étroits denvironnement runtime, logger, délai, retry et backoff |
| `plugin-sdk/channel-runtime-context` | Helpers génériques denregistrement et de recherche du contexte runtime de canal |
| `plugin-sdk/runtime` | Assistants étendus dexécution/journalisation/sauvegarde/installation de Plugin |
| `plugin-sdk/runtime-env` | Assistants étroits denvironnement dexécution, journaliseur, délai dexpiration, nouvelle tentative et backoff |
| `plugin-sdk/channel-runtime-context` | Assistants génériques denregistrement et de recherche de contexte dexécution de canal |
| `plugin-sdk/runtime-store` | `createPluginRuntimeStore` |
| `plugin-sdk/plugin-runtime` | Helpers partagés de commande/hook/http/interaction de plugin |
| `plugin-sdk/hook-runtime` | Helpers partagés de pipeline de hook Webhook/interne |
| `plugin-sdk/lazy-runtime` | Helpers de chargement/liaison runtime paresseux tels que `createLazyRuntimeModule`, `createLazyRuntimeMethod`, et `createLazyRuntimeSurface` |
| `plugin-sdk/process-runtime` | Helpers dexécution de processus |
| `plugin-sdk/cli-runtime` | Helpers de formatage CLI, attente et version |
| `plugin-sdk/gateway-runtime` | Helpers de client Gateway et de patch détat de canal |
| `plugin-sdk/config-runtime` | Helpers de chargement/écriture de configuration et de recherche de configuration de plugin |
| `plugin-sdk/telegram-command-config` | Normalisation nom/description de commande Telegram et vérifications de doublon/conflit, même lorsque la surface de contrat Telegram intégrée est indisponible |
| `plugin-sdk/text-autolink-runtime` | Détection dautoliens de références de fichiers sans le barrel text-runtime large |
| `plugin-sdk/approval-runtime` | Helpers dapprobation exec/plugin, constructeurs de capacité dapprobation, helpers auth/profil, helpers natifs de routage/runtime |
| `plugin-sdk/reply-runtime` | Helpers runtime partagés dentrée/réponse, découpage, répartition, Heartbeat, planificateur de réponse |
| `plugin-sdk/reply-dispatch-runtime` | Helpers étroits de répartition/finalisation de réponse |
| `plugin-sdk/reply-history` | Helpers partagés dhistorique de réponse sur courte fenêtre tels que `buildHistoryContext`, `recordPendingHistoryEntry`, et `clearHistoryEntriesIfEnabled` |
| `plugin-sdk/plugin-runtime` | Assistants partagés de commande/hook/http/interaction pour Plugin |
| `plugin-sdk/hook-runtime` | Assistants partagés de pipeline de Webhook/hook interne |
| `plugin-sdk/lazy-runtime` | Assistants dimportation/liaison différée à lexécution tels que `createLazyRuntimeModule`, `createLazyRuntimeMethod` et `createLazyRuntimeSurface` |
| `plugin-sdk/process-runtime` | Assistants dexécution de processus |
| `plugin-sdk/cli-runtime` | Assistants de formatage, dattente et de version CLI |
| `plugin-sdk/gateway-runtime` | Assistants de client Gateway et de correctif détat de canal |
| `plugin-sdk/config-runtime` | Assistants de chargement/écriture de configuration et assistants de recherche de configuration de Plugin |
| `plugin-sdk/telegram-command-config` | Normalisation du nom/de la description des commandes Telegram et vérifications de doublons/conflits, même lorsque la surface de contrat Telegram bundled nest pas disponible |
| `plugin-sdk/text-autolink-runtime` | Détection dautoliens de références de fichiers sans le large barrel text-runtime |
| `plugin-sdk/approval-runtime` | Assistants dapprobation exec/Plugin, constructeurs de capacité dapprobation, assistants dauthentification/profil, assistants natifs de routage/exécution |
| `plugin-sdk/reply-runtime` | Assistants partagés dexécution entrante/de réponse, segmentation, distribution, Heartbeat, planificateur de réponse |
| `plugin-sdk/reply-dispatch-runtime` | Assistants étroits de distribution/finalisation de réponse et détiquette de conversation |
| `plugin-sdk/reply-history` | Assistants partagés dhistorique des réponses sur courte fenêtre tels que `buildHistoryContext`, `recordPendingHistoryEntry` et `clearHistoryEntriesIfEnabled` |
| `plugin-sdk/reply-reference` | `createReplyReferencePlanner` |
| `plugin-sdk/reply-chunking` | Helpers étroits de découpage texte/markdown |
| `plugin-sdk/session-store-runtime` | Helpers de chemin du magasin de sessions + updated-at |
| `plugin-sdk/state-paths` | Helpers de chemins de répertoire state/OAuth |
| `plugin-sdk/routing` | Helpers de liaison route/clé de session/compte tels que `resolveAgentRoute`, `buildAgentSessionKey`, et `resolveDefaultAgentBoundAccountId` |
| `plugin-sdk/status-helpers` | Helpers partagés de résumé détat canal/compte, valeurs par défaut détat runtime et helpers de métadonnées de problème |
| `plugin-sdk/target-resolver-runtime` | Helpers partagés de résolution de cible |
| `plugin-sdk/string-normalization-runtime` | Helpers de normalisation de slug/chaîne |
| `plugin-sdk/request-url` | Extrait des URL chaîne à partir dentrées de type fetch/request |
| `plugin-sdk/run-command` | Exécuteur de commande temporisé avec résultats stdout/stderr normalisés |
| `plugin-sdk/param-readers` | Lecteurs de paramètres communs outil/CLI |
| `plugin-sdk/tool-payload` | Extrait des charges utiles normalisées à partir dobjets de résultat doutil |
| `plugin-sdk/tool-send` | Extrait les champs de cible denvoi canoniques à partir des arguments doutil |
| `plugin-sdk/temp-path` | Helpers partagés de chemin de téléchargement temporaire |
| `plugin-sdk/logging-core` | Helpers de logger de sous-système et de masquage |
| `plugin-sdk/markdown-table-runtime` | Helpers de mode/conversion de tableaux Markdown |
| `plugin-sdk/json-store` | Petits helpers de lecture/écriture détat JSON |
| `plugin-sdk/file-lock` | Helpers de verrou de fichier réentrant |
| `plugin-sdk/persistent-dedupe` | Helpers de cache de déduplication adossé au disque |
| `plugin-sdk/acp-runtime` | Helpers de runtime/session ACP et de répartition de réponse |
| `plugin-sdk/acp-binding-resolve-runtime` | Résolution en lecture seule de liaison ACP sans imports de démarrage de cycle de vie |
| `plugin-sdk/agent-config-primitives` | Primitifs étroits de schéma de configuration runtime dagent |
| `plugin-sdk/boolean-param` | Lecteur souple de paramètre booléen |
| `plugin-sdk/dangerous-name-runtime` | Helpers de résolution de correspondance de nom dangereux |
| `plugin-sdk/device-bootstrap` | Helpers de bootstrap dappareil et de jeton dassociation |
| `plugin-sdk/extension-shared` | Primitifs partagés de canal passif, statut et proxy ambiant |
| `plugin-sdk/models-provider-runtime` | Helpers de réponse de commande/fournisseur `/models` |
| `plugin-sdk/skill-commands-runtime` | Helpers de listing de commandes de Skills |
| `plugin-sdk/native-command-registry` | Helpers de construction/sérialisation du registre de commandes natives |
| `plugin-sdk/agent-harness` | Surface expérimentale de plugin de confiance pour harnais dagent bas niveau : types de harnais, helpers de steer/abort dexécution active, helpers de pont doutil OpenClaw, helpers de formatage/détail de progression doutil, et utilitaires de résultat de tentative |
| `plugin-sdk/provider-zai-endpoint` | Helpers de détection de point de terminaison Z.AI |
| `plugin-sdk/infra-runtime` | Helpers dévénement système/Heartbeat |
| `plugin-sdk/collection-runtime` | Petits helpers de cache borné |
| `plugin-sdk/diagnostic-runtime` | Helpers de drapeau/événement de diagnostic |
| `plugin-sdk/error-runtime` | Graphe derreur, formatage, helpers partagés de classification derreur, `isApprovalNotFoundError` |
| `plugin-sdk/fetch-runtime` | Helpers de fetch enveloppé, proxy et recherche épinglée |
| `plugin-sdk/runtime-fetch` | Fetch runtime conscient du dispatcher sans imports proxy/fetch protégé |
| `plugin-sdk/response-limit-runtime` | Lecteur borné de corps de réponse sans la surface runtime média large |
| `plugin-sdk/session-binding-runtime` | État actuel de liaison de conversation sans routage de liaison configurée ni magasins dassociation |
| `plugin-sdk/session-store-runtime` | Helpers de lecture du magasin de sessions sans imports larges décritures/maintenance de configuration |
| `plugin-sdk/context-visibility-runtime` | Résolution de visibilité de contexte et filtrage de contexte supplémentaire sans imports larges de config/sécurité |
| `plugin-sdk/string-coerce-runtime` | Helpers étroits de coercition et normalisation de chaîne/enregistrement primitif sans imports markdown/journalisation |
| `plugin-sdk/host-runtime` | Helpers de normalisation dhôte hostname et SCP |
| `plugin-sdk/retry-runtime` | Helpers de configuration et dexécuteur retry |
| `plugin-sdk/agent-runtime` | Helpers de répertoire/identité/espace de travail dagent |
| `plugin-sdk/directory-runtime` | Requête/déduplication dannuaire adossé à la configuration |
| `plugin-sdk/reply-chunking` | Assistants étroits de segmentation de texte/Markdown |
| `plugin-sdk/session-store-runtime` | Assistants de chemin de magasin de session + date de mise à jour |
| `plugin-sdk/state-paths` | Assistants de chemins de répertoires détat/OAuth |
| `plugin-sdk/routing` | Assistants de liaison route/clé de session/compte tels que `resolveAgentRoute`, `buildAgentSessionKey` et `resolveDefaultAgentBoundAccountId` |
| `plugin-sdk/status-helpers` | Assistants partagés de résumé détat canal/compte, valeurs par défaut détat dexécution et assistants de métadonnées de problème |
| `plugin-sdk/target-resolver-runtime` | Assistants partagés de résolution de cible |
| `plugin-sdk/string-normalization-runtime` | Assistants de normalisation de slug/chaîne |
| `plugin-sdk/request-url` | Extraire des URL sous forme de chaîne à partir dentrées de type fetch/request |
| `plugin-sdk/run-command` | Exécuteur de commande temporisé avec résultats `stdout`/`stderr` normalisés |
| `plugin-sdk/param-readers` | Lecteurs communs de paramètres doutil/CLI |
| `plugin-sdk/tool-payload` | Extraire des charges utiles normalisées à partir dobjets de résultat doutil |
| `plugin-sdk/tool-send` | Extraire les champs cibles denvoi canoniques à partir des arguments doutil |
| `plugin-sdk/temp-path` | Assistants partagés de chemins temporaires de téléchargement |
| `plugin-sdk/logging-core` | Assistants de journaliseur de sous-système et de masquage |
| `plugin-sdk/markdown-table-runtime` | Assistants de mode de tableau Markdown et de conversion |
| `plugin-sdk/json-store` | Petits assistants de lecture/écriture détat JSON |
| `plugin-sdk/file-lock` | Assistants de verrou de fichier réentrant |
| `plugin-sdk/persistent-dedupe` | Assistants de cache de déduplication adossé au disque |
| `plugin-sdk/acp-runtime` | Assistants dexécution/session ACP et de distribution de réponse |
| `plugin-sdk/acp-binding-resolve-runtime` | Résolution en lecture seule des liaisons ACP sans importations de démarrage du cycle de vie |
| `plugin-sdk/agent-config-primitives` | Primitives étroites de schéma de configuration dexécution dagent |
| `plugin-sdk/boolean-param` | Lecteur permissif de paramètre booléen |
| `plugin-sdk/dangerous-name-runtime` | Assistants de résolution de correspondance de noms dangereux |
| `plugin-sdk/device-bootstrap` | Assistants dinitialisation dappareil et de jeton dappairage |
| `plugin-sdk/extension-shared` | Primitives dassistance partagées pour canal passif, état et proxy ambiant |
| `plugin-sdk/models-provider-runtime` | Assistants de réponse de fournisseur/commande `/models` |
| `plugin-sdk/skill-commands-runtime` | Assistants de listage des commandes Skills |
| `plugin-sdk/native-command-registry` | Assistants natifs de registre/construction/sérialisation de commandes |
| `plugin-sdk/agent-harness` | Surface expérimentale de Plugin de confiance pour harnais dagent de bas niveau : types de harnais, assistants de pilotage/abandon dexécution active, assistants de pont doutil OpenClaw, assistants de formatage/détail de progression doutil et utilitaires de résultat de tentative |
| `plugin-sdk/provider-zai-endpoint` | Assistants de détection dendpoint Z.A.I |
| `plugin-sdk/infra-runtime` | Assistants dévénement système/Heartbeat |
| `plugin-sdk/collection-runtime` | Petits assistants de cache borné |
| `plugin-sdk/diagnostic-runtime` | Assistants dindicateur et dévénement de diagnostic |
| `plugin-sdk/error-runtime` | Graphe derreurs, formatage, assistants partagés de classification des erreurs, `isApprovalNotFoundError` |
| `plugin-sdk/fetch-runtime` | Assistants de fetch encapsulé, proxy et recherche épinglée |
| `plugin-sdk/runtime-fetch` | Fetch dexécution tenant compte du répartiteur, sans importations de proxy/fetch protégé |
| `plugin-sdk/response-limit-runtime` | Lecteur borné de corps de réponse sans la large surface dexécution média |
| `plugin-sdk/session-binding-runtime` | État actuel de liaison de conversation sans routage de liaison configurée ni magasins dappairage |
| `plugin-sdk/session-store-runtime` | Assistants de lecture du magasin de session sans importations étendues décriture/maintenance de configuration |
| `plugin-sdk/context-visibility-runtime` | Résolution de visibilité du contexte et filtrage du contexte supplémentaire sans importations étendues de configuration/sécurité |
| `plugin-sdk/string-coerce-runtime` | Assistants étroits de conversion/normalisation de chaîne et denregistrement primitif, sans importations Markdown/journalisation |
| `plugin-sdk/host-runtime` | Assistants de normalisation de nom dhôte et dhôte SCP |
| `plugin-sdk/retry-runtime` | Assistants de configuration et dexécuteur de nouvelle tentative |
| `plugin-sdk/agent-runtime` | Assistants de répertoire/identité/espace de travail dagent |
| `plugin-sdk/directory-runtime` | Requête/déduplication de répertoire adossée à la configuration |
| `plugin-sdk/keyed-async-queue` | `KeyedAsyncQueue` |
</Accordion>
<Accordion title="Sous-chemins de capacité et de test">
| Sous-chemin | Exports clés |
<Accordion title="Sous-chemins de capacités et de test">
| Sous-chemin | Exportations clés |
| --- | --- |
| `plugin-sdk/media-runtime` | Helpers partagés de récupération/transformation/stockage de médias plus constructeurs de charge utile média |
| `plugin-sdk/media-store` | Helpers étroits de magasin média tels que `saveMediaBuffer` |
| `plugin-sdk/media-generation-runtime` | Helpers partagés de repli pour génération de médias, sélection de candidats et messagerie de modèle manquant |
| `plugin-sdk/media-understanding` | Types de fournisseurs de compréhension média plus exports dhelpers image/audio côté fournisseur |
| `plugin-sdk/text-runtime` | Helpers partagés texte/markdown/journalisation tels que suppression de texte visible par lassistant, helpers de rendu/découpage/tableaux markdown, helpers de masquage, helpers de balises de directives, et utilitaires de texte sûr |
| `plugin-sdk/text-chunking` | Helper de découpage de texte sortant |
| `plugin-sdk/speech` | Types de fournisseurs de parole plus helpers côté fournisseur de directive, registre et validation |
| `plugin-sdk/speech-core` | Types, registre, directive et helpers de normalisation partagés pour fournisseurs de parole |
| `plugin-sdk/realtime-transcription` | Types de fournisseurs de transcription en temps réel, helpers de registre, et helper partagé de session WebSocket |
| `plugin-sdk/realtime-voice` | Types de fournisseurs de voix en temps réel et helpers de registre |
| `plugin-sdk/image-generation` | Types de fournisseurs de génération dimages |
| `plugin-sdk/image-generation-core` | Types partagés de génération dimages, repli, authentification et helpers de registre |
| `plugin-sdk/media-runtime` | Assistants partagés de récupération/transformation/stockage de médias, plus constructeurs de charge utile média |
| `plugin-sdk/media-store` | Assistants étroits de magasin média tels que `saveMediaBuffer` |
| `plugin-sdk/media-generation-runtime` | Assistants partagés de bascule de génération de média, sélection de candidats et messages de modèle manquant |
| `plugin-sdk/media-understanding` | Types de fournisseur de compréhension de média, plus exportations dassistants image/audio destinés aux fournisseurs |
| `plugin-sdk/text-runtime` | Assistants partagés de texte/Markdown/journalisation tels que suppression du texte visible par lassistant, assistants de rendu/segmentation/tableau Markdown, assistants de masquage, assistants de balises de directive et utilitaires de texte sûr |
| `plugin-sdk/text-chunking` | Assistant de segmentation de texte sortant |
| `plugin-sdk/speech` | Types de fournisseur de parole, plus assistants de directive, registre et validation destinés aux fournisseurs |
| `plugin-sdk/speech-core` | Assistants partagés de types de fournisseur de parole, registre, directive et normalisation |
| `plugin-sdk/realtime-transcription` | Types de fournisseur de transcription en temps réel, assistants de registre et assistant partagé de session WebSocket |
| `plugin-sdk/realtime-voice` | Types de fournisseur de voix en temps réel et assistants de registre |
| `plugin-sdk/image-generation` | Types de fournisseur de génération dimage |
| `plugin-sdk/image-generation-core` | Assistants partagés de types de génération dimage, bascule, authentification et registre |
| `plugin-sdk/music-generation` | Types de fournisseur/requête/résultat de génération musicale |
| `plugin-sdk/music-generation-core` | Types partagés de génération musicale, helpers de repli, recherche de fournisseur et analyse de model-ref |
| `plugin-sdk/music-generation-core` | Assistants partagés de types de génération musicale, assistants de bascule, recherche de fournisseur et analyse de référence de modèle |
| `plugin-sdk/video-generation` | Types de fournisseur/requête/résultat de génération vidéo |
| `plugin-sdk/video-generation-core` | Types partagés de génération vidéo, helpers de repli, recherche de fournisseur et analyse de model-ref |
| `plugin-sdk/webhook-targets` | Helpers de registre de cibles Webhook et dinstallation de route |
| `plugin-sdk/webhook-path` | Helpers de normalisation de chemin Webhook |
| `plugin-sdk/web-media` | Helpers partagés de chargement de médias distants/locaux |
| `plugin-sdk/zod` | `zod` réexporté pour les consommateurs du SDK de plugin |
| `plugin-sdk/video-generation-core` | Assistants partagés de types de génération vidéo, assistants de bascule, recherche de fournisseur et analyse de référence de modèle |
| `plugin-sdk/webhook-targets` | Registre de cibles Webhook et assistants dinstallation de route |
| `plugin-sdk/webhook-path` | Assistants de normalisation de chemin Webhook |
| `plugin-sdk/web-media` | Assistants partagés de chargement de médias distants/locaux |
| `plugin-sdk/zod` | `zod` réexporté pour les consommateurs du Plugin SDK |
| `plugin-sdk/testing` | `installCommonResolveTargetErrorCases`, `shouldAckReaction` |
</Accordion>
<Accordion title="Sous-chemins mémoire">
| Sous-chemin | Exports clés |
<Accordion title="Sous-chemins de mémoire">
| Sous-chemin | Exportations clés |
| --- | --- |
| `plugin-sdk/memory-core` | Surface de helpers memory-core intégrée pour les helpers de gestionnaire/configuration/fichier/CLI |
| `plugin-sdk/memory-core-engine-runtime` | Façade runtime dindex/recherche mémoire |
| `plugin-sdk/memory-core-host-engine-foundation` | Exports du moteur de fondation hôte mémoire |
| `plugin-sdk/memory-core-host-engine-embeddings` | Contrats dembeddings de lhôte mémoire, accès au registre, fournisseur local, et helpers génériques batch/distants |
| `plugin-sdk/memory-core-host-engine-qmd` | Exports du moteur QMD de lhôte mémoire |
| `plugin-sdk/memory-core-host-engine-storage` | Exports du moteur de stockage de lhôte mémoire |
| `plugin-sdk/memory-core-host-multimodal` | Helpers multimodaux de lhôte mémoire |
| `plugin-sdk/memory-core-host-query` | Helpers de requête de lhôte mémoire |
| `plugin-sdk/memory-core-host-secret` | Helpers de secret de lhôte mémoire |
| `plugin-sdk/memory-core-host-events` | Helpers de journal dévénements de lhôte mémoire |
| `plugin-sdk/memory-core-host-status` | Helpers détat de lhôte mémoire |
| `plugin-sdk/memory-core-host-runtime-cli` | Helpers runtime CLI de lhôte mémoire |
| `plugin-sdk/memory-core-host-runtime-core` | Helpers runtime du cœur de lhôte mémoire |
| `plugin-sdk/memory-core-host-runtime-files` | Helpers de fichier/runtime de lhôte mémoire |
| `plugin-sdk/memory-host-core` | Alias neutre vis-à-vis du fournisseur pour les helpers runtime du cœur de lhôte mémoire |
| `plugin-sdk/memory-host-events` | Alias neutre vis-à-vis du fournisseur pour les helpers de journal dévénements de lhôte mémoire |
| `plugin-sdk/memory-host-files` | Alias neutre vis-à-vis du fournisseur pour les helpers de fichier/runtime de lhôte mémoire |
| `plugin-sdk/memory-host-markdown` | Helpers partagés de markdown géré pour les plugins adjacents à la mémoire |
| `plugin-sdk/memory-host-search` | Façade runtime Active Memory pour laccès au gestionnaire de recherche |
| `plugin-sdk/memory-host-status` | Alias neutre vis-à-vis du fournisseur pour les helpers détat de lhôte mémoire |
| `plugin-sdk/memory-lancedb` | Surface de helpers memory-lancedb intégrée |
| `plugin-sdk/memory-core` | Surface dassistance `memory-core` bundled pour les assistants de gestionnaire/configuration/fichier/CLI |
| `plugin-sdk/memory-core-engine-runtime` | Façade dexécution dindexation/recherche mémoire |
| `plugin-sdk/memory-core-host-engine-foundation` | Exportations du moteur de base de lhôte mémoire |
| `plugin-sdk/memory-core-host-engine-embeddings` | Contrats dembeddings de lhôte mémoire, accès au registre, fournisseur local et assistants génériques de lot/distant |
| `plugin-sdk/memory-core-host-engine-qmd` | Exportations du moteur QMD de lhôte mémoire |
| `plugin-sdk/memory-core-host-engine-storage` | Exportations du moteur de stockage de lhôte mémoire |
| `plugin-sdk/memory-core-host-multimodal` | Assistants multimodaux de lhôte mémoire |
| `plugin-sdk/memory-core-host-query` | Assistants de requête de lhôte mémoire |
| `plugin-sdk/memory-core-host-secret` | Assistants de secret de lhôte mémoire |
| `plugin-sdk/memory-core-host-events` | Assistants de journal dévénements de lhôte mémoire |
| `plugin-sdk/memory-core-host-status` | Assistants détat de lhôte mémoire |
| `plugin-sdk/memory-core-host-runtime-cli` | Assistants dexécution CLI de lhôte mémoire |
| `plugin-sdk/memory-core-host-runtime-core` | Assistants dexécution cœur de lhôte mémoire |
| `plugin-sdk/memory-core-host-runtime-files` | Assistants de fichier/exécution de lhôte mémoire |
| `plugin-sdk/memory-host-core` | Alias neutre vis-à-vis du fournisseur pour les assistants dexécution cœur de lhôte mémoire |
| `plugin-sdk/memory-host-events` | Alias neutre vis-à-vis du fournisseur pour les assistants de journal dévénements de lhôte mémoire |
| `plugin-sdk/memory-host-files` | Alias neutre vis-à-vis du fournisseur pour les assistants de fichier/exécution de lhôte mémoire |
| `plugin-sdk/memory-host-markdown` | Assistants partagés de Markdown géré pour les Plugins proches de la mémoire |
| `plugin-sdk/memory-host-search` | Façade dexécution de Active Memory pour laccès au gestionnaire de recherche |
| `plugin-sdk/memory-host-status` | Alias neutre vis-à-vis du fournisseur pour les assistants détat de lhôte mémoire |
| `plugin-sdk/memory-lancedb` | Surface dassistance `memory-lancedb` bundled |
</Accordion>
<Accordion title="Sous-chemins réservés de helpers intégrés">
| Famille | Sous-chemins actuels | Usage prévu |
<Accordion title="Sous-chemins dassistance bundled réservés">
| Famille | Sous-chemins actuels | Utilisation prévue |
| --- | --- | --- |
| Browser | `plugin-sdk/browser-cdp`, `plugin-sdk/browser-config-runtime`, `plugin-sdk/browser-config-support`, `plugin-sdk/browser-control-auth`, `plugin-sdk/browser-node-runtime`, `plugin-sdk/browser-profiles`, `plugin-sdk/browser-security-runtime`, `plugin-sdk/browser-setup-tools`, `plugin-sdk/browser-support` | Helpers de prise en charge du plugin browser intégré (`browser-support` reste le barrel de compatibilité) |
| Matrix | `plugin-sdk/matrix`, `plugin-sdk/matrix-helper`, `plugin-sdk/matrix-runtime-heavy`, `plugin-sdk/matrix-runtime-shared`, `plugin-sdk/matrix-runtime-surface`, `plugin-sdk/matrix-surface`, `plugin-sdk/matrix-thread-bindings` | Surface intégrée de helper/runtime Matrix |
| Line | `plugin-sdk/line`, `plugin-sdk/line-core`, `plugin-sdk/line-runtime`, `plugin-sdk/line-surface` | Surface intégrée de helper/runtime LINE |
| IRC | `plugin-sdk/irc`, `plugin-sdk/irc-surface` | Surface intégrée de helper IRC |
| Helpers spécifiques au canal | `plugin-sdk/googlechat`, `plugin-sdk/zalouser`, `plugin-sdk/bluebubbles`, `plugin-sdk/bluebubbles-policy`, `plugin-sdk/mattermost`, `plugin-sdk/mattermost-policy`, `plugin-sdk/feishu-conversation`, `plugin-sdk/msteams`, `plugin-sdk/nextcloud-talk`, `plugin-sdk/nostr`, `plugin-sdk/tlon`, `plugin-sdk/twitch` | Coutures de compatibilité/helper de canaux intégrés |
| Helpers spécifiques auth/plugin | `plugin-sdk/github-copilot-login`, `plugin-sdk/github-copilot-token`, `plugin-sdk/diagnostics-otel`, `plugin-sdk/diffs`, `plugin-sdk/llm-task`, `plugin-sdk/thread-ownership`, `plugin-sdk/voice-call` | Coutures de helper de fonctionnalité/plugin intégrées ; `plugin-sdk/github-copilot-token` exporte actuellement `DEFAULT_COPILOT_API_BASE_URL`, `deriveCopilotApiBaseUrlFromToken`, et `resolveCopilotApiToken` |
| Navigateur | `plugin-sdk/browser-cdp`, `plugin-sdk/browser-config-runtime`, `plugin-sdk/browser-config-support`, `plugin-sdk/browser-control-auth`, `plugin-sdk/browser-node-runtime`, `plugin-sdk/browser-profiles`, `plugin-sdk/browser-security-runtime`, `plugin-sdk/browser-setup-tools`, `plugin-sdk/browser-support` | Assistants de prise en charge du Plugin navigateur bundled (`browser-support` reste le barrel de compatibilité) |
| Matrix | `plugin-sdk/matrix`, `plugin-sdk/matrix-helper`, `plugin-sdk/matrix-runtime-heavy`, `plugin-sdk/matrix-runtime-shared`, `plugin-sdk/matrix-runtime-surface`, `plugin-sdk/matrix-surface`, `plugin-sdk/matrix-thread-bindings` | Surface dassistance/dexécution Matrix bundled |
| Line | `plugin-sdk/line`, `plugin-sdk/line-core`, `plugin-sdk/line-runtime`, `plugin-sdk/line-surface` | Surface dassistance/dexécution LINE bundled |
| IRC | `plugin-sdk/irc`, `plugin-sdk/irc-surface` | Surface dassistance IRC bundled |
| Assistants spécifiques aux canaux | `plugin-sdk/googlechat`, `plugin-sdk/zalouser`, `plugin-sdk/bluebubbles`, `plugin-sdk/bluebubbles-policy`, `plugin-sdk/mattermost`, `plugin-sdk/mattermost-policy`, `plugin-sdk/feishu-conversation`, `plugin-sdk/msteams`, `plugin-sdk/nextcloud-talk`, `plugin-sdk/nostr`, `plugin-sdk/tlon`, `plugin-sdk/twitch` | Interfaces de compatibilité/dassistance bundled pour canaux |
| Assistants spécifiques à lauthentification/aux Plugins | `plugin-sdk/github-copilot-login`, `plugin-sdk/github-copilot-token`, `plugin-sdk/diagnostics-otel`, `plugin-sdk/diffs`, `plugin-sdk/llm-task`, `plugin-sdk/thread-ownership`, `plugin-sdk/voice-call` | Interfaces dassistance bundled pour fonctionnalités/Plugins ; `plugin-sdk/github-copilot-token` exporte actuellement `DEFAULT_COPILOT_API_BASE_URL`, `deriveCopilotApiBaseUrlFromToken` et `resolveCopilotApiToken` |
</Accordion>
</AccordionGroup>
## Liens associés
- [Vue densemble du SDK de plugin](/fr/plugins/sdk-overview)
- [Configuration du SDK de plugin](/fr/plugins/sdk-setup)
- [Créer des plugins](/fr/plugins/building-plugins)
- [vue densemble du Plugin SDK](/fr/plugins/sdk-overview)
- [configuration du Plugin SDK](/fr/plugins/sdk-setup)
- [Créer des Plugins](/fr/plugins/building-plugins)

View File

@ -1,34 +1,34 @@
---
read_when:
- Vous voulez utiliser les modèles Google Gemini avec OpenClaw
- Vous avez besoin du flux dauthentification par clé API ou OAuth
summary: Configuration de Google Gemini (clé API + OAuth, génération dimage, compréhension des médias, TTS, recherche Web)
- Vous souhaitez utiliser les modèles Google Gemini avec OpenClaw
- Vous avez besoin de la clé API ou du flux dauthentification OAuth
summary: Configuration de Google Gemini (clé API + OAuth, génération dimages, compréhension des médias, TTS, recherche web)
title: Google (Gemini)
x-i18n:
generated_at: "2026-04-24T07:27:03Z"
generated_at: "2026-04-24T08:57:44Z"
model: gpt-5.4
provider: openai
source_hash: b43d7171f56ecdfb49a25256783433e64f99a02760b3bc6f0e1055195f556f5d
source_hash: 7e66c9dd637e26976659d04b9b7e2452e6881945dab6011970f9e1c5e4a9a685
source_path: providers/google.md
workflow: 15
---
Le Plugin Google fournit laccès aux modèles Gemini via Google AI Studio, ainsi quà la
génération dimage, à la compréhension des médias (image/audio/vidéo), à la synthèse vocale, et à la recherche Web via
Le plugin Google fournit laccès aux modèles Gemini via Google AI Studio, ainsi que la
génération dimages, la compréhension des médias (image/audio/vidéo), la synthèse vocale et la recherche web via
Gemini Grounding.
- Fournisseur : `google`
- Authentification : `GEMINI_API_KEY` ou `GOOGLE_API_KEY`
- API : API Google Gemini
- Fournisseur alternatif : `google-gemini-cli` (OAuth)
- Fournisseur : `google`
- Authentification : `GEMINI_API_KEY` ou `GOOGLE_API_KEY`
- API : API Google Gemini
- Fournisseur alternatif : `google-gemini-cli` (OAuth)
## Prise en main
## Premiers pas
Choisissez votre méthode dauthentification préférée et suivez les étapes de configuration.
<Tabs>
<Tab title="Clé API">
**Idéal pour :** accès standard à lAPI Gemini via Google AI Studio.
**Idéal pour :** laccès standard à lAPI Gemini via Google AI Studio.
<Steps>
<Step title="Lancer lonboarding">
@ -36,7 +36,7 @@ Choisissez votre méthode dauthentification préférée et suivez les étapes
openclaw onboard --auth-choice gemini-api-key
```
Ou passez directement la clé :
Ou transmettez directement la clé :
```bash
openclaw onboard --non-interactive \
@ -70,11 +70,11 @@ Choisissez votre méthode dauthentification préférée et suivez les étapes
</Tab>
<Tab title="Gemini CLI (OAuth)">
**Idéal pour :** réutiliser une connexion Gemini CLI existante via lOAuth PKCE au lieu dune clé API séparée.
**Idéal pour :** réutiliser une connexion Gemini CLI existante via OAuth PKCE au lieu dune clé API distincte.
<Warning>
Le fournisseur `google-gemini-cli` est une intégration non officielle. Certains utilisateurs
signalent des restrictions de compte lorsquils utilisent lOAuth de cette manière. Utilisez-la à vos propres risques.
signalent des restrictions de compte lors de lutilisation dOAuth de cette façon. Utilisez-le à vos propres risques.
</Warning>
<Steps>
@ -89,8 +89,8 @@ Choisissez votre méthode dauthentification préférée et suivez les étapes
npm install -g @google/gemini-cli
```
OpenClaw prend en charge à la fois les installations Homebrew et les installations npm globales, y compris
les dispositions Windows/npm courantes.
OpenClaw prend en charge les installations Homebrew et les installations npm globales, y compris
les configurations courantes Windows/npm.
</Step>
<Step title="Se connecter via OAuth">
```bash
@ -104,10 +104,10 @@ Choisissez votre méthode dauthentification préférée et suivez les étapes
</Step>
</Steps>
- Modèle par défaut : `google-gemini-cli/gemini-3-flash-preview`
- Alias : `gemini-cli`
- Modèle par défaut : `google-gemini-cli/gemini-3-flash-preview`
- Alias : `gemini-cli`
**Variables denvironnement :**
**Variables denvironnement :**
- `OPENCLAW_GEMINI_OAUTH_CLIENT_ID`
- `OPENCLAW_GEMINI_OAUTH_CLIENT_SECRET`
@ -115,60 +115,61 @@ Choisissez votre méthode dauthentification préférée et suivez les étapes
(Ou les variantes `GEMINI_CLI_*`.)
<Note>
Si les requêtes Gemini CLI OAuth échouent après la connexion, définissez `GOOGLE_CLOUD_PROJECT` ou
`GOOGLE_CLOUD_PROJECT_ID` sur lhôte gateway et réessayez.
Si les requêtes OAuth Gemini CLI échouent après la connexion, définissez `GOOGLE_CLOUD_PROJECT` ou
`GOOGLE_CLOUD_PROJECT_ID` sur lhôte du gateway, puis réessayez.
</Note>
<Note>
Si la connexion échoue avant le démarrage du flux navigateur, assurez-vous que la commande locale `gemini`
est installée et présente dans le `PATH`.
est installée et disponible dans le `PATH`.
</Note>
Le fournisseur `google-gemini-cli` uniquement OAuth est une surface distincte
dinférence texte. La génération dimage, la compréhension des médias et Gemini Grounding restent sur
lID fournisseur `google`.
Le fournisseur `google-gemini-cli`, limité à OAuth, constitue une surface distincte
dinférence de texte. La génération dimages, la compréhension des médias et Gemini Grounding restent sur
lidentifiant de fournisseur `google`.
</Tab>
</Tabs>
## Capacités
| Capacité | Pris en charge |
| Capability | Pris en charge |
| ---------------------- | ------------------------------ |
| Complétions de chat | Oui |
| Génération dimage | Oui |
| Génération musicale | Oui |
| Synthèse vocale | Oui |
| Compréhension dimage | Oui |
| Transcription audio | Oui |
| Compréhension vidéo | Oui |
| Recherche Web (Grounding) | Oui |
| Réflexion/raisonnement | Oui (Gemini 2.5+ / Gemini 3+) |
| Modèles Gemma 4 | Oui |
| Chat completions | Oui |
| Image generation | Oui |
| Music generation | Oui |
| Text-to-speech | Oui |
| Realtime voice | Oui (Google Live API) |
| Image understanding | Oui |
| Audio transcription | Oui |
| Video understanding | Oui |
| Web search (Grounding) | Oui |
| Thinking/reasoning | Oui (Gemini 2.5+ / Gemini 3+) |
| Gemma 4 models | Oui |
<Tip>
Les modèles Gemini 3 utilisent `thinkingLevel` plutôt que `thinkingBudget`. OpenClaw mappe
les contrôles de raisonnement de Gemini 3, Gemini 3.1, et des alias `gemini-*-latest` vers
`thinkingLevel` afin que les exécutions par défaut/à faible latence nenvoient pas
de valeurs `thinkingBudget` désactivées.
les contrôles de raisonnement des alias Gemini 3, Gemini 3.1 et `gemini-*-latest` vers
`thinkingLevel` afin que les exécutions par défaut/à faible latence nenvoient pas de valeurs
`thinkingBudget` désactivées.
Les modèles Gemma 4 (par exemple `gemma-4-26b-a4b-it`) prennent en charge le mode réflexion. OpenClaw
Les modèles Gemma 4 (par exemple `gemma-4-26b-a4b-it`) prennent en charge le mode de réflexion. OpenClaw
réécrit `thinkingBudget` vers un `thinkingLevel` Google pris en charge pour Gemma 4.
Définir la réflexion sur `off` conserve la réflexion désactivée au lieu de la mapper vers
`MINIMAL`.
</Tip>
## Génération dimage
## Génération dimages
Le fournisseur intégré `google` de génération dimage utilise par défaut
Le fournisseur groupé de génération dimages `google` utilise par défaut
`google/gemini-3.1-flash-image-preview`.
- Prend aussi en charge `google/gemini-3-pro-image-preview`
- Génération : jusquà 4 images par requête
- Mode édition : activé, jusquà 5 images dentrée
- Contrôles de géométrie : `size`, `aspectRatio`, et `resolution`
- Génération : jusquà 4 images par requête
- Mode édition : activé, jusquà 5 images dentrée
- Contrôles de géométrie : `size`, `aspectRatio` et `resolution`
Pour utiliser Google comme fournisseur dimage par défaut :
Pour utiliser Google comme fournisseur dimages par défaut :
```json5
{
@ -183,20 +184,20 @@ Pour utiliser Google comme fournisseur dimage par défaut :
```
<Note>
Voir [Génération dimage](/fr/tools/image-generation) pour les paramètres partagés de loutil, la sélection du fournisseur et le comportement de basculement.
Voir [Image Generation](/fr/tools/image-generation) pour les paramètres doutil partagés, la sélection du fournisseur et le comportement de basculement.
</Note>
## Génération vidéo
Le Plugin intégré `google` enregistre aussi la génération vidéo via loutil partagé
Le plugin groupé `google` enregistre aussi la génération vidéo via loutil partagé
`video_generate`.
- Modèle vidéo par défaut : `google/veo-3.1-fast-generate-preview`
- Modes : texte-vers-vidéo, image-vers-vidéo, et flux à référence vidéo unique
- Prend en charge `aspectRatio`, `resolution`, et `audio`
- Limite actuelle de durée : **4 à 8 secondes**
- Modèle vidéo par défaut : `google/veo-3.1-fast-generate-preview`
- Modes : texte vers vidéo, image vers vidéo et flux de référence à vidéo unique
- Prend en charge `aspectRatio`, `resolution` et `audio`
- Limitation actuelle de durée : **4 à 8 secondes**
Pour utiliser Google comme fournisseur vidéo par défaut :
Pour utiliser Google comme fournisseur vidéo par défaut :
```json5
{
@ -211,22 +212,22 @@ Pour utiliser Google comme fournisseur vidéo par défaut :
```
<Note>
Voir [Génération vidéo](/fr/tools/video-generation) pour les paramètres partagés de loutil, la sélection du fournisseur et le comportement de basculement.
Voir [Video Generation](/fr/tools/video-generation) pour les paramètres doutil partagés, la sélection du fournisseur et le comportement de basculement.
</Note>
## Génération musicale
Le Plugin intégré `google` enregistre aussi la génération musicale via loutil partagé
Le plugin groupé `google` enregistre aussi la génération musicale via loutil partagé
`music_generate`.
- Modèle musical par défaut : `google/lyria-3-clip-preview`
- Modèle musical par défaut : `google/lyria-3-clip-preview`
- Prend aussi en charge `google/lyria-3-pro-preview`
- Contrôles de prompt : `lyrics` et `instrumental`
- Format de sortie : `mp3` par défaut, plus `wav` sur `google/lyria-3-pro-preview`
- Entrées de référence : jusquà 10 images
- Les exécutions adossées à une session se détachent via le flux partagé tâche/statut, y compris `action: "status"`
- Contrôles du prompt : `lyrics` et `instrumental`
- Format de sortie : `mp3` par défaut, plus `wav` sur `google/lyria-3-pro-preview`
- Entrées de référence : jusquà 10 images
- Les exécutions adossées à une session se détachent via le flux partagé de tâche/statut, y compris `action: "status"`
Pour utiliser Google comme fournisseur musical par défaut :
Pour utiliser Google comme fournisseur musical par défaut :
```json5
{
@ -241,20 +242,20 @@ Pour utiliser Google comme fournisseur musical par défaut :
```
<Note>
Voir [Génération musicale](/fr/tools/music-generation) pour les paramètres partagés de loutil, la sélection du fournisseur et le comportement de basculement.
Voir [Music Generation](/fr/tools/music-generation) pour les paramètres doutil partagés, la sélection du fournisseur et le comportement de basculement.
</Note>
## Synthèse vocale
Le fournisseur de parole intégré `google` utilise le chemin TTS de lAPI Gemini avec
Le fournisseur vocal groupé `google` utilise le chemin TTS de lAPI Gemini avec
`gemini-3.1-flash-tts-preview`.
- Voix par défaut : `Kore`
- Authentification : `messages.tts.providers.google.apiKey`, `models.providers.google.apiKey`, `GEMINI_API_KEY`, ou `GOOGLE_API_KEY`
- Sortie : WAV pour les pièces jointes TTS normales, PCM pour Talk/téléphonie
- Sortie native en note vocale : non prise en charge sur ce chemin de lAPI Gemini car lAPI renvoie du PCM plutôt que de lOpus
- Voix par défaut : `Kore`
- Authentification : `messages.tts.providers.google.apiKey`, `models.providers.google.apiKey`, `GEMINI_API_KEY` ou `GOOGLE_API_KEY`
- Sortie : WAV pour les pièces jointes TTS classiques, PCM pour Talk/téléphonie
- Sortie native de note vocale : non prise en charge sur ce chemin dAPI Gemini, car lAPI renvoie du PCM plutôt que de lOpus
Pour utiliser Google comme fournisseur TTS par défaut :
Pour utiliser Google comme fournisseur TTS par défaut :
```json5
{
@ -274,20 +275,77 @@ Pour utiliser Google comme fournisseur TTS par défaut :
```
Le TTS de lAPI Gemini accepte des balises audio expressives entre crochets dans le texte, telles que
`[whispers]` ou `[laughs]`. Pour garder les balises hors de la réponse de chat visible tout en
les envoyant au TTS, placez-les dans un bloc `[[tts:text]]...[[/tts:text]]` :
`[whispers]` ou `[laughs]`. Pour garder les balises hors de la réponse visible dans le chat tout en
les envoyant au TTS, placez-les dans un bloc `[[tts:text]]...[[/tts:text]]` :
```text
Here is the clean reply text.
Voici le texte propre de la réponse.
[[tts:text]][whispers] Here is the spoken version.[[/tts:text]]
[[tts:text]][whispers] Voici la version parlée.[[/tts:text]]
```
<Note>
Une clé API Google Cloud Console limitée à lAPI Gemini est valide pour ce
Une clé API Google Cloud Console restreinte à lAPI Gemini est valide pour ce
fournisseur. Il ne sagit pas du chemin distinct de lAPI Cloud Text-to-Speech.
</Note>
## Voix en temps réel
Le plugin groupé `google` enregistre un fournisseur vocal en temps réel adossé à la
Google Live API pour les ponts audio backend comme Voice Call et Google Meet.
| Réglage | Chemin de configuration | Par défaut |
| --------------------- | -------------------------------------------------------------------- | ------------------------------------------------------------------------------------ |
| Modèle | `plugins.entries.voice-call.config.realtime.providers.google.model` | `gemini-2.5-flash-native-audio-preview-12-2025` |
| Voix | `...google.voice` | `Kore` |
| Température | `...google.temperature` | (non défini) |
| Sensibilité de début VAD | `...google.startSensitivity` | (non défini) |
| Sensibilité de fin VAD | `...google.endSensitivity` | (non défini) |
| Durée du silence | `...google.silenceDurationMs` | (non défini) |
| Clé API | `...google.apiKey` | Repli vers `models.providers.google.apiKey`, `GEMINI_API_KEY` ou `GOOGLE_API_KEY` |
Exemple de configuration temps réel pour Voice Call :
```json5
{
plugins: {
entries: {
"voice-call": {
enabled: true,
config: {
realtime: {
enabled: true,
provider: "google",
providers: {
google: {
model: "gemini-2.5-flash-native-audio-preview-12-2025",
voice: "Kore",
},
},
},
},
},
},
},
}
```
<Note>
Google Live API utilise laudio bidirectionnel et lappel de fonctions via un WebSocket.
OpenClaw adapte laudio des ponts téléphonie/Meet au flux PCM de la Live API de Gemini et
conserve les appels doutils sur le contrat partagé de voix en temps réel. Laissez `temperature`
non défini sauf si vous avez besoin de modifier léchantillonnage ; OpenClaw omet les valeurs non positives
car Google Live peut renvoyer des transcriptions sans audio pour `temperature: 0`.
La transcription de lAPI Gemini est activée sans `languageCodes` ; le SDK Google actuel
rejette les indications de code de langue sur ce chemin dAPI.
</Note>
<Note>
Les sessions navigateur Talk de linterface Control nécessitent toujours un fournisseur de voix en temps réel avec une
implémentation de session WebRTC dans le navigateur. Aujourdhui, ce chemin est OpenAI Realtime ; le
fournisseur Google est destiné aux ponts backend en temps réel.
</Note>
## Configuration avancée
<AccordionGroup>
@ -295,12 +353,12 @@ fournisseur. Il ne sagit pas du chemin distinct de lAPI Cloud Text-to-Spee
Pour les exécutions directes de lAPI Gemini (`api: "google-generative-ai"`), OpenClaw
transmet un handle `cachedContent` configuré aux requêtes Gemini.
- Configurez des paramètres par modèle ou globaux avec soit
`cachedContent` soit lancien `cached_content`
- Si les deux sont présents, `cachedContent` lemporte
- Exemple de valeur : `cachedContents/prebuilt-context`
- Lutilisation de cache-hit Gemini est normalisée en `cacheRead` OpenClaw à partir de
`cachedContentTokenCount` amont
- Configurez des paramètres par modèle ou globaux avec
`cachedContent` ou lancien `cached_content`
- Si les deux sont présents, `cachedContent` est prioritaire
- Exemple de valeur : `cachedContents/prebuilt-context`
- Lutilisation des cache-hit Gemini est normalisée dans `cacheRead` dOpenClaw à partir de
`cachedContentTokenCount` en amont
```json5
{
@ -320,21 +378,21 @@ fournisseur. Il ne sagit pas du chemin distinct de lAPI Cloud Text-to-Spee
</Accordion>
<Accordion title="Remarques sur lutilisation JSON de Gemini CLI">
<Accordion title="Notes dutilisation du JSON Gemini CLI">
Lors de lutilisation du fournisseur OAuth `google-gemini-cli`, OpenClaw normalise
la sortie JSON de la CLI comme suit :
la sortie JSON de la CLI comme suit :
- Le texte de réponse provient du champ JSON `response` de la CLI.
- Lutilisation revient à `stats` lorsque la CLI laisse `usage` vide.
- `stats.cached` est normalisé en `cacheRead` OpenClaw.
- Si `stats.input` est manquant, OpenClaw dérive les tokens dentrée à partir de
- Lusage se replie sur `stats` lorsque la CLI laisse `usage` vide.
- `stats.cached` est normalisé dans `cacheRead` dOpenClaw.
- Si `stats.input` est absent, OpenClaw dérive les tokens dentrée à partir de
`stats.input_tokens - stats.cached`.
</Accordion>
<Accordion title="Environnement et configuration du daemon">
Si le Gateway sexécute comme daemon (launchd/systemd), assurez-vous que `GEMINI_API_KEY`
est disponible pour ce processus (par exemple dans `~/.openclaw/.env` ou via
<Accordion title="Configuration de lenvironnement et du daemon">
Si le Gateway sexécute comme un daemon (launchd/systemd), assurez-vous que `GEMINI_API_KEY`
est disponible pour ce processus (par exemple, dans `~/.openclaw/.env` ou via
`env.shellEnv`).
</Accordion>
</AccordionGroup>
@ -342,16 +400,16 @@ fournisseur. Il ne sagit pas du chemin distinct de lAPI Cloud Text-to-Spee
## Lié
<CardGroup cols={2}>
<Card title="Sélection de modèle" href="/fr/concepts/model-providers" icon="layers">
Choisir les fournisseurs, références de modèles et comportement de basculement.
<Card title="Sélection du modèle" href="/fr/concepts/model-providers" icon="layers">
Choix des fournisseurs, des références de modèle et du comportement de basculement.
</Card>
<Card title="Génération dimage" href="/fr/tools/image-generation" icon="image">
Paramètres partagés doutil dimage et sélection du fournisseur.
<Card title="Génération dimages" href="/fr/tools/image-generation" icon="image">
Paramètres partagés de loutil dimage et sélection du fournisseur.
</Card>
<Card title="Génération vidéo" href="/fr/tools/video-generation" icon="video">
Paramètres partagés doutil vidéo et sélection du fournisseur.
Paramètres partagés de loutil vidéo et sélection du fournisseur.
</Card>
<Card title="Génération musicale" href="/fr/tools/music-generation" icon="music">
Paramètres partagés doutil musical et sélection du fournisseur.
Paramètres partagés de loutil musical et sélection du fournisseur.
</Card>
</CardGroup>

View File

@ -1,51 +1,51 @@
---
read_when:
- Exécuter ou corriger des tests
summary: Comment exécuter les tests localement (vitest) et quand utiliser les modes force/coverage
summary: Comment exécuter les tests en local (Vitest) et quand utiliser les modes force/couverture
title: Tests
x-i18n:
generated_at: "2026-04-24T07:32:24Z"
generated_at: "2026-04-24T08:58:06Z"
model: gpt-5.4
provider: openai
source_hash: df4ad5808ddbc06c704c9bcf9f780b06f9be94ac213ed22e79d880dedcaa6d3b
source_hash: 26cdb5fe005e738ddd00b183e91ccebe08c709bd64eed377d573a37b76e3a3bf
source_path: reference/test.md
workflow: 15
---
- Kit de test complet (suites, live, Docker) : [Testing](/fr/help/testing)
- `pnpm test:force` : tue tout processus gateway résiduel tenant 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 collision avec une instance en cours dexécution. Utilisez-le lorsquune exécution précédente du gateway a laissé le port 18789 occupé.
- `pnpm test:coverage` : exécute la suite unit avec couverture V8 (via `vitest.unit.config.ts`). Il sagit dune barrière de couverture unitaire des fichiers chargés, pas dune couverture globale de tous les fichiers du dépôt. Les seuils sont de 70 % pour les lignes/fonctions/instructions et 55 % pour les branches. Comme `coverage.all` vaut false, la barrière mesure les fichiers chargés par la suite de couverture unitaire au lieu de considérer tous les fichiers source des lanes séparées comme non couverts.
- `pnpm test:coverage:changed` : exécute la couverture unit uniquement pour les fichiers modifiés depuis `origin/main`.
- `pnpm test:changed` : développe les chemins git modifiés en lanes Vitest ciblées lorsque le diff ne touche que des fichiers source/test routables. Les changements de configuration/setup reviennent toujours à lexécution native des projets racine afin que les modifications de câblage relancent largement si nécessaire.
- `pnpm changed:lanes` : affiche les lanes architecturales déclenchées par le diff par rapport à `origin/main`.
- `pnpm check:changed` : exécute la barrière intelligente sur les changements du diff par rapport à `origin/main`. Il exécute le travail cœur avec les lanes de test cœur, le travail dextension avec les lanes de test dextension, le travail uniquement test avec seulement le typecheck/tests de test, étend les changements du Plugin SDK public ou du contrat de plugin à un passage de validation dextension, et limite les bumps de version portant uniquement sur les métadonnées de publication aux vérifications ciblées de version/configuration/dépendances racine.
- `pnpm test` : route des cibles explicites de fichier/répertoire via des lanes Vitest ciblées. Les exécutions non ciblées utilisent des groupes de shards fixes et se développent en configurations feuille pour une exécution locale parallèle ; le groupe dextensions se développe toujours vers les configurations de shard par extension au lieu dun immense processus de projet racine.
- Les exécutions complètes et par shard dextension mettent à jour les données de timing locales dans `.artifacts/vitest-shard-timings.json` ; les exécutions suivantes utilisent ces timings pour équilibrer les shards lents et rapides. Définissez `OPENCLAW_TEST_PROJECTS_TIMINGS=0` pour ignorer lartefact local de timing.
- 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`, laissant les cas lourds au runtime sur leurs lanes existantes.
- Certains fichiers source auxiliaires `plugin-sdk` et `commands` mappent également `pnpm test:changed` vers des tests frères explicites dans ces lanes légères, afin que de petites modifications dhelpers évitent de relancer les suites lourdes adossées au runtime.
- `auto-reply` se divise désormais lui aussi en trois configurations dédiées (`core`, `top-level`, `reply`) afin que le harnais de réponse ne domine pas les tests plus légers de statut/jeton/helper de niveau supérieur.
- La configuration Vitest de base utilise désormais par défaut `pool: "threads"` et `isolate: false`, avec le runner partagé non isolé activé dans les configurations du dépôt.
- `pnpm test:force` : tue tout processus Gateway persistant qui détient 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 collision avec une instance en cours dexécution. Utilisez cette commande lorsquune exécution précédente de 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 porte de couverture unitaire sur les fichiers chargés, et non dune couverture globale all-file 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, la porte mesure les fichiers chargés par la suite de couverture unitaire au lieu de considérer chaque fichier source de lane scindée comme non couvert.
- `pnpm test:coverage:changed` : exécute la couverture unitaire uniquement pour les fichiers modifiés depuis `origin/main`.
- `pnpm test:changed` : développe les chemins git modifiés en lanes Vitest ciblées lorsque le diff ne touche que des fichiers source/de test routables. Les changements de configuration/setup reviennent tout de même à lexécution native des projets racine afin que les modifications de câblage relancent largement lorsque cest nécessaire.
- `pnpm changed:lanes` : affiche les lanes darchitecture déclenchées par le diff par rapport à `origin/main`.
- `pnpm check:changed` : exécute la porte intelligente des changements pour le diff par rapport à `origin/main`. Elle exécute le travail du cœur avec les lanes de test du cœur, le travail des extensions avec les lanes de test des extensions, le travail limité aux tests avec uniquement le typecheck/tests des tests, étend les changements du Plugin SDK public ou du plugin-contract à un passage de validation dextension, et maintient les incréments de version limités aux métadonnées de release sur des vérifications ciblées de version/configuration/dépendances racine.
- `pnpm test` : achemine les cibles explicites de fichier/répertoire via des lanes Vitest ciblées. Les exécutions sans cible utilisent des groupes de shards fixes et se développent en configurations feuille pour une exécution parallèle locale ; le groupe dextensions se développe toujours en configurations de shard par extension au lieu dun unique processus géant de projet racine.
- Les exécutions complètes et par shard dextension mettent à jour les données locales de minutage dans `.artifacts/vitest-shard-timings.json` ; les exécutions suivantes utilisent ensuite ces minutages pour équilibrer les shards lents et rapides. Définissez `OPENCLAW_TEST_PROJECTS_TIMINGS=0` pour ignorer lartefact local de minutage.
- Certains fichiers de test `plugin-sdk` et `commands` sélectionnés sont désormais acheminé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.
- Certains fichiers source utilitaires `plugin-sdk` et `commands` sélectionnés font également correspondre `pnpm test:changed` à des tests voisins explicites dans ces lanes légères, afin que de petites modifications dutilitaires évitent de relancer les suites lourdes adossées au runtime.
- `auto-reply` est désormais lui aussi scindé en trois configurations dédiées (`core`, `top-level`, `reply`) afin que le harnais reply ne domine pas les tests plus légers de statut/token/utilitaires de niveau supérieur.
- La configuration de base Vitest utilise désormais par défaut `pool: "threads"` et `isolate: false`, avec le runner partagé non isolé activé dans toutes les configurations du dépôt.
- `pnpm test:channels` exécute `vitest.channels.config.ts`.
- `pnpm test:extensions` et `pnpm test extensions` exécutent tous les shards dextension/plugin. Les plugins de canal lourds, le plugin navigateur et OpenAI sexécutent comme shards dédiés ; les autres groupes de plugins restent regroupés. Utilisez `pnpm test extensions/<id>` pour une lane dun plugin intégré.
- `pnpm test:perf:imports` : active le reporting Vitest de durée dimport + détail des imports, tout en utilisant toujours le routage ciblé de lanes pour les cibles explicites fichier/répertoire.
- `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 le chemin routé en mode changed avec lexécution native du projet racine pour le même diff git validé.
- `pnpm test:perf:changed:bench -- --worktree` compare lensemble de changements du worktree actuel sans devoir valider dabord.
- `pnpm test:extensions` et `pnpm test extensions` exécutent tous les shards dextension/plugin. Les plugins de canaux lourds, le plugin navigateur et OpenAI sexécutent comme shards dédiés ; les autres groupes de plugins restent regroupés. Utilisez `pnpm test extensions/<id>` pour une seule lane de plugin groupé.
- `pnpm test:perf:imports` : active les rapports Vitest de durée dimport + détail des imports, tout en utilisant toujours le routage ciblé des lanes pour les cibles explicites de 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 changed-mode acheminé à lexécution native du projet racine pour le même diff git validé.
- `pnpm test:perf:changed:bench -- --worktree` compare en benchmark lensemble de changements du worktree actuel sans devoir le valider dabord.
- `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 unit (`.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 configuration feuille Vitest de la suite complète et écrit des données de durée groupées ainsi que des artefacts JSON/log par configuration. Le Test Performance Agent utilise cela comme base de 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 un changement orienté performances.
- Intégration Gateway : opt-in via `OPENCLAW_TEST_INCLUDE_GATEWAY=1 pnpm test` ou `pnpm test:gateway`.
- `pnpm test:e2e` : exécute les smoke tests de bout en bout du gateway (multi-instance WS/HTTP/jumelage de nœuds). 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 journaux détaillés.
- `pnpm test:live` : exécute les tests live des fournisseurs (minimax/zai). Nécessite des clés API et `LIVE=1` (ou un `*_LIVE_TEST=1` spécifique au fournisseur) pour enlever le skip.
- `pnpm test:docker:all` : construit une fois limage partagée de live-test et limage Docker E2E, puis exécute les lanes smoke Docker avec `OPENCLAW_SKIP_DOCKER_BUILD=1` à une concurrence de 8 par défaut. Ajustez le pool principal avec `OPENCLAW_DOCKER_ALL_PARALLELISM=<n>` et le pool de fin sensible aux fournisseurs avec `OPENCLAW_DOCKER_ALL_TAIL_PARALLELISM=<n>` ; les deux valent 8 par défaut. Le runner cesse de planifier de nouvelles lanes du pool après le premier échec sauf si `OPENCLAW_DOCKER_ALL_FAIL_FAST=0` est défini, et chaque lane a un délai dattente de 120 minutes remplaçable avec `OPENCLAW_DOCKER_ALL_LANE_TIMEOUT_MS`. Les journaux par lane sont écrits sous `.artifacts/docker-tests/<run-id>/`.
- `pnpm test:docker:openwebui` : démarre OpenClaw dockerisé + Open WebUI, 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 exploitable (par exemple OpenAI dans `~/.profile`), récupère une image Open WebUI externe, et nest pas censé être stable en CI comme les suites unit/e2e normales.
- `pnpm test:docker:mcp-channels` : démarre un conteneur Gateway pré-initialisé et un second conteneur client qui lance `openclaw mcp serve`, puis vérifie la découverte de conversations routées, les lectures de transcript, les métadonnées de pièces jointes, le comportement de la file dévénements live, le routage des envois sortants, ainsi que les notifications de style canal Claude + permissions sur le vrai pont stdio. Lassertion des notifications Claude lit directement les trames MCP stdio brutes afin que le smoke reflète ce que le pont émet réellement.
- `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 configuration feuille Vitest de la suite complète en série et écrit des données de durée groupées ainsi que des artefacts JSON/log par configuration. Le Test Performance Agent utilise cela comme référence 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 centré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 end-to-end de Gateway (appairage 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 du fournisseur (minimax/zai). Nécessite des clés API et `LIVE=1` (ou `*_LIVE_TEST=1` spécifique au fournisseur) pour lever le skip.
- `pnpm test:docker:all` : construit une fois limage partagée de test live et limage Docker E2E, puis exécute les lanes Docker smoke avec `OPENCLAW_SKIP_DOCKER_BUILD=1` avec une concurrence de 8 par défaut. Ajustez le pool principal avec `OPENCLAW_DOCKER_ALL_PARALLELISM=<n>` et le pool final sensible au fournisseur avec `OPENCLAW_DOCKER_ALL_TAIL_PARALLELISM=<n>` ; les deux valent 8 par défaut. Le démarrage des lanes est échelonné de 2 secondes par défaut pour éviter les tempêtes locales de création du daemon Docker ; remplacez cela avec `OPENCLAW_DOCKER_ALL_START_STAGGER_MS=<ms>`. 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 possède un délai maximal de 120 minutes remplaçable via `OPENCLAW_DOCKER_ALL_LANE_TIMEOUT_MS`. Les logs par lane sont écrits dans `.artifacts/docker-tests/<run-id>/`.
- `pnpm test:docker:openwebui` : démarre OpenClaw et Open WebUI conteneurisés, ouvre une session 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 amorcé et un second conteneur client qui lance `openclaw mcp serve`, puis vérifie la découverte de conversation routée, la lecture des transcriptions, les métadonnées des pièces jointes, le comportement de la file dévénements live, le routage des envois sortants et les notifications de type Claude pour canal + permissions sur 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.
## Barrière locale de PR
## Porte PR locale
Pour les vérifications locales de PR/atterrissage, exécutez :
Pour les vérifications locales de landing/porte de PR, exécutez :
- `pnpm check:changed`
- `pnpm check`
@ -54,25 +54,25 @@ Pour les vérifications locales de PR/atterrissage, exécutez :
- `pnpm test`
- `pnpm check:docs`
Si `pnpm test` flake sur une machine chargée, relancez une fois avant de le traiter comme une régression, puis isolez avec `pnpm test <path/to/test>`. Pour les machines à mémoire limitée, utilisez :
Si `pnpm test` est instable sur une machine chargée, relancez-le une fois avant de le considérer comme une régression, puis isolez avec `pnpm test <path/to/test>`. Pour les machines avec peu de mémoire, utilisez :
- `OPENCLAW_VITEST_MAX_WORKERS=1 pnpm test`
- `OPENCLAW_VITEST_FS_MODULE_CACHE_PATH=/tmp/openclaw-vitest-cache pnpm test:changed`
## Benchmark de latence des modèles (clés locales)
## Benchmark de latence de modèle (clés locales)
Script : [`scripts/bench-model.ts`](https://github.com/openclaw/openclaw/blob/main/scripts/bench-model.ts)
Utilisation :
- `source ~/.profile && pnpm tsx scripts/bench-model.ts --runs 10`
- Variables env facultatives : `MINIMAX_API_KEY`, `MINIMAX_BASE_URL`, `MINIMAX_MODEL`, `ANTHROPIC_API_KEY`
- Prompt par défaut : « Reply with a single word: ok. No punctuation or extra text. »
- Env facultatif : `MINIMAX_API_KEY`, `MINIMAX_BASE_URL`, `MINIMAX_MODEL`, `ANTHROPIC_API_KEY`
- Prompt par défaut : « Répondez avec un seul mot : ok. Sans ponctuation ni texte supplémentaire. »
Dernière exécution (2025-12-31, 20 runs) :
Dernière exécution (2025-12-31, 20 exécutions) :
- minimax médiane 1279ms (min 1114, max 2431)
- opus médiane 2454ms (min 1224, max 3170)
- minimax médiane 1279 ms (min 1114, max 2431)
- opus médiane 2454 ms (min 1224, max 3170)
## Benchmark de démarrage CLI
@ -101,23 +101,23 @@ Préréglages :
- `real` : `health`, `status`, `status --json`, `sessions`, `sessions --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`, moyenne, p50, p95, min/max, distribution exit-code/signal, et résumés RSS max pour chaque commande. Les options facultatives `--cpu-prof-dir` / `--heap-prof-dir` écrivent des profils V8 par exécution afin que la mesure de temps et la capture de profil utilisent le même harnais.
La sortie inclut `sampleCount`, avg, p50, p95, min/max, la distribution exit-code/signal et les résumés de RSS max pour chaque commande. Les options facultatives `--cpu-prof-dir` / `--heap-prof-dir` écrivent des profils V8 par exécution afin que la mesure temporelle et la capture de profil utilisent le même harnais.
Conventions de sortie enregistrée :
- `pnpm test:startup:bench:smoke` écrit lartefact smoke ciblé dans `.artifacts/cli-startup-bench-smoke.json`
- `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 versionné dans `test/fixtures/cli-startup-bench.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` en utilisant `runs=5` et `warmup=1`
- `pnpm test:startup:bench:update` rafraîchit le fixture de référence versionné dans `test/fixtures/cli-startup-bench.json` en utilisant `runs=5` et `warmup=1`
Fixture versionné :
- `test/fixtures/cli-startup-bench.json`
- Actualisez-le avec `pnpm test:startup:bench:update`
- Comparez les résultats actuels au fixture avec `pnpm test:startup:bench:check`
- Rafraîchir avec `pnpm test:startup:bench:update`
- Comparer les résultats actuels au fixture avec `pnpm test:startup:bench:check`
## E2E onboarding (Docker)
## E2E donboarding (Docker)
Docker est facultatif ; il nest nécessaire que pour les smoke tests donboarding conteneurisés.
Docker est facultatif ; cela nest nécessaire que pour les tests smoke donboarding conteneurisés.
Flux complet de démarrage à froid dans un conteneur Linux propre :
@ -125,17 +125,17 @@ 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/espace de travail/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/workspace/session, puis démarre Gateway et exécute `openclaw health`.
## Smoke dimport QR (Docker)
Garantit que lassistant runtime QR maintenu se charge sous les runtimes Node Docker pris en charge (Node 24 par défaut, Node 22 compatible) :
Garantit que le helper runtime QR maintenu se charge sous les runtimes Node Docker pris en charge (Node 24 par défaut, Node 22 compatible) :
```bash
pnpm test:docker:qr
```
## Associé
## Liens connexes
- [Testing](/fr/help/testing)
- [Testing live](/fr/help/testing-live)

View File

@ -1,39 +1,38 @@
---
read_when:
- Ajout dune automatisation de navigateur contrôlée par lagent
- Débogage des raisons pour lesquelles openclaw interfère avec votre propre Chrome
- Implémentation des paramètres + du cycle de vie du navigateur dans lapplication macOS
- Ajout de lautomatisation du navigateur contrôlée par lagent
- Déboguer pourquoi openclaw interfère avec votre propre Chrome
- Implémentation des paramètres et du cycle de vie du navigateur dans lapp macOS
summary: Service intégré de contrôle du navigateur + commandes daction
title: Browser (géré par OpenClaw)
title: Navigateur (géré par OpenClaw)
x-i18n:
generated_at: "2026-04-24T07:35:06Z"
generated_at: "2026-04-24T08:58:21Z"
model: gpt-5.4
provider: openai
source_hash: 2fb0fc0b6235fa8a0324b754e247e015d5ca19d114d324d565ed4a19f9313f7e
source_hash: 80805676213ef5195093163874a848955b3c25364b20045a8d759d03ac088e14
source_path: tools/browser.md
workflow: 15
---
OpenClaw peut exécuter un **profil Chrome/Brave/Edge/Chromium dédié** contrôlé par lagent.
Il est isolé de votre navigateur personnel et géré via un petit service de
contrôle local à lintérieur du Gateway (loopback uniquement).
contrôle local à lintérieur du Gateway (loopback local uniquement).
Vue pour débutant :
Vue débutant :
- Voyez-le comme un **navigateur séparé, réservé à lagent**.
- Considérez-le comme un **navigateur séparé, réservé à lagent**.
- Le profil `openclaw` ne touche **pas** à votre profil de navigateur personnel.
- Lagent peut **ouvrir des onglets, lire des pages, cliquer et saisir** dans une voie sûre.
- Le profil intégré `user` sattache à votre vraie session Chrome connectée via Chrome MCP.
- Lagent peut **ouvrir des onglets, lire des pages, cliquer et saisir du texte** dans un cadre sûr.
- Le profil intégré `user` se connecte à votre vraie session Chrome connectée via Chrome MCP.
## Ce que vous obtenez
- Un profil de navigateur séparé nommé **openclaw** (accent orange par défaut).
- Contrôle déterministe des onglets (lister/ouvrir/focaliser/fermer).
- Actions dagent (cliquer/saisir/glisser/sélectionner), instantanés, captures décran, PDF.
- Prise en charge facultative de plusieurs profils (`openclaw`, `work`, `remote`, ...).
- Un profil de navigateur distinct nommé **openclaw** (accent orange par défaut).
- Un contrôle déterministe des onglets (lister/ouvrir/focaliser/fermer).
- Des actions dagent (cliquer/saisir/faire glisser/sélectionner), des instantanés, des captures décran, des PDF.
- Une prise en charge facultative de plusieurs profils (`openclaw`, `work`, `remote`, ...).
Ce navigateur nest **pas** votre navigateur quotidien. Cest une surface sûre et isolée pour
lautomatisation et la vérification par lagent.
Ce navigateur nest **pas** votre navigateur principal au quotidien. Cest une surface sûre et isolée pour lautomatisation et la vérification par lagent.
## Démarrage rapide
@ -44,15 +43,13 @@ openclaw browser --browser-profile openclaw open https://example.com
openclaw browser --browser-profile openclaw snapshot
```
Si vous obtenez « Browser disabled », activez-le dans la configuration (voir ci-dessous) et redémarrez le
Gateway.
Si vous obtenez « Browser disabled », activez-le dans la configuration (voir ci-dessous) puis redémarrez le Gateway.
Si `openclaw browser` est totalement absent, ou si lagent dit que loutil browser
est indisponible, allez à [Commande ou outil browser manquant](/fr/tools/browser#missing-browser-command-or-tool).
Si `openclaw browser` est totalement absent, ou si lagent indique que loutil navigateur nest pas disponible, consultez [Commande ou outil navigateur manquant](/fr/tools/browser#missing-browser-command-or-tool).
## Contrôle du Plugin
Loutil `browser` par défaut est un Plugin intégré. Désactivez-le pour le remplacer par un autre Plugin qui enregistre le même nom doutil `browser` :
Loutil `browser` par défaut est un Plugin intégré. Désactivez-le pour le remplacer par un autre Plugin qui enregistre le même nom doutil `browser` :
```json5
{
@ -66,13 +63,13 @@ Loutil `browser` par défaut est un Plugin intégré. Désactivez-le pour le
}
```
Les valeurs par défaut nécessitent à la fois `plugins.entries.browser.enabled` **et** `browser.enabled=true`. Désactiver uniquement le Plugin supprime dun seul bloc le CLI `openclaw browser`, la méthode gateway `browser.request`, loutil dagent et le service de contrôle ; votre configuration `browser.*` reste intacte pour un remplacement.
Les valeurs par défaut nécessitent à la fois `plugins.entries.browser.enabled` **et** `browser.enabled=true`. Désactiver uniquement le Plugin supprime en une seule unité la CLI `openclaw browser`, la méthode Gateway `browser.request`, loutil dagent et le service de contrôle ; votre configuration `browser.*` reste intacte pour un remplacement.
Les changements de configuration browser nécessitent un redémarrage du Gateway afin que le Plugin puisse réenregistrer son service.
Les modifications de configuration du navigateur nécessitent un redémarrage du Gateway afin que le Plugin puisse réenregistrer son service.
## Commande ou outil browser manquant
## Commande ou outil navigateur manquant
Si `openclaw browser` est inconnu après une mise à niveau, que `browser.request` est manquant, ou que lagent signale que loutil browser est indisponible, la cause habituelle est une liste `plugins.allow` qui omet `browser`. Ajoutez-le :
Si `openclaw browser` est inconnu après une mise à niveau, si `browser.request` est absent ou si lagent indique que loutil navigateur nest pas disponible, la cause habituelle est une liste `plugins.allow` qui omet `browser`. Ajoutez-le :
```json5
{
@ -82,39 +79,38 @@ Si `openclaw browser` est inconnu après une mise à niveau, que `browser.reques
}
```
`browser.enabled=true`, `plugins.entries.browser.enabled=true`, et `tools.alsoAllow: ["browser"]` ne remplacent pas lappartenance à la liste dautorisation — la liste dautorisation filtre le chargement du Plugin, et la politique doutils ne sexécute quaprès le chargement. Supprimer complètement `plugins.allow` restaure également le comportement par défaut.
`browser.enabled=true`, `plugins.entries.browser.enabled=true` et `tools.alsoAllow: ["browser"]` ne remplacent pas lappartenance à la liste dautorisation — cette liste contrôle le chargement des Plugins, et la politique doutils ne sexécute quaprès le chargement. Supprimer complètement `plugins.allow` rétablit également le comportement par défaut.
## Profils : `openclaw` vs `user`
## Profils : `openclaw` vs `user`
- `openclaw` : navigateur géré, isolé (aucune extension requise).
- `user` : profil intégré dattachement Chrome MCP pour votre **vraie session Chrome connectée**.
- `openclaw` : navigateur géré et isolé (aucune extension requise).
- `user` : profil intégré de connexion Chrome MCP à votre **vraie session Chrome connectée**.
Pour les appels doutils browser par lagent :
Pour les appels doutil navigateur de lagent :
- Par défaut : utiliser le navigateur isolé `openclaw`.
- Préférez `profile="user"` lorsque les sessions connectées existantes comptent et que lutilisateur
est à lordinateur pour cliquer/approuver toute invite dattachement.
- `profile` est la surcharge explicite lorsque vous voulez un mode de navigateur spécifique.
- Par défaut : utilisez le navigateur isolé `openclaw`.
- Préférez `profile="user"` lorsque des sessions déjà connectées comptent et que lutilisateur est à lordinateur pour cliquer/approuver toute invite de connexion.
- `profile` est la surcharge explicite lorsque vous voulez un mode navigateur spécifique.
Définissez `browser.defaultProfile: "openclaw"` si vous voulez le mode géré par défaut.
## Configuration
Les paramètres browser se trouvent dans `~/.openclaw/openclaw.json`.
Les paramètres du navigateur se trouvent dans `~/.openclaw/openclaw.json`.
```json5
{
browser: {
enabled: true, // default: true
enabled: true, // défaut : true
ssrfPolicy: {
// dangerouslyAllowPrivateNetwork: true, // opt in only for trusted private-network access
// allowPrivateNetwork: true, // legacy alias
// dangerouslyAllowPrivateNetwork: true, // activer uniquement pour un accès intentionnel à un réseau privé de confiance
// allowPrivateNetwork: true, // alias hérité
// hostnameAllowlist: ["*.example.com", "example.com"],
// allowedHostnames: ["localhost"],
},
// cdpUrl: "http://127.0.0.1:18792", // legacy single-profile override
remoteCdpTimeoutMs: 1500, // remote CDP HTTP timeout (ms)
remoteCdpHandshakeTimeoutMs: 3000, // remote CDP WebSocket handshake timeout (ms)
// cdpUrl: "http://127.0.0.1:18792", // surcharge héritée à profil unique
remoteCdpTimeoutMs: 1500, // délai dattente HTTP CDP distant (ms)
remoteCdpHandshakeTimeoutMs: 3000, // délai dattente de poignée de main WebSocket CDP distante (ms)
defaultProfile: "openclaw",
color: "#FF4500",
headless: false,
@ -145,29 +141,29 @@ Les paramètres browser se trouvent dans `~/.openclaw/openclaw.json`.
<Accordion title="Ports et accessibilité">
- Le service de contrôle se lie à loopback sur un port dérivé de `gateway.port` (par défaut `18791` = gateway + 2). Remplacer `gateway.port` ou `OPENCLAW_GATEWAY_PORT` décale les ports dérivés dans la même famille.
- Les profils locaux `openclaw` attribuent automatiquement `cdpPort`/`cdpUrl` ; ne définissez ceux-ci que pour le CDP distant. `cdpUrl` prend par défaut le port CDP local géré lorsquil nest pas défini.
- `remoteCdpTimeoutMs` sapplique aux vérifications daccessibilité HTTP CDP distantes (non loopback) ; `remoteCdpHandshakeTimeoutMs` sapplique aux poignées de main WebSocket CDP distantes.
- Le service de contrôle se lie au loopback sur un port dérivé de `gateway.port` (par défaut `18791` = gateway + 2). Remplacer `gateway.port` ou `OPENCLAW_GATEWAY_PORT` décale les ports dérivés dans la même famille.
- Les profils `openclaw` locaux attribuent automatiquement `cdpPort`/`cdpUrl` ; définissez-les uniquement pour le CDP distant. `cdpUrl` utilise par défaut le port CDP local géré lorsquil nest pas défini.
- `remoteCdpTimeoutMs` sapplique aux vérifications daccessibilité HTTP CDP distantes (hors loopback) ; `remoteCdpHandshakeTimeoutMs` sapplique aux poignées de main WebSocket CDP distantes.
</Accordion>
<Accordion title="Politique SSRF">
- La navigation browser et louverture donglet sont protégées contre SSRF avant la navigation et revérifiées au mieux sur lURL finale `http(s)` ensuite.
- La navigation du navigateur et louverture donglets sont protégées contre les SSRF avant la navigation et revérifiées au mieux sur lURL `http(s)` finale ensuite.
- En mode SSRF strict, la découverte du point de terminaison CDP distant et les sondes `/json/version` (`cdpUrl`) sont également vérifiées.
- `browser.ssrfPolicy.dangerouslyAllowPrivateNetwork` est désactivé par défaut ; activez-le uniquement lorsque laccès browser au réseau privé est intentionnellement approuvé.
- `browser.ssrfPolicy.dangerouslyAllowPrivateNetwork` est désactivé par défaut ; activez-le uniquement lorsque laccès au navigateur sur un réseau privé est intentionnellement approuvé.
- `browser.ssrfPolicy.allowPrivateNetwork` reste pris en charge comme alias hérité.
</Accordion>
<Accordion title="Comportement des profils">
- `attachOnly: true` signifie ne jamais lancer de navigateur local ; seulement sy attacher sil sexécute déjà.
- `color` (niveau supérieur et par profil) teinte linterface du navigateur afin que vous puissiez voir quel profil est actif.
- Le profil par défaut est `openclaw` (standalone géré). Utilisez `defaultProfile: "user"` pour opter pour le navigateur utilisateur connecté.
- Ordre de détection automatique : navigateur système par défaut sil est basé sur Chromium ; sinon Chrome → Brave → Edge → Chromium → Chrome Canary.
- `driver: "existing-session"` utilise Chrome DevTools MCP au lieu du CDP brut. Ne définissez pas `cdpUrl` pour ce driver.
- Définissez `browser.profiles.<name>.userDataDir` lorsquun profil existing-session doit sattacher à un profil utilisateur Chromium non par défaut (Brave, Edge, etc.).
- `attachOnly: true` signifie ne jamais lancer de navigateur local ; se connecter uniquement si un navigateur est déjà en cours dexécution.
- `color` (au niveau supérieur et par profil) teinte linterface du navigateur afin que vous puissiez voir quel profil est actif.
- Le profil par défaut est `openclaw` (autonome géré). Utilisez `defaultProfile: "user"` pour choisir le navigateur utilisateur connecté.
- Ordre de détection automatique : navigateur système par défaut sil est basé sur Chromium ; sinon Chrome → Brave → Edge → Chromium → Chrome Canary.
- `driver: "existing-session"` utilise Chrome DevTools MCP au lieu du CDP brut. Ne définissez pas `cdpUrl` pour ce pilote.
- Définissez `browser.profiles.<name>.userDataDir` lorsquun profil existing-session doit se connecter à un profil utilisateur Chromium non par défaut (Brave, Edge, etc.).
</Accordion>
@ -175,15 +171,15 @@ Les paramètres browser se trouvent dans `~/.openclaw/openclaw.json`.
## Utiliser Brave (ou un autre navigateur basé sur Chromium)
Si votre **navigateur système par défaut** est basé sur Chromium (Chrome/Brave/Edge/etc),
Si votre navigateur **par défaut du système** est basé sur Chromium (Chrome/Brave/Edge/etc.),
OpenClaw lutilise automatiquement. Définissez `browser.executablePath` pour remplacer
la détection automatique :
la détection automatique :
```bash
openclaw config set browser.executablePath "/usr/bin/google-chrome"
```
Ou définissez-le dans la configuration, selon la plateforme :
Ou définissez-le dans la configuration, selon la plateforme :
<Tabs>
<Tab title="macOS">
@ -217,53 +213,46 @@ Ou définissez-le dans la configuration, selon la plateforme :
## Contrôle local vs distant
- **Contrôle local (par défaut) :** le Gateway démarre le service de contrôle loopback et peut lancer un navigateur local.
- **Contrôle distant (hôte node) :** exécutez un hôte node sur la machine qui possède le navigateur ; le Gateway y relaie les actions browser.
- **CDP distant :** définissez `browser.profiles.<name>.cdpUrl` (ou `browser.cdpUrl`) pour
vous attacher à un navigateur distant basé sur Chromium. Dans ce cas, OpenClaw ne lancera pas de navigateur local.
- **Contrôle local (par défaut) :** le Gateway démarre le service de contrôle loopback et peut lancer un navigateur local.
- **Contrôle distant (hôte Node) :** exécutez un hôte Node sur la machine qui possède le navigateur ; le Gateway transmet les actions du navigateur à cet hôte.
- **CDP distant :** définissez `browser.profiles.<name>.cdpUrl` (ou `browser.cdpUrl`) pour vous connecter à un navigateur distant basé sur Chromium. Dans ce cas, OpenClaw ne lancera pas de navigateur local.
Le comportement à larrêt diffère selon le mode de profil :
Le comportement darrêt diffère selon le mode de profil :
- profils gérés locaux : `openclaw browser stop` arrête le processus navigateur que
OpenClaw a lancé
- profils attach-only et CDP distant : `openclaw browser stop` ferme la session de contrôle active
et libère les surcharges démulation Playwright/CDP (viewport,
schéma de couleurs, locale, fuseau horaire, mode hors ligne et état similaire), même
si aucun processus navigateur na été lancé par OpenClaw
- profils locaux gérés : `openclaw browser stop` arrête le processus navigateur lancé par OpenClaw
- profils en connexion uniquement et profils CDP distants : `openclaw browser stop` ferme la session de contrôle active et libère les surcharges démulation Playwright/CDP (viewport, schéma de couleurs, langue, fuseau horaire, mode hors ligne et états similaires), même si aucun processus navigateur na été lancé par OpenClaw
Les URL CDP distantes peuvent inclure une authentification :
Les URL CDP distantes peuvent inclure une authentification :
- Jetons de requête (par ex., `https://provider.example?token=<token>`)
- Auth Basic HTTP (par ex., `https://user:pass@provider.example`)
- Jetons de requête (par ex. `https://provider.example?token=<token>`)
- Authentification HTTP Basic (par ex. `https://user:pass@provider.example`)
OpenClaw préserve lauthentification lorsquil appelle les points de terminaison `/json/*` et lorsquil se connecte
au WebSocket CDP. Préférez les variables denvironnement ou les gestionnaires de secrets pour
les jetons plutôt que de les committer dans les fichiers de configuration.
OpenClaw conserve lauthentification lors des appels aux points de terminaison `/json/*` et lors de la connexion au WebSocket CDP. Préférez des variables denvironnement ou des gestionnaires de secrets pour les jetons plutôt que de les valider dans des fichiers de configuration.
## Proxy browser Node (par défaut sans configuration)
## Proxy de navigateur Node (par défaut sans configuration)
Si vous exécutez un **hôte node** sur la machine qui possède votre navigateur, OpenClaw peut
router automatiquement les appels doutils browser vers ce node sans configuration browser supplémentaire.
Cest le chemin par défaut pour les gateways distants.
Si vous exécutez un **hôte Node** sur la machine qui possède votre navigateur, OpenClaw peut automatiquement
acheminer les appels doutil navigateur vers ce Node sans configuration supplémentaire du navigateur.
Cest le chemin par défaut pour les Gateways distants.
Remarques :
Remarques :
- Lhôte node expose son serveur local de contrôle du navigateur via une **commande proxy**.
- Les profils proviennent de la propre configuration `browser.profiles` du node (comme en local).
- `nodeHost.browserProxy.allowProfiles` est facultatif. Laissez-le vide pour le comportement hérité/par défaut : tous les profils configurés restent accessibles via le proxy, y compris les routes de création/suppression de profil.
- Si vous définissez `nodeHost.browserProxy.allowProfiles`, OpenClaw le traite comme une frontière de moindre privilège : seuls les profils autorisés peuvent être ciblés, et les routes persistantes de création/suppression de profil sont bloquées sur la surface proxy.
- Désactivez-le si vous nen voulez pas :
- Sur le node : `nodeHost.browserProxy.enabled=false`
- Sur le gateway : `gateway.nodes.browser.mode="off"`
- Lhôte Node expose son serveur local de contrôle du navigateur via une **commande proxy**.
- Les profils proviennent de la propre configuration `browser.profiles` du Node (identique au mode local).
- `nodeHost.browserProxy.allowProfiles` est facultatif. Laissez-le vide pour le comportement hérité/par défaut : tous les profils configurés restent accessibles via le proxy, y compris les routes de création/suppression de profils.
- Si vous définissez `nodeHost.browserProxy.allowProfiles`, OpenClaw le traite comme une limite de moindre privilège : seuls les profils autorisés peuvent être ciblés, et les routes de création/suppression de profils persistants sont bloquées sur la surface du proxy.
- Désactivez-le si vous nen voulez pas :
- Sur le Node : `nodeHost.browserProxy.enabled=false`
- Sur le gateway : `gateway.nodes.browser.mode="off"`
## Browserless (CDP distant hébergé)
[Browserless](https://browserless.io) est un service Chromium hébergé qui expose
des URL de connexion CDP via HTTPS et WebSocket. OpenClaw peut utiliser lune ou lautre forme, mais
pour un profil de navigateur distant, loption la plus simple est lURL WebSocket directe
issue de la documentation de connexion Browserless.
de la documentation de connexion de Browserless.
Exemple :
Exemple :
```json5
{
@ -282,42 +271,40 @@ Exemple :
}
```
Remarques :
Remarques :
- Remplacez `<BROWSERLESS_API_KEY>` par votre vrai jeton Browserless.
- Choisissez le point de terminaison de région correspondant à votre compte Browserless (voir leur documentation).
- Choisissez le point de terminaison régional correspondant à votre compte Browserless (voir leur documentation).
- Si Browserless vous fournit une URL de base HTTPS, vous pouvez soit la convertir en
`wss://` pour une connexion CDP directe, soit conserver lURL HTTPS et laisser OpenClaw
découvrir `/json/version`.
## Providers CDP WebSocket directs
## Fournisseurs CDP WebSocket directs
Certains services de navigateur hébergés exposent un point de terminaison **WebSocket direct** au lieu de
la découverte CDP standard basée sur HTTP (`/json/version`). OpenClaw accepte trois formes dURL
CDP et choisit automatiquement la bonne stratégie de connexion :
Certains services de navigateur hébergés exposent un point de terminaison **WebSocket direct** plutôt que
la découverte CDP standard basée sur HTTP (`/json/version`). OpenClaw accepte trois
formes dURL CDP et choisit automatiquement la bonne stratégie de connexion :
- **Découverte HTTP(S)**`http://host[:port]` ou `https://host[:port]`.
OpenClaw appelle `/json/version` pour découvrir lURL du débogueur WebSocket, puis
sy connecte. Aucun repli WebSocket.
se connecte. Aucun repli WebSocket.
- **Points de terminaison WebSocket directs**`ws://host[:port]/devtools/<kind>/<id>` ou
`wss://...` avec un chemin `/devtools/browser|page|worker|shared_worker|service_worker/<id>`.
OpenClaw se connecte directement via une poignée de main WebSocket et ignore complètement
`/json/version`.
OpenClaw se connecte directement via une poignée de main WebSocket et ignore
complètement `/json/version`.
- **Racines WebSocket nues**`ws://host[:port]` ou `wss://host[:port]` sans
chemin `/devtools/...` (par ex. [Browserless](https://browserless.io),
[Browserbase](https://www.browserbase.com)). OpenClaw essaie dabord la découverte HTTP
`/json/version` (en normalisant le schéma en `http`/`https`) ;
[Browserbase](https://www.browserbase.com)). OpenClaw tente dabord la découverte HTTP
`/json/version` (en normalisant le schéma en `http`/`https`) ;
si la découverte renvoie un `webSocketDebuggerUrl`, il est utilisé, sinon OpenClaw
revient à une poignée de main WebSocket directe à la racine nue. Cela permet à une
URL `ws://` nue pointant vers un Chrome local de tout de même se connecter, puisque Chrome naccepte
les upgrades WebSocket que sur le chemin spécifique par cible fourni par
URL nue `ws://` pointant vers un Chrome local de se connecter, puisque Chrome naccepte
les mises à niveau WebSocket que sur le chemin spécifique par cible provenant de
`/json/version`.
### Browserbase
[Browserbase](https://www.browserbase.com) est une plateforme cloud pour exécuter des
navigateurs headless avec résolution intégrée des CAPTCHA, mode furtif, et proxies
résidentiels.
[Browserbase](https://www.browserbase.com) est une plateforme cloud pour exécuter des navigateurs headless avec résolution CAPTCHA intégrée, mode furtif et proxys résidentiels.
```json5
{
@ -336,80 +323,79 @@ résidentiels.
}
```
Remarques :
Remarques :
- [Inscrivez-vous](https://www.browserbase.com/sign-up) et copiez votre **API Key**
- [Inscrivez-vous](https://www.browserbase.com/sign-up) et copiez votre **clé API**
depuis le [tableau de bord Overview](https://www.browserbase.com/overview).
- Remplacez `<BROWSERBASE_API_KEY>` par votre vraie clé API Browserbase.
- Browserbase crée automatiquement une session de navigateur lors de la connexion WebSocket, donc
aucune étape de création manuelle de session nest nécessaire.
- Loffre gratuite autorise une session concurrente et une heure de navigateur par mois.
Voir [pricing](https://www.browserbase.com/pricing) pour les limites des offres payantes.
- Consultez la [documentation Browserbase](https://docs.browserbase.com) pour la référence API
complète, les guides SDK et les exemples dintégration.
- Browserbase crée automatiquement une session de navigateur lors de la connexion WebSocket, donc aucune étape manuelle de création de session nest nécessaire.
- Le niveau gratuit autorise une session concurrente et une heure de navigateur par mois.
Consultez les [tarifs](https://www.browserbase.com/pricing) pour les limites des offres payantes.
- Consultez la [documentation Browserbase](https://docs.browserbase.com) pour la référence API complète,
les guides SDK et les exemples dintégration.
## Sécurité
Idées clés :
Idées clés :
- Le contrôle du navigateur est limité à loopback ; laccès passe par lauthentification du Gateway ou lappairage de node.
- LAPI HTTP browser autonome sur loopback utilise **uniquement lauthentification par secret partagé** :
authentification bearer par jeton gateway, `x-openclaw-password`, ou authentification Basic HTTP avec le mot de passe gateway configuré.
- Les en-têtes didentité Tailscale Serve et `gateway.auth.mode: "trusted-proxy"` nauthentifient **pas** cette API browser autonome sur loopback.
- Si le contrôle browser est activé et quaucune authentification par secret partagé nest configurée, OpenClaw
- Le contrôle du navigateur est limité au loopback ; laccès passe par lauthentification du Gateway ou lappairage de Node.
- LAPI HTTP autonome du navigateur sur loopback utilise **uniquement une authentification par secret partagé** :
authentification bearer par jeton Gateway, `x-openclaw-password` ou authentification HTTP Basic avec le
mot de passe Gateway configuré.
- Les en-têtes didentité Tailscale Serve et `gateway.auth.mode: "trusted-proxy"` nauthentifient
**pas** cette API autonome du navigateur sur loopback.
- Si le contrôle du navigateur est activé et quaucune authentification par secret partagé nest configurée, OpenClaw
génère automatiquement `gateway.auth.token` au démarrage et le persiste dans la configuration.
- OpenClaw ne génère **pas** automatiquement ce jeton lorsque `gateway.auth.mode` vaut déjà
`password`, `none`, ou `trusted-proxy`.
- Gardez le Gateway et tous les hôtes node sur un réseau privé (Tailscale) ; évitez lexposition publique.
- Traitez les URL/jetons CDP distants comme des secrets ; préférez les variables denvironnement ou un gestionnaire de secrets.
- OpenClaw ne génère **pas** automatiquement ce jeton lorsque `gateway.auth.mode` est
déjà `password`, `none` ou `trusted-proxy`.
- Conservez le Gateway et tous les hôtes Node sur un réseau privé (Tailscale) ; évitez toute exposition publique.
- Traitez les URL/jetons CDP distants comme des secrets ; préférez des variables denvironnement ou un gestionnaire de secrets.
Conseils CDP distant :
Conseils pour le CDP distant :
- Préférez des points de terminaison chiffrés (HTTPS ou WSS) et des jetons de courte durée lorsque cest possible.
- Préférez les points de terminaison chiffrés (HTTPS ou WSS) et les jetons à courte durée de vie lorsque cest possible.
- Évitez dintégrer directement des jetons longue durée dans les fichiers de configuration.
## Profils (multi-navigateurs)
OpenClaw prend en charge plusieurs profils nommés (configurations de routage). Les profils peuvent être :
OpenClaw prend en charge plusieurs profils nommés (configurations de routage). Les profils peuvent être :
- **gérés par openclaw** : une instance dédiée de navigateur basé sur Chromium avec son propre répertoire de données utilisateur + port CDP
- **distants** : une URL CDP explicite (navigateur basé sur Chromium exécuté ailleurs)
- **session existante** : votre profil Chrome existant via connexion automatique Chrome DevTools MCP
- **gérés par openclaw** : une instance dédiée de navigateur basé sur Chromium avec son propre répertoire de données utilisateur + port CDP
- **distants** : une URL CDP explicite (navigateur basé sur Chromium exécuté ailleurs)
- **session existante** : votre profil Chrome existant via lauto-connexion Chrome DevTools MCP
Valeurs par défaut :
Valeurs par défaut :
- Le profil `openclaw` est créé automatiquement sil manque.
- Le profil `user` est intégré pour lattachement existing-session via Chrome MCP.
- Les profils existing-session sont opt-in au-delà de `user` ; créez-les avec `--driver existing-session`.
- Les ports CDP locaux sont alloués dans la plage **1880018899** par défaut.
- Supprimer un profil déplace son répertoire de données local vers la Corbeille.
- Le profil `openclaw` est créé automatiquement sil est absent.
- Le profil `user` est intégré pour la connexion existing-session Chrome MCP.
- Les profils existing-session sont facultatifs au-delà de `user` ; créez-les avec `--driver existing-session`.
- Les ports CDP locaux sont attribués à partir de **1880018899** par défaut.
- La suppression dun profil déplace son répertoire de données local vers la corbeille.
Tous les points de terminaison de contrôle acceptent `?profile=<name>` ; le CLI utilise `--browser-profile`.
Tous les points de terminaison de contrôle acceptent `?profile=<name>` ; la CLI utilise `--browser-profile`.
## Existing-session via Chrome DevTools MCP
OpenClaw peut aussi sattacher à un profil de navigateur basé sur Chromium en cours dexécution via le
serveur officiel Chrome DevTools MCP. Cela réutilise les onglets et létat de connexion
déjà ouverts dans ce profil de navigateur.
OpenClaw peut également se connecter à un profil de navigateur basé sur Chromium en cours dexécution via le serveur officiel Chrome DevTools MCP. Cela réutilise les onglets et létat de connexion déjà ouverts dans ce profil de navigateur.
Références officielles sur le contexte et la configuration :
Références officielles de contexte et de configuration :
- [Chrome for Developers: Use Chrome DevTools MCP with your browser session](https://developer.chrome.com/blog/chrome-devtools-mcp-debug-your-browser-session)
- [Chrome DevTools MCP README](https://github.com/ChromeDevTools/chrome-devtools-mcp)
- [README Chrome DevTools MCP](https://github.com/ChromeDevTools/chrome-devtools-mcp)
Profil intégré :
Profil intégré :
- `user`
Facultatif : créez votre propre profil existing-session personnalisé si vous voulez un
nom, une couleur ou un répertoire de données de navigateur différent.
Facultatif : créez votre propre profil existing-session personnalisé si vous voulez un
nom, une couleur ou un répertoire de données de navigateur différents.
Comportement par défaut :
Comportement par défaut :
- Le profil intégré `user` utilise la connexion automatique Chrome MCP, qui cible le
- Le profil intégré `user` utilise lauto-connexion Chrome MCP, qui cible le
profil Google Chrome local par défaut.
Utilisez `userDataDir` pour Brave, Edge, Chromium, ou un profil Chrome non par défaut :
Utilisez `userDataDir` pour Brave, Edge, Chromium ou un profil Chrome non par défaut :
```json5
{
@ -426,19 +412,19 @@ Utilisez `userDataDir` pour Brave, Edge, Chromium, ou un profil Chrome non par d
}
```
Puis, dans le navigateur correspondant :
Ensuite, dans le navigateur correspondant :
1. Ouvrez la page dinspection de ce navigateur pour le débogage à distance.
2. Activez le débogage à distance.
3. Gardez le navigateur en cours dexécution et approuvez linvite de connexion lorsquOpenClaw sy attache.
3. Gardez le navigateur en cours dexécution et approuvez linvite de connexion lorsque OpenClaw se connecte.
Pages dinspection courantes :
Pages dinspection courantes :
- Chrome : `chrome://inspect/#remote-debugging`
- Brave : `brave://inspect/#remote-debugging`
- Edge : `edge://inspect/#remote-debugging`
- Chrome : `chrome://inspect/#remote-debugging`
- Brave : `brave://inspect/#remote-debugging`
- Edge : `edge://inspect/#remote-debugging`
Test smoke dattachement en direct :
Test rapide de connexion en direct :
```bash
openclaw browser --browser-profile user start
@ -447,62 +433,61 @@ openclaw browser --browser-profile user tabs
openclaw browser --browser-profile user snapshot --format ai
```
À quoi ressemble le succès :
À quoi ressemble une réussite :
- `status` affiche `driver: existing-session`
- `status` affiche `transport: chrome-mcp`
- `status` affiche `running: true`
- `tabs` liste les onglets de navigateur déjà ouverts
- `tabs` liste les onglets déjà ouverts dans votre navigateur
- `snapshot` renvoie des refs depuis longlet actif sélectionné
Ce quil faut vérifier si lattachement ne fonctionne pas :
Ce quil faut vérifier si la connexion ne fonctionne pas :
- le navigateur basé sur Chromium ciblé est en version `144+`
- le navigateur cible basé sur Chromium est en version `144+`
- le débogage à distance est activé dans la page dinspection de ce navigateur
- le navigateur a affiché linvite de consentement dattachement et vous lavez acceptée
- `openclaw doctor` migre lancienne configuration browser basée sur extension et vérifie que
Chrome est installé localement pour les profils de connexion automatique par défaut, mais il ne peut pas
- le navigateur a affiché linvite de consentement à la connexion et vous lavez acceptée
- `openclaw doctor` migre lancienne configuration de navigateur basée sur une extension et vérifie que
Chrome est installé localement pour les profils par défaut à auto-connexion, mais il ne peut pas
activer le débogage à distance côté navigateur à votre place
Utilisation par lagent :
Utilisation par lagent :
- Utilisez `profile="user"` lorsque vous avez besoin de létat du navigateur connecté de lutilisateur.
- Si vous utilisez un profil existing-session personnalisé, passez ce nom de profil explicite.
- Ne choisissez ce mode que lorsque lutilisateur est devant lordinateur pour approuver linvite
dattachement.
- le Gateway ou lhôte node peut lancer `npx chrome-devtools-mcp@latest --autoConnect`
- Choisissez ce mode uniquement lorsque lutilisateur est à lordinateur pour approuver linvite de connexion.
- le Gateway ou lhôte Node peut lancer `npx chrome-devtools-mcp@latest --autoConnect`
Remarques :
Remarques :
- Ce chemin est plus risqué que le profil isolé `openclaw` parce quil peut
agir à lintérieur de votre session de navigateur connectée.
- OpenClaw ne lance pas le navigateur pour ce driver ; il ne fait que sy attacher.
- Ce chemin présente plus de risques que le profil isolé `openclaw` car il peut
agir dans votre session de navigateur connectée.
- OpenClaw ne lance pas le navigateur pour ce pilote ; il se contente de sy connecter.
- OpenClaw utilise ici le flux officiel `--autoConnect` de Chrome DevTools MCP. Si
`userDataDir` est défini, il est transmis afin de cibler ce répertoire de données utilisateur.
- Existing-session peut sattacher sur lhôte sélectionné ou via un
node browser connecté. Si Chrome vit ailleurs et quaucun node browser nest connecté, utilisez
plutôt un CDP distant ou un hôte node.
`userDataDir` est défini, il est transmis pour cibler ce répertoire de données utilisateur.
- Existing-session peut se connecter sur lhôte sélectionné ou via un
Node navigateur connecté. Si Chrome se trouve ailleurs et quaucun Node navigateur nest connecté, utilisez
plutôt un CDP distant ou un hôte Node.
<Accordion title="Limites fonctionnelles dexisting-session">
<Accordion title="Limites de la fonctionnalité existing-session">
Comparés au profil géré `openclaw`, les drivers existing-session sont plus contraints :
Comparés au profil géré `openclaw`, les pilotes existing-session sont plus contraints :
- **Captures décran** — les captures de page et les captures délément `--ref` fonctionnent ; les sélecteurs CSS `--element` ne fonctionnent pas. `--full-page` ne peut pas être combiné avec `--ref` ou `--element`. Playwright nest pas requis pour les captures de page ou délément basées sur des refs.
- **Actions**`click`, `type`, `hover`, `scrollIntoView`, `drag`, et `select` nécessitent des refs dinstantané (pas de sélecteurs CSS). `click` est limité au bouton gauche. `type` ne prend pas en charge `slowly=true` ; utilisez `fill` ou `press`. `press` ne prend pas en charge `delayMs`. `hover`, `scrollIntoView`, `drag`, `select`, `fill`, et `evaluate` ne prennent pas en charge de délais dattente par appel. `select` accepte une seule valeur.
- **Wait / upload / dialog** — `wait --url` prend en charge les motifs exacts, par sous-chaîne, et glob ; `wait --load networkidle` nest pas pris en charge. Les hooks dupload nécessitent `ref` ou `inputRef`, un fichier à la fois, sans CSS `element`. Les hooks de dialogue ne prennent pas en charge de surcharges de délai dattente.
- **Fonctionnalités réservées au mode géré** — actions par lot, export PDF, interception des téléchargements, et `responsebody` nécessitent toujours le chemin de navigateur géré.
- **Captures décran** — les captures de page et les captures délément `--ref` fonctionnent ; les sélecteurs CSS `--element` ne fonctionnent pas. `--full-page` ne peut pas être combiné avec `--ref` ou `--element`. Playwright nest pas nécessaire pour les captures décran de page ou délément basées sur une ref.
- **Actions**`click`, `type`, `hover`, `scrollIntoView`, `drag` et `select` nécessitent des refs dinstantané (pas de sélecteurs CSS). `click` ne prend en charge que le bouton gauche. `type` ne prend pas en charge `slowly=true` ; utilisez `fill` ou `press`. `press` ne prend pas en charge `delayMs`. `type`, `hover`, `scrollIntoView`, `drag`, `select`, `fill` et `evaluate` ne prennent pas en charge les délais dattente par appel. `select` accepte une seule valeur.
- **Attente / téléversement / boîte de dialogue** — `wait --url` prend en charge les motifs exacts, par sous-chaîne et glob ; `wait --load networkidle` nest pas pris en charge. Les hooks de téléversement nécessitent `ref` ou `inputRef`, un fichier à la fois, sans `element` CSS. Les hooks de boîte de dialogue ne prennent pas en charge les surcharges de délai dattente.
- **Fonctionnalités réservées au mode géré**les actions par lot, lexport PDF, linterception des téléchargements et `responsebody` nécessitent toujours le chemin de navigateur géré.
</Accordion>
## Garanties disolation
- **Répertoire de données utilisateur dédié** : ne touche jamais à votre profil de navigateur personnel.
- **Ports dédiés** : évite `9222` pour prévenir les collisions avec les workflows de développement.
- **Contrôle déterministe des onglets** : cible les onglets par `targetId`, pas par « dernier onglet ».
- **Répertoire de données utilisateur dédié** : ne touche jamais à votre profil de navigateur personnel.
- **Ports dédiés** : évite `9222` pour prévenir les collisions avec les flux de développement.
- **Contrôle déterministe des onglets** : cible les onglets par `targetId`, pas par « dernier onglet ».
## Sélection du navigateur
Lors dun lancement local, OpenClaw choisit le premier disponible :
Lors dun lancement local, OpenClaw choisit le premier disponible :
1. Chrome
2. Brave
@ -512,43 +497,43 @@ Lors dun lancement local, OpenClaw choisit le premier disponible :
Vous pouvez remplacer cela avec `browser.executablePath`.
Plateformes :
Plateformes :
- macOS : vérifie `/Applications` et `~/Applications`.
- Linux : recherche `google-chrome`, `brave`, `microsoft-edge`, `chromium`, etc.
- Windows : vérifie les emplacements dinstallation courants.
- macOS : vérifie `/Applications` et `~/Applications`.
- Linux : recherche `google-chrome`, `brave`, `microsoft-edge`, `chromium`, etc.
- Windows : vérifie les emplacements dinstallation courants.
## API de contrôle (facultative)
## API de contrôle (facultatif)
Pour le scripting et le débogage, le Gateway expose une petite **API HTTP de contrôle loopback-only**
ainsi quun CLI `openclaw browser` correspondant (instantanés, refs, wait
power-ups, sortie JSON, workflows de débogage). Voir
Pour les scripts et le débogage, le Gateway expose une petite **API HTTP de contrôle
limitée au loopback** ainsi quune CLI `openclaw browser` correspondante (instantanés, refs, améliorations de `wait`,
sortie JSON, flux de débogage). Consultez
[API de contrôle du navigateur](/fr/tools/browser-control) pour la référence complète.
## Dépannage
Pour les problèmes spécifiques à Linux (notamment snap Chromium), voir
Pour les problèmes spécifiques à Linux (en particulier snap Chromium), consultez
[Dépannage du navigateur](/fr/tools/browser-linux-troubleshooting).
Pour les configurations partagées WSL2 Gateway + Windows Chrome sur hôtes séparés, voir
Pour les configurations à hôte scindé WSL2 Gateway + Chrome Windows, consultez
[Dépannage WSL2 + Windows + CDP Chrome distant](/fr/tools/browser-wsl2-windows-remote-cdp-troubleshooting).
### Échec de démarrage CDP vs blocage SSRF de navigation
Ce sont deux classes déchec différentes et elles pointent vers des chemins de code différents.
- **Échec de démarrage ou de disponibilité CDP** signifie quOpenClaw ne peut pas confirmer que le plan de contrôle du navigateur est sain.
- **Blocage SSRF de navigation** signifie que le plan de contrôle du navigateur est sain, mais quune cible de navigation de page est rejetée par la politique.
- **Un échec de démarrage ou de disponibilité CDP** signifie quOpenClaw ne peut pas confirmer que le plan de contrôle du navigateur est sain.
- **Un blocage SSRF de navigation** signifie que le plan de contrôle du navigateur est sain, mais quune cible de navigation de page est rejetée par la politique.
Exemples courants :
Exemples courants :
- Échec de démarrage ou de disponibilité CDP :
- Échec de démarrage ou de disponibilité CDP :
- `Chrome CDP websocket for profile "openclaw" is not reachable after start`
- `Remote CDP for profile "<name>" is not reachable at <cdpUrl>`
- Blocage SSRF de navigation :
- les flux `open`, `navigate`, snapshot, ou douverture donglet échouent avec une erreur de politique browser/réseau alors que `start` et `tabs` fonctionnent encore
- Blocage SSRF de navigation :
- les flux `open`, `navigate`, dinstantané ou douverture donglet échouent avec une erreur de politique navigateur/réseau alors que `start` et `tabs` fonctionnent toujours
Utilisez cette séquence minimale pour séparer les deux :
Utilisez cette séquence minimale pour distinguer les deux :
```bash
openclaw browser --browser-profile openclaw start
@ -556,47 +541,47 @@ openclaw browser --browser-profile openclaw tabs
openclaw browser --browser-profile openclaw open https://example.com
```
Comment lire les résultats :
Comment interpréter les résultats :
- Si `start` échoue avec `not reachable after start`, commencez par dépanner la disponibilité CDP.
- Si `start` réussit mais que `tabs` échoue, le plan de contrôle est toujours malsain. Traitez cela comme un problème daccessibilité CDP, et non comme un problème de navigation de page.
- Si `start` et `tabs` réussissent mais que `open` ou `navigate` échoue, le plan de contrôle du navigateur est opérationnel et léchec se situe dans la politique de navigation ou dans la page cible.
- Si `start`, `tabs`, et `open` réussissent tous, le chemin de contrôle de base du navigateur géré est sain.
- Si `start` réussit mais que `tabs` échoue, le plan de contrôle est toujours défaillant. Considérez cela comme un problème daccessibilité CDP, pas comme un problème de navigation de page.
- Si `start` et `tabs` réussissent mais que `open` ou `navigate` échouent, le plan de contrôle du navigateur fonctionne et léchec se situe dans la politique de navigation ou la page cible.
- Si `start`, `tabs` et `open` réussissent tous, le chemin de contrôle de base du navigateur géré est sain.
Détails importants de comportement :
Détails de comportement importants :
- La configuration browser utilise par défaut un objet de politique SSRF en fermeture stricte même lorsque vous ne configurez pas `browser.ssrfPolicy`.
- Pour le profil géré local `openclaw` sur loopback, les vérifications de santé CDP ignorent volontairement lapplication de laccessibilité SSRF du navigateur pour le plan de contrôle local propre à OpenClaw.
- La protection de navigation est distincte. Un résultat réussi de `start` ou `tabs` ne signifie pas quune cible ultérieure de `open` ou `navigate` est autorisée.
- La configuration du navigateur utilise par défaut un objet de politique SSRF en échec fermé même lorsque vous ne configurez pas `browser.ssrfPolicy`.
- Pour le profil géré local `openclaw` sur loopback, les vérifications détat CDP ignorent intentionnellement lapplication de laccessibilité SSRF du navigateur pour le propre plan de contrôle local dOpenClaw.
- La protection de navigation est distincte. Un résultat réussi pour `start` ou `tabs` ne signifie pas quune cible ultérieure `open` ou `navigate` est autorisée.
Consignes de sécurité :
Consignes de sécurité :
- Ne relâchez **pas** la politique SSRF du navigateur par défaut.
- Nassouplissez **pas** la politique SSRF du navigateur par défaut.
- Préférez des exceptions dhôte étroites telles que `hostnameAllowlist` ou `allowedHostnames` plutôt quun accès large au réseau privé.
- Utilisez `dangerouslyAllowPrivateNetwork: true` uniquement dans des environnements intentionnellement approuvés où laccès browser au réseau privé est requis et revu.
- Utilisez `dangerouslyAllowPrivateNetwork: true` uniquement dans des environnements explicitement approuvés où laccès du navigateur au réseau privé est requis et a été examiné.
## Outils dagent + fonctionnement du contrôle
Lagent reçoit **un outil** pour lautomatisation du navigateur :
Lagent reçoit **un seul outil** pour lautomatisation du navigateur :
- `browser` — status/start/stop/tabs/open/focus/close/snapshot/screenshot/navigate/act
Correspondance :
Correspondance :
- `browser snapshot` renvoie un arbre dinterface stable (AI ou ARIA).
- `browser act` utilise les identifiants `ref` de linstantané pour cliquer/saisir/glisser/sélectionner.
- `browser screenshot` capture des pixels (page entière ou élément).
- `browser` accepte :
- `profile` pour choisir un profil de navigateur nommé (openclaw, chrome, ou CDP distant).
- `target` (`sandbox` | `host` | `node`) pour sélectionner où vit le navigateur.
- `browser act` utilise les identifiants `ref` de linstantané pour cliquer/saisir/faire glisser/sélectionner.
- `browser screenshot` capture les pixels (page complète ou élément).
- `browser` accepte :
- `profile` pour choisir un profil de navigateur nommé (openclaw, chrome ou CDP distant).
- `target` (`sandbox` | `host` | `node`) pour sélectionner lemplacement du navigateur.
- Dans les sessions sandboxées, `target: "host"` nécessite `agents.defaults.sandbox.browser.allowHostControl=true`.
- Si `target` est omis : les sessions sandboxées utilisent `sandbox` par défaut, les sessions non sandboxées utilisent `host` par défaut.
- Si un node compatible browser est connecté, loutil peut automatiquement sy router sauf si vous épinglez `target="host"` ou `target="node"`.
- Si `target` est omis : les sessions sandboxées utilisent par défaut `sandbox`, les sessions non sandboxées utilisent par défaut `host`.
- Si un Node compatible navigateur est connecté, loutil peut automatiquement lui acheminer les appels sauf si vous fixez `target="host"` ou `target="node"`.
Cela permet à lagent de rester déterministe et déviter les sélecteurs fragiles.
Cela permet de garder lagent déterministe et déviter les sélecteurs fragiles.
## Liens associés
## Liés
- [Vue densemble des outils](/fr/tools) — tous les outils dagent disponibles
- [Sandboxing](/fr/gateway/sandboxing) — contrôle du navigateur dans les environnements sandboxés
- [Sécurité](/fr/gateway/security) — risques du contrôle du navigateur et durcissement
- [Sandboxing](/fr/gateway/sandboxing) — contrôle du navigateur dans des environnements sandboxés
- [Sécurité](/fr/gateway/security) — risques et renforcement du contrôle du navigateur

View File

@ -1,80 +1,102 @@
---
read_when:
- Ajouter une nouvelle capacité cœur et une surface denregistrement de plugin
- Décider si le code appartient au cœur, à un plugin fournisseur, ou à un plugin de fonctionnalité
- Câbler un nouveau helper runtime pour les canaux ou les outils
- Ajout dune nouvelle capacité centrale et dune surface denregistrement de Plugin
- Décider si le code doit appartenir au cœur, à un Plugin fournisseur ou à un Plugin de fonctionnalité
- Câbler un nouvel assistant dexécution pour les canaux ou les outils
sidebarTitle: Adding Capabilities
summary: Guide du contributeur pour ajouter une nouvelle capacité partagée au système de plugins OpenClaw
title: Ajouter des capacités (guide du contributeur)
title: Ajout de capacités (guide du contributeur)
x-i18n:
generated_at: "2026-04-24T07:35:13Z"
generated_at: "2026-04-24T08:58:27Z"
model: gpt-5.4
provider: openai
source_hash: f1e3251b9150c9744d967e91f531dfce01435b13aea3a17088ccd54f2145d14f
source_hash: 864506dd3f61aa64e7c997c9d9e05ce0ad70c80a26a734d4f83b2e80331be4ab
source_path: tools/capability-cookbook.md
workflow: 15
---
<Info>
Ceci est un **guide du contributeur** pour les développeurs du cœur OpenClaw. Si vous
construisez un plugin externe, voir plutôt [Créer des plugins](/fr/plugins/building-plugins).
Ceci est un **guide du contributeur** pour les développeurs du cœur dOpenClaw. Si vous
créez un plugin externe, consultez plutôt [Créer des plugins](/fr/plugins/building-plugins).
</Info>
Utilisez ceci lorsquOpenClaw a besoin dun nouveau domaine comme la génération dimage, la génération vidéo, ou toute future zone de fonctionnalité adossée à un fournisseur.
Utilisez ceci lorsquOpenClaw a besoin dun nouveau domaine tel que la génération dimages, la génération
de vidéos ou une future zone de fonctionnalité prise en charge par un fournisseur.
La règle :
- plugin = frontière de responsabilité
- capacité = contrat cœur partagé
- plugin = limite de responsabilité
- capacité = contrat central partagé
Cela signifie que vous ne devez pas commencer par câbler un fournisseur directement dans un canal ou un
Cela signifie que vous ne devez pas commencer par connecter directement un fournisseur à un canal ou à un
outil. Commencez par définir la capacité.
## Quand créer une capacité
Créez une nouvelle capacité lorsque toutes les conditions suivantes sont vraies :
1. plus dun fournisseur pourrait raisonnablement limplémenter
2. les canaux, outils ou plugins de fonctionnalité devraient la consommer sans se soucier du fournisseur
3. le cœur doit posséder le comportement de repli, la politique, la configuration ou la livraison
1. plus dun fournisseur pourrait vraisemblablement limplémenter
2. les canaux, outils ou plugins de fonctionnalité devraient la consommer sans se soucier du
fournisseur
3. le cœur doit gérer le repli, la politique, la configuration ou le comportement de livraison
Si le travail est uniquement propre à un fournisseur et quaucun contrat partagé nexiste encore, arrêtez-vous et définissez dabord le contrat.
Si le travail est propre au fournisseur et quaucun contrat partagé nexiste encore, arrêtez-vous et définissez
dabord le contrat.
## Séquence standard
## La séquence standard
1. Définir le contrat cœur typé.
2. Ajouter lenregistrement de plugin pour ce contrat.
3. Ajouter un helper runtime partagé.
4. Câbler un vrai plugin fournisseur comme preuve.
5. Faire passer les consommateurs de fonctionnalité/canal par le helper runtime.
6. Ajouter des tests de contrat.
7. Documenter la configuration orientée opérateur et le modèle de responsabilité.
1. Définissez le contrat central typé.
2. Ajoutez lenregistrement du plugin pour ce contrat.
3. Ajoutez un assistant dexécution partagé.
4. Connectez un vrai plugin fournisseur comme preuve.
5. Faites passer les consommateurs fonctionnalité/canal sur lassistant dexécution.
6. Ajoutez des tests de contrat.
7. Documentez la configuration orientée opérateur et le modèle de responsabilité.
## Ce qui va où
Cœur :
- types requête/réponse
- registre de fournisseurs + résolution
- types de requête/réponse
- registre des fournisseurs + résolution
- comportement de repli
- schéma de configuration plus métadonnées de documentation `title` / `description` propagées sur les nœuds dobjet imbriqué, joker, élément de tableau et composition
- surface de helper runtime
- schéma de configuration plus métadonnées de documentation `title` / `description` propagées sur les nœuds dobjet imbriqué, de joker, délément de tableau et de composition
- surface dassistant dexécution
Plugin fournisseur :
- appels API du fournisseur
- appels dAPI fournisseur
- gestion de lauthentification du fournisseur
- normalisation de requête spécifique au fournisseur
- normalisation des requêtes spécifique au fournisseur
- enregistrement de limplémentation de la capacité
Plugin de fonctionnalité/canal :
- appelle `api.runtime.*` ou le helper `plugin-sdk/*-runtime` correspondant
- appelle `api.runtime.*` ou lassistant `plugin-sdk/*-runtime` correspondant
- nappelle jamais directement une implémentation fournisseur
## Checklist de fichiers
## Points dextension Provider et Harness
Pour une nouvelle capacité, attendez-vous à modifier ces zones :
Utilisez les hooks de provider lorsque le comportement appartient au contrat du fournisseur de modèle
plutôt quà la boucle dagent générique. Les exemples incluent les paramètres de requête spécifiques au fournisseur
après la sélection du transport, la préférence de profil dauthentification, les surcouches de prompt et
le routage de repli de suivi après le basculement de modèle/profil.
Utilisez les hooks de harness dagent lorsque le comportement appartient à lenvironnement dexécution
qui exécute un tour. Les harnesses peuvent classifier des résultats de tentative réussis mais inutilisables
comme des réponses vides, limitées au raisonnement ou limitées à la planification, afin que la politique
de repli de modèle externe puisse prendre la décision de nouvelle tentative.
Gardez les deux points dextension étroits :
- le cœur gère la politique de nouvelle tentative/repli
- les plugins provider gèrent les indices spécifiques au fournisseur pour les requêtes/lauthentification/le routage
- les plugins harness gèrent la classification spécifique à lexécution des tentatives
- les plugins tiers renvoient des indices, et non des mutations directes de létat central
## Liste de fichiers
Pour une nouvelle capacité, attendez-vous à modifier les zones suivantes :
- `src/<capability>/types.ts`
- `src/<capability>/...registry/runtime.ts`
@ -86,41 +108,41 @@ Pour une nouvelle capacité, attendez-vous à modifier ces zones :
- `src/plugins/runtime/index.ts`
- `src/plugin-sdk/<capability>.ts`
- `src/plugin-sdk/<capability>-runtime.ts`
- un ou plusieurs packages de plugins inclus
- config/docs/tests
- un ou plusieurs packages de plugins groupés
- configuration/docs/tests
## Exemple : génération dimage
## Exemple : génération dimages
La génération dimage suit la forme standard :
La génération dimages suit la forme standard :
1. le cœur définit `ImageGenerationProvider`
2. le cœur expose `registerImageGenerationProvider(...)`
3. le cœur expose `runtime.imageGeneration.generate(...)`
4. les plugins `openai`, `google`, `fal`, et `minimax` enregistrent des implémentations adossées à des fournisseurs
4. les plugins `openai`, `google`, `fal` et `minimax` enregistrent des implémentations prises en charge par des fournisseurs
5. les futurs fournisseurs peuvent enregistrer le même contrat sans modifier les canaux/outils
La clé de configuration est distincte du routage danalyse de vision :
La clé de configuration est distincte du routage danalyse visuelle :
- `agents.defaults.imageModel` = analyser les images
- `agents.defaults.imageGenerationModel` = générer des images
Gardez-les séparés afin que le repli et la politique restent explicites.
Gardez-les séparées afin que le repli et la politique restent explicites.
## Checklist de revue
## Liste de vérification pour la revue
Avant de livrer une nouvelle capacité, vérifiez :
- aucun canal/outil nimporte directement du code fournisseur
- le helper runtime est le chemin partagé
- au moins un test de contrat affirme la responsabilité des éléments inclus
- lassistant dexécution est le chemin partagé
- au moins un test de contrat affirme la responsabilité des éléments groupés
- la documentation de configuration nomme la nouvelle clé de modèle/configuration
- la documentation des plugins explique la frontière de responsabilité
- la documentation des plugins explique la limite de responsabilité
Si une PR saute la couche de capacité et code en dur le comportement fournisseur dans un
canal/outil, renvoyez-la et définissez dabord le contrat.
## Articles connexes
## Liens connexes
- [Plugin](/fr/tools/plugin)
- [Créer des Skills](/fr/tools/creating-skills)
- [Créer des skills](/fr/tools/creating-skills)
- [Outils et plugins](/fr/tools)

View File

@ -2,23 +2,23 @@
read_when:
- Installation ou configuration de plugins
- Comprendre les règles de découverte et de chargement des plugins
- Travailler avec des bundles de plugins compatibles Codex/Claude
- Utiliser des bundles de plugins compatibles avec Codex/Claude
sidebarTitle: Install and Configure
summary: Installer, configurer et gérer les plugins OpenClaw
title: Plugins
x-i18n:
generated_at: "2026-04-24T07:38:30Z"
generated_at: "2026-04-24T08:58:31Z"
model: gpt-5.4
provider: openai
source_hash: a93114ddb312552f4c321b6e318f3e19810cf5059dd0c68fde93da41936566b8
source_hash: 83ab1218d6677ad518a4991ca546d55eed9648e1fa92b76b7433ecd5df569e28
source_path: tools/plugin.md
workflow: 15
---
Les plugins étendent OpenClaw avec de nouvelles capacités : canaux, fournisseurs de modèles,
outils, Skills, parole, transcription en temps réel, voix en temps réel,
compréhension des médias, génération dimages, génération vidéo, récupération web, recherche
web, et plus encore. Certains plugins sont **cœur** (livrés avec OpenClaw), dautres
harnesses dagent, outils, Skills, parole, transcription en temps réel, voix en temps réel,
compréhension des médias, génération dimages, génération vidéo, récupération web, recherche web,
et plus encore. Certains plugins sont **core** (livrés avec OpenClaw), dautres
sont **externes** (publiés sur npm par la communauté).
## Démarrage rapide
@ -47,12 +47,12 @@ sont **externes** (publiés sur npm par la communauté).
openclaw gateway restart
```
Puis configurez sous `plugins.entries.\<id\>.config` dans votre fichier de configuration.
Configurez ensuite sous `plugins.entries.\<id\>.config` dans votre fichier de configuration.
</Step>
</Steps>
Si vous préférez un contrôle natif au chat, activez `commands.plugins: true` et utilisez :
Si vous préférez un contrôle natif dans le chat, activez `commands.plugins: true` et utilisez :
```text
/plugin install clawhub:@openclaw/voice-call
@ -60,34 +60,33 @@ Si vous préférez un contrôle natif au chat, activez `commands.plugins: true`
/plugin enable voice-call
```
Le chemin dinstallation utilise le même résolveur que la CLI : chemin/archive local, préfixe explicite
`clawhub:<pkg>`, ou spécification de package simple (ClawHub dabord, puis repli npm).
Le chemin dinstallation utilise le même résolveur que la CLI : chemin/archive local(e), `clawhub:<pkg>` explicite, ou spécification de package simple (ClawHub dabord, puis repli sur npm).
Si la configuration est invalide, linstallation échoue normalement en mode fail-closed et vous oriente vers
Si la configuration est invalide, linstallation échoue normalement de manière stricte et vous oriente vers
`openclaw doctor --fix`. La seule exception de récupération est un chemin étroit de
réinstallation de plugin inclus pour les plugins qui participent à
réinstallation de plugin inclus pour les plugins qui optent pour
`openclaw.install.allowInvalidConfigRecovery`.
Les installations packagées dOpenClaw ninstallent pas de façon anticipée tout larbre de dépendances runtime
de chaque plugin inclus. Lorsquun plugin OpenClaw inclus est actif depuis
la configuration de plugin, une configuration de canal héritée, ou un manifeste activé par défaut, le
démarrage ne répare que les dépendances runtime déclarées de ce plugin avant de limporter.
Les plugins externes et chemins de chargement personnalisés doivent toujours être installés via
Les installations packagées dOpenClaw ninstallent pas demblée tout larbre de dépendances dexécution
de chaque plugin inclus. Lorsquun plugin inclus appartenant à OpenClaw est actif à partir de la
configuration du plugin, dune configuration de canal héritée ou dun manifeste activé par défaut, le
démarrage ne répare que les dépendances dexécution déclarées de ce plugin avant de limporter.
Les plugins externes et les chemins de chargement personnalisés doivent toujours être installés via
`openclaw plugins install`.
## Types de plugins
OpenClaw reconnaît deux formats de plugin :
OpenClaw reconnaît deux formats de plugins :
| Format | Fonctionnement | Exemples |
| ---------- | -------------------------------------------------------------------- | ------------------------------------------------------ |
| **Natif** | `openclaw.plugin.json` + module runtime ; sexécute dans le processus | Plugins officiels, packages npm communautaires |
| **Bundle** | Disposition compatible Codex/Claude/Cursor ; mappée vers les fonctionnalités OpenClaw | `.codex-plugin/`, `.claude-plugin/`, `.cursor-plugin/` |
| Format | Fonctionnement | Exemples |
| ---------- | ----------------------------------------------------------------- | ------------------------------------------------------ |
| **Natif** | `openclaw.plugin.json` + module dexécution ; sexécute en processus | Plugins officiels, packages npm communautaires |
| **Bundle** | Disposition compatible Codex/Claude/Cursor ; mappée aux fonctionnalités OpenClaw | `.codex-plugin/`, `.claude-plugin/`, `.cursor-plugin/` |
Les deux apparaissent dans `openclaw plugins list`. Voir [Plugin Bundles](/fr/plugins/bundles) pour les détails sur les bundles.
Les deux apparaissent dans `openclaw plugins list`. Voir [Plugin Bundles](/fr/plugins/bundles) pour les détails des bundles.
Si vous écrivez un plugin natif, commencez par [Créer des plugins](/fr/plugins/building-plugins)
et [Aperçu du SDK de Plugin](/fr/plugins/sdk-overview).
Si vous écrivez un plugin natif, commencez par [Building Plugins](/fr/plugins/building-plugins)
et [Plugin SDK Overview](/fr/plugins/sdk-overview).
## Plugins officiels
@ -102,7 +101,7 @@ et [Aperçu du SDK de Plugin](/fr/plugins/sdk-overview).
| Zalo | `@openclaw/zalo` | [Zalo](/fr/channels/zalo) |
| Zalo Personal | `@openclaw/zalouser` | [Zalo Personal](/fr/plugins/zalouser) |
### Cœur (livrés avec OpenClaw)
### Core (livrés avec OpenClaw)
<AccordionGroup>
<Accordion title="Fournisseurs de modèles (activés par défaut)">
@ -113,22 +112,22 @@ et [Aperçu du SDK de Plugin](/fr/plugins/sdk-overview).
`vercel-ai-gateway`, `volcengine`, `xiaomi`, `zai`
</Accordion>
<Accordion title="Plugins Memory">
- `memory-core` — recherche Memory incluse (par défaut via `plugins.slots.memory`)
- `memory-lancedb`Memory long terme installée à la demande avec rappel/capture automatiques (définissez `plugins.slots.memory = "memory-lancedb"`)
<Accordion title="Plugins de mémoire">
- `memory-core` — recherche mémoire incluse (par défaut via `plugins.slots.memory`)
- `memory-lancedb`mémoire à long terme installée à la demande avec rappel/capture automatiques (définissez `plugins.slots.memory = "memory-lancedb"`)
</Accordion>
<Accordion title="Fournisseurs de parole (activés par défaut)">
<Accordion title="Fournisseurs vocaux (activés par défaut)">
`elevenlabs`, `microsoft`
</Accordion>
<Accordion title="Autres">
- `browser` — plugin navigateur inclus pour loutil navigateur, la CLI `openclaw browser`, la méthode gateway `browser.request`, le runtime navigateur, et le service de contrôle navigateur par défaut (activé par défaut ; désactivez-le avant de le remplacer)
- `copilot-proxy` — pont VS Code Copilot Proxy (désactivé par défaut)
- `browser` — plugin navigateur inclus pour loutil navigateur, la CLI `openclaw browser`, la méthode gateway `browser.request`, le runtime navigateur et le service de contrôle navigateur par défaut (activé par défaut ; désactivez-le avant de le remplacer)
- `copilot-proxy` — pont proxy VS Code Copilot (désactivé par défaut)
</Accordion>
</AccordionGroup>
Vous cherchez des plugins tiers ? Voir [Plugins communautaires](/fr/plugins/community).
Vous cherchez des plugins tiers ? Voir [Community Plugins](/fr/plugins/community).
## Configuration
@ -146,17 +145,17 @@ Vous cherchez des plugins tiers ? Voir [Plugins communautaires](/fr/plugins/com
}
```
| Field | Description |
| Champ | Description |
| ---------------- | --------------------------------------------------------- |
| `enabled` | Interrupteur principal (par défaut : `true`) |
| `allow` | Liste dautorisation des plugins (facultatif) |
| `deny` | Liste dinterdiction des plugins (facultatif ; deny lemporte) |
| `load.paths` | Fichiers/répertoires de plugins supplémentaires |
| `slots` | Sélecteurs de slots exclusifs (par ex. `memory`, `contextEngine`) |
| `entries.\<id\>` | Activations + configuration par plugin |
| `enabled` | Interrupteur maître (par défaut : `true`) |
| `allow` | Liste dautorisation des plugins (facultatif) |
| `deny` | Liste de refus des plugins (facultatif ; le refus prime) |
| `load.paths` | Fichiers/répertoires de plugins supplémentaires |
| `slots` | Sélecteurs de slot exclusifs (par ex. `memory`, `contextEngine`) |
| `entries.\<id\>` | Activations + configuration par plugin |
Les changements de configuration **nécessitent un redémarrage du gateway**. Si le Gateway sexécute avec surveillance de configuration
+ redémarrage dans le processus activés (le chemin par défaut `openclaw gateway`), ce
Les changements de configuration **nécessitent un redémarrage du gateway**. Si le Gateway sexécute avec
surveillance de configuration + redémarrage en processus activé (le chemin `openclaw gateway` par défaut), ce
redémarrage est généralement effectué automatiquement peu après lécriture de la configuration.
<Accordion title="États des plugins : désactivé vs manquant vs invalide">
@ -167,14 +166,14 @@ redémarrage est généralement effectué automatiquement peu après lécritu
## Découverte et priorité
OpenClaw recherche les plugins dans cet ordre (première correspondance gagnante) :
OpenClaw recherche les plugins dans cet ordre (la première correspondance lemporte) :
<Steps>
<Step title="Chemins de configuration">
`plugins.load.paths` — chemins explicites de fichiers ou répertoires.
`plugins.load.paths` — chemins explicites de fichier ou de répertoire.
</Step>
<Step title="Plugins despace de travail">
<Step title="Plugins du workspace">
`\<workspace\>/.openclaw/<plugin-root>/*.ts` et `\<workspace\>/.openclaw/<plugin-root>/*/index.ts`.
</Step>
@ -191,16 +190,18 @@ OpenClaw recherche les plugins dans cet ordre (première correspondance gagnante
### Règles dactivation
- `plugins.enabled: false` désactive tous les plugins
- `plugins.deny` lemporte toujours sur allow
- `plugins.deny` prime toujours sur allow
- `plugins.entries.\<id\>.enabled: false` désactive ce plugin
- Les plugins provenant de lespace de travail sont **désactivés par défaut** (ils doivent être explicitement activés)
- Les plugins inclus suivent lensemble intégré activé par défaut sauf remplacement
- Les plugins dorigine workspace sont **désactivés par défaut** (ils doivent être explicitement activés)
- Les plugins inclus suivent lensemble intégré activé par défaut, sauf remplacement
- Les slots exclusifs peuvent forcer lactivation du plugin sélectionné pour ce slot
- Certains plugins inclus opt-in sont activés automatiquement lorsque la configuration nomme une
surface appartenant au plugin, comme une référence de modèle de fournisseur, une configuration de canal, ou un runtime de harnais
- Les routes Codex de la famille OpenAI conservent des frontières de plugin séparées :
`openai-codex/*` appartient au plugin OpenAI, tandis que le plugin inclus du
serveur dapplication Codex est sélectionné par `embeddedHarness.runtime: "codex"` ou par les références de modèles héritées `codex/*`
- Certains plugins inclus sur opt-in sont activés automatiquement lorsque la configuration nomme une
surface appartenant au plugin, comme une référence de modèle de fournisseur, une configuration de canal ou un
runtime de harness
- Les routes Codex de la famille OpenAI conservent des limites de plugin distinctes :
`openai-codex/*` appartient au plugin OpenAI, tandis que le plugin intégré de
serveur dapplication Codex est sélectionné par `embeddedHarness.runtime: "codex"` ou les anciennes
références de modèle `codex/*`
## Slots de plugins (catégories exclusives)
@ -217,16 +218,16 @@ Certaines catégories sont exclusives (une seule active à la fois) :
}
```
| Slot | Ce quil contrôle | Par défaut |
| --------------- | ------------------------- | -------------------- |
| `memory` | Plugin Memory actif | `memory-core` |
| `contextEngine` | Moteur de contexte actif | `legacy` (intégré) |
| Slot | Ce quil contrôle | Par défaut |
| --------------- | ---------------------------- | ------------------- |
| `memory` | Plugin Active Memory | `memory-core` |
| `contextEngine` | Moteur de contexte actif | `legacy` (intégré) |
## Référence CLI
```bash
openclaw plugins list # inventaire compact
openclaw plugins list --enabled # seulement les plugins chargés
openclaw plugins list --enabled # plugins chargés uniquement
openclaw plugins list --verbose # lignes de détail par plugin
openclaw plugins list --json # inventaire lisible par machine
openclaw plugins inspect <id> # détail approfondi
@ -237,7 +238,7 @@ openclaw plugins doctor # diagnostics
openclaw plugins install <package> # installer (ClawHub dabord, puis npm)
openclaw plugins install clawhub:<pkg> # installer depuis ClawHub uniquement
openclaw plugins install <spec> --force # écraser linstallation existante
openclaw plugins install <spec> --force # écraser une installation existante
openclaw plugins install <path> # installer depuis un chemin local
openclaw plugins install -l <path> # lier (sans copie) pour le développement
openclaw plugins install <plugin> --marketplace <source>
@ -257,52 +258,57 @@ openclaw plugins disable <id>
```
Les plugins inclus sont livrés avec OpenClaw. Beaucoup sont activés par défaut (par exemple
les fournisseurs de modèles inclus, les fournisseurs de parole inclus, et le plugin navigateur inclus). Dautres plugins inclus nécessitent toujours `openclaw plugins enable <id>`.
les fournisseurs de modèles inclus, les fournisseurs vocaux inclus et le plugin navigateur
inclus). Les autres plugins inclus nécessitent toujours `openclaw plugins enable <id>`.
`--force` écrase en place un plugin installé existant ou un pack de hooks. Utilisez
`openclaw plugins update <id-or-npm-spec>` pour les mises à niveau de routine des plugins npm
suivis. Ce nest pas pris en charge avec `--link`, qui réutilise le chemin source au lieu
`--force` écrase sur place un plugin installé existant ou un pack de hooks existant. Utilisez
`openclaw plugins update <id-or-npm-spec>` pour les mises à niveau courantes des
plugins npm suivis. Il nest pas pris en charge avec `--link`, qui réutilise le chemin source au lieu
de copier vers une cible dinstallation gérée.
Lorsque `plugins.allow` est déjà défini, `openclaw plugins install` ajoute
lidentifiant du plugin installé à cette liste dautorisation avant de lactiver, de sorte que les installations soient
immédiatement chargeables après redémarrage.
Lorsque `plugins.allow` est déjà défini, `openclaw plugins install` ajoute lidentifiant du plugin
installé à cette liste dautorisation avant de lactiver, afin que les installations puissent être
chargées immédiatement après redémarrage.
`openclaw plugins update <id-or-npm-spec>` sapplique aux installations suivies. Passer
une spécification de package npm avec un dist-tag ou une version exacte résout le nom du package vers lenregistrement du plugin suivi et enregistre la nouvelle spécification pour les mises à jour futures.
Passer le nom du package sans version fait revenir une installation épinglée exacte vers
la branche de version par défaut du registre. Si le plugin npm installé correspond déjà à
`openclaw plugins update <id-or-npm-spec>` sapplique aux installations suivies. Le fait de transmettre
une spécification de package npm avec un dist-tag ou une version exacte résout le nom du package
vers lenregistrement de plugin suivi et enregistre la nouvelle spécification pour les futures mises à jour.
Transmettre le nom du package sans version fait revenir une installation exacte épinglée vers la
ligne de publication par défaut du registre. Si le plugin npm installé correspond déjà à
la version résolue et à lidentité dartefact enregistrée, OpenClaw ignore la mise à jour
sans téléchargement, réinstallation ni réécriture de configuration.
`--pin` est réservé à npm. Il nest pas pris en charge avec `--marketplace`, car
les installations via marketplace persistent des métadonnées de source marketplace au lieu dune spécification npm.
les installations marketplace conservent les métadonnées de source marketplace au lieu dune spécification npm.
`--dangerously-force-unsafe-install` est un remplacement durgence pour les faux
positifs du scanner intégré de code dangereux. Il permet aux installations et mises à jour de plugins de se poursuivre malgré des résultats `critical` intégrés, mais il ne contourne toujours pas les blocages de politique `before_install` du plugin ni les blocages dus aux échecs de scan.
positifs du scanner intégré de code dangereux. Il permet aux installations et mises à jour de plugins
de continuer malgré les résultats intégrés `critical`, mais il
ne contourne toujours pas les blocages de politique `before_install` du plugin ni le blocage en cas déchec danalyse.
Cet indicateur CLI sapplique uniquement aux flux dinstallation/mise à jour de plugins. Les installations de dépendances de Skills adossées au Gateway utilisent à la place le remplacement de requête correspondant `dangerouslyForceUnsafeInstall`, tandis que `openclaw skills install` reste le flux séparé de téléchargement/installation de skills ClawHub.
Ce drapeau CLI sapplique uniquement aux flux dinstallation/mise à jour de plugins. Les installations de dépendances
de Skills adossées au Gateway utilisent à la place la surcharge de requête correspondante `dangerouslyForceUnsafeInstall`, tandis que
`openclaw skills install` reste le flux distinct de téléchargement/installation de Skills ClawHub.
Les bundles compatibles participent au même flux list/inspect/enable/disable
des plugins. La prise en charge runtime actuelle inclut les Skills de bundle, les
command-skills Claude, les valeurs par défaut de `settings.json` Claude, les
valeurs par défaut Claude `.lsp.json` et `lspServers` déclarées dans le manifeste, les
command-skills Cursor, et les répertoires de hooks Codex compatibles.
Les bundles compatibles participent au même flux de liste/inspection/activation/désactivation
des plugins. La prise en charge actuelle à lexécution inclut les Skills de bundle, les command-skills Claude,
les valeurs par défaut Claude `settings.json`, les valeurs par défaut Claude `.lsp.json` et `lspServers`
déclarés dans le manifeste, les command-skills Cursor et les répertoires de hooks Codex compatibles.
`openclaw plugins inspect <id>` signale également les capacités de bundle détectées ainsi que
les entrées MCP et LSP prises en charge ou non prises en charge pour les plugins adossés à un bundle.
`openclaw plugins inspect <id>` signale aussi les capacités de bundle détectées ainsi que
les entrées de serveur MCP et LSP prises en charge ou non prises en charge pour les plugins adossés à un bundle.
Les sources marketplace peuvent être un nom de marketplace connu Claude provenant de
`~/.claude/plugins/known_marketplaces.json`, une racine marketplace locale ou un chemin
`marketplace.json`, un raccourci GitHub comme `owner/repo`, une URL de dépôt GitHub,
ou une URL git. Pour les marketplaces distants, les entrées de plugin doivent rester dans le dépôt marketplace cloné et utiliser uniquement des sources de chemin relatives.
`~/.claude/plugins/known_marketplaces.json`, une racine de marketplace locale ou un chemin
`marketplace.json`, une forme abrégée GitHub comme `owner/repo`, une URL de dépôt GitHub ou une URL git. Pour les marketplaces distantes, les entrées de plugin doivent rester dans le
dépôt de marketplace cloné et utiliser uniquement des sources de chemin relatif.
Voir la [référence CLI `openclaw plugins`](/fr/cli/plugins) pour tous les détails.
## Aperçu de lAPI des plugins
## Vue densemble de lAPI Plugin
Les plugins natifs exportent un objet dentrée qui expose `register(api)`. Les
anciens plugins peuvent encore utiliser `activate(api)` comme alias hérité, mais les nouveaux plugins doivent
Les plugins natifs exportent un objet dentrée qui expose `register(api)`. Les anciens
plugins peuvent encore utiliser `activate(api)` comme alias hérité, mais les nouveaux plugins doivent
utiliser `register`.
```typescript
@ -324,48 +330,47 @@ export default definePluginEntry({
```
OpenClaw charge lobjet dentrée et appelle `register(api)` pendant lactivation
du plugin. Le chargeur retombe encore sur `activate(api)` pour les anciens plugins,
mais les plugins inclus et les nouveaux plugins externes doivent considérer `register` comme le
contrat public.
du plugin. Le chargeur se replie encore sur `activate(api)` pour les anciens plugins,
mais les plugins inclus et les nouveaux plugins externes doivent considérer `register` comme le contrat public.
Méthodes denregistrement courantes :
| Method | Ce que cela enregistre |
| --------------------------------------- | -------------------------- |
| `registerProvider` | Fournisseur de modèle (LLM) |
| `registerChannel` | Canal de chat |
| `registerTool` | Outil dagent |
| `registerHook` / `on(...)` | Hooks de cycle de vie |
| `registerSpeechProvider` | Text-to-speech / STT |
| `registerRealtimeTranscriptionProvider` | STT en streaming |
| `registerRealtimeVoiceProvider` | Voix temps réel duplex |
| `registerMediaUnderstandingProvider` | Analyse image/audio |
| `registerImageGenerationProvider` | Génération dimages |
| `registerMusicGenerationProvider` | Génération musicale |
| `registerVideoGenerationProvider` | Génération vidéo |
| Method | Ce quelle enregistre |
| --------------------------------------- | ---------------------------- |
| `registerProvider` | Fournisseur de modèle (LLM) |
| `registerChannel` | Canal de chat |
| `registerTool` | Outil dagent |
| `registerHook` / `on(...)` | Hooks de cycle de vie |
| `registerSpeechProvider` | Synthèse vocale / STT |
| `registerRealtimeTranscriptionProvider` | STT en streaming |
| `registerRealtimeVoiceProvider` | Voix en temps réel duplex |
| `registerMediaUnderstandingProvider` | Analyse image/audio |
| `registerImageGenerationProvider` | Génération dimages |
| `registerMusicGenerationProvider` | Génération musicale |
| `registerVideoGenerationProvider` | Génération vidéo |
| `registerWebFetchProvider` | Fournisseur de récupération / scraping web |
| `registerWebSearchProvider` | Recherche web |
| `registerHttpRoute` | Point de terminaison HTTP |
| `registerCommand` / `registerCli` | Commandes CLI |
| `registerContextEngine` | Moteur de contexte |
| `registerService` | Service darrière-plan |
| `registerWebSearchProvider` | Recherche web |
| `registerHttpRoute` | Point de terminaison HTTP |
| `registerCommand` / `registerCli` | Commandes CLI |
| `registerContextEngine` | Moteur de contexte |
| `registerService` | Service en arrière-plan |
Comportement de garde des hooks pour les hooks de cycle de vie typés :
Comportement des gardes de hooks pour les hooks de cycle de vie typés :
- `before_tool_call` : `{ block: true }` est terminal ; les gestionnaires de priorité inférieure sont ignorés.
- `before_tool_call` : `{ block: false }` est un no-op et nefface pas un blocage antérieur.
- `before_tool_call` : `{ block: false }` na aucun effet et nannule pas un blocage antérieur.
- `before_install` : `{ block: true }` est terminal ; les gestionnaires de priorité inférieure sont ignorés.
- `before_install` : `{ block: false }` est un no-op et nefface pas un blocage antérieur.
- `before_install` : `{ block: false }` na aucun effet et nannule pas un blocage antérieur.
- `message_sending` : `{ cancel: true }` est terminal ; les gestionnaires de priorité inférieure sont ignorés.
- `message_sending` : `{ cancel: false }` est un no-op et nefface pas une annulation antérieure.
- `message_sending` : `{ cancel: false }` na aucun effet et nannule pas une annulation antérieure.
Pour le comportement complet des hooks typés, voir [Aperçu du SDK](/fr/plugins/sdk-overview#hook-decision-semantics).
Pour le comportement complet des hooks typés, voir [SDK Overview](/fr/plugins/sdk-overview#hook-decision-semantics).
## Lié
- [Créer des plugins](/fr/plugins/building-plugins) — créer votre propre plugin
- [Building Plugins](/fr/plugins/building-plugins) — créer votre propre plugin
- [Plugin Bundles](/fr/plugins/bundles) — compatibilité des bundles Codex/Claude/Cursor
- [Manifeste de plugin](/fr/plugins/manifest) — schéma du manifeste
- [Enregistrer des outils](/fr/plugins/building-plugins#registering-agent-tools) — ajouter des outils dagent dans un plugin
- [Internals des plugins](/fr/plugins/architecture) — modèle de capacités et pipeline de chargement
- [Plugins communautaires](/fr/plugins/community) — listes tierces
- [Plugin Manifest](/fr/plugins/manifest) — schéma du manifeste
- [Registering Tools](/fr/plugins/building-plugins#registering-agent-tools) — ajouter des outils dagent dans un plugin
- [Plugin Internals](/fr/plugins/architecture) — modèle de capacités et pipeline de chargement
- [Community Plugins](/fr/plugins/community) — listes tierces

View File

@ -1,14 +1,14 @@
---
read_when:
- Vous voulez utiliser le Gateway depuis un navigateur
- Vous voulez un accès Tailnet sans tunnels SSH
summary: Interface de contrôle basée sur le navigateur pour le Gateway (chat, nodes, configuration)
- Vous souhaitez utiliser le Gateway depuis un navigateur
- Vous souhaitez un accès Tailnet sans tunnels SSH
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-04-24T07:40:02Z"
generated_at: "2026-04-24T08:58:37Z"
model: gpt-5.4
provider: openai
source_hash: 2ad0d0cef7d842eddf665ba50f37403df258b17d4c072d22a30d1bc3830dc467
source_hash: c84a74e20d6c8829168025830ff4ec8f650f10f72fcaed7c8d2f5d92ab98d616
source_path: web/control-ui.md
workflow: 15
---
@ -16,182 +16,186 @@ x-i18n:
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`)
- préfixe facultatif : définissez `gateway.controlUi.basePath` (par exemple `/openclaw`)
Elle communique **directement avec le WebSocket Gateway** sur le même port.
Elle communique **directement avec le WebSocket du Gateway** sur le même port.
## Ouverture rapide (local)
Si le Gateway sexécute 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`.
Lauthentification est fournie lors de la poignée de main WebSocket via :
Lauthentification est fournie lors de 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é trusted-proxy lorsque `gateway.auth.mode: "trusted-proxy"`
- les en-têtes didentité de proxy approuvé lorsque `gateway.auth.mode: "trusted-proxy"`
Le panneau des paramètres du tableau de bord conserve un jeton pour la session
de longlet actuel du navigateur et lURL Gateway sélectionnée ; les mots de passe ne sont pas persistés. Lonboarding
génère généralement un jeton Gateway pour lauthentification à secret partagé à la première connexion, mais lauthentification
par mot de passe fonctionne aussi lorsque `gateway.auth.mode` vaut `"password"`.
Le panneau de paramètres du tableau de bord conserve un jeton pour la session
de longlet actuel du navigateur et lURL du Gateway sélectionnée ; les mots de passe ne sont pas persistés. Lintégration initiale génère généralement
un jeton Gateway pour lauthentification par secret partagé lors de la première connexion, mais lauthentification par mot de passe fonctionne aussi lorsque `gateway.auth.mode` vaut `"password"`.
## Appairage dappareil (première connexion)
## Appairage de lappareil (première connexion)
Lorsque vous vous connectez à linterface de contrôle depuis un nouveau navigateur ou appareil, le Gateway
exige une **approbation dappairage unique** — même si vous êtes sur le même Tailnet
avec `gateway.auth.allowTailscale: true`. Il sagit dune mesure de sécurité destinée à empêcher
exige **une approbation dappairage à usage unique** — même si vous êtes sur le même Tailnet
avec `gateway.auth.allowTailscale: true`. Il sagit dune mesure de sécurité visant à empêcher
les accès non autorisés.
**Ce que vous verrez :** "disconnected (1008): pairing required"
**Ce que vous verrez :** `disconnected (1008): pairing required`
**Pour approuver lappareil :**
```bash
# List pending requests
# Lister les demandes en attente
openclaw devices list
# Approve by request ID
# Approuver par ID de demande
openclaw devices approve <requestId>
```
Si le navigateur réessaie lappairage avec des détails dauthentification modifiés (rôle/scopes/clé
Si le navigateur relance 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.
créé. Exécutez de nouveau `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.
Si le navigateur est déjà appairé et que vous passez dun accès en lecture à
un accès en écriture/admin, cela est traité comme une montée de privilèges dapprobation, et non comme une reconnexion silencieuse.
OpenClaw conserve lancienne approbation active, bloque la reconnexion élargie,
et vous demande dapprouver explicitement le nouvel ensemble de scopes.
et vous demande dapprouver explicitement le nouvel ensemble de portées.
Une fois approuvé, lappareil est mémorisé et ne nécessitera pas de nouvelle approbation sauf
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>`. Voir
[CLI Devices](/fr/cli/devices) pour la rotation et la révocation des jetons.
[CLI Devices](/fr/cli/devices) pour la rotation des jetons et la révocation.
**Remarques :**
- Les connexions directes de navigateur local loopback (`127.0.0.1` / `localhost`) sont
- Les connexions directes du navigateur en local loopback (`127.0.0.1` / `localhost`) sont
approuvées automatiquement.
- Les connexions navigateur Tailnet et LAN exigent toujours une approbation explicite, même lorsquelles
- Les connexions navigateur via Tailnet et LAN exigent toujours une approbation explicite, même lorsquelles
proviennent de la même machine.
- Chaque profil de navigateur génère un identifiant dappareil unique, donc changer de navigateur ou
effacer les données du navigateur nécessitera un nouvel appairage.
- Chaque profil de navigateur génère un identifiant dappareil unique ; changer de navigateur ou
effacer les données du navigateur exigera donc un nouvel appairage.
## Identité personnelle (locale au navigateur)
Linterface de contrôle prend en charge une identité personnelle par navigateur (nom daffichage et
avatar) attachée aux messages sortants pour lattribution dans les sessions partagées. Elle
réside dans le stockage du navigateur, est limitée au profil de navigateur actuel, et nest pas
est stockée dans le navigateur, 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
dauteur dans la transcription des messages que vous envoyez réellement. Effacer les données du site ou
changer de navigateur la réinitialise à vide.
## Endpoint de configuration runtime
## Point de terminaison de configuration dexécution
Linterface de contrôle récupère ses paramètres runtime depuis
`/__openclaw/control-ui-config.json`. Cet endpoint est protégé par la même
authentification gateway que le reste de la surface HTTP : les navigateurs non authentifiés ne peuvent pas
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 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 Gateway déjà valide,
soit une identité Tailscale Serve, soit une identité trusted-proxy.
soit une identité Tailscale Serve, soit une identité de proxy approuvé.
## Prise en charge des langues
Linterface de contrôle peut se localiser elle-même au premier chargement en fonction de la locale de votre navigateur.
Pour la remplacer ultérieurement, ouvrez **Overview -> Gateway Access -> Language**. Le
sélecteur de locale se trouve dans la carte Gateway Access, pas dans Appearance.
Linterface de contrôle peut se localiser lors du premier chargement en fonction de la langue de votre navigateur.
Pour la remplacer ensuite, ouvrez **Overview -> Gateway Access -> Language**. Le
sélecteur de langue se trouve dans la carte Gateway Access, et non sous Appearance.
- Locales prises en charge : `en`, `zh-CN`, `zh-TW`, `pt-BR`, `de`, `es`, `ja-JP`, `ko`, `fr`, `tr`, `uk`, `id`, `pl`, `th`
- Les traductions non anglaises sont chargées à la demande dans le navigateur.
- La locale sélectionnée est enregistrée dans le stockage du navigateur et réutilisée lors des visites futures.
- Langues prises en charge : `en`, `zh-CN`, `zh-TW`, `pt-BR`, `de`, `es`, `ja-JP`, `ko`, `fr`, `tr`, `uk`, `id`, `pl`, `th`
- Les traductions autres quen anglais sont chargées à la demande dans le navigateur.
- La langue sélectionnée est enregistrée dans le stockage du navigateur et réutilisée lors des visites futures.
- Les clés de traduction manquantes reviennent à langlais.
## Ce quelle peut faire (aujourdhui)
- Discuter avec le modèle via Gateway WS (`chat.history`, `chat.send`, `chat.abort`, `chat.inject`)
- Parler directement à OpenAI Realtime depuis le navigateur via WebRTC. Le Gateway
- Communiquer directement avec OpenAI Realtime depuis le navigateur via WebRTC. Le Gateway
génère un secret client Realtime de courte durée avec `talk.realtime.session` ; le
navigateur envoie laudio du microphone directement à OpenAI et relaie les appels doutil
`openclaw_agent_consult` via `chat.send` vers le plus grand
modèle OpenClaw configuré.
- Diffuser les appels doutils + les cartes de sortie doutil en direct dans Chat (événements agent)
- Canaux : état des canaux intégrés ainsi que des plugins groupés/externes, connexion QR, et configuration par canal (`channels.status`, `web.login.*`, `config.patch`)
navigateur envoie laudio du microphone directement à OpenAI et relaie
les appels doutil `openclaw_agent_consult` via `chat.send` pour le modèle OpenClaw
plus grand configuré.
- Diffuser les appels doutil + cartes de sortie doutil en direct dans le chat (événements dagent)
- Canaux : statut des canaux intégrés ainsi que des canaux de Plugin bundled/externes, connexion 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/fast/verbose/trace/reasoning (`sessions.list`, `sessions.patch`)
- Dreams : statut du Dreaming, bascule activation/désactivation et lecteur Dream Diary (`doctor.memory.status`, `doctor.memory.dreamDiary`, `config.patch`)
- Sessions : liste + remplacements par session pour modèle/réflexion/rapide/verbeux/trace/raisonnement (`sessions.list`, `sessions.patch`)
- Dreams : état de Dreaming, activation/désactivation, et lecteur de Dream Diary (`doctor.memory.status`, `doctor.memory.dreamDiary`, `config.patch`)
- Tâches Cron : lister/ajouter/modifier/exécuter/activer/désactiver + historique dexécution (`cron.*`)
- Skills : état, activation/désactivation, installation, mises à jour de clé API (`skills.*`)
- Nodes : liste + capacités (`node.list`)
- Approbations exec : modifier les listes dautorisation gateway ou node + politique ask pour `exec host=gateway/node` (`exec.approvals.*`)
- Config : voir/modifier `~/.openclaw/openclaw.json` (`config.get`, `config.set`)
- Config : appliquer + redémarrer avec validation (`config.apply`) et réveiller la dernière session active
- Les écritures de configuration incluent une garde par hash de base pour éviter décraser des modifications concurrentes
- Les écritures de configuration (`config.set`/`config.apply`/`config.patch`) effectuent aussi en prévol la résolution active de SecretRef pour les refs dans la charge utile de configuration soumise ; les refs actives soumises non résolues sont rejetées avant lécriture
- Nœuds : liste + capacités (`node.list`)
- Approbations exec : modifier les listes dautorisation du Gateway ou du nœud + demander la stratégie pour `exec host=gateway/node` (`exec.approvals.*`)
- Configuration : afficher/modifier `~/.openclaw/openclaw.json` (`config.get`, `config.set`)
- Configuration : appliquer + redémarrer avec validation (`config.apply`) et réveiller la dernière session active
- Les écritures de configuration incluent une protection par hachage de base pour éviter décraser des modifications concurrentes
- Les écritures de configuration (`config.set`/`config.apply`/`config.patch`) effectuent également en amont la résolution active des SecretRef pour les références présentes dans la charge utile de configuration envoyée ; les références actives non résolues présentes dans la charge utile envoyée sont rejetées avant lécriture
- Schéma de configuration + rendu de formulaire (`config.schema` / `config.schema.lookup`,
y compris `title` / `description` de champ, indices dUI correspondants, résumés immédiats des enfants,
métadonnées de documentation sur les nœuds imbriqués objet/wildcard/tableau/composition,
ainsi que les schémas de plugin + canal lorsque disponibles) ; léditeur Raw JSON nest
disponible que lorsque le snapshot a un aller-retour brut sûr
- Si un snapshot ne peut pas effectuer en toute sécurité un aller-retour de texte brut, linterface de contrôle force le mode Form et désactive le mode Raw pour ce snapshot
- « Reset to saved » dans léditeur Raw JSON préserve la forme rédigée en brut (formatage, commentaires, disposition `$include`) au lieu de réafficher un snapshot aplati, afin que les modifications externes survivent à une réinitialisation lorsque le snapshot peut effectuer en toute sécurité un aller-retour
- Les valeurs dobjet SecretRef structurées sont rendues en lecture seule dans les entrées texte du formulaire pour éviter une corruption accidentelle objet-vers-chaîne
- Débogage : snapshots statut/health/models + journal dévénements + appels RPC manuels (`status`, `health`, `models.list`)
- Logs : suivi en direct des fichiers journaux du gateway avec filtre/export (`logs.tail`)
- Mise à jour : exécuter une mise à jour package/git + redémarrage (`update.run`) avec rapport de redémarrage
y compris les champs `title` / `description`, les indications dinterface correspondantes, les résumés immédiats des enfants,
les métadonnées de documentation sur les nœuds dobjet imbriqué/joker/tableau/composition,
ainsi que les schémas de Plugin + de canal lorsquils sont disponibles) ; léditeur JSON brut nest
disponible que lorsque linstantané peut effectuer un aller-retour sûr du brut
- Si un instantané ne peut pas effectuer en toute sécurité un aller-retour du texte brut, linterface de contrôle force le mode Form et désactive le mode Raw pour cet instantané
- Dans léditeur JSON brut, « Reset to saved » préserve la forme rédigée en brut (mise en forme, commentaires, structure `$include`) au lieu de réafficher 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 affichées en lecture seule dans les champs texte du formulaire afin déviter une corruption accidentelle dobjet en chaîne
- Débogage : instantanés détat/santé/modèles + journal dévénements + appels RPC manuels (`status`, `health`, `models.list`)
- Journaux : suivi en direct des journaux de fichiers du Gateway avec filtre/export (`logs.tail`)
- Mise à jour : exécuter une mise à jour de paquet/git + redémarrage (`update.run`) avec rapport de redémarrage
Remarques sur le panneau des tâches Cron :
- Pour les tâches isolées, la livraison par défaut est announce summary. Vous pouvez la passer à none si vous voulez des exécutions internes uniquement.
- Les champs canal/cible apparaissent lorsque announce est sélectionné.
- Pour les tâches isolées, le mode de livraison par défaut est lannonce du résumé. Vous pouvez passer à aucun si vous souhaitez des exécutions internes uniquement.
- Les champs canal/cible apparaissent lorsque lannonce est sélectionnée.
- Le mode Webhook utilise `delivery.mode = "webhook"` avec `delivery.to` défini sur une URL Webhook HTTP(S) valide.
- Pour les tâches main-session, les modes de livraison webhook et none sont disponibles.
- Les contrôles dédition avancée incluent delete-after-run, clear agent override, les options cron exact/stagger,
les remplacements agent model/thinking, et les bascules de livraison best-effort.
- La validation du formulaire est intégrée avec des erreurs au niveau du champ ; les valeurs invalides désactivent le bouton denregistrement jusquà correction.
- Pour les tâches de session principale, les modes de livraison webhook et none sont disponibles.
- Les contrôles de modification avancés incluent supprimer après exécution, effacer le remplacement dagent, les options Cron exactes/échelonnées,
les remplacements de modèle/réflexion dagent, et les bascules de livraison au mieux.
- La validation du formulaire est en ligne avec des erreurs au niveau des champs ; les valeurs invalides désactivent le bouton denregistrement jusquà correction.
- Définissez `cron.webhookToken` pour envoyer un jeton bearer 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.
- Solution de repli obsolète : les anciennes tâches enregistrées avec `notify: true` peuvent encore utiliser `cron.webhook` jusquà leur migration.
## Comportement du 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`.
- Renvoyer avec la même `idempotencyKey` retourne `{ status: "in_flight" }` pendant lexécution, et `{ status: "ok" }` après la fin.
- Les réponses `chat.history` sont bornées en taille pour la sécurité de lUI. Lorsque les entrées de transcription sont trop volumineuses, Gateway peut tronquer les champs texte longs, omettre les blocs de métadonnées lourds, et remplacer les messages surdimensionnés par un placeholder (`[chat.history omitted: message too large]`).
- Les images assistant/générées sont persistées comme références de média gérées et resservies via des URLs média Gateway authentifiées, de sorte que les rechargements ne dépendent pas de la conservation des charges utiles image base64 brutes dans la réponse de lhistorique du chat.
- `chat.history` supprime aussi les balises de directive inline réservées à laffichage du texte assistant visible (par exemple `[[reply_to_*]]` et `[[audio_as_voice]]`), les charges utiles XML dappel doutil en texte brut (y compris `<tool_call>...</tool_call>`, `<function_call>...</function_call>`, `<tool_calls>...</tool_calls>`, `<function_calls>...</function_calls>`, et les blocs dappel doutil tronqués), ainsi que les jetons de contrôle de modèle ASCII/full-width divulgués, et omet les entrées assistant dont tout le texte visible est seulement le jeton silencieux exact `NO_REPLY` / `no_reply`.
- `chat.inject` ajoute une note assistant à la transcription de session et diffuse un événement `chat` pour les mises à jour UI uniquement (pas dexécution dagent, pas de livraison de canal).
- Les sélecteurs de modèle et de thinking dans len-tête du chat patchent immédiatement la session active via `sessions.patch` ; ce sont des remplacements persistants de session, et non des options denvoi à usage unique.
- Le mode Talk utilise le fournisseur de voix temps réel enregistré. Configurez OpenAI avec
`talk.provider: "openai"` plus `talk.providers.openai.apiKey`, ou réutilisez la
configuration du fournisseur temps réel Voice Call. Le navigateur ne reçoit jamais la clé API OpenAI standard ; il reçoit seulement le secret client Realtime éphémère. Linvite de session Realtime est assemblée par le Gateway ; `talk.realtime.session` naccepte pas de remplacements dinstructions fournis par lappelant.
- Dans le compositeur Chat, le contrôle Talk est le bouton en forme dondes à côté du
bouton de dictée micro. Lorsque Talk démarre, la ligne détat du compositeur affiche
`Connecting Talk...`, puis `Talk live` pendant que laudio est connecté, ou
`Asking OpenClaw...` pendant quun appel doutil temps réel consulte le plus grand
modèle configuré via `chat.send`.
- `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`.
- Un nouvel envoi avec la même `idempotencyKey` renvoie `{ status: "in_flight" }` pendant lexécution, et `{ status: "ok" }` après la fin.
- Les réponses `chat.history` sont limitées en taille pour la sécurité de linterface. Lorsque les entrées de transcription sont trop volumineuses, le Gateway peut tronquer les longs champs 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 dassistant/générées sont conservées comme références média gérées et servies à nouveau via des URL média Gateway authentifiées, de sorte que les rechargements ne dépendent pas du maintien des charges utiles dimage base64 brutes dans la réponse de lhistorique du chat.
- `chat.history` supprime également du texte visible de lassistant les balises de directive en ligne uniquement destinées à laffichage (par exemple `[[reply_to_*]]` et `[[audio_as_voice]]`), les charges utiles XML dappel doutil en texte brut (y compris `<tool_call>...</tool_call>`, `<function_call>...</function_call>`, `<tool_calls>...</tool_calls>`, `<function_calls>...</function_calls>` et les blocs dappel doutil tronqués), ainsi que les jetons de contrôle de modèle ASCII/pleine largeur divulgués, et omet les entrées dassistant dont tout le texte visible est uniquement le jeton silencieux exact `NO_REPLY` / `no_reply`.
- `chat.inject` ajoute une note dassistant à la transcription de la session et diffuse un événement `chat` pour des mises à jour dinterface uniquement (pas dexécution dagent, pas de livraison à un canal).
- Les sélecteurs de modèle et de réflexion dans len-tête du chat appliquent immédiatement des correctifs à la session active via `sessions.patch` ; il sagit de remplacements persistants de session, et non doptions denvoi pour un seul tour.
- Le mode Talk utilise un fournisseur vocal temps réel enregistré qui prend en charge les
sessions WebRTC dans le navigateur. Configurez OpenAI avec `talk.provider: "openai"` plus
`talk.providers.openai.apiKey`, ou réutilisez la configuration du fournisseur temps réel Voice Call.
Le navigateur ne reçoit jamais la clé API OpenAI standard ; il reçoit
uniquement le secret client Realtime éphémère. La voix temps réel Google Live est
prise en charge pour le backend Voice Call et les ponts Google Meet, mais pas encore pour ce chemin
WebRTC du navigateur. Linvite de session Realtime est assemblée par le Gateway ;
`talk.realtime.session` naccepte pas de remplacements dinstructions fournis par lappelant.
- Dans le compositeur de chat, la commande Talk est le bouton en forme dondes à côté du
bouton de dictée au microphone. Lorsque Talk démarre, la ligne détat du compositeur affiche
`Connecting Talk...`, puis `Talk live` lorsque laudio est connecté, ou
`Asking OpenClaw...` lorsquun appel doutil temps réel consulte le
plus grand modèle configuré via `chat.send`.
- Arrêt :
- 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 attente pour injecter ce suivi dans le tour en cours.
- Tapez `/stop` (ou des phrases dinterruption autonomes comme `stop`, `stop action`, `stop run`, `stop openclaw`, `please stop`) pour interrompre hors bande
- Lorsquune exécution est active, les suivis normaux sont mis en file dattente. Cliquez sur **Steer** sur un message en attente pour injecter ce suivi dans le tour en cours.
- Saisissez `/stop` (ou des expressions darrêt autonomes comme `stop`, `stop action`, `stop run`, `stop openclaw`, `please stop`) pour interrompre hors bande
- `chat.abort` prend en charge `{ sessionKey }` (sans `runId`) pour interrompre toutes les exécutions actives de cette session
- Conservation partielle après interruption :
- Lorsquune exécution est interrompue, du texte assistant partiel peut quand même être affiché dans lUI
- Gateway persiste le texte assistant partiel interrompu dans lhistorique de transcription lorsquune sortie tamponnée existe
- Les entrées persistées incluent des métadonnées dinterruption afin que les consommateurs de transcription puissent distinguer les partiels interrompus de la sortie normale de fin
- Conservation partielle lors de linterruption :
- Lorsquune exécution est interrompue, un texte partiel de lassistant peut toujours être affiché dans linterface
- Le Gateway conserve le texte partiel interrompu de lassistant dans lhistorique de la transcription lorsquune sortie tamponnée existe
- Les entrées conservées incluent des métadonnées dinterruption afin que les consommateurs de transcription puissent distinguer les fragments dus à une interruption dune sortie normale terminée
## Intégrations hébergées
Les messages assistant peuvent afficher du contenu web hébergé en ligne avec le shortcode `[embed ...]`.
La politique sandbox iframe est contrôlée par
Les messages dassistant peuvent afficher du contenu web hébergé en ligne via le shortcode `[embed ...]`.
La politique de sandbox diframe est contrôlée par
`gateway.controlUi.embedSandbox` :
- `strict` : désactive lexécution de scripts dans les intégrations hébergées
- `scripts` : autorise les intégrations interactives tout en conservant lisolation dorigine ; cest
la valeur par défaut et cest généralement suffisant pour les jeux/widgets navigateur autonomes
la valeur par défaut et elle suffit généralement pour les jeux/widgets navigateur autonomes
- `trusted` : ajoute `allow-same-origin` en plus de `allow-scripts` pour les
documents de même site qui ont intentionnellement besoin de privilèges plus élevés
documents du même site qui ont intentionnellement besoin de privilèges plus élevés
Exemple :
@ -205,19 +209,18 @@ Exemple :
}
```
Utilisez `trusted` uniquement lorsque le document intégré a réellement besoin dun
comportement same-origin. Pour la plupart des jeux générés par agent et des canvases interactifs, `scripts` est
le choix le plus sûr.
Nutilisez `trusted` que 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 canevas interactifs, `scripts` est le choix le plus sûr.
Les URLs 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
Les URL dintégration externes absolues `http(s)` restent bloquées par défaut. Si vous
souhaitez intentionnellement que `[embed url="https://..."]` charge des pages tierces, définissez
`gateway.controlUi.allowExternalEmbedUrls: true`.
## Accès Tailnet (recommandé)
### Tailscale Serve intégré (préféré)
Gardez le Gateway sur loopback et laissez Tailscale Serve le proxifier en HTTPS :
Conservez le Gateway sur local loopback et laissez Tailscale Serve le proxifier en HTTPS :
```bash
openclaw gateway --tailscale serve
@ -227,32 +230,32 @@ Ouvrez :
- `https://<magicdns>/` (ou votre `gateway.controlUi.basePath` configuré)
Par défaut, les requêtes Serve de Control UI/WebSocket peuvent sauthentifier via les en-têtes didentité Tailscale
Par défaut, les requêtes Serve de linterface de contrôle/WebSocket 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 en-têtes que lorsque la
requête atteint loopback avec les en-têtes `x-forwarded-*` de Tailscale. Définissez
`gateway.auth.allowTailscale: false` si vous voulez exiger des identifiants explicites à secret partagé
`tailscale whois` et en la comparant à len-tête, et naccepte ces en-têtes que lorsque la
requête atteint local loopback avec les en-têtes `x-forwarded-*` de Tailscale. Définissez
`gateway.auth.allowTailscale: false` si vous souhaitez exiger des identifiants explicites à secret partagé
même pour le trafic Serve. Utilisez alors `gateway.auth.mode: "token"` ou
`"password"`.
Pour ce chemin didentité Serve asynchrone, les tentatives dauthentification échouées pour la même IP cliente
et le même scope dauthentification sont sérialisées avant les écritures de limitation de débit. Des nouvelles tentatives invalides
concurrentes depuis le même navigateur peuvent donc afficher `retry later` sur la deuxième requête
au lieu de deux simples incompatibilités en course parallèle.
Lauthentification Serve sans jeton suppose que lhôte gateway est digne de confiance. Si du code local non digne de confiance
et le même périmètre 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 parallèle.
Lauthentification Serve sans jeton suppose que lhôte du gateway est de confiance. Si du code local non fiable
peut sexécuter sur cet hôte, exigez une authentification par jeton/mot de passe.
### Lier à tailnet + jeton
### Liaison au tailnet + jeton
```bash
openclaw gateway --bind tailnet --token "$(openssl rand -hex 32)"
```
Puis ouvrez :
Ouvrez ensuite :
- `http://<tailscale-ip>:18789/` (ou votre `gateway.controlUi.basePath` configuré)
Collez le secret partagé correspondant dans les paramètres de lUI (envoyé comme
Collez le secret partagé correspondant dans les paramètres de linterface (envoyé comme
`connect.params.auth.token` ou `connect.params.auth.password`).
## HTTP non sécurisé
@ -264,15 +267,15 @@ OpenClaw **bloque** les connexions à linterface de contrôle sans identité
Exceptions documentées :
- compatibilité HTTP non sécurisé localhost uniquement avec `gateway.controlUi.allowInsecureAuth=true`
- authentification opérateur réussie à linterface de contrôle via `gateway.auth.mode: "trusted-proxy"`
- solution de secours `gateway.controlUi.dangerouslyDisableDeviceAuth=true`
- authentification réussie dopérateur à linterface de contrôle via `gateway.auth.mode: "trusted-proxy"`
- option de secours `gateway.controlUi.dangerouslyDisableDeviceAuth=true`
**Correctif recommandé :** utilisez HTTPS (Tailscale Serve) ou ouvrez lUI localement :
**Correctif recommandé :** utilisez HTTPS (Tailscale Serve) ou ouvrez linterface localement :
- `https://<magicdns>/` (Serve)
- `http://127.0.0.1:18789/` (sur lhôte gateway)
- `http://127.0.0.1:18789/` (sur lhôte du gateway)
**Comportement de la bascule dauthentification non sécurisée :**
**Comportement de loption dauthentification non sécurisée :**
```json5
{
@ -284,14 +287,14 @@ Exceptions documentées :
}
```
`allowInsecureAuth` est uniquement une bascule de compatibilité locale :
`allowInsecureAuth` est uniquement une option locale de compatibilité :
- Elle permet aux sessions localhost de linterface de contrôle de continuer sans identité dappareil dans
- Elle permet aux sessions de linterface de contrôle sur localhost de se poursuivre sans identité dappareil dans
des contextes HTTP non sécurisés.
- Elle ne contourne pas les vérifications dappairage.
- Elle nassouplit pas les exigences didentité dappareil à distance (hors localhost).
**Solution de secours uniquement :**
**Secours uniquement :**
```json5
{
@ -306,47 +309,47 @@ Exceptions documentées :
`dangerouslyDisableDeviceAuth` désactive les vérifications didentité dappareil de linterface de contrôle et constitue une
forte dégradation de la sécurité. Revenez rapidement en arrière après usage durgence.
Remarque trusted-proxy :
Remarque sur le proxy approuvé :
- une authentification trusted-proxy réussie peut autoriser des sessions **opérateur** de linterface de contrôle sans
- une authentification réussie via proxy approuvé peut autoriser des sessions dinterface de contrôle **opérateur** sans
identité dappareil
- cela ne sétend **pas** aux sessions de linterface de contrôle de rôle node
- les proxys inverses loopback sur le même hôte ne satisfont toujours pas lauthentification trusted-proxy ; voir
[Authentification Trusted Proxy](/fr/gateway/trusted-proxy-auth)
- cela ne sétend **pas** aux sessions dinterface de contrôle avec rôle de nœud
- les proxys inverses local loopback sur le même hôte ne satisfont toujours pas à lauthentification par proxy approuvé ; voir
[Authentification par proxy approuvé](/fr/gateway/trusted-proxy-auth)
Voir [Tailscale](/fr/gateway/tailscale) pour les conseils de configuration HTTPS.
## Politique de sécurité du contenu
Linterface de contrôle est fournie avec une politique `img-src` stricte : seuls les assets **same-origin** et les URLs `data:` sont autorisés. Les URLs dimage distantes `http(s)` et relatives au protocole sont rejetées par le navigateur et némettent aucune récupération réseau.
Linterface de contrôle est fournie avec une politique `img-src` stricte : seules les ressources **de même origine** et les URL `data:` sont autorisées. Les URL dimage distantes `http(s)` et relatives au protocole sont rejetées par le navigateur et némettent aucune requête réseau.
Ce que cela signifie en pratique :
Concrètement :
- Les avatars et images servis sous des chemins relatifs (par exemple `/avatars/<id>`) saffichent toujours.
- Les URLs inline `data:image/...` saffichent toujours (utile pour les charges utiles dans le protocole).
- Les URLs davatar distantes émises par les métadonnées de canal sont supprimées au niveau des helpers davatar de linterface de contrôle et remplacées par le logo/le badge intégré, de sorte quun canal compromis ou malveillant ne puisse pas forcer des récupérations dimage distantes arbitraires depuis le navigateur dun opérateur.
- Les URL `data:image/...` en ligne saffichent toujours (utile pour les charges utiles dans le protocole).
- Les URL davatar distantes émises par les métadonnées de canal sont supprimées par les assistants davatar de linterface de contrôle et remplacées par le logo/badge intégré, de sorte quun canal compromis ou malveillant ne peut pas forcer des récupérations dimages distantes arbitraires depuis le navigateur dun opérateur.
Vous navez rien à changer pour obtenir ce comportement — il est toujours activé et non configurable.
Vous navez rien à modifier pour obtenir ce comportement — il est toujours activé et nest pas configurable.
## Authentification de la route avatar
## Authentification de la route davatar
Lorsque lauthentification gateway est configurée, lendpoint avatar de linterface de contrôle exige le même jeton gateway que le reste de lAPI :
Lorsque lauthentification gateway est configurée, le point de terminaison davatar de linterface de contrôle exige le même jeton gateway que le reste de lAPI :
- `GET /avatar/<agentId>` ne renvoie limage avatar quaux 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 avatar de divulguer lidentité de lagent sur des hôtes autrement protégés.
- Linterface de contrôle elle-même transmet le jeton gateway comme en-tête bearer lors de la récupération des avatars, et utilise des URLs blob authentifiées afin que limage saffiche toujours dans les tableaux de bord.
- `GET /avatar/<agentId>` ne renvoie limage davatar quaux appelants authentifiés. `GET /avatar/<agentId>?meta=1` renvoie les métadonnées de lavatar selon la même règle.
- Les requêtes non authentifiées vers lune ou lautre route sont rejetées (comme pour la route sœur de média dassistant). Cela empêche la route davatar de divulguer lidentité de lagent sur des hôtes par ailleurs protégés.
- Linterface de contrôle elle-même transmet 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 continue de safficher dans les tableaux de bord.
Si vous désactivez lauthentification gateway (non recommandé sur des hôtes partagés), la route avatar devient également non authentifiée, en cohérence avec le reste du gateway.
Si vous désactivez lauthentification gateway (non recommandé sur des hôtes partagés), la route davatar devient également non authentifiée, conformément au reste du gateway.
## Construction de lUI
## Construire linterface
Le Gateway sert des fichiers statiques depuis `dist/control-ui`. Construisez-les avec :
Le Gateway sert les fichiers statiques depuis `dist/control-ui`. Construisez-les avec :
```bash
pnpm ui:build
```
Base absolue facultative (lorsque vous voulez des URLs dassets fixes) :
Base absolue facultative (lorsque vous souhaitez des URL de ressources fixes) :
```bash
OPENCLAW_CONTROL_UI_BASE_PATH=/openclaw/ pnpm ui:build
@ -358,15 +361,15 @@ Pour le développement local (serveur de développement séparé) :
pnpm ui:dev
```
Puis pointez lUI vers lURL WS de votre Gateway (par ex. `ws://127.0.0.1:18789`).
Pointez ensuite linterface vers lURL WS de votre Gateway (par exemple `ws://127.0.0.1:18789`).
## Débogage/test : serveur de développement + Gateway distant
Linterface de contrôle est constituée de fichiers statiques ; la cible WebSocket est configurable et peut être
différente de lorigine HTTP. Cest pratique lorsque vous voulez le serveur de développement Vite
Linterface de contrôle est composée de fichiers statiques ; la cible WebSocket est configurable et peut être
différente de lorigine HTTP. Cest pratique lorsque vous souhaitez le serveur de développement Vite
en local mais que le Gateway sexécute ailleurs.
1. Démarrez le serveur de développement UI : `pnpm ui:dev`
1. Démarrez le serveur de développement de linterface : `pnpm ui:dev`
2. Ouvrez une URL comme :
```text
@ -381,19 +384,19 @@ http://localhost:5173/?gatewayUrl=wss://<gateway-host>:18789#token=<gateway-toke
Remarques :
- `gatewayUrl` est stocké dans localStorage après le chargement et retiré de lURL.
- `token` doit être passé via le fragment dURL (`#token=...`) chaque fois que possible. Les fragments ne sont pas envoyés au serveur, ce qui évite les fuites via journaux de requête et Referer. Les anciens paramètres de requête `?token=` sont encore importés une fois pour compatibilité, mais seulement comme repli, et sont supprimés immédiatement après le bootstrap.
- `gatewayUrl` est stocké dans localStorage après le chargement et supprimé de lURL.
- `token` doit être transmis via le fragment dURL (`#token=...`) autant que possible. Les fragments ne sont pas envoyés au serveur, ce qui évite les fuites dans les journaux de requêtes et via Referer. Les anciens paramètres de requête `?token=` sont encore importés une fois pour compatibilité, mais seulement en repli, et sont supprimés immédiatement après linitialisation.
- `password` est conservé uniquement en mémoire.
- Lorsque `gatewayUrl` est défini, lUI ne retombe pas sur des identifiants issus de la configuration ou de lenvironnement.
Fournissez explicitement `token` (ou `password`). Labsence didentifiants explicites est une erreur.
- Lorsque `gatewayUrl` est défini, linterface ne revient pas aux identifiants de configuration ou denvironnement.
Fournissez `token` (ou `password`) explicitement. 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 (pas intégrée) afin dempêcher le clickjacking.
- Les déploiements dinterface de contrôle hors loopback doivent définir `gateway.controlUi.allowedOrigins`
explicitement (origines complètes). Cela inclut les configurations de développement distantes.
- Nutilisez pas `gateway.controlUi.allowedOrigins: ["*"]` sauf pour des tests locaux très contrôlés.
Cela signifie autoriser nimporte quelle origine de navigateur, pas « correspondre à lhôte que jutilise ».
- `gatewayUrl` nest accepté que dans une fenêtre de premier niveau (pas intégrée) afin dempêcher le détournement de clic.
- Les déploiements dinterface de contrôle hors local loopback doivent définir explicitement `gateway.controlUi.allowedOrigins`
(origines complètes). Cela inclut les configurations de développement distantes.
- Nutilisez pas `gateway.controlUi.allowedOrigins: ["*"]` sauf pour des tests locaux étroitement contrôlés.
Cela signifie autoriser toute origine de navigateur, et non « correspondre à lhôte que jutilise ».
- `gateway.controlUi.dangerouslyAllowHostHeaderOriginFallback=true` active
le mode de repli dorigine par en-tête Host, mais cest un mode de sécurité dangereux.
le mode de repli sur lorigine de len-tête Host, mais cest un mode de sécurité dangereux.
Exemple :
@ -409,9 +412,9 @@ Exemple :
Détails de configuration de laccès distant : [Accès distant](/fr/gateway/remote).
## Associé
## Liens associés
- [Dashboard](/fr/web/dashboard) — tableau de bord du gateway
- [WebChat](/fr/web/webchat) — interface de chat basée sur le navigateur
- [TUI](/fr/web/tui) — interface utilisateur terminal
- [TUI](/fr/web/tui) — interface utilisateur en terminal
- [Health Checks](/fr/gateway/health) — surveillance de létat du gateway