Créer des plugins
Les plugins étendent OpenClaw avec de nouvelles capacités : canaux, fournisseurs de modèles, parole, transcription en temps réel, voix en temps réel, compréhension des médias, génération d’images, génération de vidéos, récupération web, recherche web, outils d’agent, ou toute combinaison. Vous n’avez pas besoin d’ajouter votre plugin au dépôt OpenClaw. Publiez-le sur ClawHub ou npm et les utilisateurs l’installent avecopenclaw plugins install <package-name>. OpenClaw essaie d’abord ClawHub puis
bascule automatiquement vers npm.
Prérequis
- Node >= 22 et un gestionnaire de paquets (npm ou pnpm)
- Familiarité avec TypeScript (ESM)
- Pour les plugins dans le dépôt : dépôt cloné et
pnpm installexécuté
Quel type de plugin ?
Plugin de canal
Connecter OpenClaw à une plateforme de messagerie (Discord, IRC, etc.)
Plugin de fournisseur
Ajouter un fournisseur de modèles (LLM, proxy ou point de terminaison personnalisé)
Plugin d’outil / hook
Enregistrer des outils d’agent, des hooks d’événement ou des services — voir ci-dessous
createOptionalChannelSetupSurface(...) depuis
openclaw/plugin-sdk/channel-setup. Cela produit une paire adaptateur de configuration + assistant
qui annonce l’exigence d’installation et échoue en mode fermé sur les vraies écritures de configuration
tant que le plugin n’est pas installé.
Démarrage rapide : plugin d’outil
Cette procédure crée un plugin minimal qui enregistre un outil d’agent. Les plugins de canal et de fournisseur ont des guides dédiés liés ci-dessus.Créer le package et le manifeste
docs/snippets/plugin-publish/.Écrire le point d’entrée
definePluginEntry est destiné aux plugins non liés aux canaux. Pour les canaux, utilisez
defineChannelPluginEntry — voir Plugins de canal.
Pour toutes les options de points d’entrée, consultez Points d’entrée.Tester et publier
Plugins externes : validez et publiez avec ClawHub, puis installez :OpenClaw vérifie aussi ClawHub avant npm pour les spécifications de package brutes comme
@myorg/openclaw-my-plugin.Plugins dans le dépôt : placez-les sous l’arborescence du workspace de plugins intégrés — découverte automatique.Capacités des plugins
Un seul plugin peut enregistrer n’importe quel nombre de capacités via l’objetapi :
| Capacité | Méthode d’enregistrement | Guide détaillé |
|---|---|---|
| Inférence texte (LLM) | api.registerProvider(...) | Plugins de fournisseur |
| Backend d’inférence CLI | api.registerCliBackend(...) | Backends CLI |
| Canal / messagerie | api.registerChannel(...) | Plugins de canal |
| Parole (TTS/STT) | api.registerSpeechProvider(...) | Plugins de fournisseur |
| Transcription temps réel | api.registerRealtimeTranscriptionProvider(...) | Plugins de fournisseur |
| Voix temps réel | api.registerRealtimeVoiceProvider(...) | Plugins de fournisseur |
| Compréhension des médias | api.registerMediaUnderstandingProvider(...) | Plugins de fournisseur |
| Génération d’images | api.registerImageGenerationProvider(...) | Plugins de fournisseur |
| Génération de vidéos | api.registerVideoGenerationProvider(...) | Plugins de fournisseur |
| Récupération web | api.registerWebFetchProvider(...) | Plugins de fournisseur |
| Recherche web | api.registerWebSearchProvider(...) | Plugins de fournisseur |
| Outils d’agent | api.registerTool(...) | Ci-dessous |
| Commandes personnalisées | api.registerCommand(...) | Points d’entrée |
| Hooks d’événement | api.registerHook(...) | Points d’entrée |
| Routes HTTP | api.registerHttpRoute(...) | Internals |
| Sous-commandes CLI | api.registerCli(...) | Points d’entrée |
config.*,
exec.approvals.*, wizard.*, update.*) restent réservés et se résolvent toujours vers
operator.admin, même si un plugin demande une portée plus étroite.
Sémantique des gardes de hooks à garder à l’esprit :
before_tool_call:{ block: true }est terminal et arrête les gestionnaires de priorité inférieure.before_tool_call:{ block: false }est traité comme aucune décision.before_tool_call:{ requireApproval: true }met en pause l’exécution de l’agent et demande une approbation à l’utilisateur via la surcouche d’approbation exec, les boutons Telegram, les interactions Discord ou la commande/approvesur n’importe quel canal.before_install:{ block: true }est terminal et arrête les gestionnaires de priorité inférieure.before_install:{ block: false }est traité comme aucune décision.message_sending:{ cancel: true }est terminal et arrête les gestionnaires de priorité inférieure.message_sending:{ cancel: false }est traité comme aucune décision.
/approve gère à la fois les approbations exec et plugin avec un repli borné : lorsqu’un identifiant d’approbation exec est introuvable, OpenClaw réessaie le même identifiant via les approbations plugin. Le transfert des approbations plugin peut être configuré indépendamment via approvals.plugin dans la configuration.
Si une plomberie d’approbation personnalisée doit détecter ce même cas de repli borné,
préférez isApprovalNotFoundError depuis openclaw/plugin-sdk/error-runtime
plutôt que de faire correspondre manuellement des chaînes d’expiration d’approbation.
Consultez Sémantique des décisions de hook dans la vue d’ensemble du SDK pour plus de détails.
Enregistrement d’outils d’agent
Les outils sont des fonctions typées que le LLM peut appeler. Ils peuvent être requis (toujours disponibles) ou facultatifs (adhésion explicite de l’utilisateur) :- Les noms d’outils ne doivent pas entrer en conflit avec les outils du cœur (les conflits sont ignorés)
- Utilisez
optional: truepour les outils avec effets de bord ou exigences binaires supplémentaires - Les utilisateurs peuvent activer tous les outils d’un plugin en ajoutant l’identifiant du plugin à
tools.allow
Conventions d’import
Importez toujours depuis des chemins ciblésopenclaw/plugin-sdk/<subpath> :
api.ts, runtime-api.ts) pour
les imports internes — n’importez jamais votre propre plugin via son chemin SDK.
Pour les plugins de fournisseur, gardez les assistants spécifiques au fournisseur dans ces barrels
à la racine du package, sauf si la jonction est réellement générique. Exemples intégrés actuels :
- Anthropic : wrappers de flux Claude et assistants
service_tier/ bêta - OpenAI : constructeurs de fournisseurs, assistants de modèle par défaut, fournisseurs temps réel
- OpenRouter : constructeur de fournisseur plus assistants d’intégration guidée/configuration
openclaw/plugin-sdk/*.
Certaines jonctions d’assistants générées openclaw/plugin-sdk/<bundled-id> existent encore pour la
maintenance et la compatibilité des plugins intégrés, par exemple
plugin-sdk/feishu-setup ou plugin-sdk/zalo-setup. Traitez-les comme des surfaces réservées,
pas comme le modèle par défaut pour les nouveaux plugins tiers.
Checklist avant soumission
package.json a les bonnes métadonnées
openclawLe manifeste openclaw.plugin.json est présent et valide
Le point d’entrée utilise
defineChannelPluginEntry ou definePluginEntryTous les imports utilisent des chemins ciblés
plugin-sdk/<subpath>Les imports internes utilisent des modules locaux, pas des auto-imports SDK
Les tests passent (
pnpm test -- <bundled-plugin-root>/my-plugin/)pnpm check passe (plugins dans le dépôt)Tests de publication bêta
- Surveillez les tags de publication GitHub sur openclaw/openclaw et abonnez-vous via
Watch>Releases. Les tags bêta ressemblent àv2026.3.N-beta.1. Vous pouvez aussi activer les notifications pour le compte X officiel d’OpenClaw @openclaw pour les annonces de publication. - Testez votre plugin contre le tag bêta dès qu’il apparaît. La fenêtre avant stable n’est généralement que de quelques heures.
- Publiez dans le fil de votre plugin dans le canal Discord
plugin-forumaprès le test avec soitall good, soit ce qui a cassé. Si vous n’avez pas encore de fil, créez-en un. - Si quelque chose casse, ouvrez ou mettez à jour une issue intitulée
Beta blocker: <plugin-name> - <summary>et appliquez le labelbeta-blocker. Placez le lien de l’issue dans votre fil. - Ouvrez une PR vers
mainintituléefix(<plugin-id>): beta blocker - <summary>et liez l’issue à la fois dans la PR et dans votre fil Discord. Les contributeurs ne peuvent pas labelliser les PR, donc le titre est le signal côté PR pour les mainteneurs et l’automatisation. Les bloqueurs avec une PR sont fusionnés ; les bloqueurs sans PR peuvent quand même partir en publication. Les mainteneurs surveillent ces fils pendant les tests bêta. - Le silence signifie vert. Si vous ratez la fenêtre, votre correctif arrivera probablement dans le cycle suivant.
Étapes suivantes
Plugins de canal
Créer un plugin de canal de messagerie
Plugins de fournisseur
Créer un plugin de fournisseur de modèles
Vue d’ensemble du SDK
Référence de la table d’import et de l’API d’enregistrement
Assistants d’exécution
TTS, recherche, sous-agent via api.runtime
Tests
Utilitaires et modèles de test
Manifeste de plugin
Référence complète du schéma de manifeste
Lié
- Architecture des plugins — analyse approfondie de l’architecture interne
- Vue d’ensemble du SDK — référence du SDK de plugins
- Manifest — format du manifeste de plugin
- Plugins de canal — créer des plugins de canal
- Plugins de fournisseur — créer des plugins de fournisseur