Plugin SDK reference
Overzicht van de Plugin-SDK
De plugin-SDK is het getypeerde contract tussen plugins en de kern. Deze pagina is het naslagwerk voor wat u kunt importeren en wat u kunt registreren.
Importconventie
Importeer altijd vanuit een specifiek subpad:
Elk subpad is een kleine, zelfstandige module. Hierdoor blijft het opstarten snel en
worden problemen met circulaire afhankelijkheden voorkomen. Geef voor kanaalspecifieke invoer-/bouwhulpmiddelen
de voorkeur aan openclaw/plugin-sdk/channel-core; gebruik openclaw/plugin-sdk/core voor
het bredere overkoepelende oppervlak en gedeelde hulpmiddelen zoals
buildChannelConfigSchema.
Publiceer voor kanaalconfiguratie het JSON Schema waarvan het kanaal eigenaar is via
openclaw.plugin.json#channelConfigs. Het subpad plugin-sdk/channel-config-schema
is bedoeld voor gedeelde schemaprimitieven en de algemene bouwer. De meegeleverde
plugins van OpenClaw gebruiken plugin-sdk/bundled-channel-config-schema voor behouden
schema's van meegeleverde kanalen. Verouderde compatibiliteitsexports blijven beschikbaar via
plugin-sdk/channel-config-schema-legacy; geen van beide subpaden voor meegeleverde schema's is een
patroon voor nieuwe plugins.
Naslagwerk voor subpaden
De plugin-SDK wordt aangeboden als een verzameling nauw afgebakende subpaden, gegroepeerd per gebied (plugin- invoer, kanaal, provider, authenticatie, runtime, capaciteit, geheugen en gereserveerde hulpmiddelen voor meegeleverde plugins). Zie voor de volledige catalogus — gegroepeerd en met koppelingen — Subpaden van de plugin-SDK.
De inventaris van compilerinvoerpunten staat in
scripts/lib/plugin-sdk-entrypoints.json; pakketexports worden gegenereerd vanuit
de openbare deelverzameling nadat de repo-lokale subpaden voor tests/intern gebruik uit
scripts/lib/plugin-sdk-private-local-only-subpaths.json zijn verwijderd. Voer
pnpm plugin-sdk:surface uit om het aantal openbare exports te controleren. Verouderde openbare
subpaden die oud genoeg zijn en niet worden gebruikt door productiecode van meegeleverde extensies, worden
bijgehouden in scripts/lib/plugin-sdk-deprecated-public-subpaths.json; brede
verouderde barrels voor herexport worden bijgehouden in
scripts/lib/plugin-sdk-deprecated-barrel-subpaths.json.
Registratie-API
De callback register(api) ontvangt een object OpenClawPluginApi met deze
methoden:
Registratie van capaciteiten
| Methode | Wat deze registreert |
|---|---|
api.registerProvider(...) |
Tekstinferentie (LLM) |
api.registerWorkerProvider(...) |
Leases voor de levenscyclus van cloudworkers |
api.registerModelCatalogProvider(...) |
Modelcatalogusregels voor tekst- en mediageneratie |
api.registerAgentHarness(...) |
Experimentele native agentuitvoerder (Codex, Copilot) |
api.registerCliBackend(...) |
Lokale CLI-inferentiebackend |
api.registerChannel(...) |
Berichtenkanaal |
api.registerEmbeddingProvider(...) |
Herbruikbare provider voor vector-embeddings |
api.registerSpeechProvider(...) |
Tekst-naar-spraak-/STT-synthese |
api.registerRealtimeTranscriptionProvider(...) |
Realtime streamingtranscriptie |
api.registerRealtimeVoiceProvider(...) |
Duplex realtime spraaksessies |
api.registerMediaUnderstandingProvider(...) |
Analyse van afbeeldingen/audio/video |
api.registerTranscriptSourceProvider(...) |
Bron voor live of geïmporteerde vergadertranscripten |
api.registerImageGenerationProvider(...) |
Afbeeldingsgeneratie |
api.registerMusicGenerationProvider(...) |
Muziekgeneratie |
api.registerVideoGenerationProvider(...) |
Videogeneratie |
api.registerWebFetchProvider(...) |
Provider voor ophalen/scrapen van webinhoud |
api.registerWebSearchProvider(...) |
Zoeken op het web |
api.registerCompactionProvider(...) |
Verwisselbare backend voor transcript-Compaction |
Workerproviders moeten hun id ook declareren in contracts.workerProviders.
De kern slaat duurzame intentie op vóór provision(profile, operationId). Providers valideren instellingen vóór externe toewijzing en werpen WorkerProviderError op bij permanente afwijzing van een profiel. provision moet dezelfde lease overnemen wanneer de bewerkings-id wordt herhaald.
De kern slaat de gevalideerde profielinstellingen samen met de lease op en levert die momentopname aan destroy({ leaseId, profile }), dat idempotent moet zijn, en inspect({ leaseId, profile }), dat active, destroyed of unknown retourneert. Hierdoor kunnen providers levenscyclusaanroepen routeren na een herstart van de Gateway of verwijdering van een benoemd profiel. SSH-eindpunten gebruiken een SecretRef voor keyRef, nooit rechtstreeks opgenomen sleutelmateriaal, en bevatten een hostKey uit vertrouwde provisioneringsuitvoer in exact de vorm algorithm base64, zonder hostnaam of opmerking. De kern legt hostKey vast en vertrouwt nooit een sleutel uit de eerste verbinding. Een provider die een dynamische keyRef aanmaakt, kan resolveSshIdentity({ leaseId, profile, keyRef }) implementeren; indien aanwezig is die resolver gezaghebbend, terwijl providers zonder deze resolver de geconfigureerde algemene geheimresolver gebruiken.
Providers met verlengbare leases kunnen ook renew(leaseId) implementeren.
inspect moet een fout opwerpen bij tijdelijke of onbepaalde fouten; retourneer unknown uitsluitend bij gezaghebbende afwezigheid. De kern markeert een actieve lokale record als verweesd, of behandelt de afwezigheid als voltooiing van de afbraak na een opgeslagen vernietigingsverzoek.
Embeddingproviders die met api.registerEmbeddingProvider(...) zijn geregistreerd, moeten
ook worden vermeld in contracts.embeddingProviders in het pluginmanifest. Dit
is het algemene embeddingoppervlak voor herbruikbare vectorgeneratie. Geheugenzoeken
kan dit algemene provideroppervlak gebruiken. De oudere interface
api.registerMemoryEmbeddingProvider(...) en
contracts.memoryEmbeddingProviders is verouderde compatibiliteit terwijl
bestaande geheugenspecifieke providers worden gemigreerd.
Geheugenspecifieke providers die nog steeds een runtime-batchEmbed(...) aanbieden, blijven werken volgens
het bestaande batchcontract per bestand, tenzij hun runtime expliciet
sourceWideBatchEmbed: true instelt. Met deze opt-in kan de geheugenhost fragmenten uit
meerdere gewijzigde geheugenbestanden en ingeschakelde bronnen in één batchEmbed(...)-aanroep indienen,
tot aan de batchlimieten van de host. Batchadapters die JSONL-aanvraagbestanden uploaden, moeten
providertaken splitsen vóór zowel hun limiet voor uploadgrootte als hun limiet voor
het aantal aanvragen. De provider moet voor elk invoerfragment één embedding retourneren, in dezelfde volgorde als
batch.chunks; laat de vlag weg wanneer de provider batches per bestand verwacht of
de invoervolgorde niet kan behouden binnen een grotere bronbrede taak.
Tools en opdrachten
Gebruik defineToolPlugin voor eenvoudige plugins met alleen tools
en vaste toolnamen. Gebruik api.registerTool(...) rechtstreeks voor gemengde plugins
of volledig dynamische toolregistratie.
| Methode | Wat deze registreert |
|---|---|
api.registerTool(tool, opts?) |
Agenttool (vereist of { optional: true }) |
api.registerCommand(def) |
Aangepaste opdracht (omzeilt de LLM) |
api.registerNodeHostCommand(command) |
Opdracht die door openclaw node run wordt afgehandeld; optionele agentTool-metadata kan deze als een voor de agent zichtbare tool aanbieden terwijl de Node verbonden is |
Pluginopdrachten kunnen agentPromptGuidance instellen wanneer de agent een korte,
door de opdracht beheerde routeringshint nodig heeft. Laat die tekst over de opdracht zelf gaan; voeg geen
provider- of pluginspecifiek beleid toe aan de promptbouwers van de kern.
Instructievermeldingen kunnen verouderde tekenreeksen zijn, die op elk promptoppervlak van toepassing zijn, of gestructureerde vermeldingen:
agentPromptGuidance: [ "Global command hint.", { text: "Only show this in the main OpenClaw prompt.", surfaces: ["openclaw_main"] },];Gestructureerde surfaces kunnen openclaw_main, codex_app_server,
cli_backend, acp_backend of subagent bevatten. pi_main blijft een verouderde alias
voor openclaw_main. Laat surfaces weg voor instructies die bewust voor alle oppervlakken gelden. Geef
geen lege surfaces-array door; deze wordt afgewezen, zodat onbedoeld verlies van afbakening
niet leidt tot algemene prompttekst.
Native ontwikkelaarsinstructies voor de Codex-appserver zijn strenger dan andere prompt-
oppervlakken: alleen instructies die expliciet zijn afgebakend tot codex_app_server worden naar
die baan met hogere prioriteit gepromoveerd. Verouderde tekenreeksinstructies en niet-afgebakende gestructureerde
instructies blijven voor compatibiliteit beschikbaar voor promptoppervlakken die niet van Codex zijn.
Node-hostopdrachten worden uitgevoerd op de verbonden Node-host, niet binnen het Gateway-proces. Als agentTool aanwezig is, publiceert de Node na een geslaagde verbinding met de Gateway een descriptor; de Gateway stelt deze alleen beschikbaar aan agentuitvoeringen zolang die Node verbonden is en alleen als de command van de descriptor deel uitmaakt van het goedgekeurde opdrachtoppervlak van de Node. Stel agentTool.defaultPlatforms in om een niet-gevaarlijke opdracht toe te voegen aan de standaardtoelatingslijst voor Node-opdrachten; anders is een expliciete gateway.nodes.allowCommands of een Node-aanroepbeleid vereist. agentTool.name moet veilig zijn voor providers: begin met een letter, gebruik uitsluitend letters, cijfers, underscores of koppeltekens en blijf binnen 64 tekens. Door MCP ondersteunde Node-tools kunnen agentTool.mcp-metadata instellen, zodat catalogus- en toolzoekoppervlakken de identiteit van de externe MCP-server/tool kunnen tonen, maar de uitvoering verloopt nog steeds via de aangekondigde Node-opdracht.
Infrastructuur
| Methode | Wat deze registreert |
|---|---|
api.registerHook(events, handler, opts?) |
Gebeurtenishook |
api.registerHttpRoute(params) |
HTTP-eindpunt van de Gateway |
api.registerGatewayMethod(name, handler) |
RPC-methode van de Gateway |
api.registerGatewayDiscoveryService(service) |
Lokale adverteerder voor Gateway-detectie |
api.registerCli(registrar, opts?) |
CLI-subopdracht |
api.registerNodeCliFeature(registrar, opts?) |
CLI voor Node-functionaliteit onder openclaw nodes |
api.registerService(service) |
Achtergrondservice |
api.registerInteractiveHandler(registration) |
Interactieve handler |
api.registerAgentToolResultMiddleware(...) |
Runtime-middleware voor toolresultaten |
api.registerMemoryPromptSupplement(builder) |
Aanvullende promptsectie naast het geheugen |
api.registerMemoryCorpusSupplement(adapter) |
Aanvullend corpus voor zoeken/lezen in het geheugen |
api.registerHostedMediaResolver(resolver) |
Resolver voor browserachtige URL's van gehoste media |
api.registerTextTransforms(transforms) |
Door de Plugin beheerde compatibiliteitsherschrijvingen van prompt-/berichttekst |
api.registerConfigMigration(migrate) |
Lichtgewicht configuratiemigratie die wordt uitgevoerd voordat de Plugin-runtime wordt geladen |
api.registerMigrationProvider(provider) |
Importfunctie voor openclaw migrate |
api.registerAutoEnableProbe(probe) |
Configuratiecontrole die deze Plugin automatisch kan inschakelen |
api.registerReload(registration) |
Beleid per configuratieprefix voor herstart/hot/noop bij herladen |
api.registerNodeHostCommand(command) |
Opdrachthandler die aan gekoppelde Nodes wordt aangeboden |
api.registerNodeInvokePolicy(policy) |
Toelatingslijst-/goedkeuringsbeleid voor door Nodes aangeroepen opdrachten |
api.registerSecurityAuditCollector(collector) |
Bevindingenverzamelaar voor openclaw security audit |
Builders voor geheugenpromptaanvullingen ontvangen optionele context voor agentId, agentSessionKey en sandboxed. Aanroepen van search en get voor aanvullingen op het geheugencorpus ontvangen optionele context voor agentId en sandboxed. Plugins met door agents beheerde opslag moeten die opslag voor elke aanroep bepalen in plaats van tijdens de registratie één globaal pad vast te leggen. Als een agent-id vereist is maar ontbreekt bij een multi-agentbewerking, moet de bewerking gesloten mislukken in plaats van een willekeurige agent te kiezen.
Interactieve handlers van Telegram kunnen { submitText } retourneren om tekst na een geslaagde handler via het normale inkomende agentpad van Telegram te routeren. OpenClaw behoudt de terugbelknop wanneer het beleid voor inkomende berichten de tekst overslaat of de verwerking mislukt, zodat de gebruiker het opnieuw kan proberen nadat de blokkerende omstandigheid is gewijzigd. Dit resultaatveld is specifiek voor Telegram; andere kanalen behouden hun eigen contracten voor interactieve resultaten.
Hosthooks voor workflow-Plugins
Hosthooks zijn de SDK-aansluitpunten voor Plugins die aan de levenscyclus van de host moeten deelnemen in plaats van alleen een provider, kanaal of tool toe te voegen. Het zijn generieke contracten; Plan Mode kan ze gebruiken, maar dat geldt ook voor goedkeuringsworkflows, beleidscontroles voor werkruimten, achtergrondmonitors, installatiewizards en aanvullende UI-Plugins.
| Methode | Contract waarvoor deze verantwoordelijk is |
|---|---|
api.session.state.registerSessionExtension(...) |
Door de Plugin beheerde, JSON-compatibele sessiestatus die via Gateway-sessies wordt geprojecteerd |
api.session.workflow.enqueueNextTurnInjection(...) |
Duurzame, exact eenmaal in de volgende agentbeurt geïnjecteerde context voor één sessie |
api.registerTrustedToolPolicy(...) |
Door het manifest afgeschermd, vertrouwd toolbeleid vóór Plugins dat toolparameters kan blokkeren of herschrijven |
api.registerToolMetadata(...) |
Weergavemetadata voor de toolcatalogus zonder de toolimplementatie te wijzigen |
api.registerCommand(...) |
Afgebakende Plugin-opdrachten; opdrachtresultaten kunnen continueAgent: true of suppressReply: true instellen; native Discord-opdrachten ondersteunen descriptionLocalizations |
api.session.controls.registerControlUiDescriptor(...) |
Bijdragedescriptors voor de Control UI voor sessie-, tool-, uitvoerings-, instellingen- of tabbladoppervlakken |
api.lifecycle.registerRuntimeLifecycle(...) |
Opschooncallbacks voor door Plugins beheerde runtimebronnen bij reset-, verwijderings- en herlaadpaden |
api.agent.events.registerAgentEventSubscription(...) |
Opgeschoonde gebeurtenisabonnementen voor workflowstatus en monitors |
api.runContext.setRunContext(...) / getRunContext(...) / clearRunContext(...) |
Tijdelijke Plugin-status per uitvoering die wordt gewist bij de terminale levenscyclus van de uitvoering |
api.session.workflow.registerSessionSchedulerJob(...) |
Opschoonmetadata voor door Plugins beheerde schedulertaken; plant geen werk en maakt geen taakrecords |
api.session.workflow.sendSessionAttachment(...) |
Alleen voor gebundelde Plugins beschikbare, door de host bemiddelde levering van bestandsbijlagen aan de actieve directe uitgaande sessieroute |
api.session.workflow.scheduleSessionTurn(...) / unscheduleSessionTurnsByTag(...) |
Alleen voor gebundelde Plugins beschikbare, door Cron ondersteunde geplande sessiebeurten met opschoning op basis van tags |
api.session.controls.registerSessionAction(...) |
Getypeerde sessieacties die clients via de Gateway kunnen uitvoeren |
Een descriptor met surface: "tab" voegt een zijbalktabblad toe aan de Control UI. Tabbladdescriptors van actieve Plugins worden in de hello van de Gateway (controlUiTabs) aangekondigd aan dashboardclients, zodat het tabblad alleen verschijnt wanneer de Plugin is ingeschakeld. Gebundelde Plugins kunnen een volwaardige dashboardweergave voor hun tabblad leveren; andere Plugins kunnen path instellen op een HTTP-route van de Plugin (zie api.registerHttpRoute(...)) die het dashboard in een gesandboxed frame weergeeft. icon is een hint voor de naam van een dashboardpictogram, group kiest de zijbalksectie (control of agent), order bepaalt de sortering tussen Plugin-tabbladen en requiredScopes verbergt het tabblad voor verbindingen zonder die operatorbereiken:
api.session.controls.registerControlUiDescriptor({ surface: "tab", id: "logbook", label: "Logbook", description: "Your day as a timeline, built from screen snapshots.", icon: "sun", group: "control", requiredScopes: ["operator.write"],});Gebruik de gegroepeerde naamruimten voor nieuwe Plugin-code:
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(...)
De gelijkwaardige platte methoden blijven beschikbaar als verouderde compatibiliteitsaliassen voor bestaande Plugins. Voeg geen nieuwe Plugin-code toe die rechtstreeks 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 of api.unscheduleSessionTurnsByTag aanroept.
scheduleSessionTurn(...) is een sessiegebonden gemakslaag boven op de Cron-planner van de Gateway. Cron beheert de timing en maakt het achtergrondtaakrecord wanneer de beurt wordt uitgevoerd; de Plugin SDK beperkt alleen de doelsessie, de door de Plugin beheerde naamgeving en de opschoning. Gebruik api.runtime.tasks.managedFlows binnen de geplande beurt wanneer het werk zelf duurzame Task Flow-status met meerdere stappen vereist.
De contracten scheiden de bevoegdheden bewust:
- Externe Plugins kunnen sessie-uitbreidingen, UI-descriptors, opdrachten, toolmetadata, injecties voor de volgende beurt en normale hooks beheren.
- Vertrouwd toolbeleid wordt vóór gewone
before_tool_call-hooks uitgevoerd en wordt door de host vertrouwd. Gebundeld beleid wordt eerst uitgevoerd; beleid van geïnstalleerde Plugins vereist expliciete inschakeling plus de bijbehorende lokale id's incontracts.trustedToolPoliciesen wordt daarna uitgevoerd in de laadvolgorde van de Plugins. Beleids-id's zijn afgebakend tot de registrerende Plugin. - Eigendom van gereserveerde opdrachten is uitsluitend voor gebundelde Plugins. Externe Plugins moeten hun eigen opdrachtnamen of aliassen gebruiken.
allowPromptInjection=falseschakelt promptwijzigende hooks uit, waaronderagent_turn_prepare,before_prompt_build,heartbeat_prompt_contribution, promptvelden van de verouderdebefore_agent_startenenqueueNextTurnInjection.
Voorbeelden van niet-Plan-gebruikers:
| Pluginarchetype | Gebruikte hooks |
|---|---|
| Goedkeuringsworkflow | Sessie-uitbreiding, voortzetting van opdrachten, injectie in de volgende beurt, UI-descriptor |
| Beleidscontrole voor budget/werkruimte | Beleid voor vertrouwde tools, toolmetadata, sessieprojectie |
| Levenscyclusmonitor op de achtergrond | Opschoning van de runtimelevenscyclus, abonnement op agentgebeurtenissen, eigendom/opschoning van de sessieplanner, bijdrage aan Heartbeat-prompt, UI-descriptor |
| Configuratie- of onboardingwizard | Sessie-uitbreiding, bereikgebonden opdrachten, descriptor voor de Control UI |
Wanneer middleware voor toolresultaten gebruiken
Meegeleverde Plugins en expliciet ingeschakelde geïnstalleerde Plugins met
overeenkomende manifestcontracten kunnen
api.registerAgentToolResultMiddleware(...) gebruiken wanneer ze een
toolresultaat na uitvoering en voordat de runtime dat resultaat aan het model
teruggeeft, moeten herschrijven. Dit is het vertrouwde, runtimeneutrale
koppelvlak voor asynchrone uitvoerreducers zoals tokenjuice.
Plugins moeten contracts.agentToolResultMiddleware declareren voor elke
beoogde runtime, bijvoorbeeld ["openclaw", "codex"]. Geïnstalleerde Plugins
zonder dat contract, of zonder expliciete inschakeling, kunnen deze middleware
niet registreren; gebruik de normale OpenClaw-Pluginhooks voor werk waarvoor
timing van toolresultaten vóór het model niet nodig is. Het oude
registratiepad voor uitbreidingsfactory's dat uitsluitend voor de ingebedde
runner bestemd was, is verwijderd.
Gateway-discoveryregistratie
Met api.registerGatewayDiscoveryService(...) kan een Plugin de actieve
Gateway adverteren via een lokaal discoverytransport zoals mDNS/Bonjour.
OpenClaw roept de service aan tijdens het opstarten van de Gateway wanneer
lokale discovery is ingeschakeld, geeft de huidige Gateway-poorten en
niet-geheime TXT-hintgegevens door en roept tijdens het afsluiten van de
Gateway de geretourneerde stop-handler aan.
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() }; },});Gateway-discoveryplugins mogen geadverteerde TXT-waarden niet als geheimen of authenticatie behandelen. Discovery is een routeringshint; Gateway-authenticatie en TLS-pinning blijven verantwoordelijk voor vertrouwen.
Metadata voor CLI-registratie
api.registerCli(registrar, opts?) accepteert twee soorten opdrachtmetadata:
commands: expliciete opdrachtnamen waarvan de registrar eigenaar isdescriptors: opdrachtdescriptors voor de parsefase, gebruikt voor CLI-help, routering en luie registratie van de Plugin-CLIparentPath: optioneel pad naar de bovenliggende opdracht voor geneste opdrachtgroepen, zoals["nodes"]
Geef voor functies voor gekoppelde Nodes de voorkeur aan
api.registerNodeCliFeature(registrar, opts?). Dit is een kleine wrapper rond
api.registerCli(..., { parentPath: ["nodes"] }) die opdrachten zoals
openclaw nodes canvas expliciet als Node-functies van een Plugin markeert.
Als een Plugin-opdracht lui geladen moet blijven in het normale hoofdpad van de
CLI, geef dan descriptors op die elke hoofdopdracht op het hoogste niveau
dekken die door die registrar wordt beschikbaar gesteld.
api.registerCli( async ({ program }) => { const { registerMatrixCli } = await import("./src/cli.js"); registerMatrixCli({ program }); }, { descriptors: [ { name: "matrix", description: "Matrix-accounts, verificatie, apparaten en profielstatus beheren", hasSubcommands: true, }, ], },);Geneste opdrachten ontvangen de gevonden bovenliggende opdracht als program:
api.registerCli( async ({ program }) => { const { registerNodesCanvasCommands } = await import("./src/cli.js"); registerNodesCanvasCommands(program); }, { parentPath: ["nodes"], descriptors: [ { name: "canvas", description: "Canvasinhoud vastleggen of renderen vanaf een gekoppelde Node", hasSubcommands: true, }, ], },);Gebruik alleen commands wanneer luie registratie van de hoofd-CLI niet nodig
is. Dat gretige compatibiliteitspad blijft ondersteund, maar installeert geen
door descriptors ondersteunde tijdelijke aanduidingen voor lui laden tijdens
de parsefase.
Registratie van CLI-backends
Met api.registerCliBackend(...) kan een Plugin eigenaar zijn van de
standaardconfiguratie voor een lokale AI-CLI-backend zoals claude-cli of
my-cli.
- De
idvan de backend wordt het providervoorvoegsel in modelverwijzingen zoalsmy-cli/gpt-5. - De
configvan de backend gebruikt dezelfde vorm alsagents.defaults.cliBackends.<id>. - De gebruikersconfiguratie heeft nog steeds voorrang. OpenClaw voegt
agents.defaults.cliBackends.<id>samen over de standaardwaarde van de Plugin voordat de CLI wordt uitgevoerd. - Gebruik
normalizeConfigwanneer een backend na het samenvoegen compatibiliteitsherschrijvingen nodig heeft (bijvoorbeeld voor het normaliseren van oude vlagvormen). - Gebruik
resolveExecutionArgsvoor verzoekgebonden herschrijvingen van argv die bij het CLI-dialect horen, zoals het omzetten van OpenClaw-denkniveaus naar een systeemeigen inspanningsvlag. De hook ontvangtctx.executionMode; gebruik"side-question"om systeemeigen isolatievlaggen van de backend toe te voegen voor tijdelijke/btw-aanroepen. Als die vlaggen systeemeigen tools betrouwbaar uitschakelen voor een CLI waarop ze anders altijd actief zijn, declareer dan ooksideQuestionToolMode: "disabled". - Backends die alle systeemeigen tools voor een specifieke uitvoering kunnen
uitschakelen, mogen
nativeToolMode: "selectable"declareren. Beperkte aanroepen geven een legectx.toolAvailability.native-tuple plus een exacte, door de host geïsoleerde MCP-toelatingslijst door;resolveExecutionArgsmoet beide afdwingen op de uiteindelijke argv voor een nieuwe of hervatte uitvoering. OpenClaw weigert standaard als de backend dit niet kan doen.
Zie voor een volledige ontwerphandleiding Plugins voor CLI-backends.
Exclusieve slots
| Methode | Wat deze registreert |
|---|---|
api.registerContextEngine(id, factory) |
Contextengine (één tegelijk actief). Levenscycluscallbacks ontvangen runtimeSettings wanneer de host model-/provider-/modusdiagnostiek kan leveren; oudere strikte engines worden opnieuw geprobeerd zonder die sleutel. |
api.registerMemoryCapability(capability) |
Geünificeerde geheugencapaciteit |
api.registerMemoryPromptSection(builder) |
Builder voor het geheugenpromptgedeelte |
api.registerMemoryFlushPlan(resolver) |
Resolver voor het geheugenflushplan |
api.registerMemoryRuntime(runtime) |
Adapter voor de geheugenruntime |
Verouderde adapters voor geheugen-embeddings
| Methode | Wat deze registreert |
|---|---|
api.registerMemoryEmbeddingProvider(adapter) |
Adapter voor geheugen-embeddings voor de actieve Plugin |
registerMemoryCapabilityis de voorkeurs-API voor exclusieve geheugenplugins.registerMemoryCapabilitykan ookpublicArtifacts.listArtifacts(...)beschikbaar stellen, zodat begeleidende Plugins geëxporteerde geheugenartefacten kunnen gebruiken viaopenclaw/plugin-sdk/memory-host-corein plaats van toegang te zoeken tot de privé-indeling van een specifieke geheugenplugin.registerMemoryPromptSection,registerMemoryFlushPlanenregisterMemoryRuntimezijn oudere, compatibele API's voor exclusieve geheugenplugins.MemoryFlushPlan.modelkan de flushbeurt vastzetten op een exacteprovider/model-verwijzing, zoalsollama/qwen3:8b, zonder de actieve fallbackketen over te nemen.registerMemoryEmbeddingProvideris verouderd. Nieuwe embeddingproviders moetenapi.registerEmbeddingProvider(...)encontracts.embeddingProvidersgebruiken.- Bestaande geheugenspecifieke providers blijven tijdens de migratieperiode werken, maar Plugin-inspectie rapporteert dit als compatibiliteitsschuld voor niet-meegeleverde Plugins.
Gebeurtenissen en levenscyclus
| Methode | Wat deze doet |
|---|---|
api.on(hookName, handler, opts?) |
Getypte levenscyclushook |
api.onConversationBindingResolved(handler) |
Callback voor gesprekskoppeling |
Zie Pluginhooks voor voorbeelden, algemene hooknamen en bewakingssemantiek.
Beslissingssemantiek van hooks
before_install is een levenscyclushook van de Plugin-runtime, niet het
installatiebeleidsoppervlak voor de operator. Gebruik security.installPolicy
wanneer een toestaan/blokkeren-beslissing zowel CLI- als door de Gateway
ondersteunde installatie- of updatepaden moet omvatten.
before_tool_call: het retourneren van{ block: true }is definitief. Zodra een handler dit instelt, worden handlers met een lagere prioriteit overgeslagen.before_tool_call: het retourneren van{ block: false }wordt behandeld als geen beslissing (hetzelfde alsblockweglaten), niet als een overschrijving.before_install: het retourneren van{ block: true }is definitief. Zodra een handler dit instelt, worden handlers met een lagere prioriteit overgeslagen.before_install: het retourneren van{ block: false }wordt behandeld als geen beslissing (hetzelfde alsblockweglaten), niet als een overschrijving.reply_dispatch: het retourneren van{ handled: true, ... }is definitief. Zodra een handler de verzending claimt, worden handlers met een lagere prioriteit en het standaardpad voor verzending naar het model overgeslagen.message_sending: het retourneren van{ cancel: true }is definitief. Zodra een handler dit instelt, worden handlers met een lagere prioriteit overgeslagen.message_sending: het retourneren van{ cancel: false }wordt behandeld als geen beslissing (hetzelfde alscancelweglaten), niet als een overschrijving.message_received: gebruik het getypeerde veldthreadIdwanneer u routering van inkomende threads/onderwerpen nodig hebt. Gebruikmetadatavoor kanaalspecifieke aanvullingen.message_sending: gebruik eerst de getypeerde routeringsveldenreplyToId/threadIdvoordat u terugvalt op kanaalspecifiekemetadata.gateway_start: gebruikctx.config,ctx.workspaceDirenctx.getCron?.()voor opstartstatus die door de Gateway wordt beheerd, in plaats van te vertrouwen op internegateway:startup-hooks. Cron wordt op dit moment mogelijk nog geladen.cron_reconciled: bouw na het opstarten of opnieuw laden van de planner een volledige externe Cron-projectie opnieuw op. Deze bevatreasonen de effectieve statusenabled, inclusiefenabled: false, terwijlctx.getCron?.()de exact gereconcilieerde planner retourneert. Geefctx.abortSignaldoor aan duurzame projectiewerkzaamheden; dit signaal wordt afgebroken wanneer die momentopname van de planner wordt vervangen of de Gateway wordt gesloten.cron_changed: observeer wijzigingen in de door de Gateway beheerde Cron-levenscyclus. Gebeurtenissenscheduledenremovedzijn reconciliatieaanwijzingen na het vastleggen, geen geordend deltalogboek. Bij een geplande gebeurtenis ontbreektevent.nextRunAtMswanneer de taak geen volgend wekmoment heeft; een verwijderde gebeurtenis bevat nog steeds de momentopname van de verwijderde taak.
Externe wekplanners moeten cron_changed-gebeurtenissen debouncen of samenvoegen
en vervolgens de volledige duurzame weergave opnieuw lezen uit de planner die
het laatst door cron_reconciled is vastgelegd. Neem de planner niet over uit
een cron_changed-context: een losgekoppelde aanwijzing van een oudere planner
kan overlappen met een latere herlaadbewerking.
Gebruik cron_reconciled als trigger voor een volledige momentopname van duurzame
status die wordt geladen bij het opstarten van de Gateway of bij vervanging van
de planner. Deze wordt niet opnieuw afgespeeld bij een hot-reload van uitsluitend
een Plugin. Observatiehandlers worden parallel uitgevoerd en fire-and-forget-
verzendingen kunnen overlappen, dus gebruikers mogen niet afhankelijk zijn van
de volgorde waarin gebeurtenissen worden voltooid. Houd OpenClaw als de
gezaghebbende bron voor controles op vervaldatums en uitvoering.
Zie Veilige externe Cron-projectie voor een single-flight-adapter met duurzame vervanging, opnieuw proberen/back-off en netjes afsluiten.
Velden van het API-object
| Veld | Type | Beschrijving |
|---|---|---|
api.id |
string |
Plugin-id |
api.name |
string |
Weergavenaam |
api.version |
string? |
Plugin-versie (optioneel) |
api.description |
string? |
Plugin-beschrijving (optioneel) |
api.source |
string |
Pad naar de Plugin-bron |
api.rootDir |
string? |
Hoofdmap van de Plugin (optioneel) |
api.config |
OpenClawConfig |
Huidige configuratiemomentopname (actieve momentopname van de runtime in het geheugen, indien beschikbaar) |
api.pluginConfig |
Record<string, unknown> |
Pluginspecifieke configuratie uit plugins.entries.<id>.config |
api.runtime |
PluginRuntime |
Runtime-helpers |
api.logger |
PluginLogger |
Logger met beperkt bereik (debug, info, warn, error) |
api.registrationMode |
PluginRegistrationMode |
Huidige laadmodus; "setup-runtime" is het lichte opstart-/installatievenster vóór de volledige invoer |
api.resolvePath(input) |
(string) => string |
Pad relatief ten opzichte van de hoofdmap van de Plugin omzetten |
Conventie voor interne modules
Gebruik binnen uw Plugin lokale barrel-bestanden voor interne imports:
my-plugin/ api.ts # Openbare exports voor externe gebruikers runtime-api.ts # Runtime-exports uitsluitend voor intern gebruik index.ts # Ingangspunt van de Plugin setup-entry.ts # Licht ingangspunt uitsluitend voor installatie (optioneel)Openbare oppervlakken van gebundelde Plugins die via een facade worden geladen
(api.ts, runtime-api.ts, index.ts, setup-entry.ts en vergelijkbare
openbare invoerbestanden) geven de voorkeur aan de actieve momentopname van de
runtimeconfiguratie wanneer OpenClaw al actief is. Als er nog geen
runtime-momentopname bestaat, vallen ze terug op het opgeloste
configuratiebestand op schijf. Verpakte facades van gebundelde Plugins moeten
worden geladen via de Plugin-facadeladers van OpenClaw; rechtstreekse imports
uit dist/extensions/... omzeilen de manifest- en runtime-sidecarcontroles die
verpakte installaties gebruiken voor code die eigendom is van een Plugin.
Provider-Plugins kunnen een beperkt lokaal contract-barrelbestand van de Plugin beschikbaar stellen wanneer een helper bewust providerspecifiek is en nog niet thuishoort in een generiek SDK-subpad. Gebundelde voorbeelden:
- Anthropic: openbare scheiding via
api.ts/contract-api.tsvoor Claude- helpers voor betaheaders enservice_tier-streams. @openclaw/openai-provider:api.tsexporteert providerbouwers, helpers voor standaardmodellen en bouwers voor realtimeproviders.@openclaw/openrouter-provider:api.tsexporteert de providerbouwer plus helpers voor onboarding/configuratie.
Gerelateerd
Opties voor definePluginEntry en defineChannelPluginEntry.
Volledige naslag voor de naamruimte api.runtime.
Verpakking, manifesten en configuratieschema's.
Testhulpmiddelen en lintregels.
Migreren vanaf verouderde oppervlakken.
Uitgebreide architectuur en het mogelijkhedenmodel.