Plugins

Tworzenie pluginów backendu CLI

CLI backend plugins pozwalają OpenClaw wywoływać lokalne AI CLI jako backend wnioskowania tekstowego. Backend pojawia się jako prefiks dostawcy w referencjach modeli:

acme-cli/acme-large

Użyj backendu CLI, gdy integracja upstream jest już udostępniona jako lokalne polecenie, gdy CLI zarządza lokalnym stanem logowania albo gdy CLI jest użytecznym rozwiązaniem awaryjnym, jeśli dostawcy API są niedostępni.

Za co odpowiada plugin

Plugin backendu CLI ma trzy kontrakty:

Kontrakt Plik Cel
Wejście pakietu package.json Wskazuje OpenClaw moduł runtime pluginu
Własność manifestu openclaw.plugin.json Deklaruje identyfikator backendu przed załadowaniem runtime
Rejestracja runtime index.ts Wywołuje api.registerCliBackend(...) z domyślnymi poleceniami

Manifest to metadane wykrywania. Nie wykonuje CLI ani nie rejestruje zachowania runtime. Zachowanie runtime zaczyna się, gdy punkt wejścia pluginu wywoła api.registerCliBackend(...).

Minimalny plugin backendu

  • Utwórz metadane pakietu

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

    Opublikowane pakiety muszą zawierać zbudowane pliki runtime JavaScript. Jeśli wpis źródłowy to ./src/index.ts, dodaj openclaw.runtimeExtensions, które wskazuje zbudowany odpowiednik JavaScript. Zobacz Punkty wejścia.

  • Zadeklaruj własność backendu

    {
      "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 to lista własności runtime. Pozwala OpenClaw automatycznie ładować plugin, gdy konfiguracja lub wybór modelu wspomina acme-cli/....

    setup.cliBackends to powierzchnia konfiguracji oparta najpierw na deskryptorze. Dodaj ją, gdy wykrywanie modeli, onboarding lub status powinny rozpoznawać backend bez ładowania runtime pluginu. Używaj requiresRuntime: false tylko wtedy, gdy te statyczne deskryptory wystarczają do konfiguracji.

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

    Identyfikator backendu musi pasować do wpisu cliBackends w manifeście. Zarejestrowana config jest tylko wartością domyślną; konfiguracja użytkownika pod agents.defaults.cliBackends.acme-cli jest nakładana na nią w runtime.

  • Kształt konfiguracji

    CliBackendConfig opisuje, jak OpenClaw ma uruchamiać i analizować CLI:

    Pole Zastosowanie
    command Nazwa binarna lub bezwzględna ścieżka polecenia
    args Bazowe argv dla nowych uruchomień
    resumeArgs Alternatywne argv dla wznawianych sesji; obsługuje {sessionId}
    output / resumeOutput Parser: json, jsonl lub text
    input Transport promptu: arg lub stdin
    modelArg Flaga używana przed identyfikatorem modelu
    modelAliases Mapuje identyfikatory modeli OpenClaw na natywne identyfikatory CLI
    sessionArg / sessionArgs Jak przekazać identyfikator sesji
    sessionMode always, existing lub none
    sessionIdFields Pola JSON, które OpenClaw odczytuje z wyjścia CLI
    systemPromptArg / systemPromptFileArg Transport promptu systemowego
    systemPromptWhen first, always lub never
    imageArg / imageMode Obsługa ścieżek obrazów
    serialize Utrzymuje uporządkowanie uruchomień tego samego backendu
    reliability.watchdog Dostrajanie limitu czasu bez wyjścia

    Preferuj najmniejszą statyczną konfigurację, która pasuje do CLI. Dodawaj callbacki pluginu tylko dla zachowania, które rzeczywiście należy do backendu.

    Zaawansowane hooki backendu

    CliBackendPlugin może również definiować:

    Hook Zastosowanie
    normalizeConfig(config, context) Przepisuje starszą konfigurację użytkownika po scaleniu
    resolveExecutionArgs(ctx) Dodaje flagi zakresu żądania, takie jak wysiłek myślenia
    prepareExecution(ctx) Tworzy tymczasowe mosty uwierzytelniania lub konfiguracji przed uruchomieniem
    transformSystemPrompt(ctx) Stosuje końcową transformację promptu systemowego specyficzną dla CLI
    textTransforms Dwukierunkowe zamiany promptu/wyjścia
    defaultAuthProfileId Preferuje określony profil uwierzytelniania OpenClaw
    authEpochMode Decyduje, jak zmiany uwierzytelniania unieważniają zapisane sesje CLI
    nativeToolMode Deklaruje, czy CLI ma zawsze włączone narzędzia natywne
    bundleMcp / bundleMcpMode Włącza most narzędzi MCP loopback OpenClaw

    Te hooki powinny pozostawać własnością dostawcy. Nie dodawaj gałęzi specyficznych dla CLI do rdzenia, gdy hook backendu może wyrazić dane zachowanie.

    Most narzędzi MCP

    Backendy CLI domyślnie nie otrzymują narzędzi OpenClaw. Jeśli CLI potrafi użyć konfiguracji MCP, włącz to jawnie:

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

    Obsługiwane tryby mostu to:

    Tryb Zastosowanie
    claude-config-file CLI, które akceptują plik konfiguracji MCP
    codex-config-overrides CLI, które akceptują nadpisania konfiguracji w argv
    gemini-system-settings CLI, które odczytują ustawienia MCP z katalogu ustawień systemowych

    Włączaj most tylko wtedy, gdy CLI rzeczywiście potrafi go użyć. Jeśli CLI ma własną wbudowaną warstwę narzędzi, której nie można wyłączyć, ustaw nativeToolMode: "always-on", aby OpenClaw mógł bezpiecznie odmówić, gdy wywołujący wymaga braku narzędzi natywnych.

    Konfiguracja użytkownika

    Użytkownicy mogą nadpisać dowolną wartość domyślną backendu:

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

    Udokumentuj minimalne nadpisanie, którego użytkownicy prawdopodobnie będą potrzebować. Zwykle jest to tylko command, gdy plik binarny znajduje się poza PATH.

    Weryfikacja

    Dla dołączonych pluginów dodaj ukierunkowany test wokół buildera i rejestracji konfiguracji, a następnie uruchom ukierunkowaną ścieżkę testową pluginu:

    pnpm test extensions/acme-cli
    

    Dla lokalnych lub zainstalowanych pluginów zweryfikuj wykrywanie i jedno rzeczywiste uruchomienie modelu:

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

    Jeśli backend obsługuje obrazy lub MCP, dodaj live smoke potwierdzający te ścieżki z rzeczywistym CLI. Nie polegaj na statycznej inspekcji dla zachowania promptu, obrazu, MCP ani wznawiania sesji.

    Lista kontrolna

    OPENCLAW_DOCS_MARKER:calloutOpen:Q2hlY2s package.json ma openclaw.extensions i zbudowane wpisy runtime dla opublikowanych pakietów OPENCLAW_DOCS_MARKER:calloutClose:

    OPENCLAW_DOCS_MARKER:calloutOpen:Q2hlY2s openclaw.plugin.json deklaruje cliBackends i zamierzone activation.onStartup OPENCLAW_DOCS_MARKER:calloutClose:

    OPENCLAW_DOCS_MARKER:calloutOpen:Q2hlY2s setup.cliBackends jest obecne, gdy konfiguracja/wykrywanie modeli powinny widzieć backend na zimno OPENCLAW_DOCS_MARKER:calloutClose:

    OPENCLAW_DOCS_MARKER:calloutOpen:Q2hlY2s api.registerCliBackend(...) używa tego samego identyfikatora backendu co manifest OPENCLAW_DOCS_MARKER:calloutClose:

    OPENCLAW_DOCS_MARKER:calloutOpen:Q2hlY2s Nadpisania użytkownika pod agents.defaults.cliBackends.<id> nadal mają pierwszeństwo OPENCLAW_DOCS_MARKER:calloutClose: