HiAPI
Blog

Tutoriel

Maintenir la cohérence des personnages avec Nano-Banana sur hiapi : un workflow exploitable pour le storyboard et l'e-commerce

La technique de la « character bible » (bible de personnage) permet de garder le même visage, la même tenue et la même présence dans des scènes radicalement différentes — démontré de bout en bout sur Nano-Banana via le point de terminaison asynchrone /v1/tasks de hiapi, avec un budget estimé actuel de 0,41 $.

Jun 16, 2026
Maintenir la cohérence des personnages avec Nano-Banana sur hiapi : un workflow exploitable pour le storyboard et l'e-commerce

Résumé

Si vous avez déjà essayé de générer un personnage récurrent — une mascotte de storyboard, un porte-parole de marque, un mannequin d'essayage e-commerce — vous connaissez déjà le mode d'échec : chaque rendu est « une personne qui ressemble à peu près à la même », et dès que vous mettez deux images côte à côte, l'écart saute aux yeux. La gamme Nano-Banana sur hiapi est précisément calibrée pour ce problème. Cet article décrit le workflow que j'utilise réellement :

  • Trois modèles Nano-Banana sur hiapi, tous étiquetés cohérence des personnages : nano-banana (prix fixe 0,05 $), nano-banana-2 (0,036 $ / 0,057 $ / 0,086 $ en 1K / 2K / 4K respectivement), et nano-banana-pro (0,057 $ en 1K et 2K, 0,10 $ en 4K). Les trois sont des tâches asynchrones derrière POST /v1/tasks.
  • L'astuce, c'est la character bible, pas l'image de référence. Une chaîne descriptive dense, répétable et déterministe, ajoutée en préfixe à chaque prompt par scène. Pas d'image-en-image, pas de fine-tuning, pas de LoRA. Elle survit aux montées de version des modèles et se versionne très facilement dans le contrôle de source.
  • Deux démonstrations dans cet article, toutes deux rendues en direct via hiapi : une séquence de storyboard en quatre images où le même personnage (« Mira ») apparaît sous des lumières et dans des lieux radicalement différents ; et une séquence e-commerce en trois images où le même mannequin (« Aria ») réalise un changement de tenue.
  • Les sept rendus Nano-Banana coûtent 0,35 $ au total. Un rendu Pro supplémentaire de Mira pour comparer la qualité côte à côte coûte 0,057 $. Budget total estimé de cet article : 0,41 $.

Ce que signifie vraiment « cohérence des personnages » en pratique

La cohérence n'est pas une propriété unique — c'est un petit ensemble de propriétés qui doivent toutes tenir simultanément à travers plusieurs rendus pour que le résultat donne l'impression d'être la même personne :

  1. La géométrie du visage. Écartement des yeux, longueur du nez, largeur de la mâchoire, volume des joues.
  2. Les marques de peau et de cheveux. Teint, taches de rousseur ou grain de beauté, couleur et texture des cheveux.
  3. Les vêtements et accessoires. Cette veste précise, ce bonnet précis, cette ceinture à outils précise.
  4. La présence. Le répertoire de postures et d'expressions — la manière dont ce personnage se présente.

Quand le prompt est suffisamment dense, les modèles Nano-Banana sur hiapi gèrent très bien les points 1, 2 et 3. Le point 4 dépend de vous — l'auteur — qui devez inscrire dans la character bible des indices de posture et d'expression, pas seulement l'apparence.

Les trois modèles Nano-Banana sur hiapi

Extrait du catalogue /api/pricing en direct au moment de la rédaction :

Modèle Paliers de résolution Prix (USD/image) Pourquoi le choisir
nano-banana Format d'image uniquement, pas de paramètre de résolution Fixe 0,05 $ Itération rapide. Le modèle pour ébaucher un personnage.
nano-banana-2 1K / 2K / 4K 0,036 $ / 0,057 $ / 0,086 $ Sortie 4K, rendu des petits textes bien meilleur. Sous la politique actuelle, le palier 2K coûte plus cher que le 1K.
nano-banana-pro 1K / 2K / 4K 0,057 $ / 0,057 $ / 0,10 $ Détails plus nets, micro-caractéristiques plus profondes, identité la plus tenace face à des changements de scène drastiques.

Les trois acceptent input.prompt plus input.aspect_ratio. Les variantes Pro et -2 acceptent en plus input.resolution (l'une des valeurs 1K / 2K / 4K). Le nano-banana à prix fixe rejette le champ resolution avec une erreur 400 — ne le définissez que si vous avez choisi un modèle à paliers.

Ma règle empirique :

  • Itérez sur la bible avec le palier 1K de nano-banana-2 — à 0,036 $, c'est actuellement le moins cher des trois.
  • Rendez les lots de production avec le palier 1K ou 2K de nano-banana-2. En 2K, le prix est de 0,057 $, identique à Pro, donc si vous avez besoin de 2K de toute façon, Pro vaut le coup d'essayer.
  • Les plans héros — l'image qui finira en page d'accueil, dans le kit média, dans le lookbook imprimé — utilisez nano-banana-pro.

La technique de la character bible

Une character bible est un paragraphe dense que vous ajoutez en préfixe à chaque prompt de ce personnage. Elle doit être assez précise pour que le modèle n'ait nulle part où dériver, mais pas au point de vous priver de marge pour la scène.

Voici la bible exacte que j'ai écrite pour le personnage du storyboard de cet article :

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."
)

Cette bible comporte six choix délibérés :

  1. Donnez-lui un nom. « Mira » donne au modèle un identifiant stable. Même si le nom n'apparaît pas dans l'image, sa présence dans le prompt semble ancrer l'identité.
  2. Une origine métissée explicite, avec les deux moitiés nommées. « une femme » ou « asiatique » est vague. « philippino-polonaise » force le modèle à se fixer sur un métissage facial précis.
  3. Yeux, sourcils, cheveux et peau décrits séparément. Ne comptez pas sur « jolie » ou « naturelle ». Écrivez la géométrie clairement.
  4. Une marque faciale distinctive. Le grain de beauté sur la joue droite. Même s'il se déplace parfois, cette marque pousse le modèle dans un espace d'identité précis.
  5. Les vêtements sont nommés plutôt que décrits vaguement. « bonnet en laine orange rouille avec un petit écusson brodé en forme d'antenne » est répétable. « bonnet » ne l'est pas.
  6. Un sceau de style photographique à la fin. « Cinematic photography, 35mm lens look, natural film grain, neutral colour grade. » Cela maintient un langage de lumière cohérent entre des scènes par ailleurs très différentes.

Le prompt par scène n'est alors que : bible + séparateur + un court paragraphe de scène. J'utilise " | Scene: " comme séparateur. Il se lit clairement dans les logs, et le modèle traite la seconde partie comme une nouvelle requête.

Appeler le point de terminaison de tâches asynchrones de hiapi

Tous les modèles d'image sur hiapi suivent le même schéma asynchrone : POST /v1/tasks pour créer, GET /v1/tasks/{taskId} pour interroger, puis lecture de data.output[0].url une fois le succès obtenu pour récupérer l'image rendue. Les URL de sortie sont éphémères (avec un expireAt), donc téléchargez immédiatement les octets vers votre stockage.

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))

Pour Nano-Banana, un intervalle d'interrogation de 6 secondes est une bonne valeur par défaut — un jour où tout va bien, une image arrive en 10 à 60 secondes environ. Interroger plus fréquemment ne fait que gaspiller des allers-retours.

Démonstration A — un storyboard de quatre plans, un seul personnage

Tout l'intérêt du storyboard : ce qui change d'une planche à l'autre, c'est l'histoire — le protagoniste, lui, est la constante. Je vais générer une planche de modèle du personnage et deux plans de scène, tous avec exactement la même bible de Mira.

Étape 1 — Visualiser la bible

Avant de committer la bible dans le dépôt, rendez d'abord une planche de modèle avec elle. C'est la façon la moins chère de vérifier si la bible ancre suffisamment.

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."
    ),
)

Un détail notable s'est produit ici : bien que la bible précise explicitement « Cinematic photography, 35mm lens look », le modèle a produit une planche de modèle cartoon 3D. C'est le mode d'échec le plus courant lorsqu'on demande un « model sheet » ou un « character sheet » — ces tokens tirent l'esthétique vers les références de l'industrie de l'animation présentes dans les données d'entraînement. Deux façons de gérer :

  • L'accepter. La planche de modèle est un document de référence pour la bible, elle ne fait pas partie des livrables publiés. Les vêtements, accessoires et proportions générales sont visibles, ce qui est exactement ce dont vous avez besoin en pratique.
  • Repousser la tendance dans le fragment de scène avec "shot on Kodak Portra 400, full-frame DSLR, no illustration, no toon, no 3D render" — cela suffit généralement à ramener au photoréalisme.

J'ai choisi l'option 1 ici, car les deux plans de scène qui suivent sont les images de production.

Étape 2 — Placer la même Mira dans deux environnements complètement différents

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."
))

Les deux scènes n'ont rien en commun sur le plan environnemental — lumière tungstène chaude dans un petit espace intérieur contre lumière froide du jour en extérieur sur un toit ouvert. Mais le bonnet rouille avec l'écusson en forme d'antenne est identique, la veste en jean est identique, la ceinture à outils est identique, et le visage se lit comme la même jeune femme dans les deux images. C'est la bible qui fait son travail.

Ce qui change d'une scène à l'autre (et ce qui ne change pas)

Propriété Atelier Toit
Température de lumière Tungstène chaud Jour froid couvert
Posture Assise, penchée Agenouillée
Arrière-plan Intérieur encombré Toit urbain ouvert
Moment de la journée Nuit profonde Petit matin
Bonnet ✅ même orange rouille + écusson ✅ identique
Veste en jean ✅ même délavage ✅ identique
Ceinture à outils ✅ même cuir jaune ✅ identique
Géométrie du visage ✅ identique ✅ identique
Grain de beauté Sur la joue droite Présent (un peu plus pâle)

La dernière ligne est la plus importante. Sous deux éclairages complètement différents, le petit grain de beauté reste sur la joue droite. C'est exactement le signal que vous voulez.

Démonstration B — une séquence e-commerce en trois plans, un seul mannequin

L'e-commerce est la plus difficile des deux démonstrations de cet article. Le mannequin doit paraître littéralement identique entre plusieurs angles et changements de tenue, parce que les clients de la marque feront mentalement un A/B de ces photos sur la page produit. Même une légère dérive brise l'illusion.

Voici la bible d'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."
)

Cette bible fait trois choses que celle de Mira ne fait pas :

  • Elle verrouille la lumière et l'arrière-plan. Un mannequin de catalogue doit vivre sur un fond gris propre et sous une lumière de studio plate venant de l'avant-gauche. En écrivant les deux dans la bible, chaque rendu part de là.
  • Elle spécifie le cadrage. « Full-body framing, 50mm portrait lens look » se reproduit de manière cohérente sur les trois images.
  • Elle verrouille l'espace négatif. « No other jewellery » est une petite phrase qui empêche Nano-Banana d'improviser des chaînes ou une montre sur la moitié des rendus.

Étape 1 — L'image principale de face

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."
))

Une remarque honnête sur le rendu de la veste : le prompt demandait vert olive rouille, et Nano-Banana l'a interprété comme un brun tabac chaud. Les noms de couleur spécifiques de type Pantone (« rust-olive », « burnt sienna », « ultramarine ») ne se reproduisent pas de façon fiable en génération. Si vous avez besoin d'une couleur fidèle à la marque, rendez d'abord l'image de base, puis faites une passe image-en-image sur un modèle spécialisé en couleur — ou achetez une seule image colorimétriquement exacte avec nano-banana-pro uniquement pour le moment du plan héros, et acceptez le prix.

Étape 2 — Angle de trois-quarts, même tenue

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."
))

C'est précisément la partie qui échoue toujours dans les démonstrations de cohérence des personnages : la même personne, tournée. Le visage doit rester cohérent, la coiffure doit rester cohérente, et la façon dont le vêtement tombe sur elle doit rester cohérente. Côte à côte, les deux photos se lisent comme la même séance — même mannequin, même feuille de service, même chaise de maquillage. C'est le résultat qu'il vous faut.

Étape 3 — Le même mannequin, une tenue complètement différente

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."
))

C'est la démonstration qui vaut à Nano-Banana son étiquette de cohérence des personnages. Même visage, même grain de beauté sous l'œil gauche, même longueur et même raie de cheveux, mêmes petites boucles d'oreilles dorées, même vocabulaire de posture — seuls le vêtement et la silhouette changent. Si vous construisez un flux d'essayage virtuel, un générateur automatique de lookbook ou une série de photos PDP produites en masse, c'est exactement la transformation que vous exécuterez des milliers de fois.

Quand utiliser Nano-Banana-Pro

J'ai rendu une Mira supplémentaire sur nano-banana-pro au palier 1K, estimation actuelle : 0,057 $, juste pour ancrer le compromis coût/qualité :

La même bible de Mira. Le même séparateur " | Scene: ". Seul le nom du modèle a changé. Ce que vous obtenez concrètement pour 0,007 $ de plus par image (0,057 $ pour Pro contre 0,05 $ pour le Nano-Banana à prix fixe) :

  • Des micro-détails plus nets — cheveux individuels, texture du jean, écusson brodé sur le bonnet.
  • Une meilleure tenue des marqueurs d'identité moins évidents — la forme des yeux et la ligne des sourcils se lisent davantage comme le reste de la série de Mira.
  • Un meilleur rendu des petits textes. Si votre scène nécessite une enseigne, une étiquette ou un logo lisible à la taille d'une vignette, c'est Pro qu'il vous faut.

Pour les usages à fort volume (par exemple des centaines d'images par jour pour du storyboard ou de la génération de catalogue programmatique), le palier 1K de nano-banana-2 à 0,036 $ est la bonne valeur par défaut. Pro coûte 0,057 $ en 1K comme en 2K, soit le même prix que le 2K de nano-banana-2, donc utilisez-le là où vous avez besoin de 2K ou pour les plans héros — images de couverture, visuels principaux de lookbook, fiches marketing.

Budget total estimé de cet article

Rendu Modèle Palier Estimation actuelle
Couverture (Mira centrale solaire) Nano-Banana 16:9 fixe 0,05 $
Planche de modèle du personnage Nano-Banana 3:2 fixe 0,05 $
Storyboard 1 — atelier Nano-Banana 3:2 fixe 0,05 $
Storyboard 2 — toit Nano-Banana 3:2 fixe 0,05 $
E-commerce — face Nano-Banana 3:4 fixe 0,05 $
E-commerce — profil Nano-Banana 3:4 fixe 0,05 $
E-commerce — changement de tenue Nano-Banana 3:4 fixe 0,05 $
Image de comparaison Pro Nano-Banana-Pro 3:2, 1K 0,057 $
Total 0,41 $

Huit images, un seul token Bearer, un seul point de terminaison HTTP, sans SDK à assembler, sans compte amont à gérer — c'est à cela que sert hiapi.

Les règles pratiques auxquelles je reviens sans cesse

  1. Écrivez la bible une seule fois, mettez-la dans le contrôle de source, dans un module de constantes. Traitez-la comme n'importe quelle autre chaîne de configuration. Versionnez-la.
  2. Un nom par bible. « Mira », « Aria ». Même si le modèle n'affiche jamais le nom, sa présence dans le prompt est un identifiant stable.
  3. Choisissez trois marqueurs d'identité et reposez-vous résolument dessus. Pour Mira, ce sont le bonnet avec l'écusson en forme d'antenne, la ceinture à outils jaune et le petit grain de beauté. Pour Aria, le grain de beauté, les cheveux séparés au milieu et les boucles d'oreilles dorées. Si ces trois éléments survivent à un rendu, le personnage survit.
  4. Ne faites pas confiance aux noms de couleur de type Pantone. « Rust-olive » a dérivé vers le brun tabac. Si la couleur compte, rendez puis corrigez en aval, ou utilisez Pro pour capturer délibérément une image de référence de la marque.
  5. Placez le sceau de style photographique à la fin de la bible. « Cinematic 35mm » ou « 50mm portrait lens, slight matte film finish » — le mettre à la fin lui permet de survivre à une troncature de prompt long.
  6. Rendez d'abord la planche de modèle du personnage, et attendez-vous à ce qu'elle dérive vers le cartoon. C'est normal. La planche est pour vous, pas pour la publication. Pour les plans de production, utilisez la même bible plus un fragment de prompt intra-scène pour maintenir le photoréalisme.
  7. Utilisez le 1K de nano-banana-2 (0,036 $) pour les brouillons et la production, et nano-banana-pro (0,057 $ en 1K comme en 2K) pour les plans héros et tout ce qui nécessite du 2K. Construisez un petit ordonnanceur côté client qui choisit le modèle à partir d'un paramètre quality et transmet la résolution appropriée.
  8. Le nano-banana à prix fixe rejette resolution. Conditionnez ce champ selon le nom du modèle côté client. C'est une erreur 400 apprise à la dure.

Voilà le workflow. Prenez une bible, choisissez trois marqueurs d'identité, construisez les fragments de scène, déclenchez via POST /v1/tasks, et la même personne sortira de l'autre côté de chaque rendu.

Vous préférez la voie de l'image de référence à la bible textuelle ? Ideogram 3.0 Character verrouille le personnage à partir d'une image de référence téléversée, et son guide de prompt montre les mêmes techniques sur des mascottes, des pages de livre d'histoires et des retouches avec masque.

Articles similaires

Voir tous les articles →

Commencez avec des artefacts IA persistants

Obtenez votre clé API et appelez des modèles d'image, de vidéo et d'audio via une API unique basée sur les tasks.

Lire la documentation de l'API