Aller au contenu

Créer des plugins de backend CLI

Les plugins de backend CLI permettent à OpenClaw d’appeler un CLI IA local en tant que backend d’inférence de texte. Le backend apparaît comme un préfixe de provider dans les références de modèle :

acme-cli/acme-large

Utilisez un backend CLI lorsque l’intégration en amont est déjà exposée en tant que commande locale, lorsque le CLI gère l’état de connexion locale, ou lorsque le CLI constitue un repli utile si les providers d’API sont indisponibles.

Un plugin de backend CLI possède trois contrats :

ContratFichierObjectif
Point d’entrée du packagepackage.jsonPointe OpenClaw vers le module runtime du plugin
Propriété du manifesteopenclaw.plugin.jsonDéclare l’identifiant du backend avant le chargement du runtime
Enregistrement du runtimeindex.tsAppelle api.registerCliBackend(...) avec les valeurs par défaut de la commande

Le manifeste contient les métadonnées de découverte. Il n’exécute pas le CLI et n’enregistre pas le comportement du runtime. Le comportement du runtime commence lorsque le point d’entrée du plugin appelle api.registerCliBackend(...).

  1. Créer les métadonnées du 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"
    }
    }

    Les packages publiés doivent inclure les fichiers d’exécution JavaScript construits. Si votre point d’entrée source est ./src/index.ts, ajoutez openclaw.runtimeExtensions qui pointe vers le fichier JavaScript construit. Voir Points d’entrée.

  2. Déclarer la propriété du 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 est la liste de propriété d’exécution. Elle permet à OpenClaw de charger automatiquement le plugin lorsque la configuration ou la sélection de model mentionne acme-cli/....

    setup.cliBackends est la surface de configuration basée sur les descripteurs. Ajoutez-la lorsque la découverte de model, l’onboarding ou l’état doivent reconnaître le backend sans charger l’exécution du plugin. Utilisez requiresRuntime: false uniquement lorsque ces descripteurs statiques suffisent pour la configuration.

  3. Enregistrer le 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’identifiant du backend doit correspondre à l’entrée cliBackends du manifeste. La config enregistrée n’est que la valeur par défaut ; la configuration utilisateur sous agents.defaults.cliBackends.acme-cli est fusionnée avec celle-ci lors de l’exécution.

CliBackendConfig décrit comment OpenClaw doit lancer et analyser le CLI :

ChampUsage
commandNom du binaire ou chemin absolu de la commande
argsArgv de base pour les nouvelles exécutions
resumeArgsArgv alternatif pour les sessions reprises ; prend en charge {sessionId}
output / resumeOutputAnalyseur : json, jsonl ou text
inputTransport de prompt : arg ou stdin
modelArgOption utilisée avant l’identifiant du model
modelAliasesFaire correspondre les identifiants de model OpenClaw aux identifiants natifs du CLI
sessionArg / sessionArgsComment passer un id de session
sessionModealways, existing ou none
sessionIdFieldsChamps JSON que OpenClaw lit depuis la sortie CLI
systemPromptArg / systemPromptFileArgTransport du prompt système
systemPromptWhenfirst, always ou never
imageArg / imageModeSupport du chemin d’image
serializeGarder les exécutions du même backend ordonnées
reliability.watchdogAjustement du délai sans sortie

Privilégiez la plus petite configuration statique correspondant au CLI. Ajoutez des rappels de plugin uniquement pour les comportements appartenant vraiment au backend.

CliBackendPlugin peut également définir :

HookUtilisation
normalizeConfig(config, context)Réécrire la configuration utilisateur héritée après fusion
resolveExecutionArgs(ctx)Ajouter des drapeaux liés à la requête tels que l’effort de réflexion
prepareExecution(ctx)Créer des ponts d’auth ou de configuration temporaires avant le lancement
transformSystemPrompt(ctx)Appliquer une transformation finale du prompt système spécifique au CLI
textTransformsRemplacements bidirectionnels de prompt/sortie
defaultAuthProfileIdPrivilégier un profil d’auth OpenClaw spécifique
authEpochModeDécider comment les changements d’auth invalident les sessions stockées CLI
nativeToolModeDéclarer si le CLI possède des outils natifs toujours actifs
bundleMcp / bundleMcpModeActiver le pont d’outil MCP de boucle de retour OpenClaw

Gardez ces hooks sous la propriété du provider. N’ajoutez pas de branches spécifiques au CLI dans le cœur lorsqu’un hook de backend peut exprimer le comportement.

Les backends CLI ne reçoivent pas les outils OpenClaw par défaut. Si la CLI peut consommer une configuration MCP, optez explicitement pour :

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

Les modes de pont pris en charge sont :

ModeUtilisation
claude-config-fileCLIs qui acceptent un fichier de configuration MCP
codex-config-overridesCLIs qui acceptent des redéfinitions de configuration sur argv
gemini-system-settingsCLIs qui lisent les paramètres MCP depuis leur répertoire de paramètres système

N’activez le pont que lorsque la CLI peut réellement le consommer. Si la CLI possède sa propre couche d’outils intégrée qui ne peut pas être désactivée, définissez nativeToolMode: "always-on" pour qu’OpenClaw puisse échouer de manière fermée lorsqu’un appelant n’exige aucun outil natif.

Les utilisateurs peuvent remplacer toute valeur par défaut du 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"],
},
},
},
}

Documentez la redéfinition minimale dont les utilisateurs sont susceptibles d’avoir besoin. Habituellement, il ne s’agit que de command lorsque le binaire est en dehors de PATH.

Pour les plugins groupés, ajoutez un test ciblé autour du générateur et de l’inscription du configuration, puis exécutez la voie de test ciblée du plugin :

Fenêtre de terminal
pnpm test extensions/acme-cli

Pour les plugins locaux ou installés, vérifiez la découverte et une exécution réelle de model :

Fenêtre de terminal
openclaw plugins inspect acme-cli --runtime --json
openclaw agent --message "reply exactly: backend ok" --model acme-cli/acme-large

Si le backend prend en charge les images ou MCP, ajoutez un test de fumée en direct qui prouve ces chemins avec la CLI réelle. Ne vous fiez pas à l’inspection statique pour le prompt, l’image, MCP, ou le comportement de reprise de session.