Amiga
Оглавление курса · урок 5 из 24

Модуль 1 · Как устроен агент · урок 5 из 24

Компакция и длинные сессии

Любая серьёзная задача рано или поздно упирается в границу окна. Codex умеет сжимать историю сам, и делает это неплохо. Но для harness-инженера важен не сам факт сжатия, а его свойства: что сохраняется, что теряется, можно ли это проверить и как построить работу так, чтобы потеря деталей ничего не ломала.

Зачем вообще сжимать

Из урока об агентном цикле: каждый запрос несёт всю историю треда, а за один ход может пройти сотни вызовов инструментов. Без сжатия длинная задача либо упрётся в лимит окна, либо будет работать в зоне, где качество уже деградирует (context rot, урок о контекстной инженерии). Компакция — способ продолжить работу в том же треде, заменив историю её сжатым представлением.

Как компакция устроена в Codex

Майкл Болин в «Unrolling the Codex agent loop» описывает эволюцию:

  • Раньше была только ручная команда /compact: отдельный запрос с инструкцией «суммаризируй», и итоговое сообщение заменяло историю.
  • Теперь есть эндпоинт /responses/compact. Он возвращает список элементов, среди которых элемент типа compaction с непрозрачным зашифрованным содержимым. По словам Болина, оно сохраняет латентное понимание разговора моделью. Codex вызывает компакцию автоматически при превышении порога.

В статье OpenAI о компьютерной среде для Responses API (март 2026) добавлено: модели обучены сами выдавать элемент компакции, экономный по токенам. Её можно включить на сервере с порогом или вызывать отдельно. Авторы пишут, что Codex опирается на этот механизм в длинных задачах.

Ключевое свойство для нас: результат нативной компакции непрозрачен. Вы не можете прочитать, что именно сохранилось, и не можете его поправить.

Рычаги в конфигурации

Справочник конфигурации Codex описывает несколько ключей (имена проверяйте по актуальной документации — они меняются):

Ключ Что делает
model_auto_compact_token_limit Порог токенов для автоматической компакции; если не задан — значение по умолчанию для модели
model_auto_compact_token_limit_scope Считать порог по всему активному контексту (total, по умолчанию) или только по росту после перенесённого префикса (body_after_prefix)
compact_prompt Переопределение промпта сжатия истории
tool_output_token_limit Бюджет на хранение одного вывода инструмента в истории — косвенно отдаляет компакцию

У сторонних провайдеров есть параметр возможностей remote_compaction: unsupported означает локальную компакцию через промпт, v2 — компакцию через Responses. То есть качество сжатия зависит и от того, через какого провайдера вы работаете.

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

Компакция или сброс контекста

Anthropic в материале «Harness design for long-running application development» (март 2026) сравнивает компакцию на месте с полным сбросом контекста и структурированной передачей дел новой сессии. Для одной модели сброс был необходим: она проявляла «тревожность контекста» и сворачивала работу у границы окна. У следующей модели проблема почти исчезла, и надобность в сбросах уменьшилась.

Что из этого следует. Ответ на вопрос «сжимать или начинать заново» зависит от модели и меняется с каждым поколением. Но одна практика полезна при любом ответе: состояние работы живёт вне контекста — в плане исполнения, прогресс-файле, коммитах. Тогда компакция теряет только то, что легко восстановить, а новая сессия стартует с чтения файла, а не с пустоты. Форматы таких артефактов — в уроках о планах исполнения и о длинных задачах.

Хуки вокруг компакции

Раз результат сжатия непрозрачен, полезно детерминированно напоминать агенту, где лежит состояние. В Codex для этого есть:

  • PreCompact и PostCompact — срабатывают до и после сжатия, matcher проверяет триггер: manual или auto. Если хук вернёт continue: false, Codex остановится.
  • SessionStart с источником compact — запускается после компакции перед следующим запросом к модели, в том числе если автоматическая компакция случилась посреди хода. Обычный текст из stdout такого хука добавляется как дополнительный developer-контекст.
json · .codex/hooks.json
{
  "hooks": {
    "SessionStart": [
      {
        "matcher": "compact|resume",
        "hooks": [
          {
            "type": "command",
            "command": "python3 \"$(git rev-parse --show-toplevel)/.codex/hooks/reorient.py\"",
            "statusMessage": "Напоминание об активном плане"
          }
        ]
      }
    ]
  }
}
python · .codex/hooks/reorient.py
#!/usr/bin/env python3
"""После компакции или возобновления напоминает агенту, где лежит состояние работы."""
import pathlib
import subprocess

root = pathlib.Path(
    subprocess.check_output(["git", "rev-parse", "--show-toplevel"], text=True).strip()
)
plans = sorted((root / "docs" / "exec-plans" / "active").glob("*.md"))
if plans:
    names = ", ".join(str(p.relative_to(root)) for p in plans)
    print(
        "Контекст был сжат или сессия возобновлена. Прежде чем продолжать, "
        f"перечитай активные планы: {names} — разделы Progress и Decision Log. "
        "Детали из памяти перепроверяй по файлам."
    )
else:
    print("Контекст был сжат. Перед продолжением проверь git status и git log -5.")

Проектные хуки работают только в доверенном (trusted) проекте и запускаются после того, как вы просмотрите и одобрите их через /hooks.

Гигиена сессий

Лучшая компакция — та, которая не понадобилась. В best practices Codex есть прямое правило: один чат на одну связную единицу работы, а один чат на весь проект назван антипаттерном. Инструменты:

  • /new — новый чат для новой задачи;
  • /fork — ответвиться, когда работа действительно разветвилась;
  • /side — побочный вопрос, который не засоряет основной тред;
  • /compact — сжать вручную в удобный момент, например после завершения этапа плана, а не посреди отладки;
  • /recap — краткое изложение без сжатия.

Наше правило выбора:

Ситуация Что делать
Задача та же, этап завершён, детали отладки больше не нужны /compact
Задача та же, но агент начал путаться и повторять ошибки Обновить план, новый тред с чтения плана
Новая задача /new
Хочется попробовать альтернативу, не теряя текущую линию /fork

Попробуйте сами

10–15 мин на рабочем месте
  1. Поработайте над реальной задачей до ощутимого объёма истории, сделайте /compact и попросите агента перечислить ограничения задачи и изменённые файлы. Сравните с тем, что было на самом деле. То, что потерялось, должно было жить в файле.
  2. Добавьте хук из урока (адаптируйте путь к своим планам), одобрите его через /hooks и проверьте, что после /compact агент первым делом читает план.
  3. Пересмотрите свою последнюю неделю: сколько тредов вы держали на одну задачу и сколько задач в одном треде. Если больше одной задачи на тред — попробуйте неделю жить по правилу «чат на единицу работы».

Коротко

  • Codex сжимает историю автоматически; нативная компакция возвращает непрозрачный зашифрованный элемент.
  • Порог, область подсчёта и промпт сжатия настраиваются ключами config.toml.
  • Компакция или сброс — зависит от модели; внешние артефакты состояния нужны в обоих случаях.
  • Хук SessionStart с источником compact детерминированно возвращает агента к плану.
  • Один чат — одна связная единица работы.
Отметка хранится только в вашем браузере
Хотите связаться с владельцем
компании напрямую?
Дмитрий Тарасов
Дмитрий Тарасов
СЕО

НАПИСАТЬ

Написать в MAX