Plugin SDK reference
نمای کلی SDK افزونه
SDK مربوط به Plugin، قرارداد نوعدار میان Pluginها و هسته است. این صفحه مرجع مواردی است که باید وارد کنید و مواردی که میتوانید ثبت کنید.
قرارداد واردکردن
همیشه از یک زیرمسیر مشخص وارد کنید:
هر زیرمسیر یک ماژول کوچک و خودبسنده است. این کار راهاندازی را سریع نگه میدارد و
از مشکلات وابستگی دوری جلوگیری میکند. برای کمکتابعهای ورودی/ساخت مختص کانال،
openclaw/plugin-sdk/channel-core را ترجیح دهید؛ openclaw/plugin-sdk/core را برای
سطح فراگیرتر و کمکتابعهای مشترکی مانند buildChannelConfigSchema نگه دارید.
برای پیکربندی کانال، JSON Schema متعلق به کانال را از طریق
openclaw.plugin.json#channelConfigs منتشر کنید. زیرمسیر
plugin-sdk/channel-config-schema برای اجزای ابتدایی مشترک طرحواره و سازندهٔ
عمومی است. Pluginهای همراه OpenClaw برای طرحوارههای حفظشدهٔ کانالهای همراه
از plugin-sdk/bundled-channel-config-schema استفاده میکنند. خروجیهای سازگاری
منسوخشده در plugin-sdk/channel-config-schema-legacy باقی میمانند؛ هیچیک از
زیرمسیرهای طرحوارهٔ همراه الگویی برای Pluginهای جدید نیستند.
مرجع زیرمسیرها
SDK مربوط به Plugin بهصورت مجموعهای از زیرمسیرهای محدود و گروهبندیشده بر اساس حوزه ارائه میشود (ورودی Plugin، کانال، ارائهدهنده، احراز هویت، زمان اجرا، قابلیت، حافظه و کمکتابعهای رزروشدهٔ Pluginهای همراه). برای مشاهدهٔ فهرست کامل که گروهبندی و پیونددهی شده است، به زیرمسیرهای SDK مربوط به Plugin مراجعه کنید.
فهرست نقاط ورود کامپایلر در
scripts/lib/plugin-sdk-entrypoints.json قرار دارد؛ خروجیهای بسته پس از کسر
زیرمسیرهای آزمون/داخلیِ محلی مخزن که در
scripts/lib/plugin-sdk-private-local-only-subpaths.json فهرست شدهاند، از
زیرمجموعهٔ عمومی تولید میشوند. برای ممیزی تعداد خروجیهای عمومی،
pnpm plugin-sdk:surface را اجرا کنید. زیرمسیرهای عمومی منسوخشدهای که بهاندازهٔ
کافی قدیمی هستند و کد عملیاتی افزونههای همراه از آنها استفاده نمیکند، در
scripts/lib/plugin-sdk-deprecated-public-subpaths.json ردیابی میشوند؛
barrelهای گستردهٔ بازصدور منسوخشده در
scripts/lib/plugin-sdk-deprecated-barrel-subpaths.json ردیابی میشوند.
API ثبت
فراخوان برگشتی register(api) یک شیء OpenClawPluginApi با متدهای زیر دریافت
میکند:
ثبت قابلیتها
| متد | موردی که ثبت میکند |
|---|---|
api.registerProvider(...) |
استنتاج متن (LLM) |
api.registerWorkerProvider(...) |
اجارههای چرخهٔ حیات کارگر ابری |
api.registerModelCatalogProvider(...) |
ردیفهای فهرست مدل برای تولید متن و رسانه |
api.registerAgentHarness(...) |
اجراکنندهٔ بومی عامل آزمایشی (Codex، Copilot) |
api.registerCliBackend(...) |
پشتیبان محلی استنتاج CLI |
api.registerChannel(...) |
کانال پیامرسانی |
api.registerEmbeddingProvider(...) |
ارائهدهندهٔ قابلاستفادهٔ مجدد برای تعبیهٔ برداری |
api.registerSpeechProvider(...) |
سنتز متنبهگفتار / STT |
api.registerRealtimeTranscriptionProvider(...) |
رونویسی بلادرنگ جریانی |
api.registerRealtimeVoiceProvider(...) |
نشستهای صوتی بلادرنگ دوسویه |
api.registerMediaUnderstandingProvider(...) |
تحلیل تصویر/صدا/ویدئو |
api.registerTranscriptSourceProvider(...) |
منبع زنده یا واردشدهٔ رونویسی جلسه |
api.registerImageGenerationProvider(...) |
تولید تصویر |
api.registerMusicGenerationProvider(...) |
تولید موسیقی |
api.registerVideoGenerationProvider(...) |
تولید ویدئو |
api.registerWebFetchProvider(...) |
ارائهدهندهٔ واکشی / استخراج وب |
api.registerWebSearchProvider(...) |
جستوجوی وب |
api.registerCompactionProvider(...) |
پشتیبان قابلتعویض Compaction رونویسی |
ارائهدهندگان کارگر باید شناسهٔ خود را نیز در contracts.workerProviders اعلام
کنند. هسته پیش از provision(profile, operationId) قصد پایدار را ذخیره میکند.
ارائهدهندگان باید پیش از تخصیص خارجی، تنظیمات را اعتبارسنجی کنند و در صورت رد
دائمی نمایه، WorkerProviderError ایجاد کنند. وقتی شناسهٔ عملیات تکرار میشود،
provision باید همان اجاره را اختیار کند.
هسته تنظیمات اعتبارسنجیشدهٔ نمایه را همراه اجاره ذخیره میکند و آن تصویر لحظهای
را به destroy({ leaseId, profile })، که باید توان اجرای چندباره بدون تغییر
نتیجه را داشته باشد، و inspect({ leaseId, profile }) ارائه میدهد؛ متد دوم یکی
از مقادیر active، destroyed یا unknown را برمیگرداند. این کار به
ارائهدهندگان اجازه میدهد پس از راهاندازی مجدد Gateway یا حذف نمایهٔ نامگذاریشده،
فراخوانیهای چرخهٔ حیات را مسیریابی کنند. نقاط پایانی SSH برای keyRef از
SecretRef استفاده میکنند، هرگز محتوای کلید را بهصورت درونخطی قرار نمیدهند
و یک hostKey برگرفته از خروجی مورداعتماد تأمین را دقیقاً با قالب
algorithm base64، بدون نام میزبان یا توضیح، شامل میشوند. هسته hostKey را
ثابت میکند و هرگز به کلیدی که از نخستین اتصال دریافت شده باشد اعتماد نمیکند.
ارائهدهندهای که یک keyRef پویا ایجاد میکند میتواند
resolveSshIdentity({ leaseId, profile, keyRef }) را پیادهسازی کند؛ در صورت
وجود، این حلکننده مرجع نهایی است، درحالیکه ارائهدهندگان فاقد آن از حلکنندهٔ
عمومی راز پیکربندیشده استفاده میکنند.
ارائهدهندگانی که اجارههای قابل تمدید دارند، میتوانند renew(leaseId) را نیز
پیادهسازی کنند.
inspect باید در شکستهای موقت یا نامعین خطا ایجاد کند؛ فقط برای نبود قطعی
unknown را برگرداند. هسته یک رکورد محلی فعال را یتیم علامتگذاری میکند، یا پس
از درخواست حذف ذخیرهشده، نبود آن را بهمنزلهٔ تکمیل برچیدن در نظر میگیرد.
ارائهدهندگان تعبیه که با api.registerEmbeddingProvider(...) ثبت شدهاند، باید
در مانیفست Plugin نیز در contracts.embeddingProviders فهرست شوند. این سطح
عمومی تعبیه برای تولید بردار قابلاستفادهٔ مجدد است. جستوجوی حافظه میتواند این
سطح عمومی ارائهدهنده را مصرف کند. رابط قدیمیتر
api.registerMemoryEmbeddingProvider(...) و
contracts.memoryEmbeddingProviders یک سازگاری منسوخشده است که تا زمان مهاجرت
ارائهدهندگان فعلی مختص حافظه حفظ میشود.
ارائهدهندگان مختص حافظه که همچنان batchEmbed(...) را در زمان اجرا ارائه
میکنند، روی قرارداد فعلی دستهبندی بهازای هر فایل باقی میمانند، مگر اینکه
زمان اجرای آنها صراحتاً sourceWideBatchEmbed: true را تنظیم کند. این انتخاب
به میزبان حافظه اجازه میدهد قطعههای چند فایل حافظهٔ تغییریافته و منابع
فعالشده را، تا سقف محدودیت دستهٔ میزبان، در یک فراخوانی batchEmbed(...)
ارسال کند. مبدلهای دستهای که فایلهای درخواست JSONL را بارگذاری میکنند، باید
کارهای ارائهدهنده را هم پیش از سقف اندازهٔ بارگذاری و هم پیش از سقف تعداد
درخواست تقسیم کنند. ارائهدهنده باید بهازای هر قطعهٔ ورودی، یک تعبیه را با همان
ترتیب batch.chunks برگرداند؛ هنگامی که ارائهدهنده انتظار دستههای محلی فایل
را دارد یا نمیتواند ترتیب ورودی را در یک کار گستردهتر در سطح منبع حفظ کند،
این پرچم را حذف کنید.
ابزارها و فرمانها
برای Pluginهای ساده و صرفاً ابزاری با نام ابزارهای ثابت، از
defineToolPlugin استفاده کنید. برای Pluginهای ترکیبی
یا ثبت کاملاً پویای ابزار، مستقیماً از api.registerTool(...) استفاده کنید.
| متد | موردی که ثبت میکند |
|---|---|
api.registerTool(tool, opts?) |
ابزار عامل (الزامی یا { optional: true }) |
api.registerCommand(def) |
فرمان سفارشی (LLM را دور میزند) |
api.registerNodeHostCommand(command) |
فرمانی که openclaw node run مدیریت میکند؛ فرادادهٔ اختیاری agentTool میتواند هنگام اتصال Node آن را بهصورت ابزاری قابلمشاهده برای عامل ارائه کند |
فرمانهای Plugin میتوانند زمانی که عامل به یک راهنمای کوتاه برای مسیریابیِ
متعلق به فرمان نیاز دارد، agentPromptGuidance را تنظیم کنند. آن متن را به خود
فرمان محدود کنید؛ سیاست مختص ارائهدهنده یا Plugin را به سازندههای پیام هسته
اضافه نکنید.
ورودیهای راهنما میتوانند رشتههای قدیمی باشند که بر همهٔ سطوح پیام اعمال میشوند، یا ورودیهای ساختاریافته:
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
همچنان یک نام مستعار منسوخشده برای openclaw_main است. برای راهنماییای که
عمداً باید روی همهٔ سطوح اعمال شود، surfaces را حذف کنید. آرایهٔ خالی
surfaces را ارسال نکنید؛ این مقدار رد میشود تا از تبدیل ناخواستهٔ از دست رفتن
محدوده به متن سراسری پیام جلوگیری شود.
دستورالعملهای توسعهدهندهٔ بومی سرور برنامهٔ Codex از سایر سطوح پیام سختگیرانهتر
هستند: فقط راهنماییای که صراحتاً به codex_app_server محدود شده باشد، به آن
مسیر با اولویت بالاتر ارتقا مییابد. راهنمایی رشتهای قدیمی و راهنمایی
ساختاریافتهٔ بدون محدوده، برای حفظ سازگاری همچنان در دسترس سطوح پیام غیر Codex
قرار دارند.
دستورهای میزبان Node روی میزبان Node متصل اجرا میشوند، نه درون فرایند Gateway.
اگر agentTool وجود داشته باشد، Node پس از اتصال موفق به Gateway یک توصیفگر
منتشر میکند؛ Gateway فقط تا زمانی که آن Node متصل است و فقط در صورتی آن را
در اختیار اجراهای عامل قرار میدهد که command توصیفگر در سطح دستورهای
تأییدشدهٔ Node باشد. برای افزودن یک دستور غیرخطرناک به فهرست مجاز پیشفرض
دستورهای Node، agentTool.defaultPlatforms را تنظیم کنید؛ در غیر این صورت،
gateway.nodes.allowCommands صریح یا یک سیاست فراخوانی Node الزامی است.
agentTool.name باید برای ارائهدهنده ایمن باشد: با یک حرف آغاز شود، فقط از
حروف، ارقام، زیرخط یا خط تیره استفاده کند و حداکثر ۶۴ نویسه داشته باشد.
ابزارهای Node مبتنی بر MCP میتوانند فرادادهٔ agentTool.mcp را تنظیم کنند تا
سطوح کاتالوگ و جستوجوی ابزار بتوانند هویت سرور/ابزار MCP راه دور را نمایش
دهند، اما اجرا همچنان از طریق دستور اعلامشدهٔ Node انجام میشود.
زیرساخت
| متد | آنچه ثبت میکند |
|---|---|
api.registerHook(events, handler, opts?) |
هوک رویداد |
api.registerHttpRoute(params) |
نقطهٔ پایانی HTTP در Gateway |
api.registerGatewayMethod(name, handler) |
متد RPC در Gateway |
api.registerGatewayDiscoveryService(service) |
اعلانکنندهٔ کشف Gateway محلی |
api.registerCli(registrar, opts?) |
زیردستور CLI |
api.registerNodeCliFeature(registrar, opts?) |
CLI قابلیت Node زیر openclaw nodes |
api.registerService(service) |
سرویس پسزمینه |
api.registerInteractiveHandler(registration) |
کنترلکنندهٔ تعاملی |
api.registerAgentToolResultMiddleware(...) |
میانافزار نتیجهٔ ابزار در زمان اجرا |
api.registerMemoryPromptSupplement(builder) |
بخش افزودهٔ پرامپت در مجاورت حافظه |
api.registerMemoryCorpusSupplement(adapter) |
پیکرهٔ افزوده برای جستوجو/خواندن حافظه |
api.registerHostedMediaResolver(resolver) |
حلکنندهٔ نشانیهای رسانهٔ میزبانیشده به سبک مرورگر |
api.registerTextTransforms(transforms) |
بازنویسیهای متنی سازگاری پرامپت/پیام تحت مالکیت Plugin |
api.registerConfigMigration(migrate) |
مهاجرت سبک پیکربندی که پیش از بارگذاری زمان اجرای Plugin اجرا میشود |
api.registerMigrationProvider(provider) |
واردکننده برای openclaw migrate |
api.registerAutoEnableProbe(probe) |
کاوشگر پیکربندی که میتواند این Plugin را خودکار فعال کند |
api.registerReload(registration) |
سیاست پیشوند پیکربندی راهاندازی مجدد/بارگذاری گرم/بدون عملیات برای مدیریت بارگذاری مجدد |
api.registerNodeHostCommand(command) |
کنترلکنندهٔ دستوری که در اختیار Nodeهای جفتشده قرار میگیرد |
api.registerNodeInvokePolicy(policy) |
سیاست فهرست مجاز/تأیید برای دستورهایی که Node فراخوانی میکند |
api.registerSecurityAuditCollector(collector) |
گردآورندهٔ یافتهها برای openclaw security audit |
سازندههای افزونهٔ پرامپت حافظه، زمینهٔ اختیاری agentId،
agentSessionKey و sandboxed را دریافت میکنند. فراخوانیهای search
و get در افزونهٔ پیکرهٔ حافظه نیز زمینهٔ اختیاری agentId و sandboxed
را دریافت میکنند. Pluginهایی که فضای ذخیرهسازی متعلق به عامل دارند باید
این فضا را برای هر فراخوانی جداگانه حل کنند، نه اینکه هنگام ثبت یک مسیر
سراسری را ذخیره کنند. اگر در عملیاتی چندعاملی شناسهٔ عامل لازم باشد اما
وجود نداشته باشد، بهجای انتخاب یک عامل دلخواه، عملیات را بهصورت بسته
ناموفق کنید.
کنترلکنندههای تعاملی Telegram میتوانند { submitText } را برگردانند تا پس
از موفقیت کنترلکننده، متن از مسیر ورودی عادی عامل در Telegram عبور کند.
هنگامی که سیاست ورودی متن را نادیده میگیرد یا پردازش شکست میخورد، OpenClaw
دکمهٔ بازفراخوانی را نگه میدارد تا کاربر پس از تغییر وضعیت مسدودکننده دوباره
تلاش کند. این فیلد نتیجه مخصوص Telegram است؛ کانالهای دیگر قراردادهای
نتیجهٔ تعاملی خود را حفظ میکنند.
هوکهای میزبان برای Pluginهای گردش کار
هوکهای میزبان، درزهای SDK برای Pluginهایی هستند که باید در چرخهٔ عمر میزبان مشارکت کنند، نه اینکه فقط یک ارائهدهنده، کانال یا ابزار اضافه کنند. اینها قراردادهایی عمومی هستند؛ حالت برنامهریزی میتواند از آنها استفاده کند، اما گردشهای کار تأیید، دروازههای سیاست فضای کاری، پایشگرهای پسزمینه، راهنماهای راهاندازی و Pluginهای همراه رابط کاربری نیز میتوانند از آنها بهره ببرند.
| متد | قراردادی که مالک آن است |
|---|---|
api.session.state.registerSessionExtension(...) |
وضعیت نشست متعلق به Plugin و سازگار با JSON که از طریق نشستهای Gateway بازتاب داده میشود |
api.session.workflow.enqueueNextTurnInjection(...) |
زمینهٔ ماندگار و دقیقاً یکبار که برای یک نشست به نوبت بعدی عامل تزریق میشود |
api.registerTrustedToolPolicy(...) |
سیاست مورداعتماد ابزار پیش از Plugin که به مانیفست محدود است و میتواند پارامترهای ابزار را مسدود یا بازنویسی کند |
api.registerToolMetadata(...) |
فرادادهٔ نمایشی کاتالوگ ابزار بدون تغییر پیادهسازی ابزار |
api.registerCommand(...) |
دستورهای Plugin با دامنهٔ محدود؛ نتایج دستور میتوانند continueAgent: true یا suppressReply: true را تنظیم کنند؛ دستورهای بومی Discord از descriptionLocalizations پشتیبانی میکنند |
api.session.controls.registerControlUiDescriptor(...) |
توصیفگرهای مشارکت در رابط کاربری کنترل برای سطوح نشست، ابزار، اجرا، تنظیمات یا زبانه |
api.lifecycle.registerRuntimeLifecycle(...) |
بازفراخوانیهای پاکسازی منابع زمان اجرای متعلق به Plugin در مسیرهای بازنشانی/حذف/بارگذاری مجدد |
api.agent.events.registerAgentEventSubscription(...) |
اشتراکهای رویداد پالایششده برای وضعیت گردش کار و پایشگرها |
api.runContext.setRunContext(...) / getRunContext(...) / clearRunContext(...) |
وضعیت موقت Plugin بهازای هر اجرا که در چرخهٔ عمر پایانی اجرا پاک میشود |
api.session.workflow.registerSessionSchedulerJob(...) |
فرادادهٔ پاکسازی کارهای زمانبند متعلق به Plugin؛ کاری را زمانبندی نمیکند و رکورد وظیفه نمیسازد |
api.session.workflow.sendSessionAttachment(...) |
تحویل پیوست فایل با میانجیگری میزبان، فقط برای Pluginهای همراه، به مسیر فعال خروجی مستقیم نشست |
api.session.workflow.scheduleSessionTurn(...) / unscheduleSessionTurnsByTag(...) |
نوبتهای زمانبندیشدهٔ نشست مبتنی بر Cron، فقط برای Pluginهای همراه، بههمراه پاکسازی بر اساس برچسب |
api.session.controls.registerSessionAction(...) |
کنشهای نوعدار نشست که کارخواهها میتوانند از طریق Gateway ارسال کنند |
یک توصیفگر surface: "tab" یک زبانهٔ نوار کناری به رابط کاربری کنترل اضافه
میکند. توصیفگرهای زبانهٔ Pluginهای فعال در پیام آغازین gateway
(controlUiTabs) به کارخواههای داشبورد اعلام میشوند؛ بنابراین زبانه فقط
هنگامی ظاهر میشود که Plugin فعال باشد. Pluginهای همراه میتوانند یک نمای
داشبورد درجهیک برای زبانهٔ خود ارائه دهند؛ Pluginهای دیگر میتوانند path
را روی یک مسیر HTTP متعلق به Plugin تنظیم کنند (به
api.registerHttpRoute(...) مراجعه کنید) تا داشبورد آن را در یک قاب
ایزولهشده نمایش دهد. icon راهنمای نام نماد داشبورد است، group بخش نوار
کناری (control یا agent) را انتخاب میکند، order ترتیب میان زبانههای
Plugin را تعیین میکند و requiredScopes زبانه را از اتصالهایی که فاقد آن
دامنههای اپراتور هستند پنهان میکند:
api.session.controls.registerControlUiDescriptor({ surface: "tab", id: "logbook", label: "Logbook", description: "Your day as a timeline, built from screen snapshots.", icon: "sun", group: "control", requiredScopes: ["operator.write"],});برای کد جدید Plugin از فضای نام گروهبندیشده استفاده کنید:
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(...)
متدهای مسطح معادل همچنان بهعنوان نامهای مستعار سازگاری منسوخشده برای
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 زمانبندی را بر عهده دارد و هنگام اجرای نوبت، رکورد وظیفهٔ
پسزمینه را ایجاد میکند؛ SDKِ Plugin فقط نشست هدف، نامگذاری متعلق به Plugin
و پاکسازی را محدود میکند. هنگامی که خود کار به وضعیت ماندگار چندمرحلهای
جریان وظیفه نیاز دارد، درون نوبت زمانبندیشده از
api.runtime.tasks.managedFlows استفاده کنید.
قراردادها عمداً اختیار را تفکیک میکنند:
- Pluginهای خارجی میتوانند مالک افزونههای نشست، توصیفگرهای رابط کاربری، دستورها، فرادادهٔ ابزار، تزریقهای نوبت بعد و هوکهای عادی باشند.
- سیاستهای مورداعتماد ابزار پیش از هوکهای معمولی
before_tool_callاجرا میشوند و مورداعتماد میزبان هستند. سیاستهای همراه ابتدا اجرا میشوند؛ سیاستهای Pluginهای نصبشده به فعالسازی صریح و همچنین شناسههای محلی خود درcontracts.trustedToolPoliciesنیاز دارند و سپس بهترتیب بارگذاری Plugin اجرا میشوند. شناسههای سیاست به Plugin ثبتکننده محدودند. - مالکیت دستورهای رزروشده فقط برای موارد همراه است. Pluginهای خارجی باید از نامها یا نامهای مستعار دستور خود استفاده کنند.
allowPromptInjection=falseهوکهای تغییردهندهٔ پرامپت، از جملهagent_turn_prepare،before_prompt_build،heartbeat_prompt_contribution، فیلدهای پرامپت ازbefore_agent_startقدیمی وenqueueNextTurnInjectionرا غیرفعال میکند.
نمونههایی از مصرفکنندگان غیرمرتبط با حالت برنامهریزی:
| کهنالگوی Plugin | هوکهای استفادهشده |
|---|---|
| گردشکار تأیید | گسترش نشست، ادامهٔ فرمان، تزریق در نوبت بعدی، توصیفگر رابط کاربری |
| دروازهٔ سیاست بودجه/فضای کار | سیاست ابزار مورداعتماد، فرادادهٔ ابزار، تصویر نشست |
| پایشگر چرخهٔ حیات پسزمینه | پاکسازی چرخهٔ حیات زمان اجرا، اشتراک رویداد عامل، مالکیت/پاکسازی زمانبند نشست، مشارکت در پرامپت Heartbeat، توصیفگر رابط کاربری |
| راهنمای راهاندازی یا شروعبهکار | گسترش نشست، فرمانهای محدود به دامنه، توصیفگر رابط کاربری کنترل |
زمان استفاده از میانافزار نتیجهٔ ابزار
Pluginهای همراه و Pluginهای نصبشدهای که صراحتاً فعال شدهاند و قراردادهای
مانیفست منطبق دارند، وقتی لازم است نتیجهٔ ابزار را پس از اجرا و پیش از آنکه
زمان اجرا آن را دوباره به مدل بدهد بازنویسی کنند، میتوانند از
api.registerAgentToolResultMiddleware(...) استفاده کنند. این درز مورداعتماد
و مستقل از زمان اجرا برای کاهشدهندههای خروجی ناهمگام مانند tokenjuice است.
Pluginها باید برای هر زمان اجرای هدف، contracts.agentToolResultMiddleware را
اعلام کنند؛ برای نمونه ["openclaw", "codex"]. Pluginهای نصبشدهای که این
قرارداد یا فعالسازی صریح را ندارند، نمیتوانند این میانافزار را ثبت کنند؛
برای کارهایی که به زمانبندی نتیجهٔ ابزار پیش از مدل نیاز ندارند، از هوکهای
عادی Plugin در OpenClaw استفاده کنید. مسیر قدیمی ثبت کارخانهٔ افزونه که فقط
برای اجراکنندهٔ توکار بود، حذف شده است.
ثبت کشف 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 و تثبیت TLS همچنان مالک اعتماد هستند.
فرادادهٔ ثبت CLI
api.registerCli(registrar, opts?) دو نوع فرادادهٔ فرمان را میپذیرد:
commands: نامهای صریح فرمان که متعلق به ثبتکننده هستندdescriptors: توصیفگرهای فرمان هنگام تجزیه که برای راهنمای CLI، مسیریابی و ثبت تنبل CLI متعلق به Plugin استفاده میشوندparentPath: مسیر اختیاری فرمان والد برای گروههای فرمان تودرتو، مانند["nodes"]
برای قابلیتهای Node جفتشده، api.registerNodeCliFeature(registrar, opts?) را
ترجیح دهید. این یک پوشش کوچک پیرامون
api.registerCli(..., { parentPath: ["nodes"] }) است و فرمانهایی مانند
openclaw nodes canvas را بهصراحت بهعنوان قابلیتهای Node متعلق به 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, }, ], },);فرمانهای تودرتو، فرمان والد حلشده را بهعنوان 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 استفاده کنید که به ثبت تنبل CLI ریشه نیاز ندارید.
این مسیر سازگاری مشتاقانه همچنان پشتیبانی میشود، اما جاینگهدارهای مبتنی بر
توصیفگر را برای بارگذاری تنبل هنگام تجزیه نصب نمیکند.
ثبت پشتیبان CLI
api.registerCliBackend(...) به یک Plugin امکان میدهد مالک پیکربندی پیشفرض
یک پشتیبان محلی 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 به یک پرچم تلاش بومی. این هوکctx.executionModeرا دریافت میکند؛ برای افزودن پرچمهای جداسازی بومی پشتیبان به فراخوانیهای موقتی/btw، از"side-question"استفاده کنید. اگر آن پرچمها ابزارهای بومی را در یک CLI که در غیر این صورت همیشه فعال است بهطور قابلاعتماد غیرفعال میکنند،sideQuestionToolMode: "disabled"را نیز اعلام کنید. - پشتیبانهایی که میتوانند تمام ابزارهای بومی را برای یک اجرا غیرفعال کنند،
میتوانند
nativeToolMode: "selectable"را اعلام کنند. فراخوانیهای محدودشده، یک چندتایی خالیctx.toolAvailability.nativeبههمراه یک فهرست مجاز دقیق و جداسازیشده از میزبان برای MCP ارسال میکنند؛resolveExecutionArgsباید هر دو را در argv نهایی اجرای تازه یا ازسرگرفتهشده اعمال کند. اگر پشتیبان نتواند این کار را انجام دهد، OpenClaw بهصورت بسته و امن شکست میخورد.
برای راهنمای کامل نگارش، به Pluginهای پشتیبان CLI مراجعه کنید.
جایگاههای انحصاری
| متد | آنچه ثبت میکند |
|---|---|
api.registerContextEngine(id, factory) |
موتور زمینه (هر بار فقط یکی فعال است). وقتی میزبان بتواند عیبیابی مدل/ارائهدهنده/حالت را فراهم کند، فراخوانهای چرخهٔ حیات runtimeSettings را دریافت میکنند؛ موتورهای سختگیر قدیمی بدون این کلید دوباره امتحان میشوند. |
api.registerMemoryCapability(capability) |
قابلیت یکپارچهٔ حافظه |
api.registerMemoryPromptSection(builder) |
سازندهٔ بخش پرامپت حافظه |
api.registerMemoryFlushPlan(resolver) |
حلکنندهٔ طرح تخلیهٔ حافظه |
api.registerMemoryRuntime(runtime) |
سازگارگر زمان اجرای حافظه |
سازگارگرهای منسوخشدهٔ تعبیهسازی حافظه
| متد | آنچه ثبت میکند |
|---|---|
api.registerMemoryEmbeddingProvider(adapter) |
سازگارگر تعبیهسازی حافظه برای Plugin فعال |
registerMemoryCapabilityرابط برنامهنویسی انحصاری ترجیحی برای Plugin حافظه است.registerMemoryCapabilityهمچنین میتواندpublicArtifacts.listArtifacts(...)را ارائه کند تا Pluginهای همراه بتوانند بهجای دسترسی به چیدمان خصوصی یک Plugin حافظهٔ مشخص، مصنوعات حافظهٔ صادرشده را از طریقopenclaw/plugin-sdk/memory-host-coreمصرف کنند.registerMemoryPromptSection،registerMemoryFlushPlanوregisterMemoryRuntimeرابطهای برنامهنویسی انحصاری سازگار با نسخههای قدیمی برای Plugin حافظه هستند.MemoryFlushPlan.modelمیتواند نوبت تخلیه را به یک ارجاع دقیقprovider/model، مانندollama/qwen3:8b، مقید کند، بدون آنکه زنجیرهٔ جایگزین فعال را به ارث ببرد.registerMemoryEmbeddingProviderمنسوخ شده است. ارائهدهندگان تعبیهسازی جدید باید ازapi.registerEmbeddingProvider(...)وcontracts.embeddingProvidersاستفاده کنند.- ارائهدهندگان فعلی مختص حافظه در بازهٔ مهاجرت همچنان کار میکنند، اما بازرسی Plugin این مورد را برای Pluginهای غیرهمراه بهعنوان بدهی سازگاری گزارش میکند.
رویدادها و چرخهٔ حیات
| متد | کاری که انجام میدهد |
|---|---|
api.on(hookName, handler, opts?) |
هوک چرخهٔ حیات نوعدار |
api.onConversationBindingResolved(handler) |
فراخوان بازگشتی اتصال مکالمه |
برای نمونهها، نامهای رایج هوک و معناشناسی محافظها، به هوکهای Plugin مراجعه کنید.
معناشناسی تصمیم هوک
before_install یک هوک چرخهٔ حیات زمان اجرای Plugin است، نه سطح سیاست نصب
اپراتور. وقتی تصمیم اجازه/مسدودسازی باید مسیرهای نصب یا بهروزرسانی مبتنی بر
CLI و Gateway را پوشش دهد، از security.installPolicy استفاده کنید.
before_tool_call: بازگرداندن{ block: true }نهایی است. بهمحض اینکه هر هندلری آن را تنظیم کند، هندلرهای دارای اولویت پایینتر نادیده گرفته میشوند.before_tool_call: بازگرداندن{ block: false }بهمعنای عدم تصمیمگیری تلقی میشود (همانند حذفblock)، نه بهعنوان بازنویسی تصمیم.before_install: بازگرداندن{ block: true }نهایی است. بهمحض اینکه هر هندلری آن را تنظیم کند، هندلرهای دارای اولویت پایینتر نادیده گرفته میشوند.before_install: بازگرداندن{ block: false }بهمعنای عدم تصمیمگیری تلقی میشود (همانند حذفblock)، نه بهعنوان بازنویسی تصمیم.reply_dispatch: بازگرداندن{ handled: true, ... }نهایی است. بهمحض اینکه هر هندلری ارسال را بر عهده بگیرد، هندلرهای دارای اولویت پایینتر و مسیر پیشفرض ارسال مدل نادیده گرفته میشوند.message_sending: بازگرداندن{ cancel: true }نهایی است. بهمحض اینکه هر هندلری آن را تنظیم کند، هندلرهای دارای اولویت پایینتر نادیده گرفته میشوند.message_sending: بازگرداندن{ cancel: false }بهمعنای عدم تصمیمگیری تلقی میشود (همانند حذفcancel)، نه بهعنوان بازنویسی تصمیم.message_received: هنگامی که به مسیریابی رشته/موضوع ورودی نیاز دارید، از فیلد نوعدارthreadIdاستفاده کنید.metadataرا برای اطلاعات اضافی مختص کانال نگه دارید.message_sending: پیش از رجوع بهmetadataمختص کانال، از فیلدهای مسیریابی نوعدارreplyToId/threadIdاستفاده کنید.gateway_start: برای وضعیت راهاندازی تحت مالکیت Gateway، بهجای اتکا به هوکهای داخلیgateway:startupازctx.config،ctx.workspaceDirوctx.getCron?.()استفاده کنید. ممکن است Cron در این لحظه همچنان در حال بارگذاری باشد.cron_reconciled: پس از راهاندازی یا بارگذاری مجدد زمانبند، یک تصویر کامل بیرونی از Cron را بازسازی کنید. این رویداد شاملreasonو وضعیت مؤثرenabled، از جملهenabled: false، است؛ درحالیکهctx.getCron?.()زمانبند دقیقِ تطبیقیافته را بازمیگرداند. برای کار ماندگارِ تولید تصویر،ctx.abortSignalرا ارسال کنید؛ هنگامی که تصویر لحظهای آن زمانبند با نسخهای جدید جایگزین شود یا Gateway بسته شود، عملیات لغو خواهد شد.cron_changed: تغییرات چرخهٔ حیات Cron تحت مالکیت Gateway را مشاهده کنید. رویدادهایscheduledوremovedنشانههای تطبیق پس از ثبت هستند، نه یک گزارش ترتیبی از تغییرات. اگر کاری بیدارباش بعدی نداشته باشد،event.nextRunAtMsدر رویداد زمانبندیشده وجود ندارد؛ رویداد حذفشده همچنان تصویر لحظهای کار حذفشده را حمل میکند.
زمانبندهای بیدارباش بیرونی باید رویدادهای cron_changed را با تأخیر ادغام کنند یا در هم بیامیزند،
سپس نمای کامل و ماندگار را از زمانبندی که آخرین بار توسط
cron_reconciled ثبت شده است، دوباره بخوانند. زمانبند را از زمینهٔ cron_changed
نپذیرید: یک نشانهٔ جداشده از زمانبندی قدیمیتر ممکن است با بارگذاری مجدد بعدی همپوشانی داشته باشد.
از cron_reconciled بهعنوان محرک تصویر کامل برای وضعیت ماندگاری استفاده کنید که هنگام
راهاندازی Gateway یا جایگزینی زمانبند بارگذاری میشود. این رویداد برای بارگذاری مجدد فوریِ
صرفاً مختص Plugin بازپخش نمیشود. هندلرهای مشاهده بهصورت موازی اجرا میشوند و ارسالهای
بدون انتظار برای نتیجه ممکن است همپوشانی داشته باشند؛ بنابراین مصرفکنندگان نباید به ترتیب تکمیل رویدادها وابسته باشند.
OpenClaw را برای بررسی موعدها و اجرا، منبع حقیقت نگه دارید.
برای یک آداپتور تکپرواز با جایگزینی ماندگار، تلاش مجدد/عقبنشینی و خاموشسازی پاک، به تصویرسازی امن بیرونی Cron مراجعه کنید.
فیلدهای شیء 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 |
تصویر لحظهای پیکربندی فعلی (در صورت دسترسبودن، تصویر لحظهای فعالِ زمان اجرا در حافظه) |
api.pluginConfig |
Record<string, unknown> |
پیکربندی مختص Plugin از plugins.entries.<id>.config |
api.runtime |
PluginRuntime |
ابزارهای کمکی زمان اجرا |
api.logger |
PluginLogger |
ثبتکنندهٔ گزارش محدودشده به دامنه (debug، info، warn، error) |
api.registrationMode |
PluginRegistrationMode |
حالت بارگذاری فعلی؛ "setup-runtime" بازهٔ سبکوزن راهاندازی/آمادهسازی پیش از ورودی کامل است |
api.resolvePath(input) |
(string) => string |
حل مسیر نسبت به ریشهٔ Plugin |
قرارداد ماژول داخلی
درون Plugin خود، برای واردسازیهای داخلی از فایلهای barrel محلی استفاده کنید:
my-plugin/ api.ts # خروجیهای عمومی برای مصرفکنندگان بیرونی runtime-api.ts # خروجیهای زمان اجرای صرفاً داخلی index.ts # نقطهٔ ورود Plugin setup-entry.ts # ورودی سبکوزن صرفاً برای آمادهسازی (اختیاری)سطوح عمومی Plugin همراه که با facade بارگذاری میشوند (api.ts، runtime-api.ts،
index.ts، setup-entry.ts و فایلهای ورودی عمومی مشابه)، هنگامی که OpenClaw از قبل
در حال اجرا باشد، تصویر لحظهای پیکربندی فعال زمان اجرا را ترجیح میدهند. اگر هنوز تصویر
لحظهای زمان اجرا وجود نداشته باشد، به فایل پیکربندی حلشده روی دیسک رجوع میکنند.
facadeهای بستهبندیشدهٔ Plugin همراه باید از طریق بارگذارهای facade مربوط به Plugin در
OpenClaw بارگذاری شوند؛ واردسازی مستقیم از dist/extensions/... بررسیهای مانیفست
و همراه جانبی زمان اجرا را که نصبهای بستهبندیشده برای کد تحت مالکیت Plugin استفاده میکنند، دور میزند.
Pluginهای ارائهدهنده میتوانند زمانی که یک ابزار کمکی عمداً مختص ارائهدهنده است و هنوز به یک زیرمسیر عمومی SDK تعلق ندارد، یک barrel قرارداد محدود و محلی برای Plugin ارائه کنند. نمونههای همراه:
- Anthropic: مرز عمومی
api.ts/contract-api.tsبرای ابزارهای کمکی سرآیند بتای Claude و جریانservice_tier. @openclaw/openai-provider:api.tsسازندههای ارائهدهنده، ابزارهای کمکی مدل پیشفرض و سازندههای ارائهدهندهٔ بلادرنگ را صادر میکند.@openclaw/openrouter-provider:api.tsسازندهٔ ارائهدهنده بههمراه ابزارهای کمکی آغاز به کار/پیکربندی را صادر میکند.
مرتبط
گزینههای definePluginEntry و defineChannelPluginEntry.
مرجع کامل فضای نام api.runtime.
بستهبندی، مانیفستها و طرحوارههای پیکربندی.
ابزارهای آزمایش و قواعد بررسی ایستا.
مهاجرت از سطوح منسوخشده.
معماری عمیق و مدل قابلیت.