Глава 35 / 51
Том 5 · Расширения, эксплуатация и практика

Слой управления сессиями xllm-session

Окно контекста — дефицитный ресурс. xllm ничего не помнит — xllm-session помнит за вас: бюджеты, журнал раундов, сжатие и восстановление, чтобы диалоги выживали в мире горячих перезагрузок.

Обзор

Позиционирование: продолжение гл. 34. xllm — библиотека вызова без состояния; этот слой строит управление поверх её публичного API, не трогая внутренности. Предусловие: вариант build.bat xllm-session (xllm подтягивается автоматически).

35.1 Позиция и модель

Управление сессией отвечает на три вопроса: что помнить (журнал раундов — полная последовательность user/assistant/tool), когда экономить (бюджет контекста и линии давления сжатия) и как выжить (journal на диске и восстановление после рестарта процесса). Зависит только от публичного API xllm — инструменты не исполняет, вызовов не инициирует: запуск остаётся задачей вашего кода.

Связь с передачей состояния гл. 28: дескриптор сессии, экспортированный ServiceSwap, забирается в Init нового поколения — горячая перезагрузка не рвёт диалог; journal покрывает рестарты уровня процесса.

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

У каждой сессии есть бюджет окна: uContextWindowTokens минус резерв вывода и страховой резерв — это доступный лимит ввода. Подсчёт токенов идёт офлайн-оценщиком xllm; три линии давления задают политику:

ДавлениеПорогДействие
Зелёное< 75%Обычное дописывание раундов
Жёлтое≥ 75%Готовить сжатие: пометить кандидатов в сводку, архивировать старые раунды
Красное≥ 95%Принудительная транзакция сжатия: сводка заменяет старые раунды, лимит освобождается

Цифры бюджета — комбинация профиля модели (гл. 34) и конфигурационных переопределений; помощники вроде xllmSessionComputeSafetyReserve дают рекомендованные значения.

35.3 Раунды и журнал

Объект сессии и есть журнал: xllmSessionCreate создаёт, xllmSessionAddText / AddAssistantResponse / AddToolResult дописывают раунды, xllmSessionBuildRequest одним шагом даёт готовый для xllm запрос (автоусечение по бюджету). Fork делает глубокую копию ветки — эксперименты и откат не пачкают основную линию.

35.4 Сжатие и journal

Сжатие — транзакция: Prepare даёт сводку и план сохранения, xllmCompactionEvaluateSummary прогоняет детерминированные ворота качества (сводка не может молча потерять ключевые ограничения), Commit атомарно заменяет журнал. journal — поток NDJSON: каждый раунд падает на диск, checkpoint'ы снимаются периодически, xllmSessionRecover воспроизводит его — диалог продолжается после падения.

35.5 Контракт

ОбъектВладениеОсвобождение
xllm_session_configстек вызывающегонет
xllm_sessionвыделяет библиотекаxllmSessionDestroy
xllm_compactionтранзакция сжатияxllmCompactionDestroy
файл journalуправляет библиотеказакрывается вместе с сессией

Потоки: объекты сессии не потокобезопасны — один поток на сессию (привяжите к фиксированному worker или фоновому потоку, дисциплина гл. 41); через горячую перезагрузку — Swap/Take. Скрипты проверяют #ifdef XS_USE_XLLM_SESSION; вложенный TCC видит то же.

Частые ошибки

Окно принимают за бюджет ввода
Симптом
Длинные диалоги прерываются принудительным сжатием на красной линии 95%.
Причина
Из окна вычитаются резерв вывода и страховой резерв (рекомендованные значения профиля); помощники бюджета уже это делают — ручной подсчёт теряет слагаемые.
Одна сессия на много worker
Симптом
При конкурентных запросах журнал ломается, транзакции сжатия чередуются и портят данные.
Причина
У объекта сессии нет внутренней блокировки — журнал строится по модели единственного писца. Привяжите каждую сессию к одному потоку или держите мьютекс приложения.

Упражнения

БазаЖурнал насквозь

Создайте сессию, допишите пять текстовых раундов, BuildRequest и сверьте счётчик токенов с оценкой.

Приёмка: запрос содержит все пять раундов; значения бюджета совпадают с ручным подсчётом.
ПродвинутыйТранзакция сжатия

Загрузите историю до жёлтой линии 75%, выполните Prepare/Evaluate/Commit, сравните размер запроса до и после.

Приёмка: после Commit лимит возвращается в зелёную зону; ворота качества бракуют плохую сводку.
ВызовВосстановление после краха

Включите journal, ведите диалог, убейте процесс, перезапустите и Recover для продолжения.

Приёмка: после восстановления модель помнит договорённости из journal.

Итоги

ПунктВывод
Позицияуправление над xllm: журнал / бюджет / сжатие / восстановление
Бюджетокно минус резервы вывода и страховой; линии 75%/95%
СжатиеPrepare → ворота качества → Commit, транзакционная замена
СохранностьNDJSON journal + checkpoint + Recover
Конкурентностьпоток на сессию; через перезагрузку — Swap/Take
Дальнейшее чтение по xrt