# Compression Rules Format (Tiếng Việt) 🌐 **Languages:** 🇺🇸 [English](../../../../compression/COMPRESSION_RULES_FORMAT.md) · 🇪🇹 [am](../../../am/docs/compression/COMPRESSION_RULES_FORMAT.md) · 🇸🇦 [ar](../../../ar/docs/compression/COMPRESSION_RULES_FORMAT.md) · 🇦🇿 [az](../../../az/docs/compression/COMPRESSION_RULES_FORMAT.md) · 🇧🇬 [bg](../../../bg/docs/compression/COMPRESSION_RULES_FORMAT.md) · 🇧🇩 [bn](../../../bn/docs/compression/COMPRESSION_RULES_FORMAT.md) · 🇧🇦 [bs](../../../bs/docs/compression/COMPRESSION_RULES_FORMAT.md) · 🇨🇿 [cs](../../../cs/docs/compression/COMPRESSION_RULES_FORMAT.md) · 🇩🇰 [da](../../../da/docs/compression/COMPRESSION_RULES_FORMAT.md) · 🇩🇪 [de](../../../de/docs/compression/COMPRESSION_RULES_FORMAT.md) · 🇬🇷 [el](../../../el/docs/compression/COMPRESSION_RULES_FORMAT.md) · 🇪🇸 [es](../../../es/docs/compression/COMPRESSION_RULES_FORMAT.md) · 🇪🇪 [et](../../../et/docs/compression/COMPRESSION_RULES_FORMAT.md) · 🇮🇷 [fa](../../../fa/docs/compression/COMPRESSION_RULES_FORMAT.md) · 🇫🇮 [fi](../../../fi/docs/compression/COMPRESSION_RULES_FORMAT.md) · 🇫🇷 [fr](../../../fr/docs/compression/COMPRESSION_RULES_FORMAT.md) · 🇮🇪 [ga](../../../ga/docs/compression/COMPRESSION_RULES_FORMAT.md) · 🇮🇳 [gu](../../../gu/docs/compression/COMPRESSION_RULES_FORMAT.md) · 🇳🇬 [ha](../../../ha/docs/compression/COMPRESSION_RULES_FORMAT.md) · 🇮🇱 [he](../../../he/docs/compression/COMPRESSION_RULES_FORMAT.md) · 🇮🇳 [hi](../../../hi/docs/compression/COMPRESSION_RULES_FORMAT.md) · 🇭🇷 [hr](../../../hr/docs/compression/COMPRESSION_RULES_FORMAT.md) · 🇭🇺 [hu](../../../hu/docs/compression/COMPRESSION_RULES_FORMAT.md) · 🇦🇲 [hy](../../../hy/docs/compression/COMPRESSION_RULES_FORMAT.md) · 🇮🇩 [id](../../../id/docs/compression/COMPRESSION_RULES_FORMAT.md) · 🇳🇬 [ig](../../../ig/docs/compression/COMPRESSION_RULES_FORMAT.md) · 🇮🇹 [it](../../../it/docs/compression/COMPRESSION_RULES_FORMAT.md) · 🇯🇵 [ja](../../../ja/docs/compression/COMPRESSION_RULES_FORMAT.md) · 🇬🇪 [ka](../../../ka/docs/compression/COMPRESSION_RULES_FORMAT.md) · 🇰🇭 [km](../../../km/docs/compression/COMPRESSION_RULES_FORMAT.md) · 🇮🇳 [kn](../../../kn/docs/compression/COMPRESSION_RULES_FORMAT.md) · 🇰🇷 [ko](../../../ko/docs/compression/COMPRESSION_RULES_FORMAT.md) · 🇱🇹 [lt](../../../lt/docs/compression/COMPRESSION_RULES_FORMAT.md) · 🇱🇻 [lv](../../../lv/docs/compression/COMPRESSION_RULES_FORMAT.md) · 🇮🇳 [ml](../../../ml/docs/compression/COMPRESSION_RULES_FORMAT.md) · 🇮🇳 [mr](../../../mr/docs/compression/COMPRESSION_RULES_FORMAT.md) · 🇲🇾 [ms](../../../ms/docs/compression/COMPRESSION_RULES_FORMAT.md) · 🇲🇹 [mt](../../../mt/docs/compression/COMPRESSION_RULES_FORMAT.md) · 🇲🇲 [my](../../../my/docs/compression/COMPRESSION_RULES_FORMAT.md) · 🇳🇵 [ne](../../../ne/docs/compression/COMPRESSION_RULES_FORMAT.md) · 🇳🇱 [nl](../../../nl/docs/compression/COMPRESSION_RULES_FORMAT.md) · 🇳🇴 [no](../../../no/docs/compression/COMPRESSION_RULES_FORMAT.md) · 🇮🇳 [or](../../../or/docs/compression/COMPRESSION_RULES_FORMAT.md) · 🇮🇳 [pa](../../../pa/docs/compression/COMPRESSION_RULES_FORMAT.md) · 🇵🇭 [phi](../../../phi/docs/compression/COMPRESSION_RULES_FORMAT.md) · 🇵🇱 [pl](../../../pl/docs/compression/COMPRESSION_RULES_FORMAT.md) · 🇵🇹 [pt](../../../pt/docs/compression/COMPRESSION_RULES_FORMAT.md) · 🇧🇷 [pt-BR](../../../pt-BR/docs/compression/COMPRESSION_RULES_FORMAT.md) · 🇷🇴 [ro](../../../ro/docs/compression/COMPRESSION_RULES_FORMAT.md) · 🇷🇺 [ru](../../../ru/docs/compression/COMPRESSION_RULES_FORMAT.md) · 🇱🇰 [si](../../../si/docs/compression/COMPRESSION_RULES_FORMAT.md) · 🇸🇰 [sk](../../../sk/docs/compression/COMPRESSION_RULES_FORMAT.md) · 🇸🇮 [sl](../../../sl/docs/compression/COMPRESSION_RULES_FORMAT.md) · 🇷🇸 [sr](../../../sr/docs/compression/COMPRESSION_RULES_FORMAT.md) · 🇸🇪 [sv](../../../sv/docs/compression/COMPRESSION_RULES_FORMAT.md) · 🇰🇪 [sw](../../../sw/docs/compression/COMPRESSION_RULES_FORMAT.md) · 🇮🇳 [ta](../../../ta/docs/compression/COMPRESSION_RULES_FORMAT.md) · 🇮🇳 [te](../../../te/docs/compression/COMPRESSION_RULES_FORMAT.md) · 🇹🇭 [th](../../../th/docs/compression/COMPRESSION_RULES_FORMAT.md) · 🇹🇷 [tr](../../../tr/docs/compression/COMPRESSION_RULES_FORMAT.md) · 🇺🇦 [uk-UA](../../../uk-UA/docs/compression/COMPRESSION_RULES_FORMAT.md) · 🇵🇰 [ur](../../../ur/docs/compression/COMPRESSION_RULES_FORMAT.md) · 🇺🇿 [uz](../../../uz/docs/compression/COMPRESSION_RULES_FORMAT.md) · 🇳🇬 [yo](../../../yo/docs/compression/COMPRESSION_RULES_FORMAT.md) · 🇨🇳 [zh-CN](../../../zh-CN/docs/compression/COMPRESSION_RULES_FORMAT.md) · 🇹🇼 [zh-TW](../../../zh-TW/docs/compression/COMPRESSION_RULES_FORMAT.md) --- Các quy tắc nén là các tệp JSON được tải khi chạy. Chúng được chủ ý thiết kế để chỉ chứa dữ liệu, nhờ đó các gói ngôn ngữ và bộ lọc lệnh RTK mới có thể được xem xét mà không cần thay đổi mã nguồn của engine. > **Lược đồ chuẩn (nguồn tham chiếu chính xác):** [`open-sse/services/compression/rules/_schema.json`](../../open-sse/services/compression/rules/_schema.json) (JSON Schema bản nháp 2020-12). > Các ví dụ dưới đây chỉ mang tính minh họa — khi không chắc chắn, hãy kiểm tra tính hợp lệ của gói dựa trên `_schema.json`. ## Gói quy tắc Caveman Các gói quy tắc Caveman nằm trong: ```txt open-sse/services/compression/rules//.json ``` Mỗi gói chứa các phép thay thế được áp dụng cho văn bản thông thường sau khi các vùng được bảo vệ đã được tách riêng. ```json { "language": "en", "category": "filler", "rules": [ { "name": "question_to_directive", "pattern": "\\b(?:Can you explain why|Could you show me how)\\b\\s*", "replacement": "Explain why ", "replacementMap": { "can you explain why": "Explain why ", "could you show me how": "Show how " }, "flags": "gi", "context": "all", "category": "context", "minIntensity": "lite", "description": "Convert verbose questions into direct requests." } ] } ``` ### Các trường của Caveman | Trường | Bắt buộc | Mô tả | | ------------------------ | -------- | ----------------------------------------------------------------------------------------- | | `language` | có | Khóa ngôn ngữ dạng BCP-47, chẳng hạn như `en`, `pt-BR`, `es` | | `category` | có | Tên tệp/danh mục của gói, ví dụ `filler` hoặc `dedup` | | `rules` | có | Mảng các quy tắc thay thế bằng biểu thức chính quy | | `rules[].name` | có | Tên quy tắc ổn định | | `rules[].pattern` | có | Mã nguồn biểu thức chính quy JavaScript | | `rules[].flags` | không | Các cờ biểu thức chính quy JavaScript; mặc định là `gi` | | `rules[].replacement` | không | Chuỗi thay thế hoặc giá trị dự phòng khi `replacementMap` không khớp | | `rules[].replacementMap` | không | Các giá trị thay thế theo từng kết quả khớp, được lập khóa bằng văn bản khớp đã chuẩn hóa | | `rules[].context` | không | `all`, `user`, `assistant` hoặc `system`; mặc định là `all` | | `rules[].category` | không | `filler`, `context`, `structural`, `dedup`, `terse` hoặc `ultra` | | `rules[].minIntensity` | không | `lite`, `full` hoặc `ultra`; mặc định là `lite` | | `rules[].description` | không | Phần tóm tắt quy tắc mà con người có thể đọc được | Sử dụng `flags` khi việc khớp có phân biệt chữ hoa chữ thường là quan trọng, ví dụ khi loại bỏ mạo từ trước văn bản viết thường mà không loại bỏ `the OpenAI API`. Sử dụng `replacementMap` khi một biểu thức chính quy có nhiều phương án thay thế cần tạo ra các kết quả khác nhau; cách này giúp các gói quy tắc JSON chỉ chứa dữ liệu trong khi vẫn duy trì hành vi của các hàm thay thế TypeScript tích hợp sẵn, vốn phong phú hơn. ## Các gói bộ lọc RTK Các bộ lọc RTK nằm tại: ```txt open-sse/services/compression/engines/rtk/filters/.json ``` Mỗi bộ lọc mô tả cách nhận diện và nén một nhóm đầu ra lệnh. ```json { "id": "test-vitest", "label": "Vitest output", "category": "test", "priority": 92, "match": { "outputTypes": ["test-vitest"], "commands": ["vitest", "npm test", "npm run test"], "patterns": ["\\bFAIL\\b", "\\bPASS\\b", "\\bTest Files\\b"] }, "rules": { "stripAnsi": true, "replace": [{ "pattern": "\\s+\\[[0-9]+ms\\]", "replacement": "" }], "matchOutput": [ { "pattern": "All tests passed", "message": "vitest: ok", "unless": "FAIL|Error:" } ], "includePatterns": ["FAIL", "Error:", "Test Files", "Tests"], "dropPatterns": ["^\\s*$", "Duration\\s+\\d+"], "collapsePatterns": ["^\\s+at "], "deduplicate": true, "truncateLineAt": 240, "maxLines": 160, "headLines": 24, "tailLines": 40, "onEmpty": "vitest: ok", "filterStderr": false }, "preserve": { "errorPatterns": ["FAIL", "Error:", "AssertionError"], "summaryPatterns": ["Test Files", "Tests", "Snapshots"] }, "tests": [ { "name": "keeps failing tests", "command": "vitest", "input": "FAIL test/a.test.ts\\nError: boom\\nTest Files 1 failed", "expected": "FAIL test/a.test.ts\\nError: boom\\nTest Files 1 failed" } ] } ``` ### Các trường RTK | Trường | Bắt buộc | Mô tả | | -------------------------- | -------- | ---------------------------------------------------------------------------- | | `id` | có | ID ổn định của bộ lọc | | `label` | có | Tên dễ đọc trên bảng điều khiển | | `category` | có | Nhóm bộ lọc: git, test, build, shell, docker, package, infra, cloud, generic | | `priority` | không | Bộ lọc có mức ưu tiên cao hơn sẽ thắng khi nhiều bộ lọc cùng khớp | | `match.outputTypes` | không | Các ID đầu ra của bộ phát hiện dùng để chọn bộ lọc này | | `match.commands` | không | Các token lệnh dùng để chọn bộ lọc này | | `match.patterns` | không | Các mẫu biểu thức chính quy dùng để chọn bộ lọc này từ văn bản đầu ra | | `rules.stripAnsi` | không | Loại bỏ các chuỗi thoát ANSI trước các giai đoạn xử lý biểu thức chính quy | | `rules.replace` | không | Các phép thay thế bằng biểu thức chính quy theo thứ tự, áp dụng từng dòng | | `rules.matchOutput` | không | Các quy tắc đầu ra ngắt sớm với điều kiện bảo vệ `unless` tùy chọn | | `rules.includePatterns` | không | Các dòng được ưu tiên giữ lại | | `rules.dropPatterns` | không | Các dòng cần loại bỏ vì là nhiễu | | `rules.collapsePatterns` | không | Các dòng khớp lặp lại có thể được thu gọn | | `rules.deduplicate` | không | Thu gọn các dòng đã chuẩn hóa bị trùng lặp | | `rules.truncateLineAt` | không | Giới hạn ký tự trên mỗi dòng, an toàn với Unicode | | `rules.maxLines` | không | Số dòng tối đa được giữ lại trước khi bảo toàn phần cuối | | `rules.headLines` | không | Các dòng đầu được giữ lại khi cắt bớt | | `rules.tailLines` | không | Các dòng cuối được giữ lại để cung cấp ngữ cảnh gần đây | | `rules.onEmpty` | không | Thông báo dự phòng khi quá trình lọc loại bỏ toàn bộ nội dung | | `rules.filterStderr` | không | Chuẩn hóa các tiền tố stderr phổ biến trước các giai đoạn lọc tiếp theo | | `preserve.errorPatterns` | không | Các dòng lỗi cần được giữ lại sau khi cắt bớt | | `preserve.summaryPatterns` | không | Các dòng tóm tắt cần được giữ lại sau khi cắt bớt | | `tests[]` | không | Các mẫu xác minh nội tuyến được cổng xác minh RTK sử dụng | RTK áp dụng các giai đoạn khai báo theo thứ tự sau: `stripAnsi`, `filterStderr`, `replace`, `matchOutput`, `dropPatterns`/`includePatterns`, `truncateLineAt`, `headLines`/`tailLines`, `maxLines` và `onEmpty`. Có thể tải các bộ lọc tùy chỉnh từ: 1. Các tệp `.rtk/filters.json` của dự án, nhưng chỉ sau khi có hàm băm khớp trong `.rtk/trust.json` hoặc `trustProjectFilters` được bật. 2. `DATA_DIR/rtk/filters.json` toàn cục. 3. Các bộ lọc tích hợp sẵn. Các tệp tùy chỉnh của dự án/toàn cục có thể chứa một đối tượng bộ lọc hoặc một mảng các đối tượng bộ lọc. Các bộ lọc tùy chỉnh không hợp lệ sẽ bị bỏ qua kèm theo thông tin chẩn đoán; các bộ lọc tích hợp sẵn không hợp lệ sẽ khiến quá trình xác thực thất bại. Tệp tin cậy của dự án: ```json { "filtersSha256": "0123456789abcdef..." } ``` Biến ghi đè môi trường `OMNIROUTE_RTK_TRUST_PROJECT_FILTERS=1` cho phép tin cậy các bộ lọc của dự án mà không cần hàm băm và chỉ nên được sử dụng trong môi trường phát triển cục bộ được kiểm soát. ## Quy tắc an toàn - Đảm bảo các quy tắc có tính lũy đẳng: chạy cùng một bộ lọc hai lần không được làm hỏng đầu ra. - Giữ nguyên chính xác nội dung lỗi, đường dẫn tệp, số dòng và phần tóm tắt lệnh khi có thể. - Tránh các quy tắc sửa đổi khối mã, payload JSON, URL hoặc thông tin bí mật. - Bổ sung phạm vi kiểm thử đơn vị cho các nhóm lệnh mới trong các bài kiểm thử bộ phát hiện/bộ lọc. - Thêm các mẫu `tests[]` vào mọi bộ lọc tích hợp sẵn và các bộ lọc tùy chỉnh dùng chung. ## Xác thực Các gói quy tắc được xác thực trước khi sử dụng. Các gói Caveman tích hợp sẵn và bộ lọc RTK tích hợp sẵn sẽ dừng ngay khi có lỗi trong quá trình xác thực để phát hiện các thành phần phát hành bị lỗi trước khi phân phối. Các bộ lọc RTK tùy chỉnh sẽ bị bỏ qua kèm thông tin chẩn đoán khi quá trình phân tích cú pháp hoặc xác thực độ tin cậy thất bại. Xác thực có trọng tâm: ```bash node --import tsx/esm --test tests/unit/compression/rule-loader.test.ts tests/unit/compression/language-packs.test.ts node --import tsx/esm --test tests/unit/compression/rtk-verify.test.ts tests/unit/compression/rtk-dsl-pipeline.test.ts ```