# Compaction (сжатие контекста): как агенты укладывают задачу в окно модели

> **Compaction** (сжатие контекста) — это приёмы, которыми агент удерживает историю диалога в пределах окна модели и в пределах качества ответа: старую часть переписки сворачивают в короткую сводку, шумные результаты инструментов выбрасывают, а важное переносят в файлы. Модель продолжает работу не с полной стенограммой, а с выжимкой.

Compaction — это часть более широкого [контекст-инжиниринга](/pages/kontekst-inzhiniring-context-engineering). Разница простая: context engineering проектирует весь вход модели — промпт, инструменты, файлы, память, порядок блоков, — а compaction занимается одной конкретной частью: историей диалога, которая растёт на каждом шаге агента.

## Зачем сжимать, если окна хватает

У современных моделей окно в миллион токенов, и соблазн держать в нём всю сессию целиком велик. Anthropic в статье про контекст-инжиниринг прямо предупреждает: ждать, пока окна станут больше, — плохая стратегия, потому что окно любого размера страдает от загрязнения контекста и падения релевантности ([Anthropic Engineering](https://www.anthropic.com/research/effective-context-engineering-for-ai-agents)).

Две причины сжимать историю.

- **Качество.** Чем длиннее вход, тем хуже модель вытаскивает нужное из середины — это эффект [context rot](/pages/context-rot). Агент с сотней шагов и 300 тысячами токенов истории начинает терять детали задачи, и compaction нужен не ради лимита, а чтобы вернуть модели читаемый рабочий набор токенов.
- **Цена.** В агентном цикле вход отправляется заново на каждом шаге. История на 100 тысяч токенов оплачивается столько раз, сколько раундов делает агент. Подсчёты на живых задачах собраны в статье [«Сколько стоит агентная сессия»](/pages/stoimost-agentnoy-sessii-flash-vs-sonnet).

Типичная агентная сессия — 50–100 шагов, и на длинных задачах она упирается в окно регулярно, а не только в исключительных случаях.

## Как это работает

### Автоматическое сжатие в Claude Code

Claude Code сжимает историю сам, когда контекст подходит к пределу. Порог зависит от модели: у моделей с нативным окном 1M сжатие срабатывает примерно на 967 тысячах токенов, у остальных — у границы окна; при включённом ограничении 1M-контекста — на 200K ([документация Claude Code](https://code.claude.com/docs/en/model-config)). Посмотреть расход и границы можно командой `/context`: она показывает занятые токены, свободное место и зарезервированный буфер под автосжатие.

Окно компактирования настраивается: `autoCompactWindow` в `~/.claude/settings.json`, команда `/autocompact 500k` для текущей модели или переменная `CLAUDE_CODE_AUTO_COMPACT_WINDOW`. Допустимый диапазон — от 100K до 1M токенов, значение обрезается по окну модели.

Что Claude Code сохраняет при сжатии, Anthropic описывает так: архитектурные решения, нерешённые баги и детали реализации, а отбрасывается повторяющийся вывод инструментов; после сжатия агент продолжает работу с пятью последними открытыми файлами. Ручной вариант — `/compact` с указанием, что именно важно сохранить.

![Claude Code: команда /context на сессии с моделью anthropic/claude-sonnet-5.5 — 19,3 тыс. из 100 тыс. токенов, буфер автосжатия 33 тыс. токенов](https://b51bc417-3ee0-451a-a83b-8a681d027a96.selstorage.ru/public/8261abe7c35d422ccf8d716472b6b838.png)

![Claude Code: ручной /compact с инструкцией «Сохрани вывод тестов и что делает totalAmount» — новая история начинается со сводки и трёх прочитанных файлов](https://b51bc417-3ee0-451a-a83b-8a681d027a96.selstorage.ru/public/77cf2d0924b521d809bb982806182ca1.png)

### Автосжатие в Codex

В Codex CLI порог сжатия задаётся в `~/.codex/config.toml` ключом `model_auto_compact_token_limit`, а полный размер окна — `model_context_window`. Ключ `model_auto_compact_token_limit_scope` определяет, что считать: весь активный контекст (`total`, по умолчанию) или только прирост после последнего сжатия (`body_after_prefix`). Есть и `model_post_turn_compact_threshold_percent` — доля окна, при которой сжатие запускается после финального ответа хода ([схема конфигурации Codex](https://github.com/openai/codex/blob/main/codex-rs/core/config.schema.json)).

Устройство отличается от «перескажи стенограмму клиентом». По разбору исходников Codex, клиент отправляет обычный запрос с полной историей и специальным маркером, а сервер возвращает непрозрачный блок со сжатым состоянием; клиент сохраняет сообщения пользователя дословно (в пределах лимита в 64 тыс. токенов) и заново подставляет инструкции, а объём переписки ассистента и вызовов инструментов сворачивается. Для провайдеров без такого протокола Codex сжимает историю локальным промптом.

### Другие приёмы

- **Ручная суммаризация.** Команда с указанием, что сохранить, или отдельный запрос «сведи историю до решений и открытых задач» перед продолжением.
- **Выбрасывание старых tool-результатов.** Самый мягкий и безопасный приём: сырой вывод инструмента из глубины истории не нужен — файл можно прочитать снова. Anthropic называет очистку результатов инструментов самой лёгкой формой сжатия и вынес её в отдельную функцию платформы.
- **Дедупликация и сжатие логов и JSON.** Одинаковые строки журналов, повторяющиеся поля JSON и одинаковые блоки кода режутся почти без потерь. Инструменты вроде [Headroom](https://github.com/headroomlabs-ai/headroom) делают это отдельным слоем перед отправкой запроса: заявленная экономия на повторяющихся JSON-массивах и строках логов превышает 90%, на обычном тексте она близка к нулю.
- **Заметки в файл вместо «держать всё в промпте».** Anthropic называет это структурированной заметкой-памятью: агент пишет в `NOTES.md` или `AGENTS.md` прогресс, договорённости и открытые вопросы, а после сжатия или новой сессии перечитывает файл. В Claude Code для этого есть `CLAUDE.md` и auto memory, подробнее — в статье [Agent Memory](/pages/agent-memory).
- **Сжатие с возможностью запросить оригинал (CCR, compress-cache-retrieve).** Сжатый вариант отдаётся модели, а исходный текст хранится локально, и модель может подтянуть его инструментом, если выжимки не хватило. Так устроен Headroom: `headroom_retrieve` возвращает полный фрагмент по запросу.

## Что теряется при сжатии

Сводка по определению неполна. Обычно теряются:

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

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

Компенсируют это артефактами на диске. Если результат нужен позже, его пишут в файл: `test-output.log`, `plan.md`, `NOTES.md`. Тогда сводке достаточно сослаться на путь, а агент перечитает файл, когда понадобится. Отсюда практическое правило: в сводке держат решения и ссылки, а не полные данные.

## Как измерять эффект

- **Доля входа, занятая историей.** В Claude Code это видно в `/context`: сколько занимают сообщения, системный промпт, инструменты и буфер.
- **Число раундов до результата.** Сжатие, которое экономит токены, но добавляет десять лишних шагов, обычно проигрывает.
- **Доля повторных чтений файла.** Если агент снова и снова открывает один и тот же файл, значит, сжатие выбросило нужную деталь.
- **Расход в личном кабинете RouterAI.** Стоимость запросов и токены по моделям видны в разделе статистики; по ним удобно сравнивать сессии с разным устройством контекста.

## Compaction и кэширование промптов

Это разные механизмы, и путать их не стоит. [Кэширование промптов](/pages/prompt-caching) не уменьшает вход: оно удешевляет повторную отправку того же префикса. Compaction уменьшает сам вход, но ломает префикс: после сжатия история другая, и кэш приходится строить заново — Claude Code даже считает такой промах ожидаемой перестройкой кэша.

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

## Связь с RouterAI

Compaction — функция агентской обвязки, а не модели: через API приходит обычный запрос, и какой именно контекст в него попал, решает клиент. Для RouterAI это означает, что любой агент, настроенный на `https://routerai.ru/api/v1` (OpenAI-совместимый) или `https://routerai.ru/api` (Anthropic Messages), работает со сжатием так же, как с прямым провайдером. Подключение Claude Code описано в статье [Claude Code через RouterAI](/pages/vibe-coding-claude-code), Codex — в статье [Codex через RouterAI](/pages/vibe-coding-codex).

Большое окно не отменяет сжатие. Модели с окном 1M токенов в [каталоге](/models) — `deepseek/deepseek-v4.1-flash`, `qwen/qwen3.6-flash`, `z-ai/glm-5.3` — вмещают длинную сессию, но не спасают от context rot и не отменяют оплату всех этих токенов на каждом шаге.

Разница видна на арифметике. Задача из 40 шагов при входе 100 тыс. токенов на шаг — это 4 млн входных токенов, при входе 30 тыс. — 1,2 млн. По ценам каталога на ноябрь 2026 года вход на `deepseek/deepseek-v4.1-flash` стоит 8,81 ₽ за 1 млн токенов, то есть около 35 ₽ против 11 ₽ за задачу; на `anthropic/claude-sonnet-5.5` при 213,56 ₽ за 1 млн — около 854 ₽ против 256 ₽. Выходные токены и кэш в расчёт не входят, актуальные цены — в [каталоге](/models).

## Что почитать

- [Effective context engineering for AI agents](https://www.anthropic.com/research/effective-context-engineering-for-ai-agents) — Anthropic о compaction, заметках и субагентах
- [Model configuration — Claude Code Docs](https://code.claude.com/docs/en/model-config) — окно автосжатия и пороги по умолчанию
- [Codex config schema](https://github.com/openai/codex/blob/main/codex-rs/core/config.schema.json) — ключи `model_auto_compact_token_limit` и соседние
- [Claude Code как daily driver](https://arps18.github.io/posts/claude-code-mastery/) — практика работы с `CLAUDE.md`, skills и субагентами
- [Headroom на GitHub](https://github.com/headroomlabs-ai/headroom) — сжатие истории и CCR-подход

## Связанные термины

- [Context Window](/pages/context-window) — что такое контекстное окно
- [Context rot](/pages/context-rot) — почему длинный контекст не равен умному ответу
- [Контекст-инжиниринг](/pages/kontekst-inzhiniring-context-engineering) — проектирование всего входа модели
- [Prompt Caching](/pages/prompt-caching) — как кэш удешевляет повторный префикс
- [Agent Memory](/pages/agent-memory) — память агента за пределами окна
- [Захват контекста](/pages/zahvat-konteksta-context-retrieval) — подгрузка данных по требованию
