Cron vs Heartbeat: Khi nào dùng cái nào

Cả Heartbeat và cron job đều cho phép các bạn chạy các tác vụ theo lịch. Bài này sẽ giúp các bạn chọn cơ chế phù hợp cho từng trường hợp.

Bảng quyết định nhanh

Trường hợp sử dụngKhuyên dùngLý do
Kiểm tra inbox mỗi 30 phútHeartbeatGộp với các kiểm tra khác, nhận biết ngữ cảnh
Gửi báo cáo hàng ngày lúc 9h đúngCron (isolated)Cần thời gian chính xác
Theo dõi lịch để biết sự kiện sắp tớiHeartbeatPhù hợp tự nhiên cho việc kiểm tra định kỳ
Chạy phân tích sâu hàng tuầnCron (isolated)Tác vụ độc lập, có thể dùng model khác
Nhắc tôi sau 20 phútCron (main, --at)Chạy một lần với thời gian chính xác
Kiểm tra tình trạng dự án chạy nềnHeartbeatTận dụng chu kỳ đã có sẵn

Heartbeat: Kiểm tra định kỳ

Heartbeat chạy trong main session theo chu kỳ đều đặn (mặc định: 30 phút). Nó được thiết kế để Agent kiểm tra mọi thứ và đưa ra những gì quan trọng.

Khi nào dùng Heartbeat

  • Nhiều kiểm tra định kỳ: Thay vì 5 cron job riêng lẻ để kiểm tra inbox, lịch, thời tiết, thông báo và trạng thái dự án, một Heartbeat duy nhất có thể gộp tất cả lại.
  • Quyết định dựa trên ngữ cảnh: Agent có đầy đủ context của main session, nên có thể đưa ra quyết định thông minh về việc gì khẩn cấp và việc gì có thể đợi.
  • Tính liên tục trong hội thoại: Các lần chạy Heartbeat dùng chung session, nên Agent nhớ các cuộc trò chuyện gần đây và có thể theo dõi một cách tự nhiên.
  • Giám sát nhẹ nhàng: Một Heartbeat thay thế nhiều tác vụ polling nhỏ.

Ưu điểm của Heartbeat

  • Gộp nhiều kiểm tra: Một lượt Agent có thể xem inbox, lịch và thông báo cùng lúc.
  • Giảm API call: Một Heartbeat rẻ hơn 5 cron job riêng lẻ.
  • Nhận biết ngữ cảnh: Agent biết các bạn đang làm gì và có thể ưu tiên phù hợp.
  • Tự động bỏ qua: Nếu không có gì cần chú ý, Agent trả về HEARTBEAT_OK và không gửi tin nhắn nào.
  • Thời gian linh hoạt: Có thể trôi một chút dựa trên tải hàng đợi, điều này ổn với hầu hết việc giám sát.

Ví dụ Heartbeat: Checklist HEARTBEAT.md

# Heartbeat checklist

- Check email for urgent messages
- Review calendar for events in next 2 hours
- If a background task finished, summarize results
- If idle for 8+ hours, send a brief check-in

Agent đọc file này mỗi lần Heartbeat và xử lý tất cả các mục trong một lượt.

Cấu hình Heartbeat

{
  agents: {
    defaults: {
      heartbeat: {
        every: "30m", // chu kỳ
        target: "last", // nơi gửi cảnh báo
        activeHours: { start: "08:00", end: "22:00" }, // tùy chọn
      },
    },
  },
}

Xem Heartbeat để biết cấu hình đầy đủ.

Cron: Lên lịch chính xác

Cron job chạy vào thời điểm chính xác và có thể chạy trong session riêng biệt mà không ảnh hưởng đến context chính.

Khi nào dùng Cron

  • Cần thời gian chính xác: “Gửi cái này lúc 9:00 sáng thứ Hai hàng tuần” (không phải “khoảng 9h”).
  • Tác vụ độc lập: Các tác vụ không cần context hội thoại.
  • Model/thinking khác: Phân tích nặng cần model mạnh hơn.
  • Nhắc nhở một lần: “Nhắc tôi sau 20 phút” với --at.
  • Tác vụ ồn ào/thường xuyên: Các tác vụ làm lộn xộn lịch sử main session.
  • Trigger từ bên ngoài: Các tác vụ cần chạy độc lập bất kể Agent có đang hoạt động hay không.

Ưu điểm của Cron

  • Thời gian chính xác: Biểu thức cron 5 trường với hỗ trợ timezone.
  • Session riêng biệt: Chạy trong cron:<jobId> mà không làm lộn xộn lịch sử chính.
  • Override model: Dùng model rẻ hơn hoặc mạnh hơn cho từng job.
  • Kiểm soát gửi tin: Có thể gửi trực tiếp đến một Channel; vẫn đăng tóm tắt lên main theo mặc định (có thể cấu hình).
  • Không cần context của Agent: Chạy ngay cả khi main session đang idle hoặc bị nén.
  • Hỗ trợ chạy một lần: --at cho timestamp tương lai chính xác.

Ví dụ Cron: Báo cáo buổi sáng hàng ngày

openclaw cron add \
  --name "Morning briefing" \
  --cron "0 7 * * *" \
  --tz "America/New_York" \
  --session isolated \
  --message "Generate today's briefing: weather, calendar, top emails, news summary." \
  --model opus \
  --deliver \
  --channel whatsapp \
  --to "+15551234567"

Lệnh này chạy đúng 7:00 sáng giờ New York, dùng Opus để đảm bảo chất lượng, và gửi trực tiếp qua WhatsApp.

Ví dụ Cron: Nhắc nhở một lần

openclaw cron add \
  --name "Meeting reminder" \
  --at "20m" \
  --session main \
  --system-event "Reminder: standup meeting starts in 10 minutes." \
  --wake now \
  --delete-after-run

Xem Cron jobs để biết tham chiếu CLI đầy đủ.

Sơ đồ quyết định

Tác vụ có cần chạy vào thời điểm CHÍNH XÁC không?
  CÓ -> Dùng cron
  KHÔNG -> Tiếp tục...

Tác vụ có cần tách biệt khỏi main session không?
  CÓ -> Dùng cron (isolated)
  KHÔNG -> Tiếp tục...

Tác vụ này có thể gộp với các kiểm tra định kỳ khác không?
  CÓ -> Dùng Heartbeat (thêm vào HEARTBEAT.md)
  KHÔNG -> Dùng cron

Đây có phải nhắc nhở một lần không?
  CÓ -> Dùng cron với --at
  KHÔNG -> Tiếp tục...

Có cần model hoặc mức thinking khác không?
  CÓ -> Dùng cron (isolated) với --model/--thinking
  KHÔNG -> Dùng Heartbeat

Kết hợp cả hai

Cách thiết lập hiệu quả nhất là dùng cả hai:

  1. Heartbeat xử lý giám sát thường xuyên (inbox, lịch, thông báo) trong một lượt gộp mỗi 30 phút.
  2. Cron xử lý lịch trình chính xác (báo cáo hàng ngày, đánh giá hàng tuần) và nhắc nhở một lần.

Ví dụ: Thiết lập tự động hóa hiệu quả

HEARTBEAT.md (kiểm tra mỗi 30 phút):

# Heartbeat checklist

- Scan inbox for urgent emails
- Check calendar for events in next 2h
- Review any pending tasks
- Light check-in if quiet for 8+ hours

Cron jobs (thời gian chính xác):

# Báo cáo buổi sáng hàng ngày lúc 7h
openclaw cron add --name "Morning brief" --cron "0 7 * * *" --session isolated --message "..." --deliver

# Đánh giá dự án hàng tuần vào thứ Hai lúc 9h
openclaw cron add --name "Weekly review" --cron "0 9 * * 1" --session isolated --message "..." --model opus

# Nhắc nhở một lần
openclaw cron add --name "Call back" --at "2h" --session main --system-event "Call back the client" --wake now

Lobster: Workflow xác định với phê duyệt

Lobster là runtime cho pipeline công cụ nhiều bước cần thực thi xác định và phê duyệt rõ ràng. Dùng nó khi tác vụ phức tạp hơn một lượt Agent đơn lẻ, và các bạn muốn workflow có thể tiếp tục với các điểm kiểm tra của con người.

Khi nào Lobster phù hợp

  • Tự động hóa nhiều bước: Các bạn cần một pipeline cố định các lệnh gọi công cụ, không phải prompt một lần.
  • Cổng phê duyệt: Các tác động phụ nên tạm dừng cho đến khi các bạn phê duyệt, rồi mới tiếp tục.
  • Chạy có thể tiếp tục: Tiếp tục workflow đã tạm dừng mà không cần chạy lại các bước trước đó.

Cách nó kết hợp với Heartbeat và Cron

  • Heartbeat/cron quyết định khi nào một lần chạy xảy ra.
  • Lobster định nghĩa các bước nào xảy ra khi lần chạy bắt đầu.

Với workflow theo lịch, dùng cron hoặc heartbeat để kích hoạt một lượt Agent gọi Lobster. Với workflow tùy ý, gọi Lobster trực tiếp.

Ghi chú vận hành (từ code)

  • Lobster chạy như một subprocess cục bộ (lobster CLI) ở chế độ công cụ và trả về JSON envelope.
  • Nếu công cụ trả về needs_approval, các bạn tiếp tục với resumeToken và cờ approve.
  • Công cụ này là plugin tùy chọn; bật nó bằng cách thêm vào tools.alsoAllow: ["lobster"] (khuyên dùng).
  • Nếu các bạn truyền lobsterPath, nó phải là đường dẫn tuyệt đối.

Xem Lobster để biết cách dùng và ví dụ đầy đủ.

Main Session vs Isolated Session

Cả Heartbeat và cron đều có thể tương tác với main session, nhưng theo cách khác nhau:

HeartbeatCron (main)Cron (isolated)
SessionMainMain (qua system event)cron:<jobId>
HistoryDùng chungDùng chungMới mỗi lần chạy
ContextĐầy đủĐầy đủKhông có (bắt đầu sạch)
ModelModel của main sessionModel của main sessionCó thể override
OutputGửi nếu không phải HEARTBEAT_OKPrompt Heartbeat + eventTóm tắt đăng lên main

Khi nào dùng main session cron

Dùng --session main với --system-event khi các bạn muốn:

  • Nhắc nhở/sự kiện xuất hiện trong context của main session
  • Agent xử lý nó trong Heartbeat tiếp theo với đầy đủ context
  • Không có lần chạy riêng biệt
openclaw cron add \
  --name "Check project" \
  --every "4h" \
  --session main \
  --system-event "Time for a project health check" \
  --wake now

Khi nào dùng isolated cron

Dùng --session isolated khi các bạn muốn:

  • Bắt đầu sạch sẽ không có context trước đó
  • Cài đặt model hoặc thinking khác
  • Output gửi trực tiếp đến một Channel (tóm tắt vẫn đăng lên main theo mặc định)
  • Lịch sử không làm lộn xộn main session
openclaw cron add \
  --name "Deep analysis" \
  --cron "0 6 * * 0" \
  --session isolated \
  --message "Weekly codebase analysis..." \
  --model opus \
  --thinking high \
  --deliver

Cân nhắc về chi phí

Cơ chếMô hình chi phí
HeartbeatMột lượt mỗi N phút; tăng theo kích thước HEARTBEAT.md
Cron (main)Thêm event vào heartbeat tiếp theo (không có lượt riêng)
Cron (isolated)Lượt Agent đầy đủ mỗi job; có thể dùng model rẻ hơn

Mẹo:

  • Giữ HEARTBEAT.md nhỏ gọn để giảm thiểu token overhead.
  • Gộp các kiểm tra tương tự vào heartbeat thay vì nhiều cron job.
  • Dùng target: "none" trên heartbeat nếu chỉ muốn xử lý nội bộ.
  • Dùng isolated cron với model rẻ hơn cho các tác vụ thường xuyên.

Liên quan

  • Heartbeat - cấu hình heartbeat đầy đủ
  • Cron jobs - tham chiếu CLI và API cron đầy đủ
  • System - system event + điều khiển heartbeat