Главная/Блог/Разбор/LangChain vs CrewAI: Оркестрация против…
Разбор5 мин чтения · 2 октября 2026 г.

LangChain vs CrewAI: Оркестрация против нативного роутинга OpenRouter

Сравнение LangGraph, CrewAI и нативного роутинга OpenRouter. Когда нужен фреймворк, а когда достаточно простого списка моделей для фолбэка.

LangChain vs CrewAI: Оркестрация против нативного роутинга OpenRouter

Построение сложных AI-агентов требует понимания трех разных слоев: оркестрации рабочего процесса (workflow), маршрутизации моделей (model routing) и маршрутизации провайдеров (provider routing). LangChain и CrewAI решают первую задачу, а OpenRouter — две остальные. Использование фреймворка оправдано, если вам нужна сложная логика, память и делегирование. Если же цель — просто выбрать лучшую модель для запроса и автоматически переключиться на резервную при ошибке, нативный роутинг OpenRouter проще и эффективнее.

01Три слоя абстракции

Понимание различий между слоями помогает избежать избыточной сложности:

  • Workflow orchestration (LangGraph, CrewAI): Планирование, управление состоянием, память, делегирование задач между агентами. LangGraph использует графы с явным состоянием, CrewAI — роли и события.
  • Model routing (OpenRouter): Выбор модели для конкретного вызова. Параметр models в OpenRouter — это упорядоченный список фолбэков. Если первая модель возвращает ошибку, система автоматически пробует следующую.
  • Provider routing (OpenRouter): Выбор конкретного провайдера (endpoint) для выбранной модели. Многие модели доступны у разных провайдеров. OpenRouter выбирает оптимальный, а для запросов с инструментами использует Auto Exacto для сортировки провайдеров по качеству вызова инструментов.
💡
Ключевое отличие. Фолбэк в OpenRouter реагирует только на ошибки (таймауты, rate limit, ошибки валидации). Он не оценивает качество ответа. Если нужно, чтобы сильная модель проверяла ответ слабой — это второй шаг в вашем коде, а не функция роутинга.

02LangChain и LangGraph: Графовая оркестрация

LangGraph — это низкоуровневый рантайм для создания устойчивых (durable) рабочих процессов. Он моделирует процесс как граф узлов и ребер. Это дает полный контроль, но требует написания кода для каждого шага.

Ключевые возможности:

  • Checkpointer: Сохраняет состояние графа для каждого потока, позволяя делать "time travel" (возврат к предыдущим состояниям) и обеспечивать отказоустойчивость.
  • Human-in-the-loop: Функция interrupt() позволяет приостановить выполнение узла, сохранить состояние и ждать подтверждения от человека (через Command), прежде чем продолжить.
  • Store: Долгосрочная память вне состояния графа для кросс-поточных данных.

LangGraph идеален, когда каждый шаг должен быть проверяемым, возобновляемым и прозрачным. Однако для простой задачи "вызов модели с фолбэком" это избыточно.

03CrewAI: Ролевые агенты и событийные потоки

CrewAI предлагает другой подход: организация работы через роли (Roles), цели (Goals) и задачи (Tasks). Агенты объединяются в Crews (команды), которые могут работать последовательно или иерархически (с менеджером-агентом).

Структурным элементом является Flow — событийно-ориентированный слой, определяющий шаги, передачу состояния и логику ветвления. В отличие от графов LangGraph, здесь вы описываете задачи текстом, а агенты сами решают, как их выполнить.

  • Параметр allow_delegation разрешает агентам делегировать задачи друг другу.
  • max_iter (по умолчанию 20) и max_execution_time ограничивают итерации и время выполнения.

CrewAI ближе к описанию бизнес-задач, чем к определению технического графа. Это снижает порог входа, но дает меньше контроля над каждым шагом выполнения.

04Нативный роутинг OpenRouter: Простота и надежность

Если вам не нужна сложная оркестрация, а требуется только выбор модели и автоматический фолбэк, OpenRouter позволяет сделать это без сторонних фреймворков. Вы отправляете запрос на https://openrouter.ai/api/v1/chat/completions с параметром models, содержащим список приоритетных моделей.

Пример функции на Python, реализующей роутинг с фолбэком:

terminalpython
import os
import requests

def route(models: list[str], prompt: str) -> tuple[str, str]:
    response = requests.post(
        "https://openrouter.ai/api/v1/chat/completions",
        headers={"Authorization": f"Bearer {os.environ['OPENROUTER_API_KEY']}"},
        json={
            "models": models,
            "messages": [{"role": "user", "content": prompt}]
        },
        timeout=120
    )
    response.raise_for_status()
    body = response.json()
    return body["choices"][0]["message"]["content"], body["model"]

# Пример использования: черновик с одной модели, ревью с другой
draft, draft_model = route(
    ["anthropic/claude-sonnet-5", "openai/gpt-5.6-sol"],
    "Draft a one-paragraph summary of what a model fallback list does."
)

review, review_model = route(
    ["openai/gpt-5.6-sol", "anthropic/claude-sonnet-5"],
    f"Review this draft for accuracy and suggest improvements: {draft}"
)

В этом примере, если anthropic/claude-sonnet-5 недоступна, OpenRouter автоматически пробует openai/gpt-5.6-sol. Цена запроса рассчитывается по той модели, которая в итоге ответила, а поле model в ответе указывает, кто именно обработал запрос.

⚠️
Важно про фолбэк. Система пробует следующую модель только при ошибке. Если первая модель вернула ответ, но он некачественный, фолбэк не сработает. Для проверки качества нужен второй шаг (например, отдельный вызов к другой модели).

05Сравнительная таблица

Критерий LangGraph / LangChain CrewAI OpenRouter Native
Основная задача Графовая оркестрация, явное состояние Ролевые агенты, событийные потоки Выбор модели, фолбэк, провайдеры
Мульти-модель Да (объект модели на узел/агента) Да (LLM на агента/команду) Да (список models в запросе)
Планирование и память Явное (граф, checkpointer, store) Через агентов, процессы и состояние Flow Нет (только роутинг)
Человек в цикле interrupt() + checkpointer Требует кастомной логики в Flow Не предусмотрено
Стриминг Да Да (на уровне crew, stream=True) Да (на уровне запроса)
Что нужно писать Узлы, ребра, схема состояния, конфиг Определения агентов, задач, crew, flow Тело запроса (JSON)

06Гибридный подход: OpenRouter внутри фреймворка

Вы не обязаны выбирать между оркестрацией и роутингом. OpenRouter предоставляет интеграции для обоих фреймворков:

  • LangChain: Используйте ChatOpenRouter как провайдера моделей внутри агентов LangChain.
  • CrewAI: Укажите OpenRouter как провайдера в классе LLM.

Это позволяет сохранить сложную логику оркестрации (графы или роли) и одновременно получить преимущества роутинга OpenRouter (фолбэки, выбор провайдеров, Auto Exacto).

07Кому подойдёт / что запустится

  • Выбирайте OpenRouter Native, если: Вам нужно просто вызывать модели с фолбэком, экономить токены на дешевых моделях для черновиков и использовать сильные модели для финальной проверки. Идеально для простых пайплайнов "черновик -> ревью" или API-шлюзов.
  • Выбирайте LangGraph, если: Вам нужен полный контроль над состоянием, возможность паузы для проверки человеком, долгосрочная память и сложная логика переходов между шагами. Подходит для сложных enterprise-агентов.
  • Выбирайте CrewAI, если: Вы хотите быстро собрать команду специализированных агентов с ролями и целями, делегирующих задачи друг другу, без глубокого погружения в техническую реализацию графов.

Для большинства задач, где требуется только надежность вызовов LLM, нативный роутинг OpenRouter является самым легким и эффективным решением. Фреймворки стоит подключать только тогда, когда логика приложения выходит за рамки последовательных вызовов моделей.

Источник: OpenRouter ↗