Plugin SDK reference
Plugin-installatie en -configuratie
Referentie voor Plugin-packaging (package.json-metadata), manifests (openclaw.plugin.json), setup-ingangen en configuratieschema's.
Pakketmetadata
Je package.json heeft een openclaw-veld nodig dat het pluginsysteem vertelt wat je Plugin biedt:
Kanaalplugin
{ "name": "@myorg/openclaw-my-channel", "version": "1.0.0", "type": "module", "openclaw": { "extensions": ["./index.ts"], "setupEntry": "./setup-entry.ts", "channel": { "id": "my-channel", "label": "My Channel", "blurb": "Short description of the channel." } }}Providerplugin / ClawHub-basisconfiguratie
{ "name": "@myorg/openclaw-my-plugin", "version": "1.0.0", "type": "module", "dependencies": { "typebox": "1.1.39" }, "peerDependencies": { "openclaw": ">=2026.3.24-beta.2" }, "openclaw": { "extensions": ["./index.ts"], "compat": { "pluginApi": ">=2026.3.24-beta.2", "minGatewayVersion": "2026.3.24-beta.2" }, "build": { "openclawVersion": "2026.3.24-beta.2", "pluginSdkVersion": "2026.3.24-beta.2" } }}openclaw-velden
extensionsstring[]Ingangspuntbestanden (relatief aan de pakketroot). Geldige broningangen voor ontwikkeling in een workspace en Git-checkout.
runtimeExtensionsstring[]Gebouwde JavaScript-tegenhangers voor extensions, waaraan de voorkeur wordt gegeven wanneer OpenClaw een geïnstalleerd npm-pakket laadt. Zie SDK-ingangspunten voor de oplossingsvolgorde voor bron- en gebouwde bestanden.
setupEntrystringLichtgewicht ingang uitsluitend voor setup (optioneel).
runtimeSetupEntrystringGebouwde JavaScript-tegenhanger voor setupEntry. Vereist dat setupEntry ook is ingesteld.
pluginobject{ id, label }-terugvalidentiteit voor de Plugin, gebruikt wanneer een Plugin geen kanaal- of providermetadata heeft waaruit een id of label kan worden afgeleid.
channelobjectKanaalcatalogusmetadata voor setup, keuzelijsten, snelstart en statusweergaven.
installobjectInstallatieaanwijzingen: npmSpec, localPath, defaultChoice, minHostVersion, expectedIntegrity, allowInvalidConfigRecovery, requiredPlatformPackages.
startupobjectVlaggen voor opstartgedrag.
compatobjectpluginApi-versiebereik dat deze Plugin ondersteunt. Vereist voor externe publicaties op ClawHub.
openclaw.channel
openclaw.channel is lichtgewicht pakketmetadata voor kanaaldetectie en setupweergaven voordat de runtime wordt geladen.
| Veld | Type | Betekenis |
|---|---|---|
id |
string |
Canonieke kanaal-id. |
label |
string |
Primair kanaallabel. |
selectionLabel |
string |
Keuze-/setuplabel wanneer dit van label moet verschillen. |
detailLabel |
string |
Secundair detaillabel voor uitgebreidere kanaalcatalogi en statusweergaven. |
docsPath |
string |
Documentatiepad voor setup- en selectielinks. |
docsLabel |
string |
Alternatief label voor documentatielinks wanneer dit van de kanaal-id moet verschillen. |
blurb |
string |
Korte beschrijving voor onboarding/catalogus. |
order |
number |
Sorteervolgorde in kanaalcatalogi. |
aliases |
string[] |
Extra opzoekaliassen voor kanaalselectie. |
preferOver |
string[] |
Plugin-/kanaal-id's met lagere prioriteit waar dit kanaal boven moet staan. |
systemImage |
string |
Optionele pictogram-/systeemafbeeldingsnaam voor kanaalcatalogi in de gebruikersinterface. |
selectionDocsPrefix |
string |
Voorvoegseltekst vóór documentatielinks in selectieweergaven. |
selectionDocsOmitLabel |
boolean |
Toon het documentatiepad rechtstreeks in plaats van een gelabelde documentatielink in selectietekst. |
selectionExtras |
string[] |
Extra korte tekenreeksen die aan de selectietekst worden toegevoegd. |
markdownCapable |
boolean |
Markeert het kanaal als geschikt voor Markdown voor beslissingen over uitgaande opmaak. |
exposure |
object |
Zichtbaarheidsinstellingen voor het kanaal in setup, geconfigureerde lijsten en documentatieweergaven. |
quickstartAllowFrom |
boolean |
Neemt dit kanaal op in de standaard snelstartprocedure voor allowFrom-setup. |
forceAccountBinding |
boolean |
Vereist expliciete accountkoppeling, zelfs wanneer er maar één account bestaat. |
preferSessionLookupForAnnounceTarget |
boolean |
Geeft de voorkeur aan sessieopzoeking bij het bepalen van aankondigingsdoelen voor dit kanaal. |
Voorbeeld:
{ "openclaw": { "channel": { "id": "my-channel", "label": "My Channel", "selectionLabel": "My Channel (self-hosted)", "detailLabel": "My Channel Bot", "docsPath": "/channels/my-channel", "docsLabel": "my-channel", "blurb": "Webhook-based self-hosted chat integration.", "order": 80, "aliases": ["mc"], "preferOver": ["my-channel-legacy"], "selectionDocsPrefix": "Guide:", "selectionExtras": ["Markdown"], "markdownCapable": true, "exposure": { "configured": true, "setup": true, "docs": true }, "quickstartAllowFrom": true } }}exposure ondersteunt:
configured: neem het kanaal op in geconfigureerde lijsten en statusachtige weergavensetup: neem het kanaal op in interactieve setup-/configuratiekeuzelijstendocs: markeer het kanaal als publiek zichtbaar in documentatie- en navigatieweergaven
openclaw.install
openclaw.install is pakketmetadata, geen manifestmetadata.
| Veld | Type | Betekenis |
|---|---|---|
clawhubSpec |
string |
Canonieke ClawHub-specificatie voor installatie/update en onboardingprocedures voor installatie op aanvraag. |
npmSpec |
string |
Canonieke npm-specificatie voor terugvalprocedures bij installatie/update. |
localPath |
string |
Lokaal ontwikkelpad of gebundeld installatiepad. |
defaultChoice |
"clawhub" | "npm" | "local" |
Voorkeursinstallatiebron wanneer meerdere bronnen beschikbaar zijn. |
minHostVersion |
string |
Minimaal ondersteunde OpenClaw-versie, >=x.y.z of >=x.y.z-prerelease. |
expectedIntegrity |
string |
Verwachte integriteitstekenreeks van de npm-distributie, doorgaans sha512-..., voor vastgezette installaties. |
allowInvalidConfigRecovery |
boolean |
Laat herinstallatieprocedures voor gebundelde plugins herstellen van specifieke fouten door verouderde configuratie. |
requiredPlatformPackages |
string[] |
Vereiste platformspecifieke npm-aliassen die tijdens de npm-installatie worden geverifieerd. |
Onboardinggedrag
Interactieve onboarding gebruikt openclaw.install voor installatie-op-aanvraagweergaven: als je Plugin providerverificatiekeuzes of metadata voor kanaalsetup/-catalogus beschikbaar stelt voordat de runtime wordt geladen, kan onboarding vragen om installatie via ClawHub, npm of een lokale bron, de Plugin installeren of inschakelen en daarna de geselecteerde procedure voortzetten. ClawHub-keuzes gebruiken clawhubSpec en krijgen de voorkeur wanneer deze aanwezig is; npm-keuzes vereisen vertrouwde catalogusmetadata met een register-npmSpec (exacte versies en expectedIntegrity zijn optionele vastzettingen die bij installatie/update worden afgedwongen wanneer ze zijn ingesteld). Bewaar "wat moet worden weergegeven" in openclaw.plugin.json en "hoe het moet worden geïnstalleerd" in package.json.
Handhaving van minHostVersion
Als minHostVersion is ingesteld, wordt deze zowel bij installatie als bij het laden van niet-gebundelde manifestregisters afgedwongen. Oudere hosts slaan externe plugins over; ongeldige versietekenreeksen worden geweigerd. Van gebundelde bronplugins wordt aangenomen dat ze dezelfde versie hebben als de host-checkout.
Vastgezette npm-installaties
Bewaar voor vastgezette npm-installaties de exacte versie in npmSpec en voeg de verwachte artefactintegriteit toe:
{ "openclaw": { "install": { "npmSpec": "@wecom/wecom-openclaw-plugin@1.2.3", "expectedIntegrity": "sha512-REPLACE_WITH_NPM_DIST_INTEGRITY", "defaultChoice": "npm" } }}Bereik van allowInvalidConfigRecovery
allowInvalidConfigRecovery is geen algemene omzeiling voor defecte configuraties. Het is uitsluitend bedoeld voor beperkt herstel van gebundelde plugins, zodat herinstallatie/setup bekende restanten van upgrades kan herstellen, zoals een ontbrekend pad naar een gebundelde Plugin of een verouderde channels.<id>-ingang voor diezelfde Plugin. Als de configuratie om andere redenen defect is, mislukt de installatie nog steeds veilig en krijgt de beheerder de instructie om openclaw doctor --fix uit te voeren.
Uitgesteld volledig laden
Kanaalplugins kunnen uitgesteld laden inschakelen met:
{ "openclaw": { "extensions": ["./index.ts"], "setupEntry": "./setup-entry.ts", "startup": { "deferConfiguredChannelFullLoadUntilAfterListen": true } }}Wanneer dit is ingeschakeld, laadt OpenClaw tijdens de opstartfase vóór het luisteren alleen setupEntry, zelfs voor reeds geconfigureerde kanalen. De volledige ingang wordt geladen nadat de Gateway begint te luisteren.
Als je setup-/volledige ingang Gateway-RPC-methoden registreert, plaats deze dan onder een Plugin-specifiek voorvoegsel. Gereserveerde beheerdersnaamruimten van de kern (config.*, exec.approvals.*, wizard.*, update.*) blijven eigendom van de kern en worden altijd genormaliseerd naar operator.admin.
Pluginmanifest
Elke native Plugin moet een openclaw.plugin.json in de hoofdmap van het pakket bevatten. OpenClaw gebruikt dit om de configuratie te valideren zonder Plugincode uit te voeren.
{ "id": "my-plugin", "name": "My Plugin", "description": "Adds My Plugin capabilities to OpenClaw", "configSchema": { "type": "object", "additionalProperties": false, "properties": { "webhookSecret": { "type": "string", "description": "Webhook verification secret" } } }}Voeg voor kanaal-Plugins channels toe (en voor provider-Plugins providers):
{ "id": "my-channel", "channels": ["my-channel"], "configSchema": { "type": "object", "additionalProperties": false, "properties": {} }}Zelfs Plugins zonder configuratie moeten een schema bevatten. Een leeg schema is geldig:
{ "id": "my-plugin", "configSchema": { "type": "object", "additionalProperties": false }}Zie Pluginmanifest voor de volledige schemareferentie.
Publiceren op ClawHub
Skills en Pluginpakketten gebruiken afzonderlijke ClawHub-publicatieopdrachten. Gebruik voor Pluginpakketten de pakketspecifieke opdracht:
clawhub package publish your-org/your-plugin --dry-runclawhub package publish your-org/your-pluginSetup-ingangspunt
setup-entry.ts is een lichtgewicht alternatief voor index.ts dat OpenClaw laadt wanneer alleen setup-oppervlakken nodig zijn (onboarding, configuratieherstel, inspectie van uitgeschakelde kanalen):
// setup-entry.ts export default defineSetupPluginEntry(myChannelPlugin);Hierdoor wordt tijdens setupstromen geen zware runtimecode geladen (cryptografische bibliotheken, CLI-registraties, achtergrondservices).
Gebundelde workspace-kanalen die setup-veilige exports in nevenmodules bewaren, kunnen defineBundledChannelSetupEntry(...) uit openclaw/plugin-sdk/channel-entry-contract gebruiken in plaats van defineSetupPluginEntry(...). Dat gebundelde contract ondersteunt ook een optionele runtime-export, zodat runtimebedrading tijdens de setup lichtgewicht en expliciet kan blijven.
When OpenClaw uses setupEntry instead of the full entry
- Het kanaal is uitgeschakeld, maar heeft setup- of onboarding-oppervlakken nodig.
- Het kanaal is ingeschakeld, maar niet geconfigureerd.
- Uitgesteld laden is ingeschakeld (
deferConfiguredChannelFullLoadUntilAfterListen).
What setupEntry must register
- Het kanaal-Pluginobject (via
defineSetupPluginEntry). - Alle HTTP-routes die nodig zijn voordat de Gateway begint te luisteren.
- Alle Gateway-methoden die tijdens het opstarten nodig zijn.
Deze Gateway-methoden voor het opstarten moeten nog steeds gereserveerde beheerdersnaamruimten van de kern vermijden, zoals config.* of update.*.
What setupEntry should NOT include
- CLI-registraties.
- Achtergrondservices.
- Zware runtime-imports (cryptografie, SDK's).
- Gateway-methoden die pas na het opstarten nodig zijn.
Gerichte imports van setuphelpers
Geef voor intensief gebruikte paden die alleen voor setup dienen de voorkeur aan de gerichte setuphelperkoppelingen boven de bredere overkoepelende plugin-sdk/setup-koppeling wanneer je slechts een deel van het setup-oppervlak nodig hebt:
| Importpad | Gebruik hiervoor | Belangrijkste exports |
|---|---|---|
plugin-sdk/setup-runtime |
runtimehelpers voor setup die beschikbaar blijven in setupEntry / uitgesteld kanaalopstarten |
createSetupTranslator, createPatchedAccountSetupAdapter, createEnvPatchedAccountSetupAdapter, createSetupInputPresenceValidator, noteChannelLookupFailure, noteChannelLookupSummary, promptResolvedAllowFrom, splitSetupEntries, createAllowlistSetupWizardProxy, createDelegatedSetupWizardProxy |
plugin-sdk/setup-adapter-runtime |
verouderde compatibiliteitsalias; gebruik plugin-sdk/setup-runtime |
createEnvPatchedAccountSetupAdapter |
plugin-sdk/setup-tools |
CLI-, archief- en documentatiehelpers voor setup/installatie | formatCliCommand, detectBinary, extractArchive, resolveBrewExecutable, formatDocsLink, CONFIG_DIR |
Gebruik de bredere plugin-sdk/setup-koppeling wanneer je de volledige gedeelde set setupgereedschappen wilt, inclusief helpers voor configuratiepatches zoals moveSingleAccountChannelSectionToDefaultAccount(...).
Gebruik createSetupTranslator(...) voor vaste tekst in de setupwizard. Deze volgt de landinstelling van de CLI-wizard (OPENCLAW_LOCALE, daarna de systeemvariabelen voor de landinstelling) en valt terug op Engels. Bewaar Pluginspecifieke setuptekst in code die eigendom is van de Plugin en gebruik gedeelde catalogussleutels alleen voor algemene setuplabels, statustekst en setuptekst van officiële gebundelde Plugins.
De adapters voor setup-patches blijven bij import veilig voor intensief gebruikte paden. Het opzoeken van het gebundelde contractoppervlak voor promotie van één account gebeurt lui, zodat het importeren van plugin-sdk/setup-runtime de detectie van gebundelde contractoppervlakken niet voortijdig laadt voordat de adapter daadwerkelijk wordt gebruikt.
Kanaalgestuurde promotie van één account
Wanneer een kanaal wordt bijgewerkt van een configuratie met één account op het hoogste niveau naar channels.<id>.accounts.*, verplaatst het standaard gedeelde gedrag gepromoveerde accountgebonden waarden naar accounts.default.
Gebundelde kanalen kunnen die promotie beperken of overschrijven via hun setupcontractoppervlak:
singleAccountKeysToMove: aanvullende sleutels op het hoogste niveau die naar het gepromoveerde account moeten worden verplaatstnamedAccountPromotionKeys: wanneer benoemde accounts al bestaan, worden alleen deze sleutels naar het gepromoveerde account verplaatst; gedeelde beleids- en afleveringssleutels blijven in de kanaalhoofdstructuurresolveSingleAccountPromotionTarget(...): kies welk bestaand account de gepromoveerde waarden ontvangt
Configuratieschema
De Pluginconfiguratie wordt gevalideerd aan de hand van het JSON Schema in je manifest. Gebruikers configureren Plugins via:
{ plugins: { entries: { "my-plugin": { config: { webhookSecret: "abc123", }, }, }, },}Je Plugin ontvangt deze configuratie tijdens de registratie als api.pluginConfig.
Gebruik voor kanaalspecifieke configuratie in plaats daarvan de sectie voor kanaalconfiguratie:
{ channels: { "my-channel": { token: "bot-token", allowFrom: ["user1", "user2"], }, },}Kanaalconfiguratieschema's bouwen
Gebruik buildChannelConfigSchema om een Zod-schema om te zetten in de ChannelConfigSchema-wrapper die wordt gebruikt door configuratieartefacten die eigendom zijn van Plugins:
const accountSchema = z.object({ token: z.string().optional(), allowFrom: z.array(z.string()).optional(), accounts: z.object({}).catchall(z.any()).optional(), defaultAccount: z.string().optional(),}); const configSchema = buildChannelConfigSchema(accountSchema);Als je het contract al opstelt als JSON Schema of TypeBox, gebruik dan de directe helper zodat OpenClaw de conversie van Zod naar JSON Schema op metadatapaden kan overslaan:
const configSchema = buildJsonChannelConfigSchema( Type.Object({ token: Type.Optional(Type.String()), allowFrom: Type.Optional(Type.Array(Type.String())), }),);Voor Plugins van derden blijft het contract voor zelden gebruikte paden het Pluginmanifest: neem het gegenereerde JSON Schema over in openclaw.plugin.json#channelConfigs, zodat configuratieschema-, setup- en UI-oppervlakken channels.<id> kunnen inspecteren zonder runtimecode te laden.
Setupwizards
Kanaal-Plugins kunnen interactieve setupwizards aanbieden voor openclaw onboard. De wizard is een ChannelSetupWizard-object op de ChannelPlugin:
const setupWizard: ChannelSetupWizard = { channel: "my-channel", status: { configuredLabel: "Connected", unconfiguredLabel: "Not configured", resolveConfigured: ({ cfg }) => Boolean((cfg.channels as any)?.["my-channel"]?.token), }, credentials: [ { inputKey: "token", providerHint: "my-channel", credentialLabel: "Bot token", preferredEnvVar: "MY_CHANNEL_BOT_TOKEN", envPrompt: "Use MY_CHANNEL_BOT_TOKEN from environment?", keepPrompt: "Keep current token?", inputPrompt: "Enter your bot token:", inspect: ({ cfg, accountId }) => { const token = (cfg.channels as any)?.["my-channel"]?.token; return { accountConfigured: Boolean(token), hasConfiguredValue: Boolean(token), }; }, }, ],};ChannelSetupWizard ondersteunt ook textInputs, dmPolicy, allowFrom, groupAccess, prepare, finalize en meer. Zie src/setup-core.ts van de Discord-Plugin voor een volledig gebundeld voorbeeld.
Shared allowFrom prompts
Geef voor prompts voor DM-toestaanlijsten die alleen de standaardstroom note -> prompt -> parse -> merge -> patch nodig hebben de voorkeur aan de gedeelde setuphelpers uit openclaw/plugin-sdk/setup: createPromptParsedAllowFromForAccount(...), createTopLevelChannelParsedAllowFromPrompt(...) en createNestedChannelParsedAllowFromPrompt(...).
Standard channel setup status
Geef voor statusblokken van kanaalsetup die alleen verschillen in labels, scores en optionele extra regels de voorkeur aan createStandardChannelSetupStatus(...) uit openclaw/plugin-sdk/setup, in plaats van in elke Plugin handmatig hetzelfde status-object te maken.
Optional channel setup surface
Gebruik voor optionele setup-oppervlakken die alleen in bepaalde contexten moeten verschijnen createOptionalChannelSetupSurface uit openclaw/plugin-sdk/channel-setup:
import { createOptionalChannelSetupSurface } from "openclaw/plugin-sdk/channel-setup"; const setupSurface = createOptionalChannelSetupSurface({ channel: "my-channel", label: "My Channel", npmSpec: "@myorg/openclaw-my-channel", docsPath: "/channels/my-channel",});// Returns { setupAdapter, setupWizard }plugin-sdk/channel-setup stelt ook de lager-niveau-bouwfuncties createOptionalChannelSetupAdapter(...) en createOptionalChannelSetupWizard(...) beschikbaar wanneer je slechts één helft van dat optionele installatieoppervlak nodig hebt.
De gegenereerde optionele adapter/wizard weigert echte configuratiewijzigingen standaard veilig. Deze hergebruikt één bericht dat installatie vereist voor validateInput, applyAccountConfig en finalize, en voegt een documentatielink toe wanneer docsPath is ingesteld.
Installatiehelpers met binaire ondersteuning
Geef voor installatie-UI's met binaire ondersteuning de voorkeur aan de gedeelde gedelegeerde helpers in plaats van dezelfde lijmcode voor binaire bestanden/statussen naar elk kanaal te kopiëren:
createDetectedBinaryStatus(...)voor statusblokken die alleen verschillen in labels, hints, scores en detectie van binaire bestandencreateCliPathTextInput(...)voor tekstinvoer op basis van padencreateDelegatedSetupWizardStatusResolvers(...),createDelegatedPrepare(...),createDelegatedFinalize(...)encreateDelegatedResolveConfigured(...)wanneersetupEntryindien nodig moet doorsturen naar een uitgebreidere volledige wizardcreateDelegatedTextInputShouldPrompt(...)wanneersetupEntryalleen een beslissing voortextInputs[*].shouldPrompthoeft te delegeren
Publiceren en installeren
Externe plugins: publiceer naar ClawHub en installeer vervolgens:
npm
openclaw plugins install @myorg/openclaw-my-pluginKale pakketspecificaties worden tijdens de overgang bij het starten vanuit npm geïnstalleerd, tenzij de naam overeenkomt met de id van een gebundelde of officiële plugin; in dat geval gebruikt OpenClaw in plaats daarvan die lokale/officiële kopie. Gebruik clawhub:, npm:, git: of npm-pack: voor een deterministische bronselectie — zie Plugins beheren.
Alleen ClawHub
openclaw plugins install clawhub:@myorg/openclaw-my-pluginnpm-pakketspecificatie
Gebruik npm wanneer een pakket nog niet naar ClawHub is verplaatst, of wanneer u tijdens de migratie een rechtstreeks npm-installatiepad nodig hebt:
openclaw plugins install npm:@myorg/openclaw-my-pluginPlugins in de repository: plaats deze onder de werkruimteboom voor gebundelde plugins; ze worden tijdens het bouwen automatisch gedetecteerd.
Metadata van gebundelde pakketten is expliciet en wordt bij het starten van de Gateway niet afgeleid uit gebouwde JavaScript. Runtimeafhankelijkheden horen thuis in het pluginpakket dat ze beheert; het starten van een verpakte OpenClaw-installatie repareert of spiegelt nooit plugin-afhankelijkheden.
Gerelateerd
- Plugins bouwen — stapsgewijze introductiegids
- Pluginmanifest — volledige referentie voor het manifestschema
- SDK-ingangspunten —
definePluginEntryendefineChannelPluginEntry