# 🗜️ Prompt Compression Guide — OmniRoute (Русский) 🌐 **Languages:** 🇺🇸 [English](../../../../compression/COMPRESSION_GUIDE.md) · 🇪🇹 [am](../../../am/docs/compression/COMPRESSION_GUIDE.md) · 🇸🇦 [ar](../../../ar/docs/compression/COMPRESSION_GUIDE.md) · 🇦🇿 [az](../../../az/docs/compression/COMPRESSION_GUIDE.md) · 🇧🇬 [bg](../../../bg/docs/compression/COMPRESSION_GUIDE.md) · 🇧🇩 [bn](../../../bn/docs/compression/COMPRESSION_GUIDE.md) · 🇧🇦 [bs](../../../bs/docs/compression/COMPRESSION_GUIDE.md) · 🇨🇿 [cs](../../../cs/docs/compression/COMPRESSION_GUIDE.md) · 🇩🇰 [da](../../../da/docs/compression/COMPRESSION_GUIDE.md) · 🇩🇪 [de](../../../de/docs/compression/COMPRESSION_GUIDE.md) · 🇬🇷 [el](../../../el/docs/compression/COMPRESSION_GUIDE.md) · 🇪🇸 [es](../../../es/docs/compression/COMPRESSION_GUIDE.md) · 🇪🇪 [et](../../../et/docs/compression/COMPRESSION_GUIDE.md) · 🇮🇷 [fa](../../../fa/docs/compression/COMPRESSION_GUIDE.md) · 🇫🇮 [fi](../../../fi/docs/compression/COMPRESSION_GUIDE.md) · 🇫🇷 [fr](../../../fr/docs/compression/COMPRESSION_GUIDE.md) · 🇮🇪 [ga](../../../ga/docs/compression/COMPRESSION_GUIDE.md) · 🇮🇳 [gu](../../../gu/docs/compression/COMPRESSION_GUIDE.md) · 🇳🇬 [ha](../../../ha/docs/compression/COMPRESSION_GUIDE.md) · 🇮🇱 [he](../../../he/docs/compression/COMPRESSION_GUIDE.md) · 🇮🇳 [hi](../../../hi/docs/compression/COMPRESSION_GUIDE.md) · 🇭🇷 [hr](../../../hr/docs/compression/COMPRESSION_GUIDE.md) · 🇭🇺 [hu](../../../hu/docs/compression/COMPRESSION_GUIDE.md) · 🇦🇲 [hy](../../../hy/docs/compression/COMPRESSION_GUIDE.md) · 🇮🇩 [id](../../../id/docs/compression/COMPRESSION_GUIDE.md) · 🇳🇬 [ig](../../../ig/docs/compression/COMPRESSION_GUIDE.md) · 🇮🇹 [it](../../../it/docs/compression/COMPRESSION_GUIDE.md) · 🇯🇵 [ja](../../../ja/docs/compression/COMPRESSION_GUIDE.md) · 🇬🇪 [ka](../../../ka/docs/compression/COMPRESSION_GUIDE.md) · 🇰🇭 [km](../../../km/docs/compression/COMPRESSION_GUIDE.md) · 🇮🇳 [kn](../../../kn/docs/compression/COMPRESSION_GUIDE.md) · 🇰🇷 [ko](../../../ko/docs/compression/COMPRESSION_GUIDE.md) · 🇱🇹 [lt](../../../lt/docs/compression/COMPRESSION_GUIDE.md) · 🇱🇻 [lv](../../../lv/docs/compression/COMPRESSION_GUIDE.md) · 🇮🇳 [ml](../../../ml/docs/compression/COMPRESSION_GUIDE.md) · 🇮🇳 [mr](../../../mr/docs/compression/COMPRESSION_GUIDE.md) · 🇲🇾 [ms](../../../ms/docs/compression/COMPRESSION_GUIDE.md) · 🇲🇹 [mt](../../../mt/docs/compression/COMPRESSION_GUIDE.md) · 🇲🇲 [my](../../../my/docs/compression/COMPRESSION_GUIDE.md) · 🇳🇵 [ne](../../../ne/docs/compression/COMPRESSION_GUIDE.md) · 🇳🇱 [nl](../../../nl/docs/compression/COMPRESSION_GUIDE.md) · 🇳🇴 [no](../../../no/docs/compression/COMPRESSION_GUIDE.md) · 🇮🇳 [or](../../../or/docs/compression/COMPRESSION_GUIDE.md) · 🇮🇳 [pa](../../../pa/docs/compression/COMPRESSION_GUIDE.md) · 🇵🇭 [phi](../../../phi/docs/compression/COMPRESSION_GUIDE.md) · 🇵🇱 [pl](../../../pl/docs/compression/COMPRESSION_GUIDE.md) · 🇵🇹 [pt](../../../pt/docs/compression/COMPRESSION_GUIDE.md) · 🇧🇷 [pt-BR](../../../pt-BR/docs/compression/COMPRESSION_GUIDE.md) · 🇷🇴 [ro](../../../ro/docs/compression/COMPRESSION_GUIDE.md) · 🇱🇰 [si](../../../si/docs/compression/COMPRESSION_GUIDE.md) · 🇸🇰 [sk](../../../sk/docs/compression/COMPRESSION_GUIDE.md) · 🇸🇮 [sl](../../../sl/docs/compression/COMPRESSION_GUIDE.md) · 🇷🇸 [sr](../../../sr/docs/compression/COMPRESSION_GUIDE.md) · 🇸🇪 [sv](../../../sv/docs/compression/COMPRESSION_GUIDE.md) · 🇰🇪 [sw](../../../sw/docs/compression/COMPRESSION_GUIDE.md) · 🇮🇳 [ta](../../../ta/docs/compression/COMPRESSION_GUIDE.md) · 🇮🇳 [te](../../../te/docs/compression/COMPRESSION_GUIDE.md) · 🇹🇭 [th](../../../th/docs/compression/COMPRESSION_GUIDE.md) · 🇹🇷 [tr](../../../tr/docs/compression/COMPRESSION_GUIDE.md) · 🇺🇦 [uk-UA](../../../uk-UA/docs/compression/COMPRESSION_GUIDE.md) · 🇵🇰 [ur](../../../ur/docs/compression/COMPRESSION_GUIDE.md) · 🇺🇿 [uz](../../../uz/docs/compression/COMPRESSION_GUIDE.md) · 🇻🇳 [vi](../../../vi/docs/compression/COMPRESSION_GUIDE.md) · 🇳🇬 [yo](../../../yo/docs/compression/COMPRESSION_GUIDE.md) · 🇨🇳 [zh-CN](../../../zh-CN/docs/compression/COMPRESSION_GUIDE.md) · 🇹🇼 [zh-TW](../../../zh-TW/docs/compression/COMPRESSION_GUIDE.md) --- > Автоматически экономьте 15–95% токенов подходящего контекста. Краткий обзор см. в [разделе README о сжатии](../README.md#%EF%B8%8F-prompt-compression--save-15-95-eligible-tokens-automatically). ## Обзор OmniRoute реализует модульный конвейер сжатия промптов, который запускается **заблаговременно**, до того как запросы поступают к вышестоящим провайдерам. Это означает, что экономия токенов происходит прозрачно — изменять рабочий процесс не требуется. ``` Запрос клиента → Выбор стратегии сжатия → Есть переопределение для комбинации? → Использовать настройку комбинации → Достигнут порог автозапуска? → Использовать автоматический режим → Режим по умолчанию? → Использовать глобальную настройку → Отключено? → Пропустить сжатие → Выбранный режим сжатия → Off: Без сжатия → Lite: Безопасная очистка пробелов и форматирования (~15%) → Standard: Удаление слов-паразитов в телеграфном стиле (~30%) → Aggressive: Устаревание истории + суммаризация (~50%) → Ultra: Эвристическое сокращение + прореживание блоков кода (~75%) → RTK: Фильтрация вывода терминала и инструментов с учётом команд (диапазон 60–90% для вышестоящего провайдера) → Stacked: Упорядоченный многоуровневый конвейер, обычно RTK, затем Caveman (диапазон 78–95% для подходящего содержимого) → Сжатый запрос → Провайдер ``` --- ## Режимы сжатия ### Off Сжатие не применяется. Все сообщения передаются без изменений. ### Режим Lite (экономия ~15%, задержка <1 мс) Самый безопасный режим — никаких семантических изменений, только очистка форматирования: | Метод | Описание | | ------------------------ | --------------------------------------------------------------------------- | | `collapseWhitespace` | Объединение последовательных пустых строк и удаление пробелов в конце строк | | `dedupSystemPrompt` | Удаление дублирующихся системных сообщений | | `compressToolResults` | Сжатие многословного вывода инструментов/функций | | `removeRedundantContent` | Удаление повторяющихся инструкций | | `replaceImageUrls` | Сокращение URI с данными изображений в формате base64 | **Лучше всего подходит для:** Постоянного использования и критически важных рабочих процессов. ### Режим Standard (экономия ~30%) Вдохновлён [Caveman](https://github.com/JuliusBrussee/caveman) — удаляет слова-паразиты и многословные формулировки, сохраняя смысл: - Удаляет слова-паразиты («пожалуйста», «я думаю», «в основном», «на самом деле») - Сокращает многословные фразы («для того чтобы» → «чтобы», «в результате» → «из-за») - Убирает избыточно вежливые и уклончивые формулировки («Не могли бы вы...», «Если бы вы могли...») - Более 30 правил на основе регулярных выражений, настроенных для промптов, связанных с программированием **Лучше всего подходит для:** Ежедневных задач программирования и команд, стремящихся снизить расходы. ### Режим Aggressive (экономия ~50%) Интеллектуальное управление историей для длительных сеансов: - **Устаревание сообщений** — старые сообщения постепенно сжимаются всё сильнее - **Сжатие результатов инструментов** — длинный вывод инструментов обрезается или опускается (первые/последние строки, фильтрация строк с совпадениями, уплотнение ключей JSON) - **Средства контроля структурной целостности** — обеспечивают согласованность пар `tool_use` + `tool_result` - **Учёт контекстного окна** — соблюдает ограничения на количество токенов для каждой модели **Лучше всего подходит для:** Длительных сеансов отладки и больших кодовых баз. ### Режим Ultra (экономия ~75%) Максимальное сжатие для сценариев, где критически важно сократить количество токенов: - **Эвристическое сокращение** — сокращение токенов в тексте на основе оценки - **Сохранение структуры** — блоки кода с ограждениями, встроенный код, URL-адреса и идентификаторы заменяются маркерами и затем дословно восстанавливаются, никогда не подвергаясь сокращению - **Необязательный уровень SLM** — при соответствующей настройке небольшая локальная модель может улучшить результат сокращения - Не зависит от режима Aggressive: не выполняет устаревание сообщений, сжатие результатов инструментов или резервную суммаризацию (только сбой на уровне SLM может направить резервный проход через aggressive) **Лучше всего подходит для:** Случаев, когда вы регулярно достигаете пределов контекстного окна. ### Режим RTK (диапазон 60–90% для вышестоящего провайдера) Режим RTK оптимизирован для многословного вывода инструментов, возникающего в сеансах агентов программирования: - Распознаёт классы команд и вывода, такие как `git status`, `git diff`, `git log`, средства запуска тестов, сборки TypeScript/Vite/Webpack, ESLint/Biome/Prettier, аудит/установки npm, журналы Docker, вывод инфраструктурных инструментов и общий вывод оболочки - Применяет наборы JSON-фильтров из `open-sse/services/compression/engines/rtk/filters/` - Импортирует фильтры схемы RTK TOML v1 из проектных или глобальных файлов `filters.toml` с проверкой встроенных тестов и контролем доверия для проектных файлов - Включает 55 встроенных фильтров с примерами встроенной проверки - Удаляет управляющие последовательности ANSI, индикаторы выполнения, повторяющиеся строки и несущественный шум - Сохраняет сбои, ошибки, предупреждения, изменённые файлы, сводки и окончание длинного вывода - Поддерживает проектные фильтры с контролем доверия, глобальные фильтры и необязательное восстановление необработанного вывода с редактированием конфиденциальных данных **Лучше всего подходит для:** Сеансов агентов с расшифровками вывода оболочки, сборки, тестов, git, grep и файлов. ### Режим Stacked (диапазон 78–95% для подходящего содержимого) Режим Stacked запускает несколько механизмов сжатия в детерминированном порядке. Конвейер по умолчанию: ```txt RTK -> Caveman ``` Такой порядок сначала делает вывод терминала/инструментов компактным, а затем применяет семантическое уплотнение Caveman к оставшемуся промпту на естественном языке. Конвейеры Stacked можно настраивать глобально или через комбинации сжатия, назначенные комбинациям маршрутизации. **Лучше всего подходит для:** Смешанного контекста с большими журналами инструментов, а также инструкциями пользователя или сводками ассистента. --- ## Расчёт экономии при восходящей передаче OmniRoute приводит данные об экономии за счёт сжатия из двух источников: бенчмарков вышестоящих проектов и собственной комбинации движков OmniRoute. | Источник | Число из README вышестоящего проекта, используемое здесь | | -------- | --------------------------------------------------------------------------------------------------------------------------------------------------------- | | Caveman | на `~75%` меньше выходных токенов, средняя экономия выходных токенов в бенчмарках — `65%`, диапазон — `22-87%`, инструмент сжатия входных данных — `~46%` | | RTK | экономия вывода команд — `60-90%`; пример сеанса: `~118,000 -> ~23,900` токенов, или экономия `79.7%` (`~80%`) | Для пересекающихся полезных нагрузок инструментов/контекста стандартная комбинация OmniRoute последовательно применяет движки: ```txt RTK -> Caveman ``` Совокупная экономия вычисляется мультипликативно, а не аддитивно: ```txt совокупная = 1 - (1 - экономия RTK) * (1 - экономия входных данных Caveman) средняя = 1 - (1 - 0.80) * (1 - 0.46) = 89.2% диапазон = 1 - (1 - 0.60..0.90) * (1 - 0.46) = 78.4-94.6% ``` Показатель `78-95%` применим, когда и RTK, и Caveman могут уменьшить одну и ту же полезную нагрузку входных данных/контекста. Режим выходных ответов Caveman рассматривается отдельно: когда он включён, используйте собственные показатели экономии выходных данных Caveman (`65%` в среднем, заявленные `~75%`, диапазон `22-87%`). Общая экономия на оплате зависит от соотношения промптов и выходных данных. ### Что на самом деле означает «подходящий для сжатия» Заявленный диапазон 15-95% реален, но он применим только к **избыточному или многословному** содержимому — повторяющимся строкам ошибок, журналу сборки, многократно выводящему одно и то же предупреждение, чрезмерно большому выводу `grep`/чтения файла. Это **не** означает, что каждый запрос обеспечивает такую экономию. Проверено эмпирически (`tests/unit/compression/stacked-compression-tool-result-savings.test.ts`): запуск `stacked` (RTK + Caveman) для блока `tool_result` в формате Anthropic, содержащего 300 одинаковых строк ошибок, обеспечил **экономию токенов 95.93% / экономию символов 96.26%** — точно в пределах заявленного диапазона. Однако запуск того же конвейера для обычного, неизбыточного вывода инструмента (чистого списка совпадений `grep`, результата чтения короткого файла, обычного диалогового текста) ожидаемо даёт **почти нулевую экономию**, поскольку удалять нечего, а `validateCompression()` (`validation.ts`) не допускает отправку переписанного содержимого, если при этом удаляются или изменяются блоки кода, URL-адреса, заголовки, версии или идентификаторы констант в ВЕРХНЕМ РЕГИСТРЕ. Это ожидаемое и безопасное поведение, а не ошибка: сеанс программирования, в котором в основном читаются или просматриваются через `grep` обычные файлы, даст умеренную общую экономию даже при полностью включённом сжатии, тогда как сеанс, столкнувшийся с циклически повторяющейся ошибкой или многословным линтером, обеспечит полный диапазон 78-95% экономии для такого трафика. Не используйте низкий совокупный процент экономии одного сеанса как доказательство неправильной настройки сжатия — сначала проверьте, действительно ли исходный вывод инструмента был избыточным. --- ## Визуализация экономии токенов ``` Без сжатия: 47K токенов отправлено в LLM С Lite: 40K токенов отправлено (экономия 15% — безопасный режим, включён всегда) С Standard: 33K токенов отправлено (экономия 30% — правила Caveman-speak) С Aggressive: 24K токенов отправлено (экономия 50% — устаревание + суммаризация) С Ultra: 12K токенов отправлено (экономия 75% — эвристическое отсечение) С RTK: 19K-5K токенов отправлено (экономия 60-90% на выводе команд/инструментов) С Stacked: 10K-2.5K токенов отправлено (диапазон экономии 78-95% для данных, подходящих для RTK+Caveman) ``` --- ## Конфигурация ### Панель управления Перейдите в `Dashboard → Context & Cache`: - **Caveman** — выбор режима, языковые пакеты, предварительный просмотр и глобальные настройки по умолчанию - **RTK** — предварительный просмотр фильтрации команд, настройки безопасности RTK и каталог фильтров - **Комбинации сжатия** — именованные конвейеры движков, назначенные комбинациям маршрутизации - **Порог автозапуска** — автоматическое включение сжатия, когда количество токенов превышает пороговое значение ### Переопределение для отдельной комбинации В разделе `Dashboard → Context & Cache → Compression Combos` назначьте комбинацию сжатия комбинации маршрутизации: ```txt Комбинация: "free-tier-fallback" Комбинация сжатия: "coding-agent-stack" Конвейер: RTK -> Caveman Целевые модели: 1. if/kimi-k2.7-code 2. if/qwen3.8-max-preview ``` Это позволяет использовать многоступенчатое сжатие для бесплатных провайдеров и провайдеров для программирования, сохраняя облегчённый режим для платных подписок. Это назначение «Переопределение для отдельной комбинации» является отдельным элементом управления и отличается от переопределения **режима сжатия комбинации маршрутизации** (Default/Off/Lite/Standard/Aggressive/Ultra/Codex Responses — схема этого поля также принимает `rtk`, `stacked` и `omniglyph`): это переопределение не выбирает именованный конвейер комбинации сжатия, а лишь задаёт поле `compressionMode`, учитываемое функцией `resolveCompressionPlan`. Его можно задать либо на карточке комбинации (`Dashboard → Combos`), либо, начиная с #6760, для отдельной комбинации маршрутизации в списке «Assign to routing» в разделе `Dashboard → Context & Cache → Compression Combos`, рядом с флажком назначения конвейера, описанным выше. Изменения в обоих интерфейсах сохраняются через один и тот же эндпоинт `PUT /api/combos/{id}`. ### Переопределение для отдельного запроса Передайте заголовок запроса `x-omniroute-compression`, чтобы переопределить план сжатия для одного запроса. Он имеет наивысший приоритет — выше переопределения комбинации маршрутизации, активного профиля, автозапуска и значения Default на панели. Неизвестные значения игнорируются (запрос никогда не отклоняется), а глобальный главный переключатель по-прежнему управляет всем: если сжатие глобально отключено, заголовок не может его включить. Значения: | Значение | Эффект | | ------------- | -------------------------------------------------------------------------------------------------------------------------- | | `off` | Не применять сжатие к этому запросу. | | `default` | Профиль Default, определяемый настройками панели (активный профиль игнорируется). Движки с потерями остаются выключенными. | | `safe` | То же, что и отсутствие заголовка: только дедупликация и свёртывание пробелов. | | `allow-lossy` | Сохранить операторский план этого запроса, включая сводки, фильтры релевантности и перезапись стиля. | | `engine:` | Один движок, если он включён, например `engine:rtk`. Это включение данного движка для отдельного запроса. | | `` | Именованная комбинация: сначала выполняется сопоставление по имени без учёта регистра, затем по id. | Без `allow-lossy`, `engine:` или именованной комбинации движки с потерями не применяются. Если сжатие включено, к запросу по-прежнему применяются дедупликация сеанса и свёртывание пробелов. Применённый план возвращается в заголовке ответа `X-OmniRoute-Compression: ; source=`, где `` — одно из значений: `request-header`, `routing-override`, `active-profile`, `auto-trigger`, `default` или `off`. ### API ```bash # Получить настройки сжатия curl http://localhost:20128/api/settings/compression # Обновить настройки сжатия curl -X PUT http://localhost:20128/api/settings/compression \ -H "Content-Type: application/json" \ -d '{"defaultMode":"stacked","autoTriggerMode":"stacked","autoTriggerTokens":32000}' # Предварительно просмотреть конкретную полезную нагрузку RTK/stacked curl -X POST http://localhost:20128/api/compression/preview \ -H "Content-Type: application/json" \ -d '{"mode":"rtk","messages":[{"role":"tool","content":"npm test output here"}]}' # Вывести список пакетов фильтров RTK curl http://localhost:20128/api/context/rtk/filters # Протестировать RTK напрямую с необязательными метаданными команды curl -X POST http://localhost:20128/api/context/rtk/test \ -H "Content-Type: application/json" \ -d '{"command":"npm test","text":"FAIL tests/example.test.ts\nError: boom"}' ``` --- ## Что защищается Механизм сжатия **всегда сохраняет:** - ✅ Блоки кода (ограждённые и встроенные) - ✅ URL-адреса и пути к файлам - ✅ JSON-структуры и структурированные данные - ✅ Идентификаторы и защищённые технические токены - ✅ Математические выражения - ✅ Определения вызовов инструментов/функций - ✅ Системные промпты (в режиме Lite) При восстановлении необработанного вывода RTK перед сохранением маскируются распространённые API-ключи, bearer-токены, токены Slack, ключи доступа AWS, пароли, токены и секреты. --- ## Статистика сжатия Каждый сжатый запрос содержит статистику в журналах сервера: ```json { "originalTokens": 47200, "compressedTokens": 40120, "savingsPercent": 15.0, "techniquesUsed": ["collapseWhitespace", "dedupSystemPrompt"], "mode": "lite", "engine": "caveman", "compressionComboId": "coding-agent-stack", "durationMs": 0.8, "rtkRawOutputPointers": [] } ``` --- ## План этапов | Этап | Режимы | Статус | | ------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ----------- | | Этап 1 | Off, Lite | ✅ Выпущено | | Этап 2 | Standard, Aggressive, Ultra | ✅ Выпущено | | Этап 3 | RTK, Stacked, комбинации сжатия | ✅ Выпущено | | Этап 4 | Стили вывода, Ultra уровня SLM, инфраструктура оценки | ✅ Выпущено | | Этап 4C | Адаптивный бюджет контекста («регулятор») — вычислительный движок + API (`contextBudget` в `PUT /api/settings/compression`) + элементы управления режимами/политиками на панели | ✅ Выпущено | --- ## Благодарности Правила сжатия режима Standard вдохновлены проектом **[Caveman](https://github.com/JuliusBrussee/caveman)** от **[JuliusBrussee](https://github.com/JuliusBrussee)** (⭐ 51K+) — ставшим вирусным проектом «зачем использовать много токен, когда мало токен делать дело». По данным Caveman, проект обеспечивает на `~75%` меньше токенов вывода, среднюю экономию вывода в тестах на уровне `65%`, диапазон экономии вывода `22-87%` и инструмент сжатия ввода на `~46%`. Режим RTK вдохновлён **[RTK - Rust Token Killer](https://github.com/rtk-ai/rtk)** от **[RTK AI](https://github.com/rtk-ai)** — высокопроизводительным проектом сжатия вывода команд для фильтрации вывода терминала, сборки, тестов, git и инструментов. По данным RTK, экономия составляет `60-90%`, а в примере сеанса из README показана экономия `~80%`. --- ## Продвинутые системы сжатия Помимо 7 режимов, описанных выше (исходный код также поддерживает режимы `codex-responses` и `omniglyph`, которые не рассматриваются в этом руководстве), следующие разделы посвящены функциям, работающим внутри этих режимов или совместно с ними: сжатие результатов инструментов и прогрессивное старение являются шагами 1 и 2 агрессивного движка (режим Aggressive и шаг `aggressive` составного конвейера), составной конвейер определяет работу режима Stacked, сжатие с учётом кеша понижает `aggressive` и `ultra` до `standard` для провайдеров с кешированием, когда сжатие включено, а режим вывода Caveman и стили вывода представляют собой необязательные инструкции системного промпта, по умолчанию отключённые, которые определяют формат ответа модели вместо сжатия запроса. ### Сжатие с учётом кеша Некоторые провайдеры (например, Anthropic с кешированием промптов) поддерживают **кеширование промптов**, позволяющее кешировать части промпта для снижения затрат и задержки. Когда кеширование включено, агрессивное сжатие может фактически **ухудшить** производительность, поскольку оно изменяет кешированные токены, делая кеш недействительным. Модуль `cachingAware.ts` решает эту проблему, **обнаруживая контекст кеширования** и **соответствующим образом корректируя стратегию сжатия**. #### Как это работает 1. **Обнаружение контекста кеширования** — сканирует тело запроса на наличие маркеров `cache_control` 2. **Определение провайдеров с кешированием** — проверяет, поддерживает ли целевой провайдер кеширование 3. **Корректировка стратегии** — понижает `aggressive`/`ultra` до `standard` для провайдеров с кешированием 4. **Пропуск системного промпта** — системные промпты обычно кешируются, поэтому их не следует сжимать Вспомогательная функция стратегии также возвращает флаг `deterministicOnly`, однако построитель плана использует только стратегию — в настоящее время этот флаг больше нигде не считывается. #### Пример кода ```ts import { detectCachingContext, getCacheAwareStrategy, } from "@omniroute/open-sse/services/compression/cachingAware"; const body = { model: "anthropic/claude-sonnet-4.5", messages: [{ role: "user", content: "Hello" }], cache_control: { type: "ephemeral" }, // ← Маркер кеша }; const ctx = detectCachingContext(body, { provider: "anthropic" }); // → { hasCacheControl: true, provider: "anthropic", targetFormat: null, isCachingProvider: true } const strategy = getCacheAwareStrategy("aggressive", ctx); // → { strategy: "standard", skipSystemPrompt: true, deterministicOnly: true } ``` #### Когда использовать Сжатие с учётом кеша **всегда включено** — настройка не требуется. Оно срабатывает всякий раз, когда сжатие включено и целевой провайдер поддерживает кеширование промптов (Anthropic, OpenAI и т. д.); явные маркеры `cache_control` не требуются — одного провайдера с кешированием достаточно для понижения стратегии, а одни только маркеры никогда его не вызывают (обнаружение маркеров используется для телеметрии кеша, а не для принятия решения о стратегии). ### Прогрессивное старение В длинных диалогах накапливается множество реплик, однако старые реплики становятся менее актуальными. Модуль `progressiveAging.ts` **упрощает сообщения в зависимости от расстояния в репликах** (расстояние отсчитывается от конца диалога). При стандартных значениях (`verbatim: 2, light: 2, moderate: 3`): - **Последние 2 реплики (расстояние ≤ 2)**: сохраняются дословно - **Расстояние 3**: сжатие Caveman (удаление слов-паразитов) - **Расстояние 4+**: сообщения ассистента резюмируются; пользовательские сообщения сокращаются до первой строки с ограничением в 120 символов; остальные роли остаются без изменений. Системные промпты, уже состаренные сообщения и последнее пользовательское сообщение всегда сохраняются дословно независимо от расстояния. Ничто не удаляется полностью, а диапазон `light` недостижим при стандартных значениях (`light` равен `verbatim`). #### Пример кода ```ts import { applyAging } from "@omniroute/open-sse/services/compression/progressiveAging"; const messages = [ { role: "system", content: "You are a helpful assistant" }, { role: "user", content: "What is 2+2?" }, { role: "assistant", content: "4" }, // ... ещё 50 реплик ... ]; const { messages: aged, saved } = applyAging(messages, { verbatim: 3, // последние 3 реплики: дословно light: 8, // расстояние <= 8: лёгкое сжатие moderate: 20, // расстояние <= 20: сжатие caveman fullSummary: 5, // требуется типом, но не считывается кодом распределения по диапазонам // расстояние > 20: резюмирование (assistant) / сохранение первой строки (user) }); // saved = количество сэкономленных токенов ``` #### Когда использовать Прогрессивное старение **всегда включено** в режиме `aggressive` — это шаг 2 функции `compressAggressive()`. В режиме Ultra оно не выполняется. Оно особенно эффективно для: - Длительных сеансов программирования - Многодневных диалогов - Агентных рабочих процессов с большим количеством вызовов инструментов ### Режим вывода Caveman Режим вывода Caveman добавляет **инструкции системного промпта**, предписывающие самой модели давать краткие ответы: уровень `lite` запрашивает лаконичные ответы с сохранением полных предложений, `full` просит её «отвечать кратко, как умный пещерный человек», а `ultra` запрашивает телеграфный стиль; инструкции лишь формулируют просьбу и не могут гарантировать её выполнение. Запросы получают их через `applyOutputStyles()` (`open-sse/services/compression/outputStyles/apply.ts`): `open-sse/handlers/chatCore.ts` сначала определяет выбранный вариант с помощью слоя обратной совместимости (`resolveOutputStyleSelection()` в `open-sse/services/compression/outputStyles/backCompat.ts`), который при пустом `outputStyles` сопоставляет включённый `cavemanOutputMode` со стилем вывода `terse-prose` с интенсивностью `cavemanOutputMode.intensity` (см. раздел об обратной совместимости ниже); непустой набор `outputStyles` используется как есть, после чего `cavemanOutputMode.enabled` и `intensity` больше ни на что не влияют, однако переключатель `autoClarity` продолжает применяться. В `outputMode.ts` находятся тексты инструкций (`CAVEMAN_INSTRUCTION_BY_LANGUAGE`), логика обхода для содержимого и вспомогательная функция размещения, используемая при внедрении; собственный инъектор `applyCavemanOutputMode()` не вызывается в рабочем коде. #### Как это работает Этот режим не сжимает входные данные. Он добавляет блок инструкций в системный промпт (см. раздел «Как работает внедрение» ниже), после чего любой выбранный для запроса режим сжатия входных данных всё равно выполняется над содержимым, которое теперь включает этот блок. Перед общим разделом с ограничениями, которым завершается каждый уровень, английский уровень `full` содержит: > "Отвечай кратко, как умный пещерный человек. Опускай артикли (a/an/the), слова-паразиты (just/really/basically/actually/simply), любезности, оговорки. Фрагменты допустимы. Короткие синонимы (big, а не extensive; fix, а не implement). Сохраняй без изменений всю техническую суть, код, ошибки, URL-адреса и идентификаторы." Это особенно хорошо подходит для: - Генерации кода (более лаконичный вывод = меньше токенов) - Быстрых вопросов и ответов (не нужны развёрнутые объяснения) - Пакетной обработки (максимальная пропускная способность) #### Когда использовать Режим пещерного вывода является **опциональным**. При включённом сжатии (`enabled: true`, главный переключатель на странице настроек сжатия) включите его с помощью `cavemanOutputMode.enabled`; `intensity` выбирает `lite`, `full` или `ultra`: ```json { "enabled": true, "cavemanOutputMode": { "enabled": true, "intensity": "full" } } ``` Переключатель **Output Mode** комбинации сжатия (`outputMode`, уровень в `outputModeIntensity`) устанавливает тот же параметр для запросов, к которым применяется эта комбинация, а инструмент MCP `omniroute_set_compression_engine` записывает его через свой логический аргумент `outputMode`. Непустой выбор `outputStyles` имеет приоритет над этим переключателем. На панели управления включение стиля вывода **Terse prose** внедряет тот же блок (см. раздел «Стили вывода» ниже). ### Стили вывода (каталог) Описанный выше режим пещерного вывода — это **устаревший путь с одним стилем**. В фазе 4 он был обобщён до каталога комбинируемых стилей вывода: `OUTPUT_STYLE_CATALOG` в `open-sse/services/compression/outputStyles/catalog.ts`. Каждый стиль представляет собой инструкцию системного промпта, предлагающую самой модели формировать более экономный вывод; стили можно включать одновременно, и они внедряются в порядке каталога. | Стиль | `id` | Что он делает | Языки инструкций | | ------------------------------------------- | --------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------- | | Лаконичная проза | `terse-prose` | Убирает слова-паразиты, артикли и оговорки; сохраняет техническую суть без изменений. Тот же текст, что и в устаревшем режиме пещерного вывода (используется по ссылке, а не дублируется). | en, pt-BR, es, de, fr, it, ru, zh, ja, id, vi | | Меньше кода | `less-code` | Лестница YAGNI: минимальное работающее изменение, никаких незапрошенных абстракций. | en, pt-BR, es, de, fr, it, ru, zh, ja, id, vi | | Хвостик (ленивый старший разработчик) | `ponytail` | «Лучший код — код, который никогда не был написан»: повторное использование > переписывание, первопричина > симптом, кратчайший работающий diff. | en, pt-BR, es, de, fr, it, ru, zh, ja, id, vi | | У меня СДВГ (сначала действие) | `i-have-adhd` | Сначала действие (команда/путь/фрагмент кода перед пояснением), нумерованные ограниченные шаги, ОДИН конкретный следующий шаг, без преамбулы, резюме и заключительных фраз. Адаптировано из [ayghri/i-have-adhd](https://github.com/ayghri/i-have-adhd) (MIT). | en, pt-BR, es, de, fr, it, ru, zh, ja, id, vi | | Антислоп-фильтр интерфейса | `antislop-ui` | Каждый визуальный приём должен пройти проверку на целесообразность (иерархия, идентичность, читаемость); никаких градиентов, стекла или свечения по умолчанию, ограниченная палитра, никаких шаблонных макетов. Оба антислоп-стиля добавляют ограничение: никаких неработающих элементов управления и выдуманных утверждений. | en, pt-BR, es, de, fr, it, ru, zh, ja, id, vi | | Антислоп-фильтр текста и удобства для людей | `antislop-copy` | Конкретный текст (без длинных тире, шаблонных призывов к действию, модных словечек, заключительных фраз чат-бота и выдуманных фактов), а также правила для пользователей: контрастность WCAG AA, видимый фокус, доступность с клавиатуры, пустые состояния, состояния загрузки и ошибки, перестроение на мобильных устройствах. | en, pt-BR, es, de, fr, it, ru, zh, ja, id, vi | | Лаконичный CJK (文言) | `terse-cjk` | На уровнях `full`/`ultra` отвечает на классическом китайском языке (文言); на уровне `lite` лишь запрашивает краткие ответы без служебных слов, любезностей или украшательств. | zh (ограничено локалью, см. ниже) | Каждый стиль поставляется с тремя уровнями интенсивности — `lite`, `full`, `ultra` — и каждый уровень завершается общим разделом с ограничениями (`SHARED_BOUNDARIES` в `outputMode.ts`), который сохраняет без изменений блоки кода, пути к файлам, команды, ошибки и URL-адреса. Тексты уровней `terse-prose` и `terse-cjk` также добавляют в этот список идентификаторы. `terse-cjk` ограничен локалью `zh` в двух местах. На странице настроек сжатия его строка отображается только тогда, когда языком интерфейса панели управления является китайский (`zh-CN` или `zh-TW`), а `applyOutputStyles()` внедряет его только тогда, когда определённым языком запроса (см. раздел «Выбор языка» ниже) является `zh`. Скрытие строки не удаляет сохранённый выбор `terse-cjk`: API настроек принимает любой идентификатор стиля, а сохранение других стилей на странице сохраняет и его. Во время запроса проверка языка в `applyOutputStyles()` является единственным ограничением по локали. #### Как работает внедрение `applyOutputStyles()` (`open-sse/services/compression/outputStyles/apply.ts`) сопоставляет выбор с каталогом (неизвестные идентификаторы и стили, не соответствующие локали, отбрасываются, но никогда не вызывают ошибку; если в результате сопоставления не выбран ни один стиль, тело остаётся без изменений, а обработка пропускается с причиной `no_styles`), объединяет выбранные инструкции в порядке каталога, однократно добавляет условие о границах **один раз** (а также условие безопасности, `SAFETY_BOUNDARIES` или его перевод, если выбран `less-code` или `ponytail`) и начинает блок с единственного маркера идемпотентности (`[OmniRoute Output Styles]`), поэтому повторное применение ничего не меняет. Если для определённого языка (см. раздел о выборе языка ниже) существует перевод, вместо английской инструкции вставляется локализованная. Если тело содержит непустой массив `messages`, проверка идемпотентности выполняется до проверки обхода по содержимому: если маркер `[OmniRoute Output Styles]` уже присутствует в поле верхнего уровня `system` (строке или массиве блоков содержимого) либо в системном сообщении со строковым содержимым, тело остаётся без изменений с причиной `already_applied`, а проверка ключевых слов не выполняется. В противном случае механизм обхода по содержимому (`shouldBypassCavemanOutputMode()` в `open-sse/services/compression/outputMode.ts`) проверяет текст последних трёх сообщений независимо от их роли и пропускает стили для всего хода, если этот текст соответствует ключевым словам, связанным с безопасностью, необратимыми действиями или уточнением, либо содержит последовательность с учётом порядка: `first`, `then`, `after that`, `before`, `rollback` или `backup`, после чего в пределах 240 символов следует `delete`, `drop`, `migrate`, `deploy` или `release`. Обход действует, пока включён переключатель **Auto-Clarity Bypass** (`cavemanOutputMode.autoClarity`, включён по умолчанию); отключение переключателя отменяет проверку ключевых слов. Если обход не блокирует ход, `placeSystemInstruction()` (в том же файле), которая никогда не создаёт новый `messages[0]`, размещает блок в первом найденном месте из следующих: 1. Начальное системное сообщение со строковым содержимым: блок добавляется после его текста. 2. Поле верхнего уровня `system`: блок добавляется после текста строки либо как новый текстовый блок в массив блоков содержимого. 3. Первое последующее системное сообщение со строковым содержимым: блок добавляется после его текста. 4. Ничего из перечисленного: блок помещается в новое системное сообщение в конце `messages`. Если тело не содержит массив `messages` (либо содержит пустой массив), обход по содержимому не выполняется, а поле верхнего уровня `system` не учитывается. Блок добавляется после текста строкового поля `instructions`, если только это поле уже не содержит маркер `[OmniRoute Output Styles]`; в таком случае тело остаётся без изменений с причиной `already_applied`. Если в теле нет строкового поля `instructions`, но присутствует `input` (строка или массив), блок становится значением `instructions`, заменяя любое находившееся там нестроковое значение. Тело, в котором нет ни строкового поля `instructions`, ни строкового или массивного поля `input`, остаётся без изменений, а обработка пропускается с причиной `no_messages`. #### Как включить На панели управления: **Контекст сжатия → Настройки сжатия** (`/dashboard/context/settings`), раздел стилей вывода: по одной строке на каждый стиль с переключателем включения/выключения и выбором уровня. Стили применяются, пока включено само сжатие (главный переключатель страницы, `enabled`). Переключатель **Auto-Clarity Bypass** находится на странице **Caveman** (`/dashboard/context/caveman`), в карточке **Output Mode**. При программной настройке конфигурация сжатия сохраняет выбор в следующем виде: ```json { "outputStyles": [ { "id": "i-have-adhd", "level": "full" }, { "id": "less-code", "level": "lite" } ] } ``` Обратная совместимость: пока `outputStyles` пуст, устаревшая настройка `cavemanOutputMode.enabled` сопоставляется с `terse-prose` на уровне `cavemanOutputMode.intensity`. В этом случае блок начинается с маркера `[OmniRoute Output Styles]`, тогда как устаревший механизм `applyCavemanOutputMode()` вставлял `[OmniRoute Caveman Output Mode]`. Ниже маркера текст совпадает с устаревшей вставкой для en, pt-BR, es, de, fr, it, ru, id и vi; для ja и zh перед условием о границах присутствует один дополнительный пробел. `terse-prose` переведён на pt-BR, es, de, fr, it, ru, zh, ja, id и vi, поэтому для запроса, язык которого определён как `hu`, используется английский текст, тогда как устаревший механизм вставки использовал венгерский. Выбор языка стиля вывода (`resolveOutputStyleLanguage()` в `outputStyles/apply.ts`): если `languageConfig.enabled` включён, режим `autoDetect` берёт последнее пользовательское сообщение с текстом из массива `messages` запроса (строковое содержимое либо `text` его частей содержимого) и запускает для него детектор движка Caveman (`detectCompressionLanguage()`). Детектор возвращает `zh` для текста, содержащего символы хань, но не содержащего кану; в остальных случаях он возвращает тот из языков `it`, `pt-BR`, `es`, `de`, `fr`, `ru`, `ja`, `hu` и `id`, для которого найдено больше всего совпадений с подсказками, либо `en`, если совпадений нет. Для текста, который невозможно классифицировать, используется английский язык, а не `defaultLanguage`; при этом `vi` никогда не определяется, хотя стили содержат текст на `vi`. В теле Responses API ходы хранятся в `input`, который не анализируется, поэтому для него используется `defaultLanguage`, а затем английский язык. Если ни одно пользовательское сообщение в `messages` не содержит текста либо `autoDetect` выключен, применяется `defaultLanguage`, а затем английский язык. Если `languageConfig.enabled` выключен, используется английский язык — кроме случаев, когда к запросу применяется комбинация сжатия (комбинация, назначенная комбинации маршрутизации запроса, либо комбинация сжатия по умолчанию, к которой chatCore обращается для встроенного многоступенчатого конвейера): применение комбинации включает `languageConfig.enabled` для этого запроса и задаёт `defaultLanguage` на основе языковых пакетов комбинации (сохранённое значение, если оно входит в число пакетов комбинации; в противном случае — первый пакет комбинации, которым по умолчанию является `en`), при этом сохранённая настройка `autoDetect` (включённая по умолчанию) продолжает действовать. Движок ввода Caveman выбирает язык пакета правил иначе — отдельно для каждой текстовой части, а при отключённом автоматическом определении выбор также ограничивается `enabledPacks`. Матрица «стиль × язык» закреплена тестом `tests/unit/compression/output-styles-i18n-matrix.test.ts`: для каждого стиля каталога должна быть запись в `BASELINE_LANGUAGES`; стиль, не ограниченный локалью, должен поставляться с переводом на pt-BR (стиль `terse-cjk`, ограниченный локалью, освобождён от этого требования), если только он не указан в `KNOWN_ENGLISH_ONLY`, где могут находиться только стили, вообще не имеющие переводов — если указанный там стиль имеет хотя бы один перевод, тест завершается неудачей; кроме того, стиль не проходит тест, если утрачивает язык, указанный в соответствующей ему записи `BASELINE_LANGUAGES`. Чтобы добавить стиль, см. [EXTENDING_COMPRESSION.md](./EXTENDING_COMPRESSION.md#adding-an-output-style). ### Сжатие результатов инструментов `compressToolResult()` в `open-sse/services/compression/toolResultCompressor.ts` сжимает текст результатов инструментов с помощью **5 стратегий**. Они проверяются в следующем порядке, и результат определяет первая включённая стратегия, проверка которой соответствует содержимому: 1. **`fileContent`**: для содержимого из 3 или более строк, в котором хотя бы одна строка без учёта начального отступа начинается с `import `, `export `, `function `, `class `, `const `, `let `, `var ` или `return ` (ключевое слово плюс пробел), либо с `if`, `for` или `while`, за которыми следует `(` или ` (`, сохраняются первые 20 и последние 5 строк, а пропущенная середина отмечается. 2. **`grepSearch`**: для содержимого хотя бы с одной строкой вида `::`, где текст перед первым двоеточием не содержит пробелов, сохраняются только такие строки, не более 30, после чего указываются количество остальных совпадений и список файлов с совпадениями; все прочие строки удаляются. Для срабатывания стратегии достаточно одной такой строки, поэтому строка журнала, начинающаяся с временной метки наподобие `12:30:45`, также учитывается. 3. **`shellOutput`**: из вывода, содержащего управляющую последовательность ANSI CSI (`ESC[`, затем цифры или точки с запятой, а после них буква, как в цветовых кодах) либо символ `$`, за которым в любом месте текста следует пробельный символ, такие последовательности удаляются (другие управляющие последовательности, например `ESC[?25l` или OSC-последовательность заголовка окна, сохраняются), а также сохраняются последние 50 строк со свёртыванием последовательных повторяющихся строк. Поскольку эта проверка выполняется раньше `json` и `errorMessage`, вывод JSON или сообщение об ошибке, содержащее такой `$`, никогда не доходит до них, пока включена `shellOutput`. 4. **`json`**: JSON-данные длиной более 2 000 символов, которые начинаются с `{` или `[` (после необязательных пробельных символов) и успешно разбираются, сводятся к краткому виду: для массива из более чем 7 элементов сохраняются первые 5 и последние 2 элемента, а также общее количество элементов; для объекта сохраняются первые 20 ключей, при этом значение каждого вложенного объекта или массива заменяется заполнителем `{…N keys}` (для массива N — его длина), а маркер `_remaining__keys` указывает количество ключей, отброшенных после первых 20. Скалярные значения копируются целиком, поэтому объект с 20 или меньшим количеством ключей и без вложенных значений лишь форматируется с отступами — минифицированный объект увеличивается в размере и остаётся без изменений. 5. **`errorMessage`**: для вывода, содержащего в любом месте и в любом регистре `error:`, `error ` (слово с последующим пробелом, как в `no error found`), `[error]`, `exception:`, `exception `, `[exception]` или `traceback`, сохраняются первая строка, следующие 10 строк и последние 3 строки, а строки между ними заменяются маркером `… [N frames elided] …`. Маркер появляется только тогда, когда после первой строки следует более 13 строк, поэтому вывод ошибки из 14 или менее строк не сокращается (при 12 или 13 строках последние 3 строки дублируют уже сохранённые). После срабатывания стратегии последующие стратегии не проверяются, даже если сработавшая стратегия ничего не сэкономила. Если соответствующая стратегия не экономит расчётные токены (длина ÷ 4 с округлением вверх) — например, для кодоподобного файла из 25 или менее строк либо JSON-массива длиной более 2 000 символов, содержащего 7 или менее элементов, — агрессивный движок сохраняет исходный результат инструмента: оба вызывающих метода (`compressAggressive()` и `compressAnthropicToolResultBlock()`) сохраняют оригинал, когда `saved` равен 0 или меньше, хотя сама `compressToolResult()` по-прежнему возвращает результат этой стратегии. Этап обработки результата инструмента не является окончательным: резервный суммаризатор движка всё равно может сократить сообщение `tool` или `function` длиной более 8 192 символов (`maxTokensPerMessage`, 2 048, умноженное на 4). #### Когда использовать Сжатие результатов инструментов — это этап 1 агрессивного движка (`compressAggressive()` в `open-sse/services/compression/aggressive.ts`), поэтому оно выполняется в режиме Aggressive и на этапе `aggressive` составного конвейера. Оно сжимает сообщения `tool` и `function` в формате OpenAI, а также текст внутри блоков Anthropic `tool_result`. Для каждой стратегии предусмотрен собственный переключатель в `aggressive.toolStrategies`; по умолчанию все они включены. На панели управления переключатели находятся в представлении **Advanced** страницы Caveman, когда сжатие включено, а режимом по умолчанию выбран Aggressive. ### Составной конвейер В составном режиме **несколько движков выполняются последовательно** — обычно сначала RTK (экономия 60–90% для вывода инструментов), затем Caveman для оставшегося текста (экономия входных данных ~46%). В сочетании это даёт **допустимый диапазон 78–95%** (см. раздел «Расчёт экономии выше по потоку» выше): `1 - (1 - 0.60..0.90) × (1 - 0.46)` — в среднем ≈89%. #### Как это работает ``` Входные данные (1000 токенов) → RTK (фильтр с учётом команд) → 200 токенов → Caveman (удаление избыточного текста) → 108 токенов → Выходные данные (108 токенов, экономия ~89%) ``` #### Когда использовать Используйте составной режим для: - Рабочих процессов с интенсивным применением инструментов (агентное программирование, исследования) - Пакетной обработки, чувствительной к стоимости - Случаев, когда требуется максимальная экономия токенов Составные конвейеры настраиваются с помощью глобального параметра сжатия `stackedPipeline` либо с помощью именованной комбинации сжатия, назначенной комбинации маршрутизации (см. раздел «Переопределение для отдельных комбинаций» выше), — но не через `modePack` автоматической комбинации (это поле только изменяет веса выбора модели автоматической комбинацией, а `stacked` не является допустимым именем пакета). --- ## Переопределение комбинаций сжатия Вы можете переопределить глобальный режим сжатия **для каждой комбинации**, чтобы точно настроить поведение для различных сценариев использования: ```json { "id": "coding-combo", "strategy": "priority", "config": { "weights": { "taskFit": 0.5 }, "modePack": "quality-first" }, "compressionOverride": "aggressive" } ``` Это полезно для: - **Комбинаций для программирования**: используйте режим `aggressive` для длительных сессий - **Комбинаций для быстрых вопросов и ответов**: используйте режим `lite` для быстрых ответов - **Комбинаций с интенсивным использованием инструментов**: используйте режим `stacked` для максимальной экономии - **Комбинаций для промышленной эксплуатации**: не включайте переопределение для провайдеров с кэшированием — постоянно активная корректировка с учётом кэша автоматически понижает `aggressive`/`ultra` до `standard` (режим `cache-aware` нельзя выбрать) --- ## См. также - [Настройка окружения](../reference/ENVIRONMENT.md) — переменные окружения для сжатия - [Руководство по архитектуре](../architecture/ARCHITECTURE.md) — внутреннее устройство конвейера сжатия - [Руководство пользователя](../guides/USER_GUIDE.md) — начало работы со сжатием - [Сжатие RTK](./RTK_COMPRESSION.md) — фильтры RTK, модель доверия, шлюз проверки, восстановление необработанного вывода - [Механизмы сжатия](./COMPRESSION_ENGINES.md) — Caveman, RTK, stacked, API, MCP, панель мониторинга - [Формат правил сжатия](./COMPRESSION_RULES_FORMAT.md) — формат пакета правил JSON - [Языковые пакеты сжатия](./COMPRESSION_LANGUAGE_PACKS.md) — правила Caveman для конкретных языков