Gateway
Heartbeat
Heartbeat เรียกใช้ รอบการทำงานของเอเจนต์เป็นระยะ ในเซสชันหลัก เพื่อให้โมเดลแจ้งสิ่งที่ต้องดำเนินการได้โดยไม่ส่งข้อความรบกวนมากเกินไป
Heartbeat คือรอบการทำงานตามกำหนดเวลาในเซสชันหลัก โดย ไม่ สร้างระเบียน งานเบื้องหลัง ระเบียนงานมีไว้สำหรับงานที่แยกออกไปทำต่างหาก (การเรียกใช้ ACP, เอเจนต์ย่อย, งาน cron แบบแยกส่วน)
การแก้ไขปัญหา: งานตามกำหนดเวลา
เริ่มต้นอย่างรวดเร็ว (สำหรับผู้เริ่มต้น)
เลือกความถี่
เปิดใช้ Heartbeat ไว้ (ค่าเริ่มต้นคือ 30m หรือ 1h เมื่อกำหนดค่าการยืนยันตัวตนด้วย Anthropic OAuth/โทเค็น รวมถึงการใช้ 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", // ส่งไปยังผู้ติดต่อล่าสุดอย่างชัดเจน (ค่าเริ่มต้นคือ "none") directPolicy: "allow", // ค่าเริ่มต้น: อนุญาตเป้าหมายแบบตรง/DM; ตั้งเป็น "block" เพื่อระงับ lightContext: true, // ไม่บังคับ: แทรกเฉพาะ HEARTBEAT.md จากไฟล์เริ่มต้น isolatedSession: true, // ไม่บังคับ: ใช้เซสชันใหม่ในแต่ละครั้ง (ไม่มีประวัติการสนทนา) skipWhenBusy: true, // ไม่บังคับ: เลื่อนด้วยเมื่อเอเจนต์ย่อยหรือเลนซ้อนของเอเจนต์นี้ไม่ว่าง // activeHours: { start: "08:00", end: "24:00" }, // includeReasoning: true, // ไม่บังคับ: ส่งข้อความ `Thinking` แยกต่างหากด้วย }, }, },}ค่าเริ่มต้น
- ช่วงเวลา:
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
พรอมต์เริ่มต้นตั้งใจให้ครอบคลุมกว้าง:
- งานเบื้องหลัง: "พิจารณางานที่ยังค้างอยู่" กระตุ้นให้เอเจนต์ตรวจสอบสิ่งที่ต้องติดตาม (กล่องจดหมาย ปฏิทิน การแจ้งเตือน งานในคิว) และแจ้งสิ่งเร่งด่วน
- การสอบถามผู้ใช้: "สอบถามผู้ใช้ของคุณเป็นครั้งคราวในช่วงกลางวัน" กระตุ้นให้ส่งข้อความสั้น ๆ เช่น "มีอะไรให้ช่วยไหม" เป็นครั้งคราว แต่หลีกเลี่ยงการรบกวนในเวลากลางคืนโดยใช้เขตเวลาท้องถิ่นที่กำหนดค่าไว้ (ดู เขตเวลา)
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_respondที่มีความหมายพร้อมnotify: falseจะยังคงเงียบ แต่จะถูกจดจำเป็นบริบทภายในแบบมีขอบเขตสำหรับรอบการทำงานของผู้ใช้ครั้งถัดไปในเซสชันนั้น การตอบรับno_changeและการแจ้งเตือนที่มองเห็นได้จะไม่ถูกจัดเก็บด้วยวิธีนี้ - ระหว่างการเรียกใช้ Heartbeat OpenClaw จะถือว่า
HEARTBEAT_OKเป็นการตอบรับเมื่อปรากฏที่ จุดเริ่มต้นหรือจุดสิ้นสุด ของคำตอบ โทเค็นจะถูกนำออกและคำตอบจะถูกละทิ้งหากเนื้อหาที่เหลือมีความยาว ≤ackMaxChars(ค่าเริ่มต้น: 300) - หาก
HEARTBEAT_OKปรากฏที่ กลาง คำตอบ ระบบจะไม่ปฏิบัติต่อค่านั้นเป็นกรณีพิเศษ - สำหรับการแจ้งเตือน ห้าม ใส่
HEARTBEAT_OKให้ส่งคืนเฉพาะข้อความแจ้งเตือน
นอกการทำงานของ Heartbeat ค่า HEARTBEAT_OK ที่หลงเหลืออยู่ตรงจุดเริ่มต้น/จุดสิ้นสุดของข้อความจะถูกนำออกและบันทึกลงล็อก ส่วนข้อความที่มีเพียง HEARTBEAT_OK จะถูกละทิ้ง
การกำหนดค่า
{ agents: { defaults: { heartbeat: { every: "30m", // ค่าเริ่มต้น: 30m (0m ปิดใช้) model: "anthropic/claude-opus-4-6", includeReasoning: false, // ค่าเริ่มต้น: false (ส่งข้อความ Thinking แยกต่างหากเมื่อมี) lightContext: false, // ค่าเริ่มต้น: false; true จะเก็บเฉพาะ HEARTBEAT.md จากไฟล์เริ่มต้นในพื้นที่ทำงาน isolatedSession: false, // ค่าเริ่มต้น: false; true จะเรียกใช้ Heartbeat แต่ละครั้งในเซสชันใหม่ (ไม่มีประวัติการสนทนา) skipWhenBusy: false, // ค่าเริ่มต้น: false; true จะรอเลนของเอเจนต์ย่อย/เลนซ้อนของเอเจนต์นี้ด้วย target: "last", // ค่าเริ่มต้น: none | ตัวเลือก: last | none | <channel id> (แกนหลักหรือ Plugin เช่น "imessage") to: "+15551234567", // ไม่บังคับ: แทนที่ค่าตามช่องทาง accountId: "ops-bot", // ไม่บังคับ: รหัสช่องทางแบบหลายบัญชี prompt: "อ่าน HEARTBEAT.md หากมีอยู่ (บริบทพื้นที่ทำงาน) ปฏิบัติตามอย่างเคร่งครัด ห้ามอนุมานหรือกล่าวซ้ำถึงงานเก่าจากแชตก่อนหน้า หากไม่มีสิ่งใดต้องดำเนินการ ให้ตอบ HEARTBEAT_OK", includeSystemPromptSection: true, // ค่าเริ่มต้น: true; false จะละเว้นส่วนพรอมต์ระบบ ## Heartbeats สำหรับเอเจนต์เริ่มต้น ackMaxChars: 300, // จำนวนอักขระสูงสุดที่อนุญาตหลัง 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", // ส่งไปยังผู้ติดต่อล่าสุดอย่างชัดเจน (ค่าเริ่มต้นคือ "none") }, }, list: [ { id: "main", default: true }, { id: "ops", heartbeat: { every: "1h", target: "whatsapp", to: "+15551234567", timeoutSeconds: 45, prompt: "อ่าน HEARTBEAT.md หากมีอยู่ (บริบทพื้นที่ทำงาน) ปฏิบัติตามอย่างเคร่งครัด ห้ามอนุมานหรือกล่าวซ้ำถึงงานเก่าจากแชตก่อนหน้า หากไม่มีสิ่งใดต้องดำเนินการ ให้ตอบ HEARTBEAT_OK", }, }, ], },}ตัวอย่างช่วงเวลาที่ใช้งาน
จำกัด Heartbeat ให้อยู่ในเวลาทำการตามเขตเวลาที่ระบุ:
{ agents: { defaults: { heartbeat: { every: "30m", target: "last", // ส่งไปยังผู้ติดต่อล่าสุดอย่างชัดเจน (ค่าเริ่มต้นคือ "none") activeHours: { start: "09:00", end: "22:00", timezone: "America/New_York", // ไม่บังคับ; ใช้ userTimezone หากตั้งค่าไว้ มิฉะนั้นใช้เขตเวลาของโฮสต์ }, }, }, },}เมื่ออยู่นอกช่วงนี้ (ก่อน 9 นาฬิกาหรือหลัง 22 นาฬิกาตามเวลาตะวันออก) Heartbeat จะถูกข้าม รอบตามกำหนดเวลาถัดไปที่อยู่ภายในช่วงจะทำงานตามปกติ
การตั้งค่าแบบ 24/7
หากต้องการให้ Heartbeat ทำงานตลอดทั้งวัน ให้ใช้รูปแบบใดรูปแบบหนึ่งต่อไปนี้:
- ละเว้น
activeHoursทั้งหมด (ไม่มีข้อจำกัดด้านช่วงเวลา ซึ่งเป็นพฤติกรรมเริ่มต้น) - กำหนดช่วงเต็มวัน:
activeHours: { start: "00:00", end: "24:00" }
ตัวอย่างหลายบัญชี
ใช้ accountId เพื่อระบุบัญชีเฉพาะในช่องทางแบบหลายบัญชี เช่น Telegram:
{ 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)
includeReasoningbooleandefault: falseเมื่อเปิดใช้ จะส่งข้อความ Thinking แยกต่างหากด้วยเมื่อมี (รูปแบบเดียวกับ /reasoning on)
lightContextbooleandefault: falseเมื่อเป็น true การเรียกใช้ Heartbeat จะใช้บริบทเริ่มต้นแบบเบาและเก็บเฉพาะ HEARTBEAT.md จากไฟล์เริ่มต้นในพื้นที่ทำงาน
isolatedSessionbooleandefault: falseเมื่อเป็น true Heartbeat แต่ละครั้งจะทำงานในเซสชันใหม่โดยไม่มีประวัติการสนทนาก่อนหน้า ใช้รูปแบบการแยกส่วนเดียวกับ cron sessionTarget: "isolated" ซึ่งลดค่าใช้จ่ายโทเค็นต่อ Heartbeat ลงอย่างมาก ใช้ร่วมกับ lightContext: true เพื่อประหยัดสูงสุด การกำหนดเส้นทางการส่งยังคงใช้บริบทของเซสชันหลัก
skipWhenBusybooleandefault: falseเมื่อเป็น true การเรียกใช้ 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เมื่อตั้งเป็น true ให้ระงับเพย์โหลดคำเตือนข้อผิดพลาดของเครื่องมือระหว่างการเรียกใช้ 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
หากทั้ง สามค่า เป็น 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 } |
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
- การแก้ไขปัญหา - การดีบักปัญหาระบบอัตโนมัติ