Você estava trabalhando no Claude Code e de repente este erro aparece e a sessão para de responder por completo?

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.

Se a verificação da signature de um bloco thinking reenviado falhar, você pode ver este erro no lugar. Os dois têm a mesma origem: o bloco thinking já não é exatamente o da resposta original:

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

A parte ruim: uma vez que aparece, cada entrada seguinte dispara o mesmo erro. Você digita, pressiona Enter e volta o mesmo 400. A sessão entra em um estado "travado". É um bug conhecido, com vários issues abertos no repositório oficial da Anthropic (#10199, #12225, #13012, #22278, #63147 e outros).

De antemão: a causa é "os blocos de extended thinking ficarem corrompidos quando o histórico da conversa é reenviado". Os blocos de thinking carregam uma signature criptográfica, e a API verifica se os blocos de thinking reenviados continuam iguais à resposta original. Quando um bug na reconstrução do histórico pelo Claude Code faz um bloco diferir do original, a API o rejeita. A saída mais rápida é "pressionar Esc duas vezes e voltar a um checkpoint com /rewind", ou iniciar uma nova sessão. Este artigo cobre o mecanismo, as 5 causas-raiz, 3 soluções para o usuário, contramedidas para desenvolvedores e a prevenção da recorrência.

CLAUDE CODE · 400 ERROR

O panorama completo do erro de thinking-block

— Se a "signature" não coincide, a API rejeita a conversa inteira

SINTOMA
Sessão travada
Cada entrada repete o mesmo 400
CAUSA
Signature não coincide
O thinking reenviado difere do original
SAÍDA MAIS RÁPIDA
Esc×2 → /rewind
Volte para antes da corrupção

Um bug conhecido com vários issues no repo oficial da Anthropic.
A essência: a regra rígida da API de que "os blocos de thinking devem permanecer exatamente como na resposta original."

1. O que esse erro está realmente dizendo

Em termos simples, a mensagem diz: "Os blocos de thinking ou redacted_thinking da última mensagem do assistente não podem ser modificados. Esses blocos devem permanecer como estavam na resposta original."

Ou seja, a API está dizendo: "O 'bloco de thinking' dentro do histórico de conversa que você (o cliente) me enviou difere do que eu retornei da última vez. Ele foi modificado. Então não vou aceitá-lo." A API do Claude pressupõe que, em conversas multi-turno, você "inclui a resposta anterior no histórico e a reenvia sem alterações" — e o bloco de thinking, em particular, carrega uma restrição rígida de "não mudar um único caractere". messages.3.content.40 é informação de posição: "o 41º bloco de conteúdo da 4ª mensagem" é onde está o problema.

O ponto importante: na maioria dos casos isto NÃO é um erro do seu código nem do seu prompt. A causa principal é um bug em como o Claude Code reconstrói o histórico de conversa (o JSONL da sessão), corrompendo os blocos de thinking. Então não precisa se atormentar com "será que estou usando errado?" — é um bug conhecido com soluções de contorno.

2. Contexto: extended thinking e o mecanismo de "signature"

Por que só o bloco de thinking é tão rígido? A razão está em como o extended thinking funciona.

Quando o Claude responde com extended thinking ativado, ele gera um "bloco de thinking" antes da resposta. É o raciocínio intermediário do Claude — o "como ele pensou" interno que eleva a qualidade da resposta final. A esse bloco é atribuída uma signature criptográfica — algo como uma assinatura digital que garante "este conteúdo de thinking foi genuinamente gerado pelo Claude e não foi alterado."

Em conversas multi-turno e loops de tool-use, toda a troca anterior é reenviada à API a cada vez, e os blocos de thinking também precisam ser enviados. Segundo a documentação oficial, a signature carrega uma cópia criptografada do thinking completo: a API a usa para verificar se o bloco devolvido foi gerado pelo Claude, e o servidor a descriptografa para reconstruir o thinking original. O texto de thinking que você vê é um resumo, e nos modelos mais novos o padrão (display: "omitted") o deixa vazio. A signature é a mesma qualquer que seja a configuração de display, e qualquer texto colocado no campo thinking de um bloco omitted é ignorado. Por isso a documentação pede devolver os blocos de thinking exatamente como foram recebidos, sem alterações. Se a signature estiver ausente ou corrompida, ou se o bloco não corresponder mais à resposta original, a API rejeita esse bloco de thinking. Essa é a essência do erro 400.

Por que a signature existe

Impedir a modificação dos blocos de thinking bloqueia o prompt injection e a falsificação de raciocínio. É um mecanismo de segurança que protege o fato de que "o Claude realmente pensou isto" — a rigidez tem uma razão.

3. Por que acontece — 5 causas-raiz

Os cenários concretos em que a signature não coincide se agrupam em cinco — sintetizados a partir dos issues oficiais da Anthropic e de relatos da comunidade.

5 CAUSAS-RAIZ

Cinco causas-raiz de a signature não coincidir

CAUSA 1 · Bug ao retomar a sessão / reconstruir o histórico
Ao retomar uma sessão ou reconstruir o histórico, os blocos de thinking reenviados deixam de coincidir com a resposta original. O autor do Issue #63147 atribuiu a causa à forma salva "texto vazio + signature", mas essa é a forma normal nos modelos mais novos (seção 5), e outros participantes do tópico contestam. A Anthropic não publicou uma causa oficial.
CAUSA 2 · Entrelaçamento de streaming
Em sessões longas, respostas da API em paralelo ou em sequência rápida se entrelaçam no JSONL. Fragmentos de mensagens diferentes se misturam e a ordem dos blocos se quebra.
CAUSA 3 · A lógica de reparo sai do controle
O processo interno de reparo do histórico do Claude Code reordena ou altera os blocos de thinking. Um reparo bem-intencionado acaba quebrando a signature.
CAUSA 4 · Proxy/SDK de terceiros
Proxies de retransmissão (CLIProxyAPI, etc.) reserializam as mensagens e alteram o thinking. A causa principal dos erros "Invalid signature".
CAUSA 5 · Modificação do histórico no seu próprio app
Em apps que você mesmo conecta à API/SDK, apagar, resumir ou reformatar os blocos de thinking no meio do loop de tool-use antes de reenviar. O erro de implementação artesanal mais comum.

O fio condutor: se um bloco de thinking diferir do original mesmo em um byte, você sempre recebe um 400.
As causas 1 a 4 são bugs do Claude Code ou do proxy; a causa 5 é um problema de implementação artesanal.

4. Três soluções imediatas (para usuários do Claude Code)

Quando sua sessão estiver travada, tente três métodos em ordem de velocidade de recuperação.

3 SOLUÇÕES

Três soluções por velocidade de recuperação

SOLUÇÃO 1 · /rewind (prioridade máxima)
Pressione Esc duas vezes, ou execute /rewind. Volte ao checkpoint anterior ao turno corrompido. A melhor jogada — recupera preservando o contexto.
SOLUÇÃO 2 · Nova sessão
/clear ou inicie uma nova sessão. O mais confiável, mas perde o contexto. Anote ou faça commit do trabalho importante antes.
SOLUÇÃO 3 · Reparar o JSONL
Remova todos os blocos de thinking do JSONL da sessão. Uma ferramenta da comunidade (abaixo) retira só o thinking mantendo o histórico de conversa. Jogada avançada que preserva o contexto.

Tente primeiro a SOLUÇÃO 1 (Esc×2 / rewind). Se falhar, a SOLUÇÃO 2. Se precisar manter o contexto, a SOLUÇÃO 3.
E mantenha sempre o Claude Code na última versão (a Anthropic está corrigindo isso de forma progressiva).

Nota sobre a SOLUÇÃO 3: a comunidade publicou uma ferramenta "Claude Code thinking blocks fix" (por exemplo, miteshashar/claude-code-thinking-blocks-fix no GitHub). Ela remove todos os blocos de conteúdo de thinking do JSONL da sessão, erradicando o problema da signature e mantendo o histórico de conversa. Vale a pena adotá-la se você sofre com isso com frequência ou usa muito sessões longas. Mas é uma ferramenta não oficial, então use por sua conta e risco — faça um backup do JSONL antes de executá-la.

A solução permanente mais importante é "manter o Claude Code na última versão". Execute claude update ou siga os passos oficiais de atualização. O changelog do Claude Code traz uma correção atrás da outra nessa família: entrelaçamento de streaming com agentes concorrentes (2.1.47), remoção preventiva de signatures obsoletas após trocar de modelo ou de login (2.1.152), blocos de thinking modificados com o Opus 4.8 (2.1.156) e descarte dos blocos de thinking com uma única nova tentativa após um erro de redacted_thinking (2.1.282). Mesmo assim, houve relatos de que o #63147 ainda se reproduz na 2.1.157, e ele continua aberto em 4 de outubro de 2026. Às versões antigas faltam mais dessas correções.

5. Para desenvolvedores: previna no seu próprio app (API/SDK)

Se você constrói um app que conecta você mesmo à API/SDK do Claude (extended thinking + tool use), vai encontrar o mesmo erro na sua própria implementação. A documentação oficial resume a prevenção em uma regra: devolver cada turno do assistente exatamente como a API o retornou, com os blocos de thinking, e só acrescentar mensagens novas no final.

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

① Um bloco de thinking com texto vazio e só a signature é normal. Nos modelos mais novos, display vem como "omitted" por padrão: o raciocínio completo vai criptografado dentro de signature e o campo thinking chega vazio. Devolva-o como está, sem preenchê-lo nem removê-lo (qualquer texto colocado no campo thinking de um bloco omitido é ignorado).

② Não corte você mesmo o thinking de turnos passados. Se você devolver todos os blocos, a API mantém os que cada modelo precisa, descarta o resto automaticamente e só cobra como entrada os blocos realmente mostrados ao Claude. Fora do uso de ferramentas, omitir o thinking de turnos anteriores é permitido, mas nos modelos mais novos um bloco de thinking só é válido enquanto o prompt system, as tools e as mensagens anteriores não mudam: editar um turno intermediário ou remover só alguns blocos invalida todos os blocos de thinking seguintes e retorna um 400 (Invalid signature in thinking block; vale, por exemplo, para contas criadas a partir de 31 de agosto de 2026). Para enxugar o histórico, deixe isso para a edição de contexto do servidor (limpeza de blocos de thinking) ou para a compactação.

③ Trate os blocos redacted_thinking da mesma forma. Um filtro que mantém ou remove só type === 'thinking' perde os redacted_thinking em silêncio. O guia oficial de solução de problemas aponta como causas mais comuns deste erro filtrar os blocos por tipo e perder os redacted_thinking, e reconstruir a mensagem do assistente em vez de devolvê-la como veio (Thinking, Thinking troubleshooting, em 4 de outubro de 2026).

A regra de ouro para os loops de tool-use

Nos loops de extended thinking + tool use (tool_use → tool_result), nunca altere o bloco de thinking da "última" mensagem do assistente. A próxima requisição que retorna tool_result deve incluir o thinking + tool_use precedentes exatamente como estão. Se você usa o Claude Agent SDK ou o Vercel AI SDK, verifique se a biblioteca lida com isso corretamente.

6. Como distinguir de erros parecidos

Há vários erros 400 relacionados a thinking, fáceis de confundir. Distinga os três principais.

Mensagem de erroSignificadoSolução principal
thinking blocks ... cannot be modifiedO tema deste artigo. A signature e o conteúdo não coincidem/rewind, nova sessão, atualizar para a última versão
Invalid signature in thinking blockA verificação da signature falhou: o bloco thinking foi alterado ou corrompido depois da resposta original (na reconstrução do histórico ou por um proxy que reescreveu o conteúdo)/rewind, nova sessão, atualizar para a versão mais recente; se usar proxy, revise também a configuração dele
The final block in an assistant message cannot be thinkingA mensagem do assistente termina em thinking (precisa de text ou tool_use no final)Corrigir a estrutura da mensagem, atualizar o SDK

A causa-raiz compartilhada é "não tratar corretamente os blocos de extended thinking". Para os usuários do Claude Code, a maioria se resolve com /rewind + atualização para a última versão. Para apps artesanais, é preciso revisar a estrutura das mensagens e a implementação da biblioteca. Se você passa por um proxy (CLIProxyAPI, vários gateways), suspeite primeiro de que o proxy está alterando o thinking.

7. Checklist para evitar a recorrência

Um checklist prático para evitar que se repita com frequência.

Usuários do Claude Code: ① Mantenha-o na última versão com claude update (a maior medida preventiva). ② Reinicie periodicamente as sessões muito longas com /clear (reduz o risco de entrelaçamento). ③ Faça commit no git com frequência no trabalho importante (recuperável mesmo que trave). ④ Considere uma ferramenta de reparo de JSONL se se repetir muito. ⑤ Relate as reproduções nos issues oficiais da Anthropic (acelera as correções).

Desenvolvedores de API/SDK: ① Insira as mensagens do assistente no histórico sem alterar a resposta da API (com thinking, redacted_thinking e signature). ② Mantenha o histórico só com acréscimos no final: não edite turnos intermediários nem remova só alguns blocos (deixe os cortes para a edição de contexto do servidor ou para a compactação). ③ Não remova blocos de thinking com texto vazio e signature (é o formato padrão nos modelos mais novos). ④ Use o último SDK oficial e minimize o remodelamento personalizado de mensagens. ⑤ Se estiver atrás de um proxy, verifique a transparência do thinking.

Resumo

O erro 400 "thinking blocks ... cannot be modified" do Claude Code acontece quando os blocos de extended thinking ficam corrompidos no reenvio do histórico e deixam de coincidir com a resposta original. É um bug conhecido com vários issues no repo oficial da Anthropic, e na maioria dos casos não é culpa sua. As cinco causas: bug ao retomar a sessão / reconstruir o histórico, entrelaçamento de streaming, lógica de reparo fora de controle, proxies de terceiros e modificação do histórico no seu próprio app.

Para os usuários do Claude Code, a recuperação mais rápida é ① pressionar Esc×2 / /rewind até um checkpoint; se falhar, ② uma nova sessão (/clear); para preservar o contexto, ③ uma ferramenta de reparo de JSONL. A solução permanente mais importante é "atualizar o Claude Code para a última versão" — o changelog traz uma correção atrás da outra para essa família. Os desenvolvedores de API/SDK devem devolver cada turno do assistente como veio, com os blocos de thinking / manter o histórico só com acréscimos no final / não remover blocos com texto vazio e signature.

Relacionado: O que é o Claude Agent SDK, guia completo do Vercel AI SDK, O que é o Cursor, fluxo de deploy com Claude Code/Cursor.

FAQ

Q. Esse erro é um erro do meu prompt ou do meu código?
A. Na maioria dos casos, não. Se ele aparece durante o uso do Claude Code, é quase com certeza um bug conhecido do lado do Claude Code (um defeito ao reconstruir o histórico da sessão). Há vários issues abertos no repo oficial da Anthropic e as correções estão em andamento. Não precisa se culpar. Só em apps artesanais (que conectam direto à API) é preciso revisar a implementação.

Q. O /rewind não resolve. E agora?
A. Iniciar uma nova sessão (/clear) é o mais confiável. Você perde o contexto, mas sai do estado travado com certeza. Guarde primeiro o trabalho importante via git commit ou notas. Se se repetir, atualize o Claude Code para a última versão; se continuar acontecendo, considere uma ferramenta de reparo de JSONL.

Q. Posso evitá-lo desativando o extended thinking?
A. Tecnicamente sim, mas o extended thinking melhora bastante a precisão em tarefas complexas, então desativá-lo não é recomendável. Primeiro contorne com atualização para a última versão + /rewind, e considere isso apenas como último recurso em ambientes especiais (por exemplo, atrás de um proxy) onde ainda se repita.

Q. A ferramenta de reparo de JSONL é segura?
A. É não oficial, então use por sua conta e risco. Faça sempre um backup do JSONL da sessão antes de usá-la. O mecanismo é "remover todos os blocos de conteúdo de thinking mantendo o histórico de conversa", o que é seguro em princípio — mas a correção oficial (atualizar para a última versão) continua sendo a solução real.

Q. No meu próprio app, combinar tool use com thinking dispara esse erro.
A. A causa é "você está alterando o bloco de thinking da última mensagem do assistente". A próxima requisição que retorna tool_result deve incluir os blocos de thinking + tool_use precedentes exatamente como a API os retornou (com a signature). Você não precisa cortar o thinking de turnos passados; nos modelos mais novos, removê-lo só de alguns turnos invalida os blocos de thinking seguintes. Um bloco com texto vazio e só a signature é o formato normal nesses modelos, então devolva-o sem alterações. O último SDK oficial cuida da maior parte disso automaticamente.

Erros do Claude Code relacionados: referência de erros do Claude Code, erro "court" + invoke, "Prompt is too long".

Relacionado: O pensamento adaptativo do Claude.