控制 UI 是由 Gateway 提供服務的小型 Vite + Lit 單頁應用程式: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.
- 預設:
http://<host>:18789/ - 選用前綴:設定
gateway.controlUi.basePath(例如/openclaw)
快速開啟(本機)
如果 Gateway 正在同一台電腦上執行,請開啟: 如果頁面載入失敗,請先啟動 Gateway:openclaw gateway。
驗證會在 WebSocket 交握期間透過以下方式提供:
connect.params.auth.tokenconnect.params.auth.passwordgateway.auth.allowTailscale: true時的 Tailscale Serve 身分標頭gateway.auth.mode: "trusted-proxy"時的受信任 Proxy 身分標頭
gateway.auth.mode 為 "password" 時,也可以使用密碼驗證。
裝置配對(首次連線)
當你從新的瀏覽器或裝置連線到控制 UI 時,Gateway 通常會要求一次性配對核准。這是一項安全措施,用來防止未授權存取。 你會看到的內容:「disconnected (1008): pairing required」 如果瀏覽器以變更後的驗證詳細資料(角色/範圍/公開金鑰)重試配對,先前待處理的要求會被取代,並建立新的requestId。請在核准前重新執行 openclaw devices list。
如果瀏覽器已經配對,而你將它從讀取存取改為寫入/管理員存取,這會被視為核准升級,而不是靜默重新連線。OpenClaw 會保留舊核准為有效狀態、阻擋權限更廣的重新連線,並要求你明確核准新的範圍集。
核准後,裝置會被記住,除非你使用 openclaw devices revoke --device <id> --role <role> 撤銷,否則不需要重新核准。請參閱裝置 CLI 了解權杖輪替與撤銷。
- 直接 local loopback 瀏覽器連線(
127.0.0.1/localhost)會自動核准。 - 當
gateway.auth.allowTailscale: true、Tailscale 身分驗證通過,且瀏覽器提供其裝置身分時,Tailscale Serve 可略過控制 UI 操作者工作階段的配對往返流程。 - 直接 Tailnet 繫結、LAN 瀏覽器連線,以及沒有裝置身分的瀏覽器設定檔,仍需要明確核准。
- 每個瀏覽器設定檔都會產生唯一的裝置 ID,因此切換瀏覽器或清除瀏覽器資料都需要重新配對。
個人身分(瀏覽器本機)
控制 UI 支援每個瀏覽器各自的個人身分(顯示名稱和頭像),會附加到傳出的訊息,以便在共享工作階段中標示歸屬。它存在瀏覽器儲存空間中,作用範圍限於目前的瀏覽器設定檔,不會同步到其他裝置,也不會在伺服器端持久保存;除了你實際傳送的訊息上一般的逐字稿作者中繼資料之外。清除網站資料或切換瀏覽器會將它重設為空白。 相同的瀏覽器本機模式也適用於助理頭像覆寫。上傳的助理頭像只會在本機瀏覽器中覆蓋由 Gateway 解析出的身分,且絕不會透過config.patch 往返傳輸。共享的 ui.assistant.avatar 設定欄位仍可供非 UI 用戶端直接寫入該欄位(例如腳本化 Gateway 或自訂儀表板)。
執行階段設定端點
控制 UI 會從/__openclaw/control-ui-config.json 擷取其執行階段設定。該端點由與其餘 HTTP 表面相同的 Gateway 驗證保護:未驗證的瀏覽器無法擷取它,而成功擷取需要已有效的 Gateway 權杖/密碼、Tailscale Serve 身分,或受信任 Proxy 身分。
語言支援
控制 UI 可以在首次載入時依照你的瀏覽器語系進行本地化。若要稍後覆寫,請開啟概觀 -> Gateway 存取 -> 語言。語系選擇器位於 Gateway 存取卡片中,而不是外觀底下。- 支援的語系:
en、zh-CN、zh-TW、pt-BR、de、es、ja-JP、ko、fr、ar、it、tr、uk、id、pl、th、vi、nl、fa - 非英文翻譯會在瀏覽器中延遲載入。
- 選取的語系會儲存在瀏覽器儲存空間,並在未來造訪時重複使用。
- 缺少的翻譯鍵會回退為英文。
th)和波斯文(fa)文件仍會在發布儲存庫中產生;在 Mintlify 支援這些代碼之前,它們可能不會出現在該選擇器中。
外觀主題
外觀面板保留內建的 Claw、Knot 和 Dash 主題,另外還有一個瀏覽器本機的 tweakcn 匯入槽。若要匯入主題,請開啟 tweakcn 主題、選擇或建立主題、按一下分享,然後將複製的主題連結貼到外觀中。匯入器也接受https://tweakcn.com/r/themes/<id> 登錄 URL、像 https://tweakcn.com/editor/theme?theme=amethyst-haze 這樣的編輯器 URL、相對 /themes/<id> 路徑、原始主題 ID,以及像 amethyst-haze 這樣的預設主題名稱。
匯入的主題只會儲存在目前的瀏覽器設定檔中。它們不會寫入 Gateway 設定,也不會跨裝置同步。替換匯入的主題會更新那個本機槽;清除它會在匯入的主題原本被選取時,將作用中的主題切回 Claw。
它目前可以做什麼
聊天與語音交談
聊天與語音交談
- 透過 Gateway WS 與模型聊天(
chat.history、chat.send、chat.abort、chat.inject)。 - 透過瀏覽器即時工作階段進行語音交談。OpenAI 使用直接 WebRTC,Google Live 透過 WebSocket 使用受限的一次性瀏覽器權杖,而僅限後端的即時語音 Plugin 則使用 Gateway 中繼傳輸。中繼會將供應商認證保留在 Gateway 上,同時瀏覽器透過
talk.realtime.relay*RPC 串流麥克風 PCM,並將openclaw_agent_consult工具呼叫透過chat.send傳回給已設定的較大型 OpenClaw 模型。 - 在聊天中串流工具呼叫和即時工具輸出卡片(代理事件)。
頻道、實例、工作階段、夢境
頻道、實例、工作階段、夢境
- 頻道:內建以及綁定/外部 Plugin 頻道狀態、QR 登入,以及每個頻道的設定(
channels.status、web.login.*、config.patch)。 - 實例:存在清單和重新整理(
system-presence)。 - 工作階段:清單以及每個工作階段的模型/思考/快速/詳細/追蹤/推理覆寫(
sessions.list、sessions.patch)。 - 夢境:Dreaming 狀態、啟用/停用切換,以及夢境日記讀取器(
doctor.memory.status、doctor.memory.dreamDiary、config.patch)。
Cron、Skills、Node、執行核准
Cron、Skills、Node、執行核准
- Cron 工作:列出/新增/編輯/執行/啟用/停用,以及執行歷史(
cron.*)。 - Skills:狀態、啟用/停用、安裝、API 金鑰更新(
skills.*)。 - Node:清單和能力(
node.list)。 - 執行核准:編輯 Gateway 或 Node 允許清單,以及
exec host=gateway/node的詢問政策(exec.approvals.*)。
設定
設定
- 檢視/編輯
~/.openclaw/openclaw.json(config.get、config.set)。 - 套用並透過驗證重新啟動(
config.apply),並喚醒最後一個作用中的工作階段。 - 寫入包含基礎雜湊防護,以防止覆蓋並行編輯。
- 寫入(
config.set/config.apply/config.patch)會預先檢查已提交設定承載中參照的作用中 SecretRef 解析;未解析的作用中已提交參照會在寫入前被拒絕。 - 結構描述和表單算繪(
config.schema/config.schema.lookup,包括欄位title/description、符合的 UI 提示、直接子項摘要、巢狀物件/萬用字元/陣列/組合節點上的文件中繼資料,以及可用時的 Plugin 和頻道結構描述);只有在快照具有安全的原始往返時,原始 JSON 編輯器才可使用。 - 如果快照無法安全地往返原始文字,控制 UI 會強制使用表單模式,並停用該快照的原始模式。
- 原始 JSON 編輯器的「重設為已儲存」會保留以原始文字撰寫的形狀(格式、註解、
$include配置),而不是重新算繪扁平化快照,因此當快照可以安全往返時,外部編輯會在重設後保留。 - 結構化 SecretRef 物件值會在表單文字輸入中以唯讀方式算繪,以防止意外的物件轉字串損毀。
偵錯、記錄、更新
偵錯、記錄、更新
- 偵錯:狀態/健康狀態/模型快照、事件記錄,以及手動 RPC 呼叫(
status、health、models.list)。 - 記錄:即時追蹤 Gateway 檔案記錄,並提供篩選/匯出(
logs.tail)。 - 更新:執行套件/git 更新並重新啟動(
update.run),附帶重新啟動報告,然後在重新連線後輪詢update.status,以驗證正在執行的 Gateway 版本。
Cron 工作面板備註
Cron 工作面板備註
- 對於隔離工作,傳遞預設為公告摘要。如果你想要僅限內部執行,可以切換為無。
- 選取公告時會顯示頻道/目標欄位。
- Webhook 模式使用
delivery.mode = "webhook",並將delivery.to設為有效的 HTTP(S) Webhook URL。 - 對於主工作階段工作,可使用 Webhook 和無傳遞模式。
- 進階編輯控制項包括執行後刪除、清除代理覆寫、Cron 精確/錯開選項、代理模型/思考覆寫,以及盡力而為傳遞切換。
- 表單驗證會以欄位層級錯誤內嵌顯示;無效值會停用儲存按鈕,直到修正為止。
- 設定
cron.webhookToken以傳送專用 Bearer 權杖;如果省略,Webhook 會在沒有驗證標頭的情況下傳送。 - 已淘汰的後援:儲存的舊版工作若有
notify: true,在遷移前仍可使用cron.webhook。
聊天行為
傳送與歷史語意
傳送與歷史語意
chat.send是非阻塞的:它會立即以{ runId, status: "started" }確認,回應則透過chat事件串流傳送。- 聊天上傳接受圖片以及非影片檔案。圖片保留原生圖片路徑;其他檔案會儲存為受管理媒體,並在歷史記錄中顯示為附件連結。
- 使用相同
idempotencyKey重新傳送時,執行中會回傳{ status: "in_flight" },完成後會回傳{ status: "ok" }。 chat.history回應會為了 UI 安全而限制大小。當逐字稿項目過大時,Gateway 可能會截斷較長的文字欄位、省略較重的中繼資料區塊,並以佔位符取代過大的訊息([chat.history omitted: message too large])。- 助理/生成的圖片會保存為受管理媒體參照,並透過已驗證的 Gateway 媒體 URL 回傳,因此重新載入不會依賴原始 base64 圖片承載資料繼續留在聊天歷史回應中。
chat.history也會從可見助理文字中移除僅供顯示的行內指令標籤(例如[[reply_to_*]]和[[audio_as_voice]])、純文字工具呼叫 XML 承載資料(包括<tool_call>...</tool_call>、<function_call>...</function_call>、<tool_calls>...</tool_calls>、<function_calls>...</function_calls>以及被截斷的工具呼叫區塊),以及外洩的 ASCII/全形模型控制權杖,並省略整個可見文字僅為精確靜默權杖NO_REPLY/no_reply的助理項目。- 在主動傳送期間以及最終歷史重新整理時,如果
chat.history短暫回傳較舊的快照,聊天檢視會保留本機樂觀使用者/助理訊息可見;一旦 Gateway 歷史追上,正式逐字稿就會取代那些本機訊息。 chat.inject會將助理註記附加到工作階段逐字稿,並廣播chat事件以進行僅限 UI 的更新(不執行代理、不傳送到頻道)。- 聊天標頭模型與思考選擇器會透過
sessions.patch立即修補作用中工作階段;它們是持久的工作階段覆寫,不是僅限單輪的傳送選項。 - 聊天模型選擇器會要求 Gateway 已設定的模型檢視。如果存在
agents.defaults.models,該允許清單會驅動選擇器。否則,選擇器會顯示明確的models.providers.*.models項目,以及具備可用驗證的供應商。完整目錄仍可透過偵錯用models.listRPC 搭配view: "all"取得。 - 當新的 Gateway 工作階段使用量報告顯示高上下文壓力時,聊天撰寫區會顯示上下文通知,並在建議的 Compaction 層級顯示一個壓縮按鈕,用來執行一般工作階段 Compaction 路徑。過期的權杖快照會被隱藏,直到 Gateway 再次回報新的使用量。
對話模式(瀏覽器即時)
對話模式(瀏覽器即時)
對話模式使用已註冊的即時語音供應商。使用
talk.provider: "openai" 加上 talk.providers.openai.apiKey 設定 OpenAI,或使用 talk.provider: "google" 加上 talk.providers.google.apiKey 設定 Google;語音通話即時供應商設定仍可重複用作後援。瀏覽器永遠不會收到標準供應商 API 金鑰。OpenAI 會收到用於 WebRTC 的暫時 Realtime 用戶端密鑰。Google Live 會收到一次性受限的 Live API 驗證權杖,用於瀏覽器 WebSocket 工作階段,指示和工具宣告會由 Gateway 鎖定到該權杖中。只公開後端即時橋接的供應商會透過 Gateway 中繼傳輸執行,因此憑證和廠商通訊端會保留在伺服器端,而瀏覽器音訊則透過已驗證的 Gateway RPC 傳送。Realtime 工作階段提示由 Gateway 組裝;talk.realtime.session 不接受呼叫端提供的指示覆寫。在聊天撰寫器中,對話控制項是麥克風聽寫按鈕旁的波形按鈕。對話開始時,撰寫器狀態列會顯示 Connecting Talk...,音訊連線後顯示 Talk live,或在即時工具呼叫透過 chat.send 諮詢已設定的較大型模型時顯示 Asking OpenClaw...。維護者即時冒煙測試:OPENAI_API_KEY=... GEMINI_API_KEY=... node --import tsx scripts/dev/realtime-talk-live-smoke.ts 會驗證 OpenAI 瀏覽器 WebRTC SDP 交換、Google Live 受限權杖瀏覽器 WebSocket 設定,以及使用假麥克風媒體的 Gateway 中繼瀏覽器配接器。此命令只列印供應商狀態,不會記錄密鑰。停止與中止
停止與中止
- 按一下 停止(呼叫
chat.abort)。 - 執行作用中時,一般後續訊息會排入佇列。按一下佇列訊息上的 引導,可將該後續訊息注入正在執行的輪次。
- 輸入
/stop(或獨立的中止片語,例如stop、stop action、stop run、stop openclaw、please stop)以帶外方式中止。 chat.abort支援{ sessionKey }(無runId)以中止該工作階段的所有作用中執行。
中止部分保留
中止部分保留
- 執行中止時,部分助理文字仍可顯示在 UI 中。
- 當存在已緩衝輸出時,Gateway 會將中止的部分助理文字保存到逐字稿歷史中。
- 已保存項目包含中止中繼資料,因此逐字稿消費者可區分中止部分與正常完成輸出。
PWA 安裝與 Web Push
Control UI 隨附manifest.webmanifest 和服務工作程式,因此現代瀏覽器可將其安裝為獨立 PWA。Web Push 可讓 Gateway 即使在分頁或瀏覽器視窗未開啟時,也能以通知喚醒已安裝的 PWA。
| 表面 | 功能 |
|---|---|
ui/public/manifest.webmanifest | PWA 資訊清單。瀏覽器在可存取後會提供「安裝應用程式」。 |
ui/public/sw.js | 處理 push 事件與通知點擊的服務工作程式。 |
push/vapid-keys.json(位於 OpenClaw 狀態目錄下) | 自動產生的 VAPID 金鑰組,用於簽署 Web Push 承載資料。 |
push/web-push-subscriptions.json | 已保存的瀏覽器訂閱端點。 |
OPENCLAW_VAPID_PUBLIC_KEYOPENCLAW_VAPID_PRIVATE_KEYOPENCLAW_VAPID_SUBJECT(預設為mailto:openclaw@localhost)
push.web.vapidPublicKey— 擷取作用中的 VAPID 公開金鑰。push.web.subscribe— 註冊endpoint加上keys.p256dh/keys.auth。push.web.unsubscribe— 移除已註冊的端點。push.web.test— 將測試通知傳送到呼叫端的訂閱。
Web Push 獨立於 iOS APNS 中繼路徑(請參閱 設定 了解中繼支援的推播)以及既有的
push.test 方法,後者以原生行動配對為目標。託管嵌入
助理訊息可以使用[embed ...] 短代碼行內呈現託管的網頁內容。iframe 沙箱政策由 gateway.controlUi.embedSandbox 控制:
- strict
- scripts(預設)
- trusted
停用託管嵌入內的指令碼執行。
http(s) 嵌入 URL 預設仍會被封鎖。如果你刻意希望 [embed url="https://..."] 載入第三方頁面,請設定 gateway.controlUi.allowExternalEmbedUrls: true。
Tailnet 存取(建議)
- 整合式 Tailscale Serve(偏好)
- 繫結到 tailnet + 權杖
將 Gateway 保持在 loopback,並讓 Tailscale Serve 以 HTTPS 代理它:開啟:
https://<magicdns>/(或你設定的gateway.controlUi.basePath)
gateway.auth.allowTailscale 為 true 時,Control UI/WebSocket Serve 要求可透過 Tailscale 身分標頭(tailscale-user-login)驗證。OpenClaw 會使用 tailscale whois 解析 x-forwarded-for 位址並與標頭比對來驗證身分,而且只在要求命中 loopback 並帶有 Tailscale 的 x-forwarded-* 標頭時接受這些身分。對於具備瀏覽器裝置身分的 Control UI 操作者工作階段,這個已驗證的 Serve 路徑也會略過裝置配對來回流程;無裝置瀏覽器和節點角色連線仍會遵循一般裝置檢查。如果你想即使對 Serve 流量也要求明確的共用密鑰憑證,請設定 gateway.auth.allowTailscale: false。然後使用 gateway.auth.mode: "token" 或 "password"。對於該非同步 Serve 身分路徑,相同用戶端 IP 與驗證範圍的驗證失敗嘗試會在寫入速率限制前序列化。因此,同一瀏覽器的並行錯誤重試可能會讓第二個要求顯示 retry later,而不是兩個純粹不相符的要求平行競速。不安全的 HTTP
如果你透過純 HTTP(http://<lan-ip> 或 http://<tailscale-ip>)開啟儀表板,瀏覽器會在非安全上下文中執行並封鎖 WebCrypto。預設情況下,OpenClaw 會封鎖沒有裝置身分的 Control UI 連線。
已記錄的例外:
- 使用
gateway.controlUi.allowInsecureAuth=true的僅限 localhost 不安全 HTTP 相容性 - 透過
gateway.auth.mode: "trusted-proxy"成功進行的操作者 Control UI 驗證 - 緊急例外
gateway.controlUi.dangerouslyDisableDeviceAuth=true
https://<magicdns>/(Serve)http://127.0.0.1:18789/(在 Gateway 主機上)
不安全驗證切換行為
不安全驗證切換行為
allowInsecureAuth 只是本機相容性切換:- 它允許 localhost Control UI 工作階段在非安全 HTTP 上下文中不需裝置身分即可繼續。
- 它不會繞過配對檢查。
- 它不會放寬遠端(非 localhost)裝置身分要求。
僅限緊急例外
僅限緊急例外
受信任代理注意事項
受信任代理注意事項
- 成功的受信任代理驗證可以允許沒有裝置身分的操作員控制 UI 工作階段進入。
- 這不會延伸到節點角色的控制 UI 工作階段。
- 同主機 loopback 反向代理仍然不符合受信任代理驗證;請參閱受信任代理驗證。
內容安全政策
控制 UI 隨附嚴格的img-src 政策:只允許同源資產、data: URL,以及本機產生的 blob: URL。瀏覽器會拒絕遠端 http(s) 和通訊協定相對圖片 URL,且不會發出網路擷取。
實務上這代表:
- 透過相對路徑提供的頭像與圖片(例如
/avatars/<id>)仍會顯示,包括 UI 會擷取並轉換成本機blob:URL 的已驗證頭像路由。 - 內嵌
data:image/...URL 仍會顯示(對通訊協定內承載很有用)。 - 控制 UI 建立的本機
blob:URL 仍會顯示。 - 由通道中繼資料輸出的遠端頭像 URL 會在控制 UI 的頭像輔助工具中被移除,並以內建標誌/徽章取代,因此遭入侵或惡意通道無法強制操作員瀏覽器擷取任意遠端圖片。
頭像路由驗證
設定 Gateway 驗證時,控制 UI 頭像端點需要與 API 其餘部分相同的 Gateway 權杖:GET /avatar/<agentId>只會向已驗證呼叫端傳回頭像圖片。GET /avatar/<agentId>?meta=1會在相同規則下傳回頭像中繼資料。- 對任一路由的未驗證請求都會被拒絕(與同層 assistant-media 路由一致)。這會防止頭像路由在其他方面受保護的主機上洩漏代理身分。
- 控制 UI 本身會在擷取頭像時將 Gateway 權杖作為 bearer 標頭轉送,並使用已驗證的 blob URL,讓圖片仍可在儀表板中顯示。
建置 UI
Gateway 會從dist/control-ui 提供靜態檔案。使用以下命令建置:
ws://127.0.0.1:18789)。
除錯/測試:開發伺服器 + 遠端 Gateway
控制 UI 是靜態檔案;WebSocket 目標可設定,並且可以不同於 HTTP 來源。當你想在本機使用 Vite 開發伺服器,但 Gateway 在其他地方執行時,這很方便。注意事項
注意事項
gatewayUrl會在載入後儲存在 localStorage,並從 URL 中移除。- 如果你透過
gatewayUrl傳入完整的ws://或wss://端點,請對gatewayUrl值進行 URL 編碼,讓瀏覽器能正確解析查詢字串。 - 只要可行,
token應透過 URL 片段(#token=...)傳入。片段不會傳送到伺服器,可避免請求記錄和 Referer 洩漏。舊版?token=查詢參數仍會為相容性匯入一次,但僅作為後備,並會在 bootstrap 後立即移除。 password只會保留在記憶體中。- 設定
gatewayUrl時,UI 不會退回使用設定或環境憑證。請明確提供token(或password)。缺少明確憑證會造成錯誤。 - 當 Gateway 位於 TLS 後方時(Tailscale Serve、HTTPS 代理等),請使用
wss://。 gatewayUrl只會在最上層視窗中被接受(不可嵌入),以防止 clickjacking。- 非 loopback 的控制 UI 部署必須明確設定
gateway.controlUi.allowedOrigins(完整來源)。這包含遠端開發設定。 - Gateway 啟動時,可能會從有效執行階段繫結與連接埠植入本機來源,例如
http://localhost:<port>和http://127.0.0.1:<port>,但遠端瀏覽器來源仍需要明確項目。 - 除了嚴格控管的本機測試外,請勿使用
gateway.controlUi.allowedOrigins: ["*"]。這表示允許任何瀏覽器來源,而不是「符合我正在使用的任何主機」。 gateway.controlUi.dangerouslyAllowHostHeaderOriginFallback=true會啟用 Host 標頭來源後備模式,但這是危險的安全模式。