Building plugins
CLI-backendplugins bouwen
CLI-backendplugins stellen OpenClaw in staat een lokale AI-CLI aan te roepen als backend voor tekstinferentie. De backend verschijnt als providerprefix in modelverwijzingen:
acme-cli/acme-largeGebruik een CLI-backend wanneer de bovenliggende integratie al beschikbaar is als een lokale opdracht, wanneer de CLI de lokale aanmeldstatus beheert, of als terugvaloptie wanneer API- providers niet beschikbaar zijn.
Wat de plugin beheert
Een CLI-backendplugin heeft drie contracten:
| Contract | Bestand | Doel |
|---|---|---|
| Pakketingang | package.json |
Verwijst OpenClaw naar de runtimemodule van de plugin |
| Manifesteigenaarschap | openclaw.plugin.json |
Declareert de backend-id voordat de runtime wordt geladen |
| Runtimeregistratie | index.ts |
Roept api.registerCliBackend(...) aan met opdrachtstandaarden |
Het manifest is detectiemetadata: het voert de CLI niet uit en registreert geen
runtimegedrag. Runtimegedrag begint wanneer de plugingang
api.registerCliBackend(...) aanroept.
Minimale backendplugin
Pakketmetadata maken
{ "name": "@acme/openclaw-acme-cli", "version": "1.0.0", "type": "module", "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" } }, "dependencies": { "openclaw": "^2026.3.24" }, "devDependencies": { "typescript": "^5.9.0" }}Gepubliceerde pakketten moeten gebouwde JavaScript-runtimebestanden bevatten. Als je broningang
./src/index.ts is, voeg dan openclaw.runtimeExtensions toe die naar de
gebouwde JavaScript-tegenhanger verwijst. Zie Ingangspunten.
Backendeigenaarschap declareren
{ "id": "acme-cli", "name": "Acme CLI", "description": "Run Acme's local AI CLI through OpenClaw", "cliBackends": ["acme-cli"], "setup": { "cliBackends": ["acme-cli"], "requiresRuntime": false }, "activation": { "onStartup": false }, "configSchema": { "type": "object", "additionalProperties": false }}cliBackends is de lijst met runtime-eigenaarschap; hiermee kan OpenClaw de
plugin automatisch laden wanneer configuratie of modelselectie acme-cli/... vermeldt.
setup.cliBackends is het descriptorgerichte installatieoppervlak. Voeg dit toe wanneer
modeldetectie, onboarding of status de backend moet herkennen
zonder de pluginruntime te laden. Gebruik requiresRuntime: false alleen wanneer
die statische descriptors voldoende zijn voor de installatie.
De backend registreren
import { definePluginEntry } from "openclaw/plugin-sdk/plugin-entry";import { CLI_FRESH_WATCHDOG_DEFAULTS, CLI_RESUME_WATCHDOG_DEFAULTS, type CliBackendPlugin,} from "openclaw/plugin-sdk/cli-backend"; function buildAcmeCliBackend(): CliBackendPlugin { return { id: "acme-cli", liveTest: { defaultModelRef: "acme-cli/acme-large", defaultImageProbe: false, defaultMcpProbe: false, docker: { npmPackage: "@acme/acme-cli", binaryName: "acme", }, }, config: { command: "acme", args: ["chat", "--json"], output: "json", input: "stdin", modelArg: "--model", sessionArg: "--session", sessionMode: "existing", sessionIdFields: ["session_id", "conversation_id"], systemPromptFileArg: "--system-file", systemPromptWhen: "first", imageArg: "--image", imageMode: "repeat", reliability: { watchdog: { fresh: { ...CLI_FRESH_WATCHDOG_DEFAULTS }, resume: { ...CLI_RESUME_WATCHDOG_DEFAULTS }, }, }, serialize: true, }, };} export default definePluginEntry({ id: "acme-cli", name: "Acme CLI", description: "Run Acme's local AI CLI through OpenClaw", register(api) { api.registerCliBackend(buildAcmeCliBackend()); },});De backend-id moet overeenkomen met de vermelding in cliBackends van het manifest. De
geregistreerde config is alleen de standaard; gebruikersconfiguratie onder
agents.defaults.cliBackends.acme-cli wordt er tijdens runtime overheen samengevoegd.
Configuratiestructuur
CliBackendConfig beschrijft hoe OpenClaw de CLI moet starten en parseren:
| Veld | Gebruik |
|---|---|
command |
Naam van het binaire bestand of absoluut opdrachtpad |
args |
Basis-argv voor nieuwe uitvoeringen |
resumeArgs |
Alternatieve argv voor hervatte sessies; ondersteunt {sessionId} |
output / resumeOutput |
Parser: json, jsonl of text |
jsonlDialect |
JSONL-gebeurtenisdialect: claude-stream-json of gemini-stream-json |
liveSession |
Modus voor een langlopend CLI-proces (claude-stdio) |
input |
Prompttransport: arg of stdin |
maxPromptArgChars |
Maximale promptlengte voor de modus arg voordat wordt teruggevallen op stdin |
env / clearEnv |
Extra omgevingsvariabelen om in te voegen, of namen om vóór het starten te verwijderen |
modelArg |
Vlag die vóór de model-id wordt gebruikt |
modelAliases |
Wijst OpenClaw-model-id's toe aan CLI-eigen id's |
sessionArg / sessionArgs |
Hoe een sessie-id wordt doorgegeven |
sessionMode |
always, existing of none |
sessionIdFields |
JSON-velden die OpenClaw uit CLI-uitvoer leest |
systemPromptArg / systemPromptFileArg |
Transport van de systeemprompt |
systemPromptFileConfigArg / systemPromptFileConfigKey |
Transport voor configuratieoverschrijving van een systeempromptbestand (bijvoorbeeld -c) |
systemPromptMode |
append of replace |
systemPromptWhen |
first, always of never |
imageArg / imageMode |
Vlag voor afbeeldingspaden en hoe meerdere afbeeldingen worden doorgegeven (repeat of list) |
imagePathScope |
Waar klaargezette afbeeldingsbestanden vóór overdracht staan: temp of workspace |
serialize |
Houd uitvoeringen met dezelfde backend geordend |
reseedFromRawTranscriptWhenUncompacted |
Schakel begrensd opnieuw vullen vanuit het onbewerkte transcript vóór Compaction in voor veilige sessieherinitialisaties |
reliability.outputLimits |
Maximaal aantal behouden onbewerkte JSONL-tekens/-regels voor één live CLI-beurt (backends met livesessies) |
reliability.watchdog |
Afstemming van time-outs zonder uitvoer, afzonderlijk voor nieuwe en hervatte uitvoeringen |
Geef de voorkeur aan de kleinste statische configuratie die bij de CLI past. Voeg plugincallbacks alleen toe voor gedrag dat daadwerkelijk bij de backend hoort.
Geavanceerde backendhooks
CliBackendPlugin kan ook het volgende definiëren:
| Hook | Gebruik |
|---|---|
normalizeConfig(config, context) |
Herschrijf verouderde gebruikersconfiguratie na samenvoeging |
resolveExecutionArgs(ctx) |
Voeg aanvraaggebonden vlaggen toe, zoals denkinspanning of isolatie van nevenvragen |
prepareExecution(ctx) |
Maak vóór het starten tijdelijke authenticatie- of configuratiebruggen |
transformSystemPrompt(ctx) |
Pas een laatste CLI-specifieke transformatie van de systeemprompt toe |
textTransforms |
Tweerichtingsvervangingen voor prompts/uitvoer |
defaultAuthProfileId |
Geef de voorkeur aan een specifiek OpenClaw-authenticatieprofiel |
authEpochMode |
Bepaal hoe authenticatiewijzigingen opgeslagen CLI-sessies ongeldig maken |
nativeToolMode |
Declareer of systeemeigen tools afwezig, altijd ingeschakeld of door de host selecteerbaar zijn |
sideQuestionToolMode |
Declareer uitgeschakelde systeemeigen tools voor nevenvragen via /btw |
bundleMcp / bundleMcpMode |
Schakel de local loopback-MCP-toolbrug van OpenClaw in |
ownsNativeCompaction |
De backend beheert zijn eigen Compaction - OpenClaw stelt deze uit |
runtimeArtifact |
Bind een scriptstarter aan de volledige meegeleverde pakketboom |
Houd deze hooks onder beheer van de provider. Voeg geen CLI-specifieke vertakkingen toe aan de kern wanneer een backendhook het gedrag kan uitdrukken.
runtimeArtifact wordt door de plugin beheerd en kan niet door de gebruiker worden overschreven. Het wordt
alleen geraadpleegd wanneer een live inferentiebeurt geverifieerde installatiebevoegdheid aanmaakt of opnieuw valideert;
normale CLI-uitvoeringen vereisen dit niet. Een backend zonder deze declaratie kan geen
geverifieerde CLI-installatiebevoegdheid aanmaken. Een declaratie bundled-package-tree benoemt
de exacte eigenaar van package.json en vereist dat het pakketingangspunt de
opdracht is. OpenClaw hasht de begrensde, volledige geïnstalleerde pakketboom, inclusief
geneste afhankelijkheden, en weigert standaard bij omleidende symbolische koppelingen,
starters buiten het gedeclareerde pakket, vereiste externe afhankelijkheidsdeclaraties,
te grote bomen en onbekende scripts. Declareer dit alleen wanneer die
boom de volledige inferentie-implementatie bevat; optionele toolintegraties
maken een externe implementatiegraaf niet veilig.
Als dezelfde backend ook een zelfstandig systeemeigen uitvoerbaar bestand levert, vermeld dan de
canonieke basisnamen in nativeExecutableNames. Andere systeemeigen opdrachten blijven
niet-geverifieerd, zelfs wanneer een gebruiker de backendopdracht overschrijft.
ctx.executionMode is "agent" voor normale beurten en "side-question" voor
tijdelijke /btw-aanroepen. Gebruik dit wanneer de CLI andere eenmalige vlaggen nodig heeft,
zoals voor het uitschakelen van native tools, sessiepersistentie of hervattingsgedrag voor
BTW. Als een backend normaal nativeToolMode: "always-on" heeft, maar de argv voor
zijvragen deze tools betrouwbaar uitschakelt, stel dan ook
sideQuestionToolMode: "disabled" in; anders weigert OpenClaw veilig wanneer BTW
een CLI-uitvoering zonder tools vereist.
Stel nativeToolMode: "selectable" alleen in wanneer resolveExecutionArgs
elke backend-native tool voor een afzonderlijke uitvoering kan uitschakelen. Voor deze beperkte uitvoeringen
is ctx.toolAvailability.native een lege tuple en
is ctx.toolAvailability.mcp de exacte, van de host geïsoleerde MCP-toelatingslijst. De hook
moet conflicterende toolvlaggen vervangen en argv retourneren die beide waarden afdwingt;
OpenClaw roept de hook eenmaal aan met de uiteindelijke argv voor een nieuwe of hervatte sessie en weigert veilig wanneer
de backend de beperking niet kan afdwingen. MCP-namen in deze context mogen alleen
automatisch worden goedgekeurd omdat de host de gegenereerde MCP-configuratie al heeft
beperkt tot die servers en tools.
ownsNativeCompaction: OpenClaw-compactie uitschakelen
Als uw backend een agent uitvoert die zijn eigen transcript compacteert, stel dan
ownsNativeCompaction: true in, zodat de beveiligende samenvatter van OpenClaw nooit
op zijn sessies wordt uitgevoerd: de CLI-compactielevenscyclus voert geen bewerking uit en de
beurt gaat verder. claude-cli declareert dit omdat Claude Code intern compacteert
zonder harness-eindpunt. Sessies met een native harness, zoals Codex,
blijven in plaats daarvan naar het compactie-eindpunt van hun harness worden gerouteerd.
Declareer dit alleen wanneer aan alle volgende voorwaarden is voldaan, anders kan een uitgestelde sessie die het budget overschrijdt boven het budget blijven of verouderd raken (OpenClaw herstelt deze niet langer):
- de backend compacteert of begrenst zijn eigen transcript betrouwbaar wanneer het venster bijna vol is;
- de backend bewaart een hervatbare sessie, zodat de gecompacteerde toestand tussen beurten behouden blijft
(bijvoorbeeld
--resume/--session-id); - het is geen compactiesessie met een native harness: sessies met een overeenkomende
agentHarnessIdworden in plaats daarvan naar het harness-eindpunt gerouteerd.
MCP-toolbrug
CLI-backends ontvangen standaard geen OpenClaw-tools. Als de CLI een MCP-configuratie kan gebruiken, schakel dit dan expliciet in:
return { id: "acme-cli", bundleMcp: true, bundleMcpMode: "codex-config-overrides", config: { command: "acme", args: ["chat", "--json"], output: "json", },};Ondersteunde brugmodi:
| Modus | Gebruik |
|---|---|
claude-config-file |
CLI's die een MCP-configuratiebestand accepteren |
codex-config-overrides |
CLI's die configuratieoverschrijvingen in argv accepteren |
gemini-system-settings |
CLI's die MCP-instellingen uit hun map met systeeminstellingen lezen |
Schakel de brug alleen in wanneer de CLI deze daadwerkelijk kan gebruiken. Als de CLI
een eigen ingebouwde toollaag heeft die niet kan worden uitgeschakeld, stel dan nativeToolMode: "always-on" in, zodat OpenClaw veilig kan weigeren wanneer een aanroeper vereist dat er geen native
tools zijn. Als alle native tools per uitvoering kunnen worden uitgeschakeld, gebruikt u "selectable" met het
hierboven beschreven resolveExecutionArgs-contract.
Gebruikersconfiguratie
Gebruikers kunnen elke standaardwaarde van een backend overschrijven:
{ agents: { defaults: { cliBackends: { "acme-cli": { command: "/opt/acme/bin/acme", args: ["chat", "--json", "--profile", "work"], modelAliases: { large: "acme-large-2026", }, }, }, model: { primary: "openai/gpt-5.6-sol", fallbacks: ["acme-cli/large"], }, }, },}Documenteer de minimale overschrijving die gebruikers waarschijnlijk nodig hebben, doorgaans alleen
command wanneer het binaire bestand zich buiten PATH bevindt.
Verificatie
Voeg voor gebundelde plugins een gerichte test toe voor de builder en setupregistratie en voer vervolgens de gerichte testreeks van de Plugin uit:
pnpm test extensions/acme-cliControleer voor lokale of geïnstalleerde plugins de detectie en één echte modeluitvoering:
openclaw plugins inspect acme-cli --runtime --jsonopenclaw agent --message "reply exactly: backend ok" --model acme-cli/acme-largeAls de backend afbeeldingen of MCP ondersteunt, voeg dan een live-rooktest toe die deze paden met de echte CLI bewijst. Vertrouw niet op statische inspectie voor prompt-, afbeeldings-, MCP- of sessiehervattingsgedrag.
Controlelijst
OPENCLAW_DOCS_MARKER:calloutOpen:Q2hlY2s
package.json bevat openclaw.extensions en gebouwde runtimevermeldingen voor gepubliceerde pakketten
OPENCLAW_DOCS_MARKER:calloutClose:
OPENCLAW_DOCS_MARKER:calloutOpen:Q2hlY2s
openclaw.plugin.json declareert cliBackends en een doelbewuste activation.onStartup
OPENCLAW_DOCS_MARKER:calloutClose:
OPENCLAW_DOCS_MARKER:calloutOpen:Q2hlY2s
setup.cliBackends is aanwezig wanneer setup/modeldetectie de backend koud moet kunnen vinden
OPENCLAW_DOCS_MARKER:calloutClose:
OPENCLAW_DOCS_MARKER:calloutOpen:Q2hlY2s
api.registerCliBackend(...) gebruikt dezelfde backend-id als het manifest
OPENCLAW_DOCS_MARKER:calloutClose:
OPENCLAW_DOCS_MARKER:calloutOpen:Q2hlY2s
Gebruikersoverschrijvingen onder agents.defaults.cliBackends.<id> blijven voorrang houden
OPENCLAW_DOCS_MARKER:calloutClose: