¿Qué hace Límites de Tasa para LLM?
Implementa integraciones resilientes con LLM mediante reintentos deterministas, limitación de velocidad, gestión de cuotas y controles de concurrencia. Lee references/examples.md para entender los desencadenantes y no desencadenantes esperados. Lee references/troubleshooting.md cuando los síntomas no coincidan con el camino feliz.
Flujo de Trabajo
- Inspecciona el código base para encontrar el único límite donde las llamadas LLM salen de la aplicación. Prefiere modificar una pasarela, envoltorio de cliente o módulo de servicio compartido en lugar de dispersar reintentos por todos los puntos de llamada.
- Analiza el código fuente del proyecto objetivo para identificar el proveedor de LLM específico en uso. Trata a OpenAI y Groq como ramas de primera clase con semánticas de cabecera y modelos de límite específicos de cada proveedor.
- Si el proveedor es OpenAI, lee
references/openai-rate-limits.mdantes de elegir cuotas, comportamiento de reintento o suposiciones de ritmo. - Si el proveedor es Groq, lee
references/groq-rate-limits.mdantes de elegir cuotas, comportamiento de reintento o suposiciones de ritmo. - Si el usuario dice "Estoy en el Nivel 1" o proporciona otra etiqueta de plan, trátalo solo como contexto de presupuesto a menos que la documentación del proveedor indique que determina completamente los límites operativos.
- Reutiliza las abstracciones, registros, configuración y ayudantes de prueba existentes en el proyecto. Preserva el estilo del proyecto en lugar de introducir una pila de cliente paralela.
- Lee
scripts/resilience_templates.pyy adapta sus patrones de reintento, ventana de reinicio y circuit breaker al modelo de cliente HTTP y excepciones del proyecto. - Añade o actualiza la cobertura de pruebas de regresión alrededor del límite compartido de LLM cuando el proyecto tenga pruebas. Valida caminos felices, caminos de limitación y análisis de cabeceras específicas del proveedor.
Manejo Reactivo
Implementa Manejo Reactivo Basado en Cabeceras. Usa la librería tenacity en Python para envolver todas las llamadas de red a LLM.
- Analiza
Retry-Afterprimero cuando esté presente. - Si
Retry-Afterfalta, marca el ritmo usando las cabeceras de reinicio del proveedor antes de recurrir a un backoff exponencial con jitter. - Mantén el jitter exponencial en el rango de
1sa60spara evitar picos de thundering herd. - Maneja explícitamente los errores HTTP
429y503. - Trata los errores transitorios
5xx, de tiempo de espera y de reinicio de conexión solo como candidatos a reintento cuando la llamada circundante sea idempotente o segura de repetir. - Evita reintentar errores de cliente deterministas como solicitudes mal formadas.
- Emite registros estructurados que incluyan proveedor, modelo, código de estado, intento de reintento y retardo calculado.
- Para OpenAI, analiza
x-ratelimit-limit-requests,x-ratelimit-limit-tokens,x-ratelimit-remaining-requests,x-ratelimit-remaining-tokens,x-ratelimit-reset-requestsyx-ratelimit-reset-tokens, y marca el ritmo según la dimensión más restringida. - Para Groq, analiza
retry-aftermás las cabecerasx-ratelimit-*, recordando que las cabeceras de solicitud se refieren a RPD y las cabeceras de tokens a TPM. - Distingue la limitación reintentable del agotamiento de cuota o facturación no reintentable.
Circuit Breaker
Implementa el Patrón Circuit Breaker. Usa la librería pybreaker para abrir el circuito después de 5 fallos consecutivos de limitación o fallos transitorios del servidor.
- Excluye los errores de cliente
400y401de activar el breaker. - Mantén el breaker en el mismo límite compartido de LLM que la lógica de reintento.
- Lanza o mapea una excepción de fallo rápido específica del proyecto cuando el breaker esté abierto para que el código ascendente pueda degradarse elegantemente.
- Para el procesamiento flexible de Groq, trata el estado
498concapacity_exceededcomo una señal de capacidad reintentable, no como un error de aplicación permanente.
Limitación Proactiva
Implementa Limitación Proactiva.
- Configura un limitador local de cubeta de tokens (token bucket) o equivalente en el lado del cliente que rastree las dimensiones del proveedor realmente expuestas por la API objetivo.
- Mantén el rendimiento efectivo aproximadamente un
10%por debajo de los umbrales conocidos para preservar margen de maniobra para jitter, desviación de reloj y trabajadores concurrentes. - Pone en cola, retrasa o rechaza localmente cuando no haya suficiente presupuesto de solicitudes o tokens disponible en lugar de dejar que el proveedor rechace la llamada.
- Prefiere estado compartido como Redis solo cuando la aplicación tenga múltiples trabajadores o hosts que deban coordinar el mismo presupuesto.
- Para OpenAI, trata los límites como restricciones a nivel de organización y proyecto, no a nivel de usuario.
- Para OpenAI, limita el ritmo por familia de modelo y grupos de límite compartido en lugar de asumir que cada modelo tiene un presupuesto independiente.
- Para OpenAI, considera los límites de solicitudes de contexto largo por separado cuando el modelo objetivo use un cubo de contexto largo distinto.
- Para Groq, trata los límites como restricciones a nivel de organización y recuerda que los límites personalizados a nivel de proyecto solo pueden ser más restrictivos que el techo de la organización.
- Para Groq, recuerda que los tokens en caché no cuentan para los límites de tasa, pero el tráfico paralelo aún puede agotar la capacidad no almacenada en caché.
Optimizaciones del Framework
Implementa Optimizaciones del Framework cuando haya capas de orquestación presentes.
- Aplica límites explícitos de
max_concurrencyo equivalentes de abanico en cada ruta de ejecución paralela de LLM para evitar picos de red. - Inspecciona ayudantes asíncronos, grupos de trabajadores, ejecutores de grafos y herramientas de evaluación en busca de llamadas paralelas ocultas a LLM.
- Recorta o acota el historial de chat ilimitado si la integración sigue añadiendo contexto antiguo a cada llamada y quema rápidamente los presupuestos de tokens.
Recomendaciones de Caché
Recomienda Caché Semántico y ajuste de rendimiento consciente del proveedor.
- Solicita al usuario en la consola que integre una caché semántica respaldada por Redis o GPTCache para evitar llamadas externas repetidas.
- Enmarca el almacenamiento en caché como un multiplicador directo del límite de tasa, no solo una optimización de latencia.
- Sugiere la inserción en caché solo para prompts cuyas salidas sean lo suficientemente estables para reutilizar.
- Para OpenAI, recomienda reducir
max_tokensal tamaño de salida realista más cercano y agrupar cargas de trabajo síncronas solo cuando RPM esté saturado y quede margen de TPM. - Para Groq, recomienda el almacenamiento en caché de prompts cuando el modelo lo admita y la carga de trabajo reutilice grandes prefijos compartidos.
Reglas de Implementación
- Prefiere librerías probadas en batalla sobre bucles de reintento personalizados o implementaciones de breaker.
- Mantén los caminos de código deterministas con poca libertad. No inventes nuevas fórmulas de backoff cuando la plantilla ya se ajuste.
- Usa barras inclinadas de estilo Unix en cada ruta de archivo que escribas o referencies.
- Mantén las semánticas del proveedor explícitas. No asumas que los significados de las cabeceras de un proveedor se aplican a otro.
- Usa cabeceras reales, páginas de límites autenticadas o números explícitos proporcionados por el usuario cuando el ritmo exacto sea importante.
- Mantén la carpeta de la skill limpia: sin
README.md, documentos solo del repositorio ni capturas de pantalla dentro de la skill instalable.