Tutorial
Mantener la consistencia de personaje con Nano-Banana en hiapi: un flujo de trabajo listo para storyboards y comercio electrónico
La técnica de la biblia de personaje (character bible) mantiene estable el mismo rostro, el mismo vestuario y el mismo temperamento en escenarios radicalmente distintos; se demuestra de extremo a extremo en Nano-Banana mediante el endpoint asíncrono /v1/tasks de hiapi, con un presupuesto estimado actual de $0.41.
Resumen
Si alguna vez has intentado generar un personaje recurrente —una mascota de storyboard, un embajador de marca, una modelo de probador virtual de comercio electrónico— ya conoces el modo de fallo: cada renderizado es «una persona que se parece más o menos a la misma», y en cuanto pones dos fotogramas lado a lado, las diferencias saltan a la vista con crudeza. La familia Nano-Banana de hiapi está ajustada precisamente para este problema. Este artículo es el flujo de trabajo que uso realmente:
- Tres modelos Nano-Banana en hiapi, todos con la etiqueta de consistencia de personaje:
nano-banana(precio fijo de $0.05),nano-banana-2(1K / 2K / 4K a $0.036 / $0.057 / $0.086 respectivamente) ynano-banana-pro(1K y 2K a $0.057, 4K a $0.10). Los tres son tareas asíncronas detrás dePOST /v1/tasks. - La técnica es la biblia de personaje, no la imagen de referencia. Una cadena de descripción densa, repetible y determinista que se concatena como prefijo a cada prompt por escena. Sin imagen a imagen, sin ajuste fino, sin LoRA. Sobrevive a las actualizaciones del modelo y es facilísima de versionar en el control de código fuente.
- Dos demostraciones en este artículo, ambas renderizadas en vivo a través de hiapi: una secuencia de storyboard de cuatro imágenes con el mismo personaje («Mira») apareciendo en luces y lugares radicalmente distintos; y una secuencia de comercio electrónico de tres imágenes con la misma modelo («Aria») completando un cambio de vestuario.
- Los siete renderizados de Nano-Banana cuestan $0.35 en total. Un renderizado adicional de Mira en el nivel Pro para comparar calidad lado a lado cuesta $0.057. Presupuesto total estimado del artículo: $0.41.

Qué significa realmente «consistencia de personaje» en la práctica
La consistencia no es una propiedad única: es un pequeño grupo de propiedades que deben cumplirse simultáneamente en varios renderizados para que el resultado se sienta como la misma persona:
- Geometría facial. Distancia entre ojos, longitud de la nariz, anchura de la mandíbula, volumen de las mejillas.
- Marcas de piel y cabello. Tono, pecas o lunares, color y textura del cabello.
- Vestuario y accesorios. Esa chaqueta concreta, ese gorro de lana concreto, ese cinturón de herramientas concreto.
- Temperamento. El repertorio de posturas y expresiones: la forma en que este personaje se muestra.
Cuando el prompt es suficientemente denso, los modelos Nano-Banana de hiapi manejan bien los puntos 1, 2 y 3. El punto 4 depende de ti —el autor— al incluir en la biblia de personaje pistas de postura y expresión, no solo de apariencia.
Los tres modelos Nano-Banana en hiapi
Extraído del catálogo en vivo de /api/pricing en el momento de escribir:
| Modelo | Nivel de resolución | Precio (USD/imagen) | Motivo para elegirlo |
|---|---|---|---|
nano-banana |
Solo relación de aspecto, sin parámetro de resolución | Fijo $0.05 | Iteración rápida. El modelo con el que se redacta el personaje. |
nano-banana-2 |
1K / 2K / 4K | $0.036 / $0.057 / $0.086 | Salida 4K y mucha mejor capacidad de renderizar texto pequeño. Con la política actual, el nivel 2K es más caro que el 1K. |
nano-banana-pro |
1K / 2K / 4K | $0.057 / $0.057 / $0.10 | Detalle más nítido, microcaracterísticas más profundas y la identidad más tenaz ante cambios drásticos de escena. |
Los tres aceptan input.prompt más input.aspect_ratio. Las variantes Pro y -2 aceptan además input.resolution (uno de 1K / 2K / 4K). El nano-banana de precio fijo rechaza el campo resolution con un 400; solo lo estableces cuando has elegido un modelo por niveles.
Mi regla práctica:
- Itera la biblia en el nivel 1K de
nano-banana-2: $0.036 es ahora el más barato de los tres. - Renderiza los lotes de producción en el nivel 1K o 2K de
nano-banana-2. A 2K el precio es $0.057, igual que Pro, así que si de todos modos necesitas 2K, vale la pena probar Pro. - La toma principal —el fotograma que acaba en la portada, en el kit de prensa, en el lookbook impreso— renderízala con
nano-banana-pro.
La técnica de la biblia de personaje
Una biblia de personaje es un párrafo denso que concatenas como prefijo a cada prompt de ese personaje. Debe ser lo bastante concreta para que el modelo no tenga por dónde divagar, pero no tan prescriptiva que te deje sin margen para la escena.
Esta es la biblia exacta que escribí para el personaje del storyboard de este artículo:
MIRA = (
"Mira, a 28-year-old field engineer of mixed Filipina–Polish "
"heritage, warm olive skin, narrow oval face, dark almond eyes "
"with light crow's-feet, thick straight black eyebrows, a small "
"mole on the right cheek, shoulder-length wavy black hair tied "
"loosely behind, rust-orange beanie with a small embroidered "
"antenna patch, dust-faded denim jacket over a graphite grey "
"t-shirt, dark cargo trousers, scuffed brown leather work boots, "
"a battered yellow toolbelt, friendly determined expression. "
"Cinematic photography, 35mm lens look, natural film grain, "
"neutral colour grade."
)
Esta biblia tiene seis decisiones deliberadas:
- Darle un nombre. «Mira» le da al modelo un identificador estable. Aunque el nombre no aparezca en la imagen, tenerlo en el prompt parece anclar la identidad.
- Antepasados mixtos explícitos, con ambas partes nombradas. «Una mujer» o «asiática» es vago. «Filipina–polaca» obliga al modelo a aterrizar en una fusión facial concreta.
- Ojos, cejas, cabello y piel descritos por separado. No confíes en «bonita» o «natural». Escribe la geometría con claridad.
- Una marca facial distintiva. El lunar en la mejilla derecha. Aunque a veces se desplace, tener esta marca empuja al modelo hacia un espacio de identidad concreto.
- El vestuario se nombra, no se describe a la ligera. «Gorro de lana naranja óxido con un pequeño parche bordado de antena» es repetible. «Sombrero» no.
- Un sello de estilo fotográfico al final. «Cinematic photography, 35mm lens look, natural film grain, neutral colour grade.» Esto mantiene coherente el lenguaje de la luz entre escenas por lo demás dispares.
Entonces el prompt por escena es simplemente: biblia + separador + un breve párrafo de escena. Yo uso " | Scene: " como separador. Se lee con claridad en los registros y el modelo trata la segunda mitad como una nueva petición.
Llamar al endpoint de tareas asíncronas de hiapi
Todos los modelos de imagen de hiapi siguen el mismo patrón asíncrono: POST /v1/tasks para crear, GET /v1/tasks/{taskId} para sondear, y al tener éxito se lee data.output[0].url para obtener la imagen renderizada. Las URL de salida son de corta duración (llevan expireAt), así que descarga los bytes a tu almacenamiento de inmediato.
import os, json, subprocess, time
API = "https://api.hiapi.ai/v1/tasks"
TOKEN = os.environ["HIAPI_TOKEN"]
def submit(model: str, prompt: str, aspect_ratio: str,
resolution: str | None = None) -> str:
payload = {
"model": model,
"input": {"prompt": prompt, "aspect_ratio": aspect_ratio},
}
# Only nano-banana-pro and nano-banana-2 accept `resolution`.
# The flat-priced nano-banana returns 400 on the extra field.
if resolution and model in ("nano-banana-pro", "nano-banana-2"):
payload["input"]["resolution"] = resolution
r = subprocess.run(
["curl", "-s", "-X", "POST", API,
"-H", f"Authorization: Bearer {TOKEN}",
"-H", "Content-Type: application/json",
"-d", json.dumps(payload)],
capture_output=True, text=True, timeout=70,
)
data = json.loads(r.stdout)
return data["data"]["taskId"]
def wait(task_id: str, timeout_s: int = 600) -> str:
deadline = time.time() + timeout_s
while time.time() < deadline:
r = subprocess.run(
["curl", "-s", f"{API}/{task_id}",
"-H", f"Authorization: Bearer {TOKEN}"],
capture_output=True, text=True, timeout=40,
)
task = json.loads(r.stdout)["data"]
if task["status"] == "success":
return task["output"][0]["url"]
if task["status"] == "fail":
raise RuntimeError(task["error"])
time.sleep(6)
raise RuntimeError(f"timeout: {task_id}")
def render(model, scene, ratio, bible, resolution=None):
prompt = f"{bible} | Scene: {scene}"
return wait(submit(model, prompt, ratio, resolution))
Para Nano-Banana, un intervalo de sondeo de 6 segundos es un valor predeterminado adecuado: en un día con buena salud, una sola imagen aterriza en unos 10–60 segundos. Sondear con más frecuencia solo desperdicia viajes de ida y vuelta.
Demostración A — un storyboard de cuatro tomas con el mismo personaje
El sentido mismo del storyboard: lo que cambia entre viñetas es la historia; la protagonista es la constante. Voy a generar una hoja de modelo del personaje y dos tomas de escena, todas usando exactamente la misma biblia de Mira.
Paso 1 — Visualizar la biblia
Antes de enviar la biblia al repositorio, renderiza con ella una hoja de modelo del personaje. Es la forma más barata de averiguar si la biblia ancla lo suficiente.
sheet = render(
"nano-banana", aspect_ratio="3:2", bible=MIRA, scene=(
"a character model sheet on a clean white studio background, "
"three views of Mira side by side — three-quarter view facing "
"left, full profile facing right, three-quarter back view — "
"same outfit, same hairstyle, same toolbelt, even neutral "
"studio lighting, no shadows, no text labels."
),
)

Aquí ocurrió algo notable: aunque la biblia dice explícitamente «Cinematic photography, 35mm lens look», el modelo produjo una hoja de modelo de dibujos animados 3D. Este es el modo de fallo más común cuando se pide una «model sheet» o «character sheet»: esos tokens arrastran la estética hacia las referencias de la industria de la animación del conjunto de entrenamiento. Hay dos maneras de manejarlo:
- Aceptarlo. La hoja de modelo es un documento de referencia de la biblia, no parte del entregable publicable. La ropa, los accesorios y las proporciones generales se ven, que es justo lo que necesitas.
- Empujar en sentido contrario en el fragmento de escena con
"shot on Kodak Portra 400, full-frame DSLR, no illustration, no toon, no 3D render": suele bastar para devolverlo al fotorrealismo.
Aquí elegí la opción 1, porque las dos tomas de escena siguientes son los fotogramas de producción.
Paso 2 — Colocar a la misma Mira en dos entornos completamente distintos
workshop = render("nano-banana", "3:2", MIRA, scene=(
"Mira in a cluttered repair workshop, leaning over a wooden "
"workbench under a single warm hanging bulb, reading a circuit "
"schematic on tablet, soldering iron beside her, walls lined "
"with scavenged parts, late evening, focused expression."
))
rooftop = render("nano-banana", "3:2", MIRA, scene=(
"Mira on a city rooftop in cold overcast morning light, kneeling "
"to bolt a small antenna mast to a ledge, wind moving her hair, "
"distant grey buildings, breath barely visible, concentrated "
"working expression."
))


Las dos escenas no tienen nada en común en cuanto a entorno: luz cálida de tungsteno en un espacio interior reducido frente a luz fría de día en una azotea abierta. Pero el gorro de lana óxido con parche de antena es el mismo, la chaqueta vaquera es la misma, el cinturón de herramientas es el mismo, y el rostro se lee como la misma mujer joven en ambas imágenes. Eso es la biblia haciendo su trabajo.
Qué cambió entre escenas (y qué no)
| Propiedad | Taller | Azotea |
|---|---|---|
| Temperatura de luz | Tungsteno cálido | Día frío nublado |
| Postura | Sentada, inclinada | Arrodillada |
| Fondo | Interior desordenado | Azotea urbana abierta |
| Hora del día | Noche cerrada | Primera mañana |
| Gorro de lana | ✅ Mismo naranja óxido + parche | ✅ Igual |
| Chaqueta vaquera | ✅ Mismo lavado | ✅ Igual |
| Cinturón de herramientas | ✅ Mismo cuero amarillo | ✅ Igual |
| Geometría facial | ✅ Igual | ✅ Igual |
| Lunar | En la mejilla derecha | Presente (algo tenue) |
La última fila es la más importante. Bajo dos condiciones de luz completamente distintas, el pequeño lunar permanece en la mejilla derecha. Esa es exactamente la señal que buscas.
Demostración B — una secuencia de comercio electrónico de tres tomas con la misma modelo
El comercio electrónico es la más difícil de las dos demostraciones de este artículo. La modelo debe verse literalmente idéntica entre varios ángulos y cambios de vestuario, porque los clientes de la marca harán un A/B mental de estas fotos en la página de detalle del producto. Incluso una deriva mínima rompe la ilusión.
Esta es la biblia de Aria:
ARIA = (
"Aria, a 26-year-old fashion catalogue model of Korean descent, "
"soft warm undertone skin, oval face with slightly defined "
"cheekbones, thin straight black eyebrows, dark brown almond "
"eyes, small natural lips with a faint warm pink, a single "
"beauty mark just below the left eye, centre-parted glossy "
"black hair falling straight to mid-back, ears pierced with a "
"single small gold stud each side, no other jewellery, calm "
"neutral expression, even soft studio lighting from front-left, "
"clean light grey seamless paper backdrop, full-body framing, "
"50mm portrait lens look, neutral colour balance, slight matte "
"film finish."
)
Esta biblia hace tres cosas que la biblia de Mira no hace:
- Fija la luz y el fondo. Una modelo de catálogo debe vivir en un fondo gris limpio y con luz de estudio plana desde la parte frontal izquierda. Al escribir ambos en la biblia, cada renderizado parte de ahí.
- Especifica el encuadre. «Full-body framing, 50mm portrait lens look» se reproduce de forma consistente en las tres imágenes.
- Fija el espacio negativo. «No other jewellery» es una frase breve que impide que Nano-Banana improvise cadenas o relojes en la mitad de los renderizados.
Paso 1 — La imagen principal frontal
frontal = render("nano-banana", "3:4", ARIA, scene=(
"full-body straight-on frontal e-commerce shot, Aria standing "
"relaxed with arms at sides, wearing a structured rust-olive "
"wool blazer (single-breasted, two buttons, notch lapel, no "
"pattern) over a plain ivory crew-neck t-shirt and straight-leg "
"dark indigo denim jeans, simple white leather sneakers, clean "
"look-book composition."
))

Una nota de honestidad sobre el renderizado de la chaqueta: el prompt pedía verde oliva óxido, y Nano-Banana lo interpretó como un marrón tabaco cálido. Los nombres de color específicos al estilo Pantone («rust-olive», «burnt sienna», «ultramarine») no se reproducen de forma fiable en la generación. Si necesitas colores fieles a la marca, renderiza primero la imagen base y luego haz una pasada de imagen a imagen en un modelo especializado en color; o compra una muestra de color fiel solo para el momento de la imagen principal con nano-banana-pro y acepta el precio.
Paso 2 — Ángulo de tres cuartos, mismo vestuario
side = render("nano-banana", "3:4", ARIA, scene=(
"full-body three-quarter angle from her right, Aria standing "
"relaxed, wearing the same structured rust-olive wool blazer "
"(single-breasted, two buttons, notch lapel, no pattern) over "
"a plain ivory crew-neck t-shirt and straight-leg dark indigo "
"denim jeans, simple white leather sneakers, hands by her "
"sides, look-book lighting."
))

Esta es exactamente la parte en la que las demostraciones de consistencia de personaje siempre fallan: la misma persona, rotada. El rostro debe mantenerse coherente, el peinado debe mantenerse coherente y la forma en que la ropa le cae también. Vistas lado a lado, las dos fotos se leen como de la misma sesión: la misma modelo, la misma hoja de llamado, la misma silla de maquillaje. Ese es el resultado que necesitas.
Paso 3 — La misma modelo, un vestuario completamente distinto
swap = render("nano-banana", "3:4", ARIA, scene=(
"full-body straight-on frontal e-commerce shot, Aria standing "
"relaxed with arms at sides, now wearing an oversized "
"camel-coloured double-breasted wool overcoat (mid-thigh length, "
"wide lapels, large mother-of-pearl buttons) over a black "
"turtleneck and straight-leg charcoal trousers, black ankle "
"boots, look-book lighting."
))

Esta es la demostración que le gana a Nano-Banana la etiqueta de consistencia de personaje. El mismo rostro, el mismo lunar bajo el ojo izquierdo, la misma longitud y raya del cabello, los mismos pendientes de oro, el mismo vocabulario de pose: solo cambian la ropa y la silueta. Si estás construyendo un flujo de probador virtual, un generador automático de lookbooks o una sesión de PDP producida en lote, esta es exactamente la transformación que ejecutarás miles de veces.
Cuándo conviene usar Nano-Banana-Pro
Rendericé además una Mira en el nivel 1K de nano-banana-pro, estimación actual: $0.057, solo para anclar el equilibrio entre coste y calidad:

La misma biblia de Mira. El mismo separador " | Scene: ". Solo cambió el nombre del modelo. Lo que realmente obtienes pagando $0.007 más por imagen (los $0.057 de Pro frente a los $0.05 del Nano-Banana de precio fijo) es:
- Microdetalle más nítido: cabellos individuales, la trama del denim, el parche bordado del gorro de lana.
- Mejor conservación de las marcas de identidad menos evidentes: la forma de los ojos y la pendiente de las cejas se leen más como el resto de la serie de Mira.
- Mejor renderizado de texto pequeño. Si tu escena necesita un rótulo, una etiqueta o un logotipo legible a tamaño de miniatura, Pro es lo que quieres.
Para escenarios de alto volumen (como cientos de fotogramas de storyboard al día o generación programática de catálogos), el nivel 1K de nano-banana-2 a $0.036 es el valor predeterminado adecuado. Pro cuesta $0.057 tanto en 1K como en 2K, igual que el 2K de nano-banana-2, así que úsalo donde necesites 2K o fotogramas principales: portadas, imágenes principales de lookbook, hojas de marketing.
Presupuesto estimado actual de este artículo
| Renderizado | Modelo | Nivel | Estimación actual |
|---|---|---|---|
| Portada (Mira en la planta solar) | Nano-Banana | 16:9 fijo | $0.05 |
| Hoja de modelo de personaje | Nano-Banana | 3:2 fijo | $0.05 |
| Storyboard 1 — Taller | Nano-Banana | 3:2 fijo | $0.05 |
| Storyboard 2 — Azotea | Nano-Banana | 3:2 fijo | $0.05 |
| Comercio electrónico — Frontal | Nano-Banana | 3:4 fijo | $0.05 |
| Comercio electrónico — Lateral | Nano-Banana | 3:4 fijo | $0.05 |
| Comercio electrónico — Cambio de vestuario | Nano-Banana | 3:4 fijo | $0.05 |
| Imagen comparativa Pro | Nano-Banana-Pro | 3:2, 1K | $0.057 |
| Total | $0.41 |
Ocho imágenes, un token Bearer, un endpoint HTTP, sin necesidad de montar un SDK, sin gestionar cuentas de proveedores: para eso sirve hiapi.
Reglas prácticas a las que vuelvo una y otra vez
- Escribe la biblia una sola vez, guárdala en el control de código fuente, en un módulo de constantes. Trátala como cualquier otra cadena de configuración. Versiona.
- Un nombre por biblia. «Mira», «Aria». Aunque el modelo nunca muestre el nombre, tenerlo en el prompt es un identificador estable.
- Elige tres marcas de identidad y apóyate en ellas sin piedad. Para Mira son el gorro de lana con parche de antena, el cinturón de herramientas amarillo y el pequeño lunar. Para Aria son el lunar de belleza, la raya al medio y los pendientes de oro. Si estas tres sobreviven a un renderizado, el personaje sobrevive.
- No confíes en los nombres de color estilo Pantone. «Rust-olive» derivó hacia el marrón tabaco. Si el color importa, renderiza y corrige después, o usa Pro y captura deliberadamente una muestra de color de la marca.
- Pon el sello de estilo fotográfico al final de la biblia. «Cinematic 35mm» o «50mm portrait lens, slight matte film finish»: ponerlo al final le permite sobrevivir a los truncamientos de prompts largos.
- Renderiza primero la hoja de modelo de personaje y espera que derive hacia lo caricaturesco. Es normal. La hoja de modelo es para ti, no para publicar. Para las tomas de producción usa la misma biblia más el fragmento de prompt dentro de la escena, y mantén el fotorrealismo.
- Usa el 1K de
nano-banana-2($0.036) para borradores y producción en serie, ynano-banana-pro($0.057 tanto en 1K como en 2K) para tomas principales y cualquier cosa que necesite 2K. Construye un pequeño despachador en el cliente que elija el modelo a partir de un parámetroqualityy reenvíe la resolución correcta. - El
nano-bananade precio fijo rechazaresolution. Controla ese campo por nombre de modelo en el cliente. Es un 400 aprendido con lágrimas.
Ese es el flujo de trabajo. Toma una biblia, elige tres marcas de identidad, construye los fragmentos de escena, dispáralos mediante POST /v1/tasks, y la misma persona saldrá por el otro extremo de cada renderizado.
¿Prefieres la ruta de la imagen de referencia antes que la biblia de texto? Ideogram 3.0 Character fija el personaje a partir de una imagen de referencia subida, y su guía de prompts muestra las mismas técnicas en mascotas, páginas de libros de cuentos y ediciones con máscara.
Artículos relacionados
Ver todos los artículos →-
Tutorial
Cómo llamar a hailuo-2.3-fast/image-to-video a través de la API de HiAPI: práctica con curl y Python
La primera solicitud ejecutable del nivel rápido y de bajo coste de imagen a vídeo: del ID del modelo a la descarga del MP4
-
Tutorial
Cómo llamar a hailuo-2.3/text-to-video mediante la API de HiAPI: curl, Python y ejemplos de solicitud ejecutables
-
Tutorial
Uso de Kandinsky 6.0 Pro texto a video en HiAPI: tutorial con curl y Python
Demostración práctica centrada en la solicitud: construir la llamada de prompt a clip de video, enviar la solicitud, sondear el estado de finalización y descargar el resultado