Plugins

Creazione di Plugin backend per CLI

I plugin backend CLI consentono a OpenClaw di chiamare una CLI AI locale come backend di inferenza testuale. Il backend appare come prefisso provider nei riferimenti modello:

acme-cli/acme-large

Usa un backend CLI quando l'integrazione upstream è già esposta come comando locale, quando la CLI gestisce lo stato di login locale, oppure quando la CLI è un fallback utile se i provider API non sono disponibili.

Cosa gestisce il plugin

Un plugin backend CLI ha tre contratti:

Contratto File Scopo
Entry del package package.json Punta OpenClaw al modulo runtime del plugin
Proprietà manifest openclaw.plugin.json Dichiara l'id backend prima del caricamento del runtime
Registrazione runtime index.ts Chiama api.registerCliBackend(...) con i default comando

Il manifest è metadato di discovery. Non esegue la CLI e non registra comportamenti runtime. Il comportamento runtime inizia quando l'entry del plugin chiama api.registerCliBackend(...).

Plugin backend minimale

  • Crea i metadati del package

    {
      "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"
      }
    }
    

    I package pubblicati devono includere file runtime JavaScript compilati. Se la tua entry sorgente è ./src/index.ts, aggiungi openclaw.runtimeExtensions che punta al peer JavaScript compilato. Vedi Entry point.

  • Dichiara la proprietà del backend

    {
      "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 è l'elenco di proprietà runtime. Consente a OpenClaw di caricare automaticamente il plugin quando la configurazione o la selezione del modello menziona acme-cli/....

    setup.cliBackends è la superficie di setup descriptor-first. Aggiungila quando discovery dei modelli, onboarding o stato devono riconoscere il backend senza caricare il runtime del plugin. Usa requiresRuntime: false solo quando quei descrittori statici sono sufficienti per il setup.

  • Registra il 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());
      },
    });
    

    L'id backend deve corrispondere alla voce cliBackends del manifest. La config registrata è solo il default; la configurazione utente sotto agents.defaults.cliBackends.acme-cli viene unita sopra di essa a runtime.

  • Forma della configurazione

    CliBackendConfig descrive come OpenClaw deve avviare e analizzare la CLI:

    Campo Uso
    command Nome binario o percorso comando assoluto
    args Argv base per esecuzioni nuove
    resumeArgs Argv alternativo per sessioni riprese; supporta {sessionId}
    output / resumeOutput Parser: json, jsonl o text
    input Trasporto prompt: arg o stdin
    modelArg Flag usato prima dell'id modello
    modelAliases Mappa gli id modello OpenClaw agli id nativi della CLI
    sessionArg / sessionArgs Come passare un id sessione
    sessionMode always, existing o none
    sessionIdFields Campi JSON che OpenClaw legge dall'output della CLI
    systemPromptArg / systemPromptFileArg Trasporto del prompt di sistema
    systemPromptWhen first, always o never
    imageArg / imageMode Supporto percorso immagine
    serialize Mantiene ordinate le esecuzioni dello stesso backend
    reliability.watchdog Regolazione timeout senza output

    Preferisci la configurazione statica più piccola che corrisponde alla CLI. Aggiungi callback del plugin solo per comportamenti che appartengono davvero al backend.

    Hook backend avanzati

    CliBackendPlugin può anche definire:

    Hook Uso
    normalizeConfig(config, context) Riscrive la configurazione utente legacy dopo il merge
    resolveExecutionArgs(ctx) Aggiunge flag con ambito richiesta come il thinking effort
    prepareExecution(ctx) Crea bridge temporanei di auth o configurazione prima dell'avvio
    transformSystemPrompt(ctx) Applica una trasformazione finale del prompt di sistema specifica della CLI
    textTransforms Sostituzioni bidirezionali prompt/output
    defaultAuthProfileId Preferisce un profilo auth OpenClaw specifico
    authEpochMode Decide come le modifiche auth invalidano le sessioni CLI archiviate
    nativeToolMode Dichiara se la CLI ha strumenti nativi sempre attivi
    bundleMcp / bundleMcpMode Abilita il bridge tool MCP loopback di OpenClaw

    Mantieni questi hook di proprietà del provider. Non aggiungere branch specifici della CLI al core quando un hook backend può esprimere il comportamento.

    Bridge tool MCP

    I backend CLI non ricevono i tool OpenClaw per impostazione predefinita. Se la CLI può consumare una configurazione MCP, abilitala esplicitamente:

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

    Le modalità bridge supportate sono:

    Modalità Uso
    claude-config-file CLI che accettano un file di configurazione MCP
    codex-config-overrides CLI che accettano override di configurazione su argv
    gemini-system-settings CLI che leggono impostazioni MCP dalla propria directory impostazioni di sistema

    Abilita il bridge solo quando la CLI può effettivamente consumarlo. Se la CLI ha un proprio layer tool integrato che non può essere disabilitato, imposta nativeToolMode: "always-on" così OpenClaw può fallire chiuso quando un chiamante richiede nessun tool nativo.

    Configurazione utente

    Gli utenti possono sovrascrivere qualsiasi default del backend:

    {
      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"],
          },
        },
      },
    }
    

    Documenta l'override minimo di cui gli utenti avranno probabilmente bisogno. Di solito è solo command quando il binario è fuori da PATH.

    Verifica

    Per i plugin bundled, aggiungi un test mirato intorno al builder e alla registrazione setup, quindi esegui la lane di test mirata del plugin:

    pnpm test extensions/acme-cli
    

    Per plugin locali o installati, verifica discovery e un'esecuzione reale del modello:

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

    Se il backend supporta immagini o MCP, aggiungi uno smoke live che provi quei percorsi con la CLI reale. Non affidarti all'ispezione statica per prompt, immagine, MCP o comportamento di ripresa sessione.

    Checklist

    OPENCLAW_DOCS_MARKER:calloutOpen:Q2hlY2s package.json ha openclaw.extensions e entry runtime compilate per i package pubblicati OPENCLAW_DOCS_MARKER:calloutClose:

    OPENCLAW_DOCS_MARKER:calloutOpen:Q2hlY2s openclaw.plugin.json dichiara cliBackends e activation.onStartup intenzionale OPENCLAW_DOCS_MARKER:calloutClose:

    OPENCLAW_DOCS_MARKER:calloutOpen:Q2hlY2s setup.cliBackends è presente quando setup/discovery dei modelli deve vedere il backend a freddo OPENCLAW_DOCS_MARKER:calloutClose:

    OPENCLAW_DOCS_MARKER:calloutOpen:Q2hlY2s api.registerCliBackend(...) usa lo stesso id backend del manifest OPENCLAW_DOCS_MARKER:calloutClose:

    OPENCLAW_DOCS_MARKER:calloutOpen:Q2hlY2s Gli override utente sotto agents.defaults.cliBackends.<id> continuano a prevalere OPENCLAW_DOCS_MARKER:calloutClose: