跳轉到主要內容
狀態:macOS/iOS SwiftUI 聊天 UI 會直接與閘道 WebSocket 通訊。沒有嵌入式瀏覽器,也沒有本機靜態伺服器。

這是什麼

  • 閘道的原生聊天 UI。
  • 使用與其他通道相同的工作階段與路由規則。
  • 確定性路由:回覆一律回到 WebChat。
  • 歷史記錄一律從閘道擷取(不監看本機檔案)。如果無法連線到閘道,WebChat 會是唯讀狀態。

快速開始

  1. 啟動閘道。
  2. 開啟 WebChat UI(macOS/iOS 應用程式)或控制 UI 的聊天分頁。
  3. 確認已設定有效的閘道驗證路徑(預設為共享密鑰,即使在回環上也是如此)。

運作方式

  • UI 會連線到閘道 WebSocket,並使用 chat.historychat.sendchat.injectchat.message.get RPC 方法。
  • chat.history 會為了穩定性而設有界限:閘道可能會截斷長文字欄位、省略大型中繼資料,並以 [chat.history omitted: message too large] 取代過大的項目。API 用戶端可以傳送每個請求專用的 maxChars,以覆寫單次呼叫的預設限制。
  • 當可見的助理訊息在 chat.history 中遭截斷時,控制 UI 可以開啟側邊閱讀器,並透過 chat.message.get 按需擷取完整且已顯示正規化的項目,而不增加預設歷史記錄負載。chat.message.get 使用與 chat.history 相同的逐字稿分支和顯示規則,但會以 messageId 鎖定單一項目,並在無法再傳回完整內容時回傳誠實的不可用原因。
  • chat.history 會針對僅附加工作階段檔案遵循作用中的逐字稿分支,因此廢棄的重寫分支和已被取代的提示副本不會在 WebChat 中呈現。
  • 壓縮項目會呈現為「已壓縮的歷史記錄」分隔線,說明已壓縮的逐字稿會保留為檢查點,並提供開啟工作階段檢查點的操作(在權限允許時可分支或還原)。
  • 控制 UI 會記住 chat.history 傳回的後端閘道 sessionId,並在後續 chat.send 呼叫中包含它,因此重新連線和頁面重新整理會延續同一個已儲存的對話,除非使用者開始或重設工作階段。
  • chat.send 會接收冪等鍵(控制 UI 使用執行 ID);閘道會對重複使用相同鍵的重複請求去重,因此同一個工作階段/訊息/附件的重試或重複進行中提交,不會建立第二次執行。
  • 工作區啟動檔案和待處理的 BOOTSTRAP.md 指令會透過代理系統提示的 # Project Context 區段提供,而不是複製到 WebChat 使用者訊息中。如果啟動內容遭截斷,系統提示會改為取得簡短的「啟動內容通知」;詳細計數和設定旋鈕會保留在診斷介面上。
  • chat.history 的顯示正規化會移除:僅供執行階段使用的 OpenClaw 內容、傳入信封包裝、內嵌傳遞指令標籤(例如 [[reply_to_current]][[reply_to:<id>]][[audio_as_voice]])、純文字工具呼叫 XML 負載(<tool_call><function_call><tool_calls><function_calls>,包含遭截斷的區塊),以及外洩的 ASCII/全形模型控制權杖。整段可見文字僅為靜默權杖 NO_REPLY(不區分大小寫)的助理項目會被省略。
  • 標記為推理的回覆負載(isReasoning: true)會從 WebChat 助理內容、逐字稿重播文字和音訊內容區塊中排除,因此僅思考用途的負載不會浮現為可見的助理訊息或可播放音訊。
  • chat.inject 會直接將助理備註附加到逐字稿,並廣播到 UI(不執行代理)。
  • 已中止的執行可以讓部分助理輸出在 UI 中保持可見。當存在已緩衝輸出時,閘道會將該部分文字持久化到逐字稿歷史記錄中,並以中止中繼資料標記該項目。

逐字稿與傳遞模型

WebChat 有兩條不同的資料路徑:
  • 工作階段 JSONL 檔案是持久的模型/執行階段逐字稿。對於一般代理執行,嵌入式 OpenClaw 執行階段會透過其工作階段管理器持久化模型可見的 userassistanttoolResult 訊息。WebChat 不會將任意傳遞、狀態或輔助文字寫入該逐字稿。
  • 閘道 ReplyPayload 事件是即時傳遞投影:針對 WebChat/通道顯示、區塊串流、指令標籤、媒體嵌入、TTS/音訊旗標和 UI 備援行為進行正規化。它們本身不是標準工作階段記錄。
  • 需要透過 tools.message 取得可見回覆的測試工具,仍會使用 WebChat 作為目前執行的內部來源回覆接收端。來自該作用中 WebChat 執行且沒有目標的 message.send,會投影到同一個聊天並鏡像到工作階段逐字稿;WebChat 不會成為可重複使用的外送通道,也絕不會繼承 lastChannel
  • WebChat 只會在閘道擁有一般嵌入式代理回合之外顯示的訊息時,注入助理逐字稿項目:chat.inject、非代理命令回覆、已中止的部分輸出,以及 WebChat 管理的媒體逐字稿補充內容。
  • 如果即時助理文字在執行期間出現,但在重新載入歷史記錄後消失,請依序檢查:原始 JSONL 是否包含助理文字、chat.history 顯示投影是否移除了它,然後是控制 UI 的樂觀尾端合併是否以持久化快照取代了本機傳遞狀態。
一般代理執行的最終答案應該是持久的,因為嵌入式執行階段會寫入助理 message_end。任何將已傳遞最終負載鏡像到逐字稿的備援,都必須先避免重複寫入嵌入式執行階段已經寫入的助理回合。

控制 UI 代理工具面板

  • 控制 UI /agents 工具面板有一個由 tools.effective(sessionKey=...) 支援的「目前可用」檢視:這是由伺服器衍生、唯讀的目前工作階段工具清單投影,包含核心、外掛、通道擁有,以及已探索到的 MCP 伺服器工具。
  • 另一個設定編輯檢視(由 tools.catalog 支援)涵蓋設定檔、每個代理的覆寫,以及目錄語意。
  • 執行階段可用性以工作階段為範圍。在同一個代理上切換工作階段,可能會變更「目前可用」清單。如果已設定的 MCP 伺服器自上次探索以來尚未連線或變更,面板會顯示通知,而不是從讀取路徑靜默啟動 MCP 傳輸。
  • 設定編輯器不代表執行階段可用;有效存取仍遵循政策優先順序(allow/deny、每個代理和提供者/通道覆寫)。

遠端使用

  • 遠端模式會透過 SSH/Tailscale 隧穿閘道 WebSocket。
  • 你不需要執行獨立的 WebChat 伺服器。

設定參考(WebChat)

完整設定:設定 WebChat 沒有持久化設定區段。閘道使用內建的 chat.history 顯示限制;API 用戶端可以傳送每個請求專用的 maxChars,以針對單次呼叫覆寫限制。舊版 channels.webchatgateway.webchat 設定已退役;執行 openclaw doctor --fix 以移除它。 相關全域選項:
  • gateway.portgateway.bind:WebSocket 主機/連接埠。
  • gateway.auth.modegateway.auth.tokengateway.auth.password: 共享密鑰 WebSocket 驗證。
  • gateway.auth.allowTailscale:啟用時,瀏覽器控制 UI 聊天分頁可以使用 Tailscale Serve 身分標頭。
  • gateway.auth.mode: "trusted-proxy":適用於位於具身分感知能力的非回環代理來源後方之瀏覽器用戶端的反向代理驗證(請參閱受信任代理驗證)。
  • gateway.remote.urlgateway.remote.tokengateway.remote.password:遠端閘道目標。
  • session.*:工作階段儲存與主要金鑰預設值。

相關