* feat(docs): mirror every docs/ page in all 65 locales Extends the documentation mirrors from the 22-page core set (#13940) to every Markdown page under docs/: 152 sources x 65 locales = 9,880 mirrors (6,208 new), language bars rewritten for the full locale list, state adopted so the blocking drift gate now covers all 152 pages. run-translation.mjs: an oversized block made only of table rows or list items (PROVIDER_REFERENCE.md 244-row table, FREE_TIERS.md 71-item list) is cut at item boundaries and rejoined without a blank line — the single 16-40 KB request outlived the backend socket for verbose scripts. 48 older mirrors whose tables had lost rows were retranslated with --force. * docs(i18n): refresh mirrors for the sources the base changed since the branch cut Section-level retranslation of the 29 docs (and README.md) whose source or mirrors moved on release/v3.8.51 during the run, then state adoption; the drift gate is green again on the merged tree.
39 KiB
RTK Compression (Deutsch)
🌐 Languages: 🇺🇸 English · 🇪🇹 am · 🇸🇦 ar · 🇦🇿 az · 🇧🇬 bg · 🇧🇩 bn · 🇨🇿 cs · 🇩🇰 da · 🇬🇷 el · 🇪🇸 es · 🇪🇪 et · 🇮🇷 fa · 🇫🇮 fi · 🇫🇷 fr · 🇮🇪 ga · 🇮🇳 gu · 🇳🇬 ha · 🇮🇱 he · 🇮🇳 hi · 🇭🇷 hr · 🇭🇺 hu · 🇦🇲 hy · 🇮🇩 id · 🇳🇬 ig · 🇮🇹 it · 🇯🇵 ja · 🇬🇪 ka · 🇰🇭 km · 🇮🇳 kn · 🇰🇷 ko · 🇱🇹 lt · 🇱🇻 lv · 🇮🇳 ml · 🇮🇳 mr · 🇲🇾 ms · 🇲🇹 mt · 🇲🇲 my · 🇳🇵 ne · 🇳🇱 nl · 🇳🇴 no · 🇮🇳 or · 🇮🇳 pa · 🇵🇭 phi · 🇵🇱 pl · 🇵🇹 pt · 🇧🇷 pt-BR · 🇷🇴 ro · 🇷🇺 ru · 🇱🇰 si · 🇸🇰 sk · 🇸🇮 sl · 🇷🇸 sr · 🇸🇪 sv · 🇰🇪 sw · 🇮🇳 ta · 🇮🇳 te · 🇹🇭 th · 🇹🇷 tr · 🇺🇦 uk-UA · 🇵🇰 ur · 🇺🇿 uz · 🇻🇳 vi · 🇳🇬 yo · 🇨🇳 zh-CN · 🇹🇼 zh-TW
Die RTK-Komprimierung ist OmniRoutes befehlsorientierte Komprimierungs-Engine für Terminal- und Tool-Ausgaben. Sie ist für Sitzungen mit Coding-Agenten konzipiert, bei denen der Kontextzuwachs hauptsächlich durch Testprotokolle, Build-Ausgaben, Ausgaben von Paketmanagern, Shell-Transkripte, Docker-Ausgaben, git-Ausgaben und Stacktraces entsteht.
RTK kann direkt mit defaultMode: "rtk" oder als erster Schritt in einer gestapelten Pipeline ausgeführt werden, üblicherweise:
rtk -> caveman
Diese Reihenfolge komprimiert zuerst störende Maschinenausgaben und lässt Caveman anschließend die verbleibenden Fließtexte verdichten.
Das vorgelagerte RTK-Projekt gibt Einsparungen von 60-90% bei Befehlsausgaben an. Die Beispielsitzung in seiner README reduziert sich von
~118,000 Standard-Tokens auf ~23,900 RTK-Tokens, was einer Einsparung von 79.7% (~80%) entspricht. OmniRoute verwendet
diesen vorgelagerten Durchschnitt für die Berechnung der gestapelten Einsparungen zusammen mit der Caveman-Eingabekomprimierung:
RTK-Durchschnitt: 80% eingespart
Caveman-Eingabe: 46% eingespart
Gestapelt: 1 - (1 - 0.80) * (1 - 0.46) = 89.2% eingespart
Bereich: 1 - (1 - 0.60..0.90) * (1 - 0.46) = 78.4-94.6%
Was komprimiert wird
Der integrierte Katalog enthält derzeit 49 Filter in diesen Kategorien:
| Kategorie | Beispiele |
|---|---|
git |
git status, git branch, git diff, git log |
test |
Vitest, Jest, Pytest, Playwright, Go-Tests, Cargo-Tests |
build |
TypeScript, ESLint, Biome, Prettier, Vite, Webpack, Turbo, Nx |
package |
npm install, npm audit, pip, uv sync, Poetry, Bundler |
shell |
ls, find, grep, generische Shell-Protokolle |
docker |
docker ps, Docker-Protokolle |
infra |
Terraform, OpenTofu, systemctl status |
generic |
JSON-Ausgabe, Stacktraces, generischer Ausgabe-Fallback |
Der Detektor in open-sse/services/compression/engines/rtk/commandDetector.ts klassifiziert die Ausgabe
vor der Filterauswahl. Filter können auch anhand von Befehlsmustern oder regulären Ausdrücken für Ausgaben übereinstimmen, wenn eine
Befehlsklasse nicht ausreicht.
Filterauflösung
RTK lädt Filter in dieser Reihenfolge:
- Projektfilter aus
.rtk/filters.tomlund.rtk/filters.json, jedoch nur bei bestehendem Vertrauen. - Globale Filter aus
DATA_DIR/rtk/filters.tomlundDATA_DIR/rtk/filters.json. - Integrierte Filter aus
open-sse/services/compression/engines/rtk/filters/.
Innerhalb desselben Gültigkeitsbereichs haben RTK-TOML-Filter nach Schema v1 Vorrang vor OmniRoute-JSON-Filtern. TOML-
match_command-Ausdrücke werden vor der Prüfung des Befehlstyps ausgewertet, sodass ein importierter befehlsspezifischer
Filter einen allgemeineren Filter im selben Gültigkeitsbereich überschreiben kann. Der Projektbereich hat weiterhin Vorrang vor dem globalen
Bereich, unabhängig vom Dateiformat.
Projektfilter unterliegen bewusst einer Vertrauensprüfung, da Regex-Filter verändern können, wie Tool-Ausgaben Agenten angezeigt werden. Eine Projektfilterdatei wird akzeptiert, wenn eine der folgenden Bedingungen erfüllt ist:
rtkConfig.trustProjectFiltersisttrue.OMNIROUTE_RTK_TRUST_PROJECT_FILTERS=1ist gesetzt..rtk/trust.jsonenthält den passenden SHA-256-Hash für die Projektfilterdatei.
Beispiel für eine Vertrauensdatei:
{
"filtersSha256": "0123456789abcdef...",
"filtersTomlSha256": "fedcba9876543210..."
}
Die Hashes sind getrennt: filtersSha256 autorisiert .rtk/filters.json, während filtersTomlSha256
.rtk/filters.toml autorisiert. Das Bearbeiten einer der Dateien macht nur den jeweils zugehörigen Vertrauenseintrag ungültig. Globale Dateien
werden von Administratoren installiert und verwenden das bestehende Vertrauensverhalten für globale Filter.
Benutzerdefinierte Filter können aus einem einzelnen Filterobjekt oder einem Array von Filterobjekten bestehen. Ungültige benutzerdefinierte Filter werden
übersprungen und durch die Diagnosefunktion von /api/context/rtk/filters gemeldet. Ungültige integrierte Filter führen zu einem sofortigen Abbruch.
Kompatibilität mit RTK-TOML-Schema v1
OmniRoute kann deklarative Filterdateien gemäß RTK-TOML-Schema v1 parsen, validieren, testen und installieren.
Die unterstützten Felder sind description, match_command, strip_ansi, filter_stderr,
strip_lines_matching, keep_lines_matching, replace, match_output, truncate_lines_at,
head_lines, tail_lines, max_lines, on_empty sowie eingebettete Tests vom Typ [[tests.<filter>]].
Unbekannte Felder, ungültige oder unsichere reguläre Ausdrücke, gleichzeitig verwendete Regeln zum Entfernen und Beibehalten, Dateien mit mehr als
1 MiB sowie Verweise auf unbekannte Filter werden abgelehnt. Eine Datei, deren eingebettete Tests fehlschlagen, kann zur Überprüfung
validiert, aber nicht installiert oder geladen werden. Fehler beim Laden benutzerdefinierter Dateien werden weiterhin
nach dem Fail-open-Prinzip behandelt: Die ungültige Datei wird übersprungen, und die übrigen Filter funktionieren weiterhin.
OmniRoute empfängt die Werkzeugausgabe, nachdem der Client sie bereits erfasst hat, daher kann filter_stderr = true
die Prozesserfassung nicht ändern. Das Feld wird als wirkungslose Operation akzeptiert, und die Validierung gibt eine Warnung zurück.
Dies wird bewusst als Kompatibilität mit RTK-TOML-Schema v1 und nicht als vollständige Kompatibilität
mit der ausführbaren RTK-Datei, Shell-Hooks, Rust-Befehlsimplementierungen oder der Struktur des Trust-Stores bezeichnet.
Die erweiterte RTK-Ansicht des Dashboards akzeptiert eingefügtes oder hochgeladenes TOML. Die Validierung ist schreibgeschützt.
Bei der Installation wird DATA_DIR/rtk/filters.toml atomar mit restriktiven Berechtigungen geschrieben und der
aktive Filterkatalog ohne Neustart aktualisiert. Das Ersetzen einer vorhandenen Datei erfordert eine ausdrückliche overwrite-Bestätigung
und erstellt zuvor DATA_DIR/rtk/filters.toml.bak.
Filter-DSL
Filter verwenden das unter Format der Komprimierungsregeln beschriebene JSON-Schema. Die Laufzeit wendet diese Stufen in der folgenden Reihenfolge an:
stripAnsi -> filterStderr -> replace -> matchOutput -> Zeilen entfernen/einschließen
-> truncateLineAt -> head/tail/maxLines -> onEmpty
Wichtige Felder:
| Feld | Zweck |
|---|---|
rules.stripAnsi |
Terminal-Farb- und Steuersequenzen vor dem Abgleich entfernen |
rules.filterStderr |
Gängige stderr-Präfixe vor dem Abgleich/Filtern normalisieren |
rules.replace |
Geordnete Ersetzungen mit regulären Ausdrücken anwenden |
rules.matchOutput |
Eine kompakte Zusammenfassung zurückgeben, wenn die Ausgabe einer bekannten Bedingung entspricht |
rules.matchOutput[].unless |
Die Kurzform überspringen, wenn ein Fehler-/Fehlschlagmuster vorliegt |
rules.dropPatterns |
Störende Zeilen entfernen |
rules.includePatterns |
Handlungsrelevante Zeilen bevorzugen |
rules.collapsePatterns |
Wiederholte übereinstimmende Zeilen zusammenfassen |
rules.deduplicate |
Optionale Aktivierung pro Filter: aufeinanderfolgende doppelte Zeilen zusammenfassen |
rules.truncateLineAt |
Unicode-sichere Kürzung pro Zeile |
rules.onEmpty |
Ersatzmeldung, wenn alle Zeilen herausgefiltert wurden |
tests[] |
Vom Verifizierungs-Gate verwendete eingebettete Beispiele |
Es wird erwartet, dass integrierte Filter eingebettete tests[]-Beispiele enthalten. Benutzerdefinierte Filter sollten
sie ebenfalls enthalten, insbesondere wenn sie projektübergreifend genutzt werden.
Zeilendeduplizierung (zwei Ebenen)
RTK fasst doppelte Zeilen auf zwei unabhängigen Ebenen zusammen:
- Filterspezifisches
deduplicate(optional, Standardwertfalse). Ein Filter kannrules.deduplicate: truefestlegen, um aufeinanderfolgende doppelte Zeilen innerhalb der übereinstimmenden Ausgabe dieses Filters vor der Kürzung zusammenzufassen. Dies wird innerhalb vonlineFilter.tsausgeführt. Für Legacy-Filter wird es automatisch aktiviert, wenn der FiltercollapsePatternsdefiniert. Schema:deduplicate: z.boolean().default(false)inopen-sse/services/compression/engines/rtk/filterSchema.ts. - Engine-weites
deduplicateThreshold(Standardwert3). Nachdem alle Filter ausgeführt wurden, fasst die Engine jede Folge von>= deduplicateThresholdidentischen, aufeinanderfolgenden Zeilen im gesamten Ergebnis zusammen (deduplicateRepeatedLines, angewendet inengines/rtk/index.ts). Bei der Normalisierung wird der Wert auf 2–100 begrenzt.
Der filterspezifische Durchlauf erfolgt zuerst (innerhalb des Filters), der Engine-weite Durchlauf zuletzt (über die zusammengefügte Ausgabe), sodass beide zusammenwirken, ohne doppelt zu zählen.
Zeilengruppierung (enableGrouping)
Wenn rtkConfig.enableGrouping auf true gesetzt ist (Standardwert false), führt RTK einen zusätzlichen groupSimilarLines-Durchlauf
über das Ergebnis nach der Deduplizierung aus, der Folgen nahezu gleichwertiger (nicht byteidentischer)
aufeinanderfolgender Zeilen zusammenfasst. rtkConfig.groupingThreshold (Standardwert 3) ist die Mindestlänge einer Folge, ab der
die Gruppierung ausgelöst wird. Dies ist das strukturelle Gegenstück zu deduplicateThreshold: Die Deduplizierung verarbeitet exakte Wiederholungen,
die Gruppierung verarbeitet „dieselbe Struktur mit kleinen Unterschieden“. Beide Flags sind Teil des rtkConfig-JSON,
das in der Tabelle key_value persistiert wird (siehe „Konfiguration“ oben), sodass die Einstellung Neustarts überdauert.
Entfernen von Codekommentaren (stripCodeComments / preserveDocstrings)
Wenn rtkConfig.applyToCodeBlocks aktiviert ist, kann RTK auch Kommentare aus mit Fences abgegrenzten Codeblöcken entfernen:
stripCodeComments(Standardwertfalse) — optional. Wenntrue, entfernt RTK Kommentare aus mit Fences abgegrenzten JavaScript- und TypeScript-Blöcken. Historisch wurde das Flag zwar ausgelesen, aber nie angewendet; daher bleibt der Standardwert „beibehalten“, um eine unbemerkte Änderung im Produktivbetrieb zu vermeiden.preserveDocstrings(Standardwerttrue) — beim Entfernen von Kommentaren bleiben JSDoc-//** … */-Blockkommentare erhalten (sie enthalten API-Dokumentation, deren Wert die durch sie verursachte Byteanzahl übersteigt). Auffalsesetzen, um auch diese zu entfernen.
Das Entfernen von Kommentaren ist in open-sse/services/compression/engines/rtk/codeStripper.ts implementiert. Dabei wird
der TypeScript-Parser (kein regulärer Ausdruck) verwendet, sodass Zeichenketten-, Template- und Regex-Literale nie fälschlich
als Kommentare interpretiert werden. Bei erkanntem JSX wird der Vorgang vollständig abgebrochen (damit Kommentare in JSX-Ausdruckscontainern
niemals beschädigt werden). Das Entfernen von Kommentaren wird derzeit nur auf JavaScript und TypeScript angewendet — für andere
Sprachen in der CodeLanguage-Menge des Strippers (Python, Rust, Go, Ruby, Java) werden Leerzeilen und
Leerraum reduziert, Kommentare jedoch nicht entfernt. Der Durchlauf für bereinigte Blöcke wird in
rulesApplied mit rtk:code-strip gekennzeichnet.
Hinweis — GCF/tabellarische Codierung ist eine separate Engine. RTK enthält nicht den tabellarischen/spaltenorientierten „GCF“-JSON-Encoder (Graph Compact Format). Dieser Encoder — der einen älteren
omni-tabular-Encoder ersetzt hat — befindet sich in der headroom-Engine (open-sse/services/compression/engines/headroom/, der eingebundene Codec liegt unterheadroom/gcf/). Er steht in keinem Zusammenhang mit der hier dokumentierten RTK-Filterpipeline.
Konfiguration
Globale Einstellungen sind über /api/settings/compression verfügbar. RTK-spezifische Einstellungen sind außerdem
über /api/context/rtk/config verfügbar.
{
"defaultMode": "stacked",
"autoTriggerMode": "stacked",
"autoTriggerTokens": 32000,
"stackedPipeline": [
{ "engine": "rtk", "intensity": "standard" },
{ "engine": "caveman", "intensity": "full" }
],
"rtkConfig": {
"enabled": true,
"intensity": "standard",
"applyToToolResults": true,
"applyToCodeBlocks": false,
"applyToAssistantMessages": false,
"enabledFilters": [],
"disabledFilters": [],
"maxLinesPerResult": 120,
"maxCharsPerResult": 12000,
"deduplicateThreshold": 3,
"customFiltersEnabled": true,
"trustProjectFilters": false,
"rawOutputRetention": "never",
"rawOutputMaxBytes": 1048576,
"enableGrouping": false,
"groupingThreshold": 3,
"stripCodeComments": false,
"preserveDocstrings": true
}
}
enabledFilters und disabledFilters verwenden Filter-IDs, zum Beispiel test-vitest oder git-diff.
Die vollständige Struktur von rtkConfig wird durch RtkConfig / DEFAULT_RTK_CONFIG in
open-sse/services/compression/types.ts definiert. Das gesamte Objekt wird als einzelner JSON-Wert in
der SQLite-Tabelle key_value unter namespace = "compression", key = "rtkConfig"
(src/lib/db/compression.ts) gespeichert und beim Lesen durch normalizeRtkConfig normalisiert. Daher
durchläuft jedes der folgenden Felder — einschließlich enableGrouping, groupingThreshold,
stripCodeComments und preserveDocstrings — denselben Speicher und bleibt auch nach einem Neustart erhalten.
| Schlüssel | Standardwert | Zweck |
|---|---|---|
deduplicateThreshold |
3 |
Engine-weit: Mindestanzahl aufeinanderfolgender identischer Zeilen zum Zusammenfassen (begrenzt auf 2–100) |
enableGrouping |
false |
Optional: Folgen nahezu gleichwertiger aufeinanderfolgender Zeilen zusammenfassen |
groupingThreshold |
3 |
Mindestanzahl aufeinanderfolgender ähnlicher Zeilen, die eine Gruppierung auslöst |
stripCodeComments |
false |
Optional: Kommentare aus abgegrenzten Codeblöcken entfernen (erfordert applyToCodeBlocks) |
preserveDocstrings |
true |
Beim Entfernen von Kommentaren JSDoc-//** … */-Blöcke beibehalten |
API
| Route | Methode | Zweck |
|---|---|---|
/api/context/rtk/config |
GET | RTK-Konfiguration lesen |
/api/context/rtk/config |
PUT | RTK-Konfiguration aktualisieren |
/api/context/rtk/filters |
GET | Filterkatalog und Ldiagnosen auflisten |
/api/context/rtk/import |
POST | RTK-TOML-Dateien mit Schema v1 validieren oder installieren |
/api/context/rtk/test |
POST | Vorschau der RTK-Komprimierung für eine Textnutzlast |
/api/context/rtk/raw-output/[id] |
GET | Aufbewahrte, redigierte Rohausgabe lesen |
/api/compression/preview |
POST | Vorschau für einen beliebigen Komprimierungsmodus |
RTK-Testnutzlast:
{
"command": "npm test",
"text": "FAIL tests/example.test.ts\nAssertionError: expected true\nTest Files 1 failed",
"config": {
"intensity": "standard"
}
}
Nutzlast für die Komprimierungsvorschau:
{
"mode": "stacked",
"messages": [
{
"role": "tool",
"content": "FAIL tests/example.test.ts\nAssertionError: expected true\nTest Files 1 failed"
}
],
"config": {
"rtkConfig": {
"rawOutputRetention": "failures"
}
}
}
Verwaltungsrouten erfordern eine Dashboard-Verwaltungsauthentifizierung oder die entsprechende API-Schlüsselrichtlinie.
Nutzlast für die RTK-TOML-Validierung:
{
"action": "validate",
"content": "schema_version = 1\n\n[filters.my-tool]\nmatch_command = \"^my-tool\\\\b\"\nmax_lines = 20\n"
}
Verwenden Sie "action": "install", um die validierte Datei global zu installieren. Fügen Sie
"overwrite": true erst hinzu, nachdem Sie das Ersetzen einer vorhandenen globalen Datei geprüft und bestätigt haben.
Wiederherstellung der Rohausgabe
RTK gibt normalerweise nur komprimierten Text zurück. Für die Fehlersuche kann rawOutputRetention die geschwärzte
Rohausgabe aufbewahren:
| Wert | Verhalten |
|---|---|
never |
Rohausgabe nicht aufbewahren |
failures |
Nur Ausgaben wahrscheinlicher Fehler aufbewahren |
always |
Jede komprimierte RTK-Rohausgabe nach der Schwärzung aufbewahren |
Aufbewahrte Dateien werden unter folgendem Pfad gespeichert:
DATA_DIR/rtk/raw-output/
Geheimnisse werden vor der Speicherung geschwärzt, darunter gängige Bearer-Token, API-Schlüssel, Slack-Token,
AWS-Zugriffsschlüssel sowie Zuweisungswerte wie token=..., secret=... und password=.... Die Analyse
speichert nur die Zeiger-ID sowie Metadaten zu Größe und Hash.
Verifizierungs-Gate
Das fokussierte Verifizierungs-Gate führt integrierte Inline-Filtertests aus, ohne externe Befehle über eine Shell aufzurufen:
node --import tsx/esm --test tests/unit/compression/rtk-verify.test.ts
Das umfassendere RTK-Gate lautet:
node --import tsx/esm --test \
tests/unit/compression/rtk-*.test.ts \
tests/unit/compression/pipeline-integration.test.ts \
tests/unit/compression/context-compression-api.test.ts
Führen Sie vor der Veröffentlichung das umfassende Komprimierungs-Gate aus:
node --import tsx/esm --test \
tests/unit/compression/*.test.ts \
tests/golden-set/*.test.ts \
tests/integration/compression-pipeline.test.ts \
tests/unit/api/compression/compression-api.test.ts
RTK erweitern
- Fügen Sie eine Filter-JSON-Datei hinzu oder aktualisieren Sie eine vorhandene.
- Fügen Sie mindestens ein
tests[]-Beispiel hinzu, das das wichtige Verhalten nachweist. - Fügen Sie für neue Befehlsfamilien eine Fixture unter
tests/unit/compression/fixtures/rtk/hinzu. - Ergänzen Sie beim Einführen einer neuen Ausgabeklasse die Abdeckung der Befehlserkennung.
- Führen Sie das Verifizierungs-Gate und das umfassende RTK-Gate aus.
- Wenn der Filter projektspezifisch ist, committen Sie
.rtk/filters.jsonund aktualisieren Sie.rtk/trust.jsonerst nach der Überprüfung.
Intensitätsstufen (v3.8.16+)
RTK unterstützt 3 Intensitätsstufen, die einen Kompromiss zwischen Komprimierungsaggressivität und Sicherheit darstellen. Die Stufe wird über config.intensity in der Engine-Konfiguration festgelegt.
Die 3 Stufen
| Stufe | Kürzungsschwellenwert | Token-Einsparung | Risiko | Am besten geeignet für |
|---|---|---|---|---|
minimal |
24 Zeilen pro Abschnitt | ~20-40% | Sehr gering | Produktion mit kritischem Kontext |
standard (Standard) |
24 Zeilen pro Abschnitt | ~50-70% | Gering | Tägliche Coding-Sitzungen |
aggressive |
16 Zeilen pro Abschnitt | ~70-90% | Mittel | Lange Sitzungen, maximale Einsparungen |
Wo die Kürzung erfolgt
Der Kürzungsschwellenwert wirkt sich auf lineFilter.ts aus:
// Aus open-sse/services/compression/engines/rtk/index.ts:329-330
config.intensity === "aggressive" ? 16 : 24,
config.intensity === "aggressive" ? 16 : 24,
Sowohl der Anfang als auch das Ende jedes Abschnitts bleiben erhalten; Inhalte in der Mitte werden entfernt, sobald die Kürzung greift.
Was erhalten bleibt und was gekürzt wird
| Inhalt | minimal | standard | aggressive |
|---|---|---|---|
| Fehler / Stacktraces | ✅ beibehalten | ✅ beibehalten | ✅ beibehalten |
| Testfehlschläge | ✅ beibehalten | ✅ beibehalten | ✅ beibehalten |
| Build-Fehler | ✅ beibehalten | ✅ beibehalten | ✅ beibehalten |
| Erfolgreiche Tests (ausführlich) | ✅ beibehalten | 🟡 zusammengefasst | 🟡 zusammengefasst |
| Routineausgabe (Info-Logs) | 🟡 zusammengefasst | 🟡 zusammengefasst | ❌ entfernt |
| Fortschrittsbalken | 🟡 zusammengefasst | ❌ entfernt | ❌ entfernt |
| Banner / ASCII-Art | 🟡 zusammengefasst | ❌ entfernt | ❌ entfernt |
Auswahl der richtigen Intensität
Wäre ein Kontextverlust katastrophal?
│
┌───────────┼───────────┐
│ │ │
JA NEIN UNSICHER
│ │ │
▼ │ │
minimal │ │
│ │ │
│ ▼ ▼
│ Wie wichtig Zuerst `standard` testen
│ ist der (funktioniert in 80 %
│ Durchsatz? der Fälle)
│ │
│ ┌────┴────┐
│ │ │
│ GERING HOCH
│ │ │
│ ▼ ▼
│ standard aggressive
│ │ │
└──────┴─────────┘
Intensität konfigurieren
Pro Combo (in der Combo-Konfiguration):
{
"combo": "my-coding-combo",
"routing": {/* ... */},
"compression": {
"engine": "rtk",
"intensity": "aggressive"
}
}
Programmatisch:
rtkEngine (@omniroute/open-sse/services/compression/engines/rtk) ist eine
CompressionEngine und besitzt keine updateConfig-Methode. Aktualisieren Sie die Konfiguration
einer Engine stattdessen über die Registry-Hilfsfunktion:
import { updateEngineConfig } from "@omniroute/open-sse/services/compression/engines/registry";
updateEngineConfig("rtk", { intensity: "aggressive" });
Wirkung überprüfen
Verwenden Sie das Verifizierungs-Gate (siehe unten), um zu bestätigen, dass Ihr Filter bei der gewählten Intensität sicher ist:
import { runRtkFilterTests } from "omniroute/compression/engines/rtk/verify";
const result = runRtkFilterTests({ intensity: "aggressive" });
if (!result.passed) {
console.error("Filter bei aggressiver Intensität fehlgeschlagen");
}
Entwicklung benutzerdefinierter Filter (v3.8.16+)
Das Verzeichnis engines/rtk/filters/ enthält 49+ integrierte Filter-JSON-Dateien. Sie können eigene Filter hinzufügen, um die Ausgabe benutzerdefinierter Tools zu komprimieren, die von den Standardfiltern nicht abgedeckt werden.
Filterschema (Zod)
{
"id": "string", // Erforderlich. Filterkennung (Kebab-Case, z. B. "python-traceback")
"label": "string", // Erforderlich. Benutzerfreundlicher Filtername
"description": "string", // Optional (Standard: ""). Kurzbeschreibung der Filterfunktion
"category": "git|test|build|shell|docker|package|infra|cloud|generic",
"priority": number, // Optional (0–100, Standard: 50). Ausführungsreihenfolge (höher = zuerst)
"match": {
"commands": ["string"], // Abzugleichende Befehlsnamen (z. B. "python", "pytest")
"patterns": ["string"], // Reguläre Ausdrücke zum Abgleichen der Ausgabe
"outputTypes": ["string"] // Erkannte Ausgabeklassen (z. B. "test-failure")
},
"rules": {
"stripAnsi": boolean, // Optional (Standard: false). ANSI-Farbcodes entfernen
"replace": [ // Such-und-Ersetzungs-Regeln (Standard: [])
{ "pattern": "regex", "replacement": "..." }
],
"matchOutput": [ // Bei Musterübereinstimmung vorzeitig beenden (Standard: [])
{
"pattern": "regex",
"message": "short summary",
"unless": "regex" // Überspringen, wenn dieses Muster übereinstimmt
}
],
"includePatterns": ["string"], // Beizubehaltende Zeilen (reguläre Ausdrücke, Standard: [])
"dropPatterns": ["string"], // Zu verwerfende Zeilen (reguläre Ausdrücke, Standard: [])
"collapsePatterns": ["string"], // Auf ein einzelnes Vorkommen zu reduzierende Zeilen (Standard: [])
"deduplicate": boolean, // Optional (Standard: false). Doppelte Zeilen entfernen
"truncateLineAt": number, // Optional (Standard: 0). Zeilen auf die maximale Zeichenanzahl kürzen
"maxLines": number, // Optional (Standard: 0). Harte Obergrenze für die Gesamtzahl der Zeilen
"headLines": number, // Optional (Standard: 20). Die ersten N Zeilen der übereinstimmenden Ausgabe beibehalten
"tailLines": number, // Optional (Standard: 20). Die letzten N Zeilen der übereinstimmenden Ausgabe beibehalten
"onEmpty": "string", // Optional (Standard: ""). Ersatzmeldung, falls alle Zeilen herausgefiltert wurden
"filterStderr": boolean // Optional (Standard: false). Auch die stderr-Ausgabe filtern
},
"preserve": {
"errorPatterns": ["string"], // Muster, die immer beibehalten werden müssen (Standard: [])
"summaryPatterns": ["string"] // Muster für die abschließende Zusammenfassungszeile (Standard: [])
},
"tests": [ // Inline-Tests zur Überprüfung (Standard: [])
{
"name": "string", // Erforderlich. Testname
"input": "sample output", // Erforderlich. Beispiel-Eingabetext
"expected": "expected output", // Erforderlich. Erwartete komprimierte Ausgabe
"command": "optional command" // Optional. Befehlskontext
}
]
}
Beispiel: Python-Traceback-Filter
{
"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"
}
]
}
Laden benutzerdefinierter Filter
Legen Sie die Datei an einem der erkannten Speicherorte ab:
~/.omniroute/rtk/filters/my-filter.json # Benutzerebene
<project>/.rtk/filters/my-filter.json # Projektebene
Filter werden beim Start automatisch über loadRtkFilters() in open-sse/services/compression/engines/rtk/filterLoader.ts geladen. Der Loader erkennt Filter aus folgenden Quellen:
- Integrierter Katalog:
open-sse/services/compression/engines/rtk/filters/ - Benutzerverzeichnis:
~/.omniroute/rtk/filters/ - Projektverzeichnis:
<project>/.rtk/filters/
So laden Sie Filter programmgesteuert:
import { loadRtkFilters } from "@omniroute/open-sse/services/compression/engines/rtk/filterLoader";
// Optionen: customFiltersEnabled (Benutzer-/Projektfilter laden, standardmäßig aktiviert),
// trustProjectFilters, refresh.
const filters = loadRtkFilters({ customFiltersEnabled: true });
Validierung
Filter werden beim Laden anhand des Zod-Schemas validiert. Ein Filter mit einer ungültigen Struktur kann nicht geladen werden und erzeugt einen protokollierten Fehler:
RTK_FILTER_LOADER: filter "my-filter" failed validation:
- rules.replace.0.pattern: Invalid regex
- match.commands: must not be empty
Um alle installierten Filter zu validieren, rufen Sie runRtkFilterTests() auf, das aus open-sse/services/compression/engines/rtk/verify.ts exportiert wird.
Bewährte Verfahren
- Immer
tests[]einschließen — sie belegen, dass Ihr Filter funktioniert, und verhindern Regressionen matchOutputfür Kurzschlussauswertungen verwenden — wenn eine einzelne Zeile alles Wesentliche aussagt, ersetzen Sie den gesamten Blockkeepgegenüberstripbevorzugen — explizite Regeln nach dem Prinzip „immer beibehalten“ sind sicherer als „immer entfernen“- Auf allen 3 Intensitätsstufen testen —
minimalsollte keine Änderungen bewirken,aggressivesollte Fehler weiterhin beibehalten - Das Feld
unlessverwenden — sichern Sie Kurzschlussauswertungen mit „nicht auslösen, wenn X vorhanden ist“ ab
Wiederherstellung der Rohausgabe & Verifizierungs-Gate
Wenn RTK die Ausgabe aggressiv komprimiert, können Sie den ursprünglichen Text wiederherstellen, um ihn zu debuggen, zu prüfen oder erneut wiederzugeben.
Funktionsweise der Wiederherstellung der Rohausgabe
Ursprüngliche Ausgabe (10K Token)
│
▼
RTK-Komprimierung (mit rawOutput.enabled=true)
│
├─▶ Komprimierte Ausgabe (2K Token) ──▶ an das LLM
│
└─▶ Ursprüngliche Ausgabe (10K Token) ──▶ in der DB gespeichert
(über request_id verknüpft)
Aktivieren der Speicherung von Rohausgaben
Pro Anfrage (in der Combo-Konfiguration):
{
"compression": {
"engine": "rtk",
"intensity": "aggressive",
"rawOutput": {
"enabled": true,
"maxBytes": 1048576 // Begrenzung auf 1 MB
}
}
}
Standard: rawOutput.enabled: false (spart Speicherplatz).
Speicherkosten
| Pro Anfrage | Begrenzung auf 1 MB | Begrenzung auf 10 MB |
|---|---|---|
| Durchschnittlich komprimierte Ausgabe | ~5KB | ~5KB |
| Gespeicherte Rohausgabe | ~50-500KB | ~500KB-5MB |
| Bei 1000 Anfragen/Tag | 50-500MB/Tag | 500MB-5GB/Tag |
Empfehlung: Aktivieren Sie Rohausgaben nur für Debugging-Sitzungen oder stichprobenartige Audits, nicht dauerhaft.
Wiederherstellen des Originals
import { readRtkRawOutput } from "omniroute/compression/engines/rtk/rawOutput";
const raw = readRtkRawOutput(pointerId); // pointerId aus den Komprimierungsstatistiken
if (raw) {
console.log("Original output:", raw);
}
Die pointerId wird nach der Komprimierung in CompressionStats.rtkRawOutputPointers[] zurückgegeben.
Die Funktionssignatur finden Sie unter open-sse/services/compression/engines/rtk/rawOutput.ts:102.
Das Verifizierungs-Gate
Die RTK-Filterverifizierung (open-sse/services/compression/engines/rtk/verify.ts) validiert alle Filter anhand ihrer tests[] und stellt sicher, dass sie bei allen 3 Intensitätsstufen korrekt funktionieren.
Rufen Sie runRtkFilterTests() auf, um die Verifizierung auszuführen:
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}"`
);
});
}
Was validiert wird:
- Jeder Filter wird geladen und besteht die Schemavalidierung
- Jeder
tests[]-Eintrag erzeugt die erwartete Ausgabe - Die Intensität
minimalist eine No-op-Operation (behält das Original bei und wendet nur strukturelle Filter an) - Die Intensität
aggressivebewahrt Fehler, fehlgeschlagene Tests und Stacktraces - Die komprimierte Ausgabe ist niemals größer als die ursprüngliche Eingabe
-
Quelle:
open-sse/services/compression/engines/rtk/(63 Dateien, ~70KB) -
Vor dem Zusammenführen einer Filteränderung — stellen Sie stets sicher, dass die Tests erfolgreich sind
-
Nach einem Upgrade der RTK-Engine — das Schema könnte sich geändert haben
-
Regelmäßig im Monitoring — schützt vor Abweichungen in den Test-Fixtures
-
Beim Hinzufügen einer neuen Tool-/Befehlsfamilie — belegt, dass der neue Filter funktioniert
Siehe auch
- COMPRESSION_GUIDE.md — Vollständiger Überblick über die Komprimierungspipeline
- COMPRESSION_ENGINES.md — Engine-Registry und integrierte Engines
- EXTENDING_COMPRESSION.md — Benutzerdefinierte Engines, Sprachpakete, gestapelte Pipelines
- Quelle:
open-sse/services/compression/engines/rtk/(63 Dateien, ~70 KB)