コンテンツにスキップ
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,

各セクションの先頭と末尾はどちらも保持されます。切り詰めが作動すると、中間の内容が削除されます。

保持される内容と削除される内容

Section titled “保持される内容と削除される内容”
内容 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("aggressive 強度でフィルターが失敗しました");
}

カスタムフィルターの開発 (v3.8.16+)

Section titled “カスタムフィルターの開発 (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"], // 1 回の出現にまとめる行(デフォルト: [])
"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 トレースバックフィルター

Section titled “例: 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"
}
]
}

カスタムフィルターの読み込み

Section titled “カスタムフィルターの読み込み”

認識される場所にファイルを配置します。

~/.omniroute/rtk/filters/my-filter.json # ユーザーレベル
<project>/.rtk/filters/my-filter.json # プロジェクトレベル

フィルターは、open-sse/services/compression/engines/rtk/filterLoader.ts の loadRtkFilters() によって起動時に自動的に読み込まれます。ローダーは、以下の場所からフィルターを検出します。

  • 組み込みカタログ: 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

インストールされているすべてのフィルターを検証するには、open-sse/services/compression/engines/rtk/verify.ts からエクスポートされている runRtkFilterTests() を呼び出します。

  1. 必ず tests[] を含める — フィルターが正しく機能することを証明し、リグレッションを防止します
  2. 短絡処理には matchOutput を使用する — 1行で十分に内容を伝えられる場合は、ブロック全体を置き換えます
  3. strip より keep を優先する — 「常に削除する」ルールよりも、明示的な「常に保持する」ルールのほうが安全です
  4. 3段階すべての強度レベルでテストする — minimal は何も変更せず、aggressive でもエラーは保持されるようにします
  5. unless フィールドを使用する — 「Xが存在する場合はトリガーしない」という条件で短絡処理を保護します

RTK が出力を積極的に圧縮する場合でも、デバッグ、監査、または再実行のために元のテキストを復元できます。

元の出力(10Kトークン)
│
▼
RTKによる圧縮(rawOutput.enabled=true)
│
├─▶ 圧縮済み出力(2Kトークン) ──▶ LLMへ
│
└─▶ 元の出力(10Kトークン) ──▶ DBに保存
(request_idで関連付け)

リクエスト単位(combo設定内):

{
"compression": {
"engine": "rtk",
"intensity": "aggressive",
"rawOutput": {
"enabled": true,
"maxBytes": 1048576 // 上限1MB
}
}
}

デフォルト: rawOutput.enabled: false(ストレージを節約)。

リクエスト単位 上限1MB 上限10MB
圧縮済み出力の平均 ~5KB ~5KB
保存される生の出力 ~50-500KB ~500KB-5MB
1日1000リクエストの場合 50-500MB/日 500MB-5GB/日

推奨事項: 生の出力は常時有効にせず、デバッグセッションまたはサンプリング監査の場合にのみ有効にしてください。

import { readRtkRawOutput } from "omniroute/compression/engines/rtk/rawOutput";
const raw = readRtkRawOutput(pointerId); // 圧縮統計から取得したpointerId
if (raw) {
console.log("Original output:", 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(`Passed: ${result.outcomes.filter((o) => o.passed).length}`);
console.log(`Failed: ${result.outcomes.filter((o) => !o.passed).length}`);
if (!result.passed) {
console.error("Filters failed verification");
result.outcomes
.filter((o) => !o.passed)
.forEach((o) => {
console.error(
` - ${o.filterId} / ${o.testName}: expected "${o.expected}", got "${o.actual}"`
);
});
}

検証内容:

  1. すべてのフィルターが読み込まれ、スキーマ検証に合格する
  2. tests[] のすべてのエントリが期待される出力を生成する
  3. minimal 強度では何も変更しない(元の内容を保持し、構造フィルターのみを適用する)
  4. aggressive 強度でも、エラー、テスト失敗、およびスタックトレースが保持される
  5. 圧縮済み出力が元の入力より大きくならない
  • ソース: open-sse/services/compression/engines/rtk/(63ファイル、~70KB)

  • フィルターの変更をマージする前 — 必ずテストが合格することを確認する

  • RTKエンジンをアップグレードした後 — スキーマが変更されている可能性がある

  • 監視の一環として定期的に — テストフィクスチャのドリフトを防止する

  • 新しいツール/コマンドファミリーを追加するとき — 新しいフィルターが機能することを証明する


  • COMPRESSION_GUIDE.md — 圧縮パイプラインの全体概要
  • COMPRESSION_ENGINES.md — エンジンレジストリと組み込みエンジン
  • EXTENDING_COMPRESSION.md — カスタムエンジン、言語パック、スタック型パイプライン
  • ソース: open-sse/services/compression/engines/rtk/(63ファイル、約70KB)

OmniRoute ソースコード (a58000c7685f)

HagiCode

HagiCode は構造化ワークフロー、マルチエージェント実行、Hero Dungeon ビューを備えたエージェント型コーディングワークスペースです。

よりスマートで速く、楽しいエージェント型ワークフローで、使いやすいソフトウェアを形にします。

HagiCode ライトテーマのメイン画面
  • Smart構造化ワークフローは意図をアイデアから変更のリリースまで実行可能な道筋にします。
  • Efficientマルチエージェントのワークフローで調査、実装、レビューを並行して進めます。
  • FunHero Dungeon により長時間のコーディングを視覚的で協力的な体験にします。
HagiCode を見る