---
read_when:
    - Отладка или настройка доступа к WebChat
summary: Локальный статический хост WebChat и использование Gateway WS для пользовательского интерфейса чата
title: Веб-чат
x-i18n:
    generated_at: "2026-07-13T18:52:42Z"
    model: gpt-5.6
    postprocess_version: locale-links-v1
    prompt_version: 24
    provider: openai
    source_hash: e31558b3f82fc75b660455ad7835e0b43ea07de28fbbc98d4efd82f5d30425fc
    source_path: web/webchat.md
    workflow: 16
---

Статус: интерфейс чата SwiftUI для macOS/iOS подключается напрямую к WebSocket Gateway. Без встроенного браузера и локального сервера статических файлов.

## Что это такое

- Нативный интерфейс чата для Gateway.
- Использует те же сеансы и правила маршрутизации, что и другие каналы.
- Детерминированная маршрутизация: ответы всегда возвращаются в WebChat.
- История всегда загружается из Gateway (без отслеживания локальных файлов). Если Gateway недоступен, WebChat работает только для чтения.

## Быстрый старт

1. Запустите Gateway.
2. Откройте интерфейс WebChat (приложение для macOS/iOS) или вкладку чата Control UI.
3. Убедитесь, что настроен допустимый способ аутентификации в Gateway (по умолчанию используется общий секрет, даже при подключении через loopback).

## Как это работает

- Интерфейс подключается к WebSocket Gateway и использует методы RPC `chat.history`, `chat.send`, `chat.inject` и `chat.message.get`.
- `chat.history` ограничен для обеспечения стабильности: Gateway может обрезать длинные текстовые поля, исключать объёмные метаданные и заменять слишком большие записи на `[chat.history omitted: message too large]`. Клиенты API могут передать `maxChars` для отдельного запроса, чтобы переопределить стандартный лимит для одного вызова.
- Если видимое сообщение ассистента было обрезано в `chat.history`, Control UI может открыть боковую панель чтения и по запросу получить полную нормализованную для отображения запись через `chat.message.get`, не увеличивая стандартный объём данных истории. `chat.message.get` использует ту же ветвь расшифровки и те же правила отображения, что и `chat.history`, но выбирает одну запись по `messageId` и возвращает точную причину недоступности, если полное содержимое больше нельзя получить.
- `chat.history` следует активной ветви расшифровки для файлов сеансов, доступных только для добавления, поэтому заброшенные ветви перезаписи и заменённые копии промптов не отображаются в WebChat.
- Записи Compaction отображаются как разделитель «Сжатая история» с пояснением, что сжатая расшифровка сохранена как контрольная точка, и действием для открытия контрольных точек сеанса (создания ветви или восстановления, если позволяют разрешения).
- Control UI запоминает базовый `sessionId` Gateway, возвращённый методом `chat.history`, и включает его в последующие вызовы `chat.send`, поэтому после переподключения и обновления страницы продолжается тот же сохранённый разговор, если пользователь не создаст или не сбросит сеанс.
- `chat.send` принимает ключ идемпотентности (Control UI использует идентификатор запуска); Gateway устраняет повторные запросы с тем же ключом, поэтому повторные попытки или дублирующиеся одновременно выполняемые отправки для одного и того же сеанса, сообщения и вложений не создают второй запуск.
- Файлы запуска рабочего пространства и ожидающие инструкции `BOOTSTRAP.md` передаются через раздел `# Project Context` системного промпта агента, а не копируются в пользовательское сообщение WebChat. Если содержимое начальной загрузки обрезано, системный промпт вместо него получает краткое «Уведомление о контексте начальной загрузки»; подробные счётчики и параметры конфигурации остаются в диагностических интерфейсах.
- Нормализация отображения в `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` добавляет примечание ассистента непосредственно в расшифровку и передаёт его интерфейсу (без запуска агента).
- После прерванных запусков частичный вывод ассистента может оставаться видимым в интерфейсе. Если буферизованный вывод существует, Gateway сохраняет этот частичный текст в истории расшифровки и помечает запись метаданными прерывания.

### Модель расшифровки и доставки

WebChat использует два отдельных пути данных:

- Строки расшифровки в SQLite представляют собой долговечную расшифровку модели и среды выполнения. При обычных запусках агента встроенная среда выполнения OpenClaw сохраняет видимые модели сообщения `user`, `assistant` и `toolResult` через средство доступа к сеансу. WebChat не записывает в эту расшифровку произвольный текст доставки, состояния или вспомогательных сообщений.
- События Gateway `ReplyPayload` представляют собой оперативную проекцию доставки: они нормализуются для отображения в WebChat или канале с учётом потоковой передачи блоков, тегов директив, внедрения медиафайлов, флагов TTS/аудио и резервного поведения интерфейса. Сами по себе они не являются каноническим журналом сеанса.
- Среды тестирования, которым требуются видимые ответы через `tools.message`, по-прежнему используют WebChat как внутренний приёмник исходных ответов текущего запуска. `message.send` без указанного назначения из этого активного запуска WebChat проецируется в тот же чат и дублируется в расшифровку сеанса; WebChat не становится повторно используемым исходящим каналом и никогда не наследует `lastChannel`.
- WebChat добавляет записи ассистента в расшифровку только тогда, когда Gateway управляет отображаемым сообщением вне обычного встроенного хода агента: `chat.inject`, ответы команд без участия агента, прерванный частичный вывод и управляемые WebChat дополнения расшифровки для медиафайлов.
- Если во время запуска отображается текст ассистента, но после перезагрузки истории он исчезает, проверьте по порядку: содержит ли расшифровка SQLite текст ассистента, не удалила ли его проекция отображения `chat.history`, а затем не заменила ли логика объединения оптимистичного хвоста Control UI локальное состояние доставки сохранённым снимком.

Итоговые ответы обычного запуска агента должны сохраняться, поскольку встроенная среда выполнения записывает `message_end` ассистента. Любой резервный механизм, дублирующий доставленные итоговые данные в расшифровку, сначала должен убедиться, что ход ассистента, уже записанный встроенной средой выполнения, не будет продублирован.

## Панель инструментов агентов в Control UI

- Панель Tools раздела `/agents` в Control UI содержит представление "Available Right Now", использующее `tools.effective(sessionKey=...)`: сформированную сервером проекцию доступного только для чтения текущего набора инструментов сеанса, включая основные инструменты, инструменты плагинов и каналов, а также уже обнаруженные инструменты серверов MCP.
- Отдельное представление для редактирования конфигурации (использующее `tools.catalog`) охватывает профили, переопределения для отдельных агентов и семантику каталога.
- Доступность во время выполнения определяется на уровне сеанса. При переключении между сеансами одного и того же агента список "Available Right Now" может измениться. Если соединение с настроенными серверами MCP ещё не устанавливалось или их конфигурация изменилась после последнего обнаружения, панель показывает уведомление, а не запускает незаметно транспорты MCP из пути чтения.
- Редактор конфигурации не подразумевает доступность во время выполнения; фактический доступ по-прежнему определяется приоритетом политик (`allow`/`deny`, переопределениями для отдельных агентов, провайдеров и каналов).

## Удалённое использование

- В удалённом режиме WebSocket Gateway туннелируется через SSH/Tailscale.
- Запускать отдельный сервер WebChat не требуется.

## Справочник по конфигурации (WebChat)

Полная конфигурация: [Конфигурация](/ru/gateway/configuration)

У WebChat нет сохраняемого раздела конфигурации. Gateway использует встроенный лимит отображения `chat.history`; клиенты API могут передать `maxChars` для отдельного запроса, чтобы переопределить его для одного вызова. Устаревшие конфигурации `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, если они включены.
- `gateway.auth.mode: "trusted-proxy"`: аутентификация через обратный прокси для браузерных клиентов за учитывающим идентификацию источником прокси **не из loopback** (см. [Аутентификация доверенного прокси](/ru/gateway/trusted-proxy-auth)).
- `gateway.remote.url`, `gateway.remote.token`, `gateway.remote.password`: целевой удалённый Gateway.
- `session.*`: хранилище сеансов и стандартные значения основного ключа.

## См. также

- [Control UI](/ru/web/control-ui)
- [Панель управления](/ru/web/dashboard)
