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:
passRetroceso 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 secondsAñ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)
continueLimite 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
- Herramientas idempotentes y efectos secundarios
- Reintentos con retroceso exponencial
- Tiempo de espera y disyuntores
- Validar salidas de herramientas (Pydantic)