Plugins

CLI-backend-Plugins bouwen

CLI-backendplugins laten OpenClaw een lokale AI-CLI aanroepen als tekstinferentiebackend. De backend verschijnt als een providerprefix in modelverwijzingen:

acme-cli/acme-large

Gebruik een CLI-backend wanneer de upstreamintegratie al als lokale opdracht beschikbaar is, wanneer de CLI lokale aanmeldstatus beheert, of wanneer de CLI een nuttige fallback is als API-providers niet beschikbaar zijn.

Wat de plugin beheert

Een CLI-backendplugin heeft drie contracten:

Contract Bestand Doel
Pakketinvoer package.json Wijst OpenClaw naar de runtime-module 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 discoverymetadata. Het voert de CLI niet uit en registreert geen runtimegedrag. Runtimegedrag start wanneer de plugininvoer api.registerCliBackend(...) aanroept.

Minimale backendplugin

  • Create package metadata

    {
      "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 meeleveren. Als je broninvoer ./src/index.ts is, voeg dan openclaw.runtimeExtensions toe die naar de gebouwde JavaScript-tegenhanger wijst. Zie Invoerpunten.

  • Declare backend ownership

    {
      "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 runtime-eigenaarschapslijst. Hiermee kan OpenClaw de plugin automatisch laden wanneer configuratie of modelselectie acme-cli/... vermeldt.

    setup.cliBackends is het descriptor-first setup-oppervlak. Voeg het toe wanneer modeldiscovery, onboarding of status de backend moet herkennen zonder pluginruntime te laden. Gebruik requiresRuntime: false alleen wanneer die statische descriptors voldoende zijn voor setup.

  • Register the backend

    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 cliBackends-invoer in het manifest. De geregistreerde config is alleen de standaard; gebruikersconfiguratie onder agents.defaults.cliBackends.acme-cli wordt er tijdens runtime overheen samengevoegd.

  • Configuratievorm

    CliBackendConfig beschrijft hoe OpenClaw de CLI moet starten en parsen:

    Veld Gebruik
    command Binaire naam of absoluut opdrachtpad
    args Basis-argv voor nieuwe runs
    resumeArgs Alternatieve argv voor hervatte sessies; ondersteunt {sessionId}
    output / resumeOutput Parser: json, jsonl of text
    input Prompttransport: arg of stdin
    modelArg Vlag die voor de model-id wordt gebruikt
    modelAliases Koppelt OpenClaw-model-id's aan CLI-native 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 Systeemprompttransport
    systemPromptWhen first, always of never
    imageArg / imageMode Ondersteuning voor afbeeldingspaden
    serialize Houd runs op dezelfde backend geordend
    reliability.watchdog Afstelling van time-out zonder uitvoer

    Geef de voorkeur aan de kleinste statische configuratie die bij de CLI past. Voeg plugincallbacks alleen toe voor gedrag dat echt bij de backend hoort.

    Geavanceerde backendhooks

    CliBackendPlugin kan ook definiëren:

    Hook Gebruik
    normalizeConfig(config, context) Herschrijf verouderde gebruikersconfiguratie na samenvoegen
    resolveExecutionArgs(ctx) Voeg aanvraaggebonden vlaggen toe, zoals denkintensiteit
    prepareExecution(ctx) Maak tijdelijke auth- of configuratiebruggen vóór het starten
    transformSystemPrompt(ctx) Pas een laatste CLI-specifieke systeemprompttransformatie toe
    textTransforms Bidirectionele prompt-/uitvoervervangingen
    defaultAuthProfileId Geef voorkeur aan een specifiek OpenClaw-auth-profiel
    authEpochMode Bepaal hoe authwijzigingen opgeslagen CLI-sessies ongeldig maken
    nativeToolMode Declareer of de CLI altijd ingeschakelde native tools heeft
    bundleMcp / bundleMcpMode Kies voor OpenClaw's loopback-MCP-toolbrug

    Houd deze hooks provider-eigendom. Voeg geen CLI-specifieke vertakkingen toe aan core wanneer een backendhook het gedrag kan uitdrukken.

    MCP-toolbrug

    CLI-backends ontvangen standaard geen OpenClaw-tools. Als de CLI een MCP-configuratie kan gebruiken, kies daar dan expliciet voor:

    return {
      id: "acme-cli",
      bundleMcp: true,
      bundleMcpMode: "codex-config-overrides",
      config: {
        command: "acme",
        args: ["chat", "--json"],
        output: "json",
      },
    };
    

    Ondersteunde brugmodi zijn:

    Modus Gebruik
    claude-config-file CLI's die een MCP-configuratiebestand accepteren
    codex-config-overrides CLI's die configuratie-overschrijvingen op argv accepteren
    gemini-system-settings CLI's die MCP-instellingen lezen uit hun systeeminstellingenmap

    Schakel de brug alleen in wanneer de CLI die daadwerkelijk kan gebruiken. Als de CLI een eigen ingebouwde toollaag heeft die niet kan worden uitgeschakeld, stel dan nativeToolMode: "always-on" in zodat OpenClaw gesloten kan falen wanneer een aanroeper geen native tools vereist.

    Gebruikersconfiguratie

    Gebruikers kunnen elke backendstandaard 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.5",
            fallbacks: ["acme-cli/large"],
          },
        },
      },
    }
    

    Documenteer de minimale overschrijving die gebruikers waarschijnlijk nodig hebben. Meestal is dat alleen command wanneer de binary buiten PATH staat.

    Verificatie

    Voor gebundelde plugins voeg je een gerichte test toe rond de builder en setupregistratie, en voer je daarna de gerichte testlane van de plugin uit:

    pnpm test extensions/acme-cli
    

    Voor lokale of geïnstalleerde plugins verifieer je discovery en één echte modelrun:

    openclaw plugins inspect acme-cli --runtime --json
    openclaw agent --message "reply exactly: backend ok" --model acme-cli/acme-large
    

    Als de backend afbeeldingen of MCP ondersteunt, voeg dan een live smoke toe die die paden met de echte CLI bewijst. Vertrouw niet op statische inspectie voor prompt-, afbeeldings-, MCP- of sessiehervattingsgedrag.

    Checklist

    OPENCLAW_DOCS_MARKER:calloutOpen:Q2hlY2s package.json heeft openclaw.extensions en gebouwde runtime-invoerpunten voor gepubliceerde pakketten OPENCLAW_DOCS_MARKER:calloutClose:

    OPENCLAW_DOCS_MARKER:calloutOpen:Q2hlY2s openclaw.plugin.json declareert cliBackends en intentionele activation.onStartup OPENCLAW_DOCS_MARKER:calloutClose:

    OPENCLAW_DOCS_MARKER:calloutOpen:Q2hlY2s setup.cliBackends is aanwezig wanneer setup/modeldiscovery de backend koud moet zien 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> winnen nog steeds OPENCLAW_DOCS_MARKER:calloutClose: