Compaction и Context Capsules
Механизм сжатия контекста для длинных сессий. Context Capsules, триггеры, метрики, ручное и автоматическое управление.
Compaction — механизм сжатия контекста для работы с длинными сессиями. Вместо того чтобы терять историю, SOBA создаёт Context Capsules — портативные сжатые представления контекста проекта, которые подставляются в системный промпт. Это позволяет агенту «помнить» проект сколь угодно долго — как разработчику, который периодически перечитывает документацию и код, чтобы освежить понимание.
1. Зачем нужен Compaction
Проблема
Модель имеет ограниченное контекстное окно (context window) — типично 64K–128K токенов. Каждый запрос к агенту добавляет сообщения в контекст. Длинная сессия быстро исчерпывает лимит, после чего агент либо теряет начало разговора, либо получает ошибку контекста.
Традиционное решение (плохое)
Простое усечение истории — удаление старых сообщений. Но агент теряет контекст проекта: что уже сделано, какие файлы изменены, какие архитектурные решения приняты.
Решение SOBA (Context Capsules)
Вместо потери истории, агент сжимает её в капсулу — структурированное резюме:
- что было сделано
- какие файлы изменены и почему
- текущее состояние проекта
- ключевые решения и их обоснование
- незавершённые задачи
Капсула занимает ~2-10K токенов вместо 30-100K токенов сырой истории.
2. Как устроены Context Capsules
2.1. Структура капсулы
## SOBA Context Capsule
### Goal
Описание текущей задачи агента.
### Progress
- ✅ Fixed TypeScript errors in src/parser.ts (3 errors)
- Added return type annotations
- Fixed generic constraints
- ✅ Added tests for parser (85% coverage)
- 🔄 Working on refactoring utils/validator.ts (in progress)
### Key Decisions
1. Used strict TypeScript mode — rationale: ...
2. Chose Map over Record for parser state
### Current State
- Branch: feat/type-fixes
- Modified files: 5
- Test status: 12 passing, 0 failing
### Blockers
- #42: Need to update API types (blocked by backend deploy)2.2. Как капсула используется
- При compaction создаётся новая капсула
- Старые сообщения (до
keepRecentTokens) удаляются из контекста - Капсула вставляется в системный промпт
- Последние
keepRecentTokensтокенов истории сохраняются для немедленного контекста
2.3. Несколько капсул
При очень длинных сессиях может быть несколько капсул. SOBA объединяет их: последняя капсула идёт в системный промпт полностью, более старые — сжимаются до однострочных резюме.
3. Триггеры compaction
SOBA использует 5 типов триггеров:
3.1. Hard Limit (блокирующий)
Срабатывает: Когда эффективных токенов больше чем:
hardLimit = contextWindow - maxOutputTokens - safetyReserveTokensДействие: Блокирующий compaction перед следующим вызовом модели.
Нельзя отключить через auto: false. Это аварийный механизм.
Пример: contextWindow=65536, maxOutputTokens=8192, safetyReserveTokens=8192 → hardLimit = 65536 - 8192 - 8192 = 49152 токенов
3.2. Turn Complete (фоновый)
Срабатывает: После каждого завершённого хода агента, если:
auto: trueиcompactOnTurnComplete: true- Эффективных токенов ≥
minTokensForAutoCompact(32K) - ROI проходит проверку (см. §4)
Действие: Фоновый compaction. Асинхронный, не блокирует пользователя.
3.3. Milestone (фоновый)
Срабатывает: При milestone checkpoint (установленном агентом), если:
auto: trueиcompactOnMilestone: true- ROI проходит проверку
Действие: Фоновый compaction на milestone.
3.4. User Request (явный)
Срабатывает: При вызове /compact пользователем.
Действие: Безусловный compaction (ROI-проверка пропускается, но если нечего сжимать — операция no-op).
3.5. Context Overflow (аварийный)
Срабатывает: Когда провайдер возвращает ошибку context overflow.
Действие: Аварийный compaction с более агрессивными настройками (уменьшенный
keepRecentTokens, увеличенный порог сжатия).
4. Метрики и конфигурация
4.1. Параметры в config.json
{
"compaction": {
"auto": true,
"compactOnTurnComplete": true,
"compactOnMilestone": true,
"minTokensForAutoCompact": 32000,
"minReclaimableTokens": 12000,
"minSavingsRatio": 0.25,
"keepRecentTokens": 20000,
"safetyReserveTokens": 8192,
"backgroundTimeoutMs": 15000
}
}4.2. Описание параметров
| Параметр | По умолчанию | Описание |
|---|---|---|
auto | true | Включить proactive compaction |
compactOnTurnComplete | true | Фоновый compaction после хода |
compactOnMilestone | true | Фоновый compaction на milestone |
minTokensForAutoCompact | 32000 | Минимум токенов для рассмотрения авто-компакта |
minReclaimableTokens | 12000 | Минимум токенов, доступных для освобождения |
minSavingsRatio | 0.25 | Минимальный коэффициент экономии (25%) |
keepRecentTokens | 20000 | Токены, сохраняемые после компакта |
safetyReserveTokens | 8192 | Резерв безопасности |
backgroundTimeoutMs | 15000 | Таймаут фонового компакта в мс |
4.3. ROI-проверка
Автоматический compaction выполняет проверку Return on Investment:
reclaimable = effectiveTokens - keepRecentTokens
savingsRatio = reclaimable / effectiveTokensCompaction выполняется, только если:
reclaimable ≥ minReclaimableTokens(есть что сжимать)savingsRatio ≥ minSavingsRatio(сжатие оправдано)
Пример: 50K эффективных токенов, 20K keepRecent → reclaimable = 30K. savingsRatio = 30/50 = 0.6 (60%) → выше порога 0.25 → OK.
Если эффективных всего 25K → reclaimable = 5K. savingsRatio = 5/25 = 0.2 (20%) → ниже порога → пропускаем.
5. Процесс compaction (пошагово)
- Триггер — одно из условий §3 срабатывает
- Сбор контекста — агент собирает все сообщения, результаты инструментов, статус проекта
- Генерация капсулы — агент создаёт резюме по структуре Context Capsule
- Замена контекста — старые сообщения удаляются, капсула вставляется в системный промпт
- Сохранение в сессию — капсула записывается как
"type":"capsule"в JSONL
6. Ручное управление
6.1. Команды TUI
# Принудительный compaction
/compact
# Включить/выключить авто-компакт (на лету)
/auto-compact off
/auto-compact on
# Просмотр бюджета
/budget
# Детальная статистика
/budget
/capsule6.2. Переменная окружения
# Отключить авто-компакт глобально
export SOBA_AUTO_COMPACT=false6.3. CLI-флаг
# Отключить на один запуск
soba --no-auto-compact7. Диагностика
7.1. Просмотр состояния контекста
/budget
# Вывод:
# Context Stats:
# Effective tokens: 38,420
# Hard limit: 47,616
# Safety reserve: 8,192
# Keep recent: 20,000
# Capsules: 2
# Messages: 47
# Turns: 12
# Last capsule: 2m ago (2,840 tokens)
# Savings ratio: 0.48 (48%)
# Auto-compact: ON
# Next trigger est.: ~3 turns7.2. Просмотр капсулы
/capsule
# Показывает последнюю капсулу в читаемом виде7.3. Валидация конфигурации
При старте SOBA проверяет compaction-инварианты. При нарушении выводит предупреждение:
⚠️ Compaction disabled: config validation failed:
keepRecentTokens (40000) must be < hard limit (47300)8. Portable Capsules
Context Capsules внутри JSONL-сессии нужны для compaction и rewind. Portable Capsules — отдельный формат
.capsule.md, который можно передать другой сессии, агенту или проекту.
Основные команды:
/capsule create "handoff auth work"
/capsule export ck_abc ./handoff.capsule.md
/capsule load ./handoff.capsule.mdПодробнее: Portable Capsules.
9. Лучшие практики
9.1. Когда отключать auto-compact
- Короткие сессии (1-3 хода) — compaction не нужен
- Тестирование промптов — нужно видеть полную историю
- Дебаггинг — не хотите терять детали
9.2. Когда включать ручной compact
- Перед сменой задачи в рамках одной сессии
- После крупного рефакторинга (сжать старый контекст)
- Перед долгим перерывом (зафиксировать состояние)
9.3. Оптимизация параметров
- Большие проекты (>50 файлов): увеличьте
keepRecentTokensдо 30000 - Маленькие проекты (<10 файлов): уменьшите
minTokensForAutoCompactдо 16000 - Модели с большим контекстом (128K+): compaction менее агрессивен — можно увеличить
minSavingsRatioдо 0.4 - Модели с reasoning (R1, o1): они потребляют больше токенов на thinking — увеличьте
safetyReserveTokensдо 16000