Der Gateway-WS-Protokoll ist die einzige Steuerungsebene + Node-Transport für OpenClaw. Alle Clients (CLI, Web-UI, macOS-App, iOS-/Android-Nodes, headless Nodes) verbinden sich per WebSocket und deklarieren beim Handshake ihre Rolle + ihren Scope.Documentation Index
Fetch the complete documentation index at: https://docs.openclaw.ai/llms.txt
Use this file to discover all available pages before exploring further.
Transport
- WebSocket, Text-Frames mit JSON-Payloads.
- Der erste Frame muss eine
connect-Anfrage sein. - Pre-Connect-Frames sind auf 64 KiB begrenzt. Nach einem erfolgreichen Handshake sollten Clients
die Limits
hello-ok.policy.maxPayloadundhello-ok.policy.maxBufferedByteseinhalten. Bei aktivierter Diagnose geben zu große eingehende Frames und langsame ausgehende Pufferpayload.large-Events aus, bevor der Gateway den betroffenen Frame schließt oder verwirft. Diese Events behalten Größen, Limits, Oberflächen und sichere Reason-Codes. Sie behalten nicht den Nachrichtentext, Anhangsinhalte, den rohen Frame-Body, Tokens, Cookies oder geheime Werte.
Handshake (connect)
Gateway → Client (Pre-Connect-Challenge):connect-Anfrage
einen wiederholbaren UNAVAILABLE-Fehler zurückgeben, bei dem details.reason auf
"startup-sidecars" und retryAfterMs gesetzt ist. Clients sollten diese Antwort
innerhalb ihres gesamten Verbindungsbudgets erneut versuchen, statt sie als endgültigen
Handshake-Fehler anzuzeigen.
server, features, snapshot und policy sind alle vom Schema
(src/gateway/protocol/schema/frames.ts) erforderlich. auth ist ebenfalls erforderlich und meldet
die ausgehandelte Rolle und Scopes. pluginSurfaceUrls ist optional und ordnet Plugin-
Oberflächennamen wie canvas bereichsgebundenen gehosteten URLs zu.
Bereichsgebundene Plugin-Oberflächen-URLs können ablaufen. Nodes können
node.pluginSurface.refresh mit { "surface": "canvas" } aufrufen, um einen frischen
Eintrag in pluginSurfaceUrls zu erhalten. Das experimentelle Refactoring des Canvas-Plugins
unterstützt den veralteten Kompatibilitätspfad canvasHostUrl, canvasCapability oder
node.canvas.capability.refresh nicht; aktuelle native Clients und
Gateways müssen Plugin-Oberflächen verwenden.
Wenn kein Device-Token ausgestellt wird, meldet hello-ok.auth die ausgehandelten
Berechtigungen ohne Token-Felder:
client.id: "gateway-client",
client.mode: "backend") dürfen device bei direkten Loopback-Verbindungen weglassen, wenn
sie sich mit dem gemeinsamen Gateway-Token/Passwort authentifizieren. Dieser Pfad ist für interne
Control-Plane-RPCs reserviert und verhindert, dass veraltete CLI-/Device-Pairing-Baselines
lokale Backend-Arbeit wie Subagent-Session-Updates blockieren. Remote-Clients,
Browser-Origin-Clients, Node-Clients und explizite Device-Token-/Device-Identity-
Clients verwenden weiterhin die normalen Pairing- und Scope-Upgrade-Prüfungen.
Wenn ein Device-Token ausgestellt wird, enthält hello-ok außerdem:
hello-ok.auth außerdem zusätzliche
begrenzte Rolleneinträge in deviceTokens enthalten:
scopes: [], und jedes übergebene Operator-Token bleibt auf die Bootstrap-
Operator-Allowlist (operator.approvals, operator.read,
operator.talk.secrets, operator.write) begrenzt. Bootstrap-Scope-Prüfungen bleiben
rollenpräfixiert: Operator-Einträge erfüllen nur Operator-Anfragen, und Nicht-Operator-
Rollen benötigen weiterhin Scopes unter ihrem eigenen Rollenpräfix.
Node-Beispiel
Framing
- Anfrage:
{type:"req", id, method, params} - Antwort:
{type:"res", id, ok, payload|error} - Event:
{type:"event", event, payload, seq?, stateVersion?}
Rollen + Scopes
Das vollständige Operator-Scope-Modell, Approval-Time-Prüfungen und Shared-Secret- Semantik finden Sie unter Operator-Scopes.Rollen
operator= Control-Plane-Client (CLI/UI/Automatisierung).node= Capability-Host (camera/screen/canvas/system.run).
Scopes (Operator)
Häufige Scopes:operator.readoperator.writeoperator.adminoperator.approvalsoperator.pairingoperator.talk.secrets
talk.config mit includeSecrets: true erfordert operator.talk.secrets
(oder operator.admin).
Vom Plugin registrierte Gateway-RPC-Methoden können ihren eigenen Operator-Scope anfordern, aber
reservierte Core-Admin-Präfixe (config.*, exec.approvals.*, wizard.*,
update.*) werden immer zu operator.admin aufgelöst.
Der Methoden-Scope ist nur die erste Hürde. Einige Slash Commands, die über
chat.send erreicht werden, wenden zusätzlich strengere Prüfungen auf Befehlsebene an. Beispielsweise erfordern dauerhafte
Schreibvorgänge /config set und /config unset operator.admin.
node.pair.approve hat zusätzlich zum grundlegenden Methodenscope eine weitere Approval-Time-
Scope-Prüfung:
- Anfragen ohne Befehle:
operator.pairing - Anfragen mit Nicht-Exec-Node-Befehlen:
operator.pairing+operator.write - Anfragen, die
system.run,system.run.prepareodersystem.whichenthalten:operator.pairing+operator.admin
Caps/commands/permissions (Node)
Nodes deklarieren Capability-Claims beim Verbinden:caps: übergeordnete Capability-Kategorien wiecamera,canvas,screen,location,voiceundtalk.commands: Command-Allowlist für Invoke.permissions: granulare Umschalter (z. B.screen.record,camera.capture).
Präsenz
system-presencegibt Einträge zurück, die nach Device-Identity geschlüsselt sind.- Präsenz-Einträge enthalten
deviceId,rolesundscopes, damit UIs eine einzelne Zeile pro Gerät anzeigen können, auch wenn es sowohl als Operator als auch als Node verbunden ist. node.listenthält optionale FelderlastSeenAtMsundlastSeenReason. Verbundene Nodes melden ihre aktuelle Verbindungszeit alslastSeenAtMsmit dem Grundconnect; gepaarte Nodes können außerdem dauerhafte Hintergrundpräsenz melden, wenn ein vertrauenswürdiges Node-Event ihre Pairing-Metadaten aktualisiert.
Node-Hintergrund-alive-Event
Nodes könnennode.event mit event: "node.presence.alive" aufrufen, um aufzuzeichnen, dass ein gepaarter Node
während eines Hintergrund-Weckvorgangs aktiv war, ohne ihn als verbunden zu markieren.
trigger ist ein geschlossenes Enum: background, silent_push, bg_app_refresh,
significant_location, manual oder connect. Unbekannte Trigger-Strings werden vom Gateway vor der Persistierung zu
background normalisiert. Das Event ist nur für authentifizierte Node-
Device-Sessions dauerhaft; device-lose oder nicht gepaarte Sessions geben handled: false zurück.
Erfolgreiche Gateways geben ein strukturiertes Ergebnis zurück:
node.event weiterhin { "ok": true } zurückgeben; Clients sollten dies als
bestätigten RPC behandeln, nicht als dauerhafte Präsenzpersistierung.
Scope-Eingrenzung für Broadcast-Events
Serverseitig gepushte WebSocket-Broadcast-Events sind durch Scopes geschützt, damit Pairing-begrenzte oder reine Node-Sessions nicht passiv Session-Inhalte empfangen.- Chat-, Agent- und Tool-Result-Frames (einschließlich gestreamter
agent-Events und Tool-Call-Ergebnisse) erfordern mindestensoperator.read. Sessions ohneoperator.readüberspringen diese Frames vollständig. - Plugin-definierte
plugin.*-Broadcasts werden je nachdem, wie das Plugin sie registriert hat, aufoperator.writeoderoperator.adminbegrenzt. - Status- und Transport-Events (
heartbeat,presence,tick, Connect-/Disconnect-Lebenszyklus usw.) bleiben uneingeschränkt, damit die Transportintegrität für jede authentifizierte Session beobachtbar bleibt. - Unbekannte Broadcast-Event-Familien sind standardmäßig durch Scopes geschützt (fail-closed), sofern ein registrierter Handler sie nicht ausdrücklich lockert.
Häufige RPC-Methodenfamilien
Die öffentliche WS-Oberfläche ist umfangreicher als die obigen Handshake-/Auth-Beispiele. Dies ist kein generierter Dump —hello-ok.features.methods ist eine konservative
Discovery-Liste, die aus src/gateway/server-methods-list.ts plus geladenen
Plugin-/Channel-Methodenexporten erstellt wird. Behandeln Sie sie als Feature-Discovery, nicht als vollständige
Aufzählung von src/gateway/server-methods/*.ts.
System und Identität
System und Identität
healthgibt den zwischengespeicherten oder frisch geprüften Gateway-Health-Snapshot zurück.diagnostics.stabilitygibt den aktuellen begrenzten Recorder für diagnostische Stabilität zurück. Er behält operative Metadaten wie Event-Namen, Zählungen, Bytegrößen, Speicherwerte, Queue-/Session-Zustand, Channel-/Plugin-Namen und Session-IDs. Er behält keine Chat-Texte, Webhook-Bodys, Tool-Ausgaben, rohen Anfrage- oder Antwort-Bodys, Tokens, Cookies oder geheimen Werte. Operator-Read-Scope ist erforderlich.statusgibt die Gateway-Zusammenfassung im Stil von/statuszurück; sensible Felder werden nur für admin-begrenzte Operator-Clients einbezogen.gateway.identity.getgibt die Gateway-Device-Identity zurück, die von Relay- und Pairing-Flows verwendet wird.system-presencegibt den aktuellen Präsenz-Snapshot für verbundene Operator-/Node-Geräte zurück.system-eventhängt ein System-Event an und kann Präsenzkontext aktualisieren/übertragen.last-heartbeatgibt das zuletzt persistierte Heartbeat-Event zurück.set-heartbeatsschaltet die Heartbeat-Verarbeitung auf dem Gateway um.
Modelle und Nutzung
Modelle und Nutzung
models.listgibt den zur Laufzeit zulässigen Modellkatalog zurück. Übergeben Sie{ "view": "configured" }für konfigurierte Modelle in Picker-Größe (agents.defaults.modelszuerst, dannmodels.providers.*.models) oder{ "view": "all" }für den vollständigen Katalog.usage.statusgibt Provider-Nutzungsfenster und Zusammenfassungen des verbleibenden Kontingents zurück.usage.costgibt aggregierte Kostennutzungszusammenfassungen für einen Datumsbereich zurück.doctor.memory.statusgibt die Bereitschaft von Vektorspeicher / gecachten Einbettungen für den aktiven Standard-Agent-Arbeitsbereich zurück. Übergeben Sie{ "probe": true }oder{ "deep": true }nur, wenn der Aufrufer ausdrücklich einen Live-Ping an den Embedding-Provider wünscht.doctor.memory.remHarnessgibt eine begrenzte, schreibgeschützte REM-Harness-Vorschau für Remote-Control-Plane-Clients zurück. Sie kann Arbeitsbereichspfade, Speicherausschnitte, gerendertes grounded Markdown und Kandidaten für Deep Promotion enthalten, daher benötigen Aufruferoperator.read.sessions.usagegibt Nutzungszusammenfassungen pro Sitzung zurück.sessions.usage.timeseriesgibt Zeitreihen-Nutzung für eine Sitzung zurück.sessions.usage.logsgibt Nutzungsprotokolleinträge für eine Sitzung zurück.
Kanäle und Login-Helfer
Kanäle und Login-Helfer
channels.statusgibt Statuszusammenfassungen für integrierte + gebündelte Kanäle/Plugins zurück.channels.logoutmeldet einen bestimmten Kanal/Account ab, sofern der Kanal Logout unterstützt.web.login.startstartet einen QR-/Web-Login-Ablauf für den aktuellen QR-fähigen Web-Channel-Provider.web.login.waitwartet, bis dieser QR-/Web-Login-Ablauf abgeschlossen ist, und startet den Kanal bei Erfolg.push.testsendet einen Test-APNs-Push an einen registrierten iOS-Node.voicewake.getgibt die gespeicherten Wake-Word-Auslöser zurück.voicewake.setaktualisiert Wake-Word-Auslöser und verteilt die Änderung.
Nachrichten und Protokolle
Nachrichten und Protokolle
sendist der direkte RPC für ausgehende Zustellung für auf Kanal/Account/Thread ausgerichtetes Senden außerhalb des Chat-Runners.logs.tailgibt den konfigurierten Gateway-Dateiprotokoll-Tail mit Cursor-/Limit- und Max-Byte-Steuerung zurück.
Talk und TTS
Talk und TTS
talk.cataloggibt den schreibgeschützten Talk-Provider-Katalog für Sprache, Streaming-Transkription und Echtzeitstimme zurück. Er enthält Provider-IDs, Bezeichnungen, Konfigurationsstatus, offengelegte Modell-/Voice-IDs, kanonische Modi, Transporte, Brain-Strategien sowie Echtzeit-Audio-/Capability-Flags, ohne Provider-Secrets zurückzugeben oder die globale Konfiguration zu verändern.talk.configgibt die effektive Talk-Konfigurations-Payload zurück;includeSecretserfordertoperator.talk.secrets(oderoperator.admin).talk.session.createerstellt eine vom Gateway verwaltete Talk-Sitzung fürrealtime/gateway-relay,transcription/gateway-relayoderstt-tts/managed-room.brain: "direct-tools"erfordertoperator.admin.talk.session.joinvalidiert ein Managed-Room-Sitzungstoken, gibt bei Bedarfsession.ready- odersession.replaced-Events aus und gibt Raum-/Sitzungsmetadaten plus aktuelle Talk-Events zurück, ohne das Klartext-Token oder den gespeicherten Token-Hash.talk.session.appendAudiohängt base64-codiertes PCM-Eingabeaudio an vom Gateway verwaltete Echtzeit-Relay- und Transkriptionssitzungen an.talk.session.startTurn,talk.session.endTurnundtalk.session.cancelTurnsteuern den Turn-Lebenszyklus für Managed Rooms mit Ablehnung veralteter Turns, bevor der Zustand gelöscht wird.talk.session.cancelOutputstoppt die Audioausgabe des Assistenten, hauptsächlich für VAD-gesteuertes Barge-in in Gateway-Relay-Sitzungen.talk.session.submitToolResultschließt einen Provider-Tool-Aufruf ab, der von einer vom Gateway verwalteten Echtzeit-Relay-Sitzung ausgegeben wurde. Übergeben Sieoptions: { willContinue: true }für vorläufige Tool-Ausgabe, wenn ein finales Ergebnis folgt, oderoptions: { suppressResponse: true }, wenn das Tool-Ergebnis den Provider-Aufruf erfüllen soll, ohne eine weitere Echtzeit-Assistentenantwort zu starten.talk.session.closeschließt eine vom Gateway verwaltete Relay-, Transkriptions- oder Managed-Room-Sitzung und gibt abschließende Talk-Events aus.talk.modesetzt/verteilt den aktuellen Talk-Moduszustand für WebChat-/Control-UI-Clients.talk.client.createerstellt eine clientverwaltete Echtzeit-Provider-Sitzung mitwebrtcoderprovider-websocket, während das Gateway Konfiguration, Anmeldedaten, Anweisungen und Tool-Richtlinie verwaltet.talk.client.toolCalllässt clientverwaltete Echtzeit-Transporte Provider-Tool-Aufrufe an die Gateway-Richtlinie weiterleiten. Das erste unterstützte Tool istopenclaw_agent_consult; Clients erhalten eine Run-ID und warten auf normale Chat-Lebenszyklus-Events, bevor sie das Provider-spezifische Tool-Ergebnis übermitteln.talk.eventist der zentrale Talk-Event-Kanal für Echtzeit-, Transkriptions-, STT/TTS-, Managed-Room-, Telefonie- und Meeting-Adapter.talk.speaksynthetisiert Sprache über den aktiven Talk-Sprach-Provider.tts.statusgibt TTS-Aktivierungsstatus, aktiven Provider, Fallback-Provider und Provider-Konfigurationsstatus zurück.tts.providersgibt das sichtbare TTS-Provider-Inventar zurück.tts.enableundtts.disableschalten den TTS-Präferenzstatus um.tts.setProvideraktualisiert den bevorzugten TTS-Provider.tts.convertführt eine einmalige Text-zu-Sprache-Konvertierung aus.
Secrets, Konfiguration, Update und Wizard
Secrets, Konfiguration, Update und Wizard
secrets.reloadlöst aktive SecretRefs erneut auf und tauscht den Laufzeit-Secret-Zustand nur bei vollständigem Erfolg aus.secrets.resolvelöst auf einen Befehl ausgerichtete Secret-Zuweisungen für eine bestimmte Befehls-/Zielmenge auf.config.getgibt den aktuellen Konfigurations-Snapshot und Hash zurück.config.setschreibt eine validierte Konfigurations-Payload.config.patchführt eine partielle Konfigurationsaktualisierung zusammen.config.applyvalidiert und ersetzt die vollständige Konfigurations-Payload.config.schemagibt die Live-Konfigurationsschema-Payload zurück, die von Control UI und CLI-Tooling verwendet wird: Schema,uiHints, Version und Generierungsmetadaten, einschließlich Plugin- + Kanalschema-Metadaten, wenn die Laufzeit sie laden kann. Das Schema enthält Feld-title- /description-Metadaten, die aus denselben Bezeichnungen und Hilfetexten abgeleitet sind, die von der UI verwendet werden, einschließlich verschachtelter Objekt-, Platzhalter-, Array-Element- undanyOf- /oneOf- /allOf-Kompositionszweige, wenn passende Felddokumentation vorhanden ist.config.schema.lookupgibt eine pfadbezogene Lookup-Payload für einen Konfigurationspfad zurück: normalisierter Pfad, ein flacher Schema-Knoten, passender Hint +hintPathund unmittelbare Kindzusammenfassungen für UI-/CLI-Drilldown. Lookup-Schema-Knoten behalten die nutzerseitige Dokumentation und gängige Validierungsfelder bei (title,description,type,enum,const,format,pattern, numerische/String-/Array-/Objektgrenzen und Flags wieadditionalProperties,deprecated,readOnly,writeOnly). Kindzusammenfassungen legenkey, normalisiertenpath,type,required,hasChildrensowie den passendenhint/hintPathoffen.update.runführt den Gateway-Update-Ablauf aus und plant einen Neustart nur, wenn das Update selbst erfolgreich war; Aufrufer mit einer Sitzung könnencontinuationMessageeinbeziehen, damit der Start einen nachfolgenden Agent-Turn über die Neustart-Fortsetzungswarteschlange fortsetzt. Package-Manager-Updates erzwingen nach dem Pakettausch einen nicht aufschiebbaren Update-Neustart ohne Cooldown, damit der alte Gateway-Prozess nicht weiter Lazy Loading aus einem ersetztendist-Baum ausführt.update.statusgibt den neuesten gecachten Update-Neustart-Sentinel zurück, einschließlich der nach dem Neustart laufenden Version, sofern verfügbar.wizard.start,wizard.next,wizard.statusundwizard.cancelstellen den Onboarding-Wizard über WS RPC bereit.
Agent- und Arbeitsbereichshelfer
Agent- und Arbeitsbereichshelfer
agents.listgibt konfigurierte Agent-Einträge zurück, einschließlich effektivem Modell und Laufzeitmetadaten.agents.create,agents.updateundagents.deleteverwalten Agent-Datensätze und Arbeitsbereichsverkabelung.agents.files.list,agents.files.getundagents.files.setverwalten die Bootstrap-Arbeitsbereichsdateien, die für einen Agent offengelegt werden.tasks.list,tasks.getundtasks.cancelstellen SDK- und Operator-Clients das Gateway-Aufgabenbuch bereit.artifacts.list,artifacts.getundartifacts.downloadstellen aus Transkripten abgeleitete Artefaktzusammenfassungen und Downloads für einen explizitensessionKey-,runId- odertaskId-Scope bereit. Run- und Task-Abfragen lösen die zugehörige Sitzung serverseitig auf und geben nur Transkriptmedien mit passender Provenienz zurück; unsichere oder lokale URL-Quellen geben nicht unterstützte Downloads zurück, statt serverseitig abgerufen zu werden.environments.listundenvironments.statusstellen schreibgeschützte Gateway-lokale und Node-Umgebungserkennung für SDK-Clients bereit.agent.identity.getgibt die effektive Assistentenidentität für einen Agent oder eine Sitzung zurück.agent.waitwartet, bis ein Run abgeschlossen ist, und gibt den terminalen Snapshot zurück, sofern verfügbar.
Sitzungssteuerung
Sitzungssteuerung
sessions.listgibt den aktuellen Sitzungsindex zurück, einschließlichagentRuntime-Metadaten pro Zeile, wenn ein Agent-Laufzeit-Backend konfiguriert ist.sessions.subscribeundsessions.unsubscribeschalten Sitzungsänderungs-Event-Abonnements für den aktuellen WS-Client um.sessions.messages.subscribeundsessions.messages.unsubscribeschalten Transkript-/Nachrichten-Event-Abonnements für eine Sitzung um.sessions.previewgibt begrenzte Transkriptvorschauen für bestimmte Sitzungsschlüssel zurück.sessions.describegibt eine Gateway-Sitzungszeile für einen exakten Sitzungsschlüssel zurück.sessions.resolvelöst ein Sitzungsziel auf oder kanonisiert es.sessions.createerstellt einen neuen Sitzungseintrag.sessions.sendsendet eine Nachricht in eine bestehende Sitzung.sessions.steerist die Unterbrechen-und-Steuern-Variante für eine aktive Sitzung.sessions.abortbricht aktive Arbeit für eine Sitzung ab. Ein Aufrufer kannkeyplus optionalrunIdübergeben oder nurrunIdfür aktive Runs übergeben, die das Gateway einer Sitzung zuordnen kann.sessions.patchaktualisiert Sitzungsmetadaten/-Overrides und meldet das aufgelöste kanonische Modell plus effektivesagentRuntime.sessions.reset,sessions.deleteundsessions.compactführen Sitzungswartung aus.sessions.getgibt die vollständige gespeicherte Sitzungszeile zurück.- Die Chat-Ausführung verwendet weiterhin
chat.history,chat.send,chat.abortundchat.inject.chat.historyist für UI-Clients anzeige-normalisiert: Inline-Direktiv-Tags werden aus sichtbarem Text entfernt, Klartext-Tool-Call-XML-Payloads (einschließlich<tool_call>...</tool_call>,<function_call>...</function_call>,<tool_calls>...</tool_calls>,<function_calls>...</function_calls>und abgeschnittener Tool-Call-Blöcke) und durchgesickerte ASCII-/Full-Width-Modellsteuerungstokens werden entfernt, reine Silent-Token-Assistentenzeilen wie exaktNO_REPLY/no_replywerden ausgelassen, und übergroße Zeilen können durch Platzhalter ersetzt werden.
Gerätekopplung und Gerätetoken
Gerätekopplung und Gerätetoken
device.pair.listgibt ausstehende und genehmigte gekoppelte Geräte zurück.device.pair.approve,device.pair.rejectunddevice.pair.removeverwalten Gerätekopplungsdatensätze.device.token.rotaterotiert ein gekoppeltes Gerätetoken innerhalb seiner genehmigten Rollen- und Aufrufer-Scope-Grenzen.device.token.revokewiderruft ein gekoppeltes Gerätetoken innerhalb seiner genehmigten Rollen- und Aufrufer-Scope-Grenzen.
Node-Kopplung, Aufruf und ausstehende Arbeit
Node-Kopplung, Aufruf und ausstehende Arbeit
node.pair.request,node.pair.list,node.pair.approve,node.pair.reject,node.pair.removeundnode.pair.verifydecken Node-Kopplung und Bootstrap-Verifizierung ab.node.listundnode.describegeben bekannte/verbundene Node-Zustände zurück.node.renameaktualisiert eine gekoppelte Node-Bezeichnung.node.invokeleitet einen Befehl an einen verbundenen Node weiter.node.invoke.resultgibt das Ergebnis für eine Aufrufanforderung zurück.node.eventtransportiert vom Node stammende Events zurück in das Gateway.node.pending.pullundnode.pending.acksind die Warteschlangen-APIs für verbundene Nodes.node.pending.enqueueundnode.pending.drainverwalten dauerhafte ausstehende Arbeit für offline/disconnectete Nodes.
Genehmigungsfamilien
Genehmigungsfamilien
exec.approval.request,exec.approval.get,exec.approval.listundexec.approval.resolvedecken einmalige Exec-Genehmigungsanfragen sowie das Nachschlagen/Wiedergeben ausstehender Genehmigungen ab.exec.approval.waitDecisionwartet auf eine ausstehende Exec-Genehmigung und gibt die endgültige Entscheidung zurück (odernullbei Zeitüberschreitung).exec.approvals.getundexec.approvals.setverwalten Snapshots der Exec-Genehmigungsrichtlinie des Gateways.exec.approvals.node.getundexec.approvals.node.setverwalten die node-lokale Exec-Genehmigungsrichtlinie über Node-Relay-Befehle.plugin.approval.request,plugin.approval.list,plugin.approval.waitDecisionundplugin.approval.resolvedecken Plugin-definierte Genehmigungsabläufe ab.
Automatisierung, Skills und Tools
Automatisierung, Skills und Tools
- Automatisierung:
wakeplant eine sofortige oder nächste Heartbeat-Wecktext-Injektion;cron.get,cron.list,cron.status,cron.add,cron.update,cron.remove,cron.run,cron.runsverwalten geplante Arbeit. - Skills und Tools:
commands.list,skills.*,tools.catalog,tools.effective,tools.invoke.
Häufige Ereignisfamilien
chat: UI-Chat-Aktualisierungen wiechat.injectund andere rein transkriptbezogene Chat- Ereignisse.session.messageundsession.tool: Transkript-/Ereignisstrom-Aktualisierungen für eine abonnierte Sitzung.sessions.changed: Sitzungsindex oder Metadaten geändert.presence: Aktualisierungen des Systempräsenz-Snapshots.tick: periodisches Keepalive-/Liveness-Ereignis.health: Aktualisierung des Gateway-Zustands-Snapshots.heartbeat: Aktualisierung des Heartbeat-Ereignisstroms.cron: Ereignis zur Änderung eines Cron-Laufs/-Jobs.shutdown: Benachrichtigung zum Herunterfahren des Gateways.node.pair.requested/node.pair.resolved: Node-Pairing-Lebenszyklus.node.invoke.request: Broadcast einer Node-Aufrufanfrage.device.pair.requested/device.pair.resolved: Lebenszyklus gekoppelter Geräte.voicewake.changed: Wake-Word-Trigger-Konfiguration geändert.exec.approval.requested/exec.approval.resolved: Exec-Genehmigungs- Lebenszyklus.plugin.approval.requested/plugin.approval.resolved: Plugin-Genehmigungs- Lebenszyklus.
Node-Hilfsmethoden
- Nodes können
skills.binsaufrufen, um die aktuelle Liste der ausführbaren Skill-Dateien für Auto-Allow-Prüfungen abzurufen.
Task-Ledger-RPCs
Operator-Clients können Gateway-Hintergrundaufgabendatensätze über die Task-Ledger-RPCs prüfen und abbrechen. Diese Methoden geben bereinigte Aufgabenzusammenfassungen zurück, nicht den rohen Laufzeitstatus.tasks.listerfordertoperator.read.- Parameter: optional
status("queued","running","completed","failed","cancelled"oder"timed_out") oder ein Array dieser Statuswerte, optionalagentId, optionalsessionKey, optionallimitvon1bis500und optionaler Stringcursor. - Ergebnis:
{ "tasks": TaskSummary[], "nextCursor"?: string }.
- Parameter: optional
tasks.geterfordertoperator.read.- Parameter:
{ "taskId": string }. - Ergebnis:
{ "task": TaskSummary }. - Fehlende Task-IDs geben die Not-Found-Fehlerform des Gateways zurück.
- Parameter:
tasks.cancelerfordertoperator.write.- Parameter:
{ "taskId": string, "reason"?: string }. - Ergebnis:
{ "found": boolean, "cancelled": boolean, "reason"?: string, "task"?: TaskSummary }. foundmeldet, ob das Ledger eine passende Aufgabe enthielt.cancelledmeldet, ob die Laufzeit den Abbruch akzeptiert oder aufgezeichnet hat.
- Parameter:
TaskSummary enthält id, status und optionale Metadaten wie kind,
runtime, title, agentId, sessionKey, childSessionKey, ownerKey,
runId, taskId, flowId, parentTaskId, sourceId, Zeitstempel, Fortschritt,
abschließende Zusammenfassung und bereinigten Fehlertext.
Operator-Hilfsmethoden
- Operatoren können
commands.list(operator.read) aufrufen, um den Laufzeit- Befehlsbestand für einen Agent abzurufen.agentIdist optional; lassen Sie es weg, um den Standard-Agent-Workspace zu lesen.scopesteuert, auf welche Oberfläche das primärenamezielt:textgibt das primäre Textbefehlstoken ohne führendes/zurücknativeund der standardmäßigeboth-Pfad geben Provider-bewusste native Namen zurück, wenn verfügbar
textAliasesenthält exakte Slash-Aliase wie/modelund/m.nativeNameenthält den Provider-bewussten nativen Befehlsnamen, wenn einer existiert.providerist optional und wirkt sich nur auf native Benennung sowie native Plugin- Befehlsverfügbarkeit aus.includeArgs=falselässt serialisierte Argumentmetadaten in der Antwort weg.
- Operatoren können
tools.catalog(operator.read) aufrufen, um den Laufzeit-Toolkatalog für einen Agent abzurufen. Die Antwort enthält gruppierte Tools und Provenienzmetadaten:source:coreoderpluginpluginId: Plugin-Besitzer, wennsource="plugin"optional: ob ein Plugin-Tool optional ist
- Operatoren können
tools.effective(operator.read) aufrufen, um den zur Laufzeit wirksamen Tool- Bestand für eine Sitzung abzurufen.sessionKeyist erforderlich.- Das Gateway leitet vertrauenswürdigen Laufzeitkontext serverseitig aus der Sitzung ab, statt vom Aufrufer bereitgestellten Auth- oder Zustellungskontext zu akzeptieren.
- Die Antwort ist sitzungsbezogen und spiegelt wider, was die aktive Unterhaltung jetzt verwenden kann, einschließlich Core-, Plugin- und Kanal-Tools.
- Operatoren können
tools.invoke(operator.write) aufrufen, um ein verfügbares Tool über denselben Gateway-Richtlinienpfad wie/tools/invokeaufzurufen.nameist erforderlich.args,sessionKey,agentId,confirmundidempotencyKeysind optional.- Wenn sowohl
sessionKeyals auchagentIdvorhanden sind, muss der aufgelöste Sitzungs-AgentagentIdentsprechen. - Die Antwort ist ein SDK-seitiges Envelope mit
ok,toolName, optionalemoutputund typisiertenerror-Feldern. Genehmigungs- oder Richtlinienablehnungen gebenok:falsein der Nutzlast zurück, statt die Gateway-Tool-Richtlinienpipeline zu umgehen.
- Operatoren können
skills.status(operator.read) aufrufen, um den sichtbaren Skill-Bestand für einen Agent abzurufen.agentIdist optional; lassen Sie es weg, um den Standard-Agent-Workspace zu lesen.- Die Antwort enthält Eignung, fehlende Anforderungen, Konfigurationsprüfungen und bereinigte Installationsoptionen, ohne rohe Secret-Werte offenzulegen.
- Operatoren können
skills.searchundskills.detail(operator.read) für ClawHub-Discovery-Metadaten aufrufen. - Operatoren können
skills.upload.begin,skills.upload.chunkundskills.upload.commit(operator.admin) aufrufen, um ein privates Skill-Archiv vor der Installation bereitzustellen. Dies ist ein separater Admin-Upload-Pfad für vertrauenswürdige Clients, nicht der normale ClawHub-Skill-Installationsablauf, und standardmäßig deaktiviert, sofernskills.install.allowUploadedArchivesnicht aktiviert ist.skills.upload.begin({ kind: "skill-archive", slug, sizeBytes, sha256?, force?, idempotencyKey? })erstellt einen Upload, der an diesen Slug- und Force-Wert gebunden ist.skills.upload.chunk({ uploadId, offset, dataBase64 })hängt Bytes am exakt decodierten Offset an.skills.upload.commit({ uploadId, sha256? })prüft die endgültige Größe und SHA-256. Commit schließt nur den Upload ab; es installiert den Skill nicht.- Hochgeladene Skill-Archive sind ZIP-Archive, die eine
SKILL.md-Root enthalten. Der interne Verzeichnisname des Archivs wählt niemals das Installationsziel aus.
- Operatoren können
skills.install(operator.admin) in drei Modi aufrufen:- ClawHub-Modus:
{ source: "clawhub", slug, version?, force? }installiert einen Skill-Ordner in dasskills/-Verzeichnis des Standard-Agent-Workspaces. - Upload-Modus:
{ source: "upload", uploadId, slug, force?, sha256?, timeoutMs? }installiert einen abgeschlossenen Upload in das Verzeichnisskills/<slug>des Standard-Agent-Workspaces. Slug und Force-Wert müssen der ursprünglichenskills.upload.begin-Anfrage entsprechen. Dieser Modus wird abgelehnt, sofernskills.install.allowUploadedArchivesnicht aktiviert ist. Die Einstellung wirkt sich nicht auf ClawHub-Installationen aus. - Gateway-Installer-Modus:
{ name, installId, dangerouslyForceUnsafeInstall?, timeoutMs? }führt eine deklariertemetadata.openclaw.install-Aktion auf dem Gateway-Host aus.
- ClawHub-Modus:
- Operatoren können
skills.update(operator.admin) in zwei Modi aufrufen:- Der ClawHub-Modus aktualisiert einen nachverfolgten Slug oder alle nachverfolgten ClawHub-Installationen im Standard-Agent-Workspace.
- Der Konfigurationsmodus patcht Werte unter
skills.entries.<skillKey>wieenabled,apiKeyundenv.
models.list-Ansichten
models.list akzeptiert einen optionalen view-Parameter:
- Weggelassen oder
"default": aktuelles Laufzeitverhalten. Wennagents.defaults.modelskonfiguriert ist, ist die Antwort der erlaubte Katalog, einschließlich dynamisch entdeckter Modelle fürprovider/*-Einträge. Andernfalls ist die Antwort der vollständige Gateway-Katalog. "configured": Picker-großes Verhalten. Wennagents.defaults.modelskonfiguriert ist, hat es weiterhin Vorrang, einschließlich Provider-bezogener Discovery fürprovider/*-Einträge. Ohne Allowlist verwendet die Antwort explizitemodels.providers.*.models-Einträge und fällt nur dann auf den vollständigen Katalog zurück, wenn keine konfigurierten Modellzeilen existieren."all": vollständiger Gateway-Katalog unter Umgehung vonagents.defaults.models. Verwenden Sie dies für Diagnose- und Discovery-UIs, nicht für normale Modell-Picker.
Exec-Genehmigungen
- Wenn eine Exec-Anfrage Genehmigung benötigt, sendet das Gateway
exec.approval.requested. - Operator-Clients lösen dies durch Aufruf von
exec.approval.resolveauf (erfordert den Scopeoperator.approvals). - Für
host=nodemussexec.approval.requestsystemRunPlanenthalten (kanonischeargv/cwd/rawCommand/Sitzungsmetadaten). Anfragen ohnesystemRunPlanwerden abgelehnt. - Nach der Genehmigung verwenden weitergeleitete
node.invoke system.run-Aufrufe diesen kanonischensystemRunPlanals autoritativen Befehls-/cwd-/Sitzungskontext. - Wenn ein Aufrufer
command,rawCommand,cwd,agentIdodersessionKeyzwischen Vorbereitung und der abschließenden genehmigtensystem.run-Weiterleitung verändert, lehnt das Gateway den Lauf ab, statt der veränderten Nutzlast zu vertrauen.
Fallback für Agent-Zustellung
agent-Anfragen könnendeliver=trueenthalten, um ausgehende Zustellung anzufordern.bestEffortDeliver=falsebehält striktes Verhalten bei: nicht auflösbare oder nur interne Zustellziele gebenINVALID_REQUESTzurück.bestEffortDeliver=trueerlaubt einen Fallback auf sitzungsgebundene Ausführung, wenn keine extern zustellbare Route aufgelöst werden kann (zum Beispiel interne/Webchat-Sitzungen oder mehrdeutige Mehrkanal-Konfigurationen).- Finale
agent-Ergebnisse könnenresult.deliveryStatusenthalten, wenn Zustellung angefordert wurde, und verwenden dabei dieselben Statuswertesent,suppressed,partial_failedundfailed, die füropenclaw agent --json --deliverdokumentiert sind.
Versionierung
PROTOCOL_VERSIONbefindet sich insrc/gateway/protocol/version.ts.- Clients senden
minProtocol+maxProtocol; der Server lehnt Bereiche ab, die sein aktuelles Protokoll nicht einschließen. Native Clients verwenden eine v3-Untergrenze, sodass additive v4-Clients weiterhin v3-Gateways erreichen können. - Schemas + Modelle werden aus TypeBox-Definitionen generiert:
pnpm protocol:genpnpm protocol:gen:swiftpnpm protocol:check
Client-Konstanten
Der Referenzclient insrc/gateway/client.ts verwendet diese Standardwerte. Werte sind
über Protokoll v4 hinweg stabil und sind die erwartete Grundlage für Drittanbieter-Clients.
| Konstante | Standardwert | Quelle |
|---|---|---|
PROTOCOL_VERSION | 4 | src/gateway/protocol/version.ts |
MIN_CLIENT_PROTOCOL_VERSION | 3 | src/gateway/protocol/version.ts |
| Anfrage-Timeout (pro RPC) | 30_000 ms | src/gateway/client.ts (requestTimeoutMs) |
| Preauth-/Connect-Challenge-Timeout | 15_000 ms | src/gateway/handshake-timeouts.ts (Konfiguration/Env kann das gekoppelte Server-/Client-Budget erhöhen) |
| Anfänglicher Reconnect-Backoff | 1_000 ms | src/gateway/client.ts (backoffMs) |
| Maximaler Reconnect-Backoff | 30_000 ms | src/gateway/client.ts (scheduleReconnect) |
| Fast-Retry-Begrenzung nach Device-Token-Schließung | 250 ms | src/gateway/client.ts |
Force-Stop-Kulanz vor terminate() | 250 ms | FORCE_STOP_TERMINATE_GRACE_MS |
Standard-Timeout von stopAndWait() | 1_000 ms | STOP_AND_WAIT_TIMEOUT_MS |
Standard-Tick-Intervall (vor hello-ok) | 30_000 ms | src/gateway/client.ts |
| Tick-Timeout-Schließung | Code 4000, wenn Stille tickIntervalMs * 2 überschreitet | src/gateway/client.ts |
MAX_PAYLOAD_BYTES | 25 * 1024 * 1024 (25 MB) | src/gateway/server-constants.ts |
policy.tickIntervalMs, policy.maxPayload
und policy.maxBufferedBytes in hello-ok bekannt; Clients sollten diese Werte
anstelle der Standardwerte vor dem Handshake beachten.
Authentifizierung
- Shared-Secret-Gateway-Authentifizierung verwendet
connect.params.auth.tokenoderconnect.params.auth.password, abhängig vom konfigurierten Authentifizierungsmodus. - Identitätstragende Modi wie Tailscale Serve
(
gateway.auth.allowTailscale: true) oder nicht über Loopback laufendesgateway.auth.mode: "trusted-proxy"erfüllen die Connect-Authentifizierungsprüfung über Anfrage-Header statt überconnect.params.auth.*. - Private-Ingress
gateway.auth.mode: "none"überspringt die Shared-Secret-Connect-Authentifizierung vollständig; stellen Sie diesen Modus nicht auf öffentlichem/nicht vertrauenswürdigem Ingress bereit. - Nach dem Pairing stellt der Gateway ein Device Token aus, das auf die Verbindungsrolle
und Scopes begrenzt ist. Es wird in
hello-ok.auth.deviceTokenzurückgegeben und sollte vom Client für zukünftige Verbindungen persistiert werden. - Clients sollten das primäre
hello-ok.auth.deviceTokennach jeder erfolgreichen Verbindung persistieren. - Beim erneuten Verbinden mit diesem gespeicherten Device Token sollte auch die gespeicherte genehmigte Scope-Menge für dieses Token wiederverwendet werden. Dadurch bleibt Lese-/Probe-/Statuszugriff erhalten, der bereits gewährt wurde, und es wird vermieden, dass Reconnects stillschweigend auf einen engeren impliziten Nur-Admin-Scope reduziert werden.
- Clientseitige Connect-Auth-Zusammenstellung (
selectConnectAuthinsrc/gateway/client.ts):auth.passwordist orthogonal und wird immer weitergeleitet, wenn gesetzt.auth.tokenwird in Prioritätsreihenfolge befüllt: zuerst explizites Shared Token, dann ein explizitesdeviceToken, dann ein gespeichertes gerätespezifisches Token (indiziert nachdeviceId+role).auth.bootstrapTokenwird nur gesendet, wenn keines der oben Genannten einauth.tokenergeben hat. Ein Shared Token oder ein aufgelöstes Device Token unterdrückt es.- Die automatische Hochstufung eines gespeicherten Device Tokens beim einmaligen
AUTH_TOKEN_MISMATCH-Retry ist auf vertrauenswürdige Endpunkte beschränkt: Loopback oderwss://mit angepinntemtlsFingerprint. Öffentlicheswss://ohne Pinning qualifiziert sich nicht.
- Zusätzliche Einträge in
hello-ok.auth.deviceTokenssind Bootstrap-Handoff-Tokens. Persistieren Sie sie nur, wenn die Verbindung Bootstrap-Auth über einen vertrauenswürdigen Transport wiewss://oder Loopback/lokales Pairing verwendet hat. - Wenn ein Client ein explizites
deviceTokenoder explizitescopesangibt, bleibt diese vom Aufrufer angeforderte Scope-Menge maßgeblich; gecachte Scopes werden nur wiederverwendet, wenn der Client das gespeicherte gerätespezifische Token wiederverwendet. - Device Tokens können über
device.token.rotateunddevice.token.revokerotiert/widerrufen werden (erfordert den Scopeoperator.pairing). device.token.rotategibt Rotationsmetadaten zurück. Es gibt das ersetzende Bearer-Token nur bei Aufrufen desselben Geräts aus, die bereits mit diesem Device Token authentifiziert sind, damit tokenbasierte Clients ihren Ersatz persistieren können, bevor sie sich erneut verbinden. Shared-/Admin-Rotationen geben das Bearer-Token nicht aus.- Token-Ausstellung, -Rotation und -Widerruf bleiben auf die genehmigte Rollenmenge begrenzt, die im Pairing-Eintrag dieses Geräts erfasst ist; Token-Mutation kann keine Geräterolle erweitern oder ansteuern, die durch die Pairing-Genehmigung nie gewährt wurde.
- Bei Token-Sitzungen gekoppelter Geräte ist die Geräteverwaltung selbstbegrenzt, sofern der
Aufrufer nicht auch
operator.adminbesitzt: Nicht-Admin-Aufrufer können nur ihren eigenen Geräteeintrag entfernen/widerrufen/rotieren. device.token.rotateunddevice.token.revokeprüfen außerdem die Ziel-Operator-Token-Scope-Menge gegen die aktuellen Sitzungsscopes des Aufrufers. Nicht-Admin-Aufrufer können kein breiteres Operator-Token rotieren oder widerrufen, als sie bereits besitzen.- Authentifizierungsfehler enthalten
error.details.codeplus Wiederherstellungshinweise:error.details.canRetryWithDeviceToken(boolesch)error.details.recommendedNextStep(retry_with_device_token,update_auth_configuration,update_auth_credentials,wait_then_retry,review_auth_configuration)
- Clientverhalten bei
AUTH_TOKEN_MISMATCH:- Vertrauenswürdige Clients dürfen einen begrenzten Retry mit einem gecachten gerätespezifischen Token versuchen.
- Wenn dieser Retry fehlschlägt, sollten Clients automatische Reconnect-Schleifen beenden und Handlungsanleitung für den Operator anzeigen.
AUTH_SCOPE_MISMATCHbedeutet, dass das Device Token erkannt wurde, aber die angeforderte Rolle/Scopes nicht abdeckt. Clients sollten dies nicht als fehlerhaftes Token darstellen; fordern Sie den Operator auf, erneut zu pairen oder den engeren/breiteren Scope-Vertrag zu genehmigen.
Geräteidentität + Pairing
- Nodes sollten eine stabile Geräteidentität (
device.id) enthalten, die aus einem Keypair-Fingerprint abgeleitet ist. - Gateways stellen Tokens pro Gerät + Rolle aus.
- Pairing-Genehmigungen sind für neue Geräte-IDs erforderlich, sofern lokale automatische Genehmigung nicht aktiviert ist.
- Automatische Pairing-Genehmigung ist auf direkte local loopback-Verbindungen ausgerichtet.
- OpenClaw hat außerdem einen engen Backend-/Container-lokalen Self-Connect-Pfad für vertrauenswürdige Shared-Secret-Hilfsabläufe.
- Same-Host-Tailnet- oder LAN-Verbindungen werden für Pairing weiterhin als remote behandelt und erfordern Genehmigung.
- WS-Clients enthalten normalerweise während
connecteinedevice-Identität (Operator + Node). Die einzigen gerätelosen Operator-Ausnahmen sind explizite Vertrauenspfade:gateway.controlUi.allowInsecureAuth=truefür nur auf localhost beschränkte unsichere HTTP-Kompatibilität.- erfolgreiche Operator-Control-UI-Auth mit
gateway.auth.mode: "trusted-proxy". gateway.controlUi.dangerouslyDisableDeviceAuth=true(Break-Glass, schwere Sicherheitsherabstufung).- direkte Loopback-
gateway-client-Backend-RPCs, die mit dem gemeinsamen Gateway-Token/Passwort authentifiziert sind.
- Alle Verbindungen müssen die vom Server bereitgestellte
connect.challenge-Nonce signieren.
Diagnose für Geräteauthentifizierungs-Migration
Für Legacy-Clients, die noch Signierverhalten vor der Challenge verwenden, gibtconnect nun
DEVICE_AUTH_*-Detailcodes unter error.details.code mit einem stabilen error.details.reason zurück.
Häufige Migrationsfehler:
| Nachricht | details.code | details.reason | Bedeutung |
|---|---|---|---|
device nonce required | DEVICE_AUTH_NONCE_REQUIRED | device-nonce-missing | Client hat device.nonce ausgelassen (oder leer gesendet). |
device nonce mismatch | DEVICE_AUTH_NONCE_MISMATCH | device-nonce-mismatch | Client hat mit einer veralteten/falschen Nonce signiert. |
device signature invalid | DEVICE_AUTH_SIGNATURE_INVALID | device-signature | Signatur-Payload entspricht nicht dem v2-Payload. |
device signature expired | DEVICE_AUTH_SIGNATURE_EXPIRED | device-signature-stale | Signierter Zeitstempel liegt außerhalb der erlaubten Abweichung. |
device identity mismatch | DEVICE_AUTH_DEVICE_ID_MISMATCH | device-id-mismatch | device.id stimmt nicht mit dem Public-Key-Fingerprint überein. |
device public key invalid | DEVICE_AUTH_PUBLIC_KEY_INVALID | device-public-key | Public-Key-Format/Kanonisierung ist fehlgeschlagen. |
- Warten Sie immer auf
connect.challenge. - Signieren Sie den v2-Payload, der die Server-Nonce enthält.
- Senden Sie dieselbe Nonce in
connect.params.device.nonce. - Bevorzugter Signatur-Payload ist
v3, der zusätzlich zu Geräte-/Client-/Rollen-/Scope-/Token-/Nonce-FeldernplatformunddeviceFamilybindet. - Legacy-
v2-Signaturen werden aus Kompatibilitätsgründen weiterhin akzeptiert, aber Metadaten-Pinning für gekoppelte Geräte steuert weiterhin die Befehlsrichtlinie beim Reconnect.
TLS + Pinning
- TLS wird für WS-Verbindungen unterstützt.
- Clients können optional den Gateway-Zertifikatsfingerprint pinnen (siehe
gateway.tls- Konfiguration plusgateway.remote.tlsFingerprintoder CLI--tls-fingerprint).
Scope
Dieses Protokoll stellt die vollständige Gateway-API bereit (Status, Kanäle, Modelle, Chat, Agent, Sitzungen, Nodes, Genehmigungen usw.). Die genaue Oberfläche wird durch die TypeBox-Schemas insrc/gateway/protocol/schema.ts definiert.