Messages and delivery
進行中の下書き
進行状況ドラフトは、エージェントの作業中に一時的な「まだ作業中」という返信を積み重ねる代わりに、1 件のチャンネルメッセージをリアルタイムのステータス行に変えます。channels.<channel>.streaming.mode: "progress" を設定すると、OpenClaw は実際の作業が始まった時点でメッセージを作成し、エージェントが読み取り、計画、ツール呼び出し、承認待ちを行うたびに編集して、最後に最終回答へ変えます。
作業中...📖 docs/concepts/progress-drafts.md から🔎 Web Search: 「discord edit message」を検索🛠️ Bash: テストを実行クイックスタート
{ 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" を明示的に設定してください。
作業中固定ラベルを使用する場合:
{ channels: { discord: { streaming: { mode: "progress", progress: { label: "Investigating", }, }, }, },}独自のラベルプールを使用する場合(label: "auto" の場合は引き続きランダムまたはシードに基づいて選択されます):
{ channels: { discord: { streaming: { mode: "progress", progress: { label: "auto", labels: ["Checking", "Reading", "Testing", "Finishing"], }, }, }, },}ラベルを非表示にして、進行状況行だけを表示する場合:
{ channels: { discord: { streaming: { mode: "progress", progress: { label: false, }, }, }, },}進行状況行を制御する
進行状況行は、ツールの開始、項目の更新、タスク計画、承認、コマンド出力、パッチの概要、および同様のエージェントアクティビティといった、実際の実行イベントから生成されます。
デフォルトで有効です(progress.toolProgress、デフォルト true)。
ツールは、1 回の呼び出しがまだ実行中の間に、型付きの進行状況を送出することもできます。これにより、時間のかかる取得や検索では、ツールが最終結果を返す前に表示中のドラフトを更新できます。進行状況の更新は、モデル向けの内容が空で、公開チャンネル用の明示的なメタデータを持つ部分的なツール結果です。
{ "content": [], "progress": { "text": "Fetching page content...", "visibility": "channel", "privacy": "public", "id": "web_fetch:fetching" }}OpenClaw は、チャンネルの進行状況 UI に progress.text だけをレンダリングします。通常のツール結果は、後で引き続き content/details として到着し、モデルに返される唯一の部分となります。
ツールに進行状況を追加する場合は、短く汎用的なメッセージを送出し、操作の待機時間が表示に値する長さになるまで遅延させてください。web_fetch は、5 秒の遅延でまさにこの処理を行います。
const clearProgressTimer = scheduleToolProgress( onUpdate, { text: "Fetching page content...", id: "web_fetch:fetching" }, 5_000, { signal },); try { return await runToolWork();} finally { clearProgressTimer();}短時間の呼び出しでは進行状況行は表示されません。長時間の呼び出しでは、処理中に 1 行表示されます。キャンセルされた呼び出しでは、古い進行状況が表示される前にタイマーがクリアされます。進行状況テキストは公開 UI のサイドチャンネルであるため、シークレット、生の引数、取得したコンテンツ、コマンド出力、ページ本文を含めてはなりません。
詳細モード
OpenClaw は、進行状況ドラフトと /verbose に同じフォーマッターを使用します。
{ 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" に設定します。
{ 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 の見出しは前置きのみです)。
設定内のデフォルトモデルを更新してから、その変更を反映するために Gateway を再起動しています。エージェント一覧の呼び出しが 1 回失敗したため、再試行しています。ユーティリティによる説明はデフォルトで有効です(streaming.progress.narration、デフォルト true)。主要モデルへのフォールバックは行われません。明示的な utilityModel、またはエージェントの主要プロバイダーが宣言したデフォルトがある場合にのみ実行されます。ユーティリティルーティングを完全に無効にするには、utilityModel: "" を設定します。ツール行はその下に蓄積され続け、両方のステータスソースが停止すると再び表示されます。ドラフトの編集では、引き続き通常のアクティビティゲートと実際のテキスト変更を待機します。これにより、短時間のターンでの一瞬の表示を回避し、活発なチャンネルでの編集回数を減らします。ユーティリティモデルによる補完だけを無効にするには、narration: false を設定します。モデルの前置き見出しは引き続き有効です。
{ channels: { discord: { streaming: { mode: "progress", progress: { narration: false, }, }, }, },}説明用の入力には上限があり、秘匿化されています。ユーティリティモデルが受け取るのは、受信したリクエストテキストと、ドラフトにレンダリングされるものと同じ、コンパクトで秘匿化されたツール概要です。生のコマンド出力やツール結果を受け取ることはありません。commandText: "status" の場合は、ドラフトの表示内容に合わせて、説明用の入力から exec/bash のコマンドテキストも省略されます。
行数制限
表示される行数を制限します(デフォルトは 8)。
{ channels: { discord: { streaming: { mode: "progress", progress: { maxLines: 4, }, }, }, },}ドラフト編集中のチャットバブルのリフローを減らすため、進行状況行は自動的に圧縮されます。また、更新のたびに改行位置が変わらないように、OpenClaw は長い行を切り詰めます。デフォルトの 1 行あたりの上限は 120 文字です。文章は単語の境界で切り詰められます。一方、パスや生のコマンドなどの長い詳細は、末尾が見えるように中央の省略記号を使って短縮されます。
1 行あたりの上限を調整する場合:
{ channels: { discord: { streaming: { mode: "progress", progress: { maxLineChars: 160, }, }, }, },}リッチレンダリング(Slack)
Slack では、進行状況行をプレーンテキストではなく、構造化された Block Kit フィールドとしてレンダリングできます。
{ channels: { slack: { streaming: { mode: "progress", progress: { render: "rich", }, }, }, },}リッチレンダリングでは、Block Kit フィールドとともに常に同じプレーンテキスト本文も送信されます。そのため、よりリッチな形式をレンダリングできないクライアントでも、コンパクトな進行状況テキストが表示されます。
ツール/タスク行を非表示にする
1 件の進行状況ドラフトは維持しつつ、ツール行とタスク行を非表示にします。
{ 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.mode が
progress になっていることを確認してください。一部のグループまたは引用返信の経路では、
チャンネルが適切なメッセージを安全に編集できない場合、そのターンの
下書きプレビューが無効になります。
ラベルは表示されますが、ツールの行は表示されません。
streaming.progress.toolProgress を確認してください。false の場合、OpenClaw は
単一下書きの動作を維持しますが、ツールとタスクの進捗行を非表示にします。
編集された下書きではなく、新しい最終メッセージが表示されます。
これは最終処理で説明している安全のためのフォールバックです。 メディアへの返信、長い回答、明示的な返信対象、古い Telegram の下書き、 Slack のスレッド対象の欠落、削除されたプレビューメッセージ、または ネイティブストリームの最終処理の失敗時に発生する可能性があります。
独立した進捗メッセージが引き続き表示されます。
下書きが有効な間、進捗モードはデフォルトの独立したツール進捗メッセージを抑制します。
独立したメッセージが引き続き表示される場合は、そのターンが実際に
progress モードを使用しており、streaming.mode: "off" や、そのメッセージの
下書きを作成できないチャンネル経路を使用していないことを確認してください。
Teams の動作が Discord や Telegram と異なります。
Microsoft Teams は、汎用の送信後編集プレビュー転送ではなく、個人チャットで
ネイティブストリームを使用します。また、Discord や Telegram のような
下書きプレビューのブロックモードがないため、streaming.mode: "block" を Teams の
ブロック配信に対応付けます。