FREEAI
Por Adrián Pastora
Orquestador sobre modelos de IA gratuitos y abiertos: una API REST unificada para que tus apps consuman inferencia con contrato estable, sin acoplarte a un único proveedor.

Las free tiers de Cerebras, Groq, Gemini, Mistral, OpenRouter, Cohere y HuggingFace ofrecen entre 10 y 30 peticiones por minuto y unos cientos al día — suficiente para un prototipo, demasiado poco para algo serio, y atarte a uno solo significa que cualquier cambio de precio, rate-limit o caída te bloquea entero. Cambiar de proveedor implica reescribir tu integración porque cada SDK tiene su propio contrato.
Qué es FREEAI
Un orquestador que pone siete proveedores de LLMs gratuitos detrás de un único endpoint compatible con OpenAI. Tu app sigue hablando OpenAI; el orquestador decide a qué proveedor mandar cada petición, respeta los rate-limits de cada uno de forma atómica, hace fallback automático si uno falla, y suma los cupos para que en la práctica tengas la fiabilidad de una API de pago al coste de una gratuita.
tu app (OpenAI format)
│
▼
┌────────────────────┐
│ FREEAI orquestador │
│ · routing │
│ · rate atómico │
│ · fallback chain │
│ · streaming SSE │
│ · estado Postgres │
└────────────────────┘
│
▼
┌────────────────────┐
│ Cerebras · Groq │
│ Gemini · Mistral │
│ OpenRouter │
│ Cohere · HF │
└────────────────────┘
Qué incluye
- Routing multi-proveedor con adaptadores nativos para los siete servicios; todos exponen un contrato
ProviderResponsey errores tipados. - 8 estrategias built-in (
auto,fastest,cheapest,best_quality,coding,reasoning,vision,long_context) más cualquier otra definida en runtime desde el panel. - Rate limiting atómico vía función
plpgsqlen Postgres — la reserva del slot ocurre dentro de la base de datos, así que N pods concurrentes nunca exceden el límite del proveedor. Hay un test (test_concurrent_reservations_respect_limit) que lanza 50 sesiones contra un cap de 5 y verifica que pasan exactamente 5. - Errores tipados y fallback inteligente — cada fallo upstream se clasifica como
auth,rate_limited,client_error,server_error,network,parsingounknown. Transitorios se reintentan en sitio; rate-limited cae al siguiente sin marcar el proveedor unhealthy; auth pone el proveedor en cuarentena 24h. - Streaming SSE con fallback acotado: el cambio de proveedor solo es posible antes del primer byte enviado.
- Multimodal nativo — bloques
image_urlOpenAI-compatibles enrutados automáticamente a proveedores con visión (Gemini, OpenRouter), traduciendo el formato cuando hace falta. - Embeddings con fallback —
POST /v1/embeddingsenruta a Mistral (1024 dim) o Gemini (768 dim) con la misma maquinaria de rate-limiting y analytics que chat. - Auto-strategy heurístico — detecta idioma (EN/ES/FR/DE/PT) por frecuencia de stopwords y elige
coding/reasoning/vision/long_context/fastestpor señales en el prompt, sin llamada extra al LLM. - Encryption at rest — las API keys de los proveedores se guardan cifradas con Fernet; la master key sale de variable o se autogenera en el primer arranque.
- Observabilidad integrada —
structlogcon request-id en contextvars, endpoint Prometheus/metricsy dashboard Grafana opcional bajo el perfilobservabilitydel docker-compose. - Panel de analytics — KPIs, series temporales y desglose por proveedor / estrategia / outcome leyendo de la tabla
usage_events.
Despliegue
docker compose up --build y listo: aplica el setup wizard, mete tus keys de proveedor, crea un cliente y ya tienes un endpoint OpenAI-compatible apuntable desde cualquier SDK. Para producción, docker-compose.prod.yml añade Caddy delante con auto-HTTPS y certificados Let's Encrypt sin tocar nginx ni certbot.
Los trade-offs concretos detrás del proyecto: qué se eligió, qué se descartó, y por qué.
Postgres como única fuente de verdad
El rate-limiting, las reservas concurrentes y la configuración viven en Postgres, no en memoria. La función freeai_try_reserve hace la reserva atómica dentro de la base de datos, así que el sistema sigue siendo correcto detrás de N workers o N pods sin cachés compartidos por fuera. El precio: una operación extra de IO por petición. Para un orquestador free-tier, esa latencia es despreciable frente al tiempo del LLM y el beneficio operativo es enorme.
Adaptadores con contrato común
Cada proveedor implementa la misma interfaz (ProviderResponse, StreamChunk, ProviderError con ErrorKind enum). Añadir un proveedor nuevo es escribir un adaptador y registrarlo — el orquestador no cambia. Los adaptadores OpenAI-compatibles (Groq, Mistral, OpenRouter, HuggingFace) comparten implementación; Gemini y Cohere tienen la suya por contrato propio.
Fallback en streaming acotado
Si fallas en medio de un stream, el cliente ya está consumiendo bytes — no puedes cambiar de proveedor sin romper el contrato. Por eso el fallback solo se permite antes del primer byte. Es una restricción explícita, no un bug.
Errores como dato, no como excepción
Toda excepción upstream se traduce a un ErrorKind antes de subir. El orquestador decide qué hacer por el tipo, no por inspección del mensaje. Esto hace el comportamiento testable: hay test cases para empty 200 OK, content-filtered finish reason, stream idle timeout y circuit breaker.
243 tests, Postgres real en CI
La suite usa testcontainers en local y un service container Postgres 16 en GitHub Actions — nada de SQLite ni mocks de DB. Unitarios puros (crypto, auto-strategy, schemas) corren sin Docker. Cualquier cambio en SQL o en la función plpgsql se prueba contra el motor real.
Seguridad por defecto
Setup wizard con bootstrap-token de un solo uso para evitar takeovers; keys de proveedor cifradas Fernet en disco; JWT secret independiente de la master key; rate-limit en login; headers de seguridad; CORS cerrado por defecto. El endpoint /metrics queda sin auth pero el docker-compose.prod.yml solo publica Caddy al exterior.
Open source / MIT
Está bajo licencia MIT a propósito: cualquiera puede forkearlo, auditar el código, desplegar su propia instancia y reusar piezas en proyectos privados sin fricción legal. El acuerdo es honesto: tú traes tus claves de proveedor (no se comparten claves entre usuarios ni se intenta saltar ningún TOS), y respondes ante cada provider por tu propia cuenta.
— ¿Te interesa este enfoque?
Si quieres montar algo parecido (o algo distinto) sobre cimientos sólidos, lo conversamos sin compromiso.
Hablemos de tu proyecto