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
中文支持 字符级分词(\u4e00-\u9fff

返回得分最高的节点,或 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 范围时,团队成员可以将任务派发到你的设备上 —— 但你的个人记忆不会被访问到

相关文档