Handoff: управление путешествует
Ключевая идея Swarm — handoff (передача управления). В любой момент активен один агент. Он ведёт диалог, пока задача в его зоне. Как только всплывает то, что лучше сделает коллега, он передаёт эстафету — и теперь активен другой агент, унаследовав весь контекст разговора. Тот, в свою очередь, может передать дальше. Центра нет: решение «кто следующий» принимает сам текущий агент.
Живая аналогия — служба поддержки. Ты попал на оператора общего профиля. Вопрос про биллинг — он переводит тебя на биллинг-специалиста. Тому нужен техотдел — он переводит дальше. Ты всё время говоришь с одним человеком, но кто это — меняется по мере того, как выясняется суть. Никакого «супервайзера-диспетчера» над ними нет; каждый сам знает, кому передать.
Важно: handoff — это полная передача, а не «делегировал подзадачу и жду ответа» (как в Supervisor). Управление уходит целиком; предыдущий агент выбывает из разговора. Контекст (история) при этом сохраняется — новый агент видит всё, что было.
Swarm против Supervisor
Оба про «кто следующий», но принимают это решение по-разному — в этом суть децентрализации.
| Критерий | Supervisor | Swarm |
|---|---|---|
| Кто решает «кто следующий» | центральный координатор | сам активный агент |
| Топология | звезда (через центр) | сеть (peer-to-peer) |
| Возврат управления | воркер → назад в центр | эстафета уходит совсем |
| Точка отказа | центр (единая) | нет единого центра |
| Предсказуемость / контроль | выше (всё через центр) | ниже (решают многие) |
Supervisor — как компания с директором: всё решение о распределении в одной точке. Swarm — как команда равных: каждый сам решает, кому передать. Децентрализация убирает узкое место и точку отказа, но размывает контроль — нет одного места, где видно и решается всё. Это фундаментальный размен, а не «лучше/хуже».
Как реализуют handoff
Технически handoff чаще всего оформляют как особый инструмент: у агента есть «инструменты-передачи» (transfer_to_billing, transfer_to_tech), и когда модель их вызывает — рантайм переключает активного агента. То есть передача управления — это просто ещё один tool call, только его эффект — не действие в мире, а смена «говорящего».
# Каждый агент знает, КОМУ он может передать управление
def transfer_to_billing():
return billing_agent # вернуть агента = передать ему управление
def transfer_to_tech():
return tech_agent
triage = Agent(
name="triage",
instructions="Определи тему и передай профильному агенту.",
functions=[transfer_to_billing, transfer_to_tech], # доступные handoff'ы
)
billing = Agent(
name="billing",
instructions="Решай вопросы по счетам. Не по теме — верни в triage.",
functions=[transfer_to_triage, transfer_to_refunds],
)
# Рантайм: пока агент не вызвал handoff — он активен;
# вызвал transfer_to_X → активным становится X, контекст сохраняется
client.run(agent=triage, messages=[{"role": "user", "content": "Верните деньги"}])
Это модель OpenAI Swarm (экспериментальный фреймворк, давший имя паттерну; его продолжение — Agents SDK). Идея переносится и на другие инструменты: в LangGraph handoff выражают через Command(goto=..., graph=...) — узел-агент возвращает команду «перейти к другому агенту», что ровно и есть передача управления в графе. Паттерн один — реализация зависит от инструмента.
Не путай с Supervisor. При делегировании координатор даёт воркеру подзадачу и ждёт результат обратно — управление возвращается. При handoff управление уходит насовсем: новый агент продолжает разговор вместо прежнего. Разные модели: «поручил и жду» против «передал эстафету и вышел».
Сильные и слабые стороны
- нет узкого места и единой точки отказа
- гибкая, «естественная» маршрутизация
- каждый агент прост: знает лишь себя и соседей
- отлично для маршрутизации (поддержка, роутинг)
- труднее контролировать и предсказать поток
- риск «пинг-понга»: агенты гоняют управление по кругу
- нет общей картины — сложнее отлаживать
- легко «потеряться», если handoff'ы плохо описаны
Без общего надзора агенты могут перекидывать управление друг другу вечно: triage → billing → «это не ко мне» → triage → ... Лечится жёстким лимитом ходов (как recursion_limit), чёткими инструкциями «когда передавать, а когда решать самому» и понятными критериями зон ответственности. Децентрализация не отменяет предохранителей.
Когда брать Swarm
- Маршрутизация запросов: служба поддержки, роутинг обращений по отделам — канонический случай Swarm.
- Зоны ответственности чёткие, а порядок — нет: заранее не известно, к какому специалисту пойдёт разговор, но каждый знает свою область.
- Нужна отказоустойчивость без центра: нет единой точки, чей сбой всё роняет.
- Диалоговые системы: где «говорящий» естественно меняется по ходу беседы.
А не бери Swarm, если нужен строгий контроль и аудит всех решений (→ Supervisor: всё через центр) или порядок фиксирован (→ Pipeline). Swarm — про гибкую децентрализованную маршрутизацию, а не про жёсткие сценарии.
Типичные ошибки
Без потолка ходов агенты уйдут в handoff-пинг-понг. Ставь жёсткий лимит и критерии «когда решать самому».
Если непонятно, кто за что отвечает, агенты либо перекидывают запрос, либо берутся не за своё. Зоны должны быть чёткими и непересекающимися (привет специализации).
Для задач с аудитом и строгими правилами децентрализация опасна — нет одной точки контроля. Тогда Supervisor надёжнее.
Если при передаче не сохранить историю, новый агент начнёт «с чистого листа» и переспросит то, что уже сказано. Контекст должен путешествовать вместе с управлением.
Шпаргалка
ПАТТЕРН: децентрализованный handoff — активный агент САМ передаёт
управление другому по контексту. НЕТ центра. Активен всегда ОДИН.
топология «сеть» (peer-to-peer) · контекст путешествует с управлением
HANDOFF ≠ ДЕЛЕГИРОВАНИЕ:
handoff (Swarm) — управление уходит СОВСЕМ (эстафета)
делегирование (Sup.) — поручил и ЖДЁШЬ результат обратно
РЕАЛИЗАЦИЯ:
handoff = особый tool call (transfer_to_X → активен X)
OpenAI Swarm / Agents SDK · LangGraph: Command(goto=..., graph=...)
SWARM vs SUPERVISOR:
решает "кто следующий": Swarm — сам агент · Supervisor — центр
топология: сеть vs звезда · точка отказа: нет vs центр
контроль: ниже vs выше
✅ нет узкого места · гибкая маршрутизация · простые агенты · поддержка/роутинг
❌ труднее контроль · РИСК handoff-пинг-понга · нет общей картины · отладка
КОГДА: маршрутизация запросов · зоны чёткие, порядок нет · диалоги
НЕ НАДО: нужен строгий контроль → Supervisor · порядок фиксирован → Pipeline
ПРАВИЛА:
• ЛИМИТ передач (иначе пинг-понг) + критерии "решай сам"
• чёткие непересекающиеся зоны ответственности
• контекст сохраняется при handoff
Практическое задание
Собери децентрализованную маршрутизацию:
Задание: swarm поддержки
- Спроектируй 3–4 агента поддержки с чёткими зонами:
triage,billing,tech,refunds. Опиши, кто кому может передавать управление (handoff'ы). - Реализуй на любом инструменте: OpenAI Swarm/Agents SDK или LangGraph с
Command(goto=...). Handoff оформи как инструмент. - Прогони несколько запросов разной тематики и проследи путь управления: кто активен на каждом шаге, где происходит передача.
- Убедись, что контекст сохраняется: агент после handoff не переспрашивает уже сказанное.
- Намеренно опиши размытые зоны/сделай handoff'ы «туда-обратно» и словите пинг-понг. Затем добавь лимит передач и чёткие критерии — почини.
- Со звёздочкой: сравни свой Swarm с Supervisor-решением той же задачи. Где децентрализация выиграла (нет узкого места), а где проиграла (контроль/предсказуемость)?
Что дальше
Supervisor, Pipeline, Swarm — это способы распределить работу. Есть и паттерн, где несколько агентов работают над одним вопросом, но не согласованно, а споря — чтобы в столкновении аргументов родился лучший ответ. Это Debate — следующий урок.