Суть урока
Один агент — один музыкант. Он может сыграть мелодию. Но симфонию — нет.
Мультиагентная оркестрация — это когда у тебя есть дирижёр и оркестр. Дирижёр (orchestrator) не играет сам — он управляет скрипачами, виолончелистами, ударниками (специализированными агентами). Каждый играет своё. Вместе — музыка которую один не сыграет никогда.
LangGraph, CrewAI, Mastra и Claude Code native — это разные концепции того как строить этот оркестр. У каждого своя философия, свои сильные стороны, своя цена вхождения.
В этом уроке разберём их честно и поймём главное: когда вам хватит встроенных инструментов Claude Code, а когда нужно тянуть отдельный фреймворк.
🎯 Decision tree: subagents vs framework
Главный вопрос урока — не "какой фреймворк лучше", а "хватит ли тебе встроенных Claude Code subagents, или ты упёрся в стену и нужен внешний инструмент".
Используй Claude Code native subagents если:
- ✓ Python/TS не требуется как runtime (Markdown + Agent tool достаточно)
- ✓ Workflow линейный или с простыми ветками
- ✓ Команда уже на Claude Code
- ✓ State machine 5+ состояний не нужен
- ✓ Меньше 5 агентов в команде
Тяни внешний фреймворк (LangGraph / CrewAI / Mastra) если:
- ✓ Нужны циклы с возвратом state ("попробуй → исправь → попробуй снова")
- ✓ 5+ состояний и conditional edges
- ✓ Human-in-the-loop — обязательная часть флоу, не опция
- ✓ Команда уже знает Python (LangGraph / CrewAI) или TS (Mastra)
- ✓ 10+ агентов с complex orchestration
По умолчанию — Claude Code subagents. Фреймворк = когда явно упёрся.
Ключевые концепции
- Orchestrator — главный агент который декомпозирует задачу и распределяет подзадачи между специализированными агентами
- Subagent / Worker — агент с узкой специализацией: только поиск, только генерация кода, только QA, только перевод
- Graph-based orchestration (LangGraph) — агентный граф где ноды = агенты, рёбра = переходы, включая циклы и conditional branching
- Role-based crews (CrewAI) — команды агентов с человекопонятными ролями: researcher, writer, editor — как настоящий отдел
- State machine — конечный автомат который управляет в каком состоянии находится агент и куда перейти следующим
- Human-in-the-loop — встроенная точка паузы где система ждёт подтверждения человека перед критическим действием
- Context isolation — каждый subagent работает в своём контексте, не засоряя общий. Orchestrator получает только результат
- Parallel execution — несколько агентов работают одновременно над разными частями задачи
Теория
Зачем вообще несколько агентов
Один агент с длинным контекстом теоретически может сделать всё. На практике — деградирует.
Проблема называется "context rot": когда контекст сильно разрастается, качество рассуждений LLM ухудшается. Агент начинает "забывать" инструкции из начала, повторяться, терять логику.
Мультиагентная архитектура решает это через изоляцию контекстов:
- Orchestrator держит только высокоуровневый план и статус задач
- Каждый subagent работает в чистом контексте со своей конкретной задачей
- Orchestrator получает сжатый результат, не всю переписку subagent'а
Второй плюс — параллелизм. Один агент делает задачи последовательно. Пять агентов могут работать параллельно. Исследование, на которое у одного агента уходит много времени, пять агентов могут сделать заметно быстрее.
LangGraph — граф-машина для сложных состояний
LangGraph от LangChain — это фреймворк для построения агентов как ориентированных графов (DAG и циклических).
Ключевая концепция: агентный поток — это граф. Ноды — это агенты или функции. Рёбра — переходы между ними. Рёбра могут быть условными: "если result содержит ошибку → перейди в error_handler, иначе → в finalizer".
Главное что отличает LangGraph от простых цепочек — поддержка циклов. Агент может вернуться к предыдущему шагу. Это критично для паттернов вроде "попробуй → если не получилось → исправь → попробуй снова".
Состояние (State) — центральный объект который передаётся между нодами и мутируется. Каждый агент читает нужные поля state и записывает свои результаты.
# Пример минимального LangGraph агента (Python)
from typing import TypedDict
from langgraph.graph import StateGraph, END
# Определяем state
class ResearchState(TypedDict):
query: str
sources: list[str]
draft: str
final: str
iteration: int
# Ноды — это функции или агенты
def researcher(state: ResearchState) -> ResearchState:
# здесь агент ищет информацию
return {"sources": ["source1", "source2"], "iteration": state["iteration"] + 1}
def writer(state: ResearchState) -> ResearchState:
# здесь агент пишет черновик
return {"draft": "Draft based on sources..."}
def should_revise(state: ResearchState) -> str:
# Conditional edge: идти к ревизии или завершить
if state["iteration"] < 3 and len(state["draft"]) < 500:
return "revise"
return "finalize"
# Строим граф
graph = StateGraph(ResearchState)
graph.add_node("researcher", researcher)
graph.add_node("writer", writer)
graph.set_entry_point("researcher")
graph.add_edge("researcher", "writer")
graph.add_conditional_edges("writer", should_revise, {
"revise": "researcher", # цикл назад!
"finalize": END
})
app = graph.compile()
result = app.invoke({"query": "AI trends", "iteration": 0})Human-in-the-loop в LangGraph — это встроенная возможность приостановить граф (через interrupt_before у ноды или вызов interrupt() внутри неё), дождаться вашего ввода и продолжить. Для этого нужен checkpointer, который сохраняет состояние. Детали: документация LangGraph.
Когда выбирать LangGraph:
- Нужны циклы с возвратом (попробовать → исправить → попробовать снова)
- Сложные conditional branching (разные ветки для разных типов входных данных)
- State machine с 5+ состояниями
- Human-in-the-loop как обязательная часть флоу
- Проект на Python, команда знает LangChain
Когда не нужен: для линейного pipeline без ветвлений LangGraph — overengineering. Простая цепочка агентов без циклов работает через обычные вызовы.
CrewAI — команды с ролями, как настоящий отдел
CrewAI думает о мультиагентах через метафору команды (crew). Не граф, не граф с состояниями — а люди с ролями которые выполняют задачи.
Три основных концепта:
- Agent — роль + backstory + LLM + инструменты
- Task — конкретная задача с описанием, expected output, assigned_agent
- Crew — команда агентов + список задач + process (sequential или hierarchical)
CrewAI особенно хорош для параллельных исследовательских команд — когда нужно несколько независимых экспертов которые работают над одной темой с разных углов.
# Пример: исследовательская команда CrewAI
from crewai import Agent, Task, Crew, Process
from crewai_tools import SerperDevTool, WebsiteSearchTool
search_tool = SerperDevTool()
web_tool = WebsiteSearchTool()
# Агент 1: исследователь рынка
market_researcher = Agent(
role="Market Research Analyst",
goal="Найти и проанализировать последние данные о рынке AI-инструментов для разработчиков",
backstory="""Ты опытный аналитик рынка с 10-летним стажем.
Специализируешься на технологических рынках.
Всегда подкрепляешь выводы конкретными данными и цифрами.""",
verbose=True,
allow_delegation=False,
tools=[search_tool, web_tool],
llm="anthropic/claude-sonnet-5-5" # CrewAI поддерживает Claude, модель задаётся как «провайдер/модель»; актуальные модели: страница «Актуальное сейчас»
)
# Агент 2: технический эксперт
tech_expert = Agent(
role="Technical Expert",
goal="Оценить технические возможности и ограничения AI-инструментов",
backstory="""Ты senior инженер с глубокой экспертизой в AI/ML.
Умеешь объяснять сложные технические концепты простым языком.
Скептически относишься к маркетинговым заявлениям, смотришь на реальные benchmarks.""",
verbose=True,
allow_delegation=False,
tools=[web_tool],
llm="anthropic/claude-sonnet-5-5"
)
# Агент 3: финансовый аналитик
financial_analyst = Agent(
role="Financial Analyst",
goal="Оценить ROI и бизнес-потенциал AI-инструментов",
backstory="""Ты финансовый аналитик специализирующийся на tech-стартапах.
Умеешь строить unit economics и оценивать рыночный потенциал.
Всегда смотришь на pricing model и маржинальность.""",
verbose=True,
allow_delegation=False,
tools=[search_tool],
llm="anthropic/claude-haiku-4-5" # Задача проще — используем более дешёвую модель
)
# Агент 4: писатель-синтезатор
report_writer = Agent(
role="Strategic Report Writer",
goal="Синтезировать исследования в чёткий actionable отчёт",
backstory="""Ты опытный технический писатель и стратегический консультант.
Умеешь превращать сложные аналитические данные в чёткие рекомендации.
Пишешь для аудитории: tech-founders и CTOs.""",
verbose=True,
allow_delegation=False,
tools=[],
llm="anthropic/claude-sonnet-5-5"
)
# Задачи
market_task = Task(
description="""Исследуй рынок AI-инструментов для разработчиков в 2026 году.
Найди: топ-5 игроков, объём рынка, темп роста, ключевые тренды.
Используй актуальные данные, не старше 6 месяцев.""",
expected_output="Структурированный анализ рынка: размер, игроки, тренды, цифры",
agent=market_researcher,
async_execution=True # Параллельно с другими задачами!
)
tech_task = Task(
description="""Проведи технический анализ топ-3 AI coding assistants (Claude Code, Cursor, GitHub Copilot).
Сравни: поддерживаемые языки, контекстное окно, интеграции, latency, точность.""",
expected_output="Сравнительная таблица с техническими характеристиками и benchmarks",
agent=tech_expert,
async_execution=True # Параллельно!
)
financial_task = Task(
description="""Проанализируй ценообразование и ROI для AI coding assistants.
Рассчитай: стоимость на разработчика/мес, экономия времени, payback period.
Сравни pricing models: subscription vs usage-based.""",
expected_output="Финансовая модель с ROI расчётом и сравнением pricing",
agent=financial_analyst,
async_execution=True # Параллельно!
)
synthesis_task = Task(
description="""Синтезируй все три исследования в итоговый стратегический отчёт.
Структура: Executive Summary (1 стр), Market Overview, Tech Comparison, Financial Analysis, Recommendations.
Целевая аудитория: tech-founder принимающий решение о внедрении AI-инструментов.""",
expected_output="Полный стратегический отчёт 5-7 страниц готовый к презентации",
agent=report_writer,
context=[market_task, tech_task, financial_task] # Зависит от предыдущих
)
# Собираем команду
crew = Crew(
agents=[market_researcher, tech_expert, financial_analyst, report_writer],
tasks=[market_task, tech_task, financial_task, synthesis_task],
process=Process.sequential, # или Process.hierarchical с manager агентом
verbose=True,
memory=True, # Агенты помнят предыдущие взаимодействия
max_rpm=10 # Rate limiting для API calls
)
# Запускаем
result = crew.kickoff()
print(result.raw)Установка:
pip install crewai crewai-toolsКогда выбирать CrewAI:
- Нужна параллельная работа нескольких независимых экспертов
- Задача хорошо декомпозируется по ролям ("исследователь + технарь + финансист → синтезатор")
- Хочется человекочитаемой конфигурации (роли, backstory, цели)
- Уже есть команда на Python и привычка к декларативному описанию агентов
Когда не нужен: для простых задач CrewAI избыточен. Если задача линейная без параллелизма — один вызов Claude API дешевле и быстрее.
Mastra — TypeScript-фреймворк нового поколения
Mastra — относительно молодой open-source фреймворк (появился в 2024 году), разработанный командой, в которой есть выходцы из Gatsby. TypeScript-first, удобная связка с Vercel и Next.js, DX как у Next.js.
Главные принципы Mastra:
- TypeScript как первый класс — всё типизировано, автодополнение работает из коробки
- Workflows + Agents — workflow для детерминированных флоу, agents для динамических
- Memory — встроенная память агентов с подключаемым хранилищем
- Модели по строке — модель задаётся как
"провайдер/модель", без отдельных импортов провайдеров - Современный DX — локальный playground для проверки агентов и hot reload в dev
API Mastra менялся: старые примеры из блогов с new Workflow, new Step и triggerSchema уже не соответствуют текущей версии (сейчас createWorkflow и createStep). Сверяйся с документацией.
// Пример: Mastra agent с workflow (TypeScript)
import { Mastra } from "@mastra/core";
import { Agent } from "@mastra/core/agent";
import { createTool } from "@mastra/core/tools";
import { createStep, createWorkflow } from "@mastra/core/workflows";
import { z } from "zod";
import Anthropic from "@anthropic-ai/sdk";
const anthropic = new Anthropic();
// Определяем инструменты
const searchTool = createTool({
id: "web-search",
description: "Поиск актуальной информации в интернете",
inputSchema: z.object({
query: z.string().describe("Поисковый запрос"),
}),
outputSchema: z.object({ results: z.array(z.string()) }),
execute: async ({ query }) => {
// Здесь реальный поиск через Serper, Tavily и т.д.
return { results: [`Результаты для: ${query}`] };
},
});
// Создаём агента-исследователя. Модель задаётся строкой «провайдер/модель»
const researchAgent = new Agent({
id: "research-agent",
name: "Research Agent",
instructions: `Ты профессиональный исследователь.
Находишь актуальную информацию по запросу, структурируешь её,
выделяешь ключевые факты с источниками.`,
model: "anthropic/claude-sonnet-5-5", // актуальные модели: страница «Актуальное сейчас»
tools: { searchTool },
});
// Шаги workflow: у каждого шага описаны входные и выходные данные
const researchStep = createStep({
id: "research",
inputSchema: z.object({ topic: z.string() }),
outputSchema: z.object({ research: z.string() }),
execute: async ({ inputData, mastra }) => {
const agent = mastra.getAgent("researchAgent");
const result = await agent.generate(
`Исследуй тему: ${inputData.topic}. Найди актуальные данные и тренды.`
);
return { research: result.text };
},
});
const summarizeStep = createStep({
id: "summarize",
inputSchema: z.object({ research: z.string() }),
outputSchema: z.object({ summary: z.string() }),
execute: async ({ inputData }) => {
const response = await anthropic.messages.create({
model: "claude-haiku-4-5",
max_tokens: 500,
messages: [
{
role: "user",
content: `Сожми это исследование в 3 ключевых вывода:\n\n${inputData.research}`,
},
],
});
const summary = response.content.map((b) => (b.type === "text" ? b.text : "")).join("");
return { summary };
},
});
const researchWorkflow = createWorkflow({
id: "research-workflow",
inputSchema: z.object({ topic: z.string() }),
outputSchema: z.object({ summary: z.string() }),
})
.then(researchStep)
.then(summarizeStep)
.commit();
// Инициализируем Mastra
const mastra = new Mastra({
agents: { researchAgent },
workflows: { researchWorkflow },
});
// Запускаем (способ запуска сверь с документацией своей версии Mastra)
const run = await mastra.getWorkflow("researchWorkflow").createRun();
const result = await run.start({ inputData: { topic: "AI agents" } });
console.log(result);Когда выбирать Mastra:
- Весь стек на TypeScript/Node.js
- Нужна нативная интеграция с Vercel/Next.js
- Хочется современный DX с типизацией
- Строишь SaaS где агенты — это backend сервис
Слабые стороны Mastra: экосистема моложе чем у LangGraph/CrewAI, меньше готовых интеграций, документация ещё в активном развитии.
Claude Code native — когда не нужен отдельный фреймворк
Claude Code имеет встроенную мультиагентность через инструмент Agent (раньше он назывался Task) и файлы субагентов в .claude/agents/.
Как это работает:
- В
CLAUDE.mdописываешь orchestration логику - Claude Code сам вызывает subagents через Agent tool
- Каждый subagent работает в изолированном контексте
- Orchestrator получает результат, продолжает
--- name: research-crew description: Оркестратор исследовательской команды. Используй для задач на исследование темы с разных сторон. --- # .claude/agents/research-crew.md ## Описание Агент-оркестратор который координирует исследовательскую команду. ## Поведение При получении задачи на исследование: 1. Параллельно запускаю: - market-researcher: исследование рынка - tech-analyst: технический анализ - financial-model: финансовые расчёты 2. Получаю результаты от всех трёх 3. Передаю report-writer для синтеза 4. Возвращаю итоговый отчёт ## Subagents - market-researcher (market-researcher.md) - tech-analyst (tech-analyst.md) - financial-model (financial-model.md) - report-writer (report-writer.md)
Что изменилось к октябрю 2026. Субагенты по умолчанию работают в фоне. Мастер /agents убран: субагента создают просьбой к Claude или файлом в .claude/agents/. Появились agent view (claude agents показывает все фоновые сессии, research preview), agent teams (несколько сессий с общим списком задач; экспериментально, выключено по умолчанию) и dynamic workflows (/workflows): скрипт, который запускает много субагентов и перепроверяет их результаты. Это закрывает часть задач, для которых раньше брали внешний фреймворк. Подробности: Суб-агенты, Команды агентов и Актуальное сейчас.
Когда Claude Code native достаточно:
- Нет сложных conditional branches и циклов
- Orchestration логика простая и линейная
- Команда небольшая (1-3 разработчика)
- Хочется минимальных зависимостей
- Уже используете Claude Code как основной инструмент
Когда Claude Code native недостаточно:
- Нужны настоящие циклы с прерыванием по условию (LangGraph)
- Сложный state management между агентами
- Нужна интеграция с внешними системами (векторные DB, webhooks, очереди)
- Требуется observability и трассировка агентских вызовов
Сравнительная таблица
| Параметр | LangGraph | CrewAI | Mastra | Claude Code native |
|---|---|---|---|---|
| Язык | Python | Python | TypeScript | Markdown/любой |
| Парадигма | Граф состояний | Команды с ролями | Workflow + Agents | CLAUDE.md + Agent tool |
| Сложность старта | Высокая | Средняя | Средняя | Низкая |
| Циклы/state machine | ✅ Нативно | ⚠️ Ограниченно | ⚠️ Workflow | ⚠️ Через workflows и скрипты |
| Параллелизм | ✅ Да | ✅ async_execution | ✅ Да | ✅ Parallel subagents |
| Human-in-the-loop | ✅ Встроенный | ⚠️ Вручную | ⚠️ Вручную | ✅ Режим плана и запросы разрешений |
| Экосистема | Большая (LangChain) | Средняя, растёт | Молодая | Anthropic ecosystem |
| Observability | LangSmith | Встроенный UI | Встроенная трассировка | Журнал сессий |
| Подходит для | Сложные state machines | Параллельные команды | TypeScript SaaS | Простые pipeline |
| Цена | Бесплатно + LangSmith | Бесплатно + cloud | Бесплатно + cloud | Входит в платный тариф Claude или оплата по токенам |
Актуальные цены и версии: Актуальное сейчас.
Паттерн: Claude Code как orchestrator, CrewAI как внешний сервис
Самый гибкий подход — смешанная архитектура: Claude Code orchestrates высокоуровневый флоу, а для тяжёлой параллельной работы вызывает CrewAI как внешний сервис.
# crew_service.py — оборачиваем CrewAI как FastAPI сервис
from fastapi import FastAPI
from pydantic import BaseModel
from crewai import Agent, Task, Crew, Process
app = FastAPI()
class ResearchRequest(BaseModel):
topic: str
output_format: str = "report"
@app.post("/research")
async def run_research_crew(request: ResearchRequest):
"""
Этот endpoint вызывается Claude Code orchestrator'ом.
Внутри запускается параллельная CrewAI команда.
"""
researcher = Agent(
role="Senior Researcher",
goal=f"Найди всё важное о: {request.topic}",
backstory="Опытный аналитик с доступом к интернету",
llm="anthropic/claude-sonnet-5-5",
verbose=False # В продакшене выключаем verbose
)
writer = Agent(
role="Technical Writer",
goal="Превратить исследование в чёткий структурированный документ",
backstory="Специалист по технической документации",
llm="anthropic/claude-haiku-4-5",
verbose=False
)
research_task = Task(
description=f"Исследуй: {request.topic}. Найди факты, цифры, тренды.",
expected_output="Структурированные данные с источниками",
agent=researcher
)
write_task = Task(
description=f"Напиши {request.output_format} на основе исследования",
expected_output=f"Готовый {request.output_format} для клиента",
agent=writer,
context=[research_task]
)
crew = Crew(
agents=[researcher, writer],
tasks=[research_task, write_task],
process=Process.sequential,
verbose=False
)
result = crew.kickoff()
return {"result": result.raw, "topic": request.topic}Теперь Claude Code subagent просто вызывает этот сервис:
# В .claude/agents/research-orchestrator.md
# Claude Code вызывает CrewAI как внешний API
curl -X POST http://localhost:8000/research \
-H "Content-Type: application/json" \
-d '{"topic": "AI orchestration frameworks", "output_format": "report"}'OpenAI Swarm и AutoGen — быстрый обзор
OpenAI Swarm — экспериментальный минималистичный фреймворк от OpenAI; его заменил OpenAI Agents SDK (openai-agents-python). Два концепта: Agents и Handoffs. Агент может "передать" управление другому агенту. Простой и понятный, ориентирован на модели OpenAI.
Microsoft AutoGen — фреймворк для multi-agent conversations. С октября 2025 AutoGen в режиме поддержки: по README репозитория, он не получает новых функций, а новым пользователям Microsoft предлагает Microsoft Agent Framework (его наследника для корпоративных сценариев). Если встретишь AutoGen в старых туториалах, сверься с актуальной документацией.
Для большинства задач русскоязычных разработчиков: LangGraph или CrewAI + Claude — более практичный выбор, чем тяжёлые корпоративные фреймворки.
Как принимать решение: блок-схема выбора
Задача простая, линейная, без веток?
→ Claude Code native. Не усложняй.
Нужны циклы "попробовать → исправить → повторить"?
→ LangGraph
Нужно несколько параллельных экспертов над одной темой?
→ CrewAI
Весь стек TypeScript, деплоим на Vercel?
→ Mastra
Нужна корпоративная надёжность, много compliance?
→ Microsoft Agent Framework (наследник AutoGen)
Хочешь смешанный подход?
→ Claude Code orchestrator + CrewAI/LangGraph как внешний сервисПрактика
Шаг 1: Установка CrewAI и зависимостей
# Создаём проект
mkdir multiagent-crew && cd multiagent-crew
python -m venv venv && source venv/bin/activate # Windows: venv\Scripts\activate
# Устанавливаем зависимости
pip install crewai crewai-tools anthropic python-dotenv fastapi uvicorn
# Файл .env
echo "ANTHROPIC_API_KEY=sk-ant-your-key-here" > .env
echo "SERPER_API_KEY=your-serper-key" >> .env # для поиска в интернетеШаг 2: Простейший CrewAI с двумя агентами
# simple_crew.py — начинаем с минимума
import os
from dotenv import load_dotenv
from crewai import Agent, Task, Crew
load_dotenv()
# Настраиваем модель для CrewAI
os.environ["ANTHROPIC_API_KEY"] = os.getenv("ANTHROPIC_API_KEY")
# Два агента
researcher = Agent(
role="Researcher",
goal="Найти ключевую информацию по теме",
backstory="Аналитик с опытом работы в технологической индустрии",
llm="anthropic/claude-haiku-4-5", # Дешёвая модель для исследований
verbose=True
)
writer = Agent(
role="Writer",
goal="Написать чёткий и полезный контент на основе исследования",
backstory="Технический писатель специализирующийся на AI-тематике",
llm="anthropic/claude-sonnet-5-5", # Более умная модель для финального текста
verbose=True
)
# Задачи
research_task = Task(
description="Найди 5 ключевых трендов в мультиагентных AI системах в 2026 году",
expected_output="Список из 5 трендов с кратким описанием каждого (50-100 слов на тренд)",
agent=researcher
)
write_task = Task(
description="""На основе исследования напиши short-form статью (500 слов)
для технических разработчиков. Тон: профессиональный, без воды, с конкретикой.""",
expected_output="Готовая статья 500 слов в markdown формате",
agent=writer,
context=[research_task]
)
# Crew
crew = Crew(
agents=[researcher, writer],
tasks=[research_task, write_task],
verbose=True
)
# Запуск
print("Запускаем команду...")
result = crew.kickoff()
print("\n" + "="*50)
print("РЕЗУЛЬТАТ:")
print("="*50)
print(result.raw)Шаг 3: Параллельная команда из 4 агентов
# parallel_crew.py — реальная параллельная команда
import os
from dotenv import load_dotenv
from crewai import Agent, Task, Crew, Process
from crewai_tools import SerperDevTool
load_dotenv()
search = SerperDevTool()
# Четыре специализированных эксперта
market_analyst = Agent(
role="Market Analyst",
goal="Проанализировать рыночную ситуацию и конкурентов",
backstory="Аналитик рынка с фокусом на SaaS и AI-инструменты",
tools=[search],
llm="anthropic/claude-haiku-4-5",
verbose=False
)
tech_reviewer = Agent(
role="Technical Reviewer",
goal="Оценить техническую сторону и интеграции",
backstory="Senior разработчик знающий все популярные AI фреймворки",
tools=[search],
llm="anthropic/claude-haiku-4-5",
verbose=False
)
pricing_expert = Agent(
role="Pricing Expert",
goal="Разобраться в ценообразовании и ROI",
backstory="Финансовый аналитик специализирующийся на SaaS метриках",
tools=[search],
llm="anthropic/claude-haiku-4-5",
verbose=False
)
strategy_writer = Agent(
role="Strategy Consultant",
goal="Синтезировать все данные в actionable рекомендации",
backstory="Консультант McKinsey уровня который пишет чёткие executive briefs",
llm="anthropic/claude-sonnet-5-5", # Сильная модель для финального синтеза
verbose=True
)
# Параллельные задачи (async_execution=True)
market_task = Task(
description="Исследуй рынок мультиагентных AI-фреймворков: размер, игроки, тренды 2026",
expected_output="Рыночный анализ: 3-5 ключевых игроков, тренды, размер рынка",
agent=market_analyst,
async_execution=True # ПАРАЛЛЕЛЬНО
)
tech_task = Task(
description="Сравни технически: LangGraph, CrewAI, Mastra — возможности, ограничения, экосистема",
expected_output="Техническое сравнение с конкретными примерами use cases",
agent=tech_reviewer,
async_execution=True # ПАРАЛЛЕЛЬНО
)
pricing_task = Task(
description="Разбери pricing models и ROI: сколько стоит использование, какая экономия",
expected_output="Финансовый анализ с конкретными цифрами и расчётом ROI",
agent=pricing_expert,
async_execution=True # ПАРАЛЛЕЛЬНО
)
# Синтез — ждёт все три параллельных задачи
synthesis_task = Task(
description="""Синтезируй три анализа в executive brief для технического директора.
Структура: Ситуация → Выводы → Рекомендации (топ-3 actionable).
Максимум 1 страница. Никакой воды.""",
expected_output="Executive brief в markdown, 1 страница, готовый к презентации",
agent=strategy_writer,
context=[market_task, tech_task, pricing_task] # Зависит от всех трёх
)
# Собираем команду
crew = Crew(
agents=[market_analyst, tech_reviewer, pricing_expert, strategy_writer],
tasks=[market_task, tech_task, pricing_task, synthesis_task],
process=Process.sequential,
verbose=True,
memory=False # В примере отключаем для скорости
)
# Запуск
print("Параллельная команда запускается...")
print("market_analyst, tech_reviewer, pricing_expert работают одновременно")
print("strategy_writer начнёт когда все трое завершат")
print("-" * 50)
result = crew.kickoff()
# Сохраняем результат
with open("report.md", "w", encoding="utf-8") as f:
f.write(result.raw)
print("\nОтчёт сохранён в report.md")Шаг 4: Запуск и отладка
# Запускаем простую команду
python simple_crew.py
# Запускаем параллельную команду
python parallel_crew.py
# Если нужна отладка — ставим verbose=True у агентов и у Crew в коде
# Смотрим на расход токенов
# В конце CrewAI показывает total tokens usageЧастые проблемы и решения:
# Ошибка: модель не найдена
# Убедись что ANTHROPIC_API_KEY задан в .env
# CrewAI ищет ключ через os.environ
# Ошибка: rate limit
# Добавь max_rpm параметр в Crew:
crew = Crew(..., max_rpm=5) # максимум 5 запросов в минуту
# Результат не сохранился в context
# Убедись что context=[task1, task2] в зависимой задачеШаг 5: Оборачиваем CrewAI в API для Claude Code
# api_service.py — CrewAI как микросервис
from fastapi import FastAPI
from pydantic import BaseModel
import uvicorn
from crewai import Agent, Task, Crew
app = FastAPI(title="Research Crew API")
class ResearchRequest(BaseModel):
topic: str
style: str = "technical" # technical, executive, casual
@app.post("/research")
async def research(req: ResearchRequest):
"""
Claude Code вызывает этот endpoint через bash/curl.
Внутри — параллельная CrewAI команда.
"""
researcher = Agent(
role="Researcher",
goal=f"Исследуй тему досконально: {req.topic}",
backstory="Опытный аналитик",
llm="anthropic/claude-haiku-4-5",
verbose=False
)
writer = Agent(
role="Writer",
goal=f"Напиши в стиле: {req.style}",
backstory="Технический писатель",
llm="anthropic/claude-sonnet-5-5",
verbose=False
)
research_task = Task(
description=f"Исследуй: {req.topic}",
expected_output="Детальный анализ с фактами",
agent=researcher
)
write_task = Task(
description=f"Напиши в стиле '{req.style}' на основе исследования",
expected_output="Готовый документ",
agent=writer,
context=[research_task]
)
crew = Crew(
agents=[researcher, writer],
tasks=[research_task, write_task]
)
result = crew.kickoff()
return {
"topic": req.topic,
"result": result.raw,
"tokens_used": result.token_usage.total_tokens if result.token_usage else 0
}
@app.get("/health")
def health():
return {"status": "ok"}
if __name__ == "__main__":
uvicorn.run(app, host="0.0.0.0", port=8001)# Запускаем сервис
python api_service.py
# Claude Code теперь может вызвать его:
curl -X POST http://localhost:8001/research \
-H "Content-Type: application/json" \
-d '{"topic": "Multiagent orchestration trends", "style": "executive"}'Инструменты и ресурсы
- LangGraph — документация и примеры graph-based orchestration
- CrewAI — официальная дока, примеры crews, список инструментов
- Mastra — TypeScript фреймворк, документация workflows и agents
- Microsoft Agent Framework — наследник AutoGen для multi-agent и корпоративных сценариев
- OpenAI Agents SDK — минималистичный фреймворк от OpenAI (заменил Swarm)
- LangSmith — observability и tracing для LangGraph агентов
- SerperDev — API для поиска Google (интегрируется с CrewAI tools)
- Субагенты Claude Code — встроенная мультиагентность Claude Code
Ключевые выводы
Не нужен отдельный фреймворк чтобы начать с мультиагентов. Claude Code native через
.claude/agents/и Agent tool решает 80% задач. LangGraph и CrewAI нужны когда появляются циклы, сложные state machines или параллельные команды из 5+ агентов.
CrewAI — лучший старт для параллельных исследовательских команд. Role-based подход интуитивен: описываешь роль как на job posting, CrewAI обеспечивает координацию. Три независимых эксперта работают одновременно и передают результаты синтезатору — вот и вся команда.
Смешанная архитектура часто лучше чистой: Claude Code как orchestrator для высокоуровневого флоу + CrewAI или LangGraph как специализированный сервис для тяжёлой работы. Не нужно выбирать один фреймворк навсегда.
Следующий урок
→ Computer Use для продвинутых — паттерны для продвинутых сценариев
Отметка хранится только в этом браузере и никуда не отправляется. Мой прогресс