Control UI (Browser)
Die Control UI ist eine kleine Vite + Lit Single-Page-App, die vom Gateway bereitgestellt wird:- Standard:
http://<host>:18789/ - optionaler Präfix: setzen Sie
gateway.controlUi.basePath(z. B./openclaw)
Schnell öffnen (lokal)
Wenn das Gateway auf demselben Computer läuft, öffnen Sie: Wenn die Seite nicht lädt, starten Sie zuerst das Gateway:openclaw gateway.
Die Authentifizierung wird während des WebSocket-Handshakes bereitgestellt über:
connect.params.auth.tokenconnect.params.auth.passwordIm Einstellungsbereich des Dashboards können Sie ein Token speichern; Passwörter werden nicht persistiert. Der Onboarding-Assistent erzeugt standardmäßig ein Gateway-Token; fügen Sie es daher beim ersten Verbinden hier ein.
Geräte-Pairing (erste Verbindung)
Wenn Sie die Control UI von einem neuen Browser oder Gerät aus verbinden, verlangt das Gateway eine einmalige Pairing-Freigabe — selbst wenn Sie sich im selben Tailnet mitgateway.auth.allowTailscale: true befinden. Dies ist eine Sicherheitsmaßnahme zur Verhinderung
unbefugten Zugriffs.
Was Sie sehen: „disconnected (1008): pairing required“
So genehmigen Sie das Gerät:
openclaw devices revoke --device <id> --role <role>. Siehe
Devices CLI für Token-Rotation und -Widerruf.
Hinweise:
- Lokale Verbindungen (
127.0.0.1) werden automatisch genehmigt. - Remote-Verbindungen (LAN, Tailnet usw.) erfordern eine explizite Genehmigung.
- Jedes Browserprofil erzeugt eine eindeutige Geräte-ID; ein Browserwechsel oder das Löschen von Browserdaten erfordert daher ein erneutes Pairing.
Was sie (heute) kann
- Chat mit dem Modell über Gateway WS (
chat.history,chat.send,chat.abort,chat.inject) - Streaming von Werkzeugaufrufen + Live-Werkzeugausgabekarten im Chat (Agent-Ereignisse)
- Kanäle: WhatsApp/Telegram/Discord/Slack + Plugin-Kanäle (Mattermost usw.) Status + QR-Login + kanalweise Konfiguration (
channels.status,web.login.*,config.patch) - Instanzen: Präsenzliste + Aktualisieren (
system-presence) - Sitzungen: Liste + sitzungsspezifische Thinking-/Verbose-Overrides (
sessions.list,sessions.patch) - Cron-Jobs: auflisten/hinzufügen/ausführen/aktivieren/deaktivieren + Ausführungsverlauf (
cron.*) - Skills: Status, aktivieren/deaktivieren, installieren, API-Schlüssel-Updates (
skills.*) - Nodes: Liste + Caps (
node.list) - Exec-Freigaben: Gateway- oder Node-Allowlists bearbeiten + Richtlinie für
exec host=gateway/nodeabfragen (exec.approvals.*) - Konfiguration:
~/.openclaw/openclaw.jsonanzeigen/bearbeiten (config.get,config.set) - Konfiguration: Anwenden + Neustart mit Validierung (
config.apply) und die zuletzt aktive Sitzung aufwecken - Konfigurationsschreibvorgänge enthalten eine Base-Hash-Schutzmaßnahme, um das Überschreiben paralleler Änderungen zu verhindern
- Konfigurationsschema + Formular-Rendering (
config.schema, einschließlich Plugin- und Kanal-Schemata); ein Raw-JSON-Editor bleibt verfügbar - Debug: Status-/Health-/Model-Snapshots + Ereignisprotokoll + manuelle RPC-Aufrufe (
status,health,models.list) - Logs: Live-Tail der Gateway-Dateilogs mit Filter/Export (
logs.tail) - Update: Paket-/Git-Update ausführen + Neustart (
update.run) mit Neustartbericht
- Für isolierte Jobs ist die Auslieferung standardmäßig auf „announce summary“ gesetzt. Sie können auf „none“ wechseln, wenn Sie ausschließlich interne Ausführungen möchten.
- Die Felder Kanal/Ziel erscheinen, wenn „announce“ ausgewählt ist.
Chat-Verhalten
chat.sendist nicht blockierend: Es bestätigt sofort mit{ runId, status: "started" }, und die Antwort streamt überchat-Ereignisse.- Erneutes Senden mit derselben
idempotencyKeygibt während der Ausführung{ status: "in_flight" }zurück und nach Abschluss{ status: "ok" }. chat.injecthängt eine Assistenz-Notiz an das Sitzungsprotokoll an und sendet einchat-Ereignis für reine UI-Updates (kein Agent-Lauf, keine Kanalzustellung).- Stopp:
- Klicken Sie auf Stop (ruft
chat.abortauf) - Tippen Sie
/stop(oderstop|esc|abort|wait|exit|interrupt), um out-of-band abzubrechen chat.abortunterstützt{ sessionKey }(keinrunId), um alle aktiven Läufe für diese Sitzung abzubrechen
- Klicken Sie auf Stop (ruft
Tailnet-Zugriff (empfohlen)
Integriertes Tailscale Serve (bevorzugt)
Belassen Sie das Gateway auf loopback und lassen Sie es von Tailscale Serve per HTTPS proxyen:https://<magicdns>/(oder Ihr konfiguriertesgateway.controlUi.basePath)
tailscale-user-login) authentifizieren, wenn gateway.auth.allowTailscale auf true gesetzt ist. OpenClaw
verifiziert die Identität, indem es die x-forwarded-for-Adresse mit
tailscale whois auflöst und mit dem Header abgleicht, und akzeptiert diese nur,
wenn die Anfrage loopback mit Tailscales x-forwarded-*-Headern erreicht. Setzen Sie
gateway.auth.allowTailscale: false (oder erzwingen Sie gateway.auth.mode: "password"),
wenn Sie auch für Serve-Traffic ein Token/Passwort verlangen möchten.
An Tailnet binden + Token
http://<tailscale-ip>:18789/(oder Ihr konfiguriertesgateway.controlUi.basePath)
connect.params.auth.token).
Unsicheres HTTP
Wenn Sie das Dashboard über reines HTTP öffnen (http://<lan-ip> oder http://<tailscale-ip>),
läuft der Browser in einem nicht sicheren Kontext und blockiert WebCrypto. Standardmäßig
blockiert OpenClaw Control-UI-Verbindungen ohne Geräteidentität.
Empfohlene Abhilfe: Verwenden Sie HTTPS (Tailscale Serve) oder öffnen Sie die UI lokal:
https://<magicdns>/(Serve)http://127.0.0.1:18789/(auf dem Gateway-Host)
UI bauen
Das Gateway stellt statische Dateien ausdist/control-ui bereit. Bauen Sie sie mit:
ws://127.0.0.1:18789).
Debugging/Testing: Dev-Server + Remote-Gateway
Die Control UI besteht aus statischen Dateien; das WebSocket-Ziel ist konfigurierbar und kann sich vom HTTP-Origin unterscheiden. Das ist praktisch, wenn Sie den Vite-Dev-Server lokal nutzen, das Gateway jedoch anderswo läuft.- Starten Sie den UI-Dev-Server:
pnpm ui:dev - Öffnen Sie eine URL wie:
gatewayUrlwird nach dem Laden in localStorage gespeichert und aus der URL entfernt.tokenwird in localStorage gespeichert;passwordwird nur im Speicher gehalten.- Wenn
gatewayUrlgesetzt ist, greift die UI nicht auf Konfigurations- oder Umgebungs-Anmeldedaten zurück. Geben Sietoken(oderpassword) explizit an. Fehlende explizite Anmeldedaten sind ein Fehler. - Verwenden Sie
wss://, wenn sich das Gateway hinter TLS befindet (Tailscale Serve, HTTPS-Proxy usw.). gatewayUrlwird nur in einem Top-Level-Fenster akzeptiert (nicht eingebettet), um Clickjacking zu verhindern.- Für Cross-Origin-Dev-Setups (z. B.
pnpm ui:devzu einem Remote-Gateway) fügen Sie den UI-Origin zugateway.controlUi.allowedOriginshinzu.