Перейти к содержимому
OmniRoute source

RTK Compression (Русский)

RTK поддерживает 3 уровня интенсивности, обеспечивающих компромисс между агрессивностью сжатия и безопасностью. Уровень задаётся через config.intensity в конфигурации движка.

Уровень Порог усечения Экономия токенов Риск Лучше всего подходит для
minimal 24 строки на раздел ~20-40% Очень низкий Продакшена с критически важным контекстом
standard (по умолчанию) 24 строки на раздел ~50-70% Низкий Ежедневных сеансов программирования
aggressive 16 строк на раздел ~70-90% Средний Длительных сеансов, максимальной экономии

Порог усечения влияет на lineFilter.ts:

// Из open-sse/services/compression/engines/rtk/index.ts:329-330
config.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-файлов фильтров. Вы можете добавлять собственные фильтры для сжатия вывода пользовательских инструментов, не поддерживаемых по умолчанию.

{
"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" // Необязательно. Контекст команды
}
]
}
{
"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.

  1. Всегда включайте tests[] — они подтверждают, что ваш фильтр работает, и предотвращают регрессии
  2. Используйте matchOutput для коротких замыканий — если одной строки достаточно, чтобы передать суть, замените ею весь блок
  3. Предпочитайте keep вместо strip — явные правила «всегда сохранять» безопаснее, чем «всегда удалять»
  4. Тестируйте на всех 3 уровнях интенсивности — minimal не должен ничего менять, а aggressive всё равно должен сохранять ошибки
  5. Используйте поле 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}"`
);
});
}

Что проверяется:

  1. Каждый фильтр загружается и проходит проверку схемы
  2. Каждая запись tests[] формирует ожидаемый вывод
  3. Интенсивность minimal ничего не изменяет (сохраняет исходные данные, применяя только структурные фильтры)
  4. Интенсивность aggressive сохраняет ошибки, сбои тестов и трассировки стека
  5. Сжатый вывод никогда не превышает по размеру исходные входные данные
  • Исходный код: 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 КБ)

Исходный код OmniRoute (a58000c7685f)

HagiCode

HagiCode — агентная среда разработки со структурированными процессами, параллельным выполнением несколькими агентами и интерфейсами Hero Dungeon.

Превращайте идеи в полезное ПО с более умным, быстрым и увлекательным агентным рабочим процессом.

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