# RTK Compression (Français) 🌐 **Languages:** đŸ‡ș🇾 [English](../../../../compression/RTK_COMPRESSION.md) · đŸ‡ȘđŸ‡č [am](../../../am/docs/compression/RTK_COMPRESSION.md) · 🇾🇩 [ar](../../../ar/docs/compression/RTK_COMPRESSION.md) · 🇩🇿 [az](../../../az/docs/compression/RTK_COMPRESSION.md) · 🇧🇬 [bg](../../../bg/docs/compression/RTK_COMPRESSION.md) · đŸ‡§đŸ‡© [bn](../../../bn/docs/compression/RTK_COMPRESSION.md) · 🇧🇩 [bs](../../../bs/docs/compression/RTK_COMPRESSION.md) · 🇹🇿 [cs](../../../cs/docs/compression/RTK_COMPRESSION.md) · đŸ‡©đŸ‡° [da](../../../da/docs/compression/RTK_COMPRESSION.md) · đŸ‡©đŸ‡Ș [de](../../../de/docs/compression/RTK_COMPRESSION.md) · đŸ‡ŹđŸ‡· [el](../../../el/docs/compression/RTK_COMPRESSION.md) · đŸ‡Ș🇾 [es](../../../es/docs/compression/RTK_COMPRESSION.md) · đŸ‡ȘđŸ‡Ș [et](../../../et/docs/compression/RTK_COMPRESSION.md) · đŸ‡źđŸ‡· [fa](../../../fa/docs/compression/RTK_COMPRESSION.md) · đŸ‡«đŸ‡ź [fi](../../../fi/docs/compression/RTK_COMPRESSION.md) · 🇼đŸ‡Ș [ga](../../../ga/docs/compression/RTK_COMPRESSION.md) · 🇼🇳 [gu](../../../gu/docs/compression/RTK_COMPRESSION.md) · 🇳🇬 [ha](../../../ha/docs/compression/RTK_COMPRESSION.md) · đŸ‡źđŸ‡± [he](../../../he/docs/compression/RTK_COMPRESSION.md) · 🇼🇳 [hi](../../../hi/docs/compression/RTK_COMPRESSION.md) · đŸ‡­đŸ‡· [hr](../../../hr/docs/compression/RTK_COMPRESSION.md) · 🇭đŸ‡ș [hu](../../../hu/docs/compression/RTK_COMPRESSION.md) · 🇩đŸ‡Č [hy](../../../hy/docs/compression/RTK_COMPRESSION.md) · đŸ‡źđŸ‡© [id](../../../id/docs/compression/RTK_COMPRESSION.md) · 🇳🇬 [ig](../../../ig/docs/compression/RTK_COMPRESSION.md) · 🇼đŸ‡č [it](../../../it/docs/compression/RTK_COMPRESSION.md) · đŸ‡ŻđŸ‡” [ja](../../../ja/docs/compression/RTK_COMPRESSION.md) · 🇬đŸ‡Ș [ka](../../../ka/docs/compression/RTK_COMPRESSION.md) · 🇰🇭 [km](../../../km/docs/compression/RTK_COMPRESSION.md) · 🇼🇳 [kn](../../../kn/docs/compression/RTK_COMPRESSION.md) · đŸ‡°đŸ‡· [ko](../../../ko/docs/compression/RTK_COMPRESSION.md) · đŸ‡±đŸ‡č [lt](../../../lt/docs/compression/RTK_COMPRESSION.md) · đŸ‡±đŸ‡» [lv](../../../lv/docs/compression/RTK_COMPRESSION.md) · 🇼🇳 [ml](../../../ml/docs/compression/RTK_COMPRESSION.md) · 🇼🇳 [mr](../../../mr/docs/compression/RTK_COMPRESSION.md) · đŸ‡ČđŸ‡Ÿ [ms](../../../ms/docs/compression/RTK_COMPRESSION.md) · đŸ‡ČđŸ‡č [mt](../../../mt/docs/compression/RTK_COMPRESSION.md) · đŸ‡ČđŸ‡Č [my](../../../my/docs/compression/RTK_COMPRESSION.md) · đŸ‡łđŸ‡” [ne](../../../ne/docs/compression/RTK_COMPRESSION.md) · đŸ‡łđŸ‡± [nl](../../../nl/docs/compression/RTK_COMPRESSION.md) · 🇳🇮 [no](../../../no/docs/compression/RTK_COMPRESSION.md) · 🇼🇳 [or](../../../or/docs/compression/RTK_COMPRESSION.md) · 🇼🇳 [pa](../../../pa/docs/compression/RTK_COMPRESSION.md) · đŸ‡”đŸ‡­ [phi](../../../phi/docs/compression/RTK_COMPRESSION.md) · đŸ‡”đŸ‡± [pl](../../../pl/docs/compression/RTK_COMPRESSION.md) · đŸ‡”đŸ‡č [pt](../../../pt/docs/compression/RTK_COMPRESSION.md) · đŸ‡§đŸ‡· [pt-BR](../../../pt-BR/docs/compression/RTK_COMPRESSION.md) · đŸ‡·đŸ‡Ž [ro](../../../ro/docs/compression/RTK_COMPRESSION.md) · đŸ‡·đŸ‡ș [ru](../../../ru/docs/compression/RTK_COMPRESSION.md) · đŸ‡±đŸ‡° [si](../../../si/docs/compression/RTK_COMPRESSION.md) · 🇾🇰 [sk](../../../sk/docs/compression/RTK_COMPRESSION.md) · 🇾🇼 [sl](../../../sl/docs/compression/RTK_COMPRESSION.md) · đŸ‡·đŸ‡ž [sr](../../../sr/docs/compression/RTK_COMPRESSION.md) · 🇾đŸ‡Ș [sv](../../../sv/docs/compression/RTK_COMPRESSION.md) · 🇰đŸ‡Ș [sw](../../../sw/docs/compression/RTK_COMPRESSION.md) · 🇼🇳 [ta](../../../ta/docs/compression/RTK_COMPRESSION.md) · 🇼🇳 [te](../../../te/docs/compression/RTK_COMPRESSION.md) · đŸ‡č🇭 [th](../../../th/docs/compression/RTK_COMPRESSION.md) · đŸ‡čđŸ‡· [tr](../../../tr/docs/compression/RTK_COMPRESSION.md) · đŸ‡ș🇩 [uk-UA](../../../uk-UA/docs/compression/RTK_COMPRESSION.md) · đŸ‡”đŸ‡° [ur](../../../ur/docs/compression/RTK_COMPRESSION.md) · đŸ‡ș🇿 [uz](../../../uz/docs/compression/RTK_COMPRESSION.md) · đŸ‡»đŸ‡ł [vi](../../../vi/docs/compression/RTK_COMPRESSION.md) · 🇳🇬 [yo](../../../yo/docs/compression/RTK_COMPRESSION.md) · 🇹🇳 [zh-CN](../../../zh-CN/docs/compression/RTK_COMPRESSION.md) · đŸ‡čđŸ‡Œ [zh-TW](../../../zh-TW/docs/compression/RTK_COMPRESSION.md) --- La compression RTK est le moteur de compression d’OmniRoute sensible aux commandes pour les sorties de terminal et d’outils. Elle est conçue pour les sessions d’agents de codage, dans lesquelles l’essentiel de l’augmentation 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 s’exĂ©cuter directement avec `defaultMode: "rtk"` ou comme premiĂšre Ă©tape d’un pipeline empilĂ©, gĂ©nĂ©ralement : ```txt rtk -> caveman ``` Cet ordre compresse d’abord 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 l’exemple 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 : ```txt 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 d’un motif de commande ou d’une expression rĂ©guliĂšre appliquĂ©e Ă  la sortie lorsqu’une classe de commande ne suffit pas. ## RĂ©solution des filtres RTK charge les filtres dans l’ordre suivant : 1. Filtres du projet provenant de `.rtk/filters.toml` et `.rtk/filters.json`, uniquement lorsqu’ils 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 d’une mĂȘme portĂ©e, les filtres du schĂ©ma TOML v1 de RTK ont prioritĂ© sur les filtres JSON d’OmniRoute. Les expressions TOML `match_command` sont vĂ©rifiĂ©es avant la correspondance par type de commande, afin qu’un 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 d’outils sont prĂ©sentĂ©es aux agents. Un fichier de filtres de projet est acceptĂ© lorsque l’une 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 : ```json { "filtersSha256": "0123456789abcdef...", "filtersTomlSha256": "fedcba9876543210..." } ``` Les hachages sont distincts : `filtersSha256` approuve `.rtk/filters.json`, tandis que `filtersTomlSha256` approuve `.rtk/filters.toml`. La modification de l’un ou l’autre fichier invalide uniquement son entrĂ©e de confiance respective. Les fichiers globaux sont installĂ©s par l’administrateur et utilisent le comportement existant de confiance des filtres globaux. Les filtres personnalisĂ©s peuvent ĂȘtre constituĂ©s d’un objet de filtre unique ou d’un tableau d’objets 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.]]`. 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](./COMPRESSION_RULES_FORMAT.md). L'environnement d'exĂ©cution applique ces Ă©tapes dans l'ordre suivant : ```txt 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 s’exĂ©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 d’au moins `deduplicateThreshold` lignes consĂ©cutives identiques dans l’ensemble du rĂ©sultat (`deduplicateRepeatedLines`, appliquĂ© dans `engines/rtk/index.ts`). La valeur est limitĂ©e Ă  l’intervalle 2–100 lors de la normalisation. Le traitement par filtre s’exĂ©cute en premier (dans le filtre), tandis que le traitement Ă  l’échelle du moteur s’exĂ©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 d’une sĂ©quence dĂ©clenchant le regroupement. Il s’agit 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 d’API 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 l’**analyseur TypeScript** (et non une expression rĂ©guliĂšre), afin que les chaĂźnes, les gabarits et les littĂ©raux d’expression 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 d’expressions JSX ne soient jamais altĂ©rĂ©s). La suppression des commentaires ne s’applique actuellement **qu’à JavaScript et TypeScript** — les autres langages de l’ensemble `CodeLanguage` de l’outil 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. L’exĂ©cution sur le bloc nettoyĂ© est marquĂ©e `rtk:code-strip` dans `rulesApplied`. > **Remarque — GCF / l’encodage tabulaire est un moteur distinct.** RTK ne contient **pas** l’encodeur 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 n’est 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`. ```json { "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`. L’objet entier est conservĂ© sous la forme d’une 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 d’une charge utile textuelle | | `/api/context/rtk/raw-output/[id]` | GET | Lire la sortie brute expurgĂ©e conservĂ©e | | `/api/compression/preview` | POST | PrĂ©visualiser n’importe quel mode de compression | Charge utile de test RTK : ```json { "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 : ```json { "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 l’authentification de gestion du tableau de bord ou la stratĂ©gie de clĂ© API correspondante. Charge utile de validation TOML RTK : ```json { "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 d’un 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 : ```txt DATA_DIR/rtk/raw-output/ ``` Les secrets sont expurgĂ©s avant la persistance, notamment les jetons Bearer courants, les clĂ©s d’API, les jetons Slack, les clĂ©s d’accĂšs AWS et les valeurs de type affectation `token=...`, `secret=...`, `password=...`. Les donnĂ©es analytiques ne stockent que l’identifiant 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 : ```bash node --import tsx/esm --test tests/unit/compression/rtk-verify.test.ts ``` La barriĂšre RTK plus gĂ©nĂ©rale est : ```bash 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 : ```bash 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 l’introduction d’une 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 d’intensitĂ© (v3.8.16+) RTK prend en charge **3 niveaux d’intensitĂ©** offrant diffĂ©rents compromis entre **l’agressivitĂ© 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` : ```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 s’applique. ### 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 l’intensitĂ© appropriĂ©e ``` La perte de contexte est-elle catastrophique ? │ ┌───────────┌───────────┐ │ │ │ OUI NON INCERTAIN │ │ │ â–Œ │ │ minimal │ │ │ │ │ │ â–Œ â–Œ │ Quel est le Essayez d’abord `standard` │ niveau critique (convient Ă  80 % des │ du dĂ©bit ? cas) │ │ │ ┌────┮────┐ │ │ │ │ FAIBLE ÉLEVÉ │ │ │ │ â–Œ â–Œ │ standard aggressive │ │ │ └──────┮─────────┘ ``` ### Configuration de l’intensitĂ© **Par combo** (dans la configuration du combo) : ```json { "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 d’un moteur Ă  l’aide de l’utilitaire du registre : ```ts import { updateEngineConfig } from "@omniroute/open-sse/services/compression/engines/registry"; updateEngineConfig("rtk", { intensity: "aggressive" }); ``` ### VĂ©rification de l’effet Utilisez la **barriĂšre de vĂ©rification** (voir ci-dessous) pour confirmer que votre filtre est sĂ»r avec l’intensitĂ© choisie : ```ts import { runRtkFilterTests } from "omniroute/compression/engines/rtk/verify"; const result = runRtkFilterTests({ intensity: "aggressive" }); if (!result.passed) { console.error("Échec des filtres avec l’intensitĂ© 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 d’outils personnalisĂ©s non couverts par les filtres par dĂ©faut. ### SchĂ©ma du filtre (Zod) ```ts { "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 l’action du filtre "category": "git|test|build|shell|docker|package|infra|cloud|generic", "priority": number, // Facultatif (0-100, valeur par dĂ©faut : 50). Ordre d’exĂ©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 lorsqu’un 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 d’entrĂ©e "expected": "expected output", // Obligatoire. Sortie compressĂ©e attendue "command": "optional command" // Facultatif. Contexte de la commande } ] } ``` ### Exemple : filtre de traceback Python ```json { "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 /.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 : `/.rtk/filters/` Pour charger les filtres par programmation : ```ts 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 d’intensitĂ©** — `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 d’origine** Ă  des fins de dĂ©bogage, d’audit ou de relecture. ### Fonctionnement de la rĂ©cupĂ©ration de la sortie brute ``` Sortie d’origine (10K jetons) │ â–Œ Compression RTK (avec rawOutput.enabled=true) │ ├─▶ Sortie compressĂ©e (2K jetons) ──▶ vers le LLM │ └─▶ Sortie d’origine (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) : ```json { "compression": { "engine": "rtk", "intensity": "aggressive", "rawOutput": { "enabled": true, "maxBytes": 1048576 // Plafond de 1 Mo } } } ``` **Valeur par dĂ©faut** : `rawOutput.enabled: false` (Ă©conomise de l’espace 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 d’origine ```ts 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 d’intensitĂ©. **Appelez `runRtkFilterTests()`** pour exĂ©cuter la vĂ©rification : ```ts 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. L’intensitĂ© `minimal` est sans effet (elle prĂ©serve l’original et applique uniquement les filtres structurels) 4. L’intensitĂ© `aggressive` prĂ©serve les erreurs, les Ă©checs de tests et les traces de pile 5. La sortie compressĂ©e n’est jamais plus volumineuse que l’entrĂ©e d’origine - 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 l’ajout d’une nouvelle famille d’outils/commandes** — prouve que le nouveau filtre fonctionne --- ## Voir aussi - [COMPRESSION_GUIDE.md](./COMPRESSION_GUIDE.md) — Vue d’ensemble complĂšte du pipeline de compression - [COMPRESSION_ENGINES.md](./COMPRESSION_ENGINES.md) — Registre des moteurs et moteurs intĂ©grĂ©s - [EXTENDING_COMPRESSION.md](./EXTENDING_COMPRESSION.md) — Moteurs personnalisĂ©s, packs linguistiques, pipelines empilĂ©s - Source : `open-sse/services/compression/engines/rtk/` (63 fichiers, ~70 Ko)