0Pricing
AI Agents · Aula

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:
        pass

Espera 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 seconds

Adicionar 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)
    continue

Limitar 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

  1. Ferramentas idempotentes e efeitos colaterais
  2. Novas tentativas com recuo exponencial
  3. Limites de tempo e disjuntores
  4. Validando saídas de ferramentas (Pydantic)
← Voltar para AI Agents