# 🗜️ Prompt Compression Guide — OmniRoute (العربية) 🌐 **Languages:** 🇺🇸 [English](../../../../compression/COMPRESSION_GUIDE.md) · 🇪🇹 [am](../../../am/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) · 🇦🇲 [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%) → قياسي: إزالة الحشو بأسلوب الكلام المقتضب (~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 بالإصدار 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 المجمّع = 1 - (1 - وفورات RTK) * (1 - وفورات مدخلات Caveman) المتوسط = 1 - (1 - 0.80) * (1 - 0.46) = 89.2% النطاق = 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، أو العناوين، أو الإصدارات، أو معرّفات الثوابت المكتوبة بالكامل بأحرف كبيرة. هذا سلوك متوقع وآمن، وليس خطأً: فجلسة برمجة تقتصر في معظمها على قراءة الملفات النظيفة أو البحث فيها باستخدام grep ستحقق وفورات إجمالية محدودة حتى مع تمكين الضغط بالكامل، بينما تحقق الجلسة التي تواجه حلقة فاشلة أو أداة lint كثيرة الرسائل النطاق الكامل 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 رمزًا مُرسلًا (نطاق RTK+Caveman المؤهل البالغ 78-95%) ``` --- ## الإعداد ### لوحة التحكم انتقل إلى `Dashboard → Context & Cache`: - **Caveman** — تحديد الوضع، وحزم اللغات، والمعاينة، والإعدادات الافتراضية العامة - **RTK** — معاينة مرشّح الأوامر، وإعدادات أمان RTK، وكتالوج المرشّحات - **مجموعات الضغط** — مسارات معالجة مسمّاة للمحركات تُعيَّن إلى مجموعات التوجيه - **عتبة التشغيل التلقائي** — تشغيل الضغط تلقائيًا عندما يتجاوز عدد الرموز العتبة ### التجاوز لكل مجموعة في `Dashboard → Context & Cache → Compression Combos`، عيّن مجموعة ضغط إلى مجموعة توجيه: ```txt المجموعة: "free-tier-fallback" مجموعة الضغط: "coding-agent-stack" مسار المعالجة: RTK -> Caveman الأهداف: 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` لتجاوز خطة الضغط لطلب واحد. ولها الأولوية القصوى — إذ تتغلب على تجاوز مجموعة التوجيه، والملف الشخصي النشط، والتشغيل التلقائي، والإعداد الافتراضي للوحة. تُتجاهل القيم غير المعروفة (ولا يُرفض الطلب مطلقًا)، ويظل مفتاح التشغيل الرئيسي العام متحكمًا في كل شيء: عندما يكون الضغط معطّلًا عمومًا، لا يمكن للترويسة تشغيله. القيم: | القيمة | التأثير | | ------------- | -------------------------------------------------------------------------------------------------- | | `off` | لا يوجد ضغط لهذا الطلب. | | `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 والبيانات المهيكلة - ✅ المعرّفات والرموز التقنية المحمية - ✅ التعبيرات الرياضية - ✅ تعريفات استدعاءات الأدوات/الدوال - ✅ موجّهات النظام (في الوضع الخفيف) تُنقّح استعادة المخرجات الخام لـ RTK مفاتيح API الشائعة، ورموز الحامل، ورموز 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 | متوقف، خفيف | ✅ تم الإصدار | | المرحلة 2 | قياسي، مكثّف، فائق | ✅ تم الإصدار | | المرحلة 3 | RTK، مكدّس، تركيبات الضغط | ✅ تم الإصدار | | المرحلة 4 | أنماط المخرجات، فائق بمستوى SLM، إطار التقييم | ✅ تم الإصدار | | المرحلة 4C | ميزانية سياق تكيفية ("قرص التحكم") — محرك الحساب + API (`contextBudget` في `PUT /api/settings/compression`) + عناصر التحكم في الوضع/السياسة بلوحة المعلومات | ✅ تم الإصدار | --- ## شكر وتقدير قواعد الضغط في الوضع القياسي مستوحاة من **[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`، اللذين لا يتناولهما هذا الدليل)، تتناول الأقسام أدناه الميزات التي تعمل داخل تلك الأوضاع أو بجانبها: يُعد ضغط نتائج الأدوات والتقادم التدريجي الخطوتين 1 و2 من المحرك المكثف (الوضع المكثف وخطوة `aggressive` ضمن مسار معالجة مكدس)، ومسار المعالجة المكدس هو كيفية عمل الوضع المكدس، بينما يخفض الضغط المدرك للتخزين المؤقت `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)**: تُحفظان حرفيًا - **المسافة 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` — فهو الخطوة 2 من `compressAggressive()`. لا يشغّله وضع 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`، مفتاح التبديل الرئيسي في صفحة إعدادات الضغط)، فعّله باستخدام `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` | "أفضل شيفرة هي الشيفرة التي لم تُكتب قط": إعادة الاستخدام > إعادة الكتابة، السبب الجذري > العَرَض، أقصر فرق ناجح. | 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` | نص محدد (دون شرطة طويلة، أو عبارات عامة للحث على اتخاذ إجراء، أو كلمات رنانة، أو خاتمات روبوتات الدردشة، أو حقائق مختلقة)، بالإضافة إلى قواعد تخص الأشخاص: تباين WCAG AA، وتركيز مرئي، وإمكانية الوصول بلوحة المفاتيح، وحالات الفراغ/التحميل/الخطأ، وإعادة التدفق على الأجهزة المحمولة. | en, pt-BR, es, de, fr, it, ru, zh, ja, id, vi | | الصينية واليابانية والكورية الموجزة (文言) | `terse-cjk` | إجابة `full`/`ultra` بالصينية الكلاسيكية (文言)؛ أما `lite` فيطلب فقط إجابات موجزة دون كلمات وظيفية أو مجاملات أو زخرفة. | zh (مقيّد بالإعدادات المحلية، راجع أدناه) | يتضمن كل نمط ثلاثة مستويات كثافة — `lite` و`full` و`ultra` — وينتهي كل مستوى ببند الحدود المشتركة (`SHARED_BOUNDARIES` في `outputMode.ts`)، الذي يحافظ على كتل الشيفرة، ومسارات الملفات، والأوامر، والأخطاء، وعناوين URL كما هي تمامًا. وتضيف نصوص مستويات `terse-prose` و`terse-cjk` المُعرّفات إلى تلك القائمة. يُقيَّد `terse-cjk` بالإعداد المحلي `zh` في موضعين. تعرض صفحة إعدادات الضغط صفه فقط عندما تكون لغة واجهة مستخدم لوحة المعلومات هي الصينية (`zh-CN` أو `zh-TW`)، كما تحقنه `applyOutputStyles()` فقط عندما تكون اللغة المحددة للطلب (راجع اختيار اللغة أدناه) هي `zh`. لا يؤدي إخفاء الصف إلى مسح تحديد `terse-cjk` محفوظ: تقبل واجهة API للإعدادات أي مُعرّف نمط، ويؤدي حفظ أنماط أخرى في الصفحة إلى الاحتفاظ به. في وقت الطلب، يكون فحص اللغة في `applyOutputStyles()` هو بوابة الإعداد المحلي الوحيدة. #### كيفية عمل الحقن تقوم `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` متبوعًا، ضمن 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`. #### كيفية التفعيل في لوحة المعلومات: **سياق الضغط ← إعدادات الضغط** (`/dashboard/context/settings`)، ضمن قسم أنماط الإخراج: يوجد صف واحد لكل نمط مع مفتاح تشغيل/إيقاف ومحدد للمستوى. تُدرج الأنماط ما دام الضغط نفسه مفعّلًا (مفتاح الصفحة الرئيسي، `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` للنص الذي يحتوي على محارف Han ولا يحتوي على kana؛ وإلا فإنه يعيد اللغة ذات أكبر عدد من تطابقات التلميحات من بين `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` الخاص بالاختبار؛ ويجب أن يتضمن النمط غير المقيّد بإعدادات محلية ترجمة pt-BR (ويُستثنى `terse-cjk` المقيّد بإعدادات محلية من هذه القاعدة)، ما لم يكن مدرجًا في `KNOWN_ENGLISH_ONLY`، الذي لا يجوز أن يحتوي إلا على أنماط بلا أي ترجمات على الإطلاق — ويفشل الاختبار إذا كان لنمط مدرج أي ترجمة؛ كما يفشل النمط في الاختبار عندما يفقد لغة مدرجة في إدخاله ضمن `BASELINE_LANGUAGES`. لإضافة نمط، راجع [EXTENDING_COMPRESSION.md](./EXTENDING_COMPRESSION.md#adding-an-output-style). ### ضغط نتائج الأدوات تضغط `compressToolResult()` في `open-sse/services/compression/toolResultCompressor.ts` نص نتيجة الأداة باستخدام **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[` ثم أرقام أو فواصل منقوطة ثم حرف، كما في رموز الألوان) أو على `$` متبوع بمسافة بيضاء في أي موضع من النص يفقد تلك التسلسلات (وتبقى تسلسلات الهروب الأخرى، مثل `ESC[?25l` أو تسلسل OSC لعنوان النافذة)، ويحتفظ بآخر 50 سطرًا، مع دمج الأسطر المتطابقة المتتالية. ولأن هذا الفحص يُنفَّذ قبل `json` و`errorMessage`، فإن ناتج JSON أو الخطأ الذي يحتوي على `$` كهذا لا يصل إليهما أبدًا ما دام `shellOutput` مفعّلًا. 4. **`json`**: تُلخّص حمولة JSON يزيد طولها على 2,000 محرف وتبدأ بـ `{` أو `[` (بعد مسافة بيضاء اختيارية) ويمكن تحليلها: تحتفظ المصفوفة التي تضم أكثر من 7 عناصر بأول 5 عناصر وآخر عنصرين وبعددها الإجمالي، ويحتفظ الكائن بأول 20 مفتاحًا، مع استبدال قيمة كل كائن أو مصفوفة متداخلة بعنصر نائب `{…N keys}` (بالنسبة إلى المصفوفة، تكون N هي طولها) وعلامة `_remaining__keys` تحصي المفاتيح المحذوفة بعد أول 20 مفتاحًا. تُنسخ القيم العددية كاملة، ولذلك فإن كائنًا من 20 مفتاحًا أو أقل بلا قيم متداخلة لا يُعاد إلا ضبط مسافاته البادئة — أما الكائن المصغّر فيزداد عدد محارفه ويبقى دون تغيير. 5. **`errorMessage`**: الناتج الذي يحتوي، في أي موضع وبأي حالة أحرف، على `error:` أو `error ` (الكلمة متبوعة بمسافة، كما في `no error found`) أو `[error]` أو `exception:` أو `exception ` أو `[exception]` أو `traceback` يحتفظ بسطره الأول، والأسطر العشرة التالية وآخر 3 أسطر، مع وضع العلامة `… [N frames elided] …` بدلًا من الأسطر الواقعة بينها. لا تظهر العلامة إلا عندما يلي السطر الأول أكثر من 13 سطرًا، ولذلك لا يُختصر ناتج الخطأ المؤلف من 14 سطرًا أو أقل (وعند 12 أو 13 سطرًا تكرر آخر 3 أسطر أسطرًا محفوظة بالفعل). بعد مطابقة استراتيجية، حتى إن لم تحقق أي توفير، لا تُجرّب الاستراتيجيات اللاحقة. وعندما لا توفر الاستراتيجية المطابقة أي رموز مميزة مقدّرة (الطول ÷ 4، مع التقريب إلى الأعلى) — مثل ملف شبيه بالتعليمات البرمجية من 25 سطرًا أو أقل، أو مصفوفة JSON يزيد طولها على 2,000 محرف وتضم 7 عناصر أو أقل — يحتفظ المحرك القوي بنتيجة الأداة الأصلية: إذ يحتفظ كلا المستدعيين (`compressAggressive()` و`compressAnthropicToolResultBlock()`) بالأصل عندما تكون `saved` مساوية لـ 0 أو أقل، بينما تظل `compressToolResult()` نفسها تعيد ناتج تلك الاستراتيجية. وليست خطوة نتيجة الأداة صاحبة القرار النهائي: إذ لا يزال بإمكان ملخّص الرجوع الاحتياطي في المحرك اختصار رسالة `tool` أو `function` يزيد طولها على 8,192 محرفًا (`maxTokensPerMessage`، أي 2,048، مضروبة في 4). #### متى يُستخدم ضغط نتائج الأدوات هو الخطوة 1 من المحرك القوي (`compressAggressive()` في `open-sse/services/compression/aggressive.ts`)، ولذلك يُشغّل في الوضع Aggressive وفي خطوة `aggressive` ضمن مسار متراكب. وهو يضغط رسائل `tool` و`function` بصيغة OpenAI، والنص الموجود داخل كتل `tool_result` الخاصة بـ Anthropic. لكل استراتيجية مفتاحها الخاص ضمن `aggressive.toolStrategies`، وجميعها مفعّلة افتراضيًا. في لوحة المعلومات، توجد المفاتيح في عرض **Advanced** بصفحة Caveman عندما يكون الضغط مفعّلًا ويكون الوضع الافتراضي هو Aggressive. ### المسار المتراكب يشغّل الوضع المتراكب **عدة محركات بالتتابع** — عادةً RTK أولًا (توفير بنسبة 60-90% في ناتج الأدوات)، ثم Caveman على النص المتبقي (توفير بنحو 46% في المدخلات). وعند جمعهما، يكون ذلك **النطاق المؤهل البالغ 78-95%** (راجع حساب وفورات المصدر أعلاه): يبلغ متوسط `1 - (1 - 0.60..0.90) × (1 - 0.46)` نحو ≈89%. #### كيفية عمله ``` المدخلات (1000 رمز مميز) → RTK (مرشح واعٍ بالأوامر) → 200 رمز مميز → Caveman (إزالة الحشو) → 108 رموز مميزة → المخرجات (108 رموز مميزة، توفير ~89%) ``` #### متى يُستخدم استخدم الوضع المتراكب من أجل: - تدفقات العمل كثيفة استخدام الأدوات (البرمجة الوكيلة، البحث) - المعالجة الدفعية الحساسة للتكلفة - عندما تحتاج إلى أقصى قدر من توفير الرموز المميزة تُضبط المسارات المتراكبة من خلال إعداد الضغط العام `stackedPipeline`، أو من خلال مجموعة ضغط مسماة مخصصة لمجموعة توجيه (راجع التجاوز حسب المجموعة أعلاه) — وليس من خلال `modePack` لمجموعة تلقائية (فهذا الحقل لا يفعل سوى إعادة ترجيح اختيار نموذج المجموعة التلقائية، و`stacked` ليس اسم حزمة صالحًا). --- ## تجاوزات مجموعة الضغط يمكنك تجاوز وضع الضغط العام **لكل مجموعة على حدة** لضبط السلوك بدقة لحالات الاستخدام المختلفة: ```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 الخاصة بكل لغة