विषय-सूची
- 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.
वापस भेजे गए thinking block की signature की जाँच विफल हो, तो इसकी जगह नीचे वाली त्रुटि भी दिख सकती है। दोनों की वजह एक ही है: thinking block अब मूल response जैसा नहीं रहा:
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 से किसी चेकपॉइंट पर लौटें," या नया सेशन शुरू करें। यह लेख तंत्र, 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 में पूरी थिंकिंग की एन्क्रिप्ट की हुई प्रति होती है: API इसी से जाँचता है कि लौटाया गया थिंकिंग ब्लॉक सचमुच Claude ने बनाया था, और सर्वर इसे डिक्रिप्ट करके मूल थिंकिंग को दोबारा जोड़ता है। आपको दिखने वाला थिंकिंग टेक्स्ट सिर्फ़ सारांश है, और नए मॉडलों की डिफ़ॉल्ट सेटिंग (display: "omitted") में वह ख़ाली ही रहता है। display की सेटिंग कुछ भी हो, signature का मान एक ही रहता है, और omitted ब्लॉक के thinking फ़ील्ड में डाला गया टेक्स्ट अनदेखा कर दिया जाता है। इसीलिए दस्तावेज़ कहता है कि थिंकिंग ब्लॉक को ठीक वैसा ही, बिना बदले लौटाएँ जैसा मिला था। अगर signature गायब या ख़राब हो, या ब्लॉक मूल जवाब से मेल न खाए, तो API उस थिंकिंग ब्लॉक को अस्वीकार कर देता है। यही 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 चलाएं या आधिकारिक अपडेट चरणों का पालन करें। Claude Code के changelog में इस श्रेणी के फ़िक्स एक के बाद एक दर्ज हैं: समानांतर एजेंटों में स्ट्रीमिंग का आपस में मिल जाना (2.1.47), मॉडल या लॉगिन बदलने के बाद बचे पुराने signature को पहले ही हटाना (2.1.152), Opus 4.8 के साथ थिंकिंग ब्लॉक का बदल जाना (2.1.156), और redacted_thinking एरर आने पर थिंकिंग ब्लॉक हटाकर एक बार फिर कोशिश करना (2.1.282)। फिर भी रिपोर्टों के अनुसार #63147 2.1.157 पर भी दोहराया गया, और 4 अक्टूबर 2026 तक यह खुला (open) है। पुराने वर्ज़न में इनमें से ज़्यादा फ़िक्स नहीं होते।
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. खाली टेक्स्ट और सिर्फ़ signature वाला थिंकिंग ब्लॉक सामान्य है। नए मॉडलों पर display का डिफ़ॉल्ट "omitted" है: पूरा थिंकिंग एन्क्रिप्ट होकर signature में रहता है और thinking फ़ील्ड खाली लौटता है। इसे जैसा है वैसा ही वापस भेजें, न भरें न हटाएं (omitted ब्लॉक के thinking फ़ील्ड में डाला गया टेक्स्ट अनदेखा कर दिया जाता है)।
2. पिछले टर्न का थिंकिंग खुद न छांटें। सारे ब्लॉक वापस भेजने पर API हर मॉडल के लिए ज़रूरी ब्लॉक रखता है, बाकी अपने-आप हटा देता है, और इनपुट का बिल सिर्फ़ उन ब्लॉक का बनता है जो Claude को वास्तव में दिखाए गए। tool use के बाहर पिछले टर्न का थिंकिंग छोड़ना अनुमत है, लेकिन नए मॉडलों पर थिंकिंग ब्लॉक तभी तक मान्य रहता है जब तक उससे पहले का 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 | इस लेख का विषय। signature और कॉन्टेंट का बेमेल | /rewind, नया सेशन, नवीनतम पर अपडेट |
| Invalid signature in thinking block | signature की जाँच विफल: मूल response के बाद thinking block बदला गया या ख़राब हुआ (इतिहास दोबारा बनाते समय, या बीच की प्रॉक्सी ने सामग्री बदली) | /rewind, नया session, नवीनतम संस्करण पर अपडेट; प्रॉक्सी से जुड़े हों तो उसका कॉन्फ़िग भी जांचें |
| 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 प्रतिक्रिया बदले बिना हिस्ट्री में डालें (थिंकिंग, redacted_thinking और signature समेत)। 2. हिस्ट्री में सिर्फ़ आख़िर में जोड़ें: बीच के टर्न न बदलें, न सिर्फ़ कुछ ब्लॉक हटाएं (छंटाई सर्वर-साइड context editing या compaction पर छोड़ें)। 3. खाली टेक्स्ट और signature वाले थिंकिंग ब्लॉक न हटाएं (नए मॉडलों पर यही डिफ़ॉल्ट रूप है)। 4. नवीनतम आधिकारिक SDK इस्तेमाल करें और कस्टम संदेश पुनर्रचना न्यूनतम रखें। 5. प्रॉक्सी के पीछे हों तो थिंकिंग पारदर्शिता जांचें।
सारांश
Claude Code की "thinking blocks ... cannot be modified" 400 एरर तब होती है जब हिस्ट्री दोबारा भेजने पर extended-thinking ब्लॉक खराब हो जाते हैं और वे मूल रिस्पॉन्स से मेल नहीं खाते। यह Anthropic की आधिकारिक रिपॉजिटरी पर कई इश्यू वाला एक ज्ञात बग है, और ज़्यादातर मामलों में यह आपकी गलती नहीं है। पांच कारण: सेशन-रिज़्यूम / हिस्ट्री दोबारा बनाने का बग, स्ट्रीमिंग interleaving, रिपेयर लॉजिक का बेकाबू होना, थर्ड-पार्टी प्रॉक्सी, और आपके अपने ऐप में हिस्ट्री संशोधन।
Claude Code उपयोगकर्ताओं के लिए, सबसे तेज़ रिकवरी है 1. Esc×2 / /rewind से किसी चेकपॉइंट पर लौटें; विफल हो तो 2. नया सेशन (/clear); कॉन्टेक्स्ट बचाने के लिए 3. JSONL-रिपेयर टूल। सबसे महत्वपूर्ण स्थायी हल है "Claude Code को नवीनतम वर्ज़न पर अपडेट करना" - changelog में इस श्रेणी के फ़िक्स एक के बाद एक दर्ज हैं। API/SDK डेवलपर्स को हर असिस्टेंट टर्न थिंकिंग ब्लॉक समेत हूबहू लौटाना / हिस्ट्री में सिर्फ़ आख़िर में जोड़ना / खाली टेक्स्ट और signature वाले ब्लॉक न हटाना चाहिए।
संबंधित: 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 इसमें से अधिकांश स्वतः संभाल लेता है।
संबंधित Claude Code एरर: Claude Code एरर रेफरेंस, "court" + invoke बग, "Prompt is too long".
संबंधित लेख: Claude की अनुकूली सोच.