Heartbeat(Gateway 閘道器)
Heartbeat vs Cron? 請參考 Cron vs Heartbeat,了解各自的適用時機。Heartbeat 會在主工作階段中執行 週期性的代理程式回合,讓模型能在不造成訊息轟炸的情況下,主動浮現需要注意的事項。 疑難排解:/automation/troubleshooting
快速開始(初學者)
- 保持 Heartbeat 啟用(預設為
30m,或在 Anthropic OAuth/setup-token 情況下為1h),或設定你自己的節奏。 -
- 在代理的工作區建立一個精簡的
HEARTBEAT.md檢查清單(選用但建議)。
- 在代理的工作區建立一個精簡的
- 決定 Heartbeat 訊息要送到哪裡(預設為
target: "last")。 - 選用:啟用 Heartbeat 推理內容傳遞,以提高透明度。
- 選用:限制 Heartbeat 僅在活躍時段執行(本地時間)。
7. 預設值
- 間隔:
30m(或當偵測到 Anthropic OAuth/setup-token 為驗證模式時為1h)。 間隔:30m(若偵測到 Anthropic OAuth/setup-token 驗證模式,則為1h)。設定agents.defaults.heartbeat.every或每個代理程式的agents.list[].heartbeat.every;使用0m可停用。 間隔:30m(若偵測到 Anthropic OAuth/setup-token 驗證模式,則為1h)。設定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. - 心跳提示會逐字作為使用者訊息送出。 10. 系統提示包含「Heartbeat」章節,且此次執行會在內部被標記。
- Active hours (
heartbeat.activeHours) are checked in the configured timezone. 在視窗之外,心跳會被略過,直到下一次進入視窗內的 tick。
Heartbeat 提示詞的用途
- 預設提示刻意設計為寬泛:
- 背景任務:「Consider outstanding tasks」會促使代理程式檢視後續事項(收件匣、行事曆、提醒、佇列中的工作),並浮現任何緊急項目。
- 人類狀態檢查:「Checkup sometimes on your human during day time」會促使偶爾發送輕量的「需要幫忙嗎?」訊息,並透過你設定的本地時區避免夜間干擾(見 /concepts/timezone)。
agents.defaults.heartbeat.prompt(或 agents.list[].heartbeat.prompt)設為自訂內容(逐字送出)。
回應合約
- 若沒有需要注意的事項,請回覆
HEARTBEAT_OK。 - 在 Heartbeat 執行期間,OpenClaw 會在回覆 開頭或結尾 出現
HEARTBEAT_OK時,將其視為 ack。該權杖會被移除,且若剩餘內容 ≤ackMaxChars(預設:300),則整則回覆會被丟棄。 14. 會移除權杖,且若剩餘內容 ≤ackMaxChars(預設:300),回覆將被丟棄。 - 若
HEARTBEAT_OK出現在回覆 中間,則不會被特殊處理。 - 若為警示訊息,請勿 包含
HEARTBEAT_OK;僅回傳警示文字。
HEARTBEAT_OK,會被移除並記錄;僅包含 HEARTBEAT_OK 的訊息會被丟棄。
設定
Scope and precedence
agents.defaults.heartbeat設定全域 Heartbeat 行為。agents.list[].heartbeat會疊加在其上;若任何代理程式具有heartbeat區塊,則 只有那些代理程式 會執行 Heartbeat。channels.defaults.heartbeat設定所有頻道的可見度預設值。channels.<channel>.heartbeat覆寫頻道預設值。channels.<channel>.accounts.<id>.heartbeat(多帳號頻道)覆寫每個頻道的設定。
每代理程式 Heartbeat
若任何agents.list[] 項目包含 heartbeat 區塊,則 只有那些代理程式
會執行 Heartbeat。每代理程式的區塊會疊加在 agents.defaults.heartbeat 之上
(因此你可以先設定共用預設,再針對個別代理程式覆寫)。 16. 每個代理的區塊會疊加在 agents.defaults.heartbeat 之上(因此可一次設定共用預設,並為各代理覆寫)。
範例:兩個代理程式,只有第二個代理程式執行 Heartbeat。
活躍時段範例
將 Heartbeat 限制在特定時區的上班時段:多帳號範例
在 Telegram 等多帳號頻道上,使用accountId 指定特定帳號:
19. 欄位說明
every:Heartbeat 間隔(時間長度字串;預設單位 = 分鐘)。model:Heartbeat 執行時的選用模型覆寫(provider/model)。includeReasoning:啟用時,若可用,會同時傳遞獨立的Reasoning:訊息(格式與/reasoning on相同)。session:Heartbeat 執行的選用工作階段金鑰。main(預設):代理程式主工作階段。- 明確的工作階段金鑰(從
openclaw sessions --json或 sessions CLI 複製)。
target:last(預設):傳遞到最後使用的外部頻道。- 明確指定頻道:
whatsapp/telegram/discord/googlechat/slack/msteams/signal/imessage。 none:執行 Heartbeat,但 不進行 外部傳遞。
to:選用的收件者覆寫(頻道專屬 ID,例如 WhatsApp 的 E.164 或 Telegram 聊天 ID)。-
accountId:多帳號通道的選用帳號 ID。accountId:多帳號通道的選用帳號 ID。accountId:多帳號頻道的選用帳號 ID。當target: "last"時,帳號 ID 會套用到解析後的最後一個頻道(若該頻道支援帳號);否則會被忽略。若帳號 ID 與解析後頻道中已設定的帳號不符,則會略過傳遞。 If the account id does not match a configured account for the resolved channel, delivery is skipped. If the account id does not match a configured account for the resolved channel, delivery is skipped.
-
prompt:覆寫預設提示內容(不合併)。
ackMaxChars:在HEARTBEAT_OK之後允許傳遞的最大字元數。activeHours:將 Heartbeat 執行限制在時間視窗內。物件包含start(HH:MM,含)、end(HH:MM,不含;允許使用24:00作為一天結束),以及選用的timezone。 24. 物件包含start(HH:MM,含)、end(HH:MM,不含;允許24:00作為一天結束),以及選用的timezone。- 省略或
"user":若有設定,使用你的agents.defaults.userTimezone,否則回退至主機系統時區。 "local":永遠使用主機系統時區。- 任何 IANA 識別碼(例如
America/New_York):直接使用;若無效,則回退至上述"user"行為。 - 在活躍視窗之外,Heartbeat 會被略過,直到下一次落在視窗內的 tick。
- 省略或
傳遞行為
- Heartbeat 預設在代理程式的主工作階段中執行(
agent:<id>:<mainKey>), 或在session.scope = "global"時使用global。設定session可覆寫為 特定頻道的工作階段(Discord/WhatsApp 等)。 25. 設定session以覆寫為特定通道的工作階段(Discord/WhatsApp 等)。 session只影響執行脈絡;實際傳遞由target與to控制。- To deliver to a specific channel/recipient, set
target+to. 若要傳遞到特定頻道/收件者,請設定target+to。搭配target: "last"時,會使用該工作階段最後的外部頻道進行傳遞。 - 若主佇列繁忙,Heartbeat 會被略過並稍後重試。
- 若
target解析後沒有外部目的地,執行仍會發生,但不會送出對外訊息。 - 僅限 Heartbeat 的回覆 不會 保持工作階段存活;最後的
updatedAt會被還原,因此閒置到期行為維持正常。
可見度控制
By default,HEARTBEAT_OK acknowledgments are suppressed while alert content is
delivered. 你可以依通道或依帳號調整此行為:
各旗標的作用
showOk:當模型僅回傳 OK 回覆時,送出HEARTBEAT_OK確認訊息。showAlerts:當模型回傳非 OK 回覆時,送出警示內容。useIndicator:發出指示事件,用於 UI 狀態呈現。
每通道 vs 每帳號的範例
常見模式
| 目標 | 設定 |
|---|---|
| 預設行為(靜默 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 檔案,預設提示會指示代理讀取它。 32. 把它視為你的「心跳檢查清單」:小巧、穩定,且可每 30 分鐘安全地包含。
若 HEARTBEAT.md 存在但實質上是空的(僅包含空白行與像 # Heading 這樣的 Markdown 標題),OpenClaw 會略過 Heartbeat 執行以節省 API 呼叫。
若檔案不存在,Heartbeat 仍會執行,由模型自行決定要做什麼。
若檔案不存在,心跳仍會執行,並由模型決定要做什麼。
若檔案不存在,心跳仍會執行,並由模型決定要做什麼。
保持精簡(短清單或提醒)以避免提示膨脹。
HEARTBEAT.md 範例:
代理程式可以更新 HEARTBEAT.md 嗎?
可以 — 只要你要求它。HEARTBEAT.md 只是代理程式工作區中的一般檔案,因此你可以在一般對話中告訴代理程式,例如:
- 「更新
HEARTBEAT.md,加入每日行事曆檢查。」 - 「重寫
HEARTBEAT.md,讓它更精簡並專注於收件匣後續。」
HEARTBEAT.md — 它會成為提示詞脈絡的一部分。
手動喚醒(即時)
你可以佇列一個系統事件,並立即觸發 Heartbeat:heartbeat,手動喚醒會立即執行每一個代理程式的 Heartbeat。
使用 --mode next-heartbeat 可等待下一個排程 tick。
推理內容傳遞(選用)
- 預設情況下,心跳僅投遞最終的「答案」負載。
agents.defaults.heartbeat.includeReasoning: true
Reasoning: 為前綴的獨立訊息(外觀與 /reasoning on 相同)。 36. 當代理管理多個工作階段/法典且你想知道它為何決定 ping 你時,這會很有用——但也可能洩漏比你期望更多的內部細節。 7. 在群組聊天中,建議保持關閉。
成本考量
心跳會執行完整的代理回合。 39. 較短的間隔會消耗更多權杖。 40. 保持HEARTBEAT.md 精簡,並在只需要內部狀態更新時,考慮使用較便宜的 model 或 target: "none"。