Web interfaces

Веб-чат

Статус: интерфейс чата 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)

Полная конфигурация: Конфигурация

У 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 (см. Аутентификация доверенного прокси).
  • gateway.remote.url, gateway.remote.token, gateway.remote.password: целевой удалённый Gateway.
  • session.*: хранилище сеансов и стандартные значения основного ключа.

См. также

Was this useful?
On this page

On this page