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.

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_resolve pour le travail de remplacement de modĂšle/fournisseur
  • prĂ©fĂ©rer before_prompt_build pour 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 avec api.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.tools et 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 message partagĂ©, 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 :

    • accountId
    • currentChannelId
    • currentThreadTs
    • currentMessageId
    • sessionKey
    • sessionId
    • agentId
    • requesterSenderId entrant 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.sendPoll est la base partagĂ©e pour les canaux qui correspondent au modĂšle commun de sondage
    • actions.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, elevenlabs et microsoft possĂšdent les implĂ©mentations de synthĂšse
    • voice-call consomme 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 :

    ts
        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 OpenClawPluginApi ni de api.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.

    Associé

    Was this useful?
    On this page

    On this page