Глава 6

Выбирайте топологию по месту принятия решения

Router, supervisor, handoff и code-driven graph отличаются не внешним рисунком, а владельцем control flow и способом сборки результата. Router делает один выбор: классифицирует input и отправляет его одному или нескольким независимым исполнителям. Supervisor держит цель, вызывает workers как tools, собирает outputs и решает, нужен ли следующий шаг. Handoff передаёт владение: активный specialist меняется и продолжает работу в своём узком контексте.

OpenAI Agents SDK выделяет два частых паттерна: в agents-as-tools manager сохраняет управление и комбинирует outputs, при handoff specialist становится активным агентом на следующей части взаимодействия. LangChain отдельно подчёркивает различие router и supervisor - router обычно одиночный dispatch step без длительного conversational state, supervisor поддерживает динамическую многошаговую координацию.

Ключевая развилка простая. Если решение известно заранее - пишите обычный граф в коде: модель выполняет содержательные узлы, но не выбирает очевидные ветвления, retry policy и gate. Если решение зависит от смысла результата - разрешите supervisor выбрать worker из короткого allowlist, но проверяйте route, budget и termination в control plane. И даже когда выбирает модель, routing остаётся проверяемой policy.

TypeScript
import type { AgentId, TaskKind, WorkItem } from "./types.js";

const ROUTES: Readonly<Record<TaskKind, AgentId>> = {
  plan: "planner",
  test: "tester",
  security: "security",
  docs: "docs",
  review: "reviewer"
};

export function routeTask(task: WorkItem): AgentId {
  return ROUTES[task.kind];
}

export function explainRoute(task: WorkItem): string {
  return `${task.kind} -> ${routeTask(task)} by deterministic policy`;
}
Swarm не является целью. Децентрализованная передача управления полезна, когда локальный specialist лучше знает следующий адресат. Если путь известен приложению, swarm только затрудняет трассировку и ограничение стоимости.

Топология выбрана. Разберём её варианты по одному - и первый принцип: известный порядок оставляйте в обычном коде.

Ссылки