Модуль 4.3 · Урок 2
Фреймворки оркестрации агентов
Содержание
- Введение
- LangGraph — графовая оркестрация
- Ключевая идея
- Durable execution
- Пример: граф из двух агентов
- Human-in-the-loop
- Когда выбирать LangGraph
- CrewAI — ролевые команды агентов
- Ключевая идея
- Поддержка MCP
- Пример: команда из двух агентов
- Когда выбирать CrewAI
- Mastra — TypeScript-first фреймворк
- Ключевая идея
- Human-in-the-loop с persistent state
- Встроенные evals
- Пример: агент-аналитик
- Когда выбирать Mastra
- Semantic Kernel — enterprise на .NET
- Ключевая идея
- Интеграция с экосистемой Microsoft
- Пример: агент на C#
- Когда выбирать Semantic Kernel
- Pydantic AI — type-safe Python для production
- Ключевая идея
- Когда выбирать
- Когда не выбирать
- Мини-пример
- Strands — AWS-ориентированный simplicity-first
- Ключевая идея
- Когда выбирать Strands
- Когда не выбирать
- LangSmith — мониторинг агентов в production
- Сравнительная таблица
- Дерево выбора фреймворка
- Итоги
Введение
Собрать мультиагентную систему из голых API-вызовов можно. Но через неделю вы утонете в управлении состоянием, обработке ошибок, ретраях и логировании. Фреймворки оркестрации решают эти задачи за вас:
- Управление состоянием — где агент остановился, что уже сделал, какой контекст накопил
- Восстановление после сбоев — checkpoint, retry, fallback
- Наблюдаемость — трейсы, метрики, логи каждого шага
- Масштабирование — параллельное выполнение, очереди, распределённые воркеры
Четыре фреймворка покрывают основные сценарии: LangGraph для сложных графов, CrewAI для ролевых команд, Mastra для TypeScript-стека, Semantic Kernel для .NET/enterprise. Разберём каждый.
LangGraph — графовая оркестрация
- GitHub: https://github.com/langchain-ai/langgraph (~31 600 stars)
- Часть экосистемы LangChain (128 000+ stars суммарно)
- Python и JavaScript SDK
Ключевая идея
Агентская логика описывается как граф состояний. Узлы — это действия (вызов модели, инструмент, проверка). Рёбра — переходы между действиями, в том числе условные. Граф компилируется в исполняемое приложение.
Durable execution
Главное преимущество LangGraph — устойчивое выполнение. Каждый шаг сохраняется в checkpoint. Если процесс упал на третьем узле из пяти, после перезапуска он продолжит с третьего, а не начнёт заново. Это критично для долгих workflow: исследование, генерация отчёта, согласование.
graph LR
A[Старт] --> B[Узел 1: Исследование]
B --> CP1[Checkpoint 1]
CP1 --> C[Узел 2: Анализ]
C --> CP2[Checkpoint 2]
CP2 --> D{Условие: достаточно данных?}
D -- Да --> E[Узел 3: Генерация отчёта]
D -- Нет --> B
E --> F[Конец]
style A fill:#f8fafc,stroke:#e2e8f0
style B fill:#4f46e5,color:#fff,stroke:#4338ca
style C fill:#4f46e5,color:#fff,stroke:#4338ca
style E fill:#4f46e5,color:#fff,stroke:#4338ca
style CP1 fill:#059669,color:#fff,stroke:#047857
style CP2 fill:#059669,color:#fff,stroke:#047857
style D fill:#ca8a04,color:#fff,stroke:#a16207
style F fill:#f8fafc,stroke:#e2e8f0
Пример: граф из двух агентов
from langgraph.graph import StateGraph
from typing import TypedDict
class AgentState(TypedDict):
messages: list
next_step: str
def research_node(state: AgentState) -> AgentState:
"""Агент-исследователь: собирает информацию"""
# Вызов LLM с инструментами поиска
result = llm.invoke(state["messages"])
return {"messages": state["messages"] + [result], "next_step": "writer"}
def writer_node(state: AgentState) -> AgentState:
"""Агент-писатель: формирует итоговый текст"""
result = llm.invoke(state["messages"])
return {"messages": state["messages"] + [result], "next_step": "end"}
graph = StateGraph(AgentState)
graph.add_node("researcher", research_node)
graph.add_node("writer", writer_node)
graph.set_entry_point("researcher")
graph.add_edge("researcher", "writer")
graph.add_edge("writer", "__end__")
app = graph.compile()
result = app.invoke({"messages": ["Напиши статью про AI-агентов"], "next_step": ""})
Human-in-the-loop
LangGraph позволяет приостановить граф на любом узле и дождаться ввода человека. Агент готовит черновик, человек одобряет или корректирует, агент продолжает. Реализуется через interrupt_before и interrupt_after параметры при компиляции графа.
Когда выбирать LangGraph
- Сложные workflow с циклами и ветвлениями
- Критичные процессы, где нельзя потерять прогресс
- Нужна полная наблюдаемость через LangSmith
- Команда уже использует LangChain
CrewAI — ролевые команды агентов
- GitHub: https://github.com/crewAIInc/crewAI (~51 000 stars)
- Самый быстрый путь от идеи до работающего прототипа
- Один из самых быстрых фреймворков для прототипирования ролевых команд агентов (по отзывам разработчиков 2026 года)
Ключевая идея
Каждый агент — это роль с целью и предысторией. Вы описываете команду как менеджер: вот исследователь, вот редактор, вот задачи. CrewAI сам координирует их взаимодействие.
Поддержка MCP
CrewAI нативно поддерживает Model Context Protocol. Агенты могут использовать MCP-серверы как инструменты без дополнительной обвязки.
Пример: команда из двух агентов
Определение агентов в CrewAI
Задачи и запуск команды CrewAI
Когда выбирать CrewAI
- Чёткое разделение ролей в команде агентов
- Структурированные бизнес-процессы
- Нужен быстрый прототип за часы, не дни
- Интеграция с MCP-серверами
Mastra — TypeScript-first фреймворк
- GitHub: https://github.com/mastra-ai/mastra (~24 000 stars)
- Создан командой Gatsby (бэкграунд YC)
- Агенты, workflows, RAG, evals — всё в одном пакете
Ключевая идея
Mastra — это фреймворк для TypeScript-разработчиков, которым нужно всё сразу: агенты, пайплайны, RAG, оценка качества. Не надо собирать из 5 разных библиотек. Типобезопасность из коробки, интеграции генерируются автоматически.
Human-in-the-loop с persistent state
Mastra сохраняет состояние workflow между запросами. Агент может приостановиться, дождаться одобрения человека и продолжить через минуту, час или день. Состояние не теряется.
Встроенные evals
Качество ответов агента можно оценивать программно: relevance, faithfulness, toxicity. Это работает в CI/CD — прогнал тесты, увидел деградацию, откатил.
Пример: агент-аналитик
import { Mastra } from '@mastra/core';
import { Agent } from '@mastra/core/agent';
import { openai } from '@ai-sdk/openai';
const analyst = new Agent({
name: 'analyst',
instructions: 'Ты аналитик данных. Анализируй информацию и давай структурированные выводы. Отвечай на русском.',
model: openai('gpt-4o'),
});
const mastra = new Mastra({
agents: { analyst },
});
const agent = mastra.getAgent('analyst');
const response = await agent.generate('Проанализируй рынок AI-фреймворков в 2026 году');
console.log(response.text);
Когда выбирать Mastra
- Проект на TypeScript / Next.js / Node.js
- Нужны встроенные evals для CI/CD
- Хотите один фреймворк вместо пяти библиотек
- Типобезопасность критична
Semantic Kernel — enterprise на .NET
- GitHub: https://github.com/microsoft/semantic-kernel (~28 000 stars)
- C#, Python (и Java в ограниченном виде)
- Semantic Kernel активно развивается и является основой для Microsoft Agent Framework (преемник SK + AutoGen).
Ключевая идея
Semantic Kernel — это SDK от Microsoft для встраивания LLM в корпоративные приложения. Архитектура построена на плагинах: каждый плагин — набор функций, доступных агенту. Планировщик решает, какие плагины вызвать для выполнения задачи.
Интеграция с экосистемой Microsoft
Semantic Kernel тесно интегрирован с Azure OpenAI, GitHub Copilot SDK, Microsoft 365. Если ваша компания на стеке Microsoft — это путь наименьшего сопротивления.
Пример: агент на C#
using Microsoft.SemanticKernel;
using Microsoft.SemanticKernel.Agents;
var kernel = Kernel.CreateBuilder()
.AddOpenAIChatCompletion("gpt-4o", apiKey)
.Build();
var agent = new ChatCompletionAgent
{
Name = "Analyst",
Instructions = "Анализируй данные и предоставляй структурированные отчёты. Отвечай на русском.",
Kernel = kernel
};
var history = new ChatHistory();
history.AddUserMessage("Какие тренды в AI-агентах в 2026?");
await foreach (var message in agent.InvokeAsync(history))
{
Console.WriteLine(message.Content);
}
Когда выбирать Semantic Kernel
- Корпоративная разработка на .NET
- Инфраструктура на Azure
- Нужна интеграция с Microsoft 365 и GitHub Copilot
- Требования к enterprise-grade поддержке
Pydantic AI — type-safe Python для production
Pydantic AI (~16 950 stars на май 2026, релиз v1.93.0 от 8 мая 2026) — фреймворк от команды Pydantic с акцентом на типобезопасность и observability через Pydantic Logfire.
Ключевая идея
Один из самых популярных Python-фреймворков для production-агентов 2026 года. Использует Pydantic-модели как контракт между LLM, tools и приложением: структурированные input/output, validation на лету, автодополнение в IDE, возможность тестирования без вызова LLM.
Когда выбирать
- Production-приложения на Python, где критична надёжность
- Команды уже использует Pydantic для API/конфигов
- Нужна детальная observability через Pydantic Logfire (родной observability-стек)
- Хочется минималистичный API без graph state machines (LangGraph) и без role-decoration (CrewAI)
Когда не выбирать
- Если стек на TypeScript (используйте Mastra или Vercel AI SDK)
- Сложный multi-agent с условными переходами и циклами (LangGraph удобнее)
- Команда не использует Pydantic — кривая входа
Мини-пример
from pydantic_ai import Agent
from pydantic import BaseModel
class WeatherResponse(BaseModel):
location: str
temperature_c: float
summary: str
agent = Agent(
"anthropic:claude-sonnet-4-6",
output_type=WeatherResponse,
system_prompt="Ты — погодный ассистент."
)
result = agent.run_sync("Какая погода в Москве?")
print(result.output.temperature_c) # типизировано как float
В отличие от LangGraph и CrewAI — нет общего state graph, нет ролевых crews. Это decorator-style фреймворк: вы просите Agent с типизированным выходом, оркестрацию строите композицией Python-функций.
Strands — AWS-ориентированный simplicity-first
Strands Agents SDK (~5 800 stars, релиз v1.39.0 от 8 мая 2026) — open-source фреймворк с корнями в AWS, но cloud-agnostic. Принцип: agent = model + tools + prompt, без overhead графов и crews.
Ключевая идея
Минимальный API: декорируете Python-функцию через @tool, передаёте список tools агенту, агент сам решает порядок вызовов через native model reasoning (Claude tool use, OpenAI function calling).
from strands import Agent, tool
from strands.models.anthropic import AnthropicModel
@tool
def get_weather(city: str) -> str:
"""Возвращает погоду в указанном городе."""
return f"В {city} +18°C, ясно"
agent = Agent(
model=AnthropicModel(model_id="claude-sonnet-4-6"),
tools=[get_weather],
system_prompt="Ты — погодный ассистент."
)
result = agent("Какая погода в СПБ?")
print(result.message)
Когда выбирать Strands
- Приложение на AWS (Bedrock, Lambda) — Strands из коробки интегрирован с Bedrock-моделями и AWS Observability
- Хочется минимум абстракций — agent loop + tools, никаких state graphs
- Multi-agent через композицию (один агент вызывает другого как tool) — без декларативной оркестрации
- Нужна нативная поддержка MCP и A2A (поддерживается)
Когда не выбирать
- Сложные multi-agent с условиями и циклами — LangGraph удобнее
- Не AWS-стек — сравнимые по простоте Pydantic AI и Mastra богаче фичами
LangSmith — мониторинг агентов в production
LangSmith — платформа наблюдаемости от LangChain. Работает не только с LangGraph, но с любым LLM-фреймворком.
Что даёт:
- Трейсы — полная цепочка вызовов: какой агент, какой prompt, какой ответ, сколько токенов, сколько времени
- Evals — автоматическая оценка качества ответов на датасетах
- Мониторинг — дашборды, алерты, автокатегоризация ошибок
- Datasets — хранение и версионирование тестовых примеров
Для production-систем с агентами наблюдаемость не опциональна. Без трейсов вы не поймёте, почему агент выдал ерунду на третьем шаге из семи.
Сравнительная таблица
| Критерий | LangGraph | CrewAI | Mastra | Semantic Kernel |
|---|---|---|---|---|
| Stars на GitHub | ~32K | ~51K | ~24K | ~28K |
| Язык | Python, JS | Python | TypeScript | C#, Python, Java |
| Архитектурный подход | Графы состояний | Роли и задачи | Agents + Workflows | Plugins + Planning |
| Durable execution | Да | Нет | Да | Нет |
| Встроенные evals | LangSmith | Нет | Да | Нет |
| Human-in-the-loop | Да | Да | Да | Да |
| Поддержка MCP | Нет | Да | Нет | Нет |
| Время до прототипа | Часы | Минуты | Часы | Часы |
| Идеален для | Сложная логика с циклами | Быстрый прототип с ролями | TypeScript fullstack | .NET и Enterprise |
Дерево выбора фреймворка
flowchart TD
START{На каком языке проект?} -->|Python| PY{Какая задача?}
START -->|TypeScript| MASTRA[Mastra]
START -->|C# / Java| SK[Semantic Kernel]
PY -->|Сложные графы с циклами| LG[LangGraph]
PY -->|Быстрый прототип с ролями| CREW[CrewAI]
PY -->|Корпоративный .NET| SK
LG --> LG_CHECK{Нужен мониторинг?}
LG_CHECK -->|Да| LS[LangGraph + LangSmith]
LG_CHECK -->|Нет| LG_SOLO[LangGraph standalone]
CREW --> CREW_CHECK{Нужен MCP?}
CREW_CHECK -->|Да| CREW_MCP[CrewAI + MCP-серверы]
CREW_CHECK -->|Нет| CREW_SOLO[CrewAI standalone]
style START fill:#f8fafc,stroke:#4f46e5,stroke-width:2px
style PY fill:#f8fafc,stroke:#4f46e5,stroke-width:2px
style LG_CHECK fill:#f8fafc,stroke:#4f46e5,stroke-width:2px
style CREW_CHECK fill:#f8fafc,stroke:#4f46e5,stroke-width:2px
style MASTRA fill:#f0fdf4,stroke:#059669,stroke-width:2px
style SK fill:#f0fdf4,stroke:#059669,stroke-width:2px
style LG fill:#f0fdf4,stroke:#059669,stroke-width:2px
style CREW fill:#f0fdf4,stroke:#059669,stroke-width:2px
style LS fill:#f0fdf4,stroke:#059669,stroke-width:2px
style LG_SOLO fill:#f0fdf4,stroke:#059669,stroke-width:2px
style CREW_MCP fill:#f0fdf4,stroke:#059669,stroke-width:2px
style CREW_SOLO fill:#f0fdf4,stroke:#059669,stroke-width:2px
Итоги
Четыре фреймворка — четыре разных подхода к одной задаче:
-
LangGraph — графы состояний с checkpoint-ами. Для сложной условной логики, где важна устойчивость к сбоям. Экосистема LangChain и LangSmith в комплекте.
-
CrewAI — ролевые команды агентов. Самый быстрый путь к работающему прототипу. Нативный MCP. Если задача хорошо ложится на роли — это оптимальный выбор.
-
Mastra — TypeScript-first с evals и RAG из коробки. Для fullstack-разработчиков на Node.js/Next.js, которым нужен один фреймворк вместо зоопарка библиотек.
-
Semantic Kernel — enterprise SDK от Microsoft. Для компаний на .NET/Azure, где важна корпоративная поддержка и интеграция с экосистемой Microsoft.
Не существует универсального “лучшего” фреймворка. Выбор определяется стеком, задачей и командой. Начинайте с того, что ближе к вашему языку и инфраструктуре.