Интерфейс управления (браузер)
Интерфейс управления — это небольшое одностраничное приложение Vite + Lit, обслуживаемое шлюзом:
- по умолчанию: http://<host>:18789/
- опциональный префикс: установите gateway.controlUi.basePath (например /openclaw)
Он общается напрямую с WebSocket шлюза на том же порту.
Быстрое открытие (локально)
Если шлюз работает на том же компьютере, откройте:
Если страница не загружается, сначала запустите шлюз: openclaw gateway.
Аутентификация предоставляется во время рукопожатия WebSocket через:
- connect.params.auth.token
- connect.params.auth.password Панель настроек панели управления позволяет сохранить токен; пароли не сохраняются. Мастер адаптации генерирует токен шлюза по умолчанию, поэтому вставьте его сюда при первом подключении.
Что он может делать (сегодня)
- Чат с моделью через WebSocket шлюза (chat.history, chat.send, chat.abort, chat.inject)
- Потоковая передача вызовов инструментов + карточки вывода живых инструментов в чате (события агента)
- Каналы: статус WhatsApp/Telegram/Discord/Slack + канальных плагинов (Mattermost и т.д.) + вход по QR + конфигурация для каждого канала (channels.status, web.login.*, config.patch)
- Инстансы: список присутствия + обновление (system-presence)
- Сессии: список + переопределения thinking/verbose для каждой сессии (sessions.list, sessions.patch)
- Задачи Cron: список/добавить/запустить/включить/отключить + история запусков (cron.*)
- Навыки: статус, включить/отключить, установить, обновления API-ключей (skills.*)
- Ноды: список + возможности (node.list)
- Подтверждения Exec: редактировать списки разрешений шлюза или ноды + политику запроса для exec host=gateway/node (exec.approvals.*)
- Конфигурация: просмотр/редактирование ~/.openclaw/openclaw.json (config.get, config.set)
- Конфигурация: применение + перезапуск с валидацией (config.apply) и пробуждение последней активной сессии
- Запись конфигурации включает защиту base-hash для предотвращения затирания одновременных правок
- Схема конфигурации + рендеринг форм (config.schema, включая схемы плагинов + каналов); редактор необработанного JSON остается доступным
- Отладка: снапшоты status/health/models + лог событий + ручные RPC-вызовы (status, health, models.list)
- Логи: живое отслеживание файловых логов шлюза с фильтром/экспортом (logs.tail)
- Обновление: запуск обновления пакета/git + перезапуск (update.run) с отчетом о перезапуске
Поведение чата
- chat.send неблокирующий: он немедленно подтверждает с \{ runId, status: "started" \}, и ответ передается через события chat.
- Повторная отправка с тем же idempotencyKey возвращает \{ status: "in_flight" \} во время работы и \{ status: "ok" \} после завершения.
- chat.inject добавляет заметку ассистента в транскрипт сессии и транслирует событие chat только для обновления UI (без запуска агента, без доставки в канал).
- Остановка:
- Нажмите Stop (вызывает chat.abort)
- Введите /stop (или stop|esc|abort|wait|exit|interrupt) для прерывания вне полосы
- chat.abort поддерживает \{ sessionKey \} (без runId) для прерывания всех активных запусков для этой сессии
Доступ к Tailnet (рекомендуется)
Интегрированный Tailscale Serve (предпочтительно)
Держите шлюз на loopback и пусть Tailscale Serve проксирует его с HTTPS:
openclaw gateway --tailscale serve
Откройте:
- https://<magicdns>/ (или ваш настроенный gateway.controlUi.basePath)
По умолчанию запросы Serve могут аутентифицироваться через заголовки идентификации Tailscale (tailscale-user-login), когда gateway.auth.allowTailscale равно true. OpenClaw проверяет идентификацию, разрешая адрес x-forwarded-for с помощью tailscale whois и сопоставляя его с заголовком, и принимает их только когда запрос приходит на loopback с заголовками x-forwarded-* от Tailscale. Установите gateway.auth.allowTailscale: false (или принудительно gateway.auth.mode: "password"), если хотите требовать токен/пароль даже для трафика Serve.
Привязка к tailnet + токен
openclaw gateway --bind tailnet --token "$(openssl rand -hex 32)"
Затем откройте:
- http://<tailscale-ip>:18789/ (или ваш настроенный gateway.controlUi.basePath)
Вставьте токен в настройки UI (отправляется как connect.params.auth.token).
Небезопасный HTTP
Если вы открываете панель управления через простой HTTP (http://<lan-ip> или http://<tailscale-ip>), браузер работает в небезопасном контексте и блокирует WebCrypto. По умолчанию OpenClaw блокирует подключения к интерфейсу управления без идентификации устройства.
Рекомендуемое исправление: используйте HTTPS (Tailscale Serve) или откройте UI локально:
- https://<magicdns>/ (Serve)
- http://127.0.0.1:18789/ (на хосте шлюза)
Пример понижения (только токен через HTTP):
{
gateway: {
controlUi: { allowInsecureAuth: true },
bind: "tailnet",
auth: { mode: "token", token: "replace-me" }
}
}
Это отключает идентификацию устройства + сопряжение для интерфейса управления (даже через HTTPS). Используйте только если доверяете сети.
См. Tailscale для руководства по настройке HTTPS.
Сборка UI
Шлюз обслуживает статические файлы из dist/control-ui. Соберите их с помощью:
pnpm ui:build # автоматически устанавливает зависимости UI при первом запуске
Опциональная абсолютная база (когда вам нужны фиксированные URL активов):
OPENCLAW_CONTROL_UI_BASE_PATH=/openclaw/ pnpm ui:build
Для локальной разработки (отдельный dev-сервер):
pnpm ui:dev # автоматически устанавливает зависимости UI при первом запуске
Затем направьте UI на URL вашего WebSocket шлюза (например ws://127.0.0.1:18789).
Отладка/тестирование: dev-сервер + удаленный шлюз
Интерфейс управления — это статические файлы; цель WebSocket настраивается и может отличаться от HTTP-источника. Это удобно, когда вам нужен dev-сервер Vite локально, но шлюз работает в другом месте.
- Запустите dev-сервер UI: pnpm ui:dev
- Откройте URL вроде:
http://localhost:5173/?gatewayUrl=ws://<gateway-host>:18789
Опциональная одноразовая аутентификация (если требуется):
http://localhost:5173/?gatewayUrl=wss://<gateway-host>:18789&token=<gateway-token>
Примечания:
- gatewayUrl сохраняется в localStorage после загрузки и удаляется из URL.
- token сохраняется в localStorage; password хранится только в памяти.
- Используйте wss://, когда шлюз находится за TLS (Tailscale Serve, HTTPS-прокси и т.д.).
Детали настройки удаленного доступа: Удаленный доступ.