RTK Compression (Русский)
Уровни интенсивности (v3.8.16+)
Заголовок раздела «Уровни интенсивности (v3.8.16+)»RTK поддерживает 3 уровня интенсивности, обеспечивающих компромисс между агрессивностью сжатия и безопасностью. Уровень задаётся через config.intensity в конфигурации движка.
3 уровня
Заголовок раздела «3 уровня»| Уровень | Порог усечения | Экономия токенов | Риск | Лучше всего подходит для |
|---|---|---|---|---|
minimal |
24 строки на раздел | ~20-40% | Очень низкий | Продакшена с критически важным контекстом |
standard (по умолчанию) |
24 строки на раздел | ~50-70% | Низкий | Ежедневных сеансов программирования |
aggressive |
16 строк на раздел | ~70-90% | Средний | Длительных сеансов, максимальной экономии |
Где происходит усечение
Заголовок раздела «Где происходит усечение»Порог усечения влияет на lineFilter.ts:
// Из open-sse/services/compression/engines/rtk/index.ts:329-330config.intensity === "aggressive" ? 16 : 24,config.intensity === "aggressive" ? 16 : 24,Сохраняются как начало, так и конец каждого раздела; при срабатывании усечения содержимое в середине удаляется.
Что сохраняется, а что удаляется
Заголовок раздела «Что сохраняется, а что удаляется»| Содержимое | minimal | standard | aggressive |
|---|---|---|---|
| Ошибки / трассировки стека | ✅ сохраняются | ✅ сохраняются | ✅ сохраняются |
| Неудачные тесты | ✅ сохраняются | ✅ сохраняются | ✅ сохраняются |
| Ошибки сборки | ✅ сохраняются | ✅ сохраняются | ✅ сохраняются |
| Успешные тесты (подробный вывод) | ✅ сохраняются | 🟡 сворачиваются | 🟡 сворачиваются |
| Обычный вывод (информационные логи) | 🟡 сворачивается | 🟡 сворачивается | ❌ удаляется |
| Индикаторы выполнения | 🟡 сворачиваются | ❌ удаляются | ❌ удаляются |
| Баннеры / ASCII-графика | 🟡 сворачиваются | ❌ удаляются | ❌ удаляются |
Выбор подходящей интенсивности
Заголовок раздела «Выбор подходящей интенсивности» Потеря контекста катастрофична? │ ┌───────────┼───────────┐ │ │ │ ДА НЕТ НЕ УВЕРЕНЫ │ │ │ ▼ │ │ minimal │ │ │ │ │ │ ▼ ▼ │ Насколько важна Сначала попробуйте `standard` │ пропускная (подходит для 80% │ способность? случаев) │ │ │ ┌────┴────┐ │ │ │ │ НИЗКАЯ ВЫСОКАЯ │ │ │ │ ▼ ▼ │ standard aggressive │ │ │ └──────┴─────────┘Настройка интенсивности
Заголовок раздела «Настройка интенсивности»Для отдельной комбинации (в конфигурации комбинации):
{ "combo": "my-coding-combo", "routing": {/* ... */}, "compression": { "engine": "rtk", "intensity": "aggressive" }}Программно:
rtkEngine (@omniroute/open-sse/services/compression/engines/rtk) является
CompressionEngine и не имеет метода updateConfig. Обновляйте конфигурацию движка
с помощью вспомогательной функции реестра:
import { updateEngineConfig } from "@omniroute/open-sse/services/compression/engines/registry";
updateEngineConfig("rtk", { intensity: "aggressive" });Проверка эффекта
Заголовок раздела «Проверка эффекта»Используйте проверочный шлюз (см. ниже), чтобы убедиться, что ваш фильтр безопасен при выбранной интенсивности:
import { runRtkFilterTests } from "omniroute/compression/engines/rtk/verify";
const result = runRtkFilterTests({ intensity: "aggressive" });if (!result.passed) { console.error("Сбой фильтров при агрессивной интенсивности");}Разработка пользовательских фильтров (v3.8.16+)
Заголовок раздела «Разработка пользовательских фильтров (v3.8.16+)»Каталог engines/rtk/filters/ содержит более 49 встроенных JSON-файлов фильтров. Вы можете добавлять собственные фильтры для сжатия вывода пользовательских инструментов, не поддерживаемых по умолчанию.
Схема фильтра (Zod)
Заголовок раздела «Схема фильтра (Zod)»{ "id": "string", // Обязательно. Идентификатор фильтра (kebab-case, например, "python-traceback") "label": "string", // Обязательно. Понятное человеку название фильтра "description": "string", // Необязательно (по умолчанию: ""). Краткое описание назначения фильтра "category": "git|test|build|shell|docker|package|infra|cloud|generic", "priority": number, // Необязательно (0–100, по умолчанию: 50). Порядок выполнения (чем выше, тем раньше) "match": { "commands": ["string"], // Имена команд для сопоставления (например, "python", "pytest") "patterns": ["string"], // Регулярные выражения для сопоставления с выводом "outputTypes": ["string"] // Обнаруженные классы вывода (например, "test-failure") }, "rules": { "stripAnsi": boolean, // Необязательно (по умолчанию: false). Удалять цветовые ANSI-коды "replace": [ // Правила поиска и замены (по умолчанию: []) { "pattern": "regex", "replacement": "..." } ], "matchOutput": [ // Немедленно завершить обработку при совпадении с шаблоном (по умолчанию: []) { "pattern": "regex", "message": "short summary", "unless": "regex" // Пропустить, если этот шаблон совпадает } ], "includePatterns": ["string"], // Строки, которые нужно сохранить (регулярные выражения, по умолчанию: []) "dropPatterns": ["string"], // Строки, которые нужно удалить (регулярные выражения, по умолчанию: []) "collapsePatterns": ["string"], // Строки, которые нужно свернуть до одного вхождения (по умолчанию: []) "deduplicate": boolean, // Необязательно (по умолчанию: false). Удалять повторяющиеся строки "truncateLineAt": number, // Необязательно (по умолчанию: 0). Обрезать строки до максимального количества символов "maxLines": number, // Необязательно (по умолчанию: 0). Жёсткое ограничение общего количества строк "headLines": number, // Необязательно (по умолчанию: 20). Сохранять первые N строк совпавшего вывода "tailLines": number, // Необязательно (по умолчанию: 20). Сохранять последние N строк совпавшего вывода "onEmpty": "string", // Необязательно (по умолчанию: ""). Резервное сообщение, если все строки отфильтрованы "filterStderr": boolean // Необязательно (по умолчанию: false). Также фильтровать вывод stderr }, "preserve": { "errorPatterns": ["string"], // Шаблоны, которые всегда должны сохраняться (по умолчанию: []) "summaryPatterns": ["string"] // Шаблоны итоговой строки (по умолчанию: []) }, "tests": [ // Встроенные тесты для проверки (по умолчанию: []) { "name": "string", // Обязательно. Название теста "input": "sample output", // Обязательно. Пример входного текста "expected": "expected output", // Обязательно. Ожидаемый сжатый вывод "command": "optional command" // Необязательно. Контекст команды } ]}Пример: фильтр трассировки Python
Заголовок раздела «Пример: фильтр трассировки Python»{ "id": "python-traceback", "label": "Python Traceback Filter", "description": "Compresses Python tracebacks to essential file/line locations and error type", "category": "test", "priority": 60, "match": { "commands": ["python", "python3", "pytest", "uv", "poetry"], "patterns": ["Traceback \\(most recent call last\\)", "Error", "Exception"], "outputTypes": ["error-traceback"] }, "rules": { "stripAnsi": true, "includePatterns": [ "Traceback \\(most recent call last\\)", "^\\s*File \".+\", line \\d+", "^\\s*[A-Z][a-zA-Z]+Error:", "^\\s*[A-Z][a-zA-Z]+Exception" ], "dropPatterns": ["site-packages/", "^\\s+[a-z_]+\\([^)]*\\)$"], "headLines": 5, "tailLines": 3, "maxLines": 25, "filterStderr": true }, "preserve": { "errorPatterns": ["Error:", "Exception:", "Traceback"], "summaryPatterns": ["^[A-Z][a-zA-Z]+(?:Error|Exception):"] }, "tests": [ { "name": "preserves-error-type-and-location", "input": "Traceback (most recent call last):\n File \"app.py\", line 42, in main\n do_thing()\n File \"lib/utils.py\", line 17, in helper\n return 1 / 0\nZeroDivisionError: division by zero", "expected": "Traceback (most recent call last):\n File \"app.py\", line 42, in main\n File \"lib/utils.py\", line 17, in helper\nZeroDivisionError: division by zero", "command": "python app.py" } ]}Загрузка пользовательских фильтров
Заголовок раздела «Загрузка пользовательских фильтров»Поместите файл в одно из распознаваемых расположений:
~/.omniroute/rtk/filters/my-filter.json # Пользовательский уровень<project>/.rtk/filters/my-filter.json # Уровень проектаФильтры автоматически загружаются при запуске с помощью loadRtkFilters() из open-sse/services/compression/engines/rtk/filterLoader.ts. Загрузчик обнаруживает фильтры в следующих расположениях:
- Встроенный каталог:
open-sse/services/compression/engines/rtk/filters/ - Пользовательский каталог:
~/.omniroute/rtk/filters/ - Каталог проекта:
<project>/.rtk/filters/
Чтобы загрузить фильтры программно:
import { loadRtkFilters } from "@omniroute/open-sse/services/compression/engines/rtk/filterLoader";
// Параметры: customFiltersEnabled (загрузка пользовательских фильтров и фильтров проекта, включена по умолчанию),// trustProjectFilters, refresh.const filters = loadRtkFilters({ customFiltersEnabled: true });Проверка
Заголовок раздела «Проверка»При загрузке фильтры проверяются на соответствие схеме Zod. Фильтр с некорректной структурой не будет загружен, а ошибка будет записана в журнал:
RTK_FILTER_LOADER: filter "my-filter" failed validation: - rules.replace.0.pattern: Invalid regex - match.commands: must not be emptyЧтобы проверить все установленные фильтры, вызовите runRtkFilterTests(), экспортируемую из open-sse/services/compression/engines/rtk/verify.ts.
Рекомендации
Заголовок раздела «Рекомендации»- Всегда включайте
tests[]— они подтверждают, что ваш фильтр работает, и предотвращают регрессии - Используйте
matchOutputдля коротких замыканий — если одной строки достаточно, чтобы передать суть, замените ею весь блок - Предпочитайте
keepвместоstrip— явные правила «всегда сохранять» безопаснее, чем «всегда удалять» - Тестируйте на всех 3 уровнях интенсивности —
minimalне должен ничего менять, аaggressiveвсё равно должен сохранять ошибки - Используйте поле
unless— защищайте короткие замыкания условием «не срабатывать, если присутствует X»
Восстановление необработанного вывода и проверочный шлюз
Заголовок раздела «Восстановление необработанного вывода и проверочный шлюз»Когда RTK агрессивно сжимает вывод, вы можете восстановить исходный текст для отладки, аудита или повторного воспроизведения.
Как работает восстановление необработанного вывода
Заголовок раздела «Как работает восстановление необработанного вывода»Исходный вывод (10K токенов) │ ▼Сжатие RTK (с rawOutput.enabled=true) │ ├─▶ Сжатый вывод (2K токенов) ──▶ в LLM │ └─▶ Исходный вывод (10K токенов) ──▶ сохраняется в БД (связан через request_id)Включение хранения необработанного вывода
Заголовок раздела «Включение хранения необработанного вывода»Для отдельного запроса (в конфигурации combo):
{ "compression": { "engine": "rtk", "intensity": "aggressive", "rawOutput": { "enabled": true, "maxBytes": 1048576 // Ограничение в 1 МБ } }}По умолчанию: rawOutput.enabled: false (экономит место в хранилище).
Затраты на хранение
Заголовок раздела «Затраты на хранение»| На один запрос | Ограничение 1 МБ | Ограничение 10 МБ |
|---|---|---|
| Средний сжатый вывод | ~5 КБ | ~5 КБ |
| Сохранённый исходный вывод | ~50–500 КБ | ~500 КБ–5 МБ |
| При 1000 запросах в день | 50–500 МБ/день | 500 МБ–5 ГБ/день |
Рекомендация: включайте необработанный вывод только для сеансов отладки или выборочного аудита, а не на постоянной основе.
Восстановление исходного вывода
Заголовок раздела «Восстановление исходного вывода»import { readRtkRawOutput } from "omniroute/compression/engines/rtk/rawOutput";
const raw = readRtkRawOutput(pointerId); // pointerId из статистики сжатияif (raw) { console.log("Исходный вывод:", raw);}pointerId возвращается в CompressionStats.rtkRawOutputPointers[] после сжатия.
Сигнатуру функции см. в open-sse/services/compression/engines/rtk/rawOutput.ts:102.
Проверочный шлюз
Заголовок раздела «Проверочный шлюз»Проверка фильтров RTK (open-sse/services/compression/engines/rtk/verify.ts) проверяет все фильтры на соответствие их tests[] и корректность поведения на всех 3 уровнях интенсивности.
Вызовите runRtkFilterTests(), чтобы запустить проверку:
import { runRtkFilterTests } from "open-sse/services/compression/engines/rtk/verify";
const result = runRtkFilterTests();console.log(`Пройдено: ${result.outcomes.filter((o) => o.passed).length}`);console.log(`Не пройдено: ${result.outcomes.filter((o) => !o.passed).length}`);if (!result.passed) { console.error("Фильтры не прошли проверку"); result.outcomes .filter((o) => !o.passed) .forEach((o) => { console.error( ` - ${o.filterId} / ${o.testName}: ожидалось "${o.expected}", получено "${o.actual}"` ); });}Что проверяется:
- Каждый фильтр загружается и проходит проверку схемы
- Каждая запись
tests[]формирует ожидаемый вывод - Интенсивность
minimalничего не изменяет (сохраняет исходные данные, применяя только структурные фильтры) - Интенсивность
aggressiveсохраняет ошибки, сбои тестов и трассировки стека - Сжатый вывод никогда не превышает по размеру исходные входные данные
-
Исходный код:
open-sse/services/compression/engines/rtk/(63 файла, ~70 КБ) -
Перед слиянием изменения фильтра — всегда проверяйте, что тесты проходят
-
После обновления движка RTK — схема могла измениться
-
Периодически при мониторинге — защищает от рассинхронизации тестовых фикстур
-
При добавлении нового семейства инструментов/команд — подтверждает работоспособность нового фильтра
См. также
Заголовок раздела «См. также»- COMPRESSION_GUIDE.md — Полный обзор конвейера сжатия
- COMPRESSION_ENGINES.md — Реестр движков и встроенные движки
- EXTENDING_COMPRESSION.md — Пользовательские движки, языковые пакеты, составные конвейеры
- Исходный код:
open-sse/services/compression/engines/rtk/(63 файла, ~70 КБ)
HagiCode
HagiCode — агентная среда разработки со структурированными процессами, параллельным выполнением несколькими агентами и интерфейсами Hero Dungeon.
Превращайте идеи в полезное ПО с более умным, быстрым и увлекательным агентным рабочим процессом.

- SmartСтруктурированные процессы превращают намерение в исполнимый путь от идеи до готового изменения.
- EfficientМультиагентные процессы параллельно продвигают исследование, реализацию и проверку.
- FunHero Dungeon делает длительную совместную разработку наглядной и увлекательной.