Основы
Архитектура шлюза
Последнее обновление: 2026-01-22
Обзор
- Единственный долгоживущий Шлюз управляет всеми поверхностями для обмена сообщениями (WhatsApp через Baileys, Telegram через grammY, Slack, Discord, Signal, iMessage, WebChat).
- Клиенты плоскости управления (приложение для macOS, CLI, веб-интерфейс, автоматизации) подключаются к Шлюзу по WebSocket на настроенном хосте привязки (по умолчанию
127.0.0.1:18789). - Узлы (macOS/iOS/Android/headless) также подключаются по WebSocket, но объявляют
role: nodeс явными возможностями/командами. - Один Шлюз на хост; это единственное место, где открывается сессия WhatsApp.
- Хост canvas обслуживается HTTP-сервером Шлюза по адресам:
/__openclaw__/canvas/(HTML/CSS/JS, редактируемые агентом)/__openclaw__/a2ui/(хост A2UI) Он использует тот же порт, что и Шлюз (по умолчанию18789).
Компоненты и потоки
Шлюз (демон)
- Поддерживает подключения к провайдерам.
- Предоставляет типизированный WS API (запросы, ответы, события с сервера).
- Проверяет входящие фреймы на соответствие JSON Schema.
- Генерирует события, такие как
agent,chat,presence,health,heartbeat,cron.
Клиенты (приложение для Mac / CLI / веб-админка)
- Одно WS-подключение на клиента.
- Отправляют запросы (
health,status,send,agent,system-presence). - Подписываются на события (
tick,agent,presence,shutdown).
Узлы (macOS / iOS / Android / headless)
- Подключаются к тому же WS-серверу с
role: node. - Предоставляют идентификатор устройства в
connect; спаривание происходит на основе устройства (рольnode), и подтверждение хранится в хранилище спаренных устройств. - Предоставляют команды, такие как
canvas.*,camera.*,screen.record,location.get.
Детали протокола:
WebChat
- Статический интерфейс, который использует WS API Шлюза для истории чата и отправки сообщений.
- В удаленных конфигурациях подключается через тот же SSH/Tailscale туннель, что и другие клиенты.
Жизненный цикл подключения (один клиент)
Проводной протокол (кратко)
- Транспорт: WebSocket, текстовые фреймы с полезной нагрузкой JSON.
- Первый фрейм обязательно должен быть
connect. - После подтверждения соединения:
- Запросы:
{type:"req", id, method, params}→{type:"res", id, ok, payload|error} - События:
{type:"event", event, payload, seq?, stateVersion?}
- Запросы:
- Если задан
OPENCLAW_GATEWAY_TOKEN(или--token),connect.params.auth.tokenдолжен совпадать, иначе сокет закрывается. - Ключи идемпотентности требуются для методов с побочными эффектами (
send,agent) для безопасного повторения; сервер хранит кратковременный кэш дедупликации. - Узлы должны включать
role: "node", а также возможности/команды/разрешения вconnect.
Спаривание + локальное доверие
- Все WS-клиенты (операторы и узлы) включают идентификатор устройства в
connect. - Новые идентификаторы устройств требуют подтверждения спаривания; Шлюз выдает токен устройства для последующих подключений.
- Локальные подключения (loopback или собственный адрес tailnet хоста шлюза) могут быть подтверждены автоматически для удобства работы на том же хосте.
- Все подключения должны подписывать одноразовый номер
connect.challenge. - Полезная нагрузка подписи
v3также привязываетplatform+deviceFamily; шлюз фиксирует метаданные спаренного устройства при повторном подключении и требует повторного спаривания при изменении метаданных. - Нелокальные подключения по-прежнему требуют явного подтверждения.
- Аутентификация шлюза (
gateway.auth.*) по-прежнему применяется ко всем подключениям, локальным или удаленным.
Подробности: Протокол шлюза, Спаривание, Безопасность.
Типизация протокола и кодогенерация
- Схемы TypeBox определяют протокол.
- JSON Schema генерируется из этих схем.
- Swift-модели генерируются из JSON Schema.
Удаленный доступ
-
Предпочтительный способ: Tailscale или VPN.
-
Альтернатива: SSH-туннель
Копировать
ssh -N -L 18789:127.0.0.1:18789 user@host -
Тот же процесс подтверждения соединения и токен аутентификации применяются через туннель.
-
TLS и опциональная привязка сертификата могут быть включены для WS в удаленных конфигурациях.
Снимок операций
- Запуск:
openclaw gateway(на переднем плане, логи в stdout). - Проверка состояния:
healthчерез WS (также включено вhello-ok). - Наблюдение: launchd/systemd для автоматического перезапуска.
Инварианты
- Ровно один Шлюз управляет единственной сессией Baileys на хост.
- Подтверждение соединения обязательно; любой первый фрейм, не являющийся JSON или не
connect, приводит к немедленному закрытию. - События не воспроизводятся повторно; клиенты должны обновлять данные при пропусках.