Gateway 服務運行手冊
最後更新: 2025-12-09這係什麼
- 擁有單一 Baileys/Telegram 連線與控制/事件平面的永遠在線 (always-on) 程序。
- 取代舊版
gateway指令。CLI 入口點:openclaw gateway。 - 持續運行直到被停止;發生致命錯誤時非零退出,以便 Supervisor 重啟它。
如何運行 (本機)
- 設定熱重載 (Hot reload) 監聽
~/.openclaw/openclaw.json(或OPENCLAW_CONFIG_PATH)。- 預設模式:
gateway.reload.mode="hybrid"(熱套用安全變更,關鍵變更則重啟)。 - 需要時透過 SIGUSR1 進行程序內重啟。
- 使用
gateway.reload.mode="off"停用。
- 預設模式:
- 將 WebSocket控制平面綁定至
127.0.0.1:<port>(預設 18789)。 - 同一個連接埠也服務 HTTP (Control UI, hooks, A2UI)。單埠多工。
- OpenAI Chat Completions (HTTP):
/v1/chat/completions. - OpenResponses (HTTP):
/v1/responses. - Tools Invoke (HTTP):
/tools/invoke.
- OpenAI Chat Completions (HTTP):
- 預設在
canvasHost.port(預設18793) 啟動 Canvas 檔案伺服器,從~/.openclaw/workspace/canvas服務http://<gateway-host>:18793/__openclaw__/canvas/。使用canvasHost.enabled=false或OPENCLAW_SKIP_CANVAS_HOST=1停用。 - 寫入日誌至 stdout;使用 launchd/systemd 保持存活並輪替日誌。
- 故障排除時傳遞
--verbose以將除錯日誌 (handshakes, req/res, events) 從日誌檔鏡像至 stdio。 --force使用lsof尋找選定連接埠上的聆聽者,發送 SIGTERM,記錄被殺死的程序,然後啟動 gateway (若缺少lsof則快速失敗)。- 若您在 Supervisor (launchd/systemd/mac app child-process mode) 下運行,停止/重啟通常發送 SIGTERM;較舊的組建可能會顯示為
pnpmELIFECYCLE退出碼 143 (SIGTERM),這是正常關閉,並非崩潰。 - SIGUSR1 在授權時觸發程序內重啟 (gateway tool/config apply/update,或啟用
commands.restart進行手動重啟)。 - 預設需要 Gateway 認證:設定
gateway.auth.token(或OPENCLAW_GATEWAY_TOKEN) 或gateway.auth.password。用戶端必須發送connect.params.auth.token/password,除非使用 Tailscale Serve 身分。 - 精靈現在預設會產生 Token,即使在 Loopback 上也是如此。
- 連接埠優先順序:
--port>OPENCLAW_GATEWAY_PORT>gateway.port> 預設18789。
遠端存取
- 首選 Tailscale/VPN;否則使用 SSH Tunnel:
- 用戶端隨後透過 Tunnel 連線至
ws://127.0.0.1:18789。 - 若設定了 Token,用戶端即使透過 Tunnel 也必須在
connect.params.auth.token中包含它。
多個 Gateway (同一主機)
通常不需要:一個 Gateway 可以服務多個訊息 Channel 與 Agent。僅在為了冗餘或嚴格隔離 (例如:救援機器人) 時使用多個 Gateway。 若您隔離狀態 + 設定並使用唯一連接埠,則支援此功能。完整指南: Multiple gateways。 服務名稱具備 Profile 感知能力:- macOS:
bot.molt.<profile>(舊版com.openclaw.*可能仍存在) - Linux:
openclaw-gateway-<profile>.service - Windows:
OpenClaw Gateway (<profile>)
OPENCLAW_SERVICE_MARKER=openclawOPENCLAW_SERVICE_KIND=gatewayOPENCLAW_SERVICE_VERSION=<version>
Dev Profile (--dev)
快速路徑: 運行完全隔離的開發實例 (config/state/workspace) 而不影響您的主要設定。
OPENCLAW_STATE_DIR=~/.openclaw-devOPENCLAW_CONFIG_PATH=~/.openclaw-dev/openclaw.jsonOPENCLAW_GATEWAY_PORT=19001(Gateway WS + HTTP)- 瀏覽器控制服務連接埠 =
19003(推導:gateway.port+2, 僅限 loopback) canvasHost.port=19005(推導:gateway.port+4)- 當您在
--dev下執行setup/onboard時,agents.defaults.workspace預設變為~/.openclaw/workspace-dev。
- Base port =
gateway.port(或OPENCLAW_GATEWAY_PORT/--port) - 瀏覽器控制服務連接埠 = base + 2 (僅限 loopback)
canvasHost.port = base + 4(或OPENCLAW_CANVAS_HOST_PORT/ config override)- 瀏覽器 Profile CDP 連接埠從
browser.controlPort + 9 .. + 108自動分配 (每個 Profile 持久化)。
- 唯一的
gateway.port - 唯一的
OPENCLAW_CONFIG_PATH - 唯一的
OPENCLAW_STATE_DIR - 唯一的
agents.defaults.workspace - 獨立的 WhatsApp 號碼 (若使用 WA)
協定 (操作者觀點)
- 完整文件: Gateway protocol 與 Bridge protocol (legacy)。
- 用戶端強制的第一個 Frame:
req {type:"req", id, method:"connect", params:{minProtocol,maxProtocol,client:{id,displayName?,version,platform,deviceFamily?,modelIdentifier?,mode,instanceId?}, caps, auth?, locale?, userAgent? } }。 - Gateway 回覆
res {type:"res", id, ok:true, payload:hello-ok }(或ok:false帶錯誤,然後關閉)。 - 握手後:
- 請求:
{type:"req", id, method, params}→{type:"res", id, ok, payload|error} - 事件:
{type:"event", event, payload, seq?, stateVersion?}
- 請求:
- 結構化 Presence 項目:
{host, ip, version, platform?, deviceFamily?, modelIdentifier?, mode, lastInputSeconds?, ts, reason?, tags?[], instanceId? }(對於 WS 用戶端,instanceId來自connect.client.instanceId)。 agent回應是兩階段的:首先resack{runId,status:"accepted"}, 然後是最終res{runId,status:"ok"|"error",summary}在執行結束後;串流輸出以event:"agent"到達。
方法 (初始集合)
health— 完整健康快照 (與openclaw health --json形狀相同)。status— 簡短摘要。system-presence— 目前 Presence 清單。system-event— 發布 Presence/系統註記 (結構化)。send— 透過活動 Channel 發送訊息。agent— 執行一次 Agent Turn (在同一個連線上串流事件回傳)。node.list— 列出已配對 + 目前連線的節點 (包含caps,deviceFamily,modelIdentifier,paired,connected, 與廣播的commands)。node.describe— 描述一個節點 (功能 + 支援的node.invoke指令;適用於已配對節點與目前連線的未配對節點)。node.invoke— 在節點上呼叫指令 (例如canvas.*,camera.*)。node.pair.*— 配對生命週期 (request,list,approve,reject,verify)。
client.instanceId 很重要。
事件
agent— 來自 Agent 執行的串流工具/輸出事件 (seq-tagged)。presence— Presence 更新 (deltas with stateVersion) 推送給所有連線的用戶端。tick— 定期 keepalive/no-op 以確認存活。shutdown— Gateway 正在退出;Payload 包含reason與選用的restartExpectedMs。用戶端應重新連線。
WebChat 整合
- WebChat 是一個原生 SwiftUI UI,直接與 Gateway WebSocket 對話以取得歷史記錄、發送、中止與事件。
- 遠端使用透過相同的 SSH/Tailscale tunnel;若設定了 Gateway Token,用戶端在
connect期間包含它。 - macOS App 透過單一 WS 連線 (共享連線);它從初始快照 Hydrate Presence 並監聽
presence事件以更新 UI。
類型與驗證
- 伺服器使用 AJV 針對從協定定義發出的 JSON Schema 驗證每個 Inbound Frame。
- 用戶端 (TS/Swift) 使用生成的類型 (TS 直接使用;Swift 透過 Repo 的產生器)。
- 協定定義是 Source of Truth;使用以下指令重新生成 Schema/Models:
pnpm protocol:genpnpm protocol:gen:swift
連線快照
hello-ok包含一個snapshot帶有presence,health,stateVersion, 與uptimeMs加上policy {maxPayload,maxBufferedBytes,tickIntervalMs},讓用戶端無需額外請求即可立即渲染。health/system-presence仍可用於手動重新整理,但在連線時並非必要。
錯誤碼 (res.error 形狀)
- 錯誤使用
{ code, message, details?, retryable?, retryAfterMs? }。 - 標準代碼:
NOT_LINKED— WhatsApp 未驗證。AGENT_TIMEOUT— Agent 未在設定的截止時間內回應。INVALID_REQUEST— Schema/Param 驗證失敗。UNAVAILABLE— Gateway 正在關閉或依賴項目無法使用。
Keepalive 行為
- 定期發送
tick事件 (或 WS ping/pong),讓用戶端知道 Gateway 活著,即使沒有流量發生。 - Send/agent 確認保持獨立的回應;不要為了 Sends 過載 Ticks。
重播 / Gaps
- 事件不會重播。用戶端偵測 Seq gaps 並應在繼續前重新整理 (
health+system-presence)。WebChat 與 macOS 用戶端現在會在 Gap 發生時自動重新整理。
Supervision (macOS 範例)
- 使用 launchd 保持服務存活:
- Program: path to
openclaw - Arguments:
gateway - KeepAlive: true
- StandardOut/Err: file paths or
syslog
- Program: path to
- 失敗時,launchd 重啟;致命錯誤設定應保持退出以便操作者注意。
- LaunchAgents 是 Per-user 的且需要登入的工作階段;對於 Headless 設定,使用自訂 LaunchDaemon (未隨附)。
openclaw gateway install寫入~/Library/LaunchAgents/bot.molt.gateway.plist(或bot.molt.<profile>.plist; 舊版com.openclaw.*會被清理)。openclaw doctor稽核 LaunchAgent 設定並可將其更新至目前預設值。
Gateway 服務管理 (CLI)
使用 Gateway CLI 進行 install/start/stop/restart/status:gateway status預設使用服務解析的連接埠/設定探測 Gateway RPC (使用--url覆蓋)。gateway status --deep新增系統層級掃描 (LaunchDaemons/system units)。gateway status --no-probe跳過 RPC 探測 (在網路中斷時有用)。gateway status --json對腳本穩定。gateway status分別報告 Supervisor runtime (launchd/systemd 運行中) 與 RPC reachability (WS connect + status RPC)。gateway status印出 Config path + Probe target 以避免 “localhost vs LAN bind” 混淆與 Profile 不相符。gateway status在服務看起來運行中但連接埠關閉時,包含最後的 Gateway 錯誤行。logs透過 RPC 追蹤 Gateway 檔案日誌 (無需手動tail/grep)。- 若偵測到其他類 Gateway 服務,CLI 會發出警告,除非它們是 OpenClaw Profile 服務。
大多數設定我們仍建議 每台機器一個 Gateway;使用隔離的 Profiles/Ports 進行冗餘或救援機器人。參閱 Multiple gateways。
- 清理:
openclaw gateway uninstall(目前服務) 與openclaw doctor(舊版遷移)。
- 清理:
gateway install在已安裝時為 No-op;使用openclaw gateway install --force重新安裝 (Profile/Env/Path 變更)。
- OpenClaw.app 可綑綁基於 Node 的 Gateway Relay 並安裝 Per-user LaunchAgent 標記為
bot.molt.gateway(或bot.molt.<profile>; 舊版com.openclaw.*標記仍可乾淨卸載)。 - 要乾淨停止,使用
openclaw gateway stop(或launchctl bootout gui/$UID/bot.molt.gateway)。 - 要重啟,使用
openclaw gateway restart(或launchctl kickstart -k gui/$UID/bot.molt.gateway)。launchctl僅在 LaunchAgent 安裝後有效;否則先使用openclaw gateway install。- 運行具名 Profile 時將標記替換為
bot.molt.<profile>。
Supervision (systemd user unit)
OpenClaw 在 Linux/WSL2 上預設安裝 systemd user service。我們建議單一使用者機器使用 User Services (較簡單的環境,Per-user Config)。對於多使用者或 Always-on 伺服器,使用 System Service (無需 Lingering,共享 Supervision)。openclaw gateway install 寫入 User Unit。openclaw doctor 稽核 Unit 並可將其更新以符合目前推薦預設值。
建立 ~/.config/systemd/user/openclaw-gateway[-<profile>].service:
/var/lib/systemd/linger)。
然後啟用服務:
/etc/systemd/system/openclaw-gateway[-<profile>].service (複製上面的 Unit,切換 WantedBy=multi-user.target,設定 User= + WorkingDirectory=),然後:
Windows (WSL2)
Windows 安裝應使用 WSL2 並遵循上述 Linux systemd 章節。操作檢查
- Liveness: 開啟 WS 並發送
req:connect→ 預期res帶有payload.type="hello-ok"(含 snapshot)。 - Readiness: 呼叫
health→ 預期ok: true與linkChannel中已連結的 Channel (若適用)。 - Debug: 訂閱
tick與presence事件;確保status顯示 Linked/Auth age;Presence 項目顯示 Gateway Host 與已連線用戶端。
安全性保證
- 預設假設每台主機一個 Gateway;若運行多個 Profile,隔離 Ports/State 並指向正確的實例。
- 無直接 Baileys 連線的回退 (Fallback);若 Gateway 當機,Sends 快速失敗。
- 非 Connect 的第一個 Frames 或格式錯誤的 JSON 會被拒絕並關閉 Socket。
- 優雅關閉: 在關閉前發送
shutdown事件;用戶端必須處理 Close + Reconnect。
CLI 輔助工具
openclaw gateway health|status— 透過 Gateway WS 請求 Health/Status。openclaw message send --target <num> --message "hi" [--media ...]— 透過 Gateway 發送 (WhatsApp 為冪等)。openclaw agent --message "hi" --to <num>— 執行一次 Agent Turn (預設等待最終結果)。openclaw gateway call <method> --params '{"k":"v"}'— 用於除錯的原始方法呼叫器。openclaw gateway stop|restart— 停止/重啟受監管的 Gateway 服務 (launchd/systemd)。- Gateway 輔助子指令假設
--url上有運行中的 Gateway;它們不再自動衍生 (Spawn) 一個。
遷移指引
- 淘汰使用
openclaw gateway與舊版 TCP 控制連接埠。 - 更新用戶端以使用強制 Connect 與結構化 Presence 的 WS 協定。