Тринадцать файлов существовали только на диске ПК владельца, в рабочей копии, отставшей от 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>
141 lines
12 KiB
Markdown
141 lines
12 KiB
Markdown
# Задание 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`.
|