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

  • Панель інструментів /agents у Control UI має подання «Доступні зараз» на основі tools.effective(sessionKey=...): сформовану сервером проєкцію інструментарію поточного сеансу лише для читання, зокрема основних інструментів, інструментів плагінів і каналів, а також уже виявлених інструментів серверів MCP.
  • Окреме подання для редагування конфігурації (на основі tools.catalog) охоплює профілі, перевизначення для окремих агентів і семантику каталогу.
  • Доступність у середовищі виконання визначається окремо для кожного сеансу. Перемикання сеансів того самого агента може змінити список «Доступні зараз». Якщо підключення до налаштованих серверів 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