🔥 Regla de la fragua: Aquí las palabras nunca se ablandan. Se forjan. Cero eufemismos, cero tono corporativo — directo al dolor real del cliente.

LA FRAGUA

AvatarHype Studio — contenido real y animado, listo para copiar

Sin API key
🔥
Contenido real (UGC / avatar)Personaje habla a cámara — neuromarketing agresivo, sin ablandar
🎞️
Contenido animadoStorytelling reflexivo con datos — Pixar, Apple, Sci-fi, Claymation, Wes Anderson

⚙️ Configuración de la API

Tu API key de Anthropic se guarda solo en este navegador (localStorage). Nunca se envía a ningún otro sitio.

La consigues en console.anthropic.com → API Keys.

🔗 Un solo proxy para los tres proveedores (opcional)

WaveSpeed, APImart y OpenAI cada uno puede necesitar su propio Cloudflare Worker como proxy CORS — pero puedes usar el MISMO Worker para los tres si lo actualizas a la versión "genérica" de la FAQ (busca "un solo proxy para todo"). Llena este campo y listo, ya no hace falta llenar el proxy individual de cada proveedor más abajo. Si ya tenías el Worker de WaveSpeed funcionando y no quieres tocarlo, déjalo vacío y sigue usando los proxies individuales de abajo como antes — nada se rompe.

🌊 WaveSpeedAI — generación real de imagen/video

Con esto, cada prompt tiene un botón "Generar" que crea la imagen/video de verdad, sin que tengas que copiar y pegar en otra plataforma. Usa modelos mainstream (no la línea "spicy"/explícita) — menos estrictos con contenido de fitness/skincare/salud legítimo que las apps de consumo, pero no sin política alguna.

Enrutamiento automático de imagen — sin que toques nada: el character sheet (la referencia maestra de identidad) va directo al modelo de máxima calidad (Nano Banana Pro, $0.070/img) porque un error ahí se propaga a todo lo demás. Todo lo demás va al modelo económico (Nano Banana 2 Edit Fast, $0.045/img — 36% más barato, 90-95% de la misma calidad). Si el económico bloquea algo por un patrón que huele a moderación, escala solo al modelo alterno — nunca ante fallas de red o de tiempo, solo ante bloqueos reales.

Requiere haber hecho un top-up en tu cuenta de WaveSpeed para activarse.
WaveSpeed no permite llamadas directas desde una página web (CORS) — por eso da "Failed to fetch". Deja este campo vacío y verás ese error. Instrucciones para crear el proxy gratis en 2 minutos, en la FAQ de más abajo ("¿Por qué me da 'Failed to fetch'?").
Tiene su propio filtro de moderación — no es "sin censura", solo tiene otra sensibilidad.
Si al generar video te da error de "campo requerido faltante", este es el primer valor a probar cambiar. Para imagen ya está confirmado como "images".
El costo escala LINEAL con la duración — más corto es siempre más barato. 5s es lo más corto que aceptan de forma confiable los modelos Seedance. Solo sube esto si de verdad necesitas más tiempo para que se vea la acción completa.

🎙️ Videos con diálogo — lip-sync perfecto

Para diálogo, LA FRAGUA ya NO genera voz nativa dentro del video (no garantiza sincronía). En su lugar: 1) convierte el texto a voz, 2) le pega esa voz a la foto de tu modelo con un modelo de lip-sync dedicado — y le envía además las acciones exactas del guion (no solo la voz), para que la persona haga lo que dice el prompt y no solo mueva los labios.

InfiniteTalk: sincronía precisa de labios, dientes y movimiento de cabeza/cuerpo.

El TTS necesita saber cuál voz usar, no solo el texto. Si dejas vacío "voice_id de ElevenLabs", LA FRAGUA ya elige sola una voz colombiana de ElevenLabs (mujer u hombre según lo que diga el guion en cada toma) — misma voz para todas las tomas del mismo personaje. Si pones un voice_id fijo ahí, esa gana siempre, para todas las tomas. Orden completo: 1) tu voice_id de ElevenLabs si lo pusiste; 2) automática colombiana por género (nueva); 3) clonar un audio de referencia real; 4) un voice_id fijo preestablecido; 5) diseñar una voz automática por descripción (la más incierta).

Solo funciona si es una voz pública de la biblioteca de ElevenLabs — una voz clonada dentro de tu cuenta personal puede no ser accesible desde aquí (WaveSpeed usa sus propias credenciales, no las tuyas). Si da "invalid voice", prueba con "Alice" o "Callum" primero para confirmar que la conexión funciona. Déjalo vacío y LA FRAGUA elige sola una voz colombiana según el género de cada personaje en el guion — o haz clic en el campo para ver la lista y forzar una voz específica para todas las tomas.
Sube un audio corto tuyo o de cualquier locutor colombiano a cualquier hosting público (ej. el mismo sitio donde subiste las fotos) y pega el link. Cada toma clonará esa voz exacta diciendo su diálogo.

🔄 Recuperación automática

Si "Generar" se agota esperando pero la tarea sí quedó creada, LA FRAGUA la sigue revisando SOLA (cada 25s) y la carga apenas esté lista — no hace falta pegar ningún ID ni tener acceso a tu cuenta de WaveSpeed. Esto también funciona para cualquier persona a la que le compartas este archivo: el guion y lo ya generado quedan guardados en este navegador, así que recargar la página no borra nada ni deja nada a medio camino.

🧩 APImart — proveedor alterno (GPT-Image-2 + Gemini Omni Flash)

Motor alterno al de WaveSpeed. Cambia cuál usan TODOS los botones "🌊 Generar" con el interruptor arriba a la derecha (junto a Configuración) — no hay que tocar nada aquí para cambiar de uno a otro, solo para poner tu API key la primera vez. Ambos comparten las mismas referencias (state.assets): si generaste el modelo con uno, el otro sigue usando esa misma cara, nunca inventa otra persona.

Diferencia clave en video con diálogo: con WaveSpeed, la voz sale de ElevenLabs (control fino de acento colombiano) y el lip-sync es un paso aparte. Con APImart, Gemini Omni Flash genera voz + acciones + labios en un solo paso a partir del prompt — sigue mejor las acciones del guion, pero el acento colombiano queda a criterio del modelo (se le pide explícitamente en el prompt, sin garantía tipo voice_id). Úsalo como respaldo cuando WaveSpeed no siga bien las acciones.

A diferencia de WaveSpeed, APImart sí acepta llamadas directas desde el navegador — deja este campo vacío. Solo llénalo si "Generar" te da "Failed to fetch" (bloqueo CORS real), y en ese caso pega SOLO el dominio del Worker (ej. https://tu-proxy.workers.dev) — nunca la base oficial de APImart ni nada terminado en /v1, LA FRAGUA ya le agrega la ruta completa sola. Instrucciones en la FAQ de más abajo.

🎨 OpenAI / ChatGPT — SOLO para imágenes de ejemplo en la caja de herramientas

Esto NUNCA se usa para generar contenido final de anuncios — solo aparece como botón adicional "🎨 Ejemplo con ChatGPT" en las tarjetas de la caja de herramientas (character sheet, ángulos, vestuario, fondo, etc.), tal como pediste, para no arriesgar que redes sociales detecten el contenido publicitario como hecho con IA de OpenAI.

⚠️ A pedido tuyo, tu API key SÍ quedó puesta por defecto dentro de este archivo. Recuerda: si este archivo termina en un sitio público (ej. subido a Netlify sin restricción), cualquiera podría verla con clic derecho → "ver código fuente". Si en algún momento quieres quitarla del código y que cada quien la pegue en su propio navegador, dime y la saco.

Si da "Failed to fetch", es CORS — necesita su PROPIO Cloudflare Worker (no sirve el de WaveSpeed ni el de APImart), apuntando a https://api.openai.com. Mismo código de la FAQ, solo cambiando el destino.

1 · Datos del producto

Con esto la IA construye personaje, tono y dolores correctos desde el inicio.

Esto agrega setup prompts especializados (giro 360, extender crema, sirviendo la dosis, mockup de pantalla, etc.)
Debe ser un link directo a la imagen (.jpg/.png/.gif/.webp), pública — no una página, no un enlace de Drive/WhatsApp privado. Si la pegas, Claude la ve de verdad y describe lo real en los setup prompts en vez de inventarlo.

2 · ¿Ya tienes guion, o lo forjamos aquí?

Elige el modo — esto cambia lo que la IA hace con tus palabras.

Modo A · Crear guion desde cero Le doy solo el producto. La IA escribe el guion completo con neuromarketing agresivo, hook, dolor y CTA.
Modo B · Ya tengo un guion escrito Pego mi guion tal cual. La IA NO reescribe ni una palabra — solo construye personaje, voz, acciones y prompts alrededor de él.
Forjando tu contenido... Golpeando el guion hasta que duela lo que tiene que doler.

🧰 Caja de herramientas — biblioteca completa

Prompts fijos de la biblioteca de AvatarHype Academy. No necesitan IA — se generan al instante.

🎙️ Voz en off / B-roll — el avatar no habla

Clips donde el personaje actúa una escena sin hablar (no talking) para que narres tú por encima en edición. Usa los datos del producto de arriba.

🎭 Replicar video con mi modelo

Sube un video de referencia (una acción, un movimiento, un anuncio que te guste) y tu modelo lo replica. Requiere WaveSpeed configurado.

❓ Qué hacer en cada momento

Un prompt legítimo se bloqueó — ¿qué hago? real

Normalmente no tienes que hacer nada: si el modelo económico bloquea algo por un patrón que huele a moderación, LA FRAGUA escala sola al modelo alterno (GPT Image 2, que tiene su propia moderación, distinta, no ausente) — verás el mensaje de estado cambiar mientras lo hace. Solo si los dos modelos fallan aparece el error real, y ahí sí queda un botón manual "🔁 Reintentar con modelo alterno" por si quieres forzar otro intento. Si ambos siguen bloqueando, probablemente el contenido sí cruza una línea real, no un falso positivo.

¿Cómo logro que la voz suene humana y colombiana de verdad? real

Un voice_id preestablecido genérico o el diseño automático por descripción NO garantizan un acento colombiano específico — suelen salir en español neutro. Dos formas que sí lo garantizan: (1) déjalo simplemente automático — si el campo "🎤 voice_id de ElevenLabs" está vacío, LA FRAGUA detecta sola si cada toma es de un personaje hombre o mujer (según el guion) y elige una voz colombiana real de ElevenLabs para cada uno, manteniendo la misma en todas sus tomas; también puedes hacer clic en el campo para ver la lista completa (~34 voces, paisa/bogotana/Medellín/neutra) y forzar una específica; (2) sin ElevenLabs, usa "🎙️ Clonar voz real" con un audio corto (10-20s) de alguien hablando español colombiano — puede ser tu propia voz. Ambas copian una voz de verdad en vez de sintetizarla desde una descripción de texto.

Me da error "field 'voice_id' is required" al generar una toma real

El TTS necesita saber CUÁL voz usar, no solo el texto. Lo mejor es usar "🎙️ Clonar voz real" (ver pregunta anterior). Si no tienes un audio a mano, la alternativa rápida: ve a el playground de minimax/speech-02-turbo en WaveSpeed, copia el nombre de una voz preestablecida, y pégalo en "voice_id FIJO". Si dejas todo vacío, LA FRAGUA intenta diseñar una voz automática por descripción — es el respaldo menos confiable de los tres.

¿Por qué el character sheet usa un modelo distinto? real

Porque es la única imagen que define la identidad exacta que se va a repetir en todo lo demás — un error ahí (una cara ligeramente distinta) se nota en cada toma después. Por eso va directo al modelo de máxima calidad sin pasar primero por el económico, aunque cueste un poco más. Es la única generación donde vale la pena ese costo extra.

¿Qué hace "✨ Autocompletar"? real

Escribe solo el nombre del producto y presiona el botón. Si es un producto con el que ya trabajamos antes (GLADIADOR, Flexacil, Multi Collagen, Mega Red, etc.), llena los 4 campos al instante sin gastar IA. Si es un producto nuevo, busca información real en la web y llena los campos con el mismo tono directo — revisa siempre el resultado, porque una búsqueda puede no encontrar el producto exacto.

¿Qué es el botón "🌊 Generar" en cada prompt? real

Genera la imagen o video de verdad con WaveSpeedAI, sin que copies nada a otra plataforma (configúralo primero en ⚙️ Configuración). La primera imagen que generes del avatar y del producto se guarda sola como referencia, y los siguientes prompts que digan "usa esta imagen" la usan automáticamente. Si generas algo que te guste más como referencia, usa el botón "📌 Usar como avatar/producto de referencia" bajo el resultado para forzarlo.

¿Por qué me da "Failed to fetch" al generar? real

WaveSpeed no permite que una página web le hable directo desde el navegador (CORS) — necesitas un pequeño "puente" gratis. Toma 2 minutos:

1. Ve a workers.cloudflare.com y crea una cuenta gratis.
2. "Create Worker" → borra el código de ejemplo → pega este:

export default {
  async fetch(request) {
    const url = new URL(request.url);
    const target = 'https://api.wavespeed.ai' + url.pathname + url.search;
    const cors = {
      'Access-Control-Allow-Origin': '*',
      'Access-Control-Allow-Methods': 'GET, POST, OPTIONS',
      'Access-Control-Allow-Headers': 'Authorization, Content-Type'
    };
    if (request.method === 'OPTIONS') {
      return new Response(null, { headers: cors });
    }
    const init = {
      method: request.method,
      headers: {
        'Authorization': request.headers.get('Authorization') || '',
        'Content-Type': 'application/json'
      }
    };
    if (request.method === 'POST') {
      init.body = await request.text();
    }
    const resp = await fetch(target, init);
    const body = await resp.text();
    return new Response(body, {
      status: resp.status,
      headers: { 'Content-Type': 'application/json', ...cors }
    });
  }
};

3. "Deploy" → copia la URL que te dan (algo como https://tu-proxy.tu-usuario.workers.dev).
4. Pégala en LA FRAGUA → ⚙️ Configuración → "URL de tu proxy CORS" → Guardar. Listo, "Generar" ya debería funcionar.

¿Qué es el interruptor 🌊 WaveSpeed / 🧩 APImart arriba? real

Elige qué proveedor genera imagen/video cada vez que le das a "🌊 Generar" — en cualquier prompt, en cualquier toma. Cambialo cuando quieras y vuelve a darle "Generar" al mismo prompt; usa exactamente la misma referencia de tu modelo/producto que ya tenías (nunca inventa una persona distinta), así hayas generado esa referencia con el otro proveedor. Con WaveSpeed, el diálogo usa una voz de ElevenLabs (acento colombiano elegido con precisión) más un modelo de lip-sync aparte. Con APImart, Gemini Omni Flash genera voz + acciones + labios en un solo paso a partir del guion — sigue mejor las acciones si WaveSpeed te falla en eso, pero el acento colombiano queda a criterio del modelo (se le pide en el prompt, sin garantía tipo voice_id). Úsalo como respaldo, no como reemplazo automático.

Me da "Failed to fetch" al generar con APImart real

Es el mismo tipo de bloqueo CORS que con WaveSpeed, pero necesita su PROPIO proxy — el de WaveSpeed apunta a otro servidor y no sirve aquí. Repite los mismos pasos de arriba, pero con este código (solo cambia el destino):

export default {
  async fetch(request) {
    const url = new URL(request.url);
    const target = 'https://api.apimart.ai' + url.pathname + url.search;
    const cors = {
      'Access-Control-Allow-Origin': '*',
      'Access-Control-Allow-Methods': 'GET, POST, OPTIONS',
      'Access-Control-Allow-Headers': 'Authorization, Content-Type'
    };
    if (request.method === 'OPTIONS') {
      return new Response(null, { headers: cors });
    }
    const init = {
      method: request.method,
      headers: {
        'Authorization': request.headers.get('Authorization') || '',
        'Content-Type': 'application/json'
      }
    };
    if (request.method === 'POST') {
      init.body = await request.text();
    }
    const resp = await fetch(target, init);
    const body = await resp.text();
    return new Response(body, {
      status: resp.status,
      headers: { 'Content-Type': 'application/json', ...cors }
    });
  }
};

Despliega este como un Worker NUEVO (no reemplaces el de WaveSpeed) y pega su URL en ⚙️ Configuración → "URL de tu proxy CORS para APImart" → Guardar configuración de APImart.

Me da "Failed to fetch" al generar con OpenAI/ChatGPT real

Mismo bloqueo CORS, pero OpenAI necesita un Worker con una diferencia importante: el botón "🎨 Ejemplo con ChatGPT" a veces sube imágenes de referencia como archivo binario (multipart), no solo texto — el Worker de WaveSpeed/APImart de arriba dañaría esas imágenes si lo reusas aquí porque lee el cuerpo como texto. Usa este, que reenvía todo en binario y respeta el tipo de contenido original:

export default {
  async fetch(request) {
    const url = new URL(request.url);
    const target = 'https://api.openai.com' + url.pathname + url.search;
    const cors = {
      'Access-Control-Allow-Origin': '*',
      'Access-Control-Allow-Methods': 'GET, POST, OPTIONS',
      'Access-Control-Allow-Headers': 'Authorization, Content-Type'
    };
    if (request.method === 'OPTIONS') {
      return new Response(null, { headers: cors });
    }
    const init = {
      method: request.method,
      headers: { 'Authorization': request.headers.get('Authorization') || '' }
    };
    const ct = request.headers.get('Content-Type');
    if (ct) init.headers['Content-Type'] = ct; // preserva el boundary del multipart — NO forzar siempre a JSON
    if (request.method === 'POST') {
      init.body = await request.arrayBuffer(); // binario, no texto — para que no se dañen las imágenes de referencia
    }
    const resp = await fetch(target, init);
    const body = await resp.arrayBuffer();
    return new Response(body, {
      status: resp.status,
      headers: { 'Content-Type': resp.headers.get('Content-Type') || 'application/json', ...cors }
    });
  }
};

Despliega este como un Worker NUEVO (distinto a los de WaveSpeed y APImart) y pega su URL en ⚙️ Configuración → "URL de tu proxy CORS para OpenAI" → Guardar configuración de OpenAI.

¿Cómo uso un solo proxy para todo, en vez de uno por cada proveedor? real

Ninguna API puede dejar de pedir CORS por decisión tuya o mía — eso lo decide cada proveedor en su propio servidor (WaveSpeed, APImart y OpenAI simplemente no lo activaron, a diferencia de Anthropic). Lo que SÍ se puede reducir es tener que crear un Worker nuevo por cada uno. Reemplaza el código de tu Worker YA desplegado (o crea uno solo) por este, que reenvía a cualquiera de los tres según lo que LA FRAGUA le pida en la ruta:

export default {
  async fetch(request) {
    const url = new URL(request.url);
    const parts = url.pathname.split('/').filter(Boolean);
    const targetHost = parts.shift(); // ej: "api.wavespeed.ai", "api.apimart.ai" o "api.openai.com"
    const cors = {
      'Access-Control-Allow-Origin': '*',
      'Access-Control-Allow-Methods': 'GET, POST, OPTIONS',
      'Access-Control-Allow-Headers': 'Authorization, Content-Type'
    };
    if (request.method === 'OPTIONS') {
      return new Response(null, { headers: cors });
    }
    if (!targetHost) {
      return new Response('Falta el host destino en la ruta', { status: 400, headers: cors });
    }
    const target = 'https://' + targetHost + '/' + parts.join('/') + url.search;
    const init = {
      method: request.method,
      headers: { 'Authorization': request.headers.get('Authorization') || '' }
    };
    const ct = request.headers.get('Content-Type');
    if (ct) init.headers['Content-Type'] = ct;
    if (request.method === 'POST') {
      init.body = await request.arrayBuffer();
    }
    const resp = await fetch(target, init);
    const body = await resp.arrayBuffer();
    return new Response(body, {
      status: resp.status,
      headers: { 'Content-Type': resp.headers.get('Content-Type') || 'application/json', ...cors }
    });
  }
};

Pégalo en tu Worker de Cloudflare (puedes reemplazar el que ya tenías de WaveSpeed — su URL no cambia) → copia esa URL → ⚙️ Configuración → arriba de todo, "URL del proxy universal" → Guardar. Con eso queda listo para los tres proveedores a la vez; no hace falta tocar los campos de proxy individuales.

¿Cómo se genera el video con diálogo? real

En dos pasos automáticos: primero convierte el texto a voz (TTS), luego pega esa voz a la foto de tu modelo con InfiniteTalk, un modelo de lip-sync dedicado (no genera audio nativo dentro del video, que no garantiza sincronía). Esto da labios, dientes y movimiento de cabeza mucho más reales. Si el resultado no te convence, ajusta el modelo de lip-sync en Configuración — hay alternativas como Kling AI Avatar.

¿Qué es "Replicar video con mi modelo"? real

Pega la URL de cualquier video (una acción, un anuncio, un movimiento que te guste) y la foto de tu modelo — la IA genera un video nuevo con tu modelo replicando esa escena. Modo "Reemplazar" mantiene el fondo/cámara del video original; modo "Animar" solo copia el movimiento.

Ya llené los datos del producto — ¿ahora qué? real

Elige el Modo A o B en el paso 2. Si no tienes guion, deja el Modo A. Luego presiona "Forjar contenido completo".

¿En qué orden uso lo que se generó? real

1) Copia los setup prompts y genera las imágenes base. 2) Copia el prompt completo de cada toma y pégalo en tu herramienta de video. 3) Usa la caja "qué hace el personaje" para explicarle a tu editor qué debe pasar en pantalla.

Edité el diálogo y algo se puso en rojo real

Significa que una acción apuntaba a una palabra que ya no está en el texto. Presiona "Re-sincronizar" en esa toma y la IA la ajusta sin tocar el resto.

¿Qué es la Caja de herramientas y cuándo la uso? real

Son los prompts fijos de la biblioteca (ángulos, character sheet, moda, skincare, mockup de app). No necesitan IA — elige del selector y copia. Úsalos en cualquier momento, no dependen de haber "forjado" el contenido principal.

¿Qué es "voz en off / b-roll"? real

Clips donde el personaje actúa (camina, aplica el producto, se despierta) pero no habla. Tú grabas o generas la narración por separado y la montas encima en edición. Útil para TOFU sin depender de un guion hablado.

¿Por qué el modo animado no suena agresivo? animado

Porque este pipeline vende distinto: con datos duros y una reflexión tipo "amigo que sabe algo interesante", no tocando inseguridades. Prohíbe palabras como "revolucionario" y hooks que hablen directo al cliente. Es literalmente lo opuesto a la regla de "no ablandar" del modo real — por diseño.

¿Qué son los pasos marcados como "puente"? animado

Tu documento original tenía huecos (los prompts 3, 5, 7 y 8 no estaban en lo que pegaste). Construí un paso equivalente para que el flujo no se rompa, pero está marcado claramente para que sepas que no es el prompt oficial de tu sistema — si lo consigues, puedes usarlo en su lugar y saltarte ese paso aquí.

El paso 2 (insights) — ¿de dónde saca los datos? animado

Solo de lo que tú pegas en la caja de texto. La IA tiene instrucción explícita de no inventar cifras — si un insight no tiene dato duro en tu texto, lo marca como "necesita refuerzo" en vez de inventarlo.

Referencia en grande