Heartbeat と Cron の違いは? それぞれをいつ使うべきかの指針は、自動化を参照してください。
クイックスタート(初心者向け)
Pick a cadence
Heartbeat を有効のままにします(デフォルトは
30m、または Claude CLI 再利用を含む Anthropic OAuth/token 認証が構成されている場合は 1h)。または、独自の周期を設定します。Decide where heartbeat messages should go
target: "none" がデフォルトです。最後の連絡先へルーティングするには target: "last" を設定します。デフォルト
- 間隔:
30m。Anthropic プロバイダーのデフォルトを適用すると、解決された認証モードが OAuth/token(Claude CLI 再利用を含む)の場合は1hに引き上げられますが、これは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 秒です。より長い Heartbeat 作業には、agents.defaults.heartbeat.timeoutSecondsまたはエージェントごとのagents.list[].heartbeat.timeoutSecondsを設定します。 - Heartbeat プロンプトは、ユーザーメッセージとしてそのまま送信されます。システムプロンプトには、デフォルトエージェントで Heartbeat が有効(かつ
includeSystemPromptSectionがfalseではない)場合にのみ「Heartbeats」セクションが含まれ、実行には内部的にフラグが付けられます。 - Heartbeat が
0mで無効化されている場合、通常の実行でもHEARTBEAT.mdはブートストラップコンテキストから省略されるため、モデルは Heartbeat 専用の指示を見ません。 - アクティブ時間(
heartbeat.activeHours)は、設定されたタイムゾーンで確認されます。ウィンドウ外では、ウィンドウ内の次のティックまで Heartbeat はスキップされます。 - Heartbeat は、Cron 作業がアクティブまたはキューに入っている間、自動的に延期されます。
heartbeat.skipWhenBusy: trueを設定すると、そのエージェント自身のセッションキー付きサブエージェントまたはネストされたコマンドレーンでも延期します。兄弟エージェントは、別のエージェントに進行中のサブエージェント作業があるという理由だけでは、もう一時停止しません。
Heartbeat プロンプトの用途
デフォルトプロンプトは意図的に広めです。- バックグラウンドタスク: 「未処理のタスクを考慮する」は、エージェントにフォローアップ(受信箱、カレンダー、リマインダー、キュー内の作業)を確認させ、緊急のものを浮かび上がらせるための促しです。
- 人間への確認: 「日中にときどき人間の様子を確認する」は、軽い「何か必要ですか?」メッセージを時折促しますが、設定されたローカルタイムゾーン(タイムゾーンを参照)を使うことで夜間の通知乱発を避けます。
agents.defaults.heartbeat.prompt(または agents.list[].heartbeat.prompt)をカスタム本文に設定します(そのまま送信されます)。
応答契約
- 注意が必要なことが何もない場合は、
HEARTBEAT_OKで返信します。 - Heartbeat 実行では、表示される更新が不要な場合に
notify: falseでheartbeat_respondを呼び出すか、アラートにはnotify: trueとnotificationTextを指定できます。構造化ツール応答が存在する場合は、テキストのフォールバックより優先されます。 - Heartbeat 実行中、OpenClaw は返信の先頭または末尾に現れる
HEARTBEAT_OKを ack として扱います。このトークンは取り除かれ、残りの内容が ≤ackMaxChars(デフォルト: 300)の場合、返信は破棄されます。 HEARTBEAT_OKが返信の途中に現れる場合、特別扱いされません。- アラートでは、
HEARTBEAT_OKを含めないでください。アラート本文のみを返します。
HEARTBEAT_OK は取り除かれてログに記録されます。HEARTBEAT_OK だけのメッセージは破棄されます。
設定
スコープと優先順位
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 の上にマージされます(共有デフォルトを一度設定し、エージェントごとに上書きできます)。
例: 2 つのエージェントのうち、2 番目のエージェントだけが Heartbeat を実行します。
アクティブ時間の例
特定のタイムゾーンの営業時間に Heartbeat を制限します。24 時間 365 日のセットアップ
Heartbeat を終日実行したい場合は、次のいずれかのパターンを使用します。activeHoursを完全に省略します(時間ウィンドウ制限なし。これがデフォルトの動作です)。- 終日ウィンドウを設定します:
activeHours: { start: "00:00", end: "24:00" }。
マルチアカウントの例
Telegram などのマルチアカウントチャンネルで特定のアカウントを対象にするには、accountId を使用します。
フィールドメモ
Heartbeat 間隔(duration 文字列。デフォルト単位 = 分)。
Heartbeat 実行用の任意のモデル上書き(
provider/model)。有効にすると、利用可能な場合に別個の
Thinking メッセージも配信します(/reasoning on と同じ形)。true の場合、Heartbeat 実行は軽量なブートストラップコンテキストを使用し、ワークスペースのブートストラップファイルから
HEARTBEAT.md だけを保持します。true の場合、各 Heartbeat は過去の会話履歴がない新しいセッションで実行されます。Cron の
sessionTarget: "isolated" と同じ分離パターンを使用します。Heartbeat ごとのトークンコストを大幅に削減します。最大限の節約には lightContext: true と組み合わせます。配信ルーティングは引き続きメインセッションコンテキストを使用します。true の場合、Heartbeat 実行はそのエージェントの追加のビジーなレーン、つまり自身のセッションキー付きサブエージェントまたはネストされたコマンド作業で延期されます。Cron レーンはこのフラグがなくても常に Heartbeat を延期するため、ローカルモデルホストは Cron と Heartbeat プロンプトを同時に実行しません。
Heartbeat 実行用の任意のセッションキー。
main(デフォルト): エージェントのメインセッション。- 明示的なセッションキー(
openclaw sessions --jsonまたは sessions CLI からコピー)。 - セッションキー形式: セッション と グループ を参照してください。
last: 最後に使用された外部チャンネルへ配信します。- 明示的なチャンネル: 構成済みの任意のチャンネルまたは Plugin ID。たとえば
discord、matrix、telegram、whatsapp。 none(デフォルト): Heartbeat は実行しますが、外部には配信しません。
direct/DM 配信の動作を制御します。
allow: direct/DM の Heartbeat 配信を許可します。block: direct/DM 配信を抑制します(reason=dm-blocked)。任意の受信者上書き指定(チャネル固有の ID。例: WhatsApp の E.164、または Telegram チャット ID)。Telegram のトピック/スレッドでは、
<chatId>:topic:<messageThreadId> を使用します。複数アカウント対応チャネル用の任意のアカウント ID。
target: "last" の場合、解決された最後のチャネルがアカウントをサポートしていれば、そのアカウント ID が適用されます。それ以外の場合は無視されます。アカウント ID が解決されたチャネルの設定済みアカウントと一致しない場合、配信はスキップされます。デフォルトのプロンプト本文を上書きします(マージされません)。
デフォルトエージェントの
## Heartbeats システムプロンプトセクションを注入するかどうか。false に設定すると、heartbeat のランタイム動作(周期、配信、HEARTBEAT.md)は維持しつつ、エージェントのシステムプロンプトから heartbeat 指示を省略します。配信前に
HEARTBEAT_OK の後ろに許可される最大文字数。true の場合、heartbeat 実行中のツールエラー警告ペイロードを抑制します。
heartbeat エージェントターンが中止されるまでに許可される最大秒数。未設定の場合、
agents.defaults.timeoutSeconds が設定されていればそれを使用し、それ以外では heartbeat 周期を最大 600 秒に制限して使用します。heartbeat 実行を時間帯に制限します。
start(HH:MM、包含。日の開始には 00:00 を使用)、end(HH:MM、排他。日の終了には 24:00 を使用可能)、任意の timezone を持つオブジェクトです。- 省略、または
"user":agents.defaults.userTimezoneが設定されていればそれを使用し、それ以外ではホストシステムのタイムゾーンにフォールバックします。 "local": 常にホストシステムのタイムゾーンを使用します。- 任意の IANA 識別子(例:
America/New_York): 直接使用されます。無効な場合は、上記の"user"動作にフォールバックします。 - アクティブウィンドウでは
startとendが同じであってはいけません。同じ値は幅ゼロ(常にウィンドウ外)として扱われます。 - アクティブウィンドウ外では、ウィンドウ内の次の tick まで heartbeat はスキップされます。
配信動作
セッションとターゲットのルーティング
セッションとターゲットのルーティング
- heartbeat はデフォルトでエージェントのメインセッション(
agent:<id>:<mainKey>)で実行され、session.scope = "global"の場合はglobalで実行されます。特定のチャネルセッション(Discord/WhatsApp など)に上書きするには、sessionを設定します。 sessionは実行コンテキストにのみ影響します。配信はtargetとtoで制御されます。- 特定のチャネル/受信者に配信するには、
target+toを設定します。target: "last"では、そのセッションの最後の外部チャネルを使って配信します。 - heartbeat 配信では、デフォルトで直接/DM ターゲットが許可されます。heartbeat ターンは実行したまま直接ターゲットへの送信を抑制するには、
directPolicy: "block"を設定します。 - メインキュー、ターゲットセッションレーン、cron レーン、またはアクティブな cron ジョブがビジーの場合、heartbeat はスキップされ、後で再試行されます。
skipWhenBusy: trueの場合、このエージェントのセッションキー付きサブエージェントとネストされたレーンも heartbeat 実行を延期します。他のエージェントのビジーなレーンは、このエージェントを延期しません。targetが外部宛先に解決されない場合でも、実行自体は行われますが、外向きメッセージは送信されません。
可視性とスキップ動作
可視性とスキップ動作
showOk、showAlerts、useIndicatorがすべて無効な場合、実行は最初からreason=alerts-disabledとしてスキップされます。- アラート配信だけが無効な場合でも、OpenClaw は heartbeat を実行し、期限付きタスクのタイムスタンプを更新し、セッションのアイドルタイムスタンプを復元し、外向きのアラートペイロードを抑制できます。
- 解決された heartbeat ターゲットが typing をサポートしている場合、OpenClaw は heartbeat 実行がアクティブな間 typing を表示します。これは heartbeat がチャット出力を送信するのと同じターゲットを使用し、
typingMode: "never"によって無効化されます。
セッションライフサイクルと監査
セッションライフサイクルと監査
- heartbeat のみの返信は、セッションを維持しません。heartbeat メタデータがセッション行を更新することはありますが、アイドル期限切れには最後の実ユーザー/チャネルメッセージの
lastInteractionAtが使用され、日次の期限切れにはsessionStartedAtが使用されます。 - Control UI と WebChat 履歴は、heartbeat プロンプトと OK のみの確認応答を非表示にします。基礎となるセッショントランスクリプトには、監査/リプレイ用にそれらのターンが含まれる場合があります。
- 切り離されたバックグラウンドタスクは、メインセッションが何かにすばやく気づくべき場合にシステムイベントをキューに入れ、heartbeat を起こせます。その wake によって heartbeat 実行がバックグラウンドタスクになるわけではありません。
可視性コントロール
デフォルトでは、HEARTBEAT_OK 確認応答は抑制され、アラート内容は配信されます。これはチャネル単位またはアカウント単位で調整できます。
各フラグの動作
showOk: モデルが OK のみの返信を返したときに、HEARTBEAT_OK確認応答を送信します。showAlerts: モデルが OK ではない返信を返したときに、アラート内容を送信します。useIndicator: UI ステータス表示面向けにインジケーターイベントを発行します。
チャネル単位とアカウント単位の例
一般的なパターン
| 目的 | 設定 |
|---|---|
| デフォルト動作(OK は無音、アラートは有効) | (設定不要) |
| 完全に無音(メッセージなし、インジケーターなし) | channels.defaults.heartbeat: { showOk: false, showAlerts: false, useIndicator: false } |
| インジケーターのみ(メッセージなし) | channels.defaults.heartbeat: { showOk: false, showAlerts: false, useIndicator: true } |
| 1 つのチャネルだけ OK を表示 | channels.telegram.heartbeat: { showOk: true } |
HEARTBEAT.md(任意)
ワークスペースにHEARTBEAT.md ファイルが存在する場合、デフォルトプロンプトはエージェントにそれを読むよう伝えます。これは「heartbeat チェックリスト」と考えてください。小さく、安定していて、30 分ごとに検討しても安全なものです。
通常の実行では、HEARTBEAT.md はデフォルトエージェントで heartbeat ガイダンスが有効な場合にのみ注入されます。0m で heartbeat 周期を無効化するか、includeSystemPromptSection: false を設定すると、通常のブートストラップコンテキストから省略されます。
ネイティブ Codex ハーネスでは、HEARTBEAT.md の内容は他のブートストラップファイルのようにターンへ注入されません。ファイルが存在し、空白以外の内容がある場合、heartbeat のコラボレーションモードノートが Codex にそのファイルを示し、続行前にファイルを読むよう伝えます。
HEARTBEAT.md が存在しても実質的に空(空行のみ、Markdown/HTML コメント、# Heading のような Markdown 見出し、フェンスマーカー、または空のチェックリストスタブのみ)の場合、OpenClaw は API 呼び出しを節約するため heartbeat 実行をスキップします。そのスキップは reason=empty-heartbeat-file として報告されます。ファイルがない場合でも heartbeat は実行され、モデルが何をするかを判断します。
プロンプト肥大化を避けるため、小さく保ってください(短いチェックリストやリマインダー)。
HEARTBEAT.md の例:
tasks: ブロック
HEARTBEAT.md は、heartbeat 自体の中で間隔ベースのチェックを行うための小さな構造化 tasks: ブロックもサポートします。
例:
動作
動作
- OpenClaw は
tasks:ブロックを解析し、各タスクをそれぞれのintervalと照合します。 - その tick で期限が来ているタスクだけが heartbeat プロンプトに含まれます。
- 期限が来ているタスクがない場合、無駄なモデル呼び出しを避けるため heartbeat は完全にスキップされます(
reason=no-tasks-due)。 HEARTBEAT.md内のタスク以外の内容は保持され、期限付きタスクリストの後ろに追加コンテキストとして付加されます。- タスクの最終実行タイムスタンプはセッション状態(
heartbeatTaskState)に保存されるため、通常の再起動後も間隔は維持されます。 - タスクのタイムスタンプは、heartbeat 実行が通常の返信パスを完了した後にのみ進められます。スキップされた
empty-heartbeat-file/no-tasks-due実行では、タスクは完了としてマークされません。
エージェントは HEARTBEAT.md を更新できますか?
はい。依頼すれば可能です。HEARTBEAT.md はエージェントワークスペース内の通常のファイルなので、通常のチャットで次のようにエージェントに伝えられます。
- 「
HEARTBEAT.mdを更新して、毎日のカレンダーチェックを追加してください。」 - 「
HEARTBEAT.mdを短く、受信箱のフォローアップに集中した内容へ書き直してください。」
手動 wake(オンデマンド)
システムイベントをキューに入れ、任意で即時 heartbeat をトリガーするにはopenclaw system event を使用します。
| フラグ | 説明 |
|---|---|
--text <text> | システムイベントテキスト(必須)。 |
--mode <mode> | now は即時 heartbeat を実行します。next-heartbeat(デフォルト)は次のスケジュール tick を待ちます。 |
--session-key <sessionKey> | イベントの対象を特定のセッションにします。デフォルトはエージェントのメインセッションです。 |
--json | JSON を出力します。 |
--session-key が指定されず、複数のエージェントに heartbeat が設定されている場合、--mode now はそれらのエージェント heartbeat をそれぞれ即時実行します。
同じ CLI グループ内の関連 heartbeat コントロール:
Reasoning 配信(任意)
デフォルトでは、Heartbeat は最終的な「answer」ペイロードのみを配信します。 透明性が必要な場合は、次を有効にします。agents.defaults.heartbeat.includeReasoning: true
Thinking というプレフィックス付きの別メッセージも配信します(/reasoning on と同じ形)。これは、エージェントが複数のセッション/codexを管理していて、なぜpingすると判断したのかを確認したい場合に役立つことがあります。ただし、必要以上に内部の詳細が漏れる可能性もあります。グループチャットではオフのままにすることを推奨します。
コスト意識
Heartbeat は完全なエージェントターンを実行します。間隔を短くすると、より多くのトークンを消費します。コストを減らすには、次のようにします。- 完全な会話履歴の送信を避けるために
isolatedSession: trueを使用します(1回の実行あたり約100Kトークンから約2〜5Kに削減)。 - ブートストラップファイルを
HEARTBEAT.mdのみに制限するためにlightContext: trueを使用します。 - より安価な
modelを設定します(例:ollama/llama3.2:1b)。 HEARTBEAT.mdを小さく保ちます。- 内部状態の更新だけが必要な場合は、
target: "none"を使用します。
Heartbeat 後のコンテキストオーバーフロー
Heartbeat は実行完了後も共有セッションの既存のランタイムモデルを保持するため、セッションをより小さいローカルモデル(たとえば 32k ウィンドウの Ollama モデル)に切り替えた Heartbeat によって、次のメインセッションターンでもそのモデルが残ることがあります。その次のターンでコンテキストオーバーフローが報告され、セッションの最後のランタイムモデルが設定済みのheartbeat.model と一致する場合、OpenClaw の復旧メッセージは Heartbeat モデルの混入を原因として示し、修正を提案します。
これを避けるには、isolatedSession: true を使用して新しいセッションで Heartbeat を実行する(最小のプロンプトにするには必要に応じて lightContext: true と組み合わせる)か、共有セッションに十分な大きさのコンテキストウィンドウを持つ Heartbeat モデルを選択します。
関連
- 自動化 - すべての自動化メカニズムの概要
- バックグラウンドタスク - 切り離された作業の追跡方法
- タイムゾーン - タイムゾーンが Heartbeat のスケジュールに与える影響
- トラブルシューティング - 自動化の問題のデバッグ方法