Контекст-шифтинг
Контекст-шифтинг вписывает собранный диалог в бюджет токенов модели, удаляя или сжимая наименее важный контекст и сохраняя всё, что должно остаться.
Шаги до запроса
Перед отправкой запроса конвейер выполняет следующие шаги:
- Определяет профиль токенизатора и лимит контекста модели.
- Резервирует место под ответ.
- Сохраняет системный промпт, персонажа, обязательные записи лорбука и закреплённые сообщения.
- Удаляет или сжимает сначала старейшие незакреплённые блоки.
- Удаляет сообщения tool-call и tool-result только парой.
- Пересчитывает токены после каждого изменения.
- Показывает пользователю, что было исключено или суммаризировано.
Если одного защищённого контекста больше бюджета, генерация завершается
стабильной ошибкой TOKEN_BUDGET_EXCEEDED вместо отправки провайдеру
запроса сверх бюджета.
Как работает шифтинг
shiftContext(messages, countTokens, budget) подгоняет диалог под бюджет
токенов. Он возвращает три списка:
kept— сообщения, которые поместились;excluded— удалённые сообщения, показываемые пользователю;truncated— блоки, которые были сжаты, а не отброшены.
Системные и закреплённые сообщения всегда защищены. Сначала удаляются
старейшие незакреплённые блоки. Вызовы инструментов и их результаты
связываются через toolCallId, tool_call_id или callId и удаляются
одной группой, даже если они не соседние.
Встроенные стратегии
Стратегия выбирается настройкой contextStrategy и применяется через
ContextStrategyRegistry:
- truncate — удаляет старейшие незакреплённые группы.
- summarize — строит локальную экстрактивную сводку исключённой истории и сохраняет её перед текущим вводом пользователя.
- vector-recall — отбрасывает блоки лорбука и памяти с низкой релевантностью раньше блоков с высокой, а затем ужимает старую историю.
- manual — сначала исключает сообщения с флагом
meta.manualExcluded: true(включая связанные tool-call и tool-result), а затем при необходимости продолжает обычное сокращение.
Плагины и бюджет
Плагины могут регистрировать дополнительные стратегии; регистрация возвращает функцию очистки. Плагинная стратегия не может обойти бюджет:
- хост восстанавливает обязательные сообщения и отклоняет стратегию, удалившую защищённый контекст;
- хост независимо пересчитывает реальный бюджет;
- подсчёт и шифтинг выполняются до перехватчиков плагинов, а после них — обязательный пересчёт с финальным шифтингом: плагин не может добавить сообщения в конце, чтобы проскочить мимо лимита.
Аудит контекста
Каждая генерация создаёт PromptContextAudit до сетевого вызова и завершает
его одним терминальным статусом: completed, failed или cancelled.
Аудит фиксирует:
- идентификатор генерации, провайдера и модель;
- каждый блок промпта в фактическом порядке, с количеством токенов и стабильной причиной включения или исключения;
- лимит контекста, резерв под ответ и итоговое количество токенов промпта;
- профиль токенизатора и является ли он приближённым;
- финальные сообщения провайдера и диагностику перехватчиков плагинов;
- нормализованный код ошибки провайдера без тел ответов вышестоящей системы.
В базе данных хранится только последний завершённый аудит на чат; новый
запрос атомарно заменяет старый, а удаление чата удаляет аудит. UI читает
его через GET /api/v2/chats/:id/context-audit.
Живая конечная точка предпросмотра, POST /api/v2/context-preview, выполняет
те же этапы персоны, лорбука, памяти, шаблона, токенизатора и шифтинга без
создания сообщений, веток или аудитов.
См. также
- Этапы конвейера о том, где шифтинг стоит в порядке этапов.
- Токенизация о том, как считаются токены.
- Данные и хранилище о том, где хранятся аудиты.