Перейти к основному содержимому

Контекст-шифтинг

Контекст-шифтинг вписывает собранный диалог в бюджет токенов модели, удаляя или сжимая наименее важный контекст и сохраняя всё, что должно остаться.

Шаги до запроса

Перед отправкой запроса конвейер выполняет следующие шаги:

  1. Определяет профиль токенизатора и лимит контекста модели.
  2. Резервирует место под ответ.
  3. Сохраняет системный промпт, персонажа, обязательные записи лорбука и закреплённые сообщения.
  4. Удаляет или сжимает сначала старейшие незакреплённые блоки.
  5. Удаляет сообщения tool-call и tool-result только парой.
  6. Пересчитывает токены после каждого изменения.
  7. Показывает пользователю, что было исключено или суммаризировано.

Если одного защищённого контекста больше бюджета, генерация завершается стабильной ошибкой 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, выполняет те же этапы персоны, лорбука, памяти, шаблона, токенизатора и шифтинга без создания сообщений, веток или аудитов.

См. также