- الرئيسية
- Documentation
- الجلسات
- الضغط وملخصات الفروع
الضغط وملخصات الفروع
الضغط وملخصات الفروع هما الآليتان اللتان تُبقيان الجلسات الطويلة قابلةً للاستخدام دون فقدان سياق العمل السابق.
- الضغط يُعيد كتابة السجل القديم في صورة ملخص على الفرع الحالي.
- ملخص الفرع يلتقط سياق الفرع المتروك أثناء التنقل عبر
/tree.
كلاهما يُحفظ كإدخالات جلسة ويُحوَّل مجدداً إلى رسائل سياق المستخدم عند إعادة بناء مدخلات نموذج اللغة الكبير (LLM).
ملفات التنفيذ الرئيسية
Section titled “ملفات التنفيذ الرئيسية”src/session/compaction/compaction.tssrc/session/compaction/branch-summarization.tssrc/session/compaction/pruning.tssrc/session/compaction/utils.tssrc/session/session-manager.tssrc/session/agent-session.tssrc/session/messages.tssrc/extensibility/hooks/types.tssrc/config/settings-schema.ts
نموذج إدخال الجلسة
Section titled “نموذج إدخال الجلسة”الضغط وملخصات الفروع هي إدخالات جلسة من الدرجة الأولى، وليست رسائل مساعد/مستخدم عادية.
CompactionEntrytype: "compaction"summary، وshortSummaryاختياريfirstKeptEntryId(حد الضغط)tokensBeforedetailsوpreserveDataوfromExtensionاختيارية
BranchSummaryEntrytype: "branch_summary"fromId، وsummarydetailsوfromExtensionاختيارية
عند إعادة بناء السياق (buildSessionContext):
- يُحوَّل آخر ضغط على المسار النشط إلى رسالة
compactionSummaryواحدة. - تُعاد إضافة الإدخالات المحتفظ بها من
firstKeptEntryIdحتى نقطة الضغط. - تُلحَق الإدخالات اللاحقة على المسار.
- تُحوَّل إدخالات
branch_summaryإلى رسائلbranchSummary. - تُحوَّل إدخالات
custom_messageإلى رسائلcustom.
ثم تُحوَّل تلك الأدوار المخصصة إلى رسائل مستخدم موجهة لنموذج LLM في convertToLlm() باستخدام القوالب الثابتة:
prompts/compaction/compaction-summary-context.mdprompts/compaction/branch-summary-context.md
مسار الضغط
Section titled “مسار الضغط”مُشغِّلات التفعيل
Section titled “مُشغِّلات التفعيل”يمكن تشغيل الضغط بثلاث طرق:
- يدوي: يستدعي
/compact [instructions]الدالةAgentSession.compact(...). - استعادة تلقائية من تجاوز الحد: بعد خطأ مساعد مطابق لتجاوز سياق النافذة.
- ضغط تلقائي عند تجاوز العتبة: بعد دورة ناجحة عندما يتجاوز السياق العتبة المحددة.
شكل الضغط (مرئي)
Section titled “شكل الضغط (مرئي)”قبل الضغط:
entry: 0 1 2 3 4 5 6 7 8 9 ┌─────┬─────┬─────┬──────┬─────┬─────┬──────┬──────┬─────┬──────┐ │ hdr │ usr │ ass │ tool │ usr │ ass │ tool │ tool │ ass │ tool │ └─────┴─────┴─────┴──────┴─────┴─────┴──────┴──────┴─────┴──────┘ └────────┬───────┘ └──────────────┬──────────────┘ messagesToSummarize kept messages ↑ firstKeptEntryId (entry 4)
بعد الضغط (إلحاق إدخال جديد):
entry: 0 1 2 3 4 5 6 7 8 9 10 ┌─────┬─────┬─────┬──────┬─────┬─────┬──────┬──────┬─────┬──────┬─────┐ │ hdr │ usr │ ass │ tool │ usr │ ass │ tool │ tool │ ass │ tool │ cmp │ └─────┴─────┴─────┴──────┴─────┴─────┴──────┴──────┴─────┴──────┴─────┘ └──────────┬──────┘ └──────────────────────┬───────────────────┘ not sent to LLM sent to LLM ↑ starts from firstKeptEntryId
ما يراه نموذج LLM:
┌────────┬─────────┬─────┬─────┬──────┬──────┬─────┬──────┐ │ system │ summary │ usr │ ass │ tool │ tool │ ass │ tool │ └────────┴─────────┴─────┴─────┴──────┴──────┴─────┴──────┘ ↑ ↑ └─────────────────┬────────────────┘ prompt from cmp messages from firstKeptEntryIdالضغط عند تجاوز الحد مقابل الضغط عند بلوغ العتبة
Section titled “الضغط عند تجاوز الحد مقابل الضغط عند بلوغ العتبة”يتعمد المساران التلقائيان الاختلاف:
-
ضغط إعادة المحاولة عند تجاوز الحد
- المُشغِّل: يُكتشف أن خطأ المساعد في النموذج الحالي ناجم عن تجاوز سياق النافذة.
- تُحذف رسالة خطأ المساعد الفاشلة من حالة العميل النشطة قبل إعادة المحاولة.
- يُشغَّل الضغط التلقائي مع
reason: "overflow"وwillRetry: true. - عند النجاح، يواصل العميل تلقائياً (
agent.continue()) بعد الضغط.
-
ضغط العتبة
- المُشغِّل:
contextTokens > contextWindow - compaction.reserveTokens. - يُشغَّل مع
reason: "threshold"وwillRetry: false. - عند النجاح، إذا كان
compaction.autoContinue !== false، يُحقن موجه اصطناعي:"Continue if you have next steps."
- المُشغِّل:
التقليم قبل الضغط
Section titled “التقليم قبل الضغط”قبل إجراء فحوصات الضغط، قد يُشغَّل تقليم نتائج الأدوات (pruneToolOutputs).
سياسة التقليم الافتراضية:
- حماية أحدث
40_000رمز من مخرجات الأدوات. - اشتراط توفير ما لا يقل عن
20_000رمز إجمالياً. - عدم تقليم نتائج الأدوات من
skillأوread.
تُستبدل نتائج الأدوات المُقلَّمة بـ:
[Output truncated - N tokens]
إذا أفضى التقليم إلى تغيير الإدخالات، يُعاد كتابة تخزين الجلسة وتُحدَّث حالة رسائل العميل قبل اتخاذ قرارات الضغط.
منطق الحدود ونقطة القطع
Section titled “منطق الحدود ونقطة القطع”لا يأخذ prepareCompaction() في الاعتبار إلا الإدخالات منذ آخر إدخال ضغط (إن وُجد).
- إيجاد فهرس الضغط السابق.
- حساب
boundaryStart = prevCompactionIndex + 1. - تعديل
keepRecentTokensباستخدام نسبة الاستخدام المقاسة عند توفرها. - تشغيل
findCutPoint()على نافذة الحدود.
تشمل نقاط القطع الصالحة:
- إدخالات الرسائل ذات الأدوار:
user،assistant،bashExecution،hookMessage،branchSummary،compactionSummary - إدخالات
custom_message - إدخالات
branch_summary
قاعدة صارمة: لا يجوز القطع عند toolResult أبداً.
إذا وُجدت إدخالات بيانات وصفية غير رسائلية مباشرةً قبل نقطة القطع (model_change، thinking_level_change، التسميات، إلخ)، يُضمَّها إلى المنطقة المحتفظ بها بتحريك فهرس القطع للخلف حتى الوصول إلى رسالة أو حد ضغط.
معالجة الدورة المنقسمة
Section titled “معالجة الدورة المنقسمة”إذا لم تكن نقطة القطع عند بداية دورة مستخدم، يعامل الضغط الأمر باعتباره دورة منقسمة.
يعتمد اكتشاف بداية الدورة على هذه الحدود كبدايات دورة مستخدم:
message.role === "user"message.role === "bashExecution"- إدخال
custom_message - إدخال
branch_summary
يُولِّد ضغط الدورة المنقسمة ملخصين:
- ملخص السجل (
messagesToSummarize) - ملخص بادئة الدورة (
turnPrefixMessages)
يُدمج الملخص المخزن النهائي على النحو التالي:
<history summary>
---
**Turn Context (split turn):**
<turn prefix summary>توليد الملخص
Section titled “توليد الملخص”يبني compact(...) الملخصات من نص المحادثة المُسلسَل:
- تحويل الرسائل عبر
convertToLlm(). - التسلسل باستخدام
serializeConversation(). - التغليف في
<conversation>...</conversation>. - إضافة
<previous-summary>...</previous-summary>اختيارياً. - حقن سياق الخطاف اختيارياً كقائمة
<additional-context>. - تنفيذ موجه التلخيص مع
SUMMARIZATION_SYSTEM_PROMPT.
اختيار الموجه:
- أول ضغط:
compaction-summary.md - ضغط تكراري مع ملخص سابق:
compaction-update-summary.md - المرور الثاني للدورة المنقسمة:
compaction-turn-prefix.md - ملخص واجهة مستخدم مختصر:
compaction-short-summary.md
وضع التلخيص البعيد:
- إذا كان
compaction.remoteEndpointمضبوطاً، يُرسل الضغط طلب POST يحتوي على:{ systemPrompt, prompt }
- يتوقع استجابة JSON تحتوي على
{ summary }على الأقل.
سياق عمليات الملفات في الملخصات
Section titled “سياق عمليات الملفات في الملخصات”يتتبع الضغط نشاط الملفات التراكمي باستخدام استدعاءات أدوات المساعد:
read(path)← مجموعة القراءةwrite(path)← مجموعة التعديلedit(path)← مجموعة التعديل
السلوك التراكمي:
- يتضمن تفاصيل الضغط السابق فقط عندما يكون الإدخال السابق ناتجاً عن المنصة (
fromExtension !== true). - في الدورات المنقسمة، يتضمن أيضاً عمليات ملفات بادئة الدورة.
- يستثني
readFilesالملفاتِ التي جرى تعديلها أيضاً.
تُلحَق وسوم الملفات بنص الملخص عبر قالب الموجه:
<read-files>...</read-files><modified-files>...</modified-files>الحفظ والإعادة
Section titled “الحفظ والإعادة”بعد توليد الملخص (أو الملخص المُقدَّم من الخطاف)، تقوم جلسة العميل بـ:
- إلحاق
CompactionEntryباستخدامappendCompaction(...). - إعادة بناء السياق عبر
buildSessionContext(). - استبدال رسائل العميل الحية بالسياق المُعاد بناؤه.
- إطلاق حدث خطاف
session_compact.
مسار تلخيص الفروع
Section titled “مسار تلخيص الفروع”يرتبط تلخيص الفروع بالتنقل في الشجرة، لا بتجاوز حد الرموز.
المُشغِّل
Section titled “المُشغِّل”أثناء navigateTree(...):
- حساب الإدخالات المتروكة من الورقة القديمة إلى الجد المشترك باستخدام
collectEntriesForBranchSummary(...). - إذا طلب المُستدعي ملخصاً (
options.summarize)، يُولَّد الملخص قبل تبديل الورقة. - إذا وُجد ملخص، يُرفق في هدف التنقل باستخدام
branchWithSummary(...).
يُشغَّل هذا عادةً من مسار /tree عندما يكون branchSummary.enabled مفعَّلاً.
شكل تبديل الفرع (مرئي)
Section titled “شكل تبديل الفرع (مرئي)”الشجرة قبل التنقل:
┌─ B ─ C ─ D (old leaf, being abandoned) A ───┤ └─ E ─ F (target)
Common ancestor: AEntries to summarize: B, C, D
بعد التنقل مع الملخص:
┌─ B ─ C ─ D ─ [summary of B,C,D] A ───┤ └─ E ─ F (new leaf)التحضير وميزانية الرموز
Section titled “التحضير وميزانية الرموز”تحسب generateBranchSummary(...) الميزانية على النحو التالي:
tokenBudget = model.contextWindow - branchSummary.reserveTokens
ثم تقوم prepareBranchEntries(...) بـ:
- المرور الأول: جمع عمليات الملفات التراكمية من جميع الإدخالات المُلخَّصة، بما فيها تفاصيل
branch_summaryالسابقة الناتجة عن المنصة. - المرور الثاني: المشي من الأحدث إلى الأقدم، إضافة الرسائل حتى بلوغ الميزانية.
- تفضيل الحفاظ على السياق الأحدث.
- قد تُضمَّن إدخالات الملخص الكبيرة قرب حافة الميزانية لضمان الاستمرارية.
تُضمَّن إدخالات الضغط كرسائل (compactionSummary) خلال مدخلات تلخيص الفروع.
توليد الملخص والحفظ
Section titled “توليد الملخص والحفظ”يقوم تلخيص الفروع بـ:
- تحويل الرسائل المختارة وتسلسلها.
- تغليفها في
<conversation>. - استخدام تعليمات مخصصة إذا وُفِّرت، وإلا يستخدم
branch-summary.md. - استدعاء نموذج التلخيص مع
SUMMARIZATION_SYSTEM_PROMPT. - إضافة
branch-summary-preamble.mdفي البداية. - إلحاق وسوم عمليات الملفات.
يُخزَّن الناتج كـ BranchSummaryEntry مع تفاصيل اختيارية (readFiles، modifiedFiles).
نقاط تواصل الامتدادات والخطافات
Section titled “نقاط تواصل الامتدادات والخطافات”session_before_compact
Section titled “session_before_compact”خطاف ما قبل الضغط.
يمكنه:
- إلغاء الضغط (
{ cancel: true }) - توفير حمولة ضغط مخصصة كاملة (
{ compaction: CompactionResult })
session.compacting
Section titled “session.compacting”خطاف تخصيص الموجه/السياق للضغط الافتراضي.
يمكنه إرجاع:
prompt(تجاوز موجه الملخص الأساسي)context(سطور سياق إضافية تُحقن في<additional-context>)preserveData(يُخزَّن على إدخال الضغط)
session_compact
Section titled “session_compact”إشعار ما بعد الضغط يحتوي على compactionEntry المحفوظ وعلامة fromExtension.
session_before_tree
Section titled “session_before_tree”يُشغَّل عند التنقل في الشجرة قبل توليد ملخص الفرع الافتراضي.
يمكنه:
- إلغاء التنقل
- توفير
{ summary: { summary, details } }مخصص يُستخدم عندما يطلب المستخدم التلخيص
session_tree
Section titled “session_tree”حدث ما بعد التنقل يكشف عن الورقة الجديدة/القديمة وإدخال الملخص الاختياري.
سلوك وقت التشغيل ودلالات الفشل
Section titled “سلوك وقت التشغيل ودلالات الفشل”- يُلغي الضغط اليدوي عملية العميل الحالية أولاً.
- يلغي
abortCompaction()وحدات تحكم الضغط اليدوي والتلقائي معاً. - يُصدر الضغط التلقائي أحداث بدء/انتهاء جلسة لتحديثات واجهة المستخدم/الحالة.
- يمكن للضغط التلقائي تجربة مرشحين نموذجيين متعددين وإعادة محاولة الأخطاء العابرة.
- تُستثنى أخطاء التجاوز من مسار إعادة المحاولة العام لأنها تُعالَج بالضغط.
- إذا فشل الضغط التلقائي:
- يُصدر مسار التجاوز
Context overflow recovery failed: ... - يُصدر مسار العتبة
Auto-compaction failed: ...
- يُصدر مسار التجاوز
- يمكن إلغاء تلخيص الفروع عبر إشارة الإلغاء (مثل Escape)، مما يُعيد نتيجة تنقل ملغاة/متوقفة.
الإعدادات والقيم الافتراضية
Section titled “الإعدادات والقيم الافتراضية”من settings-schema.ts:
compaction.enabled=truecompaction.reserveTokens=16384compaction.keepRecentTokens=20000compaction.autoContinue=truecompaction.remoteEndpoint=undefinedbranchSummary.enabled=falsebranchSummary.reserveTokens=16384
تُستهلك هذه القيم في وقت التشغيل بواسطة AgentSession ووحدات الضغط وتلخيص الفروع.