Plugin maintainer reference
Internes du Plugin
Ceci est la rĂ©fĂ©rence dâarchitecture approfondie du systĂšme de plugins OpenClaw. Pour des guides pratiques, commencez par lâune des pages ciblĂ©es ci-dessous.
Guide utilisateur final pour ajouter, activer et dépanner des plugins.
Tutoriel de premier plugin avec le plus petit manifeste fonctionnel.
Créez un plugin de canal de messagerie.
Créez un plugin de fournisseur de modÚles.
RĂ©fĂ©rence de lâAPI dâimport map et dâenregistrement.
ModÚle de capacités public
Les capacitĂ©s constituent le modĂšle public de plugin natif dans OpenClaw. Chaque plugin OpenClaw natif sâenregistre auprĂšs dâun ou plusieurs types de capacitĂ©s :
| CapacitĂ© | MĂ©thode dâenregistrement | Exemples de plugins |
|---|---|---|
| Inférence textuelle | api.registerProvider(...) |
openai, anthropic |
| Backend dâinfĂ©rence CLI | api.registerCliBackend(...) |
openai, anthropic |
| Embeddings | api.registerEmbeddingProvider(...) |
Plugins vectoriels détenus par le fournisseur |
| Parole | api.registerSpeechProvider(...) |
elevenlabs, microsoft |
| Transcription en temps réel | api.registerRealtimeTranscriptionProvider(...) |
openai |
| Voix en temps réel | api.registerRealtimeVoiceProvider(...) |
openai |
| Compréhension multimédia | api.registerMediaUnderstandingProvider(...) |
openai, google |
| Source de transcriptions | api.registerTranscriptSourceProvider(...) |
discord |
| GĂ©nĂ©ration dâimages | api.registerImageGenerationProvider(...) |
openai, google, fal, minimax |
| Génération de musique | api.registerMusicGenerationProvider(...) |
google, minimax |
| Génération de vidéo | api.registerVideoGenerationProvider(...) |
qwen |
| Récupération Web | api.registerWebFetchProvider(...) |
firecrawl |
| Recherche Web | api.registerWebSearchProvider(...) |
google |
| Canal / messagerie | api.registerChannel(...) |
msteams, matrix |
| Découverte Gateway | api.registerGatewayDiscoveryService(...) |
bonjour |
Position de compatibilité externe
Le modĂšle de capacitĂ©s est intĂ©grĂ© au cĆur et utilisĂ© aujourdâhui par les plugins groupĂ©s/natifs, mais la compatibilitĂ© des plugins externes exige encore une barre plus stricte que « câest exportĂ©, donc câest figĂ© ».
| Situation du plugin | Recommandation |
|---|---|
| Plugins externes existants | Conserver le fonctionnement des intĂ©grations basĂ©es sur les hooks ; câest la base de compatibilitĂ©. |
| Nouveaux plugins groupĂ©s/natifs | PrĂ©fĂ©rer lâenregistrement explicite des capacitĂ©s aux accĂšs spĂ©cifiques au fournisseur ou aux nouveaux designs uniquement Ă hooks. |
| Plugins externes adoptant lâenregistrement de capacitĂ©s | AutorisĂ©, mais traiter les surfaces dâassistance propres aux capacitĂ©s comme Ă©volutives sauf si la documentation les marque comme stables. |
Lâenregistrement de capacitĂ©s est la direction prĂ©vue. Les hooks hĂ©ritĂ©s restent la voie la plus sĂ»re sans rupture pour les plugins externes pendant la transition. Les sous-chemins dâassistance exportĂ©s ne se valent pas tous â privilĂ©giez les contrats Ă©troits documentĂ©s plutĂŽt que les exports dâassistance incidents.
Formes de plugins
OpenClaw classe chaque plugin chargĂ© dans une forme selon son comportement rĂ©el dâenregistrement (pas seulement ses mĂ©tadonnĂ©es statiques) :
plain-capability
Enregistre exactement un type de capacité (par exemple un plugin uniquement fournisseur comme mistral).
hybrid-capability
Enregistre plusieurs types de capacitĂ©s (par exemple openai dĂ©tient lâinfĂ©rence textuelle, la parole, la comprĂ©hension multimĂ©dia et la gĂ©nĂ©ration dâimages).
hook-only
Enregistre uniquement des hooks (typés ou personnalisés), sans capacités, outils, commandes ni services.
non-capability
Enregistre des outils, commandes, services ou routes, mais aucune capacité.
Utilisez openclaw plugins inspect <id> pour voir la forme dâun plugin et le dĂ©tail de ses capacitĂ©s. Consultez la rĂ©fĂ©rence CLI pour plus de dĂ©tails.
Hooks hérités
Le hook before_agent_start reste pris en charge comme chemin de compatibilité pour les plugins uniquement à hooks. Des plugins hérités réels en dépendent encore.
Direction :
- le garder fonctionnel
- le documenter comme hérité
- préférer
before_model_resolvepour le travail de remplacement de modÚle/fournisseur - préférer
before_prompt_buildpour le travail de mutation de prompt - le supprimer uniquement aprĂšs une baisse de lâusage rĂ©el et lorsque la couverture par fixtures prouve la sĂ©curitĂ© de la migration
Signaux de compatibilité
Lorsque vous exĂ©cutez openclaw doctor ou openclaw plugins inspect <id>, vous pouvez voir lâun de ces libellĂ©s :
| Signal | Signification |
|---|---|
| config valid | La configuration sâanalyse correctement et les plugins se rĂ©solvent |
| compatibility advisory | Le plugin utilise un modĂšle pris en charge mais plus ancien (p. ex. hook-only) |
| legacy warning | Le plugin utilise before_agent_start, qui est obsolĂšte |
| hard error | La configuration est invalide ou le plugin nâa pas pu se charger |
Ni hook-only ni before_agent_start ne casseront votre plugin aujourdâhui : hook-only est consultatif, et before_agent_start ne dĂ©clenche quâun avertissement. Ces signaux apparaissent aussi dans openclaw status --all et openclaw plugins doctor.
Vue dâensemble de lâarchitecture
Le systĂšme de plugins dâOpenClaw comporte quatre couches :
Manifest + discovery
OpenClaw trouve les plugins candidats Ă partir des chemins configurĂ©s, des racines dâespace de travail, des racines globales de plugins et des plugins groupĂ©s. La dĂ©couverte lit dâabord les manifestes natifs openclaw.plugin.json ainsi que les manifestes de bundles pris en charge.
Enablement + validation
Le cĆur dĂ©cide si un plugin dĂ©couvert est activĂ©, dĂ©sactivĂ©, bloquĂ© ou sĂ©lectionnĂ© pour un emplacement exclusif comme la mĂ©moire.
Runtime loading
Les plugins OpenClaw natifs sont chargĂ©s dans le processus et enregistrent leurs capacitĂ©s dans un registre central. Le JavaScript empaquetĂ© se charge via require natif ; le TypeScript source local tiers est le fallback dâurgence Jiti. Les bundles compatibles sont normalisĂ©s en enregistrements de registre sans importer le code dâexĂ©cution.
Surface consumption
Le reste dâOpenClaw lit le registre pour exposer les outils, canaux, configurations de fournisseurs, hooks, routes HTTP, commandes CLI et services.
Pour la CLI de plugin en particulier, la découverte des commandes racine est divisée en deux phases :
- les mĂ©tadonnĂ©es au moment de lâanalyse viennent de
registerCli(..., { descriptors: [...] }) - le vĂ©ritable module CLI du plugin peut rester paresseux et sâenregistrer lors de la premiĂšre invocation
Cela garde le code CLI dĂ©tenu par le plugin Ă lâintĂ©rieur du plugin tout en permettant Ă OpenClaw de rĂ©server les noms de commandes racine avant lâanalyse.
La frontiĂšre de conception importante :
- la validation manifeste/configuration doit fonctionner à partir des métadonnées de manifeste/schéma sans exécuter le code du plugin
- la dĂ©couverte des capacitĂ©s natives peut charger le code dâentrĂ©e dâun plugin de confiance pour construire un instantanĂ© de registre non activant
- le comportement dâexĂ©cution natif vient du chemin
register(api)du module de plugin avecapi.registrationMode === "full"
Cette sĂ©paration permet Ă OpenClaw de valider la configuration, dâexpliquer les plugins manquants/dĂ©sactivĂ©s et de construire des indications dâinterface utilisateur/schĂ©ma avant que lâexĂ©cution complĂšte ne soit active.
Instantané des métadonnées de plugin et table de correspondance
Le dĂ©marrage du Gateway construit un PluginMetadataSnapshot pour lâinstantanĂ© de configuration actuel. LâinstantanĂ© ne contient que des mĂ©tadonnĂ©es : il stocke lâindex des plugins installĂ©s, le registre des manifestes, les diagnostics de manifeste, les cartes de propriĂ©taires, un normaliseur dâidentifiants de plugins et les enregistrements de manifeste. Il ne contient pas de modules de plugins chargĂ©s, de SDK de fournisseurs, de contenu de paquets ni dâexports dâexĂ©cution.
La validation de configuration consciente des plugins, lâauto-activation au dĂ©marrage et le bootstrap des plugins Gateway consomment cet instantanĂ© au lieu de reconstruire indĂ©pendamment les mĂ©tadonnĂ©es de manifeste/index. PluginLookUpTable est dĂ©rivĂ© du mĂȘme instantanĂ© et ajoute le plan de plugins de dĂ©marrage pour la configuration dâexĂ©cution actuelle.
AprĂšs le dĂ©marrage, Gateway conserve lâinstantanĂ© de mĂ©tadonnĂ©es actuel comme produit dâexĂ©cution remplaçable. La dĂ©couverte rĂ©pĂ©tĂ©e des fournisseurs Ă lâexĂ©cution peut emprunter cet instantanĂ© au lieu de reconstruire lâindex installĂ© et le registre des manifestes Ă chaque passe de catalogue de fournisseurs. LâinstantanĂ© est effacĂ© ou remplacĂ© lors de lâarrĂȘt du Gateway, des changements dâinventaire configuration/plugin et des Ă©critures de lâindex installĂ© ; les appelants reviennent au chemin froid manifeste/index lorsquâaucun instantanĂ© actuel compatible nâexiste. Les vĂ©rifications de compatibilitĂ© doivent inclure les racines de dĂ©couverte de plugins comme plugins.load.paths et lâespace de travail par dĂ©faut de lâagent, car les plugins dâespace de travail font partie du pĂ©rimĂštre des mĂ©tadonnĂ©es.
LâinstantanĂ© et la table de correspondance gardent les dĂ©cisions rĂ©pĂ©tĂ©es de dĂ©marrage sur le chemin rapide :
- propriété des canaux
- démarrage différé des canaux
- identifiants des plugins de démarrage
- propriété des fournisseurs et des backends CLI
- propriĂ©tĂ© du fournisseur de configuration, de lâalias de commande, du fournisseur de catalogue de modĂšles et du contrat de manifeste
- validation du schéma de configuration du plugin et du schéma de configuration du canal
- dĂ©cisions dâauto-activation au dĂ©marrage
La frontiĂšre de sĂ©curitĂ© est le remplacement de lâinstantanĂ©, pas sa mutation. Reconstruisez lâinstantanĂ© lorsque la configuration, lâinventaire des plugins, les enregistrements dâinstallation ou la politique dâindex persistĂ©e changent. Ne le traitez pas comme un large registre global mutable, et ne conservez pas dâinstantanĂ©s historiques non bornĂ©s. Le chargement des plugins Ă lâexĂ©cution reste sĂ©parĂ© des instantanĂ©s de mĂ©tadonnĂ©es afin quâun Ă©tat dâexĂ©cution obsolĂšte ne puisse pas ĂȘtre masquĂ© derriĂšre un cache de mĂ©tadonnĂ©es.
La rĂšgle de cache est documentĂ©e dans Internes de lâarchitecture des plugins : les mĂ©tadonnĂ©es de manifeste et de dĂ©couverte sont fraĂźches sauf si un appelant dĂ©tient un instantanĂ© explicite, une table de correspondance ou un registre de manifestes pour le flux actuel. Les caches de mĂ©tadonnĂ©es cachĂ©s et les TTL fondĂ©s sur lâhorloge murale ne font pas partie du chargement des plugins. Seuls les caches de chargeur dâexĂ©cution, de modules et dâartefacts de dĂ©pendance peuvent persister aprĂšs le chargement effectif du code ou des artefacts installĂ©s.
Certains appelants de chemin froid reconstruisent encore les registres de manifestes directement depuis lâindex persistant des plugins installĂ©s au lieu de recevoir une PluginLookUpTable du Gateway. Ce chemin reconstruit dĂ©sormais le registre Ă la demande ; prĂ©fĂ©rez transmettre la table de correspondance actuelle ou un registre de manifestes explicite Ă travers les flux dâexĂ©cution lorsquâun appelant en possĂšde dĂ©jĂ un.
Planification de lâactivation
La planification de lâactivation fait partie du plan de contrĂŽle. Les appelants peuvent demander quels plugins sont pertinents pour une commande, un fournisseur, un canal, une route, un harnais dâagent ou une capacitĂ© concrĂšte avant de charger des registres dâexĂ©cution plus larges.
Le planificateur conserve le comportement actuel des manifestes compatible :
- les champs
activation.*sont des indications explicites pour le planificateur providers,channels,commandAliases,setup.providers,contracts.toolset les hooks restent un repli de propriĂ©tĂ© du manifeste- lâAPI du planificateur fondĂ©e uniquement sur les identifiants reste disponible pour les appelants existants
- lâAPI de plan signale des Ă©tiquettes de raison afin que les diagnostics puissent distinguer les indications explicites du repli de propriĂ©tĂ©
Plugins de canal et lâoutil de message partagĂ©
Les plugins de canal nâont pas besoin dâenregistrer un outil sĂ©parĂ© dâenvoi, de modification ou de rĂ©action pour les actions de discussion normales. OpenClaw conserve un seul outil message partagĂ© dans le cĆur, et les plugins de canal possĂšdent la dĂ©couverte et lâexĂ©cution propres au canal qui se trouvent derriĂšre lui.
La limite actuelle est la suivante :
- le cĆur possĂšde lâhĂŽte de lâoutil
messagepartagĂ©, le cĂąblage des prompts, la tenue des sessions/threads et la rĂ©partition de lâexĂ©cution - les plugins de canal possĂšdent la dĂ©couverte des actions dĂ©limitĂ©es, la dĂ©couverte des capacitĂ©s et tous les fragments de schĂ©ma propres au canal
- les plugins de canal possÚdent la grammaire de conversation de session propre au fournisseur, par exemple la façon dont les identifiants de conversation encodent les identifiants de thread ou héritent des conversations parentes
- les plugins de canal exĂ©cutent lâaction finale via leur adaptateur dâaction
Pour les plugins de canal, la surface du SDK est ChannelMessageActionAdapter.describeMessageTool(...). Cet appel de découverte unifié permet à un plugin de renvoyer ensemble ses actions visibles, ses capacités et ses contributions de schéma afin que ces éléments ne divergent pas.
Lorsquâun paramĂštre dâoutil de message propre au canal transporte une source mĂ©dia telle quâun chemin local ou une URL mĂ©dia distante, le plugin doit Ă©galement renvoyer mediaSourceParams depuis describeMessageTool(...). Le cĆur utilise cette liste explicite pour appliquer la normalisation des chemins du bac Ă sable et les indications dâaccĂšs aux mĂ©dias sortants sans coder en dur les noms de paramĂštres appartenant au plugin. PrĂ©fĂ©rez-y des maps limitĂ©es Ă lâaction, et non une liste plate Ă lâĂ©chelle du canal, afin quâun paramĂštre mĂ©dia rĂ©servĂ© au profil ne soit pas normalisĂ© sur des actions sans rapport comme send.
Le cĆur transmet la portĂ©e dâexĂ©cution Ă cette Ă©tape de dĂ©couverte. Les champs importants incluent :
accountIdcurrentChannelIdcurrentThreadTscurrentMessageIdsessionKeysessionIdagentIdrequesterSenderIdentrant approuvé
Câest important pour les plugins sensibles au contexte. Un canal peut masquer ou exposer des actions de message selon le compte actif, le salon/thread/message actuel ou lâidentitĂ© approuvĂ©e du demandeur sans coder en dur des branches propres au canal dans lâoutil message du cĆur.
Câest pourquoi les changements de routage des runners intĂ©grĂ©s restent du travail de plugin : le runner est responsable de transmettre lâidentitĂ© de discussion/session actuelle Ă la limite de dĂ©couverte du plugin afin que lâoutil message partagĂ© expose la bonne surface appartenant au canal pour le tour actuel.
Pour les helpers dâexĂ©cution appartenant au canal, les plugins groupĂ©s doivent conserver le runtime dâexĂ©cution dans leurs propres modules dâextension. Le cĆur ne possĂšde plus les runtimes dâactions de message Discord, Slack, Telegram ou WhatsApp sous src/agents/tools. Nous ne publions pas de sous-chemins plugin-sdk/*-action-runtime sĂ©parĂ©s, et les plugins groupĂ©s doivent importer leur propre code de runtime local directement depuis leurs modules appartenant Ă lâextension.
La mĂȘme limite sâapplique de maniĂšre gĂ©nĂ©rale aux coutures SDK nommĂ©es dâaprĂšs un fournisseur : le cĆur ne doit pas importer de barrels de commoditĂ© propres Ă un canal pour Slack, Discord, Signal, WhatsApp ou des extensions similaires. Si le cĆur a besoin dâun comportement, il doit soit consommer le barrel api.ts / runtime-api.ts propre au plugin groupĂ©, soit promouvoir le besoin en une capacitĂ© gĂ©nĂ©rique Ă©troite dans le SDK partagĂ©.
Les plugins groupĂ©s suivent la mĂȘme rĂšgle. Le runtime-api.ts dâun plugin groupĂ© ne doit pas rĂ©exporter sa propre façade de marque openclaw/plugin-sdk/<plugin-id>. Ces façades de marque restent des shims de compatibilitĂ© pour les plugins externes et les anciens consommateurs, mais les plugins groupĂ©s doivent utiliser des exports locaux ainsi que des sous-chemins SDK gĂ©nĂ©riques Ă©troits comme openclaw/plugin-sdk/channel-policy, openclaw/plugin-sdk/runtime-store ou openclaw/plugin-sdk/webhook-ingress. Le nouveau code ne doit pas ajouter de façades SDK propres Ă un identifiant de plugin sauf si la limite de compatibilitĂ© dâun Ă©cosystĂšme externe existant lâexige.
Pour les sondages en particulier, il existe deux chemins dâexĂ©cution :
outbound.sendPollest la base partagée pour les canaux qui correspondent au modÚle commun de sondageactions.handleAction("poll")est le chemin préféré pour les sémantiques de sondage propres au canal ou les paramÚtres de sondage supplémentaires
Le cĆur diffĂšre dĂ©sormais lâanalyse partagĂ©e des sondages jusquâaprĂšs le refus de lâaction par la rĂ©partition de sondage du plugin, afin que les gestionnaires de sondage appartenant au plugin puissent accepter des champs de sondage propres au canal sans ĂȘtre bloquĂ©s dâabord par lâanalyseur de sondage gĂ©nĂ©rique.
Consultez Internes de lâarchitecture des plugins pour la sĂ©quence complĂšte de dĂ©marrage.
ModÚle de propriété des capacités
OpenClaw traite un plugin natif comme la limite de propriĂ©tĂ© dâune entreprise ou dâune fonctionnalitĂ©, et non comme un ensemble hĂ©tĂ©roclite dâintĂ©grations sans lien.
Cela signifie que :
- un plugin dâentreprise doit gĂ©nĂ©ralement possĂ©der toutes les surfaces de cette entreprise exposĂ©es Ă OpenClaw
- un plugin de fonctionnalitĂ© doit gĂ©nĂ©ralement possĂ©der toute la surface de fonctionnalitĂ© quâil introduit
- les canaux doivent consommer les capacitĂ©s partagĂ©es du cĆur au lieu de rĂ©implĂ©menter ponctuellement le comportement des fournisseurs
Vendor multi-capability
openai possĂšde lâinfĂ©rence de texte, la parole, la voix en temps rĂ©el, la comprĂ©hension des mĂ©dias et la gĂ©nĂ©ration dâimages. google possĂšde lâinfĂ©rence de texte ainsi que la comprĂ©hension des mĂ©dias, la gĂ©nĂ©ration dâimages et la recherche Web. qwen possĂšde lâinfĂ©rence de texte ainsi que la comprĂ©hension des mĂ©dias et la gĂ©nĂ©ration de vidĂ©os.
Vendor single-capability
elevenlabs et microsoft possÚdent la parole ; firecrawl possÚde la récupération Web ; minimax / mistral / moonshot / zai possÚdent des backends de compréhension des médias.
Feature plugin
voice-call possĂšde le transport des appels, les outils, la CLI, les routes et le pontage des flux mĂ©dia Twilio, mais consomme les capacitĂ©s partagĂ©es de parole, de transcription en temps rĂ©el et de voix en temps rĂ©el au lieu dâimporter directement des plugins de fournisseurs.
LâĂ©tat final visĂ© est le suivant :
- OpenAI vit dans un seul plugin mĂȘme sâil couvre les modĂšles de texte, la parole, les images et de futures vidĂ©os
- un autre fournisseur peut faire de mĂȘme pour sa propre surface
- les canaux ne se soucient pas du plugin fournisseur qui possĂšde le fournisseur ; ils consomment le contrat de capacitĂ© partagĂ© exposĂ© par le cĆur
Voici la distinction clé :
- plugin = limite de propriété
- capacitĂ© = contrat du cĆur que plusieurs plugins peuvent implĂ©menter ou consommer
Ainsi, si OpenClaw ajoute un nouveau domaine comme la vidĂ©o, la premiĂšre question nâest pas « quel fournisseur doit coder en dur la gestion vidĂ©o ? » La premiĂšre question est « quel est le contrat de capacitĂ© vidĂ©o du cĆur ? » Une fois ce contrat existant, les plugins de fournisseurs peuvent sây enregistrer et les plugins de canal/fonctionnalitĂ© peuvent le consommer.
Si la capacitĂ© nâexiste pas encore, la bonne dĂ©marche est gĂ©nĂ©ralement :
Define the capability
DĂ©finir la capacitĂ© manquante dans le cĆur.
Expose through the SDK
Lâexposer via lâAPI/le runtime de plugin de façon typĂ©e.
Wire consumers
Cùbler les canaux/fonctionnalités sur cette capacité.
Vendor implementations
Laisser les plugins de fournisseurs enregistrer des implémentations.
Cela garde la propriĂ©tĂ© explicite tout en Ă©vitant un comportement du cĆur dĂ©pendant dâun seul fournisseur ou dâun chemin de code ponctuel propre Ă un plugin.
Superposition des capacités
Utilisez ce modĂšle mental pour dĂ©cider oĂč placer le code :
Core capability layer
Orchestration, politique, repli, rÚgles de fusion de configuration, sémantique de livraison et contrats typés partagés.
Vendor plugin layer
API propres au fournisseur, auth, catalogues de modĂšles, synthĂšse vocale, gĂ©nĂ©ration dâimages, futurs backends vidĂ©o, points de terminaison dâusage.
Channel/feature plugin layer
IntĂ©gration Slack/Discord/voice-call/etc. qui consomme les capacitĂ©s du cĆur et les prĂ©sente sur une surface.
Par exemple, le TTS suit cette forme :
- le cĆur possĂšde la politique TTS au moment de la rĂ©ponse, lâordre de repli, les prĂ©fĂ©rences et la livraison par canal
openai,elevenlabsetmicrosoftpossÚdent les implémentations de synthÚsevoice-callconsomme le helper de runtime TTS de téléphonie
Ce mĂȘme modĂšle doit ĂȘtre prĂ©fĂ©rĂ© pour les futures capacitĂ©s.
Exemple de plugin dâentreprise Ă capacitĂ©s multiples
Un plugin dâentreprise doit paraĂźtre cohĂ©rent de lâextĂ©rieur. Si OpenClaw dispose de contrats partagĂ©s pour les modĂšles, la parole, la transcription en temps rĂ©el, la voix en temps rĂ©el, la comprĂ©hension des mĂ©dias, la gĂ©nĂ©ration dâimages, la gĂ©nĂ©ration de vidĂ©os, la rĂ©cupĂ©ration Web et la recherche Web, un fournisseur peut possĂ©der toutes ses surfaces au mĂȘme endroit :
describeImageWithModel, transcribeOpenAiCompatibleAudio,} from "openclaw/plugin-sdk/media-understanding"; const plugin: OpenClawPluginDefinition = { id: "exampleai", name: "ExampleAI", register(api) { api.registerProvider({ id: "exampleai", // auth/model catalog/runtime hooks }); api.registerSpeechProvider({ id: "exampleai", // vendor speech config â implement the SpeechProviderPlugin interface directly }); api.registerMediaUnderstandingProvider({ id: "exampleai", capabilities: ["image", "audio", "video"], async describeImage(req) { return describeImageWithModel({ provider: "exampleai", model: req.model, input: req.input, }); }, async transcribeAudio(req) { return transcribeOpenAiCompatibleAudio({ provider: "exampleai", model: req.model, input: req.input, }); }, }); api.registerWebSearchProvider( createPluginBackedWebSearchProvider({ id: "exampleai-search", // credential + fetch logic }), ); },}; export default plugin;Ce qui compte, ce ne sont pas les noms exacts des helpers. Câest la forme qui compte :
- un seul plugin possĂšde la surface du fournisseur
- le cĆur possĂšde toujours les contrats de capacitĂ©
- les canaux et les plugins de fonctionnalité consomment les helpers
api.runtime.*, pas le code du fournisseur - les tests de contrat peuvent vĂ©rifier que le plugin a enregistrĂ© les capacitĂ©s quâil prĂ©tend possĂ©der
Exemple de capacité : compréhension vidéo
OpenClaw traite dĂ©jĂ la comprĂ©hension image/audio/vidĂ©o comme une seule capacitĂ© partagĂ©e. Le mĂȘme modĂšle de propriĂ©tĂ© sây applique :
Core defines the contract
Le cĆur dĂ©finit le contrat de comprĂ©hension des mĂ©dias.
Vendor plugins register
Les plugins de fournisseurs enregistrent describeImage, transcribeAudio et describeVideo selon le cas.
Consumers use the shared behavior
Les canaux et les plugins de fonctionnalitĂ© consomment le comportement partagĂ© du cĆur au lieu de se cĂąbler directement au code du fournisseur.
Cela Ă©vite dâancrer dans le cĆur les hypothĂšses vidĂ©o dâun seul fournisseur. Le plugin possĂšde la surface du fournisseur ; le cĆur possĂšde le contrat de capacitĂ© et le comportement de repli.
La gĂ©nĂ©ration de vidĂ©os utilise dĂ©jĂ cette mĂȘme sĂ©quence : le cĆur possĂšde le contrat de capacitĂ© typĂ© et le helper de runtime, et les plugins de fournisseurs enregistrent des implĂ©mentations api.registerVideoGenerationProvider(...) en regard de celui-ci.
Besoin dâune checklist de dĂ©ploiement concrĂšte ? Consultez le Cookbook des capacitĂ©s.
Contrats et application
La surface de lâAPI de plugin est volontairement typĂ©e et centralisĂ©e dans OpenClawPluginApi. Ce contrat dĂ©finit les points dâenregistrement pris en charge et les helpers de runtime sur lesquels un plugin peut sâappuyer.
Pourquoi câest important :
- les auteurs de plugins disposent dâun standard interne stable unique
- le cĆur peut rejeter les propriĂ©tĂ©s en double, par exemple deux plugins enregistrant le mĂȘme identifiant de fournisseur
- le démarrage peut faire remonter des diagnostics exploitables pour un enregistrement mal formé
- les tests de contrat peuvent faire respecter la propriété des plugins groupés et prévenir les dérives silencieuses
Il existe deux couches dâapplication :
Runtime registration enforcement
Le registre des plugins valide les enregistrements lors du chargement des plugins. Exemples : les identifiants de fournisseurs dupliquĂ©s, les identifiants de fournisseurs vocaux dupliquĂ©s et les enregistrements mal formĂ©s produisent des diagnostics de plugin au lieu dâun comportement indĂ©fini.
Contract tests
Les plugins intĂ©grĂ©s sont capturĂ©s dans des registres de contrat pendant les exĂ©cutions de tests afin quâOpenClaw puisse affirmer explicitement la propriĂ©tĂ©. Aujourdâhui, cela est utilisĂ© pour les fournisseurs de modĂšles, les fournisseurs vocaux, les fournisseurs de recherche web et la propriĂ©tĂ© des enregistrements intĂ©grĂ©s.
Lâeffet pratique est quâOpenClaw sait, dĂšs le dĂ©part, quel plugin possĂšde quelle surface. Cela permet au cĆur et aux canaux de se composer sans friction, car la propriĂ©tĂ© est dĂ©clarĂ©e, typĂ©e et testable plutĂŽt quâimplicite.
Ce qui relĂšve dâun contrat
Good contracts
- typé
- petit
- spécifique à une capacité
- dĂ©tenu par le cĆur
- réutilisable par plusieurs plugins
- consommable par les canaux/fonctionnalités sans connaissance du fournisseur
Bad contracts
- politique spĂ©cifique au fournisseur cachĂ©e dans le cĆur
- échappatoires ponctuelles de plugin qui contournent le registre
- code de canal accédant directement à une implémentation fournisseur
- objets dâexĂ©cution ad hoc qui ne font pas partie de
OpenClawPluginApini deapi.runtime
En cas de doute, relevez le niveau dâabstraction : dĂ©finissez dâabord la capacitĂ©, puis laissez les plugins sây brancher.
ModĂšle dâexĂ©cution
Les plugins OpenClaw natifs sâexĂ©cutent dans le processus avec le Gateway. Ils ne sont pas isolĂ©s dans un bac Ă sable. Un plugin natif chargĂ© partage la mĂȘme frontiĂšre de confiance au niveau du processus que le code du cĆur.
Les bundles compatibles sont plus sûrs par défaut, car OpenClaw les traite actuellement comme des packs de métadonnées/contenu. Dans les versions actuelles, cela signifie principalement des Skills intégrées.
Utilisez des listes dâautorisation et des chemins dâinstallation/chargement explicites pour les plugins non intĂ©grĂ©s. Traitez les plugins dâespace de travail comme du code de dĂ©veloppement, pas comme des valeurs par dĂ©faut de production.
Pour les noms de packages dâespace de travail intĂ©grĂ©s, gardez lâidentifiant du plugin ancrĂ© dans le nom npm : @openclaw/<id> par dĂ©faut, ou un suffixe typĂ© approuvĂ© tel que -provider, -plugin, -speech, -sandbox ou -media-understanding lorsque le package expose intentionnellement un rĂŽle de plugin plus Ă©troit.
FrontiĂšre dâexportation
OpenClaw exporte des capacitĂ©s, pas des commoditĂ©s dâimplĂ©mentation.
Gardez lâenregistrement des capacitĂ©s public. RĂ©duisez les exports dâassistants hors contrat :
- sous-chemins dâassistants spĂ©cifiques aux plugins intĂ©grĂ©s
- sous-chemins de plomberie dâexĂ©cution non destinĂ©s Ă servir dâAPI publique
- assistants de commodité spécifiques aux fournisseurs
- assistants de configuration/onboarding qui sont des dĂ©tails dâimplĂ©mentation
Les sous-chemins rĂ©servĂ©s aux assistants de plugins intĂ©grĂ©s ont Ă©tĂ© retirĂ©s de la carte dâexportation gĂ©nĂ©rĂ©e du SDK. Gardez les assistants spĂ©cifiques au propriĂ©taire dans le package du plugin propriĂ©taire ; ne promouvez que le comportement hĂŽte rĂ©utilisable vers des contrats SDK gĂ©nĂ©riques tels que plugin-sdk/gateway-runtime, plugin-sdk/security-runtime et plugin-sdk/plugin-config-runtime.
Internes et référence
Pour le pipeline de chargement, le modĂšle de registre, les hooks dâexĂ©cution des fournisseurs, les routes HTTP du Gateway, les schĂ©mas des outils de message, la rĂ©solution des cibles de canal, les catalogues de fournisseurs, les plugins du moteur de contexte et le guide dâajout dâune nouvelle capacitĂ©, consultez Internes de lâarchitecture des plugins.