Building plugins
إنشاء Plugins
توسّع Plugins قدرات OpenClaw من دون تغيير النواة. يمكن لـ Plugin إضافة قناة مراسلة، أو موفّر نماذج، أو واجهة CLI خلفية محلية، أو أداة للوكيل، أو خطاف، أو موفّر وسائط، أو قدرة أخرى يملكها Plugin.
لا تحتاج إلى إضافة Plugin خارجي إلى مستودع OpenClaw. انشر الحزمة على ClawHub، ويمكن للمستخدمين تثبيتها باستخدام:
openclaw plugins install clawhub:<package-name>تظل مواصفات الحزم المجرّدة تُثبَّت من npm خلال فترة الانتقال عند الإطلاق. استخدم
البادئة clawhub: عندما تريد الحل عبر ClawHub.
المتطلبات
- Node 22.19+، أو Node 23.11+، أو Node 24+، و
npmأوpnpm. - وحدات TypeScript بنمط ESM.
- للعمل على Plugin مضمّن داخل المستودع، استنسخ المستودع وشغّل
pnpm install. يقتصر تطوير Plugins من نسخة الشيفرة المصدرية على pnpm لأن OpenClaw يكتشف Plugins المضمّنة من حزم مساحة العملextensions/*.
اختر بنية Plugin
صِل OpenClaw بمنصة مراسلة.
أضف موفّر نماذج، أو وسائط، أو بحث، أو جلب، أو كلام، أو وقت فعلي.
شغّل CLI محلية للذكاء الاصطناعي من خلال الرجوع الاحتياطي لنماذج OpenClaw.
سجّل أدوات الوكيل.
البدء السريع
أنشئ Plugin أدوات بسيطًا عبر تسجيل أداة وكيل إلزامية واحدة. هذه هي أقصر بنية مفيدة لـ Plugin، وتشمل الحزمة والبيان ونقطة الدخول والتحقق المحلي.
Create package metadata
{"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}}ينبغي أن تشير إدخالات وقت التشغيل في Plugins الخارجية المنشورة إلى ملفات JavaScript المبنية. راجع نقاط دخول SDK للاطلاع على عقد نقطة الدخول الكامل.
يحتاج كل Plugin إلى بيان، حتى من دون إعدادات. يجب أن تظهر أدوات وقت التشغيل
في contracts.tools حتى يتمكن OpenClaw من اكتشاف الملكية من دون
تحميل وقت تشغيل كل Plugin مسبقًا. اضبط activation.onStartup
عن قصد؛ يُحمَّل هذا المثال عند بدء تشغيل Gateway.
تخضع أسطح Plugins الموثوق بها من المضيف أيضًا لبوابة البيان، وتتطلب تصريحًا
صريحًا لـ Plugins المثبّتة: يتطلب api.registerAgentToolResultMiddleware(...)
إدراج كل وقت تشغيل مستهدف في contracts.agentToolResultMiddleware،
ويتطلب api.registerTrustedToolPolicy(...) إدراج معرّف كل سياسة في
contracts.trustedToolPolicies. تُبقي هذه التصريحات الفحص وقت التثبيت
وتسجيل وقت التشغيل متوافقين.
للاطلاع على كل حقل في البيان، راجع بيان Plugin.
Register the tool
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 مع Plugins غير الخاصة بالقنوات. أما Plugins القنوات فتستخدم
defineChannelPluginEntry من openclaw/plugin-sdk/core بدلًا منه.
Test the runtime
بالنسبة إلى Plugin مثبّت أو خارجي، افحص وقت التشغيل المحمّل:
openclaw plugins inspect my-plugin --runtime --jsonإذا كان Plugin يسجّل أمر CLI، فشغّل ذلك الأمر أيضًا وتحقق
من المخرجات، مثل openclaw demo-plugin ping.
بالنسبة إلى Plugin مضمّن في هذا المستودع، يكتشف OpenClaw حزم Plugins
في نسخة الشيفرة المصدرية من مساحة العمل extensions/*. شغّل أقرب
اختبار مستهدف:
pnpm test extensions/my-plugin/pnpm checkTest the package install
قبل نشر 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 --jsonيستخدم npm-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"] }, // 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"].
للاطلاع على خريطة الاستيراد الكاملة، راجع نظرة عامة على SDK الخاص بـPlugin.
قائمة التحقق قبل الإرسال
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: