Files
OmniRoute/docs/i18n/fr/docs/compression/RTK_COMPRESSION.md
Diego Rodrigues de Sa e Souza 8feea123bb feat(docs): mirror every docs/ page in all 65 locales (#14106)
* 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.
2026-09-18 13:16:46 -03:00

40 KiB
Raw Blame History

RTK Compression (Français)

🌐 Languages: 🇺🇸 English · 🇪🇹 am · 🇸🇦 ar · 🇦🇿 az · 🇧🇬 bg · 🇧🇩 bn · 🇨🇿 cs · 🇩🇰 da · 🇩🇪 de · 🇬🇷 el · 🇪🇸 es · 🇪🇪 et · 🇮🇷 fa · 🇫🇮 fi · 🇮🇪 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


La compression RTK est le moteur de compression dOmniRoute sensible aux commandes pour les sorties de terminal et doutils. Elle est conçue pour les sessions dagents de codage, dans lesquelles lessentiel de laugmentation du contexte provient des journaux de tests, des sorties de build, du bruit des gestionnaires de paquets, des transcriptions shell, des sorties Docker, des sorties git et des traces de pile.

RTK peut sexécuter directement avec defaultMode: "rtk" ou comme première étape dun pipeline empilé, généralement :

rtk -> caveman

Cet ordre compresse dabord les sorties machine bruyantes, puis permet à Caveman de condenser le texte restant.

Le projet RTK en amont annonce des économies de 60-90% sur les sorties de commandes. Dans lexemple de session de son README, le volume passe de ~118,000 jetons standard à ~23,900 jetons RTK, soit une économie de 79.7% (~80%). OmniRoute utilise cette moyenne en amont pour calculer les économies cumulées avec la compression des entrées de Caveman :

Moyenne RTK :   80% économisés
Entrée Caveman : 46% économisés
Cumulée :       1 - (1 - 0.80) * (1 - 0.46) = 89.2% économisés
Plage :         1 - (1 - 0.60..0.90) * (1 - 0.46) = 78.4-94.6%

Ce qui est compressé

Le catalogue intégré fournit actuellement 49 filtres répartis dans les catégories suivantes :

Catégorie Exemples
git git status, git branch, git diff, git log
test Vitest, Jest, Pytest, Playwright, tests Go, tests Cargo
build TypeScript, ESLint, Biome, Prettier, Vite, Webpack, Turbo, Nx
package npm install, npm audit, pip, uv sync, Poetry, Bundler
shell ls, find, grep, journaux shell génériques
docker docker ps, journaux Docker
infra Terraform, OpenTofu, systemctl status
generic Sortie JSON, traces de pile, solution de repli générique

Le détecteur dans open-sse/services/compression/engines/rtk/commandDetector.ts classifie la sortie avant la sélection du filtre. Les filtres peuvent également effectuer une correspondance à partir dun motif de commande ou dune expression régulière appliquée à la sortie lorsquune classe de commande ne suffit pas.

Résolution des filtres

RTK charge les filtres dans lordre suivant :

  1. Filtres du projet provenant de .rtk/filters.toml et .rtk/filters.json, uniquement lorsquils sont approuvés.
  2. Filtres globaux provenant de DATA_DIR/rtk/filters.toml et DATA_DIR/rtk/filters.json.
  3. Filtres intégrés provenant de open-sse/services/compression/engines/rtk/filters/.

Au sein dune même portée, les filtres du schéma TOML v1 de RTK ont priorité sur les filtres JSON dOmniRoute. Les expressions TOML match_command sont vérifiées avant la correspondance par type de commande, afin quun filtre importé propre à une commande puisse remplacer un filtre plus général dans cette portée. La portée du projet reste prioritaire sur la portée globale, quel que soit le format de fichier.

Les filtres de projet sont intentionnellement soumis à une vérification de confiance, car les filtres utilisant des expressions régulières peuvent modifier la manière dont les sorties doutils sont présentées aux agents. Un fichier de filtres de projet est accepté lorsque lune des conditions suivantes est remplie :

  • rtkConfig.trustProjectFilters vaut true.
  • OMNIROUTE_RTK_TRUST_PROJECT_FILTERS=1 est défini.
  • .rtk/trust.json contient le hachage SHA-256 correspondant au fichier de filtres du projet.

Exemple de fichier de confiance :

{
  "filtersSha256": "0123456789abcdef...",
  "filtersTomlSha256": "fedcba9876543210..."
}

Les hachages sont distincts : filtersSha256 approuve .rtk/filters.json, tandis que filtersTomlSha256 approuve .rtk/filters.toml. La modification de lun ou lautre fichier invalide uniquement son entrée de confiance respective. Les fichiers globaux sont installés par ladministrateur et utilisent le comportement existant de confiance des filtres globaux.

Les filtres personnalisés peuvent être constitués dun objet de filtre unique ou dun tableau dobjets de filtre. Les filtres personnalisés non valides sont ignorés et signalés par les diagnostics de /api/context/rtk/filters. Les filtres intégrés non valides provoquent un échec immédiat.

Compatibilité avec le schéma RTK TOML v1

OmniRoute peut analyser, valider, tester et installer des fichiers de filtres déclaratifs utilisant le schéma RTK TOML v1. Les champs pris en charge sont 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 et les tests intégrés [[tests.<filter>]]. Les champs inconnus, les expressions régulières non valides ou non sûres, l'utilisation simultanée de règles de suppression et de conservation, les fichiers dépassant 1 MiB et les références à des filtres inconnus sont rejetés. Un fichier dont les tests intégrés échouent peut être validé à des fins d'inspection, mais ne peut pas être installé ni chargé. Les échecs de chargement de fichiers personnalisés restent non bloquants : le fichier non valide est ignoré et les autres filtres continuent de fonctionner.

OmniRoute reçoit la sortie de l'outil après sa capture par le client ; filter_stderr = true ne peut donc pas modifier la capture du processus. Le champ est accepté sans produire d'effet et la validation renvoie un avertissement. Cette fonctionnalité est intentionnellement décrite comme une compatibilité avec le schéma RTK TOML v1, et non comme une compatibilité complète avec l'exécutable RTK, les hooks de shell, les implémentations de commandes en Rust ou la structure de son magasin de confiance.

La vue RTK avancée du tableau de bord accepte le contenu TOML collé ou téléversé. La validation est effectuée en lecture seule. L'installation écrit DATA_DIR/rtk/filters.toml de façon atomique avec des permissions restrictives et actualise le catalogue de filtres actif sans redémarrage. Le remplacement d'un fichier existant nécessite une confirmation explicite via overwrite et crée d'abord DATA_DIR/rtk/filters.toml.bak.

DSL des filtres

Les filtres utilisent le schéma JSON décrit dans Format des règles de compression. L'environnement d'exécution applique ces étapes dans l'ordre suivant :

stripAnsi -> filterStderr -> replace -> matchOutput -> suppression/inclusion de lignes
  -> truncateLineAt -> head/tail/maxLines -> onEmpty

Champs importants :

Champ Objectif
rules.stripAnsi Supprimer les séquences de couleur/contrôle du terminal avant la correspondance
rules.filterStderr Normaliser les préfixes stderr courants avant la correspondance/le filtrage
rules.replace Appliquer des remplacements ordonnés par expression régulière
rules.matchOutput Renvoyer un résumé compact lorsque la sortie correspond à une condition connue
rules.matchOutput[].unless Ignorer le raccourci lorsqu'un motif d'erreur ou d'échec est présent
rules.dropPatterns Supprimer les lignes parasites
rules.includePatterns Privilégier les lignes exploitables
rules.collapsePatterns Regrouper les lignes correspondantes répétées
rules.deduplicate Activation par filtre : regrouper les lignes consécutives dupliquées
rules.truncateLineAt Tronquer chaque ligne en préservant Unicode
rules.onEmpty Message de secours si toutes les lignes sont filtrées
tests[] Exemples intégrés utilisés par le contrôle de vérification

Les filtres intégrés doivent normalement inclure des exemples de test tests[]. Les filtres personnalisés devraient également en inclure, en particulier lorsqu'ils sont partagés entre plusieurs projets.

Déduplication des lignes (deux niveaux)

RTK regroupe les lignes dupliquées à deux niveaux indépendants :

  1. deduplicate par filtre (optionnel, valeur par défaut : false). Un filtre peut définir rules.deduplicate: true afin de regrouper les lignes dupliquées consécutives dans la sortie correspondante de ce filtre, avant la troncature. Cette opération sexécute dans lineFilter.ts. Pour les filtres historiques, elle est automatiquement activée lorsque le filtre définit collapsePatterns. Schéma : deduplicate: z.boolean().default(false) dans open-sse/services/compression/engines/rtk/filterSchema.ts.
  2. deduplicateThreshold à léchelle du moteur (valeur par défaut : 3). Une fois tous les filtres exécutés, le moteur regroupe toute séquence dau moins deduplicateThreshold lignes consécutives identiques dans lensemble du résultat (deduplicateRepeatedLines, appliqué dans engines/rtk/index.ts). La valeur est limitée à lintervalle 2100 lors de la normalisation.

Le traitement par filtre sexécute en premier (dans le filtre), tandis que le traitement à léchelle du moteur sexécute en dernier (sur la sortie concaténée) ; les deux peuvent donc être combinés sans double comptage.

Regroupement des lignes (enableGrouping)

Lorsque rtkConfig.enableGrouping vaut true (valeur par défaut : false), RTK exécute un traitement groupSimilarLines supplémentaire sur le résultat après déduplication, lequel regroupe les séquences de lignes consécutives presque équivalentes (et non identiques octet par octet). rtkConfig.groupingThreshold (valeur par défaut : 3) correspond à la longueur minimale dune séquence déclenchant le regroupement. Il sagit du pendant structurel de deduplicateThreshold : la déduplication traite les répétitions exactes, tandis que le regroupement traite « la même structure avec de petites différences ». Ces deux options font partie du JSON rtkConfig persisté dans la table key_value (voir la section Configuration ci-dessus), de sorte que le paramètre est conservé après les redémarrages.

Suppression des commentaires de code (stripCodeComments / preserveDocstrings)

Lorsque rtkConfig.applyToCodeBlocks est activé, RTK peut également supprimer les commentaires des blocs de code délimités :

  • stripCodeComments (valeur par défaut : false) — optionnel. Lorsque cette option vaut true, RTK supprime les commentaires des blocs délimités JavaScript et TypeScript. Historiquement, cette option était lue mais jamais appliquée ; la valeur par défaut reste donc « conserver » afin déviter une modification silencieuse en production.
  • preserveDocstrings (valeur par défaut : true) — lors de la suppression des commentaires, les commentaires de bloc JSDoc//** … */ sont conservés (ils contiennent une documentation dAPI dont la valeur dépasse le coût en octets). Définissez cette option sur false pour les supprimer également.

La suppression des commentaires est implémentée dans open-sse/services/compression/engines/rtk/codeStripper.ts. Elle utilise lanalyseur TypeScript (et non une expression régulière), afin que les chaînes, les gabarits et les littéraux dexpression régulière ne soient jamais confondus avec des commentaires. Elle abandonne entièrement le traitement lorsque du JSX est détecté (afin que les commentaires des conteneurs dexpressions JSX ne soient jamais altérés). La suppression des commentaires ne sapplique actuellement quà JavaScript et TypeScript — les autres langages de lensemble CodeLanguage de loutil de suppression (Python, Rust, Go, Ruby, Java) bénéficient de la suppression des lignes vides et de la réduction des espaces, mais pas de la suppression des commentaires. Lexécution sur le bloc nettoyé est marquée rtk:code-strip dans rulesApplied.

Remarque — GCF / lencodage tabulaire est un moteur distinct. RTK ne contient pas lencodeur JSON tabulaire/colonnaire « GCF » (Graph Compact Format). Cet encodeur — qui a remplacé un ancien encodeur omni-tabular — se trouve dans le moteur headroom (open-sse/services/compression/engines/headroom/, avec le codec intégré sous headroom/gcf/). Il nest pas lié au pipeline de filtres RTK documenté ici.

Configuration

Les paramètres globaux sont disponibles via /api/settings/compression. Les paramètres propres à RTK sont également disponibles via /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 et disabledFilters utilisent des identifiants de filtre, par exemple test-vitest ou git-diff.

La structure complète de rtkConfig est définie par RtkConfig / DEFAULT_RTK_CONFIG dans open-sse/services/compression/types.ts. Lobjet entier est conservé sous la forme dune valeur JSON unique dans la table SQLite key_value sous namespace = "compression", key = "rtkConfig" (src/lib/db/compression.ts), et normalisé à la lecture par normalizeRtkConfig. Ainsi, chaque champ ci-dessous — y compris enableGrouping, groupingThreshold, stripCodeComments et preserveDocstrings — effectue un aller-retour dans le même stockage et persiste après un redémarrage.

Clé Valeur par défaut Rôle
deduplicateThreshold 3 Pour tout le moteur : nombre minimal de lignes identiques consécutives à réduire (de 2 à 100)
enableGrouping false Option facultative : réduire les suites de lignes consécutives presque équivalentes
groupingThreshold 3 Nombre minimal de lignes similaires consécutives déclenchant le regroupement
stripCodeComments false Option facultative : supprimer les commentaires des blocs de code délimités (nécessite applyToCodeBlocks)
preserveDocstrings true Lors de la suppression des commentaires, conserver les blocs JSDoc//** … */

API

Route Méthode Rôle
/api/context/rtk/config GET Lire la configuration RTK
/api/context/rtk/config PUT Mettre à jour la configuration RTK
/api/context/rtk/filters GET Répertorier le catalogue de filtres et les diagnostics de chargement
/api/context/rtk/import POST Valider ou installer des fichiers de schéma TOML RTK v1
/api/context/rtk/test POST Prévisualiser la compression RTK dune charge utile textuelle
/api/context/rtk/raw-output/[id] GET Lire la sortie brute expurgée conservée
/api/compression/preview POST Prévisualiser nimporte quel mode de compression

Charge utile de test RTK :

{
  "command": "npm test",
  "text": "FAIL tests/example.test.ts\nAssertionError: expected true\nTest Files 1 failed",
  "config": {
    "intensity": "standard"
  }
}

Charge utile de prévisualisation de la compression :

{
  "mode": "stacked",
  "messages": [
    {
      "role": "tool",
      "content": "FAIL tests/example.test.ts\nAssertionError: expected true\nTest Files 1 failed"
    }
  ],
  "config": {
    "rtkConfig": {
      "rawOutputRetention": "failures"
    }
  }
}

Les routes de gestion nécessitent lauthentification de gestion du tableau de bord ou la stratégie de clé API correspondante.

Charge utile de validation TOML RTK :

{
  "action": "validate",
  "content": "schema_version = 1\n\n[filters.my-tool]\nmatch_command = \"^my-tool\\\\b\"\nmax_lines = 20\n"
}

Utilisez "action": "install" pour installer globalement le fichier validé. Ajoutez "overwrite": true uniquement après avoir examiné et confirmé le remplacement dun fichier global existant.

Récupération de la sortie brute

RTK ne renvoie normalement que du texte compressé. Pour le débogage, rawOutputRetention peut conserver la sortie brute expurgée :

Valeur Comportement
never Ne pas conserver la sortie brute
failures Conserver uniquement les sorties correspondant probablement à des échecs
always Conserver chaque sortie brute compressée par RTK, après expurgation

Les fichiers conservés sont écrits sous :

DATA_DIR/rtk/raw-output/

Les secrets sont expurgés avant la persistance, notamment les jetons Bearer courants, les clés dAPI, les jetons Slack, les clés daccès AWS et les valeurs de type affectation token=..., secret=..., password=.... Les données analytiques ne stockent que lidentifiant du pointeur, la taille et les métadonnées de hachage.

Barrière de vérification

La barrière de vérification ciblée exécute les tests de filtres intégrés sans recourir à des commandes externes :

node --import tsx/esm --test tests/unit/compression/rtk-verify.test.ts

La barrière RTK plus générale est :

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

Exécutez la barrière générale de compression avant la publication :

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

Extension de RTK

  1. Ajoutez ou mettez à jour un fichier JSON de filtre.
  2. Incluez au moins un exemple tests[] démontrant le comportement important.
  3. Ajoutez un jeu de données sous tests/unit/compression/fixtures/rtk/ pour les nouvelles familles de commandes.
  4. Ajoutez une couverture de détection des commandes lors de lintroduction dune nouvelle classe de sortie.
  5. Exécutez les barrières de vérification et RTK générale.
  6. Si le filtre est local au projet, validez .rtk/filters.json et actualisez .rtk/trust.json uniquement après vérification.

Niveaux dintensité (v3.8.16+)

RTK prend en charge 3 niveaux dintensité offrant différents compromis entre lagressivité de la compression et la sécurité. Le niveau est défini via config.intensity dans la configuration du moteur.

Les 3 niveaux

Niveau Seuil de troncature Économie de jetons Risque Idéal pour
minimal 24 lignes par section ~20-40% Très faible Production avec un contexte critique
standard (défaut) 24 lignes par section ~50-70% Faible Sessions quotidiennes de programmation
aggressive 16 lignes par section ~70-90% Moyen Longues sessions, économies maximales

Emplacement de la troncature

Le seuil de troncature affecte lineFilter.ts :

// Extrait de open-sse/services/compression/engines/rtk/index.ts:329-330
config.intensity === "aggressive" ? 16 : 24,
config.intensity === "aggressive" ? 16 : 24,

Le début et la fin de chaque section sont tous deux préservés ; le contenu intermédiaire est supprimé lorsque la troncature sapplique.

Ce qui est conservé et ce qui est supprimé

Contenu minimal standard aggressive
Erreurs / traces de pile préservées préservées préservées
Échecs de tests préservés préservés préservés
Erreurs de compilation préservées préservées préservées
Tests réussis (sortie détaillée) préservés 🟡 condensés 🟡 condensés
Sortie courante (journaux info) 🟡 condensée 🟡 condensée supprimée
Barres de progression 🟡 condensées supprimées supprimées
Bannière / art ASCII 🟡 condensé supprimé supprimé

Choix de lintensité appropriée

                  La perte de contexte est-elle catastrophique ?
                  │
      ┌───────────┼───────────┐
      │           │           │
    OUI          NON       INCERTAIN
      │           │           │
      ▼           │           │
   minimal        │           │
      │           │           │
      │           ▼           ▼
      │      Quel est le     Essayez dabord `standard`
      │      niveau critique (convient à 80 % des
      │      du débit ?      cas)
      │           │
      │      ┌────┴────┐
      │      │         │
      │   FAIBLE      ÉLEVÉ
      │      │         │
      │      ▼         ▼
      │   standard   aggressive
      │      │         │
      └──────┴─────────┘

Configuration de lintensité

Par combo (dans la configuration du combo) :

{
  "combo": "my-coding-combo",
  "routing": {/* ... */},
  "compression": {
    "engine": "rtk",
    "intensity": "aggressive"
  }
}

Par programmation :

rtkEngine (@omniroute/open-sse/services/compression/engines/rtk) est un CompressionEngine et ne possède aucune méthode updateConfig. Mettez à jour la configuration dun moteur à laide de lutilitaire du registre :

import { updateEngineConfig } from "@omniroute/open-sse/services/compression/engines/registry";

updateEngineConfig("rtk", { intensity: "aggressive" });

Vérification de leffet

Utilisez la barrière de vérification (voir ci-dessous) pour confirmer que votre filtre est sûr avec lintensité choisie :

import { runRtkFilterTests } from "omniroute/compression/engines/rtk/verify";

const result = runRtkFilterTests({ intensity: "aggressive" });
if (!result.passed) {
  console.error("Échec des filtres avec lintensité aggressive");
}

Développement de filtres personnalisés (v3.8.16+)

Le répertoire engines/rtk/filters/ contient plus de 49 fichiers JSON de filtres intégrés. Vous pouvez ajouter les vôtres afin de compresser la sortie doutils personnalisés non couverts par les filtres par défaut.

Schéma du filtre (Zod)

{
  "id": "string",                      // Obligatoire. Identifiant du filtre (kebab-case, p. ex. « python-traceback »)
  "label": "string",                   // Obligatoire. Nom lisible du filtre
  "description": "string",             // Facultatif (valeur par défaut : ""). Brève description de laction du filtre
  "category": "git|test|build|shell|docker|package|infra|cloud|generic",
  "priority": number,                  // Facultatif (0-100, valeur par défaut : 50). Ordre dexécution (plus élevé = en premier)
  "match": {
    "commands": ["string"],            // Noms de commandes à faire correspondre (p. ex. « python », « pytest »)
    "patterns": ["string"],            // Expressions régulières à faire correspondre à la sortie
    "outputTypes": ["string"]          // Classes de sortie détectées (p. ex. « test-failure »)
  },
  "rules": {
    "stripAnsi": boolean,              // Facultatif (valeur par défaut : false). Supprime les codes de couleur ANSI
    "replace": [                       // Règles de recherche et de remplacement (valeur par défaut : [])
      { "pattern": "regex", "replacement": "..." }
    ],
    "matchOutput": [                   // Interrompt le traitement lorsquun motif correspond (valeur par défaut : [])
      {
        "pattern": "regex",
        "message": "short summary",
        "unless": "regex"              // Ignore si ce motif correspond
      }
    ],
    "includePatterns": ["string"],     // Lignes à conserver (expressions régulières, valeur par défaut : [])
    "dropPatterns": ["string"],        // Lignes à supprimer (expressions régulières, valeur par défaut : [])
    "collapsePatterns": ["string"],    // Lignes à réduire à une seule occurrence (valeur par défaut : [])
    "deduplicate": boolean,            // Facultatif (valeur par défaut : false). Supprime les lignes en double
    "truncateLineAt": number,          // Facultatif (valeur par défaut : 0). Tronque les lignes au nombre maximal de caractères
    "maxLines": number,                // Facultatif (valeur par défaut : 0). Limite stricte du nombre total de lignes
    "headLines": number,               // Facultatif (valeur par défaut : 20). Conserve les N premières lignes de la sortie correspondante
    "tailLines": number,               // Facultatif (valeur par défaut : 20). Conserve les N dernières lignes de la sortie correspondante
    "onEmpty": "string",               // Facultatif (valeur par défaut : ""). Message de repli si toutes les lignes sont filtrées
    "filterStderr": boolean            // Facultatif (valeur par défaut : false). Filtre également la sortie stderr
  },
  "preserve": {
    "errorPatterns": ["string"],       // Motifs devant toujours être conservés (valeur par défaut : [])
    "summaryPatterns": ["string"]      // Motifs correspondant à la ligne de résumé finale (valeur par défaut : [])
  },
  "tests": [                           // Tests intégrés pour vérification (valeur par défaut : [])
    {
      "name": "string",               // Obligatoire. Nom du test
      "input": "sample output",        // Obligatoire. Exemple de texte dentrée
      "expected": "expected output",   // Obligatoire. Sortie compressée attendue
      "command": "optional command"    // Facultatif. Contexte de la commande
    }
  ]
}

Exemple : filtre de 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"
    }
  ]
}

Chargement des filtres personnalisés

Placez le fichier dans un emplacement reconnu :

~/.omniroute/rtk/filters/my-filter.json     # Niveau utilisateur
<project>/.rtk/filters/my-filter.json      # Niveau projet

Les filtres sont chargés automatiquement au démarrage via loadRtkFilters() dans open-sse/services/compression/engines/rtk/filterLoader.ts. Le chargeur recherche les filtres dans les emplacements suivants :

  • Catalogue intégré : open-sse/services/compression/engines/rtk/filters/
  • Répertoire utilisateur : ~/.omniroute/rtk/filters/
  • Répertoire du projet : <project>/.rtk/filters/

Pour charger les filtres par programmation :

import { loadRtkFilters } from "@omniroute/open-sse/services/compression/engines/rtk/filterLoader";

// Options : customFiltersEnabled (charge les filtres utilisateur/projet, activé par défaut),
// trustProjectFilters, refresh.
const filters = loadRtkFilters({ customFiltersEnabled: true });

Validation

Les filtres sont validés par rapport au schéma Zod lors du chargement. Un filtre dont la structure est incorrecte ne pourra pas être chargé et une erreur sera consignée :

RTK_FILTER_LOADER: échec de la validation du filtre "my-filter" :
  - rules.replace.0.pattern: Expression régulière non valide
  - match.commands: ne doit pas être vide

Pour valider tous les filtres installés, appelez runRtkFilterTests(), qui est exportée depuis open-sse/services/compression/engines/rtk/verify.ts.

Bonnes pratiques

  1. Incluez toujours tests[] — ils prouvent que votre filtre fonctionne et évitent les régressions
  2. Utilisez matchOutput pour les sorties anticipées — si une seule ligne suffit à résumer la situation, remplacez le bloc entier
  3. Préférez keep à strip — les règles explicites « toujours conserver » sont plus sûres que « toujours supprimer »
  4. Testez les 3 niveaux dintensitéminimal ne devrait produire aucun effet, tandis que aggressive devrait tout de même préserver les erreurs
  5. Utilisez le champ unless — protégez les sorties anticipées avec une condition « ne pas déclencher si X est présent »

Récupération de la sortie brute et étape de vérification

Lorsque RTK compresse la sortie de manière agressive, vous pouvez récupérer le texte dorigine à des fins de débogage, daudit ou de relecture.

Fonctionnement de la récupération de la sortie brute

Sortie dorigine (10K jetons)
        │
        ▼
Compression RTK (avec rawOutput.enabled=true)
        │
        ├─▶ Sortie compressée (2K jetons)  ──▶ vers le LLM
        │
        └─▶ Sortie dorigine (10K jetons)  ──▶ stockée dans la BDD
                                                  (liée par request_id)

Activation du stockage de la sortie brute

Par requête (dans la configuration combinée) :

{
  "compression": {
    "engine": "rtk",
    "intensity": "aggressive",
    "rawOutput": {
      "enabled": true,
      "maxBytes": 1048576 // Plafond de 1 Mo
    }
  }
}

Valeur par défaut : rawOutput.enabled: false (économise de lespace de stockage).

Coût de stockage

Par requête Plafond de 1 Mo Plafond de 10 Mo
Sortie compressée moyenne ~5 Ko ~5 Ko
Sortie brute stockée ~50-500 Ko ~500 Ko-5 Mo
Avec 1 000 requêtes/jour 50-500 Mo/jour 500 Mo-5 Go/jour

Recommandation : activez uniquement la sortie brute pour les sessions de débogage ou les audits par échantillonnage, et non en permanence.

Récupération de la sortie dorigine

import { readRtkRawOutput } from "omniroute/compression/engines/rtk/rawOutput";

const raw = readRtkRawOutput(pointerId); // pointerId provenant des statistiques de compression
if (raw) {
  console.log("Original output:", raw);
}

Le pointerId est renvoyé dans CompressionStats.rtkRawOutputPointers[] après la compression. Consultez open-sse/services/compression/engines/rtk/rawOutput.ts:102 pour connaître la signature de la fonction.

Létape de vérification

La vérification des filtres RTK (open-sse/services/compression/engines/rtk/verify.ts) valide tous les filtres par rapport à leurs tests[] et garantit que leur comportement est correct pour les 3 niveaux dintensité.

Appelez runRtkFilterTests() pour exécuter la vérification :

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}"`
      );
    });
}

Éléments validés :

  1. Chaque filtre se charge et réussit la validation du schéma
  2. Chaque entrée de tests[] produit la sortie attendue
  3. Lintensité minimal est sans effet (elle préserve loriginal et applique uniquement les filtres structurels)
  4. Lintensité aggressive préserve les erreurs, les échecs de tests et les traces de pile
  5. La sortie compressée nest jamais plus volumineuse que lentrée dorigine
  • Source : open-sse/services/compression/engines/rtk/ (63 fichiers, ~70 Ko)

  • Avant de fusionner une modification de filtre — vérifiez toujours que les tests réussissent

  • Après la mise à niveau du moteur RTK — le schéma peut avoir changé

  • Périodiquement dans le cadre de la surveillance — protège contre la dérive des jeux de données de test

  • Lors de lajout dune nouvelle famille doutils/commandes — prouve que le nouveau filtre fonctionne


Voir aussi