Gateway
Heartbeat
Heartbeat เรียกใช้ รอบการทำงานของเอเจนต์เป็นระยะ ในเซสชันหลัก เพื่อให้โมเดลสามารถแจ้งสิ่งที่ต้องให้ความสนใจได้โดยไม่ส่งข้อความรบกวนคุณมากเกินไป
Heartbeat คือรอบการทำงานตามกำหนดเวลาในเซสชันหลัก — มัน ไม่ สร้างระเบียน งานเบื้องหลัง ระเบียนงานมีไว้สำหรับงานที่แยกออกไป (การรัน ACP, เอเจนต์ย่อย, งาน cron แบบแยกโดดเดี่ยว)
การแก้ไขปัญหา: งานตามกำหนดเวลา
เริ่มต้นอย่างรวดเร็ว (ผู้เริ่มต้น)
เลือกความถี่
เปิดใช้ Heartbeat ไว้ (ค่าเริ่มต้นคือ 30m หรือ 1h สำหรับการยืนยันตัวตนด้วย Anthropic OAuth/token รวมถึงการใช้ Claude CLI ซ้ำ) หรือกำหนดความถี่ของคุณเอง
เพิ่ม HEARTBEAT.md (ไม่บังคับ)
สร้างเช็กลิสต์ HEARTBEAT.md ขนาดเล็ก หรือบล็อก tasks: ในพื้นที่ทำงานของเอเจนต์
ตัดสินใจว่าข้อความ Heartbeat ควรส่งไปที่ใด
target: "none" คือค่าเริ่มต้น; ตั้งค่า target: "last" เพื่อส่งต่อไปยังผู้ติดต่อล่าสุด
การปรับแต่งเพิ่มเติม
- เปิดใช้การส่ง reasoning ของ 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 `Reasoning:` message too }, }, },}ค่าเริ่มต้น
- ช่วงเวลา:
30m(หรือ1hเมื่อโหมดการยืนยันตัวตนที่ตรวจพบคือ Anthropic OAuth/token รวมถึงการใช้ Claude CLI ซ้ำ) ตั้งค่า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 จะถูกส่ง ตรงตามตัวอักษร เป็นข้อความของผู้ใช้ พรอมป์ระบบจะมีส่วน "Heartbeat" เฉพาะเมื่อเปิดใช้ Heartbeat สำหรับเอเจนต์เริ่มต้น และการรันถูกทำเครื่องหมายไว้ภายใน
- เมื่อปิดใช้ Heartbeat ด้วย
0mการรันปกติจะไม่รวมHEARTBEAT.mdจากบริบทเริ่มต้นด้วย เพื่อไม่ให้โมเดลเห็นคำสั่งที่มีไว้สำหรับ Heartbeat เท่านั้น - ชั่วโมงที่ใช้งานอยู่ (
heartbeat.activeHours) จะถูกตรวจสอบตามเขตเวลาที่กำหนดค่าไว้อยู่ นอกช่วงเวลาดังกล่าว Heartbeat จะถูกข้ามจนกว่าจะถึง tick ถัดไปภายในช่วงเวลา - 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สำหรับการแจ้งเตือน เมื่อมีอยู่ การตอบกลับแบบมีโครงสร้างจากเครื่องมือจะมีความสำคัญเหนือ fallback แบบข้อความ - ระหว่างการรัน Heartbeat, OpenClaw จะถือว่า
HEARTBEAT_OKเป็น ack เมื่อปรากฏที่ จุดเริ่มต้นหรือจุดสิ้นสุด ของคำตอบ โทเค็นจะถูกตัดออก และคำตอบจะถูกทิ้งหากเนื้อหาที่เหลือมีความยาว ≤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 Reasoning: 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.", 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 โมงเช้าหรือหลัง 4 ทุ่มตามเวลาตะวันออก) 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", // 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เมื่อเปิดใช้งาน ให้ส่งข้อความ Reasoning: แยกต่างหากด้วยเมื่อมีให้ใช้งาน (รูปแบบเดียวกับ /reasoning on)
lightContextbooleandefault: falseเมื่อเป็น true การรัน Heartbeat จะใช้บริบทบูตสแตรปแบบเบา และเก็บเฉพาะ HEARTBEAT.md จากไฟล์บูตสแตรปของเวิร์กสเปซ
isolatedSessionbooleandefault: falseเมื่อเป็น true Heartbeat แต่ละครั้งจะรันในเซสชันใหม่โดยไม่มีประวัติการสนทนาก่อนหน้า ใช้รูปแบบการแยกเดียวกับ Cron sessionTarget: "isolated" ลดต้นทุนโทเคนต่อ Heartbeat ได้อย่างมาก ใช้ร่วมกับ lightContext: true เพื่อประหยัดสูงสุด การกำหนดเส้นทางการส่งมอบยังคงใช้บริบทของเซสชันหลัก
skipWhenBusybooleandefault: falseเมื่อเป็น true การรัน Heartbeat จะเลื่อนออกไปบนเลนที่ยุ่งเพิ่มเติมของเอเจนต์นั้น ได้แก่ subagent ของตัวเองที่ผูกกับคีย์เซสชัน หรืองานคำสั่งแบบซ้อน เลน Cron จะเลื่อน Heartbeat เสมอ แม้ไม่มีแฟล็กนี้ เพื่อให้โฮสต์โมเดลภายในเครื่องไม่รันพรอมป์ Cron และ Heartbeat พร้อมกัน
sessionstringคีย์เซสชันแบบไม่บังคับสำหรับการรัน Heartbeat
main(ค่าเริ่มต้น): เซสชันหลักของเอเจนต์- คีย์เซสชันที่ระบุอย่างชัดเจน (คัดลอกจาก
openclaw sessions --jsonหรือ sessions CLI) - รูปแบบคีย์เซสชัน: ดู Sessions และ Groups
targetstringlast: ส่งไปยังช่องทางภายนอกที่ใช้ล่าสุด- ช่องทางที่ระบุอย่างชัดเจน: ช่องทางหรือ id ของ 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แทนที่เนื้อหาพรอมต์เริ่มต้น (ไม่รวมเข้าด้วยกัน)
ackMaxCharsnumberdefault: 300จำนวนอักขระสูงสุดที่อนุญาตหลัง HEARTBEAT_OK ก่อนส่งมอบ
suppressToolErrorWarningsbooleanเมื่อเป็น true จะระงับเพย์โหลดคำเตือนข้อผิดพลาดของเครื่องมือระหว่างการรัน heartbeat
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 จะถูกข้ามจนถึง tick ถัดไปที่อยู่ภายในหน้าต่าง
พฤติกรรมการส่งมอบ
การกำหนดเส้นทางเซสชันและเป้าหมาย
- โดยค่าเริ่มต้น 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 job ที่ใช้งานอยู่กำลังยุ่ง heartbeat จะถูกข้ามและลองใหม่ภายหลัง
- หาก
skipWhenBusy: trueเซสชัน keyed ตาม session ของเอเจนต์นี้และเลนซ้อนกันจะเลื่อนการรัน heartbeat ด้วย เลนที่ยุ่งของเอเจนต์อื่นจะไม่เลื่อนเอเจนต์นี้ - หาก
targetresolve แล้วไม่มีปลายทางภายนอก การรันยังคงเกิดขึ้นแต่ไม่มีการส่งข้อความขาออก
การมองเห็นและพฤติกรรมการข้าม
- หาก
showOk,showAlerts, และuseIndicatorถูกปิดใช้งานทั้งหมด การรันจะถูกข้ามตั้งแต่ต้นเป็นreason=alerts-disabled - หากปิดใช้งานเฉพาะการส่งมอบการแจ้งเตือน OpenClaw ยังสามารถรัน heartbeat, อัปเดต timestamp ของงานที่ครบกำหนด, คืนค่า timestamp ว่างของเซสชัน และระงับเพย์โหลดการแจ้งเตือนออกภายนอกได้
- หากเป้าหมาย heartbeat ที่ resolve แล้วรองรับสถานะกำลังพิมพ์ OpenClaw จะแสดงสถานะกำลังพิมพ์ขณะที่การรัน heartbeat ทำงานอยู่ ซึ่งใช้เป้าหมายเดียวกับที่ heartbeat จะส่งเอาต์พุตแชทไปหา และจะถูกปิดใช้งานด้วย
typingMode: "never"
วงจรชีวิตเซสชันและการตรวจสอบ
- การตอบกลับเฉพาะ heartbeat ไม่ ทำให้เซสชันยังคงอยู่ เมตาดาต้า heartbeat อาจอัปเดตแถวเซสชัน แต่การหมดอายุเมื่อว่างจะใช้
lastInteractionAtจากข้อความผู้ใช้/ช่องทางจริงล่าสุด และการหมดอายุรายวันจะใช้sessionStartedAt - ประวัติ Control UI และ WebChat ซ่อนพรอมต์ heartbeat และการตอบรับที่เป็น OK เท่านั้น transcript เซสชันพื้นฐานยังสามารถมีรอบเหล่านั้นเพื่อการตรวจสอบ/เล่นซ้ำได้
- งานเบื้องหลัง แบบแยกออกสามารถ enqueue เหตุการณ์ระบบและปลุก heartbeat เมื่อเซสชันหลักควรรับรู้บางอย่างอย่างรวดเร็ว การปลุกนั้นไม่ได้ทำให้การรัน heartbeat กลายเป็นงานเบื้องหลัง
การควบคุมการมองเห็น
โดยค่าเริ่มต้น การตอบรับ HEARTBEAT_OK จะถูกระงับขณะที่เนื้อหาการแจ้งเตือนถูกส่งมอบ คุณสามารถปรับค่านี้ต่อช่องทางหรือต่อบัญชีได้:
channels: defaults: heartbeat: showOk: false # Hide HEARTBEAT_OK (default) showAlerts: true # Show alert messages (default) useIndicator: true # Emit indicator events (default) telegram: heartbeat: showOk: true # Show OK acknowledgments on Telegram whatsapp: accounts: work: heartbeat: showAlerts: false # Suppress alert delivery for this accountลำดับความสำคัญ: ต่อบัญชี → ต่อช่องทาง → ค่าเริ่มต้นของช่องทาง → ค่าเริ่มต้นในตัว
แต่ละ flag ทำอะไร
showOk: ส่งการตอบรับHEARTBEAT_OKเมื่อโมเดลส่งคืนการตอบกลับที่เป็น OK เท่านั้นshowAlerts: ส่งเนื้อหาการแจ้งเตือนเมื่อโมเดลส่งคืนการตอบกลับที่ไม่ใช่ OKuseIndicator: emit เหตุการณ์ indicator สำหรับพื้นผิวสถานะ UI
หากทั้ง สามอย่าง เป็น false OpenClaw จะข้ามการรัน heartbeat ทั้งหมด (ไม่มีการเรียกโมเดล)
ตัวอย่างต่อช่องทางเทียบกับต่อบัญชี
channels: defaults: heartbeat: showOk: false showAlerts: true useIndicator: true slack: heartbeat: showOk: true # all Slack accounts accounts: ops: heartbeat: showAlerts: false # suppress alerts for the ops account only telegram: heartbeat: showOk: trueรูปแบบที่พบบ่อย
| เป้าหมาย | Config |
|---|---|
| พฤติกรรมเริ่มต้น (OK แบบเงียบ, เปิดการแจ้งเตือน) | (ไม่จำเป็นต้องมี config) |
| เงียบทั้งหมด (ไม่มีข้อความ, ไม่มี indicator) | channels.defaults.heartbeat: { showOk: false, showAlerts: false, useIndicator: false } |
| เฉพาะ indicator (ไม่มีข้อความ) | channels.defaults.heartbeat: { showOk: false, showAlerts: false, useIndicator: true } |
| OK เฉพาะในช่องทางเดียว | channels.telegram.heartbeat: { showOk: true } |
HEARTBEAT.md (ไม่บังคับ)
หากมีไฟล์ HEARTBEAT.md อยู่ใน workspace พรอมต์เริ่มต้นจะบอกให้เอเจนต์อ่านไฟล์นั้น ให้คิดว่าไฟล์นี้เป็น "เช็กลิสต์ heartbeat" ของคุณ: เล็ก เสถียร และปลอดภัยที่จะรวมทุก 30 นาที
ในการรันปกติ HEARTBEAT.md จะถูก inject เฉพาะเมื่อเปิดใช้งานคำแนะนำ heartbeat สำหรับเอเจนต์เริ่มต้นเท่านั้น การปิดใช้งานจังหวะ heartbeat ด้วย 0m หรือการตั้งค่า includeSystemPromptSection: false จะละไว้จากบริบท bootstrap ปกติ
หาก HEARTBEAT.md มีอยู่แต่แทบจะว่างเปล่า (มีเฉพาะบรรทัดว่างและหัวข้อ markdown เช่น # Heading) OpenClaw จะข้ามการรัน heartbeat เพื่อประหยัดการเรียก API การข้ามนั้นจะถูกรายงานเป็น reason=empty-heartbeat-file หากไฟล์หายไป heartbeat ยังคงรัน และโมเดลจะตัดสินใจว่าจะทำอะไร
ทำให้เล็กมาก (เช็กลิสต์สั้น ๆ หรือการเตือนความจำ) เพื่อหลีกเลี่ยงพรอมต์บวม
ตัวอย่าง HEARTBEAT.md:
# Heartbeat checklist - Quick scan: anything urgent in inboxes?- If it's daytime, do a lightweight check-in if nothing else is pending.- If a task is blocked, write down _what is missing_ and ask Peter next time.บล็อก tasks:
HEARTBEAT.md ยังรองรับบล็อก tasks: แบบมีโครงสร้างขนาดเล็กสำหรับการตรวจสอบตามช่วงเวลาภายใน heartbeat เอง
ตัวอย่าง:
tasks: - name: inbox-triage interval: 30m prompt: "Check for urgent unread emails and flag anything time sensitive."- name: calendar-scan interval: 2h prompt: "Check for upcoming meetings that need prep or follow-up." # Additional instructions - Keep alerts short.- If nothing needs attention after all due tasks, reply HEARTBEAT_OK.พฤติกรรม
- OpenClaw parse บล็อก
tasks:และตรวจสอบแต่ละงานกับintervalของตัวเอง - เฉพาะงานที่ ครบกำหนด เท่านั้นที่จะรวมอยู่ในพรอมต์ heartbeat สำหรับ tick นั้น
- หากไม่มีงานที่ครบกำหนด heartbeat จะถูกข้ามทั้งหมด (
reason=no-tasks-due) เพื่อหลีกเลี่ยงการเรียกโมเดลที่สูญเปล่า - เนื้อหาที่ไม่ใช่งานใน
HEARTBEAT.mdจะถูกเก็บไว้และผนวกเป็นบริบทเพิ่มเติมหลังรายการงานที่ครบกำหนด - timestamp การรันล่าสุดของงานจะถูกเก็บในสถานะเซสชัน (
heartbeatTaskState) ดังนั้นช่วงเวลาจะยังคงอยู่หลังการรีสตาร์ทตามปกติ - timestamp ของงานจะถูกเลื่อนไปข้างหน้าเฉพาะหลังจากการรัน heartbeat เสร็จสิ้นเส้นทางการตอบกลับปกติเท่านั้น การรันที่ถูกข้ามแบบ
empty-heartbeat-file/no-tasks-dueจะไม่ทำเครื่องหมายว่างานเสร็จสมบูรณ์
โหมดงานมีประโยชน์เมื่อคุณต้องการให้ไฟล์ heartbeat เดียวเก็บการตรวจสอบเป็นระยะหลายรายการ โดยไม่ต้องจ่ายสำหรับทั้งหมดในทุก tick
เอเจนต์สามารถอัปเดต HEARTBEAT.md ได้ไหม?
ได้ — หากคุณขอให้ทำ
HEARTBEAT.md เป็นเพียงไฟล์ปกติใน workspace ของเอเจนต์ ดังนั้นคุณสามารถบอกเอเจนต์ (ในแชทปกติ) ได้ เช่น:
- "Update
HEARTBEAT.mdto add a daily calendar check." - "Rewrite
HEARTBEAT.mdso it's shorter and focused on inbox follow-ups."
หากคุณต้องการให้สิ่งนี้เกิดขึ้นเชิงรุก คุณสามารถใส่บรรทัดที่ชัดเจนในพรอมต์ heartbeat ของคุณได้ด้วย เช่น: "If the checklist becomes stale, update HEARTBEAT.md with a better one."
การปลุกด้วยตนเอง (ตามต้องการ)
คุณสามารถ enqueue เหตุการณ์ระบบและทริกเกอร์ heartbeat ทันทีด้วย:
openclaw system event --text "Check for urgent follow-ups" --mode nowหากมีเอเจนต์หลายตัวที่กำหนดค่า heartbeat ไว้ การปลุกด้วยตนเองจะรัน heartbeat ของเอเจนต์เหล่านั้นแต่ละตัวทันที
ใช้ --mode next-heartbeat เพื่อรอ tick ที่กำหนดเวลาไว้ถัดไป
การส่งมอบ reasoning (ไม่บังคับ)
โดยค่าเริ่มต้น heartbeat จะส่งมอบเฉพาะเพย์โหลด "คำตอบ" สุดท้ายเท่านั้น
หากคุณต้องการความโปร่งใส ให้เปิดใช้งาน:
agents.defaults.heartbeat.includeReasoning: true
เมื่อเปิดใช้งาน heartbeat จะส่งมอบข้อความแยกต่างหากที่ขึ้นต้นด้วย Reasoning: ด้วย (รูปแบบเดียวกับ /reasoning on) สิ่งนี้มีประโยชน์เมื่อเอเจนต์จัดการหลายเซสชัน/codexes และคุณต้องการเห็นว่าทำไมเอเจนต์จึงตัดสินใจ ping คุณ — แต่อาจรั่วไหลรายละเอียดภายในมากกว่าที่คุณต้องการได้เช่นกัน แนะนำให้ปิดไว้ในแชทกลุ่ม
การตระหนักถึงต้นทุน
heartbeat รันรอบเอเจนต์เต็มรูปแบบ ช่วงเวลาที่สั้นลงใช้ token มากขึ้น เพื่อลดต้นทุน:
- ใช้
isolatedSession: trueเพื่อหลีกเลี่ยงการส่งประวัติการสนทนาทั้งหมด (~100K token ลดลงเหลือ ~2-5K ต่อการรัน) - ใช้
lightContext: trueเพื่อจำกัดไฟล์ bootstrap ให้เหลือเพียงHEARTBEAT.md - ตั้งค่า
modelที่ถูกกว่า (เช่นollama/llama3.2:1b) - ทำให้
HEARTBEAT.mdเล็ก - ใช้
target: "none"หากคุณต้องการเฉพาะการอัปเดตสถานะภายใน
บริบทล้นหลัง heartbeat
หาก heartbeat ก่อนหน้านี้ทิ้งเซสชันเดิมไว้บนโมเดล local ที่เล็กกว่า เช่น โมเดล Ollama ที่มีหน้าต่าง 32k และรอบเซสชันหลักถัดไปรายงานว่าบริบทล้น ให้รีเซ็ตโมเดล runtime ของเซสชันกลับไปเป็นโมเดลหลักที่กำหนดค่าไว้ ข้อความรีเซ็ตของ OpenClaw จะระบุเรื่องนี้เมื่อโมเดล runtime ล่าสุดตรงกับ heartbeat.model ที่กำหนดค่าไว้
heartbeat ปัจจุบันจะรักษาโมเดล runtime เดิมของเซสชันที่แชร์ไว้หลังจากการรันเสร็จสมบูรณ์ คุณยังสามารถใช้ isolatedSession: true เพื่อรัน heartbeat ในเซสชันใหม่ รวมกับ lightContext: true เพื่อให้พรอมต์เล็กที่สุด หรือเลือกโมเดล heartbeat ที่มีหน้าต่างบริบทใหญ่พอสำหรับเซสชันที่แชร์
ที่เกี่ยวข้อง
- Automation — กลไก Automation ทั้งหมดในภาพรวม
- งานเบื้องหลัง — วิธีติดตามงานที่แยกออก
- เขตเวลา — วิธีที่เขตเวลามีผลต่อการกำหนดเวลา heartbeat
- การแก้ไขปัญหา — การดีบักปัญหา Automation