logo
Desarrollo
Buscar
Arquitectura multinodo

Arquitectura multinodo

Descripción general

La arquitectura multinodo permite que varios dispositivos trabajen de forma coordinada, logrando una experiencia distribuida de "el dispositivo A conversa, el dispositivo B ejecuta". El Gateway actúa como el centro de coordinación central, gestionando el registro, el descubrimiento y el enrutamiento inteligente de todos los nodos.


Panorama general de la arquitectura

┌─────────┐ WebSocket ┌─────────────┐ WebSocket ┌──────────┐ │ Web │ ◄────────────► │ Gateway │ ◄────────────► │ Nodo APP A│ │(Browser) │ │ (Node.js) │ │ (macOS) │ └─────────┘ │ │ └──────────┘ │ - Registro de nodos │ │ - Enrutamiento inteligente │ ┌──────────┐ │ - Reenvío de mensajes │ ◄────────────► │ Nodo APP B│ │ - Verificación de permisos │ │(Windows) │ └─────────────┘ └──────────┘
                      
                      ┌─────────┐   WebSocket   ┌─────────────┐   WebSocket   ┌──────────┐
│ Web      │ ◄────────────► │   Gateway    │ ◄────────────► │ Nodo APP A│
│(Browser) │               │  (Node.js)   │               │ (macOS)  │
└─────────┘               │              │               └──────────┘
                          │  - Registro de nodos │
                          │  - Enrutamiento inteligente │               ┌──────────┐
                          │  - Reenvío de mensajes │ ◄────────────► │ Nodo APP B│
                          │  - Verificación de permisos │               │(Windows) │
                          └─────────────┘               └──────────┘

                    
Este bloque de código en una ventana flotante

Ubicación de la captura de pantalla


Tipos de nodo

Tipo Identificador Descripción Capacidad de ejecución
Human Navegador web Nodo de usuario del lado Web Sin Agent Engine
Agent APP de escritorio Nodo de ejecución completo de Agent Sí (Sidecar local)
Action Nodo de automatización Ejecución desatendida
Monitor Nodo de monitoreo Monitoreo de estado No

Información de registro de nodos

Cada nodo registra la siguiente información al conectarse al Gateway:

Campo Descripción
nodeId Identificador único del nodo
displayName Nombre para mostrar
platform Sistema operativo (macOS / Windows / Linux / Browser)
version / coreVersion / uiVersion Información de versión
deviceFamily / modelIdentifier Información del dispositivo
caps Matriz de cadenas de capacidades
tools Lista de descripciones de herramientas disponibles
commands Lista de comandos ejecutables
description Texto descriptivo de las capacidades del nodo
scope Rango de visibilidad (account / enterprise)

Rango de visibilidad de los nodos

Rango Regla de visibilidad Descripción
account Visible solo con el mismo userId Nodo personal, utilizable entre organizaciones
enterprise Visible para todos los miembros del mismo orgId Nodo empresarial, compartido dentro de la organización

Nodos de nivel account: el usuario inicia sesión en varios dispositivos y puede programar tareas entre cualquiera de ellos.

Nodos de nivel enterprise: recursos de ejecución compartidos dentro de la organización, que todos los miembros pueden usar a través del Gateway.


Enrutamiento inteligente del Gateway

Cuando un usuario del lado Web inicia una conversación, el Gateway utiliza una estrategia de degradación en tres niveles para seleccionar el nodo de ejecución más adecuado:

Primer nivel: enrutamiento semántico con LLM

Utiliza la API de OpenAI para analizar la intención del usuario y encontrar el mejor nodo:

Entrada Descripción
Mensaje del usuario Contenido de la conversación enviado por el usuario
Lista de nodos Nombre, descripción (máximo 500 caracteres) y lista de herramientas (máximo 15 elementos) de cada nodo

El LLM devuelve: {nodeId, confidence, reason}

Medidas de seguridad:

  • La descripción del nodo se trata como DATA y no se ejecuta como instrucción
  • Evita la inyección de prompts a través de la descripción del nodo

Nota: el enrutamiento LLM actual aún no tiene un modelo configurado, por lo que se degradará automáticamente al segundo nivel.

Segundo nivel: coincidencia de palabras clave con BM25

Realiza una coincidencia de palabras clave entre la consulta del usuario y la descripción del nodo basándose en el algoritmo BM25:

Parámetro Valor
k1 1.5
b 0.75
Soporte de chino Segmentación a nivel de caracteres (一-鿿)

Devuelve el nodo con la puntuación más alta, o null (sin coincidencias).

Tercer nivel: respaldo por conexión más reciente

Selecciona el nodo conectado más recientemente según la marca de tiempo connectedAtMs, garantizando que siempre haya un resultado de respaldo.


Ejecución remota

Flujo de conversación

1. El lado Web envía chat.send al Gateway 2. El Gateway ejecuta el enrutamiento inteligente y selecciona el nodo de destino 3. El Gateway reenvía el mensaje al nodo APP 4. El nodo APP inicia el Agent Loop para ejecutar la tarea 5. Los eventos de streaming durante la ejecución se devuelven mediante chat.event 6. El lado Web renderiza el proceso de ejecución en tiempo real
                      
                      1. El lado Web envía chat.send al Gateway
2. El Gateway ejecuta el enrutamiento inteligente y selecciona el nodo de destino
3. El Gateway reenvía el mensaje al nodo APP
4. El nodo APP inicia el Agent Loop para ejecutar la tarea
5. Los eventos de streaming durante la ejecución se devuelven mediante chat.event
6. El lado Web renderiza el proceso de ejecución en tiempo real

                    
Este bloque de código en una ventana flotante

Llamada remota a herramientas

1. El Agent principal especifica el nodo remoto mediante dispatch_multi_node_agent 2. El Gateway envía node.invoke.request al nodo de destino 3. El nodo remoto inicia un Agent Loop independiente 4. Al finalizar, devuelve el resultado mediante node.invoke.result
                      
                      1. El Agent principal especifica el nodo remoto mediante dispatch_multi_node_agent
2. El Gateway envía node.invoke.request al nodo de destino
3. El nodo remoto inicia un Agent Loop independiente
4. Al finalizar, devuelve el resultado mediante node.invoke.result

                    
Este bloque de código en una ventana flotante

Hoisting de adjuntos (actualización 2026-04) NEW

Al despachar entre nodos, si el mensaje contiene adjuntos base64 en línea (imágenes, documentos, etc.), el sistema los sube automáticamente al almacenamiento en la nube y los reemplaza por una referencia URL:

  • Motivo: evitar que un mensaje RPC del Gateway demasiado grande cause fallos de transmisión
  • Momento: se ejecuta automáticamente antes del despacho remoto, de forma imperceptible para el usuario
  • Normalización de rutas del SO: al despachar entre sistemas operativos (macOS/Windows/Linux), convierte automáticamente los separadores de ruta

Reglas de distribución de las ventanas emergentes de permisos

Durante la ejecución entre nodos, "en qué extremo se muestra" la ventana emergente de permisos de herramientas es una decisión de producto clave: es necesario equilibrar entre "que el usuario pueda responder a tiempo" y "evitar que se activen operaciones sensibles sin autorización".

Escenario de la misma cuenta (el llamador y el ejecutor son la misma cuenta)

Escenario Ubicación de la ventana emergente y acciones disponibles Estado
node-A APP → node-B APP (misma cuenta con sesión iniciada en ambos extremos) A través del Gateway se envía la información de la ventana emergente a node-A; node-A muestra la ventana emergente y puede pulsar "Permitir / Permitir siempre" ⚠️ La distribución entre extremos aún no está implementada
node-C Web → node-B APP (misma cuenta, Web llama a APP) La ventana emergente se muestra y se responde en el node-C Web ✅ Implementado
Mensaje del canal IM (el nodo de destino por defecto lo inicia la misma cuenta: DingTalk/Feishu/Telegram, etc.) Si el channel admite interacción con formularios/botones, la ventana emergente de permisos se convierte al estilo interactivo de ese channel (implementado mediante AskUserQuestion); si no lo admite, se rechaza por defecto (sin esperar 5 minutos) ✅ Implementado

Escenario de cuentas distintas (llamada entre cuentas a un enterprise node)

  • node-D es un nodo de tipo enterprise (puede ser descubierto por otros usuarios dentro de la misma organización), con la sesión actual de user001
  • node-E (con sesión de user002, ya sea en APP o Web) envía un mensaje a node-D a través del Gateway
  • Si node-D necesita permisos de herramientas durante la ejecución:
    • La ventana emergente se muestra únicamente en la interfaz local de node-D, no se distribuye entre extremos hacia node-E
    • Si nadie responde durante más de 5 minutos, se rechaza por defecto

Motivación del diseño

Regla Motivación
La misma cuenta en varios extremos permite autorización entre extremos El usuario puede gestionar la solicitud de autorización desde cualquier extremo, evitando que la tarea se bloquee porque un extremo no esté a su alcance
Enterprise entre cuentas no distribuye entre extremos Restringido estrictamente al equipo local del llamado, para evitar que cuentas externas activen operaciones sensibles mediante mensajes remotos (como lectura/escritura de archivos locales o ejecución de Bash)
Rechazo por defecto cuando el canal IM no admite interacción Cuando el extremo IM no puede presentar la ventana emergente, se evita que la solicitud quede colgada y bloquee el flujo del Agent
Tiempo de espera de 5 minutos entre cuentas Equilibra "el usuario podría haberse ausentado temporalmente" con "evitar que la tarea quede suspendida durante mucho tiempo"

Recordatorio de implementación: la ruta de distribución entre extremos de la misma cuenta node-A APP → node-B APP actualmente no existe. Los requisitos que involucren esta ruta necesitan añadir enrutamiento en el Gateway + lógica de recepción/visualización en el lado APP; no asuma que ya está disponible.


Aislamiento del Gateway entre cuentas NEW

Además de las reglas de ubicación de la ventana emergente de permisos, el acceso a los datos en sí también está aislado:

Aislamiento de la memoria personal

Cuando un nodo es llamado entre cuentas con el rango enterprise:

  • Memoria de nivel de cuenta (vinculada a userId): ❌ No accesible
  • Memoria de nivel empresarial (vinculada a orgId): ✅ Accesible
  • Memoria de nivel de sesión (esta sesión): ✅ Accesible

Mediante el indicador isRemoteSession se aplica un filtrado forzado en las consultas de memoria: el llamador entre cuentas no puede leer la memoria personal del propietario del nodo de destino mediante memory_query.

Por qué se diseña así

  • Protección de la privacidad: tus preferencias personales, hábitos de trabajo e información de la cuenta no pueden ser leídos por un compañero al llamar a tu nodo
  • Compartición empresarial: el conocimiento empresarial de la organización, como la pila tecnológica y las normas, sigue compartiéndose con normalidad, sin afectar la colaboración
  • Requisitos de cumplimiento: satisface las exigencias de "privilegio mínimo" de normativas de privacidad como el GDPR

Diferenciación de iconos de conversación

En la lista de sesiones, las conversaciones de distintas procedencias muestran iconos diferentes:

Icono Significado
Icono de ordenador (LocalComputerIcon) Iniciada o ejecutada por un nodo APP local
Icono de servidor (NodeIcon) Ejecutada por un nodo remoto
Icono de plataforma (Telegram/WeChat, etc.) Proveniente de un canal IM

Se determina en función de los campos isLocalInitiated, targetNodeId y sourceChannel.


Protocolo WebSocket

Handshake de conexión

1. Client → Gateway: connect.challenge 2. Gateway → Client: challenge (con nonce) 3. Client → Gateway: connect (con el JWT firmado) 4. Gateway → Client: hello-ok (confirmación de conexión)
                      
                      1. Client → Gateway: connect.challenge
2. Gateway → Client: challenge (con nonce)
3. Client → Gateway: connect (con el JWT firmado)
4. Gateway → Client: hello-ok (confirmación de conexión)

                    
Este bloque de código en una ventana flotante

Mantenimiento de la conexión (heartbeat)

  • Mecanismo tick: heartbeat periódico para mantener la conexión
  • Reconexión tras desconexión: reintento con retroceso exponencial
  • Limpieza de caducados: el Gateway limpia periódicamente las sesiones de nodos caducadas

Control de flujo

  • Throttling de Delta: los eventos de streaming SSE se agregan cada 150 ms, reduciendo el número de tramas WebSocket
  • Run TTL: tiempo de espera de 10 minutos, con limpieza de los Run caducados cada hora

Qué significa esto para el usuario

La arquitectura multinodo te permite iniciar tareas desde cualquier lugar y dejar que el dispositivo más adecuado las ejecute.

Escenarios típicos:

  • En una cafetería, iniciar desde el navegador del móvil (lado Web) una tarea que necesita acceder a archivos del ordenador de la oficina → el Gateway enruta automáticamente la tarea al nodo APP de la oficina para su ejecución
  • Un servidor de alto rendimiento del equipo (macOS Pro) siempre con la APP abierta y configurado como enterprise → todos los miembros del equipo pueden despachar el trabajo pesado desde su propio navegador

La experiencia que puedes percibir:

  • Al iniciar una conversación en el lado Web, el sistema selecciona automáticamente un nodo APP en línea para ejecutarla
  • La lista de sesiones muestra distintos iconos, para que sepas si la conversación se ejecuta localmente o de forma remota
  • Si no hay ningún nodo APP en línea, el lado Web indicará que no puede ejecutar tareas que requieren capacidades de Agent
  • Cuando varios ordenadores tienen la APP instalada, puedes seleccionar manualmente en qué ordenador ejecutar

Lo que debes tener en cuenta:

  • El lado Web no puede ejecutar tareas de Agent de forma independiente; necesita al menos un nodo APP en línea
  • Las conversaciones de ejecución remota tienen latencia de red (depende de la calidad de la red entre el Gateway y el nodo)
  • Al configurar un nodo con el rango enterprise, los miembros del equipo pueden despachar tareas a tu dispositivo, pero tu memoria personal no será accesible

Documentos relacionados