Opencode — штука мощная. Запустил, дал задачу, а она начинает читать один и тот же файл по кругу. Токены летят в трубу, модель тупит, вы ждёте. Знакомо? Переполнение контекста — не абстрактная беда. Это конкретная петля, когда LLM забывает, что уже загрузила файл, и тащит его снова. А лимит контекста давно исчерпан. Сегодня разберем, почему это происходит и как разорвать этот цикл.
Откуда берётся повторное чтение
Opencode, как и многие кодовые ассистенты, держит в контексте историю диалога, содержимое открытых файлов, результаты выполнения команд. Чем дольше сессия, тем больше мусора. Когда контекст достигает предела (для модели 3.6 35B A3B — около 256K токенов), включается механизм вытеснения. Но не всегда умный. Вместо сброса ненужной истории, модель часто решает: «А дай-ка я перечитаю исходники, чтобы освежить». И понеслось.
Типичный симптом: в логах Opencode видите многократные запросы на чтение одного и того же файла, хотя он уже был в контексте. Ответы становятся медленными, а качество падает.
В статье Opencode против Claude Code мы уже касались архитектурных различий. Основная причина — отсутствие эффективного менеджера контекста. Модель сама решает, что важно. А ей виднее (спойлер: нет).
Что НЕ работает (и почему)
- Увеличить контекстное окно — просто отсрочка. Мусора станет больше, модель утонет быстрее.
- Перезапустить сессию вручную — теряется вся история. Нельзя просто так взять и забыть, о чём договаривались.
- Надеяться на автоматику — Opencode не умеет сам чистить контекст. Он ждёт ваших команд.
Звучит логично, но есть нюанс: все эти «решения» лечат симптомы, а не причину. Причина — в управлении временем жизни контекста.
Решение: пять шагов к порядку
Главная идея — взять управление контекстом на себя. Не доверять модели, а явно указывать, что держать в памяти, а что сбросить.
1Используйте флаг --reset-context
Самый быстрый способ — принудительно очистить контекст перед критическим запросом. Opdecode (версии 0.5.2+) поддерживает эту опцию. Запустите:
opencode execute --reset-context "рефактори этого модуля"Модель начнёт с нуля. Минус: потеря истории. Но если вы зашли в тупик, лучше потерять историю, чем 20 минут ждать повторного чтения.
2Настройте лимит контекста вручную
В конфигурации .opencode.yml пропишите:
session:
max_context_tokens: 128000
preserve_files:
- "src/main.py"
- "config.yaml"
exclude_from_context:
- "*.lock"
- "node_modules/**"Так вы ограничите размер и запретите модели перечитывать ненужные файлы. Сработает, если правильно задать preserve_files — только то, что реально нужно.
3Разделите сессию на «главы»
Вместо одного бесконечного разговора — несколько сессий с явными целями. В конце каждой сохраняйте краткий саммари в текстовый файл, а в начале новой — скармливайте его как контекст. Этот приём разобран в статье Контекст-инжиниринг для coding-агентов.
Пример:
opencode session start --name "refactor-auth"
opencode session save --summary "completed auth refactoring, changed UserService.login, added tests"
opencode session close
# потом новая сессия:
opencode session start --name "add-logging" --context @last-summaryМодель не будет перечитывать всю историю, только вашу выжимку.
4Используйте внешнее хранилище памяти
Если проект большой, одного контекстного окна не хватит. Интеграция с Mem0 или MemGPT позволяет модели обращаться к долговременной памяти. В Opencode для этого есть плагин memory-bridge. Он автоматически архивирует старые обсуждения и выгружает их, только когда нужно.
После настройки memory-bridge модель перестаёт хранить в контексте старые команды — только ключевые факты. Повторное чтение файлов исчезает почти полностью.
Настройка простая:
opencode plugin install memory-bridge
opencode plugin set memory-bridge.backend mem0Подробнее про борьбу с переполнением читайте в статье Когда 128K токенов не хватает.
5Отключайте автозагрузку файлов
Opencode по умолчанию читает все открытые в редакторе файлы. Отключите это:
editor:
auto_read_open_files: falseТеперь модель будет видеть только то, что вы явно передадите через /read file.py. Контроль — ваша суперсила.
Типичные ошибки и их последствия
| Ошибка | Что происходит | Как исправить |
|---|---|---|
| Cбросить контекст без сохранения саммари | Модель забывает всё, приходится повторять | Перед сбросом сохраните выжимку через session save --summary |
| Увеличить max_context_tokens слишком сильно | Тормоза, переполнение памяти GPU | Оставьте 80% от лимита модели (для 3.6 35B A3B — 200K токенов) |
| Забыть исключить бинарники | Модель пытается читать бинарники, тратит токены | Добавьте *.bin, *.png в exclude |
Когда ничего не помогает — экстренный план
Если даже после всех настроек модель зациклилась, сделайте «жёсткий ресет»:
- Закройте текущую сессию без сохранения.
- Удалите файлы кеша:
rm -rf ~/.opencode/cache. - Запустите новую сессию с
--reset-contextи передайте только самый необходимый файл. - Если это не помогло — проблема в модели (галлюцинации, см. Контекст или галлюцинации).
--reset-context в середине сложной рефакторинга — модель может потерять контекст изменений. Лучше сначала закончить задачу и сохранить промежуточный итог.Почему это вообще происходит? Глубже, чем кажется
Проблема повторного чтения — частный случай коллапса контекста. Когда контекст переполнен, модели свойственно возвращаться к «безопасным» данным — файлам, которые она уже много раз видела. Это механизм защиты от потери информации. Но он же приводит к зацикливанию. В статье Контекст гниёт, а вы платите описано, как RLM и DSPy решают эту проблему на уровне обучения. В Opencode пока таких механизмов нет, но можно применить похожие идеи — периодически подводить итог и сбрасывать «старые» токены.
Кстати, эксперименты с SemanticZip показали, что сжатие контекста через эмбеддинги даёт спорные результаты. Для кода это особенно критично — потеря маленькой детали меняет смысл. Поэтому агрессивное сжатие не подходит. Лучше явное управление сессиями, как описано выше.
Часто задаваемые вопросы
- Поможет ли увеличение контекстного окна модели до 512K токенов?
- Временно — да. Но проблема усугубится: модель будет перечитывать файлы, потому что может. Лучше не расширять окно, а научиться его чистить.
- Почему Opencode не делает это автоматически?
- Потому что автоматическое управление контекстом — сложная задача. Разработчики фокусируются на мультиагентной архитектуре (LoopCoder), а не на оптимизации памяти одного агента. Пока это ваша забота.
- Не проще ли перейти на Claude Code?
- Claude Code лучше управляет контекстом, но он не open-source и дороже. Opdecode при грамотной настройке даёт тот же результат за меньшие деньги.
Переполнение контекста — не приговор. Это просто сигнал, что вы перегрузили модель информацией. Научитесь давать ей ровно столько, сколько нужно для текущего шага. И она перестанет читать ваши файлы по сотому кругу.