Web interfaces
Веб-чат
Статус: интерфейс чата SwiftUI для macOS/iOS подключается напрямую к WebSocket Gateway. Без встроенного браузера и локального сервера статических файлов.
Что это такое
- Нативный интерфейс чата для Gateway.
- Использует те же сеансы и правила маршрутизации, что и другие каналы.
- Детерминированная маршрутизация: ответы всегда возвращаются в WebChat.
- История всегда загружается из Gateway (без отслеживания локальных файлов). Если Gateway недоступен, WebChat работает только для чтения.
Быстрый старт
- Запустите Gateway.
- Откройте интерфейс WebChat (приложение для macOS/iOS) или вкладку чата Control UI.
- Убедитесь, что настроен допустимый способ аутентификации в 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 запоминает базовый
sessionIdGateway, возвращённый методом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.*: хранилище сеансов и стандартные значения основного ключа.