Technical reference

نظافة سجل المحادثة

يطبّق OpenClaw إصلاحات خاصة بالمزوّد على سجلات المحادثة قبل التشغيل (بناء سياق النموذج). معظم هذه الإصلاحات هي تعديلات داخل الذاكرة تُستخدم لتلبية متطلبات المزوّدين الصارمة. قد تمر أيضًا عملية إصلاح منفصلة لملف الجلسة لإعادة كتابة JSONL المخزّن قبل تحميل الجلسة، ولكن فقط للأسطر المشوّهة أو الأدوار المستمرة غير الصالحة كسجلات دائمة. تُحفَظ ردود المساعد المسلّمة على القرص؛ ولا يحدث تجريد تمهيد المساعد الخاص بالمزوّد إلا أثناء إنشاء الحمولات الصادرة. عند حدوث إصلاح، يُنسخ الملف الأصلي احتياطيًا إلى جانب ملف الجلسة.

يشمل النطاق:

  • إبقاء سياق المطالبة الخاص بوقت التشغيل خارج أدوار سجل المحادثة المرئية للمستخدم
  • تنقية معرّفات استدعاء الأدوات
  • التحقق من صحة مدخلات استدعاء الأدوات
  • إصلاح مطابقة نتائج الأدوات
  • التحقق من صحة الأدوار / ترتيبها
  • تنظيف توقيع الأفكار
  • تنظيف توقيع التفكير
  • تنقية حمولة الصور
  • تنظيف كتل النص الفارغة قبل إعادة التشغيل لدى المزوّد
  • وسم منشأ مدخلات المستخدم (للمطالبات الموجّهة بين الجلسات)
  • إصلاح دور خطأ المساعد الفارغ لإعادة تشغيل Bedrock Converse

إذا كنت بحاجة إلى تفاصيل تخزين سجل المحادثة، فراجع:


القاعدة العامة: سياق وقت التشغيل ليس سجل محادثة المستخدم

يمكن إضافة سياق وقت التشغيل/النظام إلى مطالبة النموذج لدور معيّن، لكنه ليس محتوى مؤلفًا من المستخدم النهائي. يحتفظ OpenClaw بنص مطالبة منفصل موجّه لسجل المحادثة لردود Gateway، والمتابعات الموضوعة في قائمة الانتظار، وACP، وCLI، وعمليات تشغيل Pi المضمنة. تستخدم أدوار المستخدم المرئية المخزّنة نص سجل المحادثة هذا بدلًا من المطالبة المعززة بسياق وقت التشغيل.

بالنسبة إلى الجلسات القديمة التي خزّنت بالفعل أغلفة وقت التشغيل، تطبّق أسطح سجل Gateway إسقاطًا للعرض قبل إرجاع الرسائل إلى عملاء WebChat، أو TUI، أو REST، أو SSE.


أين يعمل هذا

تتم مركزة كل نظافة سجل المحادثة في المشغّل المضمن:

  • اختيار السياسة: src/agents/transcript-policy.ts
  • تطبيق التنقية/الإصلاح: sanitizeSessionHistory في src/agents/pi-embedded-runner/replay-history.ts

تستخدم السياسة provider وmodelApi وmodelId لتحديد ما يجب تطبيقه.

بعيدًا عن نظافة سجل المحادثة، تُصلح ملفات الجلسة (عند الحاجة) قبل التحميل:

  • repairSessionFileIfNeeded في src/agents/session-file-repair.ts
  • يُستدعى من run/attempt.ts وcompact.ts (المشغّل المضمن)

القاعدة العامة: تنقية الصور

تُنقّى حمولات الصور دائمًا لمنع رفضها من جهة المزوّد بسبب حدود الحجم (تصغير/إعادة ضغط صور base64 الزائدة الحجم).

يساعد هذا أيضًا في ضبط ضغط الرموز الناتج عن الصور للنماذج القادرة على الرؤية. تقلل الأبعاد القصوى الأصغر عمومًا استخدام الرموز؛ وتحافظ الأبعاد الأكبر على التفاصيل.

التنفيذ:

  • sanitizeSessionMessagesImages في src/agents/pi-embedded-helpers/images.ts
  • sanitizeContentBlocksImages في src/agents/tool-images.ts
  • يمكن ضبط الحد الأقصى لجانب الصورة عبر agents.defaults.imageMaxDimensionPx (الافتراضي: 1200).
  • تُزال كتل النص الفارغة أثناء مرور هذه العملية على محتوى إعادة التشغيل. أدوار المساعد التي تصبح فارغة تُحذف من نسخة إعادة التشغيل؛ أما أدوار المستخدم ونتائج الأدوات التي تصبح فارغة فتتلقى عنصرًا نائبًا غير فارغ للمحتوى المحذوف.

القاعدة العامة: استدعاءات الأدوات المشوّهة

تُحذف كتل استدعاء الأدوات الخاصة بالمساعد التي تفتقد كلًا من input وarguments قبل بناء سياق النموذج. يمنع هذا رفض المزوّدين لاستدعاءات أدوات مخزّنة جزئيًا (على سبيل المثال، بعد فشل بسبب حد معدل الطلبات).

التنفيذ:

  • sanitizeToolCallInputs في src/agents/session-transcript-repair.ts
  • يُطبّق في sanitizeSessionHistory في src/agents/pi-embedded-runner/replay-history.ts

القاعدة العامة: منشأ المدخلات بين الجلسات

عندما يرسل وكيل مطالبة إلى جلسة أخرى عبر sessions_send (بما في ذلك خطوات الرد/الإعلان بين الوكلاء)، يحفظ OpenClaw دور المستخدم المُنشأ مع:

  • message.provenance.kind = "inter_session"

يضيف OpenClaw أيضًا في بداية الدور نفسه علامة [Inter-session message ... isUser=false] قبل نص المطالبة الموجّهة حتى تتمكن استدعاءة النموذج النشطة من تمييز مخرجات الجلسة الأجنبية عن تعليمات المستخدم النهائي الخارجية. تتضمن هذه العلامة الجلسة المصدر، والقناة، والأداة عندما تكون متاحة. لا يزال سجل المحادثة يستخدم role: "user" للتوافق مع المزوّدين، لكن النص المرئي وبيانات المنشأ الوصفية كلاهما يعلّمان الدور على أنه بيانات بين الجلسات.

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


مصفوفة المزوّدين (السلوك الحالي)

OpenAI / OpenAI Codex

  • تنقية الصور فقط.
  • حذف توقيعات الاستدلال اليتيمة (عناصر الاستدلال المستقلة بلا كتلة محتوى لاحقة) لسجلات OpenAI Responses/Codex، وحذف استدلال OpenAI القابل لإعادة التشغيل بعد تبديل مسار النموذج.
  • الحفاظ على حمولات عناصر استدلال OpenAI Responses القابلة لإعادة التشغيل، بما في ذلك عناصر الملخص الفارغ المشفّرة، حتى تحافظ إعادة التشغيل اليدوية/WebSocket على حالة rs_* المطلوبة مقترنة بعناصر مخرجات المساعد.
  • تتبع Native ChatGPT Codex Responses مطابقة سلك Codex عبر إعادة تشغيل حمولات الاستدلال/الرسائل/الدوال السابقة من Responses بلا معرّفات عناصر سابقة، مع الحفاظ على prompt_cache_key الخاص بالجلسة.
  • لا توجد تنقية لمعرّفات استدعاء الأدوات.
  • قد ينقل إصلاح مطابقة نتائج الأدوات المخرجات الحقيقية المطابقة ويولّد مخرجات aborted بأسلوب Codex لاستدعاءات الأدوات المفقودة.
  • لا يوجد تحقق من صحة الأدوار أو إعادة ترتيبها.
  • تُولّد مخرجات أدوات عائلة OpenAI Responses المفقودة كـ aborted لمطابقة تطبيع إعادة تشغيل Codex.
  • لا يوجد تجريد لتوقيع الأفكار.

OpenAI-compatible Gemma 4

  • تُجرّد كتل التفكير/الاستدلال التاريخية الخاصة بالمساعد قبل إعادة التشغيل حتى لا تستقبل خوادم Gemma 4 المحلية المتوافقة مع OpenAI محتوى استدلال من أدوار سابقة.
  • تحتفظ متابعات استدعاء الأدوات الحالية في الدور نفسه بكتلة استدلال المساعد مرفقة باستدعاء الأداة إلى أن تتم إعادة تشغيل نتيجة الأداة.

Google (Generative AI / Gemini CLI / Antigravity)

  • تنقية معرّفات استدعاء الأدوات: حروف وأرقام فقط بصرامة.
  • إصلاح مطابقة نتائج الأدوات ونتائج أدوات اصطناعية.
  • التحقق من صحة الأدوار (تناوب أدوار بأسلوب Gemini).
  • إصلاح ترتيب أدوار Google (إضافة تمهيد مستخدم صغير في البداية إذا بدأ السجل بالمساعد).
  • Antigravity Claude: تطبيع توقيعات التفكير؛ حذف كتل التفكير غير الموقعة.

Anthropic / Minimax (متوافق مع Anthropic)

  • إصلاح مطابقة نتائج الأدوات ونتائج أدوات اصطناعية.
  • التحقق من صحة الأدوار (دمج أدوار المستخدم المتتالية لتلبية التناوب الصارم).
  • تُجرّد أدوار تمهيد المساعد اللاحقة من حمولات Anthropic Messages الصادرة عند تمكين التفكير، بما في ذلك مسارات Cloudflare AI Gateway.
  • تُجرّد كتل التفكير ذات توقيعات إعادة التشغيل المفقودة أو الفارغة أو الخاوية قبل تحويل المزوّد. إذا جعل ذلك دور مساعد فارغًا، يحافظ OpenClaw على شكل الدور بنص غير فارغ للاستدلال المحذوف.
  • تُستبدل أدوار المساعد القديمة التي تحتوي على التفكير فقط والتي يجب تجريدها بنص غير فارغ للاستدلال المحذوف حتى لا تُسقط محولات المزوّد دور إعادة التشغيل.

Amazon Bedrock (Converse API)

  • تُصلح أدوار أخطاء تدفق المساعد الفارغة إلى كتلة نص بديلة غير فارغة قبل إعادة التشغيل. يرفض Bedrock Converse رسائل المساعد التي تحتوي على content: []، لذلك تُصلح أيضًا أدوار المساعد المخزّنة التي تحتوي على stopReason: "error" ومحتوى فارغ على القرص قبل التحميل.
  • تُحذف أدوار أخطاء تدفق المساعد التي تحتوي فقط على كتل نص فارغة من نسخة إعادة التشغيل داخل الذاكرة بدلًا من إعادة تشغيل كتلة فارغة غير صالحة.
  • تُجرّد كتل تفكير Claude ذات توقيعات إعادة التشغيل المفقودة أو الفارغة أو الخاوية قبل إعادة تشغيل Converse. إذا جعل ذلك دور مساعد فارغًا، يحافظ OpenClaw على شكل الدور بنص غير فارغ للاستدلال المحذوف.
  • تُستبدل أدوار المساعد القديمة التي تحتوي على التفكير فقط والتي يجب تجريدها بنص غير فارغ للاستدلال المحذوف حتى تحافظ إعادة تشغيل Converse على شكل الدور الصارم.
  • ترشّح إعادة التشغيل أدوار المساعد الخاصة بمرآة تسليم OpenClaw والمحقونة من Gateway.
  • تُطبّق تنقية الصور عبر القاعدة العامة.

Mistral (بما في ذلك الكشف المستند إلى معرّف النموذج)

  • تنقية معرّفات استدعاء الأدوات: strict9 (حروف وأرقام بطول 9).

OpenRouter Gemini

  • تنظيف توقيع الأفكار: تجريد قيم thought_signature غير base64 (والاحتفاظ بـ base64).

OpenRouter Anthropic

  • تُجرّد أدوار تمهيد المساعد اللاحقة من حمولات نماذج Anthropic المتوافقة مع OpenAI والمتحقق منها عبر OpenRouter عند تمكين الاستدلال، بما يطابق سلوك إعادة التشغيل المباشر لدى Anthropic وCloudflare Anthropic.

كل شيء آخر

  • تنقية الصور فقط.

السلوك التاريخي (قبل 2026.1.22)

قبل إصدار 2026.1.22، طبّق OpenClaw طبقات متعددة من نظافة سجل المحادثة:

  • كان امتداد transcript-sanitize يعمل عند كل بناء للسياق ويمكنه:
    • إصلاح مطابقة استخدام الأدوات/نتائجها.
    • تنقية معرّفات استدعاء الأدوات (بما في ذلك وضع غير صارم يحافظ على _/-).
  • كان المشغّل ينفذ أيضًا تنقية خاصة بالمزوّد، ما أدى إلى تكرار العمل.
  • حدثت طفرات إضافية خارج سياسة المزوّد، بما في ذلك:
    • تجريد وسوم <final> من نص المساعد قبل الاستمرار في التخزين.
    • حذف أدوار أخطاء المساعد الفارغة.
    • اقتطاع محتوى المساعد بعد استدعاءات الأدوات.

تسبّب هذا التعقيد في تراجعات عبر المزوّدين (خصوصًا مطابقة call_id|fc_id في openai-responses). أزالت عملية تنظيف 2026.1.22 الامتداد، ومركزت المنطق في المشغّل، وجعلت OpenAI بلا لمس باستثناء تنقية الصور.

ذو صلة