0Pricing
AI Agents · Lección

Reintentos con retroceso exponencial

Use tenacity para reintentar fallos transitorios con demoras crecientes de forma exponencial y jitter.

Reintentos con retroceso exponencial es una lección gratuita de AI Agents en CoddyKit. Esta es la lección 2 de 4. Puedes leer la lección completa abajo gratuitamente — luego la practicas en el navegador con un editor de código integrado y un tutor de IA 24/7. Forma parte de la ruta de aprendizaje de AI Agents, y tu progreso se sincroniza en la web y la app de CoddyKit. El curso de AI Agents incluye 4 lecciones en total.

¿Por qué usar reintentos?

Las llamadas externas (LLM, API de búsqueda, bases de datos vectoriales) fallan temporalmente. Un reintento sencillo permite recuperarse de la mayoría de los fallos intermitentes sin molestar al usuario.

Qué NO debe hacer

No reintente inmediatamente en un bucle cerrado: saturará el servicio y el limitador de tasa le bloqueará:

# BAD
for _ in range(10):
    try:
        return call_api()
    except Exception:
        pass

Retroceso exponencial

Espere más tiempo después de cada fallo. La exponenciación en base 2 es la convención:

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

Añada jitter

Sin jitter, los reintentos de muchos clientes se sincronizan y crean tráfico en estampida. Añada un desplazamiento aleatorio:

import random
sleep = (2 ** i) + random.uniform(0, 1)
time.sleep(sleep)

Use Tenacity

La biblioteca tenacity implementa esto por usted:

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()

Reintente solo los errores transitorios

No reintente nunca en estos casos:

  • Errores 4xx (solicitud incorrecta; reintentar no ayudará)
  • Fallos de autenticación
  • Errores de validación

Reintente en estos casos:

  • Tiempos de espera agotados
  • Errores de servidor 5xx
  • Límites de tasa (con esperas más prolongadas)

Reintentos conscientes del límite de tasa

Respete el encabezado Retry-After:

if response.status_code == 429:
    wait = int(response.headers.get('Retry-After', 5))
    time.sleep(wait)
    continue

Limite el tiempo total de reintento

Limite el tiempo total que pueden tardar los reintentos; normalmente, entre 30 y 60 segundos para una llamada de cara al usuario:

from tenacity import stop_after_delay

@retry(
    wait=wait_exponential_jitter(initial=1, max=10),
    stop=stop_after_delay(60)
)
def call_api():
    ...

Encabezados de idempotencia

Para API no idempotentes (Stripe, etc.), incluya una clave de idempotencia en cada reintento para que las operaciones duplicadas se agrupen:

headers = {'Idempotency-Key': f'agent-call-{run_id}-{tool_id}'}

Reintente también la llamada al LLM

Los SDK de OpenAI y Anthropic reintentan automáticamente una o dos veces. Puede configurarlos:

client = OpenAI(max_retries=5, timeout=30.0)

Reintentos asíncronos

Para código así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()

Registre los reintentos

Cada reintento debe registrar: número de intento, duración de la espera y motivo del error. De lo contrario, es imposible depurar "¿por qué es tan lento?".

Reintentos frente a tiempos de espera

Establezca un tiempo de espera reducido para cada intento (por ejemplo, 10 s) y un límite total mediante stop_after_delay (por ejemplo, 60 s). Sin ambos, una conexión bloqueada puede quedarse esperando indefinidamente.

¿Por qué usar jitter?

¿Por qué añadir jitter aleatorio a los retrasos entre reintentos?

Repaso

Retroceso exponencial + jitter + tiempo total limitado + reintentos solo en errores transitorios. Use tenacity para evitar escribir código repetitivo.

Preguntas frecuentes

¿La lección «Reintentos con retroceso exponencial» es gratis?

Sí — el texto completo de «Reintentos con retroceso exponencial» es gratis para leer aquí en la web. Para practicarla de forma interactiva (editor de código integrado y tutor de IA 24/7) y desbloquear el resto del curso de AI Agents, actualiza a CoddyKit PRO. El curso de AI Agents incluye 4 lecciones en total.

¿Qué aprenderé en «Reintentos con retroceso exponencial»?

Use tenacity para reintentar fallos transitorios con demoras crecientes de forma exponencial y jitter. Practicas AI Agents con código real que ejecutas directamente en el navegador, y un tutor de IA 24/7 responde tus preguntas mientras trabajas en la lección.

¿Necesito experiencia previa para empezar AI Agents?

No se requiere experiencia previa. AI Agents en CoddyKit está estructurado para principiantes hasta estudiantes avanzados, así que puedes empezar aquí o desde el inicio y avanzar a tu ritmo. Esta es la lección 2 de 4.

¿Cuánto tiempo toma la lección «Reintentos con retroceso exponencial»?

La mayoría de las lecciones de CoddyKit toman alrededor de 5–10 minutos. Cada una es compacta e interactiva, así que avanzas constantemente y retomas exactamente por donde dejaste en la web y la app.

¿Puedo escribir y ejecutar código en esta lección de AI Agents?

Sí. Cada lección de AI Agents incluye un editor de código integrado, así que escribes y ejecutas código real directamente en tu navegador y obtienes retroalimentación instantánea de IA — sin configuración local necesaria.

Todas las lecciones de este curso

  1. Herramientas idempotentes y efectos secundarios
  2. Reintentos con retroceso exponencial
  3. Tiempo de espera y disyuntores
  4. Validar salidas de herramientas (Pydantic)
← Volver a AI Agents