Backend CLI (runtime di fallback)
OpenClaw può eseguire CLI AI locali come fallback solo testo quando i provider API non sono disponibili, sono soggetti a limitazione di frequenza o si comportano temporaneamente in modo anomalo. Si tratta intenzionalmente di un approccio conservativo:- Gli strumenti OpenClaw non vengono iniettati direttamente, ma i backend con
bundleMcp: true(il valore predefinito di Claude CLI) possono ricevere gli strumenti del gateway tramite un bridge loopback MCP. - Streaming JSONL (Claude CLI usa
--output-format stream-jsoncon--include-partial-messages; i prompt vengono inviati tramite stdin). - Le sessioni sono supportate (quindi i turni successivi rimangono coerenti).
- Le immagini possono essere inoltrate se la CLI accetta percorsi di immagini.
Guida rapida per principianti
Puoi usare Claude CLI senza alcuna configurazione (il plugin Anthropic incluso registra un backend predefinito):agents.defaults.cliBackends.
Usarlo come fallback
Aggiungi un backend CLI al tuo elenco di fallback in modo che venga eseguito solo quando i modelli primari falliscono:- Se usi
agents.defaults.models(allowlist), devi includereclaude-cli/.... - Se il provider primario fallisce (autenticazione, limiti di frequenza, timeout), OpenClaw proverà poi il backend CLI.
- Il backend Claude CLI incluso accetta ancora alias più brevi come
claude-cli/opus,claude-cli/opus-4.6oclaude-cli/sonnet, ma la documentazione e gli esempi di configurazione usano i riferimenti canoniciclaude-cli/claude-*.
Panoramica della configurazione
Tutti i backend CLI si trovano in:claude-cli, my-cli).
L’id provider diventa il lato sinistro del tuo riferimento di modello:
Esempio di configurazione
Come funziona
- Seleziona un backend in base al prefisso del provider (
claude-cli/...). - Costruisce un prompt di sistema usando lo stesso prompt OpenClaw + il contesto del workspace.
- Esegue la CLI con un id sessione (se supportato) in modo che la cronologia resti coerente.
- Analizza l’output (JSON o testo semplice) e restituisce il testo finale.
- Rende persistenti gli id sessione per backend, in modo che i turni successivi riutilizzino la stessa sessione CLI.
Sessioni
- Se la CLI supporta le sessioni, imposta
sessionArg(ad esempio--session-id) oppuresessionArgs(segnaposto{sessionId}) quando l’id deve essere inserito in più flag. - Se la CLI usa un sottocomando di ripresa con flag diversi, imposta
resumeArgs(sostituisceargsdurante la ripresa) e facoltativamenteresumeOutput(per riprese non JSON). sessionMode:always: invia sempre un id sessione (nuovo UUID se non ne è stato memorizzato uno).existing: invia un id sessione solo se ne era già stato memorizzato uno.none: non invia mai un id sessione.
serialize: truemantiene ordinate le esecuzioni sulla stessa corsia.- La maggior parte delle CLI serializza su una corsia provider.
claude-cliè più ristretto: le esecuzioni riprese vengono serializzate per id sessione Claude, e le nuove esecuzioni per percorso del workspace. Workspace indipendenti possono essere eseguiti in parallelo.- OpenClaw interrompe il riutilizzo della sessione CLI memorizzata quando cambia lo stato di autenticazione del backend, inclusi nuovo login, rotazione del token o modifica di una credenziale del profilo di autenticazione.
Immagini (inoltro diretto)
Se la tua CLI accetta percorsi di immagini, impostaimageArg:
imageArg è impostato, questi
percorsi vengono passati come argomenti CLI. Se imageArg manca, OpenClaw aggiunge i
percorsi dei file al prompt (iniezione del percorso), sufficiente per le CLI che caricano automaticamente
file locali da percorsi in chiaro (comportamento di Claude CLI).
Input / output
output: "json"(predefinito) prova ad analizzare JSON ed estrarre testo + id sessione.- Per l’output JSON di Gemini CLI, OpenClaw legge il testo della risposta da
responsee l’utilizzo dastatsquandousagemanca o è vuoto. output: "jsonl"analizza flussi JSONL (ad esempio Claude CLIstream-jsone Codex CLI--json) ed estrae il messaggio finale dell’agente più gli identificatori di sessione quando presenti.output: "text"tratta stdout come risposta finale.
input: "arg"(predefinito) passa il prompt come ultimo argomento CLI.input: "stdin"invia il prompt tramite stdin.- Se il prompt è molto lungo e
maxPromptArgCharsè impostato, viene usato stdin.
Predefiniti (di proprietà del plugin)
Il plugin Anthropic incluso registra un backend predefinito perclaude-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 in PATH (brew install gemini-cli oppure
npm install -g @google/gemini-cli).
Note sul JSON di Gemini CLI:
- Il testo della risposta viene letto dal campo JSON
response. - L’utilizzo usa
statscome fallback quandousageè assente o vuoto. stats.cachedviene normalizzato in OpenClawcacheRead.- Se
stats.inputmanca, OpenClaw ricava i token di input dastats.input_tokens - stats.cached.
command assoluto).
Predefiniti di proprietà del plugin
I predefiniti dei backend CLI ora fanno parte della superficie del plugin:- I plugin li registrano con
api.registerCliBackend(...). - L’
iddel backend diventa il prefisso provider nei riferimenti di modello. - La configurazione utente in
agents.defaults.cliBackends.<id>continua a sovrascrivere il predefinito del plugin. - La pulizia della configurazione specifica del backend rimane di proprietà del plugin tramite l’hook facoltativo
normalizeConfig.
Overlay Bundle MCP
I backend CLI non ricevono direttamente le chiamate agli strumenti OpenClaw, ma un backend può aderire a una configurazione overlay MCP generata conbundleMcp: true.
Comportamento incluso attuale:
claude-cli:bundleMcp: true(predefinito)codex-cli: nessun overlay bundle MCPgoogle-gemini-cli: nessun overlay bundle MCP
- avvia un server HTTP MCP loopback che espone gli strumenti del gateway al processo CLI
- autentica il bridge con un token per sessione (
OPENCLAW_MCP_TOKEN) - limita l’accesso agli strumenti alla sessione corrente, all’account e al contesto del canale
- carica i server bundle-MCP abilitati per il workspace corrente
- li unisce con qualsiasi backend
--mcp-configesistente - riscrive gli argomenti CLI per passare
--strict-mcp-config --mcp-config <generated-file>
--strict-mcp-config impedisce a Claude CLI di ereditare server MCP ambientali
a livello utente o globali. Se non è abilitato alcun server MCP, OpenClaw
inietta comunque una configurazione vuota rigorosa in modo che le esecuzioni in background restino isolate.
Limitazioni
- Nessuna chiamata diretta agli strumenti OpenClaw. OpenClaw non inietta chiamate agli strumenti nel
protocollo del backend CLI. Tuttavia, i backend con
bundleMcp: true(il valore predefinito di Claude CLI) ricevono gli strumenti del gateway tramite un bridge loopback MCP, quindi Claude CLI può invocare gli strumenti OpenClaw tramite il proprio supporto MCP nativo. - Lo streaming è specifico del backend. Claude CLI usa streaming JSONL
(
stream-jsoncon--include-partial-messages); altri backend CLI possono ancora essere bufferizzati fino all’uscita. - Gli output strutturati dipendono dal formato JSON della CLI.
- Le sessioni Codex CLI riprendono tramite output di testo (nessun JSONL), che è meno
strutturato rispetto all’esecuzione iniziale
--json. Le sessioni OpenClaw continuano comunque a funzionare normalmente.
Risoluzione dei problemi
- CLI non trovata: imposta
commandsu un percorso completo. - Nome del modello errato: usa
modelAliasesper mappareprovider/model→ modello CLI. - Nessuna continuità di sessione: assicurati che
sessionArgsia impostato e chesessionModenon sianone(attualmente Codex CLI non può riprendere con output JSON). - Immagini ignorate: imposta
imageArg(e verifica che la CLI supporti i percorsi dei file).