> ## Documentation Index
> Fetch the complete documentation index at: https://docs2.openclaw.ai/llms.txt
> Use this file to discover all available pages before exploring further.

# Веб-чат

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

## Что это

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

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

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

## Как это работает (поведение)

* Интерфейс подключается к 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 отображаются как явный разделитель сжатой истории. Разделитель объясняет, что сжатый транскрипт сохранён как контрольная точка, и ссылается на элементы управления контрольными точками сеансов, где операторы могут создать ветку или восстановиться из этого сжатого представления, если это разрешено их правами.
* Control UI запоминает базовый `sessionId` Gateway, возвращённый `chat.history`, и включает его в последующие вызовы `chat.send`, поэтому повторные подключения и обновления страницы продолжают тот же сохранённый разговор, если пользователь не запускает или не сбрасывает сеанс.
* Control UI объединяет дублирующиеся отправки в процессе выполнения для того же сеанса, сообщения и вложений до генерации нового идентификатора запуска `chat.send`; Gateway по-прежнему дедуплицирует повторные запросы, которые повторно используют тот же ключ идемпотентности.
* Файлы запуска рабочей области и ожидающие инструкции `BOOTSTRAP.md` передаются через Project Context системного промпта агента, а не копируются в пользовательское сообщение WebChat. Обрезка bootstrap добавляет только краткое уведомление о восстановлении в системном промпте; подробные счётчики и параметры конфигурации остаются на диагностических поверхностях.
* `chat.history` также нормализован для отображения: runtime-контекст 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` добавляет заметку ассистента напрямую в транскрипт и транслирует её в интерфейс (без запуска агента).
* Прерванные запуски могут оставлять частичный вывод ассистента видимым в интерфейсе.
* Gateway сохраняет прерванный частичный текст ассистента в историю транскрипта, когда есть буферизованный вывод, и помечает эти записи метаданными прерывания.
* История всегда запрашивается из шлюза (без локального отслеживания файлов).
* Если шлюз недоступен, WebChat работает только для чтения.

### Модель транскрипта и доставки

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

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

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

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

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

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

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

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

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

## Связанные материалы

* [Control UI](/ru/web/control-ui)
* [Панель мониторинга](/ru/web/dashboard)
