Gateway
Backend CLI
OpenClaw dapat menjalankan CLI AI lokal sebagai fallback hanya teks saat penyedia API tidak aktif, dibatasi laju, atau sementara bermasalah. Ini sengaja dibuat konservatif:
- Alat OpenClaw tidak disuntikkan secara langsung, tetapi backend dengan
bundleMcp: truedapat menerima alat Gateway melalui jembatan MCP loopback. - Streaming JSONL untuk CLI yang mendukungnya.
- Sesi didukung (sehingga giliran tindak lanjut tetap koheren).
- Gambar dapat diteruskan jika CLI menerima path gambar.
Ini dirancang sebagai jaring pengaman, bukan jalur utama. Gunakan saat Anda menginginkan respons teks yang "selalu berfungsi" tanpa bergantung pada API eksternal.
Jika Anda menginginkan runtime harness penuh dengan kontrol sesi ACP, tugas latar belakang, pengikatan thread/percakapan, dan sesi coding eksternal persisten, gunakan Agen ACP sebagai gantinya. Backend CLI bukan ACP.
Mulai cepat yang ramah pemula
Anda dapat menggunakan Codex CLI tanpa konfigurasi apa pun (Plugin OpenAI bawaan mendaftarkan backend default):
openclaw agent --message "hi" --model codex-cli/gpt-5.5
Jika Gateway Anda berjalan di bawah launchd/systemd dan PATH minimal, tambahkan hanya path perintah:
{
agents: {
defaults: {
cliBackends: {
"codex-cli": {
command: "/opt/homebrew/bin/codex",
},
},
},
},
}
Selesai. Tidak perlu kunci, tidak perlu konfigurasi autentikasi tambahan selain CLI itu sendiri.
Jika Anda menggunakan backend CLI bawaan sebagai penyedia pesan utama pada
host Gateway, OpenClaw kini memuat otomatis Plugin bawaan pemiliknya saat konfigurasi Anda
secara eksplisit mereferensikan backend tersebut dalam referensi model atau di bawah
agents.defaults.cliBackends.
Menggunakannya sebagai fallback
Tambahkan backend CLI ke daftar fallback Anda sehingga hanya berjalan saat model utama gagal:
{
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": {},
},
},
},
}
Catatan:
- Jika Anda menggunakan
agents.defaults.models(daftar izin), Anda juga harus menyertakan model backend CLI Anda di sana. - Jika penyedia utama gagal (autentikasi, batas laju, timeout), OpenClaw akan mencoba backend CLI berikutnya.
Ikhtisar konfigurasi
Semua backend CLI berada di bawah:
agents.defaults.cliBackends
Setiap entri diberi kunci dengan id penyedia (mis. codex-cli, my-cli).
Id penyedia menjadi sisi kiri referensi model Anda:
<provider>/<model>
Contoh konfigurasi
{
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,
},
},
},
},
}
Cara kerjanya
- Memilih backend berdasarkan prefiks penyedia (
codex-cli/...). - Membangun prompt sistem menggunakan prompt OpenClaw yang sama + konteks workspace.
- Menjalankan CLI dengan id sesi (jika didukung) sehingga riwayat tetap konsisten.
Backend
claude-clibawaan menjaga proses stdio Claude tetap hidup per sesi OpenClaw dan mengirim giliran tindak lanjut melalui stdin stream-json. - Mengurai output (JSON atau teks biasa) dan mengembalikan teks final.
- Mempertahankan id sesi per backend, sehingga tindak lanjut menggunakan kembali sesi CLI yang sama.
Backend OpenAI codex-cli bawaan meneruskan prompt sistem OpenClaw melalui
override konfigurasi model_instructions_file milik Codex (-c model_instructions_file="..."). Codex tidak mengekspos flag bergaya Claude
--append-system-prompt, sehingga OpenClaw menulis prompt yang telah dirakit ke
file sementara untuk setiap sesi Codex CLI baru.
Backend Anthropic claude-cli bawaan menerima snapshot Skills OpenClaw
dengan dua cara: katalog Skills OpenClaw ringkas dalam prompt sistem yang ditambahkan, dan
Plugin Claude Code sementara yang diteruskan dengan --plugin-dir. Plugin tersebut hanya berisi
Skills yang memenuhi syarat untuk agen/sesi tersebut, sehingga resolver skill native Claude Code
melihat set terfilter yang sama seperti yang seharusnya diiklankan OpenClaw dalam
prompt. Override env/kunci API Skill tetap diterapkan oleh OpenClaw ke
lingkungan proses anak untuk run tersebut.
Claude CLI juga memiliki mode izin noninteraktifnya sendiri. OpenClaw memetakannya
ke kebijakan eksekusi yang ada alih-alih menambahkan konfigurasi khusus Claude: saat
kebijakan eksekusi efektif yang diminta adalah YOLO (tools.exec.security: "full" dan
tools.exec.ask: "off"), OpenClaw menambahkan --permission-mode bypassPermissions.
Pengaturan per agen agents.list[].tools.exec menimpa tools.exec global untuk
agen tersebut. Untuk memaksa mode Claude yang berbeda, tetapkan argumen backend mentah eksplisit
seperti --permission-mode default atau --permission-mode acceptEdits di bawah
agents.defaults.cliBackends.claude-cli.args dan resumeArgs yang cocok.
Backend Anthropic claude-cli bawaan juga memetakan level OpenClaw /think
ke flag native Claude Code --effort untuk level selain off. minimal dan
low dipetakan ke low, adaptive dan medium dipetakan ke medium, dan high,
xhigh, serta max dipetakan langsung. Backend CLI lain memerlukan Plugin pemiliknya untuk
mendeklarasikan pemeta argv yang setara sebelum /think dapat memengaruhi CLI yang dijalankan.
Sebelum OpenClaw dapat menggunakan backend claude-cli bawaan, Claude Code itu sendiri
harus sudah login pada host yang sama:
claude auth login
claude auth status --text
openclaw models auth login --provider anthropic --method cli --set-default
Gunakan agents.defaults.cliBackends.claude-cli.command hanya saat biner claude
belum tersedia di PATH.
Sesi
- Jika CLI mendukung sesi, tetapkan
sessionArg(mis.--session-id) atausessionArgs(placeholder{sessionId}) saat ID perlu disisipkan ke beberapa flag. - Jika CLI menggunakan subperintah resume dengan flag berbeda, tetapkan
resumeArgs(menggantikanargssaat melanjutkan) dan secara opsionalresumeOutput(untuk resume non-JSON). sessionMode:always: selalu kirim id sesi (UUID baru jika belum ada yang tersimpan).existing: hanya kirim id sesi jika sudah pernah tersimpan sebelumnya.none: jangan pernah kirim id sesi.
claude-clidefault keliveSession: "claude-stdio",output: "jsonl", daninput: "stdin"sehingga giliran tindak lanjut menggunakan kembali proses Claude live saat masih aktif. Stdio hangat kini menjadi default, termasuk untuk konfigurasi kustom yang menghilangkan field transport. Jika Gateway dimulai ulang atau proses idle keluar, OpenClaw melanjutkan dari id sesi Claude yang tersimpan. Id sesi yang tersimpan diverifikasi terhadap transkrip proyek yang sudah ada dan dapat dibaca sebelum resume, sehingga pengikatan semu dibersihkan denganreason=transcript-missingalih-alih diam-diam memulai sesi Claude CLI baru di bawah--resume.- Sesi live Claude menjaga pembatas output JSONL. Default mengizinkan hingga
8 MiB dan 20.000 baris JSONL mentah per giliran. Giliran Claude yang banyak memakai alat dapat menaikkannya
per backend dengan
agents.defaults.cliBackends.claude-cli.reliability.outputLimits.maxTurnRawCharsdanmaxTurnLines; OpenClaw membatasi pengaturan tersebut ke 64 MiB dan 100.000 baris. - Sesi CLI tersimpan adalah kontinuitas milik penyedia. Reset sesi harian implisit
tidak memutuskannya; kebijakan
/resetdansession.reseteksplisit tetap berlaku.
Catatan serialisasi:
serialize: truemenjaga run pada lane yang sama tetap berurutan.- Sebagian besar CLI melakukan serialisasi pada satu lane penyedia.
- OpenClaw menghentikan penggunaan ulang sesi CLI tersimpan saat identitas autentikasi yang dipilih berubah, termasuk perubahan id profil autentikasi, kunci API statis, token statis, atau identitas akun OAuth saat CLI mengeksposnya. Rotasi token akses dan refresh OAuth tidak memutus sesi CLI tersimpan. Jika CLI tidak mengekspos id akun OAuth yang stabil, OpenClaw membiarkan CLI tersebut menegakkan izin resume.
Prelude fallback dari sesi claude-cli
Saat upaya claude-cli gagal beralih ke kandidat non-CLI di
agents.defaults.model.fallbacks, OpenClaw menanam
upaya berikutnya dengan prelude konteks yang dipanen dari transkrip JSONL lokal
Claude Code di ~/.claude/projects/. Tanpa seed ini, penyedia fallback
akan mulai dari kosong karena transkrip sesi OpenClaw sendiri kosong
untuk run claude-cli.
- Prelude mengutamakan ringkasan
/compactterbaru atau markercompact_boundary, lalu menambahkan giliran pasca-boundary terbaru hingga batas anggaran karakter. Giliran pra-boundary dibuang karena ringkasan sudah mewakilinya. - Blok alat digabung menjadi petunjuk ringkas
(tool call: name)dan(tool result: …)agar anggaran prompt tetap jujur. Ringkasan diberi label(truncated)jika meluap. - Fallback
claude-clikeclaude-clidengan penyedia yang sama mengandalkan--resumemilik Claude sendiri dan melewati prelude. - Seed menggunakan kembali validasi path file sesi Claude yang sudah ada, sehingga path arbitrer tidak dapat dibaca.
Gambar (pass-through)
Jika CLI Anda menerima path gambar, tetapkan imageArg:
imageArg: "--image",
imageMode: "repeat"
OpenClaw akan menulis gambar base64 ke file sementara. Jika imageArg ditetapkan, path tersebut
diteruskan sebagai argumen CLI. Jika imageArg tidak ada, OpenClaw menambahkan
path file ke prompt (injeksi path), yang cukup untuk CLI yang otomatis
memuat file lokal dari path biasa.
Input / output
output: "json"(default) mencoba mengurai JSON dan mengekstrak teks + id sesi.- Untuk output JSON Gemini CLI, OpenClaw membaca teks balasan dari
responsedan penggunaan daristatssaatusagetidak ada atau kosong. output: "jsonl"mengurai stream JSONL (misalnya Codex CLI--json) dan mengekstrak pesan agen final plus pengenal sesi jika ada.output: "text"memperlakukan stdout sebagai respons final.
Mode input:
input: "arg"(default) meneruskan prompt sebagai argumen CLI terakhir.input: "stdin"mengirim prompt melalui stdin.- Jika prompt sangat panjang dan
maxPromptArgCharsditetapkan, stdin digunakan.
Default (milik Plugin)
Plugin OpenAI bawaan juga mendaftarkan default untuk 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"
Plugin Google bawaan juga mendaftarkan default untuk 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"]
Prasyarat: Gemini CLI lokal harus sudah diinstal dan tersedia sebagai
gemini di PATH (brew install gemini-cli atau
npm install -g @google/gemini-cli).
Catatan JSON Gemini CLI:
- Teks balasan dibaca dari bidang JSON
response. - Penggunaan fallback ke
statsketikausagetidak ada atau kosong. stats.cacheddinormalisasi menjadicacheReadOpenClaw.- Jika
stats.inputtidak ada, OpenClaw menurunkan token input daristats.input_tokens - stats.cached.
Timpa hanya jika diperlukan (umum: path command absolut).
Default milik Plugin
Default backend CLI sekarang menjadi bagian dari permukaan Plugin:
- Plugin mendaftarkannya dengan
api.registerCliBackend(...). idbackend menjadi prefiks provider dalam referensi model.- Konfigurasi pengguna di
agents.defaults.cliBackends.<id>tetap menimpa default Plugin. - Pembersihan konfigurasi khusus backend tetap dimiliki Plugin melalui hook opsional
normalizeConfig.
Plugin yang memerlukan shim kompatibilitas prompt/pesan kecil dapat mendeklarasikan transformasi teks dua arah tanpa mengganti provider atau backend CLI:
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 menulis ulang prompt sistem dan prompt pengguna yang diteruskan ke CLI. output
menulis ulang delta asisten yang di-stream dan teks akhir yang diurai sebelum OpenClaw menangani
penanda kontrolnya sendiri dan pengiriman channel.
Untuk CLI yang menghasilkan JSONL kompatibel stream-json Claude Code, tetapkan
jsonlDialect: "claude-stream-json" pada konfigurasi backend tersebut.
Overlay MCP bundel
Backend CLI tidak menerima panggilan tool OpenClaw secara langsung, tetapi backend dapat
memilih menggunakan overlay konfigurasi MCP yang dihasilkan dengan bundleMcp: true.
Perilaku bundel saat ini:
claude-cli: file konfigurasi MCP ketat yang dihasilkancodex-cli: penimpaan konfigurasi inline untukmcp_servers; server loopback OpenClaw yang dihasilkan ditandai dengan mode persetujuan tool per server milik Codex sehingga panggilan MCP tidak dapat tertahan pada prompt persetujuan lokalgoogle-gemini-cli: file pengaturan sistem Gemini yang dihasilkan
Ketika MCP bundel diaktifkan, OpenClaw:
- menjalankan server HTTP MCP loopback yang mengekspos tool gateway ke proses CLI
- mengautentikasi bridge dengan token per sesi (
OPENCLAW_MCP_TOKEN) - membatasi akses tool ke konteks sesi, akun, dan channel saat ini
- memuat server bundle-MCP yang diaktifkan untuk workspace saat ini
- menggabungkannya dengan bentuk konfigurasi/pengaturan MCP backend yang sudah ada
- menulis ulang konfigurasi peluncuran menggunakan mode integrasi milik backend dari ekstensi pemilik
Jika tidak ada server MCP yang diaktifkan, OpenClaw tetap menyuntikkan konfigurasi ketat ketika backend memilih MCP bundel agar run latar belakang tetap terisolasi.
Runtime MCP bundel yang tercakup sesi di-cache untuk digunakan kembali dalam sebuah sesi, lalu
dibersihkan setelah mcp.sessionIdleTtlMs milidetik waktu idle (default 10
menit; tetapkan 0 untuk menonaktifkan). Run tertanam sekali pakai seperti probe autentikasi,
pembuatan slug, dan recall Active Memory meminta pembersihan pada akhir run agar anak stdio
dan stream Streamable HTTP/SSE tidak hidup lebih lama dari run.
Batasan
- Tidak ada panggilan tool OpenClaw langsung. OpenClaw tidak menyuntikkan panggilan tool ke dalam
protokol backend CLI. Backend hanya melihat tool gateway ketika memilih menggunakan
bundleMcp: true. - Streaming bersifat khusus backend. Beberapa backend melakukan stream JSONL; yang lain melakukan buffer hingga keluar.
- Output terstruktur bergantung pada format JSON CLI.
- Sesi Codex CLI dilanjutkan melalui output teks (tanpa JSONL), yang kurang
terstruktur dibandingkan run
--jsonawal. Sesi OpenClaw tetap berfungsi normal.
Pemecahan masalah
- CLI tidak ditemukan: tetapkan
commandke path lengkap. - Nama model salah: gunakan
modelAliasesuntuk memetakanprovider/model→ model CLI. - Tidak ada kontinuitas sesi: pastikan
sessionArgditetapkan dansessionModebukannone(Codex CLI saat ini tidak dapat melanjutkan dengan output JSON). - Gambar diabaikan: tetapkan
imageArg(dan verifikasi CLI mendukung path file).