خطافات Plugin هي نقاط امتداد داخل العملية لـ OpenClaw plugins. استخدمها عندما يحتاج Plugin إلى فحص أو تغيير تشغيلات الوكيل، أو استدعاءات الأدوات، أو تدفق الرسائل، أو دورة حياة الجلسة، أو توجيه الوكلاء الفرعيين، أو عمليات التثبيت، أو بدء تشغيل Gateway. استخدم الخطافات الداخلية بدلا من ذلك عندما تريد سكربتDocumentation Index
Fetch the complete documentation index at: https://docs.openclaw.ai/llms.txt
Use this file to discover all available pages before exploring further.
HOOK.md صغيرا يثبته المشغل لأحداث الأوامر وGateway مثل
/new أو /reset أو /stop أو agent:bootstrap أو gateway:startup.
البدء السريع
سجل خطافات Plugin المكتوبة الأنواع باستخدامapi.on(...) من نقطة إدخال Plugin لديك:
priority. تحتفظ الخطافات
ذات الأولوية نفسها بترتيب التسجيل.
يقبل api.on(name, handler, opts?) ما يلي:
priority- ترتيب المعالجات (الأعلى يعمل أولا).timeoutMs- ميزانية اختيارية لكل خطاف. عند ضبطها، يوقف مشغل الخطافات ذلك المعالج بعد انقضاء الميزانية ويتابع إلى التالي، بدلا من السماح لإعداد بطيء أو عمل استدعاء بأن يستهلك مهلة النموذج المكونة لدى المستدعي. احذفها لاستخدام مهلة الملاحظة/القرار الافتراضية التي يطبقها مشغل الخطافات بشكل عام.
hooks.timeouts.<hookName> قيمة hooks.timeoutMs، والتي تتجاوز قيمة
api.on(..., { timeoutMs }) التي كتبها Plugin. يجب أن تكون كل قيمة مكونة
عددا صحيحا موجبا لا يزيد عن 600000 مللي ثانية. فضل التجاوزات لكل خطاف
للخطافات البطيئة المعروفة حتى لا يحصل Plugin واحد على ميزانية أطول
في كل مكان.
يتلقى كل خطاف event.context.pluginConfig، وهي الإعدادات المحلولة لـ
Plugin الذي سجل ذلك المعالج. استخدمها لقرارات الخطاف التي تحتاج
خيارات Plugin الحالية؛ يحقنها OpenClaw لكل معالج دون تغيير كائن الحدث
المشترك الذي تراه plugins الأخرى.
فهرس الخطافات
تجمع الخطافات حسب السطح الذي توسعه. الأسماء المكتوبة بـ خط عريض تقبل نتيجة قرار (حظر أو إلغاء أو تجاوز أو طلب موافقة)؛ وكل ما عداها للملاحظة فقط. دورة الوكيلbefore_model_resolve- تجاوز المزود أو النموذج قبل تحميل رسائل الجلسةagent_turn_prepare- استهلاك حقنات دور Plugin المصطفة وإضافة سياق للدورة نفسها قبل خطافات المطالبةbefore_prompt_build- إضافة سياق ديناميكي أو نص مطالبة نظام قبل استدعاء النموذجbefore_agent_start- مرحلة مدمجة للتوافق فقط؛ فضل الخطافين أعلاهbefore_agent_run- فحص المطالبة النهائية ورسائل الجلسة قبل إرسالها إلى النموذج وحظر التشغيل اختيارياbefore_agent_reply- قطع دورة النموذج برد اصطناعي أو صمتbefore_agent_finalize- فحص الإجابة النهائية الطبيعية وطلب مرور نموذج إضافيagent_end- ملاحظة الرسائل النهائية وحالة النجاح ومدة التشغيلheartbeat_prompt_contribution- إضافة سياق خاص بـ Heartbeat فقط لـ plugins مراقبة الخلفية ودورة الحياة
model_call_started/model_call_ended- ملاحظة بيانات وصفية منقحة لاستدعاء المزود/النموذج، والتوقيت، والنتيجة، وتجزئات معرف الطلب المحدودة دون محتوى المطالبة أو الاستجابةllm_input- ملاحظة دخل المزود (مطالبة النظام، المطالبة، السجل)llm_output- ملاحظة خرج المزود
before_tool_call- إعادة كتابة معاملات الأداة أو حظر التنفيذ أو طلب الموافقةafter_tool_call- ملاحظة نتائج الأداة والأخطاء والمدةtool_result_persist- إعادة كتابة رسالة المساعد الناتجة من نتيجة أداةbefore_message_write- فحص أو حظر كتابة رسالة قيد التقدم (نادر)
inbound_claim- المطالبة برسالة واردة قبل توجيه الوكيل (ردود اصطناعية)message_received- ملاحظة المحتوى الوارد والمرسل والسلسلة والبيانات الوصفيةmessage_sending- إعادة كتابة المحتوى الصادر أو إلغاء التسليمmessage_sent- ملاحظة نجاح أو فشل التسليم الصادرbefore_dispatch- فحص أو إعادة كتابة إرسال صادر قبل تسليمه إلى القناةreply_dispatch- المشاركة في خط أنابيب إرسال الرد النهائي
session_start/session_end- تتبع حدود دورة حياة الجلسة. تكون قيمةreasonفي الحدث واحدة منnewأوresetأوidleأوdailyأوcompactionأوdeletedأوshutdownأوrestartأوunknown. تنطلق قيمتاshutdownوrestartمن منهي إيقاف Gateway عندما تتوقف العملية أو يعاد تشغيلها بينما لا تزال الجلسات نشطة، حتى تتمكن plugins اللاحقة (مثل مخازن الذاكرة أو النصوص) من إنهاء الصفوف الشبحية التي كانت ستترك في حالة مفتوحة عبر عمليات إعادة التشغيل. المنهي محدود زمنيا حتى لا يستطيع Plugin بطيء حظر SIGTERM/SIGINT.before_compaction/after_compaction- ملاحظة دورات Compaction أو إضافة تعليقات توضيحية إليهاbefore_reset- ملاحظة أحداث إعادة ضبط الجلسة (/reset، عمليات إعادة الضبط البرمجية)
subagent_spawning/subagent_delivery_target/subagent_spawned/subagent_ended- تنسيق توجيه الوكلاء الفرعيين وتسليم الإكمال
gateway_start/gateway_stop- بدء أو إيقاف الخدمات التي يملكها Plugin مع Gatewaycron_changed- ملاحظة تغييرات دورة حياة Cron التي يملكها Gateway (أضيف، حدث، أزيل، بدأ، انتهى، جدول)before_install- فحص عمليات مسح تثبيت Skills أو Plugin وحظرها اختياريا
سياسة استدعاء الأدوات
يتلقىbefore_tool_call ما يلي:
event.toolNameevent.paramsevent.derivedPathsاختياري، ويحتوي على تلميحات مسارات هدف مستنتجة من المضيف بأفضل جهد لأغلفة الأدوات المعروفة مثلapply_patch؛ عند وجودها، قد تكون هذه المسارات غير مكتملة أو قد تبالغ في تقريب ما ستلمسه الأداة فعليا (على سبيل المثال، مع مدخلات مشوهة أو جزئية)event.runIdاختياريevent.toolCallIdاختياري- حقول سياق مثل
ctx.agentIdوctx.sessionKeyوctx.sessionId، وctx.runIdوctx.jobId(تضبط في التشغيلات المدفوعة بـ Cron)، وctx.traceالتشخيصي
block: trueنهائي ويتخطى المعالجات ذات الأولوية الأدنى.block: falseيعامل على أنه لا قرار.paramsيعيد كتابة معاملات الأداة للتنفيذ.requireApprovalيوقف تشغيل الوكيل مؤقتا ويطلب من المستخدم عبر موافقات Plugin. يمكن لأمر/approveالموافقة على موافقات exec وPlugin معا.- يمكن لـ
block: trueذي أولوية أدنى أن يظل قادرا على الحظر بعد أن يطلب خطاف أعلى أولوية الموافقة. - يتلقى
onResolutionقرار الموافقة المحلول -allow-onceأوallow-alwaysأوdenyأوtimeoutأوcancelled.
api.registerTrustedToolPolicy(...). تعمل هذه قبل خطافات
before_tool_call العادية وقبل قرارات Plugin الخارجية. استخدمها فقط
للبوابات الموثوقة من المضيف مثل سياسة مساحة العمل أو فرض الميزانية أو
سلامة سير العمل المحجوزة. يجب أن تستخدم plugins الخارجية خطافات before_tool_call
العادية.
استمرار نتيجة الأداة
يمكن أن تتضمن نتائج الأدواتdetails منظمة لعرض الواجهة، أو التشخيصات،
أو توجيه الوسائط، أو البيانات الوصفية التي يملكها Plugin. عامل details كبيانات وصفية وقت التشغيل،
وليس كمحتوى مطالبة:
- يزيل OpenClaw
toolResult.detailsقبل إعادة تشغيل المزود ودخل Compaction حتى لا تصبح البيانات الوصفية سياقا للنموذج. - تحتفظ إدخالات الجلسة المستمرة فقط بـ
detailsمحدودة. تستبدل التفاصيل الكبيرة بملخص مضغوط وpersistedDetailsTruncated: true. - يعمل
tool_result_persistوbefore_message_writeقبل حد الاستمرار النهائي. يجب أن تبقي الخطافات مع ذلكdetailsالمعادة صغيرة وتتجنب وضع نص ذي صلة بالمطالبة فيdetailsفقط؛ ضع خرج الأداة المرئي للنموذج فيcontent.
خطافات المطالبة والنموذج
استخدم الخطافات الخاصة بالمرحلة لـ plugins الجديدة:before_model_resolve: يتلقى فقط المطالبة الحالية والبيانات الوصفية للمرفقات. أرجعproviderOverrideأوmodelOverride.agent_turn_prepare: يتلقى المطالبة الحالية ورسائل الجلسة المحضرة وأي حقنات مصفوفة مرة واحدة بالضبط تم تفريغها لهذه الجلسة. أرجعprependContextأوappendContext.before_prompt_build: يتلقى المطالبة الحالية ورسائل الجلسة. أرجعprependContextأوappendContextأوsystemPromptأوprependSystemContextأوappendSystemContext.heartbeat_prompt_contribution: يعمل فقط لدورات Heartbeat ويرجعprependContextأوappendContext. وهو مخصص لمراقبي الخلفية الذين يحتاجون إلى تلخيص الحالة الحالية دون تغيير الدورات التي بدأها المستخدم.
before_agent_start لأغراض التوافق. فضل الخطافات الصريحة أعلاه
حتى لا يعتمد Plugin لديك على مرحلة مدمجة قديمة.
يعمل before_agent_run بعد إنشاء المطالبة وقبل أي دخل للنموذج،
بما في ذلك تحميل الصور المحلي للمطالبة وملاحظة llm_input. يتلقى
دخل المستخدم الحالي باسم prompt، بالإضافة إلى سجل الجلسة المحمل في messages
ومطالبة النظام النشطة. أرجع { outcome: "block", reason, message? }
لإيقاف التشغيل قبل أن يتمكن النموذج من قراءة المطالبة. reason داخلي؛
message هو البديل الموجه للمستخدم. النتائج الوحيدة المدعومة هي
pass وblock؛ تفشل أشكال القرار غير المدعومة بشكل مغلق.
عند حظر تشغيل، يخزن OpenClaw نص البديل فقط في
message.content بالإضافة إلى بيانات وصفية غير حساسة للحظر مثل معرف Plugin
الذي حظر والطابع الزمني. لا يحتفظ بالنص الأصلي للمستخدم في النص أو السياق
المستقبلي. تعامل أسباب الحظر الداخلية على أنها حساسة وتستبعد من
النص، والسجل، والبث، والسجلات، وحمولات التشخيص. يجب أن تستخدم قابلية الملاحظة
حقولا منقحة مثل معرف الحاظر، أو النتيجة، أو الطابع الزمني، أو فئة آمنة.
يتضمن before_agent_start وagent_end قيمة event.runId عندما يستطيع OpenClaw
تحديد التشغيل النشط. تتوفر القيمة نفسها أيضا في ctx.runId.
تعرض التشغيلات المدفوعة بـ Cron أيضا ctx.jobId (معرف مهمة Cron الأصلية) حتى
تستطيع خطافات Plugin حصر المقاييس أو الآثار الجانبية أو الحالة في مهمة مجدولة
محددة.
بالنسبة للتشغيلات الناشئة من القنوات، يكون ctx.messageProvider هو سطح المزود مثل
discord أو telegram، بينما يكون ctx.channelId معرف هدف المحادثة
عندما يستطيع OpenClaw اشتقاقه من مفتاح الجلسة أو بيانات التسليم
الوصفية.
agent_end هو خطاف ملاحظة ويعمل بأسلوب الإطلاق والنسيان بعد الدورة. يطبق
مشغل الخطافات مهلة 30 ثانية حتى لا يتمكن Plugin عالق أو نقطة نهاية تضمين
من ترك وعد الخطاف معلقا إلى الأبد. تسجل المهلة ويتابع
OpenClaw؛ ولا تلغي عمل الشبكة الذي يملكه Plugin إلا إذا كان
Plugin يستخدم أيضا إشارة إجهاض خاصة به.
استخدم model_call_started وmodel_call_ended لقياسات استدعاءات المزوّد
التي يجب ألا تتلقى المطالبات الخام أو السجل أو الردود أو الرؤوس أو أجسام الطلبات
أو معرّفات طلبات المزوّد. تتضمن هذه الخطافات بيانات وصفية مستقرة مثل
runId وcallId وprovider وmodel وapi/transport الاختياريين، وdurationMs/outcome النهائية، وupstreamRequestIdHash عندما يستطيع OpenClaw اشتقاق
تجزئة محدودة لمعرّف طلب المزوّد.
يعمل before_agent_finalize فقط عندما تكون الحاضنة على وشك قبول إجابة مساعد
نهائية طبيعية. إنه ليس مسار إلغاء /stop ولا يعمل عندما يوقف المستخدم دورة. أعد { action: "revise", reason } لطلب تمريرة نموذج إضافية من
الحاضنة قبل الإنهاء، أو { action: "finalize", reason? } لفرض الإنهاء، أو احذف النتيجة للمتابعة.
تُمرَّر خطافات Codex الأصلية Stop إلى هذا الخطاف كقرارات OpenClaw
before_agent_finalize.
عند إرجاع action: "revise"، يمكن للـ plugins تضمين بيانات retry الوصفية لجعل
تمريرة النموذج الإضافية محدودة وآمنة لإعادة التشغيل:
instruction بسبب المراجعة المرسل إلى الحاضنة.
يتيح idempotencyKey للمضيف عدّ المحاولات للطلب نفسه من الـ Plugin عبر
قرارات إنهاء متكافئة، ويحد maxAttempts عدد التمريرات الإضافية التي
سيسمح بها المضيف قبل المتابعة بالإجابة النهائية الطبيعية.
يجب على الـ plugins غير المجمّعة التي تحتاج إلى خطافات المحادثة الخام (before_model_resolve,
before_agent_reply, llm_input, llm_output, before_agent_finalize,
agent_end, أو before_agent_run) ضبط ما يلي:
plugins.entries.<id>.hooks.allowPromptInjection=false.
امتدادات الجلسة وحقن الدور التالي
يمكن لـ plugins سير العمل الاحتفاظ بحالة جلسة صغيرة متوافقة مع JSON باستخدامapi.registerSessionExtension(...) وتحديثها عبر طريقة Gateway
sessions.pluginPatch. تعرض صفوف الجلسات حالة الامتداد المسجلة عبر
pluginExtensions، مما يتيح لـ Control UI والعملاء الآخرين عرض
حالة يملكها الـ Plugin دون معرفة تفاصيله الداخلية.
استخدم api.enqueueNextTurnInjection(...) عندما يحتاج Plugin إلى سياق دائم
ليصل إلى دورة النموذج التالية مرة واحدة بالضبط. يفرغ OpenClaw الحقنات المصطفة قبل
خطافات المطالبات، ويسقط الحقنات المنتهية، ويزيل التكرار حسب idempotencyKey
لكل Plugin. هذا هو الموضع الصحيح لاستئناف الموافقات، وملخصات السياسات،
وفروق مراقبة الخلفية، ومتابعات الأوامر التي يجب أن تكون مرئية للنموذج في
الدورة التالية ولكن يجب ألا تصبح نص مطالبة نظام دائم.
دلالات التنظيف جزء من العقد. تتلقى استدعاءات تنظيف امتداد الجلسة وتنظيف
دورة حياة وقت التشغيل reset أو delete أو disable أو
restart. يزيل المضيف حالة امتداد الجلسة الدائمة والحقنات المعلقة للدور التالي
الخاصة بالـ Plugin المالك عند reset/delete/disable؛ بينما يحتفظ restart
بحالة الجلسة الدائمة في حين تسمح استدعاءات التنظيف للـ plugins بتحرير مهام
المجدول، وسياق التشغيل، والموارد الأخرى خارج النطاق لجيل وقت التشغيل القديم.
خطافات الرسائل
استخدم خطافات الرسائل لسياسة التوجيه والتسليم على مستوى القناة:message_received: راقب المحتوى الوارد، والمرسل، وthreadId، وmessageId, وsenderId، وارتباط التشغيل/الجلسة الاختياري، والبيانات الوصفية.message_sending: أعد كتابةcontentأو أعد{ cancel: true }.message_sent: راقب النجاح أو الفشل النهائي.
content على النص المنطوق المخفي
حتى عندما لا تحتوي حمولة القناة على نص/تعليق مرئي. إعادة كتابة ذلك
content تحدّث النص المرئي للخطاف فقط؛ ولا يُعرض كتعليق وسائط.
تعرض سياقات خطافات الرسائل حقول ارتباط مستقرة عند توفرها:
ctx.sessionKey، وctx.runId، وctx.messageId، وctx.senderId، وctx.trace،
وctx.traceId، وctx.spanId، وctx.parentSpanId، وctx.callDepth. فضّل
هذه الحقول من الدرجة الأولى قبل قراءة البيانات الوصفية القديمة.
فضّل حقلي threadId وreplyToId المطبوعين قبل استخدام البيانات الوصفية الخاصة بالقناة.
قواعد القرار:
message_sendingمعcancel: trueنهائي.message_sendingمعcancel: falseيُعامل كعدم وجود قرار.- يستمر
contentالمعاد كتابته إلى الخطافات ذات الأولوية الأدنى ما لم يلغِ خطاف لاحق التسليم. - يمكن لـ
message_sendingإرجاعcancelReasonوmetadataمحدودة مع الإلغاء. تعرض واجهات API الجديدة لدورة حياة الرسائل ذلك كنتيجة تسليم مكبوتة بالسببcancelled_by_message_sending_hook؛ بينما يستمر التسليم المباشر القديم في إرجاع مصفوفة نتائج فارغة للتوافق. message_sentللملاحظة فقط. تُسجَّل إخفاقات المعالج ولا تغيّر نتيجة التسليم.
خطافات التثبيت
يعملbefore_install بعد الفحص المدمج لتثبيت Skills والـ plugins.
أعد نتائج إضافية أو { block: true, blockReason } لإيقاف
التثبيت.
block: true نهائي. يُعامل block: false كعدم وجود قرار.
دورة حياة Gateway
استخدمgateway_start لخدمات الـ Plugin التي تحتاج إلى حالة مملوكة لـ Gateway. يعرض
السياق ctx.config وctx.workspaceDir وctx.getCron?.() من أجل
فحص Cron وتحديثه. استخدم gateway_stop لتنظيف الموارد طويلة التشغيل.
لا تعتمد على خطاف gateway:startup الداخلي لخدمات وقت التشغيل المملوكة للـ Plugin.
ينطلق cron_changed لأحداث دورة حياة cron المملوكة للـ Gateway مع حمولة
حدث مطبوعة تغطي أسباب added وupdated وremoved وstarted وfinished
وscheduled. يحمل الحدث لقطة PluginHookGatewayCronJob
(بما في ذلك state.nextRunAtMs وstate.lastRunStatus و
state.lastError عند وجودها) بالإضافة إلى PluginHookGatewayCronDeliveryStatus
بقيمة not-requested | delivered | not-delivered | unknown. ما زالت
أحداث الإزالة تحمل لقطة المهمة المحذوفة حتى تتمكن المجدولات الخارجية من
تسوية الحالة. استخدم ctx.getCron?.() وctx.config من سياق وقت التشغيل
عند مزامنة مجدولات الإيقاظ الخارجية، واجعل OpenClaw مصدر الحقيقة
لفحوصات الاستحقاق والتنفيذ.
الإهمالات القادمة
هناك بعض الأسطح المجاورة للخطافات مهملة لكنها ما زالت مدعومة. انتقل قبل الإصدار الرئيسي التالي:- أغلفة القنوات بالنص العادي في معالجات
inbound_claimوmessage_received. اقرأBodyForAgentوكتل سياق المستخدم المهيكلة بدلاً من تحليل نص الغلاف المسطح. راجع أغلفة القنوات بالنص العادي → BodyForAgent. before_agent_startيبقى للتوافق. يجب على الـ plugins الجديدة استخدامbefore_model_resolveوbefore_prompt_buildبدلاً من المرحلة المدمجة.onResolutionفيbefore_tool_callيستخدم الآن اتحادPluginApprovalResolutionالمطبوع (allow-once/allow-always/deny/timeout/cancelled) بدلاً منstringحرّ الصياغة.
command-auth → command-status - راجع
ترحيل Plugin SDK → الإهمالات النشطة.
ذات صلة
- ترحيل Plugin SDK - الإهمالات النشطة والجدول الزمني للإزالة
- بناء plugins
- نظرة عامة على Plugin SDK
- نقاط دخول Plugin
- الخطافات الداخلية
- داخليات بنية Plugin