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.