Сжатие контекста¶
Чем длиннее сессия, тем больше контекста накапливает модель: ваши запросы, ответы агента и выводы инструментов. Чтобы не упереться в лимит токенов, CLI заменяет старую историю компактным резюме — этот процесс называется сжатием (компакцией) контекста.
Когда запускается сжатие¶
Сжатие бывает автоматическим и ручным.
Автоматическое выполняется перед отправкой каждого запроса в модель. CLI подсчитывает токены текущей истории и сравнивает их с лимитом модели:
- если занято меньше 50 % лимита — ничего не происходит;
- если порог достигнут — история сжимается до отправки запроса.
Ручное запускается командой /compress (алиас /summarize).
В этом случае сжатие выполняется независимо от порога.
Что видит пользователь
Во время сжатия CLI показывает сообщение о сжатии истории. После завершения отображается, сколько токенов было до и после.
Как работает сжатие¶
Сжатие выполняется по шагам:
- Подсчёт токенов. CLI запрашивает точное число токенов в текущей истории для выбранной модели.
- Обрезка выводов инструментов. Выводы инструментов суммарно укладываются в бюджет 50 000 токенов. Самые свежие выводы сохраняются полностью, а более старые, выходящие за бюджет, обрезаются до последних 30 строк с пометкой об усечении.
- Разделение истории. Последние ~30 % истории остаются без изменений — это недавний контекст, с которым агент работает прямо сейчас. Всё, что старше, попадает в резюме.
- Генерация снимка. Модель получает сжимаемую часть истории со специальной системной инструкцией и формирует структурированный снимок состояния (см. ниже).
- Проверка снимка. Модель критически оценивает свой же снимок: если важные детали потеряны, выпускает улучшенную финальную версию. В снимок дополнительно вставляется последний запрос пользователя — дословно.
- Замена истории. Новая история состоит из снимка и сохранённого «хвоста». Перед заменой CLI проверяет результат: сжатая история не должна занимать больше токенов, чем исходная (при ручном запуске это условие не применяется), и не должна превышать лимит модели.
Если хотя бы один шаг завершается неудачно (пустая история, не удалось подсчитать токены, снимок получился пустым), история остаётся без изменений.
Какая модель сжимает
Снимок генерирует текущая модель сессии. На большой истории сжатие может занять заметное время — выполняются два полных запроса к модели.
Что попадает в снимок¶
Снимок оформляется как XML-структура <state_snapshot> и становится единственной памятью агента о сжатой части диалога.
В него входят:
| Раздел | Содержимое |
|---|---|
overall_goal |
Основная цель пользователя одной фразой |
key_knowledge |
Ключевые факты, соглашения и ограничения (команды сборки, эндпоинты и т. п.) |
file_system_state |
Какие файлы созданы, прочитаны, изменены или удалены, и важные выводы о них |
recent_actions |
Последние значимые действия агента и их результаты |
current_plan |
Пошаговый план с отметками о выполненных шагах |
latest_user_request |
Последний запрос пользователя — дословно или почти дословно |
Если в истории уже был предыдущий снимок, модель не пишет его заново, а обновляет: переносит в новый снимок актуальные детали из старого и дополняет свежими событиями.
Ручное сжатие¶
Команда /compress полезна, когда сессия длинная и контекст приближается к лимиту:
Отличия от автоматического сжатия:
- запускается сразу, без проверки порога;
- сжимается вся история — «хвост» из недавних сообщений не сохраняется;
- результат применяется, даже если токенов стало не меньше, — при условии, что новая история укладывается в лимит модели.
Настройка порога¶
Порог автоматического сжатия задаётся параметром chatCompression.contextPercentageThreshold в settings.json — долей от 0 до 1:
- Значение по умолчанию —
0.5(50 % лимита модели). - Меньшее значение — сжатие происходит чаще, но контекст всегда остаётся «свежим».
- Большее значение — сжатие происходит реже, но ближе к лимиту модели.
Подробнее о файлах настроек — в конфигурации.
Ограничения¶
- Сжатие нельзя запустить повторно, пока не завершилось предыдущее.
- Если запрос отменён, сжатие прерывается вместе с ним, и история не меняется.
- Снимок — это резюме: часть деталей диалога теряется.
Если важные инструкции нужно сохранить дословно, повторите их после сжатия или зафиксируйте в файле памяти проекта (
KODA.md/AGENTS.md). - В ACP-режиме сжатие доступно через метод
session/compact, а ход сжатия сообщается уведомлениемcontext_compaction_update.