Этапы конвейера
Генерация проходит через 14 фиксированных этапов — от ввода пользователя до сохранения сообщения, — и каждый хук плагина следует одним и тем же правилам приоритета, таймаута, отмены, разрешений и изоляции ошибок.
Порядок этапов
Порядок фиксирован и одинаков для каждой генерации:
User input
→ Macros
→ Character/persona data
→ Lorebook
→ Memory/RAG
→ Token counting
→ Context shifting
→ Plugin interceptors
→ Instruct format rendering
→ Provider serialization
→ Request
→ Streaming response
→ Post-processing hooks
→ Save message
Этап за этапом
- Ввод пользователя — фиксируются черновик сообщения и параметры генерации для этого запроса.
- Макросы —
{{user}},{{char}}и пользовательские переменные разрешаются черезreplaceMacros. Неизвестные макросы остаются как есть. - Данные персонажа/персоны — поля карточки персонажа и активная персона собираются в массив сообщений.
- Лорбук — совпавшие записи лорбука вставляются согласно их правилам активации. Записи, помеченные как обязательные, защищены от удаления.
- Память/RAG — блоки памяти и векторного поиска извлекаются и ранжируются.
- Подсчёт токенов — локальный профиль токенизатора считает собранный контекст.
- Контекст-шифтинг — контекст вписывается в бюджет токенов. См. Контекст-шифтинг.
- Перехватчики плагинов — плагины могут просматривать и изменять массив сообщений. После последнего перехватчика конвейер пересчитывает токены и повторно применяет бюджет, поэтому ни один плагин не может его обойти.
- Рендер instruct-формата — чистый массив сообщений рендерится в выбранный instruct-формат или остаётся структурированным. См. Instruct-форматы.
- Сериализация провайдера — адаптер строит запрос провайдера: чат-адаптеры получают структурированный массив сообщений, текстовые — отрендеренную строку промпта.
- Запрос — запрос отправляется с
AbortSignal, таймаутами и обработкой отключения клиента. - Стриминг ответа — ответ стримится по SSE. Необязательный
assistantPrefillдобавляется в начало первой дельты ровно один раз. - Хуки пост-обработки — плагины могут обработать стриминговый ответ до его сохранения.
- Сохранение сообщения — финальное сообщение, его варианты и метаданные генерации сохраняются одной транзакцией.
Правила хуков
Каждый хук плагина определяется одним и тем же контрактом:
- Порядок и приоритет — хуки выполняются по приоритету; равные приоритеты упорядочиваются детерминированно.
- Таймаут — у каждого хука есть таймаут. Превысивший его хук прерывается.
- Отмена — хуки получают
AbortSignalгенерации и должны прекращать работу при его срабатывании. - Разрешения — хук выполняется, только если плагин обладает разрешениями, которые требуют его объявленные возможности.
- Изоляция исключений — ошибка в хуке одного плагина перехватывается, логируется и пропускается. Конвейер продолжает работу; сломанный перехватчик никогда не должен молча ломать всю генерацию.
- Диагностический журнал — каждое изменение промпта записывается. Журнал
изменений возвращается в диагностике генерации и хранится в
metaответного сообщения, поэтому всегда видно, что именно было отправлено.
Пост-обработка промпта
В чат-режиме массив сообщений перед сериализацией может пройти через
необязательный этап пересборки — перенос классического алгоритма
mergeMessages. Режимы включают merge, semi, strict и single, плюс
варианты _tools, сохраняющие сообщения инструментов. В текстовом режиме
этот этап пропускается, потому что instruct-рендер уже свёл роли в одну
строку.
См. также
- Контекст-шифтинг о том, как соблюдается бюджет.
- Токенизация о том, как работает подсчёт токенов.
- Plugin SDK об API регистрации перехватчиков и пост-обработки.