langchain-core, поэтому инструментирование одного инструментирует другое.
Установка
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 сеанса разрешается в этом порядке, первое совпадение побеждает:instrument("langchain", session_id=...)config={"metadata": {"failproofai_sdk_session_id": ...}}- Охватывающая область
failproofai_sdk.session() metadata["session_id"],metadata["conversation_id"]илиmetadata["thread_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 и пользовательские агенты.

