CLI Backends (Fallback-Runtime)
OpenClaw kann lokale AI CLIs als Nur-Text-Fallback nutzen, wenn API-Provider nicht erreichbar sind, Rate-Limits greifen oder vorübergehend Probleme machen. Das ist bewusst konservativ gehalten:
- Tools sind deaktiviert (keine Tool-Aufrufe).
- Text rein, Text raus (zuverlässig).
- Sessions werden unterstützt (Folgeanfragen bleiben konsistent).
- Bilder können durchgereicht werden, wenn die CLI Bildpfade akzeptiert.
Das ist als Sicherheitsnetz gedacht, nicht als primärer Pfad. Nutze es, wenn du “funktioniert immer”-Textantworten brauchst, ohne auf externe APIs angewiesen zu sein.
Einsteigerfreundlicher Schnellstart
Du kannst Claude Code CLI ohne jede Konfiguration nutzen (OpenClaw bringt einen eingebauten Standard mit):
openclaw agent --message "hi" --model claude-cli/opus-4.5
Codex CLI funktioniert ebenfalls direkt:
openclaw agent --message "hi" --model codex-cli/gpt-5.2-codex
Wenn dein Gateway unter launchd/systemd läuft und PATH minimal ist, füge einfach den Befehlspfad hinzu:
{
agents: {
defaults: {
cliBackends: {
"claude-cli": {
command: "/opt/homebrew/bin/claude",
},
},
},
},
}
Das war’s. Keine Keys, keine zusätzliche Auth-Konfiguration nötig — nur die CLI selbst.
Als Fallback nutzen
Füge ein CLI Backend zu deiner Fallback-Liste hinzu, damit es nur läuft, wenn primäre Modelle fehlschlagen:
{
agents: {
defaults: {
model: {
primary: "anthropic/claude-opus-4-5",
fallbacks: ["claude-cli/opus-4.5"],
},
models: {
"anthropic/claude-opus-4-5": { alias: "Opus" },
"claude-cli/opus-4.5": {},
},
},
},
}
Hinweise:
- Wenn du
agents.defaults.models(Allowlist) verwendest, musst duclaude-cli/...mit aufnehmen. - Wenn der primäre Provider fehlschlägt (Auth, Rate-Limits, Timeouts), versucht OpenClaw als nächstes das CLI Backend.
Konfigurationsübersicht
Alle CLI Backends befinden sich unter:
agents.defaults.cliBackends
Jeder Eintrag ist nach einer Provider-ID benannt (z.B. claude-cli, my-cli).
Die Provider-ID wird zur linken Seite deiner Model-Referenz:
<provider>/<model>
Beispielkonfiguration
{
agents: {
defaults: {
cliBackends: {
"claude-cli": {
command: "/opt/homebrew/bin/claude",
},
"my-cli": {
command: "my-cli",
args: ["--json"],
output: "json",
input: "arg",
modelArg: "--model",
modelAliases: {
"claude-opus-4-5": "opus",
"claude-sonnet-4-5": "sonnet",
},
sessionArg: "--session",
sessionMode: "existing",
sessionIdFields: ["session_id", "conversation_id"],
systemPromptArg: "--system",
systemPromptWhen: "first",
imageArg: "--image",
imageMode: "repeat",
serialize: true,
},
},
},
},
}
So funktioniert es
- Wählt ein Backend basierend auf dem Provider-Präfix (
claude-cli/...). - Erstellt einen System-Prompt mit dem gleichen OpenClaw-Prompt + Workspace-Kontext.
- Führt die CLI aus mit einer Session-ID (falls unterstützt), damit der Verlauf konsistent bleibt.
- Parst die Ausgabe (JSON oder Klartext) und gibt den finalen Text zurück.
- Speichert Session-IDs pro Backend, damit Folgeanfragen dieselbe CLI-Session nutzen.
Sessions
- Wenn die CLI Sessions unterstützt, setze
sessionArg(z.B.--session-id) odersessionArgs(Platzhalter{sessionId}), wenn die ID in mehrere Flags eingefügt werden muss. - Wenn die CLI einen Resume-Subcommand mit anderen Flags verwendet, setze
resumeArgs(ersetztargsbeim Fortsetzen) und optionalresumeOutput(für Nicht-JSON-Resumes). sessionMode:always: immer eine Session-ID senden (neue UUID, falls keine gespeichert).existing: nur eine Session-ID senden, wenn bereits eine gespeichert wurde.none: nie eine Session-ID senden.
Bilder (Durchreichen)
Wenn deine CLI Bildpfade akzeptiert, setze imageArg:
imageArg: "--image",
imageMode: "repeat"
OpenClaw schreibt Base64-Bilder in temporäre Dateien. Wenn imageArg gesetzt ist, werden diese Pfade als CLI-Argumente übergeben. Wenn imageArg fehlt, hängt OpenClaw die Dateipfade an den Prompt an (Path-Injection) — das reicht für CLIs, die lokale Dateien automatisch aus einfachen Pfaden laden (Claude Code CLI-Verhalten).
Eingaben / Ausgaben
output: "json"(Standard) versucht JSON zu parsen und Text + Session-ID zu extrahieren.output: "jsonl"parst JSONL-Streams (Codex CLI--json) und extrahiert die letzte Agent-Nachricht plusthread_id, falls vorhanden.output: "text"behandelt stdout als finale Antwort.
Eingabemodi:
input: "arg"(Standard) übergibt den Prompt als letztes CLI-Argument.input: "stdin"sendet den Prompt über stdin.- Wenn der Prompt sehr lang ist und
maxPromptArgCharsgesetzt ist, wird stdin verwendet.
Standards (eingebaut)
OpenClaw bringt einen Standard für claude-cli mit:
command: "claude"args: ["-p", "--output-format", "json", "--dangerously-skip-permissions"]resumeArgs: ["-p", "--output-format", "json", "--dangerously-skip-permissions", "--resume", "{sessionId}"]modelArg: "--model"systemPromptArg: "--append-system-prompt"sessionArg: "--session-id"systemPromptWhen: "first"sessionMode: "always"
OpenClaw bringt auch einen Standard für codex-cli mit:
command: "codex"args: ["exec","--json","--color","never","--sandbox","read-only","--skip-git-repo-check"]resumeArgs: ["exec","resume","{sessionId}","--color","never","--sandbox","read-only","--skip-git-repo-check"]output: "jsonl"resumeOutput: "text"modelArg: "--model"imageArg: "--image"sessionMode: "existing"
Überschreibe nur bei Bedarf (häufig: absoluter command-Pfad).
Einschränkungen
- Keine OpenClaw-Tools (das CLI Backend erhält nie Tool-Aufrufe). Manche CLIs führen trotzdem ihre eigenen Agent-Tools aus.
- Kein Streaming (CLI-Ausgabe wird gesammelt und dann zurückgegeben).
- Strukturierte Ausgaben hängen vom JSON-Format der CLI ab.
- Codex CLI Sessions werden über Text-Ausgabe fortgesetzt (kein JSONL), was weniger strukturiert ist als der initiale
--json-Lauf. OpenClaw-Sessions funktionieren trotzdem normal.
Troubleshooting
- CLI nicht gefunden: setze
commandauf einen vollständigen Pfad. - Falscher Modellname: nutze
modelAliases, umprovider/modelauf das CLI-Modell zu mappen. - Keine Session-Kontinuität: stelle sicher, dass
sessionArggesetzt ist undsessionModenichtnoneist (Codex CLI kann derzeit nicht mit JSON-Ausgabe fortsetzen). - Bilder werden ignoriert: setze
imageArg(und prüfe, ob die CLI Dateipfade unterstützt).