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

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

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.