Автоматизация

CrewAI: команды ИИ-агентов, Flows и автоматизация на Python

CrewAI собирает на Python команды ИИ-агентов и процессы с управляемыми шагами. Подходит для обработки заявок, исследований и работы с документами. Разбираем установку, практические примеры, интеграции и ограничения.

Звёзды на GitHub
59 513
Дата релиза

Репозиторий

Язык
Python
Лицензия
MIT
Форки
8 676
Состояние
Открыт

Что такое CrewAI и какую задачу он решает

CrewAI помогает написать на Python процесс, в котором языковые модели выполняют разные задачи и передают результаты друг другу. Одному агенту можно поручить собрать сведения, второму проверить выводы, третьему подготовить документ. У каждого есть роль, цель и инструменты: функции, поиск или доступ к внешнему сервису.

Фреймворк полезен, когда одного запроса к модели уже мало. Например, заявка клиента требует свериться с базой знаний, определить ответственного и подготовить черновик ответа. CrewAI связывает эти действия в приложение. Интерфейс для клиента, авторизацию и подключение к рабочим данным вы создаёте отдельно.

Два основных понятия: Crew, команда агентов с задачами, и Flow, процесс с явно заданными шагами и состоянием. Для приложения с ветвлениями и проверками удобно начать с Flow, а работу моделей поместить в его отдельные шаги.

Кому подойдёт такой подход

  • Разработчику на Python, который собирает ассистента с доступом к данным компании и хочет разделить обязанности между агентами.
  • Вайбкодеру, который готов читать сгенерированные файлы, настраивать окружение и проверять поведение каждого шага.
  • Команде автоматизации: описать повторяемый процесс, сохранить промежуточные данные и найти этап, на котором результат испортился.
  • Для простого пересказа текста сначала достаточно одного вызова модели. Команда из нескольких агентов добавляет запросы, задержки и точки отказа.

Роль агента задаётся текстом, но работу инструментов определяет код. Если помощник должен читать заказ по его номеру, понадобится функция получения заказа и проверка доступа. Фраза «ты менеджер» сама по себе такого доступа не даёт.

Практические сценарии: заявки, исследования и документы

Как разложить задачу на агентные шаги
СценарийПример процессаЧто проверять
Поддержка клиентовКлассифицировать обращение, найти правило, подготовить ответВерность правила и отсутствие обещаний, которых нет в данных
Исследование темыСобрать материалы, выделить факты, написать сводкуСуществование источников и связь выводов с ними
Разбор документаПолучить текст, извлечь поля, проверить полнотуПустые поля, качество таблиц и формат результата
Работа с CRMСобрать сведения о заявке, предложить следующий шагПрава доступа и подтверждение перед изменением записи

Начните с процесса, в котором вход и результат легко сверить: например, из заметки о проблеме получить категорию обращения и черновик ответа. Добавлять поиск по интернету и запись в CRM лучше после того, как этот короткий путь работает предсказуемо. Так ошибку проще найти, а стоимость одного запуска проще посчитать.

Agent, Task, Crew и Flow: как они связаны

Основные части приложения CrewAI
ОбъектЗа что отвечает
AgentРоль, модель, инструкции и разрешённые инструменты
TaskЗадание, ожидаемый результат, исполнитель и зависимости
CrewНабор агентов и задач, порядок совместной работы
FlowСостояние приложения, запуск шагов, события и ветвления

Агент может выбирать инструменты в пределах своей задачи. Внешний Flow задаёт порядок крупных этапов: получить входные данные, запустить Crew, проверить результат, передать его дальше. Обычные Python-функции можно оставить для расчётов и проверок, которые не требуют модели.

Порядок задач и передача контекста

Process.sequential выполняет задачи по очереди. В Process.hierarchical работой руководит менеджер: он распределяет задания и оценивает результат. Для иерархического режима требуется manager_llm или собственный manager_agent. Менеджер тоже обращается к модели, поэтому такой режим добавляет расходы.

В Task.context можно явно указать задачи, результат которых нужен следующему исполнителю. Это удобнее, чем рассчитывать, что длинная общая переписка донесёт всё необходимое. В описании задания укажите, какие сведения нужно использовать, а в expected_output задайте форму ответа.

Требования, установка и структура проекта

CrewAI требует Python 3.10–3.13: Python 3.14 не входит в поддерживаемый диапазон. Для командной строки используется uv, инструмент управления Python-окружениями и пакетами. Установка CLI и зависимости конкретного проекта находятся в разных окружениях.

Установка CLI и создание командыBash
uv tool install crewai
crewai create crew support-crew
cd support_crew
crewai install

Генератор создаёт JSONC-проект: agents/*.jsonc хранит настройки агентов, crew.jsonc описывает задачи и команду, .env содержит ключи. JSONC похож на JSON, но допускает комментарии. Старый шаблон с crew.py и YAML можно получить через crewai create crew support-crew --classic. Выберите один вариант и следуйте его структуре.

На Windows при ошибке сборки зависимости с C++ могут понадобиться Visual Studio Build Tools с компонентом Desktop development with C++. Если команда не находится после установки, проверьте PATH; uv tool update-shell помогает настроить путь к CLI.

Быстрый старт: агент для обращения клиента

В созданном проекте замените роль и задачу на обработку обращения. Для первого запуска используйте тестовый текст без персональных данных. Настройте ключ провайдера в .env; имя модели выбирайте из доступных вашей учётной записи.

agents/researcher.jsonc: один исполнительJSON
{
  "role": "Специалист поддержки",
  "goal": "Подготовить понятный черновик ответа по тексту обращения",
  "backstory": "Ты уточняешь проблему и не придумываешь правила компании.",
  "settings": {
    "allow_delegation": false,
    "max_iter": 6
  }
}
crew.jsonc: входные данные и ожидаемый результатJSON
{
  "name": "Support draft",
  "agents": ["researcher"],
  "inputs": {"ticket": "После обновления приложение не открывается."},
  "tasks": [
    {
      "name": "draft_reply",
      "description": "Прочитай обращение: {ticket}. Напиши черновик ответа на русском. Не утверждай, что проблема решена.",
      "expected_output": "Краткое описание проблемы, один уточняющий вопрос и вежливый ответ.",
      "agent": "researcher"
    }
  ],
  "process": "sequential"
}
Пример .env и запуск; значения в угловых скобках заменитеBash
# В файле .env:
OPENAI_API_KEY=<ключ-провайдера>
MODEL=openai/<доступная-модель>

# В терминале из каталога проекта:
crewai run

Сверьте ответ с входным обращением. Если агент добавил обещание возврата денег или срок ремонта, которого вы ему не давали, исправьте инструкции и добавьте проверку результата. Успешное завершение команды означает, что процесс отработал; качество ответа оценивается отдельно.

Два агента через Python API

Python API удобен для приложения, которое уже получает обращения из очереди или HTTP-запроса. Пример ниже использует одного автора и одного проверяющего. Он обрабатывает переданный текст и не обращается к CRM или поиску.

Установка SDK в отдельном проектеBash
uv init crew-demo
cd crew-demo
uv add "crewai[openai]" python-dotenv
main.py: черновик и проверка по исходному обращениюPython
import os
from dotenv import load_dotenv
from crewai import Agent, Crew, LLM, Process, Task

load_dotenv()
llm = LLM(model=os.environ["MODEL"])
writer = Agent(
    role="Автор ответа", goal="Понятно ответить на обращение",
    backstory="Ты работаешь только с переданными фактами.",
    llm=llm, allow_delegation=False, max_iter=6,
)
reviewer = Agent(
    role="Проверяющий", goal="Убрать неподтверждённые обещания",
    backstory="Ты сверяешь ответ с исходным обращением.",
    llm=llm, allow_delegation=False, max_iter=6,
)
draft = Task(
    description="Составь ответ на русском по обращению: {ticket}",
    expected_output="Черновик ответа с уточняющим вопросом.", agent=writer,
)
check = Task(
    description="Сверь черновик с обращением {ticket}. Исправь придуманные факты.",
    expected_output="Исправленный ответ без неподтверждённых обещаний.",
    agent=reviewer, context=[draft],
)
result = Crew(
    agents=[writer, reviewer], tasks=[draft, check], process=Process.sequential,
).kickoff(inputs={"ticket": "После обновления приложение не открывается."})
print(result.raw)

Поместите MODEL и ключ в .env, затем выполните uv run python main.py. Контекст задачи check содержит результат draft. Проверяющий получает исходное обращение ещё раз, поэтому может сравнить его с ответом, а не оценивать только стиль.

Структурированный результат для приложения

Свободный текст удобен человеку, но программе нужны поля. Task.output_pydantic задаёт модель Pydantic, то есть схему с типами и проверками. output_json тоже принимает модель схемы. Структура помогает обработать результат без разбора произвольных абзацев.

Фрагмент после создания writer: получить категорию и черновикPython
from pydantic import BaseModel

class TicketResult(BaseModel):
    category: str
    reply_draft: str
    needs_human: bool

structured = Task(
    description="Разбери обращение: {ticket}. Определи категорию и предложи ответ.",
    expected_output="Поля category, reply_draft и needs_human.",
    agent=writer, output_pydantic=TicketResult,
)
result = Crew(agents=[writer], tasks=[structured]).kickoff(
    inputs={"ticket": "Прошу вернуть оплату за заказ."}
)
if result.pydantic is None:
    raise ValueError("Не получен результат нужной структуры")
print(result.pydantic.model_dump())

Схема проверяет типы полей. Для бизнес-правил нужны отдельные проверки: категория входит в разрешённый список, номер заказа существует, возврат действительно доступен. Флаг needs_human, предложенный моделью, не заменяет обязательное правило согласования в вашем приложении.

Инструменты: доступ к данным через функции

Инструмент даёт агенту конкретное действие: прочитать статус заказа, найти документ, вызвать API. Простую Python-функцию можно оформить декоратором @tool. Укажите типы аргументов и понятное описание: по ним модель понимает, когда вызывать функцию.

Учебный инструмент чтения статуса, без подключения к реальной CRMPython
from crewai.tools import tool

@tool("Read order status")
def read_order_status(order_id: str) -> str:
    """Возвращает статус тестового заказа по его идентификатору."""
    statuses = {"DEMO-1": "В обработке", "DEMO-2": "Отправлен"}
    return statuses.get(order_id, "Заказ не найден")

# При создании Agent передайте tools=[read_order_status].

В реальной функции проверьте пользователя и его право читать заказ. Ошибки сети и отсутствие записи возвращайте явно. Для записи в систему лучше отдельный инструмент с ограниченным набором действий, чтобы агент не получал произвольный доступ ко всей базе.

Flow: ветвления, состояние и сохранение

Flow связывает методы Python через события. @start() отмечает начало, @listen() запускает шаг после другого шага, @router() выбирает маршрут. Состояние можно описать Pydantic-моделью. В нём хранятся входные данные, результат Crew и статус проверки.

Самостоятельный Flow без модели: проверить вход и сохранить длинуPython
from pydantic import BaseModel
from crewai.flow.flow import Flow, listen, start

class TicketState(BaseModel):
    ticket: str = ""
    length: int = 0

class TicketFlow(Flow[TicketState]):
    @start()
    def validate(self):
        if not self.state.ticket.strip():
            raise ValueError("Пустое обращение")
        self.state.length = len(self.state.ticket)

    @listen(validate)
    def finish(self):
        return {"length": self.state.length}

print(TicketFlow().kickoff(inputs={"ticket": "Не открывается приложение"}))

Декоратор @persist из crewai.flow.persistence сохраняет состояние; по умолчанию используется SQLite. Для восстановления нужен идентификатор сохранённого процесса. Хранение состояния и защита внешних действий решают разные задачи: повторная попытка шага не должна повторно списывать деньги или создавать одинаковые записи.

Модели, локальный сервер и стоимость запросов

CrewAI подключает провайдеров через LLM. Для OpenAI, Anthropic, Gemini, Azure, Bedrock и Snowflake доступны нативные интеграции с соответствующими дополнительными зависимостями. Другие подключения используют LiteLLM; для них добавляют crewai[litellm]. У разных моделей отличается поддержка инструментов и структурированного ответа.

Для Ollama и совместимых локальных серверов настройте адрес и модель по инструкции подключения. Локальный Python-процесс сам по себе не означает, что данные остаются на компьютере: выбранный провайдер модели, поиск и инструменты могут отправлять их наружу.

Стоимость запуска складывается из всех обращений к модели, повторных попыток, поиска и дополнительных сервисов. Ограничьте max_iter, max_execution_time и max_rpm у агентов. Измеряйте расходы на законченную заявку: дешёвый отдельный ответ ещё не означает дешёвый процесс из нескольких этапов.

Память агента и источники знаний

Memory хранит сведения, которые пригодятся в дальнейшей работе. В текущем API это единый класс: при сохранении модель помогает определить область, категории и значимость записи; поиск учитывает смысловую близость, давность и важность. Memory можно использовать отдельно, с Agent, Crew или внутри Flow.

Запомнить решение и найти его по смыслуPython
from crewai import Memory

memory = Memory()
memory.remember("Для базы заказов выбрали PostgreSQL.")
for match in memory.recall("Где храним заказы?", limit=3):
    print(match.record.content)

Knowledge даёт агенту справочные материалы. Поддерживаются источники из строк и файлов; для файлов используется каталог knowledge. Этот слой полезен для регламентов и инструкций. Память о прошлых действиях и утверждённые документы лучше хранить раздельно, чтобы случайный вывод модели не превратился в правило компании.

RAG означает поиск подходящих фрагментов перед ответом модели. Для сложных PDF и сканов сначала подготовьте текст и структуру. Обзоры Docling и MinerU в блоке связанных материалов помогают выбрать обработчик документов. CrewAI управляет дальнейшими действиями агента, а качество исходного текста остаётся отдельной задачей.

MCP и подключения к внешним сервисам

MCP, Model Context Protocol, задаёт общий способ подключать инструменты внешних серверов к агенту. В CrewAI есть поле mcps для простых ссылок и структурированных конфигураций. Поддерживаются локальный транспорт stdio и сетевые HTTP/SSE-подключения; можно фильтровать доступные инструменты.

Подключение MCP-сервера добавляет возможности, которые этот сервер предоставляет. Проверьте список действий, способ авторизации и маршрут передачи данных. Для чтения базы знаний обычно достаточно поиска и получения документа; доступ на удаление записей такому помощнику не нужен.

Интеграции AMP с корпоративными приложениями относятся к отдельной платформе. Наличие логотипа сервиса на сайте не означает, что локальная установка CrewAI сразу получает готовое соединение с вашей учётной записью.

Проверки результата и участие человека

Task.human_input позволяет запросить проверку человеком перед завершением задачи. Для собственного интерфейса и длительных процессов рассмотрите механизмы human-in-the-loop в Flow: место остановки и способ продолжения нужно связать с вашим приложением.

Guardrails проверяют результат задачи и могут отклонить ответ, который не соответствует требованиям. Они полезны для формата и проверяемых условий. Важные решения лучше проверять по рабочим данным: например, разрешение возврата взять из заказа, а не из уверенного ответа другого агента.

  • Задайте обязательные поля результата и список разрешённых категорий.
  • Перед записью в CRM проверьте права и наличие исходной записи.
  • Действия, которые требуют согласования по правилам компании, останавливайте независимо от ответа модели.
  • Сохраняйте причину отказа проверки, чтобы исправлять конкретный шаг.

Как проверять качество и находить ошибки

Команда crewai test запускает Crew несколько раз и выводит показатели. Количество повторов задаётся через --n-iterations или -n; старый --n_iterations устарел. Оценивание тоже обращается к модели. Такие оценки удобно дополнять собственными проверками результата.

Проверить команду несколько раз из каталога проектаBash
crewai test --n-iterations 3

Составьте небольшой набор обращений: обычное, неполное, с неизвестным номером заказа и с противоречивыми данными. Сравнивайте ответ с ожидаемыми фактами и фиксируйте стоимость. Для инструментов отдельно проверьте ошибку API и повторный вызов; это часто объясняет проблему лучше общей оценки текста.

Локальный запуск и платформа CrewAI AMP

Открытый фреймворк запускается в вашем Python-окружении и встраивается в собственный сервис. Понадобятся способ запуска задач, хранение состояния и результатов, журнал ошибок и управление ключами. Flow помогает организовать шаги, а приложение отвечает за приём запросов и доступ пользователей.

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

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

Телеметрия и передача данных

CrewAI собирает техническую телеметрию использования. Согласно её описанию, по умолчанию промпты, ответы, ключи и данные задач в неё не включаются. share_crew расширяет состав отправляемых сведений. Трассировку AMP и собственные интеграции наблюдаемости настройте отдельно.

Настройка в .env для отключения телеметрии CrewAIBash
CREWAI_DISABLE_TELEMETRY=true

Отключение телеметрии не отключает модель или сетевые инструменты. Чтобы процесс работал в закрытом контуре, проверьте каждое подключение: модель, хранилище, поиск, MCP и сбор логов. Именно эти настройки определяют, куда уходят данные заявки.

Лицензия MIT и ограничения применения

Код CrewAI распространяется по MIT. Его можно использовать, менять и включать в коммерческие приложения; при распространении сохраняются уведомление об авторских правах и текст лицензии. Гарантии работоспособности лицензия не предоставляет. У AMP, моделей и сторонних сервисов действуют собственные условия.

  • Команда агентов не гарантирует верные факты. Ошибка первого шага может перейти в итоговый документ.
  • Большой контекст, делегирование и повторные попытки увеличивают время и стоимость обработки.
  • Сохранённое состояние не заменяет защиту внешних действий от повторного исполнения.
  • Поддержка локальной модели зависит от её возможностей, особенно вызова инструментов.
  • Ключи, разрешения и разделение данных пользователей остаются частью вашего приложения.

CrewAI, LangGraph или Microsoft Agent Framework

С какого подхода начать выбор фреймворка
ИнструментГлавный подходКогда рассмотреть
CrewAIРоли, задачи, команды; Flow задаёт общий процессРаботу удобно разделить между понятными исполнителями
LangGraphГраф шагов с состоянием и управляемыми переходамиНужны циклы, точные ветвления и восстановление исполнения
Microsoft Agent FrameworkАгенты и типизированные workflows для Python и .NETПриложение связано с .NET или инфраструктурой Microsoft

Для выбора соберите один и тот же короткий процесс: входная заявка, получение данных и проверенный черновик. Оцените, где понятнее хранится состояние, как перезапустить неудачный шаг и сколько кода требует интеграция. Подробные обзоры LangGraph и Microsoft Agent Framework открываются из таблицы альтернатив ниже.

Альтернативы CrewAI

Инструменты для похожих задач
ИнструментДля чего подходит
LangGraphЯвный граф исполнения с состоянием, контрольными точками и остановками для человека.
Microsoft Agent FrameworkАгенты и workflows для Python и .NET, интеграции с Microsoft Foundry и другими провайдерами.

Полезные ссылки