Fundamentals
Architecture du Gateway
Vue d’ensemble
-
Un unique Gateway persistant gère toutes les interfaces de messagerie (WhatsApp via Baileys, Telegram via grammY, Slack, Discord, Signal, iMessage, WebChat).
-
Les clients du plan de contrôle (application macOS, CLI, interface web, automatisations) se connectent au Gateway via WebSocket sur l’hôte d’écoute configuré (par défaut
127.0.0.1:18789). -
Les Nodes (macOS/iOS/Android/sans interface) se connectent également via WebSocket, mais déclarent
role: nodeavec des capacités et commandes explicites. -
Un seul Gateway par hôte ; c’est le seul composant qui ouvre une session WhatsApp.
-
L’hôte du canevas est servi par le serveur HTTP du Gateway sous :
/__openclaw__/canvas/(HTML/CSS/JS modifiable par l’agent)/__openclaw__/a2ui/(hôte A2UI)
Il utilise le même port que le Gateway (par défaut
18789).
Composants et flux
Gateway (démon)
- Maintient les connexions aux fournisseurs.
- Expose une API WS typée (requêtes, réponses, événements poussés par le serveur).
- Valide les trames entrantes par rapport au schéma JSON.
- Émet des événements tels que
agent,chat,presence,health,heartbeat,cron.
Clients (application Mac / CLI / administration web)
- Une connexion WS par client.
- Envoient des requêtes (
health,status,send,agent,system-presence). - S’abonnent aux événements (
tick,agent,presence,shutdown).
Nodes (macOS / iOS / Android / sans interface)
- Se connectent au même serveur WS avec
role: node. - Fournissent une identité d’appareil dans
connect; l’appairage est fondé sur l’appareil (rôlenode) et l’approbation est conservée dans le magasin d’appairage des appareils. - Exposent des commandes telles que
canvas.*,camera.*,screen.record,location.get.
Détails du protocole : Protocole du Gateway
WebChat
- Interface statique qui utilise l’API WS du Gateway pour l’historique des discussions et l’envoi de messages.
- Dans les configurations distantes, se connecte via le même tunnel SSH/Tailscale que les autres clients.
Cycle de vie de la connexion (client unique)
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<br>snapshot: presence + health
Gateway-->>Client: event:presence
Gateway-->>Client: event:tick
Client->>Gateway: req:agent
Gateway-->>Client: res:agent<br>ack {runId, status:"accepted"}
Gateway-->>Client: event:agent<br>(streaming)
Gateway-->>Client: res:agent<br>final {runId, status, summary}Protocole de transmission (résumé)
- Transport : WebSocket, trames textuelles avec charges utiles JSON.
- La première trame doit être
connect. - Après la négociation :
- Requêtes :
{type:"req", id, method, params}→{type:"res", id, ok, payload|error} - Événements :
{type:"event", event, payload, seq?, stateVersion?}
- Requêtes :
hello-ok.features.methods/eventssont des métadonnées de découverte, et non une liste générée de toutes les routes auxiliaires appelables.- L’authentification par secret partagé utilise
connect.params.auth.tokenouconnect.params.auth.password, selon le mode d’authentification configuré du Gateway. - Les modes fondés sur l’identité, tels que Tailscale Serve
(
gateway.auth.allowTailscale: true) ougateway.auth.mode: "trusted-proxy"hors local loopback, satisfont les exigences d’authentification à partir des en-têtes de requête plutôt que deconnect.params.auth.*. - Le mode d’entrée privée
gateway.auth.mode: "none"désactive entièrement l’authentification par secret partagé ; n’utilisez pas ce mode sur une entrée publique ou non fiable. - Des clés d’idempotence sont requises pour les méthodes ayant des effets de bord (
send,agent) afin de permettre des nouvelles tentatives sûres ; le serveur conserve un cache de déduplication de courte durée. - Les Nodes doivent inclure
role: "node"ainsi que les capacités, commandes et autorisations dansconnect.
Appairage et confiance locale
- Tous les clients WS (opérateurs et Nodes) incluent une identité d’appareil dans
connect. - Les nouveaux identifiants d’appareil nécessitent une approbation d’appairage ; le Gateway émet un jeton d’appareil pour les connexions ultérieures.
- Les connexions directes via local loopback peuvent être approuvées automatiquement afin de préserver la fluidité de l’expérience sur le même hôte.
- OpenClaw dispose également d’un chemin restreint d’auto-connexion locale au serveur principal ou au conteneur pour les flux auxiliaires fiables utilisant un secret partagé.
- Les connexions au tailnet et au réseau local, y compris les écoutes tailnet sur le même hôte, nécessitent toujours une approbation d’appairage explicite.
- Toutes les connexions doivent signer le nonce
connect.challenge. La charge utile de signaturev3lie égalementplatformetdeviceFamily; le Gateway fixe les métadonnées appairées lors de la reconnexion et exige un nouvel appairage de réparation en cas de modification des métadonnées. - Les connexions non locales nécessitent toujours une approbation explicite.
- L’authentification du Gateway (
gateway.auth.*) s’applique toujours à toutes les connexions, locales ou distantes.
Détails : Protocole du Gateway, Appairage, Sécurité.
Typage du protocole et génération de code
- Les schémas TypeBox définissent le protocole.
- Le schéma JSON est généré à partir de ces schémas.
- Les modèles Swift sont générés à partir du schéma JSON.
Accès distant
-
Recommandé : Tailscale ou VPN.
-
Alternative : tunnel SSH
bash ssh -N -L 18789:127.0.0.1:18789 user@gateway-host -
La même négociation et le même jeton d’authentification s’appliquent via le tunnel.
-
TLS et l’épinglage facultatif peuvent être activés pour WS dans les configurations distantes.
Aperçu des opérations
- Démarrage :
openclaw gateway(au premier plan, journaux envoyés vers la sortie standard). - État de santé :
healthvia WS (également inclus danshello-ok). - Supervision : launchd/systemd pour le redémarrage automatique.
Invariants
- Un seul Gateway contrôle exactement une session Baileys par hôte.
- La négociation est obligatoire ; toute première trame non JSON ou différente de
connectentraîne une fermeture immédiate. - Les événements ne sont pas rejoués ; les clients doivent actualiser leur état en cas de lacunes.
Rubriques connexes
- Boucle de l’agent — cycle détaillé d’exécution de l’agent
- Protocole du Gateway — contrat du protocole WebSocket
- File d’attente — file d’attente des commandes et concurrence
- Sécurité — modèle de confiance et durcissement