hermes-hub/agents/inbox/2026-09-01-A56-context-compression.md
Hermes Team 8b67f0dadb docs(agents): вернуть в репозиторий постановки A42-A56 и отчёт A30
Тринадцать файлов существовали только на диске ПК владельца, в рабочей
копии, отставшей от origin/main на 122 коммита. Их реализация и тесты
давно влиты: tests/test_a42_provider_connect.py,
test_a49_subagents_skills_memory.py, test_a51_hub_controls_hermes.py,
test_a52_local_models_supervisor_dual.py, test_a55_account_connection.py,
test_a56_context_compression.py и другие. Постановок, объясняющих, что
эти тесты обязаны доказывать, в репозитории не было.

Правило записано в agents/AGENTS.md: задание живёт в репозитории, а не в
переписке и не в личных папках на диске.

A48, A50 и A54 не переносятся: они уже есть на origin под другими именами,
содержимое совпадает с точностью до перевода строки в конце файла.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-03 18:16:35 +07:00

12 KiB
Raw Permalink Blame History

Задание A56: сжатие контекста — компрессор должен начать работать

Дата поступления

2026-09-01

База

origin/main (26f7d2c).

git fetch origin --prune
git checkout -b antigravity/a56-context-compression origin/main

В main напрямую не пушить.

Порядок исполнения

Два прохода: Flash реализует, Pro проводит аудит. Пункт P0-6 написан для аудитора.

Зона: надзиратель локальных моделей и локальный адаптер. С A55 (подключение аккаунтов) не пересекается.


Задача

На сервере владельца работает вторая локальная модель, называемая компрессором. Ревьюер проверил код: в хабе нет ни одной строки, которая бы к ней обращалась для сжатия. Порт 8082 упоминается ровно один раз — в списке адресов для обнаружения локальных серверов.

Надзиратель из A52 умеет резать задачу на куски по смысловым границам, и это работает. Но накопленный контекст между кусками никто не сжимает, и модель простаивает.

Что проверено ревьюером на живом сервере — заново не мерить

Настройка после переделки раскладки:

кодер       Qwen3-Coder-30B-A3B  порт 8081  -c 229376  30 008 МиБ  107,4 ток/с
компрессор  Qwen3-4B-2507        порт 8082  -c 32768   на CPU, -ngl 0 -t 32
                                                        604 МиБ видеопамяти
свободно на карте: 2 152 МиБ из 32 768

Скорость компрессора на процессоре измерена на настоящем промпте:

промпт 5068 токенов → 853,9 ток/с
генерация            → 5,4 ток/с

То есть сжать 32 тысячи токенов — около 38 секунд чтения плюс несколько секунд на сводку. Чтение быстрое, генерация медленная; для сжатия это удачное сочетание, потому что на выходе короткий текст.

Качество сжатия у этой модели замерено в A52: 100% — сохраняет порты, адреса, контрольные суммы. Проверено ревьюером повторно: в ответе остались и адрес сервера, и оба порта, и имя модели.

Родной контекст кодера — 262 144 по метаданным GGUF, поэтому 224К внутри предела.

Обёртка над llama-server удалена, юниты описывают действительность. Подменять бинарник больше нельзя: настройки задаются юнитом.


P0-1. Компрессор становится настраиваемой ролью

  1. Отдельная роль или настройка профиля — «модель для сжатия контекста». Владелец выбирает её в интерфейсе из подключённых локальных профилей.
  2. Адрес берётся из профиля, а не зашивается. Порт 8082 сегодняшний, завтра другой.
  3. Компрессор не участвует в маршрутизации Hermes. Это служебная роль: она не должна попадать в цепочки ролей и не обязана проходить порог в 64К. Если владелец захочет — назначит её явно, но по умолчанию нет.
  4. Компрессор не настроен — сжатие не выполняется, и это нормальное состояние. Показывать Н/Д: модель для сжатия не выбрана, а не ошибку.

P0-2. Когда сжимать

  1. Порог по заполнению контекста, а не по числу сообщений. Предел берётся у сервера через /props, размер накопленного — через /tokenize; оба механизма уже есть в надзирателе после A52.
  2. Значение порога настраивается, умолчание обосновать. Разумно начинать сжатие, когда занято около трёх четвертей.
  3. Сжимать самое старое, оставляя свежее нетронутым: последние сообщения нужны модели дословно.
  4. Не сжимать то, что уже сжато. Повторное сжатие сводки теряет факты и делает это незаметно.

P0-3. Что сохранять обязательно

Главное требование к качеству, и оно проверяемое.

Сводка обязана сохранять дословно: пути к файлам, адреса и порты, имена функций и переменных, контрольные суммы, номера версий и коммитов, точные значения из замеров.

  1. Проверять это тестом: подать текст с известными значениями и убедиться, что они в сводке остались.
  2. Потеря факта — дефект, а не приемлемая цена сжатия. Модель на этой задаче даёт 100%, значит планка достижима.
  3. Указывать степень сжатия: было столько токенов, стало столько.

P0-4. Видно, что происходит

  1. Показывать факт сжатия владельцу: когда, сколько токенов было и стало, сколько заняло.
  2. Хранить исходный текст до конца задачи, чтобы можно было вернуться, если сводка потеряла нужное.
  3. Сжатие не должно идти молча: 38 секунд тишины владелец воспримет как зависание.
  4. Ошибка сжатия не роняет задачу. Компрессор не ответил — работаем с несжатым контекстом и говорим об этом, а не прекращаем работу.

P0-5. Память о том, что сработало

Продолжение линии A52.

  1. Записывать в общую память (/srv/projects/AI-Memory): какой объём сжимался, во сколько раз, сколько заняло, сохранились ли факты.
  2. Привязывать к имени сборки GGUF, а не к порту или имени профиля.
  3. Использовать накопленное: начинать с размера куска, который уже давал хороший результат.

P0-6. Аудит вторым проходом

  1. Проверить на живом сервере, а не заглушкой: подать текст больше порога и убедиться, что сжатие произошло и факты уцелели.
  2. Проверить сохранение дословных значений — пути, порты, суммы. Это главный критерий.
  3. Проверить, что компрессор не попал в маршрутизацию Hermes и не мешает выбору моделей.
  4. Проверить поведение при недоступном компрессоре: задача продолжается на несжатом контексте.
  5. Убедиться, что предел контекста и счёт токенов берутся у сервера, а не из умолчаний.
  6. Побочные изменения объяснить.
  7. Пропущенный пункт назвать пропущенным.

Ограничения

  • Юниты владельца не править: обёртку над llama-server только что убрали, подменять бинарник запрещено.
  • Службы qwen-coder и qwen-compressor возвращать в рабочее состояние после проверок.
  • Адреса и порты в код не зашивать.
  • Учётные данные и ~/.hermes/agy_profiles/ не трогать.
  • Версию 0.1.2 не понижать.
  • Правило честности без исключений: неизмеренное — Н с причиной, потерянный факт — дефект.

Критерии приёмки

  1. Ветка в origin, git status чист.
  2. Модель для сжатия выбирается в интерфейсе; адрес берётся из профиля.
  3. Компрессор не участвует в маршрутизации Hermes по умолчанию.
  4. Порог сжатия считается от предела контекста, взятого через /props, и объёма, посчитанного через /tokenize.
  5. Сжимается старое, свежее остаётся дословным; повторное сжатие сводки не выполняется.
  6. Тест на сохранение дословных значений проходит: пути, порты, контрольные суммы, номера версий.
  7. Владелец видит факт и степень сжатия; исходный текст сохраняется до конца задачи.
  8. Недоступный компрессор не роняет задачу.
  9. Опыт записан в общую память с привязкой к имени сборки GGUF.
  10. Проверено на живом сервере, вывод приложен.
  11. ruff check . чисто; релизный гейт 10/10; тестов не меньше 599.
  12. Отчёт: START_HEAD, FINAL_HEAD, origin/main, git status, X passed / Y skipped / Z failed.

Главное

Владелец держит на сервере вторую модель под сжатие контекста, освободил ради неё место и вынес её на процессор. Модель работает, отвечает и сжимает правильно — но в хабе нет кода, который бы её позвал.

Задание закрывает разрыв между настроенным железом и неиспользуемой возможностью. Ключевое требование одно: сводка не теряет фактов. Модель на этой задаче даёт сто процентов, значит планка достижима, и снижать её нельзя — потерянный путь или порт всплывёт через два шага в виде необъяснимой ошибки.

Порядок сдачи

Передать точный FINAL_COMMIT_SHA.