Plugin SDK reference
نمای کلی SDK Plugin
Plugin SDK قرارداد تایپشده میان Pluginها و هسته است. این صفحه مرجع اینکه چه چیزی را import کنید و چه چیزی را میتوانید register کنید است.
قرارداد 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
از plugin-sdk/bundled-channel-config-schema برای schemaهای نگهداشتهشدهٔ کانالهای همراه استفاده میکنند.
exportهای سازگاری منسوخ روی
plugin-sdk/channel-config-schema-legacy باقی میمانند؛ هیچکدام از زیرمسیرهای schema همراه
الگویی برای Pluginهای جدید نیستند.
مرجع زیرمسیرها
Plugin SDK بهصورت مجموعهای از زیرمسیرهای محدود ارائه میشود که بر اساس حوزه گروهبندی شدهاند (entry Plugin، کانال، provider، auth، runtime، capability، حافظه، و helperهای رزروشدهٔ Pluginهای همراه). برای فهرست کامل، گروهبندیشده و لینکشده، به زیرمسیرهای Plugin SDK مراجعه کنید.
موجودی entrypointهای compiler در
scripts/lib/plugin-sdk-entrypoints.json قرار دارد؛ exportهای package پس از کمکردن
زیرمسیرهای test/internal محلی repo که در
scripts/lib/plugin-sdk-private-local-only-subpaths.json فهرست شدهاند، از
زیرمجموعهٔ عمومی تولید میشوند. برای ممیزی تعداد export عمومی، فرمان
pnpm plugin-sdk:surface را اجرا کنید. زیرمسیرهای عمومی منسوخ که بهاندازهٔ کافی قدیمیاند و
در کد production افزونهٔ همراه استفاده نمیشوند، در
scripts/lib/plugin-sdk-deprecated-public-subpaths.json ردیابی میشوند؛ barrelهای
re-export منسوخ گسترده در
scripts/lib/plugin-sdk-deprecated-barrel-subpaths.json ردیابی میشوند.
API ثبت
callback register(api) یک شیء OpenClawPluginApi با این
متدها دریافت میکند:
ثبت capability
| متد | چه چیزی را register میکند |
|---|---|
api.registerProvider(...) |
استنتاج متن (LLM) |
api.registerAgentHarness(...) |
اجراکنندهٔ سطح پایین و آزمایشی agent |
api.registerCliBackend(...) |
backend استنتاج CLI محلی |
api.registerChannel(...) |
کانال پیامرسانی |
api.registerEmbeddingProvider(...) |
provider embedding برداری قابلاستفادهٔ مجدد |
api.registerSpeechProvider(...) |
تبدیل متن به گفتار / سنتز STT |
api.registerRealtimeTranscriptionProvider(...) |
رونویسی realtime جریانی |
api.registerRealtimeVoiceProvider(...) |
نشستهای صوتی realtime دوطرفه |
api.registerMediaUnderstandingProvider(...) |
تحلیل تصویر/صدا/ویدئو |
api.registerImageGenerationProvider(...) |
تولید تصویر |
api.registerMusicGenerationProvider(...) |
تولید موسیقی |
api.registerVideoGenerationProvider(...) |
تولید ویدئو |
api.registerWebFetchProvider(...) |
provider واکشی / scrape وب |
api.registerWebSearchProvider(...) |
جستوجوی وب |
providerهای embedding که با api.registerEmbeddingProvider(...) ثبت میشوند، باید
در manifest Plugin نیز در contracts.embeddingProviders فهرست شوند. این
سطح embedding عمومی برای تولید بردار قابلاستفادهٔ مجدد است. جستوجوی حافظه
میتواند این سطح provider عمومی را مصرف کند. seam قدیمیتر
api.registerMemoryEmbeddingProvider(...) و
contracts.memoryEmbeddingProviders سازگاری منسوخ است، تا زمانی که
providerهای ویژهٔ حافظهٔ موجود مهاجرت کنند.
providerهای ویژهٔ حافظه که همچنان یک runtime batchEmbed(...) ارائه میکنند، روی
قرارداد batching موجود per-file باقی میمانند، مگر اینکه runtime آنها صراحتاً
sourceWideBatchEmbed: true را تنظیم کند. این opt-in به میزبان حافظه اجازه میدهد chunkها را از
چندین فایل حافظهٔ dirty و source فعالشده در یک فراخوانی batchEmbed(...)
تا سقف محدودیتهای batch میزبان ارسال کند. adapterهای batch که فایلهای درخواست JSONL را upload میکنند، باید
jobهای provider را پیش از سقف اندازهٔ upload و نیز سقف تعداد درخواستشان
تقسیم کنند. provider باید برای هر chunk ورودی، به همان ترتیبی که در
batch.chunks آمده، یک embedding برگرداند؛ وقتی provider انتظار batchهای محلیِ فایل را دارد یا
نمیتواند ترتیب ورودی را در یک job گستردهتر source-wide حفظ کند، این flag را حذف کنید.
ابزارها و فرمانها
برای Pluginهای سادهٔ فقط-ابزار با نامهای ابزار ثابت، از defineToolPlugin
استفاده کنید. برای Pluginهای ترکیبی یا ثبت ابزار کاملاً پویا، مستقیماً از
api.registerTool(...) استفاده کنید.
| متد | چه چیزی را register میکند |
|---|---|
api.registerTool(tool, opts?) |
ابزار agent (الزامی یا { optional: true }) |
api.registerCommand(def) |
فرمان سفارشی (LLM را دور میزند) |
فرمانهای Plugin میتوانند وقتی agent به یک راهنمای کوتاه routing متعلق به فرمان نیاز دارد،
agentPromptGuidance را تنظیم کنند. آن متن را دربارهٔ خود فرمان نگه دارید؛
policy ویژهٔ provider یا Plugin را به prompt builderهای هسته اضافه نکنید.
ورودیهای راهنما میتوانند رشتههای legacy باشند که روی هر سطح prompt اعمال میشوند، یا ورودیهای ساختاریافته:
agentPromptGuidance: [ "Global command hint.", { text: "Only show this in the main OpenClaw prompt.", surfaces: ["openclaw_main"] },];surfaces ساختاریافته میتواند شامل openclaw_main، codex_app_server،
cli_backend، acp_backend یا subagent باشد. pi_main یک alias منسوخ
برای openclaw_main باقی میماند. برای راهنماییِ عامدانه روی همهٔ سطحها، surfaces را حذف کنید.
آرایهٔ خالی surfaces ارسال نکنید؛ رد میشود تا از دسترفتن تصادفی scope به
متن prompt سراسری تبدیل نشود.
دستورالعملهای توسعهدهندهٔ app-server بومی Codex سختگیرانهتر از دیگر سطحهای prompt هستند:
فقط راهنماییای که صراحتاً به codex_app_server محدود شده باشد به آن مسیر
با اولویت بالاتر ارتقا داده میشود. راهنمایی legacy رشتهای و راهنمایی ساختاریافتهٔ بدون scope
برای سازگاری، همچنان در سطحهای prompt غیر Codex در دسترس میمانند.
زیرساخت
| متد | چه چیزی را register میکند |
|---|---|
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?) |
زیرcommand CLI |
api.registerNodeCliFeature(registrar, opts?) |
CLI قابلیت Node زیر openclaw nodes |
api.registerService(service) |
سرویس پسزمینه |
api.registerInteractiveHandler(registration) |
handler تعاملی |
api.registerAgentToolResultMiddleware(...) |
middleware نتیجهٔ ابزار runtime |
api.registerMemoryPromptSupplement(builder) |
بخش prompt افزایشی مجاور حافظه |
api.registerMemoryCorpusSupplement(adapter) |
corpus افزایشی جستوجو/خواندن حافظه |
hookهای میزبان برای Pluginهای workflow
hookهای میزبان، seamهای SDK برای Pluginهایی هستند که باید در چرخهٔ عمر میزبان مشارکت کنند، نه اینکه فقط یک provider، کانال یا ابزار اضافه کنند. آنها قراردادهای عمومی هستند؛ Plan Mode میتواند از آنها استفاده کند، اما workflowهای approval، gateهای policy فضای کاری، monitorهای پسزمینه، wizardهای setup و Pluginهای همراه UI هم میتوانند از آنها استفاده کنند.
| روش | قراردادی که مالک آن است |
|---|---|
api.session.state.registerSessionExtension(...) |
وضعیت نشست سازگار با JSON که مالک آن Plugin است و از طریق نشستهای Gateway بازتاب داده میشود |
api.session.workflow.enqueueNextTurnInjection(...) |
زمینه پایدار و دقیقاً یکبارمصرف که برای یک نشست به نوبت بعدی عامل تزریق میشود |
api.registerTrustedToolPolicy(...) |
سیاست ابزار معتمد پیش از Plugin که با manifest محدود میشود و میتواند پارامترهای ابزار را مسدود یا بازنویسی کند |
api.registerToolMetadata(...) |
فراداده نمایش کاتالوگ ابزار بدون تغییر پیادهسازی ابزار |
api.registerCommand(...) |
فرمانهای محدود به دامنه Plugin؛ نتایج فرمان میتوانند continueAgent: true یا suppressReply: true تنظیم کنند؛ فرمانهای بومی Discord از descriptionLocalizations پشتیبانی میکنند |
api.session.controls.registerControlUiDescriptor(...) |
توصیفگرهای مشارکت Control UI برای سطوح نشست، ابزار، اجرا، یا تنظیمات |
api.lifecycle.registerRuntimeLifecycle(...) |
callbackهای پاکسازی برای منابع runtime که مالک آنها Plugin است، در مسیرهای reset/delete/reload |
api.agent.events.registerAgentEventSubscription(...) |
اشتراکهای رویداد پاکسازیشده برای وضعیت workflow و پایشگرها |
api.runContext.setRunContext(...) / getRunContext(...) / clearRunContext(...) |
وضعیت scratch مخصوص Plugin برای هر اجرا که در چرخه عمر پایانی اجرا پاک میشود |
api.session.workflow.registerSessionSchedulerJob(...) |
فراداده پاکسازی برای کارهای زمانبند که مالک آنها Plugin است؛ کاری را زمانبندی نمیکند یا رکورد task نمیسازد |
api.session.workflow.sendSessionAttachment(...) |
تحویل پیوست فایل فقط برای بستههای bundled با میانجیگری میزبان، به مسیر نشست فعال direct-outbound |
api.session.workflow.scheduleSessionTurn(...) / unscheduleSessionTurnsByTag(...) |
نوبتهای زمانبندیشده نشست با پشتوانه Cron فقط برای bundled، بههمراه پاکسازی مبتنی بر tag |
api.session.controls.registerSessionAction(...) |
کنشهای نشست typed که clientها میتوانند از طریق Gateway ارسال کنند |
برای کد جدید Plugin از namespaceهای گروهبندیشده استفاده کنید:
api.session.state.registerSessionExtension(...)api.session.workflow.enqueueNextTurnInjection(...)api.session.workflow.registerSessionSchedulerJob(...)api.session.workflow.sendSessionAttachment(...)api.session.workflow.scheduleSessionTurn(...)api.session.workflow.unscheduleSessionTurnsByTag(...)api.session.controls.registerSessionAction(...)api.session.controls.registerControlUiDescriptor(...)api.agent.events.registerAgentEventSubscription(...)api.agent.events.emitAgentEvent(...)api.runContext.setRunContext(...)/getRunContext(...)/clearRunContext(...)api.lifecycle.registerRuntimeLifecycle(...)
روشهای flat معادل همچنان بهعنوان aliasهای سازگاری deprecated
برای Pluginهای موجود در دسترس میمانند. کد جدید Plugin اضافه نکنید که مستقیماً
api.registerSessionExtension، api.enqueueNextTurnInjection،
api.registerControlUiDescriptor، api.registerRuntimeLifecycle،
api.registerAgentEventSubscription، api.emitAgentEvent،
api.setRunContext، api.getRunContext، api.clearRunContext،
api.registerSessionSchedulerJob، api.registerSessionAction،
api.sendSessionAttachment، api.scheduleSessionTurn، یا
api.unscheduleSessionTurnsByTag را فراخوانی کند.
scheduleSessionTurn(...) یک میانبر محدود به نشست روی زمانبند Cron
در Gateway است. Cron مالک زمانبندی است و هنگام اجرای نوبت، رکورد task پسزمینه را
میسازد؛ Plugin SDK فقط نشست هدف، نامگذاری تحت مالکیت Plugin،
و پاکسازی را محدود میکند. وقتی خود کار به وضعیت پایدار چندمرحلهای Task Flow نیاز دارد،
داخل نوبت زمانبندیشده از api.runtime.tasks.managedFlows استفاده کنید.
قراردادها عمداً اختیار را جدا میکنند:
- Pluginهای خارجی میتوانند مالک extensionهای نشست، توصیفگرهای UI، فرمانها، فراداده ابزار، تزریقهای نوبت بعدی، و hookهای عادی باشند.
- سیاستهای ابزار معتمد پیش از hookهای معمولی
before_tool_callاجرا میشوند و از سوی میزبان معتمد هستند. سیاستهای bundled ابتدا اجرا میشوند؛ سیاستهای Plugin نصبشده به فعالسازی صریح بههمراه شناسههای local خود درcontracts.trustedToolPoliciesنیاز دارند، و سپس به ترتیب بارگذاری Plugin اجرا میشوند. شناسههای سیاست به Plugin ثبتکننده محدود هستند. - مالکیت فرمان reserved فقط برای bundled است. Pluginهای خارجی باید از نامها یا aliasهای فرمان خودشان استفاده کنند.
allowPromptInjection=falsehookهای تغییردهنده prompt را غیرفعال میکند، از جملهagent_turn_prepare،before_prompt_build،heartbeat_prompt_contribution، فیلدهای prompt ازbefore_agent_startقدیمی، وenqueueNextTurnInjection.
نمونههایی از مصرفکنندههای غیر Plan:
| الگوی Plugin | hookهای استفادهشده |
|---|---|
| workflow تأیید | extension نشست، ادامه فرمان، تزریق نوبت بعدی، توصیفگر UI |
| دروازه سیاست بودجه/workspace | سیاست ابزار معتمد، فراداده ابزار، projection نشست |
| پایشگر چرخه عمر پسزمینه | پاکسازی چرخه عمر runtime، اشتراک رویداد عامل، مالکیت/پاکسازی زمانبند نشست، مشارکت prompt در Heartbeat، توصیفگر UI |
| جادوگر راهاندازی یا onboarding | extension نشست، فرمانهای scoped، توصیفگر Control UI |
When to use tool-result middleware
Pluginهای bundled و Pluginهای نصبشدهای که صراحتاً فعال شدهاند و قراردادهای
manifest منطبق دارند، وقتی نیاز دارند نتیجه ابزار را پس از اجرا و پیش از آنکه runtime
آن نتیجه را به model بازگرداند بازنویسی کنند، میتوانند از
api.registerAgentToolResultMiddleware(...) استفاده کنند. این درز معتمد و مستقل از runtime
برای reducerهای خروجی async مانند tokenjuice است.
Pluginها باید برای هر runtime هدف، contracts.agentToolResultMiddleware را اعلام کنند،
برای مثال ["openclaw", "codex"]. Pluginهای نصبشدهای که این
قرارداد را ندارند، یا صراحتاً فعال نشدهاند، نمیتوانند این middleware را ثبت کنند؛ برای
کاری که به زمانبندی نتیجه ابزار پیش از model نیاز ندارد، hookهای عادی Plugin در OpenClaw را نگه دارید.
مسیر قدیمی ثبت کارخانه extension که فقط برای
embedded-runner بود حذف شده است.
ثبت کشف Gateway
api.registerGatewayDiscoveryService(...) به یک Plugin اجازه میدهد Gateway فعال را
روی یک transport کشف local مانند mDNS/Bonjour تبلیغ کند. OpenClaw وقتی کشف local فعال باشد،
در زمان startup Gateway سرویس را فراخوانی میکند، portهای فعلی Gateway و دادههای hint TXT غیرمحرمانه را
ارسال میکند، و handler برگشتی stop را هنگام shutdown Gateway فراخوانی میکند.
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 تبلیغشده را secret یا authentication تلقی کنند. کشف یک راهنمای routing است؛ احراز هویت Gateway و pinning در TLS همچنان مالک اعتماد هستند.
فراداده ثبت CLI
api.registerCli(registrar, opts?) دو نوع فراداده فرمان میپذیرد:
commands: نامهای صریح فرمان که مالک آنها registrar استdescriptors: توصیفگرهای فرمان در زمان parse که برای راهنمای CLI، routing، و ثبت lazy CLI Plugin استفاده میشوندparentPath: مسیر اختیاری فرمان والد برای گروههای فرمان تودرتو، مانند["nodes"]
برای قابلیتهای paired-node،
api.registerNodeCliFeature(registrar, opts?) را ترجیح دهید. این یک wrapper کوچک دور
api.registerCli(..., { parentPath: ["nodes"] }) است و فرمانهایی مانند
openclaw nodes canvas را به قابلیتهای node صریحی تبدیل میکند که مالک آنها Plugin است.
اگر میخواهید یک فرمان Plugin در مسیر عادی root CLI بهصورت lazy-loaded باقی بماند،
descriptorsهایی ارائه کنید که هر root فرمان سطحبالای نمایشدادهشده توسط آن
registrar را پوشش دهند.
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, }, ], },);فرمانهای تودرتو فرمان والد resolveشده را بهعنوان program دریافت میکنند:
api.registerCli( async ({ program }) => { const { registerNodesCanvasCommands } = await import("./src/cli.js"); registerNodesCanvasCommands(program); }, { parentPath: ["nodes"], descriptors: [ { name: "canvas", description: "Capture or render canvas content from a paired node", hasSubcommands: true, }, ], },);فقط زمانی از commands بهتنهایی استفاده کنید که به ثبت lazy root CLI نیاز ندارید.
آن مسیر سازگاری eager همچنان پشتیبانی میشود، اما placeholderهای مبتنی بر descriptor
را برای lazy loading در زمان parse نصب نمیکند.
ثبت backend در CLI
api.registerCliBackend(...) به یک Plugin اجازه میدهد مالک config پیشفرض برای یک backend
محلی AI CLI مانند claude-cli یا my-cli باشد.
idبکاند به پیشوند ارائهدهنده در ارجاعهای مدل مانندmy-cli/gpt-5تبدیل میشود.configبکاند همان شکلagents.defaults.cliBackends.<id>را به کار میبرد.- پیکربندی کاربر همچنان برنده است. OpenClaw پیش از اجرای CLI،
agents.defaults.cliBackends.<id>را روی مقدار پیشفرض Plugin ادغام میکند. - وقتی یک بکاند پس از ادغام به بازنویسیهای سازگاری نیاز دارد، از
normalizeConfigاستفاده کنید (برای نمونه، عادیسازی شکلهای قدیمی پرچم). - برای بازنویسیهای argv در محدوده درخواست که به گویش CLI تعلق دارند، از
resolveExecutionArgsاستفاده کنید؛ مانند نگاشت سطحهای تفکر OpenClaw به یک پرچم effort بومی. این هوکctx.executionModeرا دریافت میکند؛ برای افزودن پرچمهای جداسازی بومی بکاند به فراخوانیهای گذرای/btwاز"side-question"استفاده کنید. اگر آن پرچمها ابزارهای بومی را برای یک CLI که در غیر این صورت همیشه روشن است بهطور قابل اتکا غیرفعال میکنند،sideQuestionToolMode: "disabled"را نیز اعلام کنید.
برای راهنمای نگارش سرتاسری، Pluginهای بکاند CLI را ببینید.
جایگاههای انحصاری
| روش | آنچه ثبت میکند |
|---|---|
api.registerContextEngine(id, factory) |
موتور زمینه (هر بار یکی فعال است). وقتی میزبان بتواند عیبیابی مدل/ارائهدهنده/حالت را فراهم کند، callbackهای چرخه عمر runtimeSettings را دریافت میکنند؛ موتورهای strict قدیمیتر بدون آن کلید دوباره امتحان میشوند. |
api.registerMemoryCapability(capability) |
قابلیت یکپارچه حافظه |
api.registerMemoryPromptSection(builder) |
سازنده بخش پرامپت حافظه |
api.registerMemoryFlushPlan(resolver) |
حلکننده طرح تخلیه حافظه |
api.registerMemoryRuntime(runtime) |
آداپتور runtime حافظه |
آداپتورهای منسوخ جاسازی حافظه
| روش | آنچه ثبت میکند |
|---|---|
api.registerMemoryEmbeddingProvider(adapter) |
آداپتور جاسازی حافظه برای Plugin فعال |
registerMemoryCapability، API انحصاری ترجیحی برای Plugin حافظه است.registerMemoryCapabilityهمچنین میتواندpublicArtifacts.listArtifacts(...)را در معرض دسترس بگذارد تا Pluginهای همراه بتوانند بهجای ورود به چیدمان خصوصی یک Plugin حافظه مشخص، مصنوعات حافظه صادرشده را از طریقopenclaw/plugin-sdk/memory-host-coreمصرف کنند.registerMemoryPromptSection،registerMemoryFlushPlanوregisterMemoryRuntime، APIهای انحصاری سازگار با legacy برای Plugin حافظه هستند.MemoryFlushPlan.modelمیتواند نوبت تخلیه را بدون ارثبری از زنجیره fallback فعال، به یک ارجاع دقیقprovider/modelمانندollama/qwen3:8bسنجاق کند.registerMemoryEmbeddingProviderمنسوخ شده است. ارائهدهندگان جاسازی جدید باید ازapi.registerEmbeddingProvider(...)وcontracts.embeddingProvidersاستفاده کنند.- ارائهدهندگان موجودِ مخصوص حافظه در طول پنجره مهاجرت همچنان کار میکنند، اما گزارشهای بازرسی Plugin این مورد را برای Pluginهای غیرباندلشده بهعنوان بدهی سازگاری گزارش میکنند.
رویدادها و چرخه عمر
| روش | کاری که انجام میدهد |
|---|---|
api.on(hookName, handler, opts?) |
هوک چرخه عمر typed |
api.onConversationBindingResolved(handler) |
callback اتصال گفتوگو |
برای نمونهها، نامهای رایج هوک و معنای guard، هوکهای Plugin را ببینید.
معنای تصمیم هوک
before_install یک هوک چرخه عمر runtimeِ Plugin است، نه سطح سیاست نصب اپراتور. وقتی یک تصمیم allow/block باید مسیرهای نصب یا بهروزرسانی پشتیبانیشده با CLI و Gateway را پوشش دهد، از security.installPolicy استفاده کنید.
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 کند، handlerهای با اولویت پایینتر و مسیر dispatch پیشفرض مدل رد میشوند.message_sending: بازگرداندن{ cancel: true }نهایی است. وقتی هر handler آن را تنظیم کند، handlerهای با اولویت پایینتر رد میشوند.message_sending: بازگرداندن{ cancel: false }بهعنوان نبود تصمیم در نظر گرفته میشود (همانند حذفcancel)، نه بهعنوان override.message_received: وقتی به مسیریابی thread/topic ورودی نیاز دارید، از فیلد typed به نامthreadIdاستفاده کنید.metadataرا برای موارد اضافه مخصوص کانال نگه دارید.message_sending: پیش از fallback بهmetadataمخصوص کانال، از فیلدهای مسیریابی typed به نامreplyToId/threadIdاستفاده کنید.gateway_start: برای وضعیت راهاندازی متعلق به Gateway، بهجای تکیه بر هوکهای داخلیgateway:startupاز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 |
کمککنندههای runtime |
api.logger |
PluginLogger |
logger محدود به دامنه (debug, info, warn, error) |
api.registrationMode |
PluginRegistrationMode |
حالت بارگذاری فعلی؛ "setup-runtime" پنجره سبک راهاندازی/setup پیش از entry کامل است |
api.resolvePath(input) |
(string) => string |
حل مسیر نسبت به ریشه 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های باندلشده که با facade بارگذاری میشوند (api.ts، runtime-api.ts،
index.ts، setup-entry.ts و فایلهای entry عمومی مشابه)، وقتی OpenClaw از قبل در حال اجرا باشد،
snapshot پیکربندی runtime فعال را ترجیح میدهند. اگر هنوز هیچ snapshot از runtime وجود نداشته باشد،
به فایل پیکربندی حلشده روی دیسک fallback میکنند.
facadeهای Plugin باندلشده بستهبندیشده باید از طریق loaderهای facadeِ Plugin در OpenClaw بارگذاری شوند؛
برای کد متعلق به Plugin استفاده میکنند، دور میزند.
Pluginهای ارائهدهنده میتوانند وقتی یک helper عمداً مخصوص ارائهدهنده است و هنوز به یک زیرمسیر SDK عمومی تعلق ندارد، یک barrel قرارداد باریک و محلی به Plugin را در معرض دسترس بگذارند. نمونههای باندلشده:
- Anthropic: مرز عمومی
api.ts/contract-api.tsبرای helperهای beta-headerِ Claude و جریانservice_tier. @openclaw/openai-provider:api.tsسازندههای ارائهدهنده، helperهای مدل پیشفرض و سازندههای ارائهدهنده realtime را export میکند.@openclaw/openrouter-provider:api.tsسازنده ارائهدهنده بههمراه helperهای onboarding/پیکربندی را export میکند.
مرتبط
گزینههای definePluginEntry و defineChannelPluginEntry.
مرجع کامل فضای نام api.runtime.
بستهبندی، manifestها و schemaهای پیکربندی.
ابزارهای آزمون و قواعد lint.
مهاجرت از سطوح منسوخشده.
معماری عمیق و مدل قابلیت.