ハートビートと Cron の違いは? 使い分けのガイドについては、Cron vs ハートビート を参照してください。ハートビートは、メインセッションにおいて 定期的なエージェントのターン を実行する機能です。これにより、モデルはユーザーに頻繁に通知を送りすぎることなく、注意が必要な事項を自発的に表面化させることができます。 トラブルシューティング: /automation/troubleshooting
クイックスタート (初心者向け)
- ハートビートを有効のままにする(デフォルトは
30m、Anthropic OAuth/setup-token 利用時は1h)か、独自の頻度を設定します。 - エージェントのワークスペースに、小さな
HEARTBEAT.mdチェックリストを作成します(オプションですが推奨)。 - ハートビートメッセージの送信先を決定します(デフォルトは
target: "none"です。最後に通信した相手に送る場合はtarget: "last"を設定します)。 - オプション: 透明性を高めるため、ハートビート時の推論プロセス(Reasoning)の配信を有効にします。
- オプション: ハートビートの実行に
HEARTBEAT.mdさえあれば十分な場合は、軽量なブートストラップコンテキストを使用します。 - オプション: ハートビートの実行時間を、特定のアクティブな時間帯(現地時間)に制限します。
デフォルト設定
- 間隔:
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. - ハートビートのプロンプトは、ユーザーメッセージとして そのまま 送信されます。システムプロンプトには「Heartbeat」セクションが含まれ、実行時には内部的にフラグが立てられます。
- アクティブ時間 (
heartbeat.activeHours) は、構成されたタイムゾーンでチェックされます。時間外の場合、ハートビートはスキップされ、時間内に入った後の最初のタイミングで実行されます。
ハートビートプロンプトの目的
デフォルトのプロンプトは、意図的に幅広く定義されています:- バックグラウンドタスク: 「未処理のタスクを検討してください」という指示により、エージェントにフォローアップ(受信トレイ、カレンダー、リマインダー、キューにある仕事)を確認させ、緊急性の高いものを報告させます。
- 人間への声掛け: 「日中、時々ユーザーの様子を確認してください」という指示により、たまに「何か手伝うことはありますか?」といった軽い声掛けを行わせます。ただし、設定されたローカルタイムゾーンに基づき、夜間の通知連打を避けます(詳細は /concepts/timezone を参照)。
agents.defaults.heartbeat.prompt (またはエージェントごとの設定) にカスタムの本文を記述してください(そのまま送信されます)。
応答に関するルール
- 特に報告すべきことがない場合、モデルは
HEARTBEAT_OKと返信します。 - ハートビート実行中、返信の 先頭または末尾 に
HEARTBEAT_OKが含まれている場合、OpenClaw はそれを確認(ack)として扱います。トークンは除去され、残りの内容がackMaxChars以下 (デフォルト 300 文字) であれば、その返信は配信されません。 - 返信の 途中 に
HEARTBEAT_OKがある場合は、特別な処理は行われません。 - 通知(アラート)を送りたい場合は、
HEARTBEAT_OKを 含めず、通知内容のみを返してください。
HEARTBEAT_OK は除去され、ログに記録されます。HEARTBEAT_OK のみのメッセージは破棄されます。
構成設定
適用範囲と優先順位
agents.defaults.heartbeat: グローバルなハートビート動作を設定します。agents.list[].heartbeat: 上書き・マージされます。いずれかのエージェントにheartbeatブロックがある場合、それらのエージェントのみ がハートビートを実行します。channels.defaults.heartbeat: すべてのチャネルにおける可視性のデフォルトを設定します。channels.<channel>.heartbeat: チャネルごとのデフォルトを上書きします。channels.<channel>.accounts.<id>.heartbeat: 特定のアカウントの設定を上書きします。
エージェントごとのハートビート
agents.list[] のエントリに heartbeat ブロックが含まれている場合、そのエージェントだけ がハートビートを実行するようになります。エージェントごとのブロックは agents.defaults.heartbeat の上にマージされます(共通のデフォルトを一度設定し、エージェントごとに微調整することが可能です)。
例: 2 つのエージェントがあり、2 番目のエージェントのみがハートビートを実行する設定。
アクティブ時間(Active Hours)の例
特定のタイムゾーンの営業時間内にのみハートビートを制限します:24時間 365日の設定
常にハートビートを実行したい場合は、以下のいずれかのパターンを使用してください:activeHoursを完全に省略する(デフォルトの挙動。時間制限なし)。- 終日のウィンドウを設定する:
activeHours: { start: "00:00", end: "24:00" }。
08:00 から 08:00)。これは幅ゼロのウィンドウとみなされ、常に時間外として扱われます。
マルチアカウントの例
Telegram などのマルチアカウント対応チャネルで、特定のアカウントを対象にする場合:フィールドに関する補足
every: ハートビートの間隔(期間を表す文字列。デフォルトの単位は分)。model: ハートビート実行時に使用するモデルの上書き (provider/model)。includeReasoning: 有効な場合、推論プロセスがあれば個別のReasoning:メッセージとして配信します (/reasoning onと同様の形式)。lightContext: true の場合、ブートストラップコンテキストからHEARTBEAT.mdのみを保持し、軽量なプロンプトで実行します。session: ハートビート実行に使用するセッションキー。main(デフォルト): エージェントのメインセッション。- 明示的なセッションキー(
openclaw sessions --json等からコピー)。形式の詳細は セッション を参照。
target:last: 最後に使用された外部チャネルに配信。- 明示的なチャネル指定:
whatsapp | telegram | discord | googlechat | slack | msteams | signal | imessage。 none(デフォルト): ハートビートは実行するが、外部への 配信は行わない。
directPolicy: 直接/DM 宛の配信挙動を制御します:allow(デフォルト): 直接宛先への配信を許可。block: 直接宛先への配信を抑制 (reason=dm-blocked)。
to: 宛先の上書き(チャネル固有の ID。WhatsApp なら E.164、Telegram ならチャット ID など)。Telegram のトピック/スレッドの場合は<chatId>:topic:<messageThreadId>を使用。accountId: マルチアカウントチャネルにおけるアカウント ID。target: "last"の場合、解決された最後のチャネルがアカウントに対応していれば適用されます。一致するアカウントがない場合、配信はスキップされます。prompt: デフォルトのプロンプト本文を上書きします(マージされません)。ackMaxChars:HEARTBEAT_OKが返された際、配信を許可する最大文字数。suppressToolErrorWarnings: true の場合、ハートビート実行中のツールエラーの警告を抑制します。activeHours: ハートビートを実行する時間枠を制限します。start(HH:MM, 指定時刻を含む。1日の始まりは00:00),end(HH:MM, 指定時刻を含まない。1日の終わりは24:00が指定可能), およびオプションのtimezoneを持つオブジェクト。- 未設定または
"user":agents.defaults.userTimezoneがあればそれを使用し、なければホストのタイムゾーンを使用。 "local": 常にホストのタイムゾーンを使用。- IANA タイムゾーン識別子(例:
Asia/Tokyo): 直接使用されます。無効な場合は上記の"user"の挙動にフォールバックします。 - アクティブなウィンドウとするには、
startとendが異なる必要があります。同じ値は幅ゼロ(常に時間外)とみなされます。
- 未設定または
配信の挙動
- ハートビートは、デフォルトでエージェントのメインセッション (
agent:<id>:<mainKey>)、あるいはsession.scope = "global"の場合はglobalで実行されます。特定のチャネルセッション(Discord/WhatsApp など)で実行したい場合はsessionを設定してください。 sessionは実行コンテキスト(履歴など)にのみ影響し、どこに配信するかはtargetとtoで制御されます。target: "last"の場合、そのセッションで最後に使われた外部チャネルが配信先となります。- ハートビートの配信は、デフォルトで直接/DM ターゲットを許可しています。ハートビートを実行しつつも直接ターゲットへの送信だけを控えたい場合は、
directPolicy: "block"を設定してください。 - メインキューが混雑している場合、ハートビートはスキップされ、後で再試行されます。
targetが外部の宛先に解決されない場合、実行は行われますが、外部へのメッセージ送信は行われません。- ハートビートのみの返信(OK 応答など)によって セッションが「アクティブ」に維持されることはありません。最終更新日時 (
updatedAt) が復元されるため、アイドルの期限切れ判定は通常通り機能します。
可視性の制御
デフォルトでは、異常(Alert)がある場合には配信され、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 } |
| 特定のチャネルでのみ OK 通知も出す | channels.telegram.heartbeat: { showOk: true } |
HEARTBEAT.md (オプション)
ワークスペースにHEARTBEAT.md ファイルが存在する場合、デフォルトのプロンプトはその内容を読むようモデルに指示します。これを 30 分おきにチェックされる「ハートビート用チェックリスト」として活用してください。
HEARTBEAT.md が存在していても、実質的に空(空行や Markdown のヘッダー # Heading のみ)である場合、OpenClaw は API 呼び出しを節約するためにハートビートの実行をスキップします。ファイルが存在しない場合は実行が継続され、モデルが自身で判断して行動します。
プロンプトの肥大化を避けるため、内容は最小限(短いチェックリストやリマインダー)に留めてください。
例 HEARTBEAT.md:
エージェントは HEARTBEAT.md を更新できますか?
はい、指示すれば可能です。HEARTBEAT.md はワークスペース内の通常のファイルであるため、通常のチャットで以下のように指示できます:
- 「毎日のカレンダーチェックを行うように
HEARTBEAT.mdを更新して。」 - 「
HEARTBEAT.mdを、受信トレイのフォローアップに重点を置いた短い内容に書き換えて。」
HEARTBEAT.md を更新してください」といった指示を含めることで、自発的な更新を促すことも可能です。
安全上の注意: HEARTBEAT.md にシークレット(API キー、電話番号、プライベートトークンなど)を記述しないでください。これらはプロンプトの一部としてモデルに送信されます。
手動ウェイクアップ (オンデマンド実行)
システムイベントを投入することで、即座にハートビートをトリガーできます:--mode next-heartbeat を使用してください。
推論プロセス(Reasoning)の配信 (オプション)
デフォルトでは、ハートビートは最終的な「回答」のみを配信します。 動作の透明性を高めたい場合は、以下を有効にしてください:agents.defaults.heartbeat.includeReasoning: true
Reasoning: 接頭辞が付いた個別のメッセージも配信されます(/reasoning on と同様の形式)。エージェントが複数のセッションやタスクを管理している際に、なぜあなたに通知を送る決断をしたのかを確認するのに役立ちます。ただし、内部の詳細が意図せず漏れる可能性もあるため、グループチャットなどではオフにしておくことを推奨します。
コストに関する注意
ハートビートはエージェントのフルターン(1回の実行)を消費します。間隔を短くするほどトークンの消費量が増えます。HEARTBEAT.md は小さく保ち、内部状態の更新のみが必要な場合は安価な model を指定するか、target: "none" を検討してください。