Handoff: управление путешествует

Ключевая идея Swarm — handoff (передача управления). В любой момент активен один агент. Он ведёт диалог, пока задача в его зоне. Как только всплывает то, что лучше сделает коллега, он передаёт эстафету — и теперь активен другой агент, унаследовав весь контекст разговора. Тот, в свою очередь, может передать дальше. Центра нет: решение «кто следующий» принимает сам текущий агент.

Живая аналогия — служба поддержки. Ты попал на оператора общего профиля. Вопрос про биллинг — он переводит тебя на биллинг-специалиста. Тому нужен техотдел — он переводит дальше. Ты всё время говоришь с одним человеком, но кто это — меняется по мере того, как выясняется суть. Никакого «супервайзера-диспетчера» над ними нет; каждый сам знает, кому передать.

100%
колёсико — масштаб  ·  зажать и тянуть — перемещение
запрос triage общий профиль billing счета tech техподдержка refunds возвраты handoff нет центра · активен ОДИН агент · он сам передаёт управление (handoff) по контексту

Важно: handoff — это полная передача, а не «делегировал подзадачу и жду ответа» (как в Supervisor). Управление уходит целиком; предыдущий агент выбывает из разговора. Контекст (история) при этом сохраняется — новый агент видит всё, что было.

Swarm против Supervisor

Оба про «кто следующий», но принимают это решение по-разному — в этом суть децентрализации.

Критерий Supervisor Swarm
Кто решает «кто следующий» центральный координатор сам активный агент
Топология звезда (через центр) сеть (peer-to-peer)
Возврат управления воркер → назад в центр эстафета уходит совсем
Точка отказа центр (единая) нет единого центра
Предсказуемость / контроль выше (всё через центр) ниже (решают многие)
ℹ️ Централизованно vs децентрализованно

Supervisor — как компания с директором: всё решение о распределении в одной точке. Swarm — как команда равных: каждый сам решает, кому передать. Децентрализация убирает узкое место и точку отказа, но размывает контроль — нет одного места, где видно и решается всё. Это фундаментальный размен, а не «лучше/хуже».

Как реализуют handoff

Технически handoff чаще всего оформляют как особый инструмент: у агента есть «инструменты-передачи» (transfer_to_billing, transfer_to_tech), и когда модель их вызывает — рантайм переключает активного агента. То есть передача управления — это просто ещё один tool call, только его эффект — не действие в мире, а смена «говорящего».

Swarm: handoff как инструмент (концептуально, OpenAI Swarm-стиль)
python
# Каждый агент знает, КОМУ он может передать управление
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=...) — узел-агент возвращает команду «перейти к другому агенту», что ровно и есть передача управления в графе. Паттерн один — реализация зависит от инструмента.

⚠️ Handoff ≠ делегирование

Не путай с Supervisor. При делегировании координатор даёт воркеру подзадачу и ждёт результат обратно — управление возвращается. При handoff управление уходит насовсем: новый агент продолжает разговор вместо прежнего. Разные модели: «поручил и жду» против «передал эстафету и вышел».

Сильные и слабые стороны

✅ Сильные стороны
  • нет узкого места и единой точки отказа
  • гибкая, «естественная» маршрутизация
  • каждый агент прост: знает лишь себя и соседей
  • отлично для маршрутизации (поддержка, роутинг)
❌ Слабые стороны
  • труднее контролировать и предсказать поток
  • риск «пинг-понга»: агенты гоняют управление по кругу
  • нет общей картины — сложнее отлаживать
  • легко «потеряться», если handoff'ы плохо описаны
❌ Главный риск — бесконечный handoff-пинг-понг

Без общего надзора агенты могут перекидывать управление друг другу вечно: triage → billing → «это не ко мне» → triage → ... Лечится жёстким лимитом ходов (как recursion_limit), чёткими инструкциями «когда передавать, а когда решать самому» и понятными критериями зон ответственности. Децентрализация не отменяет предохранителей.

Когда брать Swarm

  • Маршрутизация запросов: служба поддержки, роутинг обращений по отделам — канонический случай Swarm.
  • Зоны ответственности чёткие, а порядок — нет: заранее не известно, к какому специалисту пойдёт разговор, но каждый знает свою область.
  • Нужна отказоустойчивость без центра: нет единой точки, чей сбой всё роняет.
  • Диалоговые системы: где «говорящий» естественно меняется по ходу беседы.

А не бери Swarm, если нужен строгий контроль и аудит всех решений (→ Supervisor: всё через центр) или порядок фиксирован (→ Pipeline). Swarm — про гибкую децентрализованную маршрутизацию, а не про жёсткие сценарии.

Типичные ошибки

❌ Ошибка 1: нет лимита на передачи

Без потолка ходов агенты уйдут в handoff-пинг-понг. Ставь жёсткий лимит и критерии «когда решать самому».

❌ Ошибка 2: размытые зоны ответственности

Если непонятно, кто за что отвечает, агенты либо перекидывают запрос, либо берутся не за своё. Зоны должны быть чёткими и непересекающимися (привет специализации).

❌ Ошибка 3: Swarm там, где нужен контроль

Для задач с аудитом и строгими правилами децентрализация опасна — нет одной точки контроля. Тогда Supervisor надёжнее.

❌ Ошибка 4: потеря контекста при handoff

Если при передаче не сохранить историю, новый агент начнёт «с чистого листа» и переспросит то, что уже сказано. Контекст должен путешествовать вместе с управлением.

Шпаргалка

Swarm — всё в одном месте
text
ПАТТЕРН: децентрализованный 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 поддержки

  1. Спроектируй 3–4 агента поддержки с чёткими зонами: triage, billing, tech, refunds. Опиши, кто кому может передавать управление (handoff'ы).
  2. Реализуй на любом инструменте: OpenAI Swarm/Agents SDK или LangGraph с Command(goto=...). Handoff оформи как инструмент.
  3. Прогони несколько запросов разной тематики и проследи путь управления: кто активен на каждом шаге, где происходит передача.
  4. Убедись, что контекст сохраняется: агент после handoff не переспрашивает уже сказанное.
  5. Намеренно опиши размытые зоны/сделай handoff'ы «туда-обратно» и словите пинг-понг. Затем добавь лимит передач и чёткие критерии — почини.
  6. Со звёздочкой: сравни свой Swarm с Supervisor-решением той же задачи. Где децентрализация выиграла (нет узкого места), а где проиграла (контроль/предсказуемость)?

Что дальше

Supervisor, Pipeline, Swarm — это способы распределить работу. Есть и паттерн, где несколько агентов работают над одним вопросом, но не согласованно, а споря — чтобы в столкновении аргументов родился лучший ответ. Это Debate — следующий урок.