Web interfaces

WebChat

ステータス: macOS/iOS の SwiftUI チャット UI は Gateway WebSocket と直接通信します。埋め込みブラウザもローカル静的サーバーも使用しません。

概要

  • Gateway 用のネイティブチャット UI です。
  • 他のチャネルと同じセッションおよびルーティングルールを使用します。
  • 決定論的ルーティング: 返信は常に WebChat に返されます。
  • 履歴は常に Gateway から取得されます(ローカルファイルの監視は行いません)。Gateway に到達できない場合、WebChat は読み取り専用になります。

クイックスタート

  1. Gateway を起動します。
  2. WebChat UI(macOS/iOS アプリ)または Control UI のチャットタブを開きます。
  3. 有効な Gateway 認証経路が設定されていることを確認します(loopback 上でも、デフォルトでは共有シークレットを使用します)。

仕組み

  • UI は Gateway WebSocket に接続し、chat.historychat.sendchat.injectchat.message.get RPC メソッドを使用します。
  • 安定性を確保するため、chat.history には上限があります。Gateway は長いテキストフィールドを切り詰め、容量の大きいメタデータを省略し、サイズ超過のエントリを [chat.history omitted: message too large] に置き換えることがあります。API クライアントはリクエストごとに maxChars を送信し、1 回の呼び出しに限ってデフォルトの上限を上書きできます。
  • 表示対象のアシスタントメッセージが chat.history で切り詰められた場合、Control UI はサイドリーダーを開き、デフォルトの履歴ペイロードを増やすことなく、chat.message.get を通じて表示用に正規化された完全なエントリをオンデマンドで取得できます。chat.message.getchat.history と同じトランスクリプトブランチおよび表示ルールを使用しますが、messageId で 1 つのエントリを対象とし、完全な内容を返せなくなった場合はその理由を正確に返します。
  • chat.history は追記専用セッションファイルのアクティブなトランスクリプトブランチに従うため、破棄された書き換えブランチや置き換え済みのプロンプトコピーは WebChat に表示されません。
  • Compaction エントリは「圧縮済み履歴」区切りとして表示され、圧縮されたトランスクリプトがチェックポイントとして保持されていることを説明します。また、セッションのチェックポイントを開く操作も表示されます(権限で許可されている場合は、ブランチ作成または復元が可能です)。
  • Control UI は chat.history が返した基盤 Gateway の sessionId を記憶し、後続の chat.send 呼び出しに含めます。そのため、ユーザーがセッションを開始またはリセットしない限り、再接続やページ更新後も同じ保存済み会話が継続されます。
  • chat.send は冪等性キーを受け取ります(Control UI は実行 ID を使用します)。Gateway は同じキーを再利用する繰り返しリクエストを重複排除するため、同じセッション、メッセージ、添付ファイルに対する再試行や重複した処理中の送信によって 2 回目の実行が作成されることはありません。
  • ワークスペースの起動ファイルと保留中の BOOTSTRAP.md 命令は、WebChat のユーザーメッセージにコピーされるのではなく、エージェントシステムプロンプトの # Project Context セクションを通じて提供されます。ブートストラップ内容が切り詰められた場合、代わりにシステムプロンプトへ短い「ブートストラップコンテキスト通知」が追加されます。詳細な件数や設定項目は診断画面にのみ表示されます。
  • chat.history の表示正規化では、ランタイム専用の OpenClaw コンテキスト、受信エンベロープラッパー、[[reply_to_current]][[reply_to:<id>]][[audio_as_voice]] などのインライン配信ディレクティブタグ、プレーンテキストのツール呼び出し XML ペイロード(<tool_call><function_call><tool_calls><function_calls>。切り詰められたブロックを含む)、および漏出した ASCII/全角のモデル制御トークンが除去されます。表示テキスト全体がサイレントトークン NO_REPLY のみであるアシスタントエントリは、大文字と小文字を区別せず省略されます。
  • 推論フラグ付きの返信ペイロード(isReasoning: true)は WebChat のアシスタントコンテンツ、トランスクリプト再生テキスト、音声コンテンツブロックから除外されるため、思考専用ペイロードが表示対象のアシスタントメッセージや再生可能な音声として現れることはありません。
  • chat.inject はアシスタントの注記をトランスクリプトへ直接追記し、UI にブロードキャストします(エージェント実行は行いません)。
  • 中断された実行では、部分的なアシスタント出力を UI に表示したままにできます。バッファリングされた出力が存在する場合、Gateway はその部分テキストをトランスクリプト履歴に保存し、エントリに中断メタデータを付与します。

トランスクリプトと配信モデル

WebChat には 2 つの独立したデータ経路があります。

  • SQLite のトランスクリプト行は、永続的なモデル/ランタイムトランスクリプトです。通常のエージェント実行では、埋め込み OpenClaw ランタイムがセッションアクセサーを通じて、モデルから見える userassistanttoolResult メッセージを永続化します。WebChat は任意の配信、ステータス、補助テキストをそのトランスクリプトへ書き込みません。
  • Gateway の ReplyPayload イベントはライブ配信プロジェクションです。WebChat/チャネル表示、ブロックストリーミング、ディレクティブタグ、メディア埋め込み、TTS/音声フラグ、UI フォールバック動作用に正規化されます。これら自体は正規のセッションログではありません。
  • tools.message を通じて表示可能な返信を必要とするハーネスでは、引き続き WebChat を現在実行中の内部ソース返信シンクとして使用します。そのアクティブな WebChat 実行から送信先なしで呼び出された message.send は、同じチャットに投影され、セッショントランスクリプトにもミラーリングされます。WebChat が再利用可能な送信チャネルになることはなく、lastChannel を継承することもありません。
  • WebChat がアシスタントのトランスクリプトエントリを挿入するのは、通常の埋め込みエージェントターン以外で Gateway が表示メッセージを所有する場合のみです。対象は chat.inject、エージェント以外のコマンド返信、中断された部分出力、WebChat が管理するメディアトランスクリプト補足です。
  • 実行中にライブのアシスタントテキストが表示されても履歴の再読み込み後に消える場合は、次の順序で確認してください。SQLite トランスクリプトにアシスタントテキストが含まれているか、chat.history の表示プロジェクションによって除去されたか、Control UI の楽観的末尾マージによってローカル配信状態が永続化済みスナップショットに置き換えられたか。

通常のエージェント実行の最終回答は、埋め込みランタイムがアシスタントの message_end を書き込むため、永続化される必要があります。配信された最終ペイロードをトランスクリプトへミラーリングするフォールバックでは、埋め込みランタイムがすでに書き込んだアシスタントターンとの重複をまず回避する必要があります。

Control UI のエージェントツールパネル

  • Control UI の /agents ツールパネルには、tools.effective(sessionKey=...) によって提供される「現在利用可能」ビューがあります。これは、コア、Plugin、チャネル所有、および検出済みの MCP サーバーツールを含む、現在のセッションのツール一覧をサーバー側で生成した読み取り専用プロジェクションです。
  • 別の設定編集ビュー(tools.catalog によって提供)では、プロファイル、エージェントごとのオーバーライド、カタログのセマンティクスを扱います。
  • ランタイムでの可用性はセッション単位です。同じエージェント上でセッションを切り替えると、「現在利用可能」リストが変わる場合があります。設定済みの MCP サーバーが未接続であるか、前回の検出以降に変更されている場合、読み取り経路から MCP トランスポートを暗黙に起動する代わりに、パネルに通知が表示されます。
  • 設定エディターはランタイムでの可用性を意味しません。実効アクセスには、引き続きポリシーの優先順位(allow/deny、エージェントごと、およびプロバイダー/チャネルのオーバーライド)が適用されます。

リモート使用

  • リモートモードでは、SSH/Tailscale 経由で Gateway WebSocket をトンネリングします。
  • 別個の WebChat サーバーを実行する必要はありません。

設定リファレンス(WebChat)

完全な設定については、設定を参照してください。

WebChat には永続化される設定セクションはありません。Gateway は組み込みの chat.history 表示上限を使用します。API クライアントはリクエストごとに maxChars を送信し、1 回の呼び出しに限って上書きできます。従来の channels.webchat および gateway.webchat 設定は廃止されています。削除するには openclaw doctor --fix を実行してください。

関連するグローバルオプション:

  • gateway.portgateway.bind: WebSocket のホスト/ポート。
  • gateway.auth.modegateway.auth.tokengateway.auth.password: 共有シークレットによる WebSocket 認証。
  • gateway.auth.allowTailscale: 有効にすると、ブラウザの Control UI チャットタブで Tailscale Serve の ID ヘッダーを使用できます。
  • gateway.auth.mode: "trusted-proxy": ID 対応の 非 loopback プロキシソースの背後にあるブラウザクライアント向けのリバースプロキシ認証(信頼済みプロキシ認証を参照)。
  • gateway.remote.urlgateway.remote.tokengateway.remote.password: リモート Gateway の接続先。
  • session.*: セッションストレージおよびメインキーのデフォルト。

関連項目

Was this useful?
On this page

On this page