logo
開發者文件
搜尋
多節點架構

多節點架構

概述

多節點架構使多台裝置協同工作,實現**「A 裝置對話、B 裝置執行」**的分散式體驗。Gateway 作為中央調度樞紐,管理所有節點的註冊、發現和智慧路由。


架構總覽

┌─────────┐ WebSocket ┌─────────────┐ WebSocket ┌──────────┐ │ Web 端 │ ◄────────────► │ Gateway │ ◄────────────► │ APP 節點 A│ │(Browser) │ │ (Node.js) │ │ (macOS) │ └─────────┘ │ │ └──────────┘ │ - 節點註冊 │ │ - 智慧路由 │ ┌──────────┐ │ - 訊息轉發 │ ◄────────────► │ APP 節點 B│ │ - 權限驗證 │ │(Windows) │ └─────────────┘ └──────────┘
                      
                      ┌─────────┐   WebSocket   ┌─────────────┐   WebSocket   ┌──────────┐
│ Web 端   │ ◄────────────► │   Gateway    │ ◄────────────► │ APP 節點 A│
│(Browser) │               │  (Node.js)   │               │ (macOS)  │
└─────────┘               │              │               └──────────┘
                          │  - 節點註冊    │
                          │  - 智慧路由    │               ┌──────────┐
                          │  - 訊息轉發    │ ◄────────────► │ APP 節點 B│
                          │  - 權限驗證    │               │(Windows) │
                          └─────────────┘               └──────────┘

                    
此代碼塊在浮窗中顯示

截圖位置


節點類型

類型 標識 說明 執行能力
Human Web 瀏覽器 Web 端使用者節點 無 Agent Engine
Agent APP 桌面端 完整 Agent 執行節點 有(本機 Sidecar)
Action 自動化節點 無人值守執行
Monitor 監控節點 狀態監控

節點註冊資訊

每個節點連接 Gateway 時註冊以下資訊:

欄位 說明
nodeId 唯一節點標識
displayName 顯示名稱
platform 作業系統(macOS / Windows / Linux / Browser)
version / coreVersion / uiVersion 版本資訊
deviceFamily / modelIdentifier 裝置資訊
caps 能力字串陣列
tools 可用工具描述清單
commands 可執行命令清單
description 節點能力描述文字
scope 可見範圍(account / enterprise)

節點可見範圍

範圍 可見規則 說明
account 僅同 userId 可見 個人節點,跨組織可用
enterprise 同 orgId 所有成員可見 企業節點,組織內共享

account 級節點:使用者在多台裝置上登入,可以在任意裝置間調度任務。

enterprise 級節點:組織內的共享執行資源,所有成員都可以透過 Gateway 使用。


Gateway 智慧路由

當 Web 端使用者發起對話時,Gateway 使用三級降級策略選擇最合適的執行節點:

第一級:LLM 語意路由

使用 OpenAI API 分析使用者意圖,匹配最佳節點:

輸入 說明
使用者訊息 使用者傳送的對話內容
節點清單 每個節點的名稱、描述(最多 500 字元)、工具清單(最多 15 項)

LLM 回傳:{nodeId, confidence, reason}

安全措施

  • 節點描述作為 DATA 處理,不作為指令執行
  • 防止透過節點描述進行提示注入

注意:目前 LLM 路由尚未設定模型,會自動降級到第二級。

第二級:BM25 關鍵字匹配

基於 BM25 演算法對使用者查詢和節點描述進行關鍵字匹配:

參數
k1 1.5
b 0.75
中文支援 字元級分詞(一-鿿

回傳得分最高的節點,或 null(無匹配)。

第三級:最近連接兜底

connectedAtMs 時間戳選擇最近連接的節點,確保始終有兜底結果。


遠端執行

對話流程

1. Web 端傳送 chat.send 到 Gateway 2. Gateway 執行智慧路由,選擇目標節點 3. Gateway 轉發訊息到 APP 節點 4. APP 節點啟動 Agent Loop 執行任務 5. 執行過程中的串流事件透過 chat.event 回傳 6. Web 端即時渲染執行過程
                      
                      1. Web 端傳送 chat.send 到 Gateway
2. Gateway 執行智慧路由,選擇目標節點
3. Gateway 轉發訊息到 APP 節點
4. APP 節點啟動 Agent Loop 執行任務
5. 執行過程中的串流事件透過 chat.event 回傳
6. Web 端即時渲染執行過程

                    
此代碼塊在浮窗中顯示

遠端工具呼叫

1. 主 Agent 透過 dispatch_multi_node_agent 指定遠端節點 2. Gateway 傳送 node.invoke.request 到目標節點 3. 遠端節點啟動獨立 Agent Loop 4. 完成後透過 node.invoke.result 回傳結果
                      
                      1. 主 Agent 透過 dispatch_multi_node_agent 指定遠端節點
2. Gateway 傳送 node.invoke.request 到目標節點
3. 遠端節點啟動獨立 Agent Loop
4. 完成後透過 node.invoke.result 回傳結果

                    
此代碼塊在浮窗中顯示

附件 Hoisting(2026-04 更新)NEW

跨節點派發時,如果訊息包含內聯 base64 附件(圖片、文件等),系統會自動上傳到雲端儲存並改為 URL 引用:

  • 原因:避免 Gateway RPC 訊息過大導致傳輸失敗
  • 時機:遠端派發前自動執行,使用者無感知
  • OS 路徑歸一化:跨作業系統(macOS/Windows/Linux)派發時自動轉換路徑分隔符

權限彈窗分發規則

跨節點執行時,工具權限彈窗「在哪一端展示」是關鍵的產品決策 —— 需要在「使用者能及時回應」和「防止越權觸發敏感操作」之間取得平衡。

同帳號場景(呼叫方與執行方為同一帳號)

場景 彈窗位置與可用動作 狀態
node-A APP → node-B APP(同帳號兩端登入) 透過 Gateway 向 node-A 推送彈窗資訊,node-A 展示彈窗並可點「允許 / 總是允許」 ⚠️ 跨端分發尚未實現
node-C Web → node-B APP(同帳號 Web 呼叫 APP) 彈窗在 node-C Web 端展示並回應 ✅ 已實現
IM 通道訊息(預設目標 node 同帳號發起,釘釘/飛書/Telegram 等) 若 channel 支援表單/按鈕互動,權限彈窗轉成該 channel 的互動樣式(透過 AskUserQuestion 實現);不支援時預設拒絕(不等待 5 分鐘) ✅ 已實現

不同帳號場景(enterprise node 跨帳號呼叫)

  • node-D 是 enterprise 類型節點(同組織內可被其他使用者發現),目前登入 user001
  • node-E(登入 user002,APP 或 Web 端均可)透過 Gateway 向 node-D 傳送訊息
  • 若 node-D 執行中需要工具權限:
    • 彈窗僅在 node-D 本機介面顯示,不跨端分發到 node-E
    • 無人回應超過 5 分鐘預設拒絕

設計動機

規則 動機
同帳號多端可跨端授權 使用者在任一端均可處理授權請求,避免因某一端不在身邊而阻塞任務
跨帳號 enterprise 不跨端分發 嚴格限制在被呼叫方本機,防止外部帳號透過遠端訊息觸發敏感操作(如本機檔案讀寫、Bash 執行)
IM 通道不支援互動時預設拒絕 IM 端無法呈現彈窗時,避免請求懸掛阻塞 Agent 流程
跨帳號 5 分鐘逾時 平衡「使用者可能臨時離開」與「避免任務長期掛起」

實施提醒:node-A APP → node-B APP 的同帳號跨端分發鏈路目前不存在。涉及該路徑的需求需新增 Gateway 路由 + APP 端接收/展示邏輯,不要預設它已可用。


跨帳號 Gateway 隔離 NEW

除了權限彈窗的位置規則外,資料存取本身也有隔離:

個人記憶隔離

當節點以 enterprise 範圍被跨帳號呼叫時:

  • 帳戶級記憶(userId 綁定):❌ 不可存取
  • 企業級記憶(orgId 綁定):✅ 可存取
  • 會話級記憶(本次會話):✅ 可存取

透過 isRemoteSession 標誌在記憶查詢時強制過濾 —— 跨帳號呼叫者無法透過 memory_query 讀取目標節點所有者的個人記憶

為什麼這樣設計

  • 隱私保護:你的個人偏好、工作習慣、帳戶資訊不能被同事透過呼叫你的節點讀取
  • 企業共享:組織的技術棧、規範等企業知識仍正常共享,不影響協作
  • 合規需求:滿足 GDPR 等隱私法規對「最小權限」的要求

對話圖示區分

會話清單中不同來源的對話顯示不同圖示:

圖示 含義
電腦圖示(LocalComputerIcon) 本機 APP 節點發起或執行
伺服器圖示(NodeIcon) 遠端節點執行
平台圖示(Telegram/WeChat 等) 來自 IM 渠道

基於 isLocalInitiatedtargetNodeIdsourceChannel 欄位判斷。


WebSocket 協定

連接握手

1. Client → Gateway: connect.challenge 2. Gateway → Client: challenge(含 nonce) 3. Client → Gateway: connect(含簽名的 JWT) 4. Gateway → Client: hello-ok(確認連接)
                      
                      1. Client → Gateway: connect.challenge
2. Gateway → Client: challenge(含 nonce)
3. Client → Gateway: connect(含簽名的 JWT)
4. Gateway → Client: hello-ok(確認連接)

                    
此代碼塊在浮窗中顯示

心跳保活

  • tick 機制:定期心跳維持連接
  • 斷線重連:指數退避重試
  • 過期清理:Gateway 定期清理過期節點會話

流量控制

  • Delta 節流:SSE 串流事件 150ms 聚合,減少 WebSocket 幀數
  • Run TTL:10 分鐘逾時,每小時清理過期 Run

對使用者意味著什麼

多節點架構讓你可以在任何地方發起任務,讓最合適的裝置來執行。

典型場景:

  • 在咖啡廳用手機瀏覽器(Web 端)發起一個需要存取辦公室電腦檔案的任務 → Gateway 自動把任務路由到辦公室的 APP 節點執行
  • 團隊裡一台高效能伺服器(macOS Pro)始終開著 APP 設為 enterprise → 所有團隊成員都可以從自己的瀏覽器把重活派發過去

你能感受到的體驗

  • 在 Web 端發起對話時,系統自動選擇一個線上的 APP 節點來執行
  • 會話清單中會顯示不同的圖示,讓你知道對話是本機執行還是遠端執行
  • 如果沒有 APP 節點線上,Web 端會提示無法執行需要 Agent 能力的任務
  • 多台電腦都安裝了 APP 時,可以手動選擇在哪台電腦上執行

你需要注意的

  • Web 端無法獨立執行 Agent 任務,需要至少一個 APP 節點線上
  • 遠端執行的對話有網路延遲(取決於 Gateway 和節點間的網路品質)
  • 設定節點為 enterprise 範圍時,團隊成員可以將任務派發到你的裝置上 —— 但你的個人記憶不會被存取到

相關文件