chore(i18n): refresh fr translations

This commit is contained in:
openclaw-docs-i18n[bot] 2026-04-15 07:01:52 +00:00
parent 45dacee46e
commit 063548b030
11 changed files with 2350 additions and 2215 deletions

File diff suppressed because it is too large Load Diff

View File

@ -1,15 +1,15 @@
---
read_when:
- Vous voulez que la promotion de la mémoire s'exécute automatiquement
- Vous voulez comprendre à quoi sert chaque phase de Dreaming
- Vous voulez ajuster la consolidation sans polluer MEMORY.md
summary: Consolidation de la mémoire en arrière-plan avec phases légère, profonde et REM, plus un Journal des rêves
- Vous souhaitez que la promotion de la mémoire sexécute automatiquement
- Vous voulez comprendre ce que fait chaque phase de Dreaming
- Vous voulez ajuster la consolidation sans polluer `MEMORY.md`
summary: Consolidation de la mémoire en arrière-plan avec des phases légères, profondes et REM, plus un journal de rêves
title: Dreaming (expérimental)
x-i18n:
generated_at: "2026-04-09T01:27:47Z"
generated_at: "2026-04-15T06:56:37Z"
model: gpt-5.4
provider: openai
source_hash: 26476eddb8260e1554098a6adbb069cf7f5e284cf2e09479c6d9d8f8b93280ef
source_hash: 5882a5068f2eabe54ca9893184e5385330a432b921870c38626399ce11c31e25
source_path: concepts/dreaming.md
workflow: 15
---
@ -17,8 +17,8 @@ x-i18n:
# Dreaming (expérimental)
Dreaming est le système de consolidation de la mémoire en arrière-plan dans `memory-core`.
Il aide OpenClaw à déplacer des signaux forts de court terme vers une mémoire durable, tout en
gardant le processus explicable et vérifiable.
Il aide OpenClaw à déplacer les signaux forts à court terme vers une mémoire durable tout en
gardant le processus explicable et révisable.
Dreaming est **optionnel** et désactivé par défaut.
@ -26,107 +26,111 @@ Dreaming est **optionnel** et désactivé par défaut.
Dreaming conserve deux types de sortie :
- **État machine** dans `memory/.dreams/` (magasin de rappel, signaux de phase, points de contrôle d'ingestion, verrous).
- **Sortie lisible par les humains** dans `DREAMS.md` (ou `dreams.md` existant) et fichiers de rapport de phase facultatifs sous `memory/dreaming/<phase>/YYYY-MM-DD.md`.
- **État machine** dans `memory/.dreams/` (magasin de rappel, signaux de phase, points de contrôle dingestion, verrous).
- **Sortie lisible par des humains** dans `DREAMS.md` (ou `dreams.md` existant) et des fichiers de rapport de phase facultatifs sous `memory/dreaming/<phase>/YYYY-MM-DD.md`.
La promotion à long terme n'écrit toujours que dans `MEMORY.md`.
La promotion à long terme continue décrire uniquement dans `MEMORY.md`.
## Modèle de phase
Dreaming utilise trois phases coopératives :
| Phase | Objectif | Écriture durable |
| ----- | -------- | ---------------- |
| Light | Trier et préparer le matériel récent de court terme | Non |
| Deep | Évaluer et promouvoir les candidats durables | Oui (`MEMORY.md`) |
| REM | Réfléchir aux thèmes et aux idées récurrentes | Non |
| Phase | Objectif | Écriture durable |
| ----- | ----------------------------------------- | ----------------- |
| Light | Trier et préparer le matériel récent à court terme | Non |
| Deep | Évaluer et promouvoir les candidats durables | Oui (`MEMORY.md`) |
| REM | Réfléchir aux thèmes et aux idées récurrentes | Non |
Ces phases sont des détails d'implémentation internes, pas des « modes »
distincts configurés par l'utilisateur.
Ces phases sont des détails dimplémentation internes, et non des « modes »
distincts configurés par lutilisateur.
### Phase Light
La phase Light ingère les signaux récents de mémoire quotidienne et les traces de rappel, les déduplique
et prépare des lignes candidates.
La phase Light ingère les signaux récents de mémoire quotidienne et les traces de rappel, les déduplique,
et prépare les lignes candidates.
- Lit l'état de rappel à court terme, les fichiers récents de mémoire quotidienne et les transcriptions de session expurgées lorsqu'elles sont disponibles.
- Écrit un bloc `## Light Sleep` géré lorsque le stockage inclut une sortie inline.
- Lit létat de rappel à court terme, les fichiers récents de mémoire quotidienne et les transcriptions de session expurgées lorsquelles sont disponibles.
- Écrit un bloc géré `## Light Sleep` lorsque le stockage inclut une sortie en ligne.
- Enregistre des signaux de renforcement pour le classement Deep ultérieur.
- N'écrit jamais dans `MEMORY.md`.
- Nécrit jamais dans `MEMORY.md`.
### Phase Deep
La phase Deep décide de ce qui devient une mémoire à long terme.
- Classe les candidats à l'aide d'un score pondéré et de seuils de validation.
- Classe les candidats à laide dun score pondéré et de seuils de validation.
- Exige que `minScore`, `minRecallCount` et `minUniqueQueries` soient atteints.
- Réhydrate les extraits depuis les fichiers quotidiens actifs avant l'écriture, afin que les extraits obsolètes ou supprimés soient ignorés.
- Réhydrate les extraits à partir des fichiers quotidiens actifs avant lécriture, de sorte que les extraits obsolètes ou supprimés soient ignorés.
- Ajoute les entrées promues à `MEMORY.md`.
- Écrit un résumé `## Deep Sleep` dans `DREAMS.md` et écrit éventuellement `memory/dreaming/deep/YYYY-MM-DD.md`.
- Écrit un résumé `## Deep Sleep` dans `DREAMS.md` et peut aussi écrire `memory/dreaming/deep/YYYY-MM-DD.md`.
### Phase REM
La phase REM extrait des motifs et des signaux réflexifs.
- Construit des résumés de thèmes et de réflexions à partir des traces récentes de court terme.
- Écrit un bloc `## REM Sleep` géré lorsque le stockage inclut une sortie inline.
- Construit des résumés de thèmes et de réflexions à partir des traces récentes à court terme.
- Écrit un bloc géré `## REM Sleep` lorsque le stockage inclut une sortie en ligne.
- Enregistre des signaux de renforcement REM utilisés par le classement Deep.
- N'écrit jamais dans `MEMORY.md`.
- Nécrit jamais dans `MEMORY.md`.
## Ingestion des transcriptions de session
Dreaming peut ingérer des transcriptions de session expurgées dans le corpus de Dreaming. Lorsque
des transcriptions sont disponibles, elles sont intégrées à la phase Light avec les signaux
de mémoire quotidienne et les traces de rappel. Le contenu personnel et sensible est expurgé
avant l'ingestion.
des transcriptions sont disponibles, elles sont intégrées à la phase Light en plus des signaux de
mémoire quotidienne et des traces de rappel. Le contenu personnel et sensible est expurgé
avant lingestion.
## Journal des rêves
Dreaming conserve également un **Journal des rêves** narratif dans `DREAMS.md`.
Une fois que chaque phase dispose de suffisamment de matière, `memory-core` exécute un tour
de sous-agent en arrière-plan avec effort optimal (en utilisant le modèle d'exécution par défaut) et ajoute une courte entrée au journal.
Dreaming conserve aussi un **journal des rêves** narratif dans `DREAMS.md`.
Après que chaque phase a accumulé suffisamment de matière, `memory-core` exécute un tour
de sous-agent en arrière-plan en mode best-effort (en utilisant le modèle dexécution par défaut)
et ajoute une courte entrée au journal.
Ce journal est destiné à la lecture humaine dans l'interface Dreams, pas à servir de source de promotion.
Ce journal est destiné à la lecture humaine dans linterface Dreams, et non à servir de source de promotion.
Les artefacts de journal/rapport générés par Dreaming sont exclus de la
promotion à court terme. Seuls les extraits de mémoire ancrés dans les faits peuvent être promus dans
`MEMORY.md`.
Il existe également une voie de remplissage historique fondée pour le travail de révision et de récupération :
Il existe aussi un circuit de remplissage historique ancré dans les faits pour les travaux de révision et de récupération :
- `memory rem-harness --path ... --grounded` prévisualise une sortie de journal fondée à partir de notes historiques `YYYY-MM-DD.md`.
- `memory rem-backfill --path ...` écrit des entrées de journal fondées réversibles dans `DREAMS.md`.
- `memory rem-backfill --path ... --stage-short-term` prépare des candidats durables fondés dans le même magasin de preuves à court terme que la phase Deep normale utilise déjà.
- `memory rem-backfill --rollback` et `--rollback-short-term` suppriment ces artefacts de remplissage préparés sans toucher aux entrées ordinaires du journal ni au rappel actif normal à court terme.
- `memory rem-harness --path ... --grounded` prévisualise la sortie du journal ancré dans les faits à partir des notes historiques `YYYY-MM-DD.md`.
- `memory rem-backfill --path ...` écrit des entrées réversibles de journal ancré dans les faits dans `DREAMS.md`.
- `memory rem-backfill --path ... --stage-short-term` prépare des candidats durables ancrés dans les faits dans le même magasin de preuves à court terme que la phase Deep normale utilise déjà.
- `memory rem-backfill --rollback` et `--rollback-short-term` suppriment ces artefacts de remplissage préparés sans toucher aux entrées ordinaires du journal ni au rappel actif à court terme.
L'interface Control UI expose le même flux de remplissage/réinitialisation du journal afin que vous puissiez inspecter
les résultats dans la scène Dreams avant de décider si les candidats fondés
méritent une promotion. La scène affiche également une voie fondée distincte afin que vous puissiez voir
quelles entrées préparées à court terme proviennent d'une relecture historique, quels éléments promus
ont été guidés par le mode fondé, et effacer uniquement les entrées préparées fondées sans
toucher à l'état ordinaire actif de court terme.
Linterface Control expose le même flux de remplissage/réinitialisation du journal afin que vous puissiez inspecter
les résultats dans la scène Dreams avant de décider si les candidats ancrés dans les faits
méritent une promotion. La scène affiche aussi une voie ancrée distincte pour que vous puissiez voir
quelles entrées préparées à court terme proviennent dune relecture historique, quels éléments promus
ont été guidés par des données ancrées dans les faits, et effacer uniquement les entrées préparées ancrées
sans toucher à létat ordinaire actif à court terme.
## Signaux de classement Deep
Le classement Deep utilise six signaux de base pondérés plus le renforcement de phase :
| Signal | Poids | Description |
| ------------------- | ------ | ------------------------------------------------- |
| Fréquence | 0.24 | Nombre de signaux de court terme accumulés par l'entrée |
| Pertinence | 0.30 | Qualité moyenne de récupération pour l'entrée |
| Diversité des requêtes | 0.15 | Contextes distincts de requête/jour qui l'ont fait émerger |
| Récence | 0.15 | Score de fraîcheur atténué dans le temps |
| Consolidation | 0.10 | Force de récurrence sur plusieurs jours |
| Richesse conceptuelle | 0.06 | Densité des balises de concept depuis l'extrait/le chemin |
| Signal | Poids | Description |
| ------------------- | ----- | ------------------------------------------------- |
| Fréquence | 0.24 | Nombre de signaux à court terme accumulés par lentrée |
| Pertinence | 0.30 | Qualité moyenne de récupération pour lentrée |
| Diversité des requêtes | 0.15 | Contextes distincts de requête/jour qui lont fait apparaître |
| Récence | 0.15 | Score de fraîcheur décroissant avec le temps |
| Consolidation | 0.10 | Force de récurrence sur plusieurs jours |
| Richesse conceptuelle | 0.06 | Densité des balises de concept à partir de lextrait/du chemin |
Les occurrences des phases Light et REM ajoutent un petit bonus atténué par la récence depuis
Les occurrences des phases Light et REM ajoutent un petit bonus décroissant avec le temps à partir de
`memory/.dreams/phase-signals.json`.
## Planification
Lorsqu'il est activé, `memory-core` gère automatiquement une tâche cron pour un balayage
complet de Dreaming. Chaque balayage exécute les phases dans l'ordre : light -> REM -> deep.
Lorsquil est activé, `memory-core` gère automatiquement une tâche Cron pour un cycle complet
de Dreaming. Chaque cycle exécute les phases dans lordre : light -> REM -> deep.
Comportement de cadence par défaut :
| Paramètre | Par défaut |
| -------------------- | ----------- |
| Paramètre | Par défaut |
| -------------------- | ---------- |
| `dreaming.frequency` | `0 3 * * *` |
## Démarrage rapide
@ -149,7 +153,7 @@ Activer Dreaming :
}
```
Activer Dreaming avec une cadence de balayage personnalisée :
Activer Dreaming avec une cadence de cycle personnalisée :
```json
{
@ -189,8 +193,8 @@ openclaw memory promote --limit 5
openclaw memory status --deep
```
La commande manuelle `memory promote` utilise par défaut les seuils de la phase Deep, sauf remplacement
par des drapeaux CLI.
La commande manuelle `memory promote` utilise par défaut les seuils de la phase Deep, sauf en cas de remplacement
par des indicateurs CLI.
Expliquer pourquoi un candidat spécifique serait ou ne serait pas promu :
@ -211,31 +215,31 @@ openclaw memory rem-harness --json
Tous les paramètres se trouvent sous `plugins.entries.memory-core.config.dreaming`.
| Clé | Par défaut |
| ----------- | ----------- |
| `enabled` | `false` |
| Clé | Par défaut |
| ----------- | ---------- |
| `enabled` | `false` |
| `frequency` | `0 3 * * *` |
La politique de phase, les seuils et le comportement de stockage sont des détails
d'implémentation internes (pas une configuration destinée à l'utilisateur).
La politique des phases, les seuils et le comportement de stockage sont des détails
dimplémentation internes (et non une configuration destinée aux utilisateurs).
Consultez la [référence de configuration de la mémoire](/fr/reference/memory-config#dreaming-experimental)
Voir la [référence de configuration Memory](/fr/reference/memory-config#dreaming-experimental)
pour la liste complète des clés.
## Interface Dreams
Lorsqu'il est activé, l'onglet **Dreams** de la passerelle affiche :
Lorsquil est activé, longlet **Dreams** du Gateway affiche :
- l'état actuel d'activation de Dreaming
- l'état au niveau des phases et la présence du balayage géré
- les comptes de court terme, fondés, de signaux et des promotions du jour
- l'heure de la prochaine exécution planifiée
- une voie de scène fondée distincte pour les entrées préparées issues de la relecture historique
- un lecteur de Journal des rêves extensible alimenté par `doctor.memory.dreamDiary`
- létat actuel dactivation de Dreaming
- le statut au niveau des phases et la présence dun cycle géré
- les nombres déléments à court terme, ancrés dans les faits, de signaux et promus aujourdhui
- lheure de la prochaine exécution planifiée
- une voie ancrée distincte dans la scène pour les entrées préparées issues dune relecture historique
- un lecteur de journal des rêves extensible alimenté par `doctor.memory.dreamDiary`
## Lié
- [Mémoire](/fr/concepts/memory)
- [Recherche dans la mémoire](/fr/concepts/memory-search)
- [Memory](/fr/concepts/memory)
- [Recherche Memory](/fr/concepts/memory-search)
- [CLI memory](/cli/memory)
- [Référence de configuration de la mémoire](/fr/reference/memory-config)
- [Référence de configuration Memory](/fr/reference/memory-config)

View File

@ -1,28 +1,28 @@
---
read_when:
- Vous souhaitez servir des modèles depuis votre propre machine GPU.
- Vous configurez LM Studio ou un proxy compatible OpenAI.
- Vous avez besoin des conseils les plus sûrs pour les modèles locaux.
summary: Exécutez OpenClaw sur des LLM locaux (LM Studio, vLLM, LiteLLM, points de terminaison OpenAI personnalisés)
- Vous voulez servir des modèles depuis votre propre machine GPU
- Vous configurez LM Studio ou un proxy compatible OpenAI
- Vous avez besoin des conseils les plus sûrs pour les modèles locaux
summary: Exécuter OpenClaw sur des LLM locaux (LM Studio, vLLM, LiteLLM, points de terminaison OpenAI personnalisés)
title: Modèles locaux
x-i18n:
generated_at: "2026-04-14T06:55:40Z"
generated_at: "2026-04-15T06:56:33Z"
model: gpt-5.4
provider: openai
source_hash: 1544c522357ba4b18dfa6d05ea8d60c7c6262281b53863d9aee7002464703ca7
source_hash: 8778cc1c623a356ff3cf306c494c046887f9417a70ec71e659e4a8aae912a780
source_path: gateway/local-models.md
workflow: 15
---
# Modèles locaux
Le local est possible, mais OpenClaw sattend à un contexte large ainsi quà de solides défenses contre linjection de prompt. Les petites cartes tronquent le contexte et affaiblissent la sécurité. Visez haut : **≥2 Mac Studios au maximum de leur capacité ou une machine GPU équivalente (~30 k$+)**. Un seul GPU de **24 Go** ne fonctionne que pour des prompts plus légers avec une latence plus élevée. Utilisez la **variante de modèle la plus grande / de taille complète que vous pouvez exécuter** ; les checkpoints fortement quantifiés ou « small » augmentent le risque dinjection de prompt (voir [Sécurité](/fr/gateway/security)).
Le local est possible, mais OpenClaw attend une grande fenêtre de contexte ainsi que de solides défenses contre linjection de prompt. Les petites cartes tronquent le contexte et affaiblissent la sécurité. Visez haut : **≥2 Mac Studio au maximum ou une machine GPU équivalente (~30 k$+)**. Un seul GPU de **24 Go** ne fonctionne que pour des prompts plus légers, avec une latence plus élevée. Utilisez la **variante de modèle la plus grande / pleine taille que vous puissiez exécuter** ; les checkpoints fortement quantifiés ou « petits » augmentent le risque dinjection de prompt (voir [Sécurité](/fr/gateway/security)).
Si vous voulez la configuration locale la plus simple, commencez par [LM Studio](/fr/providers/lmstudio) ou [Ollama](/fr/providers/ollama) et `openclaw onboard`. Cette page est le guide orienté recommandations pour les piles locales plus haut de gamme et les serveurs locaux personnalisés compatibles OpenAI.
Si vous voulez la configuration locale la plus simple, commencez par [LM Studio](/fr/providers/lmstudio) ou [Ollama](/fr/providers/ollama) et `openclaw onboard`. Cette page est le guide prescriptif pour les piles locales plus haut de gamme et les serveurs locaux personnalisés compatibles OpenAI.
## Recommandé : LM Studio + grand modèle local (API Responses)
La meilleure pile locale actuelle. Chargez un grand modèle dans LM Studio (par exemple, une version taille complète de Qwen, DeepSeek ou Llama), activez le serveur local (par défaut `http://127.0.0.1:1234`), et utilisez lAPI Responses pour séparer le raisonnement du texte final.
La meilleure pile locale actuelle. Chargez un grand modèle dans LM Studio (par exemple, une version pleine taille de Qwen, DeepSeek ou Llama), activez le serveur local (par défaut `http://127.0.0.1:1234`), et utilisez lAPI Responses pour séparer le raisonnement du texte final.
```json5
{
@ -59,16 +59,16 @@ La meilleure pile locale actuelle. Chargez un grand modèle dans LM Studio (par
}
```
**Liste de configuration**
**Liste de vérification de configuration**
- Installez LM Studio : [https://lmstudio.ai](https://lmstudio.ai)
- Dans LM Studio, téléchargez la **plus grande version de modèle disponible** (évitez les variantes « small » / fortement quantifiées), démarrez le serveur, et confirmez que `http://127.0.0.1:1234/v1/models` le liste.
- Dans LM Studio, téléchargez la **plus grande version de modèle disponible** (évitez les variantes « small » / fortement quantifiées), démarrez le serveur et confirmez que `http://127.0.0.1:1234/v1/models` le liste.
- Remplacez `my-local-model` par lID réel du modèle affiché dans LM Studio.
- Gardez le modèle chargé ; le chargement à froid ajoute de la latence au démarrage.
- Ajustez `contextWindow` / `maxTokens` si votre version de LM Studio diffère.
- Pour WhatsApp, restez sur lAPI Responses afin que seul le texte final soit envoyé.
Gardez les modèles hébergés configurés même lorsque vous exécutez du local ; utilisez `models.mode: "merge"` pour que des solutions de repli restent disponibles.
Conservez aussi des modèles hébergés configurés même lorsque vous exécutez en local ; utilisez `models.mode: "merge"` pour garder des solutions de repli disponibles.
### Configuration hybride : primaire hébergé, repli local
@ -113,16 +113,16 @@ Gardez les modèles hébergés configurés même lorsque vous exécutez du local
### Priorité au local avec filet de sécurité hébergé
Inversez lordre du primaire et du repli ; conservez le même bloc `providers` et `models.mode: "merge"` afin de pouvoir basculer vers Sonnet ou Opus lorsque la machine locale est indisponible.
Inversez lordre du primaire et des fallbacks ; conservez le même bloc `providers` et `models.mode: "merge"` afin de pouvoir revenir sur Sonnet ou Opus lorsque la machine locale est indisponible.
### Hébergement régional / routage des données
- Des variantes MiniMax/Kimi/GLM hébergées existent aussi sur OpenRouter avec des points de terminaison épinglés par région (par ex. hébergés aux États-Unis). Choisissez la variante régionale correspondante pour garder le trafic dans la juridiction de votre choix tout en utilisant `models.mode: "merge"` pour les replis Anthropic/OpenAI.
- Le tout-local reste la voie la plus forte pour la confidentialité ; le routage régional hébergé constitue un compromis lorsque vous avez besoin de fonctionnalités de fournisseur tout en voulant garder le contrôle sur le flux de données.
- Des variantes MiniMax/Kimi/GLM hébergées existent aussi sur OpenRouter avec des points de terminaison épinglés par région (par exemple, hébergés aux États-Unis). Choisissez-y la variante régionale pour conserver le trafic dans la juridiction de votre choix tout en utilisant `models.mode: "merge"` pour les fallbacks Anthropic/OpenAI.
- Le tout-local reste la meilleure option pour la confidentialité ; le routage régional hébergé est lentre-deux lorsque vous avez besoin de fonctionnalités fournisseur tout en gardant le contrôle du flux de données.
## Autres proxys locaux compatibles OpenAI
vLLM, LiteLLM, OAI-proxy ou des passerelles personnalisées fonctionnent sils exposent un point de terminaison `/v1` de style OpenAI. Remplacez le bloc provider ci-dessus par votre point de terminaison et lID de votre modèle :
vLLM, LiteLLM, OAI-proxy ou des Gateway personnalisés fonctionnent sils exposent un point de terminaison `/v1` de style OpenAI. Remplacez le bloc fournisseur ci-dessus par votre point de terminaison et lID de modèle :
```json5
{
@ -150,42 +150,30 @@ vLLM, LiteLLM, OAI-proxy ou des passerelles personnalisées fonctionnent sils
}
```
Conservez `models.mode: "merge"` pour que les modèles hébergés restent disponibles comme solutions de repli.
Conservez `models.mode: "merge"` afin que les modèles hébergés restent disponibles comme solutions de repli.
Remarque de comportement pour les backends `/v1` locaux / proxifiés :
Remarque de comportement pour les backends `/v1` locaux/proxifiés :
- OpenClaw les traite comme des routes de proxy compatibles OpenAI, et non comme des points de terminaison OpenAI natifs
- le façonnage de requête propre à OpenAI natif ne sapplique pas ici : pas de
`service_tier`, pas de `store` Responses, pas de façonnage de payload de compatibilité de raisonnement OpenAI,
et pas dindices de cache de prompt
- les en-têtes dattribution OpenClaw masqués (`originator`, `version`, `User-Agent`)
ne sont pas injectés sur ces URL de proxy personnalisées
- OpenClaw les traite comme des routes compatibles OpenAI de type proxy, et non comme des points de terminaison OpenAI natifs
- la mise en forme des requêtes propre à OpenAI natif ne sapplique pas ici : pas de `service_tier`, pas de `store` Responses, pas de mise en forme de payload de compatibilité de raisonnement OpenAI, et pas dindices de cache de prompt
- les en-têtes dattribution OpenClaw cachés (`originator`, `version`, `User-Agent`) ne sont pas injectés sur ces URL de proxy personnalisées
Remarques de compatibilité pour les backends compatibles OpenAI plus stricts :
Notes de compatibilité pour les backends compatibles OpenAI plus stricts :
- Certains serveurs nacceptent que `messages[].content` sous forme de chaîne sur Chat Completions, et non
des tableaux structurés de parties de contenu. Définissez
`models.providers.<provider>.models[].compat.requiresStringContent: true` pour
ces points de terminaison.
- Certains backends locaux plus petits ou plus stricts sont instables avec la forme complète
de prompt du runtime dagent dOpenClaw, en particulier lorsque des schémas doutils sont inclus. Si le
backend fonctionne pour de petits appels directs à `/v1/chat/completions` mais échoue sur des tours dagent
OpenClaw normaux, essayez dabord
`models.providers.<provider>.models[].compat.supportsTools: false`.
- Si le backend échoue toujours uniquement sur des exécutions OpenClaw plus volumineuses, le problème restant
provient généralement de la capacité du modèle/serveur en amont ou dun bug du backend, et non de la
couche de transport dOpenClaw.
- Certains serveurs nacceptent que `messages[].content` sous forme de chaîne sur Chat Completions, et non des tableaux structurés de parties de contenu. Définissez `models.providers.<provider>.models[].compat.requiresStringContent: true` pour ces points de terminaison.
- Certains backends locaux plus petits ou plus stricts sont instables avec la forme complète du prompt de lenvironnement dexécution agent dOpenClaw, en particulier lorsque des schémas doutils sont inclus. Si le backend fonctionne pour de petits appels directs `/v1/chat/completions` mais échoue sur des tours agent OpenClaw normaux, essayez dabord `agents.defaults.localModelMode: "lean"` pour supprimer les outils par défaut lourds comme `browser`, `cron` et `message` ; si cela échoue encore, essayez `models.providers.<provider>.models[].compat.supportsTools: false`.
- Si le backend échoue encore uniquement sur des exécutions OpenClaw plus importantes, le problème restant est généralement lié à la capacité du modèle/serveur en amont ou à un bug du backend, pas à la couche de transport dOpenClaw.
## Dépannage
- La Gateway peut atteindre le proxy ? `curl http://127.0.0.1:1234/v1/models`.
- Modèle LM Studio déchargé ? Rechargez-le ; le démarrage à froid est une cause fréquente de « blocage ».
- OpenClaw avertit lorsque la fenêtre de contexte détectée est inférieure à **32k** et bloque en dessous de **16k**. Si vous rencontrez ce précontrôle, augmentez la limite de contexte du serveur/modèle ou choisissez un modèle plus grand.
- Le Gateway peut-il atteindre le proxy ? `curl http://127.0.0.1:1234/v1/models`.
- Modèle LM Studio déchargé ? Rechargez-le ; un démarrage à froid est une cause fréquente de « blocage ».
- OpenClaw avertit lorsque la fenêtre de contexte détectée est inférieure à **32k** et bloque en dessous de **16k**. Si vous atteignez ce précontrôle, augmentez la limite de contexte du serveur/modèle ou choisissez un modèle plus grand.
- Erreurs de contexte ? Réduisez `contextWindow` ou augmentez la limite de votre serveur.
- Le serveur compatible OpenAI renvoie `messages[].content ... expected a string` ?
Ajoutez `compat.requiresStringContent: true` sur cette entrée de modèle.
- De petits appels directs à `/v1/chat/completions` fonctionnent, mais `openclaw infer model run`
- Les petits appels directs `/v1/chat/completions` fonctionnent, mais `openclaw infer model run`
échoue sur Gemma ou un autre modèle local ? Désactivez dabord les schémas doutils avec
`compat.supportsTools: false`, puis retestez. Si le serveur plante toujours uniquement
`compat.supportsTools: false`, puis testez à nouveau. Si le serveur plante encore uniquement
sur des prompts OpenClaw plus volumineux, considérez cela comme une limitation du serveur/modèle en amont.
- Sécurité : les modèles locaux contournent les filtres côté fournisseur ; gardez des agents limités dans leur portée et Compaction activé afin de limiter le rayon dimpact des injections de prompt.
- Sécurité : les modèles locaux contournent les filtres côté fournisseur ; gardez des agents limités et laissez Compaction activé pour limiter le rayon dimpact de linjection de prompt.

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -1,75 +1,74 @@
---
read_when:
- Vous créez un Plugin OpenClaw
- Vous devez livrer un schéma de configuration de Plugin ou déboguer des erreurs de validation de Plugin
summary: Manifeste de Plugin + exigences du schéma JSON (validation stricte de la configuration)
title: Manifeste de Plugin
- Vous devez livrer un schéma de configuration du Plugin ou déboguer les erreurs de validation du Plugin
summary: Exigences du manifeste du Plugin + schéma JSON (validation stricte de la configuration)
title: Manifeste du Plugin
x-i18n:
generated_at: "2026-04-12T23:28:44Z"
generated_at: "2026-04-15T06:56:44Z"
model: gpt-5.4
provider: openai
source_hash: 93b57c7373e4ccd521b10945346db67991543bd2bed4cc8b6641e1f215b48579
source_hash: ba2183bfa8802871e4ef33a0ebea290606e8351e9e83e25ee72456addb768730
source_path: plugins/manifest.md
workflow: 15
---
# Manifeste de Plugin (`openclaw.plugin.json`)
# Manifeste du Plugin (`openclaw.plugin.json`)
Cette page concerne uniquement le **manifeste de Plugin natif OpenClaw**.
Cette page concerne uniquement le **manifeste natif de Plugin OpenClaw**.
Pour les formats de bundles compatibles, voir [Plugin bundles](/fr/plugins/bundles).
Pour les dispositions de bundle compatibles, consultez [Plugin bundles](/fr/plugins/bundles).
Les formats de bundle compatibles utilisent des fichiers de manifeste différents :
Les formats de bundle compatibles utilisent des fichiers de manifeste différents :
- Bundle Codex : `.codex-plugin/plugin.json`
- Bundle Claude : `.claude-plugin/plugin.json` ou la disposition par défaut des composants Claude
sans manifeste
- Bundle Cursor : `.cursor-plugin/plugin.json`
- Bundle Codex : `.codex-plugin/plugin.json`
- Bundle Claude : `.claude-plugin/plugin.json` ou la disposition de composant Claude
par défaut sans manifeste
- Bundle Cursor : `.cursor-plugin/plugin.json`
OpenClaw détecte automatiquement ces dispositions de bundle également, mais elles ne sont pas validées
par rapport au schéma `openclaw.plugin.json` décrit ici.
Pour les bundles compatibles, OpenClaw lit actuellement les métadonnées du bundle ainsi que les racines de
Skills déclarées, les racines de commandes Claude, les valeurs par défaut `settings.json` des bundles Claude,
les valeurs par défaut LSP des bundles Claude, et les packs de hooks pris en charge lorsque la disposition correspond
aux attentes du runtime OpenClaw.
Skills déclarées, les racines de commandes Claude, les valeurs par défaut de `settings.json` du bundle Claude,
les valeurs par défaut LSP du bundle Claude, et les packs de hooks pris en charge lorsque la disposition correspond
aux attentes dexécution dOpenClaw.
Chaque Plugin natif OpenClaw **doit** fournir un fichier `openclaw.plugin.json` à la
Chaque Plugin OpenClaw natif **doit** fournir un fichier `openclaw.plugin.json` dans la
**racine du Plugin**. OpenClaw utilise ce manifeste pour valider la configuration
**sans exécuter le code du Plugin**. Les manifestes manquants ou invalides sont traités comme
**sans exécuter le code du Plugin**. Les manifestes absents ou invalides sont traités comme
des erreurs de Plugin et bloquent la validation de la configuration.
Voir le guide complet du système de Plugins : [Plugins](/fr/tools/plugin).
Pour le modèle natif de capacités et les recommandations actuelles de compatibilité externe :
[Capability model](/fr/plugins/architecture#public-capability-model).
Consultez le guide complet du système de Plugin : [Plugins](/fr/tools/plugin).
Pour le modèle natif de capacités et les recommandations actuelles de compatibilité externe :
[Modèle de capacités](/fr/plugins/architecture#public-capability-model).
## Rôle de ce fichier
## À quoi sert ce fichier
`openclaw.plugin.json` correspond aux métadonnées quOpenClaw lit avant de charger le
`openclaw.plugin.json` est la métadonnée quOpenClaw lit avant de charger le
code de votre Plugin.
Utilisez-le pour :
Utilisez-le pour :
- lidentité du Plugin
- la validation de la configuration
- les métadonnées dauthentification et donboarding qui doivent être disponibles sans démarrer le runtime du Plugin
- les indications dactivation peu coûteuses que les surfaces du plan de contrôle peuvent inspecter avant le chargement du runtime
- les descripteurs de configuration peu coûteux que les surfaces de configuration/onboarding peuvent inspecter avant le chargement du runtime
- les métadonnées dalias et dactivation automatique qui doivent être résolues avant le chargement du runtime du Plugin
- les métadonnées abrégées de propriété de famille de modèles qui doivent auto-activer le
Plugin avant le chargement du runtime
- les instantanés statiques de propriété de capacités utilisés pour le câblage de compatibilité intégré et la couverture des contrats
- les métadonnées de configuration spécifiques aux canaux qui doivent être fusionnées dans les surfaces de catalogue et de validation
sans charger le runtime
- les indications dinterface utilisateur pour la configuration
- les métadonnées dauthentification et donboarding qui doivent être disponibles sans démarrer lenvironnement dexécution du Plugin
- les indications dactivation peu coûteuses que les surfaces du plan de contrôle peuvent inspecter avant le chargement de lenvironnement dexécution
- les descripteurs de configuration peu coûteux que les surfaces de configuration/onboarding peuvent inspecter avant le chargement de lenvironnement dexécution
- les métadonnées dalias et dactivation automatique qui doivent être résolues avant le chargement de lenvironnement dexécution du Plugin
- les métadonnées abrégées de propriété de famille de modèles qui doivent auto-activer le Plugin avant le chargement de lenvironnement dexécution
- les instantanés statiques de propriété des capacités utilisés pour le câblage de compatibilité intégré et la couverture des contrats
- les métadonnées peu coûteuses de lexécuteur QA que lhôte partagé `openclaw qa` peut inspecter avant le chargement de lenvironnement dexécution du Plugin
- les métadonnées de configuration spécifiques aux canaux qui doivent être fusionnées dans les surfaces de catalogue et de validation sans charger lenvironnement dexécution
- les indications dinterface pour la configuration
Ne lutilisez pas pour :
Ne lutilisez pas pour :
- enregistrer le comportement du runtime
- enregistrer un comportement dexécution
- déclarer des points dentrée de code
- les métadonnées dinstallation npm
Ces éléments relèvent de votre code de Plugin et de `package.json`.
Ces éléments appartiennent à votre code de Plugin et à `package.json`.
## Exemple minimal
@ -84,7 +83,7 @@ Ces éléments relèvent de votre code de Plugin et de `package.json`.
}
```
## Exemple enrichi
## Exemple complet
```json
{
@ -111,19 +110,19 @@ Ces éléments relèvent de votre code de Plugin et de `package.json`.
"provider": "openrouter",
"method": "api-key",
"choiceId": "openrouter-api-key",
"choiceLabel": "Clé dAPI OpenRouter",
"choiceLabel": "Clé API OpenRouter",
"groupId": "openrouter",
"groupLabel": "OpenRouter",
"optionKey": "openrouterApiKey",
"cliFlag": "--openrouter-api-key",
"cliOption": "--openrouter-api-key <key>",
"cliDescription": "Clé dAPI OpenRouter",
"cliDescription": "Clé API OpenRouter",
"onboardingScopes": ["text-inference"]
}
],
"uiHints": {
"apiKey": {
"label": "Clé dAPI",
"label": "Clé API",
"placeholder": "sk-or-v1-...",
"sensitive": true
}
@ -140,64 +139,65 @@ Ces éléments relèvent de votre code de Plugin et de `package.json`.
}
```
## Référence des champs de premier niveau
## Référence des champs de niveau supérieur
| Field | Required | Type | What it means |
| ----------------------------------- | -------- | -------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
| `id` | Yes | `string` | ID canonique du Plugin. Il sagit de lID utilisé dans `plugins.entries.<id>`. |
| `configSchema` | Yes | `object` | Schéma JSON inline pour la configuration de ce Plugin. |
| `enabledByDefault` | No | `true` | Marque un Plugin intégré comme activé par défaut. Omettez-le, ou définissez toute valeur autre que `true`, pour laisser le Plugin désactivé par défaut. |
| `legacyPluginIds` | No | `string[]` | IDs hérités qui se normalisent vers cet ID canonique de Plugin. |
| `autoEnableWhenConfiguredProviders` | No | `string[]` | IDs de fournisseurs qui doivent auto-activer ce Plugin lorsque lauthentification, la configuration ou les références de modèle les mentionnent. |
| `kind` | No | `"memory"` \| `"context-engine"` | Déclare un type de Plugin exclusif utilisé par `plugins.slots.*`. |
| `channels` | No | `string[]` | IDs de canaux détenus par ce Plugin. Utilisés pour la découverte et la validation de configuration. |
| `providers` | No | `string[]` | IDs de fournisseurs détenus par ce Plugin. |
| `modelSupport` | No | `object` | Métadonnées abrégées, détenues par le manifeste, sur les familles de modèles, utilisées pour charger automatiquement le Plugin avant le runtime. |
| `cliBackends` | No | `string[]` | IDs de backends dinférence CLI détenus par ce Plugin. Utilisés pour lauto-activation au démarrage à partir de références de configuration explicites. |
| `commandAliases` | No | `object[]` | Noms de commandes détenus par ce Plugin qui doivent produire une configuration sensible au Plugin et des diagnostics CLI avant le chargement du runtime. |
| `providerAuthEnvVars` | No | `Record<string, string[]>` | Métadonnées denvironnement dauthentification fournisseur peu coûteuses quOpenClaw peut inspecter sans charger le code du Plugin. |
| `providerAuthAliases` | No | `Record<string, string>` | IDs de fournisseurs qui doivent réutiliser un autre ID de fournisseur pour la recherche dauthentification, par exemple un fournisseur de code qui partage la clé dAPI et les profils dauthentification du fournisseur de base. |
| `channelEnvVars` | No | `Record<string, string[]>` | Métadonnées denvironnement de canal peu coûteuses quOpenClaw peut inspecter sans charger le code du Plugin. Utilisez-les pour les surfaces de configuration ou dauthentification de canaux pilotées par lenvironnement que les helpers génériques de démarrage/configuration doivent voir. |
| `providerAuthChoices` | No | `object[]` | Métadonnées de choix dauthentification peu coûteuses pour les sélecteurs donboarding, la résolution du fournisseur préféré et le câblage simple des flags CLI. |
| `activation` | No | `object` | Indications dactivation peu coûteuses pour le chargement déclenché par fournisseur, commande, canal, route et capacité. Métadonnées uniquement ; le runtime du Plugin reste propriétaire du comportement réel. |
| `setup` | No | `object` | Descripteurs de configuration/onboarding peu coûteux que les surfaces de découverte et de configuration peuvent inspecter sans charger le runtime du Plugin. |
| `contracts` | No | `object` | Instantané statique des capacités intégrées pour la parole, la transcription temps réel, la voix temps réel, la compréhension des médias, la génération dimages, la génération musicale, la génération vidéo, la récupération web, la recherche web et la propriété des outils. |
| `channelConfigs` | No | `Record<string, object>` | Métadonnées de configuration de canal détenues par le manifeste, fusionnées dans les surfaces de découverte et de validation avant le chargement du runtime. |
| `skills` | No | `string[]` | Répertoires de Skills à charger, relatifs à la racine du Plugin. |
| `name` | No | `string` | Nom de Plugin lisible par un humain. |
| `description` | No | `string` | Bref résumé affiché dans les surfaces du Plugin. |
| `version` | No | `string` | Version informative du Plugin. |
| `uiHints` | No | `Record<string, object>` | Libellés dinterface, placeholders et indications de sensibilité pour les champs de configuration. |
| Champ | Obligatoire | Type | Signification |
| ----------------------------------- | ----------- | -------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
| `id` | Oui | `string` | ID canonique du Plugin. Cest lID utilisé dans `plugins.entries.<id>`. |
| `configSchema` | Oui | `object` | Schéma JSON inline pour la configuration de ce Plugin. |
| `enabledByDefault` | Non | `true` | Marque un Plugin intégré comme activé par défaut. Omettez-le, ou définissez une valeur autre que `true`, pour laisser le Plugin désactivé par défaut. |
| `legacyPluginIds` | Non | `string[]` | IDs hérités qui se normalisent vers cet ID canonique de Plugin. |
| `autoEnableWhenConfiguredProviders` | Non | `string[]` | IDs de fournisseurs qui doivent auto-activer ce Plugin lorsque lauthentification, la configuration ou les références de modèles les mentionnent. |
| `kind` | Non | `"memory"` \| `"context-engine"` | Déclare un type exclusif de Plugin utilisé par `plugins.slots.*`. |
| `channels` | Non | `string[]` | IDs de canaux détenus par ce Plugin. Utilisés pour la découverte et la validation de la configuration. |
| `providers` | Non | `string[]` | IDs de fournisseurs détenus par ce Plugin. |
| `modelSupport` | Non | `object` | Métadonnées abrégées de famille de modèles détenues par le manifeste et utilisées pour charger automatiquement le Plugin avant lenvironnement dexécution. |
| `cliBackends` | Non | `string[]` | IDs de backend dinférence CLI détenus par ce Plugin. Utilisés pour lauto-activation au démarrage à partir de références de configuration explicites. |
| `commandAliases` | Non | `object[]` | Noms de commandes détenus par ce Plugin qui doivent produire une configuration et des diagnostics CLI tenant compte du Plugin avant le chargement de lenvironnement dexécution. |
| `providerAuthEnvVars` | Non | `Record<string, string[]>` | Métadonnées denvironnement dauthentification du fournisseur, peu coûteuses, quOpenClaw peut inspecter sans charger le code du Plugin. |
| `providerAuthAliases` | Non | `Record<string, string>` | IDs de fournisseurs qui doivent réutiliser un autre ID de fournisseur pour la recherche dauthentification, par exemple un fournisseur de codage qui partage la clé API et les profils dauthentification du fournisseur de base. |
| `channelEnvVars` | Non | `Record<string, string[]>` | Métadonnées denvironnement de canal, peu coûteuses, quOpenClaw peut inspecter sans charger le code du Plugin. Utilisez ceci pour les surfaces de configuration ou dauthentification de canal pilotées par lenvironnement que les helpers génériques de démarrage/configuration doivent voir. |
| `providerAuthChoices` | Non | `object[]` | Métadonnées de choix dauthentification peu coûteuses pour les sélecteurs donboarding, la résolution du fournisseur préféré et le câblage simple des flags CLI. |
| `activation` | Non | `object` | Indications dactivation peu coûteuses pour le chargement déclenché par des fournisseurs, commandes, canaux, routes et capacités. Métadonnées uniquement ; lenvironnement dexécution du Plugin reste responsable du comportement réel. |
| `setup` | Non | `object` | Descripteurs de configuration/onboarding peu coûteux que les surfaces de découverte et de configuration peuvent inspecter sans charger lenvironnement dexécution du Plugin. |
| `qaRunners` | Non | `object[]` | Descripteurs dexécuteurs QA peu coûteux utilisés par lhôte partagé `openclaw qa` avant le chargement de lenvironnement dexécution du Plugin. |
| `contracts` | Non | `object` | Instantané statique des capacités intégrées pour la parole, la transcription en temps réel, la voix en temps réel, la compréhension des médias, la génération dimages, la génération de musique, la génération de vidéo, la récupération web, la recherche web et la propriété des outils. |
| `channelConfigs` | Non | `Record<string, object>` | Métadonnées de configuration de canal détenues par le manifeste et fusionnées dans les surfaces de découverte et de validation avant le chargement de lenvironnement dexécution. |
| `skills` | Non | `string[]` | Répertoires de Skills à charger, relatifs à la racine du Plugin. |
| `name` | Non | `string` | Nom lisible du Plugin. |
| `description` | Non | `string` | Résumé court affiché dans les surfaces du Plugin. |
| `version` | Non | `string` | Version informative du Plugin. |
| `uiHints` | Non | `Record<string, object>` | Libellés dinterface, espaces réservés et indications de sensibilité pour les champs de configuration. |
## Référence `providerAuthChoices`
## Référence de `providerAuthChoices`
Chaque entrée `providerAuthChoices` décrit un choix donboarding ou dauthentification.
OpenClaw lit cela avant le chargement du runtime du fournisseur.
Chaque entrée de `providerAuthChoices` décrit un choix donboarding ou dauthentification.
OpenClaw lit cela avant le chargement de lenvironnement dexécution du fournisseur.
| Champ | Obligatoire | Type | Ce que cela signifie |
| --------------------- | ----------- | ----------------------------------------------- | ------------------------------------------------------------------------------------------------------ |
| `provider` | Oui | `string` | ID du fournisseur auquel ce choix appartient. |
| `method` | Oui | `string` | ID de méthode dauthentification vers lequel router. |
| `choiceId` | Oui | `string` | ID de choix dauthentification stable utilisé par les flux donboarding et de CLI. |
| `choiceLabel` | Non | `string` | Libellé destiné à lutilisateur. Sil est omis, OpenClaw utilise `choiceId` comme valeur de repli. |
| `choiceHint` | Non | `string` | Court texte daide pour le sélecteur. |
| `assistantPriority` | Non | `number` | Les valeurs les plus basses sont triées plus tôt dans les sélecteurs interactifs pilotés par lassistant. |
| `assistantVisibility` | Non | `"visible"` \| `"manual-only"` | Masque ce choix dans les sélecteurs de lassistant tout en autorisant sa sélection manuelle en CLI. |
| `deprecatedChoiceIds` | Non | `string[]` | IDs de choix hérités qui doivent rediriger les utilisateurs vers ce choix de remplacement. |
| `groupId` | Non | `string` | ID de groupe facultatif pour regrouper des choix liés. |
| `groupLabel` | Non | `string` | Libellé destiné à lutilisateur pour ce groupe. |
| `groupHint` | Non | `string` | Court texte daide pour le groupe. |
| `optionKey` | Non | `string` | Clé doption interne pour les flux dauthentification simples à un seul flag. |
| `cliFlag` | Non | `string` | Nom du flag CLI, par exemple `--openrouter-api-key`. |
| `cliOption` | Non | `string` | Forme complète de loption CLI, par exemple `--openrouter-api-key <key>`. |
| `cliDescription` | Non | `string` | Description utilisée dans laide CLI. |
| Champ | Obligatoire | Type | Signification |
| --------------------- | ----------- | ----------------------------------------------- | ---------------------------------------------------------------------------------------------------------- |
| `provider` | Oui | `string` | ID du fournisseur auquel ce choix appartient. |
| `method` | Oui | `string` | ID de la méthode dauthentification vers laquelle répartir. |
| `choiceId` | Oui | `string` | ID stable de choix dauthentification utilisé par les flux donboarding et CLI. |
| `choiceLabel` | Non | `string` | Libellé destiné à lutilisateur. Sil est omis, OpenClaw utilise `choiceId` comme repli. |
| `choiceHint` | Non | `string` | Court texte daide pour le sélecteur. |
| `assistantPriority` | Non | `number` | Les valeurs plus faibles sont triées plus tôt dans les sélecteurs interactifs pilotés par lassistant. |
| `assistantVisibility` | Non | `"visible"` \| `"manual-only"` | Masque ce choix dans les sélecteurs de lassistant tout en autorisant la sélection manuelle via la CLI. |
| `deprecatedChoiceIds` | Non | `string[]` | IDs hérités de choix qui doivent rediriger les utilisateurs vers ce choix de remplacement. |
| `groupId` | Non | `string` | ID de groupe facultatif pour regrouper des choix liés. |
| `groupLabel` | Non | `string` | Libellé destiné à lutilisateur pour ce groupe. |
| `groupHint` | Non | `string` | Court texte daide pour le groupe. |
| `optionKey` | Non | `string` | Clé doption interne pour les flux dauthentification simples à un seul flag. |
| `cliFlag` | Non | `string` | Nom du flag CLI, tel que `--openrouter-api-key`. |
| `cliOption` | Non | `string` | Forme complète de loption CLI, telle que `--openrouter-api-key <key>`. |
| `cliDescription` | Non | `string` | Description utilisée dans laide CLI. |
| `onboardingScopes` | Non | `Array<"text-inference" \| "image-generation">` | Sur quelles surfaces donboarding ce choix doit apparaître. Sil est omis, la valeur par défaut est `["text-inference"]`. |
## Référence `commandAliases`
## Référence de `commandAliases`
Utilisez `commandAliases` lorsquun Plugin possède un nom de commande runtime que les utilisateurs peuvent
mettre par erreur dans `plugins.allow` ou essayer dexécuter comme commande CLI racine. OpenClaw
utilise ces métadonnées pour les diagnostics sans importer le code runtime du Plugin.
Utilisez `commandAliases` lorsquun Plugin possède un nom de commande dexécution que les utilisateurs peuvent
mettre par erreur dans `plugins.allow` ou essayer dexécuter comme une commande CLI racine. OpenClaw
utilise ces métadonnées pour les diagnostics sans importer le code dexécution du Plugin.
```json
{
@ -211,22 +211,44 @@ utilise ces métadonnées pour les diagnostics sans importer le code runtime du
}
```
| Champ | Obligatoire | Type | Ce que cela signifie |
| ------------ | ----------- | ----------------- | ----------------------------------------------------------------------- |
| `name` | Oui | `string` | Nom de commande appartenant à ce Plugin. |
| Champ | Obligatoire | Type | Signification |
| ------------ | ----------- | ----------------- | --------------------------------------------------------------------------------- |
| `name` | Oui | `string` | Nom de commande qui appartient à ce Plugin. |
| `kind` | Non | `"runtime-slash"` | Marque lalias comme une commande slash de chat plutôt quune commande CLI racine. |
| `cliCommand` | Non | `string` | Commande CLI racine associée à suggérer pour les opérations CLI, si elle existe. |
| `cliCommand` | Non | `string` | Commande CLI racine associée à suggérer pour les opérations CLI, si elle existe. |
## Référence `activation`
## Référence de `activation`
Utilisez `activation` lorsque le Plugin peut déclarer à faible coût quels événements du plan de contrôle
doivent lactiver ultérieurement.
doivent lactiver plus tard.
Ce bloc contient uniquement des métadonnées. Il nenregistre pas le comportement runtime, et il
ne remplace pas `register(...)`, `setupEntry` ni les autres points dentrée runtime/Plugin.
Les consommateurs actuels lutilisent comme indication de restriction avant un chargement plus large des Plugins, donc
labsence de métadonnées dactivation ne coûte généralement que des performances ; elle ne doit pas
modifier le comportement tant que les replis hérités de propriété du manifeste existent encore.
## Référence de `qaRunners`
Utilisez `qaRunners` lorsquun Plugin contribue à un ou plusieurs exécuteurs de transport sous la racine partagée
`openclaw qa`. Gardez ces métadonnées simples et statiques ; lenvironnement dexécution du Plugin reste responsable de lenregistrement CLI réel via une surface légère
`runtime-api.ts` qui exporte `qaRunnerCliRegistrations`.
```json
{
"qaRunners": [
{
"commandName": "matrix",
"description": "Exécuter la voie QA Matrix en direct, adossée à Docker, sur un homeserver jetable"
}
]
}
```
| Champ | Obligatoire | Type | Signification |
| ------------- | ----------- | -------- | ------------------------------------------------------------------- |
| `commandName` | Oui | `string` | Sous-commande montée sous `openclaw qa`, par exemple `matrix`. |
| `description` | Non | `string` | Texte daide de repli utilisé lorsque lhôte partagé a besoin dune commande factice. |
Ce bloc contient uniquement des métadonnées. Il nenregistre pas de comportement dexécution et
ne remplace pas `register(...)`, `setupEntry` ni dautres points dentrée dexécution/de Plugin.
Les consommateurs actuels lutilisent comme un indice de filtrage avant un chargement plus large du Plugin, donc
labsence de métadonnées dactivation na généralement quun coût de performance ; elle ne devrait pas
modifier la correction tant que les replis hérités de propriété du manifeste existent encore.
```json
{
@ -240,27 +262,28 @@ modifier le comportement tant que les replis hérités de propriété du manifes
}
```
| Champ | Obligatoire | Type | Ce que cela signifie |
| ---------------- | ----------- | ---------------------------------------------------- | ------------------------------------------------------------------- |
| Champ | Obligatoire | Type | Signification |
| ---------------- | ----------- | ---------------------------------------------------- | ----------------------------------------------------------------- |
| `onProviders` | Non | `string[]` | IDs de fournisseurs qui doivent activer ce Plugin lorsquils sont demandés. |
| `onCommands` | Non | `string[]` | IDs de commandes qui doivent activer ce Plugin. |
| `onChannels` | Non | `string[]` | IDs de canaux qui doivent activer ce Plugin. |
| `onRoutes` | Non | `string[]` | Types de routes qui doivent activer ce Plugin. |
| `onCapabilities` | Non | `Array<"provider" \| "channel" \| "tool" \| "hook">` | Indications générales de capacité utilisées par la planification dactivation du plan de contrôle. |
| `onCommands` | Non | `string[]` | IDs de commandes qui doivent activer ce Plugin. |
| `onChannels` | Non | `string[]` | IDs de canaux qui doivent activer ce Plugin. |
| `onRoutes` | Non | `string[]` | Types de routes qui doivent activer ce Plugin. |
| `onCapabilities` | Non | `Array<"provider" \| "channel" \| "tool" \| "hook">` | Indications générales de capacités utilisées par la planification dactivation du plan de contrôle. |
Consommateurs actifs actuels :
Consommateurs actifs actuels :
- la planification CLI déclenchée par commande revient au comportement hérité
- la planification CLI déclenchée par commande utilise comme repli
`commandAliases[].cliCommand` ou `commandAliases[].name`
- la planification de configuration/canal déclenchée par canal revient à la propriété héritée `channels[]`
lorsque les métadonnées explicites dactivation de canal sont absentes
- la planification de configuration/runtime déclenchée par fournisseur revient à la propriété héritée
`providers[]` et au `cliBackends[]` de premier niveau lorsque les métadonnées explicites dactivation de fournisseur sont absentes
- la planification de configuration/de canal déclenchée par canal utilise comme repli la propriété héritée `channels[]`
lorsquil manque des métadonnées explicites dactivation de canal
- la planification de configuration/dexécution déclenchée par fournisseur utilise comme repli la propriété héritée
`providers[]` et la propriété de niveau supérieur `cliBackends[]` lorsque des métadonnées explicites dactivation
de fournisseur sont absentes
## Référence `setup`
## Référence de `setup`
Utilisez `setup` lorsque les surfaces de configuration et donboarding ont besoin de métadonnées peu coûteuses, détenues par le Plugin,
avant le chargement du runtime.
Utilisez `setup` lorsque les surfaces de configuration et donboarding ont besoin de métadonnées de Plugin, simples et détenues par le Plugin,
avant le chargement de lenvironnement dexécution.
```json
{
@ -279,47 +302,48 @@ avant le chargement du runtime.
}
```
Le `cliBackends` de premier niveau reste valide et continue de décrire les
backends dinférence CLI. `setup.cliBackends` est la surface de descripteur spécifique à la configuration pour
les flux du plan de contrôle/configuration qui doivent rester limités aux métadonnées.
Le `cliBackends` de niveau supérieur reste valide et continue de décrire les
backends dinférence CLI. `setup.cliBackends` est la surface de descripteur spécifique à la configuration pour les
flux de configuration/plan de contrôle qui doivent rester uniquement basés sur des métadonnées.
Lorsquils sont présents, `setup.providers` et `setup.cliBackends` sont la surface
de recherche privilégiée, dabord fondée sur le descripteur, pour la découverte de configuration. Si le descripteur ne fait
que restreindre le Plugin candidat et que la configuration a encore besoin de hooks runtime plus riches au moment de la configuration,
Lorsquils sont présents, `setup.providers` et `setup.cliBackends` constituent la
surface privilégiée, dabord basée sur des descripteurs, pour la découverte de la configuration. Si le descripteur se contente uniquement
de restreindre le Plugin candidat et que la configuration a encore besoin de hooks dexécution plus riches au moment de la configuration,
définissez `requiresRuntime: true` et conservez `setup-api` comme
chemin dexécution de repli.
Étant donné que la recherche de configuration peut exécuter du code `setup-api` détenu par le Plugin, les valeurs
normalisées de `setup.providers[].id` et `setup.cliBackends[]` doivent rester uniques parmi
les Plugins découverts. Une propriété ambiguë échoue de manière conservatrice au lieu de choisir un gagnant selon lordre de découverte.
Comme la recherche de configuration peut exécuter du code `setup-api` détenu par le Plugin,
les valeurs normalisées `setup.providers[].id` et `setup.cliBackends[]` doivent rester uniques parmi tous les
Plugins découverts. Une propriété ambiguë échoue de manière fermée au lieu de choisir un
gagnant selon lordre de découverte.
### Référence `setup.providers`
### Référence de `setup.providers`
| Champ | Obligatoire | Type | Ce que cela signifie |
| ------------- | ----------- | ---------- | ----------------------------------------------------------------------------------------- |
| Champ | Obligatoire | Type | Signification |
| ------------- | ----------- | ---------- | ------------------------------------------------------------------------------------ |
| `id` | Oui | `string` | ID du fournisseur exposé pendant la configuration ou lonboarding. Gardez les IDs normalisés globalement uniques. |
| `authMethods` | Non | `string[]` | IDs des méthodes de configuration/authentification que ce fournisseur prend en charge sans charger le runtime complet. |
| `envVars` | Non | `string[]` | Variables denvironnement que les surfaces génériques de configuration/statut peuvent vérifier avant le chargement du runtime du Plugin. |
| `authMethods` | Non | `string[]` | IDs de méthodes de configuration/authentification que ce fournisseur prend en charge sans charger lenvironnement dexécution complet. |
| `envVars` | Non | `string[]` | Variables denvironnement que les surfaces génériques de configuration/statut peuvent vérifier avant le chargement de lenvironnement dexécution du Plugin. |
### Champs `setup`
### Champs de `setup`
| Champ | Obligatoire | Type | Ce que cela signifie |
| ------------------ | ----------- | ---------- | --------------------------------------------------------------------------------------------------------- |
| `providers` | Non | `object[]` | Descripteurs de configuration de fournisseurs exposés pendant la configuration et lonboarding. |
| `cliBackends` | Non | `string[]` | IDs de backends au moment de la configuration utilisés pour la recherche de configuration fondée dabord sur le descripteur. Gardez les IDs normalisés globalement uniques. |
| `configMigrations` | Non | `string[]` | IDs de migrations de configuration détenus par la surface de configuration de ce Plugin. |
| `requiresRuntime` | Non | `boolean` | Indique si la configuration nécessite encore lexécution de `setup-api` après la recherche par descripteur. |
| Champ | Obligatoire | Type | Signification |
| ------------------ | ----------- | ---------- | --------------------------------------------------------------------------------------------------- |
| `providers` | Non | `object[]` | Descripteurs de configuration du fournisseur exposés pendant la configuration et lonboarding. |
| `cliBackends` | Non | `string[]` | IDs de backend au moment de la configuration utilisés pour une recherche de configuration dabord basée sur des descripteurs. Gardez les IDs normalisés globalement uniques. |
| `configMigrations` | Non | `string[]` | IDs de migration de configuration détenus par la surface de configuration de ce Plugin. |
| `requiresRuntime` | Non | `boolean` | Indique si la configuration a encore besoin de lexécution de `setup-api` après la recherche par descripteur. |
## Référence `uiHints`
## Référence de `uiHints`
`uiHints` est une map reliant les noms de champs de configuration à de petites indications daffichage.
`uiHints` est une correspondance entre les noms de champs de configuration et de petites indications de rendu.
```json
{
"uiHints": {
"apiKey": {
"label": "API key",
"help": "Used for OpenRouter requests",
"label": "Clé API",
"help": "Utilisée pour les requêtes OpenRouter",
"placeholder": "sk-or-v1-...",
"sensitive": true
}
@ -327,21 +351,21 @@ les Plugins découverts. Une propriété ambiguë échoue de manière conservatr
}
```
Chaque indication de champ peut inclure :
Chaque indication de champ peut inclure :
| Champ | Type | Ce que cela signifie |
| ------------- | ---------- | ----------------------------------------- |
| Champ | Type | Signification |
| ------------- | ---------- | --------------------------------------- |
| `label` | `string` | Libellé du champ destiné à lutilisateur. |
| `help` | `string` | Court texte daide. |
| `tags` | `string[]` | Tags dinterface facultatifs. |
| `advanced` | `boolean` | Marque le champ comme avancé. |
| `help` | `string` | Court texte daide. |
| `tags` | `string[]` | Tags dinterface facultatifs. |
| `advanced` | `boolean` | Marque le champ comme avancé. |
| `sensitive` | `boolean` | Marque le champ comme secret ou sensible. |
| `placeholder` | `string` | Texte dexemple pour les champs de formulaire. |
| `placeholder` | `string` | Texte despace réservé pour les champs de formulaire. |
## Référence `contracts`
## Référence de `contracts`
Utilisez `contracts` uniquement pour les métadonnées statiques de propriété de capacités quOpenClaw peut
lire sans importer le runtime du Plugin.
lire sans importer lenvironnement dexécution du Plugin.
```json
{
@ -359,24 +383,24 @@ lire sans importer le runtime du Plugin.
}
```
Chaque liste est facultative :
Chaque liste est facultative :
| Champ | Type | Ce que cela signifie |
| -------------------------------- | ---------- | ------------------------------------------------------------ |
| `speechProviders` | `string[]` | IDs de fournisseurs de parole détenus par ce Plugin. |
| `realtimeTranscriptionProviders` | `string[]` | IDs de fournisseurs de transcription temps réel détenus par ce Plugin. |
| `realtimeVoiceProviders` | `string[]` | IDs de fournisseurs de voix temps réel détenus par ce Plugin. |
| Champ | Type | Signification |
| -------------------------------- | ---------- | --------------------------------------------------------------- |
| `speechProviders` | `string[]` | IDs de fournisseurs de parole détenus par ce Plugin. |
| `realtimeTranscriptionProviders` | `string[]` | IDs de fournisseurs de transcription en temps réel détenus par ce Plugin. |
| `realtimeVoiceProviders` | `string[]` | IDs de fournisseurs de voix en temps réel détenus par ce Plugin. |
| `mediaUnderstandingProviders` | `string[]` | IDs de fournisseurs de compréhension des médias détenus par ce Plugin. |
| `imageGenerationProviders` | `string[]` | IDs de fournisseurs de génération dimages détenus par ce Plugin. |
| `videoGenerationProviders` | `string[]` | IDs de fournisseurs de génération vidéo détenus par ce Plugin. |
| `webFetchProviders` | `string[]` | IDs de fournisseurs de récupération web détenus par ce Plugin. |
| `webSearchProviders` | `string[]` | IDs de fournisseurs de recherche web détenus par ce Plugin. |
| `videoGenerationProviders` | `string[]` | IDs de fournisseurs de génération de vidéo détenus par ce Plugin. |
| `webFetchProviders` | `string[]` | IDs de fournisseurs de récupération web détenus par ce Plugin. |
| `webSearchProviders` | `string[]` | IDs de fournisseurs de recherche web détenus par ce Plugin. |
| `tools` | `string[]` | Noms doutils dagent détenus par ce Plugin pour les vérifications de contrat intégrées. |
## Référence `channelConfigs`
## Référence de `channelConfigs`
Utilisez `channelConfigs` lorsquun Plugin de canal a besoin de métadonnées de configuration peu coûteuses avant
le chargement du runtime.
Utilisez `channelConfigs` lorsquun Plugin de canal a besoin de métadonnées de configuration simples avant
le chargement de lenvironnement dexécution.
```json
{
@ -391,7 +415,7 @@ le chargement du runtime.
},
"uiHints": {
"homeserverUrl": {
"label": "Homeserver URL",
"label": "URL du homeserver",
"placeholder": "https://matrix.example.com"
}
},
@ -403,20 +427,20 @@ le chargement du runtime.
}
```
Chaque entrée de canal peut inclure :
Chaque entrée de canal peut inclure :
| Champ | Type | Ce que cela signifie |
| ------------- | ------------------------ | ------------------------------------------------------------------------------------- |
| `schema` | `object` | Schéma JSON pour `channels.<id>`. Obligatoire pour chaque entrée déclarée de configuration de canal. |
| `uiHints` | `Record<string, object>` | Libellés/placeholders/indications de sensibilité dinterface facultatifs pour cette section de configuration de canal. |
| `label` | `string` | Libellé du canal fusionné dans les surfaces de sélection et dinspection lorsque les métadonnées runtime ne sont pas prêtes. |
| `description` | `string` | Courte description du canal pour les surfaces dinspection et de catalogue. |
| `preferOver` | `string[]` | IDs de Plugins hérités ou de priorité inférieure que ce canal doit devancer dans les surfaces de sélection. |
| Champ | Type | Signification |
| ------------- | ------------------------ | ------------------------------------------------------------------------------------------ |
| `schema` | `object` | Schéma JSON pour `channels.<id>`. Obligatoire pour chaque entrée de configuration de canal déclarée. |
| `uiHints` | `Record<string, object>` | Libellés dinterface, espaces réservés et indications de sensibilité facultatifs pour cette section de configuration du canal. |
| `label` | `string` | Libellé du canal fusionné dans les surfaces de sélection et dinspection lorsque les métadonnées dexécution ne sont pas prêtes. |
| `description` | `string` | Courte description du canal pour les surfaces dinspection et de catalogue. |
| `preferOver` | `string[]` | IDs de Plugin hérités ou de priorité inférieure que ce canal doit surpasser dans les surfaces de sélection. |
## Référence `modelSupport`
## Référence de `modelSupport`
Utilisez `modelSupport` lorsquOpenClaw doit déduire votre Plugin fournisseur à partir de
raccourcis dID de modèles comme `gpt-5.4` ou `claude-sonnet-4.6` avant le chargement du runtime du Plugin.
Utilisez `modelSupport` lorsquOpenClaw doit déduire votre Plugin fournisseur à partir
dIDs abrégés de modèle comme `gpt-5.4` ou `claude-sonnet-4.6` avant le chargement de lenvironnement dexécution du Plugin.
```json
{
@ -427,76 +451,75 @@ raccourcis dID de modèles comme `gpt-5.4` ou `claude-sonnet-4.6` avant le ch
}
```
OpenClaw applique lordre de priorité suivant :
OpenClaw applique cette priorité :
- les références explicites `provider/model` utilisent les métadonnées de manifeste `providers` du propriétaire
- `modelPatterns` a priorité sur `modelPrefixes`
- `modelPatterns` lemporte sur `modelPrefixes`
- si un Plugin non intégré et un Plugin intégré correspondent tous deux, le Plugin non intégré
lemporte
- toute ambiguïté restante est ignorée jusquà ce que lutilisateur ou la configuration spécifie un fournisseur
- les ambiguïtés restantes sont ignorées jusquà ce que lutilisateur ou la configuration spécifie un fournisseur
Champs :
Champs :
| Champ | Type | Ce que cela signifie |
| --------------- | ---------- | ------------------------------------------------------------------------- |
| `modelPrefixes` | `string[]` | Préfixes comparés avec `startsWith` aux IDs abrégés de modèles. |
| `modelPatterns` | `string[]` | Sources regex comparées aux IDs abrégés de modèles après suppression du suffixe de profil. |
| Champ | Type | Signification |
| --------------- | ---------- | -------------------------------------------------------------------------------- |
| `modelPrefixes` | `string[]` | Préfixes comparés avec `startsWith` aux IDs abrégés de modèle. |
| `modelPatterns` | `string[]` | Sources regex comparées aux IDs abrégés de modèle après suppression du suffixe de profil. |
Les clés de capacité héritées de premier niveau sont obsolètes. Utilisez `openclaw doctor --fix` pour
Les clés de capacités héritées au niveau supérieur sont obsolètes. Utilisez `openclaw doctor --fix` pour
déplacer `speechProviders`, `realtimeTranscriptionProviders`,
`realtimeVoiceProviders`, `mediaUnderstandingProviders`,
`imageGenerationProviders`, `videoGenerationProviders`,
`webFetchProviders` et `webSearchProviders` sous `contracts` ; le
chargement normal du manifeste ne traite plus ces champs de premier niveau comme
une propriété de capacité.
`webFetchProviders` et `webSearchProviders` sous `contracts` ; le chargement normal du
manifeste ne traite plus ces champs de niveau supérieur comme une
propriété de capacité.
## Manifeste versus `package.json`
## Manifeste versus package.json
Les deux fichiers remplissent des rôles différents :
Les deux fichiers remplissent des rôles différents :
| Fichier | À utiliser pour |
| ---------------------- | --------------------------------------------------------------------------------------------------------------------------------- |
| `openclaw.plugin.json` | Découverte, validation de configuration, métadonnées de choix dauthentification et indications dinterface qui doivent exister avant lexécution du code du Plugin |
| `package.json` | Métadonnées npm, installation des dépendances et bloc `openclaw` utilisé pour les points dentrée, le filtrage dinstallation, la configuration ou les métadonnées de catalogue |
| Fichier | Utilisation |
| ---------------------- | ------------------------------------------------------------------------------------------------------------------------------------ |
| `openclaw.plugin.json` | Découverte, validation de la configuration, métadonnées de choix dauthentification et indications dinterface qui doivent exister avant lexécution du code du Plugin |
| `package.json` | Métadonnées npm, installation des dépendances et bloc `openclaw` utilisé pour les points dentrée, le contrôle dinstallation, la configuration ou les métadonnées de catalogue |
Si vous ne savez pas où placer une métadonnée, utilisez cette règle :
Si vous ne savez pas où placer une métadonnée, utilisez cette règle :
- si OpenClaw doit la connaître avant de charger le code du Plugin, placez-la dans `openclaw.plugin.json`
- si elle concerne le packaging, les fichiers dentrée ou le comportement dinstallation npm, placez-la dans `package.json`
- si elle concerne le packaging, les fichiers de point dentrée ou le comportement dinstallation npm, placez-la dans `package.json`
### Champs `package.json` qui affectent la découverte
### Champs de package.json qui affectent la découverte
Certaines métadonnées de Plugin avant runtime vivent volontairement dans `package.json` sous le
bloc `openclaw` plutôt que dans `openclaw.plugin.json`.
Certaines métadonnées de Plugin avant exécution vivent intentionnellement dans `package.json` sous le
bloc `openclaw` au lieu de `openclaw.plugin.json`.
Exemples importants :
Exemples importants :
| Champ | Ce que cela signifie |
| ----------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------- |
| `openclaw.extensions` | Déclare les points dentrée de Plugins natifs. |
| `openclaw.setupEntry` | Point dentrée léger réservé à la configuration, utilisé pendant lonboarding et le démarrage différé des canaux. |
| `openclaw.channel` | Métadonnées légères de catalogue de canal comme les libellés, chemins de documentation, alias et texte de sélection. |
| `openclaw.channel.configuredState` | Métadonnées légères du vérificateur détat configuré qui peuvent répondre à « une configuration uniquement via env existe-t-elle déjà ? » sans charger le runtime complet du canal. |
| `openclaw.channel.persistedAuthState` | Métadonnées légères du vérificateur dauthentification persistée qui peuvent répondre à « y a-t-il déjà quelque chose de connecté ? » sans charger le runtime complet du canal. |
| `openclaw.install.npmSpec` / `openclaw.install.localPath` | Indications dinstallation/mise à jour pour les Plugins intégrés et publiés externement. |
| `openclaw.install.defaultChoice` | Chemin dinstallation préféré lorsque plusieurs sources dinstallation sont disponibles. |
| `openclaw.install.minHostVersion` | Version minimale prise en charge de lhôte OpenClaw, avec un plancher semver comme `>=2026.3.22`. |
| `openclaw.install.allowInvalidConfigRecovery` | Autorise un chemin de récupération de réinstallation étroit pour un Plugin intégré lorsque la configuration est invalide. |
| `openclaw.startup.deferConfiguredChannelFullLoadUntilAfterListen` | Permet aux surfaces de canal réservées à la configuration de se charger avant le Plugin de canal complet au démarrage. |
| Champ | Signification |
| ----------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------- |
| `openclaw.extensions` | Déclare les points dentrée de Plugin natifs. |
| `openclaw.setupEntry` | Point dentrée léger, réservé à la configuration, utilisé pendant lonboarding et le démarrage différé des canaux. |
| `openclaw.channel` | Métadonnées simples de catalogue de canal, comme les libellés, chemins de documentation, alias et texte de sélection. |
| `openclaw.channel.configuredState` | Métadonnées légères du vérificateur détat configuré pouvant répondre à « une configuration uniquement par variables denvironnement existe-t-elle déjà ? » sans charger lenvironnement dexécution complet du canal. |
| `openclaw.channel.persistedAuthState` | Métadonnées légères du vérificateur dauthentification persistée pouvant répondre à « quelque chose est-il déjà connecté ? » sans charger lenvironnement dexécution complet du canal. |
| `openclaw.install.npmSpec` / `openclaw.install.localPath` | Indications dinstallation/mise à jour pour les Plugins intégrés et publiés en externe. |
| `openclaw.install.defaultChoice` | Chemin dinstallation préféré lorsque plusieurs sources dinstallation sont disponibles. |
| `openclaw.install.minHostVersion` | Version minimale prise en charge de lhôte OpenClaw, en utilisant un plancher semver comme `>=2026.3.22`. |
| `openclaw.install.allowInvalidConfigRecovery` | Autorise un chemin de récupération étroit pour la réinstallation dun Plugin intégré lorsque la configuration est invalide. |
| `openclaw.startup.deferConfiguredChannelFullLoadUntilAfterListen` | Permet aux surfaces de canal réservées à la configuration de se charger avant le Plugin de canal complet au démarrage. |
`openclaw.install.minHostVersion` est appliqué pendant linstallation et le
chargement du registre de manifestes. Les valeurs invalides sont rejetées ; les valeurs valides mais plus récentes ignorent le
`openclaw.install.minHostVersion` est appliqué pendant linstallation et le chargement du registre de manifestes. Les valeurs invalides sont rejetées ; les valeurs valides mais plus récentes ignorent le
Plugin sur les hôtes plus anciens.
`openclaw.install.allowInvalidConfigRecovery` est volontairement limité. Il
ne rend pas installables des configurations arbitrairement cassées. Aujourdhui, il permet seulement aux flux dinstallation
de récupérer à partir de certaines pannes obsolètes de mise à niveau dun Plugin intégré, comme un
`openclaw.install.allowInvalidConfigRecovery` est intentionnellement étroit. Il
ne rend pas arbitrairement installables des configurations cassées. Aujourdhui, il permet seulement aux flux dinstallation
de récupérer à partir déchecs spécifiques de mise à niveau dun Plugin intégré devenu obsolète, comme un
chemin de Plugin intégré manquant ou une entrée `channels.<id>` obsolète pour ce même
Plugin intégré. Les erreurs de configuration non liées bloquent toujours linstallation et redirigent les opérateurs
Plugin intégré. Les erreurs de configuration non liées bloquent toujours linstallation et envoient les opérateurs
vers `openclaw doctor --fix`.
`openclaw.channel.persistedAuthState` est une métadonnée de package pour un minuscule
module de vérification :
`openclaw.channel.persistedAuthState` est une métadonnée de package pour un petit
module de vérification :
```json
{
@ -512,13 +535,13 @@ module de vérification :
}
```
Utilisez-le lorsque les flux de configuration, de doctor ou détat configuré ont besoin dune
vérification dauthentification oui/non peu coûteuse avant le chargement du Plugin de canal complet. Lexport cible doit être une petite
fonction qui lit uniquement létat persisté ; ne le faites pas transiter par le barrel runtime complet du
Utilisez-le lorsque les flux de configuration, doctor ou détat configuré ont besoin dune
vérification simple oui/non de lauthentification avant le chargement du Plugin de canal complet. Lexport ciblé doit être une petite
fonction qui lit uniquement létat persisté ; ne la faites pas transiter par le barrel complet de lenvironnement dexécution du
canal.
`openclaw.channel.configuredState` suit la même structure pour des vérifications peu coûteuses
de létat configuré uniquement via env :
`openclaw.channel.configuredState` suit la même forme pour des vérifications simples détat
configuré uniquement basées sur lenvironnement :
```json
{
@ -534,9 +557,10 @@ de létat configuré uniquement via env :
}
```
Utilisez-le lorsquun canal peut répondre à létat configuré à partir de lenv ou dautres petites
entrées hors runtime. Si la vérification nécessite la résolution complète de la configuration ou le véritable
runtime du canal, conservez plutôt cette logique dans le hook `config.hasConfiguredState` du Plugin.
Utilisez-le lorsquun canal peut répondre à létat configuré à partir de variables denvironnement ou dautres petites
entrées hors environnement dexécution. Si la vérification nécessite une résolution complète de la configuration ou le véritable
environnement dexécution du canal, conservez cette logique dans le hook `config.hasConfiguredState`
du Plugin à la place.
## Exigences du schéma JSON
@ -549,49 +573,49 @@ runtime du canal, conservez plutôt cette logique dans le hook `config.hasConfig
- Les clés inconnues dans `channels.*` sont des **erreurs**, sauf si lID de canal est déclaré par
un manifeste de Plugin.
- `plugins.entries.<id>`, `plugins.allow`, `plugins.deny` et `plugins.slots.*`
doivent référencer des IDs de Plugin **détectables**. Les IDs inconnus sont des **erreurs**.
doivent référencer des IDs de Plugin **découvrables**. Les IDs inconnus sont des **erreurs**.
- Si un Plugin est installé mais possède un manifeste ou un schéma cassé ou manquant,
la validation échoue et Doctor signale lerreur du Plugin.
- Si une configuration de Plugin existe mais que le Plugin est **désactivé**, la configuration est conservée et
un **avertissement** apparaît dans Doctor et dans les journaux.
un **avertissement** est remonté dans Doctor + les journaux.
Voir [Configuration reference](/fr/gateway/configuration) pour le schéma complet `plugins.*`.
Consultez [Référence de configuration](/fr/gateway/configuration) pour le schéma complet de `plugins.*`.
## Remarques
- Le manifeste est **obligatoire pour les Plugins natifs OpenClaw**, y compris pour les chargements depuis le système de fichiers local.
- Le runtime charge toujours le module du Plugin séparément ; le manifeste sert uniquement à la
- Le manifeste est **obligatoire pour les Plugins OpenClaw natifs**, y compris les chargements depuis le système de fichiers local.
- Lenvironnement dexécution charge toujours le module du Plugin séparément ; le manifeste sert uniquement à la
découverte + validation.
- Les manifestes natifs sont analysés avec JSON5, donc les commentaires, les virgules finales et les
clés non entre guillemets sont acceptés tant que la valeur finale reste un objet.
clés non entre guillemets sont acceptés tant que la valeur finale reste bien un objet.
- Seuls les champs de manifeste documentés sont lus par le chargeur de manifeste. Évitez dajouter
ici des clés personnalisées de premier niveau.
- `providerAuthEnvVars` est le chemin de métadonnées peu coûteux pour les sondes dauthentification, la
validation des marqueurs denvironnement et les surfaces similaires dauthentification fournisseur qui ne doivent pas démarrer le runtime du Plugin
ici des clés personnalisées au niveau supérieur.
- `providerAuthEnvVars` est le chemin de métadonnées simple pour les sondes dauthentification, la
validation des marqueurs de variables denvironnement et les surfaces similaires dauthentification de fournisseur
qui ne doivent pas démarrer lenvironnement dexécution du Plugin uniquement pour inspecter les noms de variables denvironnement.
- `providerAuthAliases` permet à des variantes de fournisseur de réutiliser les variables denvironnement dauthentification,
les profils dauthentification, lauthentification adossée à la configuration et le choix donboarding par clé API
dun autre fournisseur sans coder en dur cette relation dans le cœur.
- `channelEnvVars` est le chemin de métadonnées simple pour le repli basé sur les variables denvironnement du shell, les invites de configuration
et les surfaces de canal similaires qui ne doivent pas démarrer lenvironnement dexécution du Plugin
uniquement pour inspecter les noms de variables denvironnement.
- `providerAuthAliases` permet à des variantes de fournisseurs de réutiliser les variables denvironnement dauthentification
dun autre fournisseur, ses profils dauthentification, son authentification adossée à la configuration et son choix
donboarding par clé dAPI sans coder cette relation en dur dans le cœur.
- `channelEnvVars` est le chemin de métadonnées peu coûteux pour le repli via lenvironnement shell, les invites de configuration
et les surfaces de canal similaires qui ne doivent pas démarrer le runtime du Plugin
uniquement pour inspecter les noms de variables denvironnement.
- `providerAuthChoices` est le chemin de métadonnées peu coûteux pour les sélecteurs de choix dauthentification,
la résolution de `--auth-choice`, le mapping du fournisseur préféré et lenregistrement simple de flags CLI
donboarding avant le chargement du runtime du fournisseur. Pour les métadonnées dassistant runtime
qui nécessitent le code du fournisseur, voir
[Provider runtime hooks](/fr/plugins/architecture#provider-runtime-hooks).
- Les types de Plugin exclusifs sont sélectionnés via `plugins.slots.*`.
- `providerAuthChoices` est le chemin de métadonnées simple pour les sélecteurs de choix dauthentification,
la résolution de `--auth-choice`, la correspondance avec le fournisseur préféré et lenregistrement simple des flags CLI
donboarding avant le chargement de lenvironnement dexécution du fournisseur. Pour les métadonnées dassistant dexécution
qui nécessitent du code fournisseur, consultez
[Hooks dexécution de fournisseur](/fr/plugins/architecture#provider-runtime-hooks).
- Les types exclusifs de Plugin sont sélectionnés via `plugins.slots.*`.
- `kind: "memory"` est sélectionné par `plugins.slots.memory`.
- `kind: "context-engine"` est sélectionné par `plugins.slots.contextEngine`
(par défaut : `legacy` intégré).
(par défaut : `legacy` intégré).
- `channels`, `providers`, `cliBackends` et `skills` peuvent être omis lorsquun
Plugin nen a pas besoin.
- Si votre Plugin dépend de modules natifs, documentez les étapes de build et toute
- Si votre Plugin dépend de modules natifs, documentez les étapes de build ainsi que toute
exigence de liste dautorisation du gestionnaire de paquets (par exemple, pnpm `allow-build-scripts`
- `pnpm rebuild <package>`).
## Connexe
## Lié
- [Building Plugins](/fr/plugins/building-plugins) — prise en main des Plugins
- [Plugin Architecture](/fr/plugins/architecture) — architecture interne
- [SDK Overview](/fr/plugins/sdk-overview) — référence du SDK de Plugin
- [Créer des Plugins](/fr/plugins/building-plugins) — bien démarrer avec les Plugins
- [Architecture des Plugins](/fr/plugins/architecture) — architecture interne
- [Vue densemble du SDK](/fr/plugins/sdk-overview) — référence du SDK de Plugin

View File

@ -1,104 +1,110 @@
---
read_when:
- Vous créez un nouveau plugin de canal de messagerie
- Vous souhaitez connecter OpenClaw à une plateforme de messagerie
- Vous devez comprendre la surface dadaptation `ChannelPlugin`
- Vous créez un nouveau Plugin de canal de messagerie.
- Vous souhaitez connecter OpenClaw à une plateforme de messagerie.
- Vous devez comprendre la surface dadaptation de `ChannelPlugin`
sidebarTitle: Channel Plugins
summary: Guide étape par étape pour créer un plugin de canal de messagerie pour OpenClaw
title: Créer des plugins de canal
summary: Guide étape par étape pour créer un Plugin de canal de messagerie pour OpenClaw
title: Créer des Plugins de canal
x-i18n:
generated_at: "2026-04-11T02:46:17Z"
generated_at: "2026-04-15T06:56:34Z"
model: gpt-5.4
provider: openai
source_hash: 8a026e924f9ae8a3ddd46287674443bcfccb0247be504261522b078e1f440aef
source_hash: a7f4c746fe3163a8880e14c433f4db4a1475535d91716a53fb879551d8d62f65
source_path: plugins/sdk-channel-plugins.md
workflow: 15
---
# Créer des plugins de canal
# Créer des Plugins de canal
Ce guide vous accompagne dans la création dun plugin de canal qui connecte OpenClaw à une
plateforme de messagerie. À la fin, vous disposerez dun canal fonctionnel avec sécurité des DM,
appairage, threading des réponses, et messagerie sortante.
Ce guide explique comment créer un Plugin de canal qui connecte OpenClaw à une
plateforme de messagerie. À la fin, vous disposerez dun canal fonctionnel avec la sécurité des DM,
lappairage, le fil des réponses et la messagerie sortante.
<Info>
Si vous navez encore créé aucun plugin OpenClaw, lisez dabord
Si vous navez encore créé aucun Plugin OpenClaw, lisez dabord
[Getting Started](/fr/plugins/building-plugins) pour la structure de package
de base et la configuration du manifeste.
</Info>
## Fonctionnement des plugins de canal
## Fonctionnement des Plugins de canal
Les plugins de canal nont pas besoin de leurs propres outils send/edit/react. OpenClaw conserve un
outil `message` partagé dans le core. Votre plugin possède :
Les Plugins de canal nont pas besoin de leurs propres outils denvoi/modification/réaction. OpenClaw conserve un
outil `message` partagé dans le cœur. Votre Plugin gère :
- **Config** — résolution des comptes et assistant de configuration
- **Security** — politique DM et listes dautorisation
- **Pairing** — flux dapprobation des DM
- **Session grammar** — manière dont les ids de conversation propres au fournisseur se mappent aux chats de base, aux ids de thread, et aux fallbacks parents
- **Outbound** — envoi de texte, médias, et sondages vers la plateforme
- **Threading** — manière dont les réponses sont threadées
- **Configuration** — résolution de compte et assistant de configuration
- **Sécurité** — politique DM et listes dautorisation
- **Appairage** — flux dapprobation des DM
- **Grammaire de session** — comment les identifiants de conversation propres au fournisseur sont mappés vers les discussions de base, les identifiants de fil et les solutions de repli parent
- **Sortant** — envoi de texte, de médias et de sondages vers la plateforme
- **Fil des réponses** — comment les réponses sont organisées en fil
Le core possède loutil message partagé, le câblage des prompts, la forme externe de la clé de session,
la gestion générique `:thread:`, et la répartition.
Le cœur gère loutil de message partagé, le câblage des prompts, la forme externe de la clé de session,
la gestion générique `:thread:` et la distribution.
Si votre plateforme stocke une portée supplémentaire dans les ids de conversation, conservez cette analyse
dans le plugin avec `messaging.resolveSessionConversation(...)`. Cest le hook canonique pour mapper
`rawId` vers lid de conversation de base, lid de thread optionnel, `baseConversationId` explicite,
et tout `parentConversationCandidates`.
Lorsque vous renvoyez `parentConversationCandidates`, gardez-les ordonnés du parent
le plus étroit vers la conversation parente/la conversation de base la plus large.
Si votre canal ajoute des paramètres doutil de message qui transportent des sources média, exposez ces
noms de paramètres via `describeMessageTool(...).mediaSourceParams`. Le cœur utilise
cette liste explicite pour la normalisation des chemins du sandbox et la politique
daccès aux médias sortants, afin que les Plugins naient pas besoin de cas particuliers dans le cœur partagé pour des
paramètres spécifiques au fournisseur comme lavatar, la pièce jointe ou limage de couverture.
Préférez renvoyer une map indexée par action comme
`{ "set-profile": ["avatarUrl", "avatarPath"] }` afin que des actions sans lien nhéritent pas des arguments média dune autre action. Un tableau plat fonctionne aussi pour des paramètres
volontairement partagés par chaque action exposée.
Les plugins intégrés qui ont besoin de la même analyse avant le démarrage du registre de canaux
peuvent aussi exposer un fichier `session-key-api.ts` de premier niveau avec un export
`resolveSessionConversation(...)` correspondant. Le core utilise cette surface sûre au bootstrap
uniquement lorsque le registre de plugins runtime nest pas encore disponible.
Si votre plateforme stocke une portée supplémentaire dans les identifiants de conversation, conservez cette analyse
dans le Plugin avec `messaging.resolveSessionConversation(...)`. Cest le
hook canonique pour mapper `rawId` vers lidentifiant de conversation de base, lidentifiant de fil optionnel,
`baseConversationId` explicite, et tout `parentConversationCandidates`.
Lorsque vous renvoyez `parentConversationCandidates`, conservez leur ordre du
parent le plus spécifique vers la conversation parente la plus large/de base.
`messaging.resolveParentConversationCandidates(...)` reste disponible comme fallback de compatibilité
hérité lorsquun plugin na besoin que de fallbacks parents au-dessus de lid générique/brut.
Si les deux hooks existent, le core utilise dabord
`resolveSessionConversation(...).parentConversationCandidates` et ne retombe sur
`resolveParentConversationCandidates(...)` que lorsque le hook canonique
Les Plugins groupés qui ont besoin de la même analyse avant le démarrage du registre des canaux
peuvent aussi exposer un fichier de premier niveau `session-key-api.ts` avec un
export `resolveSessionConversation(...)` correspondant. Le cœur utilise cette surface sûre au démarrage
uniquement lorsque le registre de Plugin dexécution nest pas encore disponible.
`messaging.resolveParentConversationCandidates(...)` reste disponible comme solution de repli de compatibilité héritée lorsquun Plugin na besoin de solutions de repli parent quau-dessus de lidentifiant générique/brut. Si les deux hooks existent, le cœur utilise
dabord `resolveSessionConversation(...).parentConversationCandidates` et ne
revient à `resolveParentConversationCandidates(...)` que lorsque le hook canonique
les omet.
## Approbations et capacités des canaux
## Approbations et capacités de canal
La plupart des plugins de canal nont pas besoin de code spécifique aux approbations.
La plupart des Plugins de canal nont pas besoin de code spécifique aux approbations.
- Le core possède `/approve` dans le même chat, les payloads partagés des boutons dapprobation, et la livraison de fallback générique.
- Préférez un seul objet `approvalCapability` sur le plugin de canal lorsque le canal a besoin dun comportement spécifique aux approbations.
- `ChannelPlugin.approvals` est supprimé. Placez les faits dapprobation de livraison/natifs/rendu/authentification sur `approvalCapability`.
- `plugin.auth` sert uniquement à login/logout ; le core ne lit plus les hooks dauthentification dapprobation depuis cet objet.
- `approvalCapability.authorizeActorAction` et `approvalCapability.getActionAvailabilityState` sont la couture canonique pour lauthentification des approbations.
- Utilisez `approvalCapability.getActionAvailabilityState` pour la disponibilité de lauthentification des approbations dans le même chat.
- Si votre canal expose des approbations dexécution natives, utilisez `approvalCapability.getExecInitiatingSurfaceState` pour létat de la surface initiatrice/du client natif lorsquil diffère de lauthentification des approbations dans le même chat. Le core utilise ce hook spécifique à lexécution pour distinguer `enabled` de `disabled`, décider si le canal initiateur prend en charge les approbations dexécution natives, et inclure le canal dans les indications de fallback du client natif. `createApproverRestrictedNativeApprovalCapability(...)` remplit ce point pour le cas courant.
- Utilisez `outbound.shouldSuppressLocalPayloadPrompt` ou `outbound.beforeDeliverPayload` pour le comportement du cycle de vie des payloads spécifique au canal, par exemple masquer les prompts dapprobation locale en double ou envoyer des indicateurs de frappe avant la livraison.
- Utilisez `approvalCapability.delivery` uniquement pour le routage dapprobation natif ou la suppression de fallback.
- Utilisez `approvalCapability.nativeRuntime` pour les faits dapprobation native appartenant au canal. Gardez-le lazy sur les points dentrée chauds du canal avec `createLazyChannelApprovalNativeRuntimeAdapter(...)`, qui peut importer votre module runtime à la demande tout en laissant le core assembler le cycle de vie des approbations.
- Utilisez `approvalCapability.render` uniquement lorsquun canal a réellement besoin de payloads dapprobation personnalisés au lieu du moteur de rendu partagé.
- Utilisez `approvalCapability.describeExecApprovalSetup` lorsque le canal veut que la réponse du chemin désactivé explique les paramètres de configuration exacts nécessaires pour activer les approbations dexécution natives. Le hook reçoit `{ channel, channelLabel, accountId }` ; les canaux à compte nommé doivent afficher des chemins à portée de compte tels que `channels.<channel>.accounts.<id>.execApprovals.*` au lieu de valeurs par défaut de niveau supérieur.
- Si un canal peut déduire des identités DM stables de type propriétaire à partir de la configuration existante, utilisez `createResolvedApproverActionAuthAdapter` depuis `openclaw/plugin-sdk/approval-runtime` pour restreindre `/approve` dans le même chat sans ajouter de logique core spécifique aux approbations.
- Si un canal a besoin dune livraison dapprobation native, gardez le code du canal centré sur la normalisation de la cible ainsi que sur les faits de transport/présentation. Utilisez `createChannelExecApprovalProfile`, `createChannelNativeOriginTargetResolver`, `createChannelApproverDmTargetResolver`, et `createApproverRestrictedNativeApprovalCapability` depuis `openclaw/plugin-sdk/approval-runtime`. Placez les faits spécifiques au canal derrière `approvalCapability.nativeRuntime`, idéalement via `createChannelApprovalNativeRuntimeAdapter(...)` ou `createLazyChannelApprovalNativeRuntimeAdapter(...)`, afin que le core puisse assembler le gestionnaire et posséder le filtrage des requêtes, le routage, la déduplication, lexpiration, labonnement gateway, et les avis « routed elsewhere ». `nativeRuntime` est divisé en quelques coutures plus petites :
- Le cœur gère `/approve` dans la même discussion, les charges utiles de bouton dapprobation partagées et la livraison de repli générique.
- Préférez un seul objet `approvalCapability` sur le Plugin de canal lorsque le canal a besoin dun comportement spécifique aux approbations.
- `ChannelPlugin.approvals` est supprimé. Placez les informations de livraison/rendu/authentification natives de lapprobation dans `approvalCapability`.
- `plugin.auth` concerne uniquement login/logout ; le cœur ne lit plus les hooks dauthentification des approbations depuis cet objet.
- `approvalCapability.authorizeActorAction` et `approvalCapability.getActionAvailabilityState` constituent la jonction canonique pour lauthentification des approbations.
- Utilisez `approvalCapability.getActionAvailabilityState` pour la disponibilité de lauthentification des approbations dans la même discussion.
- Si votre canal expose des approbations dexécution natives, utilisez `approvalCapability.getExecInitiatingSurfaceState` pour létat de la surface initiatrice/du client natif lorsquil diffère de lauthentification des approbations dans la même discussion. Le cœur utilise ce hook spécifique à exec pour distinguer `enabled` de `disabled`, déterminer si le canal initiateur prend en charge les approbations dexécution natives, et inclure le canal dans les indications de repli du client natif. `createApproverRestrictedNativeApprovalCapability(...)` remplit ce rôle pour le cas courant.
- Utilisez `outbound.shouldSuppressLocalPayloadPrompt` ou `outbound.beforeDeliverPayload` pour le comportement spécifique au canal dans le cycle de vie des charges utiles, par exemple masquer les invites locales dapprobation en double ou envoyer des indicateurs de saisie avant la livraison.
- Utilisez `approvalCapability.delivery` uniquement pour le routage des approbations natives ou la suppression du repli.
- Utilisez `approvalCapability.nativeRuntime` pour les informations dapprobation native gérées par le canal. Gardez-le paresseux sur les points dentrée chauds du canal avec `createLazyChannelApprovalNativeRuntimeAdapter(...)`, qui peut importer votre module dexécution à la demande tout en permettant au cœur dassembler le cycle de vie de lapprobation.
- Utilisez `approvalCapability.render` uniquement lorsquun canal a réellement besoin de charges utiles dapprobation personnalisées au lieu du moteur de rendu partagé.
- Utilisez `approvalCapability.describeExecApprovalSetup` lorsque le canal souhaite que la réponse du chemin désactivé explique les paramètres de configuration exacts nécessaires pour activer les approbations dexécution natives. Le hook reçoit `{ channel, channelLabel, accountId }` ; les canaux à comptes nommés doivent afficher des chemins à portée de compte tels que `channels.<channel>.accounts.<id>.execApprovals.*` au lieu de valeurs par défaut de premier niveau.
- Si un canal peut déduire des identités DM stables de type propriétaire à partir de la configuration existante, utilisez `createResolvedApproverActionAuthAdapter` depuis `openclaw/plugin-sdk/approval-runtime` pour restreindre `/approve` dans la même discussion sans ajouter de logique du cœur spécifique aux approbations.
- Si un canal a besoin dune livraison dapprobation native, faites en sorte que le code du canal reste centré sur la normalisation de la cible ainsi que sur les informations de transport/de présentation. Utilisez `createChannelExecApprovalProfile`, `createChannelNativeOriginTargetResolver`, `createChannelApproverDmTargetResolver` et `createApproverRestrictedNativeApprovalCapability` depuis `openclaw/plugin-sdk/approval-runtime`. Placez les informations spécifiques au canal derrière `approvalCapability.nativeRuntime`, idéalement via `createChannelApprovalNativeRuntimeAdapter(...)` ou `createLazyChannelApprovalNativeRuntimeAdapter(...)`, afin que le cœur puisse assembler le gestionnaire et gérer lui-même le filtrage des requêtes, le routage, la déduplication, lexpiration, labonnement Gateway et les avis de routage externe. `nativeRuntime` est divisé en quelques jonctions plus petites :
- `availability` — si le compte est configuré et si une requête doit être traitée
- `presentation` — mapper le modèle de vue dapprobation partagé en payloads natifs en attente/résolus/expirés ou en actions finales
- `transport` — préparer les cibles plus envoyer/mettre à jour/supprimer les messages dapprobation natifs
- `interactions` — hooks optionnels de bind/unbind/clear-action pour les boutons ou réactions natifs
- `observe` — hooks optionnels de diagnostic de livraison
- Si le canal a besoin dobjets possédés par le runtime comme un client, un jeton, une app Bolt, ou un récepteur webhook, enregistrez-les via `openclaw/plugin-sdk/channel-runtime-context`. Le registre générique de contexte runtime permet au core de bootstrapper des gestionnaires pilotés par capacité à partir de létat de démarrage du canal sans ajouter de glue wrapper spécifique aux approbations.
- Recourez à `createChannelApprovalHandler` ou `createChannelNativeApprovalRuntime` de niveau inférieur uniquement lorsque la couture pilotée par capacité nest pas encore assez expressive.
- Les canaux dapprobation native doivent router à la fois `accountId` et `approvalKind` via ces helpers. `accountId` conserve la portée de la politique dapprobation multi-comptes sur le bon compte bot, et `approvalKind` conserve le comportement dapprobation dexécution vs plugin disponible pour le canal sans branches codées en dur dans le core.
- Le core possède désormais aussi les avis de reroutage dapprobation. Les plugins de canal ne doivent pas envoyer leurs propres messages de suivi « approval went to DMs / another channel » depuis `createChannelNativeApprovalRuntime` ; exposez plutôt un routage précis de lorigine + DM de lapprobateur via les helpers partagés de capacité dapprobation et laissez le core agréger les livraisons réelles avant de publier tout avis dans le chat initiateur.
- Préservez le type did dapprobation livré de bout en bout. Les clients natifs ne doivent pas
deviner ni réécrire le routage dapprobation dexécution vs plugin à partir dun état local au canal.
- `presentation` — mapper le modèle de vue dapprobation partagé vers des charges utiles natives en attente/résolues/expirées ou des actions finales
- `transport` — préparer les cibles puis envoyer/mettre à jour/supprimer des messages dapprobation natifs
- `interactions` — hooks facultatifs bind/unbind/clear-action pour les boutons ou réactions natifs
- `observe` — hooks facultatifs de diagnostic de livraison
- Si le canal a besoin dobjets gérés par lexécution comme un client, un jeton, une app Bolt ou un récepteur Webhook, enregistrez-les via `openclaw/plugin-sdk/channel-runtime-context`. Le registre générique de contexte dexécution permet au cœur damorcer des gestionnaires pilotés par les capacités à partir de létat de démarrage du canal sans ajouter de colle dencapsulation spécifique aux approbations.
- Utilisez les niveaux inférieurs `createChannelApprovalHandler` ou `createChannelNativeApprovalRuntime` uniquement lorsque la jonction pilotée par les capacités nest pas encore suffisamment expressive.
- Les canaux dapprobation native doivent faire transiter à la fois `accountId` et `approvalKind` par ces helpers. `accountId` permet de garder la politique dapprobation multi-compte limitée au bon compte de bot, et `approvalKind` rend disponible au canal le comportement dapprobation exec vs Plugin sans branches codées en dur dans le cœur.
- Le cœur gère désormais aussi les avis de reroutage dapprobation. Les Plugins de canal ne doivent pas envoyer leurs propres messages de suivi « lapprobation a été envoyée vers les DM / un autre canal » depuis `createChannelNativeApprovalRuntime` ; exposez plutôt un routage précis de lorigine + des DM de lapprobateur via les helpers de capacité dapprobation partagés et laissez le cœur agréger les livraisons réelles avant de publier un éventuel avis dans la discussion initiatrice.
- Préservez le type didentifiant dapprobation livré de bout en bout. Les clients natifs ne doivent pas
deviner ou réécrire le routage des approbations exec vs Plugin à partir dun état local au canal.
- Différents types dapprobation peuvent intentionnellement exposer différentes surfaces natives.
Exemples intégrés actuels :
- Slack conserve le routage dapprobation natif disponible pour les ids dexécution et de plugin.
- Matrix conserve le même routage DM/canal natif et la même UX par réaction pour les approbations dexécution
et de plugin, tout en permettant à lauthentification de différer selon le type dapprobation.
- `createApproverRestrictedNativeApprovalAdapter` existe toujours comme wrapper de compatibilité, mais le nouveau code doit préférer le builder de capacité et exposer `approvalCapability` sur le plugin.
Exemples groupés actuels :
- Slack maintient le routage dapprobation native disponible à la fois pour les identifiants exec et Plugin.
- Matrix conserve le même routage natif DM/canal et la même UX par réaction pour les approbations exec
et Plugin, tout en permettant à lauthentification de différer selon le type dapprobation.
- `createApproverRestrictedNativeApprovalAdapter` existe toujours comme encapsulation de compatibilité, mais le nouveau code doit préférer le constructeur de capacité et exposer `approvalCapability` sur le Plugin.
Pour les points dentrée chauds du canal, préférez les sous-chemins runtime plus étroits lorsque vous navez besoin
que dune partie de cette famille :
Pour les points dentrée chauds du canal, préférez les sous-chemins dexécution plus étroits lorsque vous navez besoin que dune seule partie de cette famille :
- `openclaw/plugin-sdk/approval-auth-runtime`
- `openclaw/plugin-sdk/approval-client-runtime`
@ -116,92 +122,90 @@ De même, préférez `openclaw/plugin-sdk/setup-runtime`,
`openclaw/plugin-sdk/reply-dispatch-runtime`,
`openclaw/plugin-sdk/reply-reference`, et
`openclaw/plugin-sdk/reply-chunking` lorsque vous navez pas besoin de la surface
ombrelle plus large.
parapluie plus large.
Pour la configuration en particulier :
- `openclaw/plugin-sdk/setup-runtime` couvre les helpers de configuration sûrs au runtime :
adaptateurs de patch de configuration import-safe (`createPatchedAccountSetupAdapter`,
- `openclaw/plugin-sdk/setup-runtime` couvre les helpers de configuration sûrs à lexécution :
adaptateurs de patch de configuration sûrs à limport (`createPatchedAccountSetupAdapter`,
`createEnvPatchedAccountSetupAdapter`,
`createSetupInputPresenceValidator`), sortie de note de lookup,
`promptResolvedAllowFrom`, `splitSetupEntries`, et les builders
délégués de setup-proxy
- `openclaw/plugin-sdk/setup-adapter-runtime` est la couture étroite dadaptateur sensible à lenvironnement
`createSetupInputPresenceValidator`), sortie de note de recherche,
`promptResolvedAllowFrom`, `splitSetupEntries`, et les constructeurs
de proxy de configuration déléguée
- `openclaw/plugin-sdk/setup-adapter-runtime` est la jonction dadaptateur étroite sensible à lenvironnement
pour `createEnvPatchedAccountSetupAdapter`
- `openclaw/plugin-sdk/channel-setup` couvre les builders de configuration à installation optionnelle
- `openclaw/plugin-sdk/channel-setup` couvre les constructeurs de configuration avec installation facultative
ainsi que quelques primitives sûres pour la configuration :
`createOptionalChannelSetupSurface`, `createOptionalChannelSetupAdapter`,
Si votre canal prend en charge une configuration ou une authentification pilotée par lenvironnement et que les flux génériques de démarrage/configuration
doivent connaître ces noms de variables denvironnement avant le chargement du runtime, déclarez-les dans le
manifeste du plugin avec `channelEnvVars`. Conservez les `envVars` runtime du canal ou les constantes locales
uniquement pour le texte destiné aux opérateurs.
Si votre canal prend en charge une configuration ou une authentification pilotée par lenvironnement et que les flux génériques de démarrage/configuration doivent connaître ces noms de variables denvironnement avant le chargement de lexécution, déclarez-les dans le manifeste du Plugin avec `channelEnvVars`. Conservez les `envVars` dexécution du canal ou les constantes locales uniquement pour le texte destiné aux opérateurs.
`createOptionalChannelSetupWizard`, `DEFAULT_ACCOUNT_ID`,
`createTopLevelChannelDmPolicy`, `setSetupChannelEnabled`, et
`splitSetupEntries`
- utilisez la couture plus large `openclaw/plugin-sdk/setup` uniquement lorsque vous avez aussi besoin des helpers partagés plus lourds de configuration/setup tels que
- utilisez la jonction plus large `openclaw/plugin-sdk/setup` uniquement lorsque vous avez également besoin des
helpers partagés plus lourds de configuration/config tels que
`moveSingleAccountChannelSectionToDefaultAccount(...)`
Si votre canal veut seulement annoncer « installez dabord ce plugin » dans les
surfaces de configuration, préférez `createOptionalChannelSetupSurface(...)`. Ladaptateur/lassistant généré
échoue de manière fermée sur les écritures de configuration et la finalisation, et ils réutilisent
le même message dinstallation requise dans la validation, la finalisation, et le texte du lien vers la documentation.
Si votre canal veut seulement annoncer « installez dabord ce Plugin » dans les
surfaces de configuration, préférez `createOptionalChannelSetupSurface(...)`. Ladaptateur/assistant généré échoue de manière fermée sur les écritures de configuration et la finalisation, et il réutilise
le même message « installation requise » pour la validation, la finalisation et le texte
du lien vers la documentation.
Pour les autres chemins chauds du canal, préférez les helpers étroits aux surfaces héritées plus larges :
- `openclaw/plugin-sdk/account-core`,
`openclaw/plugin-sdk/account-id`,
`openclaw/plugin-sdk/account-resolution`, et
`openclaw/plugin-sdk/account-helpers` pour la configuration multi-comptes et
le fallback de compte par défaut
`openclaw/plugin-sdk/account-helpers` pour la configuration multi-compte et
le repli vers le compte par défaut
- `openclaw/plugin-sdk/inbound-envelope` et
`openclaw/plugin-sdk/inbound-reply-dispatch` pour le câblage de route/enveloppe entrante
et denregistrement-et-répartition
`openclaw/plugin-sdk/inbound-reply-dispatch` pour le câblage de route/enveloppe entrante et
denregistrement-et-distribution
- `openclaw/plugin-sdk/messaging-targets` pour lanalyse/la correspondance des cibles
- `openclaw/plugin-sdk/outbound-media` et
`openclaw/plugin-sdk/outbound-runtime` pour le chargement des médias ainsi que les délégués
didentité/envoi sortants
- `openclaw/plugin-sdk/thread-bindings-runtime` pour le cycle de vie des liaisons de thread
`openclaw/plugin-sdk/outbound-runtime` pour le chargement des médias ainsi que les
délégations didentité/denvoi sortants
- `openclaw/plugin-sdk/thread-bindings-runtime` pour le cycle de vie des liaisons de fil
et lenregistrement des adaptateurs
- `openclaw/plugin-sdk/agent-media-payload` uniquement lorsquune disposition héritée des champs
de payload agent/média est encore requise
- `openclaw/plugin-sdk/agent-media-payload` uniquement lorsquune disposition de champ de charge utile agent/média héritée
est encore requise
- `openclaw/plugin-sdk/telegram-command-config` pour la normalisation des commandes personnalisées Telegram,
la validation des doublons/conflits, et un contrat de configuration de commandes
stable en fallback
la validation des doublons/conflits et un contrat de configuration de commandes
stable en repli
Les canaux dauthentification seule peuvent généralement sarrêter au chemin par défaut : le core gère les approbations et le plugin expose simplement des capacités outbound/auth. Les canaux dapprobation native comme Matrix, Slack, Telegram, et les transports de chat personnalisés doivent utiliser les helpers natifs partagés au lieu de développer leur propre cycle de vie dapprobation.
Les canaux uniquement basés sur lauthentification peuvent généralement sarrêter au chemin par défaut : le cœur gère les approbations et le Plugin expose simplement les capacités sortantes/dauthentification. Les canaux dapprobation native comme Matrix, Slack, Telegram et les transports de chat personnalisés doivent utiliser les helpers natifs partagés au lieu dimplémenter leur propre cycle de vie dapprobation.
## Politique de mention entrante
## Politique des mentions entrantes
Conservez la gestion des mentions entrantes séparée en deux couches :
- collecte des preuves appartenant au plugin
- évaluation partagée de la politique
- collecte déléments de preuve gérée par le Plugin
- évaluation de politique partagée
Utilisez `openclaw/plugin-sdk/channel-inbound` pour la couche partagée.
Bon cas dusage pour la logique locale au plugin :
Convient bien à la logique locale au Plugin :
- détection des réponses au bot
- détection des citations du bot
- vérifications de participation au thread
- vérifications de participation au fil
- exclusions des messages de service/système
- caches natifs à la plateforme nécessaires pour prouver la participation du bot
Bon cas dusage pour le helper partagé :
Convient bien au helper partagé :
- `requireMention`
- résultat de mention explicite
- liste dautorisation de mention implicite
- contournement de commande
- décision finale dignorer
- décision finale dignorance
Flux recommandé :
1. Calculez les faits de mention locaux.
2. Transmettez ces faits à `resolveInboundMentionDecision({ facts, policy })`.
3. Utilisez `decision.effectiveWasMentioned`, `decision.shouldBypassMention`, et `decision.shouldSkip` dans votre garde dentrée.
1. Calculez les éléments factuels locaux sur les mentions.
2. Passez ces éléments à `resolveInboundMentionDecision({ facts, policy })`.
3. Utilisez `decision.effectiveWasMentioned`, `decision.shouldBypassMention` et `decision.shouldSkip` dans votre garde dentrée.
```typescript
import {
@ -240,8 +244,8 @@ const decision = resolveInboundMentionDecision({
if (decision.shouldSkip) return;
```
`api.runtime.channel.mentions` expose les mêmes helpers partagés de mention pour
les plugins de canal intégrés qui dépendent déjà de linjection runtime :
`api.runtime.channel.mentions` expose les mêmes helpers de mention partagés pour
les Plugins de canal groupés qui dépendent déjà de linjection dexécution :
- `buildMentionRegexes`
- `matchesMentionPatterns`
@ -249,17 +253,17 @@ les plugins de canal intégrés qui dépendent déjà de linjection runtime :
- `implicitMentionKindWhen`
- `resolveInboundMentionDecision`
Les anciens helpers `resolveMentionGating*` restent sur
Les anciens helpers `resolveMentionGating*` restent présents dans
`openclaw/plugin-sdk/channel-inbound` uniquement comme exports de compatibilité. Le nouveau code
doit utiliser `resolveInboundMentionDecision({ facts, policy })`.
## Procédure pas à pas
## Guide pas à pas
<Steps>
<a id="step-1-package-and-manifest"></a>
<Step title="Package et manifeste">
Créez les fichiers de plugin standard. Le champ `channel` dans `package.json` est
ce qui en fait un plugin de canal. Pour la surface complète des métadonnées de package,
Créez les fichiers standards du Plugin. Le champ `channel` dans `package.json`
est ce qui en fait un Plugin de canal. Pour la surface complète des métadonnées du package,
voir [Plugin Setup and Config](/fr/plugins/sdk-setup#openclaw-channel) :
<CodeGroup>
@ -309,8 +313,8 @@ doit utiliser `resolveInboundMentionDecision({ facts, policy })`.
</Step>
<Step title="Construire lobjet plugin de canal">
Linterface `ChannelPlugin` dispose de nombreuses surfaces dadaptateur optionnelles. Commencez par
<Step title="Créer lobjet Plugin de canal">
Linterface `ChannelPlugin` comporte de nombreuses surfaces dadaptateur optionnelles. Commencez par
le minimum — `id` et `setup` — puis ajoutez des adaptateurs selon vos besoins.
Créez `src/channel.ts` :
@ -362,7 +366,7 @@ doit utiliser `resolveInboundMentionDecision({ facts, policy })`.
},
}),
// Sécurité DM : qui peut envoyer un message au bot
// Sécurité DM : qui peut envoyer des messages au bot
security: {
dm: {
channelKey: "acme-chat",
@ -375,7 +379,7 @@ doit utiliser `resolveInboundMentionDecision({ facts, policy })`.
// Appairage : flux dapprobation pour les nouveaux contacts DM
pairing: {
text: {
idLabel: "Nom dutilisateur Acme Chat",
idLabel: "nom dutilisateur Acme Chat",
message: "Envoyez ce code pour vérifier votre identité :",
notify: async ({ target, code }) => {
await acmeChatApi.sendDm(target, `Pairing code: ${code}`);
@ -383,10 +387,10 @@ doit utiliser `resolveInboundMentionDecision({ facts, policy })`.
},
},
// Threading : comment les réponses sont livrées
// Fil des réponses : comment les réponses sont livrées
threading: { topLevelReplyToMode: "reply" },
// Outbound : envoyer des messages vers la plateforme
// Sortant : envoyer des messages vers la plateforme
outbound: {
attachedResults: {
sendText: async (params) => {
@ -407,17 +411,17 @@ doit utiliser `resolveInboundMentionDecision({ facts, policy })`.
```
<Accordion title="Ce que createChatChannelPlugin fait pour vous">
Au lieu dimplémenter manuellement des interfaces dadaptateur de bas niveau, vous transmettez
des options déclaratives et le builder les compose :
Au lieu dimplémenter manuellement des interfaces dadaptateur de bas niveau, vous passez
des options déclaratives et le constructeur les compose :
| Option | Ce quelle câble |
| --- | --- |
| `security.dm` | Résolveur de sécurité DM à portée, dérivé des champs de configuration |
| `security.dm` | Résolveur de sécurité DM à portée limitée depuis les champs de configuration |
| `pairing.text` | Flux dappairage DM basé sur du texte avec échange de code |
| `threading` | Résolveur de mode de réponse threadée (fixe, à portée de compte, ou personnalisé) |
| `outbound.attachedResults` | Fonctions denvoi qui renvoient des métadonnées de résultat (ids de message) |
| `threading` | Résolveur de mode de réponse (fixe, à portée de compte ou personnalisé) |
| `outbound.attachedResults` | Fonctions denvoi qui renvoient des métadonnées de résultat (identifiants de message) |
Vous pouvez aussi transmettre des objets dadaptateur bruts à la place des options déclaratives
Vous pouvez aussi passer des objets dadaptateur bruts au lieu des options déclaratives
si vous avez besoin dun contrôle total.
</Accordion>
@ -459,14 +463,14 @@ doit utiliser `resolveInboundMentionDecision({ facts, policy })`.
});
```
Placez les descripteurs CLI appartenant au canal dans `registerCliMetadata(...)` afin quOpenClaw
puisse les afficher dans laide racine sans activer le runtime complet du canal,
tandis que les chargements complets normaux récupèrent toujours les mêmes descripteurs pour le véritable enregistrement des commandes.
Conservez `registerFull(...)` pour le travail réservé au runtime.
Si `registerFull(...)` enregistre des méthodes RPC gateway, utilisez un
préfixe spécifique au plugin. Les espaces de noms dadministration core (`config.*`,
`exec.approvals.*`, `wizard.*`, `update.*`) restent réservés et
se résolvent toujours vers `operator.admin`.
Placez les descripteurs CLI propres au canal dans `registerCliMetadata(...)` afin quOpenClaw
puisse les afficher dans laide racine sans activer lexécution complète du canal,
tandis que les chargements complets normaux récupèrent toujours les mêmes descripteurs pour le véritable enregistrement
des commandes. Réservez `registerFull(...)` au travail réservé à lexécution.
Si `registerFull(...)` enregistre des méthodes RPC Gateway, utilisez un
préfixe spécifique au Plugin. Les espaces de noms dadministration du cœur (`config.*`,
`exec.approvals.*`, `wizard.*`, `update.*`) restent réservés et se
résolvent toujours vers `operator.admin`.
`defineChannelPluginEntry` gère automatiquement la séparation des modes denregistrement. Voir
[Entry Points](/fr/plugins/sdk-entrypoints#definechannelpluginentry) pour toutes les
options.
@ -483,28 +487,28 @@ doit utiliser `resolveInboundMentionDecision({ facts, policy })`.
export default defineSetupPluginEntry(acmeChatPlugin);
```
OpenClaw charge ceci au lieu du point dentrée complet lorsque le canal est désactivé
ou non configuré. Cela évite de charger du code runtime lourd pendant les flux de configuration.
OpenClaw charge ceci au lieu de lentrée complète lorsque le canal est désactivé
ou non configuré. Cela évite de charger du code dexécution lourd pendant les flux de configuration.
Voir [Setup and Config](/fr/plugins/sdk-setup#setup-entry) pour plus de détails.
</Step>
<Step title="Gérer les messages entrants">
Votre plugin doit recevoir les messages de la plateforme et les transmettre à
OpenClaw. Le modèle typique est un webhook qui vérifie la requête et
la répartit via le gestionnaire entrant de votre canal :
Votre Plugin doit recevoir les messages depuis la plateforme et les transmettre à
OpenClaw. Le modèle habituel est un Webhook qui vérifie la requête et
la distribue via le gestionnaire entrant de votre canal :
```typescript
registerFull(api) {
api.registerHttpRoute({
path: "/acme-chat/webhook",
auth: "plugin", // authentification gérée par le plugin (vérifiez vous-même les signatures)
auth: "plugin", // authentification gérée par le Plugin (vérifiez vous-même les signatures)
handler: async (req, res) => {
const event = parseWebhookPayload(req);
// Votre gestionnaire entrant répartit le message vers OpenClaw.
// Votre gestionnaire entrant distribue le message à OpenClaw.
// Le câblage exact dépend de votre SDK de plateforme —
// voir un exemple réel dans le package de plugin Microsoft Teams ou Google Chat intégré.
// voir un exemple réel dans le package Plugin groupé Microsoft Teams ou Google Chat.
await handleAcmeChatInbound(api, event);
res.statusCode = 200;
@ -516,9 +520,9 @@ doit utiliser `resolveInboundMentionDecision({ facts, policy })`.
```
<Note>
La gestion des messages entrants est spécifique à chaque canal. Chaque plugin de canal possède
son propre pipeline entrant. Regardez les plugins de canal intégrés
(par exemple le package de plugin Microsoft Teams ou Google Chat) pour voir des modèles réels.
La gestion des messages entrants est spécifique au canal. Chaque Plugin de canal gère
son propre pipeline entrant. Consultez les Plugins de canal groupés
(par exemple le package Plugin Microsoft Teams ou Google Chat) pour voir des modèles réels.
</Note>
</Step>
@ -570,48 +574,48 @@ doit utiliser `resolveInboundMentionDecision({ facts, policy })`.
## Structure des fichiers
```text
```
<bundled-plugin-root>/acme-chat/
├── package.json # métadonnées openclaw.channel
├── openclaw.plugin.json # manifeste avec schéma de configuration
├── openclaw.plugin.json # Manifeste avec schéma de configuration
├── index.ts # defineChannelPluginEntry
├── setup-entry.ts # defineSetupPluginEntry
├── api.ts # exports publics (optionnel)
├── runtime-api.ts # exports runtime internes (optionnel)
├── api.ts # Exports publics (facultatif)
├── runtime-api.ts # Exports dexécution internes (facultatif)
└── src/
├── channel.ts # ChannelPlugin via createChatChannelPlugin
├── channel.test.ts # tests
├── client.ts # client API de la plateforme
└── runtime.ts # store runtime (si nécessaire)
├── channel.test.ts # Tests
├── client.ts # Client API de la plateforme
└── runtime.ts # Stockage dexécution (si nécessaire)
```
## Sujets avancés
<CardGroup cols={2}>
<Card title="Options de threading" icon="git-branch" href="/fr/plugins/sdk-entrypoints#registration-mode">
Modes de réponse fixes, à portée de compte, ou personnalisés
<Card title="Options de fil des réponses" icon="git-branch" href="/fr/plugins/sdk-entrypoints#registration-mode">
Modes de réponse fixes, à portée de compte ou personnalisés
</Card>
<Card title="Intégration de loutil message" icon="puzzle" href="/fr/plugins/architecture#channel-plugins-and-the-shared-message-tool">
describeMessageTool et découverte dactions
<Card title="Intégration de loutil de message" icon="puzzle" href="/fr/plugins/architecture#channel-plugins-and-the-shared-message-tool">
describeMessageTool et découverte des actions
</Card>
<Card title="Résolution de cible" icon="crosshair" href="/fr/plugins/architecture#channel-target-resolution">
inferTargetChatType, looksLikeId, resolveTarget
</Card>
<Card title="Helpers runtime" icon="settings" href="/fr/plugins/sdk-runtime">
<Card title="Helpers dexécution" icon="settings" href="/fr/plugins/sdk-runtime">
TTS, STT, média, sous-agent via api.runtime
</Card>
</CardGroup>
<Note>
Certaines coutures helper intégrées existent encore pour la maintenance des plugins intégrés et
la compatibilité. Elles ne constituent pas le modèle recommandé pour les nouveaux plugins de canal ;
préférez les sous-chemins génériques channel/setup/reply/runtime de la surface
commune du SDK, sauf si vous maintenez directement cette famille de plugins intégrés.
Certaines jonctions de helpers groupés existent encore pour la maintenance et la
compatibilité des Plugins groupés. Elles ne constituent pas le modèle recommandé pour les nouveaux Plugins de canal ;
préférez les sous-chemins génériques channel/setup/reply/runtime de la surface SDK
commune, sauf si vous maintenez directement cette famille de Plugins groupés.
</Note>
## Étapes suivantes
- [Provider Plugins](/fr/plugins/sdk-provider-plugins) — si votre plugin fournit aussi des modèles
- [SDK Overview](/fr/plugins/sdk-overview) — référence complète des imports de sous-chemins
- [SDK Testing](/fr/plugins/sdk-testing) — utilitaires de test et tests de contrat
- [Plugin Manifest](/fr/plugins/manifest) — schéma complet du manifeste
- [Plugins de fournisseur](/fr/plugins/sdk-provider-plugins) — si votre Plugin fournit aussi des modèles
- [Vue densemble du SDK](/fr/plugins/sdk-overview) — référence complète des imports par sous-chemin
- [Tests du SDK](/fr/plugins/sdk-testing) — utilitaires de test et tests de contrat
- [Manifeste de Plugin](/fr/plugins/manifest) — schéma complet du manifeste

View File

@ -5,10 +5,10 @@ read_when:
summary: Canaux de publication publics, nommage des versions et cadence
title: Politique de publication
x-i18n:
generated_at: "2026-04-14T06:55:41Z"
generated_at: "2026-04-15T06:56:33Z"
model: gpt-5.4
provider: openai
source_hash: 3eaf9f1786b8c9fd4f5a9c657b623cb69d1a485958e1a9b8f108511839b63587
source_hash: 88724307269ab783a9fbf8a0540fea198d8a3add68457f4e64d5707114fa518c
source_path: reference/RELEASING.md
workflow: 15
---
@ -17,124 +17,126 @@ x-i18n:
OpenClaw a trois canaux de publication publics :
- stable : versions taguées qui publient sur npm `beta` par défaut, ou sur npm `latest` lorsquelles sont explicitement demandées
- beta : tags de préversion qui publient sur npm `beta`
- stable : des publications balisées qui publient vers npm `beta` par défaut, ou vers npm `latest` lorsquelles sont demandées explicitement
- beta : des balises de prépublication qui publient vers npm `beta`
- dev : la tête mobile de `main`
## Nommage des versions
- Version de publication stable : `YYYY.M.D`
- Tag Git : `vYYYY.M.D`
- Balise Git : `vYYYY.M.D`
- Version de publication de correction stable : `YYYY.M.D-N`
- Tag Git : `vYYYY.M.D-N`
- Version de préversion beta : `YYYY.M.D-beta.N`
- Tag Git : `vYYYY.M.D-beta.N`
- Najoutez pas de zéro de remplissage au mois ou au jour
- `latest` signifie la version npm stable promue actuelle
- `beta` signifie la cible dinstallation beta actuelle
- Les versions stables et les versions de correction stable publient sur npm `beta` par défaut ; les opérateurs de publication peuvent cibler `latest` explicitement, ou promouvoir plus tard une build beta validée
- Chaque version dOpenClaw livre le package npm et lapp macOS ensemble
- Balise Git : `vYYYY.M.D-N`
- Version de prépublication bêta : `YYYY.M.D-beta.N`
- Balise Git : `vYYYY.M.D-beta.N`
- Ne mettez pas de zéro non significatif pour le mois ou le jour
- `latest` signifie la publication npm stable promue actuelle
- `beta` signifie la cible dinstallation bêta actuelle
- Les publications stables et les publications de correction stable publient vers npm `beta` par défaut ; les opérateurs de publication peuvent cibler `latest` explicitement, ou promouvoir plus tard une build bêta validée
- Chaque publication OpenClaw livre le package npm et lapp macOS ensemble
## Cadence de publication
- Les publications passent dabord par beta
- Stable ne suit quune fois la dernière beta validée
- La procédure de publication détaillée, les approbations, les identifiants et les notes de récupération sont réservés aux mainteneurs
- stable ne suit quaprès validation de la dernière bêta
- La procédure de publication détaillée, les approbations, les identifiants et les notes de reprise sont réservés aux mainteneurs
## Vérifications préalables à la publication
- Exécutez `pnpm build && pnpm ui:build` avant `pnpm release:check` afin que les artefacts de publication `dist/*` attendus et le bundle de lUI de contrôle existent pour létape de validation du pack
- Exécutez `pnpm release:check` avant chaque publication taguée
- Les vérifications de publication sexécutent maintenant dans un workflow manuel séparé :
- Exécutez `pnpm build && pnpm ui:build` avant `pnpm release:check` afin que les artefacts de publication attendus `dist/*` et le bundle de linterface Control UI existent pour létape de validation du pack
- Exécutez `pnpm release:check` avant chaque publication balisée
- Les vérifications de publication sexécutent désormais dans un workflow manuel distinct :
`OpenClaw Release Checks`
- Cette séparation est intentionnelle : elle garde le vrai chemin de publication npm court, déterministe et centré sur les artefacts, tandis que les vérifications live plus lentes restent dans leur propre canal pour ne pas retarder ou bloquer la publication
- Les vérifications de publication doivent être déclenchées depuis la ref de workflow `main` afin que la logique du workflow et les secrets restent canoniques
- Ce workflow accepte soit un tag de publication existant, soit le SHA de commit `main` complet actuel à 40 caractères
- En mode SHA de commit, il naccepte que le HEAD actuel de `origin/main` ; utilisez un tag de publication pour les anciens commits de publication
- La pré-vérification en validation seule de `OpenClaw NPM Release` accepte également le SHA de commit `main` complet actuel à 40 caractères sans nécessiter de tag poussé
- Ce chemin SHA est réservé à la validation et ne peut pas être promu en véritable publication
- En mode SHA, le workflow synthétise `v<package.json version>` uniquement pour la vérification des métadonnées du package ; la vraie publication exige toujours un vrai tag de publication
- Les deux workflows gardent le vrai chemin de publication et de promotion sur des runners hébergés par GitHub, tandis que le chemin de validation non mutatif peut utiliser les runners Linux Blacksmith plus grands
- La validation dexécution dinstallation et de mise à niveau multi-OS est déclenchée depuis le workflow appelant privé
`openclaw/releases-private/.github/workflows/openclaw-cross-os-release-checks.yml`,
qui invoque le workflow public réutilisable
`.github/workflows/openclaw-cross-os-release-checks-reusable.yml`
- Cette séparation est intentionnelle : elle permet de garder le chemin réel de publication npm court, déterministe et centré sur les artefacts, tandis que les vérifications live plus lentes restent dans leur propre canal afin de ne pas ralentir ni bloquer la publication
- Les vérifications de publication doivent être déclenchées depuis la référence de workflow `main` afin que la logique du workflow et les secrets restent canoniques
- Ce workflow accepte soit une balise de publication existante, soit le SHA de commit complet actuel de `main` sur 40 caractères
- En mode SHA de commit, il naccepte que la HEAD actuelle de `origin/main` ; utilisez une balise de publication pour les anciens commits de publication
- Le contrôle préalable en validation seule de `OpenClaw NPM Release` accepte également le SHA de commit complet actuel de `main` sur 40 caractères sans exiger de balise déjà poussée
- Ce chemin SHA est uniquement destiné à la validation et ne peut pas être promu en publication réelle
- En mode SHA, le workflow synthétise `v<package.json version>` uniquement pour la vérification des métadonnées du package ; la publication réelle exige toujours une véritable balise de publication
- Les deux workflows conservent le vrai chemin de publication et de promotion sur des runners hébergés par GitHub, tandis que le chemin de validation non mutatif peut utiliser les runners Linux Blacksmith plus grands
- Ce workflow exécute
`OPENCLAW_LIVE_TEST=1 OPENCLAW_LIVE_CACHE_TEST=1 pnpm test:live:cache`
en utilisant à la fois les secrets de workflow `OPENAI_API_KEY` et `ANTHROPIC_API_KEY`
- La pré-vérification de publication npm nattend plus le canal séparé des vérifications de publication
en utilisant les secrets de workflow `OPENAI_API_KEY` et `ANTHROPIC_API_KEY`
- Le contrôle préalable de publication npm nattend plus le canal distinct des vérifications de publication
- Exécutez `RELEASE_TAG=vYYYY.M.D node --import tsx scripts/openclaw-npm-release-check.ts`
(ou le tag beta/correction correspondant) avant lapprobation
(ou la balise bêta/correction correspondante) avant lapprobation
- Après la publication npm, exécutez
`node --import tsx scripts/openclaw-npm-postpublish-verify.ts YYYY.M.D`
(ou la version beta/correction correspondante) pour vérifier le chemin dinstallation du registre publié dans un préfixe temporaire frais
- Lautomatisation de publication des mainteneurs utilise désormais le modèle pré-vérification puis promotion :
- la vraie publication npm doit réussir avec un `preflight_run_id` de pré-vérification réussi
(ou la version bêta/correction correspondante) pour vérifier le chemin dinstallation publié depuis le registre dans un préfixe temporaire propre
- Lautomatisation de publication des mainteneurs utilise désormais le flux contrôle préalable puis promotion :
- la vraie publication npm doit réussir avec un `preflight_run_id` npm valide
- les publications npm stables ciblent `beta` par défaut
- la publication npm stable peut cibler `latest` explicitement via une entrée du workflow
- la promotion npm stable de `beta` vers `latest` reste disponible en mode manuel explicite dans le workflow de confiance `OpenClaw NPM Release`
- les publications stables directes peuvent également exécuter un mode explicite de synchronisation des dist-tags qui fait pointer `latest` et `beta` vers la version stable déjà publiée
- ces modes de dist-tag nécessitent toujours un `NPM_TOKEN` valide dans lenvironnement `npm-release`, car la gestion des `dist-tag` npm est distincte de la publication de confiance
- la publication publique `macOS Release` est réservée à la validation
- la vraie publication privée mac doit réussir avec des `preflight_run_id` et `validate_run_id` privés mac réussis
- la publication npm stable peut cibler `latest` explicitement via une entrée de workflow
- la mutation par jeton des dist-tags npm se trouve désormais dans
`openclaw/releases-private/.github/workflows/openclaw-npm-dist-tags.yml`
pour des raisons de sécurité, car `npm dist-tag add` exige toujours `NPM_TOKEN` alors que le dépôt public conserve une publication OIDC uniquement
- la `macOS Release` publique est uniquement destinée à la validation
- la véritable publication privée mac doit réussir avec des `preflight_run_id` et `validate_run_id` privés valides
- les vrais chemins de publication promeuvent des artefacts préparés au lieu de les reconstruire une nouvelle fois
- Pour les versions de correction stable comme `YYYY.M.D-N`, le vérificateur post-publication vérifie également le même chemin de mise à niveau en préfixe temporaire de `YYYY.M.D` vers `YYYY.M.D-N`, afin que les corrections de publication ne puissent pas laisser silencieusement les anciennes installations globales sur la charge utile stable de base
- La pré-vérification de publication npm échoue en mode fermé sauf si le tarball inclut à la fois `dist/control-ui/index.html` et une charge utile non vide `dist/control-ui/assets/`, afin déviter de livrer à nouveau un tableau de bord navigateur vide
- `pnpm test:install:smoke` applique également le budget `unpackedSize` du `npm pack` sur le tarball candidat à la mise à jour, afin que le2e de linstallateur détecte toute augmentation accidentelle de taille du pack avant le chemin de publication
- Si le travail de publication a touché la planification CI, les manifestes de timing des extensions ou les matrices de test des extensions, régénérez et examinez les sorties de matrice du workflow `checks-node-extensions` gérées par le planificateur depuis `.github/workflows/ci.yml` avant lapprobation, afin que les notes de publication ne décrivent pas une disposition CI obsolète
- La préparation dune version macOS stable inclut également les surfaces de mise à jour :
- Pour les publications de correction stable comme `YYYY.M.D-N`, le vérificateur post-publication contrôle également le même chemin de mise à niveau en préfixe temporaire de `YYYY.M.D` vers `YYYY.M.D-N` afin que les corrections de publication ne puissent pas laisser silencieusement danciennes installations globales sur la charge utile stable de base
- Le contrôle préalable de publication npm échoue par défaut sauf si le tarball inclut à la fois `dist/control-ui/index.html` et une charge utile non vide `dist/control-ui/assets/` afin déviter dexpédier à nouveau un tableau de bord navigateur vide
- `pnpm test:install:smoke` applique aussi le budget `unpackedSize` du pack npm au tarball de mise à jour candidat, afin que lE2E de linstallateur détecte toute augmentation accidentelle de taille du pack avant le chemin de publication
- Si le travail de publication a touché à la planification CI, aux manifestes de timing des extensions ou aux matrices de test des extensions, régénérez et examinez les sorties de matrice de workflow `checks-node-extensions` gérées par le planificateur à partir de `.github/workflows/ci.yml` avant lapprobation afin que les notes de publication ne décrivent pas une disposition CI obsolète
- Létat de préparation dune publication macOS stable inclut aussi les surfaces de mise à jour :
- la publication GitHub doit finir avec les fichiers empaquetés `.zip`, `.dmg` et `.dSYM.zip`
- `appcast.xml` sur `main` doit pointer vers le nouveau zip stable après publication
- lapp empaquetée doit conserver un identifiant de bundle non debug, une URL de flux Sparkle non vide et un `CFBundleVersion` au moins égal au plancher canonique de build Sparkle pour cette version
- `appcast.xml` sur `main` doit pointer vers le nouveau zip stable après la publication
- lapp empaquetée doit conserver un identifiant de bundle non debug, une URL de flux Sparkle non vide et un `CFBundleVersion` supérieur ou égal au plancher canonique de build Sparkle pour cette version de publication
## Entrées du workflow NPM
`OpenClaw NPM Release` accepte ces entrées contrôlées par lopérateur :
- `tag` : tag de publication requis tel que `v2026.4.2`, `v2026.4.2-1` ou `v2026.4.2-beta.1` ; lorsque `preflight_only=true`, il peut aussi sagir du SHA de commit `main` complet actuel à 40 caractères pour une pré-vérification en validation seule
- `tag` : balise de publication requise telle que `v2026.4.2`, `v2026.4.2-1`, ou `v2026.4.2-beta.1` ; lorsque `preflight_only=true`, cela peut aussi être le SHA de commit complet actuel de `main` sur 40 caractères pour un contrôle préalable de validation seule
- `preflight_only` : `true` pour validation/build/package uniquement, `false` pour le vrai chemin de publication
- `preflight_run_id` : requis sur le vrai chemin de publication afin que le workflow réutilise le tarball préparé depuis lexécution de pré-vérification réussie
- `npm_dist_tag` : tag cible npm pour le chemin de publication ; vaut `beta` par défaut
- `promote_beta_to_latest` : `true` pour ignorer la publication et déplacer une build stable `beta` déjà publiée vers `latest`
- `sync_stable_dist_tags` : `true` pour ignorer la publication et faire pointer `latest` et `beta` vers une version stable déjà publiée
- `preflight_run_id` : requis pour le vrai chemin de publication afin que le workflow réutilise le tarball préparé depuis lexécution de contrôle préalable réussie
- `npm_dist_tag` : dist-tag npm cible pour le chemin de publication ; la valeur par défaut est `beta`
`OpenClaw Release Checks` accepte ces entrées contrôlées par lopérateur :
- `ref` : tag de publication existant ou SHA de commit `main` complet actuel à 40 caractères à valider
- `ref` : balise de publication existante ou SHA de commit complet actuel de `main` sur 40 caractères à valider
Règles :
- Les tags stables et de correction peuvent publier vers `beta` ou `latest`
- Les tags de préversion beta ne peuvent publier que vers `beta`
- Les balises stables et de correction peuvent publier vers `beta` ou `latest`
- Les balises de prépublication bêta ne peuvent publier que vers `beta`
- Lentrée SHA de commit complet nest autorisée que lorsque `preflight_only=true`
- Le mode SHA de commit des vérifications de publication exige également le HEAD actuel de `origin/main`
- Le vrai chemin de publication doit utiliser le même `npm_dist_tag` que celui utilisé pendant la pré-vérification ; le workflow vérifie ces métadonnées avant de poursuivre la publication
- Le mode promotion doit utiliser un tag stable ou de correction, `preflight_only=false`, un `preflight_run_id` vide et `npm_dist_tag=beta`
- Le mode de synchronisation des dist-tags doit utiliser un tag stable ou de correction, `preflight_only=false`, un `preflight_run_id` vide, `npm_dist_tag=latest` et `promote_beta_to_latest=false`
- Les modes promotion et synchronisation des dist-tags exigent également un `NPM_TOKEN` valide, car `npm dist-tag add` nécessite toujours une authentification npm classique ; la publication de confiance couvre uniquement le chemin de publication du package
- Le mode SHA de commit des vérifications de publication exige également la HEAD actuelle de `origin/main`
- Le vrai chemin de publication doit utiliser le même `npm_dist_tag` que celui utilisé pendant le contrôle préalable ; le workflow vérifie ces métadonnées avant de poursuivre la publication
## Séquence de publication npm stable
Lors de la création dune publication npm stable :
1. Exécutez `OpenClaw NPM Release` avec `preflight_only=true`
- Avant quun tag nexiste, vous pouvez utiliser le SHA de commit `main` complet actuel pour un essai à sec en validation seule du workflow de pré-vérification
- Avant quune balise nexiste, vous pouvez utiliser le SHA de commit complet actuel de `main` pour une exécution à blanc de validation seule du workflow de contrôle préalable
2. Choisissez `npm_dist_tag=beta` pour le flux normal beta-first, ou `latest` uniquement lorsque vous souhaitez intentionnellement une publication stable directe
3. Exécutez `OpenClaw Release Checks` séparément avec le même tag ou le SHA complet actuel de `main` lorsque vous voulez une couverture live du cache de prompt
3. Exécutez `OpenClaw Release Checks` séparément avec la même balise ou le SHA complet actuel de `main` lorsque vous voulez une couverture live du cache de prompt
- Cette séparation est intentionnelle afin que la couverture live reste disponible sans recoupler des vérifications longues ou instables au workflow de publication
4. Enregistrez le `preflight_run_id` réussi
5. Exécutez à nouveau `OpenClaw NPM Release` avec `preflight_only=false`, le même `tag`, le même `npm_dist_tag` et le `preflight_run_id` enregistré
6. Si la publication est arrivée sur `beta`, exécutez plus tard `OpenClaw NPM Release` avec le même `tag` stable, `promote_beta_to_latest=true`, `preflight_only=false`, un `preflight_run_id` vide et `npm_dist_tag=beta` lorsque vous souhaitez déplacer cette build publiée vers `latest`
7. Si la publication a été intentionnellement publiée directement sur `latest` et que `beta` doit suivre la même build stable, exécutez `OpenClaw NPM Release` avec le même `tag` stable, `sync_stable_dist_tags=true`, `promote_beta_to_latest=false`, `preflight_only=false`, un `preflight_run_id` vide et `npm_dist_tag=latest`
6. Si la publication a atterri sur `beta`, utilisez le workflow privé
`openclaw/releases-private/.github/workflows/openclaw-npm-dist-tags.yml`
pour promouvoir cette version stable de `beta` vers `latest`
7. Si la publication a été intentionnellement publiée directement vers `latest` et que `beta` doit suivre immédiatement avec la même build stable, utilisez ce même workflow privé pour faire pointer les deux dist-tags vers la version stable, ou laissez sa synchronisation dautoréparation planifiée déplacer `beta` plus tard
Les modes promotion et synchronisation des dist-tags nécessitent toujours lapprobation de lenvironnement `npm-release` et un `NPM_TOKEN` valide accessible à cette exécution du workflow.
La mutation des dist-tags se trouve dans le dépôt privé pour des raisons de sécurité, car elle exige toujours `NPM_TOKEN`, tandis que le dépôt public conserve une publication OIDC uniquement.
Cela permet de garder à la fois le chemin de publication directe et le chemin de promotion beta-first documentés et visibles pour lopérateur.
Cela permet de documenter et de rendre visible aux opérateurs à la fois le chemin de publication directe et le chemin de promotion beta-first.
## Références publiques
- [`.github/workflows/openclaw-npm-release.yml`](https://github.com/openclaw/openclaw/blob/main/.github/workflows/openclaw-npm-release.yml)
- [`.github/workflows/openclaw-release-checks.yml`](https://github.com/openclaw/openclaw/blob/main/.github/workflows/openclaw-release-checks.yml)
- [`.github/workflows/openclaw-cross-os-release-checks-reusable.yml`](https://github.com/openclaw/openclaw/blob/main/.github/workflows/openclaw-cross-os-release-checks-reusable.yml)
- [`scripts/openclaw-npm-release-check.ts`](https://github.com/openclaw/openclaw/blob/main/scripts/openclaw-npm-release-check.ts)
- [`scripts/package-mac-dist.sh`](https://github.com/openclaw/openclaw/blob/main/scripts/package-mac-dist.sh)
- [`scripts/make_appcast.sh`](https://github.com/openclaw/openclaw/blob/main/scripts/make_appcast.sh)
Les mainteneurs utilisent la documentation privée de publication dans
Les mainteneurs utilisent la documentation de publication privée dans
[`openclaw/maintainers/release/README.md`](https://github.com/openclaw/maintainers/blob/main/release/README.md)
comme véritable runbook.

View File

@ -1,15 +1,15 @@
---
read_when:
- Vérifier la couverture des identifiants SecretRef
- Vérification de la couverture des identifiants SecretRef
- Vérifier si un identifiant est éligible à `secrets configure` ou `secrets apply`
- Vérifier pourquoi un identifiant est en dehors de la surface prise en charge
summary: Surface canonique des identifiants SecretRef pris en charge et non pris en charge
- Vérifier pourquoi un identifiant est hors de la surface prise en charge
summary: Surface canonique prise en charge ou non prise en charge des identifiants SecretRef
title: Surface des identifiants SecretRef
x-i18n:
generated_at: "2026-04-07T06:53:54Z"
generated_at: "2026-04-15T06:57:09Z"
model: gpt-5.4
provider: openai
source_hash: 211f4b504c5808f7790683066fc2c8b700c705c598f220a264daf971b81cc593
source_hash: dd0b9c379236b17a72f552d6360b8b5a2269009e019c138c6bb50f4f7328ddaf
source_path: reference/secretref-credential-surface.md
workflow: 15
---
@ -18,10 +18,10 @@ x-i18n:
Cette page définit la surface canonique des identifiants SecretRef.
Portée visée :
Intention du périmètre :
- Dans le périmètre : identifiants strictement fournis par lutilisateur quOpenClaw ne génère ni ne fait tourner.
- Hors périmètre : identifiants générés ou renouvelés à lexécution, matériel de rafraîchissement OAuth et artefacts de type session.
- Dans le périmètre : strictement les identifiants fournis par lutilisateur quOpenClaw ne crée ni ne fait tourner.
- Hors périmètre : les identifiants créés à lexécution ou rotatifs, le matériel de rafraîchissement OAuth et les artefacts de type session.
## Identifiants pris en charge
@ -49,6 +49,7 @@ Portée visée :
- `messages.tts.providers.*.apiKey`
- `tools.web.fetch.firecrawl.apiKey`
- `plugins.entries.brave.config.webSearch.apiKey`
- `plugins.entries.exa.config.webSearch.apiKey`
- `plugins.entries.google.config.webSearch.apiKey`
- `plugins.entries.xai.config.webSearch.apiKey`
- `plugins.entries.moonshot.config.webSearch.apiKey`
@ -107,8 +108,8 @@ Portée visée :
- `channels.zalo.webhookSecret`
- `channels.zalo.accounts.*.botToken`
- `channels.zalo.accounts.*.webhookSecret`
- `channels.googlechat.serviceAccount` via le champ frère `serviceAccountRef` (exception de compatibilité)
- `channels.googlechat.accounts.*.serviceAccount` via le champ frère `serviceAccountRef` (exception de compatibilité)
- `channels.googlechat.serviceAccount` via le `serviceAccountRef` frère (exception de compatibilité)
- `channels.googlechat.accounts.*.serviceAccount` via le `serviceAccountRef` frère (exception de compatibilité)
### Cibles `auth-profiles.json` (`secrets configure` + `secrets apply` + `secrets audit`)
@ -120,16 +121,16 @@ Portée visée :
Remarques :
- Les cibles de plan de profil dauthentification nécessitent `agentId`.
- Les entrées de plan ciblent `profiles.*.key` / `profiles.*.token` et écrivent les références sœurs (`keyRef` / `tokenRef`).
- Les entrées du plan ciblent `profiles.*.key` / `profiles.*.token` et écrivent les références sœurs (`keyRef` / `tokenRef`).
- Les références de profil dauthentification sont incluses dans la résolution à lexécution et dans la couverture daudit.
- Garde-fou de politique OAuth : `auth.profiles.<id>.mode = "oauth"` ne peut pas être combiné avec des entrées SecretRef pour ce profil. Le démarrage/rechargement et la résolution du profil dauthentification échouent immédiatement lorsque cette politique est violée.
- Pour les fournisseurs de modèles gérés par SecretRef, les entrées générées `agents/*/agent/models.json` conservent des marqueurs non secrets (et non des valeurs secrètes résolues) pour les surfaces `apiKey`/en-têtes.
- La persistance des marqueurs fait autorité côté source : OpenClaw écrit les marqueurs depuis linstantané actif de la configuration source (avant résolution), et non depuis les valeurs secrètes résolues à lexécution.
- Garde de politique OAuth : `auth.profiles.<id>.mode = "oauth"` ne peut pas être combiné avec des entrées SecretRef pour ce profil. Le démarrage/rechargement et la résolution du profil dauthentification échouent immédiatement si cette politique est violée.
- Pour les fournisseurs de modèles gérés par SecretRef, les entrées générées `agents/*/agent/models.json` conservent des marqueurs non secrets (et non les valeurs secrètes résolues) pour les surfaces `apiKey`/en-tête.
- La persistance des marqueurs fait autorité depuis la source : OpenClaw écrit les marqueurs à partir de linstantané de configuration source actif (avant résolution), et non à partir des valeurs secrètes résolues à lexécution.
- Pour la recherche web :
- En mode fournisseur explicite (`tools.web.search.provider` défini), seule la clé du fournisseur sélectionné est active.
- En mode auto (`tools.web.search.provider` non défini), seule la première clé de fournisseur qui se résout selon la priorité est active.
- En mode auto, les références des fournisseurs non sélectionnés sont traitées comme inactives jusquà leur sélection.
- Les anciens chemins de fournisseur `tools.web.search.*` se résolvent encore pendant la fenêtre de compatibilité, mais la surface canonique SecretRef est `plugins.entries.<plugin>.config.webSearch.*`.
- En mode automatique (`tools.web.search.provider` non défini), seule la première clé de fournisseur résolue selon la priorité est active.
- En mode automatique, les références des fournisseurs non sélectionnés sont traitées comme inactives jusquà leur sélection.
- Les anciens chemins de fournisseur `tools.web.search.*` continuent à être résolus pendant la fenêtre de compatibilité, mais la surface canonique SecretRef est `plugins.entries.<plugin>.config.webSearch.*`.
## Identifiants non pris en charge
@ -151,4 +152,4 @@ Les identifiants hors périmètre incluent :
Justification :
- Ces identifiants appartiennent à des classes générées, renouvelées, porteuses de session ou durables OAuth qui ne correspondent pas à une résolution SecretRef externe en lecture seule.
- Ces identifiants appartiennent à des classes créées, rotatives, porteuses de session ou durables OAuth qui ne correspondent pas à la résolution SecretRef externe en lecture seule.

View File

@ -1,146 +1,173 @@
---
description: Real-world OpenClaw projects from the community
read_when:
- Vous cherchez des exemples concrets d'utilisation d'OpenClaw
- Vous mettez à jour les projets phares de la communauté
summary: Projets et intégrations créés par la communauté et propulsés par OpenClaw
- Vous cherchez des exemples réels dutilisation dOpenClaw
- Mise à jour des projets communautaires mis en avant
summary: Projets et intégrations créés par la communauté, propulsés par OpenClaw
title: Vitrine
x-i18n:
generated_at: "2026-04-05T12:55:52Z"
generated_at: "2026-04-15T06:57:08Z"
model: gpt-5.4
provider: openai
source_hash: 2917e9a476ef527ddb3e51c610bbafbd145e705c9cc29f191639fb63d238ef70
source_hash: 797d0b85c9eca920240c79d870eb9636216714f3eba871c5ebd0f7f40cf7bbf1
source_path: start/showcase.md
workflow: 15
---
<!-- markdownlint-disable MD033 -->
# Vitrine
De vrais projets issus de la communauté. Découvrez ce que les gens construisent avec OpenClaw.
<div className="showcase-hero">
<p className="showcase-kicker">Conçu dans des chats, des terminaux, des navigateurs et des salons</p>
<p className="showcase-lead">
Les projets OpenClaw ne sont pas des démos gadgets. Des gens livrent des boucles de revue de PR, des applications mobiles, de la domotique,
des systèmes vocaux, des outils de développement et des flux de travail riches en mémoire depuis les canaux quils utilisent déjà.
</p>
<div className="showcase-actions">
<a href="#videos">Voir les démos</a>
<a href="#fresh-from-discord">Parcourir les projets</a>
<a href="https://discord.gg/clawd">Partager le vôtre</a>
</div>
<div className="showcase-highlights">
<div className="showcase-highlight">
<strong>Créations natives du chat</strong>
<span>Telegram, WhatsApp, Discord, Beeper, chat web et flux de travail orientés terminal.</span>
</div>
<div className="showcase-highlight">
<strong>Automatisation réelle</strong>
<span>Réservation, achats, support, reporting et contrôle du navigateur sans attendre une API.</span>
</div>
<div className="showcase-highlight">
<strong>Local + monde physique</strong>
<span>Imprimantes, aspirateurs, caméras, données de santé, systèmes domestiques et bases de connaissances personnelles.</span>
</div>
</div>
</div>
<Info>
**Vous voulez figurer ici ?** Partagez votre projet dans [#self-promotion sur Discord](https://discord.gg/clawd) ou [identifiez @openclaw sur X](https://x.com/openclaw).
**Vous voulez être mis en avant ?** Partagez votre projet dans [#self-promotion sur Discord](https://discord.gg/clawd) ou [identifiez @openclaw sur X](https://x.com/openclaw).
</Info>
## 🎥 OpenClaw en action
Visite guidée complète de l'installation (28 min) par VelvetShark.
<div
style={{
position: "relative",
paddingBottom: "56.25%",
height: 0,
overflow: "hidden",
borderRadius: 16,
}}
>
<iframe
src="https://www.youtube-nocookie.com/embed/SaWSPZoPX34"
title="OpenClaw: l'IA auto-hébergée que Siri aurait dû être (installation complète)"
style={{ position: "absolute", top: 0, left: 0, width: "100%", height: "100%" }}
frameBorder="0"
loading="lazy"
allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share"
allowFullScreen
/>
<div className="showcase-jump-links">
<a href="#videos">Vidéos</a>
<a href="#fresh-from-discord">Tout droit venu de Discord</a>
<a href="#automation-workflows">Automatisation</a>
<a href="#knowledge-memory">Mémoire</a>
<a href="#voice-phone">Voix &amp; téléphone</a>
<a href="#infrastructure-deployment">Infrastructure</a>
<a href="#home-hardware">Maison &amp; matériel</a>
<a href="#community-projects">Communauté</a>
<a href="#submit-your-project">Soumettre un projet</a>
</div>
[Regarder sur YouTube](https://www.youtube.com/watch?v=SaWSPZoPX34)
<h2 id="videos">Vidéos</h2>
<div
style={{
position: "relative",
paddingBottom: "56.25%",
height: 0,
overflow: "hidden",
borderRadius: 16,
}}
>
<iframe
src="https://www.youtube-nocookie.com/embed/mMSKQvlmFuQ"
title="Vidéo de présentation d'OpenClaw"
style={{ position: "absolute", top: 0, left: 0, width: "100%", height: "100%" }}
frameBorder="0"
loading="lazy"
allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share"
allowFullScreen
/>
<p className="showcase-section-intro">
Commencez ici si vous voulez passer le plus vite possible de « quest-ce que cest ? » à « daccord, jai compris ».
</p>
<div className="showcase-video-grid">
<div className="showcase-video-card">
<div className="showcase-video-shell">
<iframe
src="https://www.youtube-nocookie.com/embed/SaWSPZoPX34"
title="OpenClaw: LIA auto-hébergée que Siri aurait dû être (configuration complète)"
loading="lazy"
allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share"
allowFullScreen
/>
</div>
<h3>Guide complet de configuration</h3>
<p>VelvetShark, 28 minutes. Installez, configurez, et obtenez un premier assistant fonctionnel de bout en bout.</p>
<a href="https://www.youtube.com/watch?v=SaWSPZoPX34">Voir sur YouTube</a>
</div>
<div className="showcase-video-card">
<div className="showcase-video-shell">
<iframe
src="https://www.youtube-nocookie.com/embed/mMSKQvlmFuQ"
title="Vidéo vitrine OpenClaw"
loading="lazy"
allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share"
allowFullScreen
/>
</div>
<h3>Montage vitrine de la communauté</h3>
<p>Un aperçu plus rapide de vrais projets, interfaces et flux de travail construits autour dOpenClaw.</p>
<a href="https://www.youtube.com/watch?v=mMSKQvlmFuQ">Voir sur YouTube</a>
</div>
<div className="showcase-video-card">
<div className="showcase-video-shell">
<iframe
src="https://www.youtube-nocookie.com/embed/5kkIJNUGFho"
title="Vitrine communautaire OpenClaw"
loading="lazy"
allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share"
allowFullScreen
/>
</div>
<h3>Projets dans la nature</h3>
<p>Des exemples de la communauté, des boucles de développement natives du chat au matériel et à lautomatisation personnelle.</p>
<a href="https://www.youtube.com/watch?v=5kkIJNUGFho">Voir sur YouTube</a>
</div>
</div>
[Regarder sur YouTube](https://www.youtube.com/watch?v=mMSKQvlmFuQ)
<h2 id="fresh-from-discord">Tout droit venu de Discord</h2>
<div
style={{
position: "relative",
paddingBottom: "56.25%",
height: 0,
overflow: "hidden",
borderRadius: 16,
}}
>
<iframe
src="https://www.youtube-nocookie.com/embed/5kkIJNUGFho"
title="Présentation communautaire d'OpenClaw"
style={{ position: "absolute", top: 0, left: 0, width: "100%", height: "100%" }}
frameBorder="0"
loading="lazy"
allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share"
allowFullScreen
/>
</div>
[Regarder sur YouTube](https://www.youtube.com/watch?v=5kkIJNUGFho)
## 🆕 Tout frais depuis Discord
<p className="showcase-section-intro">
Des réalisations récentes remarquables dans le codage, les outils de développement, le mobile et la création de produits natifs du chat.
</p>
<CardGroup cols={2}>
<Card title="Revue de PR → Retours sur Telegram" icon="code-pull-request" href="https://x.com/i/status/2010878524543131691">
<Card title="Revue de PR → retour Telegram" icon="code-pull-request" href="https://x.com/i/status/2010878524543131691">
**@bangnokia** • `review` `github` `telegram`
OpenCode termine la modification → ouvre une PR → OpenClaw examine le diff et répond dans Telegram avec des « suggestions mineures » ainsi qu'un verdict de fusion clair (y compris les corrections critiques à appliquer d'abord).
OpenCode termine le changement → ouvre une PR → OpenClaw passe en revue le diff et répond dans Telegram avec « suggestions mineures » ainsi quun verdict clair de fusion (y compris les correctifs critiques à appliquer dabord).
<img src="/assets/showcase/pr-review-telegram.jpg" alt="Retours de revue de PR OpenClaw transmis dans Telegram" />
<img src="/assets/showcase/pr-review-telegram.jpg" alt="Retour de revue de PR OpenClaw envoyé dans Telegram" />
</Card>
<Card title="Skill cave à vin en quelques minutes" icon="wine-glass" href="https://x.com/i/status/2010916352454791216">
**@prades_maxime** • `skills` `local` `csv`
A demandé à « Robby » (@openclaw) un skill local pour cave à vin. Il demande un exemple d'export CSV + où le stocker, puis construit/teste rapidement le skill (962 bouteilles dans l'exemple).
A demandé à « Robby » (@openclaw) un Skill local de cave à vin. Il demande un export CSV dexemple + lemplacement où le stocker, puis crée/teste rapidement le Skill (962 bouteilles dans lexemple).
<img src="/assets/showcase/wine-cellar-skill.jpg" alt="OpenClaw créant un skill local de cave à vin à partir d'un CSV" />
<img src="/assets/showcase/wine-cellar-skill.jpg" alt="OpenClaw créant un Skill local de cave à vin à partir dun CSV" />
</Card>
<Card title="Pilote automatique des courses Tesco" icon="cart-shopping" href="https://x.com/i/status/2009724862470689131">
<Card title="Pilote automatique dachats Tesco" icon="cart-shopping" href="https://x.com/i/status/2009724862470689131">
**@marchattonhere** • `automation` `browser` `shopping`
Plan de repas hebdomadaire → produits habituels → réservation d'un créneau de livraison → confirmation de la commande. Aucune API, uniquement du pilotage de navigateur.
Plan de repas hebdomadaire → produits habituels → réservation dun créneau de livraison → confirmation de commande. Sans API, uniquement avec le contrôle du navigateur.
<img src="/assets/showcase/tesco-shop.jpg" alt="Automatisation des courses Tesco via chat" />
<img src="/assets/showcase/tesco-shop.jpg" alt="Automatisation dachats Tesco via chat" />
</Card>
<Card title="SNAG capture d'écran vers Markdown" icon="scissors" href="https://github.com/am-will/snag">
<Card title="SNAG capture décran vers Markdown" icon="scissors" href="https://github.com/am-will/snag">
**@am-will** • `devtools` `screenshots` `markdown`
Raccourci clavier sur une zone de l'écran → vision Gemini → Markdown instantané dans votre presse-papiers.
Touche de raccourci sur une zone de lécran → vision Gemini → Markdown instantané dans votre presse-papiers.
<img src="/assets/showcase/snag.png" alt="Outil SNAG de capture d'écran vers Markdown" />
<img src="/assets/showcase/snag.png" alt="Outil SNAG de capture décran vers Markdown" />
</Card>
<Card title="UI Agents" icon="window-maximize" href="https://releaseflow.net/kitze/agents-ui">
<Card title="Agents UI" icon="window-maximize" href="https://releaseflow.net/kitze/agents-ui">
**@kitze** • `ui` `skills` `sync`
Application de bureau pour gérer les skills/commandes entre Agents, Claude, Codex et OpenClaw.
Application de bureau pour gérer les Skills/commandes entre Agents, Claude, Codex et OpenClaw.
<img src="/assets/showcase/agents-ui.jpg" alt="Application UI Agents" />
<img src="/assets/showcase/agents-ui.jpg" alt="Application Agents UI" />
</Card>
<Card title="Notes vocales Telegram (papla.media)" icon="microphone" href="https://papla.media/docs">
**Communauté**`voice` `tts` `telegram`
Encapsule le TTS de papla.media et envoie les résultats sous forme de notes vocales Telegram (sans lecture automatique agaçante).
Enveloppe le TTS de papla.media et envoie les résultats sous forme de notes vocales Telegram (sans lecture automatique agaçante).
<img src="/assets/showcase/papla-tts.jpg" alt="Sortie en note vocale Telegram à partir du TTS" />
<img src="/assets/showcase/papla-tts.jpg" alt="Sortie de note vocale Telegram à partir du TTS" />
</Card>
<Card title="CodexMonitor" icon="eye" href="https://clawhub.ai/odrobnik/codexmonitor">
@ -151,10 +178,10 @@ Assistant installé via Homebrew pour lister/inspecter/surveiller les sessions l
<img src="/assets/showcase/codexmonitor.png" alt="CodexMonitor sur ClawHub" />
</Card>
<Card title="Contrôle d'imprimante 3D Bambu" icon="print" href="https://clawhub.ai/tobiasbischoff/bambu-cli">
<Card title="Contrôle dimprimante 3D Bambu" icon="print" href="https://clawhub.ai/tobiasbischoff/bambu-cli">
**@tobiasbischoff** • `hardware` `3d-printing` `skill`
Contrôlez et dépannez les imprimantes BambuLab : état, tâches, caméra, AMS, calibration, et plus encore.
Contrôlez et dépannez les imprimantes BambuLab : état, tâches, caméra, AMS, calibration, etc.
<img src="/assets/showcase/bambu-cli.png" alt="Skill Bambu CLI sur ClawHub" />
</Card>
@ -167,77 +194,81 @@ Départs en temps réel, perturbations, état des ascenseurs et itinéraires pou
<img src="/assets/showcase/wienerlinien.png" alt="Skill Wiener Linien sur ClawHub" />
</Card>
<Card title="Repas scolaires ParentPay" icon="utensils" href="#">
<Card title="Repas scolaires ParentPay" icon="utensils">
**@George5562** • `automation` `browser` `parenting`
Réservation automatisée des repas scolaires au Royaume-Uni via ParentPay. Utilise les coordonnées de la souris pour un clic fiable sur les cellules de tableau.
Réservation automatisée de repas scolaires au Royaume-Uni via ParentPay. Utilise des coordonnées de souris pour cliquer de manière fiable dans les cellules du tableau.
</Card>
<Card title="Envoi R2 (Send Me My Files)" icon="cloud-arrow-up" href="https://clawhub.ai/skills/r2-upload">
<Card title="Téléversement R2 (Send Me My Files)" icon="cloud-arrow-up" href="https://clawhub.ai/skills/r2-upload">
**@julianengel** • `files` `r2` `presigned-urls`
Téléversez vers Cloudflare R2/S3 et générez des liens de téléchargement présignés sécurisés. Parfait pour les instances OpenClaw distantes.
</Card>
<Card title="Application iOS via Telegram" icon="mobile" href="#">
<Card title="Application iOS via Telegram" icon="mobile">
**@coard** • `ios` `xcode` `testflight`
A créé une application iOS complète avec cartes et enregistrement vocal, déployée sur TestFlight entièrement via chat Telegram.
A créé une application iOS complète avec cartes et enregistrement vocal, puis la déployée sur TestFlight entièrement via chat Telegram.
<img src="/assets/showcase/ios-testflight.jpg" alt="Application iOS sur TestFlight" />
</Card>
<Card title="Assistant santé Oura Ring" icon="heart-pulse" href="#">
<Card title="Assistant santé Oura Ring" icon="heart-pulse">
**@AS** • `health` `oura` `calendar`
Assistant de santé IA personnel intégrant les données Oura ring avec le calendrier, les rendez-vous et le planning de sport.
Assistant IA personnel de santé intégrant les données Oura Ring avec lagenda, les rendez-vous et le programme de sport.
<img src="/assets/showcase/oura-health.png" alt="Assistant santé Oura ring" />
<img src="/assets/showcase/oura-health.png" alt="Assistant santé Oura Ring" />
</Card>
<Card title="L'équipe de rêve de Kev (14+ agents)" icon="robot" href="https://github.com/adam91holt/orchestrated-ai-articles">
<Card title="Léquipe de rêve de Kev (14+ agents)" icon="robot" href="https://github.com/adam91holt/orchestrated-ai-articles">
**@adam91holt** • `multi-agent` `orchestration` `architecture` `manifesto`
14+ agents sous une seule gateway avec un orchestrateur Opus 4.5 déléguant à des workers Codex. [Présentation technique complète](https://github.com/adam91holt/orchestrated-ai-articles) couvrant la composition de la Dream Team, la sélection des modèles, le sandboxing, les webhooks, les heartbeats et les flux de délégation. [Clawdspace](https://github.com/adam91holt/clawdspace) pour le sandboxing des agents. [Article de blog](https://adams-ai-journey.ghost.io/2026-the-year-of-the-orchestrator/).
14+ agents sous un même Gateway avec un orchestrateur Opus 4.5 qui délègue à des workers Codex. [Présentation technique](https://github.com/adam91holt/orchestrated-ai-articles) complète couvrant la composition de la Dream Team, la sélection des modèles, le sandboxing, les Webhooks, les Heartbeats et les flux de délégation. [Clawdspace](https://github.com/adam91holt/clawdspace) pour le sandboxing des agents. [Article de blog](https://adams-ai-journey.ghost.io/2026-the-year-of-the-orchestrator/).
</Card>
<Card title="CLI Linear" icon="terminal" href="https://github.com/Finesssee/linear-cli">
**@NessZerra** • `devtools` `linear` `cli` `issues`
CLI pour Linear qui s'intègre aux workflows agentiques (Claude Code, OpenClaw). Gérez les tickets, projets et workflows depuis le terminal. Première PR externe fusionnée !
CLI pour Linear qui sintègre aux flux de travail agentiques (Claude Code, OpenClaw). Gérez les tickets, projets et flux de travail depuis le terminal. Première PR externe fusionnée !
</Card>
<Card title="CLI Beeper" icon="message" href="https://github.com/blqke/beepcli">
**@jules** • `messaging` `beeper` `cli` `automation`
Lisez, envoyez et archivez des messages via Beeper Desktop. Utilise l'API MCP locale de Beeper pour que les agents puissent gérer toutes vos discussions (iMessage, WhatsApp, etc.) au même endroit.
Lisez, envoyez et archivez des messages via Beeper Desktop. Utilise lAPI MCP locale de Beeper pour que les agents puissent gérer tous vos chats (iMessage, WhatsApp, etc.) en un seul endroit.
</Card>
</CardGroup>
## 🤖 Automatisation et workflows
<h2 id="automation-workflows">Automatisation &amp; flux de travail</h2>
<p className="showcase-section-intro">
Planification, contrôle du navigateur, boucles de support et le côté « fais simplement la tâche à ma place » du produit.
</p>
<CardGroup cols={2}>
<Card title="Contrôle du purificateur d'air Winix" icon="wind" href="https://x.com/antonplex/status/2010518442471006253">
<Card title="Contrôle de purificateur dair Winix" icon="wind" href="https://x.com/antonplex/status/2010518442471006253">
**@antonplex** • `automation` `hardware` `air-quality`
Claude Code a découvert et confirmé les commandes du purificateur, puis OpenClaw prend le relais pour gérer la qualité de l'air de la pièce.
Claude Code a découvert et confirmé les contrôles du purificateur, puis OpenClaw prend le relais pour gérer la qualité de lair de la pièce.
<img src="/assets/showcase/winix-air-purifier.jpg" alt="Contrôle du purificateur d'air Winix via OpenClaw" />
<img src="/assets/showcase/winix-air-purifier.jpg" alt="Contrôle de purificateur dair Winix via OpenClaw" />
</Card>
<Card title="Belles photos du ciel par caméra" icon="camera" href="https://x.com/signalgaining/status/2010523120604746151">
**@signalgaining** • `automation` `camera` `skill` `images`
Déclenché par une caméra sur le toit : demandez à OpenClaw de prendre une photo du ciel chaque fois qu'il est beau — il a conçu un skill et pris le cliché.
Déclenché par une caméra de toit : demandez à OpenClaw de prendre une photo du ciel dès quil est beau — il a conçu un Skill et pris la photo.
<img src="/assets/showcase/roof-camera-sky.jpg" alt="Photo du ciel prise par la caméra de toit avec OpenClaw" />
<img src="/assets/showcase/roof-camera-sky.jpg" alt="Capture du ciel prise par une caméra de toit avec OpenClaw" />
</Card>
<Card title="Scène visuelle pour briefing matinal" icon="robot" href="https://x.com/buddyhadry/status/2010005331925954739">
<Card title="Scène de briefing visuel du matin" icon="robot" href="https://x.com/buddyhadry/status/2010005331925954739">
**@buddyhadry** • `automation` `briefing` `images` `telegram`
Une invite planifiée génère chaque matin une image de « scène » unique (météo, tâches, date, publication/citation favorite) via un persona OpenClaw.
Un prompt planifié génère chaque matin une image de « scène » unique (météo, tâches, date, publication/citation favorite) via un persona OpenClaw.
</Card>
<Card title="Réservation de terrain de padel" icon="calendar-check" href="https://github.com/joshp123/padel-cli">
@ -245,61 +276,65 @@ Une invite planifiée génère chaque matin une image de « scène » unique (m
Vérificateur de disponibilité Playtomic + CLI de réservation. Ne manquez plus jamais un terrain libre.
<img src="/assets/showcase/padel-screenshot.jpg" alt="Capture d'écran de padel-cli" />
<img src="/assets/showcase/padel-screenshot.jpg" alt="Capture décran de padel-cli" />
</Card>
<Card title="Collecte comptable" icon="file-invoice-dollar">
**Communauté**`automation` `email` `pdf`
Récupère les PDF depuis les e-mails, prépare les documents pour le conseiller fiscal. Comptabilité mensuelle en pilote automatique.
Récupère des PDF depuis les e-mails, prépare les documents pour le conseiller fiscal. Comptabilité mensuelle en pilote automatique.
</Card>
<Card title="Mode dev depuis le canapé" icon="couch" href="https://davekiss.com">
**@davekiss** • `telegram` `website` `migration` `astro`
A reconstruit tout son site personnel via Telegram en regardant Netflix — Notion → Astro, 18 articles migrés, DNS vers Cloudflare. N'a jamais ouvert un ordinateur portable.
A entièrement reconstruit son site personnel via Telegram en regardant Netflix — Notion → Astro, 18 articles migrés, DNS vers Cloudflare. Na jamais ouvert un ordinateur portable.
</Card>
<Card title="Agent de recherche d'emploi" icon="briefcase">
<Card title="Agent de recherche demploi" icon="briefcase">
**@attol8** • `automation` `api` `skill`
Recherche des offres d'emploi, les compare aux mots-clés du CV et renvoie les opportunités pertinentes avec liens. Construit en 30 minutes avec l'API JSearch.
Recherche des offres demploi, les compare aux mots-clés du CV et renvoie des opportunités pertinentes avec liens. Construit en 30 minutes avec lAPI JSearch.
</Card>
<Card title="Créateur de skill Jira" icon="diagram-project" href="https://x.com/jdrhyne/status/2008336434827002232">
<Card title="Générateur de Skill Jira" icon="diagram-project" href="https://x.com/jdrhyne/status/2008336434827002232">
**@jdrhyne** • `automation` `jira` `skill` `devtools`
OpenClaw s'est connecté à Jira, puis a généré un nouveau skill à la volée (avant même qu'il n'existe sur ClawHub).
OpenClaw sest connecté à Jira, puis a généré un nouveau Skill à la volée (avant même quil nexiste sur ClawHub).
</Card>
<Card title="Skill Todoist via Telegram" icon="list-check" href="https://x.com/iamsubhrajyoti/status/2009949389884920153">
**@iamsubhrajyoti** • `automation` `todoist` `skill` `telegram`
A automatisé des tâches Todoist et fait générer le skill directement par OpenClaw dans le chat Telegram.
A automatisé les tâches Todoist et a fait générer le Skill par OpenClaw directement dans le chat Telegram.
</Card>
<Card title="Analyse TradingView" icon="chart-line">
**@bheem1798** • `finance` `browser` `automation`
Se connecte à TradingView via automatisation de navigateur, capture des graphiques et effectue une analyse technique à la demande. Aucune API nécessaire — uniquement le contrôle du navigateur.
Se connecte à TradingView via lautomatisation du navigateur, capture les graphiques et effectue une analyse technique à la demande. Pas besoin dAPI — juste du contrôle de navigateur.
</Card>
<Card title="Support auto sur Slack" icon="slack">
<Card title="Support automatique Slack" icon="slack">
**@henrymascot** • `slack` `automation` `support`
Surveille le canal Slack de l'entreprise, répond utilement et transfère les notifications vers Telegram. A corrigé de façon autonome un bug de production dans une application déployée sans qu'on le lui demande.
Surveille le canal Slack de lentreprise, répond utilement et transfère les notifications vers Telegram. A corrigé de façon autonome un bug de production dans une application déployée sans quon le lui demande.
</Card>
</CardGroup>
## 🧠 Connaissances et mémoire
<h2 id="knowledge-memory">Connaissances &amp; mémoire</h2>
<p className="showcase-section-intro">
Systèmes qui indexent, recherchent, mémorisent et raisonnent sur des connaissances personnelles ou déquipe.
</p>
<CardGroup cols={2}>
<Card title="Apprentissage du chinois xuezh" icon="language" href="https://github.com/joshp123/xuezh">
**@joshp123** • `learning` `voice` `skill`
Moteur d'apprentissage du chinois avec retour sur la prononciation et parcours d'étude via OpenClaw.
Moteur dapprentissage du chinois avec retour sur la prononciation et parcours détude via OpenClaw.
<img src="/assets/showcase/xuezh-pronunciation.jpeg" alt="Retour sur la prononciation xuezh" />
</Card>
@ -307,31 +342,35 @@ Surveille le canal Slack de l'entreprise, répond utilement et transfère les no
<Card title="Coffre-fort mémoire WhatsApp" icon="vault">
**Communauté**`memory` `transcription` `indexing`
Ingère des exports complets WhatsApp, transcrit plus de 1 000 notes vocales, recoupe avec les journaux git et produit des rapports Markdown liés.
Ingère des exports WhatsApp complets, transcrit plus de 1 000 notes vocales, recoupe avec les journaux git et produit des rapports Markdown liés.
</Card>
<Card title="Recherche sémantique Karakeep" icon="magnifying-glass" href="https://github.com/jamesbrooksco/karakeep-semantic-search">
**@jamesbrooksco** • `search` `vector` `bookmarks`
Ajoute la recherche vectorielle aux favoris Karakeep à l'aide des embeddings Qdrant + OpenAI/Ollama.
Ajoute la recherche vectorielle aux marque-pages Karakeep à laide de Qdrant + embeddings OpenAI/Ollama.
</Card>
<Card title="Mémoire Inside-Out-2" icon="brain">
**Communauté**`memory` `beliefs` `self-model`
Gestionnaire de mémoire séparé qui transforme les fichiers de session en souvenirs → croyances → modèle de soi en évolution.
Gestionnaire de mémoire séparé qui transforme les fichiers de session en souvenirs → croyances → modèle de soi évolutif.
</Card>
</CardGroup>
## 🎙️ Voix et téléphone
<h2 id="voice-phone">Voix &amp; téléphone</h2>
<p className="showcase-section-intro">
Points dentrée orientés parole, ponts téléphoniques et flux de travail riches en transcription.
</p>
<CardGroup cols={2}>
<Card title="Pont téléphonique Clawdia" icon="phone" href="https://github.com/alejandroOPI/clawdia-bridge">
**@alejandroOPI** • `voice` `vapi` `bridge`
Pont HTTP entre l'assistant vocal Vapi et OpenClaw. Appels téléphoniques quasi temps réel avec votre agent.
Assistant vocal Vapi ↔ pont HTTP OpenClaw. Appels téléphoniques quasi temps réel avec votre agent.
</Card>
<Card title="Transcription OpenRouter" icon="microphone" href="https://clawhub.ai/obviyus/openrouter-transcribe">
@ -342,14 +381,18 @@ Transcription audio multilingue via OpenRouter (Gemini, etc.). Disponible sur Cl
</CardGroup>
## 🏗️ Infrastructure et déploiement
<h2 id="infrastructure-deployment">Infrastructure &amp; déploiement</h2>
<p className="showcase-section-intro">
Packaging, déploiement et intégrations qui rendent OpenClaw plus facile à exécuter et à étendre.
</p>
<CardGroup cols={2}>
<Card title="Module complémentaire Home Assistant" icon="home" href="https://github.com/ngutman/openclaw-ha-addon">
**@ngutman** • `homeassistant` `docker` `raspberry-pi`
Gateway OpenClaw exécutée sur Home Assistant OS avec prise en charge des tunnels SSH et état persistant.
Gateway OpenClaw exécuté sur Home Assistant OS avec prise en charge du tunnel SSH et état persistant.
</Card>
<Card title="Skill Home Assistant" icon="toggle-on" href="https://clawhub.ai/skills/homeassistant">
@ -361,7 +404,7 @@ Transcription audio multilingue via OpenRouter (Gemini, etc.). Disponible sur Cl
<Card title="Packaging Nix" icon="snowflake" href="https://github.com/openclaw/nix-openclaw">
**@openclaw** • `nix` `packaging` `deployment`
Configuration OpenClaw nixifiée prête à l'emploi pour des déploiements reproductibles.
Configuration OpenClaw nixifiée, complète et prête à lemploi pour des déploiements reproductibles.
</Card>
<Card title="Calendrier CalDAV" icon="calendar" href="https://clawhub.ai/skills/caldav-calendar">
@ -372,7 +415,11 @@ Transcription audio multilingue via OpenRouter (Gemini, etc.). Disponible sur Cl
</CardGroup>
## 🏠 Maison et matériel
<h2 id="home-hardware">Maison &amp; matériel</h2>
<p className="showcase-section-intro">
Le côté monde physique dOpenClaw : maisons, capteurs, caméras, aspirateurs et autres appareils.
</p>
<CardGroup cols={2}>
@ -389,37 +436,45 @@ Transcription audio multilingue via OpenRouter (Gemini, etc.). Disponible sur Cl
Contrôlez votre aspirateur robot Roborock par conversation naturelle.
<img src="/assets/showcase/roborock-screenshot.jpg" alt="État de Roborock" />
<img src="/assets/showcase/roborock-screenshot.jpg" alt="État Roborock" />
</Card>
</CardGroup>
## 🌟 Projets de la communauté
<h2 id="community-projects">Projets communautaires</h2>
<p className="showcase-section-intro">
Des choses qui ont dépassé un simple flux de travail pour devenir des produits ou des écosystèmes plus larges.
</p>
<CardGroup cols={2}>
<Card title="Place de marché StarSwap" icon="star" href="https://star-swap.com/">
<Card title="Marketplace StarSwap" icon="star" href="https://star-swap.com/">
**Communauté**`marketplace` `astronomy` `webapp`
Place de marché complète pour le matériel d'astronomie. Construite avec/autour de l'écosystème OpenClaw.
Marketplace complète pour le matériel dastronomie. Construite avec/autour de lécosystème OpenClaw.
</Card>
</CardGroup>
---
## Soumettez votre projet
<h2 id="submit-your-project">Soumettre votre projet</h2>
<p className="showcase-section-intro">
Si vous construisez quelque chose dintéressant avec OpenClaw, envoyez-le-nous. Des captures décran percutantes et des résultats concrets aident.
</p>
Vous avez quelque chose à partager ? Nous serions ravis de le mettre en avant !
<Steps>
<Step title="Partagez-le">
Publiez dans [#self-promotion sur Discord](https://discord.gg/clawd) ou [mentionnez @openclaw dans un post sur X](https://x.com/openclaw)
Publiez dans [#self-promotion sur Discord](https://discord.gg/clawd) ou [tweet @openclaw](https://x.com/openclaw)
</Step>
<Step title="Incluez des détails">
Dites-nous ce que cela fait, ajoutez un lien vers le dépôt/la démo, partagez une capture d'écran si vous en avez une
Dites-nous ce que cela fait, mettez le lien vers le dépôt/la démo, partagez une capture décran si vous en avez une
</Step>
<Step title="Soyez mis en avant">
Nous ajouterons les projets les plus remarquables à cette page
Nous ajouterons les projets remarquables à cette page
</Step>
</Steps>

View File

@ -3,76 +3,76 @@ read_when:
- Génération de vidéos via lagent
- Configuration des fournisseurs et des modèles de génération de vidéos
- Comprendre les paramètres de loutil `video_generate`
summary: Générez des vidéos à partir de texte, dimages ou de vidéos existantes à laide de 14 backends de fournisseur
summary: Générez des vidéos à partir de texte, dimages ou de vidéos existantes à laide de 14 backends de fournisseurs
title: Génération de vidéos
x-i18n:
generated_at: "2026-04-11T15:16:00Z"
generated_at: "2026-04-15T06:57:20Z"
model: gpt-5.4
provider: openai
source_hash: 0ec159a0bbb6b8a030e68828c0a8bcaf40c8538ecf98bc8ff609dab9d0068263
source_hash: c182f24b25e44f157a820e82a1f7422247f26125956944b5eb98613774268cfe
source_path: tools/video-generation.md
workflow: 15
---
# Génération de vidéos
Les agents OpenClaw peuvent générer des vidéos à partir dinvites textuelles, dimages de référence ou de vidéos existantes. Quatorze backends de fournisseur sont pris en charge, chacun avec différentes options de modèle, modes dentrée et ensembles de fonctionnalités. Lagent choisit automatiquement le bon fournisseur en fonction de votre configuration et des clés API disponibles.
Les agents OpenClaw peuvent générer des vidéos à partir dinvites textuelles, dimages de référence ou de vidéos existantes. Quatorze backends de fournisseurs sont pris en charge, chacun avec des options de modèle, des modes dentrée et des ensembles de fonctionnalités différents. Lagent choisit automatiquement le bon fournisseur en fonction de votre configuration et des clés API disponibles.
<Note>
Loutil `video_generate` napparaît que lorsquau moins un fournisseur de génération de vidéos est disponible. Si vous ne le voyez pas dans les outils de votre agent, définissez une clé API de fournisseur ou configurez `agents.defaults.videoGenerationModel`.
Loutil `video_generate` napparaît que lorsquau moins un fournisseur de génération vidéo est disponible. Si vous ne le voyez pas dans les outils de votre agent, définissez une clé API de fournisseur ou configurez `agents.defaults.videoGenerationModel`.
</Note>
OpenClaw traite la génération de vidéos selon trois modes dexécution :
OpenClaw traite la génération vidéo selon trois modes dexécution :
- `generate` pour les demandes de texte vers vidéo sans média de référence
- `imageToVideo` lorsque la demande inclut une ou plusieurs images de référence
- `videoToVideo` lorsque la demande inclut une ou plusieurs vidéos de référence
- `generate` pour les requêtes de génération texte-vers-vidéo sans média de référence
- `imageToVideo` lorsque la requête inclut une ou plusieurs images de référence
- `videoToVideo` lorsque la requête inclut une ou plusieurs vidéos de référence
Les fournisseurs peuvent prendre en charge nimporte quel sous-ensemble de ces modes. Loutil valide le mode actif avant lenvoi et signale les modes pris en charge dans `action=list`.
## Démarrage rapide
1. Définissez une clé API pour nimporte quel fournisseur pris en charge :
1. Définissez une clé API pour nimporte quel fournisseur pris en charge :
```bash
export GEMINI_API_KEY="your-key"
```
2. Épinglez éventuellement un modèle par défaut :
2. Épinglez éventuellement un modèle par défaut :
```bash
openclaw config set agents.defaults.videoGenerationModel.primary "google/veo-3.1-fast-generate-preview"
```
3. Demandez à lagent :
3. Demandez à lagent :
> Générez une vidéo cinématographique de 5 secondes dun homard sympathique faisant du surf au coucher du soleil.
> Génère une vidéo cinématique de 5 secondes dun homard amical faisant du surf au coucher du soleil.
Lagent appelle automatiquement `video_generate`. Aucune liste dautorisation doutils nest nécessaire.
## Ce qui se passe lorsque vous générez une vidéo
La génération de vidéos est asynchrone. Lorsque lagent appelle `video_generate` dans une session :
La génération vidéo est asynchrone. Lorsque lagent appelle `video_generate` dans une session :
1. OpenClaw envoie la demande au fournisseur et renvoie immédiatement un ID de tâche.
2. Le fournisseur traite le travail en arrière-plan (généralement de 30 secondes à 5 minutes selon le fournisseur et la résolution).
3. Lorsque la vidéo est prête, OpenClaw réactive la même session avec un événement interne de fin.
1. OpenClaw envoie la requête au fournisseur et renvoie immédiatement un ID de tâche.
2. Le fournisseur traite la tâche en arrière-plan (généralement de 30 secondes à 5 minutes selon le fournisseur et la résolution).
3. Lorsque la vidéo est prête, OpenClaw réveille la même session avec un événement de fin interne.
4. Lagent publie la vidéo terminée dans la conversation dorigine.
Pendant quune tâche est en cours, les appels `video_generate` en double dans la même session renvoient létat actuel de la tâche au lieu de démarrer une autre génération. Utilisez `openclaw tasks list` ou `openclaw tasks show <taskId>` pour vérifier la progression depuis la CLI.
Pendant quune tâche est en cours, les appels `video_generate` en double dans la même session renvoient létat actuel de la tâche au lieu de démarrer une nouvelle génération. Utilisez `openclaw tasks list` ou `openclaw tasks show <taskId>` pour vérifier la progression depuis la CLI.
En dehors des exécutions dagent adossées à une session (par exemple, des invocations directes doutils), loutil revient à une génération en ligne et renvoie le chemin final du média dans le même tour.
En dehors des exécutions dagent adossées à une session (par exemple, les invocations directes doutils), loutil revient à une génération inline et renvoie le chemin final du média dans le même tour.
### Cycle de vie dune tâche
### Cycle de vie de la tâche
Chaque demande `video_generate` passe par quatre états :
Chaque requête `video_generate` passe par quatre états :
1. **queued** -- tâche créée, en attente que le fournisseur laccepte.
2. **running** -- le fournisseur traite la demande (généralement de 30 secondes à 5 minutes selon le fournisseur et la résolution).
3. **succeeded** -- vidéo prête ; lagent se réactive et la publie dans la conversation.
4. **failed** -- erreur du fournisseur ou expiration du délai ; lagent se réactive avec les détails de lerreur.
2. **running** -- le fournisseur traite la requête (généralement de 30 secondes à 5 minutes selon le fournisseur et la résolution).
3. **succeeded** -- vidéo prête ; lagent se réveille et la publie dans la conversation.
4. **failed** -- erreur du fournisseur ou expiration ; lagent se réveille avec les détails de lerreur.
Vérifiez létat depuis la CLI :
Vérifiez létat depuis la CLI :
```bash
openclaw tasks list
@ -80,49 +80,49 @@ openclaw tasks show <taskId>
openclaw tasks cancel <taskId>
```
Prévention des doublons : si une tâche vidéo est déjà `queued` ou `running` pour la session actuelle, `video_generate` renvoie létat de la tâche existante au lieu den démarrer une nouvelle. Utilisez `action: "status"` pour vérifier explicitement sans déclencher une nouvelle génération.
Prévention des doublons : si une tâche vidéo est déjà `queued` ou `running` pour la session actuelle, `video_generate` renvoie létat de la tâche existante au lieu den démarrer une nouvelle. Utilisez `action: "status"` pour vérifier explicitement sans déclencher une nouvelle génération.
## Fournisseurs pris en charge
| Fournisseur | Modèle par défaut | Texte | Image de réf. | Vidéo de réf. | Clé API |
| --------------------- | ------------------------------- | ----- | --------------------------------------------------- | ---------------- | ----------------------------------------- |
| Alibaba | `wan2.6-t2v` | Oui | Oui (URL distante) | Oui (URL distante) | `MODELSTUDIO_API_KEY` |
| BytePlus (1.0) | `seedance-1-0-pro-250528` | Oui | Jusquà 2 images (modèles I2V uniquement ; première + dernière image) | Non | `BYTEPLUS_API_KEY` |
| BytePlus Seedance 1.5 | `seedance-1-5-pro-251215` | Oui | Jusquà 2 images (première + dernière image via rôle) | Non | `BYTEPLUS_API_KEY` |
| BytePlus Seedance 2.0 | `dreamina-seedance-2-0-260128` | Oui | Jusquà 9 images de référence | Jusquà 3 vidéos | `BYTEPLUS_API_KEY` |
| ComfyUI | `workflow` | Oui | 1 image | Non | `COMFY_API_KEY` ou `COMFY_CLOUD_API_KEY` |
| fal | `fal-ai/minimax/video-01-live` | Oui | 1 image | Non | `FAL_KEY` |
| Google | `veo-3.1-fast-generate-preview` | Oui | 1 image | 1 vidéo | `GEMINI_API_KEY` |
| MiniMax | `MiniMax-Hailuo-2.3` | Oui | 1 image | Non | `MINIMAX_API_KEY` |
| OpenAI | `sora-2` | Oui | 1 image | 1 vidéo | `OPENAI_API_KEY` |
| Qwen | `wan2.6-t2v` | Oui | Oui (URL distante) | Oui (URL distante) | `QWEN_API_KEY` |
| Runway | `gen4.5` | Oui | 1 image | 1 vidéo | `RUNWAYML_API_SECRET` |
| Together | `Wan-AI/Wan2.2-T2V-A14B` | Oui | 1 image | Non | `TOGETHER_API_KEY` |
| Vydra | `veo3` | Oui | 1 image (`kling`) | Non | `VYDRA_API_KEY` |
| xAI | `grok-imagine-video` | Oui | 1 image | 1 vidéo | `XAI_API_KEY` |
| Fournisseur | Modèle par défaut | Texte | Image de référence | Vidéo de référence | Clé API |
| --------------------- | ------------------------------- | ----- | --------------------------------------------------- | ------------------ | ---------------------------------------- |
| Alibaba | `wan2.6-t2v` | Oui | Oui (URL distante) | Oui (URL distante) | `MODELSTUDIO_API_KEY` |
| BytePlus (1.0) | `seedance-1-0-pro-250528` | Oui | Jusquà 2 images (modèles I2V uniquement ; première et dernière image) | Non | `BYTEPLUS_API_KEY` |
| BytePlus Seedance 1.5 | `seedance-1-5-pro-251215` | Oui | Jusquà 2 images (première et dernière image via rôle) | Non | `BYTEPLUS_API_KEY` |
| BytePlus Seedance 2.0 | `dreamina-seedance-2-0-260128` | Oui | Jusquà 9 images de référence | Jusquà 3 vidéos | `BYTEPLUS_API_KEY` |
| ComfyUI | `workflow` | Oui | 1 image | Non | `COMFY_API_KEY` ou `COMFY_CLOUD_API_KEY` |
| fal | `fal-ai/minimax/video-01-live` | Oui | 1 image | Non | `FAL_KEY` |
| Google | `veo-3.1-fast-generate-preview` | Oui | 1 image | 1 vidéo | `GEMINI_API_KEY` |
| MiniMax | `MiniMax-Hailuo-2.3` | Oui | 1 image | Non | `MINIMAX_API_KEY` |
| OpenAI | `sora-2` | Oui | 1 image | 1 vidéo | `OPENAI_API_KEY` |
| Qwen | `wan2.6-t2v` | Oui | Oui (URL distante) | Oui (URL distante) | `QWEN_API_KEY` |
| Runway | `gen4.5` | Oui | 1 image | 1 vidéo | `RUNWAYML_API_SECRET` |
| Together | `Wan-AI/Wan2.2-T2V-A14B` | Oui | 1 image | Non | `TOGETHER_API_KEY` |
| Vydra | `veo3` | Oui | 1 image (`kling`) | Non | `VYDRA_API_KEY` |
| xAI | `grok-imagine-video` | Oui | 1 image | 1 vidéo | `XAI_API_KEY` |
Certains fournisseurs acceptent des variables denvironnement de clé API supplémentaires ou alternatives. Consultez les [pages des fournisseurs](#related) correspondantes pour plus de détails.
Certains fournisseurs acceptent des variables denvironnement de clé API supplémentaires ou alternatives. Consultez les [pages des fournisseurs](#related) individuelles pour plus de détails.
Exécutez `video_generate action=list` pour inspecter à lexécution les fournisseurs, modèles et modes dexécution disponibles.
### Matrice des capacités déclarées
Il sagit du contrat de mode explicite utilisé par `video_generate`, les tests de contrat et le balayage partagé en direct.
Il sagit du contrat de mode explicite utilisé par `video_generate`, les tests de contrat et le balayage live partagé.
| Fournisseur | `generate` | `imageToVideo` | `videoToVideo` | Voies partagées en direct aujourdhui |
| ----------- | ---------- | -------------- | -------------- | ---------------------------------------------------------------------------------------------------------------------------------------- |
| Alibaba | Oui | Oui | Oui | `generate`, `imageToVideo` ; `videoToVideo` ignoré, car ce fournisseur nécessite des URL vidéo distantes `http(s)` |
| BytePlus | Oui | Oui | Non | `generate`, `imageToVideo` |
| ComfyUI | Oui | Oui | Non | Pas dans le balayage partagé ; la couverture spécifique au workflow se trouve dans les tests ComfyUI |
| fal | Oui | Oui | Non | `generate`, `imageToVideo` |
| Google | Oui | Oui | Oui | `generate`, `imageToVideo` ; `videoToVideo` partagé ignoré, car le balayage Gemini/Veo actuel adossé à un buffer naccepte pas cette entrée |
| MiniMax | Oui | Oui | Non | `generate`, `imageToVideo` |
| OpenAI | Oui | Oui | Oui | `generate`, `imageToVideo` ; `videoToVideo` partagé ignoré, car ce chemin org/entrée nécessite actuellement un accès inpaint/remix côté fournisseur |
| Qwen | Oui | Oui | Oui | `generate`, `imageToVideo` ; `videoToVideo` ignoré, car ce fournisseur nécessite des URL vidéo distantes `http(s)` |
| Runway | Oui | Oui | Oui | `generate`, `imageToVideo` ; `videoToVideo` sexécute uniquement lorsque le modèle sélectionné est `runway/gen4_aleph` |
| Together | Oui | Oui | Non | `generate`, `imageToVideo` |
| Vydra | Oui | Oui | Non | `generate` ; `imageToVideo` partagé ignoré, car le `veo3` groupé est uniquement textuel et le `kling` groupé nécessite une URL dimage distante |
| xAI | Oui | Oui | Oui | `generate`, `imageToVideo` ; `videoToVideo` ignoré, car ce fournisseur nécessite actuellement une URL MP4 distante |
| Fournisseur | `generate` | `imageToVideo` | `videoToVideo` | Canaux live partagés actuels |
| ----------- | ---------- | -------------- | -------------- | --------------------------------------------------------------------------------------------------------------------------------------- |
| Alibaba | Oui | Oui | Oui | `generate`, `imageToVideo` ; `videoToVideo` ignoré parce que ce fournisseur exige des URL vidéo distantes `http(s)` |
| BytePlus | Oui | Oui | Non | `generate`, `imageToVideo` |
| ComfyUI | Oui | Oui | Non | Pas dans le balayage partagé ; la couverture spécifique au workflow se trouve dans les tests ComfyUI |
| fal | Oui | Oui | Non | `generate`, `imageToVideo` |
| Google | Oui | Oui | Oui | `generate`, `imageToVideo` ; `videoToVideo` partagé ignoré parce que le balayage Gemini/Veo actuel adossé à un buffer naccepte pas cette entrée |
| MiniMax | Oui | Oui | Non | `generate`, `imageToVideo` |
| OpenAI | Oui | Oui | Oui | `generate`, `imageToVideo` ; `videoToVideo` partagé ignoré parce que ce chemin org/entrée exige actuellement un accès inpaint/remix côté fournisseur |
| Qwen | Oui | Oui | Oui | `generate`, `imageToVideo` ; `videoToVideo` ignoré parce que ce fournisseur exige des URL vidéo distantes `http(s)` |
| Runway | Oui | Oui | Oui | `generate`, `imageToVideo` ; `videoToVideo` ne sexécute que lorsque le modèle sélectionné est `runway/gen4_aleph` |
| Together | Oui | Oui | Non | `generate`, `imageToVideo` |
| Vydra | Oui | Oui | Non | `generate` ; `imageToVideo` partagé ignoré parce que le `veo3` fourni est texte uniquement et que le `kling` fourni exige une URL dimage distante |
| xAI | Oui | Oui | Oui | `generate`, `imageToVideo` ; `videoToVideo` ignoré parce que ce fournisseur exige actuellement une URL MP4 distante |
## Paramètres de loutil
@ -134,19 +134,19 @@ Il sagit du contrat de mode explicite utilisé par `video_generate`, les test
### Entrées de contenu
| Paramètre | Type | Description |
| ----------- | -------- | ---------------------------------------------------------------------------------------------------------------------------------------- |
| `image` | string | Image de référence unique (chemin ou URL) |
| `images` | string[] | Plusieurs images de référence (jusquà 9) |
| `imageRoles`| string[] | Indications de rôle facultatives par position, parallèles à la liste dimages combinée. Valeurs canoniques : `first_frame`, `last_frame`, `reference_image` |
| `video` | string | Vidéo de référence unique (chemin ou URL) |
| `videos` | string[] | Plusieurs vidéos de référence (jusquà 4) |
| `videoRoles`| string[] | Indications de rôle facultatives par position, parallèles à la liste de vidéos combinée. Valeur canonique : `reference_video` |
| `audioRef` | string | Référence audio unique (chemin ou URL). Utilisée par exemple pour une musique de fond ou une référence vocale lorsque le fournisseur prend en charge les entrées audio |
| `audioRefs` | string[] | Plusieurs références audio (jusquà 3) |
| `audioRoles`| string[] | Indications de rôle facultatives par position, parallèles à la liste daudios combinée. Valeur canonique : `reference_audio` |
| Paramètre | Type | Description |
| ------------ | -------- | ---------------------------------------------------------------------------------------------------------------------------------------- |
| `image` | string | Image de référence unique (chemin ou URL) |
| `images` | string[] | Plusieurs images de référence (jusquà 9) |
| `imageRoles` | string[] | Indications de rôle facultatives par position parallèles à la liste dimages combinée. Valeurs canoniques : `first_frame`, `last_frame`, `reference_image` |
| `video` | string | Vidéo de référence unique (chemin ou URL) |
| `videos` | string[] | Plusieurs vidéos de référence (jusquà 4) |
| `videoRoles` | string[] | Indications de rôle facultatives par position parallèles à la liste de vidéos combinée. Valeur canonique : `reference_video` |
| `audioRef` | string | Audio de référence unique (chemin ou URL). Utilisé par exemple pour une musique de fond ou une référence vocale lorsque le fournisseur prend en charge les entrées audio |
| `audioRefs` | string[] | Plusieurs audios de référence (jusquà 3) |
| `audioRoles` | string[] | Indications de rôle facultatives par position parallèles à la liste daudios combinée. Valeur canonique : `reference_audio` |
Les indications de rôle sont transmises telles quelles au fournisseur. Les valeurs canoniques proviennent de lunion `VideoGenerationAssetRole`, mais les fournisseurs peuvent accepter des chaînes de rôle supplémentaires. Les tableaux `*Roles` ne doivent pas comporter plus dentrées que la liste de références correspondante ; les erreurs de décalage dune position échouent avec un message clair. Utilisez une chaîne vide pour laisser un emplacement non défini.
Les indications de rôle sont transmises telles quelles au fournisseur. Les valeurs canoniques proviennent de lunion `VideoGenerationAssetRole`, mais les fournisseurs peuvent accepter des chaînes de rôle supplémentaires. Les tableaux `*Roles` ne doivent pas contenir plus dentrées que la liste de références correspondante ; les erreurs de décalage dun élément échouent avec un message clair. Utilisez une chaîne vide pour laisser une position non définie.
### Contrôles de style
@ -156,53 +156,53 @@ Les indications de rôle sont transmises telles quelles au fournisseur. Les vale
| `resolution` | string | `480P`, `720P`, `768P` ou `1080P` |
| `durationSeconds`| number | Durée cible en secondes (arrondie à la valeur prise en charge la plus proche par le fournisseur) |
| `size` | string | Indication de taille lorsque le fournisseur la prend en charge |
| `audio` | boolean | Active laudio généré dans la sortie lorsquil est pris en charge. Distinct de `audioRef*` (entrées) |
| `watermark` | boolean | Active ou désactive le filigrane du fournisseur lorsquil est pris en charge |
| `audio` | boolean | Active laudio généré dans la sortie lorsque cest pris en charge. Distinct de `audioRef*` (entrées) |
| `watermark` | boolean | Active ou désactive le filigrane du fournisseur lorsque cest pris en charge |
`adaptive` est une valeur sentinelle spécifique au fournisseur : elle est transmise telle quelle aux fournisseurs qui déclarent `adaptive` dans leurs capacités (par exemple, BytePlus Seedance lutilise pour détecter automatiquement le ratio à partir des dimensions de limage dentrée). Les fournisseurs qui ne la déclarent pas exposent la valeur via `details.ignoredOverrides` dans le résultat de loutil afin que lomission soit visible.
`adaptive` est une valeur sentinelle spécifique au fournisseur : elle est transmise telle quelle aux fournisseurs qui déclarent `adaptive` dans leurs capacités (par exemple, BytePlus Seedance lutilise pour détecter automatiquement le ratio à partir des dimensions de limage dentrée). Les fournisseurs qui ne la déclarent pas exposent la valeur via `details.ignoredOverrides` dans le résultat de loutil afin que son omission soit visible.
### Avancé
| Paramètre | Type | Description |
| ---------------- | ------ | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `action` | string | `"generate"` (par défaut), `"status"` ou `"list"` |
| `model` | string | Remplacement du fournisseur/modèle (par exemple `runway/gen4.5`) |
| `filename` | string | Indication de nom de fichier de sortie |
| `providerOptions`| object | Options spécifiques au fournisseur sous forme dobjet JSON (par exemple `{"seed": 42, "draft": true}`). Les fournisseurs qui déclarent un schéma typé valident les clés et les types ; les clés inconnues ou incompatibilités font ignorer le candidat pendant le fallback. Les fournisseurs sans schéma déclaré reçoivent les options telles quelles. Exécutez `video_generate action=list` pour voir ce que chaque fournisseur accepte |
| Paramètre | Type | Description |
| ---------------- | ------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `action` | string | `"generate"` (par défaut), `"status"` ou `"list"` |
| `model` | string | Remplacement du fournisseur/modèle (par exemple `runway/gen4.5`) |
| `filename` | string | Indication de nom de fichier de sortie |
| `providerOptions`| object | Options spécifiques au fournisseur sous forme dobjet JSON (par exemple `{"seed": 42, "draft": true}`). Les fournisseurs qui déclarent un schéma typé valident les clés et les types ; les clés inconnues ou les incompatibilités font ignorer le candidat lors du fallback. Les fournisseurs sans schéma déclaré reçoivent les options telles quelles. Exécutez `video_generate action=list` pour voir ce que chaque fournisseur accepte |
Tous les fournisseurs ne prennent pas en charge tous les paramètres. OpenClaw normalise déjà la durée à la valeur prise en charge la plus proche par le fournisseur, et remappe également les indications de géométrie traduites, comme size vers aspect ratio, lorsquun fournisseur de fallback expose une surface de contrôle différente. Les remplacements réellement non pris en charge sont ignorés dans la mesure du possible et signalés comme avertissements dans le résultat de loutil. Les limites strictes de capacité (comme un trop grand nombre dentrées de référence) échouent avant lenvoi.
Tous les fournisseurs ne prennent pas en charge tous les paramètres. OpenClaw normalise déjà la durée vers la valeur prise en charge la plus proche par le fournisseur, et remappe également les indications géométriques traduites, comme size-vers-aspect-ratio, lorsquun fournisseur de secours expose une surface de contrôle différente. Les remplacements réellement non pris en charge sont ignorés dans la mesure du possible et signalés comme avertissements dans le résultat de loutil. Les limites strictes de capacité (comme un trop grand nombre dentrées de référence) échouent avant lenvoi.
Les résultats de loutil signalent les paramètres appliqués. Lorsque OpenClaw remappe la durée ou la géométrie pendant le fallback du fournisseur, les valeurs renvoyées `durationSeconds`, `size`, `aspectRatio` et `resolution` reflètent ce qui a été envoyé, et `details.normalization` capture la traduction entre la demande et lapplication.
Les résultats de loutil indiquent les paramètres appliqués. Lorsque OpenClaw remappe la durée ou la géométrie pendant le fallback du fournisseur, les valeurs renvoyées `durationSeconds`, `size`, `aspectRatio` et `resolution` reflètent ce qui a été envoyé, et `details.normalization` capture la traduction entre la demande et ce qui a été appliqué.
Les entrées de référence sélectionnent également le mode dexécution :
Les entrées de référence sélectionnent également le mode dexécution :
- Aucun média de référence : `generate`
- Toute image de référence : `imageToVideo`
- Toute vidéo de référence : `videoToVideo`
- Les entrées audio de référence ne modifient pas le mode résolu ; elles sappliquent par-dessus le mode sélectionné par les références dimage/vidéo, et ne fonctionnent quavec les fournisseurs qui déclarent `maxInputAudios`
- Aucun média de référence : `generate`
- Toute image de référence : `imageToVideo`
- Toute vidéo de référence : `videoToVideo`
- Les entrées audio de référence ne modifient pas le mode résolu ; elles sappliquent par-dessus le mode sélectionné par les références image/vidéo, et ne fonctionnent quavec les fournisseurs qui déclarent `maxInputAudios`
Les références dimage et de vidéo mixtes ne constituent pas une surface de capacité partagée stable.
Préférez un seul type de référence par demande.
Préférez un seul type de référence par requête.
#### Fallback et options typées
Certaines vérifications de capacité sont appliquées au niveau du fallback plutôt quà la frontière de loutil, afin quune demande qui dépasse les limites du fournisseur principal puisse tout de même sexécuter sur un fournisseur de fallback compatible :
Certaines vérifications de capacité sont appliquées au niveau du fallback plutôt quà la frontière de loutil afin quune requête qui dépasse les limites du fournisseur principal puisse tout de même sexécuter sur un fournisseur de secours capable :
- Si le candidat actif ne déclare pas `maxInputAudios` (ou le déclare à `0`), il est ignoré lorsque la demande contient des références audio, et le candidat suivant est essayé.
- Si `maxDurationSeconds` du candidat actif est inférieur à la valeur demandée dans `durationSeconds` et que le candidat ne déclare pas de liste `supportedDurationSeconds`, il est ignoré.
- Si la demande contient `providerOptions` et que le candidat actif déclare explicitement un schéma typé `providerOptions`, le candidat est ignoré lorsque les clés fournies ne figurent pas dans le schéma ou que les types de valeur ne correspondent pas. Les fournisseurs qui nont pas encore déclaré de schéma reçoivent les options telles quelles (transmission compatible avec lexistant). Un fournisseur peut explicitement refuser toutes les options de fournisseur en déclarant un schéma vide (`capabilities.providerOptions: {}`), ce qui provoque le même comportement dignorance quune incompatibilité de type.
- Si le candidat actif ne déclare pas de `maxInputAudios` (ou le déclare à `0`), il est ignoré lorsque la requête contient des références audio, et le candidat suivant est essayé.
- Si le `maxDurationSeconds` du candidat actif est inférieur au `durationSeconds` demandé et que le candidat ne déclare pas de liste `supportedDurationSeconds`, il est ignoré.
- Si la requête contient `providerOptions` et que le candidat actif déclare explicitement un schéma typé `providerOptions`, le candidat est ignoré lorsque les clés fournies ne figurent pas dans le schéma ou que les types de valeur ne correspondent pas. Les fournisseurs qui nont pas encore déclaré de schéma reçoivent les options telles quelles (transmission compatible avec lexistant). Un fournisseur peut explicitement refuser toutes les options de fournisseur en déclarant un schéma vide (`capabilities.providerOptions: {}`), ce qui provoque le même comportement dignorance quune incompatibilité de type.
La première raison dignorance dans une demande est journalisée au niveau `warn` afin que les opérateurs voient quand leur fournisseur principal a été ignoré ; les ignorances suivantes sont journalisées au niveau `debug` pour éviter de surcharger les longues chaînes de fallback. Si tous les candidats sont ignorés, lerreur agrégée inclut la raison dignorance de chacun.
La première raison dignorance dans une requête est journalisée au niveau `warn` afin que les opérateurs voient quand leur fournisseur principal a été ignoré ; les ignorances suivantes sont journalisées au niveau `debug` pour éviter le bruit dans les longues chaînes de fallback. Si tous les candidats sont ignorés, lerreur agrégée inclut la raison dignorance de chacun.
## Actions
- **generate** (par défaut) -- crée une vidéo à partir de linvite donnée et des entrées de référence facultatives.
- **generate** (par défaut) -- crée une vidéo à partir de linvite donnée et dentrées de référence facultatives.
- **status** -- vérifie létat de la tâche vidéo en cours pour la session actuelle sans démarrer une autre génération.
- **list** -- affiche les fournisseurs, modèles et capacités disponibles.
- **list** -- affiche les fournisseurs, modèles et leurs capacités disponibles.
## Sélection du modèle
Lors de la génération dune vidéo, OpenClaw résout le modèle dans cet ordre :
Lors de la génération dune vidéo, OpenClaw résout le modèle dans cet ordre :
1. **Paramètre doutil `model`** -- si lagent en spécifie un dans lappel.
2. **`videoGenerationModel.primary`** -- depuis la configuration.
@ -211,7 +211,7 @@ Lors de la génération dune vidéo, OpenClaw résout le modèle dans cet ord
Si un fournisseur échoue, le candidat suivant est essayé automatiquement. Si tous les candidats échouent, lerreur inclut les détails de chaque tentative.
Définissez `agents.defaults.mediaGenerationAutoProviderFallback: false` si vous souhaitez que la génération de vidéos utilise uniquement les entrées explicites `model`, `primary` et `fallbacks`.
Définissez `agents.defaults.mediaGenerationAutoProviderFallback: false` si vous souhaitez que la génération vidéo utilise uniquement les entrées explicites `model`, `primary` et `fallbacks`.
```json5
{
@ -226,28 +226,28 @@ Définissez `agents.defaults.mediaGenerationAutoProviderFallback: false` si vous
}
```
## Remarques sur les fournisseurs
## Notes sur les fournisseurs
| Fournisseur | Remarques |
| -------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| Alibaba | Utilise le endpoint asynchrone DashScope/Model Studio. Les images et vidéos de référence doivent être des URL distantes `http(s)`. |
| BytePlus (1.0) | ID du fournisseur `byteplus`. Modèles : `seedance-1-0-pro-250528` (par défaut), `seedance-1-0-pro-t2v-250528`, `seedance-1-0-pro-fast-251015`, `seedance-1-0-lite-t2v-250428`, `seedance-1-0-lite-i2v-250428`. Les modèles T2V (`*-t2v-*`) nacceptent pas les entrées dimage ; les modèles I2V et les modèles généraux `*-pro-*` prennent en charge une seule image de référence (première image). Passez limage de manière positionnelle ou définissez `role: "first_frame"`. Les ID de modèle T2V sont automatiquement basculés vers la variante I2V correspondante lorsquune image est fournie. Clés `providerOptions` prises en charge : `seed` (number), `draft` (boolean, force le 480p), `camera_fixed` (boolean). |
| BytePlus Seedance 1.5 | Nécessite le plugin [`@openclaw/byteplus-modelark`](https://www.npmjs.com/package/@openclaw/byteplus-modelark). ID du fournisseur `byteplus-seedance15`. Modèle : `seedance-1-5-pro-251215`. Utilise lAPI unifiée `content[]`. Prend en charge au maximum 2 images dentrée (first_frame + last_frame). Toutes les entrées doivent être des URL distantes `https://`. Définissez `role: "first_frame"` / `"last_frame"` sur chaque image, ou passez les images de manière positionnelle. `aspectRatio: "adaptive"` détecte automatiquement le ratio à partir de limage dentrée. `audio: true` est mappé à `generate_audio`. `providerOptions.seed` (number) est transmis. |
| BytePlus Seedance 2.0 | Nécessite le plugin [`@openclaw/byteplus-modelark`](https://www.npmjs.com/package/@openclaw/byteplus-modelark). ID du fournisseur `byteplus-seedance2`. Modèles : `dreamina-seedance-2-0-260128`, `dreamina-seedance-2-0-fast-260128`. Utilise lAPI unifiée `content[]`. Prend en charge jusquà 9 images de référence, 3 vidéos de référence et 3 audios de référence. Toutes les entrées doivent être des URL distantes `https://`. Définissez `role` sur chaque ressource — valeurs prises en charge : `"first_frame"`, `"last_frame"`, `"reference_image"`, `"reference_video"`, `"reference_audio"`. `aspectRatio: "adaptive"` détecte automatiquement le ratio à partir de limage dentrée. `audio: true` est mappé à `generate_audio`. `providerOptions.seed` (number) est transmis. |
| ComfyUI | Exécution locale ou cloud pilotée par workflow. Prend en charge le texte vers vidéo et limage vers vidéo via le graphe configuré. |
| fal | Utilise un flux adossé à une file dattente pour les tâches longues. Une seule image de référence uniquement. |
| Google | Utilise Gemini/Veo. Prend en charge une image ou une vidéo de référence. |
| MiniMax | Une seule image de référence uniquement. |
| OpenAI | Seul le remplacement `size` est transmis. Les autres remplacements de style (`aspectRatio`, `resolution`, `audio`, `watermark`) sont ignorés avec un avertissement. |
| Qwen | Même backend DashScope quAlibaba. Les entrées de référence doivent être des URL distantes `http(s)` ; les fichiers locaux sont rejetés demblée. |
| Runway | Prend en charge les fichiers locaux via des URI de données. Le mode vidéo vers vidéo nécessite `runway/gen4_aleph`. Les exécutions texte uniquement exposent les ratios `16:9` et `9:16`. |
| Together | Une seule image de référence uniquement. |
| Vydra | Utilise directement `https://www.vydra.ai/api/v1` pour éviter les redirections qui suppriment lauthentification. `veo3` est groupé uniquement comme texte vers vidéo ; `kling` nécessite une URL dimage distante. |
| xAI | Prend en charge les flux texte vers vidéo, image vers vidéo, ainsi que les flux distants dédition/extension de vidéo. |
| Fournisseur | Notes |
| --------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| Alibaba | Utilise le endpoint asynchrone DashScope/Model Studio. Les images et vidéos de référence doivent être des URL distantes `http(s)`. |
| BytePlus (1.0) | ID du fournisseur `byteplus`. Modèles : `seedance-1-0-pro-250528` (par défaut), `seedance-1-0-pro-t2v-250528`, `seedance-1-0-pro-fast-251015`, `seedance-1-0-lite-t2v-250428`, `seedance-1-0-lite-i2v-250428`. Les modèles T2V (`*-t2v-*`) nacceptent pas les entrées dimage ; les modèles I2V et les modèles généraux `*-pro-*` prennent en charge une seule image de référence (première image). Passez limage par position ou définissez `role: "first_frame"`. Les ID de modèle T2V sont automatiquement remplacés par la variante I2V correspondante lorsquune image est fournie. Clés `providerOptions` prises en charge : `seed` (number), `draft` (boolean, force le 480p), `camera_fixed` (boolean). |
| BytePlus Seedance 1.5 | Nécessite le Plugin [`@openclaw/byteplus-modelark`](https://www.npmjs.com/package/@openclaw/byteplus-modelark). ID du fournisseur `byteplus-seedance15`. Modèle : `seedance-1-5-pro-251215`. Utilise lAPI unifiée `content[]`. Prend en charge au maximum 2 images dentrée (first_frame + last_frame). Toutes les entrées doivent être des URL distantes `https://`. Définissez `role: "first_frame"` / `"last_frame"` sur chaque image, ou passez les images par position. `aspectRatio: "adaptive"` détecte automatiquement le ratio à partir de limage dentrée. `audio: true` est mappé vers `generate_audio`. `providerOptions.seed` (number) est transmis. |
| BytePlus Seedance 2.0 | Nécessite le Plugin [`@openclaw/byteplus-modelark`](https://www.npmjs.com/package/@openclaw/byteplus-modelark). ID du fournisseur `byteplus-seedance2`. Modèles : `dreamina-seedance-2-0-260128`, `dreamina-seedance-2-0-fast-260128`. Utilise lAPI unifiée `content[]`. Prend en charge jusquà 9 images de référence, 3 vidéos de référence et 3 audios de référence. Toutes les entrées doivent être des URL distantes `https://`. Définissez `role` sur chaque ressource — valeurs prises en charge : `"first_frame"`, `"last_frame"`, `"reference_image"`, `"reference_video"`, `"reference_audio"`. `aspectRatio: "adaptive"` détecte automatiquement le ratio à partir de limage dentrée. `audio: true` est mappé vers `generate_audio`. `providerOptions.seed` (number) est transmis. |
| ComfyUI | Exécution locale ou cloud pilotée par workflow. Prend en charge le texte-vers-vidéo et limage-vers-vidéo via le graphe configuré. |
| fal | Utilise un flux adossé à une file dattente pour les tâches longues. Une seule image de référence uniquement. |
| Google | Utilise Gemini/Veo. Prend en charge une image ou une vidéo de référence. |
| MiniMax | Une seule image de référence uniquement. |
| OpenAI | Seul le remplacement `size` est transmis. Les autres remplacements de style (`aspectRatio`, `resolution`, `audio`, `watermark`) sont ignorés avec un avertissement. |
| Qwen | Même backend DashScope quAlibaba. Les entrées de référence doivent être des URL distantes `http(s)` ; les fichiers locaux sont rejetés demblée. |
| Runway | Prend en charge les fichiers locaux via des URI de données. Le mode vidéo-vers-vidéo nécessite `runway/gen4_aleph`. Les exécutions texte uniquement exposent les ratios `16:9` et `9:16`. |
| Together | Une seule image de référence uniquement. |
| Vydra | Utilise directement `https://www.vydra.ai/api/v1` pour éviter les redirections qui perdent lauthentification. `veo3` est fourni uniquement en texte-vers-vidéo ; `kling` exige une URL dimage distante. |
| xAI | Prend en charge le texte-vers-vidéo, limage-vers-vidéo et les flux distants dédition/extension vidéo. |
## Modes de capacité des fournisseurs
Le contrat partagé de génération de vidéos permet désormais aux fournisseurs de déclarer des capacités spécifiques à chaque mode, au lieu de se limiter à des limites agrégées à plat. Les nouvelles implémentations de fournisseurs doivent privilégier des blocs de mode explicites :
Le contrat partagé de génération vidéo permet désormais aux fournisseurs de déclarer des capacités spécifiques à chaque mode au lieu de simples limites globales. Les nouvelles implémentations de fournisseurs devraient privilégier des blocs de mode explicites :
```typescript
capabilities: {
@ -271,35 +271,47 @@ capabilities: {
}
```
Les champs agrégés à plat tels que `maxInputImages` et `maxInputVideos` ne suffisent pas à annoncer la prise en charge des modes de transformation. Les fournisseurs doivent déclarer explicitement `generate`, `imageToVideo` et `videoToVideo` afin que les tests en direct, les tests de contrat et loutil partagé `video_generate` puissent valider la prise en charge des modes de manière déterministe.
Les champs globaux agrégés tels que `maxInputImages` et `maxInputVideos` ne suffisent pas à annoncer la prise en charge des modes de transformation. Les fournisseurs doivent déclarer explicitement `generate`, `imageToVideo` et `videoToVideo` afin que les tests live, les tests de contrat et loutil partagé `video_generate` puissent valider la prise en charge des modes de manière déterministe.
## Tests en direct
## Tests live
Couverture en direct sur activation pour les fournisseurs groupés partagés :
Couverture live facultative pour les fournisseurs groupés partagés :
```bash
OPENCLAW_LIVE_TEST=1 pnpm test:live -- extensions/video-generation-providers.live.test.ts
```
Wrapper du dépôt :
Wrapper du dépôt :
```bash
pnpm test:live:media video
```
Ce fichier de test en direct charge les variables denvironnement de fournisseur manquantes depuis `~/.profile`, privilégie par défaut les clés API live/env par rapport aux profils dauthentification stockés, et exécute les modes déclarés quil peut tester en toute sécurité avec des médias locaux :
Ce fichier live charge les variables denvironnement de fournisseur manquantes depuis `~/.profile`, privilégie par défaut les clés API live/env par rapport aux profils dauthentification stockés, et exécute par défaut un smoke test compatible publication :
- `generate` pour chaque fournisseur autre que FAL dans le balayage
- invite de homard dune seconde
- plafond dopération par fournisseur défini par `OPENCLAW_LIVE_VIDEO_GENERATION_TIMEOUT_MS`
(`180000` par défaut)
FAL est facultatif, car la latence de file dattente côté fournisseur peut dominer le temps de publication :
```bash
pnpm test:live:media video --video-providers fal
```
Définissez `OPENCLAW_LIVE_VIDEO_GENERATION_FULL_MODES=1` pour exécuter aussi les modes de transformation déclarés que le balayage partagé peut exercer en toute sécurité avec des médias locaux :
- `generate` pour chaque fournisseur du balayage
- `imageToVideo` lorsque `capabilities.imageToVideo.enabled`
- `videoToVideo` lorsque `capabilities.videoToVideo.enabled` et que le fournisseur/modèle accepte une entrée vidéo locale adossée à un buffer dans le balayage partagé
Aujourdhui, la voie en direct partagée `videoToVideo` couvre :
Aujourdhui, le canal live partagé `videoToVideo` couvre :
- `runway` uniquement lorsque vous sélectionnez `runway/gen4_aleph`
## Configuration
Définissez le modèle de génération de vidéos par défaut dans votre configuration OpenClaw :
Définissez le modèle de génération vidéo par défaut dans votre configuration OpenClaw :
```json5
{
@ -314,16 +326,16 @@ Définissez le modèle de génération de vidéos par défaut dans votre configu
}
```
Ou via la CLI :
Ou via la CLI :
```bash
openclaw config set agents.defaults.videoGenerationModel.primary "qwen/wan2.6-t2v"
```
## Liens connexes
## Voir aussi
- [Vue densemble des outils](/fr/tools)
- [Tâches en arrière-plan](/fr/automation/tasks) -- suivi des tâches pour la génération asynchrone de vidéos
- [Tâches en arrière-plan](/fr/automation/tasks) -- suivi des tâches pour la génération vidéo asynchrone
- [Alibaba Model Studio](/fr/providers/alibaba)
- [BytePlus](/fr/concepts/model-providers#byteplus-international)
- [ComfyUI](/fr/providers/comfy)