chore(i18n): refresh fr translations

This commit is contained in:
openclaw-docs-i18n[bot] 2026-04-15 19:52:20 +00:00
parent 0fda378789
commit 41ae35e536
9 changed files with 1827 additions and 1581 deletions

File diff suppressed because it is too large Load Diff

View File

@ -1,99 +1,99 @@
---
read_when:
- Modification du texte du prompt système, de la liste des outils ou des sections heure/pulsation
- Modification du comportement damorçage de lespace de travail ou dinjection des Skills
- Modification du texte du prompt système, de la liste des outils ou des sections dheure/Heartbeat
- Modification du bootstrap de lespace de travail ou du comportement dinjection des Skills
summary: Ce que contient le prompt système dOpenClaw et comment il est assemblé
title: Prompt système
x-i18n:
generated_at: "2026-04-12T06:49:38Z"
generated_at: "2026-04-15T19:41:43Z"
model: gpt-5.4
provider: openai
source_hash: 057f01aac51f7737b5223f61f5d55e552d9011232aebb130426e269d8f6c257f
source_hash: c740e4646bc4980567338237bfb55126af0df72499ca00a48e4848d9a3608ab4
source_path: concepts/system-prompt.md
workflow: 15
---
# Prompt système
OpenClaw construit un prompt système personnalisé pour chaque exécution dagent. Le prompt est **géré par OpenClaw** et nutilise pas le prompt par défaut de pi-coding-agent.
OpenClaw construit un prompt système personnalisé pour chaque exécution dagent. Le prompt appartient à **OpenClaw** et nutilise pas le prompt par défaut de pi-coding-agent.
Le prompt est assemblé par OpenClaw et injecté dans chaque exécution dagent.
Les plugins de fournisseur peuvent apporter des indications de prompt compatibles avec le cache sans remplacer lintégralité du prompt géré par OpenClaw. Le runtime du fournisseur peut :
Les plugins de fournisseur peuvent apporter des indications de prompt compatibles avec le cache sans remplacer lintégralité du prompt détenu par OpenClaw. Le runtime du fournisseur peut :
- remplacer un petit ensemble de sections principales nommées (`interaction_style`,
- remplacer un petit ensemble de sections cœur nommées (`interaction_style`,
`tool_call_style`, `execution_bias`)
- injecter un **préfixe stable** au-dessus de la limite de cache du prompt
- injecter un **suffixe dynamique** au-dessous de la limite de cache du prompt
- injecter un **préfixe stable** au-dessus de la limite du cache de prompt
- injecter un **suffixe dynamique** en dessous de la limite du cache de prompt
Utilisez les contributions gérées par le fournisseur pour lajustement spécifique à une famille de modèles. Conservez la mutation de prompt héritée `before_prompt_build` pour la compatibilité ou pour de véritables modifications globales du prompt, pas pour le comportement normal dun fournisseur.
Utilisez des contributions détenues par le fournisseur pour les ajustements spécifiques à une famille de modèles. Conservez la mutation de prompt héritée `before_prompt_build` pour la compatibilité ou pour des changements de prompt réellement globaux, pas pour le comportement normal dun fournisseur.
## Structure
Le prompt est volontairement compact et utilise des sections fixes :
Le prompt est volontairement compact et utilise des sections fixes :
- **Outils** : rappel structuré de la source de vérité des outils, plus indications dexécution pour lutilisation des outils.
- **Sécurité** : court rappel des garde-fous pour éviter les comportements de recherche de pouvoir ou le contournement de la supervision.
- **Skills** (lorsquelles sont disponibles) : indique au modèle comment charger les instructions des Skills à la demande.
- **Auto-mise à jour dOpenClaw** : explique comment inspecter la configuration en toute sécurité avec
`config.schema.lookup`, corriger la configuration avec `config.patch`, remplacer lintégralité de la
configuration avec `config.apply`, et exécuter `update.run` uniquement sur demande explicite de lutilisateur. Loutil `gateway`, réservé au propriétaire, refuse également de réécrire
- **Tooling** : rappel de la source de vérité des outils structurés, plus indications dutilisation des outils au runtime.
- **Safety** : court rappel de garde-fous pour éviter les comportements de recherche de pouvoir ou de contournement de la supervision.
- **Skills** (lorsquils sont disponibles) : indique au modèle comment charger à la demande les instructions des Skills.
- **OpenClaw Self-Update** : comment inspecter la configuration en toute sécurité avec
`config.schema.lookup`, corriger la configuration avec `config.patch`, remplacer la
configuration complète avec `config.apply`, et exécuter `update.run` uniquement sur demande explicite de lutilisateur. Loutil `gateway`, réservé au propriétaire, refuse également de réécrire
`tools.exec.ask` / `tools.exec.security`, y compris les alias hérités `tools.bash.*`
qui se normalisent vers ces chemins exec protégés.
- **Espace de travail** : répertoire de travail (`agents.defaults.workspace`).
- **Documentation** : chemin local vers la documentation OpenClaw (dépôt ou package npm) et moment où la lire.
- **Fichiers de lespace de travail (injectés)** : indique que les fichiers damorçage sont inclus ci-dessous.
- **Sandbox** (lorsquelle est activée) : indique lenvironnement dexécution isolé, les chemins de sandbox et si lexécution élevée est disponible.
- **Date et heure actuelles** : heure locale de lutilisateur, fuseau horaire et format dheure.
- **Balises de réponse** : syntaxe facultative des balises de réponse pour les fournisseurs pris en charge.
- **Pulsations** : prompt de pulsation et comportement daccusé de réception, lorsque les pulsations sont activées pour lagent par défaut.
- **Runtime** : hôte, OS, node, racine du dépôt (lorsquelle est détectée), niveau de réflexion (une ligne).
- **Raisonnement** : niveau de visibilité actuel + indication de bascule `/reasoning`.
- **Workspace** : répertoire de travail (`agents.defaults.workspace`).
- **Documentation** : chemin local vers la documentation OpenClaw (dépôt ou package npm) et quand la lire.
- **Workspace Files (injected)** : indique que les fichiers de bootstrap sont inclus ci-dessous.
- **Sandbox** (lorsquelle est activée) : indique le runtime sandboxé, les chemins de la sandbox et si lexécution élevée est disponible.
- **Current Date & Time** : heure locale de lutilisateur, fuseau horaire et format horaire.
- **Reply Tags** : syntaxe facultative des balises de réponse pour les fournisseurs pris en charge.
- **Heartbeats** : prompt de Heartbeat et comportement daccusé de réception, lorsque les Heartbeats sont activés pour lagent par défaut.
- **Runtime** : hôte, OS, node, modèle, racine du dépôt (lorsquelle est détectée), niveau de réflexion (une ligne).
- **Reasoning** : niveau de visibilité actuel + indication de bascule /reasoning.
La section Outils comprend également des indications dexécution pour les tâches de longue durée :
La section Tooling inclut également des indications dexécution pour les tâches longues :
- utiliser cron pour un suivi ultérieur (`check back later`, rappels, travail récurrent)
au lieu de boucles `exec` avec veille, dastuces de délai `yieldMs` ou dun sondage répété de `process`
- utiliser `exec` / `process` uniquement pour les commandes qui démarrent maintenant et continuent à sexécuter
- utiliser Cron pour un suivi ultérieur (`check back later`, rappels, travail récurrent)
au lieu de boucles de veille `exec`, dastuces de délai `yieldMs` ou de sondages `process`
répétés
- utiliser `exec` / `process` uniquement pour des commandes qui démarrent maintenant et continuent à sexécuter
en arrière-plan
- lorsque le réveil automatique à la fin est activé, démarrer la commande une seule fois et sappuyer sur
le chemin de réveil push lorsquelle émet une sortie ou échoue
- utiliser `process` pour les journaux, le statut, lentrée ou lintervention lorsque vous devez
le mécanisme de réveil push lorsquelle produit une sortie ou échoue
- utiliser `process` pour les journaux, létat, lentrée ou lintervention lorsque vous devez
inspecter une commande en cours dexécution
- si la tâche est plus importante, préférer `sessions_spawn` ; la fin dun sous-agent est
pilotée par push et réannoncée automatiquement au demandeur
- si la tâche est plus importante, préférer `sessions_spawn` ; la fin des sous-agents est
signalée par push et réannoncée automatiquement au demandeur
- ne pas sonder `subagents list` / `sessions_list` en boucle uniquement pour attendre
la fin
Lorsque loutil expérimental `update_plan` est activé, la section Outils indique également au
modèle de lutiliser uniquement pour les tâches non triviales en plusieurs étapes, de conserver exactement une étape
`in_progress`, et déviter de répéter lintégralité du plan après chaque mise à jour.
Lorsque loutil expérimental `update_plan` est activé, Tooling indique également au
modèle de ne lutiliser que pour un travail non trivial en plusieurs étapes, de conserver exactement une étape
`in_progress`, et déviter de répéter le plan entier après chaque mise à jour.
Les garde-fous de sécurité dans le prompt système sont indicatifs. Ils guident le comportement du modèle mais nappliquent pas la politique. Utilisez la politique des outils, les approbations exec, le sandboxing et les listes dautorisation des canaux pour une application stricte ; les opérateurs peuvent les désactiver par conception.
Les garde-fous de Safety dans le prompt système sont indicatifs. Ils guident le comportement du modèle mais nappliquent pas la politique. Utilisez la politique des outils, les approbations exec, la sandbox et les listes dautorisation des canaux pour une application stricte ; les opérateurs peuvent les désactiver par conception.
Sur les canaux avec cartes ou boutons dapprobation natifs, le prompt dexécution indique désormais à
lagent de sappuyer dabord sur cette interface dapprobation native. Il ne doit inclure une commande manuelle
`/approve` que lorsque le résultat de loutil indique que les approbations dans le chat ne sont pas disponibles ou
que lapprobation manuelle est la seule possibilité.
Sur les canaux disposant de cartes/boutons dapprobation natifs, le prompt runtime indique désormais à lagent de sappuyer dabord sur cette interface dapprobation native. Il ne doit inclure une commande manuelle
`/approve` que lorsque le résultat de loutil indique que les approbations dans le chat ne sont pas disponibles ou que lapprobation manuelle est la seule option.
## Modes de prompt
OpenClaw peut produire des prompts système plus petits pour les sous-agents. Le runtime définit un
`promptMode` pour chaque exécution (ce nest pas une configuration visible par lutilisateur) :
OpenClaw peut générer des prompts système plus petits pour les sous-agents. Le runtime définit un
`promptMode` pour chaque exécution (pas une configuration destinée à lutilisateur) :
- `full` (par défaut) : inclut toutes les sections ci-dessus.
- `minimal` : utilisé pour les sous-agents ; omet **Skills**, **Rappel mémoire**, **Auto-mise à jour dOpenClaw**, **Alias de modèles**, **Identité de lutilisateur**, **Balises de réponse**,
**Messagerie**, **Réponses silencieuses** et **Pulsations**. Outils, **Sécurité**,
Espace de travail, Sandbox, Date et heure actuelles (lorsquelles sont connues), Runtime et le contexte
- `full` (par défaut) : inclut toutes les sections ci-dessus.
- `minimal` : utilisé pour les sous-agents ; omet **Skills**, **Memory Recall**, **OpenClaw
Self-Update**, **Model Aliases**, **User Identity**, **Reply Tags**,
**Messaging**, **Silent Replies** et **Heartbeats**. Tooling, **Safety**,
Workspace, Sandbox, Current Date & Time (lorsquils sont connus), Runtime et le contexte
injecté restent disponibles.
- `none` : renvoie uniquement la ligne didentité de base.
- `none` : renvoie uniquement la ligne didentité de base.
Lorsque `promptMode=minimal`, les prompts injectés supplémentaires sont libellés **Contexte du sous-agent**
au lieu de **Contexte du chat de groupe**.
Lorsque `promptMode=minimal`, les prompts injectés supplémentaires sont étiquetés **Subagent
Context** au lieu de **Group Chat Context**.
## Injection de lamorçage de lespace de travail
## Injection du bootstrap de lespace de travail
Les fichiers damorçage sont tronqués et ajoutés sous **Contexte du projet** afin que le modèle voie le contexte didentité et de profil sans nécessiter de lectures explicites :
Les fichiers de bootstrap sont tronqués et ajoutés sous **Project Context** afin que le modèle voie le contexte didentité et de profil sans avoir besoin de lectures explicites :
- `AGENTS.md`
- `SOUL.md`
@ -101,68 +101,68 @@ Les fichiers damorçage sont tronqués et ajoutés sous **Contexte du projet*
- `IDENTITY.md`
- `USER.md`
- `HEARTBEAT.md`
- `BOOTSTRAP.md` (uniquement dans les tout nouveaux espaces de travail)
- `BOOTSTRAP.md` (uniquement dans les espaces de travail tout neufs)
- `MEMORY.md` lorsquil est présent, sinon `memory.md` comme solution de repli en minuscules
Tous ces fichiers sont **injectés dans la fenêtre de contexte** à chaque tour, sauf si
un garde-fou spécifique au fichier sapplique. `HEARTBEAT.md` est omis lors des exécutions normales lorsque
les pulsations sont désactivées pour lagent par défaut ou lorsque
une condition spécifique au fichier sapplique. `HEARTBEAT.md` est omis lors des exécutions normales lorsque
les Heartbeats sont désactivés pour lagent par défaut ou que
`agents.defaults.heartbeat.includeSystemPromptSection` vaut false. Gardez les fichiers injectés concis —
en particulier `MEMORY.md`, qui peut grossir avec le temps et entraîner
une utilisation du contexte étonnamment élevée ainsi que des compactages plus fréquents.
une utilisation du contexte étonnamment élevée ainsi quune Compaction plus fréquente.
> **Remarque :** les fichiers quotidiens `memory/*.md` ne font **pas** partie du
> **Contexte du projet** damorçage normal. Lors des tours ordinaires, on y accède à la demande via les outils
> **Remarque :** les fichiers quotidiens `memory/*.md` ne font **pas** partie du
> Project Context de bootstrap normal. Lors des tours ordinaires, ils sont consultés à la demande via les outils
> `memory_search` et `memory_get`, de sorte quils ne comptent pas dans la
> fenêtre de contexte à moins que le modèle ne les lise explicitement. Les tours simples `/new` et
> `/reset` constituent lexception : le runtime peut préfixer la mémoire quotidienne récente
> sous la forme dun bloc ponctuel de contexte de démarrage pour ce premier tour.
> fenêtre de contexte sauf si le modèle les lit explicitement. Les tours `/new` et
> `/reset` seuls constituent lexception : le runtime peut préfixer de la mémoire quotidienne récente
> comme bloc de contexte de démarrage à usage unique pour ce premier tour.
Les fichiers volumineux sont tronqués avec un marqueur. La taille maximale par fichier est contrôlée par
`agents.defaults.bootstrapMaxChars` (par défaut : 20000). Le contenu total damorçage injecté
`agents.defaults.bootstrapMaxChars` (par défaut : 20000). Le contenu total du bootstrap injecté
sur lensemble des fichiers est plafonné par `agents.defaults.bootstrapTotalMaxChars`
(par défaut : 150000). Les fichiers manquants injectent un court marqueur de fichier manquant. Lorsquune troncature
se produit, OpenClaw peut injecter un bloc davertissement dans Contexte du projet ; contrôlez cela avec
`agents.defaults.bootstrapPromptTruncationWarning` (`off`, `once`, `always` ;
par défaut : `once`).
(par défaut : 150000). Les fichiers manquants injectent un court marqueur de fichier manquant. En cas de troncature,
OpenClaw peut injecter un bloc davertissement dans Project Context ; contrôlez cela avec
`agents.defaults.bootstrapPromptTruncationWarning` (`off`, `once`, `always` ;
par défaut : `once`).
Les sessions de sous-agent ninjectent que `AGENTS.md` et `TOOLS.md` (les autres fichiers damorçage
Les sessions de sous-agent ninjectent que `AGENTS.md` et `TOOLS.md` (les autres fichiers de bootstrap
sont filtrés pour garder le contexte du sous-agent réduit).
Les hooks internes peuvent intercepter cette étape via `agent:bootstrap` pour modifier ou remplacer
les fichiers damorçage injectés (par exemple en remplaçant `SOUL.md` par une persona alternative).
les fichiers de bootstrap injectés (par exemple en remplaçant `SOUL.md` par un persona alternatif).
Si vous souhaitez rendre lagent moins générique, commencez par le
Si vous souhaitez que lagent paraisse moins générique, commencez par
[Guide de personnalité SOUL.md](/fr/concepts/soul).
Pour inspecter la contribution de chaque fichier injecté (brut vs injecté, troncature, plus surcharge du schéma doutil), utilisez `/context list` ou `/context detail`. Voir [Contexte](/fr/concepts/context).
Pour inspecter la contribution de chaque fichier injecté (brut vs injecté, troncature, plus surcharge de schéma doutil), utilisez `/context list` ou `/context detail`. Voir [Contexte](/fr/concepts/context).
## Gestion du temps
Le prompt système inclut une section dédiée **Date et heure actuelles** lorsque le
fuseau horaire de lutilisateur est connu. Pour garder le cache du prompt stable, elle ninclut désormais que le
**fuseau horaire** (pas dhorloge dynamique ni de format dheure).
Le prompt système inclut une section dédiée **Current Date & Time** lorsque le
fuseau horaire de lutilisateur est connu. Pour garder le cache de prompt stable, il ninclut désormais que le
**fuseau horaire** (sans horloge dynamique ni format horaire).
Utilisez `session_status` lorsque lagent a besoin de lheure actuelle ; la carte détat
inclut une ligne dhorodatage. Le même outil peut aussi définir une substitution de modèle par session
(`model=default` la supprime).
Utilisez `session_status` lorsque lagent a besoin de lheure actuelle ; la carte détat
inclut une ligne dhorodatage. Le même outil peut aussi définir un remplacement de modèle par session
(`model=default` lefface).
Configurez avec :
Configurez avec :
- `agents.defaults.userTimezone`
- `agents.defaults.timeFormat` (`auto` | `12` | `24`)
Voir [Date et heure](/fr/date-time) pour tous les détails du comportement.
Voir [Date & Time](/fr/date-time) pour tous les détails de comportement.
## Skills
Lorsque des Skills éligibles existent, OpenClaw injecte une **liste compacte des Skills disponibles**
(`formatSkillsForPrompt`) qui inclut le **chemin du fichier** pour chaque Skill. Le
Lorsque des Skills admissibles existent, OpenClaw injecte une **liste compacte des Skills disponibles**
(`formatSkillsForPrompt`) qui inclut le **chemin de fichier** pour chaque Skill. Le
prompt indique au modèle dutiliser `read` pour charger le SKILL.md à lemplacement indiqué
(espace de travail, géré ou intégré). Si aucune Skill nest éligible, la section
Skills est omise.
(espace de travail, géré ou intégré). Si aucun Skill nest admissible, la
section Skills est omise.
Léligibilité comprend les garde-fous des métadonnées des Skills, les vérifications denvironnement/configuration dexécution,
Ladmissibilité inclut les conditions des métadonnées des Skills, les vérifications de lenvironnement/configuration du runtime,
et la liste dautorisation effective des Skills de lagent lorsque `agents.defaults.skills` ou
`agents.list[].skills` est configuré.
@ -176,13 +176,26 @@ et la liste dautorisation effective des Skills de lagent lorsque `agents.d
</available_skills>
```
Cela maintient un prompt de base réduit tout en permettant une utilisation ciblée des Skills.
Cela permet de conserver un prompt de base réduit tout en rendant possible une utilisation ciblée des Skills.
Le budget de la liste des Skills appartient au sous-système des Skills :
- Valeur globale par défaut : `skills.limits.maxSkillsPromptChars`
- Remplacement par agent : `agents.list[].skillsLimits.maxSkillsPromptChars`
Les extraits runtime génériques bornés utilisent une autre surface :
- `agents.defaults.contextLimits.*`
- `agents.list[].contextLimits.*`
Cette séparation permet de découpler le dimensionnement des Skills de celui de la lecture/injection au runtime
comme `memory_get`, les résultats doutil en direct et les actualisations de `AGENTS.md` après Compaction.
## Documentation
Lorsque disponible, le prompt système inclut une section **Documentation** qui pointe vers le
répertoire local de documentation OpenClaw (soit `docs/` dans lespace de travail du dépôt, soit la documentation du
Lorsquelle est disponible, le prompt système inclut une section **Documentation** qui pointe vers le
répertoire local de la documentation OpenClaw (soit `docs/` dans lespace de travail du dépôt, soit la documentation du
package npm intégré) et mentionne également le miroir public, le dépôt source, le Discord de la communauté et
ClawHub ([https://clawhub.ai](https://clawhub.ai)) pour la découverte des Skills. Le prompt indique au modèle de consulter dabord la documentation locale
pour le comportement, les commandes, la configuration ou larchitecture dOpenClaw, et dexécuter
`openclaw status` lui-même lorsque cest possible (en demandant à lutilisateur seulement lorsquil ny a pas accès).
lui-même `openclaw status` lorsque cest possible (en ne demandant à lutilisateur que lorsquil ny a pas accès).

File diff suppressed because it is too large Load Diff

View File

@ -1,16 +1,16 @@
---
read_when:
- Vous créez un nouveau Plugin de canal de messagerie.
- Vous souhaitez connecter OpenClaw à une plateforme de messagerie.
- Vous devez comprendre la surface dadaptation de `ChannelPlugin`
- Vous créez un nouveau Plugin de canal de messagerie
- Vous souhaitez connecter OpenClaw à une plateforme de messagerie
- Vous devez comprendre la surface dadaptation de ChannelPlugin
sidebarTitle: Channel Plugins
summary: Guide étape par étape pour créer un Plugin de canal de messagerie pour OpenClaw
title: Créer des Plugins de canal
x-i18n:
generated_at: "2026-04-15T06:56:34Z"
generated_at: "2026-04-15T19:41:43Z"
model: gpt-5.4
provider: openai
source_hash: a7f4c746fe3163a8880e14c433f4db4a1475535d91716a53fb879551d8d62f65
source_hash: 80e47e61d1e47738361692522b79aff276544446c58a7b41afe5296635dfad4b
source_path: plugins/sdk-channel-plugins.md
workflow: 15
---
@ -18,93 +18,106 @@ x-i18n:
# Créer des Plugins de canal
Ce guide explique comment créer un Plugin de canal qui connecte OpenClaw à une
plateforme de messagerie. À la fin, vous disposerez dun canal fonctionnel avec la sécurité des DM,
lappairage, le fil des réponses et la messagerie sortante.
plateforme de messagerie. À la fin, vous disposerez dun canal fonctionnel avec
la sécurité des messages privés, lappairage, le fil de réponse et la
messagerie sortante.
<Info>
Si vous navez encore créé aucun Plugin OpenClaw, lisez dabord
[Getting Started](/fr/plugins/building-plugins) pour la structure de package
de base et la configuration du manifeste.
Si vous navez encore jamais créé de Plugin OpenClaw, lisez dabord
[Getting Started](/fr/plugins/building-plugins) pour comprendre la structure de
package de base et la configuration du manifeste.
</Info>
## Fonctionnement des Plugins de canal
Les Plugins de canal nont pas besoin de leurs propres outils denvoi/modification/réaction. OpenClaw conserve un
outil `message` partagé dans le cœur. Votre Plugin gère :
Les Plugins de canal nont pas besoin de leurs propres outils send/edit/react.
OpenClaw conserve un seul outil `message` partagé dans le cœur. Votre Plugin
gère :
- **Configuration** — résolution de compte et assistant de configuration
- **Sécurité** — politique DM et listes dautorisation
- **Appairage** — flux dapprobation des DM
- **Grammaire de session** — comment les identifiants de conversation propres au fournisseur sont mappés vers les discussions de base, les identifiants de fil et les solutions de repli parent
- **Configuration** — résolution du compte et assistant de configuration
- **Sécurité** — politique des messages privés et listes dautorisation
- **Appairage** — flux dapprobation des messages privés
- **Grammaire de session** — comment les identifiants de conversation spécifiques 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
- **Fil de discussion** — comment les réponses sont organisées en fil
Le cœur gère loutil de message partagé, le câblage des prompts, la forme externe de la clé de session,
la gestion générique `:thread:` et la distribution.
Le cœur gère loutil de message partagé, le câblage des prompts, la forme
externe de la clé de session, le suivi générique `:thread:` et la répartition.
Si votre canal ajoute des paramètres doutil de message qui transportent des sources média, exposez ces
noms de paramètres via `describeMessageTool(...).mediaSourceParams`. Le cœur utilise
cette liste explicite pour la normalisation des chemins du sandbox et la politique
daccès aux médias sortants, afin que les Plugins naient pas besoin de cas particuliers dans le cœur partagé pour des
paramètres spécifiques au fournisseur comme lavatar, la pièce jointe ou limage de couverture.
Préférez renvoyer une map indexée par action comme
`{ "set-profile": ["avatarUrl", "avatarPath"] }` afin que des actions sans lien nhéritent pas des arguments média dune autre action. Un tableau plat fonctionne aussi pour des paramètres
volontairement partagés par chaque action exposée.
Si votre canal ajoute des paramètres doutil de message qui transportent des
sources de médias, exposez ces noms de paramètres via
`describeMessageTool(...).mediaSourceParams`. Le cœur utilise
cette liste explicite pour la normalisation des chemins du bac à sable et la
politique daccès aux médias sortants. Les Plugins nont donc pas besoin de cas
particuliers dans le cœur partagé pour les paramètres spécifiques au
fournisseur, comme lavatar, les pièces jointes ou limage de couverture.
Préférez renvoyer une map indexée par action, comme
`{ "set-profile": ["avatarUrl", "avatarPath"] }`, afin que des actions sans
rapport nhéritent pas des arguments média dune autre action. Un tableau plat
fonctionne également pour des paramètres volontairement partagés par toutes les
actions exposées.
Si votre plateforme stocke une portée supplémentaire dans les identifiants de conversation, conservez cette analyse
dans le Plugin avec `messaging.resolveSessionConversation(...)`. Cest le
hook canonique pour mapper `rawId` vers lidentifiant de conversation de base, lidentifiant de fil optionnel,
`baseConversationId` explicite, et tout `parentConversationCandidates`.
Lorsque vous renvoyez `parentConversationCandidates`, conservez leur ordre du
parent le plus spécifique vers la conversation parente la plus large/de base.
Si votre plateforme stocke une portée supplémentaire dans les identifiants de
conversation, conservez cette logique danalyse dans le Plugin avec
`messaging.resolveSessionConversation(...)`. Il sagit du hook canonique pour
mapper `rawId` vers lidentifiant de conversation de base, lidentifiant de fil
facultatif, léventuel `baseConversationId` et tous les
`parentConversationCandidates`.
Lorsque vous renvoyez `parentConversationCandidates`, gardez-les ordonnés du
parent le plus spécifique au parent le plus large ou à la conversation de base.
Les Plugins groupés qui ont besoin de la même analyse avant le démarrage du registre des canaux
peuvent aussi exposer un fichier de premier niveau `session-key-api.ts` avec un
export `resolveSessionConversation(...)` correspondant. Le cœur utilise cette surface sûre au démarrage
uniquement lorsque le registre de Plugin dexécution nest pas encore disponible.
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
niveau supérieur avec un export `resolveSessionConversation(...)`
correspondant. Le cœur utilise cette surface sûre pour lamorçage uniquement
lorsque le registre de Plugin dexécution nest pas encore disponible.
`messaging.resolveParentConversationCandidates(...)` reste disponible comme solution de repli de compatibilité héritée lorsquun Plugin na besoin de solutions de repli parent quau-dessus de lidentifiant générique/brut. Si les deux hooks existent, le cœur utilise
dabord `resolveSessionConversation(...).parentConversationCandidates` et ne
revient à `resolveParentConversationCandidates(...)` que lorsque le hook canonique
les omet.
`messaging.resolveParentConversationCandidates(...)` reste disponible comme
solution de repli de compatibilité héritée lorsquun Plugin na besoin que de
solutions de repli parent au-dessus de lidentifiant générique ou brut. Si les
deux hooks existent, le cœur utilise dabord
`resolveSessionConversation(...).parentConversationCandidates` et ne se rabat
sur `resolveParentConversationCandidates(...)` que lorsque le hook canonique ne
les fournit pas.
## Approbations et capacités de canal
## Approbations et capacités des canaux
La plupart des Plugins de canal nont pas besoin de code spécifique aux approbations.
La plupart des Plugins de canal nont pas besoin de code spécifique aux
approbations.
- Le cœur gère `/approve` dans la même discussion, les charges utiles de bouton dapprobation partagées et la livraison de repli générique.
- Préférez un seul objet `approvalCapability` sur le Plugin de canal lorsque le canal a besoin dun comportement spécifique aux approbations.
- `ChannelPlugin.approvals` est supprimé. Placez les informations de livraison/rendu/authentification natives de lapprobation dans `approvalCapability`.
- `plugin.auth` concerne uniquement login/logout ; le cœur ne lit plus les hooks dauthentification des approbations depuis cet objet.
- Préférez un seul objet `approvalCapability` sur le Plugin de canal lorsque le canal nécessite un comportement spécifique aux approbations.
- `ChannelPlugin.approvals` a été supprimé. Placez les informations de livraison, native, rendu et authentification des approbations dans `approvalCapability`.
- `plugin.auth` est réservé à login/logout ; le cœur ne lit plus les hooks dauthentification dapprobation depuis cet objet.
- `approvalCapability.authorizeActorAction` et `approvalCapability.getActionAvailabilityState` constituent la jonction canonique pour lauthentification des approbations.
- Utilisez `approvalCapability.getActionAvailabilityState` pour la disponibilité de lauthentification des approbations dans la même discussion.
- Si votre canal expose des approbations dexécution natives, utilisez `approvalCapability.getExecInitiatingSurfaceState` pour létat de la surface initiatrice/du client natif lorsquil diffère de lauthentification des approbations dans la même discussion. Le cœur utilise ce hook spécifique à exec pour distinguer `enabled` de `disabled`, déterminer si le canal initiateur prend en charge les approbations dexécution natives, et inclure le canal dans les indications de repli du client natif. `createApproverRestrictedNativeApprovalCapability(...)` remplit ce rôle pour le cas courant.
- Utilisez `outbound.shouldSuppressLocalPayloadPrompt` ou `outbound.beforeDeliverPayload` pour le comportement spécifique au canal dans le cycle de vie des charges utiles, par exemple masquer les invites locales dapprobation en double ou envoyer des indicateurs de saisie avant la livraison.
- Utilisez `approvalCapability.delivery` uniquement pour le routage des approbations natives ou la suppression du repli.
- Utilisez `approvalCapability.nativeRuntime` pour les informations dapprobation native gérées par le canal. Gardez-le paresseux sur les points dentrée chauds du canal avec `createLazyChannelApprovalNativeRuntimeAdapter(...)`, qui peut importer votre module dexécution à la demande tout en permettant au cœur dassembler le cycle de vie de lapprobation.
- Utilisez `approvalCapability.getActionAvailabilityState` pour la disponibilité de lauthentification dapprobation dans la même discussion.
- Si votre canal expose des approbations dexécution natives, utilisez `approvalCapability.getExecInitiatingSurfaceState` pour létat de la surface initiatrice ou du client natif lorsquil diffère de lauthentification dapprobation dans la même discussion. Le cœur utilise ce hook spécifique à lexécution pour distinguer `enabled` et `disabled`, décider si le canal initiateur prend en charge les approbations dexécution natives et inclure le canal dans les indications de repli du client natif. `createApproverRestrictedNativeApprovalCapability(...)` remplit ce rôle pour le cas courant.
- Utilisez `outbound.shouldSuppressLocalPayloadPrompt` ou `outbound.beforeDeliverPayload` pour le comportement spécifique au canal dans le cycle de vie des charges utiles, comme masquer les invites locales dapprobation en double ou envoyer des indicateurs de saisie avant la livraison.
- Utilisez `approvalCapability.delivery` uniquement pour le routage dapprobation natif ou la suppression du repli.
- Utilisez `approvalCapability.nativeRuntime` pour les informations dapprobation native gérées par le canal. Gardez-le paresseux sur les points dentrée critiques du canal avec `createLazyChannelApprovalNativeRuntimeAdapter(...)`, qui peut importer votre module dexécution à la demande tout en permettant au cœur dassembler le cycle de vie des approbations.
- Utilisez `approvalCapability.render` uniquement lorsquun canal a réellement besoin de charges utiles dapprobation personnalisées au lieu du moteur de rendu partagé.
- Utilisez `approvalCapability.describeExecApprovalSetup` lorsque le canal souhaite que la réponse du chemin désactivé explique les paramètres de configuration exacts nécessaires pour activer les approbations dexécution natives. Le hook reçoit `{ channel, channelLabel, accountId }` ; les canaux à comptes nommés doivent afficher des chemins à portée de compte tels que `channels.<channel>.accounts.<id>.execApprovals.*` au lieu de valeurs par défaut de premier niveau.
- Si un canal peut déduire des identités DM stables de type propriétaire à partir de la configuration existante, utilisez `createResolvedApproverActionAuthAdapter` depuis `openclaw/plugin-sdk/approval-runtime` pour restreindre `/approve` dans la même discussion sans ajouter de logique du cœur spécifique aux approbations.
- Si un canal a besoin dune livraison dapprobation native, faites en sorte que le code du canal reste centré sur la normalisation de la cible ainsi que sur les informations de transport/de présentation. Utilisez `createChannelExecApprovalProfile`, `createChannelNativeOriginTargetResolver`, `createChannelApproverDmTargetResolver` et `createApproverRestrictedNativeApprovalCapability` depuis `openclaw/plugin-sdk/approval-runtime`. Placez les informations spécifiques au canal derrière `approvalCapability.nativeRuntime`, idéalement via `createChannelApprovalNativeRuntimeAdapter(...)` ou `createLazyChannelApprovalNativeRuntimeAdapter(...)`, afin que le cœur puisse assembler le gestionnaire et gérer lui-même le filtrage des requêtes, le routage, la déduplication, lexpiration, labonnement Gateway et les avis de routage externe. `nativeRuntime` est divisé en quelques jonctions plus petites :
- `availability` — si le compte est configuré et si une requête doit être traitée
- `presentation` — mapper le modèle de vue dapprobation partagé vers des charges utiles natives en attente/résolues/expirées ou des actions finales
- `transport` — préparer les cibles puis envoyer/mettre à jour/supprimer des messages dapprobation natifs
- `interactions` — hooks facultatifs bind/unbind/clear-action pour les boutons ou réactions natifs
- Utilisez `approvalCapability.describeExecApprovalSetup` lorsque le canal veut que la réponse du chemin désactivé explique exactement quels paramètres de configuration sont nécessaires pour activer les approbations dexécution natives. Le hook reçoit `{ channel, channelLabel, accountId }` ; les canaux à comptes nommés doivent afficher des chemins à portée de compte comme `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 de messages privés 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 spécifique aux approbations dans le cœur.
- Si un canal a besoin de la livraison dapprobations natives, gardez le code du canal centré sur la normalisation de la cible ainsi que sur les informations de transport et 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 prendre en charge le filtrage des requêtes, le routage, la déduplication, lexpiration, labonnement Gateway et les notifications de routage ailleurs. `nativeRuntime` est divisé en quelques jonctions plus petites :
- `availability` — si le compte est configuré et si une requête doit être prise en charge
- `presentation` — mapper le modèle de vue dapprobation partagé vers des charges utiles natives en attente, résolues, expirées ou vers des actions finales
- `transport` — préparer les cibles puis envoyer, mettre à jour ou supprimer les messages dapprobation natifs
- `interactions` — hooks facultatifs pour lier, délier ou effacer des actions pour les boutons ou réactions natifs
- `observe` — hooks facultatifs de diagnostic de livraison
- Si le canal a besoin dobjets gérés par lexécution comme un client, un jeton, une app Bolt ou un récepteur Webhook, enregistrez-les via `openclaw/plugin-sdk/channel-runtime-context`. Le registre générique de contexte dexécution permet au cœur damorcer des gestionnaires pilotés par les capacités à partir de létat de démarrage du canal sans ajouter de colle dencapsulation spécifique aux approbations.
- Utilisez les niveaux inférieurs `createChannelApprovalHandler` ou `createChannelNativeApprovalRuntime` uniquement lorsque la jonction pilotée par les capacités nest pas encore suffisamment expressive.
- Les canaux dapprobation native doivent faire transiter à la fois `accountId` et `approvalKind` par ces helpers. `accountId` permet de garder la politique dapprobation multi-compte limitée au bon compte de bot, et `approvalKind` rend disponible au canal le comportement dapprobation exec vs Plugin sans branches codées en dur dans le cœur.
- Le cœur gère désormais aussi les avis de reroutage dapprobation. Les Plugins de canal ne doivent pas envoyer leurs propres messages de suivi « lapprobation a été envoyée vers les DM / un autre canal » depuis `createChannelNativeApprovalRuntime` ; exposez plutôt un routage précis de lorigine + des DM de lapprobateur via les helpers de capacité dapprobation partagés et laissez le cœur agréger les livraisons réelles avant de publier un éventuel avis dans la discussion initiatrice.
- Préservez le type didentifiant dapprobation livré de bout en bout. Les clients natifs ne doivent pas
deviner ou réécrire le routage des approbations exec vs Plugin à partir dun état local au canal.
- Différents types dapprobation peuvent intentionnellement exposer différentes surfaces natives.
Exemples groupés actuels :
- Slack maintient le routage dapprobation native disponible à la fois pour les identifiants exec et Plugin.
- Matrix conserve le même routage natif DM/canal et la même UX par réaction pour les approbations exec
et Plugin, tout en permettant à lauthentification de différer selon le type dapprobation.
- `createApproverRestrictedNativeApprovalAdapter` existe toujours comme encapsulation de compatibilité, mais le nouveau code doit préférer le constructeur de capacité et exposer `approvalCapability` sur le Plugin.
- Si le canal a besoin dobjets gérés par lexécution, comme un client, un jeton, une application Bolt ou un récepteur Webhook, enregistrez-les via `openclaw/plugin-sdk/channel-runtime-context`. Le registre générique de contexte dexécution permet au cœur damorcer des gestionnaires pilotés par les capacités à partir de létat de démarrage du canal sans ajouter de colle denveloppe spécifique aux approbations.
- Nutilisez le niveau plus bas `createChannelApprovalHandler` ou `createChannelNativeApprovalRuntime` que lorsque la jonction pilotée par les capacités nest pas encore suffisamment expressive.
- Les canaux dapprobation native doivent faire transiter à la fois `accountId` et `approvalKind` via ces helpers. `accountId` conserve la portée de la politique dapprobation multi-compte sur le bon compte de bot, et `approvalKind` conserve le comportement dapprobation dexécution par rapport au Plugin disponible pour le canal sans branches codées en dur dans le cœur.
- Le cœur gère désormais aussi les notifications de reroutage des approbations. Les Plugins de canal ne doivent pas envoyer leurs propres messages de suivi du type « lapprobation est allée dans les messages privés / un autre canal » depuis `createChannelNativeApprovalRuntime` ; à la place, exposez un routage précis de lorigine et des messages privés de lapprobateur via les helpers partagés de capacité dapprobation et laissez le cœur agréger les livraisons réelles avant de publier toute notification dans la discussion initiatrice.
- Préservez le type didentifiant dapprobation livré de bout en bout. Les clients natifs ne doivent pas deviner ni réécrire le routage des approbations dexécution par rapport aux approbations de Plugin à partir dun état local au canal.
- Différents types dapprobation peuvent volontairement exposer différentes surfaces natives.
Exemples intégrés actuels :
- Slack conserve le routage dapprobation native disponible à la fois pour les identifiants dexécution et de Plugin.
- Matrix conserve le même routage natif en messages privés ou canal et la même UX basée sur les réactions pour les approbations dexécution et de Plugin, tout en permettant à lauthentification de différer selon le type dapprobation.
- `createApproverRestrictedNativeApprovalAdapter` existe toujours comme enveloppe de compatibilité, mais le nouveau code doit préférer le constructeur de capacités et exposer `approvalCapability` sur le Plugin.
Pour les points dentrée chauds du canal, préférez les sous-chemins dexécution plus étroits lorsque vous navez besoin que dune seule partie de cette famille :
Pour les points dentrée critiques du canal, préférez les sous-chemins
dexécution plus étroits lorsque vous navez besoin que dune seule partie de
cette famille :
- `openclaw/plugin-sdk/approval-auth-runtime`
- `openclaw/plugin-sdk/approval-client-runtime`
@ -120,91 +133,91 @@ De même, préférez `openclaw/plugin-sdk/setup-runtime`,
`openclaw/plugin-sdk/setup-adapter-runtime`,
`openclaw/plugin-sdk/reply-runtime`,
`openclaw/plugin-sdk/reply-dispatch-runtime`,
`openclaw/plugin-sdk/reply-reference`, et
`openclaw/plugin-sdk/reply-chunking` lorsque vous navez pas besoin de la surface
parapluie plus large.
`openclaw/plugin-sdk/reply-reference` et
`openclaw/plugin-sdk/reply-chunking` lorsque vous navez pas besoin de la
surface englobante plus large.
Pour la configuration en particulier :
- `openclaw/plugin-sdk/setup-runtime` couvre les helpers de configuration sûrs à lexécution :
adaptateurs de patch de configuration sûrs à limport (`createPatchedAccountSetupAdapter`,
`createEnvPatchedAccountSetupAdapter`,
`createSetupInputPresenceValidator`), sortie de note de recherche,
`promptResolvedAllowFrom`, `splitSetupEntries`, et les constructeurs
de proxy de configuration déléguée
- `openclaw/plugin-sdk/setup-adapter-runtime` est la jonction dadaptateur étroite sensible à lenvironnement
pour `createEnvPatchedAccountSetupAdapter`
- `openclaw/plugin-sdk/channel-setup` couvre les constructeurs de configuration avec installation facultative
ainsi que quelques primitives sûres pour la configuration :
- `openclaw/plugin-sdk/setup-runtime` couvre les helpers de configuration sûrs à lexécution : adaptateurs de patch de configuration sûrs à limportation (`createPatchedAccountSetupAdapter`, `createEnvPatchedAccountSetupAdapter`, `createSetupInputPresenceValidator`), sortie des notes de recherche, `promptResolvedAllowFrom`, `splitSetupEntries` et les constructeurs de proxy de configuration déléguée
- `openclaw/plugin-sdk/setup-adapter-runtime` est la jonction dadaptateur étroite, consciente de lenvironnement, pour `createEnvPatchedAccountSetupAdapter`
- `openclaw/plugin-sdk/channel-setup` couvre les constructeurs de configuration dinstallation facultative ainsi que quelques primitives sûres pour la configuration :
`createOptionalChannelSetupSurface`, `createOptionalChannelSetupAdapter`,
Si votre canal prend en charge une configuration ou une authentification pilotée par lenvironnement et que les flux génériques de démarrage/configuration doivent connaître ces noms de variables denvironnement avant le chargement de lexécution, déclarez-les dans le manifeste du Plugin avec `channelEnvVars`. Conservez les `envVars` dexécution du canal ou les constantes locales uniquement pour le texte destiné aux opérateurs.
Si votre canal prend en charge une configuration ou une authentification pilotée
par des variables denvironnement et que les flux génériques de démarrage ou de
configuration doivent connaître ces noms de variables avant le chargement de
lexécution, déclarez-les dans le manifeste du Plugin avec `channelEnvVars`.
Conservez `envVars` de lexécution du canal ou des constantes locales
uniquement pour le texte destiné aux opérateurs.
`createOptionalChannelSetupWizard`, `DEFAULT_ACCOUNT_ID`,
`createTopLevelChannelDmPolicy`, `setSetupChannelEnabled`, et
`createTopLevelChannelDmPolicy`, `setSetupChannelEnabled` et
`splitSetupEntries`
- 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(...)`
- utilisez la jonction plus large `openclaw/plugin-sdk/setup` uniquement lorsque vous avez aussi besoin des helpers partagés de configuration plus lourds, comme `moveSingleAccountChannelSectionToDefaultAccount(...)`
Si votre canal veut seulement annoncer « installez dabord ce Plugin » dans les
surfaces de configuration, préférez `createOptionalChannelSetupSurface(...)`. Ladaptateur/assistant généré échoue de manière fermée sur les écritures de configuration et la finalisation, et il réutilise
le même message « installation requise » pour la validation, la finalisation et le texte
du lien vers la documentation.
surfaces de configuration, préférez
`createOptionalChannelSetupSurface(...)`. Ladaptateur et lassistant générés
échouent en mode fermé sur les écritures de configuration et la finalisation, et
ils réutilisent le même message « installation requise » dans 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 :
Pour les autres chemins critiques 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-resolution` et
`openclaw/plugin-sdk/account-helpers` pour la configuration multi-compte et
le repli vers le compte par défaut
la solution de repli du compte par défaut
- `openclaw/plugin-sdk/inbound-envelope` et
`openclaw/plugin-sdk/inbound-reply-dispatch` pour le câblage de route/enveloppe entrante et
denregistrement-et-distribution
- `openclaw/plugin-sdk/messaging-targets` pour lanalyse/la correspondance des cibles
`openclaw/plugin-sdk/inbound-reply-dispatch` pour le câblage de la route ou
de lenveloppe entrante ainsi que de lenregistrement et de la répartition
- `openclaw/plugin-sdk/messaging-targets` pour lanalyse et 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égations didentité/denvoi sortants
- `openclaw/plugin-sdk/thread-bindings-runtime` pour le cycle de vie des liaisons de fil
et lenregistrement des adaptateurs
- `openclaw/plugin-sdk/agent-media-payload` uniquement lorsquune disposition 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 repli
`openclaw/plugin-sdk/outbound-runtime` pour le chargement des médias ainsi que
les délégués didentité et denvoi sortants
- `openclaw/plugin-sdk/thread-bindings-runtime` pour le cycle de vie des
liaisons de fil et lenregistrement des adaptateurs
- `openclaw/plugin-sdk/agent-media-payload` uniquement lorsquune disposition
héritée des champs de charge utile agent/média est encore nécessaire
- `openclaw/plugin-sdk/telegram-command-config` pour la normalisation des
commandes personnalisées Telegram, la validation des doublons ou conflits, et
un contrat de configuration de commande stable en solution de repli
Les canaux uniquement basés sur lauthentification peuvent généralement sarrêter au chemin par défaut : le cœur gère les approbations et le Plugin expose simplement les capacités sortantes/dauthentification. Les canaux dapprobation native comme Matrix, Slack, Telegram et les transports de chat personnalisés doivent utiliser les helpers natifs partagés au lieu dimplémenter leur propre cycle de vie dapprobation.
Les canaux basés uniquement sur lauthentification peuvent généralement sarrêter au chemin par défaut : le cœur gère les approbations et le Plugin expose simplement les capacités sortantes et dauthentification. Les canaux dapprobation native comme Matrix, Slack, Telegram et les transports de discussion personnalisés doivent utiliser les helpers natifs partagés au lieu de créer leur propre cycle de vie dapprobation.
## Politique des mentions entrantes
Conservez la gestion des mentions entrantes séparée en deux couches :
Conservez la gestion des mentions entrantes répartie en deux couches :
- collecte déléments de preuve gérée par le Plugin
- collecte de preuves gérée par le Plugin
- évaluation de politique partagée
Utilisez `openclaw/plugin-sdk/channel-inbound` pour la couche partagée.
Convient bien à la logique locale au Plugin :
Bon cas dusage pour la logique locale au Plugin :
- détection des réponses au bot
- détection des citations du bot
- détection de réponse au bot
- détection de citation du bot
- vérifications de participation au fil
- exclusions des messages de service/système
- exclusions de messages de service ou système
- caches natifs à la plateforme nécessaires pour prouver la participation du bot
Convient bien au helper partagé :
Bon cas dusage pour le helper partagé :
- `requireMention`
- résultat de mention explicite
- liste dautorisation de mention implicite
- contournement de commande
- décision finale dignorance
- décision finale dignorer
Flux recommandé :
1. Calculez les éléments factuels locaux sur les mentions.
2. Passez ces éléments à `resolveInboundMentionDecision({ facts, policy })`.
1. Calculez les faits de mention locaux.
2. Transmettez ces faits à `resolveInboundMentionDecision({ facts, policy })`.
3. Utilisez `decision.effectiveWasMentioned`, `decision.shouldBypassMention` et `decision.shouldSkip` dans votre garde dentrée.
```typescript
@ -245,7 +258,7 @@ if (decision.shouldSkip) return;
```
`api.runtime.channel.mentions` expose les mêmes helpers de mention partagés pour
les Plugins de canal groupés qui dépendent déjà de linjection dexécution :
les Plugins de canal intégrés qui dépendent déjà de linjection dexécution :
- `buildMentionRegexes`
- `matchesMentionPatterns`
@ -253,18 +266,20 @@ les Plugins de canal groupés qui dépendent déjà de linjection dexécut
- `implicitMentionKindWhen`
- `resolveInboundMentionDecision`
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 })`.
Les anciens helpers `resolveMentionGating*` restent dans
`openclaw/plugin-sdk/channel-inbound` uniquement comme exports de compatibilité.
Le nouveau code doit utiliser
`resolveInboundMentionDecision({ facts, policy })`.
## Guide pas à pas
## Procédure pas à pas
<Steps>
<a id="step-1-package-and-manifest"></a>
<Step title="Package et manifeste">
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) :
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, consultez
[Plugin Setup and Config](/fr/plugins/sdk-setup#openclaw-channel) :
<CodeGroup>
```json package.json
@ -290,7 +305,7 @@ doit utiliser `resolveInboundMentionDecision({ facts, policy })`.
"kind": "channel",
"channels": ["acme-chat"],
"name": "Acme Chat",
"description": "Plugin de canal Acme Chat",
"description": "Acme Chat channel plugin",
"configSchema": {
"type": "object",
"additionalProperties": false,
@ -314,8 +329,9 @@ doit utiliser `resolveInboundMentionDecision({ facts, policy })`.
</Step>
<Step title="Créer lobjet Plugin de canal">
Linterface `ChannelPlugin` comporte de nombreuses surfaces dadaptateur optionnelles. Commencez par
le minimum — `id` et `setup` — puis ajoutez des adaptateurs selon vos besoins.
Linterface `ChannelPlugin` possède de nombreuses surfaces dadaptation
facultatives. Commencez par le minimum — `id` et `setup` — puis ajoutez des
adaptateurs selon vos besoins.
Créez `src/channel.ts` :
@ -325,7 +341,7 @@ doit utiliser `resolveInboundMentionDecision({ facts, policy })`.
createChannelPluginBase,
} from "openclaw/plugin-sdk/channel-core";
import type { OpenClawConfig } from "openclaw/plugin-sdk/channel-core";
import { acmeChatApi } from "./client.js"; // votre client API de plateforme
import { acmeChatApi } from "./client.js"; // your platform API client
type ResolvedAccount = {
accountId: string | null;
@ -366,7 +382,7 @@ doit utiliser `resolveInboundMentionDecision({ facts, policy })`.
},
}),
// Sécurité DM : qui peut envoyer des messages au bot
// DM security: who can message the bot
security: {
dm: {
channelKey: "acme-chat",
@ -376,21 +392,21 @@ doit utiliser `resolveInboundMentionDecision({ facts, policy })`.
},
},
// Appairage : flux dapprobation pour les nouveaux contacts DM
// Pairing: approval flow for new DM contacts
pairing: {
text: {
idLabel: "nom dutilisateur Acme Chat",
message: "Envoyez ce code pour vérifier votre identité :",
idLabel: "Acme Chat username",
message: "Send this code to verify your identity:",
notify: async ({ target, code }) => {
await acmeChatApi.sendDm(target, `Pairing code: ${code}`);
},
},
},
// Fil des réponses : comment les réponses sont livrées
// Threading: how replies are delivered
threading: { topLevelReplyToMode: "reply" },
// Sortant : envoyer des messages vers la plateforme
// Outbound: send messages to the platform
outbound: {
attachedResults: {
sendText: async (params) => {
@ -411,23 +427,24 @@ doit utiliser `resolveInboundMentionDecision({ facts, policy })`.
```
<Accordion title="Ce que createChatChannelPlugin fait pour vous">
Au lieu dimplémenter manuellement des interfaces dadaptateur de bas niveau, vous passez
des options déclaratives et le constructeur les compose :
Au lieu dimplémenter manuellement des interfaces dadaptateur de bas
niveau, vous fournissez des options déclaratives et le constructeur les
compose :
| Option | Ce quelle câble |
| Option | Ce quelle connecte |
| --- | --- |
| `security.dm` | Résolveur de sécurité DM à portée limitée depuis les champs de configuration |
| `pairing.text` | Flux dappairage DM basé sur du texte avec échange de code |
| `security.dm` | Résolveur de sécurité des messages privés à portée limitée depuis les champs de configuration |
| `pairing.text` | Flux dappairage de messages privés basé sur du texte avec échange de code |
| `threading` | Résolveur de mode de réponse (fixe, à portée de compte ou personnalisé) |
| `outbound.attachedResults` | Fonctions denvoi qui renvoient des métadonnées de résultat (identifiants de message) |
Vous pouvez aussi passer des objets dadaptateur bruts au lieu des options déclaratives
si vous avez besoin dun contrôle total.
Vous pouvez aussi transmettre des objets dadaptateur bruts au lieu des
options déclaratives si vous avez besoin dun contrôle total.
</Accordion>
</Step>
<Step title="Câbler le point dentrée">
<Step title="Connecter le point dentrée">
Créez `index.ts` :
```typescript index.ts
@ -437,20 +454,20 @@ doit utiliser `resolveInboundMentionDecision({ facts, policy })`.
export default defineChannelPluginEntry({
id: "acme-chat",
name: "Acme Chat",
description: "Plugin de canal Acme Chat",
description: "Acme Chat channel plugin",
plugin: acmeChatPlugin,
registerCliMetadata(api) {
api.registerCli(
({ program }) => {
program
.command("acme-chat")
.description("Gestion Acme Chat");
.description("Acme Chat management");
},
{
descriptors: [
{
name: "acme-chat",
description: "Gestion Acme Chat",
description: "Acme Chat management",
hasSubcommands: false,
},
],
@ -463,17 +480,20 @@ doit utiliser `resolveInboundMentionDecision({ facts, policy })`.
});
```
Placez les descripteurs CLI propres au canal dans `registerCliMetadata(...)` afin quOpenClaw
puisse les afficher dans laide racine sans activer lexécution complète du canal,
tandis que les chargements complets normaux récupèrent toujours les mêmes descripteurs pour le véritable enregistrement
des commandes. Réservez `registerFull(...)` au travail réservé à lexécution.
Placez les descripteurs CLI gérés par le canal dans
`registerCliMetadata(...)` afin quOpenClaw puisse les afficher dans laide
racine sans activer lexécution complète du canal, tandis que les
chargements complets normaux récupèrent toujours les mêmes descripteurs pour
lenregistrement réel des commandes. Conservez `registerFull(...)` pour le
travail réservé à lexécution.
Si `registerFull(...)` enregistre des méthodes RPC Gateway, utilisez un
préfixe spécifique au Plugin. Les espaces de noms dadministration du cœur (`config.*`,
`exec.approvals.*`, `wizard.*`, `update.*`) restent réservés et se
résolvent toujours vers `operator.admin`.
`defineChannelPluginEntry` gère automatiquement la séparation des modes denregistrement. Voir
[Entry Points](/fr/plugins/sdk-entrypoints#definechannelpluginentry) pour toutes les
options.
préfixe spécifique au Plugin. Les espaces de noms dadministration du cœur
(`config.*`, `exec.approvals.*`, `wizard.*`, `update.*`) restent réservés
et se résolvent toujours vers `operator.admin`.
`defineChannelPluginEntry` gère automatiquement cette séparation des modes
denregistrement. Consultez
[Entry Points](/fr/plugins/sdk-entrypoints#definechannelpluginentry) pour
toutes les options.
</Step>
@ -487,28 +507,36 @@ doit utiliser `resolveInboundMentionDecision({ facts, policy })`.
export default defineSetupPluginEntry(acmeChatPlugin);
```
OpenClaw charge ceci au lieu de lentrée complète lorsque le canal est désactivé
ou non configuré. Cela évite de charger du code dexécution lourd pendant les flux de configuration.
Voir [Setup and Config](/fr/plugins/sdk-setup#setup-entry) pour plus de détails.
OpenClaw charge ceci à la place du point dentrée complet lorsque le canal
est désactivé ou non configuré. Cela évite de charger du code dexécution
lourd pendant les flux de configuration.
Consultez [Setup and Config](/fr/plugins/sdk-setup#setup-entry) pour plus de
détails.
Les canaux despace de travail intégrés qui répartissent les exports sûrs
pour la configuration dans des modules annexes peuvent utiliser
`defineBundledChannelSetupEntry(...)` depuis
`openclaw/plugin-sdk/channel-entry-contract` lorsquils ont aussi besoin
dun setter dexécution explicite au moment de la configuration.
</Step>
<Step title="Gérer les messages entrants">
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 :
Votre Plugin doit recevoir les messages depuis la plateforme et les
transférer vers 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", // plugin-managed auth (verify signatures yourself)
handler: async (req, res) => {
const event = parseWebhookPayload(req);
// 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 Plugin groupé Microsoft Teams ou Google Chat.
// Your inbound handler dispatches the message to OpenClaw.
// The exact wiring depends on your platform SDK
// see a real example in the bundled Microsoft Teams or Google Chat plugin package.
await handleAcmeChatInbound(api, event);
res.statusCode = 200;
@ -520,9 +548,10 @@ doit utiliser `resolveInboundMentionDecision({ facts, policy })`.
```
<Note>
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.
La gestion des messages entrants est spécifique au canal. Chaque Plugin de
canal gère son propre pipeline entrant. Examinez les Plugins de canal
intégrés (par exemple le package Plugin Microsoft Teams ou Google Chat)
pour voir des modèles réels.
</Note>
</Step>
@ -567,7 +596,7 @@ doit utiliser `resolveInboundMentionDecision({ facts, policy })`.
pnpm test -- <bundled-plugin-root>/acme-chat/
```
Pour les helpers de test partagés, voir [Testing](/fr/plugins/sdk-testing).
Pour les helpers de test partagés, consultez [Testing](/fr/plugins/sdk-testing).
</Step>
</Steps>
@ -592,30 +621,31 @@ doit utiliser `resolveInboundMentionDecision({ facts, policy })`.
## Sujets avancés
<CardGroup cols={2}>
<Card title="Options de fil des réponses" icon="git-branch" href="/fr/plugins/sdk-entrypoints#registration-mode">
<Card title="Options de fil de discussion" icon="git-branch" href="/fr/plugins/sdk-entrypoints#registration-mode">
Modes de réponse fixes, à portée de compte ou personnalisés
</Card>
<Card title="Intégration de loutil de message" icon="puzzle" href="/fr/plugins/architecture#channel-plugins-and-the-shared-message-tool">
describeMessageTool et découverte des actions
describeMessageTool et découverte daction
</Card>
<Card title="Résolution de cible" icon="crosshair" href="/fr/plugins/architecture#channel-target-resolution">
inferTargetChatType, looksLikeId, resolveTarget
</Card>
<Card title="Helpers dexécution" icon="settings" href="/fr/plugins/sdk-runtime">
TTS, STT, média, sous-agent via api.runtime
TTS, STT, médias, sous-agent via api.runtime
</Card>
</CardGroup>
<Note>
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.
Certaines jonctions de helpers intégrés existent encore pour la maintenance et
la compatibilité des Plugins intégrés. Ce nest 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 intégrés.
</Note>
## Étapes suivantes
- [Plugins de fournisseur](/fr/plugins/sdk-provider-plugins) — si votre Plugin fournit aussi des modèles
- [Vue densemble du SDK](/fr/plugins/sdk-overview) — référence complète des imports par sous-chemin
- [Tests du SDK](/fr/plugins/sdk-testing) — utilitaires de test et tests de contrat
- [Manifeste de Plugin](/fr/plugins/manifest) — schéma complet du manifeste
- [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

View File

@ -1,33 +1,33 @@
---
read_when:
- Vous avez besoin de la signature de type exacte de `definePluginEntry` ou `defineChannelPluginEntry`
- Vous voulez comprendre le mode denregistrement (full vs setup vs métadonnées CLI)
- Vous recherchez les options des points dentrée
- Vous avez besoin de la signature de type exacte de definePluginEntry ou de defineChannelPluginEntry
- Vous souhaitez comprendre le mode denregistrement (complet vs configuration vs métadonnées CLI)
- Vous recherchez les options de point dentrée
sidebarTitle: Entry Points
summary: Référence pour `definePluginEntry`, `defineChannelPluginEntry` et `defineSetupPluginEntry`
title: Points dentrée de plugin
summary: Référence pour definePluginEntry, defineChannelPluginEntry et defineSetupPluginEntry
title: Points dentrée du Plugin
x-i18n:
generated_at: "2026-04-05T12:49:58Z"
generated_at: "2026-04-15T19:41:43Z"
model: gpt-5.4
provider: openai
source_hash: 799dbfe71e681dd8ba929a7a631dfe745c3c5c69530126fea2f9c137b120f51f
source_hash: aabca25bc9b8ff1b5bb4852bafe83640ffeba006ea6b6a8eff4e2c37a10f1fe4
source_path: plugins/sdk-entrypoints.md
workflow: 15
---
# Points dentrée de plugin
# Points dentrée du Plugin
Chaque plugin exporte un objet dentrée par défaut. Le SDK fournit trois helpers pour
les créer.
<Tip>
**Vous cherchez un guide pas à pas ?** Voir [Plugins de canal](/plugins/sdk-channel-plugins)
ou [Plugins de fournisseur](/plugins/sdk-provider-plugins) pour des guides étape par étape.
**Vous cherchez un guide pas à pas ?** Consultez [Channel Plugins](/fr/plugins/sdk-channel-plugins)
ou [Provider Plugins](/fr/plugins/sdk-provider-plugins) pour des guides étape par étape.
</Tip>
## `definePluginEntry`
**Import :** `openclaw/plugin-sdk/plugin-entry`
**Importation :** `openclaw/plugin-sdk/plugin-entry`
Pour les plugins de fournisseur, les plugins doutils, les plugins de hooks, et tout ce qui **nest pas**
un canal de messagerie.
@ -60,17 +60,18 @@ export default definePluginEntry({
| `register` | `(api: OpenClawPluginApi) => void` | Oui | — |
- `id` doit correspondre à votre manifeste `openclaw.plugin.json`.
- `kind` sert pour les emplacements exclusifs : `"memory"` ou `"context-engine"`.
- `kind` est utilisé pour les emplacements exclusifs : `"memory"` ou `"context-engine"`.
- `configSchema` peut être une fonction pour une évaluation paresseuse.
- OpenClaw résout et met ce schéma en cache lors du premier accès, de sorte que les constructeurs de schéma coûteux
- OpenClaw résout et mémorise ce schéma lors du premier accès, donc les générateurs de schéma coûteux
ne sexécutent quune seule fois.
## `defineChannelPluginEntry`
**Import :** `openclaw/plugin-sdk/channel-core`
**Importation :** `openclaw/plugin-sdk/channel-core`
Encapsule `definePluginEntry` avec le câblage spécifique aux canaux. Appelle automatiquement
`api.registerChannel({ plugin })`, expose une couture facultative de métadonnées CLI daide racine, et conditionne `registerFull` au mode denregistrement.
Encapsule `definePluginEntry` avec un câblage spécifique aux canaux. Appelle automatiquement
`api.registerChannel({ plugin })`, expose une jonction facultative de métadonnées CLI
pour laide racine, et conditionne `registerFull` selon le mode denregistrement.
```typescript
import { defineChannelPluginEntry } from "openclaw/plugin-sdk/channel-core";
@ -101,33 +102,33 @@ export default defineChannelPluginEntry({
| `registerCliMetadata` | `(api: OpenClawPluginApi) => void` | Non | — |
| `registerFull` | `(api: OpenClawPluginApi) => void` | Non | — |
- `setRuntime` est appelé pendant lenregistrement afin que vous puissiez stocker la référence de runtime
- `setRuntime` est appelé pendant lenregistrement afin que vous puissiez stocker la référence dexécution
(généralement via `createPluginRuntimeStore`). Il est ignoré pendant la capture
de métadonnées CLI.
des métadonnées CLI.
- `registerCliMetadata` sexécute à la fois lorsque `api.registrationMode === "cli-metadata"`
et lorsque `api.registrationMode === "full"`.
Utilisez-le comme emplacement canonique pour les descripteurs CLI détenus par le canal afin que laide racine
reste non activante tout en gardant lenregistrement normal des commandes CLI compatible
Utilisez-le comme emplacement canonique pour les descripteurs CLI possédés par le canal afin que laide racine
reste non activante tout en conservant la compatibilité de lenregistrement normal des commandes CLI
avec les chargements complets de plugins.
- `registerFull` ne sexécute que lorsque `api.registrationMode === "full"`. Il est ignoré
lors du chargement setup-only.
lors du chargement pour la configuration uniquement.
- Comme pour `definePluginEntry`, `configSchema` peut être une fabrique paresseuse et OpenClaw
met en cache le schéma résolu lors du premier accès.
- Pour les commandes CLI racine détenues par le plugin, préférez `api.registerCli(..., { descriptors: [...] })`
lorsque vous voulez que la commande reste chargée paresseusement sans disparaître de
larbre danalyse de la CLI racine. Pour les plugins de canal, préférez enregistrer ces descripteurs
depuis `registerCliMetadata(...)` et gardez `registerFull(...)` concentré sur le travail réservé au runtime.
- Si `registerFull(...)` enregistre aussi des méthodes Gateway RPC, gardez-les sur un
préfixe spécifique au plugin. Les espaces de noms dadministration réservés au cœur (`config.*`,
`exec.approvals.*`, `wizard.*`, `update.*`) sont toujours forcés à
mémorise le schéma résolu lors du premier accès.
- Pour les commandes CLI racine appartenant au plugin, préférez `api.registerCli(..., { descriptors: [...] })`
lorsque vous voulez que la commande reste chargée paresseusement sans disparaître de larbre
danalyse de la CLI racine. Pour les plugins de canal, préférez enregistrer ces descripteurs
depuis `registerCliMetadata(...)` et gardez `registerFull(...)` centré sur le travail réservé à lexécution.
- Si `registerFull(...)` enregistre aussi des méthodes RPC Gateway, conservez-les avec un
préfixe spécifique au plugin. Les espaces de noms dadministration du cœur réservés (`config.*`,
`exec.approvals.*`, `wizard.*`, `update.*`) sont toujours forcés en
`operator.admin`.
## `defineSetupPluginEntry`
**Import :** `openclaw/plugin-sdk/channel-core`
**Importation :** `openclaw/plugin-sdk/channel-core`
Pour le fichier léger `setup-entry.ts`. Renvoie simplement `{ plugin }` sans
câblage runtime ni CLI.
Pour le fichier léger `setup-entry.ts`. Retourne simplement `{ plugin }` sans
câblage dexécution ni de CLI.
```typescript
import { defineSetupPluginEntry } from "openclaw/plugin-sdk/channel-core";
@ -135,33 +136,59 @@ import { defineSetupPluginEntry } from "openclaw/plugin-sdk/channel-core";
export default defineSetupPluginEntry(myChannelPlugin);
```
OpenClaw charge ceci à la place de lentrée complète lorsquun canal est désactivé,
non configuré, ou lorsque le chargement différé est activé. Voir
[Setup et configuration](/plugins/sdk-setup#setup-entry) pour savoir quand cela compte.
OpenClaw charge ceci au lieu du point dentrée complet lorsquun canal est désactivé,
non configuré, ou lorsque le chargement différé est activé. Consultez
[Setup and Config](/fr/plugins/sdk-setup#setup-entry) pour savoir quand cela a de limportance.
En pratique, associez `defineSetupPluginEntry(...)` aux familles étroites de helpers setup :
En pratique, associez `defineSetupPluginEntry(...)` aux familles étroites de helpers de configuration :
- `openclaw/plugin-sdk/setup-runtime` pour des helpers setup sûrs côté runtime tels que
les adaptateurs de patch setup import-safe, la sortie lookup-note,
`promptResolvedAllowFrom`, `splitSetupEntries`, et les proxys setup délégués
- `openclaw/plugin-sdk/channel-setup` pour les surfaces setup à installation facultative
- `openclaw/plugin-sdk/setup-tools` pour les helpers setup/install CLI/archive/docs
- `openclaw/plugin-sdk/setup-runtime` pour les helpers de configuration sûrs à lexécution, tels que
les adaptateurs de patch de configuration sûrs à limportation, la sortie de notes de recherche,
`promptResolvedAllowFrom`, `splitSetupEntries`, et les proxys de configuration délégués
- `openclaw/plugin-sdk/channel-setup` pour les surfaces de configuration dinstallation facultative
- `openclaw/plugin-sdk/setup-tools` pour les helpers de CLI/archive/documentation de configuration et dinstallation
Gardez les SDK lourds, lenregistrement CLI et les services runtime longue durée dans lentrée complète.
Conservez les SDK lourds, lenregistrement CLI et les services dexécution de longue durée dans le point
dentrée complet.
Les canaux de lespace de travail groupé qui séparent les surfaces de configuration et dexécution peuvent utiliser
`defineBundledChannelSetupEntry(...)` depuis
`openclaw/plugin-sdk/channel-entry-contract` à la place. Ce contrat permet au point dentrée
de configuration de conserver des exportations de plugin/secrets sûres pour la configuration tout en exposant
un setter dexécution :
```typescript
import { defineBundledChannelSetupEntry } from "openclaw/plugin-sdk/channel-entry-contract";
export default defineBundledChannelSetupEntry({
importMetaUrl: import.meta.url,
plugin: {
specifier: "./channel-plugin-api.js",
exportName: "myChannelPlugin",
},
runtime: {
specifier: "./runtime-api.js",
exportName: "setMyChannelRuntime",
},
});
```
Utilisez ce contrat groupé uniquement lorsque les flux de configuration ont réellement besoin dun setter
dexécution léger avant le chargement du point dentrée complet du canal.
## Mode denregistrement
`api.registrationMode` indique à votre plugin comment il a été chargé :
| Mode | Quand | Ce quil faut enregistrer |
| ----------------- | ---------------------------------- | ------------------------------------------------------------------------------------- |
| `"full"` | Démarrage normal de Gateway | Tout |
| `"setup-only"` | Canal désactivé/non configuré | Enregistrement du canal uniquement |
| `"setup-runtime"` | Flux setup avec runtime disponible | Enregistrement du canal plus uniquement le runtime léger nécessaire avant le chargement de lentrée complète |
| `"cli-metadata"` | Aide racine / capture de métadonnées CLI | Descripteurs CLI uniquement |
| Mode | Quand | Ce quil faut enregistrer |
| ----------------- | --------------------------------- | --------------------------------------------------------------------------------------- |
| `"full"` | Démarrage normal de Gateway | Tout |
| `"setup-only"` | Canal désactivé/non configuré | Enregistrement du canal uniquement |
| `"setup-runtime"` | Flux de configuration avec exécution disponible | Enregistrement du canal plus uniquement lexécution légère nécessaire avant le chargement du point dentrée complet |
| `"cli-metadata"` | Capture de laide racine / des métadonnées CLI | Descripteurs CLI uniquement |
`defineChannelPluginEntry` gère automatiquement cette séparation. Si vous utilisez
`definePluginEntry` directement pour un canal, vérifiez vous-même le mode :
`definePluginEntry` directement pour un canal, vérifiez le mode vous-même :
```typescript
register(api) {
@ -173,23 +200,23 @@ register(api) {
api.registerChannel({ plugin: myPlugin });
if (api.registrationMode !== "full") return;
// Enregistrements lourds réservés au runtime
// Heavy runtime-only registrations
api.registerService(/* ... */);
}
```
Traitez `"setup-runtime"` comme la fenêtre où les surfaces de démarrage setup-only doivent
exister sans réentrer dans le runtime complet du canal intégré. Les bonnes utilisations sont
lenregistrement du canal, les routes HTTP setup-safe, les méthodes gateway setup-safe, et
les helpers setup délégués. Les services darrière-plan lourds, les enregistreurs CLI et
les bootstrap SDK fournisseur/client appartiennent toujours à `"full"`.
Traitez `"setup-runtime"` comme la fenêtre dans laquelle les surfaces de démarrage réservées à la configuration doivent
exister sans réintégrer lexécution complète du canal groupé. Les bons cas dusage sont
lenregistrement du canal, les routes HTTP sûres pour la configuration, les méthodes Gateway sûres pour la configuration, et
les helpers de configuration délégués. Les services darrière-plan lourds, les enregistreurs CLI, et
les initialisations de SDK fournisseur/client appartiennent toujours à `"full"`.
Pour les enregistreurs CLI en particulier :
- utilisez `descriptors` lorsque lenregistreur possède une ou plusieurs commandes racine et que vous
voulez quOpenClaw charge paresseusement le vrai module CLI à la première invocation
voulez quOpenClaw charge paresseusement le vrai module CLI lors de la première invocation
- assurez-vous que ces descripteurs couvrent chaque racine de commande de premier niveau exposée par lenregistreur
- utilisez `commands` seul uniquement pour des chemins de compatibilité eager
- utilisez `commands` seul uniquement pour les chemins de compatibilité eager
## Formes de plugin
@ -197,17 +224,17 @@ OpenClaw classe les plugins chargés selon leur comportement denregistrement
| Forme | Description |
| --------------------- | -------------------------------------------------- |
| **plain-capability** | Un seul type de capacité (par ex. fournisseur seul) |
| **hybrid-capability** | Plusieurs types de capacité (par ex. fournisseur + speech) |
| **plain-capability** | Un seul type de capacité (par ex. fournisseur uniquement) |
| **hybrid-capability** | Plusieurs types de capacité (par ex. fournisseur + parole) |
| **hook-only** | Seulement des hooks, aucune capacité |
| **non-capability** | Outils/commandes/services mais aucune capacité |
Utilisez `openclaw plugins inspect <id>` pour voir la forme dun plugin.
## Liens associés
## Voir aussi
- [Vue densemble du SDK](/plugins/sdk-overview) — API denregistrement et référence des sous-chemins
- [Helpers runtime](/plugins/sdk-runtime) — `api.runtime` et `createPluginRuntimeStore`
- [Setup et configuration](/plugins/sdk-setup) — manifeste, entrée setup, chargement différé
- [Plugins de canal](/plugins/sdk-channel-plugins) — construction de lobjet `ChannelPlugin`
- [Plugins de fournisseur](/plugins/sdk-provider-plugins) — enregistrement du fournisseur et hooks
- [SDK Overview](/fr/plugins/sdk-overview) — API denregistrement et référence des sous-chemins
- [Runtime Helpers](/fr/plugins/sdk-runtime) — `api.runtime` et `createPluginRuntimeStore`
- [Setup and Config](/fr/plugins/sdk-setup) — manifeste, point dentrée de configuration, chargement différé
- [Channel Plugins](/fr/plugins/sdk-channel-plugins) — construction de lobjet `ChannelPlugin`
- [Provider Plugins](/fr/plugins/sdk-provider-plugins) — enregistrement des fournisseurs et hooks

View File

@ -1,29 +1,29 @@
---
read_when:
- Vous devez appeler des assistants core depuis un plugin (TTS, STT, génération dimages, recherche web, sous-agent)
- Vous devez appeler des assistants du cœur depuis un plugin (TTS, STT, génération dimages, recherche web, sous-agent)
- Vous voulez comprendre ce que `api.runtime` expose
- Vous accédez à des assistants de configuration, dagent ou de médias depuis le code du plugin
- Vous accédez à des assistants de configuration, dagent ou de média depuis le code du plugin
sidebarTitle: Runtime Helpers
summary: api.runtime -- les assistants runtime injectés disponibles pour les plugins
title: Assistants runtime des plugins
summary: api.runtime -- les assistants dexécution injectés disponibles pour les plugins
title: Assistants dexécution du Plugin
x-i18n:
generated_at: "2026-04-11T02:46:53Z"
generated_at: "2026-04-15T19:41:44Z"
model: gpt-5.4
provider: openai
source_hash: fbf8a6ecd970300f784b8aca20eed40ba12c83107abd27385bfdc3347d2544be
source_hash: c77a6e9cd48c84affa17dce684bbd0e072c8b63485e4a5d569f3793a4ea4f9c8
source_path: plugins/sdk-runtime.md
workflow: 15
---
# Assistants runtime des plugins
# Assistants dexécution du Plugin
Référence pour lobjet `api.runtime` injecté dans chaque plugin pendant
lenregistrement. Utilisez ces assistants au lieu dimporter directement les internes de lhôte.
lenregistrement. Utilisez ces assistants au lieu dimporter directement les composants internes de lhôte.
<Tip>
**Vous cherchez une procédure détaillée ?** Consultez [Plugins de canaux](/fr/plugins/sdk-channel-plugins)
ou [Plugins fournisseurs](/fr/plugins/sdk-provider-plugins) pour des guides pas à pas
montrant ces assistants dans leur contexte.
**Vous cherchez un guide pas à pas ?** Consultez [Plugins de canal](/fr/plugins/sdk-channel-plugins)
ou [Plugins de fournisseur](/fr/plugins/sdk-provider-plugins) pour des guides étape par étape
qui montrent ces assistants dans leur contexte.
</Tip>
```typescript
@ -32,7 +32,7 @@ register(api) {
}
```
## Espaces de noms runtime
## Espaces de noms dexécution
### `api.runtime.agent`
@ -70,12 +70,12 @@ const result = await api.runtime.agent.runEmbeddedAgent({
```
`runEmbeddedAgent(...)` est lassistant neutre pour démarrer un tour dagent OpenClaw
normal depuis le code du plugin. Il utilise la même résolution fournisseur/modèle et
la même sélection dagent harness que les réponses déclenchées par canal.
normal depuis le code du plugin. Il utilise la même résolution de fournisseur/modèle et
la même sélection du harnais dagent que les réponses déclenchées par un canal.
`runEmbeddedPiAgent(...)` reste un alias de compatibilité.
Les **assistants de stockage de session** se trouvent sous `api.runtime.agent.session` :
Les **assistants du magasin de sessions** se trouvent sous `api.runtime.agent.session` :
```typescript
const storePath = api.runtime.agent.session.resolveStorePath(cfg);
@ -86,11 +86,11 @@ const filePath = api.runtime.agent.session.resolveSessionFilePath(cfg, sessionId
### `api.runtime.agent.defaults`
Constantes de fournisseur et de modèle par défaut :
Constantes de modèle et de fournisseur par défaut :
```typescript
const model = api.runtime.agent.defaults.model; // ex. "anthropic/claude-sonnet-4-6"
const provider = api.runtime.agent.defaults.provider; // ex. "anthropic"
const model = api.runtime.agent.defaults.model; // e.g. "anthropic/claude-sonnet-4-6"
const provider = api.runtime.agent.defaults.provider; // e.g. "anthropic"
```
### `api.runtime.subagent`
@ -123,15 +123,15 @@ await api.runtime.subagent.deleteSession({
```
<Warning>
Les remplacements de modèle (`provider`/`model`) nécessitent lactivation explicite de lopérateur via
Les remplacements de modèle (`provider`/`model`) nécessitent un opt-in de lopérateur via
`plugins.entries.<id>.subagent.allowModelOverride: true` dans la configuration.
Les plugins non fiables peuvent toujours exécuter des sous-agents, mais les demandes de remplacement sont rejetées.
</Warning>
### `api.runtime.taskFlow`
Lier un runtime Task Flow à une clé de session OpenClaw existante ou à un contexte
doutil de confiance, puis créer et gérer des Task Flows sans passer un propriétaire à chaque appel.
Lier un runtime TaskFlow à une clé de session OpenClaw existante ou à un contexte
doutil de confiance, puis créer et gérer des TaskFlow sans transmettre un propriétaire à chaque appel.
```typescript
const taskFlow = api.runtime.taskFlow.fromToolContext(ctx);
@ -158,8 +158,8 @@ const waiting = taskFlow.setWaiting({
});
```
Utilisez `bindSession({ sessionKey, requesterOrigin })` lorsque vous avez déjà une
clé de session OpenClaw de confiance issue de votre propre couche de liaison. Ne liez pas à partir dune entrée utilisateur brute.
Utilisez `bindSession({ sessionKey, requesterOrigin })` lorsque vous disposez déjà dune
clé de session OpenClaw de confiance provenant de votre propre couche de liaison. Neffectuez pas de liaison à partir dune entrée utilisateur brute.
### `api.runtime.tts`
@ -185,8 +185,8 @@ const voices = await api.runtime.tts.listVoices({
});
```
Utilise la configuration core `messages.tts` et la sélection du fournisseur. Renvoie un tampon audio PCM
et un taux déchantillonnage.
Utilise la configuration centrale `messages.tts` et la sélection de fournisseur. Renvoie un
tampon audio PCM + une fréquence déchantillonnage.
### `api.runtime.mediaUnderstanding`
@ -340,10 +340,10 @@ api.runtime.tools.registerMemoryCli(/* ... */);
### `api.runtime.channel`
Assistants runtime spécifiques aux canaux (disponibles lorsquun plugin de canal est chargé).
Assistants dexécution spécifiques au canal (disponibles lorsquun plugin de canal est chargé).
`api.runtime.channel.mentions` est la surface partagée de politique de mention entrante pour
les plugins de canaux intégrés qui utilisent linjection runtime :
`api.runtime.channel.mentions` est la surface partagée de stratégie de mention entrante pour les
plugins de canal intégrés qui utilisent linjection du runtime :
```typescript
const mentionMatch = api.runtime.channel.mentions.matchesMentionWithExplicit(text, {
@ -382,16 +382,19 @@ Assistants de mention disponibles :
assistants de compatibilité `resolveMentionGating*`. Préférez le chemin normalisé
`{ facts, policy }`.
## Stocker des références runtime
## Stockage des références de runtime
Utilisez `createPluginRuntimeStore` pour stocker la référence runtime afin de lutiliser en dehors
Utilisez `createPluginRuntimeStore` pour stocker la référence du runtime en vue dune utilisation en dehors
du callback `register` :
```typescript
import { createPluginRuntimeStore } from "openclaw/plugin-sdk/runtime-store";
import type { PluginRuntime } from "openclaw/plugin-sdk/runtime-store";
const store = createPluginRuntimeStore<PluginRuntime>("my-plugin runtime not initialized");
const store = createPluginRuntimeStore<PluginRuntime>({
pluginId: "my-plugin",
errorMessage: "my-plugin runtime not initialized",
});
// In your entry point
export default defineChannelPluginEntry({
@ -412,22 +415,25 @@ export function tryGetRuntime() {
}
```
Préférez `pluginId` pour lidentité du runtime-store. La forme de niveau inférieur `key` est
destinée aux cas peu courants où un plugin a intentionnellement besoin de plus dun emplacement de runtime.
## Autres champs `api` de niveau supérieur
Au-delà de `api.runtime`, lobjet API fournit également :
Au-delà de `api.runtime`, lobjet API fournit aussi :
| Champ | Type | Description |
| ------------------------ | ------------------------- | ------------------------------------------------------------------------------------------- |
| `api.id` | `string` | Identifiant du plugin |
| `api.name` | `string` | Nom daffichage du plugin |
| `api.config` | `OpenClawConfig` | Instantané actuel de la configuration (instantané runtime actif en mémoire lorsquil est disponible) |
| `api.pluginConfig` | `Record<string, unknown>` | Configuration spécifique au plugin provenant de `plugins.entries.<id>.config` |
| `api.logger` | `PluginLogger` | Logger à portée limitée (`debug`, `info`, `warn`, `error`) |
| `api.id` | `string` | ID du Plugin |
| `api.name` | `string` | Nom daffichage du Plugin |
| `api.config` | `OpenClawConfig` | Instantané actuel de la configuration (instantané actif du runtime en mémoire lorsquil est disponible) |
| `api.pluginConfig` | `Record<string, unknown>` | Configuration spécifique au Plugin provenant de `plugins.entries.<id>.config` |
| `api.logger` | `PluginLogger` | Logger à portée limitée (`debug`, `info`, `warn`, `error`) |
| `api.registrationMode` | `PluginRegistrationMode` | Mode de chargement actuel ; `"setup-runtime"` est la fenêtre légère de démarrage/configuration avant lentrée complète |
| `api.resolvePath(input)` | `(string) => string` | Résoudre un chemin relatif à la racine du plugin |
| `api.resolvePath(input)` | `(string) => string` | Résout un chemin relatif à la racine du Plugin |
## Voir aussi
## Lié
- [Aperçu du SDK](/fr/plugins/sdk-overview) -- référence de sous-chemin
- [Vue densemble du SDK](/fr/plugins/sdk-overview) -- référence des sous-chemins
- [Points dentrée du SDK](/fr/plugins/sdk-entrypoints) -- options de `definePluginEntry`
- [Internes des plugins](/fr/plugins/architecture) -- modèle de capacités et registre
- [Composants internes du Plugin](/fr/plugins/architecture) -- modèle de capacités et registre

View File

@ -1,35 +1,35 @@
---
read_when:
- Vous ajoutez un assistant de configuration à un plugin
- Vous devez comprendre setup-entry.ts par rapport à index.ts
- Vous définissez des schémas de configuration de plugin ou des métadonnées `openclaw` dans package.json
- Vous ajoutez un assistant de configuration à un Plugin
- Vous devez comprendre `setup-entry.ts` par rapport à `index.ts`
- Vous définissez des schémas de configuration du Plugin ou des métadonnées `openclaw` dans `package.json`
sidebarTitle: Setup and Config
summary: Assistants de configuration, setup-entry.ts, schémas de configuration et métadonnées package.json
title: Configuration et setup des plugins
summary: Assistants de configuration, `setup-entry.ts`, schémas de configuration et métadonnées de `package.json`
title: Configuration et config du Plugin
x-i18n:
generated_at: "2026-04-06T03:10:26Z"
generated_at: "2026-04-15T19:41:55Z"
model: gpt-5.4
provider: openai
source_hash: eac2586516d27bcd94cc4c259fe6274c792b3f9938c7ddd6dbf04a6dbb988dc9
source_hash: ddf28e25e381a4a38ac478e531586f59612e1a278732597375f87c2eeefc521b
source_path: plugins/sdk-setup.md
workflow: 15
---
# Configuration et setup des plugins
# Configuration et config du Plugin
Référence pour le packaging des plugins (métadonnées `package.json`), les manifestes
(`openclaw.plugin.json`), les entrées de setup et les schémas de configuration.
Référence pour le packaging des Plugins (métadonnées `package.json`), les manifestes
(`openclaw.plugin.json`), les entrées de configuration et les schémas de config.
<Tip>
**Vous cherchez un guide pas à pas ?** Les guides pratiques couvrent le packaging dans son contexte :
[Plugins de canal](/fr/plugins/sdk-channel-plugins#step-1-package-and-manifest) et
[Plugins de fournisseur](/fr/plugins/sdk-provider-plugins#step-1-package-and-manifest).
[Plugins de canaux](/fr/plugins/sdk-channel-plugins#step-1-package-and-manifest) et
[Plugins de fournisseurs](/fr/plugins/sdk-provider-plugins#step-1-package-and-manifest).
</Tip>
## Métadonnées du package
Votre `package.json` doit contenir un champ `openclaw` qui indique au système de plugins ce
que fournit votre plugin :
Votre `package.json` doit contenir un champ `openclaw` qui indique au système de Plugin ce
que votre Plugin fournit :
**Plugin de canal :**
@ -50,7 +50,7 @@ que fournit votre plugin :
}
```
**Plugin de fournisseur / base de publication ClawHub :**
**Plugin de fournisseur / référence de publication ClawHub :**
```json openclaw-clawhub-package.json
{
@ -71,7 +71,7 @@ que fournit votre plugin :
}
```
Si vous publiez le plugin en externe sur ClawHub, ces champs `compat` et `build`
Si vous publiez le Plugin en externe sur ClawHub, ces champs `compat` et `build`
sont obligatoires. Les extraits canoniques de publication se trouvent dans
`docs/snippets/plugin-publish/`.
@ -80,38 +80,38 @@ sont obligatoires. Les extraits canoniques de publication se trouvent dans
| Champ | Type | Description |
| ------------ | ---------- | -------------------------------------------------------------------------------------------------------- |
| `extensions` | `string[]` | Fichiers de point dentrée (relatifs à la racine du package) |
| `setupEntry` | `string` | Entrée légère réservée au setup (facultative) |
| `channel` | `object` | Métadonnées du catalogue de canaux pour les surfaces de setup, de sélection, de démarrage rapide et détat |
| `providers` | `string[]` | Identifiants de fournisseurs enregistrés par ce plugin |
| `setupEntry` | `string` | Entrée légère réservée à la configuration (facultatif) |
| `channel` | `object` | Métadonnées du catalogue de canaux pour les surfaces de configuration, de sélection, de démarrage rapide et détat |
| `providers` | `string[]` | Identifiants de fournisseurs enregistrés par ce Plugin |
| `install` | `object` | Indications dinstallation : `npmSpec`, `localPath`, `defaultChoice`, `minHostVersion`, `allowInvalidConfigRecovery` |
| `startup` | `object` | Drapeaux de comportement au démarrage |
| `startup` | `object` | Indicateurs de comportement au démarrage |
### `openclaw.channel`
`openclaw.channel` contient des métadonnées légères du package pour les surfaces de découverte et de setup
des canaux avant le chargement de lexécution.
`openclaw.channel` correspond à des métadonnées de package peu coûteuses pour la découverte des canaux et les
surfaces de configuration avant le chargement de lexécution.
| Champ | Type | Signification |
| -------------------------------------- | ---------- | -------------------------------------------------------------------------------- |
| `id` | `string` | Identifiant canonique du canal. |
| `label` | `string` | Libellé principal du canal. |
| `selectionLabel` | `string` | Libellé de sélection/setup lorsquil doit différer de `label`. |
| Champ | Type | Signification |
| -------------------------------------- | ---------- | ------------------------------------------------------------------------------ |
| `id` | `string` | Identifiant canonique du canal. |
| `label` | `string` | Libellé principal du canal. |
| `selectionLabel` | `string` | Libellé du sélecteur/de la configuration lorsquil doit différer de `label`. |
| `detailLabel` | `string` | Libellé de détail secondaire pour des catalogues de canaux et surfaces détat plus riches. |
| `docsPath` | `string` | Chemin de documentation pour les liens de setup et de sélection. |
| `docsLabel` | `string` | Libellé de remplacement utilisé pour les liens de documentation lorsquil doit différer de lidentifiant du canal. |
| `blurb` | `string` | Courte description donboarding/catalogue. |
| `order` | `number` | Ordre de tri dans les catalogues de canaux. |
| `aliases` | `string[]` | Alias supplémentaires pour la sélection du canal. |
| `preferOver` | `string[]` | Identifiants de plugin/canal de priorité plus basse que ce canal doit surpasser. |
| `systemImage` | `string` | Nom facultatif dicône/system-image pour les catalogues UI de canaux. |
| `selectionDocsPrefix` | `string` | Texte préfixe avant les liens de documentation dans les surfaces de sélection. |
| `selectionDocsOmitLabel` | `boolean` | Afficher directement le chemin de documentation au lieu dun lien documenté avec libellé dans le texte de sélection. |
| `selectionExtras` | `string[]` | Courtes chaînes supplémentaires ajoutées dans le texte de sélection. |
| `markdownCapable` | `boolean` | Marque le canal comme compatible Markdown pour les décisions de formatage sortant. |
| `exposure` | `object` | Contrôles de visibilité du canal pour les surfaces de setup, de listes configurées et de documentation. |
| `quickstartAllowFrom` | `boolean` | Fait participer ce canal au flux standard de setup rapide `allowFrom`. |
| `forceAccountBinding` | `boolean` | Exige un rattachement de compte explicite même lorsquun seul compte existe. |
| `preferSessionLookupForAnnounceTarget` | `boolean` | Privilégie la recherche de session lors de la résolution des cibles dannonce pour ce canal. |
| `docsPath` | `string` | Chemin de documentation pour les liens de configuration et de sélection. |
| `docsLabel` | `string` | Libellé de remplacement utilisé pour les liens vers la documentation lorsquil doit différer de lidentifiant du canal. |
| `blurb` | `string` | Brève description donboarding/de catalogue. |
| `order` | `number` | Ordre de tri dans les catalogues de canaux. |
| `aliases` | `string[]` | Alias de recherche supplémentaires pour la sélection du canal. |
| `preferOver` | `string[]` | Identifiants de Plugin/canal de priorité inférieure que ce canal doit dépasser. |
| `systemImage` | `string` | Nom facultatif dicône/dimage système pour les catalogues dinterface des canaux. |
| `selectionDocsPrefix` | `string` | Texte préfixe avant les liens vers la documentation dans les surfaces de sélection. |
| `selectionDocsOmitLabel` | `boolean` | Affiche directement le chemin de documentation au lieu dun lien libellé dans le texte de sélection. |
| `selectionExtras` | `string[]` | Chaînes courtes supplémentaires ajoutées dans le texte de sélection. |
| `markdownCapable` | `boolean` | Indique que le canal prend en charge le Markdown pour les décisions de mise en forme sortante. |
| `exposure` | `object` | Contrôles de visibilité du canal pour la configuration, les listes configurées et les surfaces de documentation. |
| `quickstartAllowFrom` | `boolean` | Active pour ce canal le flux standard de configuration rapide `allowFrom`. |
| `forceAccountBinding` | `boolean` | Exige une liaison explicite de compte même lorsquun seul compte existe. |
| `preferSessionLookupForAnnounceTarget` | `boolean` | Préfère la recherche de session lors de la résolution des cibles dannonce pour ce canal. |
Exemple :
@ -146,36 +146,35 @@ Exemple :
`exposure` prend en charge :
- `configured` : inclure le canal dans les surfaces de liste de type configuré/état
- `setup` : inclure le canal dans les sélecteurs interactifs de setup/configuration
- `docs` : marquer le canal comme orienté public dans les surfaces de documentation/navigation
- `setup` : inclure le canal dans les sélecteurs interactifs de configuration/configurer
- `docs` : marquer le canal comme visible publiquement dans les surfaces de documentation/navigation
`showConfigured` et `showInSetup` restent pris en charge comme alias historiques. Préférez
`showConfigured` et `showInSetup` restent pris en charge comme alias hérités. Préférez
`exposure`.
### `openclaw.install`
`openclaw.install` est une métadonnée de package, pas une métadonnée de manifeste.
| Champ | Type | Signification |
| ---------------------------- | -------------------- | ----------------------------------------------------------------------------------- |
| `npmSpec` | `string` | Spécification npm canonique pour les flux dinstallation/mise à jour. |
| `localPath` | `string` | Chemin dinstallation local de développement ou groupé. |
| `defaultChoice` | `"npm"` \| `"local"` | Source dinstallation préférée lorsque les deux sont disponibles. |
| `minHostVersion` | `string` | Version minimale dOpenClaw prise en charge, sous la forme `>=x.y.z`. |
| `allowInvalidConfigRecovery` | `boolean` | Permet aux flux de réinstallation de plugin groupé de récupérer après certains échecs dus à une configuration obsolète. |
| Champ | Type | Signification |
| ---------------------------- | -------------------- | --------------------------------------------------------------------------------- |
| `npmSpec` | `string` | Spécification npm canonique pour les flux dinstallation/de mise à jour. |
| `localPath` | `string` | Chemin dinstallation local de développement ou intégré. |
| `defaultChoice` | `"npm"` \| `"local"` | Source dinstallation préférée lorsque les deux sont disponibles. |
| `minHostVersion` | `string` | Version minimale prise en charge dOpenClaw sous la forme `>=x.y.z`. |
| `allowInvalidConfigRecovery` | `boolean` | Permet aux flux de réinstallation de Plugins intégrés de récupérer de certaines erreurs de configuration obsolète. |
Si `minHostVersion` est défini, linstallation et le chargement du registre de manifestes
lappliquent tous deux. Les hôtes plus anciens ignorent le plugin ; les chaînes de version invalides sont rejetées.
Si `minHostVersion` est défini, linstallation et le chargement du registre de manifestes lappliquent tous deux.
Les hôtes plus anciens ignorent le Plugin ; les chaînes de version invalides sont rejetées.
`allowInvalidConfigRecovery` nest pas un contournement général des configurations cassées. Il sert
uniquement à la récupération étroite de plugins groupés, afin que la réinstallation/le setup puisse réparer des restes
connus de mise à niveau comme un chemin de plugin groupé manquant ou une entrée `channels.<id>`
obsolète pour ce même plugin. Si la configuration est cassée pour des raisons non liées, linstallation
échoue quand même de façon fermée et indique à lopérateur dexécuter `openclaw doctor --fix`.
`allowInvalidConfigRecovery` nest pas un contournement général pour des configurations cassées. Il sert
uniquement à une récupération ciblée pour les Plugins intégrés, afin que la réinstallation/la configuration puisse corriger des restes connus de mise à niveau comme un chemin de Plugin intégré manquant ou une entrée `channels.<id>`
obsolète pour ce même Plugin. Si la configuration est cassée pour des raisons sans rapport, linstallation
échoue quand même de manière sûre et indique à lopérateur dexécuter `openclaw doctor --fix`.
### Chargement complet différé
Les plugins de canal peuvent choisir le chargement différé avec :
Les Plugins de canaux peuvent activer le chargement différé avec :
```json
{
@ -189,26 +188,25 @@ Les plugins de canal peuvent choisir le chargement différé avec :
}
```
Lorsquil est activé, OpenClaw ne charge que `setupEntry` pendant la phase de démarrage
précédant lécoute, même pour les canaux déjà configurés. Lentrée complète est chargée après
le début de lécoute de la gateway.
Lorsquelle est activée, OpenClaw charge uniquement `setupEntry` pendant la phase de démarrage avant lécoute,
même pour les canaux déjà configurés. Le point dentrée complet est chargé une fois que la Gateway commence à écouter.
<Warning>
Nactivez le chargement différé que si votre `setupEntry` enregistre tout ce dont la
gateway a besoin avant de commencer à écouter (enregistrement du canal, routes HTTP,
méthodes de gateway). Si lentrée complète possède des capacités requises au démarrage, conservez
Gateway a besoin avant de commencer à écouter (enregistrement du canal, routes HTTP,
méthodes Gateway). Si le point dentrée complet possède des capacités de démarrage requises, conservez
le comportement par défaut.
</Warning>
Si votre setup/entrée complète enregistre des méthodes RPC de gateway, conservez-les sur un
préfixe spécifique au plugin. Les espaces de noms dadministration du noyau réservés (`config.*`,
`exec.approvals.*`, `wizard.*`, `update.*`) restent possédés par le noyau et sont toujours résolus
Si votre entrée de configuration/complète enregistre des méthodes RPC Gateway, conservez-les sur un
préfixe spécifique au Plugin. Les espaces de noms dadministration du cœur réservés (`config.*`,
`exec.approvals.*`, `wizard.*`, `update.*`) restent la propriété du cœur et sont toujours résolus
vers `operator.admin`.
## Manifeste du plugin
## Manifeste du Plugin
Chaque plugin natif doit livrer un `openclaw.plugin.json` à la racine du package.
OpenClaw lutilise pour valider la configuration sans exécuter le code du plugin.
Chaque Plugin natif doit fournir un `openclaw.plugin.json` à la racine du package.
OpenClaw lutilise pour valider la configuration sans exécuter le code du Plugin.
```json
{
@ -228,7 +226,7 @@ OpenClaw lutilise pour valider la configuration sans exécuter le code du plu
}
```
Pour les plugins de canal, ajoutez `kind` et `channels` :
Pour les Plugins de canaux, ajoutez `kind` et `channels` :
```json
{
@ -243,7 +241,7 @@ Pour les plugins de canal, ajoutez `kind` et `channels` :
}
```
Même les plugins sans configuration doivent livrer un schéma. Un schéma vide est valide :
Même les Plugins sans configuration doivent fournir un schéma. Un schéma vide est valide :
```json
{
@ -255,25 +253,25 @@ Même les plugins sans configuration doivent livrer un schéma. Un schéma vide
}
```
Voir [Manifeste de plugin](/fr/plugins/manifest) pour la référence complète du schéma.
Voir [Manifeste du Plugin](/fr/plugins/manifest) pour la référence complète du schéma.
## Publication sur ClawHub
## Publication ClawHub
Pour les packages de plugins, utilisez la commande ClawHub spécifique au package :
Pour les packages de Plugin, utilisez la commande ClawHub spécifique au package :
```bash
clawhub package publish your-org/your-plugin --dry-run
clawhub package publish your-org/your-plugin
```
Lancien alias de publication réservé aux skills concerne les skills. Les packages de plugins doivent
Lancien alias de publication réservé aux Skills concerne les Skills. Les packages de Plugin doivent
toujours utiliser `clawhub package publish`.
## Entrée de setup
## Entrée de configuration
Le fichier `setup-entry.ts` est une alternative légère à `index.ts` que
OpenClaw charge lorsquil na besoin que des surfaces de setup (onboarding, réparation de configuration,
inspection de canal désactivé).
OpenClaw charge lorsquil na besoin que des surfaces de configuration (onboarding, réparation de config,
inspection des canaux désactivés).
```typescript
// setup-entry.ts
@ -284,75 +282,79 @@ export default defineSetupPluginEntry(myChannelPlugin);
```
Cela évite de charger du code dexécution lourd (bibliothèques de chiffrement, enregistrements CLI,
services darrière-plan) pendant les flux de setup.
services en arrière-plan) pendant les flux de configuration.
**Quand OpenClaw utilise `setupEntry` au lieu de lentrée complète :**
Les canaux despace de travail intégrés qui conservent des exports sûrs pour la configuration dans des modules annexes peuvent
utiliser `defineBundledChannelSetupEntry(...)` depuis
`openclaw/plugin-sdk/channel-entry-contract` au lieu de
`defineSetupPluginEntry(...)`. Ce contrat intégré prend également en charge un export `runtime`
facultatif afin que le câblage de lexécution au moment de la configuration reste léger et explicite.
- Le canal est désactivé mais a besoin des surfaces de setup/onboarding
**Quand OpenClaw utilise `setupEntry` au lieu du point dentrée complet :**
- Le canal est désactivé mais a besoin de surfaces de configuration/donboarding
- Le canal est activé mais non configuré
- Le chargement différé est activé (`deferConfiguredChannelFullLoadUntilAfterListen`)
**Ce que `setupEntry` doit enregistrer :**
- Lobjet plugin de canal (via `defineSetupPluginEntry`)
- Toute route HTTP requise avant lécoute de la gateway
- Toute méthode de gateway nécessaire au démarrage
- Lobjet Plugin de canal (via `defineSetupPluginEntry`)
- Toute route HTTP requise avant lécoute de la Gateway
- Toute méthode Gateway nécessaire au démarrage
Ces méthodes de gateway de démarrage doivent toujours éviter les espaces de noms
dadministration du noyau réservés comme `config.*` ou `update.*`.
Ces méthodes Gateway de démarrage doivent toujours éviter les espaces de noms dadministration du cœur
réservés tels que `config.*` ou `update.*`.
**Ce que `setupEntry` ne doit PAS inclure :**
- Enregistrements CLI
- Services darrière-plan
- Imports dexécution lourds (crypto, SDK)
- Méthodes de gateway nécessaires uniquement après le démarrage
- Services en arrière-plan
- Imports dexécution lourds (chiffrement, SDK)
- Méthodes Gateway nécessaires uniquement après le démarrage
### Imports dassistants de setup étroits
### Imports dassistants de configuration ciblés
Pour les chemins chauds réservés au setup, préférez les points daccès étroits des assistants de setup plutôt que le point daccès plus large
`plugin-sdk/setup` lorsque vous navez besoin que dune partie de la surface de setup :
Pour les chemins critiques réservés à la configuration, préférez les points daccès dassistants de configuration ciblés plutôt que le point daccès plus large
`plugin-sdk/setup` lorsque vous navez besoin que dune partie de la surface de configuration :
| Chemin dimport | À utiliser pour | Exports clés |
| ----------------------------------- | ------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `plugin-sdk/setup-runtime` | assistants dexécution au moment du setup qui restent disponibles dans `setupEntry` / démarrage différé de canal | `createPatchedAccountSetupAdapter`, `createEnvPatchedAccountSetupAdapter`, `createSetupInputPresenceValidator`, `noteChannelLookupFailure`, `noteChannelLookupSummary`, `promptResolvedAllowFrom`, `splitSetupEntries`, `createAllowlistSetupWizardProxy`, `createDelegatedSetupWizardProxy` |
| `plugin-sdk/setup-adapter-runtime` | adaptateurs de setup de compte sensibles à lenvironnement | `createEnvPatchedAccountSetupAdapter` |
| `plugin-sdk/setup-tools` | assistants setup/install CLI/archive/documentation | `formatCliCommand`, `detectBinary`, `extractArchive`, `resolveBrewExecutable`, `formatDocsLink`, `CONFIG_DIR` |
| Chemin dimport | À utiliser pour | Exports clés |
| ---------------------------------- | ---------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `plugin-sdk/setup-runtime` | assistants dexécution au moment de la configuration qui restent disponibles dans `setupEntry` / le démarrage différé du canal | `createPatchedAccountSetupAdapter`, `createEnvPatchedAccountSetupAdapter`, `createSetupInputPresenceValidator`, `noteChannelLookupFailure`, `noteChannelLookupSummary`, `promptResolvedAllowFrom`, `splitSetupEntries`, `createAllowlistSetupWizardProxy`, `createDelegatedSetupWizardProxy` |
| `plugin-sdk/setup-adapter-runtime` | adaptateurs de configuration de compte sensibles à lenvironnement | `createEnvPatchedAccountSetupAdapter` |
| `plugin-sdk/setup-tools` | assistants CLI/archive/documentation de configuration/installation | `formatCliCommand`, `detectBinary`, `extractArchive`, `resolveBrewExecutable`, `formatDocsLink`, `CONFIG_DIR` |
Utilisez le point daccès plus large `plugin-sdk/setup` lorsque vous voulez la boîte à outils de setup partagée complète,
y compris les assistants de patch de configuration tels que
Utilisez le point daccès plus large `plugin-sdk/setup` lorsque vous souhaitez lensemble complet de la boîte à outils de configuration partagée, y compris les assistants de correctif de configuration tels que
`moveSingleAccountChannelSectionToDefaultAccount(...)`.
Les adaptateurs de patch de setup restent sûrs pour le chemin chaud à limport. Leur recherche groupée
de surface de contrat de promotion de compte unique est paresseuse, donc limport de
`plugin-sdk/setup-runtime` ne charge pas de manière anticipée la découverte de surface de contrat groupée avant que ladaptateur soit réellement utilisé.
Les adaptateurs de correctif de configuration restent sûrs à limportation sur les chemins critiques. Leur
recherche de surface de contrat de promotion de compte unique intégrée est paresseuse ; ainsi, limport de
`plugin-sdk/setup-runtime` ne charge pas de manière anticipée la découverte de surface de contrat intégrée avant lutilisation effective de ladaptateur.
### Promotion de compte unique possédée par le canal
### Promotion de compte unique gérée par le canal
Lorsquun canal passe dune configuration de niveau supérieur à compte unique vers
Lorsquun canal passe dune config de niveau supérieur à compte unique à
`channels.<id>.accounts.*`, le comportement partagé par défaut consiste à déplacer les
valeurs promues à portée de compte dans `accounts.default`.
valeurs promues de portée compte dans `accounts.default`.
Les canaux groupés peuvent restreindre ou remplacer cette promotion via leur surface de contrat
de setup :
Les canaux intégrés peuvent restreindre ou remplacer cette promotion via leur surface de contrat de configuration :
- `singleAccountKeysToMove` : clés supplémentaires de niveau supérieur qui doivent être déplacées dans le
- `singleAccountKeysToMove` : clés supplémentaires de niveau supérieur qui doivent être déplacées vers le
compte promu
- `namedAccountPromotionKeys` : lorsque des comptes nommés existent déjà, seules ces
clés sont déplacées dans le compte promu ; les clés partagées de politique/livraison restent à la
racine du canal
clés sont déplacées vers le compte promu ; les clés partagées de stratégie/de distribution restent à la racine
du canal
- `resolveSingleAccountPromotionTarget(...)` : choisit quel compte existant
reçoit les valeurs promues
Matrix est lexemple groupé actuel. Si exactement un compte Matrix nommé
existe déjà, ou si `defaultAccount` pointe vers une clé existante non canonique
telle que `Ops`, la promotion conserve ce compte au lieu de créer une nouvelle
Matrix est lexemple intégré actuel. Si exactement un compte Matrix nommé existe déjà,
ou si `defaultAccount` pointe vers une clé existante non canonique telle que
`Ops`, la promotion préserve ce compte au lieu de créer une nouvelle
entrée `accounts.default`.
## Schéma de configuration
## Schéma de config
La configuration du plugin est validée par rapport au schéma JSON de votre manifeste. Les utilisateurs
configurent les plugins via :
La config du Plugin est validée par rapport au schéma JSON de votre manifeste. Les utilisateurs
configurent les Plugins via :
```json5
{
@ -368,9 +370,9 @@ configurent les plugins via :
}
```
Votre plugin reçoit cette configuration sous la forme `api.pluginConfig` pendant lenregistrement.
Votre Plugin reçoit cette config sous la forme de `api.pluginConfig` lors de lenregistrement.
Pour une configuration spécifique à un canal, utilisez plutôt la section de configuration du canal :
Pour une config spécifique au canal, utilisez plutôt la section de config du canal :
```json5
{
@ -383,10 +385,10 @@ Pour une configuration spécifique à un canal, utilisez plutôt la section de c
}
```
### Construire des schémas de configuration de canal
### Création de schémas de config de canal
Utilisez `buildChannelConfigSchema` depuis `openclaw/plugin-sdk/core` pour convertir un
schéma Zod dans lenveloppe `ChannelConfigSchema` quOpenClaw valide :
schéma Zod en lenveloppe `ChannelConfigSchema` que OpenClaw valide :
```typescript
import { z } from "zod";
@ -404,7 +406,7 @@ const configSchema = buildChannelConfigSchema(accountSchema);
## Assistants de configuration
Les plugins de canal peuvent fournir des assistants de configuration interactifs pour `openclaw onboard`.
Les Plugins de canaux peuvent fournir des assistants de configuration interactifs pour `openclaw onboard`.
Lassistant est un objet `ChannelSetupWizard` sur le `ChannelPlugin` :
```typescript
@ -439,22 +441,21 @@ const setupWizard: ChannelSetupWizard = {
```
Le type `ChannelSetupWizard` prend en charge `credentials`, `textInputs`,
`dmPolicy`, `allowFrom`, `groupAccess`, `prepare`, `finalize`, etc.
Consultez les packages de plugins groupés (par exemple le plugin Discord `src/channel.setup.ts`) pour
`dmPolicy`, `allowFrom`, `groupAccess`, `prepare`, `finalize`, et plus encore.
Consultez les packages de Plugins intégrés (par exemple le Plugin Discord `src/channel.setup.ts`) pour
des exemples complets.
Pour les invites de liste dautorisation DM qui nont besoin que du flux standard
`note -> prompt -> parse -> merge -> patch`, préférez les assistants de setup partagés
de `openclaw/plugin-sdk/setup` : `createPromptParsedAllowFromForAccount(...)`,
`createTopLevelChannelParsedAllowFromPrompt(...)` et
Pour les invites de liste dautorisation de message direct qui nont besoin que du flux standard
`note -> prompt -> parse -> merge -> patch`, préférez les assistants de configuration partagés depuis `openclaw/plugin-sdk/setup` : `createPromptParsedAllowFromForAccount(...)`,
`createTopLevelChannelParsedAllowFromPrompt(...)`, et
`createNestedChannelParsedAllowFromPrompt(...)`.
Pour les blocs détat de setup de canal qui ne varient que par les libellés, les scores et déventuelles
Pour les blocs détat de configuration de canal qui ne varient que par les libellés, les scores et déventuelles
lignes supplémentaires, préférez `createStandardChannelSetupStatus(...)` depuis
`openclaw/plugin-sdk/setup` au lieu de recréer à la main le même objet `status` dans
chaque plugin.
chaque Plugin.
Pour les surfaces de setup facultatives qui ne doivent apparaître que dans certains contextes, utilisez
Pour les surfaces de configuration facultatives qui ne doivent apparaître que dans certains contextes, utilisez
`createOptionalChannelSetupSurface` depuis `openclaw/plugin-sdk/channel-setup` :
```typescript
@ -474,19 +475,19 @@ const setupSurface = createOptionalChannelSetupSurface({
`createOptionalChannelSetupWizard(...)` lorsque vous navez besoin que dune moitié
de cette surface dinstallation facultative.
Ladaptateur/lassistant facultatif généré échoue de manière fermée sur les vraies écritures de configuration. Ils
réutilisent un message unique dinstallation requise dans `validateInput`,
`applyAccountConfig` et `finalize`, et ajoutent un lien de documentation lorsque `docsPath` est
Ladaptateur/lassistant facultatif généré échoue de manière sûre sur les vraies écritures de config. Ils
réutilisent un message unique indiquant quune installation est requise dans `validateInput`,
`applyAccountConfig`, et `finalize`, et ajoutent un lien vers la documentation lorsque `docsPath` est
défini.
Pour les UI de setup pilotées par binaire, préférez les assistants partagés délégués au lieu de
copier la même logique de binaire/état dans chaque canal :
Pour les interfaces de configuration adossées à un binaire, préférez les assistants délégués partagés au lieu de
copier la même logique de binaire/détat dans chaque canal :
- `createDetectedBinaryStatus(...)` pour les blocs détat qui ne varient que par les libellés,
indications, scores et détection de binaire
- `createCliPathTextInput(...)` pour les entrées texte adossées à un chemin
les indications, les scores et la détection du binaire
- `createCliPathTextInput(...)` pour les entrées de texte adossées à un chemin
- `createDelegatedSetupWizardStatusResolvers(...)`,
`createDelegatedPrepare(...)`, `createDelegatedFinalize(...)` et
`createDelegatedPrepare(...)`, `createDelegatedFinalize(...)`, et
`createDelegatedResolveConfigured(...)` lorsque `setupEntry` doit transférer vers
un assistant complet plus lourd de manière paresseuse
- `createDelegatedTextInputShouldPrompt(...)` lorsque `setupEntry` na besoin que de
@ -500,22 +501,22 @@ copier la même logique de binaire/état dans chaque canal :
openclaw plugins install @myorg/openclaw-my-plugin
```
OpenClaw essaie dabord ClawHub puis bascule automatiquement vers npm. Vous pouvez aussi
OpenClaw essaie dabord ClawHub puis bascule automatiquement sur npm. Vous pouvez aussi
forcer explicitement ClawHub :
```bash
openclaw plugins install clawhub:@myorg/openclaw-my-plugin # ClawHub uniquement
openclaw plugins install clawhub:@myorg/openclaw-my-plugin # ClawHub only
```
Il nexiste pas de remplacement `npm:` correspondant. Utilisez la spécification de package npm normale lorsque vous
Il nexiste pas déquivalent pour le remplacement `npm:`. Utilisez la spécification normale du package npm lorsque vous
voulez le chemin npm après le repli ClawHub :
```bash
openclaw plugins install @myorg/openclaw-my-plugin
```
**Plugins dans le dépôt :** placez-les sous larborescence de workspace des plugins groupés et ils seront automatiquement
tectés pendant le build.
**Plugins dans le dépôt :** placez-les dans larborescence despace de travail des Plugins intégrés et ils seront automatiquement
couverts pendant la compilation.
**Les utilisateurs peuvent installer :**
@ -524,13 +525,13 @@ openclaw plugins install <package-name>
```
<Info>
Pour les installations issues de npm, `openclaw plugins install` exécute
`npm install --ignore-scripts` (sans scripts de cycle de vie). Conservez des arbres de dépendances de plugin
purs JS/TS et évitez les packages qui nécessitent des builds `postinstall`.
Pour les installations depuis npm, `openclaw plugins install` exécute
`npm install --ignore-scripts` (aucun script de cycle de vie). Gardez les arborescences de dépendances des Plugins
en pur JS/TS et évitez les packages qui nécessitent des compilations `postinstall`.
</Info>
## Lié
- [Points dentrée du SDK](/fr/plugins/sdk-entrypoints) -- `definePluginEntry` et `defineChannelPluginEntry`
- [Manifeste de plugin](/fr/plugins/manifest) -- référence complète du schéma de manifeste
- [Créer des plugins](/fr/plugins/building-plugins) -- guide pas à pas pour démarrer
- [Points dentrée SDK](/fr/plugins/sdk-entrypoints) -- `definePluginEntry` et `defineChannelPluginEntry`
- [Manifeste du Plugin](/fr/plugins/manifest) -- référence complète du schéma du manifeste
- [Création de Plugins](/fr/plugins/building-plugins) -- guide de démarrage pas à pas

View File

@ -1,34 +1,34 @@
---
read_when:
- Vous écrivez des tests pour un plugin
- Vous avez besoin dutilitaires de test du SDK plugin
- Vous voulez comprendre les tests de contrat pour les plugins intégrés
- Vous avez besoin dutilitaires de test du SDK du Plugin
- Vous souhaitez comprendre les tests de contrat pour les plugins intégrés
sidebarTitle: Testing
summary: Utilitaires et modèles de test pour les plugins OpenClaw
title: Tests de plugins
title: Tests du Plugin
x-i18n:
generated_at: "2026-04-05T12:50:44Z"
generated_at: "2026-04-15T19:41:46Z"
model: gpt-5.4
provider: openai
source_hash: 2e95ed58ed180feadad17bb5138bd09e3b45f1f3ecdff4e2fba4874bb80099fe
source_hash: 2f75bd3f3b5ba34b05786e0dd96d493c36db73a1d258998bf589e27e45c0bd09
source_path: plugins/sdk-testing.md
workflow: 15
---
# Tests de plugins
# Tests du Plugin
Référence pour les utilitaires de test, les modèles et lapplication des règles lint pour les
Référence pour les utilitaires de test, les modèles et lapplication des règles de lint pour les
plugins OpenClaw.
<Tip>
**Vous cherchez des exemples de tests ?** Les guides pratiques incluent des exemples de tests détaillés :
[Tests de plugin de canal](/plugins/sdk-channel-plugins#step-6-test) et
[Tests de plugin de provider](/plugins/sdk-provider-plugins#step-6-test).
**Vous cherchez des exemples de test ?** Les guides pratiques incluent des exemples de test complets :
[Tests de plugins de canal](/fr/plugins/sdk-channel-plugins#step-6-test) et
[Tests de plugins de fournisseur](/fr/plugins/sdk-provider-plugins#step-6-test).
</Tip>
## Utilitaires de test
**Import :** `openclaw/plugin-sdk/testing`
**Importation :** `openclaw/plugin-sdk/testing`
Le sous-chemin de test exporte un ensemble restreint dassistants pour les auteurs de plugins :
@ -42,15 +42,15 @@ import {
### Exports disponibles
| Export | But |
| -------------------------------------- | ----------------------------------------------------- |
| Export | But |
| -------------------------------------- | ------------------------------------------------------ |
| `installCommonResolveTargetErrorCases` | Cas de test partagés pour la gestion des erreurs de résolution de cible |
| `shouldAckReaction` | Vérifie si un canal doit ajouter une réaction dack |
| `removeAckReactionAfterReply` | Supprime la réaction dack après la livraison de la réponse |
| `shouldAckReaction` | Vérifier si un canal doit ajouter une réaction daccusé de réception |
| `removeAckReactionAfterReply` | Supprimer la réaction daccusé de réception après lenvoi de la réponse |
### Types
Le sous-chemin de test réexporte également des types utiles dans les fichiers de test :
Le sous-chemin de test réexporte aussi des types utiles dans les fichiers de test :
```typescript
import type {
@ -65,23 +65,23 @@ import type {
## Tester la résolution de cible
Utilisez `installCommonResolveTargetErrorCases` pour ajouter des cas derreur standard à la
résolution de cible dun canal :
Utilisez `installCommonResolveTargetErrorCases` pour ajouter des cas derreur standard pour la
résolution de cible de canal :
```typescript
import { describe } from "vitest";
import { installCommonResolveTargetErrorCases } from "openclaw/plugin-sdk/testing";
describe("résolution de cible my-channel", () => {
describe("my-channel target resolution", () => {
installCommonResolveTargetErrorCases({
resolveTarget: ({ to, mode, allowFrom }) => {
// Logique de résolution de cible de votre canal
// Your channel's target resolution logic
return myChannelResolveTarget({ to, mode, allowFrom });
},
implicitAllowFrom: ["user1", "user2"],
});
// Ajouter des cas de test spécifiques au canal
// Add channel-specific test cases
it("should resolve @username targets", () => {
// ...
});
@ -90,12 +90,12 @@ describe("résolution de cible my-channel", () => {
## Modèles de test
### Tester unitaire un plugin de canal
### Test unitaire dun Plugin de canal
```typescript
import { describe, it, expect, vi } from "vitest";
describe("plugin my-channel", () => {
describe("my-channel plugin", () => {
it("should resolve account from config", () => {
const cfg = {
channels: {
@ -120,22 +120,22 @@ describe("plugin my-channel", () => {
const inspection = myPlugin.setup.inspectAccount(cfg, undefined);
expect(inspection.configured).toBe(true);
expect(inspection.tokenStatus).toBe("available");
// Aucune valeur de jeton exposée
// No token value exposed
expect(inspection).not.toHaveProperty("token");
});
});
```
### Tester unitaire un plugin de provider
### Test unitaire dun Plugin de fournisseur
```typescript
import { describe, it, expect } from "vitest";
describe("plugin my-provider", () => {
describe("my-provider plugin", () => {
it("should resolve dynamic models", () => {
const model = myProvider.resolveDynamicModel({
modelId: "custom-model-v2",
// ... contexte
// ... context
});
expect(model.id).toBe("custom-model-v2");
@ -146,7 +146,7 @@ describe("plugin my-provider", () => {
it("should return catalog when API key is available", async () => {
const result = await myProvider.catalog.run({
resolveProviderApiKey: () => ({ apiKey: "test-key" }),
// ... contexte
// ... context
});
expect(result?.provider?.models).toHaveLength(2);
@ -154,7 +154,7 @@ describe("plugin my-provider", () => {
});
```
### Simuler le runtime du plugin
### Simuler le runtime du Plugin
Pour le code qui utilise `createPluginRuntimeStore`, simulez le runtime dans les tests :
@ -162,43 +162,46 @@ Pour le code qui utilise `createPluginRuntimeStore`, simulez le runtime dans les
import { createPluginRuntimeStore } from "openclaw/plugin-sdk/runtime-store";
import type { PluginRuntime } from "openclaw/plugin-sdk/runtime-store";
const store = createPluginRuntimeStore<PluginRuntime>("test runtime not set");
const store = createPluginRuntimeStore<PluginRuntime>({
pluginId: "test-plugin",
errorMessage: "test runtime not set",
});
// Dans la configuration du test
// In test setup
const mockRuntime = {
agent: {
resolveAgentDir: vi.fn().mockReturnValue("/tmp/agent"),
// ... autres simulations
// ... other mocks
},
config: {
loadConfig: vi.fn(),
writeConfigFile: vi.fn(),
},
// ... autres espaces de noms
// ... other namespaces
} as unknown as PluginRuntime;
store.setRuntime(mockRuntime);
// Après les tests
// After tests
store.clearRuntime();
```
### Tester avec des stubs par instance
Préférez les stubs par instance à la mutation de prototype :
Préférez les stubs par instance à la mutation du prototype :
```typescript
// Préféré : stub par instance
// Preferred: per-instance stub
const client = new MyChannelClient();
client.sendMessage = vi.fn().mockResolvedValue({ id: "msg-1" });
// À éviter : mutation du prototype
// Avoid: prototype mutation
// MyChannelClient.prototype.sendMessage = vi.fn();
```
## Tests de contrat (plugins dans le dépôt)
## Tests de contrat (plugins du dépôt)
Les plugins intégrés ont des tests de contrat qui vérifient la propriété de lenregistrement :
Les plugins intégrés disposent de tests de contrat qui vérifient la propriété de lenregistrement :
```bash
pnpm test -- src/plugins/contracts/
@ -206,10 +209,10 @@ pnpm test -- src/plugins/contracts/
Ces tests vérifient :
- Quels plugins enregistrent quels providers
- Quels plugins enregistrent quels providers de parole
- La correction de la forme denregistrement
- La conformité du contrat dexécution
- Quels plugins enregistrent quels fournisseurs
- Quels plugins enregistrent quels fournisseurs vocaux
- La justesse de la forme denregistrement
- La conformité au contrat dexécution
### Exécuter des tests ciblés
@ -227,32 +230,32 @@ pnpm test -- src/plugins/contracts/auth.contract.test.ts
pnpm test -- src/plugins/contracts/runtime.contract.test.ts
```
## Application des règles lint (plugins dans le dépôt)
## Application des règles de lint (plugins du dépôt)
Trois règles sont appliquées par `pnpm check` pour les plugins dans le dépôt :
Trois règles sont appliquées par `pnpm check` pour les plugins du dépôt :
1. **Pas dimports racine monolithiques** -- la racine `openclaw/plugin-sdk` est rejetée
2. **Pas dimports directs `src/`** -- les plugins ne peuvent pas importer directement `../../src/`
1. **Pas dimports racine monolithiques** -- le barrel racine `openclaw/plugin-sdk` est rejeté
2. **Pas dimports directs depuis `src/`** -- les plugins ne peuvent pas importer `../../src/` directement
3. **Pas dauto-imports** -- les plugins ne peuvent pas importer leur propre sous-chemin `plugin-sdk/<name>`
Les plugins externes ne sont pas soumis à ces règles lint, mais il est recommandé de suivre les mêmes
Les plugins externes ne sont pas soumis à ces règles de lint, mais il est recommandé de suivre les mêmes
modèles.
## Configuration des tests
OpenClaw utilise Vitest avec des seuils de couverture V8. Pour les tests de plugin :
OpenClaw utilise Vitest avec des seuils de couverture V8. Pour les tests de plugins :
```bash
# Exécuter tous les tests
# Run all tests
pnpm test
# Exécuter les tests dun plugin spécifique
# Run specific plugin tests
pnpm test -- <bundled-plugin-root>/my-channel/src/channel.test.ts
# Exécuter avec un filtre sur un nom de test spécifique
# Run with a specific test name filter
pnpm test -- <bundled-plugin-root>/my-channel/ -t "resolves account"
# Exécuter avec la couverture
# Run with coverage
pnpm test:coverage
```
@ -262,9 +265,9 @@ Si les exécutions locales provoquent une pression mémoire :
OPENCLAW_VITEST_MAX_WORKERS=1 pnpm test
```
## Liens associés
## Voir aussi
- [SDK Overview](/plugins/sdk-overview) -- conventions dimport
- [SDK Channel Plugins](/plugins/sdk-channel-plugins) -- interface des plugins de canal
- [SDK Provider Plugins](/plugins/sdk-provider-plugins) -- hooks des plugins de provider
- [Building Plugins](/plugins/building-plugins) -- guide de démarrage
- [Vue densemble du SDK](/fr/plugins/sdk-overview) -- conventions dimportation
- [SDK Channel Plugins](/fr/plugins/sdk-channel-plugins) -- interface de Plugin de canal
- [SDK Provider Plugins](/fr/plugins/sdk-provider-plugins) -- hooks de Plugin de fournisseur
- [Création de plugins](/fr/plugins/building-plugins) -- guide de démarrage

View File

@ -1,35 +1,39 @@
---
read_when:
- Expliquer lutilisation des tokens, les coûts ou les fenêtres de contexte
- Déboguer la croissance du contexte ou le comportement de compactage
summary: Comment OpenClaw construit le contexte du prompt et rapporte lutilisation des tokens ainsi que les coûts
- Déboguer la croissance du contexte ou le comportement de Compaction
summary: Comment OpenClaw construit le contexte du prompt et rapporte lutilisation des tokens et les coûts
title: Utilisation des tokens et coûts
x-i18n:
generated_at: "2026-04-12T06:50:09Z"
generated_at: "2026-04-15T19:42:15Z"
model: gpt-5.4
provider: openai
source_hash: f8c856549cd28b8364a640e6fa9ec26aa736895c7a993e96cbe85838e7df2dfb
source_hash: 9a706d3df8b2ea1136b3535d216c6b358e43aee2a31a4759824385e1345e6fe5
source_path: reference/token-use.md
workflow: 15
---
# Utilisation des tokens et coûts
OpenClaw suit les **tokens**, pas les caractères. Les tokens sont spécifiques au modèle, mais la plupart des modèles de style OpenAI ont une moyenne denviron 4 caractères par token pour le texte anglais.
OpenClaw suit les **tokens**, pas les caractères. Les tokens dépendent du modèle, mais la plupart
des modèles de style OpenAI font en moyenne ~4 caractères par token pour le texte en anglais.
## Comment le prompt système est construit
OpenClaw assemble son propre prompt système à chaque exécution. Il inclut :
OpenClaw assemble son propre prompt système à chaque exécution. Il comprend :
- Liste des outils + courtes descriptions
- Liste des Skills (métadonnées uniquement ; les instructions sont chargées à la demande avec `read`)
- Instructions dauto-mise à jour
- Fichiers de lespace de travail + dinitialisation (`AGENTS.md`, `SOUL.md`, `TOOLS.md`, `IDENTITY.md`, `USER.md`, `HEARTBEAT.md`, `BOOTSTRAP.md` lorsquil est nouveau, ainsi que `MEMORY.md` lorsquil est présent ou `memory.md` comme solution de secours en minuscules). Les fichiers volumineux sont tronqués par `agents.defaults.bootstrapMaxChars` (par défaut : 20000), et linjection totale dinitialisation est plafonnée par `agents.defaults.bootstrapTotalMaxChars` (par défaut : 150000). Les fichiers quotidiens `memory/*.md` ne font pas partie du prompt dinitialisation normal ; ils restent accessibles à la demande via les outils de mémoire lors des tours ordinaires, mais `/new` et `/reset` seuls peuvent préfixer un bloc de contexte de démarrage à usage unique avec la mémoire quotidienne récente pour ce premier tour. Ce préambule de démarrage est contrôlé par `agents.defaults.startupContext`.
- Liste des Skills (métadonnées uniquement ; les instructions sont chargées à la demande avec `read`).
Le bloc compact des Skills est limité par `skills.limits.maxSkillsPromptChars`,
avec une surcharge facultative par agent dans
`agents.list[].skillsLimits.maxSkillsPromptChars`.
- Instructions de mise à jour automatique
- Fichiers despace de travail + damorçage (`AGENTS.md`, `SOUL.md`, `TOOLS.md`, `IDENTITY.md`, `USER.md`, `HEARTBEAT.md`, `BOOTSTRAP.md` quand ils sont nouveaux, ainsi que `MEMORY.md` lorsquil est présent ou `memory.md` comme solution de repli en minuscules). Les fichiers volumineux sont tronqués par `agents.defaults.bootstrapMaxChars` (par défaut : 12000), et linjection totale damorçage est plafonnée par `agents.defaults.bootstrapTotalMaxChars` (par défaut : 60000). Les fichiers quotidiens `memory/*.md` ne font pas partie du prompt damorçage normal ; ils restent accessibles à la demande via les outils de mémoire lors des tours ordinaires, mais les commandes `/new` et `/reset` sans argument peuvent préfixer un bloc de contexte de démarrage à usage unique avec la mémoire quotidienne récente pour ce premier tour. Ce préambule de démarrage est contrôlé par `agents.defaults.startupContext`.
- Heure (UTC + fuseau horaire de lutilisateur)
- Balises de réponse + comportement heartbeat
- Balises de réponse + comportement Heartbeat
- Métadonnées dexécution (hôte/OS/modèle/réflexion)
Voir le détail complet dans [Prompt système](/fr/concepts/system-prompt).
Consultez la ventilation complète dans [Prompt système](/fr/concepts/system-prompt).
## Ce qui compte dans la fenêtre de contexte
@ -39,53 +43,66 @@ Tout ce que le modèle reçoit compte dans la limite de contexte :
- Historique de conversation (messages utilisateur + assistant)
- Appels doutils et résultats doutils
- Pièces jointes/transcriptions (images, audio, fichiers)
- Résumés de compactage et artefacts délagage
- Wrappers fournisseur ou en-têtes de sécurité (non visibles, mais quand même comptés)
- Résumés de Compaction et artefacts délagage
- Wrappers de fournisseur ou en-têtes de sécurité (non visibles, mais quand même comptabilisés)
Pour les images, OpenClaw réduit la taille des charges utiles dimage des transcriptions/outils avant les appels au fournisseur.
Certaines surfaces dexécution volumineuses ont leurs propres limites explicites :
- `agents.defaults.contextLimits.memoryGetMaxChars`
- `agents.defaults.contextLimits.memoryGetDefaultLines`
- `agents.defaults.contextLimits.toolResultMaxChars`
- `agents.defaults.contextLimits.postCompactionMaxChars`
Les surcharges par agent se trouvent sous `agents.list[].contextLimits`. Ces paramètres
servent pour les extraits dexécution limités et les blocs injectés appartenant à lexécution.
Ils sont distincts des limites damorçage, des limites de contexte de démarrage et des limites
du prompt des Skills.
Pour les images, OpenClaw réduit les payloads dimage de transcription/doutil avant les appels au fournisseur.
Utilisez `agents.defaults.imageMaxDimensionPx` (par défaut : `1200`) pour ajuster cela :
- Des valeurs plus faibles réduisent généralement lutilisation de vision tokens et la taille des charges utiles.
- Des valeurs plus élevées préservent davantage de détails visuels pour lOCR/les captures décran dinterface lourdes.
- Des valeurs plus basses réduisent généralement lutilisation des vision-tokens et la taille des payloads.
- Des valeurs plus élevées préservent davantage de détails visuels pour lOCR/les captures décran riches en UI.
Pour un découpage pratique (par fichier injecté, outils, Skills et taille du prompt système), utilisez `/context list` ou `/context detail`. Voir [Contexte](/fr/concepts/context).
Pour une ventilation pratique (par fichier injecté, outils, Skills et taille du prompt système), utilisez `/context list` ou `/context detail`. Voir [Contexte](/fr/concepts/context).
## Comment voir lutilisation actuelle des tokens
Utilisez ceci dans le chat :
- `/status`**carte détat riche en emoji** avec le modèle de session, lutilisation du contexte, les tokens dentrée/sortie de la dernière réponse et le **coût estimé** (clé API uniquement).
- `/status`**carte détat riche en emoji** avec le modèle de session, lutilisation du contexte,
les tokens dentrée/sortie de la dernière réponse et le **coût estimé** (clé API uniquement).
- `/usage off|tokens|full` → ajoute un **pied de page dutilisation par réponse** à chaque réponse.
- Persiste par session (stocké comme `responseUsage`).
- Lauth OAuth **masque le coût** (tokens uniquement).
- Persistant par session (stocké comme `responseUsage`).
- Lauthentification OAuth **masque le coût** (tokens uniquement).
- `/usage cost` → affiche un résumé local des coûts à partir des journaux de session OpenClaw.
Autres interfaces :
Autres surfaces :
- **TUI/Web TUI :** `/status` + `/usage` sont pris en charge.
- **CLI :** `openclaw status --usage` et `openclaw channels list` affichent
des fenêtres de quota fournisseur normalisées (`X% restants`, pas les coûts par réponse).
Fournisseurs actuels avec fenêtre dutilisation : Anthropic, GitHub Copilot, Gemini CLI,
des fenêtres de quota fournisseur normalisées (`X% left`, et non des coûts par réponse).
Fournisseurs actuels de fenêtre dutilisation : Anthropic, GitHub Copilot, Gemini CLI,
OpenAI Codex, MiniMax, Xiaomi et z.ai.
Les interfaces dutilisation normalisent les alias de champs natifs des fournisseurs avant affichage.
Pour le trafic OpenAI-family Responses, cela inclut à la fois `input_tokens` /
`output_tokens` et `prompt_tokens` / `completion_tokens`, afin que les noms de champs
spécifiques au transport ne modifient pas `/status`, `/usage` ni les résumés de session.
Lutilisation JSON de Gemini CLI est également normalisée : le texte de réponse vient de `response`, et
`stats.cached` est mappé à `cacheRead`, avec `stats.input_tokens - stats.cached`
Les surfaces dutilisation normalisent les alias courants des champs natifs des fournisseurs avant laffichage.
Pour le trafic Responses de la famille OpenAI, cela inclut à la fois `input_tokens` /
`output_tokens` et `prompt_tokens` / `completion_tokens`, afin que les noms de champs propres
au transport ne modifient pas `/status`, `/usage` ou les résumés de session.
Lutilisation JSON de Gemini CLI est également normalisée : le texte de réponse provient de `response`, et
`stats.cached` est mappé vers `cacheRead`, avec `stats.input_tokens - stats.cached`
utilisé lorsque la CLI omet un champ explicite `stats.input`.
Pour le trafic natif OpenAI-family Responses, les alias dutilisation WebSocket/SSE sont
normalisés de la même manière, et les totaux retombent sur les valeurs normalisées dentrée + sortie lorsque
Pour le trafic Responses natif de la famille OpenAI, les alias dutilisation WebSocket/SSE sont
normalisés de la même manière, et les totaux reviennent à lentrée + sortie normalisées lorsque
`total_tokens` est absent ou vaut `0`.
Lorsque linstantané de la session en cours est peu détaillé, `/status` et `session_status` peuvent
Lorsque linstantané de la session actuelle est incomplet, `/status` et `session_status` peuvent
également récupérer les compteurs de tokens/cache et létiquette du modèle dexécution actif à partir du
journal dutilisation de transcription le plus récent. Les valeurs actives non nulles existantes restent prioritaires
sur les valeurs de secours issues de la transcription, et des totaux de transcription plus élevés
orientés prompt peuvent lemporter lorsque les totaux stockés sont absents ou plus faibles.
Lauthentification dutilisation pour les fenêtres de quota fournisseur provient de hooks spécifiques au fournisseur lorsque
disponible ; sinon OpenClaw retombe sur les identifiants OAuth/clé API correspondants provenant des profils dauthentification,
de lenvironnement ou de la configuration.
journal dutilisation de transcription le plus récent. Les valeurs actives non nulles existantes
restent prioritaires sur les valeurs de repli issues de la transcription, et des totaux de transcription
plus élevés orientés prompt peuvent lemporter lorsque les totaux stockés sont absents ou plus faibles.
Lauthentification dutilisation pour les fenêtres de quota fournisseur provient de hooks spécifiques
au fournisseur lorsquils sont disponibles ; sinon OpenClaw se replie sur des identifiants OAuth/clé API
correspondants issus des profils dauthentification, de lenvironnement ou de la configuration.
## Estimation des coûts (lorsquelle est affichée)
@ -95,35 +112,36 @@ Les coûts sont estimés à partir de votre configuration tarifaire de modèle :
models.providers.<provider>.models[].cost
```
Il sagit de **USD par 1M tokens** pour `input`, `output`, `cacheRead` et
Ce sont des **USD par 1M de tokens** pour `input`, `output`, `cacheRead` et
`cacheWrite`. Si la tarification est absente, OpenClaw naffiche que les tokens. Les tokens OAuth
naffichent jamais de coût en dollars.
## Impact du TTL du cache et de lélagage
La mise en cache des prompts fournisseur ne sapplique que dans la fenêtre TTL du cache. OpenClaw peut
Le cache de prompt du fournisseur ne sapplique que dans la fenêtre TTL du cache. OpenClaw peut
facultativement exécuter un **élagage cache-ttl** : il élague la session une fois le TTL du cache
expiré, puis réinitialise la fenêtre de cache afin que les requêtes suivantes puissent réutiliser le
contexte fraîchement mis en cache au lieu de remettre en cache tout lhistorique. Cela permet de limiter les
coûts décriture dans le cache lorsquune session reste inactive au-delà du TTL.
contexte fraîchement mis en cache au lieu de remettre en cache tout lhistorique. Cela permet de
maintenir des coûts décriture de cache plus faibles lorsquune session reste inactive au-delà du TTL.
Configurez cela dans [Configuration de la gateway](/fr/gateway/configuration) et consultez les
Configurez cela dans [Configuration du Gateway](/fr/gateway/configuration) et consultez les
détails du comportement dans [Élagage de session](/fr/concepts/session-pruning).
Heartbeat peut maintenir le cache **chaud** pendant les périodes dinactivité. Si le TTL de cache de votre modèle
est de `1h`, régler lintervalle heartbeat juste en dessous (par exemple `55m`) peut éviter de
remettre en cache lintégralité du prompt, ce qui réduit les coûts décriture dans le cache.
Heartbeat peut garder le cache **chaud** pendant les périodes dinactivité. Si le TTL du cache de votre modèle
est `1h`, définir lintervalle Heartbeat juste en dessous (par ex. `55m`) peut éviter de remettre en cache
le prompt complet, ce qui réduit les coûts décriture du cache.
Dans les configurations multi-agent, vous pouvez conserver une configuration de modèle partagée et ajuster le comportement du cache
Dans les configurations multi-agents, vous pouvez conserver une configuration de modèle partagée et ajuster le comportement du cache
par agent avec `agents.list[].params.cacheRetention`.
Pour un guide complet paramètre par paramètre, voir [Prompt Caching](/fr/reference/prompt-caching).
Pour un guide complet paramètre par paramètre, voir [Cache de prompt](/fr/reference/prompt-caching).
Pour la tarification de lAPI Anthropic, les lectures du cache sont significativement moins chères que les
tokens dentrée, tandis que les écritures du cache sont facturées avec un multiplicateur plus élevé. Consultez la tarification Anthropic du prompt caching pour connaître les tarifs et multiplicateurs TTL les plus récents :
Pour la tarification de lAPI Anthropic, les lectures de cache sont nettement moins coûteuses que les tokens
dentrée, tandis que les écritures de cache sont facturées avec un multiplicateur plus élevé. Consultez la tarification
du cache de prompt dAnthropic pour connaître les derniers tarifs et multiplicateurs TTL :
[https://docs.anthropic.com/docs/build-with-claude/prompt-caching](https://docs.anthropic.com/docs/build-with-claude/prompt-caching)
### Exemple : garder un cache de 1h chaud avec heartbeat
### Exemple : garder un cache de 1h chaud avec Heartbeat
```yaml
agents:
@ -153,19 +171,19 @@ agents:
- id: "research"
default: true
heartbeat:
every: "55m" # garde le cache long chaud pour les sessions approfondies
every: "55m" # garder le cache long chaud pour les sessions profondes
- id: "alerts"
params:
cacheRetention: "none" # évite les écritures de cache pour les notifications par rafales
cacheRetention: "none" # éviter les écritures de cache pour les notifications en rafales
```
`agents.list[].params` fusionne au-dessus des `params` du modèle sélectionné, ce qui vous permet
de ne remplacer que `cacheRetention` et dhériter inchangés des autres paramètres par défaut du modèle.
`agents.list[].params` est fusionné par-dessus le `params` du modèle sélectionné, ce qui vous permet
de surcharger uniquement `cacheRetention` et dhériter inchangés des autres paramètres par défaut du modèle.
### Exemple : activer len-tête bêta Anthropic 1M context
### Exemple : activer len-tête bêta Anthropic de contexte 1M
La fenêtre de contexte Anthropic de 1M est actuellement protégée par une bêta. OpenClaw peut injecter la
valeur `anthropic-beta` requise lorsque vous activez `context1m` sur les modèles Opus
La fenêtre de contexte 1M dAnthropic est actuellement protégée par une bêta. OpenClaw peut injecter la
valeur `anthropic-beta` requise lorsque vous activez `context1m` sur des modèles Opus
ou Sonnet pris en charge.
```yaml
@ -177,23 +195,23 @@ agents:
context1m: true
```
Cela correspond à len-tête bêta Anthropic `context-1m-2025-08-07`.
Cela correspond à len-tête bêta `context-1m-2025-08-07` dAnthropic.
Cela sapplique uniquement lorsque `context1m: true` est défini sur cette entrée de modèle.
Cela ne sapplique que lorsque `context1m: true` est défini sur cette entrée de modèle.
Exigence : lidentifiant doit être éligible à lutilisation long contexte. Dans le cas contraire,
Exigence : lidentifiant doit être éligible à lutilisation de contexte long. Sinon,
Anthropic répond avec une erreur de limitation de débit côté fournisseur pour cette requête.
Si vous authentifiez Anthropic avec des tokens OAuth/dabonnement (`sk-ant-oat-*`),
OpenClaw ignore len-tête bêta `context-1m-*` car Anthropic rejette actuellement
cette combinaison avec une erreur HTTP 401.
cette combinaison avec HTTP 401.
## Conseils pour réduire la pression sur les tokens
## Conseils pour réduire la pression des tokens
- Utilisez `/compact` pour résumer les longues sessions.
- Réduisez les sorties doutils volumineuses dans vos workflows.
- Diminuez `agents.defaults.imageMaxDimensionPx` pour les sessions riches en captures décran.
- Gardez les descriptions de Skills courtes (la liste des Skills est injectée dans le prompt).
- Préférez des modèles plus petits pour le travail verbeux et exploratoire.
- Préférez des modèles plus petits pour un travail verbeux et exploratoire.
Voir [Skills](/fr/tools/skills) pour la formule exacte de surcharge de la liste des Skills.