Infraestructura propia · todo en producción

Cinco motores de IA generativa, en hardware propio.

DreamsTech construye y opera su propia infraestructura de inferencia: imagen, vídeo, voz, música y lenguaje corriendo en Apple Silicon, sin APIs de terceros y sin coste de nube. Siete productos publicados y cuatro APIs REST abiertas. Esta página es a la vez el portafolio, el catálogo de endpoints y el manual de uso.

7

productos publicados

4

APIs REST públicas

5

motores de IA local

0 €

coste de nube

01 / Portafolio

Productos y cómo empezar

Cada celda lleva los pasos mínimos para usarlo y el enlace directo de entrada.

En producción

PosterLab

Descubre películas y crea pósters, tráilers y reseñas con IA. Publicada en iOS (App Store) y en prueba cerrada en Google Play.

  1. 01Abre la web y explora el catálogo de películas.
  2. 02Entra en «Crear con IA» y elige póster, tráiler, reseña o puntuación.
  3. 03Escribe la idea; el motor local genera el resultado.
  4. 04Publícalo en la comunidad o descárgalo.
En producción

Inglés · Tutor IA

Tutor conversacional que corrige de verdad: recasts, roleplay y gramática, sobre principios de adquisición de segundas lenguas.

  1. 01Abre la webapp y ve a la pestaña Tutor IA.
  2. 02Elige nivel (A1–C1) y modo: conversación, roleplay o gramática.
  3. 03Si es roleplay, escoge escenario (cafetería, aeropuerto, entrevista…).
  4. 04Escribe en inglés; el tutor responde en streaming y te corrige.
API

Emoji Generator

Packs de emojis consistentes con FLUX: un personaje principal más variaciones, en PNG transparente listo para mensajería.

  1. 01Elige estilo: apple_3d, clay, flat_vector, pixel o neon.
  2. 02Elige set: minimal_5, classic_10, creator_10 o support_10.
  3. 03Lanza el trabajo con un POST y guarda el id.
  4. 04Consulta el estado y descarga el ZIP al terminar.
En producción

Lea Librería

Biblioteca infantil con generador de cuentos personalizados: el cuento se escribe, se narra con voz y se ilustra.

  1. 01Entra en Cuentacuentos.
  2. 02Pon el nombre del niño o niña y su franja de edad (3-5, 6-8, 9-12).
  3. 03Escribe el tema: dinosaurios, espacio, piratas…
  4. 04Genera: obtendrás el cuento, la narración y la ilustración.
API

AI Studio

La fachada única de los cinco motores locales: imagen, música, voz, vídeo y texto, con moderación y cola de GPU.

  1. 01Consulta /v1/engines para ver qué motores están listos.
  2. 02Mejora tu idea con /v1/enhance (opcional, recomendado).
  3. 03Genera con /v1/generate/image, /music, /voice o /video.
  4. 04Descarga desde la ruta /media/… que devuelve.
API · Bearer

media-host

Convierte fotos locales en URLs públicas HTTPS estables. Creado porque los catálogos de comercio exigen enlaces públicos, no rutas del disco.

  1. 01Pide tu token de servicio (requiere autenticación).
  2. 02Sube la imagen con un POST multipart.
  3. 03Recibes una URL https:// permanente en el CDN.
  4. 04Subir la misma foto otra vez no la duplica: se identifica por su contenido.
En producción

Periódico Digital

Plataforma de noticias con maquetación moderna y publicación ágil.

  1. 01Abre la portada.
  2. 02Navega por secciones y abre cualquier artículo.
En producción

GAFAS · Señalización

Señalización digital y gestión de contenido para pantallas.

  1. 01Entra al panel.
  2. 02Gestiona el contenido que se emite en las pantallas.
Próximamente

Snap Clone

Red social efímera con creación de contenido asistido por IA dentro del chat. En desarrollo, aún sin despliegue público.

  1. —Sin acceso público todavía.
02 / Disponibilidad

Estado de los servicios

Comprobado en vivo desde tu propio navegador al cargar esta página. No hay caché intermedia ni informe guardado: si aquí sale verde, el servicio respondió hace segundos, y el tiempo que se muestra es el de tu propia conexión.

AI Studio

comprobando…

Tutor de inglés

comprobando…

Emoji Generator

comprobando…

media-host

comprobando…

Los cuatro servicios permiten la lectura solo desde este origen y solo con GET: encolar trabajos nunca es posible desde una página ajena.

03 / Accesos

Dónde se entra a cada cosa

Todas las direcciones en un solo sitio, con su tipo de acceso.

Direcciones públicas del ecosistema
ServicioDirecciónTipoAcceso
PosterLabposterlab.dreamlabstech.coApp webAbierto
PosterLab (espejo)posterlab.apicloud.latApp webAbierto
Inglés · Tutor IAspinedab.github.io/INGLESWebapp / PWAAbierto
Inglés · API del tutortutor.apicloud.latAPI REST + SSEAbierto
Lea Libreríalea.apicloud.latApp webAbierto
Lea · Cuentacuentoslea.apicloud.lat/cuentacuentosGenerador IAAbierto
Emoji Generatoremoji.apicloud.latAPI RESTAbierto
AI Studioestudio.apicloud.latAPI RESTAbierto
media-hostmedia.apicloud.latAPI de subidaToken
CDN de imágenescdn.dreamlabstech.coArchivos estáticosAbierto
Periódico Digitalperiodico.apicloud.latApp webAbierto
GAFAS · Señalizacióngafas.apicloud.latPanel webAbierto

Sobre los tokens. Solo media-host exige autenticación, porque escribe en el almacenamiento del hosting. Su token se genera en el primer arranque del servicio y vive en el equipo que lo hospeda, en ~/.config/dreamstech/media_host_token. Nunca se publica aquí.

04 / Manual

Cómo usar cada cosa, con detalle

Despliega la que te interese. Los ejemplos son reales y se pueden copiar y pegar. Si guardas tu token con el botón Token de la cabecera, se inyecta solo en todos los ejemplos — se queda en tu navegador y nunca se envía a esta página.

Tutor Inglés · practicar e integrarlo

Desde la webapp (lo más rápido). Abre la webapp, pulsa Tutor IA en la barra de navegación, elige nivel y modo, y escribe. La respuesta llega palabra por palabra. Funciona también instalada como PWA, y sin conexión para el resto de secciones.

  • Conversación — charla libre adaptada a tu nivel.
  • Roleplay — 8 escenarios: cafetería, aeropuerto, médico, entrevista de trabajo, alquiler de piso, llamada telefónica, reclamación en restaurante y charla informal.
  • Gramática — explicación breve y luego práctica con corrección inmediata.

Desde tu propio código. Primero se abre una sesión y luego se conversa contra ella:

# 1. abrir sesión (nivel A1–C1; modo conversation | roleplay | grammar)
curl -s -X POST https://tutor.apicloud.lat/v1/sessions/start \
  -H 'Content-Type: application/json' \
  -d '{"level":"b1","mode":"roleplay","scenario":"job-interview"}'

# 2. conversar (usa el sessionId de la respuesta anterior)
curl -s -X POST https://tutor.apicloud.lat/v1/sessions/<SESSION_ID>/respond \
  -H 'Content-Type: application/json' \
  -d '{"text":"Good morning, thanks for seeing me."}'

# 3. ver escenarios disponibles
curl -s https://tutor.apicloud.lat/v1/scenarios
import requests

BASE = "https://tutor.apicloud.lat"

# 1. abrir sesión
s = requests.post(f"{BASE}/v1/sessions/start", json={
    "level": "b1",
    "mode": "roleplay",
    "scenario": "job-interview",
}).json()
sid = s["sessionId"]

# 2. conversar
r = requests.post(f"{BASE}/v1/sessions/{sid}/respond",
                  json={"text": "Good morning, thanks for seeing me."}).json()
print(r)

# 3. escenarios
print(requests.get(f"{BASE}/v1/scenarios").json())
const BASE = "https://tutor.apicloud.lat";
const json = { "Content-Type": "application/json" };

// 1. abrir sesión
const s = await (await fetch(`${BASE}/v1/sessions/start`, {
  method: "POST", headers: json,
  body: JSON.stringify({ level: "b1", mode: "roleplay", scenario: "job-interview" }),
})).json();

// 2. conversar
const r = await (await fetch(`${BASE}/v1/sessions/${s.sessionId}/respond`, {
  method: "POST", headers: json,
  body: JSON.stringify({ text: "Good morning, thanks for seeing me." }),
})).json();
console.log(r);

Hay POST /v1/sessions/{id}/stream para respuesta en streaming (SSE), GET /v1/sessions/{id} para recuperar el historial y DELETE para cerrarla.

Detalle a tener en cuenta: la sesión queda ligada a tu conexión, así que si cambias de red a mitad de conversación tendrás que empezar una nueva.

Emoji Generar un pack completo

Es una API: no tiene interfaz gráfica propia. Un pack se genera en segundo plano porque cada imagen pasa por la GPU de una en una — cuenta con varios minutos (unos 40 segundos por imagen).

# 1. lanzar el trabajo -> devuelve un id
curl -s -X POST https://emoji.apicloud.lat/api/v1/jobs \
  -H 'Content-Type: application/json' \
  -d '{"prompt":"mascota robot simpática con antena azul",
       "style_id":"apple_3d",
       "variation_set_id":"minimal_5"}'

# 2. consultar el estado (repetir hasta que sea "completed")
curl -s https://emoji.apicloud.lat/api/v1/jobs/<JOB_ID>

# 3. descargar el pack en ZIP
curl -s -o pack.zip https://emoji.apicloud.lat/api/v1/jobs/<JOB_ID>/archive
import time, requests

BASE = "https://emoji.apicloud.lat/api/v1"

job = requests.post(f"{BASE}/jobs", json={
    "prompt": "mascota robot simpática con antena azul",
    "style_id": "apple_3d",
    "variation_set_id": "minimal_5",
}).json()

# la GPU genera de una en una: espera con paciencia, no en bucle cerrado
while True:
    st = requests.get(f"{BASE}/jobs/{job['id']}").json()
    if st["status"] in ("completed", "failed"):
        break
    time.sleep(15)

if st["status"] == "completed":
    zipped = requests.get(f"{BASE}/jobs/{job['id']}/archive").content
    open("pack.zip", "wb").write(zipped)
import { writeFile } from "node:fs/promises";

const BASE = "https://emoji.apicloud.lat/api/v1";

const job = await (await fetch(`${BASE}/jobs`, {
  method: "POST", headers: { "Content-Type": "application/json" },
  body: JSON.stringify({
    prompt: "mascota robot simpática con antena azul",
    style_id: "apple_3d", variation_set_id: "minimal_5",
  }),
})).json();

let st;
do {
  await new Promise(r => setTimeout(r, 15000));
  st = await (await fetch(`${BASE}/jobs/${job.id}`)).json();
} while (!["completed", "failed"].includes(st.status));

if (st.status === "completed") {
  const buf = await (await fetch(`${BASE}/jobs/${job.id}/archive`)).arrayBuffer();
  await writeFile("pack.zip", Buffer.from(buf));
}

Estilos: apple_3d, clay, flat_vector, pixel, neon.  Sets: minimal_5 (6 imágenes), classic_10, creator_10, support_10 (11 imágenes).

El pack incluye los PNG con fondo transparente, una hoja de contactos, el manifiesto y el ZIP. También hay /manifest y /contact-sheet por separado, y /api/v1/prompts/inspect para ver cómo quedará el prompt antes de gastar GPU.

Límites de uso: 4 packs por hora por conexión (respuesta 429) y 3 trabajos simultáneos en todo el servicio (503 con Retry-After cuando la cola de GPU va llena — reintenta en unos minutos). Los batches cuentan cada prompt por separado.

Limitación honesta: la identidad del personaje varía entre variaciones, porque cada una es una generación independiente. El recorte y el encuadre salen limpios; la coherencia del personaje entre imágenes todavía no.

Studio Generar imagen, música, voz o vídeo

Un solo punto de entrada para los cinco motores. Las peticiones a la GPU se serializan: si hay algo generando, la tuya espera turno (es a propósito — en paralelo todo se degrada).

# motores disponibles y su estado
curl -s https://estudio.apicloud.lat/v1/engines

# mejorar una idea suelta antes de generar
curl -s -X POST https://estudio.apicloud.lat/v1/enhance \
  -H 'Content-Type: application/json' \
  -d '{"idea":"gato astronauta","kind":"image"}'

# imagen (FLUX) — 256 a 1536 px
curl -s -X POST https://estudio.apicloud.lat/v1/generate/image \
  -H 'Content-Type: application/json' \
  -d '{"prompt":"póster de cine, neón, 4k","width":1024,"height":1024}'

# voz (Kokoro) — voces: ef_dora, em_alex, em_santa
curl -s -X POST https://estudio.apicloud.lat/v1/generate/voice \
  -H 'Content-Type: application/json' \
  -d '{"text":"Hola, esto es una prueba.","voice":"ef_dora"}'
import requests

BASE = "https://estudio.apicloud.lat"

# qué motores están cargados
print(requests.get(f"{BASE}/v1/engines").json())

# imagen (FLUX)
r = requests.post(f"{BASE}/v1/generate/image", json={
    "prompt": "póster de cine, neón, 4k",
    "width": 1024, "height": 1024,
}, timeout=600).json()          # la cola de GPU puede tardar

# la respuesta trae una ruta relativa: /media/<id>.png
img = requests.get(BASE + r["url"]).content
open("salida.png", "wb").write(img)
import { writeFile } from "node:fs/promises";

const BASE = "https://estudio.apicloud.lat";

console.log(await (await fetch(`${BASE}/v1/engines`)).json());

const r = await (await fetch(`${BASE}/v1/generate/image`, {
  method: "POST", headers: { "Content-Type": "application/json" },
  body: JSON.stringify({ prompt: "póster de cine, neón, 4k", width: 1024, height: 1024 }),
})).json();

// r.url es relativa al propio servicio
const buf = await (await fetch(BASE + r.url)).arrayBuffer();
await writeFile("salida.png", Buffer.from(buf));

La respuesta trae una ruta url del tipo /media/<id>.png: se descarga desde https://estudio.apicloud.lat/media/<id>.png.

  • Música — /v1/generate/music, con duration de 5 a 120 segundos y letras opcionales.
  • Vídeo — /v1/generate/video, de 1 a 10 segundos.
  • Cuentos — /v1/story, con nombre, edad y tema (es lo que usa Lea).
  • Comunidad — /v1/feed y /v1/library; se publica con /v1/items/{id}/publish y se denuncia con /report.
media-host Fotos locales a URLs públicas

Resuelve un problema concreto: los catálogos de comercio (Meta y similares) exigen que el enlace de la imagen sea una URL pública HTTPS, y una app de escritorio solo tiene rutas como /Users/tu/fotos/silla.jpg, que son rechazadas.

# el token se lee del equipo que hospeda el servicio
TOKEN={{TOKEN}}

# subir una foto -> devuelve la URL pública
curl -s -X POST https://media.apicloud.lat/v1/images \
  -H "Authorization: Bearer $TOKEN" \
  -F "file=@/ruta/a/foto.png"

# comprobar si una imagen ya estaba subida, por su hash
curl -s https://media.apicloud.lat/v1/images/<SHA256> \
  -H "Authorization: Bearer $TOKEN"
import hashlib, pathlib, requests

BASE  = "https://media.apicloud.lat"
TOKEN = {{TOKEN}}
H     = {"Authorization": f"Bearer {TOKEN}"}

foto = pathlib.Path("/ruta/a/foto.png")

# el nombre remoto es el hash del contenido: se puede preguntar antes de subir
sha = hashlib.sha256(foto.read_bytes()).hexdigest()
ya   = requests.get(f"{BASE}/v1/images/{sha}", headers=H)

if ya.status_code == 200:
    url = ya.json()["url"]
else:
    with foto.open("rb") as f:
        url = requests.post(f"{BASE}/v1/images", headers=H,
                            files={"file": f}).json()["url"]
print(url)
import { readFile } from "node:fs/promises";

const BASE  = "https://media.apicloud.lat";
const TOKEN = {{TOKEN}};

const bytes = await readFile("/ruta/a/foto.png");
const form  = new FormData();
form.append("file", new Blob([bytes]), "foto.png");

const r = await (await fetch(`${BASE}/v1/images`, {
  method: "POST",
  headers: { Authorization: `Bearer ${TOKEN}` },  // no fijes Content-Type con FormData
  body: form,
})).json();

console.log(r.url);

Devuelve la URL definitiva en cdn.dreamlabstech.co, más el hash, las dimensiones y si la imagen ya existía. Detalles del diseño que conviene conocer:

  • El nombre del archivo es el hash del contenido, así que subir la misma foto dos veces no la duplica ni cambia su URL.
  • Las imágenes se guardan en el hosting, no en el equipo que las sube. Los catálogos vuelven a leer la URL mucho después de publicar; si apuntara a un portátil que se suspende, el anuncio se rompería.
  • Se valida el contenido real, no la extensión: un .jpg que en realidad sea HTML se rechaza.
  • Máximo 12 MB por imagen y 120 peticiones por minuto. Formatos: JPEG, PNG, WebP y GIF.
PosterLab Crear y publicar contenido

Es la app más completa de cara al usuario final. Al entrar verás el catálogo de películas; la parte interesante está en Crear con IA:

  • Póster — describe la película imaginaria y se genera la portada.
  • Tráiler — genera un clip corto de vídeo.
  • Reseña y puntuación — texto crítico generado.
  • Comunidad — lo que publiques aparece en el feed común, y cualquiera puede denunciar contenido inapropiado con un motivo concreto.

La versión iOS está publicada en la App Store y la de Android está en prueba cerrada en Google Play. Ambas incluyen el mismo sistema de denuncia y moderación, requisito de las tiendas para apps con contenido generado por usuarios.

Lea Cuentos personalizados narrados

Pensado para leer con niños. En Cuentacuentos se rellenan tres campos y el sistema encadena tres motores distintos: el texto lo escribe el modelo de lenguaje, la narración la genera Kokoro y la ilustración FLUX.

  • Nombre — el protagonista del cuento será quien tú digas.
  • Edad — 3-5, 6-8 o 9-12; ajusta vocabulario y longitud.
  • Tema — libre: dinosaurios, el mar, un dragón que no sabía volar…

Tarda un poco porque son tres generaciones seguidas. El resultado se puede escuchar en la propia página.

05 / Referencia

Resumen de las APIs

Cuatro servicios, todos REST con JSON. Sin SDK que instalar.

Superficie pública de la API
APIBaseEndpoints principalesAuth
AI Studio estudio.apicloud.lat /v1/engines · /v1/enhance · /v1/generate/{image,music,voice,video} · /v1/story · /v1/feed No
Tutor de inglés tutor.apicloud.lat /v1/scenarios · /v1/sessions/start · /v1/sessions/{id}/respond · /stream (SSE) No
Emoji Generator emoji.apicloud.lat /api/v1/styles · /api/v1/variation-sets · /api/v1/jobs · /jobs/{id}/archive No
media-host media.apicloud.lat /v1/images · /v1/images/base64 · /v1/images/{sha256} Bearer

Comportamiento compartido. Todas las generaciones pasan por la misma GPU y se encolan de una en una, así que una petición puede esperar si hay otra en marcha. Los trabajos largos (packs de emojis, vídeo) son asíncronos: se lanza el trabajo y se consulta el estado después.

06 / Planificación

Cuánto va a tardar

Estimación de tiempo de inferencia en la GPU antes de escribir una línea de código. Los valores base salen de las mediciones reales del ecosistema, no de una hoja de especificaciones.

La cola es global y serializada: como máximo 3 trabajos activos.

40 s aprox.

Por unidad40 s
Tu trabajo40 s
Espera en cola0 s
Coste de nube0,00 €

Los tiempos son de la GPU de la Mac Studio (M4 Max) y varían con la resolución y la carga.

07 / Arquitectura

Cómo está montado

Sin nube de pago: los modelos corren en hardware propio y se publican por túnel cifrado.

Internet
   │
   ├── HTTPS ──▶ túnel Cloudflare ──▶ Mac Studio (M4 Max, 64 GB)
   │                                    │
   │                                    ├── PosterLab            :8810
   │                                    ├── Lea Librería         :8811
   │                                    ├── GAFAS señalización   :8812
   │                                    ├── Periódico            :8814
   │                                    ├── AI Studio            :8815 ─┐
   │                                    ├── Emoji Generator      :8816 ─┤
   │                                    ├── Tutor de inglés      :8817 ─┤
   │                                    ├── media-host           :8818 ─┤
   │                                    │                               │
   │                                    └── Motores de IA local ◀───────┘
   │                                        FLUX · LTX-Video · Kokoro
   │                                        ACE-Step · Gemma · Qwen
   │
   └── HTTPS ──▶ hosting cPanel ──▶ cdn.dreamlabstech.co       (imágenes públicas)
                                    marketing.dreamlabstech.co (esta página)

FLUX.1-schnell

imágenes

LTX-Video

vídeo

Kokoro

voz

ACE-Step 3.5B

música

Gemma · Qwen 32B

texto y visión

Por qué en hardware propio y no en una VPS. Los modelos de imagen y vídeo necesitan GPU y memoria unificada; las VPS económicas no la tienen y allí solo producirían resultados de relleno. El hosting compartido, por su parte, no ejecuta procesos, pero es siempre accesible: por eso guarda las imágenes públicas y esta propia página. La contrapartida honesta de este diseño: si la Mac se apaga, las apps que dependen de la GPU dejan de responder.

Tu token de API

Se inyecta en los ejemplos de código de esta página para que puedas copiarlos y ejecutarlos tal cual. Se guarda solo en tu navegador (localStorage) y nunca se envía a ningún servidor. Pegar está permitido, como debe ser.