* 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.
52 KiB
Compression Engines (ខ្មែរ)
🌐 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 · 🇮🇳 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
ការបង្ហាប់របស់ OmniRoute ត្រូវបានបង្កើតឡើងដោយផ្អែកលើកិច្ចសន្យារបស់ engine។ mode មួយអាចដំណើរការ engine មួយដោយផ្ទាល់
(caveman ឬ rtk) ឬ pipeline ជាជង់ដែលមានលក្ខណៈកំណត់ច្បាស់លាស់ ហើយប្រតិបត្តិ engine ជាច្រើនតាមលំដាប់។
Mode
| Mode | ផ្លូវរបស់ engine | ទិន្នន័យបញ្ចូលដែលសមស្រប |
|---|---|---|
off |
គ្មាន | រក្សា prompt ឱ្យនៅដដែលទាំងស្រុង |
lite |
ឧបករណ៍ជំនួយ Caveman lite | ការសម្អាតជាប្រចាំដែលមានហានិភ័យទាប |
standard |
Caveman | ការបង្រួម prompt ជាភាសាធម្មជាតិ |
aggressive |
Caveman + ឧបករណ៍សង្ខេបប្រវត្តិ/tool | session ជជែកដែលមានរយៈពេលវែង |
ultra |
Caveman + ឧបករណ៍ជំនួយកាត់ចេញ | ការស្ដារឡើងវិញនៅពេលឈានដល់ដែនកំណត់ context |
rtk |
RTK | លទ្ធផល terminal, shell, build, test និង git |
omniglyph |
OmniGlyph | context ជារូបភាពនៅលើខ្សែបញ្ជូន native របស់ provider |
stacked |
Pipeline, លំនាំដើម rtk -> caveman |
tool log និងអត្ថបទចម្រុះ ដើម្បីសន្សំបានអតិបរមា |
Profile បង្ហាប់របស់ OmniGlyph
engine omniglyph (package omniglyph, 1.4.0+) ទទួលយក semantic profile ដែលមានឈ្មោះ ដោយកំណត់
ជាសកលតាមរយៈ omniglyph.profile ក្នុងការកំណត់ការបង្ហាប់ ឬកំណត់សម្រាប់ជំហាននីមួយៗតាមរយៈ
ការកំណត់រចនាសម្ព័ន្ធជំហានរបស់ pipeline ជាជង់៖
| Profile | ព្រំដែន |
|---|---|
aggressive |
លំនាំដើម។ គោលការណ៍ដែល receipt ដែលបានបោះពុម្ពផ្សាយបានវាស់វែង — បម្លែង system, ឯកសារ tool និងប្រវត្តិក្រាស់ទៅជារូបភាព |
balanced |
រក្សា state ដែលកំពុងដំណើរការជា native ការពារ 8 turn ចុងក្រោយ និងបង្រួមប្រវត្តិចាស់ដែលបានបិទរួច |
coding-safe |
រក្សា authority, schema របស់ tool និងលទ្ធផល tool ដែលកំពុងដំណើរការជា native ហើយការពារ 12 turn ចុងក្រោយ |
passthrough |
បញ្ជូនបន្តដោយមិនបំប្លែង; engine ត្រូវបានរំលង |
profile គឺជា ពិដាន មិនមែនជាបាត៖ mergeCompressionProfileOptions នៅក្នុង package
បដិសេធមិនឱ្យការកំណត់ override របស់អ្នកហៅបើក lane ដែលមានការបាត់បង់ឡើងវិញ ដែល profile បានបិទនោះទេ ដូច្នេះ
preserveSystemPrompt: false ក្នុងជំហាននីមួយៗ មិនអាចបើកការបង្ហាប់ system ឡើងវិញក្រោម coding-safe បានទេ។
តាមការវាស់វែងលើ codebase នេះ៖ coding-safe និង balanced បង្កើន minCompressChars ដល់
តម្លៃអតិបរមារបស់វា ហើយរក្សា system, schema របស់ tool និងលទ្ធផល tool ជា native ដូច្នេះ session ដែលមិនទាន់
បានប្រមូលប្រវត្តិ នឹងឈប់នៅ below_min_chars ហើយ engine មិនបំប្លែងអ្វីទាំងអស់។ នេះហើយជា
មូលហេតុដែលលំនាំដើមគឺ aggressive ជំនួសឱ្យ profile ដែលមានសុវត្ថិភាពបំផុត។
package នេះកំណត់ model scope និង profile របស់ខ្លួនពីការកំណត់រចនាសម្ព័ន្ធ environment របស់វា។ OmniRoute មិនដែលប្រគល់សិទ្ធិសម្រេចចិត្តនេះទៅកន្លែងផ្សេងទេ៖ adapter ចាក់សោ model gate ទៅ scope ដ៏តឹងរ៉ឹងបំផុតរបស់ package ដូច្នេះការកំណត់ environment របស់ host អាចត្រឹមតែបង្រួម allowlist ប៉ុណ្ណោះ មិនអាច ពង្រីកវាឱ្យលើសពី receipt ដែល OmniRoute បានវាស់វែងឡើយ។
បញ្ជីចុះឈ្មោះ Engine
បញ្ជីចុះឈ្មោះមានទីតាំងនៅក្នុង open-sse/services/compression/engines/registry.ts។ Engine ទាំងឡាយបង្ហាញកិច្ចសន្យារួមមួយ៖
id: លេខសម្គាល់ engine ដែលមានស្ថិរភាព ដូចជាcavemanឬrtkapply(text, config): ផ្លូវប្រតិបត្តិចាស់ដែលប្រើដោយ pipeline ជាន់គ្នាcompress(input, config): ផ្លូវប្រតិបត្តិចម្បងដែលត្រឡប់អត្ថបទ + ស្ថិតិgetConfigSchema(): ត្រឡប់ទម្រង់ស្រដៀង JSON-Schema នៃ config ដែលត្រឹមត្រូវvalidateConfig(config): ត្រឡប់{ valid, errors[] }
ការចុះឈ្មោះប្រើ registerCompressionEngine(engine) (ឬ registerEngine សម្រាប់ករណីកម្រិតខ្ពស់)
ដែលហៅ assertValidEngine() និង validateConfig(defaultConfig) មុនពេលទទួលយក។
ប្រើ unregisterCompressionEngine(id) ដើម្បីដក engine មួយចេញនៅពេលដំណើរការ។
strategySelector.ts ចុះឈ្មោះ engine ដែលភ្ជាប់មកជាស្រេច មុនពេលការបង្ហាប់ដំណើរការ។ វាអនុញ្ញាតឱ្យការមើលជាមុន
ការបង្ហាប់ពេលដំណើរការ របៀបជាន់គ្នា ការធ្វើតេស្ត និង engine នាពេលអនាគត ប្រើផ្លូវប្រតិបត្តិដូចគ្នា។
ការបង្ហាប់សេចក្ដីពិពណ៌នា MCP (ពាក់ព័ន្ធ)
បញ្ជីចុះឈ្មោះដាច់ដោយឡែកមួយ បង្ហាប់ metadata នៃសេចក្ដីពិពណ៌នា tool របស់ MCP នៅកម្រិតបញ្ជីចុះឈ្មោះ — សូមមើល
open-sse/mcp-server/descriptionCompressor.ts និង MCP-SERVER.md។ វាប្រើច្បាប់
Caveman ឡើងវិញ ប៉ុន្តែដំណើរការលើ metadata របស់ tool មិនមែនលើ payload នៃ request ទេ។
Engine ភ្ជាប់មកជាស្រេចបន្ថែម
ក្រៅពី Caveman, RTK និង LLMLingua-2 បញ្ជីចុះឈ្មោះមានភ្ជាប់មកជាមួយ engine ឯកទេសមិនបាត់បង់ទិន្នន័យ / មានរចនាសម្ព័ន្ធជាច្រើន (ប្រើដោយ pipeline ជាន់គ្នា playground និងការធ្វើតេស្ត)៖
| Engine | Id | អ្វីដែលវាធ្វើ |
|---|---|---|
| CCR | ccr |
Content-Compress-Retrieve (H4)៖ ជំនួសប្លុកអត្ថបទជាប់គ្នាធំៗដោយឯកសារយោងដែលកំណត់អត្តសញ្ញាណតាមខ្លឹមសារ ដូច្នេះប្លុកដែលធំ ឬត្រូវបានប្រើម្ដងហើយម្ដងទៀត នឹងត្រូវផ្ញើតែម្ដង ហើយបន្ទាប់មកយោងទៅវា។ |
| headroom | headroom |
SmartCrusher (H3 + N5)៖ ការបង្រួមជាតារាងដោយមិនបាត់បង់ទិន្នន័យ សម្រាប់ payload អារេ JSON ដែលមានលក្ខណៈដូចគ្នា ទៅជាទម្រង់តាមជួរឈរ [N rows]។ |
| ionizer | ionizer |
ការយកគំរូជួរដេកពីផ្នែកក្បាល/កណ្ដាល/កន្ទុយ សម្រាប់ប្លុកមានលក្ខណៈដូចគ្នាដែលធំខ្លាំង ដោយរក្សាទុកផ្នែកកណ្ដាលដែលបានលុបចេញជាឯកសារយោង CCR ដែលកំណត់អត្តសញ្ញាណតាមខ្លឹមសារ។ |
| session-dedup | session-dedup |
ការលុបទិន្នន័យស្ទួនឆ្លងវេន ដែលកំណត់អត្តសញ្ញាណតាមខ្លឹមសារ (បានបំផុសគំនិតពី TokenMizer)៖ លុបអត្ថបទដែលបានឃើញរួចហើយនៅវេនមុនៗនៃ session ដូចគ្នា។ |
សេចក្ដីណែនាំអំពី retrieve-protocol របស់ CCR (#8033)៖ នៅលើកដំបូងដែល CCR ជំនួសប្លុក ≥1 ក្នុង
request មួយ engine នឹងបន្ថែមពីមុខនូវសារ system តែមួយដែលមានលក្ខណៈ idempotent (ចាប់ផ្ដើមដោយ
sentinel [CCR protocol]) ដើម្បីបង្រៀនអ្នកហៅអំពីកិច្ចសន្យា marker → tool៖ អត្ថន័យរបស់ marker
[CCR retrieve hash=<24hex> chars=N] ថា hash ត្រូវតែចម្លងឱ្យដូចទាំងស្រុង
(តួអក្សរ hex ទាំង 24 — hash ដែលចម្លងខុសទំនងជាមូលហេតុនៃបញ្ហា "រកមិនឃើញប្លុក"
) និងថា marker [dedup:ref sha=...] មានន័យថា "មើលត្រឡប់ទៅក្នុងប្រវត្តិ" មិនមែន "ហៅ
tool" ទេ។ កំណត់ចំណាំនេះត្រូវបានបញ្ចូល តែនៅពេលដែល tools[] ដែលអ្នកហៅបានប្រកាស បញ្ជាក់ថាវា
ពិតជាអាចចូលប្រើ omniroute_ccr_retrieve បាន (callerSupportsCcrRetrieve() ក្នុង
open-sse/services/compression/engines/ccr/protocolInstruction.ts) — អ្នកហៅដែលឆបគ្នាជាមួយ
OpenAI ធម្មតា ហើយគ្មាន tool នោះ នឹងមិនទទួលបានសេចក្ដីណែនាំឱ្យហៅអ្វីមួយដែលវាមិនអាចចូលប្រើ
បានទេ។ លក្ខណៈ idempotent ត្រូវបានអនុវត្តដោយស្កេនប្រវត្តិសារ ដើម្បីស្វែងរក sentinel
មុនពេលបញ្ចូល ដូច្នេះ request ច្រើនវេន (ដែលចាក់សារមុនៗឡើងវិញ) នឹងមិនបង្គរកំណត់ចំណាំ
មួយដងក្នុងមួយវេនឡើយ។
Caveman
របៀប Caveman ផ្តោតលើការបង្រួមអត្ថន័យនៃអត្ថបទធម្មតា៖
- រក្សាទុកប្លុកកូដ URLs, JSON, paths និងទិន្នន័យដែលមានរចនាសម្ព័ន្ធ
- លុបពាក្យបំពេញ ការប្រើពាក្យបែបមិនប្រាកដប្រជា បរិបទដដែលៗ និងឃ្លាតភ្ជាប់វែងអន្លាយ
- គាំទ្រកញ្ចប់ច្បាប់ឯកសារដែលយល់ដឹងអំពីភាសានៅក្នុង
open-sse/services/compression/rules/ - នៅតែអាចប្រើបានតាមរយៈរបៀបចាស់
standard,aggressiveនិងultra
ផ្ទាំងគ្រប់គ្រងរបស់វាគឺ Dashboard -> Context & Cache -> Caveman។
ប្រភពដើម Caveman រាយការណ៍ថា output tokens តិចជាងមុន ~75% និងសន្សំ output ជាមធ្យម 65% ក្នុងការធ្វើ benchmark
ជាមួយនឹងចន្លោះ 22-87% ព្រមទាំងឧបករណ៍បង្រួម input ប្រហែល ~46%។ OmniRoute ប្រើតួលេខផ្នែក input របស់ Caveman
ពេលរៀបរាប់អំពីការសន្សំ prompt/context ដែលដាក់ជាស្រទាប់ៗគ្នា។ របៀប output របស់ Caveman នៅតែជាមុខងារ
ឥរិយាបថឆ្លើយតបដាច់ដោយឡែក។
RTK
របៀប RTK ផ្តោតលើ output របស់ command និង tool៖
- រកឃើញប្រភេទ output ដូចជា
git status,git branch,git diff, Vitest/Jest/Pytest, ការធ្វើតេស្ត Cargo/Go, ការ build TypeScript/Vite/Webpack, ESLint, ការ audit/install របស់ npm, Docker logs, shellfind/grep, stack traces និង logs ទូទៅ - អនុវត្ត JSON filters ចំនួន 49 ពី
open-sse/services/compression/engines/rtk/filters/ - គាំទ្រ pipeline បែបប្រកាសរបស់ RTK៖ ការដក ANSI, ការជំនួស, ការបញ្ចប់ភ្លាមៗនៅពេល match-output, ការដក/រក្សាទុកបន្ទាត់ ការកាត់បន្ថយក្នុងមួយបន្ទាត់ ការកាត់បន្ថយ head/tail/max-line និង fallback នៅពេលទទេ
- គាំទ្រ project filters ដែលមានការកំណត់សិទ្ធិដោយផ្អែកលើការទុកចិត្តនៅក្នុង
.rtk/filters.jsonនិង global filters នៅក្នុងDATA_DIR/rtk/filters.json - ដក ANSI sequences, progress noise, បន្ទាត់ដដែលៗ និង boilerplate ដែលមិនមានប្រយោជន៍
- រក្សាទុក failures ដែលអាចចាត់វិធានការ warnings, summaries, ឯកសារដែលបានផ្លាស់ប្តូរ និង tail context
- អាចរក្សាទុក raw output ដែលបានលាក់ព័ត៌មានសម្ងាត់ជាជម្រើស សម្រាប់ការសង្គ្រោះ/បំបាត់កំហុស តាមរយៈ management routes ដែលបានផ្ទៀងផ្ទាត់អត្តសញ្ញាណ
ផ្ទាំងគ្រប់គ្រងរបស់វាគឺ Dashboard -> Context & Cache -> RTK។
ព័ត៌មានលម្អិតអំពីប្រតិបត្តិការសម្រាប់ custom filters, trust, verify និងការសង្គ្រោះ raw-output មាននៅក្នុង
RTK_COMPRESSION.md។
ប្រភពដើម RTK រាយការណ៍ថាសន្សំបាន 60-90% សម្រាប់ការបង្រួម command-output។ ឧទាហរណ៍ក្នុង README របស់វាបង្ហាញថា
Claude Code session រយៈពេល 30 នាទីបានថយចុះពី ~118,000 tokens មក ~23,900 ដែលស្មើនឹងសន្សំបាន 79.7%។
LLMLingua-2 (ការកាត់ចេញតាមអត្ថន័យ)
របៀប LLMLingua-2 អនុវត្ត ការកាត់ token តាមអត្ថន័យ លើអត្ថបទដោយប្រើ ONNX token classifier តូចមួយ ដើម្បីបំពេញបន្ថែមដល់ engines Caveman និង RTK ដែលផ្អែកលើច្បាប់៖
- បង្រួមតែអត្ថបទក្នុង messages ដែលមិនមែនជា system ប៉ុណ្ណោះ។ ប្លុកកូដដែលមានរបង និងរចនាសម្ព័ន្ធដែលត្រូវរក្សាទុក ផ្សេងទៀតមិនត្រូវបានកែប្រែឡើយ
- ដំណើរការ backend
@atjsh/llmlingua-2(ONNX តាមរយៈ@huggingface/transformers) នៅក្នុង worker thread ដូច្នេះ model inference មិនរារាំង request event loop ឡើយ - អាច ដាក់ជាស្រទាប់បាន (
stackPriority35)៖ ក្នុង pipeline ដែលដាក់ជាស្រទាប់ វាដំណើរការបន្ទាប់ពី structural engines (CCR, session-dedup, headroom, Caveman) ប៉ុន្តែមុនultraពីព្រោះ ការកាត់ចេញតាមអត្ថន័យមានប្រសិទ្ធភាពបំផុតលើអត្ថបទដែលបានបង្រួមតាមរចនាសម្ព័ន្ធរួចហើយ — ឧ.rtk -> caveman -> llmlingua - បន្តដំណើរការដោយបើកចំហនៅពេលមានកំហុសណាមួយ (ខ្វះ optional deps, ការបង្កើត worker, ការផ្ទុក model, inference ឬ timeout) → អត្ថបទដើមត្រូវបានត្រឡប់ដោយមិនផ្លាស់ប្តូរ មិនដែលត្រឡប់កំហុសឡើយ
ទីតាំង engine៖ open-sse/services/compression/engines/llmlingua/។ ផ្ទាំងគ្រប់គ្រងរបស់វា
គឺ Dashboard -> Context & Cache -> LLMLingua។
Models
model លំនាំដើមគឺ TinyBERT (atjsh/llmlingua-2-js-tinybert-meetingbank, ~57 MB,
លឿន)។ model BERT-base ដែលមានភាពត្រឹមត្រូវខ្ពស់ជាង (Arcoldd/llmlingua4j-bert-base-onnx,
~710 MB) អាចប្រើបានតាមរយៈ field model ក្នុងការកំណត់រចនាសម្ព័ន្ធ engine។ @huggingface/transformers
ទាញយក model ដែលបានជ្រើសរើសតាមតម្រូវការពី HuggingFace Hub ទៅក្នុង
${DATA_DIR}/models/llmlingua នៅពេលហៅលើកដំបូង (modelStore.ts)។ ការកំណត់ជំនួស modelPath
នឹងចង្អុលទៅកាន់ច្បាប់ចម្លងនៅក្នុងម៉ាស៊ីនជំនួសវិញ (សម្រាប់ការដំឡើង offline / air-gapped)។
Optional dependencies និងការដំឡើងតាមតម្រូវការ
prunable LLMLingua runtime peer stack គឺជា ជម្រើស។ packages ពីរត្រូវបានប្រកាសជា
optionalDependencies ក្នុង package.json និងរក្សាទុកជា external ដោយ production build
(scripts/build/prepublish.ts មិន bundle ពួកវាទេ)៖
| Package | កំណែ (បានចាក់សោ) | កំណត់សម្គាល់ |
|---|---|---|
@atjsh/llmlingua-2 |
2.0.5 |
package ចម្បង ដែលប្រកាស package ផ្សេងទៀតជា peers |
js-tiktoken |
^1.0.20 |
Tokenizer |
@huggingface/transformers ត្រូវបានចាក់សោនៅ ^4.2.0 (ប្រើរួមជាមួយ local embeddings path និង
ត្រូវបាន trace ចូលទៅក្នុង standalone bundle ផងដែរ)។ @atjsh/llmlingua-2@2.0.5 កំណត់វាជា peer ជាមួយ
"^3.5.2 || ^4.0.0" ដូច្នេះទាំង Transformers.js v3 និង v4 ត្រូវបានគាំទ្រ។ ចាប់ពី 2.0.4 មក
@atjsh/llmlingua-2 លែងត្រូវការ @tensorflow/tfjs ទៀតហើយ ដែលបានដកសមាសភាគធំបំផុតតែមួយ
(TensorFlow.js) ចេញពី SLM stack។ មានតែ packages ពីរខាងលើប៉ុណ្ណោះដែលជា prunable SLM
peers។ npm install ស្តង់ដារ (dev) ដំឡើង optional stack ដោយស្វ័យប្រវត្តិ លុះត្រាតែ optional
dependencies ត្រូវបានរំលង។
ហេតុអ្វីត្រូវដំឡើងតាមតម្រូវការ៖ package ដែលបានបោះពុម្ពលើ npm, standalone bundle និង Docker image
ត្រូវបានចែកចាយ ដោយគ្មាន deps ទាំងនេះ ដើម្បីរក្សាទំហំឱ្យតូច។ នៅពេលពួកវាមិនមាន dependency
gate របស់ worker (ការស្ទង់ resolve របស់ @atjsh/llmlingua-2 ក្នុង worker.ts) នឹងបរាជ័យ ហើយ engine
នឹង បន្តដំណើរការដោយស្ងាត់នៅពេលមានកំហុស — ការជ្រើស LLMLingua នឹងមិនធ្វើអ្វីទេ (អត្ថបទត្រូវបានត្រឡប់ដោយមិនផ្លាស់ប្តូរ និងគ្មាន
កំហុសត្រូវបានកត់ត្រា)។ ដើម្បីបើកដំណើរការវាក្នុងបរិស្ថានដែលបានកាត់បន្ថយ សូមដំឡើង optional stack៖
# ចាក់សោកំណែទៅតាមកំណែដែលបានប្រកាសក្នុង package.json optionalDependencies
npm install @atjsh/llmlingua-2@2.0.5 js-tiktoken
ការដក @tensorflow/tfjs ចេញ (2.0.4+) លុបបំបាត់សមាសភាគប្រហែល ~800 MB ដែលធ្លាប់មានទំហំធំបំផុត
— ទំហំដែលនៅសល់គឺ runtimes របស់ transformers.js + onnxruntime-node
បូករួមនឹង model TinyBERT (~57 MB) ដែលត្រូវបានទាញយកពេលប្រើលើកដំបូង (មិនមែនតាម npm ទេ)។
សម្រាប់បរិស្ថាននីមួយៗ៖
- Dev /
npm install— ត្រូវបានដំឡើងដោយស្វ័យប្រវត្តិ លុះត្រាតែអ្នកបានបញ្ជូន--omit=optional(ឬ--no-optional)។ មិនចាំបាច់ធ្វើអ្វីទេ។ - Global npm (
npm i -g omniroute) / standalone — ដំណើរការពាក្យបញ្ជាដំឡើងខាងលើនៅក្នុង ថតកញ្ចប់ដែលបានដំឡើង ឬដំឡើងឡើងវិញដោយមិនរំលង optional deps។ - Docker — បន្ថែមពាក្យបញ្ជាដំឡើងទៅក្នុងស្រទាប់ derived image មួយ; image ដែលបានចេញផ្សាយ ត្រូវបានរៀបចំឱ្យមានទំហំតូចតាមការរចនា។
- VPS (PM2) — ដំឡើងទៅក្នុង
node_modulesរបស់កម្មវិធី បន្ទាប់មកចាប់ផ្ដើម process ឡើងវិញ ដើម្បីឱ្យ worker ពិនិត្យ gate ឡើងវិញ។ - Raw Next standalone (
npm run build→.build/next/standalone/server.js) — standalone trace មិនភ្ជាប់មកជាមួយទាំង worker និង optional deps ទេ ដូច្នេះ engine បើកឱ្យឆ្លងកាត់ដោយស្ងៀមស្ងាត់ នៅពេលបរាជ័យ។scripts/build/colocate-standalone.mjsអនុវត្តទាំងពីរឡើងវិញ (worker esbuild + optional-dep closure ទៅក្នុង standalone tree); វាដំណើរការដោយស្វ័យប្រវត្តិតាមរយៈpostbuildnpm hook បន្ទាប់ពីរាល់ការបង្កើត build។ អាចដំណើរការឡើងវិញបានដោយមិនបង្កផលប៉ះពាល់ និងបរាជ័យដោយទន់ភ្លន់នៅពេលគ្មាន deps។
ផ្ទៀងផ្ទាត់ថាវាកំពុងសកម្ម: នៅពេលជ្រើសរើស LLMLingua អត្ថបទពិតប្រាកដនឹងត្រូវបានបង្រួម
(engine ឈប់បើកឱ្យឆ្លងកាត់នៅពេលបរាជ័យ) ហើយ request ដំបូងនឹងចាប់ផ្ដើមការទាញយក model ទៅក្នុង
${DATA_DIR}/models/llmlingua។ gate ពិនិត្យតែ @atjsh/llmlingua-2 ដោយចេតនា —
peers ផ្សេងទៀតគាំទ្រតែ ESM ហើយ require.resolve បង្កើតកំហុសលើពួកវា ទោះបីជាមានវត្តមានក៏ដោយ — ដូច្នេះ
worker នៅតែបើកឱ្យឆ្លងកាត់នៅពេលបរាជ័យ ប្រសិនបើ peer ណាមួយពិតជាបាត់នៅពេល import()។
បំពង់ដំណើរការដែលដាក់ជាជង់
របៀបដាក់ជាជង់ដំណើរការជំហាននៃបំពង់ដំណើរការតាមលំដាប់។ លំនាំដើមគឺ៖
rtk -> caveman
ប្រើវាសម្រាប់សម័យ coding-agent ដែល prompt មួយរួមបញ្ចូលលទ្ធផល command ជាមួយនឹងអត្ថបទរបស់មនុស្ស ឬ assistant។ RTK កាត់បន្ថយកំណត់ហេតុឧបករណ៍ដែលមានភាពរំខានជាមុនសិន បន្ទាប់មក Caveman បង្ហាប់ភាសាធម្មជាតិដែលនៅសល់។
ជំហាននៃបំពង់ដំណើរការត្រូវបានកំណត់រចនាសម្ព័ន្ធដោយប្រើ stackedPipeline នៅក្នុងការកំណត់ការបង្ហាប់ ឬតាមរយៈបន្សំការបង្ហាប់។
នៅពេលម៉ាស៊ីនទាំងពីរកាត់បន្ថយ payload ដូចគ្នាដែលមានសិទ្ធិ អត្រាសន្សំនឹងបូកបន្តគ្នា៖
combined = 1 - (1 - RTK savings) * (1 - Caveman input savings)
average = 1 - (1 - 0.80) * (1 - 0.46) = 89.2%
range = 1 - (1 - 0.60..0.90) * (1 - 0.46) = 78.4-94.6%
តម្រងមែកធាងភាពងាយស្រួលប្រើប្រាស់ MCP
តម្រងឆ្លាតវៃសម្រាប់មែកធាងភាពងាយស្រួលប្រើប្រាស់ MCP គឺជាស្រទាប់បង្ហាប់ក្រោយការប្រតិបត្តិ ដែលដំណើរការលើ លទ្ធផលឧបករណ៍ MCP មិនមែនលើ prompt ឬ context ទេ។ វាផ្តោតលើ payload នៃមែកធាងភាពងាយស្រួលប្រើប្រាស់ និង snapshot របស់ browser ដែលមានខ្លឹមសារច្រើនលើសលប់ ដែលត្រូវបានត្រឡប់ដោយឧបករណ៍ដូចជា Playwright, computer-use និងម៉ាស៊ីនបម្រើ MCP សម្រាប់ browser-automation។
អ្វីដែលវាធ្វើ
- ការដកភាពរំខានចេញ — ដកធាតុ generic/text ទទេចេញ (
- generic:,- text: "") - ការបង្រួមធាតុកម្រិតដូចគ្នា — នៅពេលបន្ទាត់ជាប់ៗគ្នាចំនួន ≥
collapseThreshold(លំនាំដើម 30) ជាធាតុរចនាសម្ព័ន្ធដដែលៗ វានឹងបង្រួមពួកវាទៅជាបន្ទាត់ដំបូងចំនួនcollapseKeepHead(លំនាំដើម 10) + សេចក្តីសង្ខេបចំនួន + បន្ទាត់ចុងក្រោយចំនួនcollapseKeepTail(លំនាំដើម 5) - ការរក្សាទុក ref — anchor
[ref=eXX]ដែល Playwright/computer-use ត្រូវការ នឹងមិនត្រូវបានកែប្រែឡើយ - ការកាត់ផ្តាច់ដោយកំណត់រឹង — ប្រសិនបើអត្ថបទក្រោយការបង្រួមនៅតែលើស
maxTextChars(លំនាំដើម 50,000) វានឹងកាត់ផ្តាច់អត្ថបទដោយភ្ជាប់ជាមួយការណែនាំអំពីការរុករក ដើម្បីឱ្យ agent អាចបន្តធ្វើការបាន
ទីតាំងម៉ាស៊ីន
open-sse/services/compression/engines/mcpAccessibility/
index.ts ← ចំណុចចូល smartFilterText()
collapseRepeated.ts ← ក្បួនដោះស្រាយសម្រាប់បង្រួមធាតុកម្រិតដូចគ្នា
constants.ts ← DEFAULT_MCP_ACCESSIBILITY_CONFIG
ការកំណត់រចនាសម្ព័ន្ធ
គ្រប់គ្រងដោយ compression.mcpAccessibility នៅក្នុងការកំណត់សកល (migration 056)។ ការកំណត់រចនាសម្ព័ន្ធលំនាំដើម៖
{
"enabled": true,
"maxTextChars": 50000,
"collapseThreshold": 30,
"collapseKeepHead": 10,
"collapseKeepTail": 5,
"minLengthToProcess": 2000
}
តម្រងនេះត្រូវបានអនុវត្តតែលើ payload នៃលទ្ធផលឧបករណ៍ដែលមាន type ជា "text" និងមានប្រវែងលើស minLengthToProcess ប៉ុណ្ណោះ។ វាមិនប៉ះពាល់ដល់ការបង្ហាប់ prompt ឬ payload នៃសំណើទេ។
អត្រាសន្សំដែលរំពឹងទុក
60–80% លើលទ្ធផលឧបករណ៍ snapshot របស់ browser អាស្រ័យលើភាពស្មុគស្មាញនៃទំព័រ។ ក្បួនដោះស្រាយបង្រួមមានភាពស្មុគស្មាញ O(n) តាមចំនួនបន្ទាត់ និងបន្ថែម latency តិចតួចដែលអាចមិនយកមកគិតបាន។
តម្រងនេះធៀបនឹងម៉ាស៊ីនបង្ហាប់ខាងលើ
| ទិដ្ឋភាព | Caveman / RTK / Stacked | តម្រងភាពងាយស្រួលប្រើប្រាស់ MCP |
|---|---|---|
| គោលដៅ | Prompt / context នៃសំណើ | លទ្ធផលឧបករណ៍ MCP |
| កត្តាបង្កឱ្យដំណើរការ | ការកំណត់របៀបបង្ហាប់ | compression.mcpAccessibility.enabled |
| វិសាលភាព | សារ SSE ទាំងអស់ | លទ្ធផលឧបករណ៍ប៉ុណ្ណោះ |
| Anchor ref | មិនអនុវត្ត | ត្រូវបានរក្សាទុកដោយគ្មានលក្ខខណ្ឌ |
បន្សំការបង្ហាប់
បន្សំការបង្ហាប់គឺជាប្រូហ្វាល់ការបង្ហាប់ដែលមានឈ្មោះ និងអាចកំណត់ឱ្យបន្សំកំណត់ផ្លូវបាន៖
compression_combos: រក្សាទុកម៉ូដ pipeline ការកំណត់រចនាសម្ព័ន្ធ RTK ការកំណត់រចនាសម្ព័ន្ធភាសា និងសញ្ញាសម្គាល់លំនាំដើមcompression_combo_assignments: ផ្គូផ្គងបន្សំការបង្ហាប់មួយទៅនឹងបន្សំកំណត់ផ្លូវមួយ- ការរួមបញ្ចូលពេលដំណើរការកំណត់បន្សំការបង្ហាប់ដែលបានផ្ដល់ជាមុនសិន មុននឹងការកំណត់ជំនួសបន្សំទូទៅ
- ទិន្នន័យវិភាគរួមមាន
compression_combo_idនិងengine
ទីតាំងនៅលើផ្ទាំងគ្រប់គ្រង៖ Dashboard -> Context & Cache -> Compression Combos។
ផ្ទៃ API
| ផ្លូវ | គោលបំណង |
|---|---|
/api/settings/compression |
ការកំណត់ការបង្ហាប់សកល (រួមមានការកំណត់រចនាសម្ព័ន្ធ mcpAccessibility) |
/api/compression/preview |
មើលជាមុននូវម៉ូដការបង្ហាប់ណាមួយ |
/api/compression/language-packs |
រាយបញ្ជីកញ្ចប់ភាសា Caveman ដែលមាន |
/api/context/caveman/config |
ឈ្មោះជំនួសសម្រាប់ការកំណត់ Caveman |
/api/context/rtk/config |
តម្លៃលំនាំដើម និងការកំណត់ RTK |
/api/context/rtk/filters |
កាតាឡុកតម្រង RTK |
/api/context/rtk/test |
endpoint សម្រាប់មើលជាមុន/សាកល្បង RTK |
/api/context/rtk/raw-output/[id] |
ការសង្គ្រោះ raw-output ដែលបានលាក់ព័ត៌មានរសើប និងបានផ្ទៀងផ្ទាត់អត្តសញ្ញាណ |
/api/context/combos |
CRUD សម្រាប់បន្សំការបង្ហាប់ |
/api/context/combos/[id]/assignments |
CRUD សម្រាប់ការផ្ដល់ទៅឱ្យបន្សំកំណត់ផ្លូវ |
/api/context/analytics |
ឈ្មោះជំនួសសម្រាប់ទិន្នន័យវិភាគការបង្ហាប់ |
ផ្លូវគ្រប់គ្រងតម្រូវឱ្យមានការផ្ទៀងផ្ទាត់អត្តសញ្ញាណសម្រាប់ការគ្រប់គ្រង ឬការត្រួតពិនិត្យគោលការណ៍ API-key។
ឧបករណ៍ MCP
ការបង្ហាប់ផ្ដល់ឧបករណ៍ MCP ចំនួនប្រាំ៖
| ឧបករណ៍ | វិសាលភាព | គោលបំណង |
|---|---|---|
omniroute_compression_status |
read:compression |
ការកំណត់ ទិន្នន័យវិភាគ និងស្ថិតិ cache |
omniroute_compression_configure |
write:compression |
ធ្វើបច្ចុប្បន្នភាពការកំណត់សកល |
omniroute_set_compression_engine |
write:compression |
កំណត់ម៉ូដ និង pipeline ជាជម្រើស |
omniroute_list_compression_combos |
read:compression |
រាយបញ្ជីបន្សំការបង្ហាប់ |
omniroute_compression_combo_stats |
read:compression |
អានទិន្នន័យវិភាគបន្សំ/engine |
វិសាលភាព និងការលើកលែង
Embeddings មិនត្រូវបានបង្ហាប់ជាដាច់ខាត។ open-sse/handlers/embeddings.ts មិនដែលហៅ
engine ការបង្ហាប់ណាមួយឡើយ — body នៃ request/response ត្រូវបានបញ្ជូនត្រង់ទៅ executor ដោយមិនមានការកែប្រែ។
បច្ចុប្បន្ន នេះជារចនាសម្ព័ន្ធប្រព័ន្ធ (embeddings និង chat completions មាន handler ដាច់ដោយឡែកពីគ្នា) មិនមែនជា
ការត្រួតពិនិត្យពេលដំណើរការទេ ប៉ុន្តែវាមានន័យថា កង្វល់អំពីការប្រែប្រួល vector នៅក្នុង #8034 មិនមានផ្ទៃដែលអាចរងផលប៉ះពាល់
នៅក្នុងផ្លូវ embeddings ឡើយ។
តម្រងលើកលែងតាម model/endpoint (#8034)។ សម្រាប់ chat completions ប្រតិបត្តិករអាចកំណត់ឈ្មោះ
model ids / គោលដៅ provider/model ដែលមិនត្រូវបានបង្ហាប់ជាដាច់ខាត — ជាវិធានការការពារដែលមានប្រយោជន៍ ប្រសិនបើ
ការបង្ហាប់ត្រូវបានភ្ជាប់កាន់តែជិតទៅនឹងផ្លូវដែលនៅជិត embeddings នៅពេលក្រោយ ហើយជាទូទៅក៏មានប្រយោជន៍
សម្រាប់ model ណាមួយដែល prompt របស់វាត្រូវតែដូចគ្នាបេះបិទតាម byte (ការវាយតម្លៃកំណត់ជាមុន prefix ដែលពឹងផ្អែកលើ
cache ជាដើម)។
- វាលការកំណត់៖
exclusions?: string[]នៅលើការកំណត់រចនាសម្ព័ន្ធការបង្ហាប់សកល (GET/PUT /api/settings/compression) ដែលរក្សាទុកតាមរយៈ namespace ការបង្ហាប់key_valueដែលមានស្រាប់ (src/lib/db/compression.ts) — មិនមាន table ថ្មីទេ។ - ផ្ទាំងនៅលើ Dashboard៖ Dashboard → Compression → Exclusions
(
/dashboard/compression/exclusions)។ - វាក្យសម្ព័ន្ធ pattern៖
*គឺជា wildcard តែមួយគត់។ regex metacharacter ផ្សេងទៀតទាំងអស់នៅក្នុង pattern ត្រូវបាន escape មុនពេលផ្គូផ្គង ដូច្នេះgpt-5.6ផ្គូផ្គងតែ string តាមព្យញ្ជនៈប៉ុណ្ណោះ មិនដែលផ្គូផ្គងgpt-5x6ទេ (មានសុវត្ថិភាពពី ReDoS មានដែនកំណត់ និងគ្មាន quantifier ត្រួតគ្នា)។ Pattern ត្រូវបានផ្គូផ្គងដោយមិនប្រកាន់តួអក្សរធំតូចទៅនឹង ទាំង model id ដាច់ដោយឡែក និងទម្រង់រួមprovider/model—gpt-5-6,openai/gpt-5-6, និងopenai/*សុទ្ធតែដំណើរការ ហើយ*តែឯងនឹងលើកលែងគ្រប់ model ទាំងអស់។ - ការផ្គូផ្គង៖
isCompressionExcluded()/normalizeCompressionExclusions()នៅក្នុងopen-sse/services/compression/exclusions.ts។chatCore.tsត្រួតពិនិត្យគោលដៅដែលត្រូវបានលើកលែង ភ្លាមៗបន្ទាប់ពីកំណត់ការកំណត់ការបង្ហាប់បានហើយ មុនពេល engine ណាមួយដំណើរការ ហើយចាត់ទុកការផ្គូផ្គង ដូចគ្នាបេះបិទនឹងការបិទការបង្ហាប់ជាសកល — request body ត្រូវបានធានាថា ដូចគ្នាបេះបិទតាម byte។ ការរំលងនេះត្រូវបានកត់ត្រាតាមរយៈwriteCompressionSkip(..., "excluded")ដើម្បីឱ្យ អាចមើលឃើញនៅក្នុងទិន្នន័យវិភាគ។ - លំនាំដើម (បញ្ជីទទេ/មិនមាន)៖ ដូចគ្នាបេះបិទនឹងឥរិយាបថមុន #8034 — គ្មានអ្វីត្រូវបានលើកលែងទេ។
ដែនកំណត់ដែលបានដឹង
- LLMLingua-2 (SLM) តម្រូវឱ្យ dependency ជាជម្រើសស្ថិតនៅរួមទីតាំង។ worker ដំណើរការនៅក្នុង
production build តែនៅពេល
@atjsh/llmlingua-2+ peer dependency របស់វាត្រូវបានដាក់រួមទីតាំងក្នុងdist/node_modulesប៉ុណ្ណោះ (សូមមើលscripts/build/colocateOptionals.mjs, #4286)។ ប្រសិនបើគ្មានពួកវា engine នឹង fail-open (ត្រឡប់អត្ថបទដើម)។ ការកំណត់ទីតាំង worker លែងពឹងផ្អែកលើimport.meta.urlទៀតហើយ (វាបរាជ័យក្នុង standalone bundle) — វាកំណត់គោលដោយផ្អែកលើ runtime cwd /argv[1]។ - កញ្ចប់ភាសា Caveman
de/fr/jaមានតែផ្នែកខ្លះ។ ពួកវាផ្តល់ជូនច្បាប់context+filler+structuralប៉ុន្តែមិនមានកញ្ចប់dedup/ultraទេ ដូច្នេះកម្រិតultraមិនខ្លាំងជាងfullសម្រាប់ភាសាទាំងនោះទេ (ពួកវាប្រើតែច្បាប់ផ្ទាល់ខ្លួនប៉ុណ្ណោះ — មិនមានការ fallback ដោយស្ងាត់ទៅកាន់ច្បាប់dedup/ultraជាភាសាអង់គ្លេស ដែលអាចធ្វើឱ្យអត្ថបទភាសាបរទេសខូចទ្រង់ទ្រាយឡើយ)។en/es/id/pt-BRមានពេញលេញ។ យើងស្វាគមន៍ការរួមចំណែកdedup.json+ultra.jsonសម្រាប់កញ្ចប់ដែលមានតែផ្នែកខ្លះ។ - ទិន្នន័យ telemetry បែប stacked រាយតែ engine ដែលបានបង្ហាប់ប៉ុណ្ណោះ។ ជំហាននៃ stacked-pipeline ដែល
engine បានដំណើរការ ប៉ុន្តែសន្សំបាន 0 % នឹងត្រឡប់
stats:nullដូច្នេះវាមិនបង្ហាញក្នុងengineBreakdownទេ — ដែលមិនអាចសម្គាល់ខុសគ្នាពីជំហានដែលត្រូវបានរំលងឡើយ។ ការបែងចែកភាពខុសគ្នារវាង "បានដំណើរការ, 0 %" និង "បានរំលង" នឹងតម្រូវឱ្យមានការផ្លាស់ប្តូរ breakdown-model ហើយត្រូវបានពន្យារពេល។
ការផ្ទៀងផ្ទាត់
ច្រកត្រួតពិនិត្យដែលផ្តោតលើផ្នែកនេះមានដូចខាងក្រោម៖
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
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
node --import tsx/esm --test tests/unit/compression/mcpAccessibility*.test.ts
npm run typecheck:core