Novas tentativas com recuo exponencial
Utilize tenacity para repetir operações após falhas transitórias, com atrasos que aumentam exponencialmente e aleatoriedade.
Novas tentativas com recuo exponencial é uma aula grátis de AI Agents no CoddyKit. Esta é a aula 2 de 4. Você pode ler a aula completa abaixo gratuitamente — depois pratica ao vivo no navegador com um editor de código integrado e um tutor de IA 24/7. Faz parte do caminho de aprendizado de AI Agents, e seu progresso é sincronizado entre a web e o app CoddyKit. O curso de AI Agents inclui 4 aulas no total.
Por que fazer novas tentativas?
Chamadas externas (LLM, APIs de pesquisa e bancos de dados vetoriais) falham temporariamente. Uma nova tentativa simples recupera-se da maioria dessas falhas intermitentes sem incomodar o usuário.
O que NOT fazer
Não faça novas tentativas instantaneamente em um loop apertado — você sobrecarregará o serviço, e o limitador de taxa bloqueará seu acesso:
# BAD
for _ in range(10):
try:
return call_api()
except Exception:
passEspera exponencial
Espere mais tempo após cada falha. O expoente 2 é a convenção:
import time
def call_with_backoff(fn, attempts=5):
for i in range(attempts):
try:
return fn()
except TransientError:
if i == attempts - 1:
raise
time.sleep(2 ** i) # 1, 2, 4, 8, 16 secondsAdicionar variação aleatória
Sem uma variação aleatória, as novas tentativas de muitos clientes se alinham, criando tráfego de manada. Adicione um deslocamento aleatório:
import random
sleep = (2 ** i) + random.uniform(0, 1)
time.sleep(sleep)Usar Tenacity
A biblioteca tenacity implementa isso por você:
from tenacity import retry, wait_exponential_jitter, stop_after_attempt, retry_if_exception_type
import requests
@retry(
wait=wait_exponential_jitter(initial=1, max=30),
stop=stop_after_attempt(5),
retry=retry_if_exception_type((requests.Timeout, requests.ConnectionError))
)
def search(query):
return requests.get('https://api.tavily.com/search', timeout=10).json()Repetir apenas erros transitórios
Nunca faça novas tentativas em:
- Erros 4xx (requisição inválida — repetir não ajudará)
- Falhas de autenticação
- Erros de validação
Faça novas tentativas em:
- Tempos limite esgotados
- Erros de servidor 5xx
- Limites de taxa (com esperas mais longas)
Novas tentativas cientes do limite de taxa
Respeite o cabeçalho Retry-After:
if response.status_code == 429:
wait = int(response.headers.get('Retry-After', 5))
time.sleep(wait)
continueLimitar o tempo total das novas tentativas
Limite a duração total das novas tentativas — normalmente de 30 a 60 segundos para uma chamada voltada ao usuário:
from tenacity import stop_after_delay
@retry(
wait=wait_exponential_jitter(initial=1, max=10),
stop=stop_after_delay(60)
)
def call_api():
...Cabeçalhos de idempotência
Para APIs não idempotentes (Stripe etc.), inclua uma chave de idempotência em cada nova tentativa para que os duplicados sejam agrupados:
headers = {'Idempotency-Key': f'agent-call-{run_id}-{tool_id}'}Repetir também a chamada do LLM
Os SDKs da OpenAI e da Anthropic fazem automaticamente de 1 a 2 novas tentativas. Você pode configurar:
client = OpenAI(max_retries=5, timeout=30.0)Novas tentativas assíncronas
Para código assíncrono:
from tenacity import AsyncRetrying
async for attempt in AsyncRetrying(wait=wait_exponential_jitter(), stop=stop_after_attempt(5)):
with attempt:
result = await call_api()Registrar novas tentativas
Cada nova tentativa deve registrar: número da tentativa, duração da espera e motivo do erro. Caso contrário, será impossível depurar "por que está tão lento?".
Novas tentativas versus tempos limite
Defina um tempo limite curto para cada tentativa (por exemplo, 10 s) e um limite total usando stop_after_delay (por exemplo, 60 s). Sem ambos, uma conexão travada pode ficar pendurada indefinidamente.
Por que usar variação aleatória?
Por que adicionar uma variação aleatória aos atrasos entre novas tentativas?
Recapitulação
Espera exponencial + variação aleatória + tempo total limitado + novas tentativas apenas para erros transitórios. Use tenacity para evitar o código repetitivo.
Perguntas Frequentes
A aula “Novas tentativas com recuo exponencial” é grátis?
Sim — o texto completo de “Novas tentativas com recuo exponencial” é grátis para ler aqui na web. Para praticá-la interativamente (um editor de código integrado e um tutor de IA 24/7) e desbloquear o restante do curso de AI Agents, atualize para CoddyKit PRO. O curso de AI Agents inclui 4 aulas no total.
O que vou aprender em “Novas tentativas com recuo exponencial”?
Utilize tenacity para repetir operações após falhas transitórias, com atrasos que aumentam exponencialmente e aleatoriedade. Você pratica AI Agents com código prático que executa diretamente no navegador, e um tutor de IA 24/7 responde suas dúvidas enquanto trabalha na aula.
Preciso ter experiência prévia para começar AI Agents?
Nenhuma experiência prévia é necessária. AI Agents no CoddyKit é estruturado para alunos iniciantes até avançados, então você pode começar aqui ou desde o início e aprender no seu ritmo. Esta é a aula 2 de 4.
Quanto tempo leva a aula “Novas tentativas com recuo exponencial”?
A maioria das aulas CoddyKit leva cerca de 5–10 minutos. Cada uma é compacta e interativa, então você faz progresso constante e retoma exatamente de onde parou entre web e app.
Posso escrever e executar código nesta aula de AI Agents?
Sim. Cada aula de AI Agents inclui um editor de código integrado, então você escreve e executa código real direto no navegador e recebe feedback de IA instantaneamente — nenhuma configuração local necessária.
Todas as aulas deste curso
- Ferramentas idempotentes e efeitos colaterais
- Novas tentativas com recuo exponencial
- Limites de tempo e disjuntores
- Validando saídas de ferramentas (Pydantic)