Plugins
Membangun Plugin backend CLI
Plugin backend CLI memungkinkan OpenClaw memanggil CLI AI lokal sebagai backend inferensi teks. Backend muncul sebagai prefiks penyedia dalam referensi model:
acme-cli/acme-large
Gunakan backend CLI ketika integrasi upstream sudah diekspos sebagai perintah lokal, ketika CLI memiliki status login lokal, atau ketika CLI berguna sebagai fallback jika penyedia API tidak tersedia.
Yang dimiliki Plugin
Plugin backend CLI memiliki tiga kontrak:
| Kontrak | File | Tujuan |
|---|---|---|
| Entri paket | package.json |
Mengarahkan OpenClaw ke modul runtime Plugin |
| Kepemilikan manifest | openclaw.plugin.json |
Mendeklarasikan id backend sebelum runtime dimuat |
| Pendaftaran runtime | index.ts |
Memanggil api.registerCliBackend(...) dengan default perintah |
Manifest adalah metadata penemuan. Manifest tidak menjalankan CLI dan tidak
mendaftarkan perilaku runtime. Perilaku runtime dimulai saat entri Plugin
memanggil api.registerCliBackend(...).
Plugin backend minimal
Buat metadata paket
{
"name": "@acme/openclaw-acme-cli",
"version": "1.0.0",
"type": "module",
"openclaw": {
"extensions": ["./index.ts"],
"compat": {
"pluginApi": ">=2026.3.24-beta.2",
"minGatewayVersion": "2026.3.24-beta.2"
},
"build": {
"openclawVersion": "2026.3.24-beta.2",
"pluginSdkVersion": "2026.3.24-beta.2"
}
},
"dependencies": {
"openclaw": "^2026.3.24"
},
"devDependencies": {
"typescript": "^5.9.0"
}
}
Paket yang dipublikasikan harus menyertakan file runtime JavaScript yang
sudah dibangun. Jika entri sumber Anda adalah ./src/index.ts, tambahkan
openclaw.runtimeExtensions yang menunjuk ke peer JavaScript yang sudah
dibangun. Lihat Titik entri.
Deklarasikan kepemilikan backend
{
"id": "acme-cli",
"name": "Acme CLI",
"description": "Run Acme's local AI CLI through OpenClaw",
"cliBackends": ["acme-cli"],
"setup": {
"cliBackends": ["acme-cli"],
"requiresRuntime": false
},
"activation": {
"onStartup": false
},
"configSchema": {
"type": "object",
"additionalProperties": false
}
}
cliBackends adalah daftar kepemilikan runtime. Ini memungkinkan OpenClaw
memuat Plugin secara otomatis ketika konfigurasi atau pemilihan model
menyebut acme-cli/....
setup.cliBackends adalah permukaan setup berbasis deskriptor terlebih
dahulu. Tambahkan ini ketika penemuan model, onboarding, atau status harus
mengenali backend tanpa memuat runtime Plugin. Gunakan requiresRuntime: false hanya ketika deskriptor statis tersebut cukup untuk setup.
Daftarkan backend
import { definePluginEntry } from "openclaw/plugin-sdk/plugin-entry";
import {
CLI_FRESH_WATCHDOG_DEFAULTS,
CLI_RESUME_WATCHDOG_DEFAULTS,
type CliBackendPlugin,
} from "openclaw/plugin-sdk/cli-backend";
function buildAcmeCliBackend(): CliBackendPlugin {
return {
id: "acme-cli",
liveTest: {
defaultModelRef: "acme-cli/acme-large",
defaultImageProbe: false,
defaultMcpProbe: false,
docker: {
npmPackage: "@acme/acme-cli",
binaryName: "acme",
},
},
config: {
command: "acme",
args: ["chat", "--json"],
output: "json",
input: "stdin",
modelArg: "--model",
sessionArg: "--session",
sessionMode: "existing",
sessionIdFields: ["session_id", "conversation_id"],
systemPromptFileArg: "--system-file",
systemPromptWhen: "first",
imageArg: "--image",
imageMode: "repeat",
reliability: {
watchdog: {
fresh: { ...CLI_FRESH_WATCHDOG_DEFAULTS },
resume: { ...CLI_RESUME_WATCHDOG_DEFAULTS },
},
},
serialize: true,
},
};
}
export default definePluginEntry({
id: "acme-cli",
name: "Acme CLI",
description: "Run Acme's local AI CLI through OpenClaw",
register(api) {
api.registerCliBackend(buildAcmeCliBackend());
},
});
Id backend harus cocok dengan entri cliBackends manifest. config yang
didaftarkan hanya default; konfigurasi pengguna di bawah
agents.defaults.cliBackends.acme-cli digabungkan di atasnya saat runtime.
Bentuk konfigurasi
CliBackendConfig menjelaskan bagaimana OpenClaw harus meluncurkan dan
mengurai CLI:
| Bidang | Penggunaan |
|---|---|
command |
Nama biner atau path perintah absolut |
args |
argv dasar untuk eksekusi baru |
resumeArgs |
argv alternatif untuk sesi yang dilanjutkan; mendukung {sessionId} |
output / resumeOutput |
Parser: json, jsonl, atau text |
input |
Transport prompt: arg atau stdin |
modelArg |
Flag yang digunakan sebelum id model |
modelAliases |
Memetakan id model OpenClaw ke id native CLI |
sessionArg / sessionArgs |
Cara meneruskan id sesi |
sessionMode |
always, existing, atau none |
sessionIdFields |
Bidang JSON yang dibaca OpenClaw dari output CLI |
systemPromptArg / systemPromptFileArg |
Transport prompt sistem |
systemPromptWhen |
first, always, atau never |
imageArg / imageMode |
Dukungan path gambar |
serialize |
Menjaga eksekusi backend yang sama tetap berurutan |
reliability.watchdog |
Penyesuaian timeout tanpa output |
Pilih konfigurasi statis terkecil yang cocok dengan CLI. Tambahkan callback Plugin hanya untuk perilaku yang benar-benar menjadi milik backend.
Hook backend lanjutan
CliBackendPlugin juga dapat mendefinisikan:
| Hook | Penggunaan |
|---|---|
normalizeConfig(config, context) |
Menulis ulang konfigurasi pengguna lama setelah merge |
resolveExecutionArgs(ctx) |
Menambahkan flag berlingkup permintaan seperti effort berpikir |
prepareExecution(ctx) |
Membuat jembatan autentikasi atau konfigurasi sementara sebelum peluncuran |
transformSystemPrompt(ctx) |
Menerapkan transformasi prompt sistem akhir yang spesifik CLI |
textTransforms |
Penggantian prompt/output dua arah |
defaultAuthProfileId |
Memilih profil autentikasi OpenClaw tertentu |
authEpochMode |
Menentukan bagaimana perubahan autentikasi membatalkan sesi CLI tersimpan |
nativeToolMode |
Mendeklarasikan apakah CLI memiliki alat native yang selalu aktif |
bundleMcp / bundleMcpMode |
Mengikutsertakan jembatan alat MCP loopback OpenClaw |
Jaga agar hook ini tetap dimiliki penyedia. Jangan menambahkan cabang spesifik CLI ke core ketika hook backend dapat mengekspresikan perilaku tersebut.
Jembatan alat MCP
Backend CLI tidak menerima alat OpenClaw secara default. Jika CLI dapat mengonsumsi konfigurasi MCP, ikut sertakan secara eksplisit:
return {
id: "acme-cli",
bundleMcp: true,
bundleMcpMode: "codex-config-overrides",
config: {
command: "acme",
args: ["chat", "--json"],
output: "json",
},
};
Mode jembatan yang didukung adalah:
| Mode | Penggunaan |
|---|---|
claude-config-file |
CLI yang menerima file konfigurasi MCP |
codex-config-overrides |
CLI yang menerima override konfigurasi pada argv |
gemini-system-settings |
CLI yang membaca pengaturan MCP dari direktori pengaturan sistemnya |
Aktifkan jembatan hanya ketika CLI benar-benar dapat mengonsumsinya. Jika CLI
memiliki lapisan alat bawaan sendiri yang tidak dapat dinonaktifkan, tetapkan
nativeToolMode: "always-on" agar OpenClaw dapat gagal secara tertutup ketika
pemanggil mensyaratkan tidak ada alat native.
Konfigurasi pengguna
Pengguna dapat menimpa default backend apa pun:
{
agents: {
defaults: {
cliBackends: {
"acme-cli": {
command: "/opt/acme/bin/acme",
args: ["chat", "--json", "--profile", "work"],
modelAliases: {
large: "acme-large-2026",
},
},
},
model: {
primary: "openai/gpt-5.5",
fallbacks: ["acme-cli/large"],
},
},
},
}
Dokumentasikan override minimum yang kemungkinan dibutuhkan pengguna. Biasanya
itu hanya command ketika biner berada di luar PATH.
Verifikasi
Untuk Plugin yang dibundel, tambahkan pengujian terfokus di sekitar builder dan pendaftaran setup, lalu jalankan lane pengujian tertarget milik Plugin:
pnpm test extensions/acme-cli
Untuk Plugin lokal atau terpasang, verifikasi penemuan dan satu eksekusi model nyata:
openclaw plugins inspect acme-cli --runtime --json
openclaw agent --message "reply exactly: backend ok" --model acme-cli/acme-large
Jika backend mendukung gambar atau MCP, tambahkan smoke langsung yang membuktikan path tersebut dengan CLI nyata. Jangan mengandalkan inspeksi statis untuk perilaku prompt, gambar, MCP, atau lanjutkan-sesi.
Checklist
OPENCLAW_DOCS_MARKER:calloutOpen:Q2hlY2s
package.json memiliki openclaw.extensions dan entri runtime yang sudah dibangun untuk paket yang dipublikasikan
OPENCLAW_DOCS_MARKER:calloutClose:
OPENCLAW_DOCS_MARKER:calloutOpen:Q2hlY2s
openclaw.plugin.json mendeklarasikan cliBackends dan activation.onStartup yang disengaja
OPENCLAW_DOCS_MARKER:calloutClose:
OPENCLAW_DOCS_MARKER:calloutOpen:Q2hlY2s
setup.cliBackends hadir ketika setup/penemuan model harus melihat backend dalam keadaan dingin
OPENCLAW_DOCS_MARKER:calloutClose:
OPENCLAW_DOCS_MARKER:calloutOpen:Q2hlY2s
api.registerCliBackend(...) menggunakan id backend yang sama dengan manifest
OPENCLAW_DOCS_MARKER:calloutClose:
OPENCLAW_DOCS_MARKER:calloutOpen:Q2hlY2s
Override pengguna di bawah agents.defaults.cliBackends.<id> tetap menang
OPENCLAW_DOCS_MARKER:calloutClose: