Агент может дать связный и убедительный ответ, при этом сфабриковав цифры — просто потому что вызванный инструмент вернул пустой результат. Именно такую ситуацию обнаружила команда AWS при разработке тестового агента для поиска туристической информации на базе Strands Agents SDK и Amazon Bedrock: агент иногда выдавал подозрительно точные числа там, где данных не было вовсе.
Проблема системная. Стандартное тестирование программного обеспечения проверяет, совпадает ли вывод с ожидаемым. Для ИИ-агентов, которые самостоятельно выбирают инструменты и выстраивают последовательность операций, этого недостаточно. Агент может прийти к правильному выводу, пропустив обязательные шаги верификации. Он может вызвать нужный инструмент с неверными параметрами. Эти сбои не видны на поверхности финального ответа — их можно обнаружить только анализируя трейс выполнения целиком.
| Фаза | Команда | Что делает |
|---|---|---|
| Plan | /evalkit.plan | Читает код агента, формирует план оценки с метриками |
| Data | /evalkit.data | Генерирует тест-кейсы с входными данными и ожидаемыми результатами |
| Trace | /evalkit.trace | Добавляет OpenTelemetry-трассировку; автоопределяет фреймворк |
| Run agent | /evalkit.run_agent | Прогоняет агента по тест-кейсам, сохраняет структурированные трейсы |
| Eval | /evalkit.eval | Реализует метрики как код и запускает их против трейсов |
| Report | /evalkit.report | Формирует приоритизированные рекомендации с указанием мест в коде |
Agent-EvalKit решает именно эту задачу. Тулкит распространяется под лицензией Apache 2.0 и встраивается в существующую среду разработки через ИИ-ассистентов — Claude Code, Kiro CLI или Kilo Code. Разработчик описывает цели оценки на естественном языке, а ассистент берёт на себя всю инфраструктурную работу: читает исходный код агента, генерирует тест-кейсы, инструментирует агент трассировкой, прогоняет тесты и формирует отчёт.
Работа организована в шесть фаз — от анализа кода и генерации тест-кейсов до сбора трейсов и финального отчёта с рекомендациями.

Работа организована в шесть последовательных фаз, каждая из которых вызывается slash-командой. Фаза `/evalkit.plan` анализирует определения инструментов, системный промпт и конфигурацию фреймворка, формируя план оценки с конкретными метриками. Фаза `/evalkit.data` генерирует тест-кейсы с входными данными и ожидаемыми результатами — либо создаёт их с нуля, либо использует уже существующие данные из продакшн-логов. Фаза `/evalkit.trace` добавляет OpenTelemetry-совместимую трассировку; для Strands, LangGraph и CrewAI инструментация применяется автоматически после определения фреймворка. Фаза `/evalkit.run_agent` прогоняет агента по каждому тест-кейсу и сохраняет структурированный трейс с историей вызовов инструментов, ответами модели и промежуточным состоянием. Фаза `/evalkit.eval` реализует метрики в виде исполняемого кода и запускает их против собранных трейсов, используя DeepEval или Strands Evals SDK. Финальная фаза `/evalkit.report` анализирует паттерны по всем тест-кейсам и выдаёт приоритизированные рекомендации с указанием конкретных строк кода и ожидаемым эффектом от каждого исправления.
Выбор метрик в Agent-EvalKit отражает реальную сложность оценки агентов. Три ключевых измерения — faithfulness (соответствие ответа тому, что реально вернули инструменты), корректность вызовов инструментов (нужные инструменты с правильными параметрами) и качество финального вывода — не коррелируют между собой и должны проверяться независимо. Для этого тулкит комбинирует два подхода: code-based evaluators дают быстрые воспроизводимые результаты, но штрафуют за валидные вариации; LLM-as-judge обеспечивает нюансированную оценку ценой дополнительного инференса. Большинство эффективных стратегий оценки используют оба.
Главное отличие Agent-EvalKit от автономных платформ оценки — то, что весь процесс происходит внутри среды разработки. Тот же ассистент, который помогает писать агента, помогает его тестировать. Артефакты каждой фазы сохраняются в директории `eval/` и служат входными данными для следующей. Любую фазу можно перезапустить с другими инструкциями, не перестраивая весь пайплайн с нуля — например, сместить фокус с общей точности на галлюцинации при пустых ответах инструментов.



