Plugin SDK reference
نمای کلی SDK افزونه
قرارداد نوعدار میان Pluginها و هسته، SDK مربوط به 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 مربوط به Plugin بهصورت مجموعهای از زیرمسیرهای محدود، گروهبندیشده بر اساس حوزه (ورودی Plugin، کانال، ارائهدهنده، احراز هویت، زمان اجرا، قابلیت، حافظه و کمکتابعهای رزروشدهٔ Pluginهای همراه) ارائه میشود. برای فهرست کاملِ گروهبندیشده و پیونددار، به زیرمسیرهای SDK مربوط به Plugin مراجعه کنید.
فهرست نقاط ورودی کامپایلر در
scripts/lib/plugin-sdk-entrypoints.json قرار دارد؛ خروجیهای عمومی نوعدار، زیرمسیرهای
داخلی فهرستشده در
scripts/lib/plugin-sdk-private-local-only-subpaths.json را مستثنا میکنند. ورودیهای عملیاتی
موجود در آن فهرست، خروجیهای زمان اجرای میزبانِ صرفاً JavaScript را برای Pluginهای
رسمیِ جداگانه منتشرشده حفظ میکنند، درحالیکه ورودیهای صرفاً آزمایشی صادر نمیشوند.
برای ممیزی تعداد خروجیهای عمومی، 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 با روشهای
زیر دریافت میکند:
Pluginهایی که برای یک نشست، سطح گفتوگوی تیمی خارجی فراهم میکنند میتوانند
ارائهدهندهٔ یگانهٔ سراسری فرایند را که از
openclaw/plugin-sdk/session-discussion صادر میشود ثبت کنند. روش info({ sessionKey }) آن
گزارش میدهد که آیا یک گفتوگو در دسترس نیست، آمادهٔ بازشدن است یا از پیش باز است؛
open({ sessionKey }) گفتوگو را ایجاد یا رفع میکند و URLهای جاسازیشده
و خارجی آن را برمیگرداند. ثبت ارائهدهندهای دیگر، ارائهدهندهٔ فعلی را جایگزین میکند.
ثبت قابلیت
| روش | آنچه ثبت میکند |
|---|---|
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(...) |
منبع زنده یا واردشدهٔ رونویسی جلسه؛ Pluginهای جلسه میتوانند از createMeetingTranscriptSourceProvider در plugin-sdk/transcripts استفاده کنند |
api.registerImageGenerationProvider(...) |
تولید تصویر |
api.registerMusicGenerationProvider(...) |
تولید موسیقی |
api.registerVideoGenerationProvider(...) |
تولید ویدئو |
api.registerWebFetchProvider(...) |
ارائهدهندهٔ واکشی / خزش وب |
api.registerWebSearchProvider(...) |
جستوجوی وب |
api.registerCompactionProvider(...) |
بکاند قابلاتصال فشردهسازی رونویسی |
ارائهدهندگان کارگر باید شناسهٔ خود را نیز در 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(...) ثبت میشوند باید
در contracts.embeddingProviders در مانیفست Plugin نیز فهرست شوند. این
سطح عمومی تعبیه برای تولید بردار قابلاستفادهٔ مجدد است. جستوجوی حافظه
میتواند این سطح عمومی ارائهدهنده را مصرف کند. رابط قدیمیتر
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: [ "راهنمای سراسری فرمان.", { text: "این را فقط در اعلان اصلی OpenClaw نمایش دهید.", surfaces: ["openclaw_main"] },];surfaces ساختاریافته ممکن است شامل openclaw_main، codex_app_server،
cli_backend، acp_backend یا subagent باشد. pi_main همچنان نام مستعار منسوخشدهای
برای openclaw_main است. برای راهنمایی عمدی همهٔ سطوح، surfaces را حذف کنید. یک آرایهٔ
خالی surfaces ارسال نکنید؛ این آرایه رد میشود تا از تبدیلشدن ازدسترفتن تصادفی دامنه
به متن سراسری پرامپت جلوگیری شود.
دستورالعملهای توسعهدهندهٔ بومی app-server در Codex از سایر سطوح پرامپت
سختگیرانهترند: فقط راهنماییای که صراحتاً به codex_app_server محدود شده باشد، به
آن مسیر با اولویت بالاتر ارتقا مییابد. راهنمایی رشتهای قدیمی و راهنمایی ساختاریافتهٔ
بدون دامنه برای سازگاری همچنان در دسترس سطوح پرامپت غیر Codex باقی میمانند.
فرمانهای میزبان Node روی میزبان Node متصل اجرا میشوند، نه داخل فرایند
Gateway. اگر agentTool وجود داشته باشد، Node پس از اتصال موفق به Gateway یک
توصیفگر منتشر میکند؛ Gateway آن را فقط تا زمانی که آن Node متصل است و فقط در صورتی
در اختیار اجراهای عامل قرار میدهد که command توصیفگر در سطح فرمانهای
تأییدشدهٔ Node باشد. برای افزودن یک فرمان غیرخطرناک به فهرست مجاز پیشفرض فرمانهای
Node، agentTool.defaultPlatforms را تنظیم کنید؛ در غیر این صورت، gateway.nodes.commands.allow صریح
یا یک سیاست فراخوانی Node لازم است. agentTool.name باید برای ارائهدهنده ایمن
باشد: با یک حرف شروع شود، فقط از حروف، ارقام، زیرخط یا خط تیره استفاده کند و حداکثر
64 نویسه داشته باشد. ابزارهای 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.registerMemoryPromptPreparation(prepare) |
آمادهسازی ناهمگام برای یک بخش پرامپت در مجاورت حافظه |
api.registerMemoryCorpusSupplement(adapter) |
پیکرهٔ افزایشی جستوجو/خواندن حافظه |
api.registerHostedMediaResolver(resolver) |
حلکنندهٔ URLهای رسانهٔ میزبانیشده به سبک مرورگر |
api.registerMcpServerConnectionResolver(...) |
انتقال MCP بهازای هر درخواستکننده (url/headers) برای یک نام ایستای سرور |
api.registerTextTransforms(transforms) |
بازنویسی متن سازگاری پرامپت/پیام تحت مالکیت Plugin |
api.registerConfigMigration(migrate) |
مهاجرت سبک پیکربندی که پیش از بارگیری زمان اجرای Plugin انجام میشود |
api.registerMigrationProvider(provider) |
واردکننده برای openclaw migrate |
api.registerAutoEnableProbe(probe) |
کاوش پیکربندی که میتواند این Plugin را خودکار فعال کند |
api.registerReload(registration) |
سیاست پیشوند پیکربندی restart/hot/noop برای رسیدگی به بارگذاری مجدد |
api.registerNodeHostCommand(command) |
رسیدگیکنندهٔ فرمان ارائهشده به Nodeهای جفتشده |
api.registerNodeInvokePolicy(policy) |
سیاست فهرست مجاز/تأیید برای فرمانهای فراخوانیشده از Node |
api.registerSecurityAuditCollector(collector) |
گردآورندهٔ یافتهها برای openclaw security audit |
کار Webhook پس از تأیید
مسیرهای Webhook که پیش از پایان پردازش یک درخواست را تأیید میکنند، باید آن کار جداشده را به ریشهٔ پذیرش رهگیریشدهٔ مستقل خودش منتقل کنند:
void runDetachedWebhookWork(() => processWebhookEvent(event)).catch((error) => { runtime.error?.(`ارسال webhook ناموفق بود: ${String(error)}`);});runDetachedWebhookWork(...) را هنگامی که درخواست HTTP هنوز پذیرفته شده است، بهصورت
همگام فراخوانی کنید. این تابع کمکی بلافاصله یک ریشهٔ مستقل رزرو میکند، سپس
فراخوان بازگشتی را در ریزوظیفهٔ بعدی آغاز میکند تا رسیدگیکنندهٔ درخواست بتواند
ابتدا تأیید خود را بنویسد. promise بازگشتی نتیجهٔ فراخوان بازگشتی را میپذیرد؛
رسیدگی به ردشدن همچنان بر عهدهٔ فراخواننده است. این کار باعث میشود کار صف پس از
تأیید پذیرفته بماند و تخلیههای راهاندازی مجدد یا تعلیق منتظر آن بمانند.
رسیدگیکنندههایی که پیش از بازگشت منتظر تکمیل تمام پردازش میمانند، به این تابع
کمکی نیاز ندارند.
اتصالهای MCP محدود به درخواستکننده
هویت سرور MCP (نام، فیلتر ابزار) را در mcp.servers، فیلد مانیفست
mcpServers یک Plugin بومی یا یک مانیفست بسته، ایستا نگه دارید. در صورت
تمایل، یک حلکنندهٔ اتصال ثبت کنید تا هر درخواستکنندهٔ مورداعتماد پیام، انتقال
اختصاصی خود را دریافت کند:
api.registerMcpServerConnectionResolver({ serverName: "user-email", resolve: async (ctx) => { // ctx.requesterSenderId is host-trusted; never invent sender identity here. const token = await lookupUserToken(ctx.requesterSenderId); if (!token) { return null; // omit this server for the current run } return { url: "https://mcp.example.com/email", headers: { Authorization: `Bearer ${token}` }, }; },});یادداشتهای قرارداد:
- زمینهٔ حلکننده فقط هویت مورداعتماد میزبان را حمل میکند (
requesterSenderId، وagentAccountId/messageChannelاختیاری). فیلدهای مورداعتماد آینده (برای نمونه، زمینهٔ کاربر cron/زیرعامل) را میتوان بهصورت افزایشی اضافه کرد. - هر Plugin مالک یک نام سرور است:
registerMcpServerConnectionResolverتکراری برای همانserverNameاز یک Plugin دیگر با یک پیام تشخیصی خطا رد میشود (اولین ثبت برنده است)، بنابراین مالکیت اتصال هرگز به ترتیب بارگیری Plugin وابسته نیست. - نام ابزارها از مجموعهٔ کامل سرورهای اعلامشده مشتق میشوند تا حل جزئی هرگز نامهای امن سرور را میان درخواستکنندگان یا نوبتها تغییر ندهد. هسته تأیید نمیکند که نقاط پایانی درخواستکنندگان مختلف طرحوارههای ابزار یکسانی ارائه میدهند؛ حلکننده باید هر درخواستکننده را به همان سرویس منطقی هدایت کند، وگرنه طرحوارههای ابزار (و پایداری کش پرامپت) بهازای هر درخواستکننده واگرا میشوند.
- اجراهای بدون
requesterSenderIdمورداعتماد (cron، زیرعامل، heartbeat، Gateway عمومی) هرگز سرورهای محدود به درخواستکننده را ایجاد نمیکنند. هیچ اتصال جایگزین مشترکی وجود ندارد. resolveبرای هر سرور به 10 ثانیه محدود است؛ پایان مهلت یا پرتاب خطا، آن سرور را بدون شکستدادن MCP ایستا از اجرا حذف میکند.- اتصالهای حلشده حداکثر هر 5 دقیقه یکبار بهازای هر
درخواستکننده دوباره اعتبارسنجی میشوند: چرخش، انتقال را با اعتبارنامههای تازه
بازسازی میکند و نتیجهٔ
nullآن را لغو میکند (زمان اجرای کششده حتی در میانهٔ نشست نیز کنار گذاشته میشود). بنابراین یک اعتبارنامهٔ لغوشده یا چرخیده میتواند تا 5 دقیقه همچنان در حال استفاده بماند. headersحلشده هرگز ثبت یا ماندگار نمیشوند؛ هسته برای تشخیص چرخش اعتبارنامه فقط یک چکیدهٔ کلیددار زودگذر در حافظه (HMAC محلی فرایند) نگه میدارد و مقادیر اعتبارنامهٔ URL/سرآیند حلشده را در رجیستری پوشانندگی ثبت وقایع/ثبت اشکالزدایی ثبت میکند.- سرورهای محدود به درخواستکننده نماهای MCP App ایجاد نمیکنند: یک نما بیش از اجرای احراز هویتشدهٔ درخواستکننده عمر میکند و مرز نمای Gateway هیچ هویت درخواستکنندهای ندارد، بنابراین پیشنمایشهای برنامه برای این سرورها بهصورت بسته و امن باقی میمانند. نتایج ابزار تحتتأثیر نیستند.
- سرورهای ایستای بدون حلکننده، چرخهٔ عمر محدود به نشست موجود را حفظ میکنند.
- قاعدهٔ تحویل هارنس: سرورهای محدود به درخواستکننده هرگز
وارد پیکربندی بومی کلاینت MCP هارنس نمیشوند (رشتهٔ Codex
mcp_servers، CLI-c mcp_servers=…یا هر فرافکنی MCP مشترک دیگر در نشست). در عوض، هارنسها آنها را بهصورت ابزارهای محدود به اجرا تحویل میدهند:- اجراکنندهٔ توکار: زمان اجرای MCP نشست + ابزارهای بسته (ایستا + محدود).
- app-server در Codex: ابزارهای پویا از طریق
materializeRequesterScopedMcpToolsForHarnessRun(فقط محدود؛ سرورهای ایستا روی کلاینت بومی MCP در Codex باقی میمانند).
- مشخصات ابزار محدود پس از نخستین حل موفق در آن نشست، در سطح نشست پایدار میمانند؛ بنابراین هارنسهای دارای رشتهٔ مشترک (Codex) هنگام تغییر فرستنده رشتهها را نمیچرخانند. پیش از حلشدن برای هر درخواستکننده، هیچ مشخصات محدودی اعلام نمیشود.
- درخواستکنندگان احراز هویتنشده در یک هارنس دارای رشتهٔ مشترک همچنان ابزارهای محدود اعلامشده را میبینند؛ فراخوانی هرکدام برای آن درخواستکننده یک خطای ابزار تمیزِ متصلنبودن برمیگرداند. OpenClaw هرگز به اعتبارنامههای درخواستکنندهای دیگر متوسل نمیشود.
سازندگان مکمل پرامپت حافظه، زمینهٔ اختیاری agentId،
agentSessionKey و sandboxed را دریافت میکنند. فراخوانیهای
search و get مکمل پیکرهٔ حافظه، زمینهٔ اختیاری
agentId و sandboxed را دریافت میکنند. Pluginهای دارای
ذخیرهسازی تحت مالکیت عامل باید بهجای ثبت یک مسیر سراسری هنگام ثبت، آن
ذخیرهسازی را برای هر فراخوانی حل کنند. اگر شناسهٔ عامل لازم باشد اما در عملیاتی
چندعاملی وجود نداشته باشد، بهجای انتخاب عاملی دلخواه، بهصورت بسته و امن شکست
بخورید.
هنگامی که متن پرامپت به وضعیت ناهمگام Plugin وابسته است، از
registerMemoryPromptPreparation(...) استفاده کنید. فراخوان بازگشتی پیش از هر پرامپت کامل عامل یکبار
اجرا میشود و همان زمینهٔ ابزار، عامل، نشست و sandbox سازندگان همگام پرامپت
حافظه را دریافت میکند. پیش از بارگیری وضعیت ماندگار، نمونهٔ فعلی مالک
ذخیرهسازی را اعتبارسنجی کنید، سپس فقط خطوط مربوط به همان اجرا را برگردانید.
OpenClaw آن خطوط را ثابت میکند و نتیجهٔ تغییرناپذیر را به مونتاژ همگام پرامپت
تحویل میدهد. ماندگاری، جایگزینی اتمی و حذف هنگام برداشتن مالک را درون Plugin
مالک نگه دارید؛ از سازندهٔ پرامپت فایلها را نظرسنجی یا خوانده نکنید.
رسیدگیکنندههای تعاملی Telegram میتوانند { submitText } را برگردانند تا پس
از موفقیت رسیدگیکننده، متن از مسیر عادی ورودی عامل در Telegram عبور کند.
وقتی سیاست ورودی متن را رد میکند یا پردازش شکست میخورد، OpenClaw دکمهٔ
فراخوان بازگشتی را نگه میدارد تا کاربر پس از تغییر وضعیت مسدودکننده بتواند
دوباره تلاش کند. این فیلد نتیجه مختص Telegram است؛ کانالهای دیگر قراردادهای
نتیجهٔ تعاملی خود را حفظ میکنند.
هوکهای میزبان برای Pluginهای گردش کار
هوکهای میزبان، درگاههای SDK برای Pluginهایی هستند که باید بهجای صرفاً افزودن یک ارائهدهنده، کانال یا ابزار، در چرخهٔ عمر میزبان مشارکت کنند. آنها قراردادهایی عمومیاند؛ Plan Mode میتواند از آنها استفاده کند، اما گردشکارهای تأیید، دروازههای سیاست فضای کاری، پایشگرهای پسزمینه، جادوگرهای راهاندازی و Pluginهای همراه UI نیز میتوانند از آنها بهره ببرند.
| روش | قراردادی که مالک آن است |
|---|---|
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
زبانه را از اتصالهایی که آن دامنههای دسترسی اپراتور را ندارند پنهان میکند:
برای یک زبانهٔ خارجیِ محافظتشده با Gateway، توصیفگر path را زیر یک
مسیر HTTP همPlugin با auth: "gateway" ثبت کنید. پس از راهاندازی اولیهٔ احرازشده، مرورگر یک
مجوز کوتاهعمر و HttpOnly دریافت میکند که به همان Plugin و ریشهٔ مسیر محدود است تا
قاب سندباکسشده بتواند بدون کپیکردن توکن حامل Gateway در URL
یا JavaScript خود بارگذاری شود. والد احرازشده، در مدت فعالبودن زبانهٔ خارجی
و پیش از سوارکردن آن پس از پیمایش یا ازسرگیری مرورگر، مجوز را تمدید میکند. همچنین
پیش از سوارکردن، مجوز را از همان سندباکس مات بررسی میکند تا حالتهای
حریم خصوصی مرورگر که کوکی را مسدود میکنند، بهصورت بسته شکست بخورند و پنلی
دردسترسنبودنی نمایش داده شود.
مجوز قاب فقط GET و HEAD را میپذیرد و همیشه
operator.read را حمل میکند؛ requiredScopes نمایانبودن زبانه را کنترل میکند، اما هرگز دامنهٔ
مجوز کوکی را گسترش نمیدهد. تغییرات همچنان روی سطوح والد یا حاملِ دارای
احراز هویت صریح Gateway باقی میمانند. زبانههای خارجی به HTTPS/Tailscale Serve یا یک
مبدأ loopback مورداعتماد مرورگر نیاز دارند؛ HTTP ساده روی یک میزبان LAN بهجای سوارکردن
پنلی که نمیتواند احراز هویت شود، خطای زمینهٔ امن را نمایش میدهد.
مسدودسازی کامل کوکیهای شخص ثالث نیز زبانههای محافظتشده با Gateway را دردسترسناپذیر میکند.
همانند همهٔ سطوح بومی Plugin، قاب درون مرز اعتماد Plugin نصبشده
باقی میماند؛ OpenClaw، Pluginهای نصبشده را بهعنوان هویتهای امنیتی مرورگر که متقابلاً
از یکدیگر جدا هستند در نظر نمیگیرد.
مجوزهای کوکی از مرز نام میزبان مرورگر استفاده میکنند، نه مرز پورت آن. حتی روی
پورتهای دیگر نیز سرویسهایی را که متقابلاً به یکدیگر اعتماد ندارند روی نام میزبان Gateway
هممیزبانی نکنید.
زبانههایی که احراز هویتشان توسط Plugin مدیریت میشود، رفتار مستقیم iframe خود را حفظ میکنند و این
مجوز Gateway را درخواست یا الزامی نمیکنند.
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 و پاکسازی را محدود میکند. هنگامی که خود کار به وضعیت پایدار
چندمرحلهای Task Flow نیاز دارد، درون نوبت زمانبندیشده از api.runtime.tasks.managedFlows
استفاده کنید.
قراردادها عمداً اختیار را تفکیک میکنند:
- Pluginهای خارجی میتوانند مالک افزونههای نشست، توصیفگرهای رابط کاربری، فرمانها، فرادادهٔ ابزار، تزریقهای نوبت بعدی و قلابهای عادی باشند.
- سیاستهای مورداعتماد ابزار پیش از قلابهای عادی
before_tool_callاجرا میشوند و مورداعتماد میزبان هستند. سیاستهای همراه ابتدا اجرا میشوند؛ سیاستهای Pluginهای نصبشده به فعالسازی صریح بههمراه شناسههای محلیشان درcontracts.trustedToolPoliciesنیاز دارند و سپس بهترتیب بارگذاری Plugin اجرا میشوند. شناسههای سیاست به Plugin ثبتکننده محدود هستند. - مالکیت فرمانهای رزروشده فقط برای Pluginهای همراه است. Pluginهای خارجی باید از نامها یا نامهای مستعار فرمان خود استفاده کنند.
allowPromptInjection=falseقلابهای تغییردهندهٔ پرامپت، از جملهagent_turn_prepare،before_prompt_build،heartbeat_prompt_contributionوenqueueNextTurnInjectionرا غیرفعال میکند.
نمونههایی از مصرفکنندگان غیر Plan:
| الگوی 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: "مدیریت حسابها، تأیید، دستگاهها و وضعیت نمایه Matrix", hasSubcommands: true, }, ], },);فرمانهای تودرتو فرمان والدِ تفکیکشده را بهصورت program دریافت میکنند:
api.registerCli( async ({ program }) => { const { registerNodesCanvasCommands } = await import("./src/cli.js"); registerNodesCanvasCommands(program); }, { parentPath: ["nodes"], descriptors: [ { name: "canvas", description: "ثبت یا رندر محتوای بوم از یک Node جفتشده", hasSubcommands: true, }, ], },);تنها زمانی از commands بهتنهایی استفاده کنید که به ثبت تنبل CLI ریشه نیازی ندارید.
آن مسیر سازگاریِ eager همچنان پشتیبانی میشود، اما برای بارگذاری تنبل در زمان تجزیه،
جاینگهدارهای مبتنی بر توصیفگر را نصب نمیکند.
ثبت بکاند CLI
api.registerCliBackend(...) به یک Plugin اجازه میدهد مالک پیکربندی پیشفرض یک
بکاند محلی CLI هوش مصنوعی مانند claude-cli یا my-cli باشد.
idبکاند به پیشوند ارائهدهنده در ارجاعهای مدل مانندmy-cli/gpt-5تبدیل میشود.configبکاند، آداپتور فرمانِ مرجع است: رفتار argv، محیط، تجزیهگر، نشست، تصویر و قابلیت اطمینان در کد Plugin قرار دارد.- کاربران بکاند را از طریق ارجاعهای مدل یا
agentRuntime.idمحدود به مدل انتخاب میکنند؛openclaw.jsonآداپتور را بازنویسی نمیکند. - هنگامی که فیلدهای ایستای ثبتشده به یک گذر نرمالسازی آگاه از زمان اجرا نیاز دارند، از
normalizeConfigاستفاده کنید. - برای بازنویسیهای argv محدود به درخواست که به گویش CLI تعلق دارند، از
resolveExecutionArgsاستفاده کنید؛ مانند نگاشت سطوح تفکر OpenClaw به یک پرچم effort بومی. هوک،ctx.executionModeرا دریافت میکند؛ برای افزودن پرچمهای جداسازی بومی بکاند به فراخوانیهای موقتی/btw، از"side-question"استفاده کنید. اگر این پرچمها ابزارهای بومی را برای یک CLI که در غیر این صورت همیشه فعال است بهطور قابلاعتماد غیرفعال میکنند،sideQuestionToolMode: "disabled"را نیز اعلان کنید. - برای محیط اجرای تحت مالکیت بکاند یا پلهای موقت احراز هویت/پیکربندی، از
prepareExecutionاستفاده کنید.ctx.contextTokenBudgetآن، محدودیت مؤثر توکنِ انتخابشده برای اجرا است؛ بنابراین بکاندهای دارای Compaction بومی میتوانند آستانه خود را بدون شاخههای هسته مختص ارائهدهنده همتراز کنند. همچنین هنگامی که آمادهسازی بکاند باید تنظیمات همراه MCP را گسترش دهد،ctx.envآمادهشده توسط هسته را دریافت میکند. - بکاندهایی که میتوانند همه ابزارهای بومی را برای یک اجرای مشخص غیرفعال کنند، میتوانند
nativeToolMode: "selectable"را اعلان کنند. فراخوانیهای محدودشده یک فهرست دقیقctx.toolAvailability.nativeبههمراه نامهای متعارفctx.toolAvailability.openClawارسال میکنند.toolAvailabilityEnforcement: "execution-args"را اعلان و قرارداد را در argv نهاییِ تازه/ازسرگرفتهشده اعمال کنید، یا"prepare-execution"را اعلان کنید، آن را در سیاست آمادهشده اعمال کنید وtoolAvailabilityEnforced: trueرا برگردانید. OpenClaw ابزارهای بومی را برای سقفهای زمان اجرا مانندtoolsAllowمربوط به Cron غیرفعال میکند و هنگامی که مسیر اعمال اعلانشده ناقص باشد، با حالت بسته شکست میخورد.
برای راهنمای نگارش سرتاسری، به Pluginهای بکاند CLI مراجعه کنید.
جایگاههای انحصاری
| متد | آنچه ثبت میکند |
|---|---|
api.registerContextEngine(id, factory) |
موتور زمینه (هر بار فقط یکی فعال است). هنگامی که میزبان بتواند اطلاعات عیبیابی مدل/ارائهدهنده/حالت را فراهم کند، callbackهای چرخه حیات runtimeSettings را دریافت میکنند؛ موتورهای سختگیر قدیمیتر بدون آن کلید دوباره امتحان میشوند. |
api.registerMemoryCapability(capability) |
قابلیت یکپارچه حافظه |
آداپتورهای منسوخشده تعبیه حافظه
| متد | آنچه ثبت میکند |
|---|---|
api.registerMemoryEmbeddingProvider(adapter) |
آداپتور تعبیه حافظه برای Plugin فعال |
registerMemoryCapability، API انحصاری Plugin حافظه است.registerMemoryCapabilityهمچنین ممکن استpublicArtifacts.listArtifacts(...)را برای خروجیهای مدیریتشده توسط میزبان ارائه کند. Pluginهای همراه که آن مصنوعات اعلانشده را فهرست میکنند، تا زمانی که یک API عمومی و متمرکز برای مصرفکننده وجود داشته باشد، همچنان ازlistActiveMemoryPublicArtifacts(...)نمای حفظشدهopenclaw/plugin-sdk/memory-host-coreاستفاده میکنند؛ آنها نباید به چیدمان خصوصی Plugin دیگری دسترسی پیدا کنند.MemoryFlushPlan.modelمیتواند نوبت تخلیه را به یک ارجاع دقیقprovider/model، مانندollama/qwen3:8b، سنجاق کند، بدون اینکه زنجیره fallback فعال را به ارث ببرد.registerMemoryEmbeddingProviderمنسوخ شده است. ارائهدهندگان جدید تعبیه باید ازapi.registerEmbeddingProvider(...)وcontracts.embeddingProvidersاستفاده کنند.- ارائهدهندگان موجودِ مختص حافظه در طول بازه مهاجرت به کار خود ادامه میدهند، اما بازرسی Plugin این مورد را برای Pluginهای غیرهمراه بهعنوان بدهی سازگاری گزارش میکند.
رویدادها و چرخه حیات
| متد | کاری که انجام میدهد |
|---|---|
api.on(hookName, handler, opts?) |
هوک نوعدار چرخه حیات |
api.onConversationBindingResolved(handler) |
callback اتصال مکالمه |
برای نمونهها، نامهای رایج هوک و معناشناسی محافظ، به هوکهای Plugin مراجعه کنید.
معناشناسی تصمیم هوک
before_install یک هوک چرخه حیات زمان اجرای Plugin است، نه سطح سیاست نصب اپراتور.
هنگامی که تصمیم مجازسازی/مسدودسازی باید مسیرهای نصب یا بهروزرسانی مبتنی بر 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 ارسال را بر عهده بگیرد، handlerهای با اولویت پایینتر و مسیر پیشفرض ارسال مدل نادیده گرفته میشوند.message_sending: برگرداندن{ cancel: true }نهایی است. بهمحض اینکه هر handler آن را تنظیم کند، handlerهای با اولویت پایینتر نادیده گرفته میشوند.message_sending: برگرداندن{ cancel: false }بهمعنای نبود تصمیم تلقی میشود (همانند حذفcancel)، نه بهعنوان override.message_received: هنگامی که به مسیریابی ورودی رشته/موضوع نیاز دارید، از فیلد نوعدارthreadIdاستفاده کنید.metadataرا برای موارد اضافی مختص کانال نگه دارید.message_sending: پیش از fallback به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را به کار ماندگار تصویرسازی ارسال کنید؛ هنگامی که snapshot آن زمانبند جایگزین شود یا Gateway بسته شود، عملیات را لغو میکند.cron_changed: تغییرات چرخه حیات Cron تحت مالکیت Gateway را مشاهده کنید. رویدادهایscheduledوremovedراهنمای تطبیق پس از commit هستند، نه یک گزارش مرتبشده تغییرات.event.nextRunAtMsیک رویداد زمانبندیشده هنگامی وجود ندارد که کار بیدارباش بعدی نداشته باشد؛ یک رویداد حذفشده همچنان snapshot کار حذفشده را حمل میکند.
زمانبندهای خارجی بیدارباش باید رویدادهای cron_changed را debounce یا ادغام کنند،
سپس نمای کامل و ماندگار را از زمانبندی که آخرین بار توسط
cron_reconciled ثبت شده است، دوباره بخوانند. زمانبند را از زمینه cron_changed نپذیرید:
یک راهنمای جداشده از زمانبندی قدیمیتر میتواند با بارگذاری مجدد بعدی همپوشانی داشته باشد.
از cron_reconciled بهعنوان محرک snapshot کامل برای وضعیت ماندگاری استفاده کنید که هنگام
راهاندازی Gateway یا جایگزینی زمانبند بارگذاری شده است. این مورد برای بارگذاری مجدد داغِ صرفاً Plugin
بازپخش نمیشود. handlerهای مشاهده بهطور موازی اجرا میشوند و
ارسالهای fire-and-forget میتوانند همپوشانی داشته باشند؛ بنابراین مصرفکنندگان نباید به ترتیب تکمیل رویداد وابسته باشند.
OpenClaw را منبع حقیقت برای بررسی موعدها و اجرا نگه دارید.
برای یک آداپتور تکاجرایی با جایگزینی ماندگار، تلاش مجدد/backoff و خاموششدن پاک، به تصویرسازی امن خارجی 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 |
snapshot فعلی پیکربندی (در صورت وجود، snapshot فعال زمان اجرا در حافظه) |
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 خود، برای importهای داخلی از فایلهای 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 از قبل در حال اجراست،
snapshot فعال پیکربندی runtime را ترجیح میدهند. اگر هنوز snapshotی از runtime
وجود نداشته باشد، به فایل پیکربندی resolveشده روی دیسک بازمیگردند.
facadeهای Pluginهای همراه بستهبندیشده باید از طریق بارگذارهای facade مربوط به Plugin در OpenClaw
بارگذاری شوند؛ import مستقیم از dist/extensions/... بررسیهای manifest
و sidecar مربوط به runtime را که نصبهای بستهبندیشده برای کد تحت مالکیت Plugin استفاده میکنند، دور میزند.
Pluginهای ارائهدهنده میتوانند یک barrel قرارداد محدود و محلی برای Plugin ارائه کنند، مشروط بر اینکه helper عمداً مختص ارائهدهنده باشد و هنوز به یک زیرمسیر عمومی SDK تعلق نداشته باشد. نمونههای همراه:
- Anthropic: مرز عمومی
api.ts/contract-api.tsبرای helperهای beta-header مربوط به Claude و جریانservice_tier. @openclaw/openai-provider:api.tsسازندههای ارائهدهنده، helperهای مدل پیشفرض و سازندههای ارائهدهنده بلادرنگ را export میکند.@openclaw/openrouter-provider:api.tsسازنده ارائهدهنده را همراه با helperهای راهاندازی اولیه/پیکربندی export میکند.
مرتبط
گزینههای definePluginEntry و defineChannelPluginEntry.
مرجع کامل فضای نام api.runtime.
بستهبندی، manifestها و schemaهای پیکربندی.
ابزارهای کمکی آزمایش و قواعد lint.
مهاجرت از سطوح منسوخشده.
معماری عمیق و مدل قابلیت.