Volver a proyectos
09FREEAIOpen source · MIT18 may 2026Autor y mantenedor

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.

FastAPIPostgresOpen LLMsOpenAI-compatibleStreamingMultimodalOpen SourceMIT
Captura de FREEAI
— Problema

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é construí

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 ProviderResponse y 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 plpgsql en 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, parsing o unknown. 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_url OpenAI-compatibles enrutados automáticamente a proveedores con visión (Gemini, OpenRouter), traduciendo el formato cuando hace falta.
  • Embeddings con fallbackPOST /v1/embeddings enruta 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/fastest por 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 integradastructlog con request-id en contextvars, endpoint Prometheus /metrics y dashboard Grafana opcional bajo el perfil observability del 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.

— Métricas
7
Proveedores soportados
243
Tests pytest
8
Estrategias built-in
MIT
Licencia
— Decisiones técnicas

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