Heartbeat (Gateway)
Heartbeat أم Cron؟ راجع Automation & Tasks للحصول على إرشادات حول وقت استخدام كل منهما.يشغّل Heartbeat أدوار وكيل دورية في الجلسة الرئيسية حتى يتمكن النموذج من إظهار أي شيء يحتاج إلى انتباه من دون إزعاجك برسائل متكررة. يُعد Heartbeat دورًا مجدولًا في الجلسة الرئيسية — وهو لا ينشئ سجلات background task. فسجلات المهام مخصصة للعمل المنفصل (تشغيلات ACP، والوكلاء الفرعيون، ومهام cron المعزولة). استكشاف الأخطاء وإصلاحها: Scheduled Tasks
البدء السريع (للمبتدئين)
- اترك heartbeats مفعلة (الافتراضي هو
30m، أو1hلمصادقة Anthropic OAuth/token، بما في ذلك إعادة استخدام Claude CLI) أو عيّن وتيرتك الخاصة. - أنشئ قائمة تحقق صغيرة في
HEARTBEAT.mdأو كتلةtasks:في مساحة عمل الوكيل (اختياري لكنه موصى به). - قرر أين يجب أن تذهب رسائل heartbeat (
target: "none"هو الافتراضي؛ اضبطtarget: "last"للتوجيه إلى آخر جهة اتصال). - اختياري: فعّل تسليم reasoning الخاص بـ heartbeat من أجل الشفافية.
- اختياري: استخدم سياق bootstrap خفيفًا إذا كانت تشغيلات heartbeat تحتاج فقط إلى
HEARTBEAT.md. - اختياري: فعّل الجلسات المعزولة لتجنب إرسال السجل الكامل للمحادثة في كل heartbeat.
- اختياري: قيد heartbeats بالساعات النشطة (التوقيت المحلي).
القيم الافتراضية
- الفاصل الزمني:
30m(أو1hعندما يكون وضع مصادقة Anthropic OAuth/token هو وضع المصادقة المكتشف، بما في ذلك إعادة استخدام 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” ويتم تعليم التشغيل داخليًا.
- يتم التحقق من الساعات النشطة (
heartbeat.activeHours) في المنطقة الزمنية المكوّنة. وخارج هذه النافذة، يتم تخطي heartbeats حتى التوقيت التالي داخل النافذة.
الغرض من مطالبة heartbeat
المطالبة الافتراضية واسعة عمدًا:- المهام الخلفية: عبارة “Consider outstanding tasks” تدفع الوكيل إلى مراجعة المتابعات (البريد الوارد، والتقويم، والتذكيرات، والعمل في قائمة الانتظار) وإظهار أي شيء عاجل.
- الاطمئنان على الإنسان: عبارة “Checkup sometimes on your human during day time” تدفع إلى رسالة خفيفة أحيانًا مثل “هل تحتاج شيئًا؟”، لكنها تتجنب الإزعاج الليلي باستخدام منطقتك الزمنية المحلية المكوّنة (راجع /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 سياق bootstrap خفيفًا وتحتفظ فقط بـHEARTBEAT.mdمن ملفات bootstrap الخاصة بمساحة العمل.isolatedSession: عندما تكون القيمة true، تعمل كل heartbeat في جلسة جديدة من دون سجل محادثة سابق. وتستخدم نفس نمط العزل الذي يستخدمه cron معsessionTarget: "isolated". وهذا يقلل بشكل كبير تكلفة الرموز لكل heartbeat. اجمعها معlightContext: trueلتحقيق أقصى توفير. ويظل توجيه التسليم يستخدم سياق الجلسة الرئيسية.session: مفتاح جلسة اختياري لتشغيلات heartbeat.main(الافتراضي): الجلسة الرئيسية للوكيل.- مفتاح جلسة صريح (انسخه من
openclaw sessions --jsonأو من sessions CLI). - تنسيقات مفاتيح الجلسات: راجع Sessions وGroups.
target:last: التسليم إلى آخر قناة خارجية مستخدمة.- قناة صريحة: أي قناة مكوّنة أو معرّف plugin، مثل
discordأوmatrixأوtelegramأوwhatsapp. none(الافتراضي): تشغيل heartbeat لكن من دون تسليم خارجي.
directPolicy: يتحكم في سلوك التسليم المباشر/DM:allow(الافتراضي): السماح بتسليم heartbeat إلى direct/DM.block: منع التسليم إلى direct/DM (reason=dm-blocked).
to: تجاوز اختياري للمستلم (معرّف خاص بالقناة، مثل E.164 لـ WhatsApp أو معرّف دردشة Telegram). وبالنسبة إلى Telegram topics/threads، استخدم<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 بأهداف direct/DM افتراضيًا. اضبط
directPolicy: "block"لمنع الإرسال إلى الأهداف المباشرة مع الاستمرار في تشغيل دور heartbeat. - إذا كانت الطوابير الرئيسية مشغولة، يتم تخطي heartbeat وإعادة المحاولة لاحقًا.
- إذا جرى حل
targetإلى عدم وجود وجهة خارجية، يظل التشغيل يحدث ولكن لا يتم إرسال أي رسالة صادرة. - إذا كانت
showOkوshowAlertsوuseIndicatorكلها معطلة، فيتم تخطي التشغيل مسبقًا على أنهreason=alerts-disabled. - إذا كان تسليم التنبيهات فقط معطلًا، فلا يزال بإمكان OpenClaw تشغيل heartbeat، وتحديث الطوابع الزمنية للمهام المستحقة، واستعادة الطابع الزمني للخمول للجلسة، ومنع حمولة التنبيه الخارجية.
- الردود الخاصة بـ heartbeat فقط لا تبقي الجلسة نشطة؛ إذ تتم استعادة قيمة
updatedAtالأخيرة بحيث يعمل انتهاء الصلاحية عند الخمول بشكل طبيعي. - يمكن أن تقوم background tasks المنفصلة بصف نظام حدث وتوقظ heartbeat عندما ينبغي أن تلاحظ الجلسة الرئيسية شيئًا بسرعة. ولا يجعل هذا الإيقاظ تشغيل heartbeat مهمة خلفية.
عناصر التحكم في الظهور
افتراضيًا، يتم إخفاء إشعاراتHEARTBEAT_OK بينما يتم
تسليم محتوى التنبيه. يمكنك ضبط ذلك لكل قناة أو لكل حساب:
ما الذي يفعله كل علم
showOk: يرسل إشعارHEARTBEAT_OKعندما يعيد النموذج ردًا يتضمن OK فقط.showAlerts: يرسل محتوى التنبيه عندما يعيد النموذج ردًا غير OK.useIndicator: يصدر أحداث مؤشرات لأسطح حالة واجهة المستخدم.
أمثلة لكل قناة مقابل لكل حساب
الأنماط الشائعة
| الهدف | التكوين |
|---|---|
| السلوك الافتراضي (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 موجودًا لكنه فارغ فعليًا (أسطر فارغة فقط وعناوين 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 للانتظار حتى التوقيت المجدول التالي.
تسليم Reasoning (اختياري)
افتراضيًا، تسلّم heartbeats حمولة “الإجابة” النهائية فقط. إذا كنت تريد الشفافية، ففعّل:agents.defaults.heartbeat.includeReasoning: true
Reasoning: (بنفس شكل /reasoning on). وقد يكون هذا مفيدًا عندما يكون الوكيل
يدير جلسات/codexes متعددة وتريد معرفة سبب قراره بتنبيهك —
لكنه قد يكشف أيضًا تفاصيل داخلية أكثر مما تريد. ويفضل إبقاؤه
معطّلًا في الدردشات الجماعية.
الوعي بالتكلفة
تشغّل Heartbeats أدوار وكيل كاملة. وكلما كانت الفواصل أقصر زادت تكلفة الرموز. لتقليل التكلفة:- استخدم
isolatedSession: trueلتجنب إرسال السجل الكامل للمحادثة (تقريبًا من ~100K رمز إلى ~2-5K لكل تشغيل). - استخدم
lightContext: trueلحصر ملفات bootstrap فيHEARTBEAT.mdفقط. - عيّن
modelأرخص (مثلollama/llama3.2:1b). - أبقِ
HEARTBEAT.mdصغيرًا. - استخدم
target: "none"إذا كنت تريد فقط تحديثات الحالة الداخلية.
ذو صلة
- Automation & Tasks — جميع آليات الأتمتة في لمحة
- Background Tasks — كيفية تتبع العمل المنفصل
- Timezone — كيف تؤثر المنطقة الزمنية في جدولة heartbeat
- Troubleshooting — تصحيح مشكلات الأتمتة