跳到內容
OmniRoute source

RTK Compression (中文 (繁體))

RTK 支援 3 個強度等級,用於在壓縮積極程度與安全性之間取捨。此等級透過引擎設定中的 config.intensity 設定。

等級 截斷閾值 Token 節省量 風險 最適合
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("篩選器在 aggressive 強度下失敗");
}

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 # 專案層級

篩選器會在啟動時,透過 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 處理短路情況 — 如果單一行就能說明重點,請取代整個區塊
  3. 優先使用 keep,而非 strip — 明確的「一律保留」規則比「一律移除」更安全
  4. 測試所有 3 種強度等級 — minimal 應不執行任何操作,aggressive 仍應保留錯誤
  5. 使用 unless 欄位 — 以「如果存在 X 就不要觸發」來防護短路條件

當 RTK 大幅壓縮輸出時,您可以復原原始文字,以進行偵錯、稽核或重播。

原始輸出(10K tokens)
│
▼
RTK 壓縮(rawOutput.enabled=true)
│
├─▶ 壓縮後的輸出(2K tokens) ──▶ 傳送至 LLM
│
└─▶ 原始輸出(10K tokens) ──▶ 儲存於 DB
(透過 request_id 關聯)

針對單一請求(在組合設定中):

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

預設值:rawOutput.enabled: false(節省儲存空間)。

每個請求 上限 1MB 上限 10MB
平均壓縮後輸出 ~5KB ~5KB
儲存的原始輸出 ~50-500KB ~500KB-5MB
每日 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 引擎之後 — 結構描述可能已變更

  • 定期監控時 — 防止測試固定資料發生偏移

  • 新增工具/命令系列時 — 證明新篩選器能正常運作



OmniRoute 原始碼 (a58000c7685f)

HagiCode

HagiCode 是智慧代理程式開發工作台,結合結構化工作流程、多代理程式執行與 Hero Dungeon 介面,將想法化為交付成果。

以更聰明、更快速且更有趣的智慧代理程式工作流程,打造實用的軟體。

HagiCode 淺色主題介面畫面
  • Smart結構化流程將意圖轉化為從構想到交付的可執行步驟。
  • Efficient多代理程式工作流程讓研究、實作與審查並行進行。
  • FunHero Dungeon 讓長時間的程式協作更直覺、更有參與感。
造訪 HagiCode