Выбирайте топологию по месту принятия решения
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.
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 только затрудняет трассировку и ограничение стоимости.
Топология выбрана. Разберём её варианты по одному - и первый принцип: известный порядок оставляйте в обычном коде.