Messages and delivery

進行中の下書き

進行状況ドラフトは、長時間実行されるエージェントのターンを、一時的なステータス返信の山にせず、チャット内で動いているように見せます。

進行状況ドラフトを有効にすると、OpenClaw はターンが実際に作業していることを示した後にだけ、表示される作業中メッセージを 1 つ作成し、エージェントが読み取り、計画し、ツールを呼び出し、または承認を待つ間にそれを更新し、チャンネルで安全に実行できる場合は、そのドラフトを最終回答に変換します。

Shelling...
📖 Read: from docs/concepts/progress-drafts.md
🔎 Web Search: for "discord edit message"
🛠️ Exec: run tests

ツールを多用する作業中に整ったステータスメッセージを 1 つ表示し、ターンが完了したら最終回答を表示したい場合は、進行状況ドラフトを使用します。

クイックスタート

チャンネルごとに streaming.mode: "progress" で進行状況ドラフトを有効にします。

{
  channels: {
    discord: {
      streaming: {
        mode: "progress",
      },
    },
  },
}

通常はこれで十分です。OpenClaw は自動的に 1 語のラベルを選択し、作業が少なくとも 5 秒続くか、2 つ目の作業イベントが発行されるまで待ち、有用な作業が発生している間はコンパクトな進行状況行を追加し、そのターンでは重複する独立した進行状況のおしゃべりを抑制します。

ユーザーに表示される内容

進行状況ドラフトには 2 つの部分があります。

部分 目的
ラベル Thinking...Shelling... のような短いタイトル。
進行状況行 詳細出力と同じツールラベルとアイコンを使ったコンパクトな実行更新。

ラベルは、エージェントが意味のある作業を開始し、5 秒間ビジーなままになるか、2 つ目の作業イベントを発行した後に表示されます。プレーンテキストのみの返信では進行状況ドラフトは表示されません。進行状況行は、エージェントが有用な作業更新を発行した場合にのみ追加されます。たとえば 🛠️ Exec🔎 Web Search✍️ Write: to /tmp/file です。既定では /verbose と同じコンパクトな説明モードを使用します。デバッグ時に生のコマンドや詳細も追加したい場合は、agents.defaults.toolProgressDetail: "raw" を設定します。 可能な場合、最終回答はドラフトを置き換えます。それ以外の場合、OpenClaw は通常どおり最終回答を送信し、チャンネルのトランスポートに応じてドラフトをクリーンアップするか、更新を停止します。

モードを選択する

channels.<channel>.streaming.mode は、表示される進行中の動作を制御します。

モード 最適な用途 チャットに表示される内容
off 静かなチャンネル 最終回答のみ。
partial 回答テキストが表示されていく様子を見る 最新の回答テキストで編集される 1 つのドラフト。
block より大きな回答プレビューチャンク より大きなチャンクで更新または追加される 1 つのプレビュー。
progress ツールを多用する、または長時間実行されるターン 1 つのステータスドラフト、その後に最終回答。

ユーザーが回答テキストをトークン単位でストリーミングされる様子を見ることよりも、「何が起きているか」を重視する場合は、progress を選択します。

回答自体が進行状況シグナルである場合は、partial を選択します。

より大きなテキストチャンクでドラフトプレビューを更新したい場合は、block を選択します。Discord と Telegram では、streaming.mode: "block" は引き続き通常のブロック配信ではなく、プレビューストリーミングです。通常のブロック返信が必要な場合は、streaming.block.enabled または従来の blockStreaming を使用します。

ラベルを設定する

進行状況ラベルは channels.<channel>.streaming.progress の下にあります。

既定のラベルは auto で、OpenClaw の組み込みの省略記号付き単語ラベルプールから選択します。

Thinking...
Shelling...
Scuttling...
Clawing...
Pinching...
Molting...
Bubbling...
Tiding...
Reefing...
Cracking...
Sifting...
Brining...
Nautiling...
Krilling...
Barnacling...
Lobstering...
Tidepooling...
Pearling...
Snapping...
Surfacing...

固定ラベルを使用します。

{
  channels: {
    discord: {
      streaming: {
        mode: "progress",
        progress: {
          label: "Investigating",
        },
      },
    },
  },
}

独自の自動ラベルプールを使用します。

{
  channels: {
    discord: {
      streaming: {
        mode: "progress",
        progress: {
          label: "auto",
          labels: ["Checking", "Reading", "Testing", "Finishing"],
        },
      },
    },
  },
}

ラベルを非表示にして、進行状況行のみを表示します。

{
  channels: {
    discord: {
      streaming: {
        mode: "progress",
        progress: {
          label: false,
        },
      },
    },
  },
}

進行状況行を制御する

進行状況行は、進行状況モードでは既定で有効です。これらは実際の実行イベント、つまりツール開始、項目更新、タスク計画、承認、コマンド出力、パッチ要約、および同様のエージェントアクティビティから取得されます。

OpenClaw は、進行状況ドラフトと /verbose に同じフォーマッターを使用します。

{
  agents: {
    defaults: {
      toolProgressDetail: "explain", // explain | raw
    },
  },
}

"explain" は既定値で、🛠️ Exec: check JS syntax for /tmp/app.js のような簡潔なラベルによりドラフトを安定させます。"raw" は、利用可能な場合に基礎となるコマンドや詳細を追加します。これはデバッグ中には便利ですが、チャットではややノイズが多くなります。

たとえば、同じコマンドでも詳細モードに応じて表示が異なります。

モード 進行状況行
explain 🛠️ Exec: check JS syntax for /tmp/app.js
raw 🛠️ Exec: check JS syntax for /tmp/app.js, node --check /tmp/app.js

表示されたままにする行数を制限します。

{
  channels: {
    discord: {
      streaming: {
        mode: "progress",
        progress: {
          maxLines: 4,
        },
      },
    },
  },
}

ドラフトが編集される間のチャット吹き出しの再レイアウトを減らすため、進行状況行は自動的に圧縮されます。

OpenClaw は既定で長い進行状況行を切り詰めるため、ドラフトを繰り返し編集しても更新ごとに折り返しが変わりません。プレフィックスは読みやすいままで、パスや生のコマンドなどの長い詳細は省略記号で短縮されます。

Slack では、進行状況行を単一のテキスト本文ではなく、構造化された Block Kit フィールドとしてレンダリングできます。

{
  channels: {
    slack: {
      streaming: {
        mode: "progress",
        progress: {
          render: "rich",
        },
      },
    },
  },
}

リッチレンダリングでも同じプレーンテキストのフォールバックが保持されるため、より豊かな形をサポートしないチャンネルやクライアントでも、コンパクトな進行状況テキストを表示できます。

単一の進行状況ドラフトは保持しつつ、ツール行とタスク行を非表示にします。

{
  channels: {
    discord: {
      streaming: {
        mode: "progress",
        progress: {
          toolProgress: false,
        },
      },
    },
  },
}

toolProgress: false の場合でも、OpenClaw はそのターンで古い独立したツール進行状況メッセージを抑制します。ラベルが設定されている場合を除き、最終回答まではチャンネルは視覚的に静かなままです。

チャンネルの動作

各チャンネルは、サポートしている最もクリーンなトランスポートを使用します。

チャンネル 進行状況トランスポート 注記
Discord 1 つのメッセージを送信し、その後編集する。 1 つの安全なプレビューメッセージに収まる場合、最終テキストはその場で編集される。
Matrix 1 つのイベントを送信し、その後編集する。 アカウントレベルのストリーミング設定が、アカウントレベルのドラフトを制御する。
Microsoft Teams 個人チャットではネイティブ Teams ストリーム。 streaming.mode: "block" は Teams のブロック配信にマップされる。
Slack ネイティブストリームまたは編集可能なドラフト投稿。 スレッドの利用可否は、ネイティブストリーミングを使用できるかどうかに影響する。
Telegram 1 つのメッセージを送信し、その後編集する。 古い表示中のドラフトは、最終タイムスタンプを有用に保つために置き換えられる場合がある。
Mattermost 編集可能なドラフト投稿。 ツールアクティビティは同じドラフト形式の投稿に折り込まれる。

安全な編集サポートがないチャンネルは、通常、入力中インジケーターまたは最終回答のみの配信にフォールバックします。

最終化

最終回答の準備ができると、OpenClaw はチャットをきれいに保とうとします。

  • ドラフトを安全に最終回答にできる場合、OpenClaw はそれをその場で編集します。
  • チャンネルがネイティブの進行状況ストリーミングを使用している場合、ネイティブトランスポートが最終テキストを受け入れた時点で、OpenClaw はそのストリームを最終化します。
  • 最終回答にメディア、承認プロンプト、明示的な返信先、過剰なチャンクが含まれる場合、または編集や送信に失敗した場合、OpenClaw は通常のチャンネル配信パスで最終回答を送信します。

フォールバックパスは意図的なものです。テキストを失う、返信スレッドを誤る、またはチャンネルが安全に表現できないペイロードでドラフトを上書きするよりも、新しい最終回答を送信する方が適切です。

トラブルシューティング

最終回答しか表示されません。

メッセージを処理したアカウントまたはチャンネルで、channels.<channel>.streaming.modeprogress に設定されていることを確認してください。一部のグループまたは引用返信パスでは、チャンネルが正しいメッセージを安全に編集できない場合、そのターンのドラフトプレビューが無効になることがあります。

ラベルは表示されますが、ツール行が表示されません。

streaming.progress.toolProgress を確認してください。false の場合、OpenClaw は単一ドラフトの動作を維持しますが、ツールとタスクの進行状況行を非表示にします。

編集されたドラフトではなく、新しい最終メッセージが表示されます。

これは安全のためのフォールバックです。メディア返信、長い回答、明示的な返信先、古い Telegram ドラフト、Slack スレッド先の欠落、削除されたプレビューメッセージ、またはネイティブストリームの最終化失敗で発生することがあります。

独立した進行状況メッセージがまだ表示されます。

進行状況モードでは、ドラフトがアクティブな場合、既定の独立したツール進行状況メッセージが抑制されます。独立したメッセージがまだ表示される場合は、そのターンが実際に進行状況モードを使用しており、streaming.mode: "off" や、そのメッセージ用のドラフトを作成できないチャンネルパスではないことを確認してください。

Teams は Discord や Telegram と異なる動作をします。

Microsoft Teams は、汎用の送信して編集するプレビュートランスポートではなく、個人チャットでネイティブストリームを使用します。また Teams は、Discord と Telegram で使用される同じドラフトプレビューブロックモードを持たないため、streaming.mode: "block" を Teams のブロック配信として扱います。

関連