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 :
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 :
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_callet 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 danscontracts.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=falsedĂ©sactive les hooks qui modifient le prompt, notammentagent_turn_prepare,before_prompt_build,heartbeat_prompt_contribution, les champs de prompt de lâancienbefore_agent_start, etenqueueNextTurnInjection.
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.
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 registrairedescriptors: descripteurs de commandes au moment de lâanalyse utilisĂ©s pour lâaide CLI, le routage et lâenregistrement paresseux de CLI de PluginparentPath: 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.
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 :
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
iddu backend devient le préfixe de fournisseur dans les références de modÚle commemy-cli/gpt-5. - La
configdu backend utilise la mĂȘme forme queagents.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
normalizeConfiglorsquâun backend a besoin de réécritures de compatibilitĂ© aprĂšs fusion (par exemple pour normaliser dâanciennes formes dâindicateurs). - Utilisez
resolveExecutionArgspour 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çoitctx.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 aussisideQuestionToolMode: "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 |
registerMemoryCapabilityest lâAPI exclusive de Plugin mĂ©moire recommandĂ©e.registerMemoryCapabilitypeut Ă©galement exposerpublicArtifacts.listArtifacts(...)afin que les Plugins compagnons puissent consommer les artefacts mĂ©moire exportĂ©s viaopenclaw/plugin-sdk/memory-host-coreau lieu dâaccĂ©der Ă la structure privĂ©e dâun Plugin mĂ©moire spĂ©cifique.registerMemoryPromptSection,registerMemoryFlushPlanetregisterMemoryRuntimesont des API exclusives de Plugin mĂ©moire compatibles avec lâexistant.MemoryFlushPlan.modelpeut Ă©pingler le tour de vidage Ă une rĂ©fĂ©renceprovider/modelexacte, commeollama/qwen3:8b, sans hĂ©riter de la chaĂźne de repli active.registerMemoryEmbeddingProviderest obsolĂšte. Les nouveaux fournisseurs dâembeddings doivent utiliserapi.registerEmbeddingProvider(...)etcontracts.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 siblockĂ©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 siblockĂ©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 sicancelĂ©tait omis), et non comme une substitution.message_received: utilisez le champ typĂ©threadIdlorsque vous avez besoin du routage entrant par fil/sujet. Conservezmetadatapour les complĂ©ments propres au canal.message_sending: utilisez les champs de routage typĂ©sreplyToId/threadIdavant de vous rabattre sur lesmetadatapropres au canal.gateway_start: utilisezctx.config,ctx.workspaceDiretctx.getCron?.()pour lâĂ©tat de dĂ©marrage dĂ©tenu par le Gateway au lieu de dĂ©pendre des hooks internesgateway:startup.cron_changed: observez les changements de cycle de vie Cron dĂ©tenus par le Gateway. Utilisezevent.job?.state?.nextRunAtMsetctx.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 :
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.tspour les assistants de flux dâen-tĂȘte bĂȘta Claude etservice_tier. @openclaw/openai-provider:api.tsexporte les constructeurs de fournisseur, les assistants de modĂšle par dĂ©faut et les constructeurs de fournisseur temps rĂ©el.@openclaw/openrouter-provider:api.tsexporte le constructeur de fournisseur ainsi que les assistants dâonboarding/configuration.
Connexe
Options definePluginEntry et defineChannelPluginEntry.
RĂ©fĂ©rence complĂšte de lâespace de noms api.runtime.
Empaquetage, manifestes et schémas de configuration.
Utilitaires de test et rĂšgles de lint.
Migration depuis les surfaces obsolĂštes.
Architecture approfondie et modÚle de capacités.