# 🗜️ Prompt Compression Guide — OmniRoute (Հայերեն) 🌐 **Languages:** 🇺🇸 [English](../../../../compression/COMPRESSION_GUIDE.md) · 🇪🇹 [am](../../../am/docs/compression/COMPRESSION_GUIDE.md) · 🇸🇦 [ar](../../../ar/docs/compression/COMPRESSION_GUIDE.md) · 🇦🇿 [az](../../../az/docs/compression/COMPRESSION_GUIDE.md) · 🇧🇬 [bg](../../../bg/docs/compression/COMPRESSION_GUIDE.md) · 🇧🇩 [bn](../../../bn/docs/compression/COMPRESSION_GUIDE.md) · 🇧🇦 [bs](../../../bs/docs/compression/COMPRESSION_GUIDE.md) · 🇨🇿 [cs](../../../cs/docs/compression/COMPRESSION_GUIDE.md) · 🇩🇰 [da](../../../da/docs/compression/COMPRESSION_GUIDE.md) · 🇩🇪 [de](../../../de/docs/compression/COMPRESSION_GUIDE.md) · 🇬🇷 [el](../../../el/docs/compression/COMPRESSION_GUIDE.md) · 🇪🇸 [es](../../../es/docs/compression/COMPRESSION_GUIDE.md) · 🇪🇪 [et](../../../et/docs/compression/COMPRESSION_GUIDE.md) · 🇮🇷 [fa](../../../fa/docs/compression/COMPRESSION_GUIDE.md) · 🇫🇮 [fi](../../../fi/docs/compression/COMPRESSION_GUIDE.md) · 🇫🇷 [fr](../../../fr/docs/compression/COMPRESSION_GUIDE.md) · 🇮🇪 [ga](../../../ga/docs/compression/COMPRESSION_GUIDE.md) · 🇮🇳 [gu](../../../gu/docs/compression/COMPRESSION_GUIDE.md) · 🇳🇬 [ha](../../../ha/docs/compression/COMPRESSION_GUIDE.md) · 🇮🇱 [he](../../../he/docs/compression/COMPRESSION_GUIDE.md) · 🇮🇳 [hi](../../../hi/docs/compression/COMPRESSION_GUIDE.md) · 🇭🇷 [hr](../../../hr/docs/compression/COMPRESSION_GUIDE.md) · 🇭🇺 [hu](../../../hu/docs/compression/COMPRESSION_GUIDE.md) · 🇮🇩 [id](../../../id/docs/compression/COMPRESSION_GUIDE.md) · 🇳🇬 [ig](../../../ig/docs/compression/COMPRESSION_GUIDE.md) · 🇮🇹 [it](../../../it/docs/compression/COMPRESSION_GUIDE.md) · 🇯🇵 [ja](../../../ja/docs/compression/COMPRESSION_GUIDE.md) · 🇬🇪 [ka](../../../ka/docs/compression/COMPRESSION_GUIDE.md) · 🇰🇭 [km](../../../km/docs/compression/COMPRESSION_GUIDE.md) · 🇮🇳 [kn](../../../kn/docs/compression/COMPRESSION_GUIDE.md) · 🇰🇷 [ko](../../../ko/docs/compression/COMPRESSION_GUIDE.md) · 🇱🇹 [lt](../../../lt/docs/compression/COMPRESSION_GUIDE.md) · 🇱🇻 [lv](../../../lv/docs/compression/COMPRESSION_GUIDE.md) · 🇮🇳 [ml](../../../ml/docs/compression/COMPRESSION_GUIDE.md) · 🇮🇳 [mr](../../../mr/docs/compression/COMPRESSION_GUIDE.md) · 🇲🇾 [ms](../../../ms/docs/compression/COMPRESSION_GUIDE.md) · 🇲🇹 [mt](../../../mt/docs/compression/COMPRESSION_GUIDE.md) · 🇲🇲 [my](../../../my/docs/compression/COMPRESSION_GUIDE.md) · 🇳🇵 [ne](../../../ne/docs/compression/COMPRESSION_GUIDE.md) · 🇳🇱 [nl](../../../nl/docs/compression/COMPRESSION_GUIDE.md) · 🇳🇴 [no](../../../no/docs/compression/COMPRESSION_GUIDE.md) · 🇮🇳 [or](../../../or/docs/compression/COMPRESSION_GUIDE.md) · 🇮🇳 [pa](../../../pa/docs/compression/COMPRESSION_GUIDE.md) · 🇵🇭 [phi](../../../phi/docs/compression/COMPRESSION_GUIDE.md) · 🇵🇱 [pl](../../../pl/docs/compression/COMPRESSION_GUIDE.md) · 🇵🇹 [pt](../../../pt/docs/compression/COMPRESSION_GUIDE.md) · 🇧🇷 [pt-BR](../../../pt-BR/docs/compression/COMPRESSION_GUIDE.md) · 🇷🇴 [ro](../../../ro/docs/compression/COMPRESSION_GUIDE.md) · 🇷🇺 [ru](../../../ru/docs/compression/COMPRESSION_GUIDE.md) · 🇱🇰 [si](../../../si/docs/compression/COMPRESSION_GUIDE.md) · 🇸🇰 [sk](../../../sk/docs/compression/COMPRESSION_GUIDE.md) · 🇸🇮 [sl](../../../sl/docs/compression/COMPRESSION_GUIDE.md) · 🇷🇸 [sr](../../../sr/docs/compression/COMPRESSION_GUIDE.md) · 🇸🇪 [sv](../../../sv/docs/compression/COMPRESSION_GUIDE.md) · 🇰🇪 [sw](../../../sw/docs/compression/COMPRESSION_GUIDE.md) · 🇮🇳 [ta](../../../ta/docs/compression/COMPRESSION_GUIDE.md) · 🇮🇳 [te](../../../te/docs/compression/COMPRESSION_GUIDE.md) · 🇹🇭 [th](../../../th/docs/compression/COMPRESSION_GUIDE.md) · 🇹🇷 [tr](../../../tr/docs/compression/COMPRESSION_GUIDE.md) · 🇺🇦 [uk-UA](../../../uk-UA/docs/compression/COMPRESSION_GUIDE.md) · 🇵🇰 [ur](../../../ur/docs/compression/COMPRESSION_GUIDE.md) · 🇺🇿 [uz](../../../uz/docs/compression/COMPRESSION_GUIDE.md) · 🇻🇳 [vi](../../../vi/docs/compression/COMPRESSION_GUIDE.md) · 🇳🇬 [yo](../../../yo/docs/compression/COMPRESSION_GUIDE.md) · 🇨🇳 [zh-CN](../../../zh-CN/docs/compression/COMPRESSION_GUIDE.md) · 🇹🇼 [zh-TW](../../../zh-TW/docs/compression/COMPRESSION_GUIDE.md) --- > Համապատասխան կոնտեքստի վրա ավտոմատ խնայեք 15-95%։ Արագ ակնարկի համար տե՛ս [README-ի սեղմման բաժինը](../README.md#%EF%B8%8F-prompt-compression--save-15-95-eligible-tokens-automatically)։ ## Ակնարկ OmniRoute-ն իրականացնում է հուշումների սեղմման մոդուլային շղթա, որն աշխատում է **նախապես**՝ մինչև հարցումների՝ վերին մակարդակի մատակարարներին հասնելը։ Սա նշանակում է, որ թոքենների խնայողությունը կատարվում է թափանցիկ՝ առանց ձեր աշխատանքային գործընթացը փոխելու անհրաժեշտության։ ``` Հաճախորդի հարցում → Սեղմման ռազմավարության ընտրիչ → Կոմբոյի վերասահմանո՞ւմ → Օգտագործել կոմբոյի կարգավորումը → Ավտոմատ գործարկման շե՞մ → Օգտագործել ավտոմատ ռեժիմը → Լռելյայն ռեժի՞մ → Օգտագործել գլոբալ կարգավորումը → Անջատվա՞ծ է → Բաց թողնել սեղմումը → Ընտրված սեղմման ռեժիմ → Անջատված․ առանց սեղմման → Թեթև․ բացատների/ձևաչափման անվտանգ մաքրում (~15%) → Ստանդարտ․ պարզունակ խոսքի ոճով ավելորդ բառերի հեռացում (~30%) → Ագրեսիվ․ պատմության հնեցում + ամփոփում (~50%) → Ուլտրա․ էվրիստիկ կրճատում + կոդային բլոկների նոսրացում (~75%) → RTK․ հրամանները հաշվի առնող տերմինալի/գործիքների ելքի զտում (վերին մակարդակում՝ 60-90% միջակայք) → Շերտավորված․ կարգավորված բազմաշարժիչ շղթա, սովորաբար RTK, ապա Caveman (համապատասխան կոնտեքստի 78-95% միջակայք) → Սեղմված հարցում → Մատակարար ``` --- ## Սեղմման ռեժիմներ ### Անջատված Սեղմում չի կիրառվում։ Բոլոր հաղորդագրությունները փոխանցվում են անփոփոխ։ ### Թեթև ռեժիմ (~15% խնայողություն, <1ms ուշացում) Ամենաանվտանգ ռեժիմը՝ իմաստային որևէ փոփոխություն չկա, կատարվում է միայն ձևաչափման մաքրում։ | Մեթոդ | Նկարագրություն | | ------------------------ | ------------------------------------------------------- | | `collapseWhitespace` | Միավորել հաջորդական դատարկ տողերը և վերջնային բացատները | | `dedupSystemPrompt` | Հեռացնել կրկնվող համակարգային հաղորդագրությունները | | `compressToolResults` | Սեղմել ծավալուն գործիքի/ֆունկցիայի ելքերը | | `removeRedundantContent` | Հեռացնել կրկնվող հրահանգները | | `replaceImageUrls` | Կրճատել base64 պատկերների տվյալների URI-ները | **Լավագույնն է՝** մշտապես միացված օգտագործման և անվտանգության առումով կրիտիկական աշխատանքային գործընթացների համար։ ### Ստանդարտ ռեժիմ (~30% խնայողություն) Ոգեշնչված է [Caveman-ից](https://github.com/JuliusBrussee/caveman)՝ հեռացնում է ավելորդ բառերն ու երկարաբան ձևակերպումները՝ պահպանելով իմաստը։ - Հեռացնում է ավելորդ բառերը («խնդրում եմ», «կարծում եմ», «հիմնականում», «իրականում») - Խտացնում է երկարաբան արտահայտությունները («որպեսզի» → «համար», «արդյունքում» → «քանի որ») - Հեռացնում է չափազանց քաղաքավարի մեղմացումները («Դեմ չէի՞ք լինի...», «Եթե հնարավոր լիներ...») - Ներառում է ծրագրավորման հուշումների համար հարմարեցված 30+ կանոնավոր արտահայտության կանոն **Լավագույնն է՝** ամենօրյա ծրագրավորման աշխատանքային գործընթացների և ծախսերին ուշադիր թիմերի համար։ ### Ագրեսիվ ռեժիմ (~50% խնայողություն) Պատմության խելացի կառավարում երկարատև աշխատաշրջանների համար։ - **Հաղորդագրությունների հնեցում** — ավելի հին հաղորդագրություններն աստիճանաբար ավելի շատ են սեղմվում - **Գործիքի արդյունքների սեղմում** — երկար գործիքային ելքերը հատվում կամ բաց են թողնվում (առաջին/վերջին տողեր, համընկնող տողերի զտում, JSON բանալիների խտացում) - **Կառուցվածքային ամբողջականության պաշտպանիչ մեխանիզմներ** — ապահովում են `tool_use` + `tool_result` զույգերի համապատասխանությունը - **Կոնտեքստային պատուհանի հաշվառում** — պահպանում է յուրաքանչյուր մոդելի թոքենների սահմանաչափերը **Լավագույնն է՝** երկարատև վրիպազերծման աշխատաշրջանների և մեծ կոդային բազաների համար։ ### Ուլտրա ռեժիմ (~75% խնայողություն) Առավելագույն սեղմում թոքենների առումով կրիտիկական սցենարների համար։ - **Էվրիստիկ կրճատում** — արձակի՝ գնահատականների վրա հիմնված թոքենային կրճատում - **Կառուցվածքի պահպանում** — սահմանազատված կոդային բլոկները, ներկառուցված կոդը, URL-ները և նույնացուցիչները ժամանակավորապես փոխարինվում են նշիչներով և այնուհետև բառացիորեն վերականգնվում՝ առանց կրճատման - **Ընտրովի SLM մակարդակ** — կազմաձևման դեպքում փոքր տեղային մոդելը կարող է ճշգրտել կրճատումը - Անկախ է Ագրեսիվ ռեժիմից․ այն չի կիրառում հաղորդագրությունների հնեցում, գործիքի արդյունքների սեղմում կամ պահուստային ամփոփիչ (միայն SLM մակարդակի խափանման դեպքում պահուստային անցումը կարող է ուղղվել ագրեսիվ ռեժիմով) **Լավագույնն է՝** երբ պարբերաբար հասնում եք կոնտեքստի սահմանաչափերին։ ### RTK ռեժիմ (վերին մակարդակում՝ 60-90% միջակայք) RTK ռեժիմը օպտիմալացված է ծրագրավորման գործակալների աշխատաշրջաններում հանդիպող ծավալուն գործիքային ելքերի համար։ - Հայտնաբերում է հրամանների/ելքերի դասեր, օրինակ՝ `git status`, `git diff`, `git log`, թեստային գործարկիչներ, TypeScript/Vite/Webpack կառուցումներ, ESLint/Biome/Prettier, npm աուդիտներ/տեղադրումներ, Docker մատյաններ, ենթակառուցվածքային ելք և ընդհանուր shell ելք - Կիրառում է `open-sse/services/compression/engines/rtk/filters/`-ի JSON զտիչների փաթեթները - Ներմուծում է RTK TOML schema v1 զտիչները նախագծի կամ գլոբալ `filters.toml` ֆայլերից՝ ներկառուցված թեստերի վավերացմամբ և նախագծային ֆայլերի վստահության ստուգմամբ - Ներառում է 55 ներկառուցված զտիչ՝ ներկառուցված ստուգման օրինակներով - Հեռացնում է ANSI կառավարման հաջորդականությունները, առաջընթացի գոտիները, կրկնվող տողերը և ոչ օգտակար աղմուկը - Պահպանում է խափանումները, սխալները, նախազգուշացումները, փոփոխված ֆայլերը, ամփոփումները և երկար ելքի վերջնամասը - Աջակցում է վստահության ստուգմամբ նախագծային զտիչներին, գլոբալ զտիչներին և, ըստ ցանկության, խմբագրված չմշակված ելքի վերականգնմանը **Լավագույնն է՝** shell, կառուցման, թեստավորման, git, grep և ֆայլային ելքերի արձանագրություններ պարունակող գործակալային աշխատաշրջանների համար։ ### Շերտավորված ռեժիմ (համապատասխան կոնտեքստի 78-95% միջակայք) Շերտավորված ռեժիմը սեղմման մի քանի շարժիչներ գործարկում է որոշակիացված հերթականությամբ։ Լռելյայն շղթան հետևյալն է։ ```txt RTK -> Caveman ``` Այս հերթականությունը նախ խտացնում է տերմինալի/գործիքի ելքը, այնուհետև կիրառում է Caveman-ի իմաստային խտացումը մնացած բնական լեզվով հուշման նկատմամբ։ Շերտավորված շղթաները կարող են կազմաձևվել գլոբալ կերպով կամ ուղղորդման կոմբոներին վերագրված սեղմման կոմբոների միջոցով։ **Լավագույնն է՝** մեծ գործիքային մատյաններ և մարդկային հրահանգներ կամ օգնականի ամփոփումներ պարունակող խառը կոնտեքստի համար։ --- ## Սկզբնաղբյուր նախագծերի խնայողությունների հաշվարկը OmniRoute-ը ներկայացնում է սեղմման խնայողությունները՝ հիմնվելով երկու աղբյուրի վրա՝ սկզբնաղբյուր նախագծերի չափորոշիչների և OmniRoute-ի սեփական շարժիչների համադրման։ | Աղբյուր | Այստեղ օգտագործված՝ սկզբնաղբյուր README-ի ցուցանիշը | | ------- | ---------------------------------------------------------------------------------------------------------------------------------- | | Caveman | `~75%`-ով պակաս ելքային թոքեններ, չափորոշիչներում ելքի միջին `65%` խնայողություն, `22-87%` միջակայք և մուտքի `~46%` սեղմման գործիք | | RTK | Հրամանների ելքի `60-90%` խնայողություն․ օրինակելի աշխատաշրջանում՝ `~118,000 -> ~23,900` թոքեն, կամ `79.7%` խնայողություն (`~80%`) | Գործիքների/համատեքստի համընկնող բովանդակության դեպքում OmniRoute-ի լռելյայն համակցությունը շարժիչները կիրառում է հաջորդաբար․ ```txt RTK -> Caveman ``` Համակցված խնայողությունները բազմապատկվում են, ոչ թե գումարվում․ ```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% ``` Այդ `78-95%` ցուցանիշը կիրառելի է, երբ և՛ RTK-ն, և՛ Caveman-ը կարող են կրճատել նույն մուտքային/համատեքստային բովանդակությունը։ Caveman-ի պատասխանների ելքային ռեժիմն առանձին է․ երբ այն միացված է, օգտագործեք Caveman-ի ելքային խնայողության սեփական ցուցանիշները (`65%` միջին, `~75%` հիմնական ցուցանիշ, `22-87%` միջակայք)։ Վճարումների ընդհանուր խնայողությունը կախված է ձեր հուշումների և ելքերի հարաբերակցությունից։ ### Ինչ է իրականում նշանակում «կիրառելի» Հիմնական 15-95% միջակայքն իրական է, սակայն այն կիրառելի է միայն **կրկնվող կամ չափազանց ծավալուն** բովանդակության համար՝ կրկնվող սխալի տողեր, նույն նախազգուշացումը շարունակաբար արտածող կառուցման մատյան կամ չափազանց մեծ `grep`/ֆայլի ընթերցման արտածում։ Դա **չի** նշանակում, որ յուրաքանչյուր հարցում այդքան խնայողություն է ապահովում։ Փորձնականորեն հաստատված է (`tests/unit/compression/stacked-compression-tool-result-savings.test.ts`)․ Anthropic-ի ձևաչափով `tool_result` բլոկի նկատմամբ, որը պարունակում էր սխալի 300 նույնական տող, `stacked` (RTK + Caveman) գործարկումն ապահովել է **թոքենների 95.93% խնայողություն / նիշերի 96.26% խնայողություն**՝ լիովին տեղավորվելով հայտարարված միջակայքում։ Սակայն նույն մշակաշարը սովորական, չկրկնվող գործիքային ելքի նկատմամբ գործարկելիս (`grep`-ի համընկնումների մաքուր ցանկ, ֆայլի կարճ ընթերցում, սովորական զրույցի տեքստ) ճիշտ կերպով ապահովում է **գրեթե զրոյական խնայողություն**, քանի որ հեռացնելու ենթակա կրկնվող բովանդակություն չկա, իսկ `validateCompression()`-ը (`validation.ts`) հրաժարվում է տրամադրել այնպիսի վերաշարադրում, որը կհեռացներ կամ կփոխեր կոդի բլոկները, URL-ները, վերնագրերը, տարբերակները կամ ԱՄԲՈՂՋՈՎԻՆ ՄԵԾԱՏԱՌ հաստատունների նույնացուցիչները։ Սա ակնկալվող և անվտանգ վարքագիծ է, ոչ թե սխալ․ ծրագրավորման աշխատաշրջանը, որը հիմնականում մաքուր ֆայլեր է ընթերցում կամ դրանցում որոնում կատարում, կունենա ընդհանուր համեստ խնայողություն՝ նույնիսկ լիովին միացված սեղմման դեպքում, մինչդեռ խափանվող ցիկլի կամ չափազանց շատ հաղորդագրություններ արտածող linter-ի հանդիպած աշխատաշրջանն այդ տվյալների հոսքի համար կապահովի ամբողջ 78-95% միջակայքը։ Մի օգտագործեք առանձին աշխատաշրջանի ընդհանուր խնայողության ցածր տոկոսը որպես ապացույց, որ սեղմումը սխալ է կազմաձևված․ նախ ստուգեք՝ արդյոք գործիքի սկզբնական ելքն իրականում կրկնվող էր։ --- ## Թոքենների խնայողության պատկերավոր ներկայացում ``` Առանց սեղմման՝ LLM-ին ուղարկվել է 47K թոքեն Lite-ով՝ ուղարկվել է 40K թոքեն (15% խնայողություն — անվտանգ, միշտ միացված) Standard-ով՝ ուղարկվել է 33K թոքեն (30% խնայողություն — Caveman-ի ոճի կանոններ) Aggressive-ով՝ ուղարկվել է 24K թոքեն (50% խնայողություն — հնացում + ամփոփում) Ultra-ով՝ ուղարկվել է 12K թոքեն (75% խնայողություն — էվրիստիկ զտում) RTK-ով՝ ուղարկվել է 19K-5K թոքեն (60-90% խնայողություն հրամանների/գործիքների ելքի համար) Stacked-ով՝ ուղարկվել է 10K-2.5K թոքեն (RTK+Caveman-ի կիրառելի 78-95% միջակայք) ``` --- ## Կազմաձևում ### Կառավարման վահանակ Անցեք `Կառավարման վահանակ → Համատեքստ և քեշ` բաժին՝ - **Caveman** — ռեժիմի ընտրություն, լեզվական փաթեթներ, նախադիտում և գլոբալ լռելյայն կարգավորումներ - **RTK** — հրամանների զտման նախադիտում, RTK-ի անվտանգության կարգավորումներ և զտիչների կատալոգ - **Սեղմման համակցություններ** — անվանված շարժիչային շղթաներ, որոնք վերագրված են երթուղավորման համակցություններին - **Ավտոմատ գործարկման շեմ** — ավտոմատ կերպով միացնել սեղմումը, երբ թոքենների քանակը գերազանցում է շեմը ### Յուրաքանչյուր համակցման համար վերագրում `Կառավարման վահանակ → Համատեքստ և քեշ → Սեղմման համակցություններ` բաժնում սեղմման համակցություն վերագրեք երթուղավորման համակցությանը՝ ```txt Combo: "free-tier-fallback" Compression Combo: "coding-agent-stack" Pipeline: RTK -> Caveman Targets: 1. if/kimi-k2.7-code 2. if/qwen3.8-max-preview ``` Սա թույլ է տալիս անվճար/ծրագրավորման մատակարարների դեպքում օգտագործել շղթայված սեղմում՝ վճարովի բաժանորդագրությունների համար պահպանելով թեթև ռեժիմը։ Այս «Յուրաքանչյուր համակցման համար վերագրում» կարգավորումը տարբերվում է **երթուղավորման համակցման սեղմման ռեժիմի** վերագրումից (Default/Off/Lite/Standard/Aggressive/Ultra/Codex Responses — դաշտի սխեման նաև ընդունում է `rtk`, `stacked` և `omniglyph`)․ այդ վերագրումը չի ընտրում անվանված սեղմման համակցման շղթա, այլ պարզապես սահմանում է `compressionMode` դաշտը, որն օգտագործվում է `resolveCompressionPlan`-ի կողմից։ Այն կարելի է սահմանել կա՛մ համակցման քարտում (`Կառավարման վահանակ → Համակցություններ`), կա՛մ, սկսած #6760-ից, յուրաքանչյուր երթուղավորման համակցման համար՝ «Վերագրել երթուղավորմանը» ցանկում՝ `Կառավարման վահանակ → Համատեքստ և քեշ → Սեղմման համակցություններ` բաժնում՝ անմիջապես վերևում նկարագրված շղթայի վերագրման նշատուփի կողքին։ Երկու միջերեսների փոփոխություններն էլ պահպանվում են նույն `PUT /api/combos/{id}` վերջնակետի միջոցով։ ### Յուրաքանչյուր հարցման համար վերագրում Ուղարկեք `x-omniroute-compression` հարցման վերնագիրը՝ մեկ հարցման համար սեղմման պլանը վերագրելու նպատակով։ Այն ունի ամենաբարձր առաջնահերթությունը՝ գերակայում է երթուղավորման համակցման վերագրմանը, ակտիվ պրոֆիլին, ավտոմատ գործարկմանը և վահանակի Default կարգավորմանը։ Անհայտ արժեքներն անտեսվում են (հարցումը երբեք չի մերժվում), իսկ գլոբալ գլխավոր անջատիչը շարունակում է վերահսկել ամեն ինչ․ երբ սեղմումը գլոբալ կերպով անջատված է, վերնագիրը չի կարող այն միացնել։ Արժեքներն են՝ | Արժեք | Արդյունք | | ------------- | ------------------------------------------------------------------------------------------------------------------------ | | `off` | Այս հարցման համար սեղմում չի կիրառվում։ | | `default` | Վահանակից ստացված Default պրոֆիլը (անտեսում է ակտիվ պրոֆիլը)։ Կորուստներով աշխատող շարժիչները մնում են անջատված։ | | `safe` | Նույնն է, ինչ վերնագիրը բաց թողնելը՝ միայն կրկնօրինակների հեռացում և բացատների միավորում։ | | `allow-lossy` | Պահպանում է այս հարցման օպերատորի պլանը՝ ներառյալ ամփոփումները, համապատասխանության զտիչները և ոճի վերաշարադրումները։ | | `engine:` | Մեկ շարժիչ, եթե այն միացված է, օրինակ՝ `engine:rtk`։ Սա տվյալ շարժիչը յուրաքանչյուր հարցման համար միացնելու տարբերակն է։ | | `` | Անվանված համակցություն, որը նախ համընկեցվում է ըստ անվան՝ առանց տառաչափը հաշվի առնելու, ապա՝ ըստ id-ի։ | Առանց `allow-lossy`, `engine:` կամ անվանված համակցման՝ կորուստներով աշխատող շարժիչները չեն կիրառվում։ Եթե սեղմումը միացված է, հարցման համար միևնույն է կիրառվում են աշխատաշրջանի կրկնօրինակների հեռացումը և բացատների միավորումը։ Կիրառված պլանը վերադարձվում է նաև `X-OmniRoute-Compression: ; source=` պատասխանի վերնագրում, որտեղ ``-ը հետևյալներից մեկն է՝ `request-header`, `routing-override`, `active-profile`, `auto-trigger`, `default` կամ `off`։ ### API ```bash # Ստանալ սեղմման կարգավորումները curl http://localhost:20128/api/settings/compression # Թարմացնել սեղմման կարգավորումները curl -X PUT http://localhost:20128/api/settings/compression \ -H "Content-Type: application/json" \ -d '{"defaultMode":"stacked","autoTriggerMode":"stacked","autoTriggerTokens":32000}' # Նախադիտել որոշակի RTK/stacked օգտակար բեռ curl -X POST http://localhost:20128/api/compression/preview \ -H "Content-Type: application/json" \ -d '{"mode":"rtk","messages":[{"role":"tool","content":"npm test output here"}]}' # Ցուցադրել RTK զտիչների փաթեթները curl http://localhost:20128/api/context/rtk/filters # Անմիջապես փորձարկել RTK-ն՝ հրամանի ոչ պարտադիր մետատվյալներով curl -X POST http://localhost:20128/api/context/rtk/test \ -H "Content-Type: application/json" \ -d '{"command":"npm test","text":"FAIL tests/example.test.ts\nError: boom"}' ``` --- ## Ինչն է պաշտպանվում Սեղմման շարժիչը **միշտ պահպանում է՝** - ✅ Կոդի բլոկները (սահմանազատված և ներկառուցված) - ✅ URL-ները և ֆայլերի ուղիները - ✅ JSON կառուցվածքները և կառուցվածքային տվյալները - ✅ Նույնացուցիչները և պաշտպանված տեխնիկական թոքենները - ✅ Մաթեմատիկական արտահայտությունները - ✅ Գործիքների/ֆունկցիաների կանչերի սահմանումները - ✅ Համակարգային հուշումները (Lite ռեժիմում) RTK-ի չմշակված ելքի վերականգնումը քողարկում է տարածված API բանալիները, bearer թոքենները, Slack թոքենները, AWS մուտքի բանալիները, գաղտնաբառերը, թոքենները և գաղտնիքները՝ նախքան որևէ բանի պահպանումը։ --- ## Սեղմման վիճակագրություն Յուրաքանչյուր սեղմված հարցում սերվերի գրանցամատյաններում ներառում է վիճակագրություն՝ ```json { "originalTokens": 47200, "compressedTokens": 40120, "savingsPercent": 15.0, "techniquesUsed": ["collapseWhitespace", "dedupSystemPrompt"], "mode": "lite", "engine": "caveman", "compressionComboId": "coding-agent-stack", "durationMs": 0.8, "rtkRawOutputPointers": [] } ``` --- ## Փուլերի ճանապարհային քարտեզ | Փուլ | Ռեժիմներ | Կարգավիճակ | | ------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------ | | Փուլ 1 | Անջատված, Lite | ✅ Թողարկված | | Փուլ 2 | Standard, Aggressive, Ultra | ✅ Թողարկված | | Փուլ 3 | RTK, Stacked, սեղմման համակցություններ | ✅ Թողարկված | | Փուլ 4 | Ելքի ոճեր, SLM մակարդակի Ultra, գնահատման գործիքակազմ | ✅ Թողարկված | | Փուլ 4C | Հարմարվողական համատեքստային բյուջե («կարգավորիչ») — հաշվարկային շարժիչ + API (`contextBudget`՝ `PUT /api/settings/compression`-ում) + կառավարման վահանակի ռեժիմի/քաղաքականության կառավարներ | ✅ Թողարկված | --- ## Երախտագիտություն Standard ռեժիմի սեղմման կանոնները ոգեշնչված են **[Caveman](https://github.com/JuliusBrussee/caveman)** նախագծից՝ հեղինակ **[JuliusBrussee](https://github.com/JuliusBrussee)** (⭐ 51K+)։ Սա վիրուսային տարածում գտած «ինչու օգտագործել շատ թոքեն, երբ քիչ թոքենն էլ գործը կանի» նախագիծն է։ Caveman-ը հաղորդում է ելքային թոքենների `~75%` կրճատման, հենանիշային փորձարկումներում ելքի միջին `65%` խնայողության, ելքի `22-87%` միջակայքի և մուտքի սեղմման `~46%` գործիքի մասին։ RTK ռեժիմը ոգեշնչված է **[RTK - Rust Token Killer](https://github.com/rtk-ai/rtk)** նախագծից՝ հեղինակ **[RTK AI](https://github.com/rtk-ai)**։ Այն բարձր արդյունավետությամբ հրամանների ելքի սեղմման նախագիծ է՝ տերմինալի, կառուցման, փորձարկման, git-ի և գործիքների ելքը զտելու համար։ RTK-ն հաղորդում է `60-90%` խնայողության մասին, իսկ դրա README-ի օրինակային աշխատաշրջանը ցույց է տալիս `~80%` խնայողություն։ --- ## Սեղմման առաջադեմ համակարգեր Վերը նկարագրված 7 ռեժիմներից բացի (սկզբնաղբյուրը նաև ընդունում է `codex-responses` և `omniglyph` ռեժիմները, որոնք այս ուղեցույցում չեն ներկայացվում), ստորև բերված բաժինները նկարագրում են այն հնարավորությունները, որոնք աշխատում են այդ ռեժիմների ներսում կամ դրանց հետ միասին. Գործիքի արդյունքի սեղմումը և Պրոգրեսիվ հնացումը ագրեսիվ շարժիչի 1-ին և 2-րդ քայլերն են (Aggressive ռեժիմը և շերտավորված խողովակաշարի `aggressive` քայլը), Շերտավորված խողովակաշարն այն մեխանիզմն է, որով աշխատում է Stacked ռեժիմը, Քեշը հաշվի առնող սեղմումը քեշավորում ապահովող մատակարարների համար `aggressive` և `ultra` ռեժիմները իջեցնում է մինչև `standard`, երբ սեղմումը միացված է, իսկ Քարանձավային մարդու ելքի ռեժիմը և Ելքի ոճերը ընտրովի համակարգային հուշման հրահանգներ են, որոնք լռելյայն անջատված են և հարցումը սեղմելու փոխարեն ձևավորում են մոդելի ելքը։ ### Քեշը հաշվի առնող սեղմում Որոշ մատակարարներ (օրինակ՝ Anthropic-ը՝ հուշումների քեշավորմամբ) աջակցում են **հուշումների քեշավորմանը**, ինչը թույլ է տալիս նրանց քեշավորել հուշման որոշ մասեր՝ ծախսերն ու ուշացումը նվազեցնելու համար։ Երբ քեշավորումը միացված է, ագրեսիվ սեղմումն իրականում կարող է **վատացնել** արդյունավետությունը, քանի որ այն փոխում է քեշավորված թոքենները՝ անվավեր դարձնելով քեշը։ `cachingAware.ts` մոդուլը լուծում է սա՝ **հայտնաբերելով քեշավորման համատեքստը** և համապատասխանաբար **ճշգրտելով սեղմման ռազմավարությունը**։ #### Ինչպես է այն աշխատում 1. **Քեշավորման համատեքստի հայտնաբերում** — Հարցման մարմնում որոնում է `cache_control` նշիչներ 2. **Քեշավորում ապահովող մատակարարների նույնականացում** — Ստուգում է՝ արդյոք նպատակային մատակարարն աջակցում է քեշավորմանը 3. **Ռազմավարության ճշգրտում** — Քեշավորում ապահովող մատակարարների համար `aggressive`/`ultra` ռեժիմները իջեցնում է մինչև `standard` 4. **Համակարգային հուշման բացթողում** — Համակարգային հուշումները սովորաբար քեշավորվում են, ուստի դրանք չպետք է սեղմել Ռազմավարության օժանդակ գործառույթը նաև վերադարձնում է `deterministicOnly` դրոշը, սակայն պլանը կառուցողը օգտագործում է միայն ռազմավարությունը. ներկայումս դրոշը հետագա փուլերից ոչ մեկը չի կարդում։ #### Կոդի օրինակ ```ts import { detectCachingContext, getCacheAwareStrategy, } from "@omniroute/open-sse/services/compression/cachingAware"; const body = { model: "anthropic/claude-sonnet-4.5", messages: [{ role: "user", content: "Hello" }], cache_control: { type: "ephemeral" }, // ← Քեշի նշիչ }; const ctx = detectCachingContext(body, { provider: "anthropic" }); // → { hasCacheControl: true, provider: "anthropic", targetFormat: null, isCachingProvider: true } const strategy = getCacheAwareStrategy("aggressive", ctx); // → { strategy: "standard", skipSystemPrompt: true, deterministicOnly: true } ``` #### Երբ օգտագործել Քեշը հաշվի առնող սեղմումը **միշտ միացված է**. կազմաձևում չի պահանջվում։ Այն գործարկվում է ամեն անգամ, երբ սեղմումը միացված է, և նպատակային մատակարարն աջակցում է հուշումների քեշավորմանը (Anthropic, OpenAI և այլն). բացահայտ `cache_control` նշիչները պարտադիր չեն. միայն քեշավորում ապահովող մատակարարի առկայությունն արդեն առաջացնում է ռեժիմի իջեցում, իսկ միայն նշիչները երբեք դա չեն անում (նշիչների հայտնաբերումն օգտագործվում է քեշի հեռաչափության, ոչ թե ռազմավարության որոշման համար)։ ### Պրոգրեսիվ հնացում Երկար զրույցներում կուտակվում են հաղորդագրությունների բազմաթիվ հերթեր, սակայն ավելի հին հերթերը դառնում են պակաս արդիական։ `progressiveAging.ts` մոդուլը **հաղորդագրությունների մանրամասնությունը նվազեցնում է ըստ հերթի հեռավորության** (հեռավորությունը չափվում է զրույցի վերջից)։ Առաքվող լռելյայն արժեքներով (`verbatim: 2, light: 2, moderate: 3`)՝ - **Վերջին 2 հերթերը (հեռավորություն ≤ 2)**. Պահվում են բառացի - **Հեռավորություն 3**. Քարանձավային մարդու ոճով սեղմում (լցոնող բառերի հեռացում) - **Հեռավորություն 4+**. Օգնականի հաղորդագրություններն ամփոփվում են, իսկ օգտատիրոջ հաղորդագրությունները կրճատվում են մինչև իրենց առաջին տողը՝ առավելագույնը 120 նիշով. մյուս դերերը մնում են անփոփոխ։ Համակարգային հուշումները, արդեն հնացված հաղորդագրությունները և օգտատիրոջ վերջին հաղորդագրությունը միշտ պահվում են բառացի՝ անկախ հեռավորությունից։ Ոչինչ ամբողջությամբ չի հեռացվում, իսկ `light` միջակայքն անհասանելի է առաքվող լռելյայն արժեքներով (`light`-ը հավասար է `verbatim`-ին)։ #### Կոդի օրինակ ```ts import { applyAging } from "@omniroute/open-sse/services/compression/progressiveAging"; const messages = [ { role: "system", content: "You are a helpful assistant" }, { role: "user", content: "What is 2+2?" }, { role: "assistant", content: "4" }, // ... ևս 50 հերթ ... ]; const { messages: aged, saved } = applyAging(messages, { verbatim: 3, // վերջին 3 հերթերը՝ բառացի light: 8, // հեռավորություն <= 8՝ թեթև սեղմում moderate: 20, // հեռավորություն <= 20՝ քարանձավային մարդու ոճով սեղմում fullSummary: 5, // պահանջվում է տիպի կողմից, սակայն միջակայքերի որոշման կոդը չի կարդում // հեռավորություն > 20՝ ամփոփվում է (օգնական) / պահպանվում է առաջին տողը (օգտատեր) }); // saved = խնայված թոքենների քանակը ``` #### Երբ օգտագործել Պրոգրեսիվ հնացումը **միշտ միացված է** `aggressive` ռեժիմի համար. այն `compressAggressive()`-ի 2-րդ քայլն է։ Ultra ռեժիմը դա չի գործարկում։ Այն հատկապես արդյունավետ է հետևյալ դեպքերում՝ - Երկարատև ծրագրավորման աշխատաշրջաններ - Բազմօրյա զրույցներ - Բազմաթիվ գործիքային կանչերով գործակալային աշխատանքային հոսքեր ### Քարանձավային մարդու ելքի ռեժիմ Քարանձավային մարդու ելքի ռեժիմն ավելացնում է **համակարգային հուշման հրահանգներ**, որոնք մոդելին խնդրում են հակիրճ ելք տրամադրել. `lite` մակարդակը խնդրում է տալ հակիրճ պատասխաններ՝ պահպանելով ամբողջական նախադասությունները, `full` մակարդակը խնդրում է «պատասխանել հակիրճ՝ խելացի քարանձավային մարդու նման», իսկ `ultra` մակարդակը խնդրում է հեռագրային ելք. հրահանգները միայն խնդրում են և չեն կարող դա երաշխավորել։ Հարցումներն այդ հրահանգները ստանում են `applyOutputStyles()`-ի միջոցով (`open-sse/services/compression/outputStyles/apply.ts`). `open-sse/handlers/chatCore.ts`-ը նախ ընտրությունը որոշում է հետադարձ համատեղելիության միջադիրի միջոցով (`resolveOutputStyleSelection()`՝ `open-sse/services/compression/outputStyles/backCompat.ts`-ում), որը, երբ `outputStyles`-ը դատարկ է, միացված `cavemanOutputMode`-ը վերածում է `terse-prose` ելքի ոճի՝ `cavemanOutputMode.intensity` ուժգնությամբ (տե՛ս ստորև՝ Հետադարձ համատեղելիություն). ոչ դատարկ `outputStyles` ընտրությունն օգտագործվում է անփոփոխ, և այդ դեպքում `cavemanOutputMode.enabled`-ն ու `intensity`-ն այլևս ազդեցություն չունեն, մինչդեռ դրա `autoClarity` փոխարկիչը շարունակում է կիրառվել։ `outputMode.ts`-ը պարունակում է հրահանգների տեքստերը (`CAVEMAN_INSTRUCTION_BY_LANGUAGE`), բովանդակության շրջանցումը և տեղադրման օժանդակ գործառույթը, որն օգտագործվում է ներարկման ժամանակ. դրա սեփական `applyCavemanOutputMode()` ներարկիչը արտադրական միջավայրում կանչող չունի։ #### Ինչպես է այն աշխատում Այս ռեժիմը չի սեղմում մուտքային տվյալները։ Այն հրահանգների բլոկ է ավելացնում համակարգային հուշմանը (տե՛ս ստորև՝ Ինչպես է աշխատում ներարկումը), իսկ հարցման համար ընտրված մուտքային տվյալների սեղմման ցանկացած ռեժիմ այնուհետև շարունակում է գործել այն բովանդակության վրա, որն արդեն պարունակում է այդ բլոկը։ Բոլոր մակարդակներն ավարտող ընդհանուր սահմանափակումների դրույթից առաջ անգլերեն `full` մակարդակում գրված է․ > «Պատասխանիր հակիրճ՝ խելացի քարանձավային մարդու պես։ Բաց թող հոդերը (a/an/the), ավելորդ բառերը (just/really/basically/actually/simply), քաղաքավարի արտահայտությունները, վերապահումները։ Թերի նախադասությունները թույլատրելի են։ Օգտագործիր կարճ հոմանիշներ (big, ոչ թե extensive, fix, ոչ թե implement)։ Ամբողջ տեխնիկական բովանդակությունը, կոդը, սխալները, URL-ները և նույնացուցիչները պահիր ճշգրիտ»։ Սա հատկապես լավ է աշխատում հետևյալ դեպքերում․ - Կոդի ստեղծում (ավելի հակիրճ արդյունք = ավելի քիչ թոքեններ) - Արագ հարցուպատասխան (մանրամասն բացատրությունների կարիք չկա) - Փաթեթային մշակում (առավելագույն թողունակություն) #### Երբ օգտագործել Քարանձավային մարդու ելքային ռեժիմը **միացվում է ըստ ցանկության**։ Երբ սեղմումը միացված է (`enabled: true`, Compression Settings էջի գլխավոր փոխանջատիչը միացված է), այն միացրեք `cavemanOutputMode.enabled`-ի միջոցով․ `intensity`-ն ընտրում է `lite`, `full` կամ `ultra`․ ```json { "enabled": true, "cavemanOutputMode": { "enabled": true, "intensity": "full" } } ``` Սեղմման համադրության **Output Mode** փոխանջատիչը (`outputMode`, իսկ մակարդակը՝ `outputModeIntensity`) նույն կարգավորումն է սահմանում այն հարցումների համար, որոնց վրա կիրառվում է այդ համադրությունը, իսկ `omniroute_set_compression_engine` MCP գործիքը այն գրանցում է իր բուլյան `outputMode` արգումենտի միջոցով։ Ոչ դատարկ `outputStyles` ընտրությունը գերակայում է այս փոխանջատիչի նկատմամբ։ Կառավարման վահանակում **Terse prose** ելքային ոճը միացնելիս ներարկվում է նույն բլոկը (տե՛ս ստորև՝ Output Styles)։ ### Ելքային ոճեր (կատալոգ) Վերևում նկարագրված քարանձավային մարդու ելքային ռեժիմը **հին մեկ ոճով ուղին** է։ 4-րդ փուլում այն ընդհանրացվեց՝ վերածվելով համատեղելի ելքային ոճերի կատալոգի՝ `OUTPUT_STYLE_CATALOG`, որը գտնվում է `open-sse/services/compression/outputStyles/catalog.ts`-ում։ Յուրաքանչյուր ոճ համակարգային հուշման հրահանգ է, որը մոդելից պահանջում է ավելի քիչ ծախսատար ելք․ ոճերը կարող են միացվել միաժամանակ և ներարկվում են կատալոգի հերթականությամբ։ | Ոճ | `id` | Ինչ է անում | Հրահանգների լեզուներ | | ----------------------------------- | --------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------- | | Հակիրճ արձակ | `terse-prose` | Բաց է թողնում ավելորդ բառերը/հոդերը/վերապահումները, տեխնիկական բովանդակությունը պահում է ճշգրիտ։ Նույն տեքստն է, ինչ քարանձավային մարդու հին ելքային ռեժիմում (հղվում է, կրկին չի գրվում)։ | en, pt-BR, es, de, fr, it, ru, zh, ja, id, vi | | Ավելի քիչ կոդ | `less-code` | YAGNI սանդղակ․ նվազագույն աշխատող փոփոխություն, առանց չպահանջված աբստրակցիաների։ | en, pt-BR, es, de, fr, it, ru, zh, ja, id, vi | | Ձիու պոչ (ծույլ ավագ ծրագրավորող) | `ponytail` | «Լավագույն կոդը երբեք չգրված կոդն է»․ վերաօգտագործում > վերագրում, սկզբնապատճառ > ախտանիշ, ամենակարճ աշխատող տարբերություն։ | en, pt-BR, es, de, fr, it, ru, zh, ja, id, vi | | Ես ունեմ ADHD (նախ՝ գործողությունը) | `i-have-adhd` | Նախ՝ գործողությունը (հրաման/ուղի/հատված՝ արձակից առաջ), համարակալված և սահմանափակ քայլեր, ՄԵԿ կոնկրետ հաջորդ քայլ, առանց նախաբանի/ամփոփման/եզրափակիչ խոսքի։ Հարմարեցված է [ayghri/i-have-adhd](https://github.com/ayghri/i-have-adhd)-ից (MIT)։ | en, pt-BR, es, de, fr, it, ru, zh, ja, id, vi | | Antislop UI զտիչ | `antislop-ui` | Յուրաքանչյուր տեսողական հնարք պետք է անցնի նպատակի ստուգում (հիերարխիա, ինքնություն, ընթեռնելիություն)․ առանց լռելյայն գրադիենտների/ապակու/փայլի, սահմանափակ գունապնակով և առանց ձևանմուշային դասավորությունների։ Երկու antislop ոճերն էլ ավելացնում են չաշխատող կառավարիչ տարրերն ու հորինված պնդումներն արգելող սահմանափակում։ | en, pt-BR, es, de, fr, it, ru, zh, ja, id, vi | | Antislop տեքստային և մարդկային զտիչ | `antislop-copy` | Կոնկրետ տեքստ (առանց երկար գծիկի, ընդհանուր CTA-ների, նորաձև բառերի, չաթբոտային եզրափակումների, հորինված փաստերի), ինչպես նաև մարդկանց համար կանոններ․ WCAG AA հակադրություն, տեսանելի ֆոկուս, ստեղնաշարով հասանելիություն, դատարկ/բեռնման/սխալի վիճակներ, բջջային վերադասավորում։ | en, pt-BR, es, de, fr, it, ru, zh, ja, id, vi | | Հակիրճ CJK (文言) | `terse-cjk` | `full`/`ultra` պատասխանը դասական չինարենով է (文言), իսկ `lite`-ը միայն պահանջում է հակիրճ պատասխաններ՝ առանց սպասարկու բառերի, քաղաքավարի արտահայտությունների կամ զարդարանքի։ | zh (սահմանափակված ըստ տեղայնացման, տե՛ս ստորև) | Յուրաքանչյուր ոճ ունի ինտենսիվության երեք մակարդակ՝ `lite`, `full`, `ultra`, և յուրաքանչյուր մակարդակ ավարտվում է ընդհանուր սահմանափակումների դրույթով (`SHARED_BOUNDARIES`՝ `outputMode.ts`-ում), որը կոդի բլոկները, ֆայլերի ուղիները, հրամանները, սխալները և URL-ները պահում է ճշգրիտ։ `terse-prose` և `terse-cjk` մակարդակների տեքստերն այդ ցանկին ավելացնում են նաև նույնացուցիչները։ `terse-cjk`-ն երկու տեղում սահմանափակված է `zh` տեղայնացմամբ։ Compression Settings էջը դրա տողը ցուցադրում է միայն այն դեպքում, երբ կառավարման վահանակի միջերեսի լեզուն չինարեն է (`zh-CN` կամ `zh-TW`), իսկ `applyOutputStyles()`-ն այն ներարկում է միայն այն դեպքում, երբ հարցման որոշված լեզուն (տե՛ս ստորև՝ Լեզվի ընտրություն) `zh` է։ Տողը թաքցնելը չի մաքրում պահպանված `terse-cjk` ընտրությունը․ կարգավորումների API-ն ընդունում է ցանկացած ոճի id, իսկ էջում այլ ոճեր պահպանելիս այն պահպանվում է։ Հարցման ժամանակ `applyOutputStyles()`-ի լեզվի ստուգումը տեղայնացման միակ սահմանափակումն է։ #### Ինչպես է աշխատում ներարկումը `applyOutputStyles()`-ը (`open-sse/services/compression/outputStyles/apply.ts`) ընտրությունը համադրում է կատալոգի հետ (անհայտ id-ներով և տեղայնացմանը չհամապատասխանող ոճերը հեռացվում են և երբեք սխալ չեն առաջացնում․ որևէ ոճի չհամապատասխանող ընտրությունը մարմինը թողնում է անփոփոխ և բաց է թողնվում որպես `no_styles`), ընտրված հրահանգները միավորում է կատալոգի հերթականությամբ, սահմանների դրույթն ավելացնում է **մեկ անգամ** (ինչպես նաև անվտանգության դրույթը՝ `SAFETY_BOUNDARIES`-ը կամ դրա թարգմանությունը, երբ ընտրված է `less-code`-ը կամ `ponytail`-ը) և բլոկը սկսում է իդեմպոտենտության մեկ նշիչով (`[OmniRoute Output Styles]`), ուստի կրկին կիրառելը որևէ ազդեցություն չի ունենում։ Երբ որոշված լեզվի համար (տե՛ս ստորև՝ «Լեզվի ընտրություն») առկա է թարգմանություն, անգլերեն հրահանգի փոխարեն ներդրվում է տեղայնացված հրահանգը։ Ոչ դատարկ `messages` զանգված ունեցող մարմնի դեպքում իդեմպոտենտության ստուգումը կատարվում է բովանդակության շրջանցումից առաջ․ երբ `[OmniRoute Output Styles]` նշիչն արդեն առկա է վերին մակարդակի `system` դաշտում (տող կամ բովանդակության բլոկների զանգված) կամ տողային բովանդակությամբ համակարգային հաղորդագրության մեջ, մարմինը մնում է անփոփոխ՝ որպես `already_applied`, և հիմնաբառերի ստուգում չի կատարվում։ Հակառակ դեպքում բովանդակության շրջանցումը (`shouldBypassCavemanOutputMode()`՝ `open-sse/services/compression/outputMode.ts`-ում) ստուգում է վերջին երեք հաղորդագրությունների տեքստը՝ անկախ դրանց դերից, և բաց է թողնում ոճերն ամբողջ ընթացիկ քայլի համար, երբ այդ տեքստը համապատասխանում է անվտանգության, անդառնալի գործողության կամ պարզաբանման հիմնաբառերին, կամ հերթականությունից կախված շղթայի՝ `first`, `then`, `after that`, `before`, `rollback` կամ `backup`, որին 240 նիշի սահմաններում հաջորդում է `delete`, `drop`, `migrate`, `deploy` կամ `release`։ Շրջանցումն աշխատում է, քանի դեռ **Auto-Clarity Bypass** փոխարկիչը (`cavemanOutputMode.autoClarity`, լռելյայն միացված) միացված է․ փոխարկիչն անջատելիս հիմնաբառերի ստուգումը բաց է թողնվում։ Երբ շրջանցումը թույլ է տալիս մշակել ընթացիկ քայլը, `placeSystemInstruction()`-ը (նույն ֆայլում), որը երբեք նոր `messages[0]` չի ստեղծում, բլոկը տեղադրում է իր գտած հետևյալ տարբերակներից առաջինում․ 1. Սկզբում գտնվող՝ տողային բովանդակությամբ համակարգային հաղորդագրություն․ բլոկն ավելացվում է դրա տեքստից հետո։ 2. Վերին մակարդակի `system` դաշտ․ բլոկն ավելացվում է տողի տեքստից հետո կամ որպես նոր տեքստային բլոկ՝ բովանդակության բլոկների զանգվածում։ 3. Հետագայում հանդիպող առաջին՝ տողային բովանդակությամբ համակարգային հաղորդագրություն․ բլոկն ավելացվում է դրա տեքստից հետո։ 4. Վերոնշյալներից ոչ մեկը․ բլոկը տեղադրվում է `messages`-ի վերջում ավելացված նոր համակարգային հաղորդագրության մեջ։ `messages` զանգված չունեցող (կամ դատարկ զանգված ունեցող) մարմնի դեպքում բովանդակության շրջանցում չի կատարվում, իսկ վերին մակարդակի `system` դաշտը չի դիտարկվում։ Բլոկն ավելացվում է տողային `instructions` դաշտի տեքստից հետո, եթե այդ դաշտն արդեն չի պարունակում `[OmniRoute Output Styles]` նշիչը, որի դեպքում մարմինը մնում է անփոփոխ՝ որպես `already_applied`։ Երբ մարմինը չունի տողային `instructions` դաշտ, սակայն պարունակում է `input` (տող կամ զանգված), բլոկը դառնում է `instructions`՝ փոխարինելով այդ դաշտում եղած ցանկացած ոչ տողային արժեք։ Մարմինը, որը չունի ո՛չ տողային `instructions` դաշտ, ո՛չ էլ տող կամ զանգված հանդիսացող `input`, մնում է անփոփոխ և բաց է թողնվում որպես `no_messages`։ #### Ինչպես միացնել Կառավարման վահանակում՝ **Compression Context → Compression Settings** (`/dashboard/context/settings`), Output styles բաժին․ յուրաքանչյուր ոճի համար կա մեկ տող՝ միացման/անջատման փոխարկիչով և մակարդակի ընտրիչով։ Ոճերը ներդրվում են, երբ սեղմումն ինքնին միացված է (էջի գլխավոր փոխարկիչը՝ `enabled`)։ **Auto-Clarity Bypass** փոխարկիչը գտնվում է **Caveman** էջում (`/dashboard/context/caveman`)՝ դրա **Output Mode** քարտում։ Ծրագրային եղանակով սեղմման կազմաձևը պահպանում է ընտրությունը հետևյալ ձևով․ ```json { "outputStyles": [ { "id": "i-have-adhd", "level": "full" }, { "id": "less-code", "level": "lite" } ] } ``` Հետադարձ համատեղելիություն․ քանի դեռ `outputStyles`-ը դատարկ է, հին `cavemanOutputMode.enabled` կարգավորումը համապատասխանեցվում է `terse-prose`-ին՝ `cavemanOutputMode.intensity` ինտենսիվությամբ։ Այդ դեպքում բլոկը սկսվում է `[OmniRoute Output Styles]` նշիչով, մինչդեռ հին `applyCavemanOutputMode()` ներդրիչը գրում էր `[OmniRoute Caveman Output Mode]`։ Նշիչից ներքև տեքստը համապատասխանում է հին ներդրմանը en, pt-BR, es, de, fr, it, ru, id և vi լեզուներով․ ja և zh լեզուներում այն սահմանների դրույթից առաջ ունի մեկ լրացուցիչ բացատ։ `terse-prose`-ը թարգմանվում է pt-BR, es, de, fr, it, ru, zh, ja, id և vi լեզուներով, ուստի այն հարցումը, որի որոշված լեզուն `hu` է, ստանում է անգլերեն տեքստը, մինչդեռ հին ներդրիչն օգտագործում էր հունգարերեն տարբերակը։ Ելքային ոճի լեզվի ընտրություն (`resolveOutputStyleLanguage()`՝ `outputStyles/apply.ts`-ում)․ երբ `languageConfig.enabled`-ը միացված է, `autoDetect`-ը նմուշառում է հարցման `messages` զանգվածի տեքստ ունեցող վերջին օգտատիրոջ հաղորդագրությունը (տողային բովանդակությունը կամ դրա բովանդակության մասերի `text`-ը) և դրա վրա գործարկում է Caveman շարժիչի հայտնաբերիչը (`detectCompressionLanguage()`)։ Հայտնաբերիչը վերադարձնում է `zh`՝ հան նշաններ, բայց ոչ կանա պարունակող տեքստի համար․ հակառակ դեպքում այն վերադարձնում է `it`, `pt-BR`, `es`, `de`, `fr`, `ru`, `ja`, `hu` և `id` տարբերակներից այն մեկը, որն ունի ամենաշատ ակնարկային համընկնումները, իսկ համընկնումների բացակայության դեպքում՝ `en`։ Այն տեքստը, որը հնարավոր չէ դասակարգել, ստանում է անգլերեն, այլ ոչ թե `defaultLanguage`, իսկ `vi`-ն երբեք չի հայտնաբերվում, թեև ոճերը ներառում են `vi` տեքստ։ Responses API-ի մարմինն իր քայլերը պահում է `input`-ում, որը չի նմուշառվում, ուստի այն սկզբում ստանում է `defaultLanguage`, ապա՝ անգլերեն։ Երբ `messages`-ում օգտատիրոջ ոչ մի հաղորդագրություն տեքստ չունի կամ երբ `autoDetect`-ն անջատված է, կիրառվում է `defaultLanguage`, ապա՝ անգլերեն։ Երբ `languageConfig.enabled`-ն անջատված է, լեզուն անգլերենն է, եթե հարցման նկատմամբ չի կիրառվում սեղմման որևէ համակցություն (հարցման երթուղավորման համակցությանը նշանակված համակցություն կամ լռելյայն սեղմման համակցությունը, որին chatCore-ը վերադառնում է ներկառուցված բազմաշերտ խողովակաշարի համար)։ Համակցություն կիրառելը տվյալ հարցման համար միացնում է `languageConfig.enabled`-ը և `defaultLanguage`-ը սահմանում համակցության լեզվային փաթեթներից (պահված արժեքը, եթե այն համակցության փաթեթներից մեկն է, հակառակ դեպքում՝ համակցության առաջին փաթեթը, որի լռելյայն արժեքը `en` է), մինչդեռ պահպանված `autoDetect`-ը (լռելյայն միացված) շարունակում է կիրառվել։ Caveman մուտքային շարժիչն իր կանոնների փաթեթի լեզուն ընտրում է այլ կերպ՝ ըստ յուրաքանչյուր տեքստային մասի, իսկ ավտոմատ հայտնաբերումն անջատված լինելու դեպքում՝ `enabledPacks`-ով սահմանափակված։ Ոճ × լեզու մատրիցը ամրագրված է `tests/unit/compression/output-styles-i18n-matrix.test.ts`-ով. կատալոգի յուրաքանչյուր ոճ պետք է գրառում ունենա թեստի `BASELINE_LANGUAGES`-ում. locale-ով չսահմանափակված ոճը պետք է ներառի pt-BR թարգմանություն (locale-ով սահմանափակված `terse-cjk`-ն ազատված է այս կանոնից), եթե այն նշված չէ `KNOWN_ENGLISH_ONLY`-ում, որը կարող է պարունակել միայն ընդհանրապես թարգմանություններ չունեցող ոճեր — ցանկում նշված ոճը, որն ունի որևէ թարգմանություն, չի անցնում թեստը. ինչպես նաև ոճը չի անցնում թեստը, երբ կորցնում է իր `BASELINE_LANGUAGES` գրառման մեջ նշված լեզուներից մեկը։ Ոճ ավելացնելու համար տե՛ս [EXTENDING_COMPRESSION.md](./EXTENDING_COMPRESSION.md#adding-an-output-style)։ ### Գործիքի արդյունքի սեղմում `open-sse/services/compression/toolResultCompressor.ts`-ում գտնվող `compressToolResult()`-ը սեղմում է գործիքի արդյունքի տեքստը՝ կիրառելով **5 ռազմավարություն**։ Այն փորձում է դրանք այս հերթականությամբ, և առաջին միացված ռազմավարությունը, որի ստուգումը համապատասխանում է բովանդակությանը, որոշում է արդյունքը. 1. **`fileContent`**. 3 կամ ավելի տողից բաղկացած բովանդակությունը, որում առնվազն մեկ տող, անտեսելով սկզբի նահանջը, սկսվում է `import `, `export `, `function `, `class `, `const `, `let `, `var ` կամ `return `-ով (բանալի բառը՝ գումարած բացատ), կամ `if`, `for` կամ `while`-ով, որին հաջորդում է `(` կամ ` (`, պահպանում է իր առաջին 20 և վերջին 5 տողերը՝ բաց թողնված միջնամասը նշելով։ 2. **`grepSearch`**. առնվազն մեկ `::` ձևաչափով տող պարունակող բովանդակությունը, որտեղ առաջին երկու կետից առաջ գտնվող տեքստը բացատանիշեր չունի, պահպանում է միայն այդ տողերը՝ առավելագույնը 30, որոնց հաջորդում են մնացած համընկնումների քանակը և համընկած ֆայլերի ցանկը. մնացած բոլոր տողերը հեռացվում են։ Մեկ այդպիսի տողը բավական է ռազմավարությունը գործարկելու համար, ուստի `12:30:45`-ի նման ժամադրոշմով սկսվող մատյանի տողը նույնպես հաշվվում է։ 3. **`shellOutput`**. ANSI CSI հաջորդականություն (`ESC[`, ապա թվանշաններ կամ կետ-ստորակետեր, այնուհետև տառ, ինչպես գունային կոդերում) կամ տեքստի որևէ հատվածում `$`, որին հաջորդում է բացատանիշ, պարունակող արտածումը կորցնում է այդ հաջորդականությունները (այլ escape հաջորդականությունները, օրինակ՝ `ESC[?25l`-ը կամ OSC պատուհանի վերնագրի հաջորդականությունը, պահպանվում են) և պահպանում է իր վերջին 50 տողերը՝ հաջորդական կրկնվող տողերը միավորելով։ Քանի որ այս ստուգումը կատարվում է `json`-ից և `errorMessage`-ից առաջ, այդպիսի `$` պարունակող JSON-ը կամ սխալի արտածումը երբեք չի հասնում դրանց, քանի դեռ `shellOutput`-ը միացված է։ 4. **`json`**. 2,000 նիշից ավելի JSON ծանրաբեռնվածությունը, որը սկսվում է `{`-ով կամ `[`-ով (ըստ ցանկության բացատանիշերից հետո) և հաջողությամբ վերլուծվում է, ամփոփվում է. 7-ից ավելի տարր ունեցող զանգվածը պահպանում է իր առաջին 5 և վերջին 2 տարրերը և տարրերի ընդհանուր քանակը, իսկ օբյեկտը պահպանում է իր առաջին 20 բանալիները՝ յուրաքանչյուր ներդրված օբյեկտի կամ զանգվածի արժեքը փոխարինելով `{…N keys}` տեղապահիչով (զանգվածի դեպքում N-ը դրա երկարությունն է) և առաջին 20-ից հետո հեռացված բանալիները հաշվարկող `_remaining__keys` նշիչով։ Սկալյար արժեքներն ամբողջությամբ պատճենվում են, ուստի 20 կամ պակաս բանալի ունեցող և ներդրված արժեքներ չունեցող օբյեկտը միայն վերաձևաչափվում է՝ նահանջներով. մինիմիզացված տարբերակը նիշեր է ավելացնում և մնում է անփոփոխ։ 5. **`errorMessage`**. արտածումը, որը որևէ հատվածում և տառերի ցանկացած ռեգիստրով պարունակում է `error:`, `error ` (բառը, որին հաջորդում է բացատ, ինչպես `no error found`-ում), `[error]`, `exception:`, `exception `, `[exception]` կամ `traceback`, պահպանում է իր առաջին տողը, հաջորդ 10 տողերը և վերջին 3-ը՝ դրանց միջև գտնվող տողերի փոխարեն տեղադրելով `… [N frames elided] …` նշիչը։ Նշիչը հայտնվում է միայն այն դեպքում, երբ առաջին տողից հետո կա ավելի քան 13 տող, ուստի 14 կամ պակաս տող ունեցող սխալի արտածումը չի կրճատվում (12 կամ 13 տողի դեպքում վերջին 3-ը կրկնում են արդեն պահպանված տողերը)։ Ռազմավարության համապատասխանեցումից հետո, նույնիսկ եթե այն ոչինչ չի խնայում, հետագա ռազմավարությունները չեն փորձարկվում։ Երբ համապատասխանող ռազմավարությունը չի խնայում գնահատված token-ներ (երկարությունը ÷ 4՝ կլորացված դեպի վեր) — օրինակ՝ կոդանման ֆայլ 25 կամ պակաս տողով, կամ 2,000 նիշից ավելի JSON զանգված՝ 7 կամ պակաս տարրով, ագրեսիվ շարժիչը պահպանում է գործիքի սկզբնական արդյունքը. երկու կանչողներն էլ (`compressAggressive()` և `compressAnthropicToolResultBlock()`) պահպանում են սկզբնականը, երբ `saved`-ը 0 կամ պակաս է, մինչդեռ `compressToolResult()`-ն ինքը միևնույն է վերադարձնում է այդ ռազմավարության արտածումը։ Գործիքի արդյունքի քայլը վերջնական որոշումը չէ. շարժիչի պահուստային ամփոփիչը դեռ կարող է կրճատել 8,192 նիշից երկար `tool` կամ `function` հաղորդագրությունը (`maxTokensPerMessage`, 2,048՝ բազմապատկած 4-ով)։ #### Երբ օգտագործել Գործիքի արդյունքի սեղմումը ագրեսիվ շարժիչի 1-ին քայլն է (`compressAggressive()`՝ `open-sse/services/compression/aggressive.ts`-ում), ուստի այն գործարկվում է Aggressive ռեժիմում և դարսված pipeline-ի `aggressive` քայլում։ Այն սեղմում է OpenAI ձևաչափի `tool` և `function` հաղորդագրությունները և Anthropic-ի `tool_result` բլոկների ներսում գտնվող տեքստը։ Յուրաքանչյուր ռազմավարություն ունի իր անջատիչը `aggressive.toolStrategies`-ում, և բոլորն էլ լռելյայն միացված են։ Dashboard-ում անջատիչները գտնվում են Caveman էջի **Advanced** տեսքում, երբ սեղմումը միացված է, իսկ լռելյայն ռեժիմը Aggressive է։ ### Դարսված pipeline Դարսված ռեժիմը **մի քանի շարժիչներ է հաջորդաբար գործարկում**՝ սովորաբար սկզբում RTK (գործիքի արտածման 60-90% խնայողություն), ապա Caveman՝ մնացած տեքստի վրա (~46% մուտքային խնայողություն)։ Համակցված՝ դա կազմում է **78-95% կիրառելի միջակայք** (տե՛ս վերևում Upstream Savings Math-ը). `1 - (1 - 0.60..0.90) × (1 - 0.46)`-ի միջինը ≈89% է։ #### Ինչպես է այն աշխատում ``` Մուտք (1000 token) → RTK (հրամանները հաշվի առնող զտիչ) → 200 token → Caveman (լցոնիչ տեքստի հեռացում) → 108 token → Ելք (108 token, ~89% խնայողություն) ``` #### Երբ օգտագործել Օգտագործեք դարսված ռեժիմը հետևյալի համար. - Գործիքներով հարուստ աշխատանքային հոսքեր (ագենտային ծրագրավորում, հետազոտություն) - Ծախսազգայուն փաթեթային մշակում - Երբ անհրաժեշտ է token-ների առավելագույն խնայողություն Դարսված pipeline-ները կազմաձևվում են գլոբալ `stackedPipeline` սեղմման կարգավորման միջոցով կամ routing combo-ին նշանակված անունով compression combo-ի միջոցով (տե՛ս վերևում Per-Combo Override-ը), այլ ոչ թե auto-combo-ի `modePack`-ի միջոցով (այդ դաշտը միայն վերակշռում է auto-combo-ի մոդելի ընտրությունը, իսկ `stacked`-ը վավեր pack անուն չէ)։ --- ## Կոմպրեսիայի համակցությունների վերասահմանումներ Դուք կարող եք վերասահմանել կոմպրեսիայի գլոբալ ռեժիմը **յուրաքանչյուր համակցության համար առանձին**՝ տարբեր օգտագործման դեպքերում վարքագիծը ճշգրտելու նպատակով. ```json { "id": "coding-combo", "strategy": "priority", "config": { "weights": { "taskFit": 0.5 }, "modePack": "quality-first" }, "compressionOverride": "aggressive" } ``` Սա օգտակար է հետևյալ դեպքերում. - **Ծրագրավորման համակցություններ**. երկարատև աշխատաշրջանների համար օգտագործեք `aggressive` ռեժիմը - **Արագ հարցուպատասխանի համակցություններ**. արագ պատասխանների համար օգտագործեք `lite` ռեժիմը - **Գործիքների ինտենսիվ օգտագործմամբ համակցություններ**. առավելագույն խնայողության համար օգտագործեք `stacked` ռեժիմը - **Արտադրական համակցություններ**. քեշավորում ապահովող մատակարարների դեպքում վերասահմանումն անջատված թողեք. մշտապես միացված՝ քեշավորումը հաշվի առնող ճշգրտումն ավտոմատ կերպով իջեցնում է `aggressive`/`ultra` ռեժիմները մինչև `standard` (ընտրելի `cache-aware` ռեժիմ գոյություն չունի) --- ## Տես նաև - [Միջավայրի կազմաձևում](../reference/ENVIRONMENT.md) — Կոմպրեսիայի միջավայրի փոփոխականներ - [Ճարտարապետության ուղեցույց](../architecture/ARCHITECTURE.md) — Կոմպրեսիայի մշակման շղթայի ներքին կառուցվածքը - [Օգտագործողի ուղեցույց](../guides/USER_GUIDE.md) — Կոմպրեսիայի օգտագործման սկիզբը - [RTK կոմպրեսիա](./RTK_COMPRESSION.md) — RTK զտիչներ, վստահության մոդել, ստուգման դարպաս, չմշակված ելքի վերականգնում - [Կոմպրեսիայի շարժիչներ](./COMPRESSION_ENGINES.md) — Caveman, RTK, stacked, API-ներ, MCP, կառավարման վահանակ - [Կոմպրեսիայի կանոնների ձևաչափ](./COMPRESSION_RULES_FORMAT.md) — JSON կանոնների փաթեթի ձևաչափ - [Կոմպրեսիայի լեզվական փաթեթներ](./COMPRESSION_LANGUAGE_PACKS.md) — Լեզվին հատուկ Caveman կանոններ