Неограниченная история диалога может переполнить контекст

Симптом

Во время тестирования агент внезапно начал завершать каждый запрос ошибкой LLMResponseError: No choices in OpenRouter response.

Контекст

Чтобы разобраться в сбое, мы добавили логирование и при этом перезапустили процесс. После перезапуска агент снова заработал. Само логирование не могло исправить ответы OpenRouter, зато перезапуск очистил состояние, жившее только в памяти процесса: историю текущего диалога. Такое хранение было частью архитектуры, а не ошибкой само по себе.

Поскольку очистка истории совпала с восстановлением, основной гипотезой стало переполнение контекстного окна модели. Восстановление после перезапуска - сильный сигнал, но само по себе оно не доказывает диагноз.

Вероятная причина

В базовом каркасе контроль контекстного окна был реализован лишь частично. Объём контекста, извлекаемого из памяти, ограничивался, но активная история диалога могла расти бесконтрольно. Этот пробел согласуется с тем, что после очистки истории агент восстановился.

Ошибочное предположение

Мы предполагали, что готовый каркас уже учитывает это базовое ограничение. В предыдущем продукте управление контекстом было заложено с самого начала, а этот каркас не предусматривал длинные диалоги.

Исправление

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

Общий вывод

Ограничение только для контекста из памяти не ограничивает итоговый запрос к модели. Бюджет должен учитывать и активную историю диалога.