Technical reference

تعمق في إدارة الجلسات

يدير OpenClaw الجلسات من البداية إلى النهاية عبر هذه المجالات:

  • توجيه الجلسات (كيفية ربط الرسائل الواردة بـ sessionKey)
  • مخزن الجلسات (sessions.json) وما يتتبعه
  • استمرارية النصوص الحوارية (*.jsonl) وبنيتها
  • نظافة النصوص الحوارية (تصحيحات خاصة بالمزوّدين قبل التشغيل)
  • حدود السياق (نافذة السياق مقابل الرموز المتتبعة)
  • Compaction (اليدوي والتلقائي) ومكان ربط أعمال ما قبل Compaction
  • تنظيف صامت (كتابات الذاكرة التي يجب ألا تنتج مخرجات مرئية للمستخدم)

إذا أردت نظرة عامة أعلى مستوى أولاً، فابدأ بـ:


مصدر الحقيقة: Gateway

صُمم OpenClaw حول عملية Gateway واحدة تملك حالة الجلسة.

  • يجب أن تستعلم واجهات المستخدم (تطبيق macOS، وواجهة التحكم على الويب، وTUI) من Gateway عن قوائم الجلسات وأعداد الرموز.
  • في الوضع البعيد، تكون ملفات الجلسات على المضيف البعيد؛ لن يعكس "فحص ملفات جهاز Mac المحلي" ما يستخدمه Gateway.

طبقتا استمرارية

يحتفظ OpenClaw بالجلسات في طبقتين:

  1. مخزن الجلسات (sessions.json)

    • خريطة مفتاح/قيمة: sessionKey -> SessionEntry
    • صغير، قابل للتغيير، وآمن للتحرير (أو حذف الإدخالات)
    • يتتبع بيانات تعريف الجلسة (معرّف الجلسة الحالي، آخر نشاط، المفاتيح التبديلية، عدادات الرموز، إلخ)
  2. النص الحواري (<sessionId>.jsonl)

    • نص حواري للإلحاق فقط ببنية شجرية (تحتوي الإدخالات على id + parentId)
    • يخزن المحادثة الفعلية + استدعاءات الأدوات + ملخصات Compaction
    • يُستخدم لإعادة بناء سياق النموذج للدورات المستقبلية
    • تُتجاوز نقاط تفتيش التصحيح الكبيرة قبل Compaction بمجرد أن يتجاوز النص الحواري النشط الحد الأقصى لحجم نقطة التفتيش، لتجنب نسخة .checkpoint.*.jsonl ضخمة ثانية.

يجب على قارئي سجل Gateway تجنب تحميل النص الحواري بالكامل في الذاكرة ما لم تحتج الواجهة صراحةً إلى وصول تاريخي عشوائي. يستخدم سجل الصفحة الأولى، وسجل الدردشة المضمن، واستعادة إعادة التشغيل، وفحوصات الرموز/الاستخدام قراءات ذيل محدودة. تمر عمليات المسح الكامل للنص الحواري عبر فهرس النص الحواري غير المتزامن، والذي يُخزّن مؤقتاً حسب مسار الملف إضافةً إلى mtimeMs/size ويُشارك بين القرّاء المتزامنين.


المواقع على القرص

لكل وكيل، على مضيف Gateway:

  • المخزن: ~/.openclaw/agents/<agentId>/sessions/sessions.json
  • النصوص الحوارية: ~/.openclaw/agents/<agentId>/sessions/<sessionId>.jsonl
    • جلسات مواضيع Telegram: .../<sessionId>-topic-<threadId>.jsonl

يحل OpenClaw هذه المسارات عبر src/config/sessions.ts.


صيانة المخزن وضوابط القرص

تتضمن استمرارية الجلسات ضوابط صيانة تلقائية (session.maintenance) لـ sessions.json، ومصنوعات النصوص الحوارية، والملفات الجانبية للمسارات:

  • mode: warn (الافتراضي) أو enforce
  • pruneAfter: حد عمر الإدخال القديم (الافتراضي 30d)
  • maxEntries: الحد الأقصى للإدخالات في sessions.json (الافتراضي 500)
  • resetArchiveRetention: مدة الاحتفاظ بأرشيفات النصوص الحوارية *.reset.<timestamp> (الافتراضي: مثل pruneAfter؛ يعطّل false التنظيف)
  • maxDiskBytes: ميزانية اختيارية لدليل الجلسات
  • highWaterBytes: هدف اختياري بعد التنظيف (الافتراضي 80% من maxDiskBytes)

تمر كتابات Gateway العادية عبر كاتب جلسات لكل مخزن يسلسل التغييرات داخل العملية دون أخذ قفل ملف وقت التشغيل. تستعير مساعدات التصحيح في المسار الساخن الذاكرة المؤقتة القابلة للتغيير والمتحقق منها أثناء احتفاظها بفتحة الكاتب تلك، لذلك لا تُنسخ ملفات sessions.json الكبيرة أو تُعاد قراءتها لكل تحديث بيانات تعريف. يجب أن يفضل كود وقت التشغيل updateSessionStore(...) أو updateSessionStoreEntry(...)؛ أما عمليات حفظ المخزن الكامل المباشرة فهي أدوات توافق وصيانة دون اتصال. عندما يكون Gateway قابلاً للوصول، تفوض openclaw sessions cleanup وopenclaw agents delete غير الجافتين تغييرات المخزن إلى Gateway حتى ينضم التنظيف إلى طابور الكاتب نفسه؛ ويكون --store <path> هو مسار الإصلاح الصريح دون اتصال للصيانة المباشرة للملفات. لا يزال تنظيف maxEntries مجمعاً للحدود ذات حجم الإنتاج، لذلك قد يتجاوز المخزن الحد الأقصى المضبوط لفترة وجيزة قبل أن يعيد تنظيف حد الماء العالي التالي كتابته إلى الأسفل. لا تقلّم قراءات مخزن الجلسات الإدخالات أو تحدها أثناء بدء Gateway؛ استخدم الكتابات أو openclaw sessions cleanup --enforce للتنظيف. لا يزال openclaw sessions cleanup --enforce يطبق الحد الأقصى المضبوط فوراً ويقلّم النصوص الحوارية ونقاط التفتيش ومصنوعات المسارات القديمة غير المشار إليها حتى عند عدم ضبط ميزانية للقرص.

تحافظ الصيانة على مؤشرات المحادثات الخارجية المتينة مثل جلسات المجموعات وجلسات الدردشة محددة الخيط، لكن الإدخالات الاصطناعية وقت التشغيل لـ Cron، والخطاطيف، وHeartbeat، وACP، والوكلاء الفرعيين لا تزال قابلة للإزالة عندما تتجاوز العمر أو العدد أو ميزانية القرص المضبوطة.

لم يعد OpenClaw ينشئ نسخ تدوير احتياطية تلقائية sessions.json.bak.* أثناء كتابات Gateway. يتم تجاهل المفتاح القديم session.maintenance.rotateBytes ويزيله openclaw doctor --fix من الإعدادات الأقدم.

تستخدم تغييرات النص الحواري قفل كتابة جلسة على ملف النص الحواري. ينتظر الحصول على القفل حتى session.writeLock.acquireTimeoutMs قبل إظهار خطأ جلسة مشغولة؛ القيمة الافتراضية هي 60000 مللي ثانية. ارفع هذه القيمة فقط عندما تتزاحم أعمال إعداد أو تنظيف أو Compaction أو نسخ مرآة للنص الحواري مشروعة لفترة أطول على الأجهزة البطيئة. تبقى سياسات اكتشاف الأقفال القديمة وتحذيرات الحد الأقصى لمدة الاحتفاظ منفصلة.

ترتيب الإنفاذ لتنظيف ميزانية القرص (mode: "enforce"):

  1. أزل أولاً أقدم المصنوعات المؤرشفة، أو النصوص الحوارية اليتيمة، أو مصنوعات المسارات اليتيمة.
  2. إذا بقي الاستخدام فوق الهدف، أخرج أقدم إدخالات الجلسات وملفات نصوصها الحوارية/مساراتها.
  3. استمر حتى يصبح الاستخدام عند highWaterBytes أو دونه.

في mode: "warn"، يبلّغ OpenClaw عن عمليات الإخراج المحتملة لكنه لا يغيّر المخزن/الملفات.

شغّل الصيانة عند الطلب:

openclaw sessions cleanup --dry-run
openclaw sessions cleanup --enforce

جلسات Cron وسجلات التشغيل

تنشئ عمليات Cron المعزولة أيضاً إدخالات جلسات/نصوصاً حوارية، ولها ضوابط احتفاظ مخصصة:

  • cron.sessionRetention (الافتراضي 24h) يقلّم جلسات تشغيل Cron المعزولة القديمة من مخزن الجلسات (false يعطّل ذلك).
  • cron.runLog.maxBytes + cron.runLog.keepLines يقلّمان ملفات ~/.openclaw/cron/runs/<jobId>.jsonl (القيم الافتراضية: 2_000_000 بايت و2000 سطر).

عندما يُنشئ Cron قسراً جلسة تشغيل معزولة جديدة، فإنه ينقّي إدخال جلسة cron:<jobId> السابق قبل كتابة الصف الجديد. ينقل التفضيلات الآمنة مثل إعدادات التفكير/السرعة/الإسهاب، والتسميات، وتجاوزات النموذج/المصادقة التي اختارها المستخدم صراحةً. ويسقط سياق المحادثة المحيط مثل توجيه القناة/المجموعة، وسياسة الإرسال أو الطابور، والرفع، والأصل، وربط وقت تشغيل ACP حتى لا ترث عملية تشغيل معزولة جديدة تسليماً قديماً أو سلطة وقت تشغيل من تشغيل أقدم.


مفاتيح الجلسات (sessionKey)

يحدد sessionKey حاوية المحادثة التي أنت فيها (التوجيه + العزل).

أنماط شائعة:

  • الدردشة الرئيسية/المباشرة (لكل وكيل): agent:<agentId>:<mainKey> (الافتراضي main)
  • المجموعة: agent:<agentId>:<channel>:group:<id>
  • الغرفة/القناة (Discord/Slack): agent:<agentId>:<channel>:channel:<id> أو ...:room:<id>
  • Cron: cron:<job.id>
  • Webhook: hook:<uuid> (ما لم يُتجاوز)

القواعد القانونية موثقة في /concepts/session.


معرّفات الجلسات (sessionId)

يشير كل sessionKey إلى sessionId حالي (ملف النص الحواري الذي يواصل المحادثة).

قواعد عامة:

  • إعادة الضبط (/new، /reset) تنشئ sessionId جديداً لذلك sessionKey.
  • إعادة الضبط اليومية (افتراضياً 4:00 صباحاً بالتوقيت المحلي على مضيف Gateway) تنشئ sessionId جديداً عند الرسالة التالية بعد حد إعادة الضبط.
  • انتهاء الخمول (session.reset.idleMinutes أو القديم session.idleMinutes) ينشئ sessionId جديداً عندما تصل رسالة بعد نافذة الخمول. عند ضبط اليومي + الخمول معاً، يفوز ما ينتهي أولاً.
  • أحداث النظام (Heartbeat، واستيقاظات Cron، وإشعارات التنفيذ، ومسك دفاتر Gateway) قد تغيّر صف الجلسة لكنها لا تمدد حداثة إعادة الضبط اليومية/الخاملة. يتخلص انتقال إعادة الضبط من إشعارات أحداث النظام المصفوفة للجلسة السابقة قبل بناء المطالبة الجديدة.
  • سياسة تفرع الأصل تستخدم الفرع النشط في PI عند إنشاء خيط أو تفرع وكيل فرعي. إذا كان ذلك الفرع كبيراً جداً، يبدأ OpenClaw الابن بسياق معزول بدلاً من الفشل أو وراثة سجل غير قابل للاستخدام. سياسة التحجيم تلقائية؛ تتم إزالة إعداد session.parentForkMaxTokens القديم بواسطة openclaw doctor --fix.

تفصيل تنفيذي: يحدث القرار في initSessionState() في src/auto-reply/reply/session.ts.


مخطط مخزن الجلسات (sessions.json)

نوع قيمة المخزن هو SessionEntry في src/config/sessions.ts.

حقول رئيسية (ليست شاملة):

  • sessionId: معرّف النص الحواري الحالي (يُشتق اسم الملف من هذا ما لم تُضبط sessionFile)
  • sessionStartedAt: طابع زمني لبداية sessionId الحالي؛ تستخدم حداثة إعادة الضبط اليومية هذا الحقل. قد تشتقه الصفوف القديمة من رأس جلسة JSONL.
  • lastInteractionAt: الطابع الزمني لآخر تفاعل مستخدم/قناة حقيقي؛ تستخدم حداثة إعادة ضبط الخمول هذا الحقل حتى لا تبقي أحداث Heartbeat وCron والتنفيذ الجلسات حية. تعود الصفوف القديمة التي لا تحتوي هذا الحقل إلى وقت بدء الجلسة المستعاد لحداثة الخمول.
  • updatedAt: الطابع الزمني لآخر تغيير في صف المخزن، ويُستخدم للعرض والتقليم ومسك الدفاتر. ليس هو المرجع لحداثة إعادة الضبط اليومية/الخاملة.
  • sessionFile: تجاوز اختياري صريح لمسار النص الحواري
  • chatType: direct | group | room (يساعد واجهات المستخدم وسياسة الإرسال)
  • provider، subject، room، space، displayName: بيانات تعريف لتسمية المجموعة/القناة
  • المفاتيح التبديلية:
    • thinkingLevel، verboseLevel، reasoningLevel، elevatedLevel
    • sendPolicy (تجاوز لكل جلسة)
  • اختيار النموذج:
    • providerOverride، modelOverride، authProfileOverride
  • عدادات الرموز (بأفضل جهد / معتمدة على المزوّد):
    • inputTokens، outputTokens، totalTokens، contextTokens
  • compactionCount: عدد مرات اكتمال Compaction التلقائي لمفتاح الجلسة هذا
  • memoryFlushAt: الطابع الزمني لآخر تفريغ ذاكرة قبل Compaction
  • memoryFlushCompactionCount: عدد Compaction عند تشغيل آخر تفريغ

المخزن آمن للتحرير، لكن Gateway هو المرجع: قد يعيد كتابة الإدخالات أو إعادة ترطيبها أثناء تشغيل الجلسات.


بنية النص الحواري (*.jsonl)

تُدار النصوص الحوارية بواسطة SessionManager الخاص بـ @mariozechner/pi-coding-agent.

الملف بصيغة JSONL:

  • السطر الأول: رأس الجلسة (type: "session"، يتضمن id، وcwd، وtimestamp، وparentSession الاختياري)
  • ثم: إدخالات الجلسة مع id + parentId (شجرة)

أنواع إدخالات جديرة بالملاحظة:

  • message: رسائل المستخدم/المساعد/نتيجة الأداة
  • custom_message: رسائل محقونة من الامتداد تدخل سياق النموذج (يمكن إخفاؤها عن واجهة المستخدم)
  • custom: حالة امتداد لا تدخل سياق النموذج
  • compaction: ملخص Compaction مستمر مع firstKeptEntryId وtokensBefore
  • branch_summary: ملخص مستمر عند التنقل في فرع شجري

يتعمد OpenClaw عدم "تصحيح" النصوص الحوارية؛ يستخدم Gateway SessionManager لقراءتها/كتابتها.


نوافذ السياق مقابل الرموز المتتبعة

هناك مفهومان مختلفان مهمان:

  1. نافذة سياق النموذج: حد أقصى صارم لكل نموذج (الرموز المرئية للنموذج)
  2. عدادات مخزن الجلسات: إحصاءات متحركة تُكتب في sessions.json (تُستخدم لـ /status ولوحات المعلومات)

إذا كنت تضبط الحدود:

  • تأتي نافذة السياق من كتالوج النماذج (ويمكن تجاوزها عبر الإعدادات).
  • contextTokens في المخزن قيمة تقدير/إبلاغ وقت التشغيل؛ لا تعاملها كضمان صارم.

للمزيد، راجع /token-use.


Compaction: ما هو

يلخص Compaction المحادثة الأقدم في إدخال compaction مستمر في النص الحواري ويبقي الرسائل الحديثة سليمة.

بعد Compaction، ترى الدورات المستقبلية:

  • ملخص Compaction
  • الرسائل بعد firstKeptEntryId

Compaction مستمر (على عكس تقليم الجلسة). راجع /concepts/session-pruning.

حدود أجزاء Compaction واقتران الأدوات

عندما يقسم OpenClaw نصا طويلا إلى أجزاء Compaction، فإنه يبقي استدعاءات أدوات المساعد مقترنة بإدخالات toolResult المطابقة لها.

  • إذا وقع تقسيم حصة الرموز بين استدعاء أداة ونتيجته، فإن OpenClaw ينقل الحد إلى رسالة استدعاء الأداة الخاصة بالمساعد بدلا من فصل الزوج.
  • إذا كان من شأن كتلة نتيجة أداة لاحقة أن تدفع الجزء فوق الهدف، فإن OpenClaw يحافظ على كتلة الأداة المعلقة هذه ويبقي الذيل غير الملخص سليما.
  • لا تبقي كتل استدعاء الأدوات الملغاة/الخاطئة تقسيما معلقا مفتوحا.

متى يحدث Compaction التلقائي (وقت تشغيل Pi)

في وكيل Pi المضمن، يتم تشغيل Compaction التلقائي في حالتين:

  1. استرداد الفائض: يعيد النموذج خطأ فيض سياق (request_too_large, context length exceeded, input exceeds the maximum number of tokens, input token count exceeds the maximum number of input tokens, input is too long for the model, ollama error: context length exceeded، ومتغيرات مشابهة بشكل موفر) ← ضغط ← إعادة المحاولة.
  2. صيانة العتبة: بعد دورة ناجحة، عندما:

contextTokens > contextWindow - reserveTokens

حيث:

  • contextWindow هي نافذة سياق النموذج
  • reserveTokens هي مساحة احتياطية محجوزة للمطالبات + خرج النموذج التالي

هذه دلالات وقت تشغيل Pi (يستهلك OpenClaw الأحداث، لكن Pi يقرر متى يجري Compaction).

يمكن لـ OpenClaw أيضا تشغيل Compaction محلي استباقي قبل فتح التشغيل التالي عندما يكون agents.defaults.compaction.maxActiveTranscriptBytes مضبوطا ويبلغ ملف النص النشط ذلك الحجم. هذا حارس لحجم الملف لتكلفة إعادة الفتح المحلية، وليس أرشفة أولية: ما زال OpenClaw يشغل Compaction الدلالي العادي، ويتطلب truncateAfterCompaction حتى يصبح الملخص المضغوط نصا لاحقا جديدا.

بالنسبة لتشغيلات Pi المضمنة، يضيف agents.defaults.compaction.midTurnPrecheck.enabled: true حارسا اختياريا لحلقة الأدوات. بعد إلحاق نتيجة أداة وقبل استدعاء النموذج التالي، يقدر OpenClaw ضغط المطالبة باستخدام منطق الميزانية الاستباقية نفسه المستخدم عند بداية الدورة. إذا لم يعد السياق مناسبا، فإن الحارس لا يجري Compaction داخل خطاف transformContext الخاص بـ Pi. بل يطلق إشارة فحص مسبق منظمة في منتصف الدورة، ويوقف إرسال المطالبة الحالي، ويتيح للحلقة الخارجية استخدام مسار الاسترداد الموجود: اقتطاع نتائج الأدوات كبيرة الحجم عندما يكون ذلك كافيا، أو تشغيل وضع Compaction المهيأ وإعادة المحاولة. يكون الخيار معطلا افتراضيا ويعمل مع وضعي Compaction default وsafeguard، بما في ذلك Compaction الوقائي المدعوم بموفر. هذا مستقل عن maxActiveTranscriptBytes: يعمل حارس حجم البايت قبل فتح دورة، بينما يعمل الفحص المسبق في منتصف الدورة لاحقا داخل حلقة أدوات Pi المضمنة بعد إلحاق نتائج أدوات جديدة.


إعدادات Compaction (reserveTokens, keepRecentTokens)

توجد إعدادات Compaction الخاصة بـ Pi في إعدادات Pi:

{
  compaction: {
    enabled: true,
    reserveTokens: 16384,
    keepRecentTokens: 20000,
  },
}

يفرض OpenClaw أيضا حد أمان أدنى للتشغيلات المضمنة:

  • إذا كان compaction.reserveTokens < reserveTokensFloor، يرفعه OpenClaw.
  • الحد الأدنى الافتراضي هو 20000 رمز.
  • اضبط agents.defaults.compaction.reserveTokensFloor: 0 لتعطيل الحد الأدنى.
  • إذا كان أعلى بالفعل، يتركه OpenClaw كما هو.
  • يحترم /compact اليدوي قيمة agents.defaults.compaction.keepRecentTokens الصريحة ويحافظ على نقطة قص الذيل الحديث في Pi. من دون ميزانية احتفاظ صريحة، يظل Compaction اليدوي نقطة تحقق صارمة ويبدأ السياق المعاد بناؤه من الملخص الجديد.
  • اضبط agents.defaults.compaction.midTurnPrecheck.enabled: true لتشغيل الفحص المسبق الاختياري لحلقة الأدوات بعد نتائج الأدوات الجديدة وقبل استدعاء النموذج التالي. هذا مشغل فقط؛ ما زال إنشاء الملخص يستخدم مسار Compaction المهيأ. وهو مستقل عن maxActiveTranscriptBytes، وهو حارس حجم البايت لنص نشط عند بداية الدورة.
  • اضبط agents.defaults.compaction.maxActiveTranscriptBytes على قيمة بايت أو سلسلة مثل "20mb" لتشغيل Compaction المحلي قبل دورة عندما يكبر النص النشط. لا يكون هذا الحارس نشطا إلا عندما يكون truncateAfterCompaction مفعلا أيضا. اتركه غير مضبوط أو اضبطه على 0 للتعطيل.
  • عندما يكون agents.defaults.compaction.truncateAfterCompaction مفعلا، يدور OpenClaw النص النشط إلى JSONL لاحق مضغوط بعد Compaction. يبقى النص الكامل القديم مؤرشفا ومربوطا من نقطة تحقق Compaction بدلا من إعادة كتابته في مكانه.

السبب: ترك مساحة احتياطية كافية لأعمال "الصيانة" متعددة الدورات (مثل كتابات الذاكرة) قبل أن يصبح Compaction لا مفر منه.

التنفيذ: ensurePiCompactionReserveTokens() في src/agents/pi-settings.ts (يستدعى من src/agents/pi-embedded-runner.ts).


موفرو Compaction القابلون للتوصيل

يمكن لـ Plugins تسجيل موفر Compaction عبر registerCompactionProvider() على واجهة Plugin API. عندما يكون agents.defaults.compaction.provider مضبوطا على معرف موفر مسجل، يفوض امتداد safeguard التلخيص إلى ذلك الموفر بدلا من مسار summarizeInStages المدمج.

  • provider: معرف Plugin مسجل لموفر Compaction. اتركه غير مضبوط للتلخيص الافتراضي عبر LLM.
  • ضبط provider يفرض mode: "safeguard".
  • يتلقى الموفرون تعليمات Compaction نفسها وسياسة الحفاظ على المعرفات نفسها التي يتلقاها المسار المدمج.
  • ما زال safeguard يحافظ على سياق لاحقة الدورة الحديثة والدورة المقسمة بعد خرج الموفر.
  • يعيد التلخيص المدمج في safeguard استخلاص الملخصات السابقة مع الرسائل الجديدة بدلا من الحفاظ على الملخص السابق الكامل حرفيا.
  • يفعّل وضع safeguard عمليات تدقيق جودة الملخص افتراضيا؛ اضبط qualityGuard.enabled: false لتخطي سلوك إعادة المحاولة عند الخرج المشوه.
  • إذا فشل الموفر أو أعاد نتيجة فارغة، يعود OpenClaw تلقائيا إلى التلخيص المدمج عبر LLM.
  • يعاد طرح إشارات الإلغاء/انتهاء المهلة (ولا يتم ابتلاعها) لاحترام إلغاء المستدعي.

المصدر: src/plugins/compaction-provider.ts, src/agents/pi-hooks/compaction-safeguard.ts.


الأسطح المرئية للمستخدم

يمكنك مراقبة Compaction وحالة الجلسة عبر:

  • /status (في أي جلسة دردشة)
  • openclaw status (CLI)
  • openclaw sessions / sessions --json
  • الوضع المطول: 🧹 Auto-compaction complete + عدد مرات Compaction

صيانة صامتة (NO_REPLY)

يدعم OpenClaw دورات "صامتة" للمهام الخلفية حيث يجب ألا يرى المستخدم الخرج الوسيط.

العرف:

  • يبدأ المساعد خرجه بالرمز الصامت الدقيق NO_REPLY / no_reply للإشارة إلى "لا تسلم ردا إلى المستخدم".
  • يزيل OpenClaw هذا أو يكبته في طبقة التسليم.
  • كبت الرمز الصامت الدقيق غير حساس لحالة الأحرف، لذا فإن NO_REPLY و no_reply كلاهما يحتسب عندما تكون الحمولة كلها مجرد الرمز الصامت.
  • هذا مخصص فقط لدورات الخلفية/عدم التسليم الحقيقية؛ وليس اختصارا لطلبات المستخدم العملية العادية.

اعتبارا من 2026.1.10، يكبت OpenClaw أيضا بث المسودة/الكتابة عندما يبدأ جزء جزئي بـ NO_REPLY، حتى لا تسرب العمليات الصامتة خرجا جزئيا في منتصف الدورة.


"تفريغ الذاكرة" قبل Compaction (منفذ)

الهدف: قبل حدوث Compaction التلقائي، تشغيل دورة وكيلية صامتة تكتب حالة دائمة إلى القرص (مثل memory/YYYY-MM-DD.md في مساحة عمل الوكيل) حتى لا يستطيع Compaction محو السياق الحرج.

يستخدم OpenClaw نهج التفريغ قبل العتبة:

  1. راقب استخدام سياق الجلسة.
  2. عندما يتجاوز "عتبة ناعمة" (أدنى من عتبة Compaction الخاصة بـ Pi)، شغل توجيها صامتا "اكتب الذاكرة الآن" إلى الوكيل.
  3. استخدم الرمز الصامت الدقيق NO_REPLY / no_reply حتى لا يرى المستخدم أي شيء.

الإعداد (agents.defaults.compaction.memoryFlush):

  • enabled (الافتراضي: true)
  • model (تجاوز اختياري ودقيق للموفر/النموذج لدورة التفريغ، مثلا ollama/qwen3:8b)
  • softThresholdTokens (الافتراضي: 4000)
  • prompt (رسالة المستخدم لدورة التفريغ)
  • systemPrompt (مطالبة نظام إضافية مرفقة لدورة التفريغ)

ملاحظات:

  • تتضمن المطالبة/مطالبة النظام الافتراضية تلميح NO_REPLY لكبت التسليم.
  • عندما يكون model مضبوطا، تستخدم دورة التفريغ ذلك النموذج من دون وراثة سلسلة الرجوع الاحتياطي للجلسة النشطة، لذلك لا تعود الصيانة المحلية فقط بصمت إلى نموذج محادثة مدفوع.
  • يعمل التفريغ مرة واحدة لكل دورة Compaction (متتبعة في sessions.json).
  • يعمل التفريغ فقط لجلسات Pi المضمنة (تتخطاه خلفيات CLI).
  • يتم تخطي التفريغ عندما تكون مساحة عمل الجلسة للقراءة فقط (workspaceAccess: "ro" أو "none").
  • راجع الذاكرة لتخطيط ملفات مساحة العمل وأنماط الكتابة.

يكشف Pi أيضا خطاف session_before_compact في واجهة API الخاصة بالامتداد، لكن منطق التفريغ في OpenClaw يعيش اليوم على جانب Gateway.


قائمة تحقق استكشاف الأخطاء وإصلاحها

  • مفتاح الجلسة خاطئ؟ ابدأ من /concepts/session وتأكد من sessionKey في /status.
  • عدم تطابق بين المخزن والنص؟ تأكد من مضيف Gateway ومسار المخزن من openclaw status.
  • تكرار Compaction بشكل مزعج؟ تحقق من:
    • نافذة سياق النموذج (صغيرة جدا)
    • إعدادات Compaction (reserveTokens مرتفع جدا لنافذة النموذج وقد يسبب Compaction مبكرا)
    • تضخم نتائج الأدوات: فعّل/اضبط تقليم الجلسة
  • تسرب الدورات الصامتة؟ تأكد من أن الرد يبدأ بـ NO_REPLY (رمز دقيق غير حساس لحالة الأحرف) وأنك تستخدم بنية تتضمن إصلاح كبت البث.

ذو صلة