Ir al contenido
Volver a Escritos

Limitación de tasa y control de costos de API LLM: Gestiona presupuestos de tokens, throttling por clave y dashboards de costos

Byte Smith · · 18 min de lectura

Los costos de API LLM se comportan de manera diferente a casi cualquier otro costo de API que tu equipo haya gestionado antes. Las llamadas API tradicionales tienen costos por solicitud aproximadamente predecibles. Una consulta a base de datos, una operación de almacenamiento o una entrega de webhook cuesta más o menos lo mismo independientemente de lo que envíe el usuario. Las APIs de LLM rompen esa suposición completamente porque el costo escala con el conteo de tokens tanto de entrada como de salida, y esos conteos pueden variar en órdenes de magnitud entre solicitudes.

Un solo flujo de trabajo agéntico puede quemar cincuenta dólares o más en tokens en minutos. Cuando un agente hace bucles, reintenta con resultados ambiguos o se expande a través de múltiples llamadas de herramientas, el consumo de tokens se compone de maneras difíciles de predecir y más difíciles de detener después del hecho. Un desarrollador probando un nuevo prompt contra una ventana de contexto larga puede gastar sin saberlo más en una sesión de lo que su equipo presupuestó para todo el día. Estos no son casos extremos. Son condiciones normales de operación para equipos que construyen con modelos de lenguaje grandes.

El principio que más importa aquí es simple: no puedes controlar lo que no mides. Si tu equipo está llamando a OpenAI, Anthropic o cualquier proveedor de modelos sin seguimiento por clave, estimación de costo por solicitud y aplicación de presupuestos, estás volando a ciegas. La factura llega al final del mes y la conversación pasa de ingeniería a contabilidad.

La limitación de tasa tampoco es solo un control de costos. Es un control de seguridad. Una API key comprometida sin límites de tasa le da a un atacante acceso ilimitado a un recurso costoso. El throttling por clave limita el radio de impacto de una credencial filtrada. Los presupuestos por clave limitan el daño financiero. Estos son los mismos principios de defensa en profundidad que se aplican a la seguridad de API para aplicaciones de IA e integraciones SaaS, aplicados específicamente al consumo de LLM.

Anatomía de los costos de API LLM

Entender los precios de LLM requiere entender cómo funciona la facturación basada en tokens, porque es fundamentalmente diferente de la facturación basada en solicitudes.

Cada llamada de API LLM tiene tres componentes de costo: tokens de entrada, tokens de salida y, en algunos casos, tokens de entrada en caché. Los tokens de entrada son lo que envías al modelo, incluyendo el prompt del sistema, historial de conversación y cualquier contexto recuperado. Los tokens de salida son lo que el modelo genera en respuesta. Los tokens de entrada en caché se aplican cuando el proveedor reconoce prefijos repetidos y cobra una tasa con descuento por ellos.

Las diferencias de precio entre modelos son dramáticas. Usando cifras aproximadas de una instantánea de precios reciente: gpt-4o cuesta aproximadamente $2.50 por millón de tokens de entrada y $10.00 por millón de tokens de salida. gpt-4o-mini baja a $0.15 por millón de tokens de entrada y $0.60 por millón de tokens de salida. gpt-3.5-turbo está en $0.50 y $1.50 respectivamente. Los modelos de razonamiento como o1 son significativamente más caros a $15.00 por millón de entrada y $60.00 por millón de salida.

Estos precios cambian. Por eso un sistema de control de costos de producción debería tratar los precios como un manifiesto versionado en lugar de constantes hardcodeadas. Cuando OpenAI ajusta los precios, actualizas un archivo de configuración, no código de aplicación.

Las matemáticas son instructivas. A precios de gpt-4o, un presupuesto de $1,000 por mes compra aproximadamente 400 millones de tokens de entrada o 100 millones de tokens de salida. Eso suena como mucho hasta que consideras que un solo flujo de trabajo agéntico con una ventana de contexto de 128k puede consumir 100k+ tokens por turno. A precios de gpt-4o-mini, esos mismos $1,000 compran aproximadamente 6.7 mil millones de tokens de entrada, por eso la selección de modelo es la palanca individual más grande para la optimización de costos.

Los costos ocultos son a menudo más peligrosos que los visibles. Los reintentos por errores transitorios duplican o triplican el gasto de tokens para una sola solicitud lógica. Las ventanas de contexto largas significan que cada mensaje en una conversación lleva todo el historial hacia adelante. Los bucles de agentes que reintentan hasta obtener una respuesta satisfactoria pueden acumular costos ilimitados. Las llamadas de embeddings para pipelines RAG agregan un flujo de costos separado y más silencioso que se acumula con el tiempo.

Tres pilares del control de costos de LLM

La gestión efectiva de costos de LLM se basa en tres pilares: limitación de tasa, aplicación de presupuestos y visibilidad de costos. Cada uno resuelve una parte diferente del problema, y necesitas los tres.

Pilar 1: Limitación de tasa

La limitación de tasa para APIs de LLM necesita funcionar en dos dimensiones simultáneamente. Las solicitudes por minuto (RPM) previenen el abuso de ráfagas y protegen contra automatización descontrolada que dispara demasiadas llamadas demasiado rápido. Los tokens por minuto (TPM) previenen que consultas costosas monopolicen la capacidad incluso a tasas bajas de solicitud. Una sola solicitud con una ventana de contexto de 100k tokens y una respuesta de 4k tokens puede costar más que mil solicitudes pequeñas.

La elección del algoritmo de limitación de tasa importa. La limitación de ventana fija es simple pero sufre del problema de ráfaga en los límites: un cliente puede enviar el doble de la tasa prevista cronometrando solicitudes al final de una ventana y al inicio de la siguiente. La limitación de ventana deslizante evita esto suavizando el conteo a través del tiempo. Los algoritmos de token bucket permiten ráfagas controladas manteniendo un promedio a largo plazo. Para tráfico LLM, la ventana deslizante es generalmente la mejor elección porque proporciona throttling predecible y suave sin la explotación de límites que permiten las ventanas fijas.

Los límites de tasa del lado del proveedor y los límites de tasa del lado de la aplicación sirven propósitos diferentes. OpenAI impone sus propios límites de tasa basados en el nivel de tu cuenta, pero esos límites aplican a toda tu organización. La limitación de tasa del lado de la aplicación te permite subdividir esa capacidad entre equipos, proyectos y API keys individuales. Necesitas ambas capas.

Pilar 2: Aplicación de presupuestos

La aplicación de presupuestos traduce los límites de tasa en controles financieros. Los presupuestos de tokens diarios y mensuales por clave le dan a cada consumidor una asignación clara y un límite duro.

El patrón más útil es la aplicación por niveles en lugar de un solo corte duro. Advertir al 80% del presupuesto consumido para que el consumidor pueda ajustar su uso. Al 95%, opcionalmente degradar el modelo de un nivel más costoso a uno más barato. Al 100%, bloquear solicitudes adicionales completamente. Esto da a los consumidores tiempo para reaccionar antes de chocar con un muro.

La degradación de modelo merece un manejo cuidadoso. Cambiar automáticamente una solicitud de gpt-4o a gpt-4o-mini puede ahorrar dinero significativo, pero las diferencias de capacidad entre modelos son reales. Una tarea que requiere razonamiento fuerte o seguimiento preciso de instrucciones puede fallar o producir resultados de menor calidad en un modelo más pequeño. Por eso la degradación de modelo nunca debería ser un comportamiento por defecto. Debe ser explícitamente optada por clave, configurada en un archivo de políticas y señalizada claramente al cliente a través de encabezados de respuesta para que la aplicación pueda manejar el cambio de capacidad apropiadamente.

Pilar 3: Visibilidad de costos

No puedes gestionar costos sin visibilidad sobre a dónde va el dinero. El seguimiento de uso en tiempo real por clave, equipo y modelo es la base.

La estimación de costo antes de enviar una solicitud es valiosa pero inherentemente imprecisa. Puedes estimar el costo de entrada contando tokens con un tokenizador como tiktoken, y puedes calcular un techo de peor caso de salida basado en el parámetro max_tokens. Pero el costo real de salida depende de cuántos tokens genera el modelo en tiempo de ejecución, lo cual varía por solicitud. El enfoque correcto es usar la estimación para verificaciones de presupuesto pre-vuelo y registrar el costo real después de que la respuesta se complete.

La detección de anomalías agrega una capa de protección que los presupuestos estáticos no pueden proporcionar. Si una clave que normalmente gasta $5 por día de repente gasta $50 en una hora, ese patrón debería activar una alerta independientemente de si se ha excedido el presupuesto. La línea base puede ser tan simple como un promedio móvil con un multiplicador de umbral.

Para dashboards, tres visualizaciones cubren la mayoría de las necesidades: costo por clave como gráfico de barras para identificar los principales consumidores, costo a lo largo del tiempo como gráfico de líneas para detectar tendencias y anomalías, y presupuesto restante como gráfico de dona para estado de un vistazo. Estos son dashboards operacionales, no métricas de vanidad. Deberían ser lo primero que un equipo de plataforma revise cuando algo se sienta raro.

Arquitectura: el patrón de proxy inverso

La arquitectura más efectiva para el control de costos de LLM es un proxy inverso que se sitúa entre tu aplicación y el proveedor del modelo. Cada solicitud fluye a través del proxy, que aplica controles antes de reenviar a la API ascendente.

El patrón de proxy inverso tiene varias ventajas sobre la integración de SDK del lado del cliente. Control central significa un punto de aplicación en lugar de actualizar cada cliente. Funciona con cualquier cliente que pueda hacer solicitudes HTTP, ya sea un script Python, una aplicación TypeScript o un comando curl. Proporciona un único punto de visibilidad para todo el tráfico LLM. Y no puede ser eludido por un desarrollador que olvide usar el SDK o decida llamar al proveedor directamente.

La cadena de middleware en un proxy bien diseñado sigue una secuencia clara: autenticar la solicitud usando API keys, verificar límites de tasa, verificar disponibilidad de presupuesto, verificar el caché por una coincidencia exacta, hacer proxy de la solicitud al proveedor ascendente y registrar el uso real de tokens y costo después de que la respuesta se complete.

La gestión de API keys merece atención. Las claves deberían usar un prefijo reconocible como lbp_ para que sean fáciles de identificar en registros y archivos de configuración. Deberían almacenarse como hashes SHA-256, no en texto plano, y mostrarse al usuario exactamente una vez en el momento de creación. Este es el mismo patrón usado por GitHub, Stripe y otras plataformas con gestión madura de claves. Las API keys reales que se validan en el servidor son mucho más seguras que encabezados falsificables o identidad afirmada por el cliente.

Para un despliegue de instancia única, SQLite es una elección pragmática para el almacén de respaldo. Es rápido, no requiere un servidor separado y maneja bien las necesidades de concurrencia de un proxy de un solo nodo. La ruta de actualización a Redis o Postgres existe para equipos que necesitan despliegues de múltiples instancias, pero comenzar con SQLite mantiene la huella operacional mínima y el despliegue simple.

Caché de coincidencia exacta

El caché de respuestas LLM puede reducir dramáticamente los costos para cargas de trabajo con consultas repetitivas. El enfoque efectivo más simple es el caché de coincidencia exacta: hashear el cuerpo completo de la solicitud con claves ordenadas para hashing determinista y devolver la respuesta en caché si existe una coincidencia.

Esto deliberadamente no es caché semántico. El caché semántico, donde encuentras consultas “lo suficientemente similares” y devuelves una respuesta previa, requiere un modelo de embeddings, un índice de búsqueda vectorial, umbrales de similitud y reglas de invalidación de caché que son en sí mismas un desafío de ingeniería significativo. Es un sistema separado con sus propios modos de fallo. El caché de coincidencia exacta es simple, predecible y correcto por construcción. Si la solicitud es idéntica, la respuesta en caché es válida.

Las estrategias de TTL deberían variar por caso de uso. Las consultas conversacionales donde la respuesta podría cambiar con nueva información merecen TTLs más cortos, quizás de 5 a 15 minutos. Las llamadas de generación de embeddings que producen salidas deterministas para la misma entrada pueden usar TTLs mucho más largos, potencialmente horas o incluso días. Los prompts del sistema que son idénticos entre solicitudes son excelentes candidatos para caché.

Los ahorros reales aparecen en cargas de trabajo con repetición natural: generación de embeddings para ingestión de documentos donde los mismos fragmentos aparecen entre ejecuciones, prompts del sistema repetidos en conversaciones de múltiples turnos, tareas de clasificación batch donde muchas entradas comparten la misma estructura y flujos de trabajo de desarrollo donde los ingenieros iteran sobre prompts contra las mismas entradas de prueba. Para estos patrones, tasas de acierto de caché del 30-60% son comunes, lo que se traduce directamente en ahorro de costos.

Streaming y contabilidad

La mayoría de las integraciones LLM de producción usan respuestas en streaming a través de Server-Sent Events (SSE). El streaming mejora la latencia percibida porque el cliente ve tokens a medida que se generan en lugar de esperar la respuesta completa. Pero el streaming complica significativamente la contabilidad de costos.

La técnica clave es inyectar stream_options.include_usage = true en el cuerpo de la solicitud antes de reenviar a OpenAI. Esto le dice a la API que incluya los conteos reales de tokens en el fragmento SSE final. Sin esta bandera, las respuestas en streaming no reportan uso, y el proxy tendría que estimar los conteos de tokens analizando el contenido transmitido, lo cual es propenso a errores.

// Inject usage reporting into streaming requests
if (!body.stream_options || typeof body.stream_options !== "object") {
  body.stream_options = {};
}
(body.stream_options as Record<string, unknown>).include_usage = true;

El manejo de fallos parciales es donde el streaming se vuelve genuinamente difícil. Si la conexión ascendente se cae a mitad del streaming, el proxy necesita contabilizar los tokens que se consumieron hasta el punto de fallo. El fragmento final de uso nunca llega en este caso, así que el proxy debe recurrir a contar los tokens en los fragmentos que sí recibió. Esto es una estimación, pero es mejor que registrar cero uso para una solicitud que realmente consumió tokens y costó dinero.

La cancelación del cliente es el problema espejo. Si el cliente se desconecta antes de que la respuesta esté completa, el proxy debería abortar la solicitud ascendente para detener la generación adicional de tokens y contabilizar el uso parcial. Simplemente ignorar la cancelación desperdicia tokens en una respuesta que nadie leerá.

Esto es más difícil de lo que parece porque los errores pueden llegar después de un código de estado 200 en respuestas en streaming. La conexión HTTP se establece y el estado inicial se envía antes de que el modelo comience a generar tokens. Un fallo a mitad de generación parece una conexión exitosa que deja de producir datos, no una respuesta de error limpia. El proxy necesita manejar tanto el camino feliz como estos escenarios desordenados de fallo parcial.

La implementación de referencia llm-budget-proxy

El llm-budget-proxy es una implementación de referencia open-source que pone estos conceptos en un sistema desplegable. Es un proxy inverso de un solo contenedor construido con Fastify y SQLite que proporciona limitación de tasa, aplicación de presupuestos, caché de coincidencia exacta y seguimiento de costos para APIs compatibles con OpenAI.

La arquitectura sigue la cadena de middleware descrita anteriormente. La configuración es impulsada por dos archivos YAML: un archivo de configuración principal que define límites de tasa, umbrales de presupuesto, reglas de degradación de modelo, configuración de caché y webhooks de alerta, y un manifiesto de precios que mapea nombres de modelos a costos por token con una fecha de versión para que sepas cuándo se actualizaron los precios por última vez.

El proxy es compatible solo con OpenAI en su forma actual. La API de Messages de Anthropic usa un esquema de solicitud y respuesta diferente, incluyendo nombres de campos diferentes para conteos de tokens, formatos de streaming diferentes y estructuras de error diferentes. Soportar Anthropic requeriría manejadores de ruta separados o una capa de normalización que traduzca entre esquemas. Esa es una extensión futura documentada, no algo que el MVP intente hacer. Mantener el alcance estrecho mantiene la implementación comprensible y el código lo suficientemente pequeño como para que un solo ingeniero pueda leerlo completo en una tarde.

El despliegue toma unos cinco minutos con Docker:

// Clone and deploy
// git clone https://github.com/InkByteStudio/llm-budget-proxy
// cp .env.example .env  (add your OpenAI key and admin key)
// docker compose up -d

La API de administración proporciona endpoints para crear y gestionar API keys, ver estadísticas de uso y verificar el estado del presupuesto. Cada clave obtiene sus propios límites de tasa y asignaciones de presupuesto, que pueden anular los valores por defecto definidos en el archivo de configuración.

Construir vs comprar: comparación honesta

El espacio de proxies LLM no está vacío. LiteLLM tiene aproximadamente 39,000 estrellas en GitHub y soporta más de 100 integraciones de proveedores. Ofrece claves virtuales, presupuestos por clave, un dashboard de gestión de gastos, y está respaldado por Postgres y Redis. Es una plataforma madura y probada en la que muchos equipos de producción confían. Helicone y Portkey ofrecen soluciones gestionadas con análisis adicionales, gestión de prompts y funciones de cumplimiento.

El diferenciador de llm-budget-proxy es la simplicidad operacional. Se ejecuta como un solo contenedor con SQLite. No hay Postgres que provisionar, no hay Redis que gestionar, no hay UI de administración que desplegar por separado. La configuración es un archivo YAML. El despliegue es docker compose up. Todo el código es lo suficientemente pequeño como para auditarlo en una sola sesión. Eso importa cuando necesitas entender exactamente qué hace el proxy con tus API keys y datos de solicitud.

Cuándo usar llm-budget-proxy: eres un equipo pequeño, estás ejecutando en entornos de desarrollo o staging, usas un solo proveedor y quieres entender los internos del control de costos de LLM en lugar de tratarlo como una caja negra. También es un buen ajuste para equipos que quieren una implementación de referencia para aprender antes de evaluar plataformas más grandes.

Cuándo usar LiteLLM, Helicone o Portkey: necesitas soporte multi-proveedor a través de OpenAI, Anthropic, Google y otros. Necesitas escala empresarial con múltiples instancias de proxy. Necesitas soporte del proveedor, SLAs o certificaciones de cumplimiento. Necesitas funciones como gestión de prompts, pruebas A/B o análisis avanzados que van más allá del control de costos.

Un enfoque híbrido funciona bien para muchas organizaciones: usar llm-budget-proxy para entornos de desarrollo y staging donde la simplicidad y el costo importan más, y una solución de proveedor para producción donde la escala, soporte y enrutamiento multi-proveedor justifican la sobrecarga operacional.

Qué sigue

Si quieres implementar estos controles de forma práctica, sigue el tutorial complementario: Implementa limitación de tasa y controles de costos de LLM. Te guía a través del despliegue del proxy, creación de API keys, configuración de presupuestos y límites de tasa, y validación de cada control con llamadas reales a la API de OpenAI.

Para más sobre los temas cubiertos en esta guía:

Obtén el llm-budget-proxy →

Obtén la Lista de Verificación Gratuita de Control de Costos de LLM →

Preguntas frecuentes

¿Cómo difiere la limitación de tasa de LLM de la limitación de tasa tradicional de API?

La limitación de tasa de LLM rastrea tanto solicitudes por minuto (RPM) como tokens por minuto (TPM), porque el costo escala con el conteo de tokens de entrada y salida en lugar de solo el conteo de solicitudes. Una sola solicitud LLM puede consumir miles de tokens y costar varios dólares, haciendo que los límites basados en tokens sean esenciales junto con los límites basados en solicitudes.

¿Se puede calcular el costo exacto de API LLM antes de enviar una solicitud?

No exactamente. Puedes estimar el costo de entrada contando tokens con tiktoken y calcular un techo de peor caso de salida usando el parámetro max_tokens, pero el costo real de salida depende de cuántos tokens genera el modelo en tiempo de ejecución. El costo preciso se registra después de que la respuesta se completa.

¿Cuándo deberías construir tu propio proxy LLM vs usar una solución gestionada?

Construye el tuyo cuando necesites un proxy ligero de un solo proveedor para desarrollo/staging, quieras entender los internos, o necesites control total sobre un despliegue simple. Usa una solución gestionada como LiteLLM, Helicone o Portkey cuando necesites soporte multi-proveedor, escala empresarial, soporte del proveedor o certificaciones de cumplimiento.