Gateway
Heartbeat
Heartbeat เรียกใช้ รอบการทำงานของเอเจนต์เป็นระยะ ในเซสชันหลัก เพื่อให้โมเดลแจ้งสิ่งที่ต้องได้รับความสนใจโดยไม่ส่งข้อความรบกวนคุณมากเกินไป
Heartbeat คือรอบการทำงานตามกำหนดเวลาในเซสชันหลัก โดย ไม่ สร้างระเบียน งานเบื้องหลัง ระเบียนงานมีไว้สำหรับงานที่แยกออกไปทำต่างหาก (การทำงานของ ACP, เอเจนต์ย่อย, งาน Cron แบบแยกส่วน)
การแก้ไขปัญหา: งานตามกำหนดเวลา
เริ่มต้นอย่างรวดเร็ว (สำหรับผู้เริ่มต้น)
เลือกความถี่
เปิดใช้ Heartbeat ไว้ (ค่าเริ่มต้นคือ 30m หรือ 1h เมื่อกำหนดค่าการยืนยันตัวตนด้วย OAuth/โทเค็นของ Anthropic รวมถึงการใช้ข้อมูลจาก Claude CLI ซ้ำ) หรือกำหนดความถี่ของคุณเอง
เพิ่ม HEARTBEAT.md (ไม่บังคับ)
สร้างรายการตรวจสอบขนาดเล็กใน HEARTBEAT.md หรือบล็อก tasks: ในพื้นที่ทำงานของเอเจนต์
กำหนดปลายทางของข้อความ Heartbeat
target: "none" เป็นค่าเริ่มต้น ให้ตั้งค่า target: "last" เพื่อส่งไปยังผู้ติดต่อล่าสุด
การปรับแต่งเพิ่มเติม
- เปิดใช้การส่งเหตุผลของ Heartbeat เพื่อความโปร่งใส
- ใช้บริบทเริ่มต้นแบบประหยัด หากการทำงานของ Heartbeat ต้องใช้เพียง
HEARTBEAT.md - เปิดใช้เซสชันแบบแยกส่วนเพื่อหลีกเลี่ยงการส่งประวัติการสนทนาทั้งหมดในทุก Heartbeat
- จำกัด Heartbeat ให้ทำงานเฉพาะช่วงเวลาที่ใช้งาน (เวลาท้องถิ่น)
ตัวอย่างการกำหนดค่า:
{ agents: { defaults: { heartbeat: { every: "30m", target: "last", // explicit delivery to last contact (default is "none") directPolicy: "allow", // default: allow direct/DM targets; set "block" to suppress lightContext: true, // optional: only inject HEARTBEAT.md from bootstrap files isolatedSession: true, // optional: fresh session each run (no conversation history) skipWhenBusy: true, // optional: also defer when this agent's subagent or nested lanes are busy // activeHours: { start: "08:00", end: "24:00" }, // includeReasoning: true, // optional: send separate `Thinking` message too }, }, },}ค่าเริ่มต้น
- ช่วงเวลา:
30mการใช้ค่าเริ่มต้นของผู้ให้บริการ Anthropic จะเพิ่มเป็น1hเมื่อโหมดการยืนยันตัวตนที่ได้คือ OAuth/โทเค็น (รวมถึงการใช้ข้อมูลจาก Claude CLI ซ้ำ) แต่เฉพาะเมื่อยังไม่ได้ตั้งค่าheartbeat.everyกำหนด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 ที่ไม่ได้กำหนดค่าจะใช้
agents.defaults.timeoutSecondsหากมีการตั้งค่าไว้ มิฉะนั้นจะใช้ความถี่ของ Heartbeat โดยจำกัดสูงสุดไว้ที่ 600 วินาที กำหนดagents.defaults.heartbeat.timeoutSecondsหรือagents.list[].heartbeat.timeoutSecondsรายเอเจนต์สำหรับงาน Heartbeat ที่ใช้เวลานานกว่านั้น - พรอมต์ Heartbeat จะถูกส่ง ตามข้อความเดิมทุกประการ ในฐานะข้อความของผู้ใช้ พรอมต์ระบบจะมีส่วน "Heartbeats" เฉพาะเมื่อเปิดใช้ Heartbeat สำหรับเอเจนต์เริ่มต้น (และ
includeSystemPromptSectionไม่ใช่false) และการทำงานดังกล่าวจะถูกทำเครื่องหมายไว้ภายใน - เมื่อปิดใช้ Heartbeat ด้วย
0mการทำงานปกติจะไม่นำHEARTBEAT.mdเข้าในบริบทเริ่มต้นด้วย เพื่อไม่ให้โมเดลเห็นคำสั่งที่มีไว้สำหรับ Heartbeat เท่านั้น - ช่วงเวลาที่ใช้งาน (
heartbeat.activeHours) จะได้รับการตรวจสอบตามเขตเวลาที่กำหนดค่าไว้ เมื่ออยู่นอกช่วง Heartbeat จะถูกข้ามจนถึงรอบถัดไปที่อยู่ภายในช่วง - Heartbeat จะเลื่อนออกไปโดยอัตโนมัติขณะที่งาน Cron กำลังทำงานหรืออยู่ในคิว ตั้งค่า
heartbeat.skipWhenBusy: trueเพื่อเลื่อนเอเจนต์ออกไปด้วย เมื่อเอเจนต์ย่อยที่ผูกกับคีย์เซสชันของเอเจนต์นั้นหรือช่องทางคำสั่งแบบซ้อนกำลังทำงาน เอเจนต์ระดับเดียวกันจะไม่หยุดชั่วคราวเพียงเพราะเอเจนต์อื่นมีงานของเอเจนต์ย่อยกำลังดำเนินอยู่
จุดประสงค์ของพรอมต์ Heartbeat
พรอมต์เริ่มต้นตั้งใจให้ครอบคลุมกว้าง:
- งานเบื้องหลัง: "Consider outstanding tasks" กระตุ้นให้เอเจนต์ตรวจสอบสิ่งที่ต้องติดตามต่อ (กล่องจดหมาย ปฏิทิน การแจ้งเตือน งานในคิว) และแจ้งสิ่งเร่งด่วน
- การสอบถามผู้ใช้: "Checkup sometimes on your human during day time" กระตุ้นให้ส่งข้อความสั้น ๆ เป็นครั้งคราวว่า "มีอะไรให้ช่วยไหม" แต่หลีกเลี่ยงการส่งข้อความรบกวนในเวลากลางคืนด้วยการใช้เขตเวลาท้องถิ่นที่คุณกำหนดค่าไว้ (ดู เขตเวลา)
Heartbeat สามารถตอบสนองต่องาน เบื้องหลัง ที่เสร็จสิ้นแล้วได้ แต่การทำงานของ Heartbeat เองจะไม่สร้างระเบียนงาน
หากคุณต้องการให้ Heartbeat ทำสิ่งที่เฉพาะเจาะจงมาก (เช่น "ตรวจสอบสถิติ Gmail PubSub" หรือ "ตรวจสอบสถานะของ Gateway") ให้ตั้งค่า agents.defaults.heartbeat.prompt (หรือ agents.list[].heartbeat.prompt) เป็นเนื้อหาที่กำหนดเอง (ส่งตามข้อความเดิมทุกประการ)
ข้อตกลงการตอบกลับ
- หากไม่มีสิ่งใดต้องได้รับความสนใจ ให้ตอบกลับด้วย
HEARTBEAT_OK - การทำงานของ Heartbeat อาจเรียก
heartbeat_respondโดยใช้notify: falseเพื่อไม่แสดงการอัปเดต หรือใช้notify: trueพร้อมnotificationTextสำหรับการแจ้งเตือนแทน หากมีการตอบกลับจากเครื่องมือแบบมีโครงสร้าง การตอบกลับนั้นจะมีลำดับความสำคัญเหนือข้อความสำรอง - ระหว่างการทำงานของ Heartbeat OpenClaw จะถือว่า
HEARTBEAT_OKเป็นการตอบรับเมื่อปรากฏที่ จุดเริ่มต้นหรือจุดสิ้นสุด ของคำตอบ โทเค็นดังกล่าวจะถูกตัดออก และคำตอบจะถูกละทิ้งหากเนื้อหาที่เหลือมีความยาว ≤ackMaxChars(ค่าเริ่มต้น: 300) - หาก
HEARTBEAT_OKปรากฏอยู่ ตรงกลาง คำตอบ ระบบจะไม่จัดการเป็นกรณีพิเศษ - สำหรับการแจ้งเตือน ห้าม ใส่
HEARTBEAT_OKให้ส่งกลับเฉพาะข้อความแจ้งเตือน
นอกการทำงานของ Heartbeat ระบบจะตัด HEARTBEAT_OK ที่หลงอยู่ตรงจุดเริ่มต้นหรือจุดสิ้นสุดของข้อความออกและบันทึกลงในบันทึก ข้อความที่มีเพียง HEARTBEAT_OK จะถูกละทิ้ง
การกำหนดค่า
{ agents: { defaults: { heartbeat: { every: "30m", // default: 30m (0m disables) model: "anthropic/claude-opus-4-6", includeReasoning: false, // default: false (deliver separate Thinking message when available) lightContext: false, // default: false; true keeps only HEARTBEAT.md from workspace bootstrap files isolatedSession: false, // default: false; true runs each heartbeat in a fresh session (no conversation history) skipWhenBusy: false, // default: false; true also waits for this agent's subagent/nested lanes target: "last", // default: none | options: last | none | <channel id> (core or plugin, e.g. "imessage") to: "+15551234567", // optional channel-specific override accountId: "ops-bot", // optional multi-account channel id 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.", includeSystemPromptSection: true, // default: true; false omits the ## Heartbeats system prompt section for the default agent ackMaxChars: 300, // max chars allowed after HEARTBEAT_OK }, }, },}ขอบเขตและลำดับความสำคัญ
agents.defaults.heartbeatกำหนดพฤติกรรม Heartbeat โดยรวมagents.list[].heartbeatจะผสานทับค่าดังกล่าว หากเอเจนต์ใดมีบล็อกheartbeatเฉพาะเอเจนต์เหล่านั้น เท่านั้นที่จะเรียกใช้ Heartbeatchannels.defaults.heartbeatกำหนดค่าเริ่มต้นด้านการมองเห็นสำหรับทุกช่องทางchannels.<channel>.heartbeatเขียนทับค่าเริ่มต้นของช่องทางchannels.<channel>.accounts.<id>.heartbeat(ช่องทางแบบหลายบัญชี) เขียนทับการตั้งค่ารายช่องทาง
Heartbeat รายเอเจนต์
หากรายการใดใน agents.list[] มีบล็อก heartbeat เฉพาะเอเจนต์เหล่านั้น เท่านั้นที่จะเรียกใช้ Heartbeat บล็อกรายเอเจนต์จะผสานทับ agents.defaults.heartbeat (คุณจึงสามารถกำหนดค่าเริ่มต้นร่วมกันครั้งเดียวและเขียนทับเป็นรายเอเจนต์ได้)
ตัวอย่าง: มีเอเจนต์สองตัว โดยมีเพียงเอเจนต์ตัวที่สองที่เรียกใช้ Heartbeat
{ agents: { defaults: { heartbeat: { every: "30m", target: "last", // explicit delivery to last contact (default is "none") }, }, list: [ { id: "main", default: true }, { id: "ops", heartbeat: { every: "1h", target: "whatsapp", to: "+15551234567", timeoutSeconds: 45, 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 ให้ทำงานเฉพาะเวลาทำการในเขตเวลาที่ระบุ:
{ agents: { defaults: { heartbeat: { every: "30m", target: "last", // explicit delivery to last contact (default is "none") activeHours: { start: "09:00", end: "22:00", timezone: "America/New_York", // optional; uses your userTimezone if set, otherwise host tz }, }, }, },}เมื่ออยู่นอกช่วงนี้ (ก่อน 9:00 น. หรือหลัง 22:00 น. ตามเวลาตะวันออก) Heartbeat จะถูกข้าม รอบตามกำหนดเวลาถัดไปที่อยู่ภายในช่วงจะทำงานตามปกติ
การตั้งค่าให้ทำงานตลอด 24 ชั่วโมงทุกวัน
หากคุณต้องการให้ Heartbeat ทำงานตลอดทั้งวัน ให้ใช้รูปแบบใดรูปแบบหนึ่งต่อไปนี้:
- ละ
activeHoursทั้งหมด (ไม่มีข้อจำกัดด้านช่วงเวลา ซึ่งเป็นพฤติกรรมเริ่มต้น) - กำหนดช่วงเต็มวัน:
activeHours: { start: "00:00", end: "24:00" }
ตัวอย่างหลายบัญชี
ใช้ accountId เพื่อระบุบัญชีที่ต้องการบนช่องทางแบบหลายบัญชี เช่น Telegram:
{ agents: { list: [ { id: "ops", heartbeat: { every: "1h", target: "telegram", to: "12345678:topic:42", // optional: route to a specific topic/thread accountId: "ops-bot", }, }, ], }, channels: { telegram: { accounts: { "ops-bot": { botToken: "YOUR_TELEGRAM_BOT_TOKEN" }, }, }, },}หมายเหตุเกี่ยวกับฟิลด์
everystringช่วงเวลาของ Heartbeat (สตริงระยะเวลา หน่วยเริ่มต้น = นาที)
modelstringการเขียนทับโมเดลสำหรับการทำงานของ Heartbeat ซึ่งไม่บังคับ (provider/model)
includeReasoningbooleandefault: falseเมื่อเปิดใช้ ระบบจะส่งข้อความ Thinking แยกต่างหากด้วยเมื่อมีให้ใช้งาน (รูปแบบเดียวกับ /reasoning on)
lightContextbooleandefault: falseเมื่อเป็นจริง การทำงานของ Heartbeat จะใช้บริบทเริ่มต้นแบบประหยัด และเก็บเฉพาะ HEARTBEAT.md จากไฟล์เริ่มต้นของพื้นที่ทำงาน
isolatedSessionbooleandefault: falseเมื่อเป็นจริง Heartbeat แต่ละครั้งจะทำงานในเซสชันใหม่โดยไม่มีประวัติการสนทนาก่อนหน้า โดยใช้รูปแบบการแยกส่วนเดียวกับ sessionTarget: "isolated" ของ Cron ซึ่งช่วยลดค่าใช้จ่ายโทเค็นต่อ Heartbeat ได้อย่างมาก ใช้ร่วมกับ lightContext: true เพื่อประหยัดสูงสุด การกำหนดเส้นทางการส่งยังคงใช้บริบทของเซสชันหลัก
skipWhenBusybooleandefault: falseเมื่อเป็นจริง การทำงานของ Heartbeat จะเลื่อนออกไปเมื่อช่องทางงานเพิ่มเติมของเอเจนต์นั้นไม่ว่าง ได้แก่ เอเจนต์ย่อยที่ผูกกับคีย์เซสชันของตนเองหรืองานคำสั่งแบบซ้อน ช่องทาง Cron จะเลื่อน Heartbeat ออกไปเสมอแม้ไม่มีแฟล็กนี้ เพื่อให้โฮสต์โมเดลภายในเครื่องไม่เรียกใช้พรอมต์ Cron และ Heartbeat พร้อมกัน
sessionstringคีย์เซสชันสำหรับการทำงานของ Heartbeat ซึ่งไม่บังคับ
main(ค่าเริ่มต้น): เซสชันหลักของเอเจนต์- คีย์เซสชันที่ระบุชัดเจน (คัดลอกจาก
openclaw sessions --jsonหรือ CLI สำหรับเซสชัน) - รูปแบบคีย์เซสชัน: ดู เซสชัน และ กลุ่ม
targetstringlast: ส่งไปยังช่องทางภายนอกที่ใช้ล่าสุด- ช่องทางที่ระบุชัดเจน: ช่องทางหรือรหัส Plugin ใด ๆ ที่กำหนดค่าไว้ เช่น
discord,matrix,telegramหรือwhatsapp none(ค่าเริ่มต้น): เรียกใช้ Heartbeat แต่ ไม่ส่ง ไปยังภายนอก
directPolicy"allow" | "block"default: allowควบคุมพฤติกรรมการส่งโดยตรง/DM allow: อนุญาตให้ส่ง Heartbeat โดยตรง/DM block: ระงับการส่งโดยตรง/DM (reason=dm-blocked)
tostringตัวเลือกเสริมสำหรับแทนที่ผู้รับ (รหัสเฉพาะของช่องทาง เช่น E.164 สำหรับ WhatsApp หรือรหัสแชต Telegram) สำหรับหัวข้อ/เธรดของ Telegram ให้ใช้ <chatId>:topic:<messageThreadId>
accountIdstringรหัสบัญชีเสริมสำหรับช่องทางที่รองรับหลายบัญชี เมื่อกำหนด target: "last" รหัสบัญชีจะใช้กับช่องทางล่าสุดที่ถูกระบุ หากช่องทางนั้นรองรับบัญชี มิฉะนั้นระบบจะไม่สนใจค่านี้ หากรหัสบัญชีไม่ตรงกับบัญชีที่กำหนดค่าไว้สำหรับช่องทางที่ถูกระบุ ระบบจะข้ามการส่ง
promptstringแทนที่เนื้อหาพรอมต์เริ่มต้น (ไม่ผสานรวม)
includeSystemPromptSectionbooleandefault: trueกำหนดว่าจะแทรกส่วน ## Heartbeats ของพรอมต์ระบบสำหรับเอเจนต์เริ่มต้นหรือไม่ ตั้งค่าเป็น false เพื่อคงพฤติกรรม Heartbeat ขณะทำงาน (รอบเวลา การส่ง และ HEARTBEAT.md) แต่ไม่รวมคำสั่ง Heartbeat ไว้ในพรอมต์ระบบของเอเจนต์
ackMaxCharsnumberdefault: 300จำนวนอักขระสูงสุดที่อนุญาตหลัง HEARTBEAT_OK ก่อนส่ง
suppressToolErrorWarningsbooleanเมื่อเป็นจริง จะระงับเพย์โหลดคำเตือนข้อผิดพลาดของเครื่องมือระหว่างการทำงานของ Heartbeat
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>) หรือglobalเมื่อsession.scope = "global"ตั้งค่าsessionเพื่อแทนที่ด้วยเซสชันของช่องทางที่ระบุ (Discord/WhatsApp/ฯลฯ) sessionมีผลเฉพาะต่อบริบทการทำงาน ส่วนการส่งควบคุมด้วยtargetและto- หากต้องการส่งไปยังช่องทาง/ผู้รับที่ระบุ ให้ตั้งค่า
target+toเมื่อใช้target: "last"การส่งจะใช้ช่องทางภายนอกล่าสุดของเซสชันนั้น - โดยค่าเริ่มต้น การส่ง Heartbeat อนุญาตเป้าหมายแบบโดยตรง/DM ตั้งค่า
directPolicy: "block"เพื่อระงับการส่งไปยังเป้าหมายโดยตรง แต่ยังคงเรียกใช้เทิร์น Heartbeat - หากคิวหลัก เลนของเซสชันเป้าหมาย เลน Cron หรืองาน Cron ที่กำลังทำงานอยู่ไม่ว่าง ระบบจะข้าม Heartbeat และลองใหม่ภายหลัง
- หากตั้งค่า
skipWhenBusy: trueเลนของเอเจนต์ย่อยที่ผูกกับคีย์เซสชันและเลนซ้อนของเอเจนต์นี้จะเลื่อนการทำงานของ Heartbeat ด้วย เลนที่ไม่ว่างของเอเจนต์อื่นจะไม่ทำให้เอเจนต์นี้เลื่อนการทำงาน - หาก
targetไม่สามารถระบุปลายทางภายนอกได้ การทำงานยังคงเกิดขึ้น แต่จะไม่มีการส่งข้อความออก
การมองเห็นและพฤติกรรมการข้าม
- หากปิดใช้งาน
showOk,showAlertsและuseIndicatorทั้งหมด ระบบจะข้ามการทำงานตั้งแต่ต้นด้วยreason=alerts-disabled - หากปิดใช้งานเฉพาะการส่งการแจ้งเตือน OpenClaw ยังสามารถเรียกใช้ Heartbeat อัปเดตการประทับเวลาของงานที่ถึงกำหนด คืนค่าการประทับเวลาไม่ได้ใช้งานของเซสชัน และระงับเพย์โหลดการแจ้งเตือนภายนอก
- หากเป้าหมาย Heartbeat ที่ถูกระบุรองรับสถานะกำลังพิมพ์ OpenClaw จะแสดงสถานะกำลังพิมพ์ขณะที่ Heartbeat ทำงาน โดยใช้เป้าหมายเดียวกับที่ Heartbeat จะส่งผลลัพธ์แชตไป และสามารถปิดใช้งานได้ด้วย
typingMode: "never"
วงจรชีวิตของเซสชันและการตรวจสอบ
- การตอบกลับที่มีเฉพาะ Heartbeat จะไม่ทำให้เซสชันคงอยู่ต่อไป เมตาดาต้า Heartbeat อาจอัปเดตแถวของเซสชัน แต่การหมดอายุเนื่องจากไม่ได้ใช้งานจะใช้
lastInteractionAtจากข้อความจริงล่าสุดของผู้ใช้/ช่องทาง และการหมดอายุรายวันจะใช้sessionStartedAt - ประวัติใน Control UI และ 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: ส่งการตอบรับHEARTBEAT_OKเมื่อโมเดลส่งคืนคำตอบที่มีเฉพาะ OKshowAlerts: ส่งเนื้อหาการแจ้งเตือนเมื่อโมเดลส่งคืนคำตอบที่ไม่ใช่ OKuseIndicator: ปล่อยอีเวนต์ตัวบ่งชี้สำหรับพื้นผิวสถานะของ UI
หากทั้งสามค่าเป็นเท็จ 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 } |
HEARTBEAT.md (ตัวเลือกเสริม)
หากมีไฟล์ HEARTBEAT.md อยู่ในพื้นที่ทำงาน พรอมต์เริ่มต้นจะบอกให้เอเจนต์อ่านไฟล์นี้ ให้มองว่าไฟล์นี้เป็น "รายการตรวจสอบ Heartbeat" ของคุณ ซึ่งควรมีขนาดเล็ก คงที่ และปลอดภัยสำหรับการพิจารณาทุก 30 นาที
ในการทำงานปกติ ระบบจะแทรก HEARTBEAT.md เฉพาะเมื่อเปิดใช้งานคำแนะนำ Heartbeat สำหรับเอเจนต์เริ่มต้น การปิดใช้งานรอบเวลาของ Heartbeat ด้วย 0m หรือการตั้งค่า includeSystemPromptSection: false จะไม่นำไฟล์นี้ไปรวมในบริบทเริ่มต้นตามปกติ
บนชุดควบคุม Codex แบบเนทีฟ เนื้อหาของ HEARTBEAT.md จะไม่ถูกแทรกเข้าไปในเทิร์นเหมือนไฟล์เริ่มต้นอื่น หากไฟล์มีอยู่และมีเนื้อหาที่ไม่ใช่ช่องว่าง หมายเหตุโหมดการทำงานร่วมกันของ Heartbeat จะชี้ให้ Codex ไปยังไฟล์ดังกล่าวและบอกให้อ่านไฟล์ก่อนดำเนินการต่อ
หากมี HEARTBEAT.md แต่แทบไม่มีเนื้อหา (มีเพียงบรรทัดว่าง ความคิดเห็น Markdown/HTML หัวข้อ Markdown เช่น # Heading เครื่องหมายรั้วโค้ด หรือโครงรายการตรวจสอบที่ว่างเปล่า) OpenClaw จะข้ามการทำงานของ Heartbeat เพื่อประหยัดการเรียก API การข้ามดังกล่าวจะรายงานเป็น reason=empty-heartbeat-file หากไม่มีไฟล์ Heartbeat จะยังคงทำงานและโมเดลจะตัดสินใจว่าควรทำอะไร
รักษาไฟล์ให้มีขนาดเล็ก (รายการตรวจสอบหรือข้อความเตือนสั้น ๆ) เพื่อหลีกเลี่ยงไม่ให้พรอมต์มีขนาดใหญ่เกินไป
ตัวอย่าง HEARTBEAT.md:
# รายการตรวจสอบ Heartbeat - ตรวจอย่างรวดเร็ว: มีเรื่องเร่งด่วนในกล่องข้อความหรือไม่?- หากเป็นช่วงกลางวัน ให้ตรวจสอบสถานะเล็กน้อยถ้าไม่มีเรื่องอื่นรอดำเนินการ- หากงานติดขัด ให้จดว่า_ขาดอะไร_ และถาม Peter ในครั้งถัดไปบล็อก tasks:
HEARTBEAT.md ยังรองรับบล็อก tasks: แบบมีโครงสร้างขนาดเล็กสำหรับการตรวจสอบตามช่วงเวลาภายใน Heartbeat เอง
ตัวอย่าง:
tasks: - name: inbox-triage interval: 30m prompt: "ตรวจหาอีเมลที่ยังไม่ได้อ่านและเร่งด่วน แล้วทำเครื่องหมายรายการที่ไวต่อเวลา"- name: calendar-scan interval: 2h prompt: "ตรวจหาการประชุมที่กำลังจะมาถึงซึ่งต้องเตรียมตัวหรือติดตามผล" # คำสั่งเพิ่มเติม - เขียนการแจ้งเตือนให้สั้น- หากไม่มีสิ่งใดต้องดำเนินการหลังตรวจงานที่ถึงกำหนดทั้งหมดแล้ว ให้ตอบ HEARTBEAT_OKพฤติกรรม
- OpenClaw จะแยกวิเคราะห์บล็อก
tasks:และตรวจสอบแต่ละงานตามintervalของงานนั้น - เฉพาะงานที่ถึงกำหนดเท่านั้นที่จะถูกรวมไว้ในพรอมต์ Heartbeat สำหรับรอบนั้น
- หากไม่มีงานถึงกำหนด ระบบจะข้าม Heartbeat ทั้งหมด (
reason=no-tasks-due) เพื่อหลีกเลี่ยงการเรียกโมเดลโดยเปล่าประโยชน์ - เนื้อหาที่ไม่ใช่งานใน
HEARTBEAT.mdจะถูกเก็บไว้และต่อท้ายเป็นบริบทเพิ่มเติมหลังรายการงานที่ถึงกำหนด - การประทับเวลาที่เรียกใช้งานล่าสุดจะจัดเก็บไว้ในสถานะเซสชัน (
heartbeatTaskState) ดังนั้นช่วงเวลาจึงยังคงอยู่หลังการเริ่มระบบใหม่ตามปกติ - การประทับเวลาของงานจะเลื่อนไปข้างหน้าหลังจาก Heartbeat ทำงานผ่านเส้นทางการตอบกลับปกติจนเสร็จสมบูรณ์เท่านั้น การทำงานที่ถูกข้ามด้วย
empty-heartbeat-file/no-tasks-dueจะไม่ทำเครื่องหมายว่างานเสร็จสมบูรณ์
โหมดงานมีประโยชน์เมื่อคุณต้องการใช้ไฟล์ Heartbeat ไฟล์เดียวเก็บการตรวจสอบตามรอบเวลาหลายรายการ โดยไม่ต้องเสียค่าใช้จ่ายสำหรับทุกรายการในทุกรอบ
เอเจนต์สามารถอัปเดต HEARTBEAT.md ได้หรือไม่?
ได้ หากคุณขอให้ดำเนินการ
HEARTBEAT.md เป็นเพียงไฟล์ปกติในพื้นที่ทำงานของเอเจนต์ ดังนั้นคุณสามารถบอกเอเจนต์ (ในแชตปกติ) ได้ดังนี้:
- "อัปเดต
HEARTBEAT.mdเพื่อเพิ่มการตรวจสอบปฏิทินรายวัน" - "เขียน
HEARTBEAT.mdใหม่ให้สั้นลงและมุ่งเน้นการติดตามผลจากกล่องข้อความ"
หากต้องการให้เกิดขึ้นเชิงรุก คุณสามารถใส่บรรทัดที่ชัดเจนในพรอมต์ Heartbeat ได้เช่นกัน เช่น: "หากรายการตรวจสอบล้าสมัย ให้อัปเดต HEARTBEAT.md ด้วยรายการที่ดีกว่า"
การปลุกด้วยตนเอง (ตามคำขอ)
ใช้ openclaw system event เพื่อเพิ่มอีเวนต์ระบบเข้าคิวและเลือกเรียก Heartbeat ทันที:
openclaw system event --text "Check for urgent follow-ups" --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 # แสดงอีเวนต์ Heartbeat ล่าสุดopenclaw system heartbeat enable # เปิดใช้งาน Heartbeatopenclaw system heartbeat disable # ปิดใช้งาน Heartbeatการส่งกระบวนการให้เหตุผล (ตัวเลือกเสริม)
ตามค่าเริ่มต้น Heartbeat จะส่งเฉพาะเพย์โหลด "คำตอบ" สุดท้ายเท่านั้น
หากต้องการความโปร่งใส ให้เปิดใช้งาน:
agents.defaults.heartbeat.includeReasoning: true
เมื่อเปิดใช้งาน Heartbeat จะส่งข้อความแยกต่างหากที่ขึ้นต้นด้วย Thinking ด้วย (มีรูปแบบเดียวกับ /reasoning on) ซึ่งมีประโยชน์เมื่อตัวแทนกำลังจัดการหลายเซสชัน/หลาย codex และคุณต้องการทราบว่าเหตุใดจึงตัดสินใจส่งการแจ้งเตือนถึงคุณ แต่ก็อาจเปิดเผยรายละเอียดภายในมากกว่าที่คุณต้องการ แนะนำให้ปิดไว้ในการแชทกลุ่ม
การคำนึงถึงค่าใช้จ่าย
Heartbeat จะเรียกใช้รอบการทำงานของตัวแทนแบบเต็ม ช่วงเวลาที่สั้นลงจะใช้โทเค็นมากขึ้น วิธีลดค่าใช้จ่าย:
- ใช้
isolatedSession: trueเพื่อหลีกเลี่ยงการส่งประวัติการสนทนาทั้งหมด (ลดจากประมาณ 100K โทเค็นเหลือประมาณ 2–5K ต่อการเรียกใช้) - ใช้
lightContext: trueเพื่อจำกัดไฟล์เริ่มต้นให้เหลือเพียงHEARTBEAT.md - ตั้งค่า
modelที่มีราคาถูกกว่า (เช่นollama/llama3.2:1b) - ทำให้
HEARTBEAT.mdมีขนาดเล็ก - ใช้
target: "none"หากต้องการเพียงอัปเดตสถานะภายใน
บริบทล้นหลังจาก Heartbeat
Heartbeat จะคงโมเดลรันไทม์ปัจจุบันของเซสชันที่ใช้ร่วมกันไว้หลังจากการเรียกใช้เสร็จสิ้น ดังนั้น Heartbeat ที่สลับเซสชันไปใช้โมเดลภายในเครื่องที่เล็กกว่า (ตัวอย่างเช่น โมเดล Ollama ที่มีหน้าต่างบริบท 32k) อาจทำให้โมเดลดังกล่าวยังคงถูกใช้ในรอบถัดไปของเซสชันหลัก หากรอบถัดไปนั้นรายงานว่าบริบทล้น และโมเดลรันไทม์ล่าสุดของเซสชันตรงกับ heartbeat.model ที่กำหนดไว้ ข้อความกู้คืนของ OpenClaw จะระบุว่าการที่โมเดล Heartbeat ค้างมาใช้ต่อเป็นสาเหตุที่เป็นไปได้ และจะแนะนำวิธีแก้ไข
เพื่อหลีกเลี่ยงปัญหานี้ ให้ใช้ isolatedSession: true เพื่อเรียกใช้ Heartbeat ในเซสชันใหม่ (อาจใช้ร่วมกับ lightContext: true เพื่อให้พรอมต์มีขนาดเล็กที่สุด) หรือเลือกโมเดล Heartbeat ที่มีหน้าต่างบริบทใหญ่เพียงพอสำหรับเซสชันที่ใช้ร่วมกัน
เนื้อหาที่เกี่ยวข้อง
- ระบบอัตโนมัติ - ภาพรวมกลไกระบบอัตโนมัติทั้งหมด
- งานเบื้องหลัง - วิธีติดตามงานที่ทำงานแยกออกมา
- เขตเวลา - ผลของเขตเวลาต่อการกำหนดเวลา Heartbeat
- การแก้ไขปัญหา - การแก้ไขข้อบกพร่องของระบบอัตโนมัติ