Plugins
نمای کلی SDK Plugin
Plugin SDK قرارداد تایپشده بین Pluginها و هسته است. این صفحه مرجع آنچه باید import کنید و آنچه میتوانید ثبت کنید است.
قرارداد import
همیشه از یک زیرمسیر مشخص import کنید:
هر زیرمسیر یک ماژول کوچک و مستقل است. این کار شروعبهکار را سریع نگه میدارد و
از مشکلات وابستگی چرخهای جلوگیری میکند. برای helperهای entry/build ویژه کانال،
openclaw/plugin-sdk/channel-core را ترجیح دهید؛ openclaw/plugin-sdk/core را برای
سطح چتری گستردهتر و helperهای مشترکی مانند
buildChannelConfigSchema نگه دارید.
برای پیکربندی کانال، JSON Schema متعلق به کانال را از طریق
openclaw.plugin.json#channelConfigs منتشر کنید. زیرمسیر plugin-sdk/channel-config-schema
برای primitiveهای schema مشترک و builder عمومی است. Pluginهای همراه OpenClaw
برای schemaهای حفظشده کانالهای همراه از plugin-sdk/bundled-channel-config-schema استفاده میکنند.
exportهای سازگاری منسوخ روی
plugin-sdk/channel-config-schema-legacy باقی میمانند؛ هیچکدام از زیرمسیرهای schema همراه الگویی
برای Pluginهای جدید نیستند.
مرجع زیرمسیرها
Plugin SDK بهصورت مجموعهای از زیرمسیرهای باریک ارائه میشود که بر اساس حوزه گروهبندی شدهاند (entry Plugin، کانال، provider، auth، runtime، قابلیت، memory، و helperهای رزروشده Pluginهای همراه). برای فهرست کامل، گروهبندیشده و لینکشده، ببینید زیرمسیرهای Plugin SDK.
فهرست تولیدشده بیش از 200 زیرمسیر در scripts/lib/plugin-sdk-entrypoints.json قرار دارد.
API ثبت
callback register(api) یک شیء OpenClawPluginApi با این
متدها دریافت میکند:
ثبت قابلیت
| متد | آنچه ثبت میکند |
|---|---|
api.registerProvider(...) |
استنتاج متن (LLM) |
api.registerAgentHarness(...) |
اجراکننده agent سطح پایین آزمایشی |
api.registerCliBackend(...) |
backend استنتاج CLI محلی |
api.registerChannel(...) |
کانال پیامرسانی |
api.registerSpeechProvider(...) |
تبدیل متن به گفتار / سنتز STT |
api.registerRealtimeTranscriptionProvider(...) |
رونویسی realtime جریانی |
api.registerRealtimeVoiceProvider(...) |
نشستهای صدای realtime دوسویه |
api.registerMediaUnderstandingProvider(...) |
تحلیل تصویر/صدا/ویدئو |
api.registerImageGenerationProvider(...) |
تولید تصویر |
api.registerMusicGenerationProvider(...) |
تولید موسیقی |
api.registerVideoGenerationProvider(...) |
تولید ویدئو |
api.registerWebFetchProvider(...) |
provider دریافت / scrape وب |
api.registerWebSearchProvider(...) |
جستوجوی وب |
ابزارها و فرمانها
| متد | آنچه ثبت میکند |
|---|---|
api.registerTool(tool, opts?) |
ابزار agent (الزامی یا { optional: true }) |
api.registerCommand(def) |
فرمان سفارشی (LLM را دور میزند) |
فرمانهای Plugin میتوانند زمانی که agent به یک راهنمای کوتاه routing متعلق به فرمان نیاز دارد،
agentPromptGuidance را تنظیم کنند. آن متن را درباره خود فرمان نگه دارید؛
policy ویژه provider یا Plugin را به سازندههای prompt هسته اضافه نکنید.
زیرساخت
| متد | آنچه ثبت میکند |
|---|---|
api.registerHook(events, handler, opts?) |
hook رویداد |
api.registerHttpRoute(params) |
endpoint HTTP در Gateway |
api.registerGatewayMethod(name, handler) |
متد RPC در Gateway |
api.registerGatewayDiscoveryService(service) |
آگهیدهنده کشف Gateway محلی |
api.registerCli(registrar, opts?) |
زیرفرمان CLI |
api.registerService(service) |
سرویس پسزمینه |
api.registerInteractiveHandler(registration) |
handler تعاملی |
api.registerAgentToolResultMiddleware(...) |
middleware نتیجه ابزار runtime |
api.registerMemoryPromptSupplement(builder) |
بخش prompt افزایشی مجاور memory |
api.registerMemoryCorpusSupplement(adapter) |
corpus افزایشی جستوجو/خواندن memory |
hookهای میزبان برای Pluginهای workflow
hookهای میزبان seamهای SDK برای Pluginهایی هستند که باید در چرخه عمر میزبان مشارکت کنند، نه اینکه فقط یک provider، کانال، یا ابزار اضافه کنند. آنها قراردادهای عمومی هستند؛ Plan Mode میتواند از آنها استفاده کند، اما workflowهای approval، دروازههای policy workspace، مانیتورهای پسزمینه، wizardهای setup، و Pluginهای همراه UI نیز میتوانند.
| متد | قراردادی که مالک آن است |
|---|---|
api.registerSessionExtension(...) |
وضعیت session متعلق به Plugin و سازگار با JSON که از طریق sessionهای Gateway بازنمایی میشود |
api.enqueueNextTurnInjection(...) |
context پایدار دقیقا-یکبار که برای یک session در turn بعدی agent تزریق میشود |
api.registerTrustedToolPolicy(...) |
policy ابزار پیش از Plugin همراه/قابلاعتماد که میتواند params ابزار را مسدود یا بازنویسی کند |
api.registerToolMetadata(...) |
metadata نمایشی کاتالوگ ابزار بدون تغییر پیادهسازی ابزار |
api.registerCommand(...) |
فرمانهای scoped متعلق به Plugin؛ نتایج فرمان میتوانند continueAgent: true تنظیم کنند؛ فرمانهای native در Discord از descriptionLocalizations پشتیبانی میکنند |
api.registerControlUiDescriptor(...) |
descriptorهای مشارکت Control UI برای سطحهای session، ابزار، run، یا settings |
api.registerRuntimeLifecycle(...) |
callbackهای پاکسازی برای منابع runtime متعلق به Plugin در مسیرهای reset/delete/reload |
api.registerAgentEventSubscription(...) |
subscriptionهای رویداد sanitized برای وضعیت workflow و مانیتورها |
api.setRunContext(...) / getRunContext(...) / clearRunContext(...) |
وضعیت scratch متعلق به Plugin برای هر run که در چرخه عمر پایانی run پاک میشود |
api.registerSessionSchedulerJob(...) |
رکوردهای job زمانبند session متعلق به Plugin با پاکسازی deterministic |
این قراردادها عمدا اختیار را تفکیک میکنند:
- Pluginهای خارجی میتوانند مالک session extensionها، descriptorهای UI، فرمانها، metadata ابزار، تزریقهای turn بعدی، و hookهای عادی باشند.
- policyهای ابزار قابلاعتماد پیش از hookهای معمولی
before_tool_callاجرا میشوند و فقط همراه هستند، چون در policy ایمنی میزبان مشارکت دارند. - مالکیت فرمان رزروشده فقط همراه است. Pluginهای خارجی باید از نامها یا aliasهای فرمان خودشان استفاده کنند.
allowPromptInjection=false، hookهای تغییردهنده prompt از جملهagent_turn_prepare،before_prompt_build،heartbeat_prompt_contribution، فیلدهای prompt ازbefore_agent_startقدیمی، وenqueueNextTurnInjectionرا غیرفعال میکند.
نمونههایی از مصرفکنندگان غیر Plan:
| الگوی Plugin | hookهای استفادهشده |
|---|---|
| workflow approval | session extension، ادامه فرمان، تزریق turn بعدی، descriptor UI |
| دروازه policy بودجه/workspace | policy ابزار قابلاعتماد، metadata ابزار، projection session |
| مانیتور چرخه عمر پسزمینه | پاکسازی چرخه عمر runtime، subscription رویداد agent، مالکیت/پاکسازی scheduler session، مشارکت prompt heartbeat، descriptor UI |
| wizard setup یا onboarding | session extension، فرمانهای scoped، descriptor در Control UI |
چه زمانی از middleware نتیجه ابزار استفاده کنید
Pluginهای همراه میتوانند وقتی لازم است نتیجه ابزار را بعد از اجرا و پیش از اینکه runtime
آن نتیجه را به مدل برگرداند بازنویسی کنند، از api.registerAgentToolResultMiddleware(...) استفاده کنند.
این seam قابلاعتماد و مستقل از runtime برای reducerهای خروجی async مانند tokenjuice است.
Pluginهای همراه باید برای هر runtime هدف،
contracts.agentToolResultMiddleware را declare کنند، برای مثال ["pi", "codex"]. Pluginهای خارجی
نمیتوانند این middleware را ثبت کنند؛ برای کاری که به زمانبندی نتیجه ابزار پیش از مدل نیاز ندارد،
hookهای عادی Plugin در OpenClaw را نگه دارید. مسیر ثبت factory افزونه embedشده قدیمی فقط برای Pi
حذف شده است.
ثبت کشف Gateway
api.registerGatewayDiscoveryService(...) به یک Plugin اجازه میدهد Gateway فعال را روی یک انتقال کشف محلی مانند mDNS/Bonjour اعلام کند. OpenClaw هنگام راهاندازی Gateway و وقتی کشف محلی فعال باشد، این سرویس را فراخوانی میکند، پورتهای Gateway فعلی و دادههای راهنمای TXT غیرمحرمانه را پاس میدهد، و هنگام خاموششدن Gateway هندلر stop برگرداندهشده را فراخوانی میکند.
api.registerGatewayDiscoveryService({
id: "my-discovery",
async advertise(ctx) {
const handle = await startMyAdvertiser({
gatewayPort: ctx.gatewayPort,
tls: ctx.gatewayTlsEnabled,
displayName: ctx.machineDisplayName,
});
return { stop: () => handle.stop() };
},
});
Pluginهای کشف Gateway نباید مقادیر TXT اعلامشده را بهعنوان اسرار یا احراز هویت در نظر بگیرند. کشف فقط یک راهنمای مسیریابی است؛ اعتماد همچنان بر عهده احراز هویت Gateway و pinning مربوط به TLS است.
فراداده ثبت CLI
api.registerCli(registrar, opts?) دو نوع فراداده سطح بالا را میپذیرد:
commands: ریشههای فرمان صریح که در مالکیت ثبتکننده هستندdescriptors: توصیفگرهای فرمان در زمان parse که برای راهنمای CLI ریشه، مسیریابی، و ثبت CLI تنبل Plugin استفاده میشوند
اگر میخواهید یک فرمان Plugin در مسیر عادی CLI ریشه بهصورت تنبل بارگذاری شود، descriptorsای ارائه کنید که هر ریشه فرمان سطح بالایی را که آن ثبتکننده در معرض استفاده قرار میدهد پوشش دهد.
api.registerCli(
async ({ program }) => {
const { registerMatrixCli } = await import("./src/cli.js");
registerMatrixCli({ program });
},
{
descriptors: [
{
name: "matrix",
description: "Manage Matrix accounts, verification, devices, and profile state",
hasSubcommands: true,
},
],
},
);
فقط زمانی commands را بهتنهایی استفاده کنید که به ثبت تنبل CLI ریشه نیاز ندارید. آن مسیر سازگاری eager همچنان پشتیبانی میشود، اما placeholderهای مبتنی بر توصیفگر را برای بارگذاری تنبل در زمان parse نصب نمیکند.
ثبت backend CLI
api.registerCliBackend(...) به یک Plugin اجازه میدهد پیکربندی پیشفرض یک backend محلی CLI هوش مصنوعی مانند codex-cli را مالک شود.
idمربوط به backend در ارجاعهای مدل مانندcodex-cli/gpt-5به پیشوند provider تبدیل میشود.configمربوط به backend همان شکلagents.defaults.cliBackends.<id>را استفاده میکند.- پیکربندی کاربر همچنان برنده است. OpenClaw پیش از اجرای CLI،
agents.defaults.cliBackends.<id>را روی پیشفرض Plugin merge میکند. - وقتی یک backend پس از merge به بازنویسیهای سازگاری نیاز دارد، از
normalizeConfigاستفاده کنید (برای مثال عادیسازی شکلهای قدیمی flag). - برای بازنویسیهای argv در محدوده درخواست که به dialect مربوط به CLI تعلق دارند، از
resolveExecutionArgsاستفاده کنید؛ مانند نگاشت سطوح تفکر OpenClaw به یک flag بومی effort.
اسلاتهای انحصاری
| متد | آنچه ثبت میکند |
|---|---|
api.registerContextEngine(id, factory) |
موتور زمینه (هر بار فقط یکی فعال است). callback مربوط به assemble() مقدارهای availableTools و citationsMode را دریافت میکند تا موتور بتواند افزودههای prompt را تنظیم کند. |
api.registerMemoryCapability(capability) |
قابلیت حافظه یکپارچه |
api.registerMemoryPromptSection(builder) |
سازنده بخش prompt حافظه |
api.registerMemoryFlushPlan(resolver) |
resolver برنامه flush حافظه |
api.registerMemoryRuntime(runtime) |
adapter runtime حافظه |
adapterهای embedding حافظه
| متد | آنچه ثبت میکند |
|---|---|
api.registerMemoryEmbeddingProvider(adapter) |
adapter embedding حافظه برای Plugin فعال |
registerMemoryCapabilityAPI ترجیحی انحصاری Plugin حافظه است.registerMemoryCapabilityهمچنین ممکن استpublicArtifacts.listArtifacts(...)را در معرض استفاده قرار دهد تا Pluginهای همراه بتوانند artifactهای حافظه صادرشده را از طریقopenclaw/plugin-sdk/memory-host-coreمصرف کنند، بهجای اینکه وارد چیدمان خصوصی یک Plugin حافظه مشخص شوند.registerMemoryPromptSection،registerMemoryFlushPlan، وregisterMemoryRuntimeAPIهای انحصاری سازگار با legacy برای Plugin حافظه هستند.MemoryFlushPlan.modelمیتواند نوبت flush را بدون بهارثبردن زنجیره fallback فعال، به یک ارجاع دقیقprovider/modelمانندollama/qwen3:8bpin کند.registerMemoryEmbeddingProviderبه Plugin حافظه فعال اجازه میدهد یک یا چند شناسه adapter embedding ثبت کند (برای مثالopenai،gemini، یا یک شناسه سفارشی تعریفشده توسط Plugin).- پیکربندی کاربر مانند
agents.defaults.memorySearch.providerوagents.defaults.memorySearch.fallbackدر برابر همان شناسههای adapter ثبتشده resolve میشود.
رویدادها و چرخه عمر
| متد | کاری که انجام میدهد |
|---|---|
api.on(hookName, handler, opts?) |
hook چرخه عمر تایپشده |
api.onConversationBindingResolved(handler) |
callback مربوط به binding مکالمه |
برای نمونهها، نامهای رایج hook، و معناشناسی guard به hookهای Plugin مراجعه کنید.
معناشناسی تصمیم hook
before_tool_call: برگرداندن{ block: true }نهایی است. وقتی هر handler آن را تنظیم کند، handlerهای با اولویت پایینتر رد میشوند.before_tool_call: برگرداندن{ block: false }بهعنوان نبود تصمیم در نظر گرفته میشود (همانند حذفblock)، نه بهعنوان override.before_install: برگرداندن{ block: true }نهایی است. وقتی هر handler آن را تنظیم کند، handlerهای با اولویت پایینتر رد میشوند.before_install: برگرداندن{ block: false }بهعنوان نبود تصمیم در نظر گرفته میشود (همانند حذفblock)، نه بهعنوان override.reply_dispatch: برگرداندن{ handled: true, ... }نهایی است. وقتی هر handler مسئولیت dispatch را claim کند، handlerهای با اولویت پایینتر و مسیر dispatch پیشفرض مدل رد میشوند.message_sending: برگرداندن{ cancel: true }نهایی است. وقتی هر handler آن را تنظیم کند، handlerهای با اولویت پایینتر رد میشوند.message_sending: برگرداندن{ cancel: false }بهعنوان نبود تصمیم در نظر گرفته میشود (همانند حذفcancel)، نه بهعنوان override.message_received: وقتی به مسیریابی thread/topic ورودی نیاز دارید، از فیلد تایپشدهthreadIdاستفاده کنید.metadataرا برای جزئیات اضافه مختص کانال نگه دارید.message_sending: پیش از fallback بهmetadataمختص کانال، از فیلدهای مسیریابی تایپشدهreplyToId/threadIdاستفاده کنید.gateway_start: بهجای تکیه بر hookهای داخلیgateway:startup، برای وضعیت راهاندازی متعلق به Gateway ازctx.config،ctx.workspaceDir، وctx.getCron?.()استفاده کنید.cron_changed: تغییرات چرخه عمر Cron متعلق به Gateway را مشاهده کنید. هنگام همگامسازی زمانبندهای بیدارسازی خارجی ازevent.job?.state?.nextRunAtMsوctx.getCron?.()استفاده کنید، و OpenClaw را بهعنوان منبع حقیقت برای بررسیهای موعد و اجرا نگه دارید.
فیلدهای شیء API
| فیلد | نوع | توضیح |
|---|---|---|
api.id |
string |
شناسه Plugin |
api.name |
string |
نام نمایشی |
api.version |
string? |
نسخه Plugin (اختیاری) |
api.description |
string? |
توضیح Plugin (اختیاری) |
api.source |
string |
مسیر منبع Plugin |
api.rootDir |
string? |
دایرکتوری ریشه Plugin (اختیاری) |
api.config |
OpenClawConfig |
snapshot پیکربندی فعلی (snapshot runtime فعال در حافظه، وقتی در دسترس باشد) |
api.pluginConfig |
Record<string, unknown> |
پیکربندی مختص Plugin از plugins.entries.<id>.config |
api.runtime |
PluginRuntime |
helperهای runtime |
api.logger |
PluginLogger |
logger محدودهبندیشده (debug، info، warn، error) |
api.registrationMode |
PluginRegistrationMode |
حالت بارگذاری فعلی؛ "setup-runtime" پنجره سبک راهاندازی/setup پیش از full-entry است |
api.resolvePath(input) |
(string) => string |
resolve مسیر نسبت به ریشه Plugin |
قرارداد ماژول داخلی
درون Plugin خود، برای importهای داخلی از فایلهای barrel محلی استفاده کنید:
my-plugin/
api.ts # Public exports for external consumers
runtime-api.ts # Internal-only runtime exports
index.ts # Plugin entry point
setup-entry.ts # Lightweight setup-only entry (optional)
سطحهای عمومی Pluginهای bundled که از طریق facade بارگذاری میشوند (api.ts، runtime-api.ts،
index.ts، setup-entry.ts، و فایلهای ورودی عمومی مشابه)، وقتی OpenClaw از قبل در حال اجرا باشد، snapshot پیکربندی runtime فعال را ترجیح میدهند. اگر هنوز snapshot runtime وجود نداشته باشد، به فایل پیکربندی resolveشده روی دیسک fallback میکنند. facadeهای Pluginهای bundled بستهبندیشده باید از طریق loaderهای facade Plugin در OpenClaw بارگذاری شوند؛ import مستقیم از dist/extensions/... بررسیهای manifest و sidecar runtime را که نصبهای بستهبندیشده برای کد متعلق به Plugin استفاده میکنند دور میزند.
Pluginهای provider میتوانند یک barrel قرارداد باریک و محلیِ Plugin را در معرض استفاده قرار دهند، وقتی یک helper عمداً مختص provider است و هنوز به یک زیرمسیر generic در SDK تعلق ندارد. نمونههای bundled:
- Anthropic: seam عمومی
api.ts/contract-api.tsبرای helperهای stream مربوط به beta-header وservice_tierدر Claude. @openclaw/openai-provider:api.tsسازندههای provider، helperهای default-model، و سازندههای provider realtime را export میکند.@openclaw/openrouter-provider:api.tsسازنده provider بهعلاوه helperهای onboarding/config را export میکند.
مرتبط
گزینههای definePluginEntry و defineChannelPluginEntry.
مرجع کامل فضای نام api.runtime.
بستهبندی، مانیفستها، و اسکیماهای پیکربندی.
ابزارهای آزمون و قواعد lint.
مهاجرت از سطحهای منسوخ.
معماری تفصیلی و مدل قابلیتها.