Сжатие контекста¶
Чем длиннее сессия, тем больше контекста накапливает модель: ваши запросы, ответы агента и выводы инструментов. Чтобы не упереться в лимит токенов, CLI заменяет старую часть истории компактным резюме — этот процесс называется сжатием (компакцией) контекста.
Бюджет контекста¶
Перед каждым запросом к модели — включая повторные попытки и сам запрос сжатия — CLI проверяет собранный запрос на соответствие бюджету контекста. В бюджет входят входные токены и резерв на вывод модели (по умолчанию 8192 токена либо заданный лимит вывода запроса).
Лимит контекста берётся из метаданных модели.
Если метаданных нет, кастомные модели получают лимит 200 000 токенов, остальные — 30 000.
Своё ограничение можно задать командой /maxcontext: оно действует между лимитом по умолчанию и жёстким максимумом модели.
Подсчёт токенов экономный:
- для неизменной части запроса используется последнее подтверждённое провайдером число входных токенов плюс локальная оценка только добавленных сообщений;
- удалённый подсчёт токенов применяется лишь когда локальная оценка приближается к лимиту;
- если оценка превышает лимит в 2,5 раза, запрос отклоняется сразу — без подсчёта и попытки сжатия.
Когда запускается сжатие¶
Сжатие бывает автоматическим и ручным.
Автоматическое сжатие становится нужным, когда завершившийся ответ модели сообщил входное использование не меньше лимит − 40 000 токенов.
Для моделей с окном 40 000 токенов и меньше порог составляет 75 % лимита.
Токены вывода и ожидающие результаты инструментов в этот порог не входят.
Перед следующим запросом CLI сжимает подтверждённую старую часть истории — ту, которая реально отправлялась в последнем успешном запросе. Последний ответ модели, его вызовы и результаты инструментов, а также новые сообщения сохраняются дословно вне резюме.
Ручное сжатие запускается командой /compress (алиас /summarize) независимо от порога.
Что видит пользователь
Во время сжатия CLI показывает сообщение о сжатии истории.
После завершения отображается, сколько токенов было до и после; оценки помечаются знаком ≈.
Уведомление объясняет, что последний ответ и новые данные сохранены.
Как работает сжатие¶
Сжатие выполняется одним запросом к модели — без разбиения на части, проверочного прохода и рекурсивного слияния:
- Подсчёт токенов. CLI определяет размер текущей истории для выбранной модели.
- Разделение истории. Автоматическое сжатие заменяет только подтверждённый старый префикс; последний ответ и всё, что добавилось после него, остаются без изменений. Ручное сжатие может забрать в резюме всю историю.
- Генерация снимка. Модель получает сжимаемую часть истории и формирует снимок состояния объёмом до 1000 слов (см. ниже). Последний запрос пользователя дополнительно вставляется в снимок дословно.
- Проверка результата. Новая история должна помещаться в лимит модели вместе с сохранённым хвостом и резервом на вывод. Ручное сжатие дополнительно требует сократить контекст до 70 % лимита; автоматическому достаточно уложиться в 100 %.
Если запрос сжатия не удался (слишком большой вход, ошибка модели, отмена), исходная история сохраняется без изменений — её можно сжать вручную позже. Постоянной блокировки нет: следующая попытка доступна сразу.
Какая модель сжимает?
Снимок генерирует текущая модель сессии. На большой истории сжатие может занять заметное время.
Исключение: слишком много новых данных
Если только новые сообщения занимают больше половины лимита контекста, а полный запрос переполняет бюджет, CLI останавливается с ошибкой лимита контекста без попытки сжатия.
В этом случае поможет /clear или более компактный запрос.
Что попадает в снимок¶
Снимок оформляется как XML-структура <state_snapshot> и становится единственной памятью агента о сжатой части диалога.
Модель включает в него:
- текущие цели и последний запрос пользователя;
- требования, ограничения и критерии готовности;
- принятые решения и их причины;
- выполненную работу, изменения кода и значимые пути файлов;
- результаты проверок, ошибки и блокеры;
- незавершённую работу и следующие шаги.
Снимок отличает подтверждённые результаты от предположений и планов, сохраняет актуальные сведения из предыдущих снимков и не добавляет фактов, которых нет в истории.
Ручное сжатие¶
Команда /compress полезна, когда сессия длинная и контекст приближается к лимиту:
Отличия от автоматического сжатия:
- запускается сразу, без проверки порога;
- может сжать всю историю — «хвост» из недавних сообщений не сохраняется;
- требует, чтобы результат занял не больше 70 % лимита модели, иначе сообщает о неудаче.
Настройка¶
Автоматическое сжатие включается и выключается настройкой autoCompressContext в settings.json (по умолчанию true).
При отключении остаются ручное /compress и защита бюджета контекста: запрос, который не помещается в лимит, по-прежнему не отправляется.
Порог автоматического сжатия фиксирован и не настраивается.
Устаревший ключ chatCompression.contextPercentageThreshold больше не управляет порогом — см. конфигурацию.
Ограничения¶
- Сжатие нельзя запустить повторно, пока не завершилось предыдущее.
- Если запрос отменён, сжатие прерывается вместе с ним, и история не меняется.
- Снимок — это резюме: часть деталей диалога теряется.
Если важные инструкции нужно сохранить дословно, повторите их после сжатия или зафиксируйте в файле памяти проекта (
KODA.md/AGENTS.md). - В ACP-режиме сжатие доступно через метод
session/compact, а ход сжатия сообщается уведомлениемcontext_compaction_update. Та же политика применяется в CLI и у субагентов.