Skip to content
Эта страница создана и переведена с помощью ИИ. Если вы заметили неточности, помогите нам улучшить её. Редактировать на GitHub

Удалённые узлы

Инструмент nodes позволяет агентам PRX взаимодействовать с удалёнными экземплярами PRX в распределённом развёртывании. Узел -- это отдельный демон PRX, работающий на другой машине, возможно с иными аппаратными возможностями, сетевым доступом или конфигурацией инструментов, который был сопряжён с экземпляром-контроллером.

Через инструмент nodes агент может обнаруживать доступные узлы, проверять их состояние, маршрутизировать задачи к узлам со специализированными возможностями (напр., доступ к GPU) и получать результаты. Это обеспечивает распределение нагрузки, специализацию среды и географическое распределение задач агента.

Инструмент nodes зарегистрирован в реестре all_tools() и всегда доступен. Фактическая функциональность зависит от конфигурации узлов и наличия сопряжённых удалённых пиров.

Конфигурация

Режим контроллера

Контроллер -- это основной экземпляр PRX, оркестрирующий работу между узлами:

toml
[node]
mode = "controller"
node_id = "primary"
advertise_address = "192.168.1.100:3121"

[node.discovery]
method = "static"          # "static" | "mdns"
peers = [
  "192.168.1.101:3121",   # Хост с GPU
  "192.168.1.102:3121",   # Среда staging
]

Режим узла

Узел -- это экземпляр PRX, принимающий делегированную работу от контроллера:

toml
[node]
mode = "node"
node_id = "gpu-host-01"
advertise_address = "192.168.1.101:3121"
controller = "192.168.1.100:3121"

Методы обнаружения

МетодОписаниеПрименение
staticЯвный список адресов пиров в конфигурацииИзвестная стабильная инфраструктура
mdnsАвтоматическое обнаружение через multicast DNS в локальной сетиДинамические среды, разработка
toml
# Обнаружение через mDNS
[node.discovery]
method = "mdns"
service_name = "_prx._tcp.local."

Использование

Список доступных узлов

Обнаружение и список всех сопряжённых удалённых узлов с их статусом:

json
{
  "name": "nodes",
  "arguments": {
    "action": "list"
  }
}

Пример ответа:

Узлы:
  1. gpu-host-01 (192.168.1.101:3121) - ONLINE
     Возможности: gpu, cuda, python
     Нагрузка: 23%

  2. staging-01 (192.168.1.102:3121) - ONLINE
     Возможности: docker, network-access
     Нагрузка: 5%

Проверка состояния узла

Запрос состояния и возможностей конкретного узла:

json
{
  "name": "nodes",
  "arguments": {
    "action": "health",
    "node_id": "gpu-host-01"
  }
}

Отправка задачи на узел

Маршрутизация задачи к конкретному удалённому узлу для выполнения:

json
{
  "name": "nodes",
  "arguments": {
    "action": "send",
    "node_id": "gpu-host-01",
    "task": "Run the ML inference pipeline on the uploaded dataset."
  }
}

Получение результатов с узла

Получение результатов ранее отправленной задачи:

json
{
  "name": "nodes",
  "arguments": {
    "action": "result",
    "task_id": "task_xyz789"
  }
}

Параметры

ПараметрТипОбязательныйПо умолчаниюОписание
actionstringДа--Действие узла: "list", "health", "send", "result", "capabilities"
node_idstringУсловно--Идентификатор целевого узла (обязателен для "health", "send")
taskstringУсловно--Описание задачи (обязательно для "send")
task_idstringУсловно--Идентификатор задачи (обязателен для "result")

Возвращает:

ПолеТипОписание
successbooltrue если операция завершена
outputstringРезультат операции (список узлов, статус здоровья, результат задачи и т.д.)
errorstring?Сообщение об ошибке при неудачной операции (узел недоступен, задача не найдена и т.д.)

Архитектура

Система узлов PRX использует топологию контроллер-узел:

┌──────────────────┐         ┌──────────────────┐
│   Контроллер     │         │   Узел A         │
│   (основной PRX) │◄──────► │   (gpu-host-01)  │
│                  │  mTLS   │   GPU, CUDA      │
│   Цикл агента   │         │   Локальные      │
│   ├── инстр.    │         │   инструменты    │
│   │   nodes     │         └──────────────────┘
│   └── делегир.  │
│                  │         ┌──────────────────┐
│                  │◄──────► │   Узел B         │
│                  │  mTLS   │   (staging-01)   │
│                  │         │   Docker, Net    │
└──────────────────┘         └──────────────────┘

Протокол коммуникации

Узлы взаимодействуют с помощью пользовательского протокола через TCP с взаимной аутентификацией TLS (mTLS):

  1. Сопряжение: Узел сопрягается с контроллером через рукопожатие "запрос-ответ" (см. Сопряжение узлов)
  2. Heartbeat: Сопряжённые узлы отправляют периодические heartbeat для отчёта о состоянии и возможностях
  3. Диспетчеризация задач: Контроллер отправляет задачи узлам с сериализованным контекстом
  4. Возврат результатов: Узлы возвращают результаты задач со структурированным выводом

Объявление возможностей

Каждый узел объявляет свои возможности, которые контроллер использует для интеллектуальной маршрутизации задач:

  • Оборудование: gpu, cuda, tpu, high-memory
  • Программное обеспечение: docker, python, rust, nodejs
  • Сеть: network-access, vpn-connected, internal-network
  • Инструменты: Список доступных инструментов PRX на узле

Типичные паттерны

Задачи с GPU-ускорением

Маршрутизация ML и вычислительно-интенсивных задач к узлам с GPU:

Агент: Пользователь хочет запустить классификацию изображений.
  1. [nodes] action="list" → находит gpu-host-01 с CUDA
  2. [nodes] action="send", node_id="gpu-host-01", task="Run image classification on /data/images/"
  3. [ожидание завершения]
  4. [nodes] action="result", task_id="task_abc123"

Изоляция сред

Использование узлов для задач, требующих специфических сред:

Агент: Нужно протестировать скрипт развёртывания в среде staging.
  1. [nodes] action="send", node_id="staging-01", task="Run deploy.sh and verify all services start"
  2. [nodes] action="result", task_id="task_def456"

Распределение нагрузки

Распределение работы по нескольким узлам для параллельного выполнения:

Агент: Обработать 3 набора данных одновременно.
  1. [nodes] action="send", node_id="node-a", task="Process dataset-1.csv"
  2. [nodes] action="send", node_id="node-b", task="Process dataset-2.csv"
  3. [nodes] action="send", node_id="node-c", task="Process dataset-3.csv"
  4. [сбор результатов со всех трёх]

Безопасность

Взаимная TLS-аутентификация

Вся коммуникация между узлами использует mTLS. Как контроллер, так и узел должны предъявить действительные сертификаты во время TLS-рукопожатия. Сертификаты обмениваются в процессе сопряжения.

Требование сопряжения

Узлы должны завершить рукопожатие сопряжения перед обменом задачами. Несопряжённые узлы отклоняются на уровне соединения. См. Сопряжение узлов для описания протокола сопряжения.

Изоляция задач

Задачи, отправленные на удалённые узлы, выполняются в рамках политики безопасности узла. Конфигурация песочницы, ограничения инструментов и лимиты ресурсов узла применяются независимо от настроек контроллера.

Сетевая безопасность

  • Порты коммуникации узлов должны быть защищены файрволом с разрешением только известных адресов контроллера/узлов
  • Обнаружение через mDNS ограничено локальным сегментом сети
  • Для продакшен-развёртываний рекомендуются статические списки пиров

Политика безопасности

Инструмент nodes управляется политикой безопасности:

toml
[security.tool_policy.tools]
nodes = "supervised"       # Требовать одобрение перед отправкой задач на удалённые узлы

Связанные разделы

Released under the Apache-2.0 License.