メインコンテンツへスキップ
インバウンドメッセージは、ルーティング、重複排除/デバウンス、エージェント実行、アウトバウンド配信を通って移動します。
Inbound message
  -> routing/bindings -> session key
  -> dedupe + debounce
  -> queue (if a run is already active)
  -> agent run (streaming + tools)
  -> outbound replies (channel limits + chunking)
主要な設定サーフェス:
  • プレフィックス、キューイング、インバウンドデバウンス、グループ動作用の messages.*
  • ブロックストリーミング、チャンク化、サイレント返信のデフォルト用の agents.defaults.*
  • チャンネルごとの上限とストリーミング切り替え用のチャンネルオーバーライド (channels.telegram.*channels.whatsapp.* など)。
完全なスキーマは 設定 を参照してください。

インバウンド重複排除

チャンネルは再接続後に同じメッセージを再配信することがあります。OpenClaw は、エージェントスコープ、チャンネルルート (チャンネル + ピア + アカウント + スレッド)、メッセージ ID をキーにしたインメモリキャッシュを保持するため、再配信されたメッセージが 2 回目のエージェント実行をトリガーすることはありません。キャッシュエントリは 20 分後、または 5000 件のエントリが追跡された時点のどちらか早い方で期限切れになります。

インバウンドデバウンス

同じ送信者からの短時間に連続したテキストメッセージは、messages.inbound によって 1 つのエージェントターンにバッチ化できます。デバウンスはチャンネル + 会話ごとにスコープされ、返信のスレッド化/ID には最新のメッセージを使用します。
{
  messages: {
    inbound: {
      debounceMs: 2000,
      byChannel: {
        discord: 1500,
        slack: 1500,
        whatsapp: 5000,
      },
    },
  },
}
  • デバウンスはテキストのみのメッセージに適用されます。メディア/添付ファイルは即座にフラッシュされます。
  • 制御コマンド (stop/abort/status など) はデバウンスをバイパスし、即座にディスパッチされます。
  • デフォルトでは無効です。messages.inbound.debounceMs には組み込みのデフォルトがないため、デバウンスは (グローバルまたはチャンネルごとに) 設定した場合にのみ有効になります。
  • iMessage の coalesceSameSenderDms オプトインが唯一の例外です。これは Apple の command+URL 分割送信が 1 つのターンとして到着するのに十分な時間、同じ送信者の DM テキスト (コマンドを含む) をすべて保持します。グループチャットはこの設定に関係なく常に即座にディスパッチされます。

セッションとデバイス

セッションはクライアントではなく Gateway が所有します。
  • ダイレクトチャットはエージェントのメインセッションキーにまとめられます。
  • グループ/チャンネルはそれぞれ独自のセッションキーを取得します。
  • セッションストアとトランスクリプトは Gateway ホスト上に存在します。
複数のデバイス/チャンネルを同じセッションにマップできますが、履歴がすべてのクライアントへ完全に同期されるわけではありません。コンテキストの分岐を避けるため、長い会話には 1 つの主要デバイスを使用してください。Control UI と TUI は常に Gateway に裏付けられたセッショントランスクリプトを表示するため、これらが信頼できる情報源です。 詳細: セッション管理

プロンプト本文と履歴コンテキスト

チャンネル Plugin は、インバウンドコンテキスト上の複数のテキストフィールドを、推奨度の高い順に設定します。
フィールド目的
BodyForAgent現在のターン向けのモデル対面テキスト。未設定の場合は CommandBody / RawBody / Body にフォールバックします。
BodyForCommandsディレクティブ/コマンド解析に使用されるクリーンなテキスト。未設定の場合は CommandBody / RawBody / Body にフォールバックします。
CommandBodyレガシーの中間本文。BodyForCommands を優先してください。
RawBodyCommandBody の非推奨エイリアス。
Bodyレガシーのプロンプト本文。チャンネルのエンベロープや履歴ラッパーを含む場合があります。
チャンネルが履歴を提供する場合、次のようにラップします。
  • [Chat messages since your last reply - for context]
  • [Current message - respond to this]
非ダイレクトチャット (グループ/チャンネル/ルーム) では、現在のメッセージ本文に送信者ラベルがプレフィックスされ、履歴エントリで使われるスタイルと一致します。ディレクティブの除去は現在のメッセージセクションにのみ適用されるため、履歴はそのまま残ります。履歴をラップするチャンネルは、BodyForCommands (またはレガシーの CommandBody / RawBody) を元のメッセージテキストに設定し、Body は結合済みプロンプトとして保持する必要があります。 履歴バッファは保留中のものだけです。つまり、実行をトリガーしなかったグループメッセージ (たとえば、メンションでゲートされたメッセージ) を含み、すでにセッショントランスクリプトにあるメッセージは除外します。構造化履歴、返信、転送、チャンネルメタデータは、プロンプト組み立て時に信頼されないユーザーロールのコンテキストブロックとしてレンダリングされます。 履歴サイズは messages.groupChat.historyLimit (グローバルデフォルト) または channels.slack.historyLimitchannels.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.dropsummarize です (oldnew も利用可能)。チャンネルごとのオーバーライドは messages.queue.byChannelmessages.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.responsePrefixchannels.<channel>.responsePrefixchannels.<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 が有効な場合にのみ表示されます。 素のサイレント返信はすべてのサーフェスでドロップされるため、親セッションはセンチネルテキストをフォールバックの雑談に書き換えることなく静かなままです。

関連