Índice
- 1. O que esse erro está realmente dizendo
- 2. Contexto: extended thinking e o mecanismo de "signature"
- 3. Por que acontece — 5 causas-raiz
- 4. Três soluções imediatas (para usuários do Claude Code)
- 5. Para desenvolvedores: previna no seu próprio app (API/SDK)
- 6. Como distinguir de erros parecidos
- 7. Checklist para evitar a recorrência
- Resumo
- FAQ
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.
O panorama completo do erro de thinking-block
— Se a "signature" não coincide, a API rejeita a conversa inteira
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.
Cinco causas-raiz de a signature não coincidir
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.
Três soluções por velocidade de recuperação
/rewind. Volte ao checkpoint anterior ao turno corrompido. A melhor jogada — recupera preservando o contexto./clear ou inicie uma nova sessão. O mais confiável, mas perde o contexto. Anote ou faça commit do trabalho importante antes.
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 erro | Significado | Solução principal |
|---|---|---|
| thinking blocks ... cannot be modified | O 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 block | A 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 thinking | A 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.