"API Error: Stream idle timeout - partial response received": como resolver
Voltar para o Blog
Artigotroubleshootingclaude codedev toolsprodutividade

"API Error: Stream idle timeout - partial response received": como resolver

Mafra7 de novembro de 20266 min de leitura

No meio de uma resposta longa, o CLI para de escrever e devolve:

API Error: Stream idle timeout - partial response received

A sessão continua aberta e o histórico não se perde, mas o turno acabou ali. O erro nasce no próprio CLI, não na sua conta: um watchdog de stream abandonou a resposta porque os bytes pararam de chegar por tempo demais. Ele aparece em situações diferentes, com correções diferentes, e este guia separa cada uma.

O que significa "Stream idle timeout - partial response received"?

Significa que a resposta começou e foi cortada no meio. Os primeiros bytes chegaram, o stream abriu, e em algum ponto entre um chunk e o próximo a conexão ficou muda até o watchdog estourar e abortar o turno.

É diferente de No response from API, que é a espera antes do primeiro byte. Aqui a resposta já estava em andamento. O que se perde é o trecho que estava sendo gerado, não a conversa: a sua mensagem, os arquivos lidos e as ferramentas já executadas seguem na sessão.

Fluxograma: a resposta cortou no meio, suba o limiar do watchdog com CLAUDE_STREAM_IDLE_TIMEOUT_MS, que vem com 90 segundos por padrão; se só reiniciar resolve, é o latch do keep-alive
Do erro até a correção certa, em três passos e um ramo.

Por que a resposta corta no meio?

Três causas respondem por quase todos os relatos, e cada uma pede uma correção diferente. Antes de mexer em configuração, identifique a sua.

CausaComo você reconheceO que resolve
Silêncio do provedor ou do caminho até elecorta em turnos longos, às vezes em todossubir o limiar do watchdog
Proxy ou gateway que bufferiza a respostacorta sempre atrás de VPN, gateway ou ANTHROPIC_BASE_URLtestar sem proxy e ajustar o prazo do retry
Latch de keep-alive do próprio CLIa sessão piora com o tempo e reiniciar resolvereiniciar a sessão ou voltar de versão

Aumentei API_TIMEOUT_MS e nada mudou. Por quê?

Porque API_TIMEOUT_MS não é o teto da resposta em streaming. O próprio changelog descreve o comportamento: quando a API não manda cabeçalhos, o retry passa a esperar até API_TIMEOUT_MS, que vale 10 minutos por padrão. É um prazo de espera por resposta, não um relógio que mede o silêncio entre um chunk e o próximo.

Quem olha a mensagem de idle timeout e sobe esse número continua batendo no mesmo watchdog, porque o relógio que estourou é outro.

Qual variável controla o watchdog do stream?

É CLAUDE_STREAM_IDLE_TIMEOUT_MS, que configura o limiar do watchdog de idle do streaming e vem com 90 segundos por padrão. Quando nenhum byte chega dentro dessa janela, o turno é abortado e você vê a mensagem de partial response.

VariávelO que controlaPadrão
CLAUDE_STREAM_IDLE_TIMEOUT_MSlimiar do watchdog de idle do stream90 segundos
API_TIMEOUT_MSquanto o retry espera por uma resposta sem cabeçalhos10 minutos
API_FORCE_IDLE_TIMEOUTtimeout de idle de 5 minutos restaurado por padrão no Vertex e no Foundryativo nesses provedores; 0 desativa
CLAUDE_CODE_DISABLE_NONSTREAMING_FALLBACKdesliga o fallback não streaming quando o streaming falhadesligado

Repare no escopo de cada uma: CLAUDE_STREAM_IDLE_TIMEOUT_MS é o watchdog genérico de silêncio no stream, enquanto API_FORCE_IDLE_TIMEOUT mexe num timeout específico de Vertex e Foundry. Se você não está nesses dois provedores, essa segunda variável não é a sua alavanca.

Para uma sessão, exporte antes de abrir o CLI. O valor é em milissegundos, então 180000 equivale a três minutos:

export CLAUDE_STREAM_IDLE_TIMEOUT_MS=180000
claude

Para valer em todas as sessões, use o bloco env do ~/.claude/settings.json:

{
  "env": {
    "CLAUDE_STREAM_IDLE_TIMEOUT_MS": "180000"
  }
}

No PowerShell, a sintaxe é $env:CLAUDE_STREAM_IDLE_TIMEOUT_MS = "180000". Depois de salvar o arquivo, rode /status e confira a linha Setting sources para saber se o CLI carregou o arquivo.

Atenção: subir o limiar evita o aborto prematuro, não conserta uma conexão que caiu. Se o corte vem sempre no mesmo ponto, com o relógio batendo perto de um número redondo, o problema está no caminho da rede, não no prazo.

Por que sessão longa piora com o tempo?

Existe um agravante no pool de conexões. O changelog registra a mudança: o keep-alive passa a ser desligado depois de uma conexão obsoleta, para o retry abrir um socket novo. Segundo o relato da issue #100353, o código desliga essa chave e nada a religa: o processo passa a abrir conexão nova a cada requisição até ser reiniciado.

O autor mediu o efeito numa sessão de orquestrador com muitos subagentes, no Linux, com o watchdog em 60 segundos:

CenárioRequisiçõesAborts do watchdogLacunas de 40 segundos ou maisErros 400 de continuação
Com o latch ativo~1.725131 (7,6%)66101
Com o latch desativado no binário~2.190002

Os números são do relato, não de uma medição nossa, e a issue segue aberta. O sinal está no log: rode com --debug-file e procure a linha que começa com Stale connection e termina com disabling keep-alive for retry. Depois dela, a sessão tende a piorar até reiniciar.

Como resolver quando só reiniciar resolve?

Se o log mostra o latch, as saídas são três, em ordem de custo:

  1. Reinicie a sessão longa depois do primeiro aviso. É o que o autor da issue faz, e o que derruba a taxa de stalls para zero.
  2. Rode uma versão do CLI anterior à mudança de keep-alive descrita na issue, onde o gatilho ainda não estava ativo.
  3. Se precisar ficar na versão atual, desligue o fallback não streaming, que é o que transforma um stall em reenvio da conversa inteira:
    export CLAUDE_CODE_DISABLE_NONSTREAMING_FALLBACK=1

O item 3 não corrige o latch. Ele evita o efeito caro, que é reenviar de 0,35 a 1,1 MB de conversa a cada stall, segundo o mesmo relato.

O erro aparece em requisições de mais de 5 minutos?

Aí o limite é de outra natureza. Um relato aberto em 04/11/2026 com o CLI 2.1.317, atualizado em 07/11/2026, descreve o uso de um modelo local grande servido via ANTHROPIC_BASE_URL: qualquer requisição que passe de 5 minutos é abortada, com uma sequência de Request timed out. Retrying até o limite de tentativas.

Nesse cenário, o watchdog de stream não é o único envolvido, e o próprio autor aponta a possibilidade de um timeout de idle da camada HTTP do runtime. Para um modelo local que demora mais de 5 minutos por resposta, a saída prática é dividir a tarefa em pedaços menores ou esperar a correção, não aumentar variável de watchdog.

Como reduzir a chance de acontecer de novo?

  • Divida turnos longos. Pedir um plano enorme num único turno é um dos cenários que aparecem nos relatos.
  • Rode /compact antes de tarefas longas, para o turno seguinte ter menos contexto para sustentar.
  • Teste sem VPN, proxy ou gateway quando o erro for constante, e compare com a API direta.
  • Em automação, prefira sessões curtas e headless, reiniciando entre lotes.
  • Abra sessões longas com --debug-file, para ver o latch antes de perder a tarde.

A Verboo Code é a segunda rota para quando a primeira trava no meio: ela roda no mesmo fluxo de terminal e entrega tokens ilimitados, então um turno longo não esbarra em cota enquanto você investiga o stream. Manter dois caminhos configurados evita que um provider único pare o dia.

Gostou deste artigo?
Compartilhe conhecimento com sua rede.
// Leia também

Artigos relacionados