Skip to main content
Один адаптер подходит для обоих. LangGraph работает на менеджере обратных вызовов langchain-core, поэтому инструментирование одного инструментирует другое.

Установка

Для LangChain без LangGraph используйте failproofai-sdk[langchain]. Поддерживается: langchain-core 1.4.7 до 2.0, langgraph 1.2 до 2.0. За пределами этого диапазона адаптер всё ещё устанавливается и выдаёт предупреждение один раз.

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

instrument() регистрирует трассировщик через langchain_core.tracers.context.register_configure_hook. LangChain внедряет его в каждый менеджер обратных вызовов, который он создаёт, поэтому графы, инструменты и модели захватываются без изменения точки вызова — включая те, которые находятся внутри библиотек, которые вы не писали.

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

Узел становится хуком, а не вложенным агентом. agent_id является основным аспектом на каждой поверхности панели инструментов — повышение retrieve, grade_documents и should_continue до агентов было бы перегруженным и помечало бы сеанс по тому узлу, который произошёл первым. Диапазоны хуков отображаются так же и по-прежнему дают вам вид задержки для каждого узла.
Называйте ваши узлы как угодно. Запуск узла идентифицируется по его форме — нелистовой запуск, несущий собственный шаг LangGraph — никогда по его имени.
Назвать узел в честь того, что он запускает, раньше заставляло события этого объекта исчезнуть. Теперь это больше не происходит.

Потоковая передача

.stream() и .astream() не генерируют события для каждого токена. Они встроены в завершающий model_response:

Подсчёт токенов на потоковом ответе

Отдельный вопрос и легко упустить: OpenAI отправляет использование на потоковом ответе только при запросе.
Адаптер записывает то, что фреймворк ему передал. Без этого флага нечего записывать, и model_response приходит без подсчёта токенов.

Пример

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

По умолчанию корневой диапазон принимает имя самого графа. Оберните его, чтобы получить выбранную вами метку:
Для многоагентных настроек вложите области. Каждый рабочий становится дочерним диапазоном с parent_id:
Держите agent_id низкой мощности. Используйте роль или имя узла, никогда UUID или строку для каждого запуска.

Контролируйте сеанс

ID сеанса разрешается в этом порядке, первое совпадение побеждает:
  1. instrument("langchain", session_id=...)
  2. config={"metadata": {"failproofai_sdk_session_id": ...}}
  3. Охватывающая область failproofai_sdk.session()
  4. metadata["session_id"], metadata["conversation_id"] или metadata["thread_id"]
  5. ID корневого запуска
Он никогда не генерируется с нуля, потому что синтезированный ID разбивает один запуск на несколько сеансов.

Опции

Установите capture_content=False для регулируемых данных. Структура, синхронизация, подсчёт токенов, имена инструментов и результаты по-прежнему записываются; тела сообщений нет. include_chains применяется только к вложенным запускам. Запускаемый, который вы вызываете на верхнем уровне, является корнем сеанса, поэтому он становится диапазоном агента, а не парой хуков, и название его здесь не имеет эффекта.

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

interrupt() производит четыре события, и ни одна пара не является избыточной:
human_wait в human_input содержит подсказку и ответ (оба исключены под capture_content=False, наряду с источниками документов ретривера — количество документов сохраняется). agent_pause в agent_resume — единственная пара, которая подаёт время паузы, поэтому без неё десятиминутное ожидание человека будет учтено как активное время агента. Корневой диапазон остаётся открытым на протяжении разрыва, удерживая оба вызова в одном сеансе.

Частые проблемы

create_react_agent распространяет исключение. Чтобы позволить модели увидеть отказ и продолжить, постройте узел инструмента явно:
Отказ записывается как tool_result с ошибкой в любом случае. Это только решает, выживает ли запуск после этого.
Прямой llm.invoke() вне любого графа не имеет родительского запуска, поэтому он открывает корневой диапазон и генерирует внутри него пару моделей. Панель инструментов размещает листья открытому агенту, поэтому диапазон намеренный. Назовите его:
Вы передали обработчик Failproof в config={"callbacks": [...]}, а также вызвали instrument(). Удалите его. Хук конфигурации уже охватывает каждый менеджер обратных вызовов в процессе.
Это неправда. LangGraph вызывает GraphInterrupt по тому же пути, что и реальное исключение, поэтому каждая пауза достигает трассировщика как обратный вызов ошибки. Любой подкласс GraphBubbleUp вместо этого рассматривается как поток управления, поэтому одобрение не окрашивает красную ошибку.
Проверьте в этом порядке: instrument() запустился перед выполнением графа; вокруг вызова стоит with failproofai_sdk.session():; FAILPROOFAI_SDK_STRICT=1 установлен, поэтому деградированный хук вызывает исключение вместо поглощения.

Далее

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

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

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

Проследите причинность через захваченный сеанс.

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

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