Building plugins
Création de plugins
Les Plugins étendent OpenClaw sans modifier le cœur. Un Plugin peut ajouter un canal de messagerie, un fournisseur de modèles, un backend CLI local, un outil d’agent, un hook, un fournisseur de médias, ou une autre fonctionnalité appartenant au Plugin.
Il n’est pas nécessaire d’ajouter un Plugin externe au dépôt OpenClaw. Publiez le paquet sur ClawHub, puis les utilisateurs l’installent avec :
openclaw plugins install clawhub:<package-name>Les spécifications de paquet sans préfixe sont toujours installées depuis npm pendant la transition de lancement. Utilisez le
préfixe clawhub: lorsque vous souhaitez une résolution par ClawHub.
Prérequis
- Node 22.22.3+, Node 24.15+ ou Node 25.9+, et
npmoupnpm. - Modules ESM TypeScript.
- Pour travailler sur un Plugin intégré au dépôt, clonez le dépôt et exécutez
pnpm install. Le développement de Plugins à partir du code source utilise uniquement pnpm, car OpenClaw détecte les Plugins intégrés à partir des paquets de l’espace de travailextensions/*.
Choisir la forme du Plugin
Connectez OpenClaw à une plateforme de messagerie.
Ajoutez un fournisseur de modèles, de médias, de recherche, de récupération, de synthèse vocale ou de temps réel.
Exécutez une CLI d’IA locale via le mécanisme de repli de modèle d’OpenClaw.
Enregistrez des outils d’agent.
Démarrage rapide
Créez un Plugin d’outil minimal en enregistrant un outil d’agent obligatoire. Il s’agit de la forme de Plugin utile la plus courte, qui couvre le paquet, le manifeste, le point d’entrée et la validation locale.
Créer les métadonnées du paquet
{"name": "@myorg/openclaw-my-plugin","version": "1.0.0","type": "module","dependencies": {"typebox": "1.1.39"},"peerDependencies": {"openclaw": ">=2026.3.24-beta.2"},"openclaw": {"extensions": ["./index.ts"],"compat": {"pluginApi": ">=2026.3.24-beta.2","minGatewayVersion": "2026.3.24-beta.2"},"build": {"openclawVersion": "2026.3.24-beta.2","pluginSdkVersion": "2026.3.24-beta.2"}}}{"id": "my-plugin","name": "My Plugin","description": "Adds a custom tool to OpenClaw","contracts": {"tools": ["my_tool"]},"activation": {"onStartup": true},"configSchema": {"type": "object","additionalProperties": false}}Les Plugins externes publiés doivent faire pointer les entrées d’exécution vers des fichiers JavaScript compilés. Consultez Points d’entrée du SDK pour connaître le contrat complet des points d’entrée.
Chaque Plugin nécessite un manifeste, même sans configuration. Les outils d’exécution doivent
figurer dans contracts.tools afin qu’OpenClaw puisse déterminer leur propriétaire sans
charger immédiatement l’environnement d’exécution de chaque Plugin. Définissez activation.onStartup
intentionnellement ; cet exemple effectue le chargement au démarrage du Gateway.
Les surfaces de Plugin approuvées par l’hôte sont également contrôlées par le manifeste et nécessitent une
déclaration explicite pour les Plugins installés : api.registerAgentToolResultMiddleware(...)
exige que chaque environnement d’exécution cible soit répertorié dans contracts.agentToolResultMiddleware,
et api.registerTrustedToolPolicy(...) exige que chaque identifiant de stratégie figure dans
contracts.trustedToolPolicies. Ces déclarations maintiennent la cohérence entre l’inspection au moment de l’installation
et l’enregistrement à l’exécution.
Pour tous les champs du manifeste, consultez Manifeste de Plugin.
Enregistrer l’outil
import { Type } from "typebox";import { definePluginEntry } from "openclaw/plugin-sdk/plugin-entry"; export default definePluginEntry({ id: "my-plugin", name: "My Plugin", description: "Adds a custom tool to OpenClaw", register(api) { api.registerTool({ name: "my_tool", description: "Echo one input value", parameters: Type.Object({ input: Type.String() }), async execute(_id, params) { return { content: [{ type: "text", text: `Got: ${params.input}` }], }; }, }); },});Utilisez definePluginEntry pour les Plugins autres que les canaux. Les Plugins de canal utilisent
plutôt defineChannelPluginEntry depuis openclaw/plugin-sdk/core.
Tester l’environnement d’exécution
Pour un Plugin installé ou externe, inspectez l’environnement d’exécution chargé :
openclaw plugins inspect my-plugin --runtime --jsonSi le Plugin enregistre une commande CLI, exécutez-la également et vérifiez
sa sortie, par exemple openclaw demo-plugin ping.
Pour un Plugin intégré à ce dépôt, OpenClaw détecte les paquets de Plugins
du code source dans l’espace de travail extensions/*. Exécutez le test ciblé le plus proche :
pnpm test extensions/my-plugin/pnpm checkTester l’installation du paquet
Avant de publier un Plugin prêt à être empaqueté, testez la même forme d’installation que celle
que les utilisateurs recevront. Ajoutez d’abord une étape de compilation, faites pointer les entrées d’exécution telles que
openclaw.extensions vers du JavaScript compilé comme ./dist/index.js, et assurez-vous
que npm pack inclut cette sortie dist/. Les entrées de code source TypeScript sont
réservées aux extractions du code source et aux chemins de développement local.
Empaquetez ensuite le Plugin et installez l’archive tar avec npm-pack: :
npm pack --pack-destination /tmpopenclaw plugins install npm-pack:/tmp/<plugin-package>.tgz --forceopenclaw plugins inspect my-plugin --runtime --jsonnpm-pack: utilise le projet npm par Plugin géré par OpenClaw ; il détecte donc
les erreurs de dépendances d’exécution que les tests à partir du code source peuvent masquer. Il valide
la structure du paquet et des dépendances, mais pas l’approbation officielle liée au catalogue.
Les imports d’exécution doivent figurer dans dependencies ou optionalDependencies ;
les dépendances laissées uniquement dans devDependencies ne seront pas installées pour le
projet d’exécution géré.
N’utilisez pas une installation directe depuis une archive ou un chemin comme validation finale du comportement officiel ou privilégié d’un Plugin. Les sources directes sont utiles pour le débogage local, mais elles ne valident pas le même chemin de dépendances que les installations npm ou ClawHub. Si votre Plugin dépend du statut de Plugin officiel approuvé, ajoutez une seconde validation au moyen d’une installation officielle adossée au catalogue ou d’un chemin de paquet publié qui enregistre l’approbation officielle. Consultez Résolution des dépendances des Plugins pour plus de détails sur la racine d’installation et la propriété des dépendances.
Publier
Validez le paquet avant de le publier :
clawhub package publish your-org/your-plugin --dry-runclawhub package publish your-org/your-pluginLes extraits canoniques de paquets ClawHub se trouvent dans docs/snippets/plugin-publish/.
Installer
Installez le paquet publié via ClawHub :
openclaw plugins install clawhub:your-org/your-pluginEnregistrer des outils
Les outils peuvent être obligatoires ou facultatifs. Les outils obligatoires sont toujours disponibles lorsque le Plugin est activé. Les outils facultatifs nécessitent l’adhésion explicite de l’utilisateur avant qu’OpenClaw ne charge l’environnement d’exécution du Plugin propriétaire.
Les fabriques d’outils reçoivent un contexte d’exécution approuvé, notamment deliveryContext,
nativeChannelId pour la conversation active sur la plateforme lorsqu’elle est disponible, et
requesterSenderId.
register(api) { api.registerTool( { name: "workflow_tool", description: "Run a workflow", parameters: Type.Object({ pipeline: Type.String() }), async execute(_id, params) { return { content: [{ type: "text", text: params.pipeline }] }; }, }, { optional: true }, );}Chaque outil enregistré avec api.registerTool(...) doit également être déclaré dans le
manifeste du Plugin :
{ "contracts": { "tools": ["workflow_tool"] }, "toolMetadata": { "workflow_tool": { "optional": true } }}Les utilisateurs donnent leur accord avec tools.allow :
{ tools: { allow: ["workflow_tool"] }, // ou ["my-plugin"] pour tous les outils d’un même Plugin}Les outils facultatifs déterminent si un outil est exposé au modèle. Utilisez les demandes d’autorisation de Plugin lorsqu’un outil ou un hook doit demander une approbation après sa sélection par le modèle et avant l’exécution de l’action.
Utilisez des outils facultatifs pour les effets de bord, les binaires inhabituels ou les fonctionnalités qui
ne doivent pas être exposées par défaut. Les noms d’outils ne doivent pas entrer en conflit avec les noms d’outils
du cœur ; les conflits sont ignorés et signalés dans les diagnostics des Plugins. Les
enregistrements incorrects sont ignorés et signalés de la même manière : un
name non vide manquant, un execute qui n’est pas une fonction ou un descripteur d’outil sans objet parameters.
Les fabriques d’outils reçoivent un objet de contexte fourni par l’environnement d’exécution. Utilisez ctx.activeModel
lorsqu’un outil doit journaliser, afficher ou s’adapter au modèle actif pour le tour en cours ;
il peut inclure provider, modelId et modelRef. Considérez-le comme
des métadonnées d’exécution informatives, et non comme une frontière de sécurité vis-à-vis de l’opérateur
local, du code des Plugins installés ou d’un environnement d’exécution OpenClaw modifié. Les outils locaux
sensibles doivent toujours exiger l’adhésion explicite du Plugin ou de l’opérateur et
échouer de manière fermée lorsque les métadonnées du modèle actif sont absentes ou inadaptées.
Le manifeste déclare la propriété et la détection ; l’exécution appelle toujours l’implémentation active
de l’outil enregistré. Maintenez toolMetadata.<tool>.optional: true
aligné sur api.registerTool(..., { optional: true }) afin qu’OpenClaw puisse éviter
de charger l’environnement d’exécution de ce Plugin tant que l’outil n’a pas été explicitement ajouté à la liste d’autorisation.
Conventions d’importation
Importez depuis les sous-chemins ciblés du SDK :
N’importez pas depuis le barrel racine obsolète :
Dans votre paquet de Plugin, utilisez des fichiers barrel locaux tels que api.ts et
runtime-api.ts pour les imports internes. N’importez pas votre propre Plugin via un
chemin du SDK. Les fonctions utilitaires propres à un fournisseur doivent rester dans le paquet du fournisseur, sauf si
l’interface est véritablement générique.
Les méthodes RPC personnalisées du Gateway constituent un point d’entrée avancé. Conservez-les sous un
préfixe propre au Plugin ; les espaces de noms d’administration du cœur tels que config.*,
exec.approvals.*, operator.admin.*, wizard.* et update.* restent réservés
et se résolvent en operator.admin. Le pont
openclaw/plugin-sdk/gateway-method-runtime est réservé aux routes HTTP des Plugins
qui déclarent contracts.gatewayMethodDispatch: ["authenticated-request"].
Pour la carte complète des imports, consultez Vue d’ensemble du SDK des Plugins.
Liste de contrôle avant soumission
OPENCLAW_DOCS_MARKER:calloutOpen:Q2hlY2s
package.json contient les métadonnées openclaw correctes
OPENCLAW_DOCS_MARKER:calloutClose:
OPENCLAW_DOCS_MARKER:calloutOpen:Q2hlY2s Le manifeste openclaw.plugin.json est présent et valide OPENCLAW_DOCS_MARKER:calloutClose:
OPENCLAW_DOCS_MARKER:calloutOpen:Q2hlY2s
Le point d’entrée utilise defineChannelPluginEntry ou definePluginEntry
OPENCLAW_DOCS_MARKER:calloutClose:
OPENCLAW_DOCS_MARKER:calloutOpen:Q2hlY2s
Tous les imports utilisent des chemins plugin-sdk/<subpath> ciblés
OPENCLAW_DOCS_MARKER:calloutClose: