विषय-सूची
- 1. यह एरर असल में क्या कह रही है
- 2. पृष्ठभूमि: extended thinking और "signature" तंत्र
- 3. यह क्यों होता है - 5 मूल कारण
- 4. अभी के तीन हल (Claude Code उपयोगकर्ताओं के लिए)
- 5. डेवलपर्स के लिए: इसे अपने ऐप में रोकें (API/SDK)
- 6. मिलती-जुलती एरर से इसे अलग पहचानना
- 7. पुनरावृत्ति-रोकथाम चेकलिस्ट
- सारांश
- अक्सर पूछे जाने वाले सवाल
क्या आप 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 signature को कॉन्टेंट से बाइट-दर-बाइट सत्यापित करता है। जब Claude Code किसी बग के साथ हिस्ट्री दोबारा बनाता है - जैसे थिंकिंग टेक्स्ट खाली करके भी signature रखे रहना - तो signature मेल नहीं खाता और API अस्वीकार कर देता है। सबसे तेज़ निकास है "Esc दो बार दबाएं और /rewind से किसी चेकपॉइंट पर लौटें," या नया सेशन शुरू करें। यह लेख तंत्र, 5 मूल कारण, 3 उपयोगकर्ता-स्तरीय हल, डेवलपर उपाय, और पुनरावृत्ति-रोकथाम को कवर करता है।
थिंकिंग-ब्लॉक एरर की पूरी तस्वीर
- अगर "signature" मेल नहीं खाता, तो API पूरी बातचीत अस्वीकार कर देता है
Anthropic की आधिकारिक रिपॉजिटरी पर कई इश्यू के साथ एक ज्ञात बग।
सार: API का सख़्त नियम कि "थिंकिंग ब्लॉक हूबहू मूल प्रतिक्रिया जैसे ही रहने चाहिए।"
1. यह एरर असल में क्या कह रही है
सीधे शब्दों में, संदेश कहता है: "नवीनतम असिस्टेंट संदेश में thinking या redacted_thinking ब्लॉक को संशोधित नहीं किया जा सकता। ये ब्लॉक मूल प्रतिक्रिया जैसे ही रहने चाहिए।"
यानी API आपसे कह रहा है: "आपने (क्लाइंट ने) मुझे जो बातचीत की हिस्ट्री भेजी है, उसके अंदर का 'थिंकिंग ब्लॉक' उससे अलग है जो मैंने पिछली बार लौटाया था। इसे बदला गया है। इसलिए मैं इसे स्वीकार नहीं करूंगा।" Claude API यह मानकर चलता है कि बहु-टर्न बातचीत में आप "पिछली प्रतिक्रिया को हिस्ट्री में शामिल करके बिना बदले वापस भेजते हैं" - और खासकर थिंकिंग ब्लॉक पर "एक भी अक्षर न बदलें" की सख़्त शर्त लगती है। messages.3.content.40 एक स्थितिगत जानकारी है: "चौथे संदेश का 41वां कॉन्टेंट ब्लॉक" ही समस्या का स्थान है।
महत्वपूर्ण बात: ज़्यादातर मामलों में यह आपके कोड या प्रॉम्प्ट की गलती नहीं है। मुख्य कारण है Claude Code द्वारा बातचीत की हिस्ट्री (सेशन JSONL) दोबारा बनाने के तरीके में एक बग, जो थिंकिंग ब्लॉक को खराब कर देता है। इसलिए "क्या मैं इसे गलत इस्तेमाल कर रहा हूं?" को लेकर परेशान होने की ज़रूरत नहीं - यह एक ज्ञात बग है जिसके वर्कअराउंड मौजूद हैं।
2. पृष्ठभूमि: extended thinking और "signature" तंत्र
केवल थिंकिंग ब्लॉक ही इतना सख़्त क्यों है? कारण extended thinking के काम करने के तरीके में छिपा है।
जब Claude extended thinking चालू रखकर जवाब देता है, तो वह उत्तर से पहले एक "थिंकिंग ब्लॉक" बनाता है। यह Claude का मध्यवर्ती तर्क है - वह आंतरिक "कैसे सोचा" जो अंतिम उत्तर की गुणवत्ता बढ़ाता है। इस ब्लॉक को एक क्रिप्टोग्राफिक signature सौंपा जाता है - एक डिजिटल हस्ताक्षर जैसा कुछ, जो यह गारंटी देता है कि "यह थिंकिंग कॉन्टेंट सचमुच Claude ने बनाया है और इसे बदला नहीं गया।"
बहु-टर्न बातचीत और tool use लूप में, हर बार पूरा पिछला आदान-प्रदान API को वापस भेजा जाता है। थिंकिंग ब्लॉक भी भेजने होते हैं, लेकिन signature "पूरे मूल थिंकिंग टेक्स्ट" पर गणना होती है - इसलिए अगर टेक्स्ट एक अक्षर भी बदला, तो signature सत्यापन विफल हो जाता है। सुरक्षा के लिए, API उन थिंकिंग ब्लॉक को अस्वीकार कर देता है जिनका signature मेल नहीं खाता। यही 400 एरर का सार है।
signature क्यों मौजूद है
थिंकिंग ब्लॉक के संशोधन को रोकना prompt injection और सोच की नकल को रोकता है। यह एक सुरक्षा तंत्र है जो इस तथ्य की रक्षा करता है कि "Claude ने सचमुच यह सोचा" - सख़्ती का एक कारण है।
3. यह क्यों होता है - 5 मूल कारण
signature बेमेल के ठोस परिदृश्य पांच में बंटते हैं - Anthropic के आधिकारिक इश्यू और समुदाय की रिपोर्टों से संकलित।
signature बेमेल के पांच मूल कारण
सामान्य सूत्र: अगर कोई थिंकिंग ब्लॉक मूल से एक बाइट भी अलग है, तो हमेशा 400 मिलता है।
कारण 1-4 Claude Code / प्रॉक्सी के बग हैं; कारण 5 एक DIY कार्यान्वयन मुद्दा है।
4. अभी के तीन हल (Claude Code उपयोगकर्ताओं के लिए)
जब आपका सेशन अटक जाए, तो रिकवरी की गति के क्रम में तीन तरीके आज़माएं।
रिकवरी गति के अनुसार तीन हल
/rewind चलाएं। खराब टर्न से पहले के चेकपॉइंट पर लौटें। सबसे अच्छा कदम - कॉन्टेक्स्ट बचाते हुए रिकवर करता है।/clear या एक नया सेशन शुरू करें। सबसे भरोसेमंद, पर कॉन्टेक्स्ट खो जाता है। पहले अहम काम को नोट करें या git में सेव करें।
पहले हल 1 (Esc×2 / rewind) आज़माएं। विफल हो तो हल 2। कॉन्टेक्स्ट रखना ज़रूरी हो तो हल 3।
और हमेशा Claude Code को नवीनतम वर्ज़न पर अपडेट करें (Anthropic इसे क्रमशः ठीक कर रहा है)।
हल 3 पर एक नोट: समुदाय ने एक "Claude Code thinking blocks fix" टूल प्रकाशित किया है (जैसे GitHub पर miteshashar/claude-code-thinking-blocks-fix)। यह सेशन JSONL से सभी थिंकिंग कॉन्टेंट ब्लॉक हटा देता है, बातचीत की हिस्ट्री रखते हुए signature समस्या को जड़ से मिटाता है। अगर आप इससे अक्सर टकराते हैं या लंबे सेशन का भारी उपयोग करते हैं तो इसे अपनाना उचित है। पर यह एक अनौपचारिक टूल है, इसलिए अपने जोखिम पर उपयोग करें - चलाने से पहले JSONL का बैकअप लें।
सबसे महत्वपूर्ण स्थायी हल है "Claude Code को नवीनतम वर्ज़न पर रखना।" claude update चलाएं या आधिकारिक अपडेट चरणों का पालन करें। इस बग शृंखला (#10199, #12225, #63147, आदि) के लिए Anthropic क्रमशः एक "रक्षात्मक गार्ड जो खाली-टेक्स्ट-के-साथ-signature थिंकिंग ब्लॉक का पता लगाकर भेजने से पहले उन्हें हटा देता है" जारी कर रहा है। पुराने वर्ज़न इससे ज़्यादा टकराते हैं।
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. अगर पिछले टर्न का थिंकिंग नहीं भेजेंगे, तो पूरा ब्लॉक हटाएं (खाली-टेक्स्ट-के-साथ-signature सबसे बुरा मामला है)। 3. रिक्वेस्ट-बिल्ड समय पर एक रक्षात्मक गार्ड जोड़ें जो "खाली टेक्स्ट पर signature मौजूद" थिंकिंग ब्लॉक का पता लगाकर उन्हें हटा दे।
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 | इस लेख का विषय। signature और कॉन्टेंट का बेमेल | /rewind, नया सेशन, नवीनतम पर अपडेट |
| Invalid signature in thinking block | signature स्वयं अमान्य है (अक्सर प्रॉक्सी द्वारा बदलाव) | प्रॉक्सी कॉन्फ़िग जांचें, सीधे API से जुड़ें |
| The final block in an assistant message cannot be thinking | असिस्टेंट संदेश thinking पर खत्म होता है (अंत में text या tool_use चाहिए) | संदेश संरचना ठीक करें, SDK अपडेट करें |
साझा मूल कारण है "extended-thinking ब्लॉक को सही ढंग से न संभालना।" Claude Code उपयोगकर्ताओं के लिए, ज़्यादातर /rewind + नवीनतम-वर्ज़न अपडेट से हल हो जाते हैं। DIY ऐप्स के लिए, आपको संदेश संरचना और लाइब्रेरी कार्यान्वयन की समीक्षा करनी होगी। अगर आप किसी प्रॉक्सी (CLIProxyAPI, विभिन्न गेटवे) से होकर जाते हैं, तो पहले शक करें कि प्रॉक्सी थिंकिंग बदल रहा है।
7. पुनरावृत्ति-रोकथाम चेकलिस्ट
बार-बार पुनरावृत्ति रोकने के लिए एक व्यावहारिक चेकलिस्ट।
Claude Code उपयोगकर्ता: 1. claude update से इसे नवीनतम वर्ज़न पर रखें (सबसे बड़ा निवारक)। 2. बहुत लंबे सेशन को समय-समय पर /clear से रीसेट करें (interleaving का जोखिम घटाता है)। 3. अहम काम के लिए बार-बार git में commit करें (अटकने पर भी रिकवर हो सकता है)। 4. अगर अक्सर हो तो JSONL-रिपेयर टूल पर विचार करें। 5. रिप्रोडक्शन Anthropic के आधिकारिक इश्यू में रिपोर्ट करें (फ़िक्स तेज़ करता है)।
API/SDK डेवलपर: 1. असिस्टेंट संदेशों को API प्रतिक्रिया बदले बिना हिस्ट्री में डालें। 2. पिछला थिंकिंग छोड़ना हो तो पूरा ब्लॉक हटाएं (खाली-टेक्स्ट-के-साथ-signature नहीं)। 3. रिक्वेस्ट-बिल्ड पर एक रक्षात्मक गार्ड जोड़ें (खाली-टेक्स्ट-के-साथ-signature का पता लगाएं → हटाएं)। 4. नवीनतम आधिकारिक SDK इस्तेमाल करें और कस्टम संदेश पुनर्रचना न्यूनतम रखें। 5. प्रॉक्सी के पीछे हों तो थिंकिंग पारदर्शिता जांचें।
सारांश
Claude Code की "thinking blocks ... cannot be modified" 400 एरर तब होती है जब हिस्ट्री दोबारा भेजने पर extended-thinking ब्लॉक खराब हो जाते हैं और क्रिप्टोग्राफिक signature अब कॉन्टेंट से मेल नहीं खाता। यह Anthropic की आधिकारिक रिपॉजिटरी पर कई इश्यू वाला एक ज्ञात बग है, और ज़्यादातर मामलों में यह आपकी गलती नहीं है। पांच कारण: सेशन-रिज़्यूम बग (सबसे आम), स्ट्रीमिंग interleaving, रिपेयर लॉजिक का बेकाबू होना, थर्ड-पार्टी प्रॉक्सी, और आपके अपने ऐप में हिस्ट्री संशोधन।
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 की आधिकारिक रिपॉजिटरी पर कई इश्यू खुले हैं और फ़िक्स जारी हैं। खुद को दोष देने की ज़रूरत नहीं। केवल DIY ऐप्स (सीधे API कॉल करने वाले) के लिए ही आपको अपने कार्यान्वयन की समीक्षा करनी होती है।
प्र. /rewind से ठीक नहीं हुआ। अब क्या?
उ. नया सेशन शुरू करना (/clear) सबसे भरोसेमंद है। आप कॉन्टेक्स्ट खोते हैं पर अटकी स्थिति से निश्चित रूप से निकल जाते हैं। पहले git commit या नोट्स से अहम काम बचा लें। अगर दोहराए तो Claude Code को नवीनतम वर्ज़न पर अपडेट करें; फिर भी हो तो JSONL-रिपेयर टूल पर विचार करें।
प्र. क्या extended thinking बंद करके इससे बचा जा सकता है?
उ. तकनीकी रूप से हां, पर extended thinking जटिल कार्यों में सटीकता को काफ़ी बढ़ाता है, इसलिए इसे बंद करना अनुशंसित नहीं। पहले नवीनतम-वर्ज़न अपडेट + /rewind से निपटें, और इसे केवल अंतिम उपाय के रूप में उन विशेष परिवेशों (जैसे प्रॉक्सी के पीछे) में सोचें जहां यह फिर भी दोहराता है।
प्र. क्या JSONL-रिपेयर टूल सुरक्षित है?
उ. यह अनौपचारिक है, इसलिए अपने जोखिम पर उपयोग करें। उपयोग से पहले हमेशा सेशन JSONL का बैकअप लें। तंत्र है "बातचीत की हिस्ट्री रखते हुए सभी थिंकिंग कॉन्टेंट ब्लॉक हटाना," जो सिद्धांततः सुरक्षित है - पर आधिकारिक फ़िक्स (नवीनतम-वर्ज़न अपडेट) ही असली समाधान बना रहता है।
प्र. मेरे अपने ऐप में, tool use को thinking के साथ जोड़ने पर यह एरर ट्रिगर होती है।
उ. कारण है "आप नवीनतम असिस्टेंट संदेश के थिंकिंग ब्लॉक को बदल रहे हैं।" tool_result लौटाने वाली अगली रिक्वेस्ट में पूर्ववर्ती थिंकिंग + tool_use ब्लॉक हूबहू वैसे ही शामिल हों जैसे API ने लौटाए (signature के साथ)। अगर आप पिछले टर्न का थिंकिंग छोड़ते हैं, तो पूरा ब्लॉक हटाएं (खाली-टेक्स्ट-के-साथ-signature नहीं)। नवीनतम आधिकारिक SDK इसमें से अधिकांश स्वतः संभाल लेता है।