# 🗜️ 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) · 🇫🇮 [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) · 🇦🇲 [hy](../../../hy/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%) → استاندارد: حذف کلمات زائد به سبک Caveman (~30%) → تهاجمی: قدیمیسازی تاریخچه + خلاصهسازی (~50%) → فوقفشرده: هرس اکتشافی + تُنُکسازی بلوکهای کد (~75%) → RTK: پالایش آگاه از فرمانِ خروجی ترمینال/ابزار (بازهٔ بالادستی 60-90%) → انباشته: خط لولهٔ چندموتورهٔ مرتب، معمولاً ابتدا RTK و سپس Caveman (بازهٔ واجد شرایط 78-95%) → درخواست فشردهشده → ارائهدهنده ``` --- ## حالتهای فشردهسازی ### خاموش هیچ فشردهسازیای اعمال نمیشود. همهٔ پیامها بدون تغییر عبور میکنند. ### حالت سبک (~15% صرفهجویی، <1ms تأخیر) ایمنترین حالت — بدون هیچ تغییر معنایی و فقط با پاکسازی قالببندی: | تکنیک | توضیحات | | ------------------------ | ----------------------------------------- | | `collapseWhitespace` | ادغام خطوط خالی متوالی و فاصلههای انتهایی | | `dedupSystemPrompt` | حذف پیامهای سیستمی تکراری | | `compressToolResults` | فشردهسازی خروجیهای پرحجم ابزار/تابع | | `removeRedundantContent` | حذف دستورالعملهای تکراری | | `replaceImageUrls` | کوتاهسازی URIهای دادهٔ base64 تصاویر | **مناسب برای:** استفادهٔ دائمی و گردشکارهای حساس به ایمنی. ### حالت استاندارد (~30% صرفهجویی) با الهام از [Caveman](https://github.com/JuliusBrussee/caveman) — کلمات زائد و عبارتهای طولانی را با حفظ معنا حذف میکند: - حذف کلمات زائد («لطفاً»، «فکر میکنم»، «اساساً»، «در واقع») - فشردهسازی عبارتهای طولانی («بهمنظور» ← «برای»، «در نتیجهٔ» ← «زیرا») - حذف عبارات مؤدبانهٔ محتاطانه («ممکن است...»، «اگر امکان دارد...») - بیش از 30 قاعدهٔ regex بهینهشده برای پرامپتهای برنامهنویسی **مناسب برای:** گردشکارهای روزمرهٔ برنامهنویسی و تیمهای حساس به هزینه. ### حالت تهاجمی (~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، خروجی زیرساخت و خروجی عمومی پوسته را تشخیص میدهد - بستههای پالایش JSON را از `open-sse/services/compression/engines/rtk/filters/` اعمال میکند - پالایههای RTK TOML schema v1 را از فایلهای پروژه یا سراسری `filters.toml`، همراه با اعتبارسنجی آزمونهای درونخطی و کنترل اعتماد برای فایلهای پروژه، وارد میکند - شامل 55 پالایهٔ داخلی همراه با نمونههای راستیآزمایی درونخطی است - توالیهای کنترلی ANSI، نوارهای پیشرفت، خطوط تکراری و نویزهای غیرقابلاقدام را حذف میکند - شکستها، خطاها، هشدارها، فایلهای تغییریافته، خلاصهها و بخش انتهایی خروجیهای طولانی را حفظ میکند - از پالایههای پروژه با کنترل اعتماد، پالایههای سراسری و بازیابی اختیاری خروجی خام با اطلاعات محرمانهٔ پوشاندهشده پشتیبانی میکند **مناسب برای:** نشستهای عامل شامل رونوشتهای پوسته، ساخت، آزمون، 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`): اجرای `stacked` (RTK + Caveman) روی یک بلوک `tool_result` با ساختار Anthropic که شامل 300 خط خطای یکسان بود، **95.93% صرفهجویی در توکن / 96.26% صرفهجویی در نویسه** ایجاد کرد — کاملاً در محدودهٔ بازهٔ اعلامشده. اما اجرای همان خط لوله روی خروجی عادی و غیرتکراری ابزار (فهرستی تمیز از تطبیقهای `grep`، خواندن کوتاه یک فایل یا متن مکالمهای معمولی) بهدرستی **صرفهجویی نزدیک به صفر** ایجاد میکند، زیرا هیچ محتوای تکراریای برای حذف وجود ندارد و `validateCompression()` (`validation.ts`) اجازه نمیدهد بازنویسیای ارسال شود که بلوکهای کد، URLها، عنوانها، نسخهها یا شناسههای ثابت تماماً با حروف بزرگ را حذف یا تغییر دهد. این رفتاری مورد انتظار و ایمن است، نه یک باگ: یک نشست کدنویسی که عمدتاً فایلهای تمیز را میخواند یا در آنها جستوجو میکند، حتی با فعال بودن کامل فشردهسازی نیز صرفهجویی کلی محدودی خواهد داشت؛ درحالیکه نشستی که با یک حلقهٔ ناموفق یا یک لینتر پرحرف مواجه میشود، روی آن ترافیک از تمام بازهٔ 78-95% بهرهمند خواهد شد. درصد پایین صرفهجویی تجمیعی در یک نشست را بهتنهایی نشانهٔ پیکربندی نادرست فشردهسازی ندانید — ابتدا بررسی کنید که آیا خروجی زیربنایی ابزار واقعاً تکراری بوده است یا خیر. --- ## نمایش بصری صرفهجویی در توکن ``` بدون فشردهسازی: 47K توکن ارسالشده به LLM با Lite: 40K توکن ارسالشده (15% صرفهجویی — ایمن و همیشه فعال) با Standard: 33K توکن ارسالشده (30% صرفهجویی — قواعد caveman-speak) با Aggressive: 24K توکن ارسالشده (50% صرفهجویی — کهنهسازی + خلاصهسازی) با Ultra: 12K توکن ارسالشده (75% صرفهجویی — هرس ابتکاری) با RTK: 19K-5K توکن ارسالشده (60-90% صرفهجویی در خروجی فرمان/ابزار) با Stacked: 10K-2.5K توکن ارسالشده (بازهٔ واجد شرایط 78-95% برای RTK+Caveman) ``` --- ## پیکربندی ### داشبورد به `Dashboard → Context & Cache` بروید: - **Caveman** — انتخاب حالت، بستههای زبان، پیشنمایش و پیشفرضهای سراسری - **RTK** — پیشنمایش فیلتر فرمان، تنظیمات ایمنی RTK و فهرست فیلترها - **ترکیبهای فشردهسازی** — پایپلاینهای نامگذاریشدهٔ موتور که به ترکیبهای مسیریابی اختصاص داده میشوند - **آستانهٔ فعالسازی خودکار** — هنگامی که تعداد توکنها از آستانه فراتر میرود، فشردهسازی را بهطور خودکار فعال میکند ### بازنویسی بهازای هر ترکیب در `Dashboard → Context & Cache → Compression Combos`، یک ترکیب فشردهسازی را به یک ترکیب مسیریابی اختصاص دهید: ```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` آن را بررسی میکند. این گزینه را میتوان روی کارت ترکیب (`Dashboard → Combos`) یا، از #6760 به بعد، برای هر ترکیب مسیریابی در فهرست «Assign to routing» در `Dashboard → Context & Cache → Compression Combos`، درست کنار کادر انتخاب تخصیص پایپلاین که در بالا مستند شده است، تنظیم کرد. هر دو رابط از طریق همان نقطهٔ پایانی `PUT /api/combos/{id}` ذخیره میشوند. ### بازنویسی بهازای هر درخواست برای بازنویسی طرح فشردهسازی یک درخواست منفرد، هدر درخواست `x-omniroute-compression` را ارسال کنید. این هدر بالاترین اولویت را دارد — بر بازنویسی ترکیب مسیریابی، پروفایل فعال، فعالسازی خودکار و مقدار Default پنل مقدم است. مقادیر ناشناخته نادیده گرفته میشوند (درخواست هرگز رد نمیشود) و کلید اصلی سراسری همچنان همهچیز را کنترل میکند: وقتی فشردهسازی بهصورت سراسری خاموش باشد، هدر نمیتواند آن را روشن کند. مقادیر: | مقدار | اثر | | ------------- | ------------------------------------------------------------------------------------------------------------------- | | `off` | برای این درخواست فشردهسازی انجام نمیشود. | | `default` | پروفایل Default مشتقشده از پنل (پروفایل فعال را نادیده میگیرد). موتورهای اتلافی خاموش میمانند. | | `safe` | همانند حذف هدر است: فقط حذف موارد تکراری و یکپارچهسازی فاصلههای سفید. | | `allow-lossy` | طرح اپراتور این درخواست، شامل خلاصهها، فیلترهای مرتبطبودن و بازنویسیهای سبک، حفظ میشود. | | `engine:` | در صورت فعالبودن، یک موتور منفرد؛ برای مثال `engine:rtk`. این گزینهٔ پذیرش بهازای هر درخواست برای آن موتور است. | | `` | یک ترکیب نامگذاریشده که ابتدا بر اساس نام (بدون حساسیت به بزرگی و کوچکی حروف) و سپس بر اساس شناسه تطبیق داده میشود. | بدون `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 | Off, Lite | ✅ منتشرشده | | مرحله 2 | Standard, Aggressive, Ultra | ✅ منتشرشده | | مرحله 3 | RTK, Stacked, Compression Combos | ✅ منتشرشده | | مرحله 4 | Output Styles, SLM-tier Ultra, eval harness | ✅ منتشرشده | | مرحله 4C | بودجه تطبیقی زمینه ("dial") — موتور محاسباتی + 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%` را نشان میدهد. --- ## سیستمهای فشردهسازی پیشرفته فراتر از ۷ حالتی که در بالا توضیح داده شد (منبع همچنین حالتهای `codex-responses` و `omniglyph` را میپذیرد که در این راهنما پوشش داده نمیشوند)، بخشهای زیر قابلیتهایی را پوشش میدهند که درون آن حالتها یا در کنارشان کار میکنند: فشردهسازی نتیجهٔ ابزار و فرسایش تدریجی، مراحل ۱ و ۲ موتور تهاجمی هستند (حالت Aggressive و یک مرحلهٔ `aggressive` از خط لولهٔ پشتهای)؛ خط لولهٔ پشتهای نحوهٔ اجرای حالت Stacked است؛ فشردهسازی آگاه از کش، هنگام فعال بودن فشردهسازی، `aggressive` و `ultra` را برای ارائهدهندگان دارای کش به `standard` تنزل میدهد؛ و حالت خروجی Caveman و سبکهای خروجی، دستورالعملهای اختیاری system prompt هستند که بهطور پیشفرض غیرفعالاند و بهجای فشردهسازی درخواست، خروجی مدل را شکل میدهند. ### فشردهسازی آگاه از کش برخی ارائهدهندگان (مانند Anthropic با قابلیت کشکردن prompt) از **کشکردن prompt** پشتیبانی میکنند که به آنها امکان میدهد بخشهایی از prompt را برای کاهش هزینه و تأخیر کش کنند. هنگامی که کش فعال است، فشردهسازی تهاجمی میتواند عملاً به عملکرد **آسیب بزند**، زیرا tokenهای کششده را تغییر میدهد و کش را نامعتبر میکند. ماژول `cachingAware.ts` این مشکل را از طریق **تشخیص زمینهٔ کش** و **تنظیم راهبرد فشردهسازی** متناسب با آن حل میکند. #### نحوهٔ کار 1. **تشخیص زمینهٔ کش** — بدنهٔ درخواست را برای نشانگرهای `cache_control` اسکن میکند 2. **شناسایی ارائهدهندگان دارای کش** — بررسی میکند که آیا ارائهدهندهٔ مقصد از کش پشتیبانی میکند 3. **تنظیم راهبرد** — `aggressive`/`ultra` را برای ارائهدهندگان دارای کش به `standard` تنزل میدهد 4. **رد کردن system prompt** — system promptها معمولاً کش میشوند، بنابراین آنها را فشرده نمیکند تابع کمکی راهبرد همچنین یک پرچم `deterministicOnly` برمیگرداند، اما سازندهٔ plan فقط راهبرد را مصرف میکند — در حال حاضر هیچ بخش پاییندستی این پرچم را نمیخواند. #### نمونهٔ کد ```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 } ``` #### زمان استفاده فشردهسازی آگاه از کش **همیشه فعال است** — به هیچ پیکربندیای نیاز ندارد. هرگاه فشردهسازی فعال باشد و ارائهدهندهٔ مقصد از کشکردن prompt پشتیبانی کند (Anthropic، OpenAI و غیره)، این قابلیت وارد عمل میشود؛ وجود نشانگرهای صریح `cache_control` الزامی نیست — تنها وجود یک ارائهدهندهٔ دارای کش باعث تنزل راهبرد میشود و نشانگرها بهتنهایی هرگز چنین کاری نمیکنند (تشخیص نشانگر، دادههای تلهمتری کش را تغذیه میکند، نه تصمیم راهبرد را). ### فرسایش تدریجی مکالمههای طولانی شامل نوبتهای پیام بسیاری میشوند، اما نوبتهای قدیمیتر ارتباط کمتری پیدا میکنند. ماژول `progressiveAging.ts` **پیامها را بر اساس فاصلهٔ نوبت تنزل میدهد** (فاصله از انتهای مکالمه اندازهگیری میشود). با مقادیر پیشفرض ارائهشده (`verbatim: 2, light: 2, moderate: 3`): - **۲ نوبت آخر (فاصله ≤ ۲)**: عیناً نگه داشته میشوند - **فاصلهٔ ۳**: فشردهسازی Caveman (حذف عبارات زائد) - **فاصلهٔ ۴ به بالا**: پیامهای assistant خلاصه میشوند؛ پیامهای user به خط اولشان کاهش مییابند و حداکثر به ۱۲۰ نویسه محدود میشوند؛ سایر roleها دستنخورده باقی میمانند. system promptها، پیامهایی که قبلاً فرسوده شدهاند و آخرین پیام user، بدون توجه به فاصله همیشه عیناً نگه داشته میشوند. هیچچیز بهطور کامل حذف نمیشود و باند `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" }, // ... ۵۰ نوبت دیگر ... ]; const { messages: aged, saved } = applyAging(messages, { verbatim: 3, // ۳ نوبت آخر: عیناً light: 8, // فاصله <= ۸: فشردهسازی سبک moderate: 20, // فاصله <= ۲۰: فشردهسازی caveman fullSummary: 5, // توسط نوع الزامی است، اما کد تعیین باند آن را نمیخواند // فاصله > ۲۰: خلاصهشده (assistant) / نگهداشتن خط اول (user) }); // saved = تعداد tokenهای صرفهجوییشده ``` #### زمان استفاده فرسایش تدریجی برای حالت `aggressive` **همیشه فعال است** — این قابلیت مرحلهٔ ۲ `compressAggressive()` است. حالت Ultra آن را اجرا نمیکند. این قابلیت بهویژه برای موارد زیر مؤثر است: - نشستهای طولانیمدت برنامهنویسی - مکالمههای چندروزه - گردشهای کاری عاملمحور با فراخوانیهای متعدد ابزار ### حالت خروجی Caveman حالت خروجی Caveman **دستورالعملهایی را به system prompt اضافه میکند** که از خود مدل خروجی مختصر میخواهند — سطح `lite` پاسخهای موجزی را درخواست میکند که جملههای کامل را حفظ میکنند، سطح `full` از مدل میخواهد «کوتاه و مانند یک غارنشین باهوش پاسخ دهد» و سطح `ultra` خروجی تلگرافی درخواست میکند؛ دستورالعملها فقط درخواست میکنند و نمیتوانند اجرای آن را تضمین کنند. درخواستها این دستورالعملها را از طریق `applyOutputStyles()` (`open-sse/services/compression/outputStyles/apply.ts`) دریافت میکنند: `open-sse/handlers/chatCore.ts` ابتدا انتخاب را با shim سازگاری با نسخههای قبلی (`resolveOutputStyleSelection()` در `open-sse/services/compression/outputStyles/backCompat.ts`) تعیین میکند؛ این shim، تا زمانی که `outputStyles` خالی باشد، یک `cavemanOutputMode` فعال را با شدت `cavemanOutputMode.intensity` به سبک خروجی `terse-prose` نگاشت میکند (بخش سازگاری با نسخههای قبلی را در پایین ببینید)؛ یک انتخاب غیرخالی `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`، کلید اصلی در صفحهٔ تنظیمات فشردهسازی)، آن را با `cavemanOutputMode.enabled` فعال کنید؛ `intensity` یکی از `lite`، `full` یا `ultra` را انتخاب میکند: ```json { "enabled": true, "cavemanOutputMode": { "enabled": true, "intensity": "full" } } ``` کلید **حالت خروجی** (`outputMode`، با سطح موجود در `outputModeIntensity`) در یک ترکیب فشردهسازی، همین گزینه را برای درخواستهایی که آن ترکیب بر آنها اعمال میشود تنظیم میکند و ابزار MCP با نام `omniroute_set_compression_engine` آن را از طریق آرگومان بولی `outputMode` ثبت میکند. انتخاب غیرخالی `outputStyles` بر این کلید اولویت دارد. در داشبورد، فعالکردن سبک خروجی **نثر مختصر** همان بلوک را تزریق میکند (بخش سبکهای خروجی را در پایین ببینید). ### سبکهای خروجی (فهرست) حالت خروجی غارنشینی در بالا، **مسیر تکسبکی قدیمی** است. فاز 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` | «بهترین کد، کدی است که هرگز نوشته نشده»: استفادهٔ مجدد > بازنویسی، علت ریشهای > نشانه، کوتاهترین diff عملی. | 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` | هر تکنیک بصری باید آزمون هدف را بگذراند (سلسلهمراتب، هویت، خوانایی)؛ بدون گرادیان/شیشه/درخشش پیشفرض، با پالت محدود و بدون چیدمانهای قالبی. هر دو سبک ضدشلختگی، محدودیتِ نبود کنترلهای بیاثر / ادعاهای ساختگی را اضافه میکنند. | en, pt-BR, es, de, fr, it, ru, zh, ja, id, vi | | فیلتر ضدشلختگی متن و انسان | `antislop-copy` | متن مشخص (بدون خط تیرهٔ بلند، CTAهای عمومی، اصطلاحات پرطمطراق، عبارات پایانی چتباتی و واقعیتهای ساختگی) بههمراه قواعد مرتبط با افراد: کنتراست WCAG AA، فوکوس قابلمشاهده، دسترسی با صفحهکلید، وضعیتهای خالی/بارگذاری/خطا و بازچینی در موبایل. | en, pt-BR, es, de, fr, it, ru, zh, ja, id, vi | | CJK مختصر (文言) | `terse-cjk` | پاسخ `full`/`ultra` به زبان چینی کلاسیک (文言)؛ `lite` فقط پاسخهای کوتاه و بدون واژههای دستوری، تعارفات یا آرایهپردازی درخواست میکند. | zh (محدود به locale، پایین را ببینید) | هر سبک با سه سطح شدت عرضه میشود — `lite`، `full`، `ultra` — و هر سطح با بند مشترک محدودیتها (`SHARED_BOUNDARIES` در `outputMode.ts`) پایان مییابد که بلوکهای کد، مسیر فایلها، دستورها، خطاها و URLها را دقیق نگه میدارد. متن سطحهای `terse-prose` و `terse-cjk`، شناسهها را نیز به این فهرست اضافه میکند. `terse-cjk` در دو محل به locale برابر با `zh` محدود شده است. صفحهٔ تنظیمات فشردهسازی ردیف آن را فقط زمانی نمایش میدهد که زبان رابط کاربری داشبورد چینی باشد (`zh-CN` یا `zh-TW`)، و `applyOutputStyles()` فقط زمانی آن را تزریق میکند که زبان تعیینشدهٔ درخواست (بخش انتخاب زبان را در پایین ببینید) برابر با `zh` باشد. پنهانکردن ردیف، انتخاب ذخیرهشدهٔ `terse-cjk` را پاک نمیکند: API تنظیمات هر شناسهٔ سبکی را میپذیرد و ذخیرهکردن سبکهای دیگر در صفحه، آن را حفظ میکند. هنگام پردازش درخواست، بررسی زبان در `applyOutputStyles()` تنها محدودیت locale است. #### نحوهٔ تزریق `applyOutputStyles()` (`open-sse/services/compression/outputStyles/apply.ts`) انتخاب را با کاتالوگ تطبیق میدهد (شناسههای ناشناخته و سبکهایی که زبان محلیشان مطابقت ندارد حذف میشوند و هرگز خطا ایجاد نمیکنند؛ اگر انتخاب به هیچ سبکی منتهی نشود، بدنه بدون تغییر میماند و با دلیل `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` که حداکثر در فاصلهٔ ۲۴۰ نویسه پس از آنها `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()`) را روی آن اجرا میکند. آشکارساز برای متنی که دارای نویسههای Han و فاقد kana باشد، `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-gated با نام `terse-cjk` از این قاعده مستثنا است)، مگر اینکه در `KNOWN_ENGLISH_ONLY` فهرست شده باشد؛ این فهرست فقط میتواند شامل سبکهایی باشد که مطلقاً هیچ ترجمهای ندارند — سبکی که در این فهرست قرار دارد، در صورت داشتن هرگونه ترجمه در آزمون شکست میخورد؛ همچنین اگر سبکی زبانی را که در ورودی `BASELINE_LANGUAGES` آن ذکر شده از دست بدهد، آزمون آن سبک شکست میخورد. برای افزودن یک سبک، به [EXTENDING_COMPRESSION.md](./EXTENDING_COMPRESSION.md#adding-an-output-style) مراجعه کنید. ### فشردهسازی نتیجهٔ ابزار `compressToolResult()` در `open-sse/services/compression/toolResultCompressor.ts` متن نتیجهٔ ابزار را با **۵ راهبرد** فشرده میکند. این راهبردها را به ترتیب زیر امتحان میکند و نخستین راهبرد فعال که بررسی آن با محتوا مطابقت داشته باشد، نتیجه را تعیین میکند: 1. **`fileContent`**: محتوایی شامل ۳ خط یا بیشتر که در آن، با نادیده گرفتن تورفتگی ابتدایی، دستکم یک خط با `import `، `export `، `function `، `class `، `const `، `let `، `var ` یا `return ` (کلمهٔ کلیدی بههمراه یک فاصله)، یا با `if`، `for` یا `while` که پس از آن `(` یا ` (` آمده باشد شروع شود؛ ۲۰ خط نخست و ۵ خط آخر را نگه میدارد و بخش میانی حذفشده را علامتگذاری میکند. 2. **`grepSearch`**: محتوایی با دستکم یک خط بهشکل `::` که متن پیش از نخستین دونقطه در آن هیچ فاصلهٔ سفیدی ندارد؛ فقط همان خطوط را، حداکثر تا ۳۰ خط، نگه میدارد و پس از آن تعداد تطابقهای اضافی و فهرست فایلهای منطبق را میآورد؛ همهٔ خطوط دیگر حذف میشوند. تنها یک چنین خطی برای فعالشدن این راهبرد کافی است، بنابراین خط گزارشی که با برچسب زمانی مانند `12:30:45` آغاز شود نیز تطابق محسوب میشود. 3. **`shellOutput`**: خروجیای که شامل یک دنبالهٔ ANSI CSI باشد (`ESC[` و سپس ارقام یا نقطهویرگولها و بعد یک حرف، مانند کدهای رنگ)، یا در هر جای متن یک `$` داشته باشد که پس از آن فاصلهٔ سفید آمده باشد، آن دنبالهها را از دست میدهد (سایر escapeها، مانند `ESC[?25l` یا یک دنبالهٔ OSC برای عنوان پنجره، نگه داشته میشوند) و ۵۰ خط آخر خود را نگه میدارد؛ خطوط تکراری متوالی نیز ادغام میشوند. چون این بررسی پیش از `json` و `errorMessage` اجرا میشود، خروجی JSON یا خطایی که حاوی چنین `$`ای باشد، تا زمانی که `shellOutput` فعال است هرگز به آنها نمیرسد. 4. **`json`**: یک payload از نوع JSON با بیش از ۲٬۰۰۰ نویسه که با `{` یا `[` آغاز شود (پس از فاصلهٔ سفید اختیاری) و با موفقیت parse شود، خلاصه میشود: آرایهای با بیش از ۷ آیتم، ۵ آیتم نخست و ۲ آیتم آخر و تعداد کل آیتمها را نگه میدارد؛ و یک object، ۲۰ کلید نخست خود را نگه میدارد و مقدار هر object یا آرایهٔ تودرتو با placeholder از نوع `{…N keys}` جایگزین میشود (برای آرایه، N طول آن است) و یک نشانگر `_remaining__keys` تعداد کلیدهای حذفشده پس از ۲۰ کلید نخست را مشخص میکند. مقادیر scalar بهطور کامل کپی میشوند، بنابراین objectای با ۲۰ کلید یا کمتر که مقدار تودرتو نداشته باشد فقط دوباره تورفتگیبندی میشود — نسخهٔ minified آن نویسههای بیشتری پیدا میکند و بدون تغییر باقی میماند. 5. **`errorMessage`**: خروجیای که در هر نقطه و بدون حساسیت به بزرگی و کوچکی حروف شامل `error:`، `error ` (کلمهای که پس از آن فاصله آمده باشد، مانند `no error found`)، `[error]`، `exception:`، `exception `، `[exception]` یا `traceback` باشد، خط نخست، ۱۰ خط بعدی و ۳ خط آخر خود را نگه میدارد و خطوط میان آنها را با نشانگر `… [N frames elided] …` جایگزین میکند. این نشانگر فقط زمانی ظاهر میشود که پس از خط نخست بیش از ۱۳ خط وجود داشته باشد، بنابراین خروجی خطای ۱۴خطی یا کوتاهتر خلاصه نمیشود (در ۱۲ یا ۱۳ خط، ۳ خط آخر، خطوطی را که از قبل نگه داشته شدهاند تکرار میکنند). پس از تطابق یک راهبرد، حتی اگر هیچ صرفهجوییای ایجاد نکند، راهبردهای بعدی امتحان نمیشوند. هنگامی که راهبرد منطبق هیچ token تخمینیای ذخیره نمیکند (طول ÷ ۴، گرد شده به بالا) — برای مثال، فایلی شبیه کد با ۲۵ خط یا کمتر، یا آرایهٔ JSON با بیش از ۲٬۰۰۰ نویسه و ۷ آیتم یا کمتر — موتور aggressive نتیجهٔ اصلی ابزار را نگه میدارد: هر دو فراخواننده (`compressAggressive()` و `compressAnthropicToolResultBlock()`) هنگامی که `saved` برابر با ۰ یا کمتر باشد، مقدار اصلی را نگه میدارند؛ درحالیکه خود `compressToolResult()` همچنان خروجی آن راهبرد را بازمیگرداند. مرحلهٔ نتیجهٔ ابزار تصمیم نهایی نیست: خلاصهساز fallback موتور همچنان میتواند پیام `tool` یا `function` با طول بیش از ۸٬۱۹۲ نویسه (`maxTokensPerMessage` برابر با ۲٬۰۴۸، ضربدر ۴) را کوتاه کند. #### زمان استفاده فشردهسازی نتیجهٔ ابزار مرحلهٔ ۱ موتور aggressive است (`compressAggressive()` در `open-sse/services/compression/aggressive.ts`)، بنابراین در حالت Aggressive و در یک مرحلهٔ `aggressive` از pipeline پشتهای اجرا میشود. این قابلیت پیامهای `tool` و `function` با ساختار OpenAI و متن داخل بلوکهای `tool_result` متعلق به Anthropic را فشرده میکند. هر راهبرد گزینهٔ فعالسازی مخصوص خود را زیر `aggressive.toolStrategies` دارد که همگی بهطور پیشفرض فعالاند. در داشبورد، این گزینهها هنگام فعالبودن فشردهسازی و Aggressive بودن حالت پیشفرض، در نمای **Advanced** صفحهٔ Caveman قرار دارند. ### Pipeline پشتهای حالت پشتهای **چند موتور را بهترتیب** اجرا میکند — معمولاً ابتدا RTK (۶۰ تا ۹۰٪ صرفهجویی در خروجی ابزار)، سپس Caveman روی متن باقیمانده (حدود ۴۶٪ صرفهجویی در ورودی). حاصل ترکیب آنها **محدودهٔ واجد شرایط ۷۸ تا ۹۵٪** است (بخش محاسبات صرفهجویی Upstream در بالا را ببینید): `1 - (1 - 0.60..0.90) × (1 - 0.46)` بهطور میانگین تقریباً ۸۹٪ است. #### نحوهٔ کار ``` Input (1000 tokens) → RTK (command-aware filter) → 200 tokens → Caveman (filler removal) → 108 tokens → Output (108 tokens, ~89% savings) ``` #### زمان استفاده از حالت پشتهای در موارد زیر استفاده کنید: - workflowهای وابسته به ابزار (کدنویسی agentic، پژوهش) - پردازش دستهای حساس به هزینه - زمانی که به بیشترین صرفهجویی در token نیاز دارید pipelineهای پشتهای از طریق تنظیم سراسری فشردهسازی `stackedPipeline` یا از طریق یک compression combo نامگذاریشده که به یک routing combo اختصاص یافته است پیکربندی میشوند (بخش Per-Combo Override در بالا را ببینید) — نه از طریق `modePack` متعلق به auto-combo (آن فیلد فقط وزندهی انتخاب مدل در 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 مختص زبان