chore(i18n): refresh fr translations
This commit is contained in:
parent
45dacee46e
commit
063548b030
File diff suppressed because it is too large
Load Diff
@ -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 s’exé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 d’ingestion, 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 d’implémentation internes, et non des « modes »
|
||||
distincts configurés par l’utilisateur.
|
||||
|
||||
### 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 lorsqu’elles 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 à l’aide d’un 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 l’ingestion.
|
||||
|
||||
## 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 d’exé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 l’interface 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.
|
||||
L’interface 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 d’une 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 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 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 l’extrait/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.
|
||||
Lorsqu’il est activé, `memory-core` gère automatiquement une tâche Cron pour un cycle complet
|
||||
de Dreaming. Chaque cycle exécute les phases dans l’ordre : 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
|
||||
d’implé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 :
|
||||
Lorsqu’il est activé, l’onglet **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 d’activation de Dreaming
|
||||
- le statut au niveau des phases et la présence d’un cycle géré
|
||||
- les nombres d’éléments à court terme, ancrés dans les faits, de signaux et promus aujourd’hui
|
||||
- l’heure de la prochaine exécution planifiée
|
||||
- une voie ancrée distincte dans la scène pour les entrées préparées issues d’une 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)
|
||||
|
||||
@ -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 s’attend à un contexte large ainsi qu’à de solides défenses contre l’injection 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 d’injection 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 l’injection 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 d’injection 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 l’API 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 l’API 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 l’ID 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 l’API 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 l’ordre 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 l’ordre 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 l’entre-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 s’ils exposent un point de terminaison `/v1` de style OpenAI. Remplacez le bloc provider ci-dessus par votre point de terminaison et l’ID de votre modèle :
|
||||
vLLM, LiteLLM, OAI-proxy ou des Gateway personnalisés fonctionnent s’ils exposent un point de terminaison `/v1` de style OpenAI. Remplacez le bloc fournisseur ci-dessus par votre point de terminaison et l’ID de modèle :
|
||||
|
||||
```json5
|
||||
{
|
||||
@ -150,42 +150,30 @@ vLLM, LiteLLM, OAI-proxy ou des passerelles personnalisées fonctionnent s’ils
|
||||
}
|
||||
```
|
||||
|
||||
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 s’applique pas ici : pas de
|
||||
`service_tier`, pas de `store` Responses, pas de façonnage de payload de compatibilité de raisonnement OpenAI,
|
||||
et pas d’indices de cache de prompt
|
||||
- les en-têtes d’attribution 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 s’applique pas ici : pas de `service_tier`, pas de `store` Responses, pas de mise en forme de payload de compatibilité de raisonnement OpenAI, et pas d’indices de cache de prompt
|
||||
- les en-têtes d’attribution 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 n’acceptent 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 d’agent d’OpenClaw, en particulier lorsque des schémas d’outils sont inclus. Si le
|
||||
backend fonctionne pour de petits appels directs à `/v1/chat/completions` mais échoue sur des tours d’agent
|
||||
OpenClaw normaux, essayez d’abord
|
||||
`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 d’un bug du backend, et non de la
|
||||
couche de transport d’OpenClaw.
|
||||
- Certains serveurs n’acceptent 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 l’environnement d’exécution agent d’OpenClaw, en particulier lorsque des schémas d’outils sont inclus. Si le backend fonctionne pour de petits appels directs `/v1/chat/completions` mais échoue sur des tours agent OpenClaw normaux, essayez d’abord `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 d’OpenClaw.
|
||||
|
||||
## 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 d’abord les schémas d’outils 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 d’impact 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 d’impact de l’injection de prompt.
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@ -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 d’exécution d’OpenClaw.
|
||||
|
||||
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 qu’OpenClaw lit avant de charger le
|
||||
`openclaw.plugin.json` est la métadonnée qu’OpenClaw lit avant de charger le
|
||||
code de votre Plugin.
|
||||
|
||||
Utilisez-le pour :
|
||||
Utilisez-le pour :
|
||||
|
||||
- l’identité du Plugin
|
||||
- la validation de la configuration
|
||||
- les métadonnées d’authentification et d’onboarding qui doivent être disponibles sans démarrer le runtime du Plugin
|
||||
- les indications d’activation 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 d’alias et d’activation 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 d’interface utilisateur pour la configuration
|
||||
- les métadonnées d’authentification et d’onboarding qui doivent être disponibles sans démarrer l’environnement d’exécution du Plugin
|
||||
- les indications d’activation peu coûteuses que les surfaces du plan de contrôle peuvent inspecter avant le chargement de l’environnement d’exécution
|
||||
- les descripteurs de configuration peu coûteux que les surfaces de configuration/onboarding peuvent inspecter avant le chargement de l’environnement d’exécution
|
||||
- les métadonnées d’alias et d’activation automatique qui doivent être résolues avant le chargement de l’environnement d’exé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 l’environnement d’exé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 l’exécuteur QA que l’hôte partagé `openclaw qa` peut inspecter avant le chargement de l’environnement d’exé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 l’environnement d’exécution
|
||||
- les indications d’interface pour la configuration
|
||||
|
||||
Ne l’utilisez pas pour :
|
||||
Ne l’utilisez pas pour :
|
||||
|
||||
- enregistrer le comportement du runtime
|
||||
- enregistrer un comportement d’exécution
|
||||
- déclarer des points d’entrée de code
|
||||
- les métadonnées d’installation 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é d’API OpenRouter",
|
||||
"choiceLabel": "Clé API OpenRouter",
|
||||
"groupId": "openrouter",
|
||||
"groupLabel": "OpenRouter",
|
||||
"optionKey": "openrouterApiKey",
|
||||
"cliFlag": "--openrouter-api-key",
|
||||
"cliOption": "--openrouter-api-key <key>",
|
||||
"cliDescription": "Clé d’API OpenRouter",
|
||||
"cliDescription": "Clé API OpenRouter",
|
||||
"onboardingScopes": ["text-inference"]
|
||||
}
|
||||
],
|
||||
"uiHints": {
|
||||
"apiKey": {
|
||||
"label": "Clé d’API",
|
||||
"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 s’agit de l’ID 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 l’authentification, 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 d’inférence CLI détenus par ce Plugin. Utilisés pour l’auto-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 d’environnement d’authentification fournisseur peu coûteuses qu’OpenClaw 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 d’authentification, par exemple un fournisseur de code qui partage la clé d’API et les profils d’authentification du fournisseur de base. |
|
||||
| `channelEnvVars` | No | `Record<string, string[]>` | Métadonnées d’environnement de canal peu coûteuses qu’OpenClaw peut inspecter sans charger le code du Plugin. Utilisez-les pour les surfaces de configuration ou d’authentification de canaux pilotées par l’environnement que les helpers génériques de démarrage/configuration doivent voir. |
|
||||
| `providerAuthChoices` | No | `object[]` | Métadonnées de choix d’authentification peu coûteuses pour les sélecteurs d’onboarding, la résolution du fournisseur préféré et le câblage simple des flags CLI. |
|
||||
| `activation` | No | `object` | Indications d’activation 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 d’images, 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 d’interface, placeholders et indications de sensibilité pour les champs de configuration. |
|
||||
| Champ | Obligatoire | Type | Signification |
|
||||
| ----------------------------------- | ----------- | -------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
|
||||
| `id` | Oui | `string` | ID canonique du Plugin. C’est l’ID 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 l’authentification, 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 l’environnement d’exécution. |
|
||||
| `cliBackends` | Non | `string[]` | IDs de backend d’inférence CLI détenus par ce Plugin. Utilisés pour l’auto-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 l’environnement d’exécution. |
|
||||
| `providerAuthEnvVars` | Non | `Record<string, string[]>` | Métadonnées d’environnement d’authentification du fournisseur, peu coûteuses, qu’OpenClaw 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 d’authentification, par exemple un fournisseur de codage qui partage la clé API et les profils d’authentification du fournisseur de base. |
|
||||
| `channelEnvVars` | Non | `Record<string, string[]>` | Métadonnées d’environnement de canal, peu coûteuses, qu’OpenClaw peut inspecter sans charger le code du Plugin. Utilisez ceci pour les surfaces de configuration ou d’authentification de canal pilotées par l’environnement que les helpers génériques de démarrage/configuration doivent voir. |
|
||||
| `providerAuthChoices` | Non | `object[]` | Métadonnées de choix d’authentification peu coûteuses pour les sélecteurs d’onboarding, la résolution du fournisseur préféré et le câblage simple des flags CLI. |
|
||||
| `activation` | Non | `object` | Indications d’activation peu coûteuses pour le chargement déclenché par des fournisseurs, commandes, canaux, routes et capacités. Métadonnées uniquement ; l’environnement d’exé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 l’environnement d’exécution du Plugin. |
|
||||
| `qaRunners` | Non | `object[]` | Descripteurs d’exécuteurs QA peu coûteux utilisés par l’hôte partagé `openclaw qa` avant le chargement de l’environnement d’exé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 d’images, 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 l’environnement d’exé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 d’interface, 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 d’onboarding ou d’authentification.
|
||||
OpenClaw lit cela avant le chargement du runtime du fournisseur.
|
||||
Chaque entrée de `providerAuthChoices` décrit un choix d’onboarding ou d’authentification.
|
||||
OpenClaw lit cela avant le chargement de l’environnement d’exé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 d’authentification vers lequel router. |
|
||||
| `choiceId` | Oui | `string` | ID de choix d’authentification stable utilisé par les flux d’onboarding et de CLI. |
|
||||
| `choiceLabel` | Non | `string` | Libellé destiné à l’utilisateur. S’il est omis, OpenClaw utilise `choiceId` comme valeur de repli. |
|
||||
| `choiceHint` | Non | `string` | Court texte d’aide 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 l’assistant. |
|
||||
| `assistantVisibility` | Non | `"visible"` \| `"manual-only"` | Masque ce choix dans les sélecteurs de l’assistant 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é à l’utilisateur pour ce groupe. |
|
||||
| `groupHint` | Non | `string` | Court texte d’aide pour le groupe. |
|
||||
| `optionKey` | Non | `string` | Clé d’option interne pour les flux d’authentification simples à un seul flag. |
|
||||
| `cliFlag` | Non | `string` | Nom du flag CLI, par exemple `--openrouter-api-key`. |
|
||||
| `cliOption` | Non | `string` | Forme complète de l’option CLI, par exemple `--openrouter-api-key <key>`. |
|
||||
| `cliDescription` | Non | `string` | Description utilisée dans l’aide CLI. |
|
||||
| Champ | Obligatoire | Type | Signification |
|
||||
| --------------------- | ----------- | ----------------------------------------------- | ---------------------------------------------------------------------------------------------------------- |
|
||||
| `provider` | Oui | `string` | ID du fournisseur auquel ce choix appartient. |
|
||||
| `method` | Oui | `string` | ID de la méthode d’authentification vers laquelle répartir. |
|
||||
| `choiceId` | Oui | `string` | ID stable de choix d’authentification utilisé par les flux d’onboarding et CLI. |
|
||||
| `choiceLabel` | Non | `string` | Libellé destiné à l’utilisateur. S’il est omis, OpenClaw utilise `choiceId` comme repli. |
|
||||
| `choiceHint` | Non | `string` | Court texte d’aide 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 l’assistant. |
|
||||
| `assistantVisibility` | Non | `"visible"` \| `"manual-only"` | Masque ce choix dans les sélecteurs de l’assistant 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é à l’utilisateur pour ce groupe. |
|
||||
| `groupHint` | Non | `string` | Court texte d’aide pour le groupe. |
|
||||
| `optionKey` | Non | `string` | Clé d’option interne pour les flux d’authentification simples à un seul flag. |
|
||||
| `cliFlag` | Non | `string` | Nom du flag CLI, tel que `--openrouter-api-key`. |
|
||||
| `cliOption` | Non | `string` | Forme complète de l’option CLI, telle que `--openrouter-api-key <key>`. |
|
||||
| `cliDescription` | Non | `string` | Description utilisée dans l’aide CLI. |
|
||||
| `onboardingScopes` | Non | `Array<"text-inference" \| "image-generation">` | Sur quelles surfaces d’onboarding ce choix doit apparaître. S’il est omis, la valeur par défaut est `["text-inference"]`. |
|
||||
|
||||
## Référence `commandAliases`
|
||||
## Référence de `commandAliases`
|
||||
|
||||
Utilisez `commandAliases` lorsqu’un Plugin possède un nom de commande runtime que les utilisateurs peuvent
|
||||
mettre par erreur dans `plugins.allow` ou essayer d’exécuter comme commande CLI racine. OpenClaw
|
||||
utilise ces métadonnées pour les diagnostics sans importer le code runtime du Plugin.
|
||||
Utilisez `commandAliases` lorsqu’un Plugin possède un nom de commande d’exécution que les utilisateurs peuvent
|
||||
mettre par erreur dans `plugins.allow` ou essayer d’exécuter comme une commande CLI racine. OpenClaw
|
||||
utilise ces métadonnées pour les diagnostics sans importer le code d’exé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 l’alias comme une commande slash de chat plutôt qu’une 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 l’activer ultérieurement.
|
||||
doivent l’activer plus tard.
|
||||
|
||||
Ce bloc contient uniquement des métadonnées. Il n’enregistre pas le comportement runtime, et il
|
||||
ne remplace pas `register(...)`, `setupEntry` ni les autres points d’entrée runtime/Plugin.
|
||||
Les consommateurs actuels l’utilisent comme indication de restriction avant un chargement plus large des Plugins, donc
|
||||
l’absence de métadonnées d’activation 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` lorsqu’un Plugin contribue à un ou plusieurs exécuteurs de transport sous la racine partagée
|
||||
`openclaw qa`. Gardez ces métadonnées simples et statiques ; l’environnement d’exécution du Plugin reste responsable de l’enregistrement 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 d’aide de repli utilisé lorsque l’hôte partagé a besoin d’une commande factice. |
|
||||
|
||||
Ce bloc contient uniquement des métadonnées. Il n’enregistre pas de comportement d’exécution et
|
||||
ne remplace pas `register(...)`, `setupEntry` ni d’autres points d’entrée d’exécution/de Plugin.
|
||||
Les consommateurs actuels l’utilisent comme un indice de filtrage avant un chargement plus large du Plugin, donc
|
||||
l’absence de métadonnées d’activation n’a généralement qu’un 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 lorsqu’ils 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 d’activation 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 d’activation 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 d’activation 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 d’activation 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[]`
|
||||
lorsqu’il manque des métadonnées explicites d’activation de canal
|
||||
- la planification de configuration/d’exé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 d’activation
|
||||
de fournisseur sont absentes
|
||||
|
||||
## Référence `setup`
|
||||
## Référence de `setup`
|
||||
|
||||
Utilisez `setup` lorsque les surfaces de configuration et d’onboarding 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 d’onboarding ont besoin de métadonnées de Plugin, simples et détenues par le Plugin,
|
||||
avant le chargement de l’environnement d’exé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 d’infé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 d’infé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.
|
||||
|
||||
Lorsqu’ils sont présents, `setup.providers` et `setup.cliBackends` sont la surface
|
||||
de recherche privilégiée, d’abord 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,
|
||||
Lorsqu’ils sont présents, `setup.providers` et `setup.cliBackends` constituent la
|
||||
surface privilégiée, d’abord 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 d’exécution plus riches au moment de la configuration,
|
||||
définissez `requiresRuntime: true` et conservez `setup-api` comme
|
||||
chemin d’exé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 l’ordre 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 l’ordre 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 l’onboarding. 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 d’environnement 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 l’environnement d’exécution complet. |
|
||||
| `envVars` | Non | `string[]` | Variables d’environnement que les surfaces génériques de configuration/statut peuvent vérifier avant le chargement de l’environnement d’exé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 l’onboarding. |
|
||||
| `cliBackends` | Non | `string[]` | IDs de backends au moment de la configuration utilisés pour la recherche de configuration fondée d’abord 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 l’exé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 l’onboarding. |
|
||||
| `cliBackends` | Non | `string[]` | IDs de backend au moment de la configuration utilisés pour une recherche de configuration d’abord 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 l’exé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 d’affichage.
|
||||
`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é à l’utilisateur. |
|
||||
| `help` | `string` | Court texte d’aide. |
|
||||
| `tags` | `string[]` | Tags d’interface facultatifs. |
|
||||
| `advanced` | `boolean` | Marque le champ comme avancé. |
|
||||
| `help` | `string` | Court texte d’aide. |
|
||||
| `tags` | `string[]` | Tags d’interface facultatifs. |
|
||||
| `advanced` | `boolean` | Marque le champ comme avancé. |
|
||||
| `sensitive` | `boolean` | Marque le champ comme secret ou sensible. |
|
||||
| `placeholder` | `string` | Texte d’exemple pour les champs de formulaire. |
|
||||
| `placeholder` | `string` | Texte d’espace 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 qu’OpenClaw peut
|
||||
lire sans importer le runtime du Plugin.
|
||||
lire sans importer l’environnement d’exé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 d’images 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 d’outils d’agent 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` lorsqu’un Plugin de canal a besoin de métadonnées de configuration peu coûteuses avant
|
||||
le chargement du runtime.
|
||||
Utilisez `channelConfigs` lorsqu’un Plugin de canal a besoin de métadonnées de configuration simples avant
|
||||
le chargement de l’environnement d’exé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é d’interface facultatifs pour cette section de configuration de canal. |
|
||||
| `label` | `string` | Libellé du canal fusionné dans les surfaces de sélection et d’inspection lorsque les métadonnées runtime ne sont pas prêtes. |
|
||||
| `description` | `string` | Courte description du canal pour les surfaces d’inspection 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 d’interface, 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 d’inspection lorsque les métadonnées d’exécution ne sont pas prêtes. |
|
||||
| `description` | `string` | Courte description du canal pour les surfaces d’inspection 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` lorsqu’OpenClaw doit déduire votre Plugin fournisseur à partir de
|
||||
raccourcis d’ID de modèles comme `gpt-5.4` ou `claude-sonnet-4.6` avant le chargement du runtime du Plugin.
|
||||
Utilisez `modelSupport` lorsqu’OpenClaw doit déduire votre Plugin fournisseur à partir
|
||||
d’IDs abrégés de modèle comme `gpt-5.4` ou `claude-sonnet-4.6` avant le chargement de l’environnement d’exécution du Plugin.
|
||||
|
||||
```json
|
||||
{
|
||||
@ -427,76 +451,75 @@ raccourcis d’ID de modèles comme `gpt-5.4` ou `claude-sonnet-4.6` avant le ch
|
||||
}
|
||||
```
|
||||
|
||||
OpenClaw applique l’ordre 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` l’emporte sur `modelPrefixes`
|
||||
- si un Plugin non intégré et un Plugin intégré correspondent tous deux, le Plugin non intégré
|
||||
l’emporte
|
||||
- toute ambiguïté restante est ignorée jusqu’à ce que l’utilisateur ou la configuration spécifie un fournisseur
|
||||
- les ambiguïtés restantes sont ignorées jusqu’à ce que l’utilisateur 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 d’authentification et indications d’interface qui doivent exister avant l’exécution du code du Plugin |
|
||||
| `package.json` | Métadonnées npm, installation des dépendances et bloc `openclaw` utilisé pour les points d’entrée, le filtrage d’installation, 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 d’authentification et indications d’interface qui doivent exister avant l’exécution du code du Plugin |
|
||||
| `package.json` | Métadonnées npm, installation des dépendances et bloc `openclaw` utilisé pour les points d’entrée, le contrôle d’installation, 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 d’entrée ou le comportement d’installation npm, placez-la dans `package.json`
|
||||
- si elle concerne le packaging, les fichiers de point d’entrée ou le comportement d’installation 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 d’entrée de Plugins natifs. |
|
||||
| `openclaw.setupEntry` | Point d’entrée léger réservé à la configuration, utilisé pendant l’onboarding 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 d’authentification 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 d’installation/mise à jour pour les Plugins intégrés et publiés externement. |
|
||||
| `openclaw.install.defaultChoice` | Chemin d’installation préféré lorsque plusieurs sources d’installation sont disponibles. |
|
||||
| `openclaw.install.minHostVersion` | Version minimale prise en charge de l’hô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 d’entrée de Plugin natifs. |
|
||||
| `openclaw.setupEntry` | Point d’entrée léger, réservé à la configuration, utilisé pendant l’onboarding 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 d’environnement existe-t-elle déjà ? » sans charger l’environnement d’exécution complet du canal. |
|
||||
| `openclaw.channel.persistedAuthState` | Métadonnées légères du vérificateur d’authentification persistée pouvant répondre à « quelque chose est-il déjà connecté ? » sans charger l’environnement d’exécution complet du canal. |
|
||||
| `openclaw.install.npmSpec` / `openclaw.install.localPath` | Indications d’installation/mise à jour pour les Plugins intégrés et publiés en externe. |
|
||||
| `openclaw.install.defaultChoice` | Chemin d’installation préféré lorsque plusieurs sources d’installation sont disponibles. |
|
||||
| `openclaw.install.minHostVersion` | Version minimale prise en charge de l’hô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 d’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. |
|
||||
|
||||
`openclaw.install.minHostVersion` est appliqué pendant l’installation 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 l’installation 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. Aujourd’hui, il permet seulement aux flux d’installation
|
||||
de récupérer à partir de certaines pannes obsolètes de mise à niveau d’un Plugin intégré, comme un
|
||||
`openclaw.install.allowInvalidConfigRecovery` est intentionnellement étroit. Il
|
||||
ne rend pas arbitrairement installables des configurations cassées. Aujourd’hui, il permet seulement aux flux d’installation
|
||||
de récupérer à partir d’échecs spécifiques de mise à niveau d’un 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 l’installation et redirigent les opérateurs
|
||||
Plugin intégré. Les erreurs de configuration non liées bloquent toujours l’installation 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 d’une
|
||||
vérification d’authentification oui/non peu coûteuse avant le chargement du Plugin de canal complet. L’export 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 d’une
|
||||
vérification simple oui/non de l’authentification avant le chargement du Plugin de canal complet. L’export ciblé doit être une petite
|
||||
fonction qui lit uniquement l’état persisté ; ne la faites pas transiter par le barrel complet de l’environnement d’exé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 l’environnement :
|
||||
|
||||
```json
|
||||
{
|
||||
@ -534,9 +557,10 @@ de l’état configuré uniquement via env :
|
||||
}
|
||||
```
|
||||
|
||||
Utilisez-le lorsqu’un canal peut répondre à l’état configuré à partir de l’env ou d’autres 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 lorsqu’un canal peut répondre à l’état configuré à partir de variables d’environnement ou d’autres petites
|
||||
entrées hors environnement d’exécution. Si la vérification nécessite une résolution complète de la configuration ou le véritable
|
||||
environnement d’exé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 l’ID 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 l’erreur 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.
|
||||
- L’environnement d’exé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 d’ajouter
|
||||
ici des clés personnalisées de premier niveau.
|
||||
- `providerAuthEnvVars` est le chemin de métadonnées peu coûteux pour les sondes d’authentification, la
|
||||
validation des marqueurs d’environnement et les surfaces similaires d’authentification 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 d’authentification, la
|
||||
validation des marqueurs de variables d’environnement et les surfaces similaires d’authentification de fournisseur
|
||||
qui ne doivent pas démarrer l’environnement d’exécution du Plugin uniquement pour inspecter les noms de variables d’environnement.
|
||||
- `providerAuthAliases` permet à des variantes de fournisseur de réutiliser les variables d’environnement d’authentification,
|
||||
les profils d’authentification, l’authentification adossée à la configuration et le choix d’onboarding par clé API
|
||||
d’un 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 d’environnement du shell, les invites de configuration
|
||||
et les surfaces de canal similaires qui ne doivent pas démarrer l’environnement d’exécution du Plugin
|
||||
uniquement pour inspecter les noms de variables d’environnement.
|
||||
- `providerAuthAliases` permet à des variantes de fournisseurs de réutiliser les variables d’environnement d’authentification
|
||||
d’un autre fournisseur, ses profils d’authentification, son authentification adossée à la configuration et son choix
|
||||
d’onboarding par clé d’API 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 l’environnement 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 d’environnement.
|
||||
- `providerAuthChoices` est le chemin de métadonnées peu coûteux pour les sélecteurs de choix d’authentification,
|
||||
la résolution de `--auth-choice`, le mapping du fournisseur préféré et l’enregistrement simple de flags CLI
|
||||
d’onboarding avant le chargement du runtime du fournisseur. Pour les métadonnées d’assistant 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 d’authentification,
|
||||
la résolution de `--auth-choice`, la correspondance avec le fournisseur préféré et l’enregistrement simple des flags CLI
|
||||
d’onboarding avant le chargement de l’environnement d’exécution du fournisseur. Pour les métadonnées d’assistant d’exécution
|
||||
qui nécessitent du code fournisseur, consultez
|
||||
[Hooks d’exé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 lorsqu’un
|
||||
Plugin n’en 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 d’autorisation 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 d’ensemble du SDK](/fr/plugins/sdk-overview) — référence du SDK de Plugin
|
||||
|
||||
@ -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 d’adaptation `ChannelPlugin`
|
||||
- Vous créez un nouveau Plugin de canal de messagerie.
|
||||
- Vous souhaitez connecter OpenClaw à une plateforme de messagerie.
|
||||
- Vous devez comprendre la surface d’adaptation 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 d’un plugin de canal qui connecte OpenClaw à une
|
||||
plateforme de messagerie. À la fin, vous disposerez d’un 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 d’un canal fonctionnel avec la sécurité des DM,
|
||||
l’appairage, le fil des réponses et la messagerie sortante.
|
||||
|
||||
<Info>
|
||||
Si vous n’avez encore créé aucun plugin OpenClaw, lisez d’abord
|
||||
Si vous n’avez encore créé aucun Plugin OpenClaw, lisez d’abord
|
||||
[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 n’ont 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 n’ont pas besoin de leurs propres outils d’envoi/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 d’autorisation
|
||||
- **Pairing** — flux d’approbation 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 d’autorisation
|
||||
- **Appairage** — flux d’approbation 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 l’outil 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 l’outil 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(...)`. C’est le hook canonique pour mapper
|
||||
`rawId` vers l’id de conversation de base, l’id 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 d’outil 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
|
||||
d’accès aux médias sortants, afin que les Plugins n’aient pas besoin de cas particuliers dans le cœur partagé pour des
|
||||
paramètres spécifiques au fournisseur comme l’avatar, la pièce jointe ou l’image de couverture.
|
||||
Préférez renvoyer une map indexée par action comme
|
||||
`{ "set-profile": ["avatarUrl", "avatarPath"] }` afin que des actions sans lien n’héritent pas des arguments média d’une 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 n’est 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(...)`. C’est le
|
||||
hook canonique pour mapper `rawId` vers l’identifiant de conversation de base, l’identifiant 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é lorsqu’un plugin n’a besoin que de fallbacks parents au-dessus de l’id générique/brut.
|
||||
Si les deux hooks existent, le core utilise d’abord
|
||||
`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 d’exécution n’est pas encore disponible.
|
||||
|
||||
`messaging.resolveParentConversationCandidates(...)` reste disponible comme solution de repli de compatibilité héritée lorsqu’un Plugin n’a besoin de solutions de repli parent qu’au-dessus de l’identifiant générique/brut. Si les deux hooks existent, le cœur utilise
|
||||
d’abord `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 n’ont pas besoin de code spécifique aux approbations.
|
||||
La plupart des Plugins de canal n’ont pas besoin de code spécifique aux approbations.
|
||||
|
||||
- Le core possède `/approve` dans le même chat, les payloads partagés des boutons d’approbation, 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 d’un comportement spécifique aux approbations.
|
||||
- `ChannelPlugin.approvals` est supprimé. Placez les faits d’approbation de livraison/natifs/rendu/authentification sur `approvalCapability`.
|
||||
- `plugin.auth` sert uniquement à login/logout ; le core ne lit plus les hooks d’authentification d’approbation depuis cet objet.
|
||||
- `approvalCapability.authorizeActorAction` et `approvalCapability.getActionAvailabilityState` sont la couture canonique pour l’authentification des approbations.
|
||||
- Utilisez `approvalCapability.getActionAvailabilityState` pour la disponibilité de l’authentification des approbations dans le même chat.
|
||||
- Si votre canal expose des approbations d’exécution natives, utilisez `approvalCapability.getExecInitiatingSurfaceState` pour l’état de la surface initiatrice/du client natif lorsqu’il diffère de l’authentification des approbations dans le même chat. Le core utilise ce hook spécifique à l’exécution pour distinguer `enabled` de `disabled`, décider si le canal initiateur prend en charge les approbations d’exé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 d’approbation locale en double ou envoyer des indicateurs de frappe avant la livraison.
|
||||
- Utilisez `approvalCapability.delivery` uniquement pour le routage d’approbation natif ou la suppression de fallback.
|
||||
- Utilisez `approvalCapability.nativeRuntime` pour les faits d’approbation native appartenant au canal. Gardez-le lazy sur les points d’entré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 lorsqu’un canal a réellement besoin de payloads d’approbation 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 d’exé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 d’une livraison d’approbation 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, l’expiration, l’abonnement 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 d’approbation 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 d’un comportement spécifique aux approbations.
|
||||
- `ChannelPlugin.approvals` est supprimé. Placez les informations de livraison/rendu/authentification natives de l’approbation dans `approvalCapability`.
|
||||
- `plugin.auth` concerne uniquement login/logout ; le cœur ne lit plus les hooks d’authentification des approbations depuis cet objet.
|
||||
- `approvalCapability.authorizeActorAction` et `approvalCapability.getActionAvailabilityState` constituent la jonction canonique pour l’authentification des approbations.
|
||||
- Utilisez `approvalCapability.getActionAvailabilityState` pour la disponibilité de l’authentification des approbations dans la même discussion.
|
||||
- Si votre canal expose des approbations d’exécution natives, utilisez `approvalCapability.getExecInitiatingSurfaceState` pour l’état de la surface initiatrice/du client natif lorsqu’il diffère de l’authentification 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 d’exé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 d’approbation 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 d’approbation native gérées par le canal. Gardez-le paresseux sur les points d’entrée chauds du canal avec `createLazyChannelApprovalNativeRuntimeAdapter(...)`, qui peut importer votre module d’exécution à la demande tout en permettant au cœur d’assembler le cycle de vie de l’approbation.
|
||||
- Utilisez `approvalCapability.render` uniquement lorsqu’un canal a réellement besoin de charges utiles d’approbation 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 d’exé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 d’une livraison d’approbation 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, l’expiration, l’abonnement 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 d’approbation 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 d’approbation 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 d’objets 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é n’est pas encore assez expressive.
|
||||
- Les canaux d’approbation native doivent router à la fois `accountId` et `approvalKind` via ces helpers. `accountId` conserve la portée de la politique d’approbation multi-comptes sur le bon compte bot, et `approvalKind` conserve le comportement d’approbation d’exé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 d’approbation. 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 l’origine + DM de l’approbateur via les helpers partagés de capacité d’approbation et laissez le core agréger les livraisons réelles avant de publier tout avis dans le chat initiateur.
|
||||
- Préservez le type d’id d’approbation livré de bout en bout. Les clients natifs ne doivent pas
|
||||
deviner ni réécrire le routage d’approbation d’exécution vs plugin à partir d’un état local au canal.
|
||||
- `presentation` — mapper le modèle de vue d’approbation 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 d’approbation 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 d’objets gérés par l’exé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 d’exécution permet au cœur d’amorcer des gestionnaires pilotés par les capacités à partir de l’état de démarrage du canal sans ajouter de colle d’encapsulation spécifique aux approbations.
|
||||
- Utilisez les niveaux inférieurs `createChannelApprovalHandler` ou `createChannelNativeApprovalRuntime` uniquement lorsque la jonction pilotée par les capacités n’est pas encore suffisamment expressive.
|
||||
- Les canaux d’approbation native doivent faire transiter à la fois `accountId` et `approvalKind` par ces helpers. `accountId` permet de garder la politique d’approbation multi-compte limitée au bon compte de bot, et `approvalKind` rend disponible au canal le comportement d’approbation 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 d’approbation. Les Plugins de canal ne doivent pas envoyer leurs propres messages de suivi « l’approbation a été envoyée vers les DM / un autre canal » depuis `createChannelNativeApprovalRuntime` ; exposez plutôt un routage précis de l’origine + des DM de l’approbateur via les helpers de capacité d’approbation 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 d’identifiant d’approbation livré de bout en bout. Les clients natifs ne doivent pas
|
||||
deviner ou réécrire le routage des approbations exec vs Plugin à partir d’un état local au canal.
|
||||
- Différents types d’approbation peuvent intentionnellement exposer différentes surfaces natives.
|
||||
Exemples intégrés actuels :
|
||||
- Slack conserve le routage d’approbation natif disponible pour les ids d’exécution et de plugin.
|
||||
- Matrix conserve le même routage DM/canal natif et la même UX par réaction pour les approbations d’exécution
|
||||
et de plugin, tout en permettant à l’authentification de différer selon le type d’approbation.
|
||||
- `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 d’approbation 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 à l’authentification de différer selon le type d’approbation.
|
||||
- `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 d’entrée chauds du canal, préférez les sous-chemins runtime plus étroits lorsque vous n’avez besoin
|
||||
que d’une partie de cette famille :
|
||||
Pour les points d’entrée chauds du canal, préférez les sous-chemins d’exécution plus étroits lorsque vous n’avez besoin que d’une 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 n’avez 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 à l’exécution :
|
||||
adaptateurs de patch de configuration sûrs à l’import (`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 d’adaptateur sensible à l’environnement
|
||||
`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 d’adaptateur étroite sensible à l’environnement
|
||||
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 l’environnement et que les flux génériques de démarrage/configuration
|
||||
doivent connaître ces noms de variables d’environnement 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 l’environnement et que les flux génériques de démarrage/configuration doivent connaître ces noms de variables d’environnement avant le chargement de l’exécution, déclarez-les dans le manifeste du Plugin avec `channelEnvVars`. Conservez les `envVars` d’exé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 d’abord ce plugin » dans les
|
||||
surfaces de configuration, préférez `createOptionalChannelSetupSurface(...)`. L’adaptateur/l’assistant 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 d’installation requise dans la validation, la finalisation, et le texte du lien vers la documentation.
|
||||
Si votre canal veut seulement annoncer « installez d’abord ce Plugin » dans les
|
||||
surfaces de configuration, préférez `createOptionalChannelSetupSurface(...)`. L’adaptateur/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 d’enregistrement-et-répartition
|
||||
`openclaw/plugin-sdk/inbound-reply-dispatch` pour le câblage de route/enveloppe entrante et
|
||||
d’enregistrement-et-distribution
|
||||
- `openclaw/plugin-sdk/messaging-targets` pour l’analyse/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
|
||||
d’identité/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 d’identité/d’envoi sortants
|
||||
- `openclaw/plugin-sdk/thread-bindings-runtime` pour le cycle de vie des liaisons de fil
|
||||
et l’enregistrement des adaptateurs
|
||||
- `openclaw/plugin-sdk/agent-media-payload` uniquement lorsqu’une disposition héritée des champs
|
||||
de payload agent/média est encore requise
|
||||
- `openclaw/plugin-sdk/agent-media-payload` uniquement lorsqu’une 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 d’authentification seule peuvent généralement s’arrêter au chemin par défaut : le core gère les approbations et le plugin expose simplement des capacités outbound/auth. Les canaux d’approbation 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 d’approbation.
|
||||
Les canaux uniquement basés sur l’authentification peuvent généralement s’arrêter au chemin par défaut : le cœur gère les approbations et le Plugin expose simplement les capacités sortantes/d’authentification. Les canaux d’approbation native comme Matrix, Slack, Telegram et les transports de chat personnalisés doivent utiliser les helpers natifs partagés au lieu d’implémenter leur propre cycle de vie d’approbation.
|
||||
|
||||
## 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 d’usage 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 d’usage pour le helper partagé :
|
||||
Convient bien au helper partagé :
|
||||
|
||||
- `requireMention`
|
||||
- résultat de mention explicite
|
||||
- liste d’autorisation de mention implicite
|
||||
- contournement de commande
|
||||
- décision finale d’ignorer
|
||||
- décision finale d’ignorance
|
||||
|
||||
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 d’entré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 d’entré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 l’injection 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 l’injection d’exécution :
|
||||
|
||||
- `buildMentionRegexes`
|
||||
- `matchesMentionPatterns`
|
||||
@ -249,17 +253,17 @@ les plugins de canal intégrés qui dépendent déjà de l’injection 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 l’objet plugin de canal">
|
||||
L’interface `ChannelPlugin` dispose de nombreuses surfaces d’adaptateur optionnelles. Commencez par
|
||||
<Step title="Créer l’objet Plugin de canal">
|
||||
L’interface `ChannelPlugin` comporte de nombreuses surfaces d’adaptateur 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 d’approbation pour les nouveaux contacts DM
|
||||
pairing: {
|
||||
text: {
|
||||
idLabel: "Nom d’utilisateur Acme Chat",
|
||||
idLabel: "nom d’utilisateur 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 d’implémenter manuellement des interfaces d’adaptateur de bas niveau, vous transmettez
|
||||
des options déclaratives et le builder les compose :
|
||||
Au lieu d’implémenter manuellement des interfaces d’adaptateur de bas niveau, vous passez
|
||||
des options déclaratives et le constructeur les compose :
|
||||
|
||||
| Option | Ce qu’elle 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 d’appairage 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 d’envoi 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 d’envoi qui renvoient des métadonnées de résultat (identifiants de message) |
|
||||
|
||||
Vous pouvez aussi transmettre des objets d’adaptateur bruts à la place des options déclaratives
|
||||
Vous pouvez aussi passer des objets d’adaptateur bruts au lieu des options déclaratives
|
||||
si vous avez besoin d’un contrôle total.
|
||||
</Accordion>
|
||||
|
||||
@ -459,14 +463,14 @@ doit utiliser `resolveInboundMentionDecision({ facts, policy })`.
|
||||
});
|
||||
```
|
||||
|
||||
Placez les descripteurs CLI appartenant au canal dans `registerCliMetadata(...)` afin qu’OpenClaw
|
||||
puisse les afficher dans l’aide 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 d’administration 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 qu’OpenClaw
|
||||
puisse les afficher dans l’aide racine sans activer l’exé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é à l’exécution.
|
||||
Si `registerFull(...)` enregistre des méthodes RPC Gateway, utilisez un
|
||||
préfixe spécifique au Plugin. Les espaces de noms d’administration 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 d’enregistrement. 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 d’entré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 l’entrée complète lorsque le canal est désactivé
|
||||
ou non configuré. Cela évite de charger du code d’exé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 d’exé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 d’exé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 l’outil message" icon="puzzle" href="/fr/plugins/architecture#channel-plugins-and-the-shared-message-tool">
|
||||
describeMessageTool et découverte d’actions
|
||||
<Card title="Intégration de l’outil 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 d’exé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 d’ensemble 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
|
||||
|
||||
@ -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` lorsqu’elles 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` lorsqu’elles 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`
|
||||
- N’ajoutez pas de zéro de remplissage au mois ou au jour
|
||||
- `latest` signifie la version npm stable promue actuelle
|
||||
- `beta` signifie la cible d’installation 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 d’OpenClaw livre le package npm et l’app 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 d’installation 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 l’app macOS ensemble
|
||||
|
||||
## Cadence de publication
|
||||
|
||||
- Les publications passent d’abord par beta
|
||||
- Stable ne suit qu’une 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 qu’aprè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 l’UI 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 s’exé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 l’interface 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 s’exé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 n’accepte 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 d’exécution d’installation 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 n’accepte 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 n’attend 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 n’attend 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 l’approbation
|
||||
(ou la balise bêta/correction correspondante) avant l’approbation
|
||||
- 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 d’installation du registre publié dans un préfixe temporaire frais
|
||||
- L’automatisation 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 d’installation publié depuis le registre dans un préfixe temporaire propre
|
||||
- L’automatisation 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 l’environnement `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 l’e2e de l’installateur 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 l’approbation, afin que les notes de publication ne décrivent pas une disposition CI obsolète
|
||||
- La préparation d’une 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 d’anciennes 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 d’expé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 l’E2E de l’installateur 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 l’approbation afin que les notes de publication ne décrivent pas une disposition CI obsolète
|
||||
- L’état de préparation d’une 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
|
||||
- l’app 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
|
||||
- l’app 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 l’opé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 s’agir 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 l’exé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 l’exé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 l’opé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`
|
||||
- L’entrée SHA de commit complet n’est 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 d’une publication npm stable :
|
||||
|
||||
1. Exécutez `OpenClaw NPM Release` avec `preflight_only=true`
|
||||
- Avant qu’un tag n’existe, vous pouvez utiliser le SHA de commit `main` complet actuel pour un essai à sec en validation seule du workflow de pré-vérification
|
||||
- Avant qu’une balise n’existe, 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 d’autoréparation planifiée déplacer `beta` plus tard
|
||||
|
||||
Les modes promotion et synchronisation des dist-tags nécessitent toujours l’approbation de l’environnement `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 l’opé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.
|
||||
|
||||
@ -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 l’utilisateur qu’OpenClaw ne génère ni ne fait tourner.
|
||||
- Hors périmètre : identifiants générés ou renouvelés à l’exécution, matériel de rafraîchissement OAuth et artefacts de type session.
|
||||
- Dans le périmètre : strictement les identifiants fournis par l’utilisateur qu’OpenClaw ne crée ni ne fait tourner.
|
||||
- Hors périmètre : les identifiants créés à l’exé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 d’authentification 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 d’authentification sont incluses dans la résolution à l’exécution et dans la couverture d’audit.
|
||||
- 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 d’authentification é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 l’instantané actif de la configuration source (avant résolution), et non depuis les valeurs secrètes résolues à l’exé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 d’authentification é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 l’instantané de configuration source actif (avant résolution), et non à partir des valeurs secrètes résolues à l’exé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.
|
||||
|
||||
@ -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 d’utilisation d’OpenClaw
|
||||
- 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 qu’ils 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 & téléphone</a>
|
||||
<a href="#infrastructure-deployment">Infrastructure</a>
|
||||
<a href="#home-hardware">Maison & 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 « qu’est-ce que c’est ? » à « d’accord, j’ai 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: L’IA 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 d’OpenClaw.</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 à l’automatisation 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 qu’un verdict clair de fusion (y compris les correctifs critiques à appliquer d’abord).
|
||||
|
||||
<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 d’exemple + l’emplacement où le stocker, puis crée/teste rapidement le Skill (962 bouteilles dans l’exemple).
|
||||
|
||||
<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 d’un CSV" />
|
||||
</Card>
|
||||
|
||||
<Card title="Pilote automatique des courses Tesco" icon="cart-shopping" href="https://x.com/i/status/2009724862470689131">
|
||||
<Card title="Pilote automatique d’achats 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 d’un 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 d’achats 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 d’imprimante 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 l’a 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 l’agenda, 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 s’intè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 l’API 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 & 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 d’air 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 l’air 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 d’air 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 qu’il 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. N’a jamais ouvert un ordinateur portable.
|
||||
</Card>
|
||||
|
||||
<Card title="Agent de recherche d'emploi" icon="briefcase">
|
||||
<Card title="Agent de recherche d’emploi" 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 d’emploi, les compare aux mots-clés du CV et renvoie des opportunités pertinentes avec liens. Construit en 30 minutes avec l’API 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 s’est connecté à Jira, puis a généré un nouveau Skill à la volée (avant même qu’il n’existe 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 l’automatisation du navigateur, capture les graphiques et effectue une analyse technique à la demande. Pas besoin d’API — 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 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.
|
||||
</Card>
|
||||
|
||||
</CardGroup>
|
||||
|
||||
## 🧠 Connaissances et mémoire
|
||||
<h2 id="knowledge-memory">Connaissances & 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 d’apprentissage 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 à l’aide 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 & téléphone</h2>
|
||||
|
||||
<p className="showcase-section-intro">
|
||||
Points d’entré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 & 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 à l’emploi 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 & matériel</h2>
|
||||
|
||||
<p className="showcase-section-intro">
|
||||
Le côté monde physique d’OpenClaw : 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 d’astronomie. 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 d’inté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>
|
||||
|
||||
@ -3,76 +3,76 @@ read_when:
|
||||
- Génération de vidéos via l’agent
|
||||
- Configuration des fournisseurs et des modèles de génération de vidéos
|
||||
- Comprendre les paramètres de l’outil `video_generate`
|
||||
summary: Générez des vidéos à partir de texte, d’images ou de vidéos existantes à l’aide de 14 backends de fournisseur
|
||||
summary: Générez des vidéos à partir de texte, d’images ou de vidéos existantes à l’aide 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 d’invites textuelles, d’images 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 d’entrée et ensembles de fonctionnalités. L’agent 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 d’invites textuelles, d’images 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 d’entrée et des ensembles de fonctionnalités différents. L’agent choisit automatiquement le bon fournisseur en fonction de votre configuration et des clés API disponibles.
|
||||
|
||||
<Note>
|
||||
L’outil `video_generate` n’apparaît que lorsqu’au 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`.
|
||||
L’outil `video_generate` n’apparaît que lorsqu’au 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 d’exécution :
|
||||
OpenClaw traite la génération vidéo selon trois modes d’exé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 n’importe quel sous-ensemble de ces modes. L’outil valide le mode actif avant l’envoi et signale les modes pris en charge dans `action=list`.
|
||||
|
||||
## Démarrage rapide
|
||||
|
||||
1. Définissez une clé API pour n’importe quel fournisseur pris en charge :
|
||||
1. Définissez une clé API pour n’importe 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 à l’agent :
|
||||
3. Demandez à l’agent :
|
||||
|
||||
> Générez une vidéo cinématographique de 5 secondes d’un homard sympathique faisant du surf au coucher du soleil.
|
||||
> Génère une vidéo cinématique de 5 secondes d’un homard amical faisant du surf au coucher du soleil.
|
||||
|
||||
L’agent appelle automatiquement `video_generate`. Aucune liste d’autorisation d’outils n’est nécessaire.
|
||||
|
||||
## Ce qui se passe lorsque vous générez une vidéo
|
||||
|
||||
La génération de vidéos est asynchrone. Lorsque l’agent appelle `video_generate` dans une session :
|
||||
La génération vidéo est asynchrone. Lorsque l’agent 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. L’agent publie la vidéo terminée dans la conversation d’origine.
|
||||
|
||||
Pendant qu’une 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 qu’une 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 d’agent adossées à une session (par exemple, des invocations directes d’outils), l’outil 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 d’agent adossées à une session (par exemple, les invocations directes d’outils), l’outil revient à une génération inline et renvoie le chemin final du média dans le même tour.
|
||||
|
||||
### Cycle de vie d’une 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 l’accepte.
|
||||
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 ; l’agent se réactive et la publie dans la conversation.
|
||||
4. **failed** -- erreur du fournisseur ou expiration du délai ; l’agent se réactive avec les détails de l’erreur.
|
||||
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 ; l’agent se réveille et la publie dans la conversation.
|
||||
4. **failed** -- erreur du fournisseur ou expiration ; l’agent se réveille avec les détails de l’erreur.
|
||||
|
||||
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 d’en 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 d’en 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 d’environnement de clé API supplémentaires ou alternatives. Consultez les [pages des fournisseurs](#related) correspondantes pour plus de détails.
|
||||
Certains fournisseurs acceptent des variables d’environnement 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 à l’exécution les fournisseurs, modèles et modes d’exécution disponibles.
|
||||
|
||||
### Matrice des capacités déclarées
|
||||
|
||||
Il s’agit du contrat de mode explicite utilisé par `video_generate`, les tests de contrat et le balayage partagé en direct.
|
||||
Il s’agit 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 aujourd’hui |
|
||||
| ----------- | ---------- | -------------- | -------------- | ---------------------------------------------------------------------------------------------------------------------------------------- |
|
||||
| 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 n’accepte 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` s’exé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 d’image 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 n’accepte 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 s’exé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 d’image distante |
|
||||
| xAI | Oui | Oui | Oui | `generate`, `imageToVideo` ; `videoToVideo` ignoré parce que ce fournisseur exige actuellement une URL MP4 distante |
|
||||
|
||||
## Paramètres de l’outil
|
||||
|
||||
@ -134,19 +134,19 @@ Il s’agit 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 d’images 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 d’audios 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 d’images 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 d’audios combinée. Valeur canonique : `reference_audio` |
|
||||
|
||||
Les indications de rôle sont transmises telles quelles au fournisseur. Les valeurs canoniques proviennent de l’union `VideoGenerationAssetRole`, mais les fournisseurs peuvent accepter des chaînes de rôle supplémentaires. Les tableaux `*Roles` ne doivent pas comporter plus d’entrées que la liste de références correspondante ; les erreurs de décalage d’une position échouent avec un message clair. Utilisez une chaîne vide pour laisser un emplacement non défini.
|
||||
Les indications de rôle sont transmises telles quelles au fournisseur. Les valeurs canoniques proviennent de l’union `VideoGenerationAssetRole`, mais les fournisseurs peuvent accepter des chaînes de rôle supplémentaires. Les tableaux `*Roles` ne doivent pas contenir plus d’entrées que la liste de références correspondante ; les erreurs de décalage d’un é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 l’audio généré dans la sortie lorsqu’il est pris en charge. Distinct de `audioRef*` (entrées) |
|
||||
| `watermark` | boolean | Active ou désactive le filigrane du fournisseur lorsqu’il est pris en charge |
|
||||
| `audio` | boolean | Active l’audio généré dans la sortie lorsque c’est pris en charge. Distinct de `audioRef*` (entrées) |
|
||||
| `watermark` | boolean | Active ou désactive le filigrane du fournisseur lorsque c’est 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 l’utilise pour détecter automatiquement le ratio à partir des dimensions de l’image d’entrée). Les fournisseurs qui ne la déclarent pas exposent la valeur via `details.ignoredOverrides` dans le résultat de l’outil afin que l’omission 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 l’utilise pour détecter automatiquement le ratio à partir des dimensions de l’image d’entrée). Les fournisseurs qui ne la déclarent pas exposent la valeur via `details.ignoredOverrides` dans le résultat de l’outil afin que 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 d’objet JSON (par exemple `{"seed": 42, "draft": true}`). Les fournisseurs qui déclarent un schéma typé valident les clés et les types ; les clés inconnues ou 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 d’objet JSON (par exemple `{"seed": 42, "draft": true}`). Les fournisseurs qui déclarent un schéma typé valident les clés et les types ; les clés inconnues ou les incompatibilités 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, lorsqu’un fournisseur de fallback expose une surface de contrôle différente. Les remplacements réellement non pris en charge sont ignorés dans la mesure du possible et signalés comme avertissements dans le résultat de l’outil. Les limites strictes de capacité (comme un trop grand nombre d’entrées de référence) échouent avant l’envoi.
|
||||
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, lorsqu’un 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 l’outil. Les limites strictes de capacité (comme un trop grand nombre d’entrées de référence) échouent avant l’envoi.
|
||||
|
||||
Les résultats de l’outil 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 l’application.
|
||||
Les résultats de l’outil 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 d’exécution :
|
||||
Les entrées de référence sélectionnent également le mode d’exé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 s’appliquent par-dessus le mode sélectionné par les références d’image/vidéo, et ne fonctionnent qu’avec 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 s’appliquent par-dessus le mode sélectionné par les références image/vidéo, et ne fonctionnent qu’avec les fournisseurs qui déclarent `maxInputAudios`
|
||||
|
||||
Les références d’image 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 l’outil, afin qu’une demande qui dépasse les limites du fournisseur principal puisse tout de même s’exé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 l’outil afin qu’une requête qui dépasse les limites du fournisseur principal puisse tout de même s’exé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 n’ont pas encore déclaré de schéma reçoivent les options telles quelles (transmission compatible avec l’existant). 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 d’ignorance qu’une 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 n’ont pas encore déclaré de schéma reçoivent les options telles quelles (transmission compatible avec l’existant). 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 d’ignorance qu’une incompatibilité de type.
|
||||
|
||||
La première raison d’ignorance 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, l’erreur agrégée inclut la raison d’ignorance de chacun.
|
||||
La première raison d’ignorance dans une requête est journalisée au niveau `warn` afin que les opérateurs voient quand leur fournisseur principal a été 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, l’erreur agrégée inclut la raison d’ignorance de chacun.
|
||||
|
||||
## Actions
|
||||
|
||||
- **generate** (par défaut) -- crée une vidéo à partir de l’invite donnée et des entrées de référence facultatives.
|
||||
- **generate** (par défaut) -- crée une vidéo à partir de l’invite donnée et d’entrées de référence facultatives.
|
||||
- **status** -- vérifie l’état de la tâche vidéo en cours pour la session actuelle sans démarrer une autre génération.
|
||||
- **list** -- affiche les fournisseurs, 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 d’une vidéo, OpenClaw résout le modèle dans cet ordre :
|
||||
Lors de la génération d’une vidéo, OpenClaw résout le modèle dans cet ordre :
|
||||
|
||||
1. **Paramètre d’outil `model`** -- si l’agent en spécifie un dans l’appel.
|
||||
2. **`videoGenerationModel.primary`** -- depuis la configuration.
|
||||
@ -211,7 +211,7 @@ Lors de la génération d’une 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, l’erreur 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-*`) n’acceptent pas les entrées d’image ; les modèles I2V et les modèles généraux `*-pro-*` prennent en charge une seule image de référence (première image). Passez l’image 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 lorsqu’une 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 l’API unifiée `content[]`. Prend en charge au maximum 2 images d’entrée (first_frame + last_frame). Toutes les entrées doivent être des URL 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 l’image d’entré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 l’API unifiée `content[]`. Prend en charge jusqu’à 9 images de référence, 3 vidéos de référence et 3 audios de référence. Toutes les entrées doivent être des URL 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 l’image d’entré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 l’image vers vidéo via le graphe configuré. |
|
||||
| fal | Utilise un flux adossé à une file d’attente 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 qu’Alibaba. Les entrées de référence doivent être des URL distantes `http(s)` ; les fichiers locaux sont rejetés d’emblé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 l’authentification. `veo3` est groupé uniquement comme texte vers vidéo ; `kling` nécessite une URL d’image 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-*`) n’acceptent pas les entrées d’image ; les modèles I2V et les modèles généraux `*-pro-*` prennent en charge une seule image de référence (première image). Passez l’image par position ou définissez `role: "first_frame"`. Les ID de modèle T2V sont automatiquement remplacés par la variante I2V correspondante lorsqu’une 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 l’API unifiée `content[]`. Prend en charge au maximum 2 images d’entrée (first_frame + last_frame). Toutes les entrées doivent être des URL 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 l’image d’entré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 l’API unifiée `content[]`. Prend en charge jusqu’à 9 images de référence, 3 vidéos de référence et 3 audios de référence. Toutes les entrées doivent être des URL 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 l’image d’entré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 l’image-vers-vidéo via le graphe configuré. |
|
||||
| fal | Utilise un flux adossé à une file d’attente 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 qu’Alibaba. Les entrées de référence doivent être des URL distantes `http(s)` ; les fichiers locaux sont rejetés d’emblé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 l’authentification. `veo3` est fourni uniquement en texte-vers-vidéo ; `kling` exige une URL d’image distante. |
|
||||
| xAI | Prend en charge le texte-vers-vidéo, l’image-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 l’outil 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 l’outil 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 d’environnement de fournisseur manquantes depuis `~/.profile`, privilégie par défaut les clés API live/env par rapport aux profils d’authentification stockés, et exécute les modes déclarés qu’il peut tester en toute sécurité avec des médias locaux :
|
||||
Ce fichier live charge les variables d’environnement de fournisseur manquantes depuis `~/.profile`, privilégie par défaut les clés API live/env par rapport aux profils d’authentification 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 d’une seconde
|
||||
- plafond d’opération par fournisseur défini par `OPENCLAW_LIVE_VIDEO_GENERATION_TIMEOUT_MS`
|
||||
(`180000` par défaut)
|
||||
|
||||
FAL est facultatif, car la latence de file d’attente 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é
|
||||
|
||||
Aujourd’hui, la voie en direct partagée `videoToVideo` couvre :
|
||||
Aujourd’hui, 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 d’ensemble 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)
|
||||
|
||||
Loading…
Reference in New Issue
Block a user