Toda organización que usa LLMs en producción se enfrenta pronto a la misma realidad: quieres usar varios proveedores. OpenAI para un caso, Claude para otro, Mistral self-hosted para sensitive data, Cohere para embeddings multilingüe. El código rápidamente se llena de adaptadores, cada SDK con sus peculiaridades, sin forma unificada de hacer rate limiting, fallbacks, o observabilidad.
LiteLLM resuelve este problema con una API unificada compatible con OpenAI, routing inteligente, y un proxy desplegable. Este artículo cubre qué hace, cuándo tiene sentido, y cómo desplegarlo sin complicar tu stack.
El problema que resuelve
Sin LiteLLM, una aplicación que usa 3 proveedores tiene:
# OpenAI
from openai import OpenAI
client_oai = OpenAI(api_key=...)
# Anthropic
from anthropic import Anthropic
client_ant = Anthropic(api_key=...)
# Ollama local
import requests
ollama_response = requests.post("http://localhost:11434/api/generate", ...)
Cada uno con payload y response shape distintos. Para añadir cache, rate limit, fallback si uno falla, tienes que envolver cada uno. Escala mal.
LiteLLM convierte esto en:
from litellm import completion
response = completion(model="gpt-4", messages=[...])
response = completion(model="claude-3-sonnet-20240229", messages=[...])
response = completion(model="ollama/llama2", messages=[...])
Mismo shape, misma abstracción.
Dos modos de uso
Modo librería: importar litellm en tu código. Simple para apps monolíticas.
Modo proxy: desplegar un servidor LiteLLM separado. Tu app habla con http://localhost:4000 via OpenAI SDK. Recomendado para:
- Múltiples servicios compartiendo acceso a LLMs.
- Necesidad de gestión central de keys, budgets, rate limits.
- Observabilidad agregada.
- Admin teams que no quieren modificar código de apps.
Para empresas serias, el modo proxy es casi siempre la opción correcta.
Proxy: deploy básico
# litellm_config.yaml
model_list:
- model_name: gpt-4
litellm_params:
model: openai/gpt-4
api_key: os.environ/OPENAI_API_KEY
- model_name: claude-3-sonnet
litellm_params:
model: anthropic/claude-3-sonnet-20240229
api_key: os.environ/ANTHROPIC_API_KEY
- model_name: mistral-local
litellm_params:
model: ollama/mistral
api_base: http://ollama.internal:11434
general_settings:
master_key: sk-master-123
database_url: os.environ/DATABASE_URL # para tracking de usage
Docker:
docker run -p 4000:4000 \
-v $(pwd)/litellm_config.yaml:/app/config.yaml \
-e OPENAI_API_KEY=... \
-e ANTHROPIC_API_KEY=... \
ghcr.io/berriai/litellm:main \
--config /app/config.yaml
Apps consumen con:
from openai import OpenAI
client = OpenAI(base_url="http://litellm:4000", api_key="sk-user-123")
response = client.chat.completions.create(model="gpt-4", ...)
La app no sabe que hay LiteLLM en medio. Totalmente transparente.
Features que importan
Fallbacks automáticos
Si OpenAI cae o rate-limitea, fallback a Claude:
router_settings:
fallbacks:
- gpt-4: ["claude-3-sonnet"]
- claude-3-sonnet: ["mistral-local"]
Apps ni se enteran. Para resilience en producción, crítico.
Rate limiting y budgets
Por usuario / key / modelo:
general_settings:
master_key: sk-master-123
# Crear user key con budget via API
curl -X POST http://litellm:4000/key/generate \
-H "Authorization: Bearer sk-master-123" \
-d '{"models": ["gpt-4"], "max_budget": 100, "duration": "30d"}'
Evita que un equipo quemé el presupuesto corporativo.
Caching
Cache de respuestas semánticamente equivalentes:
cache:
type: redis
host: redis.internal
ttl: 3600
supported_call_types: ["completion", "embedding"]
Útil para patrones de consulta repetidos.
Observability
LiteLLM expone métricas Prometheus y logs estructurados. Integración con:
- Langfuse
- Helicone
- Sentry
- Prometheus / Grafana
Para trazar coste, latencia y errores por modelo/tenant.
Comparación con alternativas
LiteLLM no es único:
- Portkey: SaaS con gateway similar, UI más pulida, comercial.
- OpenRouter: SaaS que unifica APIs de LLMs, con billing consolidado.
- Helicone: foco en observabilidad, puede proxy también.
- Self-built: FastAPI + switch/case. Funciona para <3 proveedores.
LiteLLM es el OSS más completo; Portkey el comercial más pulido. Para empresas sensitivas a vendor lock-in, LiteLLM es la apuesta segura.
Limitaciones
Ser honesto:
- Feature parity imperfecto: algunas features específicas de proveedor (structured output, function calling variaciones) pueden no traducir 1:1.
- Latencia adicional: un hop extra añade 5-20ms. Despreciable para LLM, visible para embeddings.
- Complejidad operativa: el proxy es otra pieza que mantener.
- Ecosistema SDK: algunos clients nativos tienen features que el OpenAI client estándar no soporta.
Cuándo NO es necesario
Si tu uso es:
- Un solo proveedor sin planes de cambiar.
- Uso experimental o de prototipo.
- Un solo desarrollador experimentando.
Una capa provider.py con if/else cubre. LiteLLM introduce complejidad no justificada.
Casos donde LiteLLM brilla
- Empresa con múltiples teams: proxy central con keys/budgets por team.
- Aplicación multi-proveedor que quiere seleccionar el mejor por tarea.
- Resiliencia crítica: fallbacks automatizados.
- Coste control: visibilidad y rate limiting centralizado.
- Compliance: punto único para auditoría, redacción, compliance checks.
Patrones de routing
LiteLLM soporta routing avanzado:
- By cost: preferir el modelo más barato capaz.
- By latency: menor latencia percibida.
- By availability: skip proveedores con alto error rate.
- By specific tags (prod, dev, sensitive).
router_settings:
routing_strategy: least-busy
Para apps con requirements específicos por request, esto es oro.
Seguridad
Checklist mínima:
- Keys de proveedores solo en el proxy, nunca en apps.
- Keys de usuario con budget limitado y duración corta.
- TLS obligatorio al proxy.
- Audit logs para compliance.
- Rate limit agresivo contra abuso.
Deployment en Kubernetes
Para producción:
- Deployment con 2+ réplicas detrás de service.
- PostgreSQL o Redis backend para state (keys, budgets, cache).
- Prometheus ServiceMonitor para scraping.
- PodDisruptionBudget para upgrades sin downtime.
- HPA basado en CPU/memory.
Chart de Helm oficial existe pero es básico; ajustar para producción.
Casos reales
Patrón que hemos visto funcionar:
- Frontend web llama a
/api/llm/chaten tu backend. - Backend hace ruta OpenAI-compat a LiteLLM proxy.
- LiteLLM rutea según tags (user tier, request type) a GPT-4, Claude, o Mistral.
- Si OpenAI falla, fallback automático.
- Observability: cada request tiene tenant_id, modelo, tokens, coste en Prometheus.
30 líneas de código en backend, un binario corriendo, toda la complejidad de multi-LLM gestionada.
Conclusión
LiteLLM es de las herramientas más útiles que han salido en el ecosistema LLM durante 2023-2024. Para equipos que usan un solo proveedor, es overkill. Para equipos que usan dos o más, o que quieren preparar el terreno para hacerlo, es casi obligatorio. El proxy elimina fricción de integración, permite governance centralizada y facilita migraciones entre modelos. Adopción tiene coste operativo pero paga dividendos pronto. Si estás construyendo LLM seriamente, probablemente necesitas LiteLLM o equivalente — mejor adoptarlo pronto que integrarlo tras meses de código multi-SDK.
Síguenos en jacar.es para más sobre LLMs en producción, arquitecturas IA y proxys inteligentes.