Skip to main content

title: “CrewAI” sidebarTitle: “CrewAI” description: “Оркестрируйте команды, потоки, агентов по ролям, инструменты, память и обратную связь от пользователей.” icon: “/images/frameworks/crewai.svg”

Установка

Поддерживается: crewai версии 1.13 до 2.0. 1.13 — это релиз, добавивший started_event_id и нормализовавший использование токенов, на которые полагается адаптер для сопоставления событий и отчётности о токенах.

Инструментирование

instrument() регистрирует слушатель на шине событий CrewAI на уровне модуля и подписывает один обработчик на класс событий. Ничего не меняется в вашей команде, агентах, задачах или инструментах.

Что записывается

Задача ничего не испускает намеренно. Задача CrewAI — это подмножество выполнения агента, который её запускает, поэтому испускание обоих означало бы удвоение каждой строки и отображение их как сиблингов. Вместо этого id и имя задачи находятся на собственных событиях агента. Операции с памятью и знаниями записываются как инструменты, названные по поверхности, которую они затрагивают, поэтому они появляются рядом с вашими реальными инструментами, где вы можете сравнить их латентность. В иерархической команде вложенность делает трассу читаемой:
CrewAI родитель делегированного выполнения на инструментальном событии delegate_work_to_coworker, а не на менеджере напрямую, поэтому адаптер следует этой ссылке. Без неё каждый агент выходит сиблингом каждого другого и структура делегирования теряется.

Пример

Передача видна в трассе: спан analyst закрывается, спан writer открывается, и оба находятся внутри одного спана crew.

Назовите ваши спаны

agent_id происходит из Agent(role=...), что делает его читаемым аспектом панели управления.
agent_id — колонка низкой кардинальности. Роль, содержащая id запуска или отметку времени, деградирует её для каждого запроса, который кто-либо выполняет. Если роль выглядит как id, адаптер отказывает в её использовании и помещает реальное значение в поле полезной нагрузки вместо этого.

Управление сеансом

Разрешается в этом порядке, первое совпадение побеждает:
  1. instrument("crewai", session_id=...)
  2. Охватывающая область failproofai_sdk.session()
  3. Сгенерированный uuid4().hex, один раз на команду или поток
Оберните kickoff, чтобы управлять им за запуск:

Параметры

session_id — единственный параметр, который читает этот адаптер. Подсказки и завершения всегда записываются, усечены до бюджета полезной нагрузки.

Человек в цикле

CrewAI имеет две поверхности человека в цикле, и обе записываются как одни и те же четыре события. @human_feedback на методе потока проходит через шину событий CrewAI: среда выполнения испускает событие перед блокировкой на человеке и другое после ответа. Task(human_input=True) не проходит. Она вызывает input() внутри собственного поставщика входных данных CrewAI и не испускает событие никакого рода, поэтому адаптер оборачивает этого поставщика напрямую — без этого вся ожидание человека было невидимым и учитывалось как активное время агента. В любом случае вы получаете:
agent_pause в agent_resume — единственная пара, которая питает время паузы. Без неё десятиминутное ожидание человека учитывается как десять минут активного времени агента.
CrewAI не устанавливает корреляционный id на события обратной связи от человека, поэтому адаптер сопоставляет их по имени потока и метода, переходя к наиболее недавно открытой паузе. Это корректно, потому что консольный запрос блокирует. Если вы создаёте конкурентного поставщика обратной связи, установите request_id на оба события.
Поскольку путь Task(human_input=True) — это обёртка вокруг поставщика входных данных CrewAI, а не подписка на события, он восстанавливается на uninstrument() и повторно вызывает всё, что вызывает input(), включая KeyboardInterrupt, без изменений.

Общие проблемы

role содержит UUID, отметку времени или суффикс для каждого запуска. Используйте стабильную человеческую роль и поместите id для конкретного запуска в описание задачи вместо этого.
Шина событий асинхронна, и kickoff() возвращает значение перед запуском последних обработчиков. Сначала осушите её:
Это свойство CrewAI, а не SDK.
agent_end принудительно закрывает открытые паузы, но не инструменты или модели, поэтому запуск, который умирает внутри вызова инструмента, оставляет этот спан открытым. Нормальное завершение закрывает всё, что ещё открыто, и помечает его как неполное. Только SIGKILL оставляет его зависшим, потому что ничего не может запуститься.
Проверьте по порядку: instrument() запустился перед kickoff(); есть with failproofai_sdk.session(): вокруг него; crewai версии 1.13 или новее; FAILPROOFAI_SDK_STRICT=1 установлен, поэтому деградированный хук вызывает исключение вместо его подавления.

Далее

Как это работает

Пары, ids, жизненный цикл сеанса и доставка.

Прочитайте трассу

Следите за причинно-следственной связью через сеанс, который вы только что захватили.

Другие фреймворки

LangGraph, LlamaIndex, Pydantic AI и пользовательские агенты.