Backends de CLI (runtime de respaldo)
OpenClaw puede ejecutar CLI locales de IA como respaldo solo de texto cuando los proveedores de API no funcionan, están limitados por tasa o se comportan mal temporalmente. Esto es intencionalmente conservador:- Las herramientas de OpenClaw no se inyectan directamente, pero los backends con
bundleMcp: true(el valor predeterminado de Claude CLI) pueden recibir herramientas del gateway mediante un puente MCP loopback. - Streaming JSONL (Claude CLI usa
--output-format stream-jsoncon--include-partial-messages; los prompts se envían por stdin). - Se admiten sesiones (para que los turnos de seguimiento mantengan la coherencia).
- Las imágenes pueden pasarse si la CLI acepta rutas de imágenes.
Inicio rápido para principiantes
Puedes usar Claude CLI sin ninguna configuración (el plugin incluido de Anthropic registra un backend predeterminado):agents.defaults.cliBackends.
Usarlo como respaldo
Agrega un backend de CLI a tu lista de respaldo para que solo se ejecute cuando fallen los modelos principales:- Si usas
agents.defaults.models(allowlist), debes incluirclaude-cli/.... - Si el proveedor principal falla (autenticación, límites de tasa, tiempos de espera), OpenClaw intentará a continuación con el backend de CLI.
- El backend incluido de Claude CLI sigue aceptando alias más cortos como
claude-cli/opus,claude-cli/opus-4.6oclaude-cli/sonnet, pero la documentación y los ejemplos de configuración usan las referencias canónicasclaude-cli/claude-*.
Resumen de configuración
Todos los backends de CLI se encuentran en:claude-cli, my-cli).
El id del proveedor se convierte en el lado izquierdo de tu referencia de modelo:
Ejemplo de configuración
Cómo funciona
- Selecciona un backend según el prefijo del proveedor (
claude-cli/...). - Construye un system prompt usando el mismo prompt + contexto de espacio de trabajo de OpenClaw.
- Ejecuta la CLI con un id de sesión (si se admite) para que el historial se mantenga consistente.
- Analiza la salida (JSON o texto sin formato) y devuelve el texto final.
- Conserva los ids de sesión por backend, para que los seguimientos reutilicen la misma sesión de CLI.
Sesiones
- Si la CLI admite sesiones, define
sessionArg(por ejemplo--session-id) osessionArgs(marcador{sessionId}) cuando el ID deba insertarse en varios indicadores. - Si la CLI usa un subcomando de reanudación con indicadores distintos, define
resumeArgs(reemplazaargsal reanudar) y opcionalmenteresumeOutput(para reanudaciones no JSON). sessionMode:always: siempre envía un id de sesión (un UUID nuevo si no hay ninguno almacenado).existing: solo envía un id de sesión si ya se almacenó antes.none: nunca envía un id de sesión.
serialize: truemantiene ordenadas las ejecuciones del mismo carril.- La mayoría de las CLI serializan en un carril por proveedor.
claude-clies más estrecho: las ejecuciones reanudadas se serializan por id de sesión de Claude, y las ejecuciones nuevas se serializan por ruta del espacio de trabajo. Los espacios de trabajo independientes pueden ejecutarse en paralelo.- OpenClaw descarta la reutilización de sesiones almacenadas de CLI cuando cambia el estado de autenticación del backend, incluidos nuevo inicio de sesión, rotación de token o un cambio en la credencial del perfil de autenticación.
Imágenes (paso directo)
Si tu CLI acepta rutas de imágenes, defineimageArg:
imageArg está definido, esas
rutas se pasan como argumentos de CLI. Si falta imageArg, OpenClaw agrega las
rutas de archivo al prompt (inyección de ruta), lo cual es suficiente para CLI que cargan
automáticamente archivos locales a partir de rutas simples (comportamiento de Claude CLI).
Entradas / salidas
output: "json"(predeterminado) intenta analizar JSON y extraer texto + id de sesión.- Para la salida JSON de Gemini CLI, OpenClaw lee el texto de respuesta desde
responsey el uso desdestatscuandousagefalta o está vacío. output: "jsonl"analiza flujos JSONL (por ejemplo Claude CLIstream-jsony Codex CLI--json) y extrae el mensaje final del agente junto con identificadores de sesión cuando están presentes.output: "text"trata stdout como la respuesta final.
input: "arg"(predeterminado) pasa el prompt como último argumento de la CLI.input: "stdin"envía el prompt por stdin.- Si el prompt es muy largo y
maxPromptArgCharsestá definido, se usa stdin.
Valores predeterminados (propiedad del plugin)
El plugin incluido de Anthropic registra un valor predeterminado paraclaude-cli:
command: "claude"args: ["-p", "--output-format", "stream-json", "--include-partial-messages", "--verbose", "--permission-mode", "bypassPermissions"]resumeArgs: ["-p", "--output-format", "stream-json", "--include-partial-messages", "--verbose", "--permission-mode", "bypassPermissions", "--resume", "{sessionId}"]output: "jsonl"input: "stdin"modelArg: "--model"systemPromptArg: "--append-system-prompt"sessionArg: "--session-id"systemPromptWhen: "first"sessionMode: "always"
codex-cli:
command: "codex"args: ["exec","--json","--color","never","--sandbox","workspace-write","--skip-git-repo-check"]resumeArgs: ["exec","resume","{sessionId}","--color","never","--sandbox","workspace-write","--skip-git-repo-check"]output: "jsonl"resumeOutput: "text"modelArg: "--model"imageArg: "--image"sessionMode: "existing"
google-gemini-cli:
command: "gemini"args: ["--prompt", "--output-format", "json"]resumeArgs: ["--resume", "{sessionId}", "--prompt", "--output-format", "json"]modelArg: "--model"sessionMode: "existing"sessionIdFields: ["session_id", "sessionId"]
gemini en PATH (brew install gemini-cli o
npm install -g @google/gemini-cli).
Notas sobre JSON de Gemini CLI:
- El texto de respuesta se lee desde el campo JSON
response. - El uso recurre a
statscuandousageno existe o está vacío. stats.cachedse normaliza comocacheReaden OpenClaw.- Si falta
stats.input, OpenClaw deriva los tokens de entrada a partir destats.input_tokens - stats.cached.
command absoluta).
Valores predeterminados propiedad del plugin
Los valores predeterminados de backend de CLI ahora forman parte de la superficie del plugin:- Los plugins los registran con
api.registerCliBackend(...). - El backend
idse convierte en el prefijo de proveedor en las referencias de modelo. - La configuración del usuario en
agents.defaults.cliBackends.<id>sigue reemplazando el valor predeterminado del plugin. - La limpieza de configuración específica del backend sigue siendo propiedad del plugin mediante el hook opcional
normalizeConfig.
Superposiciones MCP incluidas
Los backends de CLI no reciben llamadas a herramientas de OpenClaw directamente, pero un backend puede optar por una superposición de configuración MCP generada conbundleMcp: true.
Comportamiento incluido actual:
claude-cli:bundleMcp: true(predeterminado)codex-cli: sin superposición bundle MCPgoogle-gemini-cli: sin superposición bundle MCP
- inicia un servidor MCP HTTP loopback que expone herramientas del gateway al proceso de la CLI
- autentica el puente con un token por sesión (
OPENCLAW_MCP_TOKEN) - limita el acceso a herramientas a la sesión, cuenta y contexto de canal actuales
- carga los servidores bundle-MCP habilitados para el espacio de trabajo actual
- los fusiona con cualquier
--mcp-configexistente del backend - reescribe los argumentos de la CLI para pasar
--strict-mcp-config --mcp-config <generated-file>
--strict-mcp-config impide que Claude CLI herede servidores MCP
ambientales a nivel de usuario o global. Si no hay servidores MCP habilitados, OpenClaw aun así
inyecta una configuración vacía estricta para que las ejecuciones en segundo plano permanezcan aisladas.
Limitaciones
- Sin llamadas directas a herramientas de OpenClaw. OpenClaw no inyecta llamadas a herramientas en
el protocolo del backend de CLI. Sin embargo, los backends con
bundleMcp: true(el valor predeterminado de Claude CLI) reciben herramientas del gateway mediante un puente MCP loopback, por lo que Claude CLI puede invocar herramientas de OpenClaw a través de su compatibilidad nativa con MCP. - El streaming es específico del backend. Claude CLI usa streaming JSONL
(
stream-jsoncon--include-partial-messages); otros backends de CLI pueden seguir usando búfer hasta la salida. - Las salidas estructuradas dependen del formato JSON de la CLI.
- Las sesiones de Codex CLI se reanudan mediante salida de texto (sin JSONL), que está menos
estructurada que la ejecución inicial con
--json. Las sesiones de OpenClaw siguen funcionando normalmente.
Solución de problemas
- CLI no encontrada: define
commandcon una ruta completa. - Nombre de modelo incorrecto: usa
modelAliasespara asignarprovider/model→ modelo de CLI. - No hay continuidad de sesión: asegúrate de que
sessionArgesté definido y quesessionModeno seanone(actualmente Codex CLI no puede reanudar con salida JSON). - Las imágenes se ignoran: define
imageArg(y verifica que la CLI admita rutas de archivo).