Перейти к содержанию

Сжатие контекста

Чем длиннее сессия, тем больше контекста накапливает модель: ваши запросы, ответы агента и выводы инструментов. Чтобы не упереться в лимит токенов, CLI заменяет старую часть истории компактным резюме — этот процесс называется сжатием (компакцией) контекста.

Бюджет контекста

Перед каждым запросом к модели — включая повторные попытки и сам запрос сжатия — CLI проверяет собранный запрос на соответствие бюджету контекста. В бюджет входят входные токены и резерв на вывод модели (по умолчанию 8192 токена либо заданный лимит вывода запроса).

Лимит контекста берётся из метаданных модели. Если метаданных нет, кастомные модели получают лимит 200 000 токенов, остальные — 30 000. Своё ограничение можно задать командой /maxcontext: оно действует между лимитом по умолчанию и жёстким максимумом модели.

Подсчёт токенов экономный:

  • для неизменной части запроса используется последнее подтверждённое провайдером число входных токенов плюс локальная оценка только добавленных сообщений;
  • удалённый подсчёт токенов применяется лишь когда локальная оценка приближается к лимиту;
  • если оценка превышает лимит в 2,5 раза, запрос отклоняется сразу — без подсчёта и попытки сжатия.

Когда запускается сжатие

Сжатие бывает автоматическим и ручным.

Автоматическое сжатие становится нужным, когда завершившийся ответ модели сообщил входное использование не меньше лимит − 40 000 токенов. Для моделей с окном 40 000 токенов и меньше порог составляет 75 % лимита. Токены вывода и ожидающие результаты инструментов в этот порог не входят.

Перед следующим запросом CLI сжимает подтверждённую старую часть истории — ту, которая реально отправлялась в последнем успешном запросе. Последний ответ модели, его вызовы и результаты инструментов, а также новые сообщения сохраняются дословно вне резюме.

Ручное сжатие запускается командой /compress (алиас /summarize) независимо от порога.

Что видит пользователь

Во время сжатия CLI показывает сообщение о сжатии истории. После завершения отображается, сколько токенов было до и после; оценки помечаются знаком ≈. Уведомление объясняет, что последний ответ и новые данные сохранены.

Как работает сжатие

Сжатие выполняется одним запросом к модели — без разбиения на части, проверочного прохода и рекурсивного слияния:

  1. Подсчёт токенов. CLI определяет размер текущей истории для выбранной модели.
  2. Разделение истории. Автоматическое сжатие заменяет только подтверждённый старый префикс; последний ответ и всё, что добавилось после него, остаются без изменений. Ручное сжатие может забрать в резюме всю историю.
  3. Генерация снимка. Модель получает сжимаемую часть истории и формирует снимок состояния объёмом до 1000 слов (см. ниже). Последний запрос пользователя дополнительно вставляется в снимок дословно.
  4. Проверка результата. Новая история должна помещаться в лимит модели вместе с сохранённым хвостом и резервом на вывод. Ручное сжатие дополнительно требует сократить контекст до 70 % лимита; автоматическому достаточно уложиться в 100 %.

Если запрос сжатия не удался (слишком большой вход, ошибка модели, отмена), исходная история сохраняется без изменений — её можно сжать вручную позже. Постоянной блокировки нет: следующая попытка доступна сразу.

Какая модель сжимает?

Снимок генерирует текущая модель сессии. На большой истории сжатие может занять заметное время.

Исключение: слишком много новых данных

Если только новые сообщения занимают больше половины лимита контекста, а полный запрос переполняет бюджет, CLI останавливается с ошибкой лимита контекста без попытки сжатия. В этом случае поможет /clear или более компактный запрос.

Что попадает в снимок

Снимок оформляется как XML-структура <state_snapshot> и становится единственной памятью агента о сжатой части диалога. Модель включает в него:

  • текущие цели и последний запрос пользователя;
  • требования, ограничения и критерии готовности;
  • принятые решения и их причины;
  • выполненную работу, изменения кода и значимые пути файлов;
  • результаты проверок, ошибки и блокеры;
  • незавершённую работу и следующие шаги.

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

Ручное сжатие

Команда /compress полезна, когда сессия длинная и контекст приближается к лимиту:

/compress

Отличия от автоматического сжатия:

  • запускается сразу, без проверки порога;
  • может сжать всю историю — «хвост» из недавних сообщений не сохраняется;
  • требует, чтобы результат занял не больше 70 % лимита модели, иначе сообщает о неудаче.

Настройка

Автоматическое сжатие включается и выключается настройкой autoCompressContext в settings.json (по умолчанию true). При отключении остаются ручное /compress и защита бюджета контекста: запрос, который не помещается в лимит, по-прежнему не отправляется.

Порог автоматического сжатия фиксирован и не настраивается.

Устаревший ключ chatCompression.contextPercentageThreshold больше не управляет порогом — см. конфигурацию.

Ограничения

  • Сжатие нельзя запустить повторно, пока не завершилось предыдущее.
  • Если запрос отменён, сжатие прерывается вместе с ним, и история не меняется.
  • Снимок — это резюме: часть деталей диалога теряется. Если важные инструкции нужно сохранить дословно, повторите их после сжатия или зафиксируйте в файле памяти проекта (KODA.md / AGENTS.md).
  • В ACP-режиме сжатие доступно через метод session/compact, а ход сжатия сообщается уведомлением context_compaction_update. Та же политика применяется в CLI и у субагентов.