Бюджет контекста¶
dev context показывает, насколько заполнено контекстное окно каждой сессии OpenCode, — относительно максимума самой модели, а не общего лимита.
Зачем это нужно¶
На рантайме контекст уже охраняют два плагина:
opencode-context-watchпредупреждает при пересечении порога заполнения.opencode-context-compress(и@skybluejacket/opencode-context-compress) сжимает и обрезает контекст, когда окно переполняется.
Эти плагины работают от использования, о котором сообщает провайдер, и от фиксированного порога. Чего они не умеют — отвечать на вопрос «насколько полна эта сессия относительно потолка этой модели». Сессия на 350 тысяч токенов — пустяк для модели на 1 млн токенов, но авария для локальной модели на 131 тысячу. Реестр лимитов моделей (src/data/routing.json → cost_table[].context) принадлежит инициализатору, поэтому ему же принадлежит и отчёт:
- Единый источник лимитов — окно каждой модели указано в одном месте.
- Офлайн-отчёт — смотришь использование без запущенной сессии, из сохранённого состояния.
- Единые пороги — те же числа WARN/ACT, что используют плагины.
Как читается реестр¶
Инструмент не копирует числа моделей в код. Он читает cost_table из routing.json в момент запуска. Каждая запись сопоставляет ключ модели (например, deepseek/deepseek-v4-pro) с полями { input, output, context, free }. context — это размер окна в токенах.
Записи сессий сопоставляются с ключом реестра по вхождению, без учёта регистра: id сессии deepseek-v4-pro совпадает с ключом deepseek/deepseek-v4-pro, и наоборот. Сессия, модель которой не удалось сопоставить, показывается с limit=? и статусом UNKNOWN — её сообщают, а не отбрасывают.
Использование¶
dev context models # таблица известных моделей и их окон
dev context status # скан сессий, использование против лимита модели
dev context check --strict # статус, выход 1 при наличии сессии на уровне ACT
dev context status --json # машинный вывод
models¶
model context note
deepseek/deepseek-v4-pro 1000000 free
deepseek/deepseek-v4-flash 1000000 free
zai/glm-5-turbo 200000 paid
ollama/qwen3:32b 131072 free · local
status¶
session model used limit pct status
ses_ab12cd deepseek/deepseek-v4-pro 950000 1000000 95.0 ACT
ses_ef34gh zai/glm-5.2 610000 1000000 61.0 OK
ses_ij56kl mystery-model-1 50000 ? ? UNKNOWN
warn=0.77 act=0.9 act_sessions=1 warn_sessions=0
status — советующий: всегда выходит с кодом 0. check --strict — форма для CI/скриптов: выходит 1, когда хоть одна сессия на уровне ACT, иначе 0.
Семантика порогов¶
| Уровень | По умолчанию | Смысл |
|---|---|---|
OK | ниже 77% | запас есть |
WARN | 77% | сжатие уже должно было сработать |
ACT | 90% | практический потолок — дальше модель деградирует или теряет контекст |
Числа — это отраслевая сходимость, а не выдумка: пороги предупреждения собираются около 75–77%, потолок действия — около 90%, а абсолютный лимит токенов около 350 тысяч — отдельная забота плагинов (модель на 1 млн токенов вместит 350 тысяч; модель на 131 тысячу — нет). WARN и ACT намеренно разнесены (77 → 90), чтобы дать полосу гистерезиса: сжатие запускается на WARN и переходит в жёсткую тревогу только на ACT, поэтому сессия не дёргается между состояниями на границе.
Настройка¶
Пороги лежат в ~/.config/opencode/context-guard.json в блоке budget, который пишет модуль 57-context-guard:
{
"version": 1,
"managed_by": "opencode_initializer@57-context-guard",
"compress": { "enabled": true, "auto": true },
"watch": { "threshold": 0.85 },
"budget": { "warn_percent": 0.77, "act_percent": 0.90 }
}
Отредактируй budget.warn_percent / budget.act_percent и перезапусти dev context status. Инструмент читает этот файл, но никогда его не пишет. Если блока нет, он откатывается к watch.warn_percent, затем watch.threshold, затем к встроенным значениям.
Интеграция¶
- Состояние сессий читается из
$HOME/.local/share/opencode/storage/session(с фолбэком наstorage/), свежие файлы первыми, не более 20. Битые файлы пропускаются молча. ROUTING_JSONпереопределяет путь к реестру;--jsonвыдаёт{ sessions, warn_percent, act_percent, act_count, warn_count }для скриптов.dev contextзарегистрирован рядом сdev skillsи остальными командами после установки;healthпроверяет, что инструмент компилируется черезpy_compile.