Automation
کارهای زمانبندیشده
Cron زمانبند داخلی Gateway است. کارها را بهصورت پایدار نگه میدارد، عامل را در زمان مناسب بیدار میکند و میتواند خروجی را به یک کانال گفتوگو، یک Webhook یا هیچ مقصدی تحویل دهد.
شروع سریع
افزودن یک یادآور یکباره
openclaw cron create "2027-02-01T16:00:00Z" \ --name "Reminder" \ --session main \ --system-event "Reminder: check the cron docs draft" \ --wake now \ --delete-after-runبررسی کارها
openclaw cron listopenclaw cron get <job-id>openclaw cron show <job-id>مشاهده تاریخچه اجرا
openclaw cron runs --id <job-id>نحوه کار Cron
- Cron درون فرایند Gateway اجرا میشود، نه درون مدل. برای فعالشدن زمانبندیها، Gateway باید در حال اجرا باشد.
- تعریف کارها، وضعیت زمان اجرا و تاریخچه اجرا در پایگاه داده مشترک وضعیت SQLite متعلق به OpenClaw بهصورت پایدار نگهداری میشوند؛ بنابراین راهاندازی مجدد باعث از دست رفتن زمانبندیها نمیشود.
- هر اجرای Cron یک رکورد وظیفه پسزمینه ایجاد میکند.
- کارهای یکباره (
--at) بهطور پیشفرض پس از موفقیت خودکار حذف میشوند؛ برای نگهداشتن آنها،--keep-after-runرا ارسال کنید. - بودجه زمانی واقعی هر اجرا: در صورت تنظیم،
--timeout-seconds. در غیر این صورت، کارهای نوبت عامل ایزوله/جداشده پیش از آنکه مهلت زمانی نوبت عامل زیربنایی (agents.defaults.timeoutSeconds، با مقدار پیشفرض 48 ساعت) اعمال شود، بهوسیله نگهبان 60 دقیقهای خود Cron محدود میشوند؛ کارهای فرمان بهطور پیشفرض 10 دقیقه و محمولههای اسکریپت بهطور پیشفرض 5 دقیقه مهلت دارند. - هنگام راهاندازی Gateway، کارهای نوبت عامل ایزولهای که موعدشان گذشته است، بهجای بازپخش فوری دوباره زمانبندی میشوند تا کارهای راهاندازی اولیه مدل/ابزار خارج از بازه اتصال کانال انجام شوند.
- اگر
openclaw agentرا از Cron سیستم یا زمانبند خارجی دیگری اجرا میکنید، با وجود اینکه CLI از قبلSIGTERM/SIGINTرا مدیریت میکند، آن را با سازوکار تشدید تا کشتن اجباری محصور کنید. اجراهای متکی به Gateway از Gateway میخواهند اجراهای پذیرفتهشده را لغو کند؛ اجراهای--localنیز همان سیگنال لغو را دریافت میکنند. برایtimeoutدر GNU،timeout -k 60 600 openclaw agent ...را بهtimeout 600 ...ساده ترجیح دهید — مقدار-kآخرین راهحل است، اگر فرایند نتواند بهموقع تخلیه شود. برای واحدهای systemd، پیش از کشتن نهایی از سیگنال توقفSIGTERMبا یک بازه مهلت (TimeoutStopSec) استفاده کنید. استفاده مجدد از یک--run-idدر زمانی که اجرای اصلی Gateway هنوز فعال است، بهجای شروع اجرای دوم، مورد تکراری را در حال اجرا گزارش میکند.
مقاومسازی اجرای ایزوله
- اجراهای ایزوله پس از تکمیل، در حد توان زبانهها/فرایندهای مرورگر ردیابیشده مربوط به نشست
cron:<jobId>خود را میبندند و هر نمونه زمان اجرای MCP همراهی را که برای کار ایجاد شده است، از طریق همان مسیر پاکسازی مشترک مورد استفاده اجراهای نشست اصلی و نشست سفارشی آزاد میکنند. خطاهای پاکسازی نادیده گرفته میشوند تا نتیجه Cron همچنان تعیینکننده باشد. - اجراهای ایزوله دارای مجوز محدود خودپاکسازی Cron میتوانند وضعیت زمانبند، فهرستی خودفیلترشده که فقط شامل کار خودشان است و تاریخچه اجرای همان کار را بخوانند و فقط مجازند کار خود را حذف کنند.
- اجراهای ایزوله در برابر پاسخهای تأیید قدیمی محافظت میشوند: اگر نتیجه نخست فقط یک بهروزرسانی وضعیت موقت باشد (
on it،pulling everything togetherو نشانههای مشابه) و هیچ زیرعامل فرزندی همچنان مسئول پاسخ نهایی نباشد، OpenClaw پیش از تحویل، یکبار دیگر نتیجه واقعی را درخواست میکند. - فراداده ساختاریافته رد اجرا (از جمله پوششهای
UNAVAILABLEمیزبان Node که خطای تودرتوی آنها باSYSTEM_RUN_DENIEDیاINVALID_REQUESTآغاز میشود) شناسایی میشود تا فرمان مسدودشده بهعنوان اجرای موفق گزارش نشود، درحالیکه نثر عادی دستیار بهاشتباه رد اجرا تلقی نمیشود. - شکستهای عامل در سطح اجرا حتی بدون محموله پاسخ نیز خطای کار محسوب میشوند؛ بنابراین شکستهای مدل/ارائهدهنده شمارندههای خطا را افزایش میدهند و بهجای موفق تلقیکردن کار، اعلانهای شکست را فعال میکنند.
- وقتی یک کار به
timeoutSecondsمیرسد، Cron اجرا را لغو میکند و یک بازه کوتاه برای پاکسازی به آن میدهد. اگر تخلیه نشود، پاکسازی تحت مالکیت Gateway پیش از آنکه Cron پایان مهلت را ثبت کند، مالکیت نشست آن اجرا را بهاجبار پاک میکند تا کار گفتوگوی صفشده پشت یک نشست پردازشی قدیمی گیر نکند. - توقفهای راهاندازی/شروع، مهلت زمانی ویژه مرحله دریافت میکنند (برای مثال
cron: isolated agent setup timed out before runner startیاcron: isolated agent run stalled before execution start (last phase: context-engine)). این نگهبانها حتی پیش از شروع فرایند CLI خارجی ارائهدهندگان، هم ارائهدهندگان تعبیهشده و هم متکی به CLI را پوشش میدهند و مستقل از مقادیر طولانیtimeoutSecondsمحدود میشوند تا شکستهای شروع سرد/احراز هویت/زمینه بهسرعت آشکار شوند.
تطبیق وظیفه
تطبیق وظیفه Cron ابتدا تحت مالکیت زمان اجرا و سپس متکی به تاریخچه پایدار است: تا زمانی که زمان اجرای Cron همچنان آن کار را در حال اجرا ردیابی کند، وظیفه فعال Cron زنده میماند، حتی اگر یک ردیف نشست فرزند قدیمی همچنان وجود داشته باشد. پس از آنکه زمان اجرا دیگر مالک کار نباشد و بازه مهلت 5 دقیقهای پایان یابد، بررسیهای نگهداری، گزارشهای اجرای پایدار و وضعیت کار را برای اجرای منطبق با cron:<jobId>:<startedAt> بررسی میکنند. وجود نتیجه نهایی در آنجا دفتر وظیفه را نهایی میکند؛ در غیر این صورت، نگهداری تحت مالکیت Gateway میتواند وظیفه را lost علامتگذاری کند. ممیزی آفلاین CLI میتواند از تاریخچه پایدار بازیابی کند، اما خالیبودن مجموعه کارهای فعال درونفرایندی خودش، اثباتی بر پایانیافتن اجرای تحت مالکیت Gateway نیست.
انواع زمانبندی
| نوع | پرچم CLI | توضیحات |
|---|---|---|
at |
--at |
برچسب زمانی یکباره (ISO 8601 یا نسبی مانند 20m) |
every |
--every |
فاصله ثابت (10m، 1h، 1d) |
cron |
--cron |
عبارت Cron پنجفیلدی یا ششفیلدی با --tz اختیاری |
on-exit |
--on-exit |
هنگام خروج یک فرمان تحت نظارت، یکبار فعال شود (محرک رویداد؛ پس از برچیدن نوبت باقی میماند؛ --on-exit-cwd اختیاری) |
stream |
--stream-command |
از خطوط دستهبندیشده تولیدشده توسط یک فرمان طولانیمدت تحت نظارت فعال شود |
برچسبهای زمانی بدون منطقه زمانی، UTC در نظر گرفته میشوند. برای تفسیر یک تاریخوزمان --at بدون آفست یا ارزیابی عبارت Cron در آن منطقه زمانی IANA، --tz America/New_York را اضافه کنید. عبارتهای Cron بدون --tz از منطقه زمانی میزبان Gateway استفاده میکنند. --tz همراه با --every یا --on-exit معتبر نیست.
عبارتهای تکرارشونده ابتدای ساعت (دقیقه 0 با فیلد ساعت جاینگهدار) برای کاهش جهش بار، بهطور خودکار تا 5 دقیقه پراکنده میشوند. برای اجبار زمانبندی دقیق از --exact یا برای یک بازه صریح از --stagger 30s استفاده کنید (فقط زمانبندیهای Cron).
مهاجرت وظیفه Heartbeat
محیط موقت قدیمی Heartbeat از یک بلوک ساختاریافته tasks: پشتیبانی میکرد. پس از ارتقا، openclaw doctor --fix را اجرا کنید تا هر ورودی به یک کار عادی و قابلویرایش Cron در نشست اصلی تبدیل شود. Doctor فاصله و زمان اجرای قبلی را حفظ میکند، پیش از حذف بلوک کارها را میسازد و در اجرای مجدد، همان کلیدهای اعلان را با اطمینان همگرا میکند.
این کارهای مهاجرتیافته محمولههای عمومی systemEvent را حمل میکنند؛ بنابراین openclaw cron list، get، edit و remove بههمراه ابزار Cron آنها را مانند سایر کارها مدیریت میکنند. اجرای آنها از بیدارسازی محافظتشده وظیفه Heartbeat استفاده میکند: ساعات فعال، حداقل فاصله، کنترل سیلاب و تلاشهای مجدد هنگام مشغولبودن همچنان اعمال میشوند، درحالیکه Cron آهنگ مستقل هر وظیفه را مدیریت میکند. کارهایی که موعدشان در یک بازه ادغام مشترک است، میتوانند یک نوبت Heartbeat را بهاشتراک بگذارند. یک رخداد زمانبندیشده خارج از ساعات فعال Heartbeat نادیده گرفته میشود و در رخداد بعدی کار دوباره امتحان میشود.
محیط موقت Heartbeat اکنون فقط نثر پایش است. Heartbeatهای زمان اجرا، متن tasks: را بهعنوان زمانبندی تجزیه نمیکنند؛ کار تکرارشونده جدید را با Cron ایجاد کنید.
منابع جریانی
یک زمانبندی جریانی، فرمان argv نوشتهشده توسط اپراتور را تحت Gateway در حال اجرا نگه میدارد و کار را از خطوط stdout و stderr آن فعال میکند. زمانبندیهای جریانی رویدادمحورند، هرگز موعد زمانی ندارند و به cron.triggers.enabled: true نیاز دارند، زیرا فرمان طولانیمدت همان رده اعتماد اجرای بدون نظارت اسکریپتهای محرک را دارد. غیرفعالکردن یا حذف کار، فرایند را متوقف میکند؛ خاموششدن Gateway تا برچیدن درخت فرایند منتظر میماند. شکستهای سریع با عقبنشینی خطای داخلی Cron دوباره راهاندازی میشوند. پنج اجرای متوالی کوتاهتر از 60 ثانیه، کار را در وضعیت خطا نگه میدارند و از مسیر عادی هشدار شکست استفاده میکنند؛ برای پاککردن سقف راهاندازی مجدد، کار را بهصورت دستی دوباره فعال کنید.
openclaw cron add \ --name "Build event stream" \ --stream-command '["node","scripts/build-events.mjs"]' \ --stream-mode match \ --stream-match '^(failed|recovered):' \ --stream-batch-ms 250 \ --session isolated \ --message "Investigate these build events."mode: "line" (مقدار پیشفرض) هر خط را میپذیرد. mode: "match" فقط خطوط منطبق با عبارت منظم کامپایلشده match را میپذیرد. یک دسته پس از batchMs سکوت (پیشفرض 250 میلیثانیه، محدودشده به 50–5000) یا در maxBatchBytes (پیشفرض 16384، محدودشده به 1024–65536) بسته میشود. در سقف بایت، دسته با [truncated] پایان مییابد. حالت تطبیق همیشه خطوط کامل را با متن کاملشان ارزیابی میکند، حتی پس از maxBatchBytes (فقط دسته تحویلی بریده میشود)؛ خطی که در حد محدود دریافت خام بریده شده فقط یک پیشوند است، پس نامنطبق در نظر گرفته میشود تا الگوی دارای لنگر انتهایی روی بخش بریدهشده فعال نشود. دسته به متن رویداد سیستم یا پیام نوبت عامل افزوده میشود. محمولههای فرمان برای زمانبندیهای جریانی رد میشوند، زیرا فرمان منبع و فرمان محموله مالکیت فرایندی مبهمی خواهند داشت.
برای هر کار فقط یک فعالسازی محموله و یک دسته در انتظار محدود نگه داشته میشود. خطوطی که هنگام اجرای محموله یا پیش از سپریشدن فاصله داخلی 30 ثانیهای محرک میرسند، بهجای ساختن یک صف نامحدود، در همان دسته در انتظار ادغام میشوند. یک مالک سریالشده، حذفهای گیت، خطاهای محموله و ارسالهای هنگام اجرانبودن را در streamDroppedBatches ثبت میکند؛ ادغامهای محدود streamCoalescedBatches را افزایش میدهند. محمولههای شکستخورده دوباره امتحان نمیشوند، زیرا ممکن است همتوان نباشند. هویت منطقی منبع در راهاندازیهای مجدد فرزند تحت نظارت ثابت میماند، اما با غیرفعالشدن، حذف یا جایگزینی منبع تغییر میکند؛ بنابراین دستههای صفشده منبع بازنشسته حتی پس از ویرایش A به B و دوباره به A نمیتوانند فعال شوند. پس از تکمیل توقف، فراخوانیهای دیرهنگام یک فرزند قدیمی بیاثرند. V1 شامل منبع بومی WebSocket نیست؛ آن را با یک فرمان argv مانند websocat wss://example.invalid/events پل بزنید.
وقتی یک کار جریانی trigger.script نیز دارد، گیت برای هر دسته بستهشده یکبار اجرا میشود. دسته فعلی بهصورت رشته عمیقاً منجمدشده trigger.streamBatch در کنار trigger.state در دسترس است. fire: false پس از پایدارسازی وضعیت گیت، آن دسته را حذف میکند. fire: true معناشناسی موجود پیام محرک را حفظ میکند و سپس دسته را به محموله حاصل میافزاید. یک کار جریانی میتواند بهجای آن از محموله اسکریپت بدون گیت شرط استفاده کند؛ آن اسکریپت دسته را از طریق همان مقدار trigger.streamBatch دریافت میکند. ترکیب محموله اسکریپت با گیت شرط رد میشود، زیرا هر دو مالک شیار پایدار trigger.state خواهند بود.
آهنگ پویا (تنظیم سرعت)
کارهای تکرارشونده میتوانند pacing.min و/یا pacing.max را روی رشتههای مدتزمانی مانند 15m یا 4h تنظیم کنند؛ دستکم یک کران الزامی است. از --pacing-min و --pacing-max همراه با cron add|edit استفاده کنید (--clear-pacing هر دو کران را حذف میکند).
در طول یک اجرای ایزوله، یک کار با زمانبندی تطبیقی میتواند ابزار cron را با action: "next_check" و in: "30m" فراخوانی کند. پیشنهاد فقط بر همان کاری اعمال میشود که در حال حاضر اجرا میشود و از زمان تکمیل موفق اجرای آن محاسبه میشود. OpenClaw بدون نمایش پیام، آن را به محدودههای پیکربندیشده محدود میکند.
زمانبندی تطبیقی بدون پیشنهاد، برنامهٔ زمانی عادی را بدون تغییر باقی میگذارد. اجراهای ناموفق، منقضیشده و ردشده پیشنهاد را کنار میگذارند؛ بنابراین رفتار موجودِ تلاش مجدد و عقبنشینی خطا اولویت دارد. اجبار دستی یک کار تکرارشونده خارج از روال زمانبندی است و نوبت طبیعی یا تطبیقیِ در انتظار آن را حفظ میکند. برای کارهای فعالشونده با شرط، حداقل فاصلهٔ داخلی حتی هنگامی که پیشنهادی بررسی زودتری را درخواست میکند، همچنان کران پایین باقی میماند.
روز ماه و روز هفته از منطق OR استفاده میکنند
عبارتهای Cron توسط croner تجزیه میشوند. وقتی هر دو فیلد روز ماه و روز هفته غیرعام باشند، croner زمانی تطبیق میدهد که یکی از فیلدها منطبق باشد، نه هر دو. این رفتار استاندارد cron در Vixie است.
# مقصود: «ساعت 9 صبح روز پانزدهم، فقط اگر دوشنبه باشد»# نتیجهٔ واقعی: «ساعت 9 صبح در هر روز پانزدهم و ساعت 9 صبح در هر دوشنبه»0 9 15 * 1این عبارت بهجای 0-1 بار در ماه، تقریباً 5-6 بار در ماه اجرا میشود. برای الزام هر دو شرط، از اصلاحگر روز هفتهٔ + در croner (0 9 15 * +1) استفاده کنید، یا زمانبندی را بر اساس یکی از فیلدها انجام دهید و فیلد دیگر را در اعلان یا فرمان کار خود بررسی کنید.
فعالسازهای رویداد (ناظرهای شرط)
یک فعالساز رویداد، اسکریپت شرطیِ بدون رابطی را به یک برنامهٔ زمانی every، cron یا stream اضافه میکند. برنامههای زمانی مبتنی بر زمان، آن را در موعد مقرر ارزیابی میکنند؛ برنامههای زمانی جریانی، آن را برای هر دستهٔ بستهشده ارزیابی میکنند. Cron فقط زمانی بار عادی را اجرا میکند که اسکریپت fire: true را برگرداند:
{ schedule: { kind: "every", everyMs: 30000 }, trigger: { // فقط زمانی فعال میشود که وضعیت مشاهدهشده با ارزیابی قبلی متفاوت باشد. script: "const res = await tools.call('exec', { command: 'gh pr checks 123 --json state -q \\'.[].state\\' | sort -u' }); const status = String(res?.result?.details?.aggregated ?? '').trim(); json({ fire: status !== trigger.state?.status, message: `PR 123 CI: ${trigger.state?.status ?? 'unknown'} -> ${status}`, state: { status } });", once: false, }, payload: { kind: "agentTurn", message: "تغییر وضعیت CI را بررسی کنید." },}اسکریپت باید { fire, message?, state? } را برگرداند. وضعیت JSON قبلی بهصورت trigger.state که بهشکل عمیق منجمد شده است در دسترس قرار دارد؛ دروازههای جریان نیز دستهٔ فعلی را بهصورت trigger.streamBatch دریافت میکنند. برای ماندگارکردن آن، مقدار جدیدی برای state برگردانید. وضعیت به 16 KB محدود است. وقتی نتیجهای که باعث فعالشدن شده شامل message باشد، Cron پیش از اجرا آن را به متن رویداد سیستمی یا پیام نوبت عامل میافزاید. once: true پس از نخستین بار موفقیتآمیز اجرای بار فعالشده، کار را غیرفعال میکند.
fire: false وضعیت ارزیابی و شمارندهها را ماندگار میکند، سپس بدون ایجاد سابقهٔ اجرا دوباره زمانبندی میکند. اگر اجرای بار فعالشده ناموفق باشد، state برگشتی ماندگار نمیشود — ارزیابی بعدی وضعیت قبلی را میبیند و میتواند دوباره فعال شود؛ بنابراین اسکریپتها را بهصورت بررسیهای فقطخواندنی بنویسید و کنشها را در بار نگه دارید. برنامههای زمانی فعالساز حداقل فاصلهٔ داخلی 30 ثانیه دارند. هر ارزیابی بودجهٔ زمانی دیواری 30 ثانیه و حداکثر 5 فراخوانی ابزار دارد.
ناظرها را پیرامون وضعیت قابل اقدام طراحی کنید، نه فقط موفقیت: ناظری که هنگام ناموفقشدن یا پایان مهلت بررسی خود ساکت میشود، با وجود خرابی سالم به نظر میرسد. مشاهده را با trigger.state مقایسه کنید و برای حذف موارد تکراری وضعیت تازهای برگردانید؛ به حافظهٔ مدل یا فرایند متکی نباشید. هنگام فعالشدن، message را خودبسنده کنید، زیرا به زمینهٔ کامل رویدادِ اجرای فعالشده تبدیل میشود.
یک ناظر از فایل اسکریپت محلی ایجاد کنید (- اسکریپت را از ورودی استاندارد میخواند):
openclaw cron add \ --name "ناظر CI مربوط به PR" \ --every 30s \ --trigger-script ./watch-pr-ci.js \ --message "به تغییر وضعیت CI پاسخ دهید" \ --session isolatedبارها
هر کار دقیقاً یک نوع بار دارد که با پرچم انتخاب میشود:
| بار | پرچم | اجرا |
|---|---|---|
| رویداد سیستمی | --system-event <text> |
در نشست اصلی در صف قرار میگیرد و بهخودیخود مدل را فراخوانی نمیکند |
| پیام عامل | --message <text> |
یک نوبت عامل با پشتیبانی مدل |
| فرمان | --command <shell> یا --command-argv <json> |
یک پوسته/فرایند روی میزبان Gateway، بدون فراخوانی مدل |
| اسکریپت | --script <file|-> |
یک اسکریپت حالت کدِ بدون رابط که از ابزارهای عامل مالک استفاده میکند |
یک نوع بار دیگر، heartbeat، متعلق به سیستم است: Gateway برای هر عامل دارای Heartbeat، یک کار پایش Heartbeat را همگرا میکند (به Heartbeat مراجعه کنید). این بار در cron list --all ظاهر میشود، اما از طریق CLI یا API قابل ایجاد یا ویرایش نیست. پیکربندی Heartbeat هنگام راهاندازی، بارگذاری مجدد پیکربندی یا بهوسیلهٔ openclaw doctor --fix در برنامهٔ زمانی پایش ماندگار نوشته میشود. وقتی Cron غیرفعال باشد، پایشگر تیک نمیزند و هیچ زمانسنج جایگزینی برای Heartbeat اجرا نمیشود.
گزینههای نوبت عامل
--messagestringrequiredمتن اعلان (برای کارهای نشست ایزوله/فعلی/سفارشی الزامی است).
--modelstringجایگزینی مدل؛ باید به یک مدل مجاز حل شود، وگرنه اجرا با خطای اعتبارسنجی ناموفق میشود.
--fallbacksstringفهرست مدلهای جایگزین مختص هر کار، برای مثال --fallbacks openai/gpt-5.6-sol,openrouter/meta-llama/llama-3.3-70b-instruct:free. برای اجرای سختگیرانه بدون مدل جایگزین، --fallbacks "" را ارسال کنید.
--clear-fallbacksbooleanدر cron edit، جایگزینی مدلهای پشتیبان مختص کار را حذف میکند تا کار از اولویت پیکربندیشدهٔ مدلهای پشتیبان پیروی کند. نمیتوان آن را با --fallbacks ترکیب کرد.
--clear-modelbooleanدر cron edit، جایگزینی مدل مختص کار را حذف میکند تا کار از اولویت عادی مدل Cron پیروی کند (جایگزینی ذخیرهشدهٔ نشست Cron، وگرنه مدل عامل/پیشفرض). نمیتوان آن را با --model ترکیب کرد.
--thinkingstringجایگزینی سطح تفکر (off|minimal|low|medium|high|xhigh|adaptive|max|ultra). سطوح قابل دسترس همچنان به مدل انتخابشده و زمان اجرای عامل بستگی دارند.
--clear-thinkingbooleanدر cron edit، جایگزینی تفکر مختص کار را حذف میکند. نمیتوان آن را با --thinking ترکیب کرد.
--light-contextbooleanاز تزریق فایل راهاندازی فضای کاری صرفنظر میکند.
--toolsstringابزارهای قابل استفاده برای کار را محدود میکند، برای مثال --tools exec,read.
کارهای جدیدی که میتوانند ابزار اجرا کنند، همیشه یک سیاست ابزار صریح ذخیره میکنند. کارهایی که یک عامل ایجاد میکند
به ابزارهای در دسترس همان نوبت ایجادکننده محدود میشوند و عامل نمیتواند
فهرست ذخیرهشده را گسترش دهد. کارهایی که یک اپراتور احراز هویتشده بدون --tools ایجاد میکند، یک
سیاست نامحدود * ذخیره میکنند؛ cron edit --clear-tools آن سیاست نامحدود صریح را
بازمیگرداند. کارهای موجودی که پیش از سیاست ابزار صریح ایجاد شدهاند، رفتار فعلی خود را حفظ میکنند
تا زمانی که سیاست ابزارشان بهصراحت ویرایش شود یا کار دوباره ایجاد شود.
--model مدل اصلی کار را تنظیم میکند؛ این مقدار جایگزینی /model یک نشست را تعویض نمیکند، بنابراین زنجیرههای پشتیبان پیکربندیشده همچنان روی آن اعمال میشوند. مدلی که حل نشود یا مجاز نباشد، بهجای بازگشت بیسروصدا به مدل پیشفرض، اجرا را با خطای اعتبارسنجی صریح ناموفق میکند. اگر کاری --model داشته باشد اما هیچ فهرست پشتیبان صریح یا پیکربندیشدهای نداشته باشد، OpenClaw بهجای افزودن بیسروصدای مدل اصلی عامل بهعنوان هدف پنهان تلاش مجدد، یک جایگزینی پشتیبان خالی ارسال میکند.
اولویت انتخاب مدل برای کارهای ایزوله، از بیشترین به کمترین:
- بار مختص کار
model(پیکربندی صریح؛ مدل غیرمجاز اجرا را ناموفق میکند) - جایگزینی مدل هوک Gmail (فقط زمانی که اجرا از Gmail آمده باشد و آن جایگزینی مجاز باشد)
- جایگزینی مدل ذخیرهشدهٔ نشست Cron که کاربر انتخاب کرده است
- انتخاب مدل عامل/پیشفرض
حالت سریع از انتخاب زندهٔ حلشده پیروی میکند. اگر پیکربندی مدل انتخابشده params.fastMode داشته باشد، Cron ایزوله بهطور پیشفرض از آن استفاده میکند؛ جایگزینی ذخیرهشدهٔ نشست fastMode (و پس از آن fastModeDefault عامل) همچنان در هر دو جهت بر پیکربندی مدل اولویت دارد. حالت خودکار از آستانهٔ params.fastAutoOnSeconds مدل استفاده میکند که مقدار پیشفرض آن 60 ثانیه است.
اگر اجرا با واگذاری زندهٔ تغییر مدل روبهرو شود، Cron با ارائهدهنده/مدل تغییرکرده دوباره تلاش میکند و آن انتخاب (و هر نمایهٔ احراز هویت جدید) را برای اجرای فعال ماندگار میکند. تلاشهای مجدد محدودند: پس از تلاش اولیه و 2 تلاش مجدد برای تغییر، Cron بهجای ورود به حلقه اجرا را متوقف میکند.
پیش از شروع اجرای ایزوله، OpenClaw دسترسیپذیری نقطههای پایانی محلی را برای ارائهدهندگان پیکربندیشدهٔ api: "ollama" و api: "openai-completions" که baseUrl آنها loopback، شبکهٔ خصوصی یا .local است بررسی میکند. این پیشبررسی زنجیرهٔ پشتیبان پیکربندیشدهٔ کار را پیمایش میکند و فقط زمانی اجرا را skipped علامت میزند که همهٔ گزینهها دسترسناپذیر باشند؛ --fallbacks "" این پیمایش را صرفاً به مدل اصلی محدود میکند. یک نقطهٔ پایانی ازکارافتاده، بهجای آغاز فراخوانی مدل، اجرا را با skipped و خطایی روشن ثبت میکند. نتیجه برای هر نقطهٔ پایانی بهمدت 5 دقیقه در حافظهٔ نهان نگهداری میشود (نه برای هر کار یا مدل)، بنابراین بسیاری از کارهای همزمانی که یک سرور محلی ازکارافتادهٔ Ollama/vLLM/SGLang/LM Studio را به اشتراک میگذارند، بهجای طوفان درخواست تنها هزینهٔ یک کاوش را دارند. اجراهایی که در پیشبررسی رد میشوند، عقبنشینی خطای اجرا را افزایش نمیدهند؛ برای دریافت هشدارهای مکرر ردشدن، failureAlert.includeSkipped را تنظیم کنید.
بارهای فرمان
بارهای فرمان، اسکریپتهای قطعی را در زمانبند Gateway بدون آغاز نوبت پشتیبانیشده توسط مدل اجرا میکنند. آنها روی میزبان Gateway اجرا میشوند، stdout/stderr را ضبط میکنند، اجرا را در سابقهٔ Cron ثبت میکنند و همان حالتهای تحویل announce، webhook و none کارهای نوبت عامل را دوباره بهکار میگیرند.
openclaw cron create "*/15 * * * *" \ --name "کاوش عمق صف" \ --command "scripts/check-queue.sh" \ --command-cwd "/srv/app" \ --announce \ --channel telegram \ --to "-1001234567890"--command <shell> مقدار argv: ["sh", "-lc", <shell>] را ذخیره میکند. برای اجرای دقیق argv بدون تجزیهٔ پوسته، از --command-argv '["node","scripts/report.mjs"]' استفاده کنید. گزینههای اختیاری --command-env KEY=VALUE (قابل تکرار)، --command-input، --timeout-seconds (پیشفرض 10 دقیقه)، --no-output-timeout-seconds و --output-max-bytes محیط فرایند، ورودی استاندارد و محدودیتهای خروجی را کنترل میکنند.
متن تحویلی از خروجی فرایند استخراج میشود: stdout غیرخالی اولویت دارد؛ اگر stdout خالی و stderr غیرخالی باشد، stderr تحویل داده میشود؛ اگر هر دو موجود باشند، Cron یک بلوک کوچک stdout: / stderr: ارسال میکند. کد خروج 0 اجرا را بهصورت ok ثبت میکند؛ خروج غیرصفر، سیگنال، پایان مهلت یا پایان مهلت بدون خروجی، error ثبت میکند و میتواند هشدارهای شکست را فعال کند. فرمانی که فقط NO_REPLY را چاپ کند، از سرکوب عادی توکن سکوت در Cron استفاده میکند و هیچچیز به گفتوگو ارسال نمیکند.
بارهای اسکریپت
بارهای اسکریپت بهصورت بدون رابط و در همان اجراکننده حالت کدِ اسکریپتهای راهانداز اجرا میشوند، بدون آنکه نوبت محاورهای عامل آغاز شود. پیش از ایجاد یا اجرای آنها، cron.triggers.enabled را فعال کنید؛ این دروازه خودکارسازی خطرناک هم اسکریپتهای راهانداز و هم بارهای اسکریپت را پوشش میدهد. کارهای اسکریپتی فقط از اهداف نشست main و isolated پشتیبانی میکنند.
openclaw cron create "0 * * * *" \ --name "بررسی ساعتی صف" \ --script ./automation/check-queue.js \ --script-timeout-seconds 300 \ --script-tool-budget 50 \ --session isolated \ --announceبرای خواندن JavaScript از فایل یا ورودی استاندارد، از --script <file|-> استفاده کنید. مهلت زمانی بهطور پیشفرض 300 ثانیه است و حداکثر 900 ثانیه خواهد بود؛ بودجه ابزار بهطور پیشفرض 50 فراخوانی است و حداکثر 200 فراخوانی خواهد بود. این بودجههای بار از بودجههای کوچکتر ارزیابی دروازه راهانداز جدا هستند.
اسکریپت میتواند شیئی با این فیلدهای اختیاری برگرداند:
notify: متنی که از طریق حالت تحویلannounce،webhookیاnoneکار تحویل داده میشود. در صورت حذف، چیزی تحویل داده نمیشود. برای یک کارmain، متن به رویداد سیستمی تبدیل میشود.wake: مقدار"now"پس از قرار دادنnotifyدر صف (یا یک رویداد فشرده تکمیل)، یک Heartbeat فوری درخواست میکند؛ مقدار"next-heartbeat"رویداد را برای Heartbeat بعدی در صف قرار میدهد.state: وضعیت JSON که به 16 KB محدود است و فقط پس از اجرای موفق ماندگار میشود. اجرای بعدی، مانند اسکریپتهای راهانداز، یک نسخه ثابتشده را بهصورتtrigger.stateدریافت میکند. چون آن فضای نام یک مالک ماندگار دارد، نمیتوان بار اسکریپت را در همان کار با راهانداز شرطی ترکیب کرد.nextCheck: مدتی مانند"15m". این مقدار فقط برای کارهایی معتبر است که آهنگ اجرا در آنها فعال شده باشد و از همان محدودسازی آهنگِ پیشنهادهای نوبت عامل استفاده میکند.
پرتاب استثنا، پایان مهلت زمانی، اتمام بودجه ابزار، نتایج نامعتبر و nextCheck بدون آهنگ اجرا، خطاهای عادی اجرای Cron هستند: بدون ماندگار کردن وضعیت بازگشتی، وارد تاریخچه اجرا، عقبنشینی و مدیریت هشدار خرابی میشوند.
سبکهای اجرا
| سبک | مقدار --session |
محل اجرا | مناسب برای |
|---|---|---|---|
| نشست اصلی | main |
مسیر اختصاصی بیدارسازی Cron | یادآورها، رویدادهای سیستمی |
| ایزوله | isolated |
cron:<jobId> اختصاصی |
گزارشها، کارهای پسزمینه |
| نشست جاری | current |
هنگام ایجاد مقید میشود | کارهای تکرارشونده آگاه از زمینه |
| نشست سفارشی | session:custom-id |
نشست نامگذاریشده ماندگار | گردشکارهایی که بر تاریخچه بنا میشوند |
نشست اصلی در برابر ایزوله و سفارشی
کارهای نشست اصلی یک رویداد سیستمی را در مسیر اجرای تحت مالکیت Cron در صف قرار میدهند و در صورت نیاز Heartbeat را بیدار میکنند (--wake now یا --wake next-heartbeat). آنها میتوانند برای پاسخها از آخرین زمینه تحویل نشست اصلی هدف استفاده کنند، اما نوبتهای معمول Cron را به مسیر گفتوگوی انسانی اضافه نمیکنند و تازگی بازنشانی روزانه/بیکاری نشست هدف را تمدید نمیکنند. کارهای ایزوله یک نوبت اختصاصی عامل را با نشستی تازه اجرا میکنند. نشستهای سفارشی (session:xxx) زمینه را میان اجراها ماندگار میکنند و گردشکارهایی مانند جلسههای هماهنگی روزانه را ممکن میسازند که بر خلاصههای قبلی بنا میشوند.
رویدادهای Cron نشست اصلی، یادآورهای مستقلِ رویداد سیستمی هستند. آنها بهطور خودکار اعلان پیشفرض Heartbeat یا یادداشت موقت پایشگر Heartbeat را دربر نمیگیرند؛ اگر یادآوری باید به آن زمینه مراجعه کند، این موضوع را صریحاً در متن رویداد Cron بیان کنید.
معنای «نشست تازه» برای کارهای ایزوله
برای هر اجرا، یک شناسه رونوشت/نشست جدید ایجاد میشود. OpenClaw ترجیحات ایمن را حفظ میکند (تنظیمات تفکر/سریع/پرمطلب، برچسبها و بازنویسیهای صریح مدل/احراز هویت انتخابشده توسط کاربر)، اما زمینه ضمنی مکالمه را از یک ردیف قدیمی Cron به ارث نمیبرد: مسیریابی کانال/گروه، سیاست ارسال یا صف، ارتقای سطح دسترسی، مبدأ یا اتصال زماناجرای ACP. وقتی یک کار تکرارشونده باید آگاهانه بر همان زمینه مکالمه بنا شود، از current یا session:<id> استفاده کنید.
قرارداد اجرای بدون نظارت
نوبتهای عامل در Cron ایزوله و hook صریحاً بدون نظارت هستند: کسی برای توضیح بیشتر یا تأیید حضور ندارد. پاسخ نهایی باید خودِ خروجی قابلتحویل باشد، نه برنامه، اعلام دریافت یا درخواست ورودی. وقتی کاری لازم نیست، عامل HEARTBEAT_OK را برمیگرداند و خرابیها را بهروشنی بیان میکند؛ سیاست تلاش مجدد و هشدار خرابی بر عهده Cron است.
برای کارهای زمانبندیشده مورداعتماد، اگر دستورهای خود کار عمداً سؤال یا برنامهای درخواست کنند، بر سایر دستورها اولویت دارند و عامل میتواند کاری را که دیگر لازم نیست حذف کند. نوبتهای hook خارجی فقط قرارداد مشترک اجرای بدون نظارت را دریافت میکنند؛ آن بازنویسی یا راهنمای حذف خودکار از مرز محتوای خارجی عبور نمیکند.
تحویل زیرعامل و Discord
وقتی اجراهای Cron ایزوله زیرعاملها را هماهنگ میکنند، تحویل، خروجی نهایی آخرین زیرعامل را بر متن میانی قدیمی عامل والد ترجیح میدهد. اگر زیرعاملها همچنان در حال اجرا باشند، OpenClaw بهجای اعلام آن، بهروزرسانی ناقص والد را سرکوب میکند.
برای اهداف اعلامی فقطمتنی Discord، OpenClaw بهجای پخش دوباره متن جریانی/میانی و پاسخ نهایی، متن نهایی و معیار عامل دستیار را یکبار ارسال میکند. رسانهها و بارهای ساختیافته Discord همچنان جداگانه تحویل داده میشوند تا پیوستها و مؤلفهها حذف نشوند.
تحویل و خروجی
| حالت | رخداد |
|---|---|
announce |
اگر عامل ارسال نکرده باشد، متن نهایی بهصورت جایگزین به هدف تحویل داده میشود |
webhook |
بار رویداد پایانیافته با POST به یک URL ارسال میشود |
none |
تحویل جایگزین توسط اجراکننده انجام نمیشود |
برای تحویل کانالی از --announce --channel telegram --to "-1001234567890" استفاده کنید. برای موضوعات انجمن Telegram از -1001234567890:topic:123 استفاده کنید؛ OpenClaw همچنین شکل کوتاه -1001234567890:123 متعلق به Telegram را میپذیرد. فراخوانهای مستقیم RPC/پیکربندی میتوانند delivery.threadId را بهصورت رشته یا عدد ارسال کنند. اهداف Slack/Discord/Mattermost از پیشوندهای صریح استفاده میکنند (channel:<id>، user:<id>). شناسههای اتاق Matrix به حروف بزرگ و کوچک حساساند؛ از شناسه دقیق اتاق یا قالب room:!room:server در Matrix استفاده کنید.
وقتی تحویل اعلامی از channel: "last" استفاده میکند یا channel را حذف میکند، هدفی با پیشوند ارائهدهنده مانند telegram:123 میتواند پیش از بازگشت Cron به تاریخچه نشست یا یک کانال پیکربندیشده، کانال را انتخاب کند. فقط پیشوندهایی که Plugin بارگذاریشده اعلام میکند انتخابگر ارائهدهنده هستند. اگر delivery.channel صریح باشد، پیشوند هدف باید همان ارائهدهنده را نام ببرد؛ ترکیب channel: "whatsapp" با to: "telegram:123" رد میشود تا WhatsApp شناسه Telegram را بهعنوان شماره تلفن تفسیر نکند. پیشوندهای نوع هدف و سرویس (channel:<id>، user:<id>، imessage:<handle>، sms:<number>) نحو هدف متعلق به کانال باقی میمانند، نه انتخابگر ارائهدهنده.
برای کارهای ایزوله، تحویل گفتوگو مشترک است: اگر مسیر گفتوگویی در دسترس باشد، عامل حتی با --no-deliver نیز میتواند از ابزار message استفاده کند. اگر عامل به هدف پیکربندیشده/جاری ارسال کند، OpenClaw اعلام جایگزین را نادیده میگیرد. در غیر این صورت، announce، webhook و none فقط رفتار اجراکننده با پاسخ نهایی پس از نوبت عامل را کنترل میکنند.
وقتی عاملی از یک گفتوگوی فعال، یادآوری ایزوله ایجاد میکند، OpenClaw هدف زنده تحویلِ حفظشده را برای مسیر اعلام جایگزین ذخیره میکند. کلیدهای داخلی نشست ممکن است با حروف کوچک باشند؛ وقتی زمینه گفتوگوی جاری در دسترس است، اهداف تحویل ارائهدهنده از آن کلیدها بازسازی نمیشوند.
تحویل اعلامی ضمنی برای اعتبارسنجی و مسیریابی مجدد اهداف منقضیشده از فهرستهای مجاز کانال پیکربندیشده استفاده میکند. تأییدهای ذخیره جفتسازی پیام خصوصی، گیرندگان جایگزین خودکارسازی نیستند؛ وقتی یک کار زمانبندیشده باید فعالانه به یک پیام خصوصی ارسال کند، delivery.to را تنظیم کنید یا ورودی allowFrom کانال را پیکربندی کنید.
اعلانهای خرابی
اعلانهای خرابی مسیر مقصد جداگانهای را دنبال میکنند:
cron.failureDestinationیک مقدار پیشفرض سراسری برای اعلانهای خرابی تنظیم میکند.job.delivery.failureDestinationآن را برای هر کار بازنویسی میکند.- اگر هیچکدام تنظیم نشده باشند و کار از قبل از طریق
announceتحویل دهد، اعلانهای خرابی به همان هدف اعلامی اصلی بازمیگردند. delivery.failureDestinationفقط در کارهایsessionTarget="isolated"پشتیبانی میشود، مگر آنکه حالت تحویل اصلیwebhookباشد.failureAlert.includeSkipped: trueخطمشی هشدار Cron یک کار یا خطمشی سراسری را برای هشدارهای مکررِ اجرای نادیدهگرفتهشده فعال میکند. اجراهای نادیدهگرفتهشده شمارنده متوالی جداگانهای دارند، بنابراین بر عقبنشینی خطای اجرا تأثیر نمیگذارند.openclaw cron editتنظیم هشدار برای هر کار را ارائه میدهد:--failure-alert/--no-failure-alert،--failure-alert-after <n>،--failure-alert-channel،--failure-alert-to،--failure-alert-cooldown،--failure-alert-include-skipped/--failure-alert-exclude-skipped،--failure-alert-modeو--failure-alert-account-id.
زبان خروجی
کارهای Cron زبان پاسخ را از کانال، منطقه زبانی یا پیامهای قبلی استنباط نمیکنند. قاعده زبان را در پیام یا قالب زمانبندیشده قرار دهید:
openclaw cron edit <jobId> \ --message "بهروزرسانیها را خلاصه کن. به زبان چینی پاسخ بده؛ URLها، کد و نام محصولات را بدون تغییر نگه دار."برای فایلهای قالب، دستور زبان را در اعلان رندرشده نگه دارید و پیش از اجرای کار بررسی کنید که جاینگهدارهایی مانند {{language}} مقداردهی شده باشند. اگر خروجی زبانها را ترکیب میکند، قاعده را صریح بیان کنید؛ برای نمونه: «برای متن روایی از زبان چینی استفاده کن و اصطلاحات فنی را به انگلیسی نگه دار.»
نمونههای CLI
یادآوری یکباره
openclaw cron add \ --name "بررسی تقویم" \ --at "20m" \ --session main \ --system-event "Heartbeat بعدی: تقویم را بررسی کن." \ --wake nowکار ایزوله تکرارشونده
openclaw cron create "0 7 * * *" \ "بهروزرسانیهای شب گذشته را خلاصه کن." \ --name "گزارش صبحگاهی" \ --tz "America/Los_Angeles" \ --session isolated \ --announce \ --channel slack \ --to "channel:C1234567890"بازنویسی مدل و تفکر
openclaw cron add \ --name "تحلیل عمیق" \ --cron "0 6 * * 1" \ --tz "America/Los_Angeles" \ --session isolated \ --message "تحلیل عمیق هفتگی از پیشرفت پروژه." \ --model "opus" \ --thinking high \ --announceخروجی Webhook
openclaw cron create "0 18 * * 1-5" \ "استقرارهای امروز را بهصورت JSON خلاصه کن." \ --name "خلاصه استقرارها" \ --webhook "https://example.invalid/openclaw/cron"خروجی فرمان
openclaw cron create "*/15 * * * *" \ --name "کاوش عمق صف" \ --command "scripts/check-queue.sh" \ --command-cwd "/srv/app" \ --announce \ --channel telegram \ --to "-1001234567890"مدیریت کارها
# فهرستکردن کارهای فعالopenclaw cron list # شاملکردن کارهای غیرفعالopenclaw cron list --all # دریافت یک کار ذخیرهشده بهصورت JSONopenclaw cron get <jobId> # نمایش یک کار، شامل مسیر تحویل نهاییشدهopenclaw cron show <jobId> # فعال/غیرفعالکردن بدون حذفopenclaw cron enable <jobId>openclaw cron disable <jobId> # ویرایش یک کارopenclaw cron edit <jobId> --message "پرامپت بهروزشده" --model "opus" # اجرای اجباری یک کار در همین لحظهopenclaw cron run <jobId> # اجرای اجباری یک کار در همین لحظه و انتظار برای وضعیت پایانی آنopenclaw cron run <jobId> --wait --wait-timeout 10m --poll-interval 2s # اجرا فقط در صورت فرارسیدن موعدopenclaw cron run <jobId> --due # مشاهده تاریخچه اجراopenclaw cron runs --id <jobId> --limit 50 # مشاهده یک اجرای دقیقopenclaw cron runs --id <jobId> --run-id <runId> # حذف یک کارopenclaw cron remove <jobId> # انتخاب عامل (راهاندازیهای چندعاملی)openclaw cron create "0 6 * * *" "صف عملیات را بررسی کن" --name "پایش عملیات" --session isolated --agent opsopenclaw cron edit <jobId> --clear-agentبایگانیکردن یک نشست (از طریق Control UI یا sessions.patch { archived: true } توسط یک فراخواننده مدیر اپراتور) همه کارهای Cron فعال متصل به آن نشست را غیرفعال میکند: نشست مجزای cron:<jobId> آن، یک مقصد session:<key> یا یک مسیر تحویل/بیدارسازی sessionKey. بازیابی نشست این کارها را دوباره فعال نمیکند؛ از openclaw cron enable <jobId> استفاده کنید. نشستهایی که یک کار متصل فعال دارند، در نوار کناری Control UI نشان ساعت نمایش میدهند.
openclaw cron run <jobId> پس از قراردادن اجرای دستی در صف بازمیگردد. برای هوکهای خاموشسازی، اسکریپتهای نگهداشت یا دیگر خودکارسازیهایی که باید تا پایان اجرای در صف مسدود بمانند، از --wait استفاده کنید؛ این فرمان runId بازگرداندهشده را پایش میکند (مهلت پیشفرض 10m، فاصله پایش 2s) و برای وضعیت ok با کد 0 و برای error، skipped یا پایان مهلت انتظار با کدی غیرصفر خارج میشود.
ابزار cron عامل، خلاصههای فشرده کار (id، name، enabled، nextRunAtMs، scheduleKind، lastRunStatus) را از cron(action: "list") بازمیگرداند؛ برای دریافت تعریف کامل یک کار از cron(action: "get", jobId: "...") استفاده کنید. فراخوانندههای مستقیم Gateway میتوانند compact: true را به cron.list ارسال کنند؛ حذف آن پاسخ کامل را همراه با پیشنمایشهای تحویل حفظ میکند.
openclaw cron create نام مستعار openclaw cron add است. کارهای جدید میتوانند از یک زمانبندی موقعیتی ("0 9 * * 1"، "every 1h"، "20m" یا یک برچسب زمانی ISO) و پس از آن یک پرامپت موقعیتی عامل استفاده کنند. برای POST کردن بار اجرای تکمیلشده به یک نقطه پایانی HTTP، از --webhook <url> در cron add|create یا cron edit استفاده کنید؛ تحویل Webhook را نمیتوان با پرچمهای تحویل چت (--announce، --channel، --to، --thread-id، --account) ترکیب کرد. در cron edit، --clear-channel، --clear-to، --clear-thread-id و --clear-account آن فیلدهای مسیریابی را جداگانه پاک کنید (هرکدام همراه با پرچم تنظیم متناظر خود رد میشوند) — برخلاف --no-deliver که فقط تحویل جایگزین اجراکننده را غیرفعال میکند.
Webhookها
Gateway میتواند نقاط پایانی Webhook مبتنی بر HTTP را برای محرکهای خارجی در دسترس قرار دهد. آن را در پیکربندی فعال کنید:
{ hooks: { enabled: true, token: "shared-secret", path: "/hooks", },}احراز هویت
هر درخواست باید توکن هوک را از طریق سربرگ ارسال کند:
Authorization: Bearer <token>(توصیهشده)x-openclaw-token: <token>
توکنهای رشته پرسوجو رد میشوند.
POST /hooks/wake
یک رویداد سیستمی را برای نشست اصلی در صف قرار دهید:
curl -X POST http://127.0.0.1:18789/hooks/wake \ -H 'Authorization: Bearer SECRET' \ -H 'Content-Type: application/json' \ -d '{"text":"ایمیل جدیدی دریافت شد","mode":"now"}'textstringrequiredتوضیح رویداد.
modestringdefault: nownow یا next-heartbeat.
POST /hooks/agent
یک نوبت مجزای عامل را اجرا کنید:
curl -X POST http://127.0.0.1:18789/hooks/agent \ -H 'Authorization: Bearer SECRET' \ -H 'Content-Type: application/json' \ -d '{"message":"صندوق ورودی را خلاصه کن","name":"ایمیل","model":"openai/gpt-5.6-sol"}'فیلدها: message (الزامی)، name، agentId، sessionKey (نیازمند hooks.allowRequestSessionKey=true)، idempotencyKey، wakeMode، deliver، channel، to، model، thinking، timeoutSeconds.
OPENCLAW_DOCS_MARKER:accordionOpen:IHRpdGxlPSLZh9mI2qnigIzZh9in24wg2Ybar9in2LTYquKAjNi02K_ZhyAoUE9TVCAvaG9va3MvPG5hbWU
)">
نامهای سفارشی هوک از طریق hooks.mappings در پیکربندی نهایی میشوند. نگاشتها میتوانند بارهای دلخواه را با الگوها یا تبدیلهای کد به کنشهای wake یا agent تبدیل کنند.
یکپارچهسازی Gmail PubSub
محرکهای صندوق ورودی Gmail را از طریق Google PubSub به OpenClaw متصل کنید.
راهاندازی با راهنما (توصیهشده)
openclaw webhooks gmail setup --account openclaw@gmail.comاین فرمان پیکربندی hooks.gmail را مینویسد، پیشتنظیم Gmail را فعال میکند و Tailscale Funnel را بهعنوان پیشفرض نقطه پایانی ارسال تنظیم میکند (--tailscale funnel|serve|off).
شروع خودکار Gateway
هنگامی که hooks.enabled=true فعال و hooks.gmail.account تنظیم شده باشد، Gateway هنگام راهاندازی gog gmail watch serve را آغاز میکند و پایش را خودکار تمدید میکند. برای انصراف، OPENCLAW_SKIP_GMAIL_WATCHER=1 را تنظیم کنید.
راهاندازی دستی یکباره
انتخاب پروژه GCP
پروژه GCP مالک کلاینت OAuth مورداستفاده gog را انتخاب کنید:
gcloud auth logingcloud config set project <project-id>gcloud services enable gmail.googleapis.com pubsub.googleapis.comایجاد موضوع و اعطای دسترسی ارسال Gmail
gcloud pubsub topics create gog-gmail-watchgcloud pubsub topics add-iam-policy-binding gog-gmail-watch \ --member=serviceAccount:gmail-api-push@system.gserviceaccount.com \ --role=roles/pubsub.publisherآغاز پایش
gog gmail watch start \ --account openclaw@gmail.com \ --label INBOX \ --topic projects/<project-id>/topics/gog-gmail-watchبازنویسی مدل Gmail
{ hooks: { gmail: { model: "openai/gpt-5.6-sol", thinking: "high", }, },}برای صندوقهای ورودی غیرقابلاعتماد، از بهترین مدل نسل جدید موجود نزد ارائهدهنده خود استفاده کنید. مقدار بالا یک نمونه است؛ مدل باید در کاتالوگ و فهرست مجاز پیکربندیشده شما وجود داشته باشد.
پیکربندی
{ cron: { enabled: true, store: "~/.openclaw/cron/jobs.json", triggers: { enabled: false, }, webhookToken: "replace-with-dedicated-webhook-token", sessionRetention: "24h", },}webhookToken در POSTهای Webhook مربوط به Cron بهصورت Authorization: Bearer <token> ارسال میشود.
cron.store یک کلید منطقی ذخیرهسازی و مسیر مهاجرت doctor است، نه یک فایل JSON زنده برای ویرایش دستی. دادههای کار در SQLite قرار دارند؛ برای تغییرات از CLI یا API مربوط به Gateway استفاده کنید.
غیرفعالکردن Cron: cron.enabled: false یا OPENCLAW_SKIP_CRON=1.
رفتار تلاش مجدد
تلاش مجدد اجرای یکباره: خطاهای گذرا (محدودیت نرخ، اضافهبار، شبکه، پایان مهلت، خطای سرور) از یک زمانبندی داخلی تلاش مجدد استفاده میکنند. خطاهای دائمی بلافاصله کار را غیرفعال میکنند.
تلاش مجدد اجرای تکرارشونده: خطاهای اجرای متوالی طبق یک زمانبندی توسعهیافته عقبنشینی میکنند (30s، 60s، 5m، 15m، 60m). عقبنشینی پس از اجرای موفق بعدی بازنشانی میشود.
نگهداشت
cron.sessionRetention (پیشفرض 24h، مقدار false آن را غیرفعال میکند) ورودیهای نشست اجرای مجزا را پاکسازی میکند. تاریخچه اجرا جدیدترین 2000 ردیف پایانی هر کار را نگه میدارد؛ ردیفهای ازدسترفته بازه پاکسازی 24 ساعته خود را حفظ میکنند.
مهاجرت ذخیرهگاه قدیمی
هنگام ارتقا، openclaw doctor --fix را اجرا کنید تا فایلهای قدیمی ~/.openclaw/cron/jobs.json، jobs-state.json و runs/*.jsonl به SQLite وارد و با پسوند .migrated تغییر نام داده شوند. ردیفهای معیوب کار در زمان اجرا نادیده گرفته و برای تعمیر یا بازبینی بعدی در jobs-quarantine.json کپی میشوند.
عیبیابی
نردبان فرمانها
openclaw statusopenclaw gateway statusopenclaw cron statusopenclaw cron listopenclaw cron runs --id <jobId> --limit 20openclaw system heartbeat lastopenclaw logs --followopenclaw doctorCron اجرا نمیشود
cron.enabledو متغیر محیطیOPENCLAW_SKIP_CRONرا بررسی کنید.- تأیید کنید که Gateway بهطور پیوسته در حال اجرا است.
- برای زمانبندیهای
cron، منطقه زمانی (--tz) را در مقایسه با منطقه زمانی میزبان بررسی کنید. - وجود
reason: not-dueدر خروجی اجرا یعنی اجرای دستی باopenclaw cron run <jobId> --dueبررسی شده و موعد کار هنوز نرسیده است.
Cron اجرا شد اما تحویلی انجام نشد
- حالت تحویل
noneیعنی انتظار نمیرود ارسال جایگزین اجراکننده انجام شود. وقتی مسیر گفتوگو در دسترس باشد، عامل همچنان میتواند مستقیماً با ابزارmessageارسال کند. - نبودن یا نامعتبر بودن مقصد تحویل (
channel/to) یعنی ارسال خروجی نادیده گرفته شد. - برای Matrix، کارهای کپیشده یا قدیمی با شناسههای اتاق
delivery.toکه با حروف کوچک نوشته شدهاند ممکن است ناموفق باشند، زیرا شناسههای اتاق Matrix به بزرگی و کوچکی حروف حساساند. کار را با مقدار دقیق!room:serverیاroom:!room:serverاز Matrix ویرایش کنید. - خطاهای احراز هویت کانال (
unauthorized،Forbidden) یعنی تحویل بهدلیل اعتبارنامهها مسدود شده است. - اگر اجرای ایزوله فقط توکن سکوت (
NO_REPLY/no_reply) را برگرداند، OpenClaw تحویل مستقیم خروجی و مسیر جایگزین خلاصهٔ صفبندیشده را سرکوب میکند؛ بنابراین چیزی به گفتوگو بازگردانده نمیشود. - اگر عامل باید خودش به کاربر پیام بدهد، بررسی کنید که کار مسیر قابلاستفادهای داشته باشد (
channel: "last"همراه با یک گفتوگوی قبلی، یا کانال/مقصد صریح).
به نظر میرسد Cron یا Heartbeat مانع جابهجایی به سبک /new میشود
- تازگی بازنشانی روزانه و در حالت بیکاری بر پایهٔ
updatedAtنیست؛ به مدیریت نشست مراجعه کنید. - بیدارسازیهای Cron، اجراهای Heartbeat، اعلانهای exec و ثبتهای مدیریتی Gateway ممکن است ردیف نشست را برای مسیریابی/وضعیت بهروزرسانی کنند، اما
sessionStartedAtیاlastInteractionAtرا تمدید نمیکنند. - برای ردیفهای قدیمی که پیش از وجود این فیلدها ایجاد شدهاند، اگر فایل همچنان در دسترس باشد، OpenClaw میتواند
sessionStartedAtرا از سرآیند نشست JSONL رونوشت بازیابی کند. ردیفهای قدیمیِ بیکار فاقدlastInteractionAtاز زمان شروع بازیابیشده بهعنوان خط مبنای بیکاری استفاده میکنند.
نکات ظریف منطقهٔ زمانی
- Cron بدون
--tzاز منطقهٔ زمانی میزبان Gateway استفاده میکند. - زمانبندیهای
atبدون منطقهٔ زمانی، UTC در نظر گرفته میشوند. activeHoursدر Heartbeat از تفکیک منطقهٔ زمانی پیکربندیشده استفاده میکند.
مرتبط
- اتوماسیون — همهٔ سازوکارهای اتوماسیون در یک نگاه
- وظایف پسزمینه — دفتر ثبت وظایف برای اجراهای Cron
- Heartbeat — نوبتهای دورهای نشست اصلی
- منطقهٔ زمانی — پیکربندی منطقهٔ زمانی