Plugins
CLI-Backend-Plugins erstellen
CLI-Backend-Plugins ermöglichen OpenClaw, eine lokale KI-CLI als Textinferenz-Backend aufzurufen. Das Backend erscheint als Provider-Präfix in Modellreferenzen:
acme-cli/acme-large
Verwenden Sie ein CLI-Backend, wenn die Upstream-Integration bereits als lokaler Befehl verfügbar ist, wenn die CLI den lokalen Anmeldestatus verwaltet oder wenn die CLI ein nützlicher Fallback ist, falls API-Provider nicht verfügbar sind.
Was das Plugin verwaltet
Ein CLI-Backend-Plugin hat drei Verträge:
| Vertrag | Datei | Zweck |
|---|---|---|
| Paketeinstieg | package.json |
Verweist OpenClaw auf das Laufzeitmodul des Plugins |
| Manifest-Zuständigkeit | openclaw.plugin.json |
Deklariert die Backend-ID, bevor die Laufzeit geladen wird |
| Laufzeitregistrierung | index.ts |
Ruft api.registerCliBackend(...) mit Befehlsvorgaben auf |
Das Manifest ist Discovery-Metadaten. Es führt die CLI nicht aus und registriert kein Laufzeitverhalten. Das Laufzeitverhalten beginnt, wenn der Plugin-Einstieg api.registerCliBackend(...) aufruft.
Minimales Backend-Plugin
Paketmetadaten erstellen
{
"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"
}
}
Veröffentlichte Pakete müssen gebaute JavaScript-Laufzeitdateien ausliefern. Wenn Ihr Quell-Einstieg ./src/index.ts ist, fügen Sie openclaw.runtimeExtensions hinzu, das auf das gebaute JavaScript-Peer verweist. Siehe Einstiegspunkte.
Backend-Zuständigkeit deklarieren
{
"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 ist die Liste der Laufzeit-Zuständigkeiten. Sie ermöglicht OpenClaw, das Plugin automatisch zu laden, wenn die Konfiguration oder Modellauswahl acme-cli/... erwähnt.
setup.cliBackends ist die deskriptorbasierte Setup-Oberfläche. Fügen Sie sie hinzu, wenn Modellerkennung, Onboarding oder Status das Backend erkennen sollen, ohne die Plugin-Laufzeit zu laden. Verwenden Sie requiresRuntime: false nur, wenn diese statischen Deskriptoren für das Setup ausreichen.
Das Backend registrieren
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());
},
});
Die Backend-ID muss mit dem Manifest-Eintrag cliBackends übereinstimmen. Die registrierte config ist nur die Vorgabe; die Benutzerkonfiguration unter agents.defaults.cliBackends.acme-cli wird zur Laufzeit darübergeführt.
Konfigurationsform
CliBackendConfig beschreibt, wie OpenClaw die CLI starten und parsen soll:
| Feld | Verwendung |
|---|---|
command |
Binärname oder absoluter Befehlspfad |
args |
Basis-argv für neue Ausführungen |
resumeArgs |
Alternatives argv für fortgesetzte Sitzungen; unterstützt {sessionId} |
output / resumeOutput |
Parser: json, jsonl oder text |
input |
Prompt-Transport: arg oder stdin |
modelArg |
Flag vor der Modell-ID |
modelAliases |
OpenClaw-Modell-IDs CLI-nativen IDs zuordnen |
sessionArg / sessionArgs |
Wie eine Sitzungs-ID übergeben wird |
sessionMode |
always, existing oder none |
sessionIdFields |
JSON-Felder, die OpenClaw aus der CLI-Ausgabe liest |
systemPromptArg / systemPromptFileArg |
System-Prompt-Transport |
systemPromptWhen |
first, always oder never |
imageArg / imageMode |
Unterstützung für Bildpfade |
serialize |
Ausführungen desselben Backends geordnet halten |
reliability.watchdog |
Abstimmung des Timeouts ohne Ausgabe |
Bevorzugen Sie die kleinste statische Konfiguration, die zur CLI passt. Fügen Sie Plugin-Callbacks nur für Verhalten hinzu, das wirklich zum Backend gehört.
Erweiterte Backend-Hooks
CliBackendPlugin kann außerdem Folgendes definieren:
| Hook | Verwendung |
|---|---|
normalizeConfig(config, context) |
Veraltete Benutzerkonfiguration nach dem Zusammenführen umschreiben |
resolveExecutionArgs(ctx) |
Anfragebezogene Flags wie Thinking-Aufwand hinzufügen |
prepareExecution(ctx) |
Temporäre Auth- oder Konfigurationsbrücken vor dem Start erstellen |
transformSystemPrompt(ctx) |
Eine letzte CLI-spezifische System-Prompt-Transformation anwenden |
textTransforms |
Bidirektionale Prompt-/Ausgabe-Ersetzungen |
defaultAuthProfileId |
Ein bestimmtes OpenClaw-Auth-Profil bevorzugen |
authEpochMode |
Festlegen, wie Auth-Änderungen gespeicherte CLI-Sitzungen ungültig machen |
nativeToolMode |
Deklarieren, ob die CLI immer aktive native Tools hat |
bundleMcp / bundleMcpMode |
In OpenClaws loopback-MCP-Tool-Bridge einsteigen |
Halten Sie diese Hooks Provider-eigen. Fügen Sie keine CLI-spezifischen Verzweigungen zum Core hinzu, wenn ein Backend-Hook das Verhalten ausdrücken kann.
MCP-Tool-Bridge
CLI-Backends erhalten OpenClaw-Tools standardmäßig nicht. Wenn die CLI eine MCP-Konfiguration nutzen kann, aktivieren Sie dies ausdrücklich:
return {
id: "acme-cli",
bundleMcp: true,
bundleMcpMode: "codex-config-overrides",
config: {
command: "acme",
args: ["chat", "--json"],
output: "json",
},
};
Unterstützte Bridge-Modi sind:
| Modus | Verwendung |
|---|---|
claude-config-file |
CLIs, die eine MCP-Konfigurationsdatei akzeptieren |
codex-config-overrides |
CLIs, die Konfigurations-Overrides auf argv akzeptieren |
gemini-system-settings |
CLIs, die MCP-Einstellungen aus ihrem System-Einstellungsverzeichnis lesen |
Aktivieren Sie die Bridge nur, wenn die CLI sie tatsächlich nutzen kann. Wenn die CLI eine eigene integrierte Tool-Schicht hat, die nicht deaktiviert werden kann, setzen Sie nativeToolMode: "always-on", damit OpenClaw geschlossen fehlschlagen kann, wenn ein Aufrufer keine nativen Tools verlangt.
Benutzerkonfiguration
Benutzer können jede Backend-Vorgabe überschreiben:
{
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"],
},
},
},
}
Dokumentieren Sie die minimale Überschreibung, die Benutzer voraussichtlich benötigen. In der Regel ist das nur command, wenn sich die Binärdatei außerhalb von PATH befindet.
Verifizierung
Fügen Sie für gebündelte Plugins einen fokussierten Test rund um den Builder und die Setup-Registrierung hinzu und führen Sie dann die gezielte Test-Lane des Plugins aus:
pnpm test extensions/acme-cli
Verifizieren Sie bei lokalen oder installierten Plugins die Discovery und einen echten Modelllauf:
openclaw plugins inspect acme-cli --runtime --json
openclaw agent --message "reply exactly: backend ok" --model acme-cli/acme-large
Wenn das Backend Bilder oder MCP unterstützt, fügen Sie einen Live-Smoke hinzu, der diese Pfade mit der echten CLI nachweist. Verlassen Sie sich bei Prompt-, Bild-, MCP- oder Sitzungsfortsetzungsverhalten nicht auf statische Inspektion.
Checkliste
OPENCLAW_DOCS_MARKER:calloutOpen:Q2hlY2s
package.json hat openclaw.extensions und gebaute Laufzeiteinträge für veröffentlichte Pakete
OPENCLAW_DOCS_MARKER:calloutClose:
OPENCLAW_DOCS_MARKER:calloutOpen:Q2hlY2s
openclaw.plugin.json deklariert cliBackends und bewusstes activation.onStartup
OPENCLAW_DOCS_MARKER:calloutClose:
OPENCLAW_DOCS_MARKER:calloutOpen:Q2hlY2s
setup.cliBackends ist vorhanden, wenn Setup/Modellerkennung das Backend kalt sehen soll
OPENCLAW_DOCS_MARKER:calloutClose:
OPENCLAW_DOCS_MARKER:calloutOpen:Q2hlY2s
api.registerCliBackend(...) verwendet dieselbe Backend-ID wie das Manifest
OPENCLAW_DOCS_MARKER:calloutClose:
OPENCLAW_DOCS_MARKER:calloutOpen:Q2hlY2s
Benutzer-Overrides unter agents.defaults.cliBackends.<id> gewinnen weiterhin
OPENCLAW_DOCS_MARKER:calloutClose: