هل كنت تعمل في 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.

إذا فشل التحقق من توقيع كتلة thinking التي تعيد إرسالها، فقد يظهر بدلاً من ذلك الخطأ التالي. وللخطأين المصدر نفسه: لم تعد كتلة thinking مطابقة للاستجابة الأصلية:

API Error: 400 messages.1.content.0:
invalid `signature` in `thinking` block

الجزء المزعج: بمجرد ظهوره، يُطلق كل إدخال لاحق الخطأ نفسه. تكتب، تضغط Enter، وتحصل على الـ 400 نفسه. تدخل الجلسة حالة "تجمّد". هذا خطأ معروف بعدة تذاكر مفتوحة على المستودع الرسمي لـ Anthropic (#10199 و#12225 و#13012 و#22278 و#63147 وغيرها).

باختصار مقدّم: السبب هو "تلف كتل extended thinking عند إعادة إرسال سجل المحادثة." تحمل كتل التفكير توقيعاً تشفيرياً (signature)، ويتحقّق الـ API من أن كتل التفكير المُعادة لم تتغيّر عن الاستجابة الأصلية. وعندما يجعل خلل في إعادة بناء السجل داخل Claude Code كتلةً تختلف عن الأصل، يرفضها الـ API. أسرع مخرج هو "اضغط Esc مرتين واستخدم /rewind للعودة إلى نقطة فحص"، أو ابدأ جلسة جديدة. يغطّي هذا المقال الآلية، والأسباب الخمسة الجذرية، وثلاثة حلول للمستخدمين، وإجراءات وقائية للمطوّرين، ومنع التكرار.

CLAUDE CODE · 400 ERROR

الصورة الكاملة لخطأ كتلة التفكير

- إن لم يتطابق الـ "signature"، يرفض الـ API المحادثة بأكملها

العَرَض
جلسة متجمدة
كل إدخال يكرّر الـ 400 نفسه
السبب
عدم تطابق التوقيع
التفكير المُعاد يختلف عن الأصل
أسرع مخرج
Esc×2 → /rewind
تراجع إلى ما قبل التلف

خطأ معروف بعدة تذاكر على المستودع الرسمي لـ 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 للتحقق من أن كتلة التفكير المُعادة وَلّدها Claude فعلاً، ويفكّ الخادم تشفيره لإعادة بناء التفكير الأصلي. أما نص التفكير الذي تراه فهو ملخّص فقط، وفي النماذج الأحدث يجعله الإعداد الافتراضي (display: "omitted") فارغاً. وقيمة التوقيع واحدة أياً كان إعداد display، وأي نص تضعه في حقل thinking لكتلة omitted يُتجاهَل. لذلك تطلب الوثائق إعادة كتل التفكير كما وصلت تماماً دون أي تعديل. فإذا كان التوقيع مفقوداً أو تالفاً، أو لم تعد الكتلة مطابقة للرد الأصلي، يرفض الـ API كتلة التفكير تلك. هذا هو جوهر خطأ الـ 400.

لماذا يوجد التوقيع

منع تعديل كتل التفكير يحجب prompt injection وتزييف التفكير. إنها آلية أمنية تحمي حقيقة أن "Claude فكّر بهذا فعلاً" - فللصرامة سبب.

3. لماذا يحدث - 5 أسباب جذرية

تنقسم السيناريوهات الملموسة لعدم تطابق التوقيع إلى خمسة - مُجمّعة من تذاكر Anthropic الرسمية وتقارير المجتمع.

5 ROOT CAUSES

خمسة أسباب جذرية لعدم تطابق التوقيع

السبب 1 · خلل استئناف الجلسة / إعادة بناء السجل
عند استئناف جلسة أو إعادة بناء سجلها، لا تعود كتل التفكير المُرسلة مطابقة للاستجابة الأصلية. نسب كاتب التذكرة #63147 السبب إلى الشكل المحفوظ "نص فارغ + توقيع"، لكن هذا هو الشكل المعتاد في النماذج الأحدث (القسم 5)، ويعترض عليه آخرون في النقاش. لم تنشر Anthropic سبباً رسمياً.
السبب 2 · تداخل التدفّق (streaming)
في الجلسات الطويلة، تتداخل ردود الـ API المتوازية/المتتابعة السريعة في الـ JSONL. تختلط قطع رسائل مختلفة وينكسر ترتيب الكتل.
السبب 3 · منطق الإصلاح يخرج عن السيطرة
عملية إصلاح السجل الداخلية في Claude Code تعيد ترتيب كتل التفكير أو تغيّرها. إصلاح حسن النية ينتهي بكسر التوقيع.
السبب 4 · وسيط/SDK من طرف ثالث
وسطاء التمرير (CLIProxyAPI وغيرها) يعيدون تسلسل (serialize) الرسائل ويغيّرون التفكير. السبب الرئيسي لأخطاء "Invalid signature".
السبب 5 · تعديل السجل في تطبيقك أنت
في التطبيقات التي تستدعي الـ API/SDK بنفسك، حذف كتل التفكير أو تلخيصها أو إعادة تنسيقها في منتصف حلقة tool use قبل إعادة الإرسال. أكثر أخطاء التنفيذ الذاتي شيوعاً.

القاسم المشترك: إذا اختلفت كتلة تفكير عن الأصل ولو ببايت واحد، تحصل دائماً على 400.
الأسباب 1-4 أخطاء في Claude Code / الوسيط؛ والسبب 5 مشكلة تنفيذ ذاتي.

4. ثلاثة حلول فورية (لمستخدمي Claude Code)

عندما تتجمّد جلستك، جرّب ثلاث طرق بترتيب سرعة الاستعادة.

3 FIXES

ثلاثة حلول بترتيب سرعة الاستعادة

الحل 1 · /rewind (الأولوية القصوى)
اضغط Esc مرتين، أو شغّل /rewind. ارجع إلى نقطة الفحص قبل الدور المعطوب. أفضل خطوة - تستعيد مع الحفاظ على السياق.
الحل 2 · جلسة جديدة
/clear أو ابدأ جلسة جديدة. الأكثر موثوقية، لكنه يفقد السياق. دوّن أو احفظ عملك المهم في git أولاً.
الحل 3 · إصلاح JSONL
جرّد كل كتل التفكير من الجلسة JSONL. أداة مجتمعية (أدناه) تحذف التفكير فقط مع إبقاء سجل المحادثة. خطوة متقدّمة تحافظ على السياق.

جرّب الحل 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 أو اتّبع خطوات التحديث الرسمية. يسرد سجل التغييرات (changelog) الخاص بـ Claude Code إصلاحاً تلو الآخر في هذه الفئة: تداخل التدفّق مع الوكلاء المتزامنين (2.1.47)، والتجريد الاستباقي للتواقيع القديمة المتبقية بعد تبديل النموذج أو تسجيل الدخول (2.1.152)، وتعديل كتل التفكير مع Opus 4.8 (2.1.156)، وإسقاط كتل التفكير مع إعادة المحاولة مرة واحدة بعد خطأ redacted_thinking (2.1.282). ومع ذلك أفادت تقارير بأن #63147 ما زال يتكرّر في 2.1.157، ولا يزال مفتوحاً حتى 4 أكتوبر 2026. وتفتقر الإصدارات الأقدم إلى عدد أكبر من هذه الإصلاحات.

5. للمطوّرين: امنعه في تطبيقك (API/SDK)

إن كنت تبني تطبيقاً يستدعي Claude API/SDK بنفسك (extended thinking + tool use)، فستصادف الخطأ نفسه في تنفيذك. وتختصر الوثائق الرسمية الوقاية في قاعدة واحدة: أعِد كل رسالة من المساعد كما أعادها الـ API تماماً، مع كتل التفكير، ولا تُضِف الرسائل الجديدة إلا في النهاية.

// BAD 1: rebuilding the assistant message from picked block types
const rebuilt = {
  role: 'assistant',
  content: [
    ...response.content.filter(b => b.type === 'thinking'), // drops redacted_thinking
    ...response.content.filter(b => b.type === 'tool_use'),
  ],
};

// BAD 2: deleting thinking blocks that have empty text and only a signature
// On newer models this is the normal shape (display defaults to "omitted")

// GOOD: push the assistant message from the API untouched, then append
messages.push({ role: 'assistant', content: response.content }); // thinking, redacted_thinking and signatures included
messages.push({ role: 'user', content: [toolResult] });          // new messages go at the end only

1. كتلة التفكير ذات النص الفارغ والتوقيع وحده أمر طبيعي. في النماذج الأحدث تكون القيمة الافتراضية لـ display هي "omitted": فالتفكير الكامل مشفّر داخل signature، ويعود الحقل thinking فارغاً. أعِدها كما هي دون أن تملأها أو تحذفها (أي نص تضعه في الحقل thinking لكتلة omitted يُتجاهَل).

2. لا تقلّم تفكير الأدوار السابقة بنفسك. إذا أعدت كل الكتل، يحتفظ الـ API بما يحتاجه كل نموذج ويزيل الباقي تلقائياً، ولا يحتسب في الإدخال إلا الكتل التي عُرضت على Claude فعلاً. ويُسمح بحذف تفكير الأدوار السابقة خارج استخدام الأدوات، لكن كتلة التفكير في النماذج الأحدث تبقى صالحة فقط ما دامت مطالبة system وtools والرسائل السابقة لها دون تغيير: فتعديل دور في المنتصف أو حذف بعض الكتل فقط يُبطل كل كتل التفكير اللاحقة ويُرجع خطأ 400 (Invalid signature in thinking block؛ ويُطبَّق مثلاً على الحسابات المنشأة في 31 أغسطس 2026 أو بعده). ولتخفيف السجل، اترك ذلك لتحرير السياق من جهة الخادم (context editing لمسح كتل التفكير) أو للضغط (compaction).

3. عامِل كتل redacted_thinking بالطريقة نفسها. المرشِّح الذي يُبقي أو يحذف type === 'thinking' وحده يُسقط redacted_thinking بصمت. ويذكر دليل استكشاف الأخطاء الرسمي أن أكثر أسباب هذا الخطأ شيوعاً هما ترشيح الكتل حسب النوع مع إسقاط redacted_thinking، وإعادة بناء رسالة المساعد بدلاً من إعادتها كما هي (Thinking، Thinking troubleshooting، حتى 4 أكتوبر 2026).

القاعدة الحديدية لحلقات 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فشل التحقق من التوقيع: تعدّلت كتلة thinking أو تلفت بعد الاستجابة الأصلية (عند إعادة بناء السجل، أو حين يعيد وسيط كتابة المحتوى)/rewind، جلسة جديدة، التحديث إلى أحدث إصدار؛ وإن كنت تمر عبر وسيط فراجع إعداده أيضًا
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 (مع التفكير وredacted_thinking والتوقيع). 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 إلى أحدث إصدار" - ويسرد سجل التغييرات إصلاحاً تلو الآخر لهذه الفئة. وعلى مطوّري 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 رسمي يعالج معظم هذا تلقائياً.

أخطاء Claude Code ذات صلة: مرجع أخطاء Claude Code، علّة «court» ووسوم invoke، "Prompt is too long".

مقال ذو صلة: التفكير التكيفي في Claude.