Building plugins
การสร้าง Plugin
Plugin ช่วยขยายความสามารถของ OpenClaw โดยไม่ต้องแก้ไขส่วนแกนหลัก Plugin สามารถเพิ่มช่องทางการส่งข้อความ ผู้ให้บริการโมเดล แบ็กเอนด์ CLI ภายในเครื่อง เครื่องมือเอเจนต์ ฮุก ผู้ให้บริการสื่อ หรือความสามารถอื่นที่ Plugin เป็นเจ้าของ
ไม่จำเป็นต้องเพิ่ม Plugin ภายนอกลงในรีโพซิทอรี OpenClaw ให้เผยแพร่แพ็กเกจไปยัง ClawHub แล้วผู้ใช้ติดตั้งด้วย:
openclaw plugins install clawhub:<package-name>ในช่วงเปลี่ยนผ่านของการเปิดตัว ข้อกำหนดแพ็กเกจแบบไม่มีคำนำหน้ายังคงติดตั้งจาก npm ใช้คำนำหน้า clawhub: เมื่อต้องการให้ ClawHub ดำเนินการแก้ไขตำแหน่งแพ็กเกจ
ข้อกำหนด
- Node 22.22.3+, Node 24.15+ หรือ Node 25.9+ และ
npmหรือpnpm - โมดูล TypeScript ESM
- สำหรับงานพัฒนา Plugin แบบบันเดิลภายในรีโพซิทอรี ให้โคลนรีโพซิทอรีแล้วเรียกใช้
pnpm installการพัฒนา Plugin จากซอร์สเช็กเอาต์รองรับเฉพาะ pnpm เนื่องจาก OpenClaw ค้นพบ Plugin แบบบันเดิลจากแพ็กเกจเวิร์กสเปซextensions/*
เลือกรูปแบบ Plugin
เชื่อมต่อ OpenClaw กับแพลตฟอร์มรับส่งข้อความ
เพิ่มผู้ให้บริการโมเดล สื่อ การค้นหา การดึงข้อมูล เสียงพูด หรือการทำงานแบบเรียลไทม์
เรียกใช้ AI CLI ภายในเครื่องผ่านกลไกสำรองโมเดลของ OpenClaw
ลงทะเบียนเครื่องมือเอเจนต์
เริ่มต้นอย่างรวดเร็ว
สร้าง Plugin เครื่องมือขั้นต่ำโดยลงทะเบียนเครื่องมือเอเจนต์ที่จำเป็นหนึ่งรายการ นี่คือ รูปแบบ Plugin ที่สั้นที่สุดแต่ใช้งานได้จริง และครอบคลุมแพ็กเกจ แมนิเฟสต์ จุดเข้าใช้งาน และ การพิสูจน์ภายในเครื่อง
สร้างข้อมูลเมตาของแพ็กเกจ
{"name": "@myorg/openclaw-my-plugin","version": "1.0.0","type": "module","dependencies": {"typebox": "1.1.39"},"peerDependencies": {"openclaw": ">=2026.3.24-beta.2"},"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"}}}{"id": "my-plugin","name": "My Plugin","description": "เพิ่มเครื่องมือแบบกำหนดเองให้ OpenClaw","contracts": {"tools": ["my_tool"]},"activation": {"onStartup": true},"configSchema": {"type": "object","additionalProperties": false}}Plugin ภายนอกที่เผยแพร่แล้วควรกำหนดให้รายการรันไทม์ชี้ไปยังไฟล์ JavaScript ที่สร้างเสร็จแล้ว ดูสัญญาจุดเข้าใช้งานฉบับเต็มได้ที่ จุดเข้าใช้งาน SDK
Plugin ทุกตัวต้องมีแมนิเฟสต์ แม้ไม่มีการกำหนดค่าก็ตาม เครื่องมือรันไทม์ต้อง
ปรากฏใน contracts.tools เพื่อให้ OpenClaw ค้นพบความเป็นเจ้าของได้โดยไม่ต้อง
โหลดรันไทม์ของ Plugin ทุกตัวล่วงหน้า กำหนด activation.onStartup
อย่างตั้งใจ ตัวอย่างนี้จะโหลดเมื่อ Gateway เริ่มทำงาน
พื้นผิว Plugin ที่โฮสต์ไว้วางใจก็ถูกควบคุมด้วยแมนิเฟสต์เช่นกัน และ Plugin
ที่ติดตั้งต้องประกาศอย่างชัดเจน: api.registerAgentToolResultMiddleware(...)
ต้องระบุรันไทม์เป้าหมายแต่ละรายการใน contracts.agentToolResultMiddleware
และ api.registerTrustedToolPolicy(...) ต้องระบุรหัสนโยบายแต่ละรายการใน
contracts.trustedToolPolicies การประกาศเหล่านี้ช่วยให้การตรวจสอบขณะติดตั้ง
สอดคล้องกับการลงทะเบียนขณะรันไทม์
สำหรับฟิลด์ทั้งหมดในแมนิเฟสต์ โปรดดู แมนิเฟสต์ Plugin
ลงทะเบียนเครื่องมือ
import { Type } from "typebox";import { definePluginEntry } from "openclaw/plugin-sdk/plugin-entry"; export default definePluginEntry({ id: "my-plugin", name: "My Plugin", description: "Adds a custom tool to OpenClaw", register(api) { api.registerTool({ name: "my_tool", description: "Echo one input value", parameters: Type.Object({ input: Type.String() }), async execute(_id, params) { return { content: [{ type: "text", text: `Got: ${params.input}` }], }; }, }); },});ใช้ definePluginEntry สำหรับ Plugin ที่ไม่ใช่ช่องทาง ส่วน Plugin ช่องทางให้ใช้
defineChannelPluginEntry จาก openclaw/plugin-sdk/core แทน
ทดสอบรันไทม์
สำหรับ Plugin ที่ติดตั้งแล้วหรือ Plugin ภายนอก ให้ตรวจสอบรันไทม์ที่โหลด:
openclaw plugins inspect my-plugin --runtime --jsonหาก Plugin ลงทะเบียนคำสั่ง CLI ให้เรียกใช้คำสั่งนั้นด้วยและยืนยัน
เอาต์พุต เช่น openclaw demo-plugin ping
สำหรับ Plugin แบบบันเดิลในรีโพซิทอรีนี้ OpenClaw จะค้นพบแพ็กเกจ Plugin
จากซอร์สเช็กเอาต์ในเวิร์กสเปซ extensions/* ให้เรียกใช้การทดสอบแบบเจาะจงที่ใกล้เคียงที่สุด:
pnpm test extensions/my-plugin/pnpm checkทดสอบการติดตั้งแพ็กเกจ
ก่อนเผยแพร่ Plugin ที่พร้อมเป็นแพ็กเกจ ให้ทดสอบด้วยรูปแบบการติดตั้งเดียวกับที่ผู้ใช้
จะได้รับ ขั้นแรกให้เพิ่มขั้นตอนบิลด์ กำหนดให้รายการรันไทม์ เช่น
openclaw.extensions ชี้ไปยัง JavaScript ที่สร้างแล้ว เช่น ./dist/index.js และตรวจสอบว่า
npm pack รวมเอาต์พุต dist/ นั้น รายการซอร์ส TypeScript
มีไว้สำหรับซอร์สเช็กเอาต์และเส้นทางการพัฒนาภายในเครื่องเท่านั้น
จากนั้นแพ็ก Plugin และติดตั้งทาร์บอลด้วย npm-pack::
npm pack --pack-destination /tmpopenclaw plugins install npm-pack:/tmp/<plugin-package>.tgz --forceopenclaw plugins inspect my-plugin --runtime --jsonnpm-pack: ใช้โปรเจกต์ npm ต่อ Plugin ที่ OpenClaw จัดการ จึงตรวจพบ
ข้อผิดพลาดด้านการขึ้นต่อกันของรันไทม์ที่การทดสอบซอร์สเช็กเอาต์อาจซ่อนไว้ วิธีนี้พิสูจน์
รูปแบบแพ็กเกจและการขึ้นต่อกัน ไม่ใช่สถานะความไว้วางใจอย่างเป็นทางการที่เชื่อมโยงกับแค็ตตาล็อก
การนำเข้าขณะรันไทม์ต้องอยู่ใน dependencies หรือ optionalDependencies;
การขึ้นต่อกันที่อยู่เฉพาะใน devDependencies จะไม่ถูกติดตั้งให้กับ
โปรเจกต์รันไทม์ที่จัดการไว้
อย่าใช้การติดตั้งจากไฟล์เก็บถาวรหรือพาธโดยตรงเป็นหลักฐานขั้นสุดท้ายสำหรับพฤติกรรม ของ Plugin อย่างเป็นทางการหรือที่มีสิทธิ์พิเศษ ซอร์สดิบมีประโยชน์สำหรับการดีบักภายในเครื่อง แต่ ไม่ได้พิสูจน์เส้นทางการขึ้นต่อกันแบบเดียวกับการติดตั้งจาก npm หรือ ClawHub หาก Plugin อาศัยสถานะ Plugin ทางการที่เชื่อถือได้ ให้เพิ่มหลักฐานชุดที่สอง ผ่านการติดตั้งอย่างเป็นทางการที่มีแค็ตตาล็อกรองรับ หรือเส้นทางแพ็กเกจที่เผยแพร่แล้วซึ่ง บันทึกสถานะความไว้วางใจอย่างเป็นทางการ ดูรายละเอียดความเป็นเจ้าของรูทการติดตั้งและ การขึ้นต่อกันที่ การแก้ไขการขึ้นต่อกันของ Plugin
เผยแพร่
ตรวจสอบความถูกต้องของแพ็กเกจก่อนเผยแพร่:
clawhub package publish your-org/your-plugin --dry-runclawhub package publish your-org/your-pluginตัวอย่างแพ็กเกจ ClawHub มาตรฐานอยู่ใน docs/snippets/plugin-publish/
ติดตั้ง
ติดตั้งแพ็กเกจที่เผยแพร่แล้วผ่าน ClawHub:
openclaw plugins install clawhub:your-org/your-pluginการลงทะเบียนเครื่องมือ
เครื่องมืออาจเป็นแบบจำเป็นหรือไม่บังคับ เครื่องมือที่จำเป็นจะพร้อมใช้งานเสมอเมื่อ เปิดใช้งาน Plugin ส่วนเครื่องมือที่ไม่บังคับต้องให้ผู้ใช้เลือกเข้าร่วมอย่างชัดเจนก่อนที่ OpenClaw จะโหลดรันไทม์ของ Plugin เจ้าของ
แฟกทอรีเครื่องมือจะได้รับบริบทรันไทม์ที่เชื่อถือได้ รวมถึง deliveryContext,
nativeChannelId สำหรับบทสนทนาบนแพลตฟอร์มที่ใช้งานอยู่เมื่อมี และ
requesterSenderId
register(api) { api.registerTool( { name: "workflow_tool", description: "Run a workflow", parameters: Type.Object({ pipeline: Type.String() }), async execute(_id, params) { return { content: [{ type: "text", text: params.pipeline }] }; }, }, { optional: true }, );}เครื่องมือทุกตัวที่ลงทะเบียนด้วย api.registerTool(...) ต้องประกาศใน
แมนิเฟสต์ของ Plugin ด้วย:
{ "contracts": { "tools": ["workflow_tool"] }, "toolMetadata": { "workflow_tool": { "optional": true } }}ผู้ใช้เลือกเข้าร่วมด้วย tools.allow:
{ tools: { allow: ["workflow_tool"] }, // หรือ ["my-plugin"] สำหรับเครื่องมือทั้งหมดจาก Plugin เดียว}เครื่องมือที่ไม่บังคับควบคุมว่าเครื่องมือจะถูกเปิดเผยต่อโมเดลหรือไม่ ใช้ คำขอสิทธิ์ของ Plugin เมื่อเครื่องมือ หรือฮุกควรขอการอนุมัติหลังจากโมเดลเลือกแล้วและก่อนดำเนินการ
ใช้เครื่องมือที่ไม่บังคับสำหรับผลข้างเคียง ไบนารีที่ไม่ทั่วไป หรือความสามารถที่
ไม่ควรถูกเปิดเผยโดยค่าเริ่มต้น ชื่อเครื่องมือต้องไม่ขัดแย้งกับชื่อเครื่องมือแกนหลัก
รายการที่ขัดแย้งจะถูกข้ามและรายงานในการวินิจฉัย Plugin การลงทะเบียนที่มีรูปแบบ
ไม่ถูกต้องจะถูกข้ามและรายงานในลักษณะเดียวกัน ได้แก่ ไม่มี name
ที่ไม่ว่างเปล่า, execute ที่ไม่ใช่ฟังก์ชัน หรือตัวอธิบายเครื่องมือที่ไม่มีออบเจ็กต์ parameters
แฟกทอรีเครื่องมือจะได้รับออบเจ็กต์บริบทที่รันไทม์จัดหาให้ ใช้ ctx.activeModel
เมื่อเครื่องมือต้องบันทึก แสดงผล หรือปรับตามโมเดลที่ใช้งานอยู่สำหรับเทิร์นปัจจุบัน
โดยอาจมี provider, modelId และ modelRef ให้ถือว่าเป็น
ข้อมูลเมตารันไทม์เพื่อให้ข้อมูล ไม่ใช่ขอบเขตความปลอดภัยสำหรับป้องกันโอเปอเรเตอร์
ภายในเครื่อง โค้ด Plugin ที่ติดตั้ง หรือรันไทม์ OpenClaw ที่ถูกดัดแปลง เครื่องมือ
ภายในเครื่องที่ละเอียดอ่อนยังคงต้องกำหนดให้ Plugin หรือโอเปอเรเตอร์เลือกเข้าร่วมอย่างชัดเจน และ
ปฏิเสธการทำงานโดยค่าเริ่มต้นเมื่อข้อมูลเมตาของโมเดลที่ใช้งานอยู่หายไปหรือไม่เหมาะสม
แมนิเฟสต์ประกาศความเป็นเจ้าของและการค้นพบ ส่วนการดำเนินการยังคงเรียกใช้อิมพลีเมนเทชัน
เครื่องมือสดที่ลงทะเบียนไว้ รักษา toolMetadata.<tool>.optional: true
ให้สอดคล้องกับ api.registerTool(..., { optional: true }) เพื่อให้ OpenClaw หลีกเลี่ยง
การโหลดรันไทม์ของ Plugin นั้นจนกว่าเครื่องมือจะถูกเพิ่มลงในรายการอนุญาตอย่างชัดเจน
แนวทางการนำเข้า
นำเข้าจากพาธย่อย SDK ที่เจาะจง:
อย่านำเข้าจากบาร์เรลรูทที่เลิกใช้แล้ว:
ภายในแพ็กเกจ Plugin ให้ใช้ไฟล์บาร์เรลภายในเครื่อง เช่น api.ts และ
runtime-api.ts สำหรับการนำเข้าภายใน อย่านำเข้า Plugin ของตนเองผ่าน
พาธ SDK ตัวช่วยเฉพาะผู้ให้บริการควรอยู่ในแพ็กเกจผู้ให้บริการ เว้นแต่
รอยต่อดังกล่าวจะเป็นแบบทั่วไปอย่างแท้จริง
เมธอด Gateway RPC แบบกำหนดเองเป็นจุดเข้าใช้งานขั้นสูง ให้ใช้คำนำหน้า
เฉพาะ Plugin เนมสเปซผู้ดูแลระบบแกนหลัก เช่น config.*,
exec.approvals.*, operator.admin.*, wizard.* และ update.* ยังคงสงวนไว้
และแก้ไขเป็น operator.admin บริดจ์
openclaw/plugin-sdk/gateway-method-runtime สงวนไว้สำหรับเส้นทาง HTTP ของ Plugin
ที่ประกาศ contracts.gatewayMethodDispatch: ["authenticated-request"]
สำหรับแผนผังการนำเข้าฉบับเต็ม โปรดดู ภาพรวม Plugin SDK
รายการตรวจสอบก่อนส่ง
OPENCLAW_DOCS_MARKER:calloutOpen:Q2hlY2s
package.json มีข้อมูลเมตา openclaw ที่ถูกต้อง
OPENCLAW_DOCS_MARKER:calloutClose:
OPENCLAW_DOCS_MARKER:calloutOpen:Q2hlY2s มีแมนิเฟสต์ openclaw.plugin.json และถูกต้อง OPENCLAW_DOCS_MARKER:calloutClose:
OPENCLAW_DOCS_MARKER:calloutOpen:Q2hlY2s
จุดเข้าใช้งานใช้ defineChannelPluginEntry หรือ definePluginEntry
OPENCLAW_DOCS_MARKER:calloutClose:
OPENCLAW_DOCS_MARKER:calloutOpen:Q2hlY2s
การนำเข้าทั้งหมดใช้พาธ plugin-sdk/<subpath> ที่เจาะจง
OPENCLAW_DOCS_MARKER:calloutClose: