Контрактные тесты для LLM-провайдеров: что гонять ежедневно
Контрактные тесты для LLM-провайдеров помогают вовремя ловить сбои в формате ответа, причине остановки, лимитах и структурированном выводе.

Где интеграция ломается без явной ошибки
Проблемы с LLM редко начинаются с честной ошибки 500. Намного чаще все выглядит почти нормально: запрос проходит, модель отвечает, а пайплайн разваливается на мелочи. Именно такие сбои дольше всего живут в проде, потому что сначала их принимают за шум.
Самый частый пример - один и тот же промпт возвращает разный JSON. Вчера нужное поле лежало в message.content, сегодня часть данных приехала в другом виде, с пустым массивом, другой вложенностью или лишним служебным блоком. Человек разницу почти не заметит. Парсер заметит сразу.
Есть и другой тихий сбой: меняется причина остановки ответа. Код ждет обычный stop, а получает length, content_filter или внутренний отказ. В интерфейсе это выглядит как короткий ответ. В сервисе это уже сломанные ретраи, неверные статусы задач и кривая аналитика.
С лимитами токенов история еще неприятнее. Команда думает, что модель