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 กับแพลตฟอร์มรับส่งข้อความ
เพิ่มผู้ให้บริการโมเดล สื่อ การค้นหา การดึงข้อมูล เสียงพูด หรือแบบเรียลไทม์
เรียกใช้ CLI AI ภายในเครื่องผ่านกลไกสำรองโมเดลของ 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": "Adds a custom tool to 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() }), outputSchema: Type.Object( { input: Type.String() }, { additionalProperties: false }, ), async execute(_id, params) { const details = { input: params.input }; return { content: [{ type: "text", text: `Got: ${params.input}` }], details, }; }, }); },});ใช้ 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 และติดตั้ง tarball ด้วย 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() }), outputSchema: Type.Object( { pipeline: Type.String() }, { additionalProperties: false }, ), async execute(_id, params) { return { content: [{ type: "text", text: params.pipeline }], details: { pipeline: params.pipeline }, }; }, }, { optional: true }, );}outputSchema เป็นตัวเลือก โดยอธิบายค่า details ที่มีโครงสร้างซึ่งใช้โดย
โหมดโค้ด และ การค้นหาเครื่องมือ การเรียกใช้แค็ตตาล็อก
จะปฏิเสธสคีมาที่ไม่ถูกต้องก่อนดำเนินการ และตรวจสอบค่าขั้นสุดท้ายหลังจาก
ฮุกเครื่องมือ ให้ละเว้นสำหรับเครื่องมือที่ไม่มีผลลัพธ์ JSON ที่เสถียร โปรดดู
สัญญาฉบับเต็มที่ Plugin เครื่องมือ
เครื่องมือทุกตัวที่ลงทะเบียนด้วย api.registerTool(...) ต้องประกาศไว้ใน
ไฟล์กำกับ Plugin ด้วย:
{ "contracts": { "tools": ["workflow_tool"] }, "toolMetadata": { "workflow_tool": { "optional": true } }}ผู้ใช้เลือกเข้าร่วมด้วย tools.allow:
{ tools: { allow: ["workflow_tool"] }, // or ["my-plugin"] for every tool from one 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 ตัวช่วยเฉพาะผู้ให้บริการควรอยู่ในแพ็กเกจผู้ให้บริการ เว้นแต่
รอยต่อดังกล่าวจะเป็นแบบทั่วไปอย่างแท้จริง
เมธอด RPC ของ Gateway แบบกำหนดเองเป็นจุดเข้าใช้งานขั้นสูง ให้ใช้คำนำหน้า
เฉพาะ 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: