Todos los recursos

LiteLLM unifica más de 100 proveedores de modelos detrás de una sola API con la forma de OpenAI, y su proxy convierte las llaves, presupuestos, fallbacks y logs dispersos por todos lados en un único plano de control al que apunta todo tu stack. Aquí va qué es, cuándo un gateway justifica su existencia frente a un SDK nativo, un quickstart que puedes copiar tal cual, y las concesiones sin maquillaje, incluyendo cómo la normalización va aplanando sin avisar las funciones del proveedor de las que quizá dependes.

LiteLLM: un solo gateway para todos tus modelos

En resumen

  • LiteLLM es un SDK de Python y, a la vez, un proxy independiente que expone más de 100 proveedores (Anthropic, OpenAI, Together, Ollama local y más) detrás de una sola API compatible con OpenAI.
  • Lo que de verdad vale es el proxy: se convierte en un plano de control con llaves virtuales por equipo, topes de gasto, límites de tasa, fallbacks automáticos y logs unificados que ya no tienes que programar a mano en cada servicio.
  • Sácalo cuando tengas un montaje con varios proveedores y necesites controlar costos; para una app de un solo proveedor el SDK nativo es más simple y no pierdes nada.
  • La trampa está en la normalización: el prompt caching, los presupuestos de thinking y algunas semánticas de tools quizá no pasen limpios, así que verifica de punta a punta las funciones de las que dependes antes de estandarizar todo.
  • Es un gateway, no un modelo ni una estrategia. Enruta y mide las llamadas que tú decides hacer; no decide qué modelo merece cuál llamada.

La mayoría de los stacks va acumulando llamadas al modelo de la peor manera: un servicio trae una llave de Anthropic escrita a fuego en el código, otro carga una de OpenAI en su propio archivo de env, un tercero llama directo a un modelo local, y nadie es capaz de responder "¿cuánto gastamos la semana pasada?" sin ponerse a grepear logs en tres lugares distintos. LiteLLM existe precisamente para acabar con ese desorden. Unifica más de 100 proveedores detrás de una interfaz con la forma de OpenAI, la usas como SDK de Python dentro de tu proceso o, mucho más útil, como un proxy independiente al que apunta todo tu stack, para que las llaves, los presupuestos, los fallbacks y el logging vivan en un solo plano de control en lugar de andar dispersos por cada app. Aquí va qué es la herramienta de verdad, en qué casos un gateway justifica honestamente su complejidad frente a un SDK nativo, un quickstart que puedes copiar tal cual, y las concesiones que el README pasa por alto, empezando por cómo la normalización aplana justo las funciones del proveedor de las que quizá dependes.

Nota

LiteLLM es un gateway, no un modelo ni una estrategia de enrutamiento. Logra que todos los proveedores hablen la misma forma y te da un único lugar para medirlos y controlarlos; no vuelve más listo a un modelo barato, ni decide cuál llamada merece cuál modelo. Esas decisiones siguen siendo tuyas. Júzgalo por el trabajo operativo que te quita de encima, no por una calidad que no puede aportar.

01 · Qué es en realidad

LiteLLM tiene dos caras, y confundirlas es la primera fuente de líos. El SDK es una librería de Python que llamas dentro de tu proceso, «from litellm import completion», y que traduce una sola llamada de función a la forma que pida el proveedor de destino, y luego traduce la respuesta de vuelta al formato chat-completions de OpenAI. El proxy es un servidor independiente (normalmente un contenedor de Docker) que expone esa misma traducción por HTTP, de modo que cualquier cliente, en cualquier lenguaje, que hable la API de OpenAI puede apuntarle y llegar a todos los proveedores que tiene detrás.

La capa de traducción es la base, pero es el proxy lo que hace que LiteLLM deje de ser una comodidad y pase a ser infraestructura. Apenas tus servicios empiezan a llamar al proxy en vez de a los proveedores directamente, ganas un único lugar donde hacer todo lo que de otra forma tendrías que reimplementar en cada app:

  • Llaves virtuales. Emites llaves por equipo o por servicio que el proxy mapea a las credenciales reales del proveedor. Tus apps nunca ven la llave de Anthropic o de OpenAI que está arriba; rotas la real en un solo lugar y revocas una llave virtual filtrada sin tener que tocar nada más.
  • Presupuestos y límites de tasa. Le pones un tope de gasto mensual y un techo de requests por minuto a cada llave virtual. Cuando un loop descontrolado se pone a martillar a Claude a las 3 de la mañana, el proxy lo corta en el presupuesto en vez de que te enteres por la factura el mes que viene.
  • Fallbacks. Declaras una lista ordenada de modelos; si el principal falla o se pasa de tiempo, el proxy reintenta con el siguiente de forma transparente. El código que llama pide un modelo y se lleva la resiliencia de regalo.
  • Logging unificado. Cada request que pasa por el proxy cae en un solo stream de logs (modelo, tokens, latencia, costo, la llave virtual que lo hizo), y esa es la diferencia entre "gastamos de más" y "este servicio gastó de más en este modelo".

Consejo

El modelo mental más limpio: el proxy es tu plano de control de modelos, igual que un reverse proxy es tu plano de control de HTTP. No le darías a cada servicio su propia terminación TLS pública y su propio rate limiter; por las mismas razones, no le das a cada servicio su propia llave cruda del proveedor ni su lógica de presupuesto improvisada. Centraliza la política y deja las apps lo más tontas posible.

02 · Por qué un gateway vale la pena

El argumento a favor de LiteLLM se vuelve fuerte justo cuando dejas de tener un solo modelo y una sola app. Estas son las situaciones donde la pieza extra que tienes que mover sí se paga sola:

Enrutamiento multi-proveedor sin reescribir nada

Con una cuenta de Anthropic y, digamos, un crédito de cómputo de Together AI, la jugada obvia es enrutar las tareas baratas o abiertas a Together y las de razonamiento pesado a Claude. Hecho de forma rústica, eso significa dos SDKs, dos flujos de auth y código condicional en cada punto de llamada. Con el proxy se reduce a un string de modelo y una entrada en el config, la app pide «anthropic/claude-sonnet-4-5» o «together_ai/...» y el gateway se encarga del resto. Cambiar de proveedor más adelante es tocar el config, no un refactor.

Control de costos que no programas a mano

Si alguna vez intentaste imponer un presupuesto de LLM por equipo repartiendo contadores de tokens por todo el código de la aplicación, ya sabes que eso se descompone enseguida. El proxy lo resuelve como política: los presupuestos y límites de tasa se pegan a las llaves, no a los puntos de llamada, así un servicio nuevo hereda las reglas con solo usar una llave acotada, sin que nadie tenga que acordarse de agregar la contabilidad. Es el mismo instinto que acotar un rol de base de datos en vez de confiar en que cada query se porte bien.

Resiliencia como configuración

Las caídas de proveedores y los picos de rate limit no son nada raros. Meter los fallbacks dentro del código de la aplicación significa que cada equipo reinventa la lógica de reintentar-y-degradar, casi siempre mal. Declarar los fallbacks una sola vez en el gateway hace que cada llamada herede el mismo comportamiento probado, y lo afinas en un único lugar cuando la confiabilidad de un proveedor cambia.

Cuándo no vale la pena: una app de un solo proveedor que únicamente le habla a Claude gana muy poco con un proxy y carga con el costo de un servicio más que hay que correr, asegurar y mantener al día. El SDK nativo de Anthropic es más simple, expone cada función directo, y no tiene una capa de traducción que pueda aplanar nada. Sácale provecho a LiteLLM cuando el desorden sea real, varios proveedores, varios consumidores, gasto de verdad que haya que controlar, y no antes, por si acaso.

03 · Quickstart

Empieza con el SDK para sentir cómo funciona la traducción, y pásate al proxy cuando quieras el plano de control. La llamada del SDK de abajo nombra un modelo con prefijo de proveedor y declara un fallback en la misma línea:

from litellm import completion

resp = completion(
    model="anthropic/claude-sonnet-4-5",
    messages=[{"role": "user", "content": "resume este ticket"}],
    fallbacks=["together_ai/meta-llama/Llama-3.1-70B-Instruct"],
)
print(resp.choices[0].message.content)

El proxy es donde esto se vuelve infraestructura. Defines tus modelos, llaves y políticas en un archivo de config y lo corres como contenedor. Una config mínima que mapea dos nombres amigables a proveedores reales y define un fallback se ve así:

model_list:
  - model_name: smart
    litellm_params:
      model: anthropic/claude-sonnet-4-5
      api_key: os.environ/ANTHROPIC_API_KEY
  - model_name: cheap
    litellm_params:
      model: together_ai/meta-llama/Llama-3.1-70B-Instruct
      api_key: os.environ/TOGETHER_API_KEY

litellm_settings:
  fallbacks: [{ "smart": ["cheap"] }]

Lo corres y, a partir de ahí, cualquier cliente compatible con OpenAI llega a todos los proveedores cambiando solo la base URL, usando una llave virtual que el proxy emitió, nunca la credencial real que está arriba:

import OpenAI from "openai"

const client = new OpenAI({
  baseURL: "http://litellm:4000/v1",
  apiKey: process.env.LITELLM_VIRTUAL_KEY, // con alcance, presupuesto y revocable
})

const r = await client.chat.completions.create({
  model: "smart", // resuelve a Claude, cae al modelo barato si hay error
  messages: [{ role: "user", content: "redacta una respuesta" }],
})

Corre el proxy en su propio contenedor dentro de una red interna, nunca expongas el puerto 4000 al internet público, ponle límites de recursos explícitos, y deja las llaves reales de los proveedores solo en el environment del proxy. Así tus apps no guardan nada más que una llave virtual revocable, lo que reduce bastante el radio de impacto si alguna se filtra.

04 · La concesión de la normalización

Este es el que muerde a quien se apura demasiado en estandarizar todo sobre el proxy, así que se lleva su propia sección. Justo lo que vuelve valioso a LiteLLM, reducir a cada proveedor a una sola forma, es exactamente lo que puede dejar fuera, sin que te enteres, el poder específico de cada proveedor. Una interfaz normalizada solo puede exponer la intersección de lo que todos los proveedores hacen limpio; cualquier cosa fuera de esa intersección hay que tratarla como caso especial, y los casos especiales son donde se cuelan las fugas.

Las funciones con más probabilidad de no pasar limpias son justamente las que te importan, precisamente porque ahorran dinero o mejoran la calidad:

  • Prompt caching. El prompt caching de Anthropic puede recortar muchísimo el costo de un system prompt largo y estable, pero depende de marcadores de cache-control y de armar el request con la forma exacta. Si eso no sobrevive la traducción, pierdes el descuento sin darte cuenta y tu factura sale más alta de lo que el propio dashboard del gateway te hace pensar que deberías estar pagando.
  • Presupuestos de thinking / razonamiento. Los controles de extended-thinking son específicos de cada proveedor. Una API normalizada quizá no pase tu presupuesto de thinking, o lo pase de un modo que el proveedor de arriba termina ignorando, así que crees que configuraste la profundidad de razonamiento y resulta que no.
  • Semánticas de tools y los bordes del streaming. Los formatos de tool-call, las llamadas a tools en paralelo y la forma de los eventos de streaming difieren de manera sutil entre proveedores. Los casos comunes mapean bien; los bordes, justo las partes de las que tu loop de agente puede depender, son donde "compatible con OpenAI" pasa a ser "compatible lo suficiente para una demo, pero no para confiar a ciegas".

Atención

No estandarices todo tu stack sobre el proxy antes de verificar que las funciones de las que dependes de verdad funcionan de punta a punta a través de él. Manda un request real, con caching, con tu presupuesto de thinking, con tus definiciones de tools, y confirma el comportamiento del proveedor de arriba en sus propios logs o conteos de tokens, no te quedes solo con que el proxy devolvió un 200. Una función que no hace nada sin avisar te cuesta dinero o calidad sin lanzar un solo error que te ponga sobre aviso.

La postura pragmática: enruta el grueso del tráfico normal por el gateway para tener control y resiliencia, y para el puñado de llamadas que se apoyan fuerte en las funciones de frontera de un proveedor, considera llamar a ese proveedor directo, o, como mínimo, comprueba que la función sobrevive el proxy antes de confiar en ella. El gateway no tiene por qué ser todo o nada.

05 · Concesiones sin maquillaje

LiteLLM es de verdad útil, pero es infraestructura que ahora te toca administrar a ti, y no sale gratis:

  • Es un servicio más que correr y asegurar. El proxy es un proceso con tus llaves reales de proveedor en su environment y un puerto que bajo ninguna circunstancia debe dar a internet. Es un lugar pensado y defendible para concentrar los secretos, pero también es un único objetivo de alto valor, así que se gana el aislamiento de red, las llaves virtuales acotadas y la misma disciplina de parcheo que cualquier otro servicio.
  • Agrega un salto. Cada llamada pasa ahora por un round-trip de red más y por una cosa más que puede caerse. Las funciones de fallback y resiliencia están, en parte, para compensar esto, pero el proxy en sí se vuelve una dependencia en tu camino crítico; presupuesta su disponibilidad.
  • La normalización aplana funciones, como vimos arriba. La comodidad de una sola forma se paga perdiendo acceso a los bordes filosos de cada proveedor. Ten claro qué bordes necesitas antes de comprometerte.
  • Controla el gasto; no lo reduce. El proxy te dice cuánto gastas y le pone tope a los descontroles (valor real), pero no abarata ningún modelo ni te elige uno más barato. Enrutar la tarea correcta al modelo correcto sigue siendo tu decisión de diseño; el gateway solo hace que esa decisión sea barata de expresar y fácil de imponer.

En mi propio trabajo, el proxy se gana su lugar en el momento en que un stack tiene más de un proveedor y más de un consumidor, el punto donde las llaves dispersas y el gasto que nadie puede cuadrar dejan de ser una carga hipotética y se vuelven una real. Pongo las llaves reales en el proxy, no le entrego a las apps nada más que llaves virtuales acotadas, declaro los fallbacks una sola vez, y me queda un único stream de logs que responde "quién gastó qué en cuál modelo" sin tener que montar una investigación forense. La disciplina que lo mantiene honesto es el paso de verificación: comprueba que las funciones del proveedor en las que te apoyas sobreviven la traducción, mantén el puerto fuera del internet público, y recuerda que el gateway controla las llamadas que haces. Nunca decide cuáles llamadas debiste haber hecho.

Puntos clave

  • LiteLLM unifica más de 100 proveedores detrás de una sola API con la forma de OpenAI, usable como SDK dentro de tu proceso o, más útil aún, como un proxy independiente al que apunta todo tu stack.
  • El valor real está en el proxy: es un plano de control para llaves virtuales, presupuestos, límites de tasa, fallbacks y un único stream de logs unificado que ya no programas a mano en cada servicio.
  • Sácale provecho en stacks con varios proveedores y varios consumidores donde haya gasto que controlar; para una sola app sobre un solo proveedor, el SDK nativo es más simple y no pierdes nada.
  • La normalización aplana funciones del proveedor, prompt caching, presupuestos de thinking, bordes de tools, así que verifica que las funciones de las que dependes sobreviven de punta a punta antes de estandarizar todo.
  • Controla el gasto, no lo reduce: deja las llaves reales solo en el proxy, mantén el puerto fuera del internet público, entrega a las apps llaves virtuales acotadas, y recuerda que enrutar la tarea correcta al modelo correcto sigue siendo tu decisión.

Preguntas frecuentes

¿SDK o proxy, por cuál empiezo?

Empieza con el SDK para sentir la capa de traducción dentro de un solo proceso, pero pásate al proxy apenas tengas más de un servicio haciendo llamadas al modelo. El SDK te da completions agnósticas del proveedor y fallbacks en la misma línea, todo dentro de una sola app, práctico, pero el valor de control se queda bajo llave. El proxy es donde LiteLLM se vuelve infraestructura: llaves virtuales, presupuestos, límites de tasa y un único stream de logs para todos los consumidores. Si solo vas a tener una app hablándole a un solo proveedor, quizá no necesites ninguno de los dos por encima del SDK nativo; lo que ganas con el proxy crece a la par con la cantidad de proveedores y consumidores que estés tratando de controlar.

¿El gateway me abarata los modelos?

No, controla el gasto, no lo reduce. El proxy te da visibilidad (cuánto costó cada llave y cada modelo), topes (presupuestos que cortan los loops descontrolados) y la plomería para enrutar las tareas baratas a modelos baratos, pero el ahorro real viene de tus decisiones de enrutamiento, no del gateway en sí. LiteLLM hace que sea barato expresar 'manda esta tarea al modelo barato y esa otra a Claude' y fácil imponer un presupuesto, pero elegir el modelo correcto para cada tarea sigue siendo tu decisión de diseño. Peor todavía: si la normalización deja fuera sin avisar una función de costo como el prompt caching, el gateway hasta puede hacerte gastar más de lo que esperabas; verifica que esas funciones de verdad sobrevivan.

¿Qué es exactamente lo que se rompe con la normalización?

Las funciones específicas de cada proveedor que viven fuera de la forma común de OpenAI, y suelen ser justo las de mayor valor. El prompt caching depende de marcadores de cache-control y de armar el request con la forma exacta, y eso quizá no sobreviva la traducción, costándote el descuento sin que te enteres. Los presupuestos de extended-thinking / razonamiento son específicos del proveedor y pueden quedar fuera o ser ignorados arriba, así que crees que fijaste la profundidad de razonamiento y resulta que no. Los formatos de tool-call, las llamadas a tools en paralelo y la forma de los eventos de streaming tienen diferencias sutiles según el proveedor, y ahí los bordes de los que depende tu loop de agente quizá no mapeen limpios. La solución es verificar: manda un request real con la función activada y confirma que surtió efecto en los logs o los conteos de tokens del propio proveedor, no te quedes solo con que el proxy devolvió un 200.

¿Meter todas mis llaves de proveedor en un solo proxy es un riesgo de seguridad?

Concentra los secretos, y eso es a la vez el beneficio y el riesgo, pero, sopesándolo bien, suele ser el diseño más seguro cuando se hace como se debe. Las llaves reales de los proveedores viven solo en el environment del proxy; tus apps, en cambio, guardan llaves virtuales revocables y acotadas, así una credencial de app filtrada tiene un radio de impacto mucho más pequeño y la llave de arriba la rotas en un solo lugar. La otra cara es que el proxy se vuelve un único objetivo de alto valor, así que tiene que ganarse esa confianza: mantén el puerto 4000 fuera del internet público, solo en una red interna, ponle límites de recursos, parchéalo como cualquier otro servicio, y trata su environment con el mismo cuidado que un gestor de secretos. Concentrado y defendido le gana a disperso y olvidado.

¿Cómo se comportan los fallbacks por dentro?

Declaras una lista ordenada de modelos y, cuando el principal falla o se pasa de tiempo, el proxy reintenta con el siguiente de forma transparente, sin que el código que llama se entere. Eso es resiliencia como configuración, cada llamada hereda el mismo comportamiento de degradado ya probado, en vez de que cada equipo reinvente la lógica de reintento. Lo que hay que tener en cuenta es que caer a un modelo distinto es un cambio de calidad, no solo de enrutamiento: si 'smart' cae a 'cheap', el request igual tiene éxito, pero la respuesta puede salir notablemente peor, y a quien esperaba una salida de calidad de frontera nadie le avisa. Decide a propósito cuáles llamadas pueden tolerar una bajada en silencio y cuáles deberían fallar de forma ruidosa, y vigila tus logs para ver con qué frecuencia se disparan los fallbacks, que se disparen seguido suele ser señal de un problema de proveedor que conviene atacar en la fuente.

¿Cuándo LiteLLM es demasiado?

Cuando tienes una sola app hablándole a un solo proveedor. Un servicio que únicamente llama a Claude no gana casi nada con un gateway y carga con el costo completo: otro contenedor que correr, asegurar y parchear, un salto de red extra en el camino crítico, y una capa de traducción que puede aplanar justo las funciones de Anthropic que querrías usar. En ese caso el SDK nativo de Anthropic es más simple, expone cada función directo, y no agrega piezas que se muevan. Sácale provecho a LiteLLM cuando el desorden sea real, varios proveedores, varios consumidores, gasto que de verdad necesitas controlar, y ni un momento antes. Adoptar infraestructura por si acaso es su propia clase de desperdicio.

Abrir recurso (abre en pestaña nueva)

¿Prefieres que lo hagamos por ti?

Esto mismo lo construimos para negocios como el tuyo. La primera conversación es gratis y sin compromiso.

Escríbenos por WhatsApp

Escríbenos por WhatsApp

Escanéalo con tu teléfono para escribirnos por WhatsApp.

Escanéalo con tu teléfono para escribirnos por WhatsApp.

¿Estás desde el teléfono y no puedes escanear? Escríbenos a info@ilustrari.com

Primera conversación gratis. Te responde el fundador.

Recursos relacionados