المحتويات
هل كنت تعمل في Claude Code فظهر فجأة هذا الخطأ وتوقفت الجلسة عن الاستجابة تماماً؟
API Error: 400 messages.3.content.40: `thinking` or
`redacted_thinking` blocks in the latest assistant message
cannot be modified. These blocks must remain as they were
in the original response.
الجزء المزعج: بمجرد ظهوره، يُطلق كل إدخال لاحق الخطأ نفسه. تكتب، تضغط Enter، وتحصل على الـ 400 نفسه. تدخل الجلسة حالة "تجمّد". هذا خطأ معروف بعدة تذاكر مفتوحة على المستودع الرسمي لـ Anthropic (#10199 و#12225 و#13012 و#22278 و#63147 وغيرها).
باختصار مقدّم: السبب هو "تلف كتل extended thinking عند إعادة إرسال سجل المحادثة." تحمل كتل التفكير توقيعاً تشفيرياً (signature)، ويتحقّق الـ API من مطابقة التوقيع للمحتوى بايتاً ببايت. وعندما يعيد Claude Code بناء السجل وفيه خلل - مثلاً إفراغ نص التفكير مع إبقاء التوقيع - لا يعود التوقيع مطابقاً فيرفضه الـ API. أسرع مخرج هو "اضغط Esc مرتين واستخدم /rewind للعودة إلى نقطة فحص"، أو ابدأ جلسة جديدة. يغطّي هذا المقال الآلية، والأسباب الخمسة الجذرية، وثلاثة حلول للمستخدمين، وإجراءات وقائية للمطوّرين، ومنع التكرار.
الصورة الكاملة لخطأ كتلة التفكير
- إن لم يتطابق الـ "signature"، يرفض الـ API المحادثة بأكملها
خطأ معروف بعدة تذاكر على المستودع الرسمي لـ Anthropic.
الجوهر: قاعدة الـ API الصارمة بأن "كتل التفكير يجب أن تبقى تماماً كما في الرد الأصلي."
1. ماذا يقول هذا الخطأ فعلاً
بعبارة بسيطة، تقول الرسالة: "لا يمكن تعديل كتل thinking أو redacted_thinking في آخر رسالة من المساعد. يجب أن تبقى هذه الكتل كما كانت في الرد الأصلي."
أي أن الـ API يقول لك: "كتلة التفكير داخل سجل المحادثة الذي أرسلته (أنت العميل) إليّ تختلف عمّا أعدته لك آخر مرة. لقد جرى تعديلها. لذا لن أقبلها." يفترض Claude API أنك "تُضمّن الرد السابق في السجل وتعيد إرساله دون تغيير" في المحادثات متعددة الأدوار - وتحمل كتلة التفكير على وجه الخصوص قيداً صارماً بـ "لا تغيّر حرفاً واحداً". وmessages.3.content.40 معلومة موضعية: "كتلة المحتوى رقم 41 من الرسالة رقم 4" هي محل المشكلة.
النقطة المهمة: في أغلب الحالات هذا ليس خطأً في شيفرتك أو مطالبتك. السبب الرئيسي خلل في طريقة إعادة Claude Code بناء سجل المحادثة (ملف الجلسة JSONL) يُتلف كتل التفكير. لذا لا داعي للقلق من "هل أستخدمه بطريقة خاطئة؟" - إنه خطأ معروف وله حلول التفافية.
2. الخلفية: extended thinking وآلية الـ "signature"
لماذا كتلة التفكير وحدها بهذه الصرامة؟ السبب يكمن في طريقة عمل extended thinking.
عندما يردّ Claude مع تفعيل extended thinking، يولّد "كتلة تفكير" قبل الإجابة. هذا هو الاستدلال الوسيط لدى Claude - الجزء الداخلي من "كيف فكّر" الذي يرفع جودة الإجابة النهائية. وتُسند إلى هذه الكتلة توقيع تشفيري (signature) - أشبه بتوقيع رقمي يضمن "أن محتوى التفكير هذا وَلّده Claude فعلاً ولم يُعدَّل."
في المحادثات متعددة الأدوار وحلقات tool use، يُعاد إرسال التبادل السابق بأكمله إلى الـ API في كل مرة. ويجب إرسال كتل التفكير أيضاً، لكن التوقيع يُحتسب على "كامل نص التفكير الأصلي" - فإذا تغيّر النص بحرف واحد، فشل التحقق من التوقيع. لأسباب أمنية، يرفض الـ API كتل التفكير التي لا يتطابق توقيعها. هذا هو جوهر خطأ الـ 400.
لماذا يوجد التوقيع
منع تعديل كتل التفكير يحجب prompt injection وتزييف التفكير. إنها آلية أمنية تحمي حقيقة أن "Claude فكّر بهذا فعلاً" - فللصرامة سبب.
3. لماذا يحدث - 5 أسباب جذرية
تنقسم السيناريوهات الملموسة لعدم تطابق التوقيع إلى خمسة - مُجمّعة من تذاكر Anthropic الرسمية وتقارير المجتمع.
خمسة أسباب جذرية لعدم تطابق التوقيع
القاسم المشترك: إذا اختلفت كتلة تفكير عن الأصل ولو ببايت واحد، تحصل دائماً على 400.
الأسباب 1-4 أخطاء في Claude Code / الوسيط؛ والسبب 5 مشكلة تنفيذ ذاتي.
4. ثلاثة حلول فورية (لمستخدمي Claude Code)
عندما تتجمّد جلستك، جرّب ثلاث طرق بترتيب سرعة الاستعادة.
ثلاثة حلول بترتيب سرعة الاستعادة
/rewind. ارجع إلى نقطة الفحص قبل الدور المعطوب. أفضل خطوة - تستعيد مع الحفاظ على السياق./clear أو ابدأ جلسة جديدة. الأكثر موثوقية، لكنه يفقد السياق. دوّن أو احفظ عملك المهم في git أولاً.
جرّب الحل 1 (Esc×2 / rewind) أولاً. إن فشل، فالحل 2. وإن لزمك الحفاظ على السياق، فالحل 3.
ودائماً حدّث Claude Code إلى أحدث إصدار (تصلحه Anthropic تدريجياً).
ملاحظة على الحل 3: نشر المجتمع أداة "Claude Code thinking blocks fix" (مثل miteshashar/claude-code-thinking-blocks-fix على GitHub). فهي تحذف كل كتل محتوى التفكير من الجلسة JSONL، فتقضي على مشكلة التوقيع مع إبقاء سجل المحادثة. تستحق التبنّي إن كنت تصادفها كثيراً أو تستخدم جلسات طويلة بكثافة. لكنها أداة غير رسمية، فاستخدمها على مسؤوليتك - خذ نسخة احتياطية من الـ JSONL قبل تشغيلها.
أهم إصلاح دائم هو "إبقاء Claude Code على أحدث إصدار." شغّل claude update أو اتّبع خطوات التحديث الرسمية. تطرح Anthropic تدريجياً "حارساً دفاعياً يكتشف كتل التفكير ذات النص الفارغ مع توقيع ويجرّدها قبل الإرسال" لهذه السلسلة من الأخطاء (#10199 و#12225 و#63147 وغيرها). الإصدارات الأقدم تصادفها أكثر.
5. للمطوّرين: امنعه في تطبيقك (API/SDK)
إن كنت تبني تطبيقاً يستدعي Claude API/SDK بنفسك (extended thinking + tool use)، فستصادف الخطأ نفسه في تنفيذك. ثلاثة مبادئ تمنعه.
// BAD: deleting/altering thinking blocks before sending back
const history = previousMessages.map(m => ({
...m,
content: m.content.filter(b => b.type !== 'thinking') // mismatches signature
}));
// GOOD pattern 1: keep thinking blocks "exactly as-is"
// Push the assistant message from the API into history untouched
messages.push(assistantMessageFromApi); // keep the signature intact
// GOOD pattern 2: "fully drop" thinking from past turns
// Don't send empty text + signature; omit the block entirely
const clean = previousMessages.map(m => {
if (m.role !== 'assistant') return m;
return {
...m,
content: m.content.filter(b =>
b.type !== 'thinking' && b.type !== 'redacted_thinking'
),
};
});
// NOTE: do NOT drop them from the "latest" assistant message (during tool use)
المبادئ الثلاثة: 1. احفظ نص التفكير الموقَّع كاملاً وأعد تمريره سليماً. 2. إن لم تكن سترسل تفكير الأدوار السابقة، فاحذف الكتلة بأكملها (النص الفارغ مع توقيع هو أسوأ حالة). 3. أضِف حارساً دفاعياً وقت بناء الطلب يكتشف كتل التفكير ذات "النص الفارغ مع وجود توقيع" ويجرّدها.
القاعدة الحديدية لحلقات tool use
في حلقات extended thinking + tool use (tool_use → tool_result)، لا تغيّر أبداً كتلة التفكير في آخر رسالة من المساعد. يجب أن يتضمّن الطلب التالي الذي يعيد tool_result التفكير + tool_use السابقين كما هما تماماً. وإن كنت تستخدم Claude Agent SDK أو Vercel AI SDK، فتحقّق من أن المكتبة تعالج هذا بشكل صحيح.
6. تمييزه عن الأخطاء المشابهة
توجد عدة أخطاء 400 متعلقة بالتفكير، يسهل الخلط بينها. ميّز الثلاثة الرئيسية.
| رسالة الخطأ | المعنى | الحل الرئيسي |
|---|---|---|
| thinking blocks ... cannot be modified | موضوع هذا المقال. عدم تطابق التوقيع والمحتوى | /rewind، جلسة جديدة، التحديث إلى الأحدث |
| Invalid signature in thinking block | التوقيع نفسه غير صالح (غالباً بسبب تعديل الوسيط) | راجع إعداد الوسيط، اتصل بالـ API مباشرة |
| The final block in an assistant message cannot be thinking | تنتهي رسالة المساعد بتفكير (تحتاج إلى text أو tool_use في النهاية) | أصلح بنية الرسالة، حدّث الـ SDK |
السبب الجذري المشترك هو "عدم معالجة كتل extended thinking بشكل صحيح." لمستخدمي Claude Code، يُحلّ معظمها بـ /rewind + التحديث إلى أحدث إصدار. وللتطبيقات الذاتية، تحتاج إلى مراجعة بنية الرسالة وتنفيذ المكتبة. وإن كنت تمرّ عبر وسيط (CLIProxyAPI، بوابات متنوعة)، فاشتبه أولاً في أن الوسيط يعدّل التفكير.
7. قائمة منع التكرار
قائمة عملية لمنع التكرار المتكرر.
مستخدمو Claude Code: 1. أبقِه على أحدث إصدار بـ claude update (أكبر إجراء وقائي). 2. أعِد ضبط الجلسات الطويلة جداً دورياً بـ /clear (يقلّل خطر التداخل). 3. أودِع عملك في git بشكل متكرر للمهام المهمة (قابل للاستعادة حتى لو تجمّدت الجلسة). 4. فكّر في أداة إصلاح JSONL إن تكرر كثيراً. 5. أبلغ عن إعادة الإنتاج في تذاكر Anthropic الرسمية (يسرّع الإصلاحات).
مطوّرو API/SDK: 1. أدخِل رسائل المساعد إلى السجل دون تغيير رد الـ API. 2. إن حذفت التفكير السابق، احذف الكتلة بأكملها (لا نص فارغ مع توقيع). 3. أضِف حارساً دفاعياً وقت بناء الطلب (اكتشف النص الفارغ مع توقيع ← جرّد). 4. استخدم أحدث SDK رسمي وقلّل من إعادة تشكيل الرسائل المخصّصة. 5. إن كنت خلف وسيط، فتحقّق من شفافية التفكير.
الخلاصة
يحدث خطأ Claude Code "thinking blocks ... cannot be modified" 400 عندما تتلف كتل extended thinking عند إعادة إرسال السجل ولا يعود التوقيع التشفيري مطابقاً للمحتوى. إنه خطأ معروف بعدة تذاكر على المستودع الرسمي لـ Anthropic، وفي أغلب الحالات ليس خطأك. الأسباب الخمسة: خلل استئناف الجلسة (الأكثر شيوعاً)، تداخل التدفّق، منطق الإصلاح الخارج عن السيطرة، الوسطاء من طرف ثالث، وتعديل السجل في تطبيقك أنت.
لمستخدمي Claude Code، أسرع استعادة هي 1. اضغط Esc×2 / /rewind للعودة إلى نقطة فحص؛ إن فشل، فـ 2. جلسة جديدة (/clear)؛ وللحفاظ على السياق، 3. أداة إصلاح JSONL. وأهم إصلاح دائم هو "تحديث Claude Code إلى أحدث إصدار" - تطرح Anthropic حارساً دفاعياً تدريجياً. وعلى مطوّري API/SDK اتّباع المبادئ الثلاثة: إعادة تمرير كتل التفكير كما هي / حذفها بالكامل عند الإسقاط / إضافة حارس دفاعي.
ذات صلة: ما هو Claude Agent SDK، دليل Vercel AI SDK الكامل، ما هو Cursor، سير عمل النشر بـ Claude Code/Cursor.
الأسئلة الشائعة
س. هل هذا الخطأ خطأ في مطالبتي أو شيفرتي؟
ج. في أغلب الحالات، لا. إن ظهر أثناء استخدام Claude Code، فهو شبه مؤكد خطأ معروف من جهة Claude Code (عيب في إعادة بناء سجل الجلسة). عدة تذاكر مفتوحة على المستودع الرسمي لـ Anthropic والإصلاحات جارية. لا داعي للوم نفسك. فقط في التطبيقات الذاتية (التي تستدعي الـ API مباشرة) تحتاج إلى مراجعة تنفيذك.
س. /rewind لا يصلحه. ماذا الآن؟
ج. بدء جلسة جديدة (/clear) هو الأكثر موثوقية. تفقد السياق لكنك تخرج من حالة التجمّد بشكل مؤكد. خبّئ عملك المهم عبر git commit أو ملاحظات أولاً. إن تكرر، حدّث Claude Code إلى أحدث إصدار؛ وإن استمر، ففكّر في أداة إصلاح JSONL.
س. هل أتجنّبه بإيقاف extended thinking؟
ج. تقنياً نعم، لكن extended thinking يحسّن الدقة بشكل ملحوظ في المهام المعقّدة، لذا لا يُنصح بإيقافه. عالجه أولاً بـ التحديث إلى أحدث إصدار + /rewind، ولا تفكّر في هذا إلا كملاذ أخير في بيئات خاصة (مثلاً خلف وسيط) ما زال يتكرر فيها.
س. هل أداة إصلاح JSONL آمنة؟
ج. إنها غير رسمية، فاستخدمها على مسؤوليتك. خذ دائماً نسخة احتياطية من الجلسة JSONL قبل استخدامها. الآلية هي "حذف كل كتل محتوى التفكير مع إبقاء سجل المحادثة"، وهي آمنة من حيث المبدأ - لكن الإصلاح الرسمي (التحديث إلى أحدث إصدار) يبقى الحل الحقيقي.
س. في تطبيقي أنا، يُطلق دمج tool use مع التفكير هذا الخطأ.
ج. السبب هو "أنك تغيّر كتلة التفكير في آخر رسالة من المساعد." يجب أن يتضمّن الطلب التالي الذي يعيد tool_result كتل التفكير + tool_use السابقة تماماً كما أعادها الـ API (مع التوقيع). وإن أسقطت تفكير الأدوار السابقة، فاحذف الكتلة بأكملها (لا نص فارغ مع توقيع). أحدث SDK رسمي يعالج معظم هذا تلقائياً.