CLI-Backends (Fallback-Runtime)
OpenClaw kann lokale KI-CLIs als Nur-Text-Fallback nutzen, wenn API-Anbieter ausfallen, Rate-Limits greifen oder vorübergehend Probleme auftreten. Das ist bewusst konservativ gehalten:
- Tools sind deaktiviert (keine Tool-Calls).
- Text rein → Text raus (zuverlässig).
- Sessions werden unterstützt (sodass Folgeantworten kohärent bleiben).
- Bilder können durchgereicht werden, sofern die CLI Bildpfade akzeptiert.
Das ist als Sicherheitsnetz gedacht, nicht als primärer Pfad. Nutze es, wenn du “funktioniert immer”-Textantworten willst, ohne auf externe APIs angewiesen zu sein.
Einsteigerfreundlicher Schnellstart
Du kannst Claude Code CLI ohne jede Konfiguration verwenden (OpenClaw liefert einen eingebauten Standard):
openclaw agent --message "hi" --model claude-cli/opus-4.6
Codex CLI funktioniert ebenfalls sofort:
openclaw agent --message "hi" --model codex-cli/gpt-5.4
Falls 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 Schlüssel, keine weitere Auth-Konfiguration nötig, abgesehen von der CLI selbst.
Als Fallback verwenden
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-6",
fallbacks: ["claude-cli/opus-4.6", "claude-cli/opus-4.5"],
},
models: {
"anthropic/claude-opus-4-6": { alias: "Opus" },
"claude-cli/opus-4.6": {},
"claude-cli/opus-4.5": {},
},
},
},
}
Hinweise:
- Wenn du
agents.defaults.models(Allowlist) verwendest, musst duclaude-cli/...einschließen. - Falls der primäre Anbieter 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 Modellreferenz:
<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-6": "opus",
"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), sodass der Verlauf konsistent bleibt.
- Parst die Ausgabe (JSON oder Klartext) und gibt den finalen Text zurück.
- Speichert Session-IDs pro Backend, sodass Folgeanfragen die gleiche CLI-Session wiederverwenden.
Sessions
- Wenn die CLI Sessions unterstützt, setze
sessionArg(z. B.--session-id) odersessionArgs(Platzhalter{sessionId}), wenn die ID in mehreren Flags eingefügt werden muss. - Falls die CLI ein 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 wenn keine gespeichert).existing: Session-ID nur senden, wenn eine zuvor gespeichert wurde.none: niemals eine Session-ID senden.
Bilder (Durchreichung)
Wenn deine CLI Bildpfade akzeptiert, setze imageArg:
imageArg: "--image",
imageMode: "repeat"
OpenClaw schreibt Base64-Bilder in temporäre Dateien. Falls imageArg gesetzt ist, werden
diese Pfade als CLI-Argumente übergeben. Ohne imageArg hängt OpenClaw die Dateipfade an den
Prompt an (Pfad-Injektion), was für CLIs genügt, die lokale Dateien automatisch aus Klartextpfaden laden (Claude Code CLI-Verhalten).
Eingabe / Ausgabe
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 sowiethread_id, wenn 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 liefert einen Standard für claude-cli:
command: "claude"args: ["-p", "--output-format", "json", "--permission-mode", "bypassPermissions"]resumeArgs: ["-p", "--output-format", "json", "--permission-mode", "bypassPermissions", "--resume", "{sessionId}"]modelArg: "--model"systemPromptArg: "--append-system-prompt"sessionArg: "--session-id"systemPromptWhen: "first"sessionMode: "always"
OpenClaw liefert auch einen Standard für codex-cli:
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 niemals Tool-Calls). Manche CLIs können dennoch ihr eigenes Agent-Tooling ausführen.
- 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 weiterhin normal.
Fehlerbehebung
- CLI nicht gefunden: Setze
commandauf einen vollständigen Pfad. - Falscher Modellname: Verwende
modelAliases, umprovider/model→ CLI-Modell abzubilden. - Keine Session-Kontinuität: Stelle sicher, dass
sessionArggesetzt ist undsessionModenichtnoneist (Codex CLI kann derzeit nicht mit JSON-Ausgabe fortsetzen). - Bilder ignoriert: Setze
imageArg(und prüfe, ob die CLI Dateipfade unterstützt).