Слой управления сессиями xllm-session
Окно контекста — дефицитный ресурс. xllm ничего не помнит — xllm-session помнит за вас: бюджеты, журнал раундов, сжатие и восстановление, чтобы диалоги выживали в мире горячих перезагрузок.
Обзор
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%.
- Причина
- Из окна вычитаются резерв вывода и страховой резерв (рекомендованные значения профиля); помощники бюджета уже это делают — ручной подсчёт теряет слагаемые.
- Симптом
- При конкурентных запросах журнал ломается, транзакции сжатия чередуются и портят данные.
- Причина
- У объекта сессии нет внутренней блокировки — журнал строится по модели единственного писца. Привяжите каждую сессию к одному потоку или держите мьютекс приложения.
Упражнения
Создайте сессию, допишите пять текстовых раундов, BuildRequest и сверьте счётчик токенов с оценкой.
Загрузите историю до жёлтой линии 75%, выполните Prepare/Evaluate/Commit, сравните размер запроса до и после.
Включите journal, ведите диалог, убейте процесс, перезапустите и Recover для продолжения.
Итоги
| Пункт | Вывод |
|---|---|
| Позиция | управление над xllm: журнал / бюджет / сжатие / восстановление |
| Бюджет | окно минус резервы вывода и страховой; линии 75%/95% |
| Сжатие | Prepare → ворота качества → Commit, транзакционная замена |
| Сохранность | NDJSON journal + checkpoint + Recover |
| Конкурентность | поток на сессию; через перезагрузку — Swap/Take |
- xrt · json — NDJSON-основа journal