Plugins
Creación de plugins de backend de CLI
Los plugins de backend CLI permiten que OpenClaw llame a una CLI de IA local como backend de inferencia de texto. El backend aparece como un prefijo de proveedor en las refs de modelo:
acme-cli/acme-large
Usa un backend CLI cuando la integración ascendente ya esté expuesta como un comando local, cuando la CLI controle el estado de inicio de sesión local, o cuando la CLI sea una alternativa útil si los proveedores de API no están disponibles.
Qué controla el plugin
Un plugin de backend CLI tiene tres contratos:
| Contrato | Archivo | Propósito |
|---|---|---|
| Entrada de paquete | package.json |
Apunta OpenClaw al módulo de runtime del plugin |
| Propiedad de manifiesto | openclaw.plugin.json |
Declara el id del backend antes de cargar el runtime |
| Registro de runtime | index.ts |
Llama a api.registerCliBackend(...) con valores predeterminados del comando |
El manifiesto es metadatos de descubrimiento. No ejecuta la CLI y no registra comportamiento de runtime. El comportamiento de runtime empieza cuando la entrada del plugin llama a api.registerCliBackend(...).
Plugin de backend mínimo
Crear metadatos del paquete
{
"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"
}
}
Los paquetes publicados deben incluir archivos JavaScript de runtime compilados. Si tu entrada de origen es ./src/index.ts, agrega openclaw.runtimeExtensions que apunte al par JavaScript compilado. Consulta Puntos de entrada.
Declarar la propiedad 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 es la lista de propiedad de runtime. Permite que OpenClaw cargue automáticamente el plugin cuando la configuración o la selección de modelo mencione acme-cli/....
setup.cliBackends es la superficie de configuración basada primero en descriptores. Agrégala cuando el descubrimiento de modelos, la incorporación o el estado deban reconocer el backend sin cargar el runtime del plugin. Usa requiresRuntime: false solo cuando esos descriptores estáticos basten para la configuración.
Registrar el 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());
},
});
El id del backend debe coincidir con la entrada cliBackends del manifiesto. La config registrada es solo el valor predeterminado; la configuración de usuario en agents.defaults.cliBackends.acme-cli se fusiona sobre ella en runtime.
Forma de la configuración
CliBackendConfig describe cómo OpenClaw debe iniciar y analizar la CLI:
| Campo | Uso |
|---|---|
command |
Nombre del binario o ruta absoluta del comando |
args |
argv base para ejecuciones nuevas |
resumeArgs |
argv alternativo para sesiones reanudadas; admite {sessionId} |
output / resumeOutput |
Analizador: json, jsonl o text |
input |
Transporte del prompt: arg o stdin |
modelArg |
Marca usada antes del id del modelo |
modelAliases |
Asigna ids de modelo de OpenClaw a ids nativos de la CLI |
sessionArg / sessionArgs |
Cómo pasar un id de sesión |
sessionMode |
always, existing o none |
sessionIdFields |
Campos JSON que OpenClaw lee de la salida de la CLI |
systemPromptArg / systemPromptFileArg |
Transporte del prompt del sistema |
systemPromptWhen |
first, always o never |
imageArg / imageMode |
Compatibilidad con rutas de imagen |
serialize |
Mantiene ordenadas las ejecuciones del mismo backend |
reliability.watchdog |
Ajuste de tiempo de espera sin salida |
Prefiere la configuración estática más pequeña que coincida con la CLI. Agrega callbacks del plugin solo para comportamientos que realmente pertenezcan al backend.
Hooks avanzados de backend
CliBackendPlugin también puede definir:
| Hook | Uso |
|---|---|
normalizeConfig(config, context) |
Reescribe configuración de usuario heredada tras la fusión |
resolveExecutionArgs(ctx) |
Agrega marcas con alcance de solicitud, como esfuerzo de razonamiento |
prepareExecution(ctx) |
Crea puentes temporales de autenticación o configuración antes del inicio |
transformSystemPrompt(ctx) |
Aplica una transformación final del prompt del sistema específica de la CLI |
textTransforms |
Reemplazos bidireccionales de prompt/salida |
defaultAuthProfileId |
Prefiere un perfil de autenticación específico de OpenClaw |
authEpochMode |
Decide cómo los cambios de autenticación invalidan sesiones CLI almacenadas |
nativeToolMode |
Declara si la CLI tiene herramientas nativas siempre activas |
bundleMcp / bundleMcpMode |
Opta por el puente de herramientas MCP de loopback de OpenClaw |
Mantén estos hooks bajo propiedad del proveedor. No agregues ramas específicas de CLI al núcleo cuando un hook de backend pueda expresar el comportamiento.
Puente de herramientas MCP
Los backends CLI no reciben herramientas de OpenClaw de forma predeterminada. Si la CLI puede consumir una configuración MCP, opta por ella explícitamente:
return {
id: "acme-cli",
bundleMcp: true,
bundleMcpMode: "codex-config-overrides",
config: {
command: "acme",
args: ["chat", "--json"],
output: "json",
},
};
Los modos de puente compatibles son:
| Modo | Uso |
|---|---|
claude-config-file |
CLI que aceptan un archivo de configuración MCP |
codex-config-overrides |
CLI que aceptan sobrescrituras de configuración en argv |
gemini-system-settings |
CLI que leen configuración MCP desde su directorio de configuración del sistema |
Activa el puente solo cuando la CLI pueda consumirlo realmente. Si la CLI tiene su propia capa de herramientas integrada que no puede desactivarse, define nativeToolMode: "always-on" para que OpenClaw pueda fallar en modo cerrado cuando un llamador requiera no usar herramientas nativas.
Configuración de usuario
Los usuarios pueden sobrescribir cualquier valor predeterminado 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 la sobrescritura mínima que los usuarios probablemente necesiten. Normalmente es solo command cuando el binario está fuera de PATH.
Verificación
Para plugins incluidos, agrega una prueba enfocada alrededor del constructor y el registro de configuración, y luego ejecuta el carril de pruebas dirigido del plugin:
pnpm test extensions/acme-cli
Para plugins locales o instalados, verifica el descubrimiento y una ejecución real de modelo:
openclaw plugins inspect acme-cli --runtime --json
openclaw agent --message "reply exactly: backend ok" --model acme-cli/acme-large
Si el backend admite imágenes o MCP, agrega una prueba smoke en vivo que demuestre esas rutas con la CLI real. No dependas de la inspección estática para el comportamiento de prompts, imágenes, MCP o reanudación de sesiones.
Lista de verificación
OPENCLAW_DOCS_MARKER:calloutOpen:Q2hlY2s
package.json tiene openclaw.extensions y entradas de runtime compiladas para paquetes publicados
OPENCLAW_DOCS_MARKER:calloutClose:
OPENCLAW_DOCS_MARKER:calloutOpen:Q2hlY2s
openclaw.plugin.json declara cliBackends y activation.onStartup intencional
OPENCLAW_DOCS_MARKER:calloutClose:
OPENCLAW_DOCS_MARKER:calloutOpen:Q2hlY2s
setup.cliBackends está presente cuando la configuración o el descubrimiento de modelos debe ver el backend en frío
OPENCLAW_DOCS_MARKER:calloutClose:
OPENCLAW_DOCS_MARKER:calloutOpen:Q2hlY2s
api.registerCliBackend(...) usa el mismo id de backend que el manifiesto
OPENCLAW_DOCS_MARKER:calloutClose:
OPENCLAW_DOCS_MARKER:calloutOpen:Q2hlY2s
Las sobrescrituras de usuario en agents.defaults.cliBackends.<id> siguen teniendo prioridad
OPENCLAW_DOCS_MARKER:calloutClose: