- プレフィックス、キューイング、インバウンドデバウンス、グループ動作用の
messages.*。 - ブロックストリーミング、チャンク化、サイレント返信のデフォルト用の
agents.defaults.*。 - チャンネルごとの上限とストリーミング切り替え用のチャンネルオーバーライド (
channels.telegram.*、channels.whatsapp.*など)。
インバウンド重複排除
チャンネルは再接続後に同じメッセージを再配信することがあります。OpenClaw は、エージェントスコープ、チャンネルルート (チャンネル + ピア + アカウント + スレッド)、メッセージ ID をキーにしたインメモリキャッシュを保持するため、再配信されたメッセージが 2 回目のエージェント実行をトリガーすることはありません。キャッシュエントリは 20 分後、または 5000 件のエントリが追跡された時点のどちらか早い方で期限切れになります。インバウンドデバウンス
同じ送信者からの短時間に連続したテキストメッセージは、messages.inbound によって 1 つのエージェントターンにバッチ化できます。デバウンスはチャンネル + 会話ごとにスコープされ、返信のスレッド化/ID には最新のメッセージを使用します。
- デバウンスはテキストのみのメッセージに適用されます。メディア/添付ファイルは即座にフラッシュされます。
- 制御コマンド (stop/abort/status など) はデバウンスをバイパスし、即座にディスパッチされます。
- デフォルトでは無効です。
messages.inbound.debounceMsには組み込みのデフォルトがないため、デバウンスは (グローバルまたはチャンネルごとに) 設定した場合にのみ有効になります。 - iMessage の
coalesceSameSenderDmsオプトインが唯一の例外です。これは Apple の command+URL 分割送信が 1 つのターンとして到着するのに十分な時間、同じ送信者の DM テキスト (コマンドを含む) をすべて保持します。グループチャットはこの設定に関係なく常に即座にディスパッチされます。
セッションとデバイス
セッションはクライアントではなく Gateway が所有します。- ダイレクトチャットはエージェントのメインセッションキーにまとめられます。
- グループ/チャンネルはそれぞれ独自のセッションキーを取得します。
- セッションストアとトランスクリプトは Gateway ホスト上に存在します。
プロンプト本文と履歴コンテキスト
チャンネル Plugin は、インバウンドコンテキスト上の複数のテキストフィールドを、推奨度の高い順に設定します。| フィールド | 目的 |
|---|---|
BodyForAgent | 現在のターン向けのモデル対面テキスト。未設定の場合は CommandBody / RawBody / Body にフォールバックします。 |
BodyForCommands | ディレクティブ/コマンド解析に使用されるクリーンなテキスト。未設定の場合は CommandBody / RawBody / Body にフォールバックします。 |
CommandBody | レガシーの中間本文。BodyForCommands を優先してください。 |
RawBody | CommandBody の非推奨エイリアス。 |
Body | レガシーのプロンプト本文。チャンネルのエンベロープや履歴ラッパーを含む場合があります。 |
[Chat messages since your last reply - for context][Current message - respond to this]
BodyForCommands (またはレガシーの CommandBody / RawBody) を元のメッセージテキストに設定し、Body は結合済みプロンプトとして保持する必要があります。
履歴バッファは保留中のものだけです。つまり、実行をトリガーしなかったグループメッセージ (たとえば、メンションでゲートされたメッセージ) を含み、すでにセッショントランスクリプトにあるメッセージは除外します。構造化履歴、返信、転送、チャンネルメタデータは、プロンプト組み立て時に信頼されないユーザーロールのコンテキストブロックとしてレンダリングされます。
履歴サイズは messages.groupChat.historyLimit (グローバルデフォルト) または channels.slack.historyLimit や channels.telegram.accounts.<id>.historyLimit などのチャンネルごとのオーバーライドで設定します (0 に設定すると無効化)。
ツール結果メタデータ
ツール結果のcontent はモデルに見える結果です。details は UI レンダリング、診断、メディア配信、Plugin 用のランタイムメタデータです。
toolResult.detailsはプロバイダー再生前と Compaction 入力前に取り除かれます。- 永続化されたセッショントランスクリプトは、境界付けられた
detailsのみを保持します。大きすぎるメタデータはpersistedDetailsTruncated: trueが付いたコンパクトな要約に置き換えられます。 - Plugin とツールは、モデルが読む必要のあるテキストを
detailsだけでなくcontentに入れる必要があります。
キューイングとフォローアップ
実行がすでにアクティブな場合、インバウンドメッセージはデフォルトでその実行に向けられます。messages.queue がモードを制御します。
| モード | 動作 |
|---|---|
steer (デフォルト) | 新しいプロンプトをアクティブな実行に注入します。 |
followup | アクティブな実行が終了した後にメッセージを実行します。 |
collect | 互換性のあるメッセージを後続の 1 ターンにバッチ化します。 |
interrupt | アクティブな実行を中止し、その後で最新のプロンプトを開始します。 |
messages.queue.debounceMs は 500ms (steer、followup、collect のバッチ化に同様に適用)、messages.queue.cap は 20 件のキュー済みメッセージ、messages.queue.drop は summarize です (old と new も利用可能)。チャンネルごとのオーバーライドは messages.queue.byChannel と messages.queue.debounceMsByChannel で設定します。
詳細: コマンドキュー と ステアリングキュー。
チャンネル実行の所有権
チャンネル Plugin は、メッセージがセッションキューに入る前に順序を保持し、入力をデバウンスし、トランスポートのバックプレッシャーを適用できます。エージェントターン自体を囲む別個のタイムアウトを課すべきではありません。メッセージがセッションにルーティングされると、セッション、ツール、ランタイムのライフサイクルが長時間実行される作業を管理するため、すべてのチャンネルが遅いターンを一貫して報告し、回復できます。ストリーミング、チャンク化、バッチ化
ブロックストリーミングは、モデルがテキストブロックを生成するにつれて部分的な返信を送信します。チャンク化はチャンネルのテキスト制限を尊重し、フェンス付きコードの分割を避けます。agents.defaults.blockStreamingDefault(on|off、デフォルトoff)agents.defaults.blockStreamingBreak(text_end|message_end)agents.defaults.blockStreamingChunk(minChars|maxChars|breakPreference)agents.defaults.blockStreamingCoalesce(アイドルベースのバッチ化)agents.defaults.humanDelay(ブロック返信間の人間らしい間)- チャンネルオーバーライド:
*.blockStreamingと*.blockStreamingCoalesce(Telegram を含むすべてのチャンネルで、*.blockStreamingが明示的にtrueに設定されていない限り、ブロックストリーミングはオフです)。
推論の可視性とトークン
/reasoning on|off|streamは可視性を制御します。- モデルが推論内容を生成する場合、その内容もトークン使用量にカウントされます。
- Telegram は、一時的な下書きバブルへの推論ストリーミングをサポートしており、最終配信後に削除されます。永続的な推論出力には
/reasoning onを使用してください。
プレフィックス、スレッド化、返信
- アウトバウンドプレフィックスのカスケード:
messages.responsePrefix、channels.<channel>.responsePrefix、channels.<channel>.accounts.<id>.responsePrefix。WhatsApp にはインバウンドプレフィックス用のchannels.whatsapp.messagePrefixもあります。 replyToModeとチャンネルごとのデフォルトによる返信スレッド化。
サイレント返信
サイレントトークンNO_REPLY (大文字小文字を区別しないため no_reply も一致) は、「ユーザーに見える返信を配信しない」ことを意味します。ターンに生成された TTS 音声などの保留中のツールメディアもある場合、OpenClaw はサイレントテキストを取り除きますが、メディア添付ファイルは引き続き配信します。
サイレンスポリシーは会話タイプによって解決されます。
- ダイレクト会話は
NO_REPLYプロンプトガイダンスを受け取りません。ダイレクト実行が誤って素のサイレントトークンを返した場合、OpenClaw はそれを書き換えたり配信したりせずに抑制します。 - グループ/チャンネルはデフォルトでサイレンスを許可します。
message_toolの可視返信モードでは、サイレンスはモデルがmessage(action=send)を呼び出さないことを意味します。 - 内部オーケストレーションはデフォルトでサイレンスを許可します。
agents.defaults.silentReply 配下にあります。surfaces.<id>.silentReply はサーフェスごとにグループ/内部ポリシーをオーバーライドできます。
OpenClaw は非ダイレクトチャットでの汎用的な内部ランナー失敗にもサイレント返信を使用するため、グループ/チャンネルには Gateway のエラー定型文が表示されません。認証不足、レート制限、過負荷通知など、ユーザー向けの回復文がある分類済みの失敗は引き続き配信できます。ダイレクトチャットはデフォルトでコンパクトな失敗文を表示します。生のランナー詳細は /verbose full が有効な場合にのみ表示されます。
素のサイレント返信はすべてのサーフェスでドロップされるため、親セッションはセンチネルテキストをフォールバックの雑談に書き換えることなく静かなままです。
関連
- メッセージライフサイクルのリファクター - 耐久性のある送受信設計のターゲット
- ストリーミング - リアルタイムメッセージ配信
- 再試行 - メッセージ配信の再試行動作
- キュー - メッセージ処理キュー
- チャンネル - メッセージングプラットフォーム連携