Agente da orquestração falhou no meio: como retomar sem refazer tudo

Retomar orquestração de agentes é resolver três problemas diferentes: erro passageiro, processo que cai e trabalho já feito que não pode ser refeito. Na API da Anthropic, 529 é overloaded_error (sobrecarga temporária) e 429 é rate_limit_error (limite da sua conta), e os SDKs oficiais já refazem falhas transitórias com backoff exponencial, duas vezes por padrão. Erro determinístico como ValueError não entra nessa conta. Pra voltar do meio você precisa de estado salvo: checkpointer por superstep no LangGraph, sessão em disco no Claude Agent SDK, Session no OpenAI Agents SDK. E precisa saber onde o seu orquestrador corta o cache
Fala aí, beleza? Orquestração longa que nunca falha no meio não existe, o que existe é orquestração que sabe voltar
O cenário é sempre o mesmo: você dispara o fluxo, vários agentes rodando em paralelo, vinte minutos de trabalho acumulado… e uma etapa morre
Aí vem a pergunta que dói: refaz tudo?
A resposta honesta é que falha de agente no meio é rotina, não exceção, e o conserto vem em três camadas: retentativa pro erro passageiro, estado salvo por etapa e retomada só do que faltou
Bora destrinchar cada uma 🙂
Qual falha você teve? 529, 429, erro no stream ou etapa quebrada
Antes de mexer em configuração, triagem
O conserto muda COMPLETAMENTE conforme a causa, e a maioria das pessoas configura retentativa em cima de um erro que nunca vai passar por repetição
- 529: é o
overloaded_errorda API da Anthropic, ou seja, a API está temporariamente sobrecarregada. Aqui retentar faz sentido, é literalmente o caso de uso - 429: é
rate_limit_error, o limite da SUA conta. Repetir rápido não resolve, o que resolve é espaçar as chamadas - overloaded_error dentro do stream: quando a resposta vem por streaming, a sobrecarga chega como um evento de erro no meio do stream, equivalente ao 529 do modo não streaming
- erro determinístico:
ValueError,TypeError,SyntaxErrore companhia. Isso não é sobrecarga, é bug. Repetir dez vezes dá o mesmo resultado dez vezes
Formação Vibe Coding
Do Prompt ao Produto: Crie Software Real com IA
- 474 aulas
- 20 projetos
- 39h 27min
Essa distinção não é teórica: a política padrão de retentativa do LangGraph repete erro de conexão e HTTP 5xx, e NÃO repete ValueError, TypeError, SyntaxError e similares
Ou seja, o próprio framework já assume que retentativa é remédio pra erro transitório, não pra código quebrado
E o 429 tem um detalhe prático: se você usa n8n, o campo que segura o limite é o tempo de espera entre tentativas, e ele precisa ser MAIOR que a janela do limite. Pra um limite de 1 requisição por segundo, isso significa 1000 ms de espera
Como prevenir: trate a etapa como retomável desde o início
O erro clássico aqui é descobrir que o fluxo não é retomável na hora em que ele quebra
Aí já era: o trabalho estava só na memória do processo
Prevenir é decidir ANTES onde o estado é gravado, mesmo que a primeira versão do fluxo nunca falhe. É o mesmo raciocínio de segurar o agente antes da edição: você paga um custo pequeno de planejamento pra não pagar um custo grande de retrabalho
E não confie só na camada do SDK. Existe uma issue aberta no repositório do Claude Code relatando exatamente isso: erros 529 transitórios abortando tarefas longas sem recuperação automática
Sinal claro de que a camada de aplicação também precisa da própria rede de proteção
O que você precisa antes de configurar a retomada
Checklist curto, e honesto no que ele não resolve:
1. Etapas com fronteira clara
Uma unidade de trabalho por nó, por agente, por passo
Se uma etapa faz três coisas diferentes, você só consegue retomar as três juntas. Retomada boa nasce de granularidade boa, e granularidade nasce de saber a diferença entre subagentes e comandos na hora de fatiar o fluxo
2. Um lugar pra gravar estado
Sem isso não existe retomada, existe só recomeço
- LangGraph: um checkpointer
- Claude Agent SDK: a sessão gravada em disco automaticamente
- OpenAI Agents SDK: o protocolo Session (a implementação padrão em Python usa SQLite)
3. A decisão de durabilidade
Essa é a que quase ninguém toma conscientemente
O LangGraph tem três modos que definem QUANDO o estado é gravado:
| Modo | Quando grava | O que você aceita |
|---|---|---|
exit | só ao terminar a execução | sem recuperação no meio |
async | em paralelo com o passo seguinte | risco de perder o checkpoint se o processo cair |
sync | antes de começar o próximo passo | custo de performance |
Não existe escolha certa universal aqui
Existe a pergunta: perder um passo dói mais que o custo de gravar antes de cada passo? Se dói, sync
Passo a passo: da retentativa automática à retomada do que faltou
- Deixe o SDK cuidar do transitório
Os SDKs oficiais da Anthropic já refazem sozinhos as falhas transitórias (erro de conexão, rate limit e erros 5xx) com backoff exponencial, duas vezes por padrão, e respeitando o header retry-after quando ele vem na resposta
O erro comum deste passo: empilhar retry em cima de retry
Você põe a sua retentativa por fora, o SDK já tem a dele por dentro, e o número real de tentativas vira uma multiplicação que você não controla. Antes de escrever qualquer loop, saiba o que a camada de baixo já faz
- Política de retentativa por etapa, não global
No LangGraph a retentativa é configurada POR NÓ, no add_node:
builder.add_node("call_api", call_api, retry_policy=RetryPolicy(max_attempts=3))Os padrões do RetryPolicy são estes:
initial_interval = 0.5s
backoff_factor = 2.0
max_interval = 128.0s
max_attempts = 3Repare no detalhe: max_attempts conta a PRIMEIRA tentativa
Então 3 não é "uma chamada mais três repetições", é três chamadas no total. Já vi gente dimensionar orçamento de chamada errado por causa disso
O erro comum deste passo: esperar que a política repita erro determinístico
Ela não repete, e isso é uma decisão de projeto, não uma limitação. Se o seu nó estoura ValueError, o conserto é no nó
- Ligue o checkpointer e organize por thread
Com um checkpointer, o LangGraph salva o estado do grafo a cada superstep e organiza as execuções por thread
É isso que permite voltar do último ponto salvo em vez de voltar do início
E é aqui que a decisão de durabilidade do bloco anterior encosta na realidade: se você ficou no exit, não existe ponto salvo no meio pra voltar. O checkpoint só existe onde você mandou gravar
- Retome
No Claude Agent SDK a sessão inteira (prompt, chamadas de ferramenta, resultados e respostas) é persistida em disco automaticamente, e o query() tem os campos de opção continue e resume pra voltar nela
// opções do query()
{ resume: sessionId, forkSession: true }O forkSession (ou fork_session, no Python) é o irmão esperto do resume: em vez de continuar a mesma linha, ele cria um NOVO id de sessão partindo do estado retomado, com cópia do histórico
Muito massa pra quando você quer testar dois caminhos a partir do mesmo ponto de falha, sem destruir o original
No n8n, o caminho é outro: a retentativa mora dentro do painel Settings do próprio nó, com Retry On Fail ligado e os campos Max Tries e Wait Between Tries (em ms)
O erro comum do passo de retomada: no OpenAI Agents SDK, Sessions não pode ser combinada com conversation_id, previous_response_id ou auto_previous_response_id no mesmo run
São dois modelos de persistência mutuamente exclusivos, e misturar os dois não te dá o dobro de segurança, te dá um conflito
Como cada orquestrador retoma na prática (e onde cada um corta)
Retomar é fácil de prometer
O que separa as ferramentas é quanto trabalho volta de graça, e onde exatamente o cache para
Claude Code dynamic workflows
Um run parado pode ser retomado, e os agentes já concluídos costumam devolver o resultado em cache enquanto o resto roda ao vivo
A retomada é feita pela tela /workflows: você seleciona o run e aperta p, ou simplesmente pede pro Claude relançar o workflow com o mesmo script
Só que essa retomada tem UMA condição que você precisa saber antes de contar com ela: ela vale dentro da MESMA sessão. Se você sair do Claude Code com um workflow rodando, a próxima sessão começa o workflow do zero
Ou seja, o /workflows te devolve o run enquanto a sessão está de pé, não pra sempre
Agora se liga na regra de corte, porque ela é o detalhe que muda tudo:
- agente que ainda estava RODANDO quando você parou não é salvo e recomeça
- o cache para no primeiro agente que não terminou
- todo agente iniciado depois dele roda de novo, mesmo tendo concluído
Ou seja: não é "tudo que terminou volta do cache", é "tudo que terminou ANTES do primeiro incompleto volta do cache"
Existe também uma issue aberta relatando re-execução de agentes concluídos em vez do uso do cache do journal, então vale acompanhar antes de apostar todas as fichas no reaproveitamento
Claude Agent SDK
Aqui o modelo é de sessão, não de grafo
A sessão é gravada em disco automaticamente e você volta nela com continue ou resume, ou bifurca com forkSession / fork_session pra criar um novo id partindo do mesmo estado
Simples e previsível: o que a sessão registrou é o que você recupera
LangGraph
Checkpoint a cada superstep, organizado por thread
O detalhe legal é que esse mesmo mecanismo não serve só pra recuperação de falha: ele é a base do histórico de estado e do human-in-the-loop
Faz sentido, né? Pausar pra um humano decidir e pausar porque a API caiu são o mesmo problema técnico visto de dois ângulos
OpenAI Agents SDK
Três caminhos distintos de persistência entre execuções:
- gestão manual, com
RunResult.to_input_list() - persistência automática, via protocolo
Session - estado no servidor, via
conversation_id/previous_response_id
A implementação padrão de sessão em Python usa SQLite, e aqui mora uma pegadinha: em memória, o histórico morre quando o processo termina. Em arquivo, ele persiste
Se você configurou em memória e reiniciou o processo pra tentar de novo, não tem retomada nenhuma pra fazer
Na versão TypeScript dá pra retomar a partir de um RunState interrompido, e o novo turno é anexado ao mesmo registro de memória. Em execuções locais com sessão, a SDK faz um rollback best-effort dos itens recém-persistidos pra reduzir entradas duplicadas depois de um retry
Repare no "best-effort": é redução de duplicata, não garantia
n8n
O que a documentação do n8n cobre nesse ponto é a retentativa POR NÓ, e ela mora no painel Settings do próprio nó
Você liga o Retry On Fail e define Max Tries e Wait Between Tries (em ms)
E lembra do 429 lá do começo? É aqui que ele volta: o Wait Between Tries precisa ser MAIOR que a janela do limite, senão você só repete o mesmo estouro mais rápido. Pra 1 requisição por segundo, 1000 ms
Temporal
O modelo de execução durável é o mais radical dos cinco
No replay, chamadas de LLM e invocações de ferramenta já concluídas não são re-executadas: os resultados voltam do histórico de eventos
É a diferença entre "eu guardei o resultado da etapa" e "eu guardei a linha do tempo inteira da execução"
Conclusão
Resumindo o que faz o quê, porque cada camada resolve um problema diferente e trocar uma pela outra é o erro mais caro aqui:
- retentativa resolve o transitório (529, conexão, 5xx)
- checkpoint resolve o processo que cai
- retomada só compensa de verdade se você souber a regra de corte do SEU orquestrador
E essa última é a que mais engana: dá pra ter checkpoint configurado, retomar o run e mesmo assim ver metade dos agentes rodando de novo, porque o corte do cache não era onde você imaginava
Próximo passo concreto pra fechar: identifique a etapa mais cara do seu fluxo, aquela que gasta mais tempo e mais token
Grave o estado ANTES dela
E faça uma parada proposital, de propósito mesmo, só pra ver com os próprios olhos quanto volta do cache e quanto roda de novo
Melhor descobrir isso num teste do que às 2h da manhã com o fluxo de produção pela metade 😀
até o próximo post!
Perguntas frequentes
Se eu sair do Claude Code com um workflow rodando, ele continua sozinho?
Não. A retomada de workflow do Claude Code vale dentro da mesma sessão, então se você sair com um workflow em andamento, a próxima sessão começa esse workflow do zero. Pra retomar de verdade, o run precisa continuar acessível em /workflows antes de você fechar a sessão.
Como retomar um workflow pausado do Claude Code sem perder os agentes que já terminaram?
Você seleciona o run em /workflows e aperta p, ou pede pra relançar o workflow com o mesmo script. Os agentes já concluídos costumam devolver o resultado em cache enquanto o resto roda ao vivo, mas o cache para no primeiro agente que ainda estava rodando quando você parou: esse e todo agente iniciado depois dele executam de novo, mesmo que tenham concluído nesse meio tempo.
Qual a diferença prática entre erro 429 e erro 529 na API da Anthropic?
429 é rate_limit_error, o limite da sua própria conta, e repetir a chamada rápido não resolve, o que resolve é espaçar as requisições. 529 é overloaded_error, sobrecarga temporária do provedor, e aqui retentar faz sentido porque é literalmente o caso de uso da retentativa.
O Claude Agent SDK salva o progresso da sessão automaticamente ou preciso configurar isso?
Ele grava a sessão em disco automaticamente, incluindo prompt, chamadas de ferramenta, resultados e respostas. Pra voltar a ela você usa as opções continue ou resume no query(), e se quiser abrir uma linha nova a partir daquele ponto, dá pra bifurcar com forkSession (ou fork_session em Python), que cria um novo id de sessão com cópia do histórico.
Configurar retentativa por conta própria é necessário se o SDK já refaz erro transitório sozinho?
O SDK oficial já refaz falhas transitórias com backoff exponencial, duas vezes por padrão, respeitando o header retry-after. Ainda assim existe issue aberta no repositório do Claude Code relatando 529 abortando tarefas longas sem recuperação automática, então a camada de aplicação também precisa da própria rede de proteção.
Dá pra definir uma política de retentativa diferente pra cada etapa de um agente?
No LangGraph sim: a retentativa é configurada por nó, passando retry_policy no add_node. Os padrões são initial_interval de 0,5s, backoff_factor de 2,0, max_interval de 128s e max_attempts de 3, contando a primeira tentativa dentro desse total.
Formações
Formação SAAS com IA
Tire usas ideias do papel criando softwares com IA, integre pagamentos e lance seu projeto!
- 291 aulas
- 18 projetos
- 24h 17min
Blog | Mais populares

As diferenças de var, let e const

Como fazer redirecionamento com PHP
Neste artigo você vai aprender a como fazer redirecionamento com PHP, utilizaremos abordagens fáceis de entender e de aplicar Fala programador(a), beleza? Bora aprender mais […]

ChatGPT: o que é, como usar, dicas e como acessar login
ChatGPT é uma ferramenta de processamento de linguagem natural (NLP) baseada na arquitetura GPT-3.5, desenvolvida pela OpenAI. Sua criação representa um marco significativo no campo […]
