Содержание
- 1. Перед началом: действительно ли вам нужна мультиархитектура?
- 2. Базовая форма: паттерн supervisor
- 3. Построение за 5 шагов
- 4. Минимальный код ①: Claude Agent SDK
- 5. Минимальный код ②: OpenAI Agents SDK
- 6. Как делить роли: удачные и неудачные разбиения
- 7. Частые ошибки и способы их избежать
- Итоги
- FAQ
Когда вы уже усвоили концепцию «координации нескольких ИИ» из статьи Что такое мультиагентная система?, следующий вопрос — как её реально построить. В этой статье мы пройдём практический процесс из 5 шагов для начинающих, используя де-факто стандарт 2026 года: паттерн supervisor.
Прежде чем говорить о фреймворках, вот самый важный принцип: «сначала стройте на одном агенте и добавляйте агентов минимально — только когда упрётесь в предел». Начинать сразу с толпы агентов — как правило, переусложнение. Во второй половине статьи — минимальный читаемый код по официальной документации Claude Agent SDK и OpenAI Agents SDK, а также то, как делить роли, и ошибки, которые встречаются на практике. Та же логика работает, если вы подключаете инструменты через MCP.
Стройте мало, измеряйте, потом добавляйте
— Паттерн supervisor, начиная с минимальной конфигурации
Примечание: код написан по официальной документации Claude Agent SDK и OpenAI Agents SDK (проверено 4 октября 2026 года). Эти SDK быстро меняются, поэтому перед запуском сверяйте имена параметров с официальной документацией. Для каждой цифры в статье указан источник.
1. Перед началом: действительно ли вам нужна мультиархитектура?
Первый барьер — не технический, а вопрос оценки. Мультиагентность мощна, но помогает не в любой работе. Если ничего из перечисленного ниже не подходит, сначала стройте на одном агенте.
3 признака того, что пора переходить на мульти
- Разделение специализаций: знания не помещаются в один промпт (области охватывают исследования, юриспруденцию, код и т. д.)
- Параллелизм: выполнять несколько задач одновременно явно быстрее
- Разделение решений: качество растёт, когда вы разделяете «исполнителя» и «проверяющего»
Как говорилось в предыдущей статье, мультиагентность на линейном процессе обходится дорого. В исследовании Google Research (опубликовано в январе 2026 года, сравнивались 180 конфигураций) все проверенные мультиагентные варианты справились на 39–70% хуже одного агента с задачей на строго последовательное рассуждение (PlanCraft). Растут и расходы: в разборе собственного исследовательского агента Anthropic пишет, что агенты расходуют примерно в 4 раза больше токенов, чем чат, а мультиагентные системы — примерно в 15 раз. Отправная точка: больше агентов не значит умнее.
2. Базовая форма: паттерн supervisor
Если сомневаетесь, какой паттерн выбрать, безопаснее всего начать с паттерна supervisor. Основные SDK описывают его как базовый. В Claude Agent SDK главный агент вызывает субагентов через инструмент Agent; в OpenAI Agents SDK ему соответствует «agents as tools»: агент-менеджер вызывает агентов-специалистов как инструменты.
Один владелец итогового ответа
Supervisor сохраняет управление разговором и сводит результаты worker в один ответ. Документация OpenAI рекомендует эту форму, когда итоговый ответ должен принадлежать одному агенту.
Ошибки распространяются меньше
В том же исследовании Google Research агенты, работающие параллельно без общения, усиливали ошибки в 17,2 раза, а схемы с оркестратором — лишь в 4,4 раза.
Легко проверить
Кому что поручили и что вернулось — всё остаётся в истории supervisor. У каждого worker свой набор инструментов, поэтому и возможный ущерб ограничен.
Механика проста. Supervisor получает общую задачу, разбивает её на подзадачи, делегирует их специализированным worker и агрегирует результаты. Supervisor не обязан знать, как worker выполняет свою работу — только какого worker вызвать и в каком формате вывода. Экспертиза живёт в worker.
Учтите: в OpenAI Agents SDK handoff означает нечто более узкое, чем передача работы в шаге 4: агент-диспетчер передаёт сам разговор специалисту, и дальше тот отвечает пользователю напрямую. Supervisor при этом не остаётся, так что это отдельный паттерн (когда что выбирать — в разделе 6).
3. Построение за 5 шагов
Соберите минимальную конфигурацию supervisor за пять шагов. Правило большого пальца: начинайте с 2-3 worker, а затем добавляйте новых только тогда, когда это оправдано измерениями.
ШАГ 1. Разложите задачу
Выпишите «конечную цель» и нужные «специализированные роли». Пример: для отчёта по исследованию рынка — «1) собрать данные → 2) проанализировать → 3) написать → 4) проверить факты». Разложите всё чётко с самого начала — расплывчатость здесь обрушит всю конструкцию.
ШАГ 2. Определите worker (до 3-5)
Дайте каждому worker одну роль, нужные ему инструменты и формат вывода. Не жадничайте поначалу — максимум 3-5. Каждый worker независим и держит только собственные инструменты (поиск, выполнение кода и т. д.).
ШАГ 3. Спроектируйте supervisor
В промпте supervisor явно перечислите имена worker, которых он может вызывать (жёсткий лимит). Хитрость: тратьте больше времени на supervisor, чем на любой отдельный worker. Именно это определяет общее качество.
ШАГ 4. Определите handoff и обмен контекстом
Определите, что и в каком формате передаётся между worker. Передача полного контекста всем раздувает токены, поэтому передавайте только нужную информацию. Стандартный протокол для координации между агентами — A2A.
ШАГ 5. Измеряйте и работайте с лимитами
Инструментируйте каждый handoff, прежде чем добавлять агентов (наблюдаемость не опциональна). Установите лимиты на итерации, токены и стоимость. Одновременно настройте evals и ограждения (guardrails).
4. Минимальный код ①: Claude Agent SDK (Python)
Сначала соберём один supervisor и два worker (исследователя и проверяющего) на Claude Agent SDK от Anthropic. Подготовка — только pip install claude-agent-sdk и переменная окружения ANTHROPIC_API_KEY (официальный quickstart; файлы .env SDK автоматически не читает). Код следует официальной странице Subagents. Об SDK в целом — в нашем руководстве по Claude Agent SDK.
import asyncio
from claude_agent_sdk import query, ClaudeAgentOptions, AgentDefinition, ResultMessage
options = ClaudeAgentOptions(
model="claude-opus-5-5", # supervisor (главный агент)
system_prompt=(
"Ты координируешь исследовательский отчёт. Поиск поручай researcher, проверку "
"фактов — reviewer, итоговый текст пиши сам. Поручая задачу, всегда указывай "
"цель, формат ответа и границы."
),
allowed_tools=["Agent", "WebSearch", "WebFetch"], # инструменты, которые работают без запроса разрешения
agents={
"researcher": AgentDefinition(
description="Собирает первоисточники. Использовать, когда нужны факты или цифры.",
prompt="Найди первоисточники по вопросу и верни список с URL каждого источника. Не заполняй пробелы догадками.",
tools=["WebSearch", "WebFetch"], # единственные инструменты этой роли
model="sonnet",
maxTurns=15,
),
"reviewer": AgentDefinition(
description="Проверяет черновики. Использовать всегда перед финальной версией.",
prompt="Сверь каждое утверждение черновика с источником и перечисли фразы без подтверждения.",
tools=["WebFetch"],
model="sonnet",
maxTurns=10,
),
},
max_turns=30, # лимит циклов для всего запуска
max_budget_usd=5.0, # лимит расходов (оценка SDK)
env={"CLAUDE_CODE_MAX_SUBAGENT_SPAWN_DEPTH": "1"}, # worker не создают своих субагентов
)
async def main():
try:
async for message in query(
prompt="Найди три официальные статистики об использовании генеративного ИИ в работе и напиши короткий отчёт",
options=options,
):
if isinstance(message, ResultMessage):
print(message.subtype, message.total_cost_usd)
print(message.result)
except Exception as error:
print(f"Остановлено досрочно: {error}") # сюда же попадает достижение лимита
asyncio.run(main())
Пять моментов, на которые стоит обратить внимание:
- Worker перечисляются в
agentsкак записиAgentDefinition. Supervisor читаетdescriptionкаждого worker и решает, кого и когда вызвать, поэтому конкретно описывайте, что делает роль и когда её использовать. - Если перечислить
tools, у роли будут только эти инструменты. Поэтому у проверяющего нет инструментов записи. Аallowed_tools— это список инструментов, которые запускаются без запроса разрешения; он ничего не ограничивает (официальный справочник Python). - Ставьте лимиты в трёх местах.
maxTurnsдля каждой роли, общийmax_turnsи лимит расходовmax_budget_usd. При достижении общего лимита подтип результата становитсяerror_max_turnsилиerror_max_budget_usd, и запуск останавливается (документация по циклу агента). - Остановите вложенность. Субагенты могут порождать своих субагентов. Если задать переменной окружения
CLAUDE_CODE_MAX_SUBAGENT_SPAWN_DEPTHзначение1, worker будут выполнять работу сами.CLAUDE_CODE_MAX_CONCURRENT_SUBAGENTS(по умолчанию 20) ограничивает, сколько их работает одновременно. - Поля
AgentDefinitionпишутся в camelCase. Если написатьmax_turnsвместоmaxTurns, при создании возникнет TypeError (официальное примечание). Supervisor использует текущуюclaude-opus-5-5, а worker — псевдоним"sonnet", чтобы код продолжал работать при выходе новой версии.
Официальная документация отмечает, что Opus 5 охотнее предыдущих моделей поручает работу субагентам, и советует задавать лимиты глубины, параллельности и расходов в дополнение к инструкциям в промпте. Инструкция меняет лишь то, как Claude просит о помощи; надёжно останавливают запуск только лимиты.
5. Минимальный код ②: OpenAI Agents SDK (Python)
В Agents SDK от OpenAI та же форма строится так: агенты-специалисты превращаются в инструменты через as_tool() и передаются в tools supervisor (официальный раздел «agents as tools»). Подготовка — pip install openai-agents и переменная окружения OPENAI_API_KEY (официальный quickstart). Если не указать model, будет использована модель SDK по умолчанию; она меняется от версии к версии, поэтому сверяйтесь со страницей Models.
import asyncio
from agents import Agent, Runner, WebSearchTool
researcher = Agent(
name="Researcher",
instructions="Найди первоисточники по вопросу и верни список с URL каждого источника. Не заполняй пробелы догадками.",
tools=[WebSearchTool()],
)
reviewer = Agent(
name="Reviewer",
instructions="Сверь каждое утверждение полученного черновика с источником и перечисли фразы без подтверждения.",
)
manager = Agent(
name="Manager",
instructions=(
"Ты координируешь исследовательский отчёт. Поиск поручай research, проверку "
"фактов — review, итоговый текст пиши сам."
),
tools=[
researcher.as_tool(
tool_name="research",
tool_description="Собрать первоисточники со ссылками",
max_turns=10, # лимит циклов этой роли
),
reviewer.as_tool(
tool_name="review",
tool_description="Проверить факты в черновике",
),
],
)
async def main():
result = await Runner.run(
manager,
input="Найди три официальные статистики об использовании генеративного ИИ в работе и напиши короткий отчёт",
max_turns=10, # при превышении — MaxTurnsExceeded
)
print(result.final_output)
asyncio.run(main())
Что у двух SDK общего и чем они различаются:
- Worker не знает разговора родителя. Агент, вызванный через
as_tool(), не наследует автоматически состояние разговора родительского запуска (официальная документация). В Claude Agent SDK так же: от родителя субагент получает только промпт инструмента Agent. Пути к файлам, тексты ошибок и принятые решения пишите прямо в поручении. - Лимит —
Runner.run(..., max_turns=). При превышении выбрасываетсяMaxTurnsExceeded. Если передатьerror_handlers={"max_turns": ...}, вместо исключения можно вернуть заранее заданный ответ (Running agents). - С handoff код выглядел бы так:
Agent(..., handoffs=[billing_agent, refund_agent]). Принимающий агент берёт разговор на себя и по умолчанию видит всю предыдущую историю. Если какие-то данные ему передавать нельзя, сузьте их черезinput_filter.
6. Как делить роли: удачные и неудачные разбиения
Разделить роли сложнее, чем написать код. Anthropic пишет, что каждому субагенту нужны цель, формат вывода, указания, какие инструменты и источники использовать, и чёткие границы задачи (тот же разбор). Ниже — разбиения, которые выполняют эти четыре условия, и те, что не выполняют.
| Разбиение | Оценка | Почему |
|---|---|---|
| По специализации и инструментам (поиск, написание, проверка фактов) | Удачно | Каждая роль получает только нужные инструменты и права. Проверяющего можно сделать только для чтения. |
| По независимым объектам (изучить продукты трёх компаний, по одной на роль) | Удачно | Роли работают параллельно, не дожидаясь друг друга, а supervisor сравнивает результаты в конце. |
| Нарезать линейный конвейер на роли (резюме → форматирование → перевод) | Избегать | Каждый шаг просто ждёт предыдущий, параллельности нет, а при каждой передаче теряется контекст. Хватит одного агента. |
| Раздать один и тот же вопрос нескольким ролям без границ | Избегать | В ранней версии Anthropic при запросе о дефиците полупроводников один субагент изучал автомобильный чиповый кризис 2021 года, а двое других дублировали друг друга, исследуя цепочки поставок 2025 года. |
| Объединить исполнителя и проверяющего в одной роли | Избегать | Роль проверяет собственный результат, и смысл отдельной проверки пропадает. |
В том же разборе есть ориентир, сколько агентов запускать. Anthropic вписала правила масштабирования в промпт своего исследовательского supervisor: для простого поиска фактов — 1 агент и 3–10 вызовов инструментов, для прямого сравнения — 2–4 субагента по 10–15 вызовов, сложное исследование может задействовать больше 10 субагентов. Это цифры для исследовательской работы, поэтому в своей задаче начинайте с малого и добавляйте только после измерений.
Выбирать между supervisor и handoff помогает понятный критерий из документации OpenAI. Если итоговый ответ должен принадлежать одному агенту или нужно объединить результаты нескольких специалистов — supervisor (agents as tools). Если сама маршрутизация и есть работа, а выбранный специалист должен отвечать пользователю напрямую (например, распределение обращений в поддержку), — handoff. Их можно сочетать.
7. Частые ошибки и способы их избежать
Места, где спотыкаются, предсказуемы. Ниже — ошибки, которые, по словам Anthropic, реально случались с её исследовательским агентом, и то, о чём предупреждает официальная документация обоих SDK.
| Ошибка | Решение |
|---|---|
| Толпа worker на простой вопрос (ранняя версия Anthropic запускала 50 субагентов на простые запросы) | Впишите правила масштабирования в промпт supervisor и ограничьте параллельность и расходы. |
| Бесконечный поиск несуществующих источников (ещё одна ошибка ранней версии) | Обрывайте через maxTurns для роли и общий max_turns. |
| Worker дублируют работу друг друга | В каждом поручении указывайте цель, формат ответа и границы (в том числе что делать не нужно). |
| Worker отвечает мимо, потому что не знает контекста | Разговор родителя не передаётся. Впишите нужные факты в поручение. |
| Supervisor делает работу сам, вместо того чтобы делегировать | Сделайте каждое description конкретным или назовите worker по имени в промпте (официальный раздел устранения неполадок Claude Agent SDK). |
| Раздувание токенов (мультиагентная система расходует примерно в 15 раз больше, чем чат) | Передавайте только нужное, а не весь контекст. Для worker берите более дешёвые модели. |
| Падение точности на последовательных задачах (исследование показало ухудшение на 39–70%) | Если работа линейная, вернитесь к одному агенту. |
| Непонятно, где произошёл сбой | Логируйте каждый вызов. В Claude Agent SDK блоки tool_use с именем Agent и поле parent_tool_use_id показывают, какая роль создала сообщение. |
Общий урок: «промпты, проектирование инструментов и набор evals решают успех в большей степени, чем фреймворк». Документация OpenAI тоже называет вложения в хорошие промпты, мониторинг и доработку, специализированных агентов и evals. Важнее эффектной архитектуры — дисциплина строить мало, измерять и добавлять только тогда, когда это окупается; в итоге именно она оказывается самой быстрой.
Итоги
Построение мультиагентной системы не страшно, если начать с паттерна supervisor в минимальной конфигурации. Давайте подведём итог.
Ключевые выводы
- 🚦 Начинайте с одного. На последовательных задачах, по данным исследования, все мультиагентные схемы были на 39–70% хуже.
- 🧠 Базовая форма — supervisor. В Claude Agent SDK это субагенты, в OpenAI Agents SDK — agents as tools.
- 🔢 5 шагов: декомпозиция → определение worker → проектирование supervisor → передачи → измерения.
- 🧩 Разбиение: по специализации, инструментам или независимым объектам. Не нарезайте линейный конвейер.
- ⚠️ Лимиты в трёх местах (на роль, общий и на расходы). Давайте каждому worker цель, формат и границы.
«Стройте мало, измеряйте, потом добавляйте». Держите эту дисциплину — и мультиагентная система станет мощным партнёром для сложной работы. Про концепцию см. Что такое мультиагентная система?; про построение одиночного агента — Как построить ИИ-агента.
FAQ
В. Какой паттерн строить первым?
О. Паттерн supervisor, без вопросов. Его поддерживают основные фреймворки, его режим отказа известен, а референсных реализаций больше всего. Другие паттерны изучайте, когда освоитесь.
В. Со скольких worker начинать?
О. Начинайте с 2-3 и держите максимум 3-5. Чем больше вы добавляете, тем нестабильнее всё становится и тем сильнее раздуваются токены. Норма — добавлять новых только после того, как измерения докажут необходимость.
В. Нужен ли фреймворк (SDK)?
О. Нет. Документация OpenAI описывает и оркестрацию кодом: например, классифицировать задачу через структурированный вывод и по категории выбрать следующего агента или гонять в цикле агента-исполнителя и агента-оценщика — и отмечает, что так скорость, стоимость и результат предсказуемее. Это удобно для работы с фиксированным порядком шагов. Если не хочется самому писать хранение сессий, права инструментов и лимиты, SDK — короткий путь.
В. Как предотвратить взрывной рост стоимости?
О. Работают четыре вещи: ① лимит циклов — общий и для каждой роли, ② лимит расходов (max_budget_usd в Claude Agent SDK), ③ передавать только нужное вместо всего контекста, ④ дешёвые модели для worker. По данным Anthropic, мультиагентные системы расходовали примерно в 15 раз больше токенов, чем чат, поэтому ставьте лимиты с первого дня.