# Compression Engines (Հայերեն) 🌐 **Languages:** 🇺🇸 [English](../../../../compression/COMPRESSION_ENGINES.md) · 🇪🇹 [am](../../../am/docs/compression/COMPRESSION_ENGINES.md) · 🇸🇦 [ar](../../../ar/docs/compression/COMPRESSION_ENGINES.md) · 🇦🇿 [az](../../../az/docs/compression/COMPRESSION_ENGINES.md) · 🇧🇬 [bg](../../../bg/docs/compression/COMPRESSION_ENGINES.md) · 🇧🇩 [bn](../../../bn/docs/compression/COMPRESSION_ENGINES.md) · 🇧🇦 [bs](../../../bs/docs/compression/COMPRESSION_ENGINES.md) · 🇨🇿 [cs](../../../cs/docs/compression/COMPRESSION_ENGINES.md) · 🇩🇰 [da](../../../da/docs/compression/COMPRESSION_ENGINES.md) · 🇩🇪 [de](../../../de/docs/compression/COMPRESSION_ENGINES.md) · 🇬🇷 [el](../../../el/docs/compression/COMPRESSION_ENGINES.md) · 🇪🇸 [es](../../../es/docs/compression/COMPRESSION_ENGINES.md) · 🇪🇪 [et](../../../et/docs/compression/COMPRESSION_ENGINES.md) · 🇮🇷 [fa](../../../fa/docs/compression/COMPRESSION_ENGINES.md) · 🇫🇮 [fi](../../../fi/docs/compression/COMPRESSION_ENGINES.md) · 🇫🇷 [fr](../../../fr/docs/compression/COMPRESSION_ENGINES.md) · 🇮🇪 [ga](../../../ga/docs/compression/COMPRESSION_ENGINES.md) · 🇮🇳 [gu](../../../gu/docs/compression/COMPRESSION_ENGINES.md) · 🇳🇬 [ha](../../../ha/docs/compression/COMPRESSION_ENGINES.md) · 🇮🇱 [he](../../../he/docs/compression/COMPRESSION_ENGINES.md) · 🇮🇳 [hi](../../../hi/docs/compression/COMPRESSION_ENGINES.md) · 🇭🇷 [hr](../../../hr/docs/compression/COMPRESSION_ENGINES.md) · 🇭🇺 [hu](../../../hu/docs/compression/COMPRESSION_ENGINES.md) · 🇮🇩 [id](../../../id/docs/compression/COMPRESSION_ENGINES.md) · 🇳🇬 [ig](../../../ig/docs/compression/COMPRESSION_ENGINES.md) · 🇮🇹 [it](../../../it/docs/compression/COMPRESSION_ENGINES.md) · 🇯🇵 [ja](../../../ja/docs/compression/COMPRESSION_ENGINES.md) · 🇬🇪 [ka](../../../ka/docs/compression/COMPRESSION_ENGINES.md) · 🇰🇭 [km](../../../km/docs/compression/COMPRESSION_ENGINES.md) · 🇮🇳 [kn](../../../kn/docs/compression/COMPRESSION_ENGINES.md) · 🇰🇷 [ko](../../../ko/docs/compression/COMPRESSION_ENGINES.md) · 🇱🇹 [lt](../../../lt/docs/compression/COMPRESSION_ENGINES.md) · 🇱🇻 [lv](../../../lv/docs/compression/COMPRESSION_ENGINES.md) · 🇮🇳 [ml](../../../ml/docs/compression/COMPRESSION_ENGINES.md) · 🇮🇳 [mr](../../../mr/docs/compression/COMPRESSION_ENGINES.md) · 🇲🇾 [ms](../../../ms/docs/compression/COMPRESSION_ENGINES.md) · 🇲🇹 [mt](../../../mt/docs/compression/COMPRESSION_ENGINES.md) · 🇲🇲 [my](../../../my/docs/compression/COMPRESSION_ENGINES.md) · 🇳🇵 [ne](../../../ne/docs/compression/COMPRESSION_ENGINES.md) · 🇳🇱 [nl](../../../nl/docs/compression/COMPRESSION_ENGINES.md) · 🇳🇴 [no](../../../no/docs/compression/COMPRESSION_ENGINES.md) · 🇮🇳 [or](../../../or/docs/compression/COMPRESSION_ENGINES.md) · 🇮🇳 [pa](../../../pa/docs/compression/COMPRESSION_ENGINES.md) · 🇵🇭 [phi](../../../phi/docs/compression/COMPRESSION_ENGINES.md) · 🇵🇱 [pl](../../../pl/docs/compression/COMPRESSION_ENGINES.md) · 🇵🇹 [pt](../../../pt/docs/compression/COMPRESSION_ENGINES.md) · 🇧🇷 [pt-BR](../../../pt-BR/docs/compression/COMPRESSION_ENGINES.md) · 🇷🇴 [ro](../../../ro/docs/compression/COMPRESSION_ENGINES.md) · 🇷🇺 [ru](../../../ru/docs/compression/COMPRESSION_ENGINES.md) · 🇱🇰 [si](../../../si/docs/compression/COMPRESSION_ENGINES.md) · 🇸🇰 [sk](../../../sk/docs/compression/COMPRESSION_ENGINES.md) · 🇸🇮 [sl](../../../sl/docs/compression/COMPRESSION_ENGINES.md) · 🇷🇸 [sr](../../../sr/docs/compression/COMPRESSION_ENGINES.md) · 🇸🇪 [sv](../../../sv/docs/compression/COMPRESSION_ENGINES.md) · 🇰🇪 [sw](../../../sw/docs/compression/COMPRESSION_ENGINES.md) · 🇮🇳 [ta](../../../ta/docs/compression/COMPRESSION_ENGINES.md) · 🇮🇳 [te](../../../te/docs/compression/COMPRESSION_ENGINES.md) · 🇹🇭 [th](../../../th/docs/compression/COMPRESSION_ENGINES.md) · 🇹🇷 [tr](../../../tr/docs/compression/COMPRESSION_ENGINES.md) · 🇺🇦 [uk-UA](../../../uk-UA/docs/compression/COMPRESSION_ENGINES.md) · 🇵🇰 [ur](../../../ur/docs/compression/COMPRESSION_ENGINES.md) · 🇺🇿 [uz](../../../uz/docs/compression/COMPRESSION_ENGINES.md) · 🇻🇳 [vi](../../../vi/docs/compression/COMPRESSION_ENGINES.md) · 🇳🇬 [yo](../../../yo/docs/compression/COMPRESSION_ENGINES.md) · 🇨🇳 [zh-CN](../../../zh-CN/docs/compression/COMPRESSION_ENGINES.md) · 🇹🇼 [zh-TW](../../../zh-TW/docs/compression/COMPRESSION_ENGINES.md) --- OmniRoute-ի սեղմումը կառուցված է շարժիչների պայմանագրերի շուրջ։ Ռեժիմը կարող է ուղղակիորեն գործարկել մեկ շարժիչ (`caveman` կամ `rtk`) կամ դետերմինացված շերտավորված կոնվեյեր, որը հերթականությամբ գործարկում է մի քանի շարժիչ։ ## Ռեժիմներ | Ռեժիմ | Շարժիչի ուղի | Նախատեսված մուտք | | ------------ | ------------------------------------------------------------------------------------- | ------------------------------------------------------------ | | `off` | none | Ճշգրիտ հուշման պահպանում | | `lite` | Caveman lite helpers | Ցածր ռիսկի մշտական մաքրում | | `standard` | Caveman | Բնական լեզվի հուշման խտացում | | `aggressive` | Caveman + history/tool summarizers | Երկար զրույցի սեանսներ | | `ultra` | Caveman + pruning helpers | Կոնտեքստի սահմանաչափի վերականգնում | | `rtk` | RTK | Տերմինալի, shell-ի, build-ի, test-ի և git-ի ելք | | `omniglyph` | OmniGlyph | Կոնտեքստը որպես պատկեր բնիկ մատակարարի մալուխի վրա | | `stacked` | Pipeline. The request default is `session-dedup -> lite`. `rtk -> caveman` is opt-in. | Խառը գործիքների լոգեր և արձակ, առավելագույն խնայողություններ | ### OmniGlyph սեղմման պրոֆիլներ `omniglyph` շարժիչը (`omniglyph` փաթեթ, 1.4.0+) ընդունում է անվանական իմաստային պրոֆիլ, որը սահմանվում է գլոբալ կերպով `omniglyph.profile`-ի միջոցով սեղմման կարգավորումներում կամ յուրաքանչյուր քայլի համար՝ stacked pipeline-ի քայլի կոնֆիգուրացիայի միջոցով: | Պրոֆիլ | Սահման | | ------------- | -------------------------------------------------------------------------------------------------------------------------------- | | `aggressive` | Լռելյայն։ Քաղաքականություն, որը չափվել է հրապարակված անդորրագրերով՝ պատկերների համակարգ, գործիքների փաստաթղթեր և խիտ պատմություն | | `balanced` | Պահպանում է կենդանի վիճակը բնիկ, պաշտպանում է վերջին 8 շրջադարձերը, փլուզում է հին փակ պատմությունը | | `coding-safe` | Պահպանում է լիազորությունը, գործիքների սխեմաները և կենդանի գործիքի ելքը բնիկ, պաշտպանում է վերջին 12 շրջադարձերը | | `passthrough` | Անցկացնում է առանց փոխակերպման; շարժիչը բաց է թողնվում | Պրոֆիլը **առաստաղ է, ոչ թե հատակ**: Փաթեթի `mergeCompressionProfileOptions`-ը հրաժարվում է թույլ տալ կանչողին վերագործարկել կորուստներով ուղին, որը պրոֆիլը փակել է, ուստի յուրաքանչյուր քայլի համար նախատեսված `preserveSystemPrompt: false`-ը չի կարող վերագործարկել համակարգի սեղմումը `coding-safe`-ի ներքո: Չափված է այս կոդբազայի վրա. `coding-safe`-ը և `balanced`-ը բարձրացնում են `minCompressChars`-ը մինչև իր առավելագույնը և պահպանում են համակարգը, գործիքների սխեմաները և գործիքների արդյունքները բնիկ, այնպես որ սեանսը, որը դեռ պատմություն չի կուտակել, կանգ է առնում `below_min_chars`-ում, և շարժիչը ոչինչ չի փոխակերպում: Ահա թե ինչու լռելյայնը `aggressive` է, այլ ոչ թե ամենաանվտանգ պրոֆիլը: Փաթեթը լուծում է իր սեփական մոդելի շրջանակը և պրոֆիլը իր միջավայրի կոնֆիգուրացիայից: OmniRoute-ը երբեք չի պատվիրակում որոշումը. ադապտերը մոդելի դարպասը կապում է փաթեթի ամենասահմանափակ շրջանակին, այնպես որ հոսթի միջավայրի կարգավորումները կարող են միայն նեղացնել թույլատրված ցուցակը, երբեք չընդլայնել այն OmniRoute-ի չափված անդորրագրերից այն կողմ: ## Շարժիչների ռեեստր Ռեեստրը գտնվում է `open-sse/services/compression/engines/registry.ts`-ում։ Շարժիչներն ապահովում են ընդհանուր պայմանագիր․ - `id`՝ շարժիչի կայուն նույնացուցիչ, օրինակ՝ `caveman` կամ `rtk` - `apply(text, config)`՝ կատարման հին ուղին, որն օգտագործվում է շերտավորված մշակաշարերի կողմից - `compress(input, config)`՝ կատարման հիմնական ուղին, որը վերադարձնում է տեքստ և վիճակագրություն - `getConfigSchema()`՝ վերադարձնում է վավեր կազմաձևի՝ JSON Schema-ին նման կառուցվածքը - `validateConfig(config)`՝ վերադարձնում է `{ valid, errors[] }` Գրանցումն օգտագործում է `registerCompressionEngine(engine)`-ը (կամ `registerEngine`-ը՝ առաջադեմ դեպքերի համար), որը նախքան ընդունելը կանչում է `assertValidEngine()`-ը և `validateConfig(defaultConfig)`-ը։ Շարժիչը կատարման ընթացքում հեռացնելու համար օգտագործեք `unregisterCompressionEngine(id)`-ը։ `strategySelector.ts`-ը գրանցում է ներկառուցված շարժիչները՝ նախքան սեղմման մեկնարկը։ Սա հնարավորություն է տալիս, որ նախադիտումը, կատարման ժամանակի սեղմումը, շերտավորված ռեժիմը, թեստերը և ապագա շարժիչներն օգտագործեն կատարման նույն ուղին։ ### MCP նկարագրության սեղմում (առնչվող) Առանձին ռեեստր սեղմում է MCP գործիքների նկարագրության մետատվյալները ռեեստրի մակարդակում․ տե՛ս `open-sse/mcp-server/descriptionCompressor.ts` և [MCP-SERVER.md](../frameworks/MCP-SERVER.md)։ Այն վերօգտագործում է Caveman-ի կանոնները, սակայն աշխատում է գործիքների մետատվյալների, այլ ոչ թե հարցումների օգտակար բեռների հետ։ ### Լրացուցիչ ներկառուցված շարժիչներ Բացի Caveman-ից, RTK-ից և LLMLingua-2-ից, ռեեստրն ընդգրկում է մի քանի մասնագիտացված անկորուստ / կառուցվածքային շարժիչներ (որոնք օգտագործվում են շերտավորված մշակաշարերի, փորձադաշտի և թեստերի կողմից)․ | Շարժիչ | Նույնացուցիչ | Ինչ է այն անում | | ------------- | --------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | CCR | `ccr` | Content-Compress-Retrieve (H4)․ մեծ, հարակից տեքստային բլոկները փոխարինում է բովանդակությամբ հասցեավորվող հղումներով, որպեսզի կրկնվող/մեծ բլոկներն ուղարկվեն մեկ անգամ, իսկ հետագայում դրանց հղում արվի։ | | headroom | `headroom` | SmartCrusher (H3 + N5)․ համասեռ JSON զանգվածների օգտակար բեռների անկորուստ աղյուսակային խտացում՝ սյունակային `[N rows]` ձևաչափի։ | | ionizer | `ionizer` | Շատ մեծ համասեռ բլոկներից սկզբի/միջնամասի/վերջի տողերի նմուշառում՝ բաց թողնված միջնամասը պահելով որպես CCR բովանդակությամբ հասցեավորվող հղում։ | | session-dedup | `session-dedup` | Բովանդակությամբ հասցեավորվող, հաղորդագրությունների փուլերի միջև կրկնությունների վերացում (TokenMizer-ից ոգեշնչված)․ բաց է թողնում նույն աշխատաշրջանի ավելի վաղ փուլերում արդեն հանդիպած տեքստը։ | **CCR-ի ստացման արձանագրության հրահանգ (#8033)․** երբ CCR-ն առաջին անգամ հարցման մեջ փոխարինում է ≥1 բլոկ, շարժիչը սկզբում ավելացնում է մեկ, իդեմպոտենտ `system` հաղորդագրություն (որը սկսվում է `[CCR protocol]` պահակային նշիչով)՝ կանչողին բացատրելով նշիչ → գործիք պայմանագիրը․ ինչ է նշանակում `[CCR retrieve hash=<24hex> chars=N]` նշիչը, որ հեշը պետք է բառացիորեն պատճենվի (բոլոր 24 տասնվեցական նիշերը․ սխալ պատճենված հեշերը «բլոկը չի գտնվել» բացթողումների հավանական պատճառն են), և որ `[dedup:ref sha=...]` նշիչը նշանակում է «հետ նայիր պատմության մեջ», այլ ոչ թե «կանչիր գործիքը»։ Նշումը ներարկվում է **միայն այն դեպքում, երբ կանչողի հայտարարած `tools[]`-ը հաստատում է, որ այն իրականում կարող է հասանելիություն ստանալ `omniroute_ccr_retrieve`-ին** (`callerSupportsCcrRetrieve()`՝ `open-sse/services/compression/engines/ccr/protocolInstruction.ts`-ում)․ սովորական OpenAI-ի հետ համատեղելի կանչողը, որն այդ գործիքը չունի, երբեք չի ստանում իրեն անհասանելի որևէ բան կանչելու հրահանգ։ Իդեմպոտենտությունն ապահովվում է՝ նախքան ներարկումը հաղորդագրությունների պատմության մեջ պահակային նշիչը որոնելով, այնպես որ բազմափուլ հարցումները (որոնք վերարտադրում են նախորդ հաղորդագրությունները) յուրաքանչյուր փուլի համար մեկական նշում չեն կուտակում։ ## Caveman Caveman ռեժիմը կենտրոնանում է սովորական արձակի իմաստային խտացման վրա՝ - պահպանում է կոդի բլոկները, URL-ները, JSON-ը, ուղիները և կառուցվածքավորված տվյալները - հեռացնում է ավելորդ բառերը, անորոշ ձևակերպումները, կրկնվող համատեքստը և ծավալուն կապակցող արտահայտությունները - աջակցում է լեզվին համապատասխան ֆայլային կանոնների փաթեթներին՝ `open-sse/services/compression/rules/`-ում - շարունակում է հասանելի լինել հին `standard`, `aggressive` և `ultra` ռեժիմների միջոցով Կառավարման վահանակում այն գտնվում է `Dashboard -> Context & Cache -> Caveman` բաժնում։ Caveman-ի սկզբնաղբյուրը հաղորդում է ելքային թոքենների `~75%` նվազում, թեստերում ելքի միջինում `65%` խնայողություն՝ `22-87%` միջակայքով, և մուտքային տվյալների սեղմման `~46%` գործիք։ OmniRoute-ը օգտագործում է Caveman-ի մուտքային կողմի ցուցանիշը՝ համակցված հուշումների/համատեքստի խնայողությունները փաստագրելիս․ Caveman-ի ելքային ռեժիմը մնում է պատասխանի վարքագծի առանձին գործառույթ։ ## RTK RTK ռեժիմը կենտրոնանում է հրամանների և գործիքների ելքի վրա՝ - հայտնաբերում է ելքի դասեր, ինչպիսիք են `git status`, `git branch`, `git diff`, Vitest/Jest/Pytest, Cargo/Go թեստերը, TypeScript/Vite/Webpack կառուցումները, ESLint-ը, npm աուդիտները/տեղադրումները, Docker-ի մատյանները, shell-ի `find`/`grep` հրամանները, կանչերի շղթաները և ընդհանուր մատյանները - կիրառում է 49 JSON զտիչ՝ `open-sse/services/compression/engines/rtk/filters/`-ից - աջակցում է RTK ոճի դեկլարատիվ մշակաշղթային՝ ANSI-ի հեռացում, փոխարինում, ելքի համընկնման դեպքում կարճ միացում, տողերի հեռացում/պահպանում, յուրաքանչյուր տողի կրճատում, սկզբի/վերջի/առավելագույն տողերի կրճատում և դատարկ արդյունքի դեպքում պահուստային տարբերակ - աջակցում է վստահությամբ սահմանափակված նախագծային զտիչներին՝ `.rtk/filters.json`-ում, և գլոբալ զտիչներին՝ `DATA_DIR/rtk/filters.json`-ում - հեռացնում է ANSI հաջորդականությունները, առաջընթացի աղմուկը, կրկնվող տողերը և ոչ օգտակար ձևանմուշային տեքստը - պահպանում է գործողություն պահանջող ձախողումները, նախազգուշացումները, ամփոփումները, փոփոխված ֆայլերը և վերջնամասի համատեքստը - կարող է ըստ ցանկության պահպանել գաղտնազերծված հում ելքը՝ նույնականացում պահանջող կառավարման երթուղիների միջոցով վերականգնման/վրիպազերծման համար Կառավարման վահանակում այն գտնվում է `Dashboard -> Context & Cache -> RTK` բաժնում։ Հատուկ զտիչների, վստահության, ստուգման և հում ելքի վերականգնման գործառնական մանրամասները ներկայացված են [`RTK_COMPRESSION.md`](./RTK_COMPRESSION.md)-ում։ RTK-ի սկզբնաղբյուրը հաղորդում է հրամանների ելքի սեղմման `60-90%` խնայողություն։ Դրա README-ի օրինակում Claude Code-ի 30 րոպեանոց աշխատաշրջանի թոքենների քանակը `~118,000`-ից նվազում է մինչև `~23,900`, այսինքն՝ խնայվում է `79.7%`։ ## LLMLingua-2 (Իմաստային նոսրացում) LLMLingua-2 ռեժիմն արձակի վրա իրականացնում է **թոքենների իմաստային նոսրացում**՝ օգտագործելով փոքր ONNX թոքենային դասակարգիչ և լրացնելով կանոնների վրա հիմնված Caveman ու RTK շարժիչները՝ - սեղմում է արձակը միայն ոչ համակարգային հաղորդագրություններում․ սահմանազատված կոդի բլոկները և պահպանվող այլ կառուցվածքները երբեք չեն փոփոխվում - գործարկում է `@atjsh/llmlingua-2` հետնամասը (ONNX՝ `@huggingface/transformers`-ի միջոցով) աշխատանքային հոսքում, որպեսզի մոդելի եզրակացությունը երբեք չարգելափակի հարցման իրադարձությունների ցիկլը - **համակցելի է շղթայում** (`stackPriority` 35)․ համակցված մշակաշղթայում այն աշխատում է կառուցվածքային շարժիչներից (CCR, session-dedup, headroom, Caveman) հետո, բայց `ultra`-ից առաջ, քանի որ իմաստային նոսրացումն առավել արդյունավետ է արդեն կառուցվածքային եղանակով սեղմված տեքստի վրա, օրինակ՝ `rtk -> caveman -> llmlingua` - **ցանկացած սխալի դեպքում բաց է թողնում մշակումը** (բացակայող կամընտիր կախվածություններ, աշխատանքային հոսքի ստեղծում, մոդելի բեռնում, եզրակացություն կամ ժամանակի սպառում) → սկզբնական տեքստը վերադարձվում է անփոփոխ, և երբեք սխալ չի վերադարձվում Շարժիչի գտնվելու վայրը՝ `open-sse/services/compression/engines/llmlingua/`։ Կառավարման վահանակում այն գտնվում է `Dashboard -> Context & Cache -> LLMLingua` բաժնում։ ### Մոդելներ Լռելյայն մոդելը **TinyBERT**-ն է (`atjsh/llmlingua-2-js-tinybert-meetingbank`, ~57 MB, արագ)։ Ավելի բարձր ճշգրտությամբ **BERT-base** մոդելը (`Arcoldd/llmlingua4j-bert-base-onnx`, ~710 MB) հասանելի է շարժիչի կազմաձևման `model` դաշտի միջոցով։ `@huggingface/transformers`-ն առաջին կանչի ժամանակ ընտրված մոդելը ծույլ եղանակով ներբեռնում է HuggingFace Hub-ից՝ `${DATA_DIR}/models/llmlingua` պանակ (`modelStore.ts`)․ կազմաձևման `modelPath` վերասահմանումը դրա փոխարեն մատնանշում է տեղային պատճենը (անցանց / մեկուսացված տեղադրումների համար)։ ### Կամընտիր կախվածություններ և ըստ պահանջի տեղադրում Հեռացվող LLMLingua գործարկման միջավայրի peer փաթեթակույտը **կամընտիր** է։ Երկու փաթեթ սահմանված են որպես `optionalDependencies`՝ `package.json`-ում, և արտադրական կառուցման ժամանակ պահվում են **արտաքին** (`scripts/build/prepublish.ts`-ը դրանք փաթեթում չի ներառում)՝ | Փաթեթ | Տարբերակ (ամրագրված) | Նշումներ | | -------------------- | -------------------- | ---------------------------------------------------- | | `@atjsh/llmlingua-2` | `2.0.5` | Մուտքային փաթեթ․ մյուսները հայտարարում է որպես peers | | `js-tiktoken` | `^1.0.20` | Թոքենիզատոր | `@huggingface/transformers`-ն ամրագրված է `^4.2.0` տարբերակով (օգտագործվում է նաև տեղային embeddings ուղու հետ և հետագծվում է առանձին փաթեթի մեջ)․ `@atjsh/llmlingua-2@2.0.5`-ը դրա համար սահմանում է `"^3.5.2 || ^4.0.0"` peer պահանջ, ուստի աջակցվում են ինչպես Transformers.js v3-ը, այնպես էլ v4-ը։ Սկսած 2.0.4-ից՝ `@atjsh/llmlingua-2`-ն այլևս չի պահանջում `@tensorflow/tfjs`, ինչը SLM փաթեթակույտից հեռացրեց ամենամեծ առանձին բաղադրիչը (TensorFlow.js)։ Միայն վերը նշված երկու փաթեթներն են հեռացվող SLM peer-երը։ Սովորական `npm install`-ը (մշակման միջավայրում) ինքնաբերաբար տեղադրում է կամընտիր փաթեթակույտը, եթե կամընտիր կախվածությունները բաց չեն թողնվել։ **Ինչու՝ ըստ պահանջի.** npm-ում հրապարակված փաթեթը, առանձին փաթեթը և Docker պատկերը մատակարարվում են **առանց** այս կախվածությունների՝ փոքր չափը պահպանելու համար։ Երբ դրանք բացակայում են, աշխատանքային հոսքի կախվածությունների ստուգումը (`worker.ts`-ում `@atjsh/llmlingua-2`-ի resolve փորձարկումը) ձախողվում է, և շարժիչը **անաղմուկ բաց է թողնում մշակումը**․ LLMLingua-ի ընտրությունը դառնում է գործողություն չկատարող տարբերակ (տեքստը վերադարձվում է անփոփոխ, սխալ չի գրանցվում)։ Այն կրճատված միջավայրում ակտիվացնելու համար տեղադրեք կամընտիր փաթեթակույտը՝ ```bash # ամրագրել package.json-ի optionalDependencies-ում հայտարարված տարբերակներին npm install @atjsh/llmlingua-2@2.0.5 js-tiktoken ``` `@tensorflow/tfjs`-ի հեռացումը (2.0.4+) վերացնում է նախկինում գերակշռող ~800 MB բաղադրիչը․ մնացած ծավալը կազմում են transformers.js + onnxruntime-node գործարկման միջավայրերը, ինչպես նաև TinyBERT մոդելը (~57 MB), որը ներբեռնվում է առաջին օգտագործման ժամանակ (ոչ npm-ի միջոցով)։ Ըստ միջավայրի՝ - **Մշակում / `npm install`** — տեղադրվում է ինքնաբերաբար, եթե չեք փոխանցել `--omit=optional` (կամ `--no-optional`)։ Որևէ գործողություն անհրաժեշտ չէ։ - **Գլոբալ npm (`npm i -g omniroute`) / ինքնուրույն տարբերակ** — գործարկեք վերևի տեղադրման հրամանը տեղադրված փաթեթի գրացուցակում կամ վերատեղադրեք՝ առանց կամընտիր կախվածությունները բաց թողնելու։ - **Docker** — տեղադրման հրամանն ավելացրեք ածանցյալ պատկերի շերտում․ հրապարակված պատկերը նախագծված է թեթև լինելու համար։ - **VPS (PM2)** — տեղադրեք հավելվածի `node_modules`-ում, ապա վերագործարկեք գործընթացը, որպեսզի աշխատիչը կրկին ստուգի դարպասը։ - **Չմշակված Next ինքնուրույն տարբերակ (`npm run build` → `.build/next/standalone/server.js`)** — ինքնուրույն տարբերակի հետագծումը չի ներառում Ո՛Չ աշխատիչը, Ո՛Չ էլ կամընտիր կախվածությունները, ուստի շարժիչը լռելյայն անցնում է բաց ռեժիմի։ `scripts/build/colocate-standalone.mjs`-ը կրկին կիրառում է երկուսն էլ (աշխատիչի esbuild + կամընտիր կախվածությունների ամբողջական շղթան ինքնուրույն տարբերակի ծառում)․ այն յուրաքանչյուր կառուցումից հետո ինքնաբերաբար գործարկվում է `postbuild` npm հուկի միջոցով։ Իդեմպոտենտ է և կախվածությունների բացակայության դեպքում ավարտվում է առանց կոշտ ձախողման։ **Ստուգեք, որ այն ակտիվ է․** երբ ընտրված է LLMLingua-ն, իրական արձակ տեքստն իսկապես կրճատվում է (շարժիչը դադարում է բաց ռեժիմի անցնել), իսկ առաջին հարցումը գործարկում է մոդելի ներբեռնումը `${DATA_DIR}/models/llmlingua` պանակ։ Դարպասը միտումնավոր ստուգում է միայն `@atjsh/llmlingua-2`-ը․ մյուս համարժեք կախվածությունները միայն ESM են, և `require.resolve`-ը դրանց դեպքում սխալ է նետում նույնիսկ առկայության պարագայում, ուստի աշխատիչը շարունակում է անցնել բաց ռեժիմի, եթե որևէ համարժեք կախվածություն իրապես բացակայում է `import()`-ի կատարման պահին։ ## Շղթայված խողովակաշարեր Շղթայված ռեժիմը խողովակաշարի քայլերը գործարկում է հերթականությամբ։ Լռելյայն տարբերակն է՝ ```txt rtk -> caveman ``` Օգտագործեք սա կոդավորման գործակալի աշխատաշրջանների համար, որոնցում հուշումը համադրում է հրամանի ելքը մարդու կամ օգնականի արձակ տեքստի հետ։ RTK-ն նախ նվազեցնում է գործիքների աղմկոտ մատյանները, ապա Caveman-ը սեղմում է մնացած բնական լեզվով տեքստը։ Խողովակաշարի քայլերը կազմաձևվում են սեղմման կարգավորումներում `stackedPipeline`-ի միջոցով կամ սեղմման համակցությունների օգնությամբ։ Երբ երկու շարժիչներն էլ նվազեցնում են նույն համապատասխան բեռնվածքը, խնայողությունները բազմապատկվում են՝ ```txt 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 **գործիքների արդյունքների**, այլ ոչ թե հուշումների կամ համատեքստի վրա։ Այն նախատեսված է Playwright-ի, computer-use-ի և դիտարկիչների ավտոմատացման MCP սերվերների նման գործիքների վերադարձրած ծավալուն մատչելիության ծառերի և դիտարկիչի ակնթարթային պատկերների բեռնվածքների համար։ ### Ինչ է այն անում 1. **Աղմուկի հեռացում** — հեռացնում է դատարկ ընդհանուր/տեքստային գրառումները (`- generic:`, `- text: ""`) 2. **Հարակից տարրերի կրճատում** — երբ ≥ `collapseThreshold` (լռելյայն՝ 30) հաջորդական տողերը կառուցվածքային կրկնություններ են, դրանք կրճատում է՝ թողնելով առաջին `collapseKeepHead` (լռելյայն՝ 10) տողերը + քանակի ամփոփագիրը + վերջին `collapseKeepTail` (լռելյայն՝ 5) տողերը 3. **Հղումների պահպանում** — Playwright-ին/computer-use-ին անհրաժեշտ `[ref=eXX]` խարիսխները երբեք չեն փոփոխվում 4. **Կոշտ կրճատում** — եթե կրճատումից հետո տեքստը դեռ գերազանցում է `maxTextChars`-ը (լռելյայն՝ 50,000), այն կրճատվում է՝ ավելացնելով նավիգացիոն հուշում, որպեսզի գործակալը կարողանա շարունակել աշխատանքը ### Շարժիչի գտնվելու վայրը ```txt open-sse/services/compression/engines/mcpAccessibility/ index.ts ← smartFilterText()-ի մուտքի կետ collapseRepeated.ts ← հարակից տարրերի կրճատման ալգորիթմ constants.ts ← DEFAULT_MCP_ACCESSIBILITY_CONFIG ``` ### Կազմաձևում Կառավարվում է ընդհանուր կարգավորումների `compression.mcpAccessibility`-ի միջոցով (միգրացիա 056)։ Լռելյայն կազմաձևը՝ ```json { "enabled": true, "maxTextChars": 50000, "collapseThreshold": 30, "collapseKeepHead": 10, "collapseKeepTail": 5, "minLengthToProcess": 2000 } ``` Զտիչը կիրառվում է միայն գործիքի արդյունքի այն բեռնվածքների նկատմամբ, որոնց `type`-ը `"text"` է, և որոնց երկարությունը գերազանցում է `minLengthToProcess`-ը։ Այն չի ազդում հուշումների սեղմման կամ հարցման բեռնվածքների վրա։ ### Ակնկալվող խնայողություն 60–80%՝ դիտարկիչի ակնթարթային պատկերի գործիքային արդյունքների դեպքում՝ կախված էջի բարդությունից։ Կրճատման ալգորիթմի բարդությունը, ըստ տողերի քանակի, O(n) է, և այն ավելացնում է աննշան ուշացում։ ### Այս զտիչը՝ վերևի սեղմման շարժիչների համեմատ | Բնութագիր | Caveman / RTK / Stacked | MCP մատչելիության զտիչ | | ------------------- | ------------------------------ | -------------------------------------- | | Թիրախ | Հարցման հուշումներ / համատեքստ | MCP գործիքների արդյունքներ | | Գործարկման պայման | Սեղմման ռեժիմի կարգավորում | `compression.mcpAccessibility.enabled` | | Կիրառման շրջանակ | Բոլոր SSE հաղորդագրությունները | Միայն գործիքների արդյունքները | | Հղումների խարիսխներ | Կիրառելի չէ | Անվերապահորեն պահպանվում են | --- ## Սեղմման կոմբինացիաներ Սեղմման կոմբինացիաներն անվանված սեղմման պրոֆիլներ են, որոնք կարող են վերագրվել երթուղավորման կոմբինացիաներին․ - `compression_combos`․ պահպանում է ռեժիմը, մշակման շղթան, 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` | RTK նախադիտման/փորձարկման վերջնակետ | | `/api/context/rtk/raw-output/[id]` | Նույնականացմամբ հասանելի, գաղտնազերծված հում ելքի վերականգնում | | `/api/context/combos` | Սեղմման կոմբինացիաների CRUD | | `/api/context/combos/[id]/assignments` | Երթուղավորման կոմբինացիաների վերագրումների CRUD | | `/api/context/analytics` | Սեղմման վերլուծական տվյալների այլանուն | Կառավարման երթուղիները պահանջում են կառավարման նույնականացում կամ API բանալիի քաղաքականության ստուգումներ։ ## MCP գործիքներ Սեղմումը տրամադրում է հինգ MCP գործիք․ | Գործիք | Տիրույթ | Նպատակ | | ----------------------------------- | ------------------- | ---------------------------------------------------- | | `omniroute_compression_status` | `read:compression` | Կարգավորումներ, վերլուծություն, քեշի վիճակագրություն | | `omniroute_compression_configure` | `write:compression` | Թարմացնել ընդհանուր կարգավորումները | | `omniroute_set_compression_engine` | `write:compression` | Սահմանել ռեժիմը և ոչ պարտադիր մշակման շղթան | | `omniroute_list_compression_combos` | `read:compression` | Ցուցադրել սեղմման կոմբինացիաները | | `omniroute_compression_combo_stats` | `read:compression` | Կարդալ կոմբինացիայի/շարժիչի վերլուծական տվյալները | ## Տիրույթ և բացառումներ **Ներդրումները երբեք չեն սեղմվում։** `open-sse/handlers/embeddings.ts`-ը երբեք չի կանչում որևէ սեղմման շարժիչ․ հարցման/պատասխանի մարմիններն անփոփոխ փոխանցվում են անմիջապես կատարողին։ Ներկայում սա կառուցվածքային է (ներդրումների և զրույցի լրացումների մշակիչներն առանձնացված են), ոչ թե կատարման ժամանակի ստուգում, սակայն դա նշանակում է, որ #8034-ում նշված վեկտորների աղավաղման մտահոգությունը ներդրումների ուղում ազդեցության մակերես չունի։ **Ըստ մոդելի/վերջնակետի բացառման զտիչ (#8034)։** Զրույցի լրացումների համար օպերատորը կարող է նշել մոդելի id-ներ / `provider/model` թիրախներ, որոնք երբեք չպետք է սեղմվեն․ սա օգտակար պաշտպանիչ սահմանափակում է, եթե հետագայում սեղմումը երբևէ միացվի ներդրումներին մոտ որևէ ուղու, և ընդհանուր առմամբ օգտակար է ցանկացած մոդելի համար, որի բայթ առ բայթ ճշգրիտ հուշումը կարևոր է (դետերմինացված գնահատումներ, քեշի նկատմամբ զգայուն նախածանցներ և այլն)։ - Կարգավորումների դաշտ՝ `exclusions?: string[]`՝ սեղմման ընդհանուր կազմաձևման մեջ (`GET`/`PUT /api/settings/compression`), պահպանվում է գոյություն ունեցող `key_value` սեղմման անվանատարածքի միջոցով (`src/lib/db/compression.ts`)․ նոր աղյուսակ չի ստեղծվում։ - Կառավարման վահանակի ներդիր՝ **Dashboard → Compression → Exclusions** (`/dashboard/compression/exclusions`)։ - Ձևանմուշի շարահյուսություն․ `*`-ը միակ փոխարինման նշանն է։ Ձևանմուշի մյուս բոլոր կանոնավոր արտահայտությունների մետանիշները համընկնումը ստուգելուց առաջ էկրանավորվում են, ուստի `gpt-5.6`-ը համընկնում է միայն բառացի տողի հետ և երբեք՝ `gpt-5x6`-ի (ReDoS-ից անվտանգ, սահմանափակ, առանց ներդրված քանակիչների)։ Ձևանմուշները, առանց տառաչափը հաշվի առնելու, համեմատվում են ինչպես մոդելի պարզ id-ի, այնպես էլ `provider/model` բաղադրյալ արժեքի հետ․ `gpt-5-6`, `openai/gpt-5-6` և `openai/*` տարբերակները բոլորն աշխատում են, իսկ միայն `*`-ը բացառում է յուրաքանչյուր մոդել։ - Համընկնում՝ `isCompressionExcluded()` / `normalizeCompressionExclusions()`՝ `open-sse/services/compression/exclusions.ts`-ում։ `chatCore.ts`-ը բացառված թիրախը ստուգում է սեղմման կարգավորումները որոշելուց անմիջապես հետո՝ **նախքան որևէ շարժիչի գործարկումը**, և համընկնումը մշակում է ճիշտ այնպես, ինչպես սեղմման ընդհանուր անջատումը․ ապացուցելի է, որ հարցման մարմինը բայթ առ բայթ նույնական է։ Բաց թողնելը գրանցվում է `writeCompressionSkip(..., "excluded")`-ի միջոցով՝ վերլուծական տվյալներում տեսանելիության համար։ - Լռելյայն (դատարկ/բացակայող ցուցակ)՝ նույնական է մինչ #8034 եղած վարքագծին․ ոչինչ չի բացառվում։ ## Հայտնի սահմանափակումներ - **LLMLingua-2-ը (SLM) պահանջում է համատեղ տեղակայված ընտրովի կախվածություններ։** Worker-ը production build-ում աշխատում է միայն այն դեպքում, երբ `@atjsh/llmlingua-2`-ը և peer կախվածությունները համատեղ տեղակայված են `dist/node_modules`-ում (տե՛ս `scripts/build/colocateOptionals.mjs`, #4286)։ Առանց դրանց շարժիչը fail-open ռեժիմով է աշխատում (վերադարձնում է սկզբնական տեքստը)։ Worker-ի որոշումն այլևս կախված չէ `import.meta.url`-ից (այն խափանվում է standalone bundle-ում). որպես հենակետ օգտագործվում է runtime cwd-ն / `argv[1]`-ը։ - **Caveman-ի `de` / `fr` / `ja` լեզվական փաթեթները մասնակի են։** Դրանք ներառում են `context` + `filler` + `structural` կանոններ, բայց չունեն `dedup` / `ultra` փաթեթներ, ուստի այդ լեզուների համար `ultra` ինտենսիվությունն ավելի ուժեղ չէ, քան `full`-ը (դրանք օգտագործում են միայն իրենց սեփական կանոնները. չկա աննկատ հետադարձ անցում դեպի անգլերեն `dedup`/`ultra` կանոնները, որոնք կաղավաղեին օտարալեզու տեքստը)։ `en` / `es` / `id` / `pt-BR` փաթեթներն ամբողջական են։ Մասնակի փաթեթների համար `dedup.json` + `ultra.json` ներդրումները ողջունելի են։ - **Շերտավորված հեռաչափությունը ցուցակում ներառում է միայն սեղմում կատարած շարժիչները։** Շերտավորված pipeline-ի այն քայլը, որի շարժիչն աշխատել է, բայց ապահովել է 0 % խնայողություն, վերադարձնում է `stats:null` և այդ պատճառով չի հայտնվում `engineBreakdown`-ում՝ չտարբերվելով բաց թողնված քայլից։ «Աշխատել է, 0 %» և «բաց է թողնվել» դեպքերը տարբերակելու համար կպահանջվեր breakdown մոդելի փոփոխություն, և դա հետաձգված է։ ## Վավերացում Այս ոլորտի համար կենտրոնացված ստուգումներն են՝ ```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 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 ```