Gateway
CLI-backends
OpenClaw kan lokale AI-CLI's uitvoeren als fallback met alleen tekst wanneer API-providers niet beschikbaar zijn, rate-limited zijn of tijdelijk verkeerd werken. Dit is bewust conservatief:
- OpenClaw-tools worden niet rechtstreeks geïnjecteerd, maar backends met
bundleMcp: truekunnen Gateway-tools ontvangen via een loopback-MCP-bridge. - JSONL-streaming voor CLI's die dit ondersteunen.
- Sessies worden ondersteund (zodat vervolgbeurten coherent blijven).
- Afbeeldingen kunnen worden doorgegeven als de CLI afbeeldingspaden accepteert.
Dit is ontworpen als een vangnet in plaats van een primair pad. Gebruik het wanneer je "werkt altijd"-tekstantwoorden wilt zonder afhankelijk te zijn van externe API's.
Als je een volledige harness-runtime wilt met ACP-sessiebediening, achtergrondtaken, thread-/gespreksbinding en persistente externe codeersessies, gebruik dan ACP-agenten. CLI-backends zijn geen ACP.
Beginnersvriendelijke snelstart
Je kunt Codex CLI zonder enige configuratie gebruiken (de gebundelde OpenAI-Plugin registreert een standaardbackend):
openclaw agent --message "hi" --model codex-cli/gpt-5.5
Als je Gateway onder launchd/systemd draait en PATH minimaal is, voeg dan alleen het opdrachtpad toe:
{
agents: {
defaults: {
cliBackends: {
"codex-cli": {
command: "/opt/homebrew/bin/codex",
},
},
},
},
}
Dat is alles. Geen sleutels, geen extra auth-configuratie nodig buiten de CLI zelf.
Als je een gebundelde CLI-backend gebruikt als de primaire berichtprovider op een
Gateway-host, laadt OpenClaw nu automatisch de eigenaar-Plugin wanneer je configuratie
expliciet naar die backend verwijst in een modelreferentie of onder
agents.defaults.cliBackends.
Gebruiken als fallback
Voeg een CLI-backend toe aan je fallbacklijst, zodat deze alleen draait wanneer primaire modellen falen:
{
agents: {
defaults: {
model: {
primary: "anthropic/claude-opus-4-6",
fallbacks: ["codex-cli/gpt-5.5"],
},
models: {
"anthropic/claude-opus-4-6": { alias: "Opus" },
"codex-cli/gpt-5.5": {},
},
},
},
}
Opmerkingen:
- Als je
agents.defaults.models(allowlist) gebruikt, moet je je CLI-backendmodellen daar ook opnemen. - Als de primaire provider faalt (auth, rate limits, time-outs), zal OpenClaw daarna de CLI-backend proberen.
Configuratieoverzicht
Alle CLI-backends staan onder:
agents.defaults.cliBackends
Elke vermelding wordt geïndexeerd met een provider-id (bijv. codex-cli, my-cli).
De provider-id wordt de linkerkant van je modelreferentie:
<provider>/<model>
Voorbeeldconfiguratie
{
agents: {
defaults: {
cliBackends: {
"codex-cli": {
command: "/opt/homebrew/bin/codex",
},
"my-cli": {
command: "my-cli",
args: ["--json"],
output: "json",
input: "arg",
modelArg: "--model",
modelAliases: {
"claude-opus-4-6": "opus",
"claude-sonnet-4-6": "sonnet",
},
sessionArg: "--session",
sessionMode: "existing",
sessionIdFields: ["session_id", "conversation_id"],
systemPromptArg: "--system",
// For CLIs with a dedicated prompt-file flag:
// systemPromptFileArg: "--system-file",
// Codex-style CLIs can point at a prompt file instead:
// systemPromptFileConfigArg: "-c",
// systemPromptFileConfigKey: "model_instructions_file",
systemPromptWhen: "first",
imageArg: "--image",
imageMode: "repeat",
serialize: true,
},
},
},
},
}
Hoe het werkt
- Selecteert een backend op basis van het provider-prefix (
codex-cli/...). - Bouwt een systeemprompt met dezelfde OpenClaw-prompt + workspace-context.
- Voert de CLI uit met een sessie-id (indien ondersteund), zodat de geschiedenis consistent blijft.
De gebundelde
claude-cli-backend houdt een Claude-stdio-proces actief per OpenClaw-sessie en stuurt vervolgbeurten via stream-json stdin. - Parseert uitvoer (JSON of platte tekst) en retourneert de uiteindelijke tekst.
- Slaat sessie-id's persistent op per backend, zodat vervolgbeurten dezelfde CLI-sessie hergebruiken.
De gebundelde OpenAI codex-cli-backend geeft de systeemprompt van OpenClaw door via
Codex' model_instructions_file-configuratieoverride (-c model_instructions_file="..."). Codex biedt geen Claude-achtige
--append-system-prompt-flag, dus OpenClaw schrijft de samengestelde prompt naar een
tijdelijk bestand voor elke nieuwe Codex CLI-sessie.
De gebundelde Anthropic claude-cli-backend ontvangt de OpenClaw Skills-snapshot
op twee manieren: de compacte OpenClaw Skills-catalogus in de toegevoegde systeemprompt, en
een tijdelijke Claude Code-Plugin die met --plugin-dir wordt doorgegeven. De Plugin bevat
alleen de geschikte Skills voor die agent/sessie, zodat Claude Code's native skillresolver
dezelfde gefilterde set ziet die OpenClaw anders in
de prompt zou adverteren. Skill-env/API-sleuteloverrides worden nog steeds door OpenClaw toegepast op de
childprocesomgeving voor de run.
Claude CLI heeft ook zijn eigen niet-interactieve toestemmingsmodus. OpenClaw mapt die
naar het bestaande exec-beleid in plaats van Claude-specifieke configuratie toe te voegen: wanneer het
effectief gevraagde exec-beleid YOLO is (tools.exec.security: "full" en
tools.exec.ask: "off"), voegt OpenClaw --permission-mode bypassPermissions toe.
Per-agentinstellingen agents.list[].tools.exec overschrijven globale tools.exec voor
die agent. Om een andere Claude-modus af te dwingen, stel je expliciete raw backend-args in,
zoals --permission-mode default of --permission-mode acceptEdits onder
agents.defaults.cliBackends.claude-cli.args en bijpassende resumeArgs.
De gebundelde Anthropic claude-cli-backend mapt ook OpenClaw /think-niveaus
naar Claude Code's native --effort-flag voor niveaus die niet off zijn. minimal en
low mappen naar low, adaptive en medium mappen naar medium, en high,
xhigh en max mappen rechtstreeks. Andere CLI-backends hebben hun eigenaar-Plugin nodig om
een equivalente argv-mapper te declareren voordat /think invloed kan hebben op de gespawnde CLI.
Voordat OpenClaw de gebundelde claude-cli-backend kan gebruiken, moet Claude Code zelf
al zijn ingelogd op dezelfde host:
claude auth login
claude auth status --text
openclaw models auth login --provider anthropic --method cli --set-default
Gebruik agents.defaults.cliBackends.claude-cli.command alleen wanneer de claude-
binary nog niet op PATH staat.
Sessies
- Als de CLI sessies ondersteunt, stel dan
sessionArg(bijv.--session-id) ofsessionArgs(placeholder{sessionId}) in wanneer de ID in meerdere flags moet worden ingevoegd. - Als de CLI een resume-subcommand gebruikt met andere flags, stel dan
resumeArgsin (vervangtargsbij hervatten) en optioneelresumeOutput(voor niet-JSON-hervattingen). sessionMode:always: stuur altijd een sessie-id (nieuwe UUID als er geen is opgeslagen).existing: stuur alleen een sessie-id als er eerder een is opgeslagen.none: stuur nooit een sessie-id.
claude-cligebruikt standaardliveSession: "claude-stdio",output: "jsonl", eninput: "stdin"zodat vervolgbeurten het live Claude-proces hergebruiken terwijl het actief is. Warme stdio is nu de standaard, ook voor aangepaste configuraties die transportvelden weglaten. Als de Gateway herstart of het idle-proces stopt, hervat OpenClaw vanaf de opgeslagen Claude-sessie-id. Opgeslagen sessie- id's worden gecontroleerd tegen een bestaand leesbaar projecttranscript voordat wordt hervat, zodat spookbindingen worden gewist metreason=transcript-missingin plaats van stilzwijgend een nieuwe Claude CLI-sessie te starten onder--resume.- Claude-live-sessies houden begrensde JSONL-uitvoerbewakingen aan. Standaarden staan tot
8 MiB en 20.000 raw JSONL-regels per beurt toe. Tool-intensieve Claude-beurten kunnen
deze per backend verhogen met
agents.defaults.cliBackends.claude-cli.reliability.outputLimits.maxTurnRawCharsenmaxTurnLines; OpenClaw begrenst die instellingen op 64 MiB en 100.000 regels. - Opgeslagen CLI-sessies zijn provider-eigen continuïteit. De impliciete dagelijkse sessie-
reset onderbreekt ze niet;
/reseten explicietesession.reset-beleidsregels doen dat nog steeds.
Serialisatieopmerkingen:
serialize: truehoudt runs in dezelfde lane geordend.- De meeste CLI's serialiseren op één provider-lane.
- OpenClaw laat hergebruik van opgeslagen CLI-sessies vallen wanneer de geselecteerde auth-identiteit verandert, inclusief een gewijzigde auth-profiel-id, statische API-sleutel, statisch token of OAuth- accountidentiteit wanneer de CLI er een blootstelt. Rotatie van OAuth-access- en refresh-token onderbreekt de opgeslagen CLI-sessie niet. Als een CLI geen stabiele OAuth-account-id blootstelt, laat OpenClaw die CLI hervattoestemmingen afdwingen.
Fallback-prelude uit claude-cli-sessies
Wanneer een claude-cli-poging faalt en overgaat naar een niet-CLI-kandidaat in
agents.defaults.model.fallbacks, seedt OpenClaw
de volgende poging met een contextprelude die is verzameld uit Claude Code's lokale
JSONL-transcript op ~/.claude/projects/. Zonder deze seed zou de fallback-
provider koud starten, omdat OpenClaw's eigen sessietranscript leeg is
voor claude-cli-runs.
- De prelude geeft de voorkeur aan de nieuwste
/compact-samenvatting ofcompact_boundary- marker en voegt daarna de meest recente post-boundary-beurten toe tot aan een teken- budget. Pre-boundary-beurten worden weggelaten omdat de samenvatting ze al vertegenwoordigt. - Toolblokken worden samengevoegd tot compacte
(tool call: name)- en(tool result: …)-hints om het promptbudget eerlijk te houden. De samenvatting wordt gelabeld als(truncated)als deze overloopt. - Fallbacks van dezelfde provider van
claude-clinaarclaude-clivertrouwen op Claude's eigen--resumeen slaan de prelude over. - De seed hergebruikt de bestaande padvalidatie van Claude-sessiebestanden, zodat willekeurige paden niet kunnen worden gelezen.
Afbeeldingen (doorgeven)
Als je CLI afbeeldingspaden accepteert, stel dan imageArg in:
imageArg: "--image",
imageMode: "repeat"
OpenClaw schrijft base64-afbeeldingen naar tijdelijke bestanden. Als imageArg is ingesteld, worden die
paden doorgegeven als CLI-args. Als imageArg ontbreekt, voegt OpenClaw de
bestandspaden toe aan de prompt (padinjectie), wat genoeg is voor CLI's die lokale bestanden automatisch
laden vanuit platte paden.
Invoer / uitvoer
output: "json"(standaard) probeert JSON te parsen en tekst + sessie-id te extraheren.- Voor Gemini CLI-JSON-uitvoer leest OpenClaw antwoordtekst uit
responseen gebruik uitstatswanneerusageontbreekt of leeg is. output: "jsonl"parseert JSONL-streams (bijvoorbeeld Codex CLI--json) en extraheert het uiteindelijke agentbericht plus sessie- identifiers wanneer aanwezig.output: "text"behandelt stdout als het uiteindelijke antwoord.
Invoermodi:
input: "arg"(standaard) geeft de prompt door als de laatste CLI-arg.input: "stdin"stuurt de prompt via stdin.- Als de prompt erg lang is en
maxPromptArgCharsis ingesteld, wordt stdin gebruikt.
Standaarden (eigendom van Plugin)
De gebundelde OpenAI-Plugin registreert ook een standaard voor codex-cli:
command: "codex"args: ["exec","--json","--color","never","--sandbox","workspace-write","--skip-git-repo-check"]resumeArgs: ["exec","resume","{sessionId}","-c","sandbox_mode=\"workspace-write\"","--skip-git-repo-check"]output: "jsonl"resumeOutput: "text"modelArg: "--model"imageArg: "--image"sessionMode: "existing"
De gebundelde Google-Plugin registreert ook een standaard voor google-gemini-cli:
command: "gemini"args: ["--output-format", "json", "--prompt", "{prompt}"]resumeArgs: ["--resume", "{sessionId}", "--output-format", "json", "--prompt", "{prompt}"]imageArg: "@"imagePathScope: "workspace"modelArg: "--model"sessionMode: "existing"sessionIdFields: ["session_id", "sessionId"]
Vereiste: de lokale Gemini CLI moet geinstalleerd zijn en beschikbaar zijn als
gemini op PATH (brew install gemini-cli of
npm install -g @google/gemini-cli).
Gemini CLI JSON-opmerkingen:
- Antwoordtekst wordt gelezen uit het JSON-veld
response. - Gebruik valt terug op
statswanneerusageontbreekt of leeg is. stats.cachedwordt genormaliseerd naar OpenClawcacheRead.- Als
stats.inputontbreekt, leidt OpenClaw invoertokens af uitstats.input_tokens - stats.cached.
Overschrijf alleen indien nodig (gebruikelijk: absoluut command-pad).
Standaardwaarden in eigendom van Plugin
CLI-backendstandaardwaarden maken nu deel uit van het pluginoppervlak:
- Plugins registreren ze met
api.registerCliBackend(...). - De backend-
idwordt het providerprefix in modelrefs. - Gebruikersconfiguratie in
agents.defaults.cliBackends.<id>overschrijft nog steeds de Plugin-standaardwaarde. - Backend-specifieke configuratieopschoning blijft in eigendom van de Plugin via de optionele
normalizeConfig-hook.
Plugins die kleine compatibiliteitsshims voor prompts/berichten nodig hebben, kunnen bidirectionele teksttransformaties declareren zonder een provider of CLI-backend te vervangen:
api.registerTextTransforms({
input: [
{ from: /red basket/g, to: "blue basket" },
{ from: /paper ticket/g, to: "digital ticket" },
{ from: /left shelf/g, to: "right shelf" },
],
output: [
{ from: /blue basket/g, to: "red basket" },
{ from: /digital ticket/g, to: "paper ticket" },
{ from: /right shelf/g, to: "left shelf" },
],
});
input herschrijft de systeemprompt en gebruikersprompt die aan de CLI worden doorgegeven. output
herschrijft gestreamde assistent-delta's en geparseerde definitieve tekst voordat OpenClaw
zijn eigen controlemarkeringen en kanaalbezorging afhandelt.
Voor CLI's die Claude Code stream-json-compatibele JSONL uitstoten, stel je
jsonlDialect: "claude-stream-json" in op de configuratie van die backend.
Bundle-MCP-overlays
CLI-backends ontvangen OpenClaw-toolaanroepen niet rechtstreeks, maar een backend kan
zich aanmelden voor een gegenereerde MCP-configuratie-overlay met bundleMcp: true.
Huidig gebundeld gedrag:
claude-cli: gegenereerd strikt MCP-configuratiebestandcodex-cli: inline configuratieoverschrijvingen voormcp_servers; de gegenereerde OpenClaw-loopbackserver is gemarkeerd met Codex' toolgoedkeuringsmodus per server zodat MCP-aanroepen niet kunnen vastlopen op lokale goedkeuringspromptsgoogle-gemini-cli: gegenereerd Gemini-systeeminstellingenbestand
Wanneer bundle MCP is ingeschakeld, doet OpenClaw het volgende:
- start een loopback-HTTP-MCP-server die Gateway-tools beschikbaar maakt voor het CLI-proces
- authenticeert de bridge met een token per sessie (
OPENCLAW_MCP_TOKEN) - beperkt tooltoegang tot de huidige sessie, account- en kanaalcontext
- laadt ingeschakelde bundle-MCP-servers voor de huidige werkruimte
- voegt ze samen met een bestaande backend-MCP-configuratie-/instellingenvorm
- herschrijft de startconfiguratie met de backend-eigen integratiemodus van de eigenaarsextensie
Als er geen MCP-servers zijn ingeschakeld, injecteert OpenClaw nog steeds een strikte configuratie wanneer een backend zich aanmeldt voor bundle MCP, zodat achtergrondruns geisoleerd blijven.
Sessiespecifieke gebundelde MCP-runtimes worden gecachet voor hergebruik binnen een sessie, en vervolgens
opgeruimd na mcp.sessionIdleTtlMs milliseconden inactiviteit (standaard 10
minuten; stel 0 in om uit te schakelen). Eenmalige ingebedde runs zoals auth-probes,
slug-generatie en active-memory recall vragen om opschoning aan het einde van de run, zodat stdio-
children en Streamable HTTP/SSE-streams niet langer leven dan de run.
Beperkingen
- Geen rechtstreekse OpenClaw-toolaanroepen. OpenClaw injecteert geen toolaanroepen in
het CLI-backendprotocol. Backends zien Gateway-tools alleen wanneer ze zich aanmelden voor
bundleMcp: true. - Streaming is backend-specifiek. Sommige backends streamen JSONL; andere bufferen tot afsluiting.
- Gestructureerde uitvoer is afhankelijk van het JSON-formaat van de CLI.
- Codex CLI-sessies worden hervat via tekstuitvoer (geen JSONL), wat minder
gestructureerd is dan de eerste
--json-run. OpenClaw-sessies werken nog steeds normaal.
Probleemoplossing
- CLI niet gevonden: stel
commandin op een volledig pad. - Verkeerde modelnaam: gebruik
modelAliasesomprovider/model→ CLI-model te mappen. - Geen sessiecontinuiteit: zorg dat
sessionArgis ingesteld en datsessionModenietnoneis (Codex CLI kan momenteel niet hervatten met JSON-uitvoer). - Afbeeldingen genegeerd: stel
imageArgin (en controleer of de CLI bestandspaden ondersteunt).