Бывало ли у вас так, что во время работы в 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.

Если проверка signature у отправленного обратно блока thinking не проходит, вместо этого может появиться ошибка ниже. Причина у обеих одна: блок thinking уже не совпадает с исходным ответом:

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

Самое неприятное: стоит ей появиться, и каждый последующий ввод вызывает ту же ошибку. Вы печатаете, жмете Enter — снова те же 400. Сессия впадает в состояние "зависания". Это известный баг с несколькими открытыми тикетами в официальном репозитории Anthropic (#10199, #12225, #13012, #22278, #63147 и другие).

Сразу о главном: причина в том, что блоки extended thinking повреждаются при повторной отправке истории разговора. Блоки thinking несут криптографическую signature, и API проверяет, что отправленные обратно блоки thinking не изменились по сравнению с исходным ответом. Когда из-за бага при пересборке истории в Claude Code блок отличается от исходного, API отклоняет запрос. Самый быстрый выход — "дважды нажать Esc и сделать /rewind к контрольной точке" либо начать новую сессию. В этой статье разберем механизм, 5 первопричин, 3 способа исправления для пользователей, меры для разработчиков и предотвращение повторов.

CLAUDE CODE · 400 ERROR

Полная картина ошибки с блоком thinking

— Если signature не совпадает, API отклоняет весь разговор

СИМПТОМ
Сессия зависла
Каждый ввод повторяет те же 400
ПРИЧИНА
Несовпадение signature
Отправленный thinking отличается от исходного
САМЫЙ БЫСТРЫЙ ВЫХОД
Esc×2 → /rewind
Откат до повреждения

Известный баг с несколькими тикетами в официальном репозитории Anthropic.
Суть: строгое правило API, что "блоки thinking должны оставаться точно такими, как в исходном ответе."

1. Что на самом деле говорит эта ошибка

Простыми словами сообщение говорит: "Блоки thinking или redacted_thinking в последнем сообщении ассистента нельзя изменять. Эти блоки должны оставаться такими, какими были в исходном ответе."

То есть API сообщает вам: "Блок thinking внутри истории разговора, которую вы (клиент) мне прислали, отличается от того, что я вернул в прошлый раз. Он был изменен. Поэтому я его не приму." Claude API исходит из того, что в многоходовых разговорах вы "включаете предыдущий ответ в историю и отправляете его обратно без изменений", причем именно блок thinking несет строгое ограничение "не менять ни единого символа". messages.3.content.40 — это позиционная информация: проблема в "41-м блоке контента 4-го сообщения".

Важный момент: в большинстве случаев это НЕ ошибка в вашем коде или промпте. Главная причина — баг в том, как Claude Code пересобирает историю разговора (сессионный JSONL), который повреждает блоки thinking. Так что незачем мучиться вопросом "может, я что-то делаю не так?" — это известный баг с обходными путями.

2. Предыстория: extended thinking и механизм signature

Почему именно блок thinking настолько строг? Причина — в том, как работает extended thinking.

Когда Claude отвечает с включенным extended thinking, он генерирует "блок thinking" перед ответом. Это промежуточное рассуждение Claude — внутреннее "как он думал", что повышает качество финального ответа. Этому блоку присваивается криптографическая signature — нечто вроде цифровой подписи, гарантирующей, что "это содержимое thinking действительно сгенерировано Claude и не было изменено."

В многоходовых разговорах и циклах tool use весь предыдущий обмен каждый раз отправляется обратно в API, и блоки thinking тоже нужно отправлять. Согласно официальной документации, signature содержит зашифрованную копию всего рассуждения: по ней API проверяет, что возвращённый блок thinking создан Claude, а сервер расшифровывает её, чтобы восстановить исходное рассуждение. Видимый текст thinking — лишь краткое изложение, а у новых моделей по умолчанию (display: "omitted") он вообще пустой. Значение signature одинаково при любой настройке display, а текст, вписанный в поле thinking блока omitted, игнорируется. Поэтому документация требует возвращать блоки thinking в точности такими, какими они пришли, без изменений. Если signature отсутствует или повреждена либо блок больше не совпадает с исходным ответом, API отклоняет этот блок thinking. В этом и суть ошибки 400.

Зачем нужна signature

Запрет на изменение блоков thinking блокирует prompt injection и подделку рассуждений. Это механизм безопасности, защищающий факт того, что "Claude действительно так думал" — у строгости есть своя причина.

3. Почему это происходит — 5 первопричин

Конкретные сценарии несовпадения signature сводятся к пяти — на основе официальных тикетов Anthropic и сообщений сообщества.

5 ROOT CAUSES

Пять первопричин несовпадения signature

ПРИЧИНА 1 · Баг возобновления сессии / пересборки истории
При возобновлении сессии или пересборке истории отправляемые обратно блоки thinking перестают совпадать с исходным ответом. Автор Issue #63147 счел причиной сохраненную форму «пустой текст + signature», но для новых моделей это штатная форма (раздел 5), и в обсуждении с этим спорят. Официального объяснения причины Anthropic не публиковала.
ПРИЧИНА 2 · Смешивание стримов
В долгих сессиях параллельные или быстро идущие подряд ответы API перемешиваются в JSONL. Фрагменты разных сообщений смешиваются, и порядок блоков ломается.
ПРИЧИНА 3 · Логика починки идет вразнос
Внутренний процесс починки истории в Claude Code переставляет или меняет блоки thinking. Починка с благими намерениями в итоге ломает signature.
ПРИЧИНА 4 · Сторонний прокси/SDK
Релейные прокси (CLIProxyAPI и т. п.) повторно сериализуют сообщения и меняют thinking. Главная причина ошибок "Invalid signature".
ПРИЧИНА 5 · Изменение истории в своем приложении
В приложениях, которые сами обращаются к API/SDK, удаление, суммаризация или переформатирование блоков thinking посреди цикла tool use перед обратной отправкой. Самая частая ошибка самостоятельной реализации.

Общий знаменатель: если блок thinking отличается от исходного хотя бы на один байт, вы всегда получаете 400.
Причины 1–4 — это баги Claude Code / прокси; причина 5 — проблема самостоятельной реализации.

4. Три способа исправить прямо сейчас (для пользователей Claude Code)

Когда сессия зависла, попробуйте три метода в порядке скорости восстановления.

3 FIXES

Три способа по скорости восстановления

СПОСОБ 1 · /rewind (главный приоритет)
Дважды нажмите Esc или выполните /rewind. Вернитесь к контрольной точке перед поврежденным ходом. Лучший вариант — восстанавливает с сохранением контекста.
СПОСОБ 2 · Новая сессия
/clear или запуск новой сессии. Самый надежный, но теряет контекст. Сначала зафиксируйте важную работу заметкой/коммитом.
СПОСОБ 3 · Починка JSONL
Удалите все блоки thinking из сессионного JSONL. Инструмент сообщества (см. ниже) убирает только thinking, сохраняя историю разговора. Продвинутый ход, сохраняющий контекст.

Сначала пробуйте СПОСОБ 1 (Esc×2 / rewind). Если не помогло — СПОСОБ 2. Если нужно сохранить контекст — СПОСОБ 3.
И всегда обновляйте Claude Code до последней версии (Anthropic исправляет это постепенно).

О СПОСОБЕ 3: сообщество выпустило инструмент "Claude Code thinking blocks fix" (например, miteshashar/claude-code-thinking-blocks-fix на GitHub). Он удаляет из сессионного JSONL все блоки контента thinking, искореняя проблему signature и сохраняя историю разговора. Его стоит взять на вооружение, если вы часто сталкиваетесь с этим или активно работаете в долгих сессиях. Но это неофициальный инструмент, так что используйте на свой риск — сделайте резервную копию JSONL перед запуском.

Самое важное постоянное решение — "держать Claude Code на последней версии." Выполняйте claude update или следуйте официальной процедуре обновления. В changelog Claude Code исправления этого семейства идут одно за другим: смешивание стримов при параллельных агентах (2.1.47), упреждающее удаление устаревших signature после смены модели или входа (2.1.152), изменение блоков thinking при работе с Opus 4.8 (2.1.156), отбрасывание блоков thinking с одной повторной попыткой после ошибки redacted_thinking (2.1.282). Тем не менее, по сообщениям, #63147 воспроизводился и на 2.1.157 и на 4 октября 2026 года остается открытым. В старых версиях этих исправлений меньше.

5. Для разработчиков: предотвращение в своем приложении (API/SDK)

Если вы строите приложение, которое само обращается к Claude API/SDK (extended thinking + tool use), вы столкнетесь с той же ошибкой в собственной реализации. Официальная документация сводит профилактику к одному правилу: возвращать каждый ход ассистента ровно в том виде, в каком его вернул API, вместе с блоками thinking, и добавлять новые сообщения только в конец.

// 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

① Блок thinking с пустым текстом и одной лишь signature — это норма. У новых моделей display по умолчанию равен "omitted": полное рассуждение зашифровано внутри signature, а поле thinking приходит пустым. Возвращайте такой блок как есть, не дополняя и не удаляя его (текст, вписанный в поле thinking блока omitted, игнорируется).

② Не прореживайте thinking прошлых ходов сами. Если вернуть все блоки, API оставит то, что нужно конкретной модели, остальное уберет автоматически и выставит счет за ввод только по блокам, реально показанным Claude. Вне tool use пропускать thinking прошлых ходов разрешено, но у новых моделей блок thinking действителен, лишь пока не меняются промпт system, tools и предшествующие сообщения: правка хода в середине или удаление только части блоков делает недействительными все последующие блоки thinking и приводит к 400 (Invalid signature in thinking block; применяется, например, к аккаунтам, созданным 31 августа 2026 года и позже). Чтобы облегчить историю, доверьте это серверному context editing (очистке блоков thinking) или compaction.

③ С блоками redacted_thinking — так же. Фильтр, который оставляет или убирает только type === 'thinking', молча теряет redacted_thinking. Официальное руководство по устранению неполадок называет самыми частыми причинами этой ошибки фильтрацию блоков по типу с потерей redacted_thinking и пересборку сообщения ассистента вместо возврата его как есть (Thinking, Thinking troubleshooting, по состоянию на 4 октября 2026 года).

Железное правило для циклов tool use

В циклах extended thinking + tool use (tool_use → tool_result) никогда не меняйте блок thinking "последнего" сообщения ассистента. Следующий запрос, возвращающий tool_result, должен включать предшествующие thinking + tool_use ровно в том виде, как есть. Если вы используете Claude Agent SDK или Vercel AI SDK, убедитесь, что библиотека обрабатывает это корректно.

6. Как отличить от похожих ошибок

Есть несколько связанных с thinking ошибок 400, которые легко спутать. Различайте три основные.

Сообщение об ошибкеЗначениеОсновное решение
thinking blocks ... cannot be modifiedТема этой статьи. Несовпадение signature и содержимого/rewind, новая сессия, обновление до последней версии
Invalid signature in thinking blockПроверка signature не пройдена: блок thinking изменён или повреждён после исходного ответа (при восстановлении истории или когда прокси переписал содержимое)/rewind, новая сессия, обновление до последней версии; при работе через прокси проверьте и его настройки
The final block in an assistant message cannot be thinkingСообщение ассистента заканчивается на thinking (в конце нужен text или tool_use)Исправить структуру сообщения, обновить SDK

Общая первопричина — "некорректная обработка блоков extended thinking." Для пользователей Claude Code большинство случаев решается через /rewind + обновление до последней версии. Для самостоятельных приложений нужно пересмотреть структуру сообщений и реализацию библиотеки. Если вы идете через прокси (CLIProxyAPI, разные шлюзы), в первую очередь подозревайте, что прокси меняет thinking.

7. Чек-лист предотвращения повторов

Практический чек-лист, чтобы избежать частых повторов.

Пользователям Claude Code: ① Держите его на последней версии через claude update (главная профилактика). ② Периодически сбрасывайте очень длинные сессии через /clear (снижает риск смешивания). ③ Часто коммитьте в git важную работу (восстановимо даже при зависании). ④ Подумайте об инструменте починки JSONL, если повторяется часто. ⑤ Сообщайте о воспроизведениях в официальные тикеты Anthropic (ускоряет исправления).

Разработчикам на API/SDK: ① Кладите сообщения ассистента в историю без изменения ответа API (вместе с thinking, redacted_thinking и signature). ② Ведите историю только с добавлением в конец: не правьте ходы в середине и не удаляйте лишь часть блоков (сокращение доверьте серверному context editing или compaction). ③ Не удаляйте блоки thinking с пустым текстом и signature (это форма по умолчанию у новых моделей). ④ Используйте последний официальный SDK и минимизируйте свои переделки сообщений. ⑤ Если вы за прокси, проверьте прозрачность для thinking.

Итог

Ошибка 400 "thinking blocks ... cannot be modified" в Claude Code возникает, когда блоки extended thinking повреждаются при повторной отправке истории и перестают совпадать с исходным ответом. Это известный баг с несколькими тикетами в официальном репозитории Anthropic, и в большинстве случаев это не ваша вина. Пять причин: баг возобновления сессии / пересборки истории, смешивание стримов, логика починки идет вразнос, сторонние прокси и изменение истории в своем приложении.

Для пользователей Claude Code самое быстрое восстановление — ① нажать Esc×2 / /rewind к контрольной точке; если не помогло — ② новая сессия (/clear); чтобы сохранить контекст — ③ инструмент починки JSONL. Самое важное постоянное решение — "обновить Claude Code до последней версии", ведь в changelog исправления этого семейства идут одно за другим. Разработчикам на API/SDK следует возвращать каждый ход ассистента как есть, вместе с блоками thinking / вести историю только с добавлением в конец / не удалять блоки с пустым текстом и signature.

Похожие материалы: Что такое Claude Agent SDK, Полное руководство по Vercel AI SDK, Что такое Cursor, Рабочий процесс деплоя Claude Code/Cursor.

FAQ

Q. Эта ошибка — ошибка в моем промпте или коде?
A. В большинстве случаев нет. Если она появляется при использовании Claude Code, это почти наверняка известный баг на стороне Claude Code (дефект пересборки истории сессии). В официальном репозитории Anthropic открыто несколько тикетов, и исправления идут. Винить себя не нужно. Только для самостоятельных приложений (прямое обращение к API) стоит пересмотреть свою реализацию.

Q. /rewind не помогает. Что дальше?
A. Запуск новой сессии (/clear) — самый надежный путь. Вы теряете контекст, но гарантированно выходите из зависшего состояния. Сначала сохраните важную работу через git commit или заметки. Если повторяется — обновите Claude Code до последней версии; если все равно происходит, подумайте об инструменте починки JSONL.

Q. Можно ли избежать этого, отключив extended thinking?
A. Технически да, но extended thinking заметно повышает точность на сложных задачах, поэтому отключать его не рекомендуется. Сначала справьтесь через обновление до последней версии + /rewind, и рассматривайте этот вариант лишь как крайнюю меру в особых средах (например, за прокси), где он все равно повторяется.

Q. Безопасен ли инструмент починки JSONL?
A. Он неофициальный, так что используйте на свой риск. Всегда делайте резервную копию сессионного JSONL перед использованием. Механизм — "удалить все блоки контента thinking, сохранив историю разговора", что в принципе безопасно, но официальное решение (обновление до последней версии) остается настоящим выходом.

Q. В моем приложении сочетание tool use с thinking вызывает эту ошибку.
A. Причина в том, что "вы меняете блок thinking последнего сообщения ассистента." Следующий запрос, возвращающий tool_result, должен включать предшествующие блоки thinking + tool_use ровно так, как их вернул API (с signature). Прореживать thinking прошлых ходов самим не нужно; у новых моделей удаление его лишь из части ходов делает недействительными последующие блоки thinking. Блок с пустым текстом и одной signature — нормальная форма для этих моделей, возвращайте его без изменений. Последний официальный SDK делает большую часть этого автоматически.

Похожие ошибки Claude Code: справочник ошибок Claude Code, «court» и теги invoke, "Prompt is too long".

По теме: Адаптивное мышление Claude.