* 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 (Română)
🌐 Languages: 🇺🇸 English · 🇪🇹 am · 🇸🇦 ar · 🇦🇿 az · 🇧🇬 bg · 🇧🇩 bn · 🇨🇿 cs · 🇩🇰 da · 🇩🇪 de · 🇬🇷 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 · 🇷🇺 ru · 🇱🇰 si · 🇸🇰 sk · 🇸🇮 sl · 🇷🇸 sr · 🇸🇪 sv · 🇰🇪 sw · 🇮🇳 ta · 🇮🇳 te · 🇹🇭 th · 🇹🇷 tr · 🇺🇦 uk-UA · 🇵🇰 ur · 🇺🇿 uz · 🇻🇳 vi · 🇳🇬 yo · 🇨🇳 zh-CN · 🇹🇼 zh-TW
Compresia RTK este motorul OmniRoute de compresie adaptată comenzilor pentru ieșirea terminalului și a instrumentelor. Este concepută pentru sesiuni cu agenți de programare, în care cea mai mare parte a creșterii contextului provine din jurnalele testelor, ieșirea proceselor de compilare, mesajele redundante ale managerelor de pachete, transcrierile shell, ieșirea Docker, ieșirea git și urmele de stivă.
RTK poate rula direct cu defaultMode: "rtk" sau ca prim pas într-un pipeline compus, de obicei:
rtk -> caveman
Această ordine comprimă mai întâi ieșirea automată redundantă, apoi permite Caveman să condenseze textul rămas.
Proiectul RTK din amonte raportează economii de 60-90% pentru ieșirea comenzilor. Sesiunea demonstrativă din README-ul său scade de la
~118,000 de tokenuri standard la ~23,900 de tokenuri RTK, ceea ce înseamnă o economie de 79.7% (~80%). OmniRoute folosește
această medie din amonte pentru calcularea economiilor compuse împreună cu compresia intrării Caveman:
Media RTK: 80% economisit
Intrare Caveman: 46% economisit
Compus: 1 - (1 - 0.80) * (1 - 0.46) = 89.2% economisit
Interval: 1 - (1 - 0.60..0.90) * (1 - 0.46) = 78.4-94.6%
Ce comprimă
Catalogul încorporat include în prezent 49 de filtre din următoarele categorii:
| Categorie | Exemple |
|---|---|
git |
git status, git branch, git diff, git log |
test |
Vitest, Jest, Pytest, Playwright, teste Go, teste Cargo |
build |
TypeScript, ESLint, Biome, Prettier, Vite, Webpack, Turbo, Nx |
package |
npm install, npm audit, pip, uv sync, Poetry, Bundler |
shell |
ls, find, grep, jurnale shell generice |
docker |
docker ps, jurnale Docker |
infra |
Terraform, OpenTofu, systemctl status |
generic |
Ieșire JSON, urme de stivă, soluție de rezervă pentru ieșirea generică |
Detectorul din open-sse/services/compression/engines/rtk/commandDetector.ts clasifică ieșirea
înainte de selectarea filtrului. Filtrele se pot potrivi și după modelul comenzii sau după expresia regulată aplicată ieșirii atunci când o clasă
de comenzi nu este suficientă.
Rezolvarea filtrelor
RTK încarcă filtrele în această ordine:
- Filtrele proiectului din
.rtk/filters.tomlși.rtk/filters.json, numai atunci când sunt de încredere. - Filtrele globale din
DATA_DIR/rtk/filters.tomlșiDATA_DIR/rtk/filters.json. - Filtrele încorporate din
open-sse/services/compression/engines/rtk/filters/.
În cadrul aceluiași domeniu, filtrele RTK cu schema TOML v1 au prioritate față de filtrele JSON OmniRoute. Expresiile TOML
match_command sunt verificate înaintea potrivirii după tipul comenzii, astfel încât un filtru importat, specific unei comenzi,
să poată suprascrie un filtru mai general din domeniul respectiv. Domeniul proiectului are în continuare prioritate față de domeniul global,
indiferent de formatul fișierului.
Filtrele proiectului sunt restricționate în mod intenționat în funcție de nivelul de încredere, deoarece filtrele bazate pe expresii regulate pot schimba modul în care ieșirea instrumentelor este afișată agenților. Un fișier de filtre al proiectului este acceptat atunci când una dintre următoarele condiții este adevărată:
rtkConfig.trustProjectFiltersestetrue.OMNIROUTE_RTK_TRUST_PROJECT_FILTERS=1este setată..rtk/trust.jsonconține hash-ul SHA-256 corespunzător fișierului de filtre al proiectului.
Exemplu de fișier de încredere:
{
"filtersSha256": "0123456789abcdef...",
"filtersTomlSha256": "fedcba9876543210..."
}
Hash-urile sunt separate: filtersSha256 acordă încredere fișierului .rtk/filters.json, iar filtersTomlSha256
acordă încredere fișierului .rtk/filters.toml. Editarea oricăruia dintre fișiere invalidează numai propria intrare de încredere. Fișierele globale
sunt instalate de administrator și utilizează comportamentul existent privind încrederea în filtrele globale.
Filtrele personalizate pot fi un singur obiect de filtru sau o matrice de obiecte de filtru. Filtrele personalizate nevalide sunt
omise și raportate de diagnosticele /api/context/rtk/filters. Filtrele încorporate nevalide provoacă imediat o eroare.
Compatibilitate cu schema RTK TOML v1
OmniRoute poate analiza, valida, testa și instala fișiere de filtre declarative utilizând schema RTK TOML v1.
Câmpurile acceptate sunt 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 și testele inline [[tests.<filter>]].
Câmpurile necunoscute, expresiile regulate nevalide sau nesigure, regulile simultane de eliminare/păstrare, fișierele de peste
1 MiB și referințele la filtre necunoscute sunt respinse. Un fișier ale cărui teste inline eșuează poate fi
validat pentru examinare, dar nu poate fi instalat sau încărcat. Erorile la încărcarea fișierelor personalizate rămân
de tip fail-open: fișierul nevalid este omis, iar filtrele rămase continuă să funcționeze.
OmniRoute primește rezultatul instrumentului după ce clientul l-a capturat deja, astfel încât filter_stderr = true
nu poate modifica procesul de capturare. Câmpul este acceptat ca operație fără efect, iar validarea returnează un avertisment.
Acest lucru este descris în mod intenționat drept compatibilitate cu schema RTK TOML v1, nu compatibilitate deplină
cu executabilul RTK, hook-urile shell, implementările comenzilor Rust sau structura depozitului său de încredere.
Vizualizarea RTK avansată din tabloul de bord acceptă conținut TOML lipit sau încărcat. Validarea este doar în citire.
Instalarea scrie atomic DATA_DIR/rtk/filters.toml, cu permisiuni restrictive, și actualizează
catalogul activ de filtre fără repornire. Înlocuirea unui fișier existent necesită confirmarea explicită overwrite
și creează mai întâi DATA_DIR/rtk/filters.toml.bak.
DSL pentru filtre
Filtrele utilizează schema JSON descrisă în Formatul regulilor de compresie. La rulare, aceste etape sunt aplicate în ordine:
stripAnsi -> filterStderr -> replace -> matchOutput -> eliminare/includere linii
-> truncateLineAt -> head/tail/maxLines -> onEmpty
Câmpuri importante:
| Câmp | Scop |
|---|---|
rules.stripAnsi |
Elimină secvențele de culoare/control ale terminalului înainte de potrivire |
rules.filterStderr |
Normalizează prefixele stderr uzuale înainte de potrivire/filtrare |
rules.replace |
Aplică în ordine înlocuirile bazate pe expresii regulate |
rules.matchOutput |
Returnează un rezumat compact când rezultatul corespunde unei condiții cunoscute |
rules.matchOutput[].unless |
Omite scurtătura când este prezent un tipar de eroare/eșec |
rules.dropPatterns |
Elimină liniile redundante |
rules.includePatterns |
Acordă prioritate liniilor utile |
rules.collapsePatterns |
Comasează liniile repetate care corespund tiparului |
rules.deduplicate |
Activare per filtru: comasează liniile duplicate consecutive |
rules.truncateLineAt |
Trunchiere per linie, sigură pentru Unicode |
rules.onEmpty |
Mesaj de rezervă dacă toate liniile sunt eliminate prin filtrare |
tests[] |
Exemple inline utilizate de mecanismul de verificare |
Se așteaptă ca filtrele încorporate să includă exemple inline în tests[]. Și filtrele personalizate ar trebui să le includă,
mai ales atunci când sunt partajate între proiecte.
Deduplicarea liniilor (două niveluri)
RTK restrânge liniile duplicate la două niveluri independente:
deduplicateper filtru (opțional, implicitfalse). Un filtru poate setarules.deduplicate: truepentru a restrânge liniile duplicate consecutive din rezultatul corespunzător filtrului respectiv, înainte de trunchiere. Această operație se execută înlineFilter.ts. Pentru filtrele vechi, este activată automat atunci când filtrul defineștecollapsePatterns. Schemă:deduplicate: z.boolean().default(false)înopen-sse/services/compression/engines/rtk/filterSchema.ts.deduplicateThresholdla nivelul motorului (implicit3). După executarea tuturor filtrelor, motorul restrânge orice secvență de>= deduplicateThresholdlinii consecutive identice din întregul rezultat (deduplicateRepeatedLines, aplicat înengines/rtk/index.ts). La normalizare, valoarea este limitată la intervalul 2–100.
Etapa per filtru se execută prima (în interiorul filtrului), iar etapa la nivelul motorului se execută ultima (asupra rezultatului îmbinat), astfel încât cele două se combină fără numărare dublă.
Gruparea liniilor (enableGrouping)
Când rtkConfig.enableGrouping este true (implicit false), RTK execută o etapă suplimentară groupSimilarLines
asupra rezultatului de după deduplicare, care restrânge secvențele de linii consecutive aproape echivalente (nu identice la nivel de octet).
rtkConfig.groupingThreshold (implicit 3) reprezintă lungimea minimă a secvenței care declanșează
gruparea. Aceasta este contrapartea structurală a deduplicateThreshold: deduplicarea gestionează repetările exacte,
iar gruparea gestionează „aceeași structură, cu mici diferențe”. Ambele opțiuni fac parte din obiectul JSON rtkConfig
stocat în tabelul key_value (consultați secțiunea Configurare de mai sus), astfel încât setarea persistă după reporniri.
Eliminarea comentariilor din cod (stripCodeComments / preserveDocstrings)
Când rtkConfig.applyToCodeBlocks este activat, RTK poate elimina și comentariile din blocurile de cod delimitate:
stripCodeComments(implicitfalse) — opțional. Când estetrue, RTK elimină comentariile din blocurile delimitate JavaScript și TypeScript. În trecut, opțiunea era citită, dar nu era aplicată niciodată, astfel încât valoarea implicită rămâne „păstrează”, pentru a evita o modificare silențioasă în producție.preserveDocstrings(implicittrue) — la eliminarea comentariilor, comentariile de tip bloc JSDoc//** … */sunt păstrate (acestea conțin documentație API care valorează mai mult decât octeții pe care îi ocupă). Setați lafalsepentru a le elimina și pe acestea.
Eliminarea comentariilor este implementată în open-sse/services/compression/engines/rtk/codeStripper.ts. Aceasta utilizează
parserul TypeScript (nu o expresie regulată), astfel încât literalii șir, șablon și expresie regulată să nu fie niciodată confundați
cu comentarii, iar procesarea este abandonată complet atunci când este detectat JSX (astfel încât comentariile din containerele de expresii JSX
să nu fie niciodată corupte). În prezent, eliminarea comentariilor se aplică doar pentru JavaScript și TypeScript — celelalte
limbaje din setul CodeLanguage al procesorului (Python, Rust, Go, Ruby, Java) beneficiază de restrângerea liniilor goale și
a spațiilor albe, dar nu și de eliminarea comentariilor. Procesarea blocului curățat este etichetată cu rtk:code-strip în
rulesApplied.
Notă — codificarea GCF/tabelară este un motor separat. RTK nu conține codificatorul JSON tabelar/pe coloane „GCF” (Graph Compact Format). Acel codificator — care a înlocuit un codificator mai vechi,
omni-tabular— se află în motorul headroom (open-sse/services/compression/engines/headroom/, iar codecul inclus se află înheadroom/gcf/). Acesta nu are legătură cu fluxul de filtre RTK documentat aici.
Configurare
Setările globale sunt disponibile prin /api/settings/compression. Setările specifice RTK sunt, de asemenea,
disponibile prin /api/context/rtk/config.
{
"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 și disabledFilters utilizează ID-uri de filtre, de exemplu test-vitest sau git-diff.
Structura completă rtkConfig este definită de RtkConfig / DEFAULT_RTK_CONFIG în
open-sse/services/compression/types.ts. Întregul obiect este stocat ca o singură valoare JSON în
tabelul SQLite key_value, sub namespace = "compression", key = "rtkConfig"
(src/lib/db/compression.ts), și este normalizat la citire de normalizeRtkConfig. Prin urmare, fiecare câmp de mai jos
— inclusiv enableGrouping, groupingThreshold, stripCodeComments și preserveDocstrings —
este stocat și recuperat prin același mecanism și persistă după o repornire.
| Cheie | Valoare implicită | Scop |
|---|---|---|
deduplicateThreshold |
3 |
La nivelul motorului: numărul minim de linii consecutive identice pentru restrângere (2–100) |
enableGrouping |
false |
Opțional: restrânge secvențele de linii consecutive aproape echivalente |
groupingThreshold |
3 |
Numărul minim de linii similare consecutive care declanșează gruparea |
stripCodeComments |
false |
Opțional: elimină comentariile din blocurile de cod delimitate (necesită applyToCodeBlocks) |
preserveDocstrings |
true |
La eliminarea comentariilor, păstrează blocurile JSDoc//** … */ |
API
| Rută | Metodă | Scop |
|---|---|---|
/api/context/rtk/config |
GET | Citește configurația RTK |
/api/context/rtk/config |
PUT | Actualizează configurația RTK |
/api/context/rtk/filters |
GET | Listează catalogul de filtre și diagnosticele de încărcare |
/api/context/rtk/import |
POST | Validează sau instalează fișiere de schemă RTK TOML v1 |
/api/context/rtk/test |
POST | Previzualizează compresia RTK pentru un text |
/api/context/rtk/raw-output/[id] |
GET | Citește rezultatul brut redactat și păstrat |
/api/compression/preview |
POST | Previzualizează orice mod de compresie |
Sarcină utilă pentru testarea RTK:
{
"command": "npm test",
"text": "FAIL tests/example.test.ts\nAssertionError: expected true\nTest Files 1 failed",
"config": {
"intensity": "standard"
}
}
Sarcină utilă pentru previzualizarea compresiei:
{
"mode": "stacked",
"messages": [
{
"role": "tool",
"content": "FAIL tests/example.test.ts\nAssertionError: expected true\nTest Files 1 failed"
}
],
"config": {
"rtkConfig": {
"rawOutputRetention": "failures"
}
}
}
Rutele de administrare necesită autentificare pentru administrarea panoului de control sau politica aferentă cheii API.
Sarcină utilă pentru validarea RTK TOML:
{
"action": "validate",
"content": "schema_version = 1\n\n[filters.my-tool]\nmatch_command = \"^my-tool\\\\b\"\nmax_lines = 20\n"
}
Utilizați "action": "install" pentru a instala global fișierul validat. Adăugați "overwrite": true numai
după examinarea și confirmarea înlocuirii unui fișier global existent.
Recuperarea rezultatului brut
În mod normal, RTK returnează doar text comprimat. Pentru depanare, rawOutputRetention poate păstra rezultatul brut cu informațiile sensibile eliminate:
| Valoare | Comportament |
|---|---|
never |
Nu păstrează rezultatul brut |
failures |
Păstrează doar rezultatele care indică probabil un eșec |
always |
Păstrează fiecare rezultat brut comprimat de RTK, după eliminarea informațiilor sensibile |
Fișierele păstrate sunt scrise în:
DATA_DIR/rtk/raw-output/
Informațiile secrete sunt eliminate înainte de stocare, inclusiv tokenurile bearer uzuale, cheile API, tokenurile Slack, cheile de acces AWS și valorile de tip atribuire token=..., secret=..., password=.... Datele analitice stochează doar identificatorul indicatorului, dimensiunea și metadatele hash.
Poarta de verificare
Poarta de verificare focalizată rulează testele integrate ale filtrelor inline fără a invoca comenzi externe prin shell:
node --import tsx/esm --test tests/unit/compression/rtk-verify.test.ts
Poarta RTK mai amplă este:
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
Rulați poarta amplă de compresie înainte de lansare:
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
Extinderea RTK
- Adăugați sau actualizați un fișier JSON de filtrare.
- Includeți cel puțin un exemplu
tests[]care demonstrează comportamentul important. - Adăugați o mostră în
tests/unit/compression/fixtures/rtk/pentru familiile noi de comenzi. - Adăugați acoperire pentru detectarea comenzilor când introduceți o nouă clasă de rezultate.
- Rulați porțile de verificare și RTK amplă.
- Dacă filtrul este local proiectului, includeți
.rtk/filters.jsonîn commit și reîmprospătați.rtk/trust.jsonnumai după revizuire.
Niveluri de intensitate (v3.8.16+)
RTK acceptă 3 niveluri de intensitate care realizează un compromis între agresivitatea compresiei și siguranță. Nivelul este setat prin config.intensity în configurația motorului.
Cele 3 niveluri
| Nivel | Prag de trunchiere | Economie de tokenuri | Risc | Recomandat pentru |
|---|---|---|---|---|
minimal |
24 de linii pe secțiune | ~20-40% | Foarte scăzut | Producție cu un context critic |
standard (implicit) |
24 de linii pe secțiune | ~50-70% | Scăzut | Sesiuni zilnice de programare |
aggressive |
16 linii pe secțiune | ~70-90% | Mediu | Sesiuni lungi, economii maxime |
Unde are loc trunchierea
Pragul de trunchiere afectează lineFilter.ts:
// Din open-sse/services/compression/engines/rtk/index.ts:329-330
config.intensity === "aggressive" ? 16 : 24,
config.intensity === "aggressive" ? 16 : 24,
Atât începutul, cât și sfârșitul fiecărei secțiuni sunt păstrate; conținutul din mijloc este eliminat atunci când se activează trunchierea.
Ce se păstrează și ce se elimină
| Conținut | minimal | standard | aggressive |
|---|---|---|---|
| Erori / urme de stivă | ✅ păstrate | ✅ păstrate | ✅ păstrate |
| Teste eșuate | ✅ păstrate | ✅ păstrate | ✅ păstrate |
| Erori de compilare | ✅ păstrate | ✅ păstrate | ✅ păstrate |
| Teste reușite (detaliate) | ✅ păstrate | 🟡 restrânse | 🟡 restrânse |
| Rezultate de rutină (jurnale info) | 🟡 restrânse | 🟡 restrânse | ❌ eliminate |
| Bare de progres | 🟡 restrânse | ❌ eliminate | ❌ eliminate |
| Bannere / artă ASCII | 🟡 restrânse | ❌ eliminate | ❌ eliminate |
Alegerea intensității potrivite
Pierderea contextului este catastrofală?
│
┌───────────┼───────────┐
│ │ │
DA NU NESIGUR
│ │ │
▼ │ │
minimal │ │
│ │ │
│ ▼ ▼
│ Cât de critică Încercați mai întâi `standard`
│ este viteza? (funcționează pentru 80%
│ │ din cazuri)
│ ┌────┴────┐
│ │ │
│ SCĂZUTĂ RIDICATĂ
│ │ │
│ ▼ ▼
│ standard aggressive
│ │ │
└──────┴─────────┘
Configurarea intensității
Per combinație (în configurația combinației):
{
"combo": "my-coding-combo",
"routing": {/* ... */},
"compression": {
"engine": "rtk",
"intensity": "aggressive"
}
}
Programatic:
rtkEngine (@omniroute/open-sse/services/compression/engines/rtk) este un
CompressionEngine și nu are nicio metodă updateConfig. Actualizați configurația unui motor
prin intermediul funcției ajutătoare a registrului:
import { updateEngineConfig } from "@omniroute/open-sse/services/compression/engines/registry";
updateEngineConfig("rtk", { intensity: "aggressive" });
Verificarea efectului
Utilizați Poarta de verificare (consultați mai jos) pentru a confirma că filtrul este sigur la intensitatea aleasă:
import { runRtkFilterTests } from "omniroute/compression/engines/rtk/verify";
const result = runRtkFilterTests({ intensity: "aggressive" });
if (!result.passed) {
console.error("Filtrele au eșuat la intensitatea agresivă");
}
Dezvoltarea filtrelor personalizate (v3.8.16+)
Directorul engines/rtk/filters/ conține peste 49 de fișiere JSON cu filtre încorporate. Puteți adăuga propriile filtre pentru a comprima rezultatele instrumentelor personalizate care nu sunt acoperite de setările implicite.
Schema filtrului (Zod)
{
"id": "string", // Obligatoriu. Identificatorul filtrului (kebab-case, de ex., "python-traceback")
"label": "string", // Obligatoriu. Numele lizibil al filtrului
"description": "string", // Opțional (implicit: ""). Scurtă descriere a funcției filtrului
"category": "git|test|build|shell|docker|package|infra|cloud|generic",
"priority": number, // Opțional (0-100, implicit: 50). Ordinea de execuție (mai mare = primul)
"match": {
"commands": ["string"], // Numele comenzilor care trebuie identificate (de ex., "python", "pytest")
"patterns": ["string"], // Expresii regulate pentru identificarea rezultatului
"outputTypes": ["string"] // Clase de rezultat detectate (de ex., "test-failure")
},
"rules": {
"stripAnsi": boolean, // Opțional (implicit: false). Elimină codurile de culoare ANSI
"replace": [ // Reguli de căutare și înlocuire (implicit: [])
{ "pattern": "regex", "replacement": "..." }
],
"matchOutput": [ // Oprește procesarea la identificarea unui șablon (implicit: [])
{
"pattern": "regex",
"message": "short summary",
"unless": "regex" // Omite dacă acest șablon este identificat
}
],
"includePatterns": ["string"], // Liniile care trebuie păstrate (expresii regulate, implicit: [])
"dropPatterns": ["string"], // Liniile care trebuie eliminate (expresii regulate, implicit: [])
"collapsePatterns": ["string"], // Liniile care trebuie restrânse la o singură apariție (implicit: [])
"deduplicate": boolean, // Opțional (implicit: false). Elimină liniile duplicate
"truncateLineAt": number, // Opțional (implicit: 0). Trunchiază liniile la numărul maxim de caractere
"maxLines": number, // Opțional (implicit: 0). Limită strictă pentru numărul total de linii
"headLines": number, // Opțional (implicit: 20). Păstrează primele N linii ale rezultatului identificat
"tailLines": number, // Opțional (implicit: 20). Păstrează ultimele N linii ale rezultatului identificat
"onEmpty": "string", // Opțional (implicit: ""). Mesaj de rezervă dacă toate liniile sunt filtrate
"filterStderr": boolean // Opțional (implicit: false). Filtrează și rezultatul stderr
},
"preserve": {
"errorPatterns": ["string"], // Șabloane care trebuie păstrate întotdeauna (implicit: [])
"summaryPatterns": ["string"] // Șabloane pentru linia finală de rezumat (implicit: [])
},
"tests": [ // Teste inline pentru verificare (implicit: [])
{
"name": "string", // Obligatoriu. Numele testului
"input": "sample output", // Obligatoriu. Exemplu de text de intrare
"expected": "expected output", // Obligatoriu. Rezultatul comprimat așteptat
"command": "optional command" // Opțional. Contextul comenzii
}
]
}
Exemplu: filtru pentru traceback 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"
}
]
}
Încărcarea filtrelor personalizate
Plasați fișierul într-o locație recunoscută:
~/.omniroute/rtk/filters/my-filter.json # La nivel de utilizator
<project>/.rtk/filters/my-filter.json # La nivel de proiect
Filtrele sunt încărcate automat la pornire prin loadRtkFilters() din open-sse/services/compression/engines/rtk/filterLoader.ts. Modulul de încărcare descoperă filtrele din:
- Catalogul încorporat:
open-sse/services/compression/engines/rtk/filters/ - Directorul utilizatorului:
~/.omniroute/rtk/filters/ - Directorul proiectului:
<project>/.rtk/filters/
Pentru a încărca filtrele programatic:
import { loadRtkFilters } from "@omniroute/open-sse/services/compression/engines/rtk/filterLoader";
// Opțiuni: customFiltersEnabled (încarcă filtrele utilizatorului/proiectului, activat implicit),
// trustProjectFilters, refresh.
const filters = loadRtkFilters({ customFiltersEnabled: true });
Validare
Filtrele sunt validate la încărcare pe baza schemei Zod. Un filtru cu o structură incorectă nu va putea fi încărcat și va genera o eroare în jurnal:
RTK_FILTER_LOADER: filter "my-filter" failed validation:
- rules.replace.0.pattern: Invalid regex
- match.commands: must not be empty
Pentru a valida toate filtrele instalate, apelați runRtkFilterTests(), care este exportată din open-sse/services/compression/engines/rtk/verify.ts.
Bune practici
- Includeți întotdeauna
tests[]— acestea demonstrează că filtrul funcționează și previn regresiile - Utilizați
matchOutputpentru scurtcircuitări — dacă un singur rând spune întreaga poveste, înlocuiți tot blocul - Preferați
keepîn loc destrip— regulile explicite de tip „păstrează întotdeauna” sunt mai sigure decât cele de tip „elimină întotdeauna” - Testați la toate cele 3 niveluri de intensitate —
minimalnu ar trebui să facă nimic, iaraggressivear trebui să păstreze în continuare erorile - Utilizați câmpul
unless— protejați scurtcircuitările cu regula „nu declanșa dacă X este prezent”
Recuperarea ieșirii brute și poarta de verificare
Atunci când RTK comprimă agresiv ieșirea, puteți recupera textul original pentru depanare, auditare sau reluare.
Cum funcționează recuperarea ieșirii brute
Ieșire originală (10K tokenuri)
│
▼
Comprimare RTK (cu rawOutput.enabled=true)
│
├─▶ Ieșire comprimată (2K tokenuri) ──▶ către LLM
│
└─▶ Ieșire originală (10K tokenuri) ──▶ stocată în DB
(asociată prin request_id)
Activarea stocării ieșirii brute
Pentru fiecare solicitare (în configurația combo):
{
"compression": {
"engine": "rtk",
"intensity": "aggressive",
"rawOutput": {
"enabled": true,
"maxBytes": 1048576 // limită de 1MB
}
}
}
Valoare implicită: rawOutput.enabled: false (economisește spațiu de stocare).
Costul stocării
| Per solicitare | Limită de 1MB | Limită de 10MB |
|---|---|---|
| Ieșire comprimată medie | ~5KB | ~5KB |
| Ieșire brută stocată | ~50-500KB | ~500KB-5MB |
| Cu 1000 solicitări/zi | 50-500MB/zi | 500MB-5GB/zi |
Recomandare: Activați ieșirea brută numai pentru sesiuni de depanare sau auditare prin eșantionare, nu în permanență.
Recuperarea originalului
import { readRtkRawOutput } from "omniroute/compression/engines/rtk/rawOutput";
const raw = readRtkRawOutput(pointerId); // pointerId din statisticile de comprimare
if (raw) {
console.log("Original output:", raw);
}
pointerId este returnat în CompressionStats.rtkRawOutputPointers[] după comprimare.
Consultați open-sse/services/compression/engines/rtk/rawOutput.ts:102 pentru semnătura funcției.
Poarta de verificare
Verificarea filtrelor RTK (open-sse/services/compression/engines/rtk/verify.ts) validează toate filtrele în raport cu propriile tests[] și se asigură că au un comportament corect la toate cele 3 niveluri de intensitate.
Apelați runRtkFilterTests() pentru a rula verificarea:
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}"`
);
});
}
Ce validează:
- Fiecare filtru se încarcă și trece validarea schemei
- Fiecare intrare
tests[]produce rezultatul așteptat - Intensitatea
minimalnu efectuează nicio operațiune (păstrează originalul și aplică numai filtrele structurale) - Intensitatea
aggressivepăstrează erorile, testele nereușite și urmele stivei - Ieșirea comprimată nu este niciodată mai mare decât intrarea originală
-
Sursă:
open-sse/services/compression/engines/rtk/(63 de fișiere, ~70KB) -
Înainte de îmbinarea unei modificări de filtru — asigurați-vă întotdeauna că testele trec
-
După actualizarea motorului RTK — este posibil ca schema să se fi modificat
-
Periodic, în cadrul monitorizării — protejează împotriva divergențelor din datele de test
-
La adăugarea unei noi familii de instrumente/comenzi — demonstrează că noul filtru funcționează
Consultați și
- COMPRESSION_GUIDE.md — Prezentare generală completă a fluxului de compresie
- COMPRESSION_ENGINES.md — Registrul motoarelor și motoarele încorporate
- EXTENDING_COMPRESSION.md — Motoare personalizate, pachete lingvistice, fluxuri suprapuse
- Sursă:
open-sse/services/compression/engines/rtk/(63 de fișiere, ~70 KB)