Claude: ошибка 400 «Invalid signature in thinking block» — причины и решения
Wokey Team · 2026-10-30
Коротко: Invalid `signature` in `thinking` block — это ответ 400 от Claude: блок thinking в истории диалога не прошёл проверку. Либо подпись выдана не Claude (пустая, обрезанная, изменённая или созданная другим провайдером), либо на новейших моделях после создания блока изменилось что-то раньше в диалоге. Смена аккаунта Claude или API-ключа эту ошибку не вызывает. Повтор того же запроса не поможет: уберите блоки thinking из истории или начните новый диалог.
Два варианта сообщения
| Сообщение | Что не прошло проверку |
|---|---|
messages.N.content.N: Invalid `signature` in `thinking` block |
Сама подпись: пустая, обрезанная, изменённая или выданная не Claude |
…Invalid `signature` in `thinking` block. The block is bound to a different conversation. Remove the block, or set `thinking.block_binding.prefix_mismatch_behavior` to "drop_block". |
Проверка префикса: после создания блока изменились промпт system, tools или более раннее сообщение |
Проверка префикса действует для Claude Fable 5.1, Opus 5.5, Sonnet 5.5 и Haiku 5.5. По умолчанию Anthropic применяет её к аккаунтам, созданным 31 августа 2026 года или позже, а также к любому запросу, где задан thinking.block_binding. Полный ответ API выглядит так:
{"type":"error","error":{"type":"invalid_request_error","message":"messages.1.content.0: Invalid `signature` in `thinking` block"},"request_id":"req_011C..."}
Та же проверка истории выдаёт ещё две похожие ошибки: Invalid `data` in `redacted_thinking` block и `thinking` or `redacted_thinking` blocks in the latest assistant message cannot be modified — вторая означает, что был изменён сам текст thinking.
В Claude Code
Claude Code показывает ошибку как API Error: 400 … Invalid `signature` in `thinking` block. Новые версии распознают её, убирают из истории блоки thinking и повторяют запрос, так что сессия обычно продолжается, а вы ничего не замечаете. Если ошибка повторяется на каждом шаге, сначала обновитесь (claude update). Старые версии, например серия 2.0, сами не восстанавливаются. Если и после обновления ошибка остаётся, выполните /rewind, чтобы вернуться к шагу до проблемы, или /clear, чтобы начать заново.
Причина 1: история от другого провайдера
Это самая частая причина у тех, кто использует несколько провайдеров в одном диалоге. Многие модели не от Anthropic предлагают API, совместимый с Anthropic, и возвращают собственные блоки thinking. В их поле signature — строка этого провайдера или вообще ничего. Claude не может проверить ни то, ни другое.
Поэтому ошибка появляется, когда диалог начинается на другой модели, а потом переходит на Claude:
- провайдера сменили посреди сессии через переключатель конфигураций или правкой
ANTHROPIC_BASE_URL; - через
/modelна шлюзе перешли с модели не от Anthropic, например DeepSeek, на модель Claude в той же сессии; - продолжили сессию, начатую у другого провайдера.
С Wokey происходит то же самое. Wokey пересылает блоки thinking ровно в том виде, в каком получил: не переписывает и не удаляет их. Поэтому блок, созданный DeepSeek раньше в диалоге, приходит к Claude всё с той же подписью DeepSeek.
Переход между моделями Claude или между аккаунтами Claude — другое дело. Если модель Claude не может использовать блок, написанный другой моделью Claude, или блок Sonnet 5.5 либо Haiku 5.5 от другого аккаунта, API молча отбрасывает его, и запрос выполняется успешно.
Причина 2: клиент сохранил блок неправильно
API требует, чтобы каждый ход ассистента возвращался в точности таким, каким пришёл. Типичные ошибки клиентов:
- сохраняют текст
thinking, но неsignature; - собирают потоковый ответ, не добавляя события
signature_delta; - обрезают, укорачивают или перекодируют строку подписи;
- копируют один и тот же блок thinking в несколько сообщений.
Opus 5.5, Sonnet 5.5, Haiku 5.5 и Fable 5.1 по умолчанию возвращают блоки thinking с пустым полем thinking. Рассуждение хранится в signature, поэтому такой блок полноценный и его нужно отправлять обратно как есть.
Причина 3: диалог изменился (проверка префикса)
Вариант с «bound to a different conversation» означает, что история перед блоком больше не совпадает. Частые причины: правка, перестановка или удаление более раннего хода; пересборка промпта system или массива tools на каждом шаге; удаление напоминания, вставленного ранее; сжатие на стороне клиента, которое сохраняет последние ходы вместе с их thinking.
Как исправить в своём коде
Возвращайте ходы ассистента дословно. Сохраняйте весь массив content вместе с блоками thinking и подписями, а не собирайте его заново из текста.
Если история пришла от другого провайдера, уберите thinking перед отправкой в Claude. Удалите все блоки thinking и redacted_thinking, остальные блоки в каждом ходе оставьте:
def strip_thinking(messages):
cleaned = []
for message in messages:
content = message["content"]
if message["role"] == "assistant" and isinstance(content, list):
content = [b for b in content if b.get("type") not in ("thinking", "redacted_thinking")]
cleaned.append({**message, "content": content})
return cleaned
Для варианта с проверкой префикса ведите историю только на добавление. Новые инструкции добавляйте отдельным сообщением, а не правкой system или tools. Чтобы продолжить запрос без устаревшего рассуждения, отправьте beta-заголовок thinking-binding-controls-2026-08-01 и задайте thinking.block_binding.prefix_mismatch_behavior равным "drop_block", либо уберите блоки thinking, как показано выше, и повторите запрос один раз.
Частые вопросы
Вызывает ли эту ошибку смена аккаунта Claude или API-ключа?
Нет. Подпись не перестаёт проходить проверку из-за смены аккаунта. Привязаны к аккаунту только блоки thinking от Sonnet 5.5 и Haiku 5.5: если аккаунт другой, API молча отбрасывает их, и запрос выполняется успешно, без ошибки 400.
Поможет ли повторить запрос?
Без изменений — нет: тот же запрос отклоняется каждый раз. Удалите из истории блоки thinking и redacted_thinking и отправьте снова либо начните новый диалог. Для варианта с проверкой префикса можно также отправить beta-заголовок thinking-binding-controls-2026-08-01 и задать thinking.block_binding.prefix_mismatch_behavior равным "drop_block".
Почему ошибка появляется при переходе на Claude с DeepSeek и похожих моделей?
Их API, совместимые с Anthropic, тоже возвращают блоки thinking, но подпись в них — строка этого провайдера или пустое значение, и Claude не может её проверить. Когда та же сессия переходит на Claude, эти блоки уходят вместе с запросом, и Claude отвечает 400. При смене провайдера начинайте новую сессию или сначала удалите блоки thinking из истории.
Что делать, если Claude Code показывает эту ошибку постоянно?
Новые версии Claude Code сами убирают блоки thinking и повторяют запрос, поэтому сначала выполните claude update. Если и после обновления ошибка на каждом шаге, выполните /rewind, чтобы вернуться к шагу до проблемы, или /clear, чтобы начать новый диалог.