Messages and delivery

進行中の下書き

進捗ドラフトは、エージェントの作業中、一時的な「まだ作業中です」という返信を積み重ねる代わりに、1つのチャンネルメッセージをライブステータス行に変えます。 channels.<channel>.streaming.mode: "progress" を設定すると、OpenClaw は実際の作業が始まった時点で メッセージを作成し、エージェントが読み取り、計画し、ツールを呼び出し、 承認を待つ間に編集し、最後に最終回答へと変えます。

text
作業中...📖 docs/concepts/progress-drafts.md から🔎 Web Search: 「discord edit message」を検索🛠️ Bash: テストを実行

クイックスタート

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

ここでのデフォルトは、開始までの遅延が5秒、有用な作業が行われている間は 簡潔な進捗行を表示し、そのターンでは従来の独立した進捗メッセージを 抑制する設定です。生のツール行ドラフトでは、自動的に1語のラベルが使用されます。 ステータス見出しでは、明示的に設定しない限り、その重複するタイトルは省略されます。

このページでは、進捗ドラフトの利用体験と設定項目について説明します。 ストリーミングモードの完全な対応表、チャンネルごとのランタイムに関する注意事項、 従来のキーの移行については、ストリーミングとチャンク化を 参照してください。

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

部分 目的
ステータス見出し Discord と Telegram では、モデルの前置き。Discord ではユーティリティによる補足も追加されます。
ラベル Working などの任意の開始行またはステータス行。
進捗行 /verbose と同じツールアイコンおよび詳細フォーマッターを使用した簡潔な実行状況の更新。

生のツール進捗では、エージェントが意味のある作業を開始し、 最初の遅延時間を超えて処理が続いている場合にラベルが表示されます。 ラベルはスクロールする進捗行リストの先頭に置かれるため、具体的な作業行が 十分に追加されるとスクロールして見えなくなります。ステータス見出しには、 ラベルが明示的に設定されていない限り、エージェントによる平易なステータスだけが 表示されます。プレーンテキストだけの返信には進捗ドラフトは表示されません。 行が表示されるのは、🛠️ Bash: run tests🔎 Web Search: for "discord edit message"✍️ Write: to /tmp/file など、実際の作業状況が更新された場合だけです。

チャンネルで安全に実行できる場合、最終回答はその場でドラフトを置き換えます。 それ以外の場合、OpenClaw は通常の配信方法で最終回答を送信し、ドラフトを クリーンアップするか、更新を停止します(完了処理を参照)。

モードを選択する

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

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

回答テキストがトークン単位でストリーミングされる様子よりも「何が起きているか」を ユーザーが重視する場合は progress、回答テキスト自体を進捗の合図とする場合は partial、より大きなプレビューチャンクには block を選択します。 Discord と Telegram では、streaming.mode: "block" は通常のブロック返信配信ではなく、 引き続きプレビューストリーミングです。通常のブロック返信には streaming.block.enabled を使用してください。

ラベルを設定する

進捗ラベルは channels.<channel>.streaming.progress 配下にあります。生のツール行の デフォルトラベルは "auto" で、組み込みのプレーンな Working ラベルを使用します。ステータス見出しでは、この暗黙的なラベルは 非表示になります。その上にもラベルを表示する場合は、 label: "auto" を明示的に設定します。

text
作業中

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

json5
{  channels: {    discord: {      streaming: {        mode: "progress",        progress: {          label: "調査中",        },      },    },  },}

独自のラベル候補を使用します(label: "auto" の場合と同様に、 ランダムまたはシードによって選択されます)。

json5
{  channels: {    discord: {      streaming: {        mode: "progress",        progress: {          label: "auto",          labels: ["確認中", "読み取り中", "テスト中", "仕上げ中"],        },      },    },  },}

ラベルを非表示にして、進捗行だけを表示します。

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

進捗行を制御する

進捗行は、ツールの開始、項目の更新、タスク計画、承認、コマンド出力、 パッチの概要など、実際の実行イベントや同様のエージェント活動から生成されます。 デフォルトで有効です(progress.toolProgress、デフォルトは true)。

また、ツールは1回の呼び出しがまだ実行中でも、型付き進捗を送信できます。 これにより、時間のかかる取得や検索では、ツールが最終結果を返す前に、 表示中のドラフトを更新できます。進捗更新は、モデルコンテンツが空で、 公開チャンネルの明示的なメタデータを持つ部分的なツール結果です。

json
{  "content": [],  "progress": {    "text": "ページのコンテンツを取得中...",    "visibility": "channel",    "privacy": "public",    "id": "web_fetch:fetching"  }}

OpenClaw がチャンネルの進捗UIに表示するのは progress.text だけです。 通常のツール結果は、後で content/details として到着し、 モデルに返されるのはその部分だけです。

ツールに進捗を追加する場合は、短く汎用的なメッセージを送信し、 処理が有用と判断できる時間だけ保留状態になった後に表示してください。 web_fetch は、5秒の遅延でまさにこの処理を行います。

typescript
const clearProgressTimer = scheduleToolProgress(  onUpdate,  { text: "ページのコンテンツを取得中...", id: "web_fetch:fetching" },  5_000,  { signal },); try {  return await runToolWork();} finally {  clearProgressTimer();}

短時間の呼び出しでは進捗行は表示されません。時間のかかる呼び出しでは、 保留中に1行が表示されます。キャンセルされた呼び出しでは、古い進捗が 表示される前にタイマーが解除されます。進捗テキストは公開UIの サイドチャンネルであるため、シークレット、生の引数、取得したコンテンツ、 コマンド出力、ページのテキストを含めてはなりません。

詳細モード

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

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

"explain" がデフォルトで、簡潔なラベルを使用してドラフトを安定させます。 "raw" は、利用可能な場合に基になるコマンドを追加します。 デバッグ時には便利ですが、チャットではノイズが増えます。たとえば、 node --check /tmp/app.js の呼び出しは、モードによって次のように異なって表示されます。

モード 進捗行
explain 🛠️ check js syntax for /tmp/app.js
raw 🛠️ check js syntax for /tmp/app.js · node --check /tmp/app.js

コマンド/execテキスト

streaming.progress.commandText(デフォルトは "raw")は、 上記の詳細モードとは別に、exec/bash の進捗行の横に表示するコマンドの 詳細量を制御します。コマンドテキストを完全に非表示にしながら ツール進捗行を表示したままにするには、"status" に設定します。

json5
{  channels: {    discord: {      streaming: {        mode: "progress",        progress: {          commandText: "status",        },      },    },  },}

コメンタリーレーン

streaming.progress.commentary(デフォルトは false)は、 モデルによるツール実行前のコメンタリーや前置きの説明(💬、たとえば 「確認してから...」)を、ドラフト内のツール行と交互に表示します。 チャンネル間で共通の設定形式については、 ストリーミングとチャンク化を 参照してください。

コメンタリーレーンが有効な場合、前置きは交互に挿入される💬行としてのみ 表示されます。レーンが文書化された形式を維持できるよう、 後述のステータス見出しは表示されません。

ステータス見出し

Discord と Telegram の進捗モードでは、モデルが型付きで出力する ツール実行前の前置きが利用可能な場合、それがドラフトのステータス見出しになります。 その他の進捗モード対応チャンネルでは、既存のステータス動作が維持されます。 見出しはデフォルトで有効ですが、短いターンに対する通常のアクティビティゲートを 迂回することはありません。streaming.progress.commentary を有効にすると、 前置きは代わりに交互表示のコメンタリーレーンへ渡されます。

Discord では、エージェント用のユーティリティモデルが解決される場合、 つまり明示的な utilityModel、 またはプライマリプロバイダーが宣言した小規模モデルのデフォルト (OpenAI → gpt-5.6-luna、Anthropic → claude-haiku-4-5)がある場合、 モデルが前置きを出力しないか、約20秒間更新がないときに、平易な短い補足を表示します (現在、Telegram の見出しは前置きのみです)。

text
設定内のデフォルトモデルを更新し、変更を反映するためにGatewayを再起動しています。エージェント一覧の取得呼び出しが1回失敗したため、再試行しています。

ナレーションはデフォルトで有効です(streaming.progress.narration、デフォルトは true)。プライマリモデルへのフォールバックは行われません。 明示的な utilityModel、またはエージェントのプライマリプロバイダー向けに プロバイダーが宣言したデフォルトがある場合にのみ実行されます。 ユーティリティルーティングを完全に無効にするには、utilityModel: "" を設定します。 ツール行はその下に蓄積され続け、両方のステータスソースが停止すると再び表示されます。 ドラフトの編集は、通常のアクティビティゲートと実際のテキスト変更を引き続き待機します。 これにより、短いターンでの一瞬の表示を防ぎ、利用の多いチャンネルでの編集頻度を 減らします。ユーティリティモデルによる補足だけを無効にするには、 narration: false を設定します。モデルの前置き見出しは引き続き有効です。

json5
{  channels: {    discord: {      streaming: {        mode: "progress",        progress: {          narration: false,        },      },    },  },}

ナレーションへの入力は制限され、機密情報が除去されます。ユーティリティモデルが 受け取るのは、受信したリクエストのテキストに加え、ドラフトに表示されるものと同じ、 簡潔で機密情報が除去されたツール概要です。生のコマンド出力やツール結果を 受け取ることはありません。commandText: "status" の場合、ナレーションへの入力からも exec/bash のコマンドテキストが省略され、ドラフトの表示内容と一致します。

行数制限

表示し続ける行数を制限します(デフォルトは8)。

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

ドラフトの編集中にチャットバブルが再レイアウトされるのを抑えるため、 進捗行は自動的に圧縮されます。また、ドラフトを繰り返し編集しても更新のたびに 異なる位置で折り返されないよう、OpenClaw は長い行を切り詰めます。 デフォルトの1行あたりの上限は120文字です。文章は単語の境界で切られ、 パスや生のコマンドなどの長い詳細は、末尾が見えるよう中央の省略記号で短縮されます。

1行あたりの上限を調整します。

json5
{  channels: {    discord: {      streaming: {        mode: "progress",        progress: {          maxLineChars: 160,        },      },    },  },}

リッチレンダリング(Slack)

Slack では、進捗行をプレーンテキストではなく、構造化された Block Kit フィールドとして表示できます。

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

リッチレンダリングでは、Block Kit フィールドとともに、常に同じ プレーンテキスト本文も送信されます。そのため、よりリッチな形式を レンダリングできないクライアントでも、簡潔な進捗テキストが表示されます。

ツール/タスク行を非表示にする

1つの進捗ドラフトを維持したまま、ツール行とタスク行を非表示にします。

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

toolProgress: false を使用すると、そのターンでは OpenClaw が従来の独立した ツール進捗メッセージを引き続き抑制します。ラベルが設定されている場合を除き、 最終回答が表示されるまでチャンネルは視覚的に静かなままです。

チャンネルの動作

チャンネル 進捗の転送方法 注記
Discord 1 件のメッセージを送信し、編集します。 デフォルトは progress モードです。最終回答には -# アクティビティ受領情報が付き、回答の投稿後にステータス下書きが削除されます。
Matrix 1 件のイベントを送信し、編集します。 アカウントレベルのストリーミング設定によって、アカウントレベルの下書きが制御されます。
Microsoft Teams 個人チャットのネイティブ Teams ストリーム。 代わりに streaming.mode: "block" は Teams のブロック配信に対応します。
Slack ネイティブストリームまたは編集可能な下書き投稿。 返信スレッドの対象が必要です。対象のない最上位の DM でも、下書きのプレビュー投稿と編集は行われます。
Telegram 1 件のメッセージを送信し、編集します。 進捗の下書きと回答の間に別のメッセージが投稿された場合、クライアントのスクロール位置を急変させる代わりに、下書きをその下へ再投稿します(新規投稿後に旧投稿を削除)。
Mattermost 編集可能な下書き投稿。 block モードでは、完了済みテキストとツールアクティビティの投稿を切り替えます。他のモードでは、ツールアクティビティを同じ下書き形式の投稿に統合します。

安全な編集をサポートしていないチャンネルでは、入力中インジケーターまたは 最終回答のみの配信にフォールバックします。チャンネルごとのランタイム動作の 詳細な内訳については、ストリーミングとチャンク化を参照してください。

完了処理

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

  • Discord の progress モードでは、最終回答が新しいメッセージとして送信され、 小さな -# アクティビティ受領情報(例: -# 🧠 2 thoughts · 🛠️ 5 tool calls · ⏱️ 12s)が追加されます。その回答の配信後に、 ステータス下書きが削除されます。通信量の多いチャンネルでも返信の上に孤立した ツールログは残りません。エラーとなった最終回答の場合は、失敗したターンの 可視記録として下書きが保持されます。
  • 下書きを安全に最終回答へ変換できる場合(partial/block モード)、 OpenClaw はその場で下書きを編集します。
  • チャンネルがネイティブの進捗ストリーミングを使用している場合、ネイティブ転送が 最終テキストを受け入れた時点で、OpenClaw はそのストリームを完了します。
  • それ以外の場合(メディア、承認プロンプト、明示的な返信対象、チャンク数の超過、 または編集や送信の失敗)、OpenClaw は下書きを上書きせず、通常のチャンネル配信経路を通じて 最終回答を送信します。

このフォールバックは意図的なものです。新しい最終回答を送信するほうが、 テキストの消失、誤ったスレッドへの返信、またはチャンネルが安全に表現できない ペイロードによる下書きの上書きを避けられます。

トラブルシューティング

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

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

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

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

編集された下書きではなく、新しい最終メッセージが表示されます。

これは完了処理で説明した安全上のフォールバックです。 メディアへの返信、長い回答、明示的な返信対象、古い Telegram の下書き、 Slack のスレッド対象の欠落、削除されたプレビューメッセージ、または ネイティブストリームの完了処理の失敗で発生することがあります。

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

下書きがアクティブな間、進捗モードはデフォルトの独立したツール進捗メッセージを 抑制します。それでも独立したメッセージが表示される場合、そのターンが実際に progress モードを使用しており、streaming.mode: "off" や、 そのメッセージの下書きを作成できないチャンネル経路を使用していないことを確認してください。

Teams の動作が Discord や Telegram と異なります。

Microsoft Teams は汎用的な送信後編集式のプレビュー転送ではなく、個人チャットで ネイティブストリームを使用します。また、Discord や Telegram のような 下書きプレビューのブロックモードがないため、streaming.mode: "block" を Teams の ブロック配信に対応付けます。

関連項目

Was this useful?
On this page

On this page