---
read_when:
    - WebChat アクセスのデバッグまたは設定
summary: チャット UI 向けの Loopback WebChat 静的ホストと Gateway WS の使用法
title: WebChat
x-i18n:
    generated_at: "2026-06-27T13:24:07Z"
    model: gpt-5.5
    postprocess_version: locale-links-v1
    provider: openai
    source_hash: 108dd98f975a2d2e980921bd0f486c3683c18ba6eb37111163af87929a9d7973
    source_path: web/webchat.md
    workflow: 16
---

ステータス: macOS/iOS SwiftUI チャット UI は Gateway WebSocket と直接通信します。

## 概要

- ゲートウェイ向けのネイティブチャット UI です (埋め込みブラウザーもローカル静的サーバーも使いません)。
- 他のチャネルと同じセッションとルーティングルールを使用します。
- 決定的ルーティング: 返信は常に WebChat に戻ります。

## クイックスタート

1. ゲートウェイを起動します。
2. WebChat UI (macOS/iOS アプリ) または Control UI のチャットタブを開きます。
3. 有効なゲートウェイ認証パスが構成されていることを確認します (デフォルトは共有シークレットで、
   ループバック上でも同様です)。

## 仕組み (動作)

- UI は Gateway WebSocket に接続し、`chat.history`、`chat.send`、`chat.inject` を使用します。
- `chat.history` は安定性のために制限されます。Gateway は長いテキストフィールドを切り詰め、重いメタデータを省略し、サイズが大きすぎるエントリを `[chat.history omitted: message too large]` に置き換えることがあります。
- 表示可能なアシスタントメッセージが `chat.history` で切り詰められた場合、Control UI はサイドリーダーを開き、デフォルトの履歴ペイロードを増やさずに `chat.message.get` を通じて完全な表示正規化済みエントリをオンデマンドで取得できます。
- `chat.history` は、現代的な追記専用セッションファイルではアクティブなトランスクリプトブランチに従うため、放棄された書き換えブランチや置き換え済みのプロンプトコピーは WebChat に描画されません。
- Compaction エントリは、明示的な圧縮済み履歴の区切りとして描画されます。この区切りは、圧縮済みトランスクリプトがチェックポイントとして保持されることを説明し、権限が許す場合にオペレーターがその圧縮済みビューからブランチ作成や復元を行える Sessions のチェックポイント操作へリンクします。
- Control UI は `chat.history` が返す背後の Gateway `sessionId` を記憶し、後続の `chat.send` 呼び出しに含めます。そのため、ユーザーがセッションを開始またはリセットしない限り、再接続やページ更新後も同じ保存済み会話が継続されます。
- Control UI は、新しい `chat.send` 実行 ID を生成する前に、同じセッション、メッセージ、添付ファイルに対する重複した送信中リクエストを集約します。Gateway は同じ冪等性キーを再利用する反復リクエストも引き続き重複排除します。
- ワークスペース起動ファイルと保留中の `BOOTSTRAP.md` 指示は、WebChat のユーザーメッセージにコピーされるのではなく、エージェントシステムプロンプトの Project Context を通じて提供されます。ブートストラップの切り詰めでは簡潔なシステムプロンプト復旧通知だけが追加され、詳細な件数と構成ノブは診断サーフェスに残ります。
- `chat.history` も表示正規化されます。ランタイム専用の OpenClaw コンテキスト、
  受信エンベロープラッパー、`[[reply_to_*]]` や `[[audio_as_voice]]` などのインライン配信ディレクティブタグ、プレーンテキストのツール呼び出し XML
  ペイロード (`<tool_call>...</tool_call>`、
  `<function_call>...</function_call>`、`<tool_calls>...</tool_calls>`、
  `<function_calls>...</function_calls>`、および切り詰められたツール呼び出しブロックを含む)、および
  漏出した ASCII/全角のモデル制御トークンは表示テキストから除去され、
  表示テキスト全体が正確なサイレントトークン `NO_REPLY` / `no_reply` のみであるアシスタントエントリは省略されます。
- 推論フラグ付きの返信ペイロード (`isReasoning: true`) は、WebChat のアシスタントコンテンツ、トランスクリプト再生テキスト、音声コンテンツブロックから除外されるため、思考のみのペイロードが表示可能なアシスタントメッセージや再生可能な音声として表面化することはありません。
- `chat.inject` は、アシスタントノートをトランスクリプトに直接追加し、UI にブロードキャストします (エージェント実行はありません)。
- 中止された実行では、部分的なアシスタント出力が UI に表示されたままになることがあります。
- Gateway は、バッファされた出力が存在する場合、中止された部分的なアシスタントテキストをトランスクリプト履歴に永続化し、それらのエントリに中止メタデータを付与します。
- 履歴は常にゲートウェイから取得されます (ローカルファイル監視はありません)。
- ゲートウェイに到達できない場合、WebChat は読み取り専用になります。

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

WebChat には 2 つの別個のデータパスがあります。

- セッション JSONL ファイルは、永続的なモデル/ランタイムトランスクリプトです。通常のエージェント実行では、埋め込み OpenClaw ランタイムがセッションマネージャーを通じて、モデルから見える `user`、`assistant`、`toolResult` メッセージを永続化します。WebChat は任意の配信、ステータス、補助テキストをそのトランスクリプトに書き込みません。
- Gateway `ReplyPayload` イベントはライブ配信プロジェクションです。これらは WebChat/チャネル表示、ブロックストリーミング、ディレクティブタグ、メディア埋め込み、TTS/音声フラグ、UI フォールバック動作向けに正規化できます。これら自体は正準のセッションログではありません。
- `tools.message` を通じて表示可能な返信を必要とするハーネスは、引き続き WebChat を現在実行中の内部ソース返信シンクとして使用します。そのアクティブな WebChat 実行からのターゲットなしの `message.send` は同じチャットに投影され、セッショントランスクリプトにミラーされます。WebChat は再利用可能な送信チャネルにはならず、`lastChannel` を継承することもありません。
- WebChat は、Gateway が通常の埋め込みエージェントターン外で表示メッセージを所有する場合にのみ、アシスタントトランスクリプトエントリを注入します。対象は `chat.inject`、非エージェントコマンド返信、中止された部分出力、WebChat 管理のメディアトランスクリプト補足です。
- `chat.history` は保存済みセッショントランスクリプトを読み取り、WebChat の表示プロジェクションを適用します。実行中にライブアシスタントテキストが表示されても履歴の再読み込み後に消える場合は、まず生の JSONL にアシスタントテキストが含まれるかを確認し、次に `chat.history` プロジェクションがそれを除去したかを確認し、その後 Control UI の楽観的テールマージがローカル配信状態を永続化済みスナップショットに置き換えたかを確認してください。
- `chat.message.get` は、アクティブエージェントのスコープ設定を含め、`chat.history` と同じトランスクリプトブランチおよび表示プロジェクションルールを使用します。ただし、`messageId` によって 1 つのトランスクリプトエントリを対象にし、完全なコンテンツを返せなくなった場合は正直な利用不可理由を返します。

通常のエージェント実行の最終回答は、埋め込みランタイムがアシスタントの `message_end` を書き込むため、永続的であるべきです。配信済みの最終ペイロードをトランスクリプトにミラーするフォールバックは、埋め込みランタイムがすでに書き込んだアシスタントターンを重複させないことを最初に確認する必要があります。

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

- Control UI の `/agents` Tools パネルには 2 つの別個のビューがあります。
  - **現在利用可能** は `tools.effective(sessionKey=...)` を使用し、コア、Plugin、チャネル所有、
    およびすでに検出済みの MCP サーバーツールを含む、現在のセッションインベントリのサーバー派生の
    読み取り専用プロジェクションを表示します。
  - **ツール構成** は `tools.catalog` を使用し、プロファイル、オーバーライド、
    カタログセマンティクスに焦点を合わせます。
- ランタイム可用性はセッションスコープです。同じエージェントでセッションを切り替えると、
  **現在利用可能** リストが変わることがあります。構成済みの MCP サーバーが接続されていない、または
  最後の検出以降に変更された場合、パネルは読み取りパスから MCP トランスポートを暗黙に開始するのではなく通知を表示します。
- 構成エディターはランタイム可用性を意味しません。有効なアクセスは引き続きポリシーの
  優先順位 (`allow`/`deny`、エージェントごと、およびプロバイダー/チャネルのオーバーライド) に従います。

## リモート利用

- リモートモードは、ゲートウェイ WebSocket を SSH/Tailscale 経由でトンネルします。
- 別の WebChat サーバーを実行する必要はありません。

## 構成リファレンス (WebChat)

完全な構成: [構成](/ja-JP/gateway/configuration)

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

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

- `gateway.port`, `gateway.bind`: WebSocket ホスト/ポート。
- `gateway.auth.mode`, `gateway.auth.token`, `gateway.auth.password`:
  共有シークレット WebSocket 認証。
- `gateway.auth.allowTailscale`: 有効な場合、ブラウザーの Control UI チャットタブは Tailscale
  Serve ID ヘッダーを使用できます。
- `gateway.auth.mode: "trusted-proxy"`: ID 認識型の **非ループバック** プロキシソースの背後にあるブラウザークライアント向けのリバースプロキシ認証です ([Trusted Proxy Auth](/ja-JP/gateway/trusted-proxy-auth) を参照)。
- `gateway.remote.url`, `gateway.remote.token`, `gateway.remote.password`: リモートゲートウェイターゲット。
- `session.*`: セッションストレージとメインキーのデフォルト。

## 関連

- [Control UI](/ja-JP/web/control-ui)
- [Dashboard](/ja-JP/web/dashboard)
