Building plugins

ساخت Plugin‌ها

Pluginها OpenClaw را بدون تغییر هسته گسترش می‌دهند. یک Plugin می‌تواند یک کانال پیام‌رسانی، ارائه‌دهنده مدل، پشتیبان محلی CLI، ابزار عامل، هوک، ارائه‌دهنده رسانه یا قابلیت دیگری تحت مالکیت Plugin اضافه کند.

لازم نیست یک Plugin خارجی را به مخزن OpenClaw اضافه کنید. بسته را در ClawHub منتشر کنید تا کاربران آن را با دستور زیر نصب کنند:

bash
openclaw plugins install clawhub:<package-name>

در دوره گذار راه‌اندازی، مشخصات بسته بدون پیشوند همچنان از npm نصب می‌شوند. وقتی می‌خواهید تفکیک نام از طریق ClawHub انجام شود، از پیشوند clawhub: استفاده کنید.

الزامات

  • Node 22.19+، Node 23.11+ یا Node 24+، و npm یا pnpm.
  • ماژول‌های ESM در TypeScript.
  • برای کار روی Plugin همراه‌شده درون مخزن، مخزن را کلون و pnpm install را اجرا کنید. توسعه Plugin در نسخه منبع فقط با pnpm انجام می‌شود، زیرا OpenClaw، Pluginهای همراه‌شده را از بسته‌های فضای کاری extensions/* شناسایی می‌کند.

ساختار Plugin را انتخاب کنید

شروع سریع

با ثبت یک ابزار عامل الزامی، یک Plugin ابزار حداقلی بسازید. این کوتاه‌ترین ساختار مفید Plugin است و بسته، مانیفست، نقطه ورود و اثبات محلی را پوشش می‌دهد.

  • فراداده بسته را ایجاد کنید

    package.json
    {"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"}}}
    openclaw.plugin.json
    {"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 مراجعه کنید.

  • ابزار را ثبت کنید

    index.ts
    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}` }],        };      },    });  },});

    برای Pluginهای غیرکانالی از definePluginEntry استفاده کنید. در عوض، Pluginهای کانال از defineChannelPluginEntry در openclaw/plugin-sdk/core استفاده می‌کنند.

  • زمان اجرا را آزمایش کنید

    برای یک Plugin نصب‌شده یا خارجی، زمان اجرای بارگذاری‌شده را بررسی کنید:

    bash
    openclaw plugins inspect my-plugin --runtime --json

    اگر Plugin یک فرمان CLI ثبت می‌کند، آن فرمان را نیز اجرا و خروجی را تأیید کنید؛ برای نمونه openclaw demo-plugin ping.

    برای یک Plugin همراه‌شده در این مخزن، OpenClaw بسته‌های Plugin نسخه منبع را از فضای کاری extensions/* شناسایی می‌کند. نزدیک‌ترین آزمون هدفمند را اجرا کنید:

    bash
    pnpm test extensions/my-plugin/pnpm check
  • نصب بسته را آزمایش کنید

    پیش از انتشار یک Plugin آماده بسته‌بندی، همان ساختار نصبی را آزمایش کنید که کاربران دریافت خواهند کرد. ابتدا یک مرحله ساخت اضافه کنید، ورودی‌های زمان اجرا مانند openclaw.extensions را به JavaScript ساخته‌شده‌ای مانند ./dist/index.js ارجاع دهید و مطمئن شوید npm pack خروجی dist/ را شامل می‌شود. ورودی‌های منبع TypeScript فقط برای نسخه‌های منبع و مسیرهای توسعه محلی هستند.

    سپس Plugin را بسته‌بندی کنید و فایل tar را با npm-pack: نصب کنید:

    bash
    npm pack --pack-destination /tmpopenclaw plugins install npm-pack:/tmp/<plugin-package>.tgz --forceopenclaw plugins inspect my-plugin --runtime --json

    npm-pack: از پروژه npm مدیریت‌شده OpenClaw برای هر Plugin استفاده می‌کند، بنابراین اشتباهات وابستگی زمان اجرا را که آزمایش نسخه منبع ممکن است پنهان کند، آشکار می‌سازد. این روش ساختار بسته و وابستگی را اثبات می‌کند، نه اعتماد رسمی متصل به کاتالوگ را. واردسازی‌های زمان اجرا باید در dependencies یا optionalDependencies باشند؛ وابستگی‌هایی که فقط در devDependencies باقی بمانند، برای پروژه زمان اجرای مدیریت‌شده نصب نخواهند شد.

    از نصب مستقیم بایگانی یا مسیر به‌عنوان اثبات نهایی رفتار رسمی یا دارای امتیاز ویژه Plugin استفاده نکنید. منابع خام برای اشکال‌زدایی محلی مفیدند، اما همان مسیر وابستگی نصب‌های npm یا ClawHub را اثبات نمی‌کنند. اگر Plugin شما به وضعیت مورداعتماد Plugin رسمی وابسته است، یک اثبات دوم از طریق نصب رسمی مبتنی بر کاتالوگ یا مسیر بسته منتشرشده‌ای اضافه کنید که اعتماد رسمی را ثبت می‌کند. برای جزئیات ریشه نصب و مالکیت وابستگی، به تفکیک وابستگی Plugin مراجعه کنید.

  • منتشر کنید

    بسته را پیش از انتشار اعتبارسنجی کنید:

    bash
    clawhub package publish your-org/your-plugin --dry-runclawhub package publish your-org/your-plugin

    قطعه‌کدهای مرجع بسته ClawHub در docs/snippets/plugin-publish/ قرار دارند.

  • نصب کنید

    بسته منتشرشده را از طریق ClawHub نصب کنید:

    bash
    openclaw plugins install clawhub:your-org/your-plugin
  • ثبت ابزارها

    ابزارها می‌توانند الزامی یا اختیاری باشند. وقتی Plugin فعال است، ابزارهای الزامی همیشه در دسترس‌اند. پیش از آنکه OpenClaw زمان اجرای Plugin مالک را بارگذاری کند، ابزارهای اختیاری به پذیرش صریح کاربر نیاز دارند.

    کارخانه‌های ابزار، زمینه مورداعتماد زمان اجرا را دریافت می‌کنند؛ از جمله deliveryContext، مقدار nativeChannelId برای گفت‌وگوی پلتفرم فعال در صورت وجود، و requesterSenderId.

    typescript
    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 نیز اعلان شود:

    json
    {  "contracts": {    "tools": ["workflow_tool"]  },  "toolMetadata": {    "workflow_tool": {      "optional": true    }  }}

    کاربران با tools.allow آن را فعال می‌کنند:

    json5
    {  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 وارد کنید:

    typescript
      

    از ورودی تجمیعی ریشه منسوخ‌شده وارد نکنید:

    typescript
     

    درون بسته 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:

    Was this useful?
    On this page

    On this page