Protocole de la gateway (WebSocket)
Le protocole WS de la gateway est le plan de contrôle unique + transport de nœud pour OpenClaw. Tous les clients (CLI, interface web, application macOS, nœuds iOS/Android, nœuds headless) se connectent via WebSocket et déclarent leur rôle + portée au moment de la poignée de main.Transport
- WebSocket, trames texte avec charge utile JSON.
- La première trame doit être une requête
connect.
Poignée de main (connect)
Gateway → client (défi pré-connexion) :hello-ok inclut aussi :
hello-ok.auth peut aussi inclure des
entrées de rôle supplémentaires limitées dans deviceTokens :
scopes: [] et tout jeton operator transmis reste limité à la liste d’autorisation
operator de l’amorçage (operator.approvals, operator.read,
operator.talk.secrets, operator.write). Les vérifications de portée d’amorçage restent
préfixées par rôle : les entrées operator ne satisfont que les requêtes operator, et les rôles non operator
ont toujours besoin de portées sous leur propre préfixe de rôle.
Exemple de nœud
Tramage
- Requête :
{type:"req", id, method, params} - Réponse :
{type:"res", id, ok, payload|error} - Événement :
{type:"event", event, payload, seq?, stateVersion?}
Rôles + portées
Rôles
operator= client du plan de contrôle (CLI/UI/automatisation).node= hôte de capacités (camera/screen/canvas/system.run).
Portées (operator)
Portées courantes :operator.readoperator.writeoperator.adminoperator.approvalsoperator.pairingoperator.talk.secrets
talk.config avec includeSecrets: true nécessite operator.talk.secrets
(ou operator.admin).
Les méthodes RPC de gateway enregistrées par plugin peuvent demander leur propre portée operator, mais
les préfixes admin réservés du cœur (config.*, exec.approvals.*, wizard.*,
update.*) sont toujours résolus en operator.admin.
La portée de méthode n’est que la première barrière. Certaines commandes slash atteintes via
chat.send appliquent en plus des vérifications plus strictes au niveau commande. Par exemple,
les écritures persistantes /config set et /config unset nécessitent operator.admin.
node.pair.approve possède aussi une vérification de portée supplémentaire au moment de l’approbation, en plus de la portée de méthode de base :
- requêtes sans commande :
operator.pairing - requêtes avec commandes de nœud autres que exec :
operator.pairing+operator.write - requêtes qui incluent
system.run,system.run.prepareousystem.which:operator.pairing+operator.admin
Caps/commands/permissions (node)
Les nœuds déclarent leurs revendications de capacité au moment deconnect :
caps: catégories de capacité de haut niveau.commands: liste d’autorisation des commandes pour l’invocation.permissions: bascules granulaires (par exemplescreen.record,camera.capture).
Présence
system-presencerenvoie des entrées indexées par identité d’appareil.- Les entrées de présence incluent
deviceId,rolesetscopesafin que les interfaces puissent afficher une seule ligne par appareil même lorsqu’il se connecte à la fois comme operator et node.
Familles courantes de méthodes RPC
Cette page n’est pas un dump complet généré, mais la surface WS publique est plus large que les exemples de poignée de main/authentification ci-dessus. Voici les principales familles de méthodes que la gateway expose actuellement.hello-ok.features.methods est une liste de découverte conservatrice construite à partir de
src/gateway/server-methods-list.ts plus les exportations chargées de méthodes de plugin/canal.
Considérez-la comme une découverte de fonctionnalités, pas comme un dump généré de tous les assistants appelables
implémentés dans src/gateway/server-methods/*.ts.
Système et identité
healthrenvoie l’instantané d’état de la gateway mis en cache ou nouvellement sondé.statusrenvoie le résumé de gateway de type/status; les champs sensibles ne sont inclus que pour les clients operator à portée admin.gateway.identity.getrenvoie l’identité d’appareil de la gateway utilisée par les flux de relais et de jumelage.system-presencerenvoie l’instantané de présence actuel pour les appareils operator/node connectés.system-eventajoute un événement système et peut mettre à jour/diffuser le contexte de présence.last-heartbeatrenvoie le dernier événement heartbeat persisté.set-heartbeatsactive/désactive le traitement heartbeat sur la gateway.
Modèles et utilisation
models.listrenvoie le catalogue de modèles autorisé à l’exécution.usage.statusrenvoie les fenêtres d’utilisation fournisseur/résumés de quota restant.usage.costrenvoie des résumés agrégés de coût d’utilisation pour une plage de dates.doctor.memory.statusrenvoie l’état de préparation de la mémoire vectorielle / des embeddings pour l’espace de travail actif de l’agent par défaut.sessions.usagerenvoie des résumés d’utilisation par session.sessions.usage.timeseriesrenvoie une série temporelle d’utilisation pour une session.sessions.usage.logsrenvoie les entrées de journal d’utilisation pour une session.
Canaux et assistants de connexion
channels.statusrenvoie des résumés d’état de canal/plugin intégrés + groupés.channels.logoutdéconnecte un canal/compte spécifique lorsque le canal prend en charge la déconnexion.web.login.startdémarre un flux de connexion QR/web pour le fournisseur de canal web actuel compatible QR.web.login.waitattend la fin de ce flux de connexion QR/web et démarre le canal en cas de succès.push.testenvoie un push APNs de test à un nœud iOS enregistré.voicewake.getrenvoie les déclencheurs de mot d’activation stockés.voicewake.setmet à jour les déclencheurs de mot d’activation et diffuse le changement.
Messagerie et journaux
sendest le RPC de livraison sortante directe pour les envois ciblés par canal/compte/fil en dehors du moteur de chat.logs.tailrenvoie la fin du journal fichier configuré de la gateway avec contrôles de curseur/limite et d’octets maximum.
Talk et TTS
talk.configrenvoie la charge utile de configuration Talk effective ;includeSecretsnécessiteoperator.talk.secrets(ouoperator.admin).talk.modedéfinit/diffuse l’état du mode Talk actuel pour les clients WebChat/interface de contrôle.talk.speaksynthétise la parole via le fournisseur de parole Talk actif.tts.statusrenvoie l’état d’activation du TTS, le fournisseur actif, les fournisseurs de repli, et l’état de configuration du fournisseur.tts.providersrenvoie l’inventaire visible des fournisseurs TTS.tts.enableettts.disableactivent/désactivent l’état des préférences TTS.tts.setProvidermet à jour le fournisseur TTS préféré.tts.convertexécute une conversion ponctuelle texte-vers-parole.
Secrets, configuration, mise à jour et assistant
secrets.reloadrerésout les SecretRef actifs et ne remplace l’état secret d’exécution qu’en cas de succès complet.secrets.resolverésout les affectations de secrets ciblées par commande pour un ensemble commande/cible spécifique.config.getrenvoie l’instantané de configuration actuel et son hash.config.setécrit une charge utile de configuration validée.config.patchfusionne une mise à jour partielle de configuration.config.applyvalide + remplace la charge utile complète de configuration.config.schemarenvoie la charge utile de schéma de configuration active utilisée par l’interface de contrôle et les outils CLI : schéma,uiHints, version et métadonnées de génération, y compris les métadonnées de schéma plugin + canal lorsque le runtime peut les charger. Le schéma inclut les métadonnées de champtitle/descriptiondérivées des mêmes libellés et textes d’aide utilisés par l’interface, y compris pour les objets imbriqués, génériques, éléments de tableau, et branches de compositionanyOf/oneOf/allOflorsque la documentation de champ correspondante existe.config.schema.lookuprenvoie une charge utile de recherche limitée à un chemin pour un chemin de configuration : chemin normalisé, nœud de schéma superficiel, indication correspondante +hintPath, et résumés immédiats des enfants pour l’exploration détaillée UI/CLI.- Les nœuds de schéma de lookup conservent la documentation orientée utilisateur et les champs de validation courants :
title,description,type,enum,const,format,pattern, bornes numériques/chaînes/tableaux/objets, et drapeaux booléens commeadditionalProperties,deprecated,readOnly,writeOnly. - Les résumés d’enfants exposent
key,pathnormalisé,type,required,hasChildren, plushint/hintPathcorrespondants.
- Les nœuds de schéma de lookup conservent la documentation orientée utilisateur et les champs de validation courants :
update.runexécute le flux de mise à jour de la gateway et planifie un redémarrage uniquement lorsque la mise à jour elle-même a réussi.wizard.start,wizard.next,wizard.statusetwizard.cancelexposent l’assistant d’onboarding via RPC WS.
Grandes familles existantes
Assistants d’agent et d’espace de travail
agents.listrenvoie les entrées d’agent configurées.agents.create,agents.updateetagents.deletegèrent les enregistrements d’agent et le câblage de l’espace de travail.agents.files.list,agents.files.getetagents.files.setgèrent les fichiers bootstrap d’espace de travail exposés pour un agent.agent.identity.getrenvoie l’identité effective de l’assistant pour un agent ou une session.agent.waitattend la fin d’une exécution et renvoie l’instantané terminal lorsque disponible.
Contrôle de session
sessions.listrenvoie l’index actuel des sessions.sessions.subscribeetsessions.unsubscribeactivent/désactivent les abonnements aux événements de changement de session pour le client WS courant.sessions.messages.subscribeetsessions.messages.unsubscribeactivent/désactivent les abonnements aux événements de transcription/message pour une session.sessions.previewrenvoie des aperçus bornés de transcription pour des clés de session spécifiques.sessions.resolverésout ou canonicalise une cible de session.sessions.createcrée une nouvelle entrée de session.sessions.sendenvoie un message dans une session existante.sessions.steerest la variante d’interruption-et-réorientation pour une session active.sessions.abortinterrompt le travail actif d’une session.sessions.patchmet à jour les métadonnées/remplacements d’une session.sessions.reset,sessions.deleteetsessions.compacteffectuent la maintenance de session.sessions.getrenvoie la ligne complète de session stockée.- l’exécution du chat utilise toujours
chat.history,chat.send,chat.abortetchat.inject. chat.historyest normalisé pour l’affichage pour les clients UI : les balises de directives inline sont retirées du texte visible, les charges utiles XML d’appel d’outil en texte brut (y compris<tool_call>...</tool_call>,<function_call>...</function_call>,<tool_calls>...</tool_calls>,<function_calls>...</function_calls>, et les blocs tronqués d’appel d’outil) ainsi que les jetons de contrôle de modèle ASCII/pleine largeur divulgués sont retirés, les lignes d’assistant composées uniquement de jetons silencieux commeNO_REPLY/no_replyexact sont omises, et les lignes surdimensionnées peuvent être remplacées par des espaces réservés.
Jumelage d’appareils et jetons d’appareil
device.pair.listrenvoie les appareils jumelés en attente et approuvés.device.pair.approve,device.pair.rejectetdevice.pair.removegèrent les enregistrements de jumelage d’appareil.device.token.rotatefait tourner un jeton d’appareil jumelé dans les limites de son rôle et de ses portées approuvés.device.token.revokerévoque un jeton d’appareil jumelé.
Jumelage de nœuds, invocation et travail en attente
node.pair.request,node.pair.list,node.pair.approve,node.pair.rejectetnode.pair.verifycouvrent le jumelage de nœud et la vérification d’amorçage.node.listetnode.describerenvoient l’état des nœuds connus/connectés.node.renamemet à jour un libellé de nœud jumelé.node.invoketransfère une commande à un nœud connecté.node.invoke.resultrenvoie le résultat d’une requête d’invocation.node.eventtransporte les événements d’origine nœud vers la gateway.node.canvas.capability.refreshactualise les jetons de capacité canvas limités en portée.node.pending.pulletnode.pending.acksont les API de file pour nœuds connectés.node.pending.enqueueetnode.pending.draingèrent le travail durable en attente pour les nœuds hors ligne/déconnectés.
Familles d’approbation
exec.approval.requestetexec.approval.resolvecouvrent les demandes d’approbation exec ponctuelles.exec.approval.waitDecisionattend une approbation exec en attente et renvoie la décision finale (ounullen cas de délai).exec.approvals.getetexec.approvals.setgèrent les instantanés de politique d’approbation exec de la gateway.exec.approvals.node.getetexec.approvals.node.setgèrent la politique d’approbation exec locale au nœud via des commandes de relais nœud.plugin.approval.request,plugin.approval.waitDecisionetplugin.approval.resolvecouvrent les flux d’approbation définis par les plugins.
Autres grandes familles
- automatisation :
wakeplanifie une injection de texte de réveil immédiate ou au prochain heartbeatcron.list,cron.status,cron.add,cron.update,cron.remove,cron.run,cron.runs
- Skills/outils :
skills.*,tools.catalog,tools.effective
Familles courantes d’événements
chat: mises à jour de chat UI telles quechat.injectet autres événements de chat limités à la transcription.session.messageetsession.tool: mises à jour transcription/flux d’événements pour une session abonnée.sessions.changed: l’index ou les métadonnées de session ont changé.presence: mises à jour d’instantané de présence système.tick: événement périodique de keepalive / vitalité.health: mise à jour de l’instantané d’état de la gateway.heartbeat: mise à jour du flux d’événements heartbeat.cron: événement de changement d’exécution/tâche cron.shutdown: notification d’arrêt de la gateway.node.pair.requested/node.pair.resolved: cycle de vie du jumelage de nœud.node.invoke.request: diffusion d’une requête d’invocation de nœud.device.pair.requested/device.pair.resolved: cycle de vie de l’appareil jumelé.voicewake.changed: la configuration des déclencheurs de mot d’activation a changé.exec.approval.requested/exec.approval.resolved: cycle de vie de l’approbation exec.plugin.approval.requested/plugin.approval.resolved: cycle de vie de l’approbation plugin.
Méthodes d’assistance pour nœuds
- Les nœuds peuvent appeler
skills.binspour récupérer la liste actuelle des exécutables de Skills pour les vérifications d’auto-autorisation.
Méthodes d’assistance pour operator
- Les operators peuvent appeler
tools.catalog(operator.read) pour récupérer le catalogue d’outils runtime pour un agent. La réponse inclut des outils groupés et des métadonnées de provenance :source:coreoupluginpluginId: plugin propriétaire lorsquesource="plugin"optional: si un outil de plugin est facultatif
- Les operators peuvent appeler
tools.effective(operator.read) pour récupérer l’inventaire d’outils effectif à l’exécution pour une session.sessionKeyest obligatoire.- La gateway dérive le contexte d’exécution approuvé côté serveur au lieu d’accepter un contexte d’authentification ou de livraison fourni par l’appelant.
- La réponse est limitée à la session et reflète ce que la conversation active peut utiliser à cet instant, y compris les outils core, plugin et canal.
- Les operators peuvent appeler
skills.status(operator.read) pour récupérer l’inventaire visible des Skills pour un agent.agentIdest facultatif ; omettez-le pour lire l’espace de travail de l’agent par défaut.- La réponse inclut l’éligibilité, les exigences manquantes, les vérifications de configuration et les options d’installation assainies sans exposer les valeurs brutes de secrets.
- Les operators peuvent appeler
skills.searchetskills.detail(operator.read) pour les métadonnées de découverte ClawHub. - Les operators peuvent appeler
skills.install(operator.admin) selon deux modes :- mode ClawHub :
{ source: "clawhub", slug, version?, force? }installe un dossier de Skill dans le répertoireskills/de l’espace de travail de l’agent par défaut. - mode d’installation gateway :
{ name, installId, dangerouslyForceUnsafeInstall?, timeoutMs? }exécute une action déclaréemetadata.openclaw.installsur l’hôte gateway.
- mode ClawHub :
- Les operators peuvent appeler
skills.update(operator.admin) selon deux modes :- le mode ClawHub met à jour un slug suivi ou toutes les installations ClawHub suivies dans l’espace de travail de l’agent par défaut.
- le mode configuration applique un patch aux valeurs
skills.entries.<skillKey>telles queenabled,apiKeyetenv.
Approbations exec
- Lorsqu’une requête exec nécessite une approbation, la gateway diffuse
exec.approval.requested. - Les clients operator résolvent cela en appelant
exec.approval.resolve(nécessite la portéeoperator.approvals). - Pour
host=node,exec.approval.requestdoit incluresystemRunPlan(argv/cwd/rawCommand/métadonnées de session canoniques). Les requêtes sanssystemRunPlansont rejetées. - Après approbation, les appels transférés
node.invoke system.runréutilisent cesystemRunPlancanonique comme contexte faisant autorité pour la commande/le cwd/la session. - Si un appelant modifie
command,rawCommand,cwd,agentIdousessionKeyentre la préparation et le transfert final approuvésystem.run, la gateway rejette l’exécution au lieu de faire confiance à la charge utile modifiée.
Repli de livraison d’agent
- Les requêtes
agentpeuvent incluredeliver=truepour demander une livraison sortante. bestEffortDeliver=falseconserve un comportement strict : les cibles de livraison non résolues ou internes seulement renvoientINVALID_REQUEST.bestEffortDeliver=trueautorise un repli vers une exécution limitée à la session lorsqu’aucune route de livraison externe résoluble ne peut être trouvée (par exemple sessions internes/webchat ou configurations multicanales ambiguës).
Versionnement
PROTOCOL_VERSIONse trouve danssrc/gateway/protocol/schema.ts.- Les clients envoient
minProtocol+maxProtocol; le serveur rejette les incompatibilités. - Les schémas + modèles sont générés à partir de définitions TypeBox :
pnpm protocol:genpnpm protocol:gen:swiftpnpm protocol:check
Authentification
- L’authentification gateway par secret partagé utilise
connect.params.auth.tokenouconnect.params.auth.password, selon le mode d’authentification configuré. - Les modes portant une identité comme Tailscale Serve
(
gateway.auth.allowTailscale: true) ougateway.auth.mode: "trusted-proxy"hors local loopback satisfont la vérification d’authentification connect à partir des en-têtes de requête au lieu deconnect.params.auth.*. - L’entrée privée
gateway.auth.mode: "none"ignore entièrement l’authentification connect par secret partagé ; n’exposez pas ce mode sur une entrée publique/non fiable. - Après jumelage, la gateway émet un jeton d’appareil limité au rôle + aux portées de la connexion.
Il est renvoyé dans
hello-ok.auth.deviceTokenet doit être persisté par le client pour les connexions futures. - Les clients doivent persister le
hello-ok.auth.deviceTokenprincipal après toute connexion réussie. - Une reconnexion avec ce jeton d’appareil stocké doit aussi réutiliser l’ensemble de portées approuvées stocké pour ce jeton. Cela préserve l’accès lecture/sonde/statut déjà accordé et évite que les reconnexions ne se réduisent silencieusement à une portée implicite admin seulement.
- L’ordre normal de priorité d’authentification à la connexion est : jeton/mot de passe partagé explicite d’abord, puis
deviceTokenexplicite, puis jeton par appareil stocké, puis jeton d’amorçage. - Les entrées supplémentaires
hello-ok.auth.deviceTokenssont des jetons de transfert d’amorçage. Ne les persistez que lorsque la connexion a utilisé l’authentification d’amorçage sur un transport approuvé tel quewss://ou local loopback/jumelage local. - Si un client fournit un
deviceTokenexplicite ou desscopesexplicites, cet ensemble de portées demandé par l’appelant reste faisant autorité ; les portées en cache ne sont réutilisées que lorsque le client réutilise le jeton par appareil stocké. - Les jetons d’appareil peuvent être tournés/révoqués via
device.token.rotateetdevice.token.revoke(nécessite la portéeoperator.pairing). - L’émission/la rotation de jeton reste limitée à l’ensemble de rôles approuvés enregistré dans l’entrée de jumelage de cet appareil ; la rotation d’un jeton ne peut pas étendre l’appareil vers un rôle que l’approbation de jumelage n’a jamais accordé.
- Pour les sessions avec jeton d’appareil jumelé, la gestion d’appareil est limitée à soi-même sauf si l’appelant dispose aussi de
operator.admin: les appelants non admin ne peuvent supprimer/révoquer/faire tourner que leur propre entrée d’appareil. device.token.rotatevérifie également l’ensemble de portées operator demandé par rapport aux portées actuelles de la session appelante. Les appelants non admin ne peuvent pas faire tourner un jeton vers un ensemble de portées operator plus large que celui qu’ils détiennent déjà.- Les échecs d’authentification incluent
error.details.codeplus des indices de récupération :error.details.canRetryWithDeviceToken(booléen)error.details.recommendedNextStep(retry_with_device_token,update_auth_configuration,update_auth_credentials,wait_then_retry,review_auth_configuration)
- Comportement client pour
AUTH_TOKEN_MISMATCH:- Les clients approuvés peuvent tenter une nouvelle tentative délimitée avec un jeton par appareil mis en cache.
- Si cette nouvelle tentative échoue, les clients doivent arrêter les boucles automatiques de reconnexion et afficher des consignes d’action à l’opérateur.
Identité d’appareil + jumelage
- Les nœuds doivent inclure une identité d’appareil stable (
device.id) dérivée de l’empreinte d’une paire de clés. - Les gateways émettent des jetons par appareil + rôle.
- Des approbations de jumelage sont nécessaires pour les nouveaux IDs d’appareil, sauf si l’auto-approbation locale est activée.
- L’auto-approbation de jumelage est centrée sur les connexions directes local loopback.
- OpenClaw dispose aussi d’un chemin étroit d’auto-connexion backend/locale au conteneur pour des flux d’assistance à secret partagé approuvés.
- Les connexions tailnet ou LAN du même hôte sont toujours traitées comme distantes pour le jumelage et nécessitent une approbation.
- Tous les clients WS doivent inclure l’identité
devicependantconnect(operator + node). L’interface de contrôle ne peut l’omettre que dans ces modes :gateway.controlUi.allowInsecureAuth=truepour la compatibilité HTTP non sécurisée localhost uniquement.- authentification operator d’interface de contrôle réussie avec
gateway.auth.mode: "trusted-proxy". gateway.controlUi.dangerouslyDisableDeviceAuth=true(solution de dernier recours, grave dégradation de sécurité).
- Toutes les connexions doivent signer le nonce
connect.challengefourni par le serveur.
Diagnostics de migration de l’authentification d’appareil
Pour les clients hérités qui utilisent encore le comportement de signature pré-défi,connect renvoie désormais
des codes de détail DEVICE_AUTH_* sous error.details.code avec un error.details.reason stable.
Échecs de migration courants :
| Message | details.code | details.reason | Signification |
|---|---|---|---|
device nonce required | DEVICE_AUTH_NONCE_REQUIRED | device-nonce-missing | Le client a omis device.nonce (ou envoyé vide). |
device nonce mismatch | DEVICE_AUTH_NONCE_MISMATCH | device-nonce-mismatch | Le client a signé avec un nonce obsolète/incorrect. |
device signature invalid | DEVICE_AUTH_SIGNATURE_INVALID | device-signature | La charge utile de signature ne correspond pas à la charge utile v2. |
device signature expired | DEVICE_AUTH_SIGNATURE_EXPIRED | device-signature-stale | L’horodatage signé est hors du décalage autorisé. |
device identity mismatch | DEVICE_AUTH_DEVICE_ID_MISMATCH | device-id-mismatch | device.id ne correspond pas à l’empreinte de la clé publique. |
device public key invalid | DEVICE_AUTH_PUBLIC_KEY_INVALID | device-public-key | Le format/canonicalisation de la clé publique a échoué. |
- Toujours attendre
connect.challenge. - Signer la charge utile v2 qui inclut le nonce serveur.
- Envoyer le même nonce dans
connect.params.device.nonce. - La charge utile de signature préférée est
v3, qui lieplatformetdeviceFamilyen plus des champs device/client/role/scopes/token/nonce. - Les signatures héritées
v2restent acceptées pour la compatibilité, mais l’épinglage des métadonnées d’appareil jumelé continue de contrôler la politique de commande à la reconnexion.
TLS + épinglage
- TLS est pris en charge pour les connexions WS.
- Les clients peuvent éventuellement épingler l’empreinte du certificat gateway (voir la configuration
gateway.tlsplusgateway.remote.tlsFingerprintou l’option CLI--tls-fingerprint).
Portée
Ce protocole expose l’API complète de la gateway (status, canaux, modèles, chat, agent, sessions, nœuds, approbations, etc.). La surface exacte est définie par les schémas TypeBox danssrc/gateway/protocol/schema.ts.