Контекст переполняется — нужно уметь сжимать
«The agent can forget strategically and keep working forever.» Стратегическое забвение — это инженерная возможность.
Зачем нужен compact?
После долгой работы агента messages[] раздувается: каждый read_file возвращает несколько тысяч токенов, каждый bash — сотни, плюс текст рассуждений модели каждый раунд. За 50 итераций контекст легко достигает 100K+. Два последствия:
- Достижение лимита модели: при превышении размера окна агент падает, или каждый API-вызов становится дороже линейно.
- Размывание внимания: текущая задача тонет в tool_result из 30 раундов назад, модель начинает «уходить в сторону».
Подход s06: агент активно забывает неважное, сохраняя ключевое состояние. Три уровня — от лёгкого к тяжёлому.
Уровень 1 · micro_compact (работает тихо каждый раунд)
Самый дешёвый уровень. Перед каждым LLM-вызовом заменяет tool_result старше трёх последних на заполнитель:
# Начиная с 10-го раунда большинство tool_result становятся: { "type": "tool_result", "tool_use_id": "toolu_01A", "content": "[Previous: used bash]" # с тысяч символов до нескольких десятков }
Исключение: результаты read_file не сжимаются. Почему? Их вывод — это справочный материал; если сжать, модели придётся перечитывать файл, что в итоге дороже.
PRESERVE_RESULT_TOOLS = {"read_file"} # никогда не сжимать
Наблюдайте, как micro_compact поглощает старые результаты шаг за шагом
Ниже пошаговая симуляция 10 итераций взаимодействия — перед каждой запускается micro_compact. Наблюдайте, как старые tool_result превращаются в [Previous: ...], а последние три остаются нетронутыми.
Уровень 2 · auto_compact (срабатывает по порогу)
Даже при постоянно работающем micro накопленный объём в итоге превысит предел. В s06 задан порог (по умолчанию 50000 токенов):
- Оценить количество токенов через
len(str(messages)) // 4(грубо, но достаточно). - При превышении порога — записать transcript на диск в
.transcripts/transcript_TIMESTAMP.jsonl(для архива). - Попросить LLM написать summary всего диалога.
- Полностью заменить
messagesодной строкой"[compressed] SUMMARY...".
Цена очевидна: теряются конкретные вывод инструментов и тон диалога, остаётся лишь выжимка. Но агент может продолжать работу — это главный выигрыш.
Уровень 3 · модель сама вызывает инструмент compact
auto_compact срабатывает автоматически — модель об этом не знает. Уровень 3 наоборот: дать модели инструмент compact, чтобы она сама запрашивала сжатие — например, когда чувствует, что предыдущее исследование уже не нужно и начинается новый этап.
Вызов модели:
tool_use("compact", focus="keep the API design decisions")
Срабатывает так же, как auto, но принимает параметр focus — подсказывает, что важно сохранить при суммаризации. На практике очень полезно: модель лучше знает, какие задачи «уже завершены», и точнее, чем эвристика harness.
Какой уровень подходит? Тест-вопросы
Несколько сценариев — определите, какой уровень срабатывает логичнее: micro / auto / manual.