Technical reference
نظافة النص المنسوخ
تطبّق OpenClaw إصلاحات خاصة بالمزوّد على سجلات المحادثة قبل التشغيل (عند بناء سياق النموذج). معظم هذه الإصلاحات هي تعديلات داخل الذاكرة تُستخدم لتلبية متطلبات المزوّد الصارمة. قد تمرّ أيضًا مرحلة إصلاح منفصلة لملف الجلسة لإعادة كتابة JSONL المخزّن قبل تحميل الجلسة، ولكن فقط للأسطر المشوّهة أو الدورات المستمرة غير الصالحة كسجلات دائمة. تُحفَظ ردود المساعد المسلّمة على القرص؛ أما إزالة بادئة تعبئة المساعد الخاصة بالمزوّد فتحدث فقط أثناء إنشاء الحمولات الصادرة. عند حدوث إصلاح، يُكتب الملف الأصلي إلى شقيق مؤقت باسم *.bak-<pid>-<ts> قبل الاستبدال الذري، ثم يُزال بعد نجاح الاستبدال؛ ولا يُحتفَظ بالنسخة الاحتياطية إلا إذا فشل التنظيف نفسه (وفي هذه الحالة يُبلَّغ عن المسار).
يشمل النطاق:
- إبقاء سياق المطالبة الخاص بوقت التشغيل خارج دورات سجل المحادثة المرئية للمستخدم
- تنقية معرّف استدعاء الأداة
- التحقق من صحة مُدخلات استدعاء الأداة
- إصلاح اقتران نتائج الأدوات
- التحقق من صحة الدورات / ترتيبها
- تنظيف توقيع الفكر
- تنظيف توقيع التفكير
- تنقية حمولة الصور
- تنظيف كتل النص الفارغة قبل إعادة التشغيل لدى المزوّد
- تنظيف دورات الطول الناقصة المكوّنة من الاستدلال فقط قبل إعادة التشغيل لدى المزوّد
- وسم مصدر مُدخلات المستخدم (للمطالبات الموجّهة بين الجلسات)
- إصلاح دورات خطأ المساعد الفارغة لإعادة تشغيل Bedrock Converse
إذا كنت بحاجة إلى تفاصيل تخزين سجل المحادثة، فراجع:
القاعدة العامة: سياق وقت التشغيل ليس سجل محادثة المستخدم
يمكن إضافة سياق وقت التشغيل/النظام إلى مطالبة النموذج لدورة ما، لكنه ليس محتوى ألّفه المستخدم النهائي. تحتفظ OpenClaw بجسم مطالبة منفصل موجّه إلى سجل المحادثة لردود Gateway، والمتابعات الموضوعة في الصف، وACP، وCLI، وتشغيلات OpenClaw المضمّنة. تستخدم دورات المستخدم المرئية المخزّنة جسم سجل المحادثة هذا بدلًا من المطالبة المُثرَاة بسياق وقت التشغيل.
بالنسبة إلى الجلسات القديمة التي استمرت فيها مغلّفات وقت التشغيل بالفعل، تطبّق أسطح سجل Gateway إسقاط عرض قبل إرجاع الرسائل إلى عملاء WebChat أو TUI أو REST أو SSE.
أين يعمل هذا
تتم مركزة كل نظافة سجل المحادثة في المشغّل المضمّن:
- اختيار السياسة:
src/agents/transcript-policy.ts - تطبيق التنقية/الإصلاح:
sanitizeSessionHistoryفيsrc/agents/embedded-agent-runner/replay-history.ts
تستخدم السياسة provider وmodelApi وmodelId لتحديد ما يجب تطبيقه.
وبشكل منفصل عن نظافة سجل المحادثة، تُصلَح ملفات الجلسة (عند الحاجة) قبل التحميل:
repairSessionFileIfNeededفيsrc/agents/session-file-repair.ts- تُستدعى من
run/attempt.tsوcompact.ts(المشغّل المضمّن)
القاعدة العامة: تنقية الصور
تُنقّى حمولات الصور دائمًا لمنع رفضها من جهة المزوّد بسبب حدود الحجم (تصغير/إعادة ضغط صور base64 كبيرة الحجم).
يساعد هذا أيضًا على ضبط ضغط الرموز الناتج عن الصور للنماذج القادرة على الرؤية. الأبعاد القصوى الأقل تقلل عمومًا استخدام الرموز؛ والأبعاد الأعلى تحافظ على التفاصيل.
التنفيذ:
sanitizeSessionMessagesImagesفيsrc/agents/embedded-agent-helpers/images.tssanitizeContentBlocksImagesفيsrc/agents/tool-images.ts- يمكن ضبط الحد الأقصى لجانب الصورة عبر
agents.defaults.imageMaxDimensionPx(الافتراضي:1200). - تُزال كتل النص الفارغة أثناء مرور هذه المرحلة على محتوى إعادة التشغيل. دورات المساعد التي تصبح فارغة تُسقَط من نسخة إعادة التشغيل؛ أما دورات المستخدم ونتائج الأدوات التي تصبح فارغة فتتلقى عنصرًا نائبًا غير فارغ لمحتوى محذوف.
القاعدة العامة: استدعاءات الأدوات المشوّهة
تُسقَط كتل استدعاء أدوات المساعد التي ينقصها كل من input وarguments
قبل بناء سياق النموذج. يمنع هذا رفض المزوّد لاستدعاءات أدوات استُمرت جزئيًا
(على سبيل المثال، بعد فشل بسبب حد المعدل).
التنفيذ:
sanitizeToolCallInputsفيsrc/agents/session-transcript-repair.ts- يُطبَّق في
sanitizeSessionHistoryفيsrc/agents/embedded-agent-runner/replay-history.ts
القاعدة العامة: دورات الاستدلال الناقصة فقط
تُحذَف دورات المساعد التي تصل إلى حد مخرجات المزوّد مع محتوى تفكير أو تفكير منقّح فقط من نسخة إعادة التشغيل داخل الذاكرة. تحتوي هذه الدورات على حالة مزوّد ناقصة وقد تحمل توقيع تفكير جزئيًا.
تبقى دورات الطول الفارغة كما هي، وكذلك دورات الطول التي تتضمن نصًا مرئيًا أو استدعاءات أدوات أو كتل محتوى غير معروفة. لا يُعاد كتابة سجلات المحادثة المخزّنة.
التنفيذ:
normalizeAssistantReplayContentفيsrc/agents/embedded-agent-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للجلسة. - تحافظ إعادة تشغيل عائلة OpenAI Responses على أزواج الاستدلال القانونية
call_*|fc_*للنموذج نفسه، لكنها تطبّع بشكل حتمي معرّفاتcall_id/ عناصر استدعاء الدوال المشوّهة أو الطويلة جدًا قبل تحويل حمولة pi-ai. - قد ينقل إصلاح اقتران نتائج الأدوات المخرجات الحقيقية المطابقة ويُنشئ مخرجات
abortedبنمط Codex لاستدعاءات الأدوات المفقودة. - لا يوجد تحقق من صحة الدورات أو إعادة ترتيبها.
- تُنشأ مخرجات الأدوات المفقودة في عائلة OpenAI Responses كـ
abortedلمطابقة تطبيع إعادة تشغيل Codex. - لا توجد إزالة لتوقيع الفكر.
Chat Completions المتوافقة مع OpenAI
- تُزال كتل تفكير/استدلال المساعد التاريخية قبل إعادة التشغيل حتى لا تتلقى
الخوادم المحلية والمتوافقة مع OpenAI بنمط الوكيل حقول استدلال من دورات سابقة
مثل
reasoningأوreasoning_content. - تحتفظ متابعات استدعاء الأدوات في الدورة نفسها الحالية بكتلة استدلال المساعد مرفقة باستدعاء الأداة حتى تُعاد نتيجة الأداة.
- تحافظ إدخالات النماذج المخصصة/المستضافة ذاتيًا التي تحتوي على
reasoning: trueعلى بيانات الاستدلال الوصفية المُعاد تشغيلها. - يمكن للاستثناءات المملوكة للمزوّد الانسحاب عندما يتطلب بروتوكولها السلكي بيانات الاستدلال الوصفية المُعاد تشغيلها.
Google (Generative AI / Gemini CLI / Antigravity)
- تنقية معرّف استدعاء الأداة: أحرف وأرقام فقط بصرامة.
- إصلاح اقتران نتائج الأدوات ونتائج أدوات اصطناعية.
- التحقق من صحة الدورات (تناوب الدورات بنمط Gemini).
- إصلاح ترتيب دورات Google (إضافة دورة تمهيد مستخدم صغيرة في البداية إذا بدأ السجل بالمساعد).
- Antigravity Claude: تطبيع توقيعات التفكير؛ إسقاط كتل التفكير غير الموقّعة.
Anthropic / Minimax (المتوافق مع Anthropic)
- إصلاح اقتران نتائج الأدوات ونتائج أدوات اصطناعية.
- التحقق من صحة الدورات (دمج دورات المستخدم المتتالية لتلبية التناوب الصارم).
- تُزال دورات تعبئة المساعد اللاحقة من حمولات Anthropic Messages الصادرة عندما يكون التفكير مفعّلًا، بما في ذلك مسارات Cloudflare AI Gateway.
- تُزال توقيعات تفكير المساعد السابقة لـ Compaction قبل إعادة التشغيل لدى المزوّد عندما تكون الجلسة قد خضعت لـ Compaction. تكون توقيعات التفكير مرتبطة تشفيريًا ببادئة المحادثة وقت الإنشاء؛ وبعد Compaction تتغير البادئة (يُستبدل المحتوى الملخّص بملخص Compaction)، لذلك تؤدي إعادة تشغيل التوقيعات الأصلية إلى رفض Anthropic للطلب مع "Invalid signature in thinking block". يُحفَظ نص التفكير ككتلة غير موقعة ثم تتعامل معه القاعدة أدناه.
- تُزال كتل التفكير ذات توقيعات إعادة التشغيل المفقودة أو الفارغة أو الخالية قبل تحويل المزوّد. إذا أدى ذلك إلى إفراغ دورة مساعد، تحافظ OpenClaw على شكل الدورة بنص استدلال محذوف غير فارغ.
- تُستبدل دورات المساعد القديمة المكوّنة من التفكير فقط والتي يجب إزالتها بنص استدلال محذوف غير فارغ حتى لا تُسقِط محولات المزوّد دورة إعادة التشغيل.
Amazon Bedrock (Converse API)
- تُصلَح دورات خطأ بث المساعد الفارغة إلى كتلة نص بديلة غير فارغة قبل
إعادة التشغيل. يرفض Bedrock Converse رسائل المساعد ذات
content: []، لذلك تُصلَح أيضًا دورات المساعد المستمرة ذاتstopReason: "error"والمحتوى الفارغ على القرص قبل التحميل. - تُسقَط دورات خطأ بث المساعد التي تحتوي فقط على كتل نص فارغة من نسخة إعادة التشغيل داخل الذاكرة بدلًا من إعادة تشغيل كتلة فارغة غير صالحة.
- تُزال توقيعات تفكير المساعد السابقة لـ Compaction قبل إعادة التشغيل في Converse عندما تكون الجلسة قد خضعت لـ Compaction، للسبب نفسه المذكور في Anthropic أعلاه.
- تُزال كتل تفكير 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 دون مساس باستثناء تنقية الصور.