Heartbeat (البوابة)
Heartbeat أم Cron؟ راجع الأتمتة والمهام للحصول على إرشادات حول وقت استخدام كل منهما.يشغّل Heartbeat أدوار وكيل دورية في الجلسة الرئيسية حتى يتمكن النموذج من إبراز أي شيء يحتاج إلى انتباه دون إغراقك بالرسائل. Heartbeat هو دور مجدول في الجلسة الرئيسية — وهو لا ينشئ سجلات المهام الخلفية. سجلات المهام مخصصة للعمل المنفصل (تشغيلات ACP، والوكلاء الفرعيون، ووظائف cron المعزولة). استكشاف الأخطاء وإصلاحها: المهام المجدولة
بداية سريعة (للمبتدئين)
- اترك Heartbeat مفعّلًا (القيمة الافتراضية هي
30m، أو1hلمصادقة Anthropic OAuth/الرمز، بما في ذلك إعادة استخدام Claude CLI) أو اضبط وتيرتك الخاصة. - أنشئ قائمة تحقق صغيرة في
HEARTBEAT.mdأو كتلةtasks:في مساحة عمل الوكيل (اختياري لكنه مستحسن). - قرر إلى أين يجب أن تذهب رسائل Heartbeat (القيمة الافتراضية هي
target: "none"؛ اضبطtarget: "last"للتوجيه إلى آخر جهة اتصال). - اختياري: فعّل تسليم الاستدلال الخاص بـ Heartbeat لمزيد من الشفافية.
- اختياري: استخدم سياق تمهيد خفيفًا إذا كانت تشغيلات Heartbeat تحتاج فقط إلى
HEARTBEAT.md. - اختياري: فعّل الجلسات المعزولة لتجنب إرسال سجل المحادثة الكامل في كل Heartbeat.
- اختياري: قيّد Heartbeats بساعات النشاط (بالتوقيت المحلي).
القيم الافتراضية
- الفاصل الزمني:
30m(أو1hعندما تكون مصادقة Anthropic OAuth/الرمز هي وضع المصادقة المكتشف، بما في ذلك إعادة استخدام Claude CLI). اضبطagents.defaults.heartbeat.everyأوagents.list[].heartbeat.everyلكل وكيل؛ استخدم0mللتعطيل. - نص الموجّه (قابل للتهيئة عبر
agents.defaults.heartbeat.prompt):Read HEARTBEAT.md if it exists (workspace context). Follow it strictly. Do not infer or repeat old tasks from prior chats. If nothing needs attention, reply HEARTBEAT_OK. - يُرسَل موجّه Heartbeat حرفيًا كرسالة مستخدم. يتضمن موجّه النظام قسم “Heartbeat” فقط عندما تكون Heartbeats مفعّلة للوكيل الافتراضي، ويكون التشغيل معلّمًا داخليًا.
- عندما يتم تعطيل Heartbeats باستخدام
0m، تحذف التشغيلات العادية أيضًاHEARTBEAT.mdمن سياق التمهيد حتى لا يرى النموذج تعليمات Heartbeat فقط. - يتم التحقق من ساعات النشاط (
heartbeat.activeHours) في المنطقة الزمنية المهيأة. خارج النافذة، يتم تخطي Heartbeats حتى النبضة التالية داخل النافذة.
ما الغرض من موجّه Heartbeat
الموجّه الافتراضي عام عمدًا:- المهام الخلفية: عبارة “ضع في الاعتبار المهام المعلّقة” تدفع الوكيل إلى مراجعة المتابعات (البريد الوارد، والتقويم، والتذكيرات، والعمل المصطف في الطابور) وإبراز أي شيء عاجل.
- التحقق من المستخدم: عبارة “تحقق من إنسانك أحيانًا أثناء النهار” تدفع إلى رسالة خفيفة من حين لآخر مثل “هل تحتاج إلى شيء؟”، لكنها تتجنب الإزعاج الليلي باستخدام منطقتك الزمنية المحلية المهيأة (راجع /concepts/timezone).
agents.defaults.heartbeat.prompt (أو
agents.list[].heartbeat.prompt) على نص مخصص (يُرسَل حرفيًا).
عقد الاستجابة
- إذا لم يكن هناك ما يحتاج إلى انتباه، فردّ بـ
HEARTBEAT_OK. - أثناء تشغيلات Heartbeat، يتعامل OpenClaw مع
HEARTBEAT_OKكإقرار عندما يظهر في بداية أو نهاية الرد. تتم إزالة الرمز ويُسقَط الرد إذا كان المحتوى المتبقي ≤ackMaxChars(الافتراضي: 300). - إذا ظهر
HEARTBEAT_OKفي منتصف الرد، فلا تتم معاملته معاملة خاصة. - للتنبيهات، لا تُضمّن
HEARTBEAT_OK؛ أعد نص التنبيه فقط.
HEARTBEAT_OK عارض في بداية/نهاية الرسالة
ويُسجَّل؛ وتُسقَط الرسالة إذا كانت فقط HEARTBEAT_OK.
الإعدادات
النطاق والأسبقية
- يضبط
agents.defaults.heartbeatسلوك Heartbeat العام. - يُدمَج
agents.list[].heartbeatفوقه؛ إذا كان لدى أي وكيل كتلةheartbeat، فإن هؤلاء الوكلاء فقط هم من يشغّلون Heartbeats. - يضبط
channels.defaults.heartbeatالقيم الافتراضية للظهور لجميع القنوات. - يتجاوز
channels.<channel>.heartbeatالقيم الافتراضية للقناة. - يتجاوز
channels.<channel>.accounts.<id>.heartbeat(القنوات متعددة الحسابات) إعدادات كل قناة.
Heartbeats لكل وكيل
إذا تضمّن أي إدخال فيagents.list[] كتلة heartbeat، فإن هؤلاء الوكلاء فقط
هم من يشغّلون Heartbeats. وتُدمَج الكتلة الخاصة بكل وكيل فوق agents.defaults.heartbeat
(حتى تتمكن من ضبط القيم المشتركة مرة واحدة ثم تجاوزها لكل وكيل).
مثال: وكيلان، والوكيل الثاني فقط هو من يشغّل Heartbeats.
مثال على ساعات النشاط
قيّد Heartbeats بساعات العمل في منطقة زمنية محددة:إعداد 24/7
إذا كنت تريد تشغيل Heartbeats طوال اليوم، فاستخدم أحد هذين النمطين:- احذف
activeHoursبالكامل (من دون تقييد بنافذة زمنية؛ وهذا هو السلوك الافتراضي). - اضبط نافذة يوم كامل:
activeHours: { start: "00:00", end: "24:00" }.
start وend على الوقت نفسه (مثل 08:00 إلى 08:00).
تُعامَل هذه الحالة على أنها نافذة بعرض صفري، لذلك يتم دائمًا تخطي Heartbeats.
مثال على الحسابات المتعددة
استخدمaccountId لاستهداف حساب محدد في القنوات متعددة الحسابات مثل Telegram:
ملاحظات الحقول
every: الفاصل الزمني لـ Heartbeat (سلسلة مدة؛ وحدة القياس الافتراضية = دقائق).model: تجاوز اختياري للنموذج في تشغيلات Heartbeat (provider/model).includeReasoning: عند تفعيله، يسلّم أيضًا رسالةReasoning:المنفصلة عند توفرها (بالصيغة نفسها مثل/reasoning on).lightContext: عندما تكون قيمته true، تستخدم تشغيلات Heartbeat سياق تمهيد خفيفًا وتُبقي فقطHEARTBEAT.mdمن ملفات تمهيد مساحة العمل.isolatedSession: عندما تكون قيمته true، يعمل كل Heartbeat في جلسة جديدة من دون أي سجل محادثة سابق. ويستخدم نمط العزل نفسه مثل cronsessionTarget: "isolated". ويقلل بدرجة كبيرة تكلفة الرموز لكل Heartbeat. اجمعه معlightContext: trueلتحقيق أكبر قدر من التوفير. يظل توجيه التسليم يستخدم سياق الجلسة الرئيسية.session: مفتاح جلسة اختياري لتشغيلات Heartbeat.main(الافتراضي): الجلسة الرئيسية للوكيل.- مفتاح جلسة صريح (انسخه من
openclaw sessions --jsonأو من CLI الجلسات). - صيغ مفاتيح الجلسة: راجع الجلسات والمجموعات.
target:last: التسليم إلى آخر قناة خارجية مستخدمة.- قناة صريحة: أي قناة أو معرّف plugin مهيأ، مثل
discordأوmatrixأوtelegramأوwhatsapp. none(الافتراضي): شغّل Heartbeat لكن لا تُسلِّمه خارجيًا.
directPolicy: يتحكم في سلوك التسليم المباشر/الرسائل الخاصة:allow(الافتراضي): السماح بتسليم Heartbeat إلى الأهداف المباشرة/الرسائل الخاصة.block: منع التسليم المباشر/الرسائل الخاصة (reason=dm-blocked).
to: تجاوز اختياري للمستلم (معرّف خاص بالقناة، مثل E.164 لـ WhatsApp أو معرّف دردشة Telegram). بالنسبة إلى topics/threads في Telegram، استخدم<chatId>:topic:<messageThreadId>.accountId: معرّف حساب اختياري للقنوات متعددة الحسابات. عندما تكونtarget: "last"، يُطبَّق معرّف الحساب على آخر قناة محلولة إذا كانت تدعم الحسابات؛ وإلا يتم تجاهله. وإذا لم يطابق معرّف الحساب حسابًا مهيأً للقناة المحلولة، يتم تخطي التسليم.prompt: يتجاوز نص الموجّه الافتراضي (من دون دمج).ackMaxChars: الحد الأقصى للأحرف المسموح بها بعدHEARTBEAT_OKقبل التسليم.suppressToolErrorWarnings: عندما تكون قيمته true، يمنع حمولات تحذير أخطاء الأدوات أثناء تشغيلات Heartbeat.activeHours: يقيّد تشغيلات Heartbeat بنافذة زمنية. وهو كائن يحتوي علىstart(HH:MM، شامل؛ استخدم00:00لبداية اليوم) وend(HH:MM غير شامل؛ ويسمح بـ24:00لنهاية اليوم) وtimezoneاختياري.- إذا حُذف أو كانت قيمته
"user": يستخدمagents.defaults.userTimezoneإذا كان مضبوطًا، وإلا يعود إلى المنطقة الزمنية لنظام المضيف. "local": يستخدم دائمًا المنطقة الزمنية لنظام المضيف.- أي معرّف IANA (مثل
America/New_York): يُستخدم مباشرة؛ وإذا كان غير صالح، يعود إلى سلوك"user"أعلاه. - يجب ألا تكون
startوendمتساويتين في النافذة النشطة؛ إذ تُعامَل القيم المتساوية على أنها عرض صفري (أي دائمًا خارج النافذة). - خارج النافذة النشطة، يتم تخطي Heartbeats حتى النبضة التالية داخل النافذة.
- إذا حُذف أو كانت قيمته
سلوك التسليم
- تعمل Heartbeats افتراضيًا في الجلسة الرئيسية للوكيل (
agent:<id>:<mainKey>)، أوglobalعندما تكونsession.scope = "global". اضبطsessionللتجاوز إلى جلسة قناة محددة (Discord/WhatsApp/إلخ). - يؤثر
sessionفقط في سياق التشغيل؛ ويتحكمtargetوtoفي التسليم. - للتسليم إلى قناة/مستلم محدد، اضبط
target+to. معtarget: "last"، يستخدم التسليم آخر قناة خارجية لتلك الجلسة. - تسمح تسليمات Heartbeat بالأهداف المباشرة/الرسائل الخاصة افتراضيًا. اضبط
directPolicy: "block"لمنع الإرسال إلى الأهداف المباشرة مع الاستمرار في تشغيل دور Heartbeat. - إذا كان الطابور الرئيسي مشغولًا، يتم تخطي Heartbeat وإعادة المحاولة لاحقًا.
- إذا لم يُحلّ
targetإلى أي وجهة خارجية، فسيحدث التشغيل لكن لن تُرسَل أي رسالة صادرة. - إذا كانت
showOkوshowAlertsوuseIndicatorكلها معطلة، فيتم تخطي التشغيل مسبقًا بسببreason=alerts-disabled. - إذا كان تسليم التنبيهات فقط معطلًا، فلا يزال بإمكان OpenClaw تشغيل Heartbeat، وتحديث الطوابع الزمنية للمهام المستحقة، واستعادة الطابع الزمني لخمول الجلسة، ومنع حمولة التنبيه الخارجية.
- الردود الخاصة بـ Heartbeat فقط لا تُبقي الجلسة نشطة؛ بل تتم استعادة
updatedAtالأخيرة حتى يعمل انتهاء صلاحية الخمول بشكل طبيعي. - يمكن لـ المهام الخلفية المنفصلة إدراج حدث نظام وإيقاظ Heartbeat عندما ينبغي أن تلاحظ الجلسة الرئيسية شيئًا بسرعة. وهذا الإيقاظ لا يجعل تشغيل Heartbeat مهمة خلفية.
عناصر التحكم في الظهور
افتراضيًا، يتم منع إقراراتHEARTBEAT_OK بينما يتم
تسليم محتوى التنبيهات. يمكنك ضبط هذا لكل قناة أو لكل حساب:
ماذا يفعل كل علم
showOk: يرسل إقرارHEARTBEAT_OKعندما يعيد النموذج ردًا يحتوي فقط على OK.showAlerts: يرسل محتوى التنبيه عندما يعيد النموذج ردًا غير OK.useIndicator: يصدر أحداث مؤشر لواجهات حالة UI.
أمثلة لكل قناة مقابل لكل حساب
الأنماط الشائعة
| الهدف | الإعدادات |
|---|---|
| السلوك الافتراضي (إشعارات OK صامتة، والتنبيهات مفعّلة) | (لا حاجة إلى إعدادات) |
| صامت بالكامل (من دون رسائل، ومن دون مؤشر) | channels.defaults.heartbeat: { showOk: false, showAlerts: false, useIndicator: false } |
| المؤشر فقط (من دون رسائل) | channels.defaults.heartbeat: { showOk: false, showAlerts: false, useIndicator: true } |
| إظهار OK في قناة واحدة فقط | channels.telegram.heartbeat: { showOk: true } |
HEARTBEAT.md (اختياري)
إذا كان ملف HEARTBEAT.md موجودًا في مساحة العمل، فإن الموجّه الافتراضي يطلب من
الوكيل قراءته. فكّر فيه باعتباره “قائمة تحقق Heartbeat” الخاصة بك: صغيرة، وثابتة،
وآمنة للإدراج كل 30 دقيقة.
في التشغيلات العادية، لا يتم حقن HEARTBEAT.md إلا عندما تكون إرشادات Heartbeat
مفعّلة للوكيل الافتراضي. ويؤدي تعطيل وتيرة Heartbeat باستخدام 0m أو
ضبط includeSystemPromptSection: false إلى حذفه من سياق التمهيد
العادي.
إذا كان HEARTBEAT.md موجودًا لكنه فارغ فعليًا (يحتوي فقط على أسطر فارغة وعناوين markdown
مثل # Heading)، فإن OpenClaw يتخطى تشغيل Heartbeat لتوفير استدعاءات API.
ويتم الإبلاغ عن هذا التخطي باعتباره reason=empty-heartbeat-file.
أما إذا كان الملف مفقودًا، فلا يزال Heartbeat يعمل ويقرر النموذج ما الذي ينبغي فعله.
اجعله صغيرًا جدًا (قائمة تحقق قصيرة أو تذكيرات) لتجنب تضخم الموجّه.
مثال على HEARTBEAT.md:
كتل tasks:
يدعم HEARTBEAT.md أيضًا كتلة tasks: منظَّمة صغيرة لإجراء
فحوصات قائمة على الفواصل الزمنية داخل Heartbeat نفسه.
مثال:
- يحلل OpenClaw كتلة
tasks:ويفحص كل مهمة وفقintervalالخاص بها. - لا يتم تضمين سوى المهام المستحقة في موجّه Heartbeat لتلك النبضة.
- إذا لم تكن هناك مهام مستحقة، يتم تخطي Heartbeat بالكامل (
reason=no-tasks-due) لتجنب استدعاء نموذج غير ضروري. - يتم الاحتفاظ بالمحتوى غير المتعلق بالمهام في
HEARTBEAT.mdوإلحاقه كسياق إضافي بعد قائمة المهام المستحقة. - تُخزَّن الطوابع الزمنية لآخر تشغيل للمهمة في حالة الجلسة (
heartbeatTaskState)، لذلك تظل الفواصل الزمنية محفوظة عبر عمليات إعادة التشغيل العادية. - لا تُقدَّم الطوابع الزمنية للمهام إلا بعد أن يكمل Heartbeat مسار رده العادي. أما تشغيلات
empty-heartbeat-file/no-tasks-dueالمتخطاة فلا تضع علامة على المهام باعتبارها مكتملة.
هل يمكن للوكيل تحديث HEARTBEAT.md؟
نعم — إذا طلبت منه ذلك.
إن HEARTBEAT.md مجرد ملف عادي في مساحة عمل الوكيل، لذا يمكنك أن تطلب من
الوكيل (في دردشة عادية) شيئًا مثل:
- “حدّث
HEARTBEAT.mdلإضافة فحص يومي للتقويم.” - “أعد كتابة
HEARTBEAT.mdليصبح أقصر ويركز على متابعات البريد الوارد.”
HEARTBEAT.md — لأنه يصبح جزءًا من سياق الموجّه.
إيقاظ يدوي (عند الطلب)
يمكنك إدراج حدث نظام وتشغيل Heartbeat فوري باستخدام:heartbeat، فإن الإيقاظ اليدوي يشغّل Heartbeats الخاصة بكل واحد منهم
فورًا.
استخدم --mode next-heartbeat للانتظار حتى النبضة المجدولة التالية.
تسليم الاستدلال (اختياري)
افتراضيًا، تسلّم Heartbeats حمولة “الإجابة” النهائية فقط. إذا كنت تريد مزيدًا من الشفافية، ففعّل:agents.defaults.heartbeat.includeReasoning: true
Reasoning: (بالصيغة نفسها مثل /reasoning on). وقد يكون هذا مفيدًا عندما يكون الوكيل
يدير عدة جلسات/نسخ Codex وتريد أن ترى لماذا قرر أن ينبهك —
لكنه قد يكشف أيضًا تفاصيل داخلية أكثر مما تريد. لذا يُفضَّل إبقاؤه
معطلًا في الدردشات الجماعية.
الوعي بالتكلفة
تشغّل Heartbeats أدوار وكيل كاملة. الفواصل الأقصر تستهلك رموزًا أكثر. لتقليل التكلفة:- استخدم
isolatedSession: trueلتجنب إرسال سجل المحادثة الكامل (من ~100 ألف رمز إلى ~2-5 آلاف لكل تشغيل). - استخدم
lightContext: trueلقصر ملفات التمهيد علىHEARTBEAT.mdفقط. - اضبط
modelأرخص (مثلollama/llama3.2:1b). - اجعل
HEARTBEAT.mdصغيرًا. - استخدم
target: "none"إذا كنت تريد فقط تحديثات الحالة الداخلية.
ذو صلة
- الأتمتة والمهام — نظرة عامة على جميع آليات الأتمتة
- المهام الخلفية — كيفية تتبع العمل المنفصل
- المنطقة الزمنية — كيف تؤثر المنطقة الزمنية في جدولة Heartbeat
- استكشاف الأخطاء وإصلاحها — تصحيح أخطاء مشكلات الأتمتة