Gateway
Heartbeat
Heartbeat در نشست اصلی، نوبتهای دورهای عامل را اجرا میکند تا مدل بتواند بدون ارسال پیامهای مزاحم، هر مورد نیازمند توجه را مطرح کند.
Heartbeat یک نوبت زمانبندیشده در نشست اصلی است و رکورد وظیفه پسزمینه ایجاد نمیکند. رکوردهای وظیفه برای کارهای مستقل هستند (اجرای ACP، زیرعاملها، کارهای cron ایزوله).
در لایه زیرین، تناوب Heartbeat در اختیار زمانبند cron است: Gateway برای هر عامل دارای Heartbeat فعال، یک کار cron متعلق به سیستم نگه میدارد (در openclaw cron list --all بهصورت Heartbeat (agent-id) قابل مشاهده است). پیکربندی Heartbeat همچنان ورودی وضعیت مطلوب است، درحالیکه زمانبندی پایشگرِ پایدارشده، تیک واقعی و دوره انتظار بعدی اجراکننده را کنترل میکند. Gateway تغییرات پیکربندی را هنگام راهاندازی و بارگذاری مجدد پیکربندی اعمال میکند؛ openclaw doctor --fix میتواند پیش از راهاندازی بعدی Gateway، ردیفهای پایشگرِ مفقود یا قدیمی را ایجاد کند. agents.*.heartbeat را ویرایش کنید، نه کار cron را.
Heartbeatهای زمانبندیشده به cron نیاز دارند. وقتی cron.enabled برابر false یا OPENCLAW_SKIP_CRON=1 باشد، Gateway هنگام راهاندازی هشداری ثبت میکند و Heartbeatهای زمانبندیشده را اجرا نمیکند؛ بیدارسازیهای دستی و رویدادمحور Heartbeat همچنان در دسترس میمانند. هیچ تایمر جایگزین جداگانهای برای Heartbeat وجود ندارد.
عیبیابی: وظایف زمانبندیشده
شروع سریع (مبتدی)
انتخاب تناوب
Heartbeatها را فعال نگه دارید (مقدار پیشفرض 30m است، یا هنگام پیکربندی احراز هویت OAuth/توکن Anthropic، از جمله استفاده مجدد از Claude CLI، مقدار 1h) یا تناوب دلخواه خود را تنظیم کنید.
افزودن یادداشت پایشگر (اختیاری)
با openclaw cron scratch <jobId> --set "..." یک چکلیست کوچک در یادداشت پایشگر Heartbeat ذخیره کنید.
تعیین مقصد پیامهای Heartbeat
مقدار پیشفرض target: "none" است؛ برای هدایت به آخرین مخاطب، target: "last" را تنظیم کنید.
تنظیم اختیاری
- اگر اجرای Heartbeat فقط به یادداشت پایشگر نیاز دارد، از زمینه راهاندازی سبک استفاده کنید.
- برای جلوگیری از ارسال کل تاریخچه مکالمه در هر Heartbeat، نشستهای ایزوله را فعال کنید.
- Heartbeatها را به ساعات فعال (زمان محلی) محدود کنید.
نمونه پیکربندی:
{ agents: { defaults: { heartbeat: { every: "30m", target: "last", // ارسال صریح به آخرین مخاطب (مقدار پیشفرض "none" است) directPolicy: "allow", // پیشفرض: اجازه به مقصدهای مستقیم/DM؛ برای جلوگیری، "block" را تنظیم کنید lightContext: true, // اختیاری: رد کردن فایلهای راهاندازی فضای کاری برای اجرای Heartbeat isolatedSession: true, // اختیاری: نشست تازه در هر اجرا (بدون تاریخچه مکالمه) // activeHours: { start: "08:00", end: "24:00" }, }, }, },}مقادیر پیشفرض
- فاصله:
30m. اعمال مقادیر پیشفرض ارائهدهنده Anthropic، وقتی حالت احراز هویت تعیینشده OAuth/توکن باشد (از جمله استفاده مجدد از Claude CLI)، این مقدار را به1hافزایش میدهد، اما فقط تا زمانی کهheartbeat.everyتنظیم نشده باشد.agents.defaults.heartbeat.everyیاagents.entries.*.heartbeat.everyمختص هر عامل را تنظیم کنید؛ برای غیرفعالسازی از0mاستفاده کنید. - بدنه پرامپت (قابل پیکربندی از طریق
agents.defaults.heartbeat.prompt):Follow the heartbeat monitor scratch context when provided. Recurring tasks are cron jobs; create or change their schedules with cron tools or the openclaw cron CLI, not heartbeat scratch. Do not infer or repeat old tasks from prior chats. If nothing needs attention, reply HEARTBEAT_OK. - مهلت زمانی: نوبتهای Heartbeat فاقد مقدار تنظیمشده، در صورت تنظیم بودن
agents.defaults.timeoutSeconds، از آن استفاده میکنند. در غیر این صورت، از تناوب Heartbeat با سقف 600 ثانیه استفاده میکنند. برای کارهای طولانیتر Heartbeat،agents.defaults.heartbeat.timeoutSecondsیاagents.entries.*.heartbeat.timeoutSecondsمختص هر عامل را تنظیم کنید. - پرامپت Heartbeat عیناً بهعنوان پیام کاربر ارسال میشود. وقتی Heartbeatها برای عامل پیشفرض فعال باشند، پرامپت سیستم شامل بخش «Heartbeatها» میشود و اجرا در داخل علامتگذاری میشود.
- وقتی Heartbeatها با
0mغیرفعال شوند، کار cron پایشگر باقی میماند اما غیرفعال میشود و یادداشت آن برای زمانی که تناوب را دوباره فعال کنید حفظ میشود. - وقتی خود cron غیرفعال باشد، حتی اگر تناوب Heartbeat فعال بماند، Heartbeatهای زمانبندیشده اجرا نمیشوند.
- ساعات فعال (
heartbeat.activeHours) در منطقه زمانی پیکربندیشده بررسی میشوند. خارج از این بازه، Heartbeatها تا تیک بعدی درون بازه نادیده گرفته میشوند. - Heartbeatها هنگامی که کار cron فعال یا در صف است، یا زمانی که مسیرهای زیرعامل مبتنی بر کلید نشست یا فرمانهای تودرتوی آن عامل مشغولاند، خودکار به تعویق میافتند. عاملهای همسطح یکدیگر را متوقف نمیکنند.
هدف پرامپت Heartbeat
پرامپت پیشفرض عمداً گسترده است:
- وظایف پسزمینه: عبارت «وظایف معوق را در نظر بگیر» عامل را ترغیب میکند پیگیریها (صندوق ورودی، تقویم، یادآورها، کارهای در صف) را بررسی کند و هر مورد فوری را مطرح کند.
- احوالپرسی با انسان: عبارت «گاهی در طول روز از انسان خود احوالپرسی کن» ارسال گاهبهگاه پیام کوتاه «چیزی نیاز دارید؟» را ترغیب میکند، اما با استفاده از منطقه زمانی محلی پیکربندیشده، از ارسال پیامهای مزاحم شبانه جلوگیری میکند (به منطقه زمانی مراجعه کنید).
Heartbeat میتواند به وظایف پسزمینه تکمیلشده واکنش نشان دهد، اما خود اجرای Heartbeat رکورد وظیفه ایجاد نمیکند.
اگر میخواهید Heartbeat کار بسیار مشخصی انجام دهد (برای مثال «آمار Gmail PubSub را بررسی کن» یا «سلامت Gateway را تأیید کن»)، agents.defaults.heartbeat.prompt (یا agents.entries.*.heartbeat.prompt) را روی یک بدنه سفارشی تنظیم کنید (عیناً ارسال میشود).
قرارداد پاسخ
- اگر هیچ موردی نیازمند توجه نیست، با
HEARTBEAT_OKپاسخ دهید. - اجرای Heartbeat میتواند بهجای آن، برای نداشتن بهروزرسانی قابل مشاهده،
heartbeat_respondرا باnotify: falseفراخوانی کند، یا برای هشدار،notify: trueرا همراهnotificationTextفراخوانی کند. در صورت وجود، پاسخ ساختاریافته ابزار بر متن جایگزین اولویت دارد. - یک نتیجه معنادار
heartbeat_respondباnotify: falseبیصدا میماند، اما بهعنوان زمینه داخلی محدود برای نوبت بعدی کاربر در همان نشست به خاطر سپرده میشود. تأییدهایno_changeو اعلانهای قابل مشاهده به این شکل ذخیره نمیشوند. - در طول اجرای Heartbeat، اگر
HEARTBEAT_OKدر ابتدا یا انتهای پاسخ ظاهر شود، OpenClaw آن را تأیید دریافت در نظر میگیرد. توکن حذف میشود و اگر محتوای باقیمانده حداکثر 300 نویسه باشد، پاسخ کنار گذاشته میشود. - اگر
HEARTBEAT_OKدر میانه پاسخ ظاهر شود، رفتار ویژهای با آن نمیشود. - برای هشدارها،
HEARTBEAT_OKرا درج نکنید؛ فقط متن هشدار را برگردانید.
خارج از Heartbeatها، HEARTBEAT_OK اضافی در ابتدا/انتهای پیام حذف و ثبت میشود؛ پیامی که فقط شامل HEARTBEAT_OK باشد کنار گذاشته میشود.
پیکربندی
{ agents: { defaults: { heartbeat: { every: "30m", // پیشفرض: 30m (مقدار 0m غیرفعال میکند) model: "anthropic/claude-opus-4-6", lightContext: false, // پیشفرض: false؛ مقدار true فایلهای راهاندازی فضای کاری را برای اجرای Heartbeat رد میکند isolatedSession: false, // پیشفرض: false؛ مقدار true هر Heartbeat را در نشستی تازه اجرا میکند (بدون تاریخچه مکالمه) target: "last", // پیشفرض: none | گزینهها: last | none | <channel id> (هسته یا Plugin، برای مثال "imessage") to: "+15551234567", // بازنویسی اختیاری مختص کانال accountId: "ops-bot", // شناسه اختیاری کانال چندحسابی prompt: "در صورت ارائه، زمینه یادداشت پایشگر Heartbeat را دنبال کن. وظایف تکرارشونده کارهای cron هستند؛ زمانبندی آنها را با ابزارهای cron یا CLI مربوط به openclaw cron ایجاد یا تغییر بده، نه با یادداشت Heartbeat. وظایف قدیمی را از گفتوگوهای قبلی استنباط یا تکرار نکن. اگر هیچ موردی نیازمند توجه نیست، پاسخ بده HEARTBEAT_OK.", }, }, },}دامنه و اولویت
agents.defaults.heartbeatرفتار سراسری Heartbeat را تنظیم میکند.agents.entries.*.heartbeatروی آن ادغام میشود؛ اگر هر عاملی دارای بلوکheartbeatباشد، فقط همان عاملها Heartbeat را اجرا میکنند.channels.defaults.heartbeatVisibilityمقادیر پیشفرض قابلیت مشاهده را برای همه کانالها تنظیم میکند.channels.<channel>.heartbeatVisibilityمقادیر پیشفرض کانال را بازنویسی میکند.channels.<channel>.accounts.<id>.heartbeatVisibility(کانالهای چندحسابی) تنظیمات مختص کانال را بازنویسی میکند.
Heartbeatهای مختص عامل
اگر هر ورودی agents.entries.* شامل بلوک heartbeat باشد، فقط همان عاملها Heartbeat را اجرا میکنند. بلوک مختص عامل روی agents.defaults.heartbeat ادغام میشود (بنابراین میتوانید مقادیر پیشفرض مشترک را یکبار تنظیم و برای هر عامل بازنویسی کنید).
مثال: دو عامل که فقط عامل دوم Heartbeat را اجرا میکند.
{ agents: { defaults: { heartbeat: { every: "30m", target: "last", // ارسال صریح به آخرین مخاطب (مقدار پیشفرض "none" است) }, }, list: [ { id: "main", default: true }, { id: "ops", heartbeat: { every: "1h", target: "whatsapp", to: "+15551234567", timeoutSeconds: 45, prompt: "در صورت ارائه، زمینه یادداشت پایشگر Heartbeat را دنبال کن. وظایف تکرارشونده کارهای cron هستند؛ زمانبندی آنها را با ابزارهای cron یا CLI مربوط به openclaw cron ایجاد یا تغییر بده، نه با یادداشت Heartbeat. وظایف قدیمی را از گفتوگوهای قبلی استنباط یا تکرار نکن. اگر هیچ موردی نیازمند توجه نیست، پاسخ بده HEARTBEAT_OK.", }, }, ], },}نمونه ساعات فعال
Heartbeatها را به ساعات کاری در منطقه زمانی مشخص محدود کنید:
{ agents: { defaults: { heartbeat: { every: "30m", target: "last", // ارسال صریح به آخرین مخاطب (مقدار پیشفرض "none" است) activeHours: { start: "09:00", end: "22:00", timezone: "America/New_York", // اختیاری؛ در صورت تنظیم از userTimezone و در غیر این صورت از منطقه زمانی میزبان استفاده میکند }, }, }, },}خارج از این بازه (پیش از ساعت 9 صبح یا پس از ساعت 10 شب به وقت شرق آمریکا)، Heartbeatها نادیده گرفته میشوند. تیک زمانبندیشده بعدی درون بازه بهطور عادی اجرا میشود.
راهاندازی 24/7
اگر میخواهید Heartbeatها تمام روز اجرا شوند، از یکی از این الگوها استفاده کنید:
activeHoursرا کاملاً حذف کنید (بدون محدودیت بازه زمانی؛ این رفتار پیشفرض است).- یک بازه تمامروز تنظیم کنید:
activeHours: { start: "00:00", end: "24:00" }.
نمونه چندحسابی
برای هدفگیری حسابی مشخص در کانالهای چندحسابی مانند Telegram، از accountId استفاده کنید:
{ agents: { list: [ { id: "ops", heartbeat: { every: "1h", target: "telegram", to: "12345678:topic:42", // اختیاری: هدایت به موضوع/رشتهای مشخص accountId: "ops-bot", }, }, ], }, channels: { telegram: { accounts: { "ops-bot": { botToken: "YOUR_TELEGRAM_BOT_TOKEN" }, }, }, },}یادداشتهای فیلدها
everystringفاصله Heartbeat (رشته مدتزمان؛ واحد پیشفرض = دقیقه).
modelstringبازنویسی اختیاری مدل برای اجرای Heartbeat (provider/model).
lightContextbooleandefault: falseوقتی true باشد، اجرای Heartbeat از زمینه راهاندازی سبک استفاده میکند و فایلهای راهاندازی فضای کاری را رد میکند. در هر دو حالت، یادداشت پایشگر توسط اجراکننده Heartbeat تزریق میشود.
isolatedSessionbooleandefault: falseوقتی true باشد، هر Heartbeat در نشستی تازه و بدون تاریخچه مکالمه قبلی اجرا میشود. از همان الگوی ایزولهسازی cron sessionTarget: "isolated" استفاده میکند. هزینه توکن هر Heartbeat را بهطور چشمگیری کاهش میدهد. برای بیشترین صرفهجویی، آن را با lightContext: true ترکیب کنید. هدایت تحویل همچنان از زمینه نشست اصلی استفاده میکند.
sessionstringکلید نشست اختیاری برای اجرای Heartbeat.
main(پیشفرض): نشست اصلی عامل.- کلید نشست صریح (از
openclaw sessions --jsonیا CLI نشستها کپی کنید). - قالبهای کلید نشست: به نشستها و گروهها مراجعه کنید.
targetstringlast: تحویل به آخرین کانال خارجی استفادهشده.- کانال صریح: هر کانال پیکربندیشده یا شناسهٔ Plugin، برای مثال
discord،matrix،telegramیاwhatsapp. none(پیشفرض): Heartbeat را اجرا میکند، اما آن را بهصورت خارجی تحویل نمیدهد.
directPolicy"allow" | "block"default: allowرفتار تحویل مستقیم/DM را کنترل میکند. allow: تحویل مستقیم/DM در Heartbeat را مجاز میکند. block: تحویل مستقیم/DM را متوقف میکند (reason=dm-blocked).
tostringبازنویسی اختیاری گیرنده (شناسهٔ مختص کانال، مثلاً E.164 برای WhatsApp یا شناسهٔ گفتوگوی Telegram). برای موضوعها/رشتههای Telegram، از <chatId>:topic:<messageThreadId> استفاده کنید.
accountIdstringشناسهٔ اختیاری حساب برای کانالهای چندحسابی. وقتی target: "last" باشد، شناسهٔ حساب در صورتی بر آخرین کانال تعیینشده اعمال میشود که آن کانال از حسابها پشتیبانی کند؛ در غیر این صورت نادیده گرفته میشود. اگر شناسهٔ حساب با هیچ حساب پیکربندیشدهای برای کانال تعیینشده مطابقت نداشته باشد، تحویل انجام نمیشود.
promptstringبدنهٔ پیشفرض پرامپت را بازنویسی میکند (ادغام نمیشود).
timeoutSecondsnumberdefault: global timeout or min(every, 600)حداکثر زمان مجاز برحسب ثانیه برای یک نوبت عامل Heartbeat پیش از لغو آن. تنظیمنشده باقی بگذارید تا در صورت تنظیم بودن از agents.defaults.timeoutSeconds استفاده شود؛ در غیر این صورت، تناوب Heartbeat با سقف 600 ثانیه استفاده میشود.
activeHoursobjectاجرای Heartbeat را به یک بازهٔ زمانی محدود میکند. شیئی شامل start (HH:MM، شامل ابتدا؛ برای آغاز روز از 00:00 استفاده کنید)، end (HH:MM، بدون احتساب انتها؛ 24:00 برای پایان روز مجاز است) و timezone اختیاری.
- حذفشده یا
"user": اگرagents.defaults.userTimezoneتنظیم شده باشد از آن استفاده میکند؛ در غیر این صورت به منطقهٔ زمانی سیستم میزبان برمیگردد. "local": همیشه از منطقهٔ زمانی سیستم میزبان استفاده میکند.- هر شناسهٔ IANA (مثلاً
America/New_York): مستقیماً استفاده میشود؛ اگر نامعتبر باشد، به رفتار"user"در بالا برمیگردد. startوendبرای یک بازهٔ فعال نباید برابر باشند؛ مقادیر برابر بهعنوان بازهای با عرض صفر در نظر گرفته میشوند (همیشه خارج از بازه).- خارج از بازهٔ فعال، Heartbeatها تا تیک بعدی درون بازه نادیده گرفته میشوند.
رفتار تحویل
مسیریابی نشست و مقصد
- Heartbeatها بهطور پیشفرض در نشست اصلی عامل اجرا میشوند (
agent:<id>:<mainKey>)، یا وقتیsession.scope = "global"باشد درglobal. برای بازنویسی با یک نشست کانال مشخص (Discord/WhatsApp/و غیره)،sessionرا تنظیم کنید. sessionفقط بر زمینهٔ اجرا اثر میگذارد؛ تحویل توسطtargetوtoکنترل میشود.- برای تحویل به یک کانال/گیرندهٔ مشخص،
target+toرا تنظیم کنید. باtarget: "last"، تحویل از آخرین کانال خارجی آن نشست استفاده میکند. - تحویلهای Heartbeat بهطور پیشفرض مقصدهای مستقیم/DM را مجاز میکنند. برای جلوگیری از ارسال به مقصد مستقیم، در حالی که نوبت Heartbeat همچنان اجرا میشود،
directPolicy: "block"را تنظیم کنید. - اگر صف اصلی، مسیر نشست مقصد، مسیر Cron یا یک کار Cron فعال مشغول باشد، Heartbeat نادیده گرفته میشود و بعداً دوباره تلاش میشود.
- اگر
targetبه هیچ مقصد خارجی منتهی نشود، اجرا همچنان انجام میشود، اما هیچ پیام خروجی ارسال نمیشود.
نمایانی و رفتار نادیدهگیری
- اگر
showOk،showAlertsوuseIndicatorهمگی غیرفعال باشند، اجرا از ابتدا با وضعیتreason=alerts-disabledنادیده گرفته میشود. - اگر فقط تحویل هشدار غیرفعال باشد، OpenClaw همچنان میتواند Heartbeat را اجرا کند، مُهرهای زمانی وظایف سررسیدشده را بهروزرسانی کند، مُهر زمانی بیکاری نشست را بازیابی کند و محتوای هشدار خروجی را متوقف کند.
- اگر مقصد تعیینشدهٔ Heartbeat از نمایش وضعیت تایپ پشتیبانی کند، OpenClaw هنگام فعال بودن اجرای Heartbeat وضعیت تایپ را نشان میدهد. این قابلیت از همان مقصدی استفاده میکند که Heartbeat خروجی گفتوگو را به آن میفرستاد و با
typingMode: "never"غیرفعال میشود.
چرخهٔ عمر نشست و ممیزی
- پاسخهای مختص Heartbeat نشست را زنده نگه نمیدارند. فرادادهٔ Heartbeat ممکن است ردیف نشست را بهروزرسانی کند، اما انقضای ناشی از بیکاری از
lastInteractionAtمربوط به آخرین پیام واقعی کاربر/کانال استفاده میکند و انقضای روزانه ازsessionStartedAtاستفاده میکند. - تاریخچهٔ رابط کنترل و WebChat پرامپتهای Heartbeat و تأییدهای فقط OK را پنهان میکند. رونوشت زیرین نشست همچنان میتواند این نوبتها را برای ممیزی/بازپخش دربر داشته باشد.
- وظایف پسزمینهای جداشده میتوانند یک رویداد سیستمی را در صف قرار دهند و هنگامی که نشست اصلی باید سریعاً متوجه چیزی شود، Heartbeat را بیدار کنند. این بیدارسازی باعث نمیشود اجرای Heartbeat به یک وظیفهٔ پسزمینهای تبدیل شود.
کنترلهای نمایانی
بهطور پیشفرض، تأییدهای HEARTBEAT_OK متوقف میشوند، در حالی که محتوای هشدار تحویل داده میشود. میتوانید این رفتار را برای هر کانال یا هر حساب تنظیم کنید:
channels: defaults: heartbeat: showOk: false # HEARTBEAT_OK را پنهان میکند (پیشفرض) showAlerts: true # پیامهای هشدار را نشان میدهد (پیشفرض) useIndicator: true # رویدادهای نشانگر را منتشر میکند (پیشفرض) telegram: heartbeat: showOk: true # تأییدهای OK را در Telegram نشان میدهد whatsapp: accounts: work: heartbeat: showAlerts: false # تحویل هشدار را برای این حساب متوقف میکنداولویت: هر حساب ← هر کانال ← پیشفرضهای کانال ← پیشفرضهای داخلی.
کارکرد هر پرچم
showOk: وقتی مدل پاسخی فقط شامل OK برمیگرداند، یک تأییدHEARTBEAT_OKارسال میکند.showAlerts: وقتی مدل پاسخی غیر از OK برمیگرداند، محتوای هشدار را ارسال میکند.useIndicator: رویدادهای نشانگر را برای سطوح وضعیت رابط کاربری منتشر میکند.
اگر هر سه false باشند، OpenClaw اجرای Heartbeat را کاملاً نادیده میگیرد (بدون فراخوانی مدل).
نمونههای هر کانال در برابر هر حساب
channels: defaults: heartbeat: showOk: false showAlerts: true useIndicator: true slack: heartbeat: showOk: true # همهٔ حسابهای Slack accounts: ops: heartbeat: showAlerts: false # هشدارها را فقط برای حساب ops متوقف میکند telegram: heartbeat: showOk: trueالگوهای رایج
| هدف | پیکربندی |
|---|---|
| رفتار پیشفرض (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 } |
یادداشت موقت پایشگر (اختیاری)
هر کار Cron پایشگر Heartbeat یک سند یادداشت موقت خصوصی دارد که در پایگاه دادهٔ وضعیت مشترک ذخیره میشود. آن را مانند «چکلیست Heartbeat» خود در نظر بگیرید: کوچک، پایدار و مناسب برای بررسی هر 30 دقیقه. وقتی یادداشت موقت وجود داشته باشد، محتوای آن به پرامپت Heartbeat افزوده میشود.
آن را با CLI مربوط به Cron مدیریت کنید (شناسهٔ کار از openclaw cron list --all میآید):
openclaw cron scratch <jobId> # یادداشت موقت فعلی را چاپ میکندopenclaw cron scratch <jobId> --set "..." # آن را با متن دقیق جایگزین میکندopenclaw cron scratch <jobId> --file notes.md # آن را از یک فایل جایگزین میکند (- برای stdin)openclaw cron scratch <jobId> --unset # آن را حذف میکندنوشتنها با سازوکار مقایسهوجایگزینی محافظت میشوند: --expected-revision <n> را ارسال کنید تا بهجای بازنویسی یک ویرایش همزمان، عملیات ناموفق شود. یادداشت موقت به 256 KiB محدود است و هرگز در خروجی cron list/cron runs ظاهر نمیشود.
عامل نیز میتواند یادداشت موقت خودش را بهروزرسانی کند: در طول یک نوبت Heartbeat، heartbeat_respond یک رشتهٔ اختیاری scratch میپذیرد که یادداشت موقت پایشگر را برای Heartbeatهای آینده بهطور کامل جایگزین میکند.
اگر یادداشت موقت وجود داشته باشد اما عملاً خالی باشد (فقط خطوط خالی، توضیحات Markdown/HTML، عنوانهای Markdown مانند # Heading، نشانگرهای حصار یا چکلیستهای خالی)، OpenClaw برای صرفهجویی در فراخوانیهای API اجرای Heartbeat را نادیده میگیرد. این نادیدهگیری با reason=empty-heartbeat-file گزارش میشود. اگر هیچ یادداشت موقتی وجود نداشته باشد، Heartbeat همچنان اجرا میشود و مدل تصمیم میگیرد چه کاری انجام دهد.
آن را بسیار کوچک نگه دارید (چکلیست کوتاه یا یادآورها) تا از حجیم شدن پرامپت جلوگیری شود.
نمونهٔ یادداشت موقت:
# چکلیست Heartbeat - بررسی سریع: آیا چیزی فوری در صندوقهای ورودی وجود دارد؟- اگر روز است و کار دیگری در انتظار نیست، یک بررسی سبک انجام بده.- اگر وظیفهای مسدود شده است، یادداشت کن _چه چیزی کم است_ و دفعهٔ بعد از Peter بپرس.زمانبندی بررسیهای تکرارشونده با Cron
یادداشت موقت Heartbeat زمینهٔ پرامپت است، نه زمانبند. هر بررسی تکرارشونده را بهصورت یک کار Cron ایجاد کنید تا تناوب، وضعیت فعال/غیرفعال و تاریخچهٔ اجرای خودش را داشته باشد. وقتی بررسی باید از زمینهٔ عادی مکالمه استفاده کند، کارهای Cron همچنان میتوانند نشست اصلی را هدف قرار دهند.
یادداشت موقت قدیمی ممکن است شامل یک بلوک ساختاریافتهٔ tasks: باشد. پس از ارتقا، openclaw doctor --fix را یکبار اجرا کنید: Doctor هر ورودی معتبر را به یک کار Cron با زمانبندی مستقل تبدیل میکند، فاصلهٔ زمانی و زمان اجرای قبلی آن را حفظ میکند و بلوک بازنشسته را حذف میکند، در حالی که نثر پیرامون یادداشت موقت را نگه میدارد. نوبتهای Heartbeat در زمان اجرا، متن tasks: را بهعنوان زمانبندی تجزیه نمیکنند.
کارهای Heartbeat ایجادشده توسط Doctor، ساعتهای فعال، دورهٔ انتظار، محافظهای سیلاب و مشغول بودن Heartbeat را حفظ میکنند. کارهایی که همزمان سررسید میشوند میتوانند در یک نوبت Heartbeat ادغام شوند. یک رخداد خارج از ساعتهای فعال نادیده گرفته میشود و در رخداد Cron بعدی آن دوباره تلاش میشود.
آیا عامل میتواند یادداشت موقت خود را بهروزرسانی کند؟
بله. در طول یک نوبت Heartbeat، عامل میتواند مقدار scratch را به heartbeat_respond ارسال کند تا نثر پایشگر برای Heartbeatهای آینده بهطور کامل جایگزین شود. همچنین میتوانید در یک گفتوگوی عادی از آن بخواهید openclaw cron scratch <jobId> --set ... را اجرا کند، یا خودتان یادداشت موقت را با همان فرمان ویرایش کنید. زمانبندیهای تکرارشونده را با Cron مدیریت کنید، نه با نوشتن نحو زمانبند در یادداشت موقت.
بیدارسازی دستی (در صورت تقاضا)
از openclaw system event برای قرار دادن یک رویداد سیستمی در صف و در صورت تمایل فعالسازی فوری Heartbeat استفاده کنید:
openclaw system event --text "پیگیریهای فوری را بررسی کن" --mode now| پرچم | توضیحات |
|---|---|
--text <text> |
متن رویداد سیستم (الزامی). |
--mode <mode> |
now یک Heartbeat فوری اجرا میکند؛ next-heartbeat (پیشفرض) تا تیک زمانبندیشده بعدی منتظر میماند. |
--session-key <sessionKey> |
رویداد را به یک نشست مشخص هدایت میکند؛ پیشفرض، نشست اصلی عامل است. |
--json |
خروجی JSON. |
اگر هیچ --session-key ارائه نشده باشد و چند عامل با heartbeat پیکربندی شده باشند، --mode now هر یک از Heartbeatهای آن عاملها را بلافاصله اجرا میکند.
کنترلهای مرتبط Heartbeat در همان گروه CLI:
openclaw system heartbeat last # نمایش آخرین رویداد Heartbeatopenclaw system heartbeat enable # فعالکردن Heartbeatهاopenclaw system heartbeat disable # غیرفعالکردن Heartbeatهاآگاهی از هزینه
Heartbeatها نوبتهای کامل عامل را اجرا میکنند. بازههای کوتاهتر توکن بیشتری مصرف میکنند. برای کاهش هزینه:
- از
isolatedSession: trueاستفاده کنید تا از ارسال تاریخچه کامل مکالمه جلوگیری شود (کاهش از حدود 100K توکن به حدود 2-5K در هر اجرا). - از
lightContext: trueاستفاده کنید تا فایلهای راهاندازی اولیه فضای کاری در اجراهای Heartbeat نادیده گرفته شوند. - یک
modelارزانتر تنظیم کنید (برای مثالollama/llama3.2:1b). - فضای موقت پایشگر را کوچک نگه دارید.
- اگر فقط بهروزرسانی وضعیت داخلی را میخواهید، از
target: "none"استفاده کنید.
سرریز زمینه پس از Heartbeat
Heartbeatها پس از اتمام اجرا، مدل زمان اجرای موجود در نشست مشترک را حفظ میکنند؛ بنابراین Heartbeatی که نشست را به یک مدل محلی کوچکتر تغییر داده باشد (برای مثال یک مدل Ollama با پنجره 32k)، ممکن است آن مدل را برای نوبت بعدی نشست اصلی همچنان فعال نگه دارد. اگر آن نوبت بعدی سپس سرریز زمینه را گزارش کند و آخرین مدل زمان اجرای نشست با heartbeat.model پیکربندیشده مطابقت داشته باشد، پیام بازیابی OpenClaw نشت مدل Heartbeat را بهعنوان علت احتمالی مطرح و راهحلی پیشنهاد میکند.
برای جلوگیری از این مشکل: از isolatedSession: true استفاده کنید تا Heartbeatها در نشستی تازه اجرا شوند (و در صورت تمایل، برای کوچکترین پرامپت آن را با lightContext: true ترکیب کنید)، یا مدلی برای Heartbeat انتخاب کنید که پنجره زمینه آن برای نشست مشترک بهاندازه کافی بزرگ باشد.
مرتبط
- اتوماسیون - نمایی کلی از همه سازوکارهای اتوماسیون
- وظایف پسزمینه - نحوه پیگیری کارهای جداشده
- منطقه زمانی - نحوه تأثیر منطقه زمانی بر زمانبندی Heartbeat
- عیبیابی - اشکالزدایی مشکلات اتوماسیون