Plugin SDK reference

Présentation du SDK de Plugin

Le SDK de plugin est le contrat typĂ© entre les plugins et le noyau. Cette page est la rĂ©fĂ©rence pour ce qu’il faut importer et ce que vous pouvez enregistrer.

Convention d’importation

Importez toujours depuis un sous-chemin spécifique :

typescript
  

Chaque sous-chemin est un petit module autonome. Cela garde le dĂ©marrage rapide et Ă©vite les problĂšmes de dĂ©pendances circulaires. Pour les helpers d’entrĂ©e/de construction propres aux canaux, prĂ©fĂ©rez openclaw/plugin-sdk/channel-core ; rĂ©servez openclaw/plugin-sdk/core Ă  la surface d’ensemble plus large et aux helpers partagĂ©s tels que buildChannelConfigSchema.

Pour la configuration de canal, publiez le schĂ©ma JSON dĂ©tenu par le canal via openclaw.plugin.json#channelConfigs. Le sous-chemin plugin-sdk/channel-config-schema sert aux primitives de schĂ©ma partagĂ©es et au constructeur gĂ©nĂ©rique. Les plugins intĂ©grĂ©s d’OpenClaw utilisent plugin-sdk/bundled-channel-config-schema pour les schĂ©mas de canaux intĂ©grĂ©s conservĂ©s. Les exports de compatibilitĂ© obsolĂštes restent sur plugin-sdk/channel-config-schema-legacy ; aucun des sous-chemins de schĂ©ma intĂ©grĂ© n’est un modĂšle pour les nouveaux plugins.

Référence des sous-chemins

Le SDK de plugin est exposĂ© comme un ensemble de sous-chemins Ă©troits regroupĂ©s par domaine (entrĂ©e de plugin, canal, fournisseur, auth, runtime, capacitĂ©, mĂ©moire et helpers rĂ©servĂ©s aux plugins intĂ©grĂ©s). Pour le catalogue complet — regroupĂ© et liĂ© — consultez Sous-chemins du SDK de plugin.

L’inventaire des points d’entrĂ©e du compilateur se trouve dans scripts/lib/plugin-sdk-entrypoints.json ; les exports de package sont gĂ©nĂ©rĂ©s depuis le sous-ensemble public aprĂšs soustraction des sous-chemins de test/internes propres au dĂ©pĂŽt listĂ©s dans scripts/lib/plugin-sdk-private-local-only-subpaths.json. ExĂ©cutez pnpm plugin-sdk:surface pour auditer le nombre d’exports publics. Les sous-chemins publics obsolĂštes assez anciens et inutilisĂ©s par le code de production des extensions intĂ©grĂ©es sont suivis dans scripts/lib/plugin-sdk-deprecated-public-subpaths.json ; les barrels larges de rĂ©export obsolĂštes sont suivis dans scripts/lib/plugin-sdk-deprecated-barrel-subpaths.json.

API d’enregistrement

Le callback register(api) reçoit un objet OpenClawPluginApi avec ces méthodes :

Enregistrement des capacités

MĂ©thode Ce qu’elle enregistre
api.registerProvider(...) Inférence de texte (LLM)
api.registerAgentHarness(...) ExĂ©cuteur d’agent bas niveau expĂ©rimental
api.registerCliBackend(...) Backend d’infĂ©rence CLI local
api.registerChannel(...) Canal de messagerie
api.registerEmbeddingProvider(...) Fournisseur rĂ©utilisable d’embeddings vectoriels
api.registerSpeechProvider(...) SynthĂšse texte-vers-parole / STT
api.registerRealtimeTranscriptionProvider(...) Transcription temps réel en streaming
api.registerRealtimeVoiceProvider(...) Sessions vocales temps réel duplex
api.registerMediaUnderstandingProvider(...) Analyse d’images/audio/vidĂ©os
api.registerImageGenerationProvider(...) GĂ©nĂ©ration d’images
api.registerMusicGenerationProvider(...) Génération de musique
api.registerVideoGenerationProvider(...) Génération de vidéo
api.registerWebFetchProvider(...) Fournisseur de récupération / extraction web
api.registerWebSearchProvider(...) Recherche web

Les fournisseurs d’embeddings enregistrĂ©s avec api.registerEmbeddingProvider(...) doivent Ă©galement ĂȘtre listĂ©s dans contracts.embeddingProviders dans le manifeste du plugin. C’est la surface d’embeddings gĂ©nĂ©rique pour la gĂ©nĂ©ration vectorielle rĂ©utilisable. La recherche mĂ©moire peut consommer cette surface de fournisseur gĂ©nĂ©rique. L’ancienne couture api.registerMemoryEmbeddingProvider(...) et contracts.memoryEmbeddingProviders est une compatibilitĂ© obsolĂšte pendant la migration des fournisseurs existants propres Ă  la mĂ©moire.

Les fournisseurs propres Ă  la mĂ©moire qui exposent encore un runtime batchEmbed(...) restent sur le contrat existant de traitement par lots par fichier, sauf si leur runtime dĂ©finit explicitement sourceWideBatchEmbed: true. Cette option permet Ă  l’hĂŽte mĂ©moire de soumettre des fragments provenant de plusieurs fichiers mĂ©moire modifiĂ©s et sources activĂ©es dans un seul appel batchEmbed(...) jusqu’aux limites de lot de l’hĂŽte. Les adaptateurs de lot qui tĂ©lĂ©versent des fichiers de requĂȘtes JSONL doivent diviser les tĂąches fournisseur avant leur plafond de taille de tĂ©lĂ©versement ainsi que leur plafond de nombre de requĂȘtes. Le fournisseur doit renvoyer un embedding par fragment d’entrĂ©e dans le mĂȘme ordre que batch.chunks ; omettez l’indicateur lorsque le fournisseur attend des lots locaux au fichier ou ne peut pas prĂ©server l’ordre des entrĂ©es dans une tĂąche plus large Ă  l’échelle de la source.

Outils et commandes

Utilisez defineToolPlugin pour les plugins simples uniquement composĂ©s d’outils avec des noms d’outils fixes. Utilisez directement api.registerTool(...) pour les plugins mixtes ou l’enregistrement d’outils entiĂšrement dynamique.

MĂ©thode Ce qu’elle enregistre
api.registerTool(tool, opts?) Outil d’agent (obligatoire ou { optional: true })
api.registerCommand(def) Commande personnalisée (contourne le LLM)

Les commandes de plugin peuvent dĂ©finir agentPromptGuidance lorsque l’agent a besoin d’un court indice de routage dĂ©tenu par la commande. Gardez ce texte centrĂ© sur la commande elle-mĂȘme ; n’ajoutez pas de politique propre au fournisseur ou au plugin aux constructeurs de prompts du noyau.

Les entrĂ©es de guidage peuvent ĂȘtre des chaĂźnes hĂ©ritĂ©es, qui s’appliquent Ă  toutes les surfaces de prompt, ou des entrĂ©es structurĂ©es :

ts
agentPromptGuidance: [  "Global command hint.",  { text: "Only show this in the main OpenClaw prompt.", surfaces: ["openclaw_main"] },];

Les surfaces structurĂ©es peuvent inclure openclaw_main, codex_app_server, cli_backend, acp_backend ou subagent. pi_main reste un alias obsolĂšte de openclaw_main. Omettez surfaces pour un guidage volontairement valable sur toutes les surfaces. Ne passez pas de tableau surfaces vide ; il est rejetĂ© afin qu’une perte accidentelle de portĂ©e ne devienne pas du texte de prompt global.

Les instructions dĂ©veloppeur natives du serveur d’application Codex sont plus strictes que les autres surfaces de prompt : seul le guidage explicitement limitĂ© Ă  codex_app_server est promu dans cette voie Ă  prioritĂ© plus Ă©levĂ©e. Le guidage hĂ©ritĂ© sous forme de chaĂźne et le guidage structurĂ© sans portĂ©e restent disponibles pour les surfaces de prompt non Codex par compatibilitĂ©.

Infrastructure

MĂ©thode Ce qu’elle enregistre
api.registerHook(events, handler, opts?) Hook d’évĂ©nement
api.registerHttpRoute(params) Point de terminaison HTTP du Gateway
api.registerGatewayMethod(name, handler) Méthode RPC du Gateway
api.registerGatewayDiscoveryService(service) Annonceur de découverte Gateway locale
api.registerCli(registrar, opts?) Sous-commande CLI
api.registerNodeCliFeature(registrar, opts?) Fonctionnalité CLI Node sous openclaw nodes
api.registerService(service) Service d’arriùre-plan
api.registerInteractiveHandler(registration) Gestionnaire interactif
api.registerAgentToolResultMiddleware(...) Middleware runtime de rĂ©sultat d’outil
api.registerMemoryPromptSupplement(builder) Section de prompt additive adjacente à la mémoire
api.registerMemoryCorpusSupplement(adapter) Corpus additif de recherche/lecture mémoire

Hooks hĂŽte pour les plugins de workflow

Les hooks hĂŽte sont les coutures SDK pour les plugins qui doivent participer au cycle de vie de l’hĂŽte plutĂŽt que seulement ajouter un fournisseur, un canal ou un outil. Ce sont des contrats gĂ©nĂ©riques ; le mode Plan peut les utiliser, mais aussi les workflows d’approbation, les garde-fous de politique d’espace de travail, les moniteurs d’arriĂšre-plan, les assistants de configuration et les plugins compagnons d’interface utilisateur.

MĂ©thode Contrat qu’elle possĂšde
api.session.state.registerSessionExtension(...) État de session dĂ©tenu par le Plugin, compatible JSON, projetĂ© via les sessions Gateway
api.session.workflow.enqueueNextTurnInjection(...) Contexte durable exactement une fois injectĂ© dans le prochain tour d’agent pour une session
api.registerTrustedToolPolicy(...) Politique d’outil approuvĂ© prĂ©-Plugin, contrĂŽlĂ©e par le manifeste, qui peut bloquer ou réécrire les paramĂštres d’outil
api.registerToolMetadata(...) MĂ©tadonnĂ©es d’affichage du catalogue d’outils sans modifier l’implĂ©mentation de l’outil
api.registerCommand(...) Commandes de Plugin à portée définie ; les résultats de commande peuvent définir continueAgent: true ou suppressReply: true ; les commandes natives Discord prennent en charge descriptionLocalizations
api.session.controls.registerControlUiDescriptor(...) Descripteurs de contribution de l’interface de contrĂŽle pour les surfaces de session, d’outil, d’exĂ©cution ou de paramĂštres
api.lifecycle.registerRuntimeLifecycle(...) Callbacks de nettoyage pour les ressources d’exĂ©cution dĂ©tenues par le Plugin sur les chemins de rĂ©initialisation/suppression/rechargement
api.agent.events.registerAgentEventSubscription(...) Abonnements Ă  des Ă©vĂ©nements assainis pour l’état du workflow et les moniteurs
api.runContext.setRunContext(...) / getRunContext(...) / clearRunContext(...) État de travail temporaire du Plugin par exĂ©cution, effacĂ© lors du cycle de vie terminal de l’exĂ©cution
api.session.workflow.registerSessionSchedulerJob(...) MĂ©tadonnĂ©es de nettoyage pour les tĂąches planifiĂ©es dĂ©tenues par le Plugin ; ne planifie pas de travail et ne crĂ©e pas d’enregistrements de tĂąche
api.session.workflow.sendSessionAttachment(...) Livraison de piĂšce jointe fichier, rĂ©servĂ©e aux modules intĂ©grĂ©s et mĂ©diĂ©e par l’hĂŽte, vers la route de session directe sortante active
api.session.workflow.scheduleSessionTurn(...) / unscheduleSessionTurnsByTag(...) Tours de session planifiés adossés à Cron, réservés aux modules intégrés, plus nettoyage par balise
api.session.controls.registerSessionAction(...) Actions de session typées que les clients peuvent distribuer via le Gateway

Utilisez les espaces de noms groupés pour le nouveau code de Plugin :

  • api.session.state.registerSessionExtension(...)
  • api.session.workflow.enqueueNextTurnInjection(...)
  • api.session.workflow.registerSessionSchedulerJob(...)
  • api.session.workflow.sendSessionAttachment(...)
  • api.session.workflow.scheduleSessionTurn(...)
  • api.session.workflow.unscheduleSessionTurnsByTag(...)
  • api.session.controls.registerSessionAction(...)
  • api.session.controls.registerControlUiDescriptor(...)
  • api.agent.events.registerAgentEventSubscription(...)
  • api.agent.events.emitAgentEvent(...)
  • api.runContext.setRunContext(...) / getRunContext(...) / clearRunContext(...)
  • api.lifecycle.registerRuntimeLifecycle(...)

Les mĂ©thodes plates Ă©quivalentes restent disponibles comme alias de compatibilitĂ© obsolĂštes pour les plugins existants. N’ajoutez pas de nouveau code de Plugin qui appelle api.registerSessionExtension, api.enqueueNextTurnInjection, api.registerControlUiDescriptor, api.registerRuntimeLifecycle, api.registerAgentEventSubscription, api.emitAgentEvent, api.setRunContext, api.getRunContext, api.clearRunContext, api.registerSessionSchedulerJob, api.registerSessionAction, api.sendSessionAttachment, api.scheduleSessionTurn ou api.unscheduleSessionTurnsByTag directement.

scheduleSessionTurn(...) est un raccourci limitĂ© Ă  une session au-dessus du planificateur Cron du Gateway. Cron possĂšde la temporalitĂ© et crĂ©e l’enregistrement de tĂąche en arriĂšre-plan lorsque le tour s’exĂ©cute ; le SDK Plugin limite uniquement la session cible, la nomination dĂ©tenue par le Plugin et le nettoyage. Utilisez api.runtime.tasks.managedFlows dans le tour planifiĂ© lorsque le travail lui-mĂȘme nĂ©cessite un Ă©tat durable de Task Flow en plusieurs Ă©tapes.

Les contrats séparent volontairement les autorités :

  • Les plugins externes peuvent dĂ©tenir les extensions de session, les descripteurs d’interface utilisateur, les commandes, les mĂ©tadonnĂ©es d’outils, les injections au tour suivant et les hooks normaux.
  • Les politiques d’outils approuvĂ©s s’exĂ©cutent avant les hooks ordinaires before_tool_call et sont approuvĂ©es par l’hĂŽte. Les politiques intĂ©grĂ©es s’exĂ©cutent en premier ; les politiques des plugins installĂ©s nĂ©cessitent une activation explicite plus leurs identifiants locaux dans contracts.trustedToolPolicies, puis s’exĂ©cutent ensuite dans l’ordre de chargement des plugins. Les identifiants de politique sont limitĂ©s au Plugin qui les enregistre.
  • La propriĂ©tĂ© des commandes rĂ©servĂ©es est rĂ©servĂ©e aux modules intĂ©grĂ©s. Les plugins externes doivent utiliser leurs propres noms de commande ou alias.
  • allowPromptInjection=false dĂ©sactive les hooks qui modifient le prompt, notamment agent_turn_prepare, before_prompt_build, heartbeat_prompt_contribution, les champs de prompt de l’ancien before_agent_start, et enqueueNextTurnInjection.

Exemples de consommateurs non-Plan :

Archétype de Plugin Hooks utilisés
Workflow d’approbation Extension de session, continuation de commande, injection au tour suivant, descripteur d’interface utilisateur
BarriĂšre de politique de budget/espace de travail Politique d’outil approuvĂ©, mĂ©tadonnĂ©es d’outil, projection de session
Moniteur de cycle de vie en arriĂšre-plan Nettoyage du cycle de vie d’exĂ©cution, abonnement aux Ă©vĂ©nements d’agent, propriĂ©tĂ©/nettoyage du planificateur de session, contribution au prompt Heartbeat, descripteur d’interface utilisateur
Assistant de configuration ou d’onboarding Extension de session, commandes Ă  portĂ©e dĂ©finie, descripteur de l’interface de contrĂŽle
Quand utiliser le middleware de rĂ©sultat d’outil

Les plugins intĂ©grĂ©s et les plugins installĂ©s explicitement activĂ©s avec des contrats de manifeste correspondants peuvent utiliser api.registerAgentToolResultMiddleware(...) lorsqu’ils doivent réécrire un rĂ©sultat d’outil aprĂšs l’exĂ©cution et avant que le runtime ne renvoie ce rĂ©sultat au modĂšle. C’est le point d’extension approuvĂ© et neutre vis-Ă -vis du runtime pour les rĂ©ducteurs de sortie asynchrones comme tokenjuice.

Les plugins doivent dĂ©clarer contracts.agentToolResultMiddleware pour chaque runtime ciblĂ©, par exemple ["openclaw", "codex"]. Les plugins installĂ©s sans ce contrat, ou sans activation explicite, ne peuvent pas enregistrer ce middleware ; conservez les hooks de Plugin OpenClaw normaux pour le travail qui n’a pas besoin d’un timing de rĂ©sultat d’outil avant modĂšle. L’ancien chemin d’enregistrement de fabrique d’extension uniquement pour l’exĂ©cuteur intĂ©grĂ© a Ă©tĂ© supprimĂ©.

Enregistrement de découverte Gateway

api.registerGatewayDiscoveryService(...) permet Ă  un Plugin d’annoncer le Gateway actif sur un transport de dĂ©couverte local tel que mDNS/Bonjour. OpenClaw appelle le service pendant le dĂ©marrage du Gateway lorsque la dĂ©couverte locale est activĂ©e, transmet les ports Gateway actuels et des donnĂ©es d’indication TXT non secrĂštes, et appelle le gestionnaire stop renvoyĂ© pendant l’arrĂȘt du Gateway.

typescript
api.registerGatewayDiscoveryService({  id: "my-discovery",  async advertise(ctx) {    const handle = await startMyAdvertiser({      gatewayPort: ctx.gatewayPort,      tls: ctx.gatewayTlsEnabled,      displayName: ctx.machineDisplayName,    });    return { stop: () => handle.stop() };  },});

Les plugins de dĂ©couverte Gateway ne doivent pas traiter les valeurs TXT annoncĂ©es comme des secrets ou de l’authentification. La dĂ©couverte est une indication de routage ; l’authentification Gateway et l’épinglage TLS restent propriĂ©taires de la confiance.

MĂ©tadonnĂ©es d’enregistrement CLI

api.registerCli(registrar, opts?) accepte deux types de métadonnées de commande :

  • commands : noms de commandes explicites dĂ©tenus par le registraire
  • descriptors : descripteurs de commandes au moment de l’analyse utilisĂ©s pour l’aide CLI, le routage et l’enregistrement paresseux de CLI de Plugin
  • parentPath : chemin de commande parent facultatif pour les groupes de commandes imbriquĂ©s, comme ["nodes"]

Pour les fonctionnalitĂ©s de nƓud appairĂ©, prĂ©fĂ©rez api.registerNodeCliFeature(registrar, opts?). C’est un petit wrapper autour de api.registerCli(..., { parentPath: ["nodes"] }) qui rend les commandes comme openclaw nodes canvas explicitement des fonctionnalitĂ©s de nƓud dĂ©tenues par le Plugin.

Si vous voulez qu’une commande de Plugin reste chargĂ©e paresseusement dans le chemin CLI racine normal, fournissez des descriptors qui couvrent chaque racine de commande de premier niveau exposĂ©e par ce registraire.

typescript
api.registerCli(  async ({ program }) => {    const { registerMatrixCli } = await import("./src/cli.js");    registerMatrixCli({ program });  },  {    descriptors: [      {        name: "matrix",        description: "Manage Matrix accounts, verification, devices, and profile state",        hasSubcommands: true,      },    ],  },);

Les commandes imbriquées reçoivent la commande parente résolue comme program :

typescript
api.registerCli(  async ({ program }) => {    const { registerNodesCanvasCommands } = await import("./src/cli.js");    registerNodesCanvasCommands(program);  },  {    parentPath: ["nodes"],    descriptors: [      {        name: "canvas",        description: "Capture or render canvas content from a paired node",        hasSubcommands: true,      },    ],  },);

Utilisez commands seul uniquement lorsque vous n’avez pas besoin de l’enregistrement paresseux de CLI racine. Ce chemin de compatibilitĂ© avide reste pris en charge, mais il n’installe pas d’espaces rĂ©servĂ©s adossĂ©s Ă  des descripteurs pour le chargement paresseux au moment de l’analyse.

Enregistrement du backend CLI

api.registerCliBackend(...) permet Ă  un Plugin de dĂ©tenir la configuration par dĂ©faut pour un backend CLI d’IA local tel que claude-cli ou my-cli.

  • Le id du backend devient le prĂ©fixe de fournisseur dans les rĂ©fĂ©rences de modĂšle comme my-cli/gpt-5.
  • La config du backend utilise la mĂȘme forme que agents.defaults.cliBackends.<id>.
  • La configuration utilisateur reste prioritaire. OpenClaw fusionne agents.defaults.cliBackends.<id> par-dessus la valeur par dĂ©faut du Plugin avant d’exĂ©cuter la CLI.
  • Utilisez normalizeConfig lorsqu’un backend a besoin de réécritures de compatibilitĂ© aprĂšs fusion (par exemple pour normaliser d’anciennes formes d’indicateurs).
  • Utilisez resolveExecutionArgs pour les réécritures argv limitĂ©es Ă  la requĂȘte qui relĂšvent du dialecte CLI, comme le mappage des niveaux de rĂ©flexion OpenClaw vers un indicateur d’effort natif. Le hook reçoit ctx.executionMode; utilisez "side-question" pour ajouter des indicateurs d’isolation natifs au backend pour les appels /btw Ă©phĂ©mĂšres. Si ces indicateurs dĂ©sactivent de façon fiable les outils natifs pour une CLI autrement toujours active, dĂ©clarez aussi sideQuestionToolMode: "disabled".

Pour un guide de création de bout en bout, consultez Plugins de backend CLI.

Emplacements exclusifs

MĂ©thode Ce qu’elle enregistre
api.registerContextEngine(id, factory) Moteur de contexte (un seul actif Ă  la fois). Les rappels de cycle de vie reçoivent runtimeSettings lorsque l’hĂŽte peut fournir des diagnostics de modĂšle/fournisseur/mode ; les anciens moteurs stricts sont rĂ©essayĂ©s sans cette clĂ©.
api.registerMemoryCapability(capability) Capacité mémoire unifiée
api.registerMemoryPromptSection(builder) GĂ©nĂ©rateur de section d’invite mĂ©moire
api.registerMemoryFlushPlan(resolver) Résolveur de plan de vidage mémoire
api.registerMemoryRuntime(runtime) Adaptateur d’exĂ©cution mĂ©moire

Adaptateurs d’embedding mĂ©moire obsolĂštes

MĂ©thode Ce qu’elle enregistre
api.registerMemoryEmbeddingProvider(adapter) Adaptateur d’embedding mĂ©moire pour le Plugin actif
  • registerMemoryCapability est l’API exclusive de Plugin mĂ©moire recommandĂ©e.
  • registerMemoryCapability peut Ă©galement exposer publicArtifacts.listArtifacts(...) afin que les Plugins compagnons puissent consommer les artefacts mĂ©moire exportĂ©s via openclaw/plugin-sdk/memory-host-core au lieu d’accĂ©der Ă  la structure privĂ©e d’un Plugin mĂ©moire spĂ©cifique.
  • registerMemoryPromptSection, registerMemoryFlushPlan et registerMemoryRuntime sont des API exclusives de Plugin mĂ©moire compatibles avec l’existant.
  • MemoryFlushPlan.model peut Ă©pingler le tour de vidage Ă  une rĂ©fĂ©rence provider/model exacte, comme ollama/qwen3:8b, sans hĂ©riter de la chaĂźne de repli active.
  • registerMemoryEmbeddingProvider est obsolĂšte. Les nouveaux fournisseurs d’embeddings doivent utiliser api.registerEmbeddingProvider(...) et contracts.embeddingProviders.
  • Les fournisseurs propres Ă  la mĂ©moire existants continuent de fonctionner pendant la fenĂȘtre de migration, mais l’inspection du Plugin signale cela comme une dette de compatibilitĂ© pour les Plugins non groupĂ©s.

ÉvĂ©nements et cycle de vie

MĂ©thode Ce qu’elle fait
api.on(hookName, handler, opts?) Hook de cycle de vie typé
api.onConversationBindingResolved(handler) Rappel de liaison de conversation

Consultez Hooks de Plugin pour des exemples, les noms de hooks courants et la sémantique des gardes.

Sémantique de décision des hooks

before_install est un hook de cycle de vie de l’exĂ©cution du Plugin, pas la surface de politique d’installation de l’opĂ©rateur. Utilisez security.installPolicy lorsqu’une dĂ©cision d’autorisation/blocage doit couvrir les chemins d’installation ou de mise Ă  jour adossĂ©s Ă  la CLI et au Gateway.

  • before_tool_call : renvoyer { block: true } est terminal. DĂšs qu’un gestionnaire le dĂ©finit, les gestionnaires de prioritĂ© infĂ©rieure sont ignorĂ©s.
  • before_tool_call : renvoyer { block: false } est traitĂ© comme une absence de dĂ©cision (comme si block Ă©tait omis), et non comme une substitution.
  • before_install : renvoyer { block: true } est terminal. DĂšs qu’un gestionnaire le dĂ©finit, les gestionnaires de prioritĂ© infĂ©rieure sont ignorĂ©s.
  • before_install : renvoyer { block: false } est traitĂ© comme une absence de dĂ©cision (comme si block Ă©tait omis), et non comme une substitution.
  • reply_dispatch : renvoyer { handled: true, ... } est terminal. DĂšs qu’un gestionnaire revendique l’envoi, les gestionnaires de prioritĂ© infĂ©rieure et le chemin d’envoi de modĂšle par dĂ©faut sont ignorĂ©s.
  • message_sending : renvoyer { cancel: true } est terminal. DĂšs qu’un gestionnaire le dĂ©finit, les gestionnaires de prioritĂ© infĂ©rieure sont ignorĂ©s.
  • message_sending : renvoyer { cancel: false } est traitĂ© comme une absence de dĂ©cision (comme si cancel Ă©tait omis), et non comme une substitution.
  • message_received : utilisez le champ typĂ© threadId lorsque vous avez besoin du routage entrant par fil/sujet. Conservez metadata pour les complĂ©ments propres au canal.
  • message_sending : utilisez les champs de routage typĂ©s replyToId / threadId avant de vous rabattre sur les metadata propres au canal.
  • gateway_start : utilisez ctx.config, ctx.workspaceDir et ctx.getCron?.() pour l’état de dĂ©marrage dĂ©tenu par le Gateway au lieu de dĂ©pendre des hooks internes gateway:startup.
  • cron_changed : observez les changements de cycle de vie Cron dĂ©tenus par le Gateway. Utilisez event.job?.state?.nextRunAtMs et ctx.getCron?.() lors de la synchronisation de planificateurs de rĂ©veil externes, et conservez OpenClaw comme source de vĂ©ritĂ© pour les vĂ©rifications d’échĂ©ance et l’exĂ©cution.

Champs de l’objet API

Champ Type Description
api.id string ID du Plugin
api.name string Nom d’affichage
api.version string? Version du Plugin (facultatif)
api.description string? Description du Plugin (facultatif)
api.source string Chemin source du Plugin
api.rootDir string? Répertoire racine du Plugin (facultatif)
api.config OpenClawConfig InstantanĂ© de configuration actuel (instantanĂ© d’exĂ©cution actif en mĂ©moire lorsqu’il est disponible)
api.pluginConfig Record<string, unknown> Configuration propre au Plugin depuis plugins.entries.<id>.config
api.runtime PluginRuntime Assistants d’exĂ©cution
api.logger PluginLogger Journaliseur à 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 l’entrĂ©e complĂšte
api.resolvePath(input) (string) => string Résout le chemin relatif à la racine du Plugin

Convention de module interne

Dans votre Plugin, utilisez des fichiers barrel locaux pour les imports internes :

Code
my-plugin/  api.ts            # Public exports for external consumers  runtime-api.ts    # Internal-only runtime exports  index.ts          # Plugin entry point  setup-entry.ts    # Lightweight setup-only entry (optional)

Les surfaces publiques des Plugins groupĂ©s chargĂ©s par façade (api.ts, runtime-api.ts, index.ts, setup-entry.ts et fichiers d’entrĂ©e publics similaires) prĂ©fĂšrent l’instantanĂ© de configuration d’exĂ©cution actif lorsque OpenClaw est dĂ©jĂ  en cours d’exĂ©cution. Si aucun instantanĂ© d’exĂ©cution n’existe encore, elles se rabattent sur le fichier de configuration rĂ©solu sur disque. Les façades de Plugins groupĂ©s empaquetĂ©s doivent ĂȘtre chargĂ©es via les chargeurs de façade de Plugin d’OpenClaw ; les imports directs depuis dist/extensions/... contournent le manifeste et les vĂ©rifications sidecar d’exĂ©cution que les installations empaquetĂ©es utilisent pour le code dĂ©tenu par le Plugin.

Les Plugins de fournisseur peuvent exposer un barrel de contrat local au Plugin et Ă©troit lorsqu’un assistant est intentionnellement propre au fournisseur et n’a pas encore sa place dans un sous-chemin SDK gĂ©nĂ©rique. Exemples groupĂ©s :

  • Anthropic : surface publique api.ts / contract-api.ts pour les assistants de flux d’en-tĂȘte bĂȘta Claude et service_tier.
  • @openclaw/openai-provider : api.ts exporte les constructeurs de fournisseur, les assistants de modĂšle par dĂ©faut et les constructeurs de fournisseur temps rĂ©el.
  • @openclaw/openrouter-provider : api.ts exporte le constructeur de fournisseur ainsi que les assistants d’onboarding/configuration.

Connexe

Was this useful?
On this page

On this page