Библиотека · Автономные агенты и мультиагентные системы

Мультиагентная оркестрация — LangGraph, CrewAI и Mastra против Claude Code

Инженер70 минОбновлено: октябрь 2026
74 из 105 в библиотеке

Модуль: 18. Advanced Orchestration | Время: ~30 мин теории + 40 мин практики


Суть урока

Один агент — один музыкант. Он может сыграть мелодию. Но симфонию — нет.

Мультиагентная оркестрация — это когда у тебя есть дирижёр и оркестр. Дирижёр (orchestrator) не играет сам — он управляет скрипачами, виолончелистами, ударниками (специализированными агентами). Каждый играет своё. Вместе — музыка которую один не сыграет никогда.

LangGraph, CrewAI, Mastra и Claude Code native — это разные концепции того как строить этот оркестр. У каждого своя философия, свои сильные стороны, своя цена вхождения.

В этом уроке разберём их честно и поймём главное: когда вам хватит встроенных инструментов Claude Code, а когда нужно тянуть отдельный фреймворк.

🎨 Образ: выбор между оркестром и джаз-квартетом. Оркестр мощнее — но нужен зал, расписание, 80 музыкантов. Квартет менее формален — но за вечер он импровизирует то что оркестр репетировал бы месяц. Для разных задач — разные ансамбли.


🎯 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. Фреймворк = когда явно упёрся.

🎨 Образ: велосипед vs автомобиль. До магазина в 2 км — велосипед быстрее (не надо парковаться, заводить, заправлять). А вот ехать в другой город — нужен автомобиль. Не покупай машину если тебе только до магазина.


Ключевые концепции

  • 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 и записывает свои результаты.

python
# Пример минимального 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). Не граф, не граф с состояниями — а люди с ролями которые выполняют задачи.

Три основных концепта:

  1. Agent — роль + backstory + LLM + инструменты
  2. Task — конкретная задача с описанием, expected output, assigned_agent
  3. Crew — команда агентов + список задач + process (sequential или hierarchical)

CrewAI особенно хорош для параллельных исследовательских команд — когда нужно несколько независимых экспертов которые работают над одной темой с разных углов.

python
# Пример: исследовательская команда 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)

Установка:

bash
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). Сверяйся с документацией.

typescript
// Пример: 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 как внешний сервис.

python
# 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 просто вызывает этот сервис:

bash
# В .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 — более практичный выбор, чем тяжёлые корпоративные фреймворки.

🎨 Образ: Корпоративный фреймворк — это Boeing 747. Мощный, надёжный, летает далеко. Но чтобы поднять в воздух нужна команда из 50 человек и сертификация. CrewAI — Cessna. Один пилот, запустил и полетел.


Как принимать решение: блок-схема выбора

Код
Задача простая, линейная, без веток?
  → Claude Code native. Не усложняй.

Нужны циклы "попробовать → исправить → повторить"?
  → LangGraph

Нужно несколько параллельных экспертов над одной темой?
  → CrewAI

Весь стек TypeScript, деплоим на Vercel?
  → Mastra

Нужна корпоративная надёжность, много compliance?
  → Microsoft Agent Framework (наследник AutoGen)

Хочешь смешанный подход?
  → Claude Code orchestrator + CrewAI/LangGraph как внешний сервис

Практика

Шаг 1: Установка CrewAI и зависимостей

bash
# Создаём проект
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 с двумя агентами

python
# 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 агентов

python
# 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: Запуск и отладка

bash
# Запускаем простую команду
python simple_crew.py

# Запускаем параллельную команду
python parallel_crew.py

# Если нужна отладка — ставим verbose=True у агентов и у Crew в коде

# Смотрим на расход токенов
# В конце CrewAI показывает total tokens usage

Частые проблемы и решения:

bash
# Ошибка: модель не найдена
# Убедись что 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

python
# 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)
bash
# Запускаем сервис
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 для продвинутых — паттерны для продвинутых сценариев

Отметка хранится только в этом браузере и никуда не отправляется. Мой прогресс