कंट्रोल UI (ब्राउज़र)¶
कंट्रोल UI एक छोटा Vite + Lit सिंगल‑पेज ऐप है जिसे Gateway द्वारा परोसा जाता है:
- डिफ़ॉल्ट:
http://<host>:18789/ - वैकल्पिक प्रीफ़िक्स:
gateway.controlUi.basePathसेट करें (उदा./openclaw)
यह उसी पोर्ट पर Gateway WebSocket से सीधे बात करता है।
त्वरित खोलें (लोकल)¶
यदि Gateway उसी कंप्यूटर पर चल रहा है, तो खोलें:
यदि पेज लोड नहीं होता, तो पहले Gateway शुरू करें: openclaw gateway.
प्रमाणीकरण WebSocket हैंडशेक के दौरान निम्न के माध्यम से प्रदान किया जाता है:
connect.params.auth.tokenconnect.params.auth.passwordडैशबोर्ड सेटिंग्स पैनल आपको एक टोकन सहेजने की सुविधा देता है; पासवर्ड सहेजे नहीं जाते हैं। The onboarding wizard generates a gateway token by default, so paste it here on first connect.
डिवाइस पेयरिंग (पहला कनेक्शन)¶
जब आप किसी नए ब्राउज़र या डिवाइस से Control UI से कनेक्ट करते हैं, तो Gateway
requires a one-time pairing approval — even if you're on the same Tailnet
with gateway.auth.allowTailscale: true. This is a security measure to prevent
unauthorized access.
आप क्या देखेंगे: "disconnected (1008): pairing required"
डिवाइस को अनुमोदित करने के लिए:
# List pending requests
openclaw devices list
# Approve by request ID
openclaw devices approve <requestId>
स्वीकृत होने के बाद, डिवाइस को याद रखा जाता है और पुनः-स्वीकृति की आवश्यकता नहीं होगी जब तक
you revoke it with openclaw devices revoke --device <id> --role <role>. See
Devices CLI for token rotation and revocation.
टिप्पणियाँ:
- लोकल कनेक्शन (
127.0.0.1) स्वतः अनुमोदित होते हैं। - रिमोट कनेक्शन (LAN, Tailnet आदि) के लिए स्पष्ट स्वीकृति आवश्यक है।
- प्रत्येक ब्राउज़र प्रोफ़ाइल एक अद्वितीय डिवाइस ID बनाती है, इसलिए ब्राउज़र बदलने या ब्राउज़र डेटा साफ़ करने पर पुनः‑पेयरिंग की आवश्यकता होगी।
यह आज क्या कर सकता है¶
- Gateway WS के माध्यम से मॉडल के साथ चैट (
chat.history,chat.send,chat.abort,chat.inject) - चैट में टूल कॉल स्ट्रीम करना + लाइव टूल आउटपुट कार्ड (एजेंट इवेंट्स)
- Channels: WhatsApp/Telegram/Discord/Slack + plugin channels (Mattermost, etc.) status + QR login + per-channel config (
channels.status,web.login.*,config.patch) - इंस्टेंस: प्रेज़ेन्स सूची + रिफ़्रेश (
system-presence) - सत्र: सूची + प्रति‑सत्र thinking/verbose ओवरराइड (
sessions.list,sessions.patch) - क्रॉन जॉब्स: सूची/जोड़ें/चलाएँ/सक्षम/अक्षम + रन इतिहास (
cron.*) - Skills: स्थिति, सक्षम/अक्षम, इंस्टॉल, API कुंजी अपडेट (
skills.*) - नोड्स: सूची + क्षमताएँ (
node.list) - Exec अनुमोदन: gateway या नोड allowlists संपादित करें +
exec host=gateway/nodeके लिए नीति पूछें (exec.approvals.*) - विन्यास: देखें/संपादित करें
~/.openclaw/openclaw.json(config.get,config.set) - विन्यास: सत्यापन (
config.apply) के साथ लागू करें + पुनः प्रारंभ करें और अंतिम सक्रिय सत्र को जगाएँ - विन्यास लेखन में समवर्ती संपादनों को ओवरराइट होने से रोकने के लिए base-hash गार्ड शामिल है
- विन्यास स्कीमा + फ़ॉर्म रेंडरिंग (
config.schema, जिसमें प्लगइन + चैनल स्कीमा शामिल हैं); Raw JSON संपादक उपलब्ध रहता है - डिबग: स्थिति/स्वास्थ्य/मॉडल स्नैपशॉट्स + इवेंट लॉग + मैनुअल RPC कॉल (
status,health,models.list) - लॉग्स: फ़िल्टर/एक्सपोर्ट के साथ gateway फ़ाइल लॉग्स का लाइव टेल (
logs.tail) - अपडेट: पैकेज/git अपडेट चलाएँ + पुनः प्रारंभ करें (
update.run) और एक रीस्टार्ट रिपोर्ट के साथ
क्रॉन जॉब्स पैनल नोट्स:
- अलग-थलग जॉब्स के लिए, डिलीवरी डिफ़ॉल्ट रूप से सारांश की घोषणा पर सेट होती है। यदि आप केवल आंतरिक रन चाहते हैं, तो आप इसे none पर स्विच कर सकते हैं।
- जब announce चुना जाता है, तब चैनल/टार्गेट फ़ील्ड दिखाई देते हैं।
चैट व्यवहार¶
chat.sendनॉन‑ब्लॉकिंग है: यह तुरंत{ runId, status: "started" }के साथ ack करता है और प्रतिक्रियाchatइवेंट्स के माध्यम से स्ट्रीम होती है।- उसी
idempotencyKeyके साथ पुनः भेजने पर, चलने के दौरान{ status: "in_flight" }और पूर्ण होने के बाद{ status: "ok" }लौटता है। chat.injectसत्र ट्रांसक्रिप्ट में एक सहायक नोट जोड़ता है और UI‑केवल अपडेट्स के लिएchatइवेंट प्रसारित करता है (कोई एजेंट रन नहीं, कोई चैनल डिलीवरी नहीं)।- रोकें:
- Stop पर क्लिक करें (
chat.abortकॉल करता है) /stopटाइप करें (याstop|esc|abort|wait|exit|interrupt) ताकि आउट‑ऑफ़‑बैंड निरस्त किया जा सकेchat.abort{ sessionKey }का समर्थन करता है (कोईrunIdनहीं) ताकि उस सत्र के सभी सक्रिय रन निरस्त किए जा सकें
Tailnet एक्सेस (अनुशंसित)¶
एकीकृत Tailscale Serve (पसंदीदा)¶
Gateway को loopback पर रखें और Tailscale Serve को HTTPS के साथ इसे प्रॉक्सी करने दें:
openclaw gateway --tailscale serve
खोलें:
https://<magicdns>/(या आपका विन्यस्तgateway.controlUi.basePath)
डिफ़ॉल्ट रूप से, Serve अनुरोध Tailscale पहचान हेडर्स के माध्यम से प्रमाणित हो सकते हैं
(tailscale-user-login) when gateway.auth.allowTailscale is true. OpenClaw
verifies the identity by resolving the x-forwarded-for address with
tailscale whois and matching it to the header, and only accepts these when the
request hits loopback with Tailscale’s x-forwarded-* headers. Set
gateway.auth.allowTailscale: false (or force gateway.auth.mode: "password")
if you want to require a token/password even for Serve traffic.
Tailnet से बाइंड + टोकन¶
openclaw gateway --bind tailnet --token "$(openssl rand -hex 32)"
फिर खोलें:
http://<tailscale-ip>:18789/(या आपका विन्यस्तgateway.controlUi.basePath)
टोकन को UI सेटिंग्स में पेस्ट करें ( connect.params.auth.token के रूप में भेजा जाता है)।
असुरक्षित HTTP¶
यदि आप डैशबोर्ड को साधारण HTTP (http://<lan-ip> या http://<tailscale-ip>) पर खोलते हैं,
the browser runs in a non-secure context and blocks WebCrypto. By default,
OpenClaw blocks Control UI connections without device identity.
अनुशंसित समाधान: HTTPS (Tailscale Serve) का उपयोग करें या UI को लोकली खोलें:
https://<magicdns>/(Serve)http://127.0.0.1:18789/(Gateway होस्ट पर)
डाउनग्रेड उदाहरण (HTTP पर केवल‑टोकन):
{
gateway: {
controlUi: { allowInsecureAuth: true },
bind: "tailnet",
auth: { mode: "token", token: "replace-me" },
},
}
यह Control UI के लिए डिवाइस पहचान + पेयरिंग को अक्षम कर देता है (यहाँ तक कि HTTPS पर भी)। उपयोग करें only if you trust the network.
HTTPS सेटअप मार्गदर्शन के लिए Tailscale देखें।
UI बनाना¶
The Gateway serves static files from dist/control-ui. Build them with:
pnpm ui:build # auto-installs UI deps on first run
वैकल्पिक absolute base (जब आप स्थिर एसेट URL चाहते हैं):
OPENCLAW_CONTROL_UI_BASE_PATH=/openclaw/ pnpm ui:build
लोकल विकास के लिए (अलग dev सर्वर):
pnpm ui:dev # auto-installs UI deps on first run
Then point the UI at your Gateway WS URL (e.g. ws://127.0.0.1:18789).
डिबगिंग/टेस्टिंग: dev सर्वर + रिमोट Gateway¶
The Control UI is static files; the WebSocket target is configurable and can be different from the HTTP origin. This is handy when you want the Vite dev server locally but the Gateway runs elsewhere.
- UI dev सर्वर शुरू करें:
pnpm ui:dev - इस प्रकार का URL खोलें:
http://localhost:5173/?gatewayUrl=ws://<gateway-host>:18789
वैकल्पिक एक‑बार प्रमाणीकरण (यदि आवश्यक हो):
http://localhost:5173/?gatewayUrl=wss://<gateway-host>:18789&token=<gateway-token>
नोट्स:
gatewayUrlलोड के बाद localStorage में संग्रहीत होता है और URL से हटा दिया जाता है।tokenlocalStorage में संग्रहीत होता है;passwordकेवल मेमोरी में रखा जाता है।- When
gatewayUrlis set, the UI does not fall back to config or environment credentials. Providetoken(orpassword) explicitly. Missing explicit credentials is an error. - जब Gateway TLS (Tailscale Serve, HTTPS प्रॉक्सी, आदि) के पीछे हो, तो
wss://का उपयोग करें। - क्लिकजैकिंग रोकने के लिए
gatewayUrlकेवल टॉप‑लेवल विंडो में स्वीकार किया जाता है (एम्बेडेड नहीं)। - For cross-origin dev setups (e.g.
pnpm ui:devto a remote Gateway), add the UI origin togateway.controlUi.allowedOrigins.
उदाहरण:
{
gateway: {
controlUi: {
allowedOrigins: ["http://localhost:5173"],
},
},
}
रिमोट एक्सेस सेटअप विवरण: Remote access।