Plugins
การสร้าง Plugin แบ็กเอนด์ CLI
Plugin แบ็กเอนด์ CLI ช่วยให้ OpenClaw เรียก CLI AI ภายในเครื่องเป็นแบ็กเอนด์การอนุมานข้อความได้ แบ็กเอนด์จะแสดงเป็นคำนำหน้าผู้ให้บริการใน refs ของโมเดล:
acme-cli/acme-large
ใช้แบ็กเอนด์ CLI เมื่อการผสาน upstream ถูกเปิดเผยเป็นคำสั่งภายในเครื่องอยู่แล้ว เมื่อ CLI เป็นเจ้าของสถานะการเข้าสู่ระบบภายในเครื่อง หรือเมื่อ CLI เป็นตัวเลือกสำรองที่มีประโยชน์หากผู้ให้บริการ API ไม่พร้อมใช้งาน
สิ่งที่ Plugin เป็นเจ้าของ
Plugin แบ็กเอนด์ CLI มีสัญญาสามส่วน:
| สัญญา | ไฟล์ | วัตถุประสงค์ |
|---|---|---|
| จุดเข้าแพ็กเกจ | package.json |
ชี้ OpenClaw ไปยังโมดูล runtime ของ Plugin |
| ความเป็นเจ้าของ manifest | openclaw.plugin.json |
ประกาศรหัสแบ็กเอนด์ก่อนโหลด runtime |
| การลงทะเบียน runtime | index.ts |
เรียก api.registerCliBackend(...) พร้อมค่าเริ่มต้นของคำสั่ง |
manifest เป็นเมทาดาทาสำหรับการค้นพบ มันไม่ได้เรียกใช้ CLI และไม่ได้ลงทะเบียนพฤติกรรม runtime พฤติกรรม runtime เริ่มเมื่อจุดเข้า Plugin เรียก api.registerCliBackend(...)
Plugin แบ็กเอนด์ขั้นต่ำ
สร้างเมทาดาทาแพ็กเกจ
{
"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"
}
}
แพ็กเกจที่เผยแพร่ต้องจัดส่งไฟล์ runtime JavaScript ที่ build แล้ว หากจุดเข้าซอร์สของคุณคือ ./src/index.ts ให้เพิ่ม openclaw.runtimeExtensions ที่ชี้ไปยังไฟล์ JavaScript ที่ build แล้วคู่กัน ดู จุดเข้า
ประกาศความเป็นเจ้าของแบ็กเอนด์
{
"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 คือรายการความเป็นเจ้าของ runtime ซึ่งช่วยให้ OpenClaw โหลด Plugin อัตโนมัติเมื่อ config หรือการเลือกโมเดลกล่าวถึง acme-cli/...
setup.cliBackends คือพื้นผิวการตั้งค่าแบบ descriptor-first เพิ่มเมื่อการค้นพบโมเดล การเริ่มใช้งาน หรือสถานะควรรู้จักแบ็กเอนด์โดยไม่ต้องโหลด runtime ของ Plugin ใช้ requiresRuntime: false เฉพาะเมื่อ descriptor แบบสแตติกเหล่านั้นเพียงพอสำหรับการตั้งค่า
ลงทะเบียนแบ็กเอนด์
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());
},
});
รหัสแบ็กเอนด์ต้องตรงกับรายการ cliBackends ใน manifest ส่วน config ที่ลงทะเบียนเป็นเพียงค่าเริ่มต้นเท่านั้น config ของผู้ใช้ภายใต้ agents.defaults.cliBackends.acme-cli จะถูก merge ทับใน runtime
รูปแบบ config
CliBackendConfig อธิบายว่า OpenClaw ควรเรียกใช้และแยกวิเคราะห์ CLI อย่างไร:
| ฟิลด์ | การใช้งาน |
|---|---|
command |
ชื่อไบนารีหรือพาธคำสั่งแบบสมบูรณ์ |
args |
argv พื้นฐานสำหรับการรันใหม่ |
resumeArgs |
argv ทางเลือกสำหรับเซสชันที่ดำเนินต่อ รองรับ {sessionId} |
output / resumeOutput |
ตัวแยกวิเคราะห์: json, jsonl หรือ text |
input |
การส่งพรอมป์: arg หรือ stdin |
modelArg |
แฟล็กที่ใช้ก่อนรหัสโมเดล |
modelAliases |
แมปรหัสโมเดล OpenClaw ไปยังรหัสแบบเนทีฟของ CLI |
sessionArg / sessionArgs |
วิธีส่งรหัสเซสชัน |
sessionMode |
always, existing หรือ none |
sessionIdFields |
ฟิลด์ JSON ที่ OpenClaw อ่านจากเอาต์พุต CLI |
systemPromptArg / systemPromptFileArg |
การส่งพรอมป์ระบบ |
systemPromptWhen |
first, always หรือ never |
imageArg / imageMode |
การรองรับพาธรูปภาพ |
serialize |
รักษาลำดับการรันของแบ็กเอนด์เดียวกัน |
reliability.watchdog |
การปรับแต่ง timeout เมื่อไม่มีเอาต์พุต |
เลือกใช้ config แบบสแตติกที่เล็กที่สุดซึ่งตรงกับ CLI เพิ่ม callback ของ Plugin เฉพาะสำหรับพฤติกรรมที่เป็นของแบ็กเอนด์จริง ๆ
hook แบ็กเอนด์ขั้นสูง
CliBackendPlugin ยังสามารถกำหนด:
| Hook | การใช้งาน |
|---|---|
normalizeConfig(config, context) |
เขียน config ผู้ใช้แบบเก่าใหม่หลัง merge |
resolveExecutionArgs(ctx) |
เพิ่มแฟล็กตามขอบเขตคำขอ เช่น ระดับความพยายามในการคิด |
prepareExecution(ctx) |
สร้างสะพาน auth หรือ config ชั่วคราวก่อนเริ่มทำงาน |
transformSystemPrompt(ctx) |
ใช้การแปลงพรอมป์ระบบขั้นสุดท้ายที่เจาะจงกับ CLI |
textTransforms |
การแทนที่พรอมป์/เอาต์พุตแบบสองทิศทาง |
defaultAuthProfileId |
เลือกใช้โปรไฟล์ auth ของ OpenClaw ที่เจาะจง |
authEpochMode |
ตัดสินว่าการเปลี่ยน auth ทำให้เซสชัน CLI ที่จัดเก็บไว้หมดอายุอย่างไร |
nativeToolMode |
ประกาศว่า CLI มีเครื่องมือเนทีฟที่เปิดตลอดหรือไม่ |
bundleMcp / bundleMcpMode |
เลือกใช้สะพานเครื่องมือ MCP ผ่าน loopback ของ OpenClaw |
ให้ hook เหล่านี้เป็นของผู้ให้บริการ อย่าเพิ่ม branch ที่เจาะจง CLI ลงใน core เมื่อ hook แบ็กเอนด์สามารถแสดงพฤติกรรมได้
สะพานเครื่องมือ MCP
แบ็กเอนด์ CLI จะไม่ได้รับเครื่องมือ OpenClaw โดยค่าเริ่มต้น หาก CLI สามารถใช้ config MCP ได้ ให้เลือกใช้โดยชัดเจน:
return {
id: "acme-cli",
bundleMcp: true,
bundleMcpMode: "codex-config-overrides",
config: {
command: "acme",
args: ["chat", "--json"],
output: "json",
},
};
โหมดสะพานที่รองรับคือ:
| โหมด | การใช้งาน |
|---|---|
claude-config-file |
CLI ที่ยอมรับไฟล์ config MCP |
codex-config-overrides |
CLI ที่ยอมรับการ override config บน argv |
gemini-system-settings |
CLI ที่อ่านการตั้งค่า MCP จากไดเรกทอรีการตั้งค่าระบบของตัวเอง |
เปิดใช้สะพานเฉพาะเมื่อ CLI ใช้งานได้จริง หาก CLI มีเลเยอร์เครื่องมือในตัวที่ปิดไม่ได้ ให้ตั้ง nativeToolMode: "always-on" เพื่อให้ OpenClaw ปิดกั้นอย่างปลอดภัยเมื่อผู้เรียกต้องการไม่มีเครื่องมือเนทีฟ
การกำหนดค่าของผู้ใช้
ผู้ใช้สามารถ override ค่าเริ่มต้นของแบ็กเอนด์ใดก็ได้:
{
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"],
},
},
},
}
บันทึก override ขั้นต่ำที่ผู้ใช้น่าจะต้องใช้ โดยทั่วไปคือเฉพาะ command เมื่อไบนารีอยู่นอก PATH
การตรวจสอบ
สำหรับ Plugin ที่รวมมาในชุด ให้เพิ่มการทดสอบแบบเฉพาะจุดรอบ builder และการลงทะเบียน setup จากนั้นรัน lane ทดสอบเป้าหมายของ Plugin:
pnpm test extensions/acme-cli
สำหรับ Plugin ภายในเครื่องหรือที่ติดตั้งแล้ว ให้ตรวจสอบการค้นพบและการรันโมเดลจริงหนึ่งครั้ง:
openclaw plugins inspect acme-cli --runtime --json
openclaw agent --message "reply exactly: backend ok" --model acme-cli/acme-large
หากแบ็กเอนด์รองรับรูปภาพหรือ MCP ให้เพิ่ม live smoke ที่พิสูจน์เส้นทางเหล่านั้นด้วย CLI จริง อย่าพึ่งพาการตรวจสอบแบบสแตติกสำหรับพฤติกรรมพรอมป์ รูปภาพ MCP หรือการดำเนินเซสชันต่อ
รายการตรวจสอบ
OPENCLAW_DOCS_MARKER:calloutOpen:Q2hlY2s
package.json มี openclaw.extensions และจุดเข้า runtime ที่ build แล้วสำหรับแพ็กเกจที่เผยแพร่
OPENCLAW_DOCS_MARKER:calloutClose:
OPENCLAW_DOCS_MARKER:calloutOpen:Q2hlY2s
openclaw.plugin.json ประกาศ cliBackends และ activation.onStartup ตามเจตนา
OPENCLAW_DOCS_MARKER:calloutClose:
OPENCLAW_DOCS_MARKER:calloutOpen:Q2hlY2s
setup.cliBackends มีอยู่เมื่อการตั้งค่า/การค้นพบโมเดลควรมองเห็นแบ็กเอนด์แบบเย็น
OPENCLAW_DOCS_MARKER:calloutClose:
OPENCLAW_DOCS_MARKER:calloutOpen:Q2hlY2s
api.registerCliBackend(...) ใช้รหัสแบ็กเอนด์เดียวกับ manifest
OPENCLAW_DOCS_MARKER:calloutClose:
OPENCLAW_DOCS_MARKER:calloutOpen:Q2hlY2s
override ของผู้ใช้ภายใต้ agents.defaults.cliBackends.<id> ยังคงชนะ
OPENCLAW_DOCS_MARKER:calloutClose: