Observability для AI-агентов: как Dunetrace ловит тихие сбои в реальном времени
AI-агенты ломаются тихо — тратят токены в циклах, теряют цель, отвечают без данных. Dunetrace запускает 15 поведенческих детекторов на каждом прогоне и алертит в Slack до того, как пользователь заметит проблему.
Агенты ломаются молча
У классического софта есть понятный сигнал о сбое: исключение, crash, HTTP 500. У AI-агента такого сигнала нет. Агент возвращает уверенный ответ — и ты не знаешь, что по пути он вызвал один и тот же инструмент 8 раз, раздул контекст в 5 раз и проигнорировал результаты поиска с нулевой релевантностью.
Это тихий сбой (silent failure) — ситуация, когда агент технически работает, но поведенчески деградирует. Пользователь получает ответ. Только ответ хуже, дороже и медленнее, чем должен быть. Чем сложнее агентная система, тем больше таких невидимых потерь.
Dunetrace: 15 детекторов поведенческих сбоев
Dunetrace — open-source инструмент, который подключается к агенту через callback и анализирует каждый прогон в реальном времени. Архитектура: SDK встраивается в процесс агента, хэширует весь текст SHA-256, отправляет структурные метрики на локальный сервер, а тот прогоняет через 15 детекторов.
Что конкретно ловят детекторы
CRITICAL: PROMPT_INJECTION_SIGNAL — входные данные совпадают с известными паттернами инъекций.
HIGH (немедленное внимание):
- TOOL_LOOP — один и тот же инструмент вызван 3+ раза в окне из 5 вызовов
- TOOL_THRASHING — агент чередует ровно два инструмента (не исследование — застревание)
- LLM_TRUNCATION_LOOP — модель возвращает finish_reason=length два и более раз; контекст переполнен
- RETRY_STORM — один инструмент падает 3+ раза подряд; агент не переключается на альтернативу
- EMPTY_LLM_RESPONSE — пустой ответ с finish_reason=stop
- CASCADING_TOOL_FAILURE — 3+ последовательных ошибки в 2+ разных инструментах
MEDIUM (деградация качества):
- SLOW_STEP — вызов инструмента > 15 сек или LLM > 30 сек
- TOOL_AVOIDANCE — финальный ответ без единого вызова доступного инструмента
- GOAL_ABANDONMENT — инструменты перестали вызываться, затем 4+ последовательных LLM-вызова без выхода
- RAG_EMPTY_RETRIEVAL — retrieval вернул 0 результатов или релевантность < 0.3, но агент дал ответ
- CONTEXT_BLOAT — prompt tokens выросли в 3× от первого до последнего LLM-вызова
- STEP_COUNT_INFLATION — прогон использовал > 2× медианного числа шагов (P75 по последним 50 успешным)
- FIRST_STEP_FAILURE — ошибка или пустой вывод на шаге ≤ 2
- REASONING_STALL — соотношение LLM:tool-call ≥ 4×; агент «думает», но не действует
Как подключить: 4 строки кода
Для LangChain/LangGraph: импортировать DunetraceCallbackHandler, создать экземпляр Dunetrace, передать callback при вызове агента через config={"callbacks": [callback]}, вызвать dt.shutdown() по завершении.
Для агентов без фреймворка — ручная обвязка через контекстный менеджер: run.llm_called(), run.tool_called(), run.final_answer().
Деплой: docker compose up -d. Дашборд на порту 3000, API — на 8002, SDK-инжест — на 8001.
Приватность: SHA-256 до выхода из процесса
Весь текст (промпты, ответы, аргументы инструментов) хэшируется SHA-256 прямо внутри процесса. На сервер уходят только хэши и структурные метрики: токены, latency, finish_reason, success/failure.
Это принципиально отличает Dunetrace от LangSmith, Langfuse или Arize, где raw traces передаются на внешний сервер. Для команд с strict data residency требованиями — реальный аргумент.
Detect vs. Prevent: открытый вопрос
Dunetrace сознательно придерживается подхода «detect, not prevent» — алертит, но не вмешивается в прогон. Для продакшна одного detect может быть мало: когда TOOL_LOOP сжигает $2 в токенах за 30 секунд, алерт в Slack — запоздалая мера. Логичная эволюция — опциональный circuit breaker при HIGH-детекции.
Что Dunetrace не покрывает
- Качество ответа — структурные аномалии ловятся, семантическая деградация — нет
- Мультиагентные каскады — каждый прогон анализируется изолированно
- Стоимость в долларах — токены считаются, конвертация в $$ отсутствует
Практические рекомендации
- Подключите к staging-среде — дашборд покажет, сколько прогонов попадают в TOOL_LOOP или CONTEXT_BLOAT
- Настройте пороги под свою специфику — дефолтный 3× для CONTEXT_BLOAT может быть нормой для RAG-агента
- Комбинируйте с eval-фреймворками — Dunetrace (runtime) + deepeval/ragas (quality) = полная картина
- Следите за STEP_COUNT_INFLATION — самый информативный детектор долгосрочной деградации
Итого
Dunetrace решает конкретную и болезненную проблему: AI-агенты ломаются тихо, а существующие инструменты заточены на постмортем-дебаг. 15 поведенческих детекторов, privacy-first архитектура, 4 строки интеграции — прагматичный инструмент для команд, которые запускают агентов в продакшн.
- observability
- AI-агенты
- LangChain
- Dunetrace
- мониторинг
- open source
- LLM
- silent failures