Fundamentals
Gateway-Architektur
Überblick
- Ein einzelner langlebiger Gateway besitzt alle Messaging-Oberflächen (WhatsApp über Baileys, Telegram über grammY, Slack, Discord, Signal, iMessage, WebChat).
- Control-Plane-Clients (macOS-App, CLI, Web-UI, Automatisierungen) verbinden sich mit dem
Gateway über WebSocket auf dem konfigurierten Bind-Host (Standard
127.0.0.1:18789). - Nodes (macOS/iOS/Android/headless) verbinden sich ebenfalls über WebSocket, geben aber
role: nodemit expliziten Funktionen/Befehlen an. - Ein Gateway pro Host; er ist die einzige Stelle, die eine WhatsApp-Sitzung öffnet.
- Der Canvas-Host wird vom Gateway-HTTP-Server bereitgestellt unter:
/__openclaw__/canvas/(durch Agenten bearbeitbares HTML/CSS/JS)/__openclaw__/a2ui/(A2UI-Host) Er verwendet denselben Port wie der Gateway (Standard18789).
Komponenten und Abläufe
Gateway (Daemon)
- Verwaltet Provider-Verbindungen.
- Stellt eine typisierte WS-API bereit (Anfragen, Antworten, Server-Push-Ereignisse).
- Validiert eingehende Frames gegen JSON Schema.
- Gibt Ereignisse wie
agent,chat,presence,health,heartbeat,cronaus.
Clients (Mac-App / CLI / Web-Admin)
- Eine WS-Verbindung pro Client.
- Senden Anfragen (
health,status,send,agent,system-presence). - Abonnieren Ereignisse (
tick,agent,presence,shutdown).
Nodes (macOS / iOS / Android / headless)
- Verbinden sich mit demselben WS-Server mit
role: node. - Stellen eine Geräteidentität in
connectbereit; Pairing ist gerätebasiert (Rollenode) und die Freigabe liegt im Geräte-Pairing-Speicher. - Stellen Befehle wie
canvas.*,camera.*,screen.record,location.getbereit.
Protokolldetails:
WebChat
- Statische UI, die die Gateway-WS-API für Chatverlauf und Senden verwendet.
- In Remote-Setups verbindet sie sich über denselben SSH-/Tailscale-Tunnel wie andere Clients.
Verbindungslebenszyklus (einzelner Client)
sequenceDiagram
participant Client
participant Gateway
Client->>Gateway: req:connect
Gateway-->>Client: res (ok)
Note right of Gateway: or res error + close
Note left of Client: payload=hello-ok
snapshot: presence + health
Gateway-->>Client: event:presence
Gateway-->>Client: event:tick
Client->>Gateway: req:agent
Gateway-->>Client: res:agent
ack {runId, status:"accepted"}
Gateway-->>Client: event:agent
(streaming)
Gateway-->>Client: res:agent
final {runId, status, summary}
Wire-Protokoll (Zusammenfassung)
- Transport: WebSocket, Text-Frames mit JSON-Payloads.
- Der erste Frame muss
connectsein. - Nach dem Handshake:
- Anfragen:
{type:"req", id, method, params}→{type:"res", id, ok, payload|error} - Ereignisse:
{type:"event", event, payload, seq?, stateVersion?}
- Anfragen:
hello-ok.features.methods/eventssind Discovery-Metadaten, kein generierter Dump jeder aufrufbaren Hilfsroute.- Shared-Secret-Authentifizierung verwendet
connect.params.auth.tokenoderconnect.params.auth.password, abhängig vom konfigurierten Gateway-Authentifizierungsmodus. - Modi mit Identität wie Tailscale Serve
(
gateway.auth.allowTailscale: true) oder nicht-loopbackgateway.auth.mode: "trusted-proxy"erfüllen die Authentifizierung über Anfrage-Header statt überconnect.params.auth.*. - Private-Ingress
gateway.auth.mode: "none"deaktiviert Shared-Secret-Authentifizierung vollständig; lassen Sie diesen Modus für öffentlichen/nicht vertrauenswürdigen Ingress deaktiviert. - Idempotenzschlüssel sind für Methoden mit Seiteneffekten (
send,agent) erforderlich, um Wiederholungen sicher auszuführen; der Server hält einen kurzlebigen Deduplizierungs-Cache. - Nodes müssen
role: "node"sowie Funktionen/Befehle/Berechtigungen inconnectenthalten.
Pairing + lokales Vertrauen
- Alle WS-Clients (Operatoren + Nodes) enthalten bei
connecteine Geräteidentität. - Neue Geräte-IDs erfordern eine Pairing-Freigabe; der Gateway stellt ein Gerätetoken für nachfolgende Verbindungen aus.
- Direkte local loopback-Verbindungen können automatisch freigegeben werden, damit die UX auf demselben Host reibungslos bleibt.
- OpenClaw hat außerdem einen engen backend-/containerlokalen Self-Connect-Pfad für vertrauenswürdige Shared-Secret-Hilfsabläufe.
- Tailnet- und LAN-Verbindungen, einschließlich Tailnet-Bindings auf demselben Host, erfordern weiterhin eine explizite Pairing-Freigabe.
- Alle Verbindungen müssen die
connect.challenge-Nonce signieren. - Signatur-Payload
v3bindet außerdemplatform+deviceFamily; der Gateway pinnt gepairte Metadaten beim erneuten Verbinden und verlangt Reparatur-Pairing bei Metadatenänderungen. - Nicht lokale Verbindungen erfordern weiterhin explizite Freigabe.
- Gateway-Authentifizierung (
gateway.auth.*) gilt weiterhin für alle Verbindungen, lokal oder remote.
Details: Gateway-Protokoll, Pairing, Sicherheit.
Protokolltypisierung und Codegenerierung
- TypeBox-Schemas definieren das Protokoll.
- JSON Schema wird aus diesen Schemas generiert.
- Swift-Modelle werden aus dem JSON Schema generiert.
Remote-Zugriff
-
Bevorzugt: Tailscale oder VPN.
-
Alternative: SSH-Tunnel
ssh -N -L 18789:127.0.0.1:18789 user@host -
Derselbe Handshake + Authentifizierungstoken gelten über den Tunnel.
-
TLS + optionales Pinning können für WS in Remote-Setups aktiviert werden.
Betriebsübersicht
- Start:
openclaw gateway(Vordergrund, Logs nach stdout). - Integrität:
healthüber WS (auch inhello-okenthalten). - Überwachung: launchd/systemd für automatischen Neustart.
Invarianten
- Genau ein Gateway kontrolliert eine einzelne Baileys-Sitzung pro Host.
- Handshake ist verpflichtend; jeder nicht-JSON- oder nicht-connect erste Frame führt zu einem harten Schließen.
- Ereignisse werden nicht erneut abgespielt; Clients müssen bei Lücken aktualisieren.
Verwandte Themen
- Agent Loop — detaillierter Agent-Ausführungszyklus
- Gateway-Protokoll — WebSocket-Protokollvertrag
- Queue — Befehlswarteschlange und Nebenläufigkeit
- Sicherheit — Vertrauensmodell und Härtung