HiAPI
Blogue

Tutorial

Mantendo a consistência de personagens com o Nano-Banana na hiapi: um fluxo de trabalho utilizável para storyboards e e-commerce

A técnica de character bible mantém o mesmo rosto, o mesmo guarda-roupa e o mesmo temperamento estáveis em cenários completamente diferentes — demonstrado de ponta a ponta no Nano-Banana através do endpoint assíncrono /v1/tasks da hiapi, com orçamento atual estimado em $0.41.

Jun 16, 2026
Mantendo a consistência de personagens com o Nano-Banana na hiapi: um fluxo de trabalho utilizável para storyboards e e-commerce

Resumo

Se você já tentou gerar um personagem recorrente — um mascote de storyboard, um porta-voz de marca, uma modelo de prova virtual de e-commerce — você já conhece o modo de falha: cada renderização é "uma pessoa que quase parece a mesma", e assim que você coloca dois quadros lado a lado, as diferenças saltam aos olhos. A linha Nano-Banana na hiapi é ajustada exatamente para esse problema. Este artigo é o fluxo de trabalho que eu realmente uso:

  • Três modelos Nano-Banana na hiapi, todos com a tag de consistência de personagem: nano-banana (fixo em $0.05), nano-banana-2 (1K / 2K / 4K por $0.036 / $0.057 / $0.086), e nano-banana-pro (1K e 2K por $0.057, 4K por $0.10). Todos os três são tarefas assíncronas por trás de POST /v1/tasks.
  • A técnica é a character bible, não a imagem de referência. Uma string de descrição densa, repetível e determinística, concatenada como prefixo em cada prompt por cena. Sem image-to-image, sem fine-tuning, sem LoRA. Ela sobrevive a atualizações de modelo e é extremamente fácil de versionar no controle de código-fonte.
  • Duas demonstrações neste artigo, ambas renderizadas ao vivo via hiapi: uma sequência de storyboard de quatro imagens com o mesmo personagem ("Mira") em luzes e locais completamente diferentes; e uma sequência de e-commerce de três imagens com a mesma modelo ("Aria") completando uma troca de roupa.
  • Todas as sete renderizações Nano-Banana custam $0.35. Uma renderização extra de Mira no nível Pro para comparação lado a lado custa $0.057. Orçamento total estimado deste artigo: $0.41.

O que "consistência de personagem" realmente significa na prática

Consistência não é um atributo único — é um pequeno conjunto de atributos que devem se manter simultaneamente ao longo de várias renderizações para que o resultado pareça a mesma pessoa:

  1. Geometria facial. Distância entre os olhos, comprimento do nariz, largura do maxilar, volume das bochechas.
  2. Marcas de pele e cabelo. Tom de pele, sardas ou sinais, cor e textura do cabelo.
  3. Roupas e acessórios. Aquela jaqueta específica, aquele gorro específico, aquele cinto de ferramentas específico.
  4. Temperamento. Repertório de posturas e expressões — a forma como o personagem se apresenta.

Quando o prompt é suficientemente denso, os modelos Nano-Banana na hiapi lidam bem com os pontos 1, 2 e 3. O ponto 4 depende de você — o autor — ao incluir pistas de postura e expressão na character bible, não apenas a aparência.

Os três modelos Nano-Banana na hiapi

Extraído do catálogo /api/pricing ao vivo no momento da escrita:

Modelo Faixa de resolução Preço (USD/imagem) Motivo da escolha
nano-banana Apenas proporção, sem parâmetro de resolução Fixo $0.05 Iteração rápida. O modelo usado para rascunhar o personagem.
nano-banana-2 1K / 2K / 4K $0.036 / $0.057 / $0.086 Saída em 4K, capacidade muito maior de renderizar textos pequenos. Sob a política atual, o nível 2K é mais caro que o 1K.
nano-banana-pro 1K / 2K / 4K $0.057 / $0.057 / $0.10 Detalhes mais nítidos, microcaracterísticas mais profundas, identidade mais resistente em mudanças drásticas de cena.

Os três aceitam input.prompt mais input.aspect_ratio. As variantes Pro e -2 também aceitam adicionalmente input.resolution (um de 1K / 2K / 4K). O nano-banana de preço fixo rejeita o campo resolution com 400 — defina-o apenas quando você escolher um modelo com faixas de resolução.

Minha regra prática:

  • Itere a bible no nível 1K do nano-banana-2 — a $0.036, é atualmente o mais barato dos três.
  • Renderize lotes de produção no nível 1K ou 2K do nano-banana-2. A 2K o preço é $0.057, igual ao Pro, então se você precisa de 2K de qualquer forma, vale a pena experimentar o Pro.
  • Para o takes de visual principal — o quadro que vai para a página inicial, o kit de mídia, o lookbook impresso — use nano-banana-pro.

A técnica da character bible

A character bible é um parágrafo denso que você concatena como prefixo em cada prompt do personagem. Ela precisa ser específica o suficiente para que o modelo não tenha para onde desviar, mas não tão prescritiva a ponto de você não ter espaço para a cena.

Esta é a bible exata que escrevi para o personagem do storyboard deste artigo:

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 bible tem seis decisões de design deliberadas:

  1. Dê um nome a ela. "Mira" dá ao modelo um identificador estável. Mesmo que o nome não apareça na imagem, tê-lo no prompt parece ancorar a identidade.
  2. Origem mestiça explícita, com ambas as metades nomeadas. "Uma mulher" ou "asiática" é vago. "Filipina–polonesa" força o modelo a convergir para uma mistura facial concreta.
  3. Olhos, sobrancelhas, cabelo e pele descritos separadamente. Não confie em "bonita" ou "natural". Escreva a geometria com clareza.
  4. Uma marca facial distintiva. O sinal na bochecha direita. Mesmo que ele se desloque ocasionalmente, ter essa marca empurra o modelo para um espaço de identidade específico.
  5. As roupas são nomeadas, não descritas vagamente. "Gorro de tricô laranja-ferrugem com um pequeno remendo bordado de antena" é repetível. "Chapéu" não é.
  6. Um selo de estilo fotográfico no final. "Cinematic photography, 35mm lens look, natural film grain, neutral colour grade." Isso mantém a linguagem de iluminação consistente entre cenas originalmente díspares.

Então o prompt por cena é apenas: bible + delimitador + um breve parágrafo de cena. Uso " | Scene: " como delimitador. Ele fica legível nos logs, e o modelo trata a segunda metade como uma nova solicitação.

Chamando o endpoint de tarefas assíncronas da hiapi

Todos os modelos de imagem na hiapi seguem o mesmo padrão assíncrono: POST /v1/tasks cria, GET /v1/tasks/{taskId} faz polling, e após o sucesso você lê data.output[0].url para obter a imagem renderizada. As URLs de saída são de curta duração (com expireAt), então baixe os bytes para o seu armazenamento imediatamente.

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 o Nano-Banana, um intervalo de polling de 6 segundos é um padrão razoável — num dia bom, uma única imagem fica pronta em cerca de 10–60 segundos. Um polling mais apertado só desperdiça round-trips.

Demonstração A — um storyboard de quatro tomadas, o mesmo personagem

O ponto central de um storyboard é: a história é o que muda entre os painéis — o protagonista é a constante. Vou gerar uma folha de modelo de personagem e duas tomadas de cena, todas usando exatamente a mesma bible da Mira.

Passo 1 — Visualizar a bible

Antes de enviar a bible para o repositório, renderize uma folha de modelo de personagem com ela. Essa é a forma mais barata de descobrir se a bible ancora o 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."
    ),
)

Aconteceu algo notável aqui: embora a bible diga explicitamente "Cinematic photography, 35mm lens look", o modelo produziu uma folha de modelo em desenho 3D. Esse é o modo de falha mais comum ao pedir "model sheet" ou "character sheet" — esses tokens puxam a estética para as referências da indústria de animação no conjunto de treino. Há duas formas de lidar com isso:

  • Aceite. A folha de modelo é o documento de referência da bible, não parte do entregável de publicação. Roupas, acessórios e proporções gerais são visíveis, que é exatamente o que você realmente precisa.
  • Recue no fragmento de cena com "shot on Kodak Portra 400, full-frame DSLR, no illustration, no toon, no 3D render" — geralmente suficiente para trazê-lo de volta ao fotorrealismo.

Optei pela abordagem 1 aqui, porque as duas tomadas de cena a seguir são os quadros de produção.

Passo 2 — Colocar a mesma Mira em dois ambientes completamente diferentes

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

As duas cenas não têm nada em comum ambientalmente — luz de tungstênio quente em um espaço interior apertado, contra luz do dia fria num telhado aberto. Mas o gorro de tricô ferrugem com o remendo de antena é o mesmo, a jaqueta jeans é a mesma, o cinto de ferramentas é o mesmo, e o rosto lê como a mesma jovem nas duas imagens. É a bible funcionando.

O que muda entre as cenas (e o que não muda)

Atributo Oficina Telhado
Temperatura da luz Tungstênio quente Nublado frio
Postura Sentada, debruçada Ajoelhada
Fundo Interior bagunçado Telhado urbano aberto
Hora do dia Noite avançada Início da manhã
Gorro de tricô ✅ Mesmo laranja-ferrugem + remendo ✅ Igual
Jaqueta jeans ✅ Mesmo lavado ✅ Igual
Cinto de ferramentas ✅ Mesmo couro amarelo ✅ Igual
Geometria facial ✅ Igual ✅ Igual
Sinal Na bochecha direita Presente (mais apagado)

A última linha é a mais importante. Sob duas condições de iluminação completamente diferentes, o pequeno sinal permanece na bochecha direita. Esse é exatamente o sinal que você quer.

Demonstração B — uma sequência de e-commerce de três tomadas, a mesma modelo

E-commerce é a mais difícil das duas demonstrações deste artigo. A modelo precisa parecer literalmente idêntica entre múltiplos ângulos e trocas de roupa, porque os clientes da marca farão um A/B mental dessas fotos na página de detalhes do produto. Até um pequeno desvio quebra a ilusão.

Esta é a bible da 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 bible faz três coisas que a bible da Mira não faz:

  • Ela fixa a iluminação e o fundo. Uma modelo de catálogo precisa viver num fundo cinza limpo e numa luz de estúdio plana vinda da frente-esquerda. Colocar ambos na bible faz com que toda renderização comece a partir daí.
  • Ela especifica o enquadramento. "Full-body framing, 50mm portrait lens look" é reproduzível de forma consistente nas três imagens.
  • Ela fixa o espaço negativo. "No other jewellery" é uma pequena frase que impede o Nano-Banana de improvisar correntes ou relógios em metade das renderizações.

Passo 1 — A imagem 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."
))

Uma nota honesta sobre a renderização do blazer: o prompt pedia verde-oliva ferrugem, e o Nano-Banana interpretou como um marrom-tabaco quente. Nomes de cor específicos no estilo Pantone ("rust-olive", "burnt sienna", "ultramarine") não são reproduzíveis de forma confiável na geração. Se você precisa de cores fiéis à marca, renderize a imagem base primeiro e depois rode um image-to-image num modelo especializado em cor — ou compre uma imagem de amostra com cor precisa usando nano-banana-pro apenas no momento da imagem principal, e aceite o preço.

Passo 2 — Ângulo de três quartos, mesmo look

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 é exatamente a parte em que as demonstrações de consistência de personagem sempre falham: a mesma pessoa, girada. O rosto precisa permanecer consistente, o penteado precisa permanecer consistente, e a forma como as roupas caem sobre ela também precisa permanecer consistente. Lado a lado, as duas fotos leem como o mesmo ensaio — a mesma modelo, a mesma folha de chamada, a mesma cadeira de maquiagem. Esse é o resultado que você precisa.

Passo 3 — A mesma modelo, um look completamente diferente

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 é a demonstração que rendeu ao Nano-Banana a tag de consistência de personagem. O mesmo rosto, a mesma marca de beleza sob o olho esquerdo, o mesmo comprimento e repartição de cabelo, os mesmos brincos de ouro — apenas as roupas e a silhueta mudam. Se você está construindo um fluxo de prova virtual, um gerador automático de lookbook, ou uma sessão de PDP produzida em massa, esta é exatamente a transformação que você vai executar milhares de vezes.

Quando usar o Nano-Banana-Pro

Renderizei uma Mira extra no nível 1K do nano-banana-pro, estimativa atual: $0.057, apenas para ancorar o trade-off entre custo e qualidade:

A mesma bible da Mira. O mesmo delimitador " | Scene: ". Apenas o nome do modelo mudou. O que você realmente ganha pagando $0.007 a mais por imagem (Pro a $0.057 contra o Nano-Banana fixo a $0.05):

  • Microdetalhes mais nítidos — fios de cabelo individuais, a trama do jeans, o remendo bordado no gorro de tricô.
  • Melhor retenção de marcas de identidade menos evidentes — o formato dos olhos e a inclinação das sobrancelhas leem mais como o resto da série da Mira.
  • Melhor renderização de textos pequenos. Se a sua cena precisa que uma placa, etiqueta ou logotipo seja legível no tamanho de miniatura, o Pro é o que você quer.

Para cenários de alto volume (como centenas de quadros de storyboard por dia ou geração programática de catálogo), o nível 1K do nano-banana-2 a $0.036 é o padrão adequado. O Pro custa $0.057 tanto em 1K quanto em 2K, o mesmo que o 2K do nano-banana-2, então use-o onde você precisa de 2K ou de quadros de imagem principal — imagens de capa, imagens principais de lookbook, folhetos de marketing.

Orçamento atual estimado deste artigo

Renderização Modelo Nível Estimativa atual
Capa (Mira na usina solar) Nano-Banana 16:9 fixo $0.05
Folha de modelo de personagem Nano-Banana 3:2 fixo $0.05
Storyboard 1 — Oficina Nano-Banana 3:2 fixo $0.05
Storyboard 2 — Telhado Nano-Banana 3:2 fixo $0.05
E-commerce — Frontal Nano-Banana 3:4 fixo $0.05
E-commerce — Lateral Nano-Banana 3:4 fixo $0.05
E-commerce — Troca de roupa Nano-Banana 3:4 fixo $0.05
Imagem comparativa Pro Nano-Banana-Pro 3:2, 1K $0.057
Total $0.41

Oito imagens, um Bearer token, um endpoint HTTP, sem precisar montar SDK, sem gerenciar contas upstream — é para isso que a hiapi serve.

Regras práticas às quais eu volto repetidamente

  1. Escreva a bible uma vez, coloque-a no controle de código-fonte, num módulo de constantes. Trate-a como qualquer outra string de configuração. Versione-a.
  2. Um nome por bible. "Mira", "Aria". Mesmo que o modelo nunca exiba o nome, tê-lo no prompt é um identificador estável.
  3. Escolha três marcas de identidade e dependa delas com força. Para Mira são o gorro de tricô com o remendo de antena, o cinto de ferramentas amarelo e o pequeno sinal. Para Aria são a marca de beleza, o cabelo repartido ao meio, e os brincos de ouro. Se esses três sobrevivem a uma renderização, o personagem sobrevive.
  4. Não confie em nomes de cor no estilo Pantone. "Rust-olive" desviou para marrom-tabaco. Se a cor importa, renderize primeiro e corrija a jusante, ou use o Pro e tire intencionalmente fotos de amostra da marca.
  5. Coloque o selo de estilo fotográfico no final da bible. "Cinematic 35mm" ou "50mm portrait lens, slight matte film finish" — colocá-lo por último faz com que ele sobreviva ao truncamento de prompts longos.
  6. Renderize a folha de modelo de personagem primeiro, e espere que ela desvie para o desenho animado. Isso é normal. A folha de modelo é para você, não para publicação. As tomadas de produção usam a mesma bible mais o fragmento de prompt dentro da cena, mantendo o fotorrealismo.
  7. Use nano-banana-2 1K ($0.036) para rascunhos e produção em massa, e nano-banana-pro ($0.057 tanto em 1K quanto em 2K) para tomadas de imagem principal e qualquer coisa que precise de 2K. Construa um pequeno despachante no cliente que escolha o modelo a partir de um parâmetro quality e encaminhe a resolução correta.
  8. O nano-banana de preço fixo rejeita resolution. Filtre esse campo por nome de modelo no cliente. Este é um 400 aprendido da pior forma.

Esse é o fluxo de trabalho. Pegue uma bible, escolha três marcas de identidade, construa seus fragmentos de cena, dispare via POST /v1/tasks, e a mesma pessoa sairá do outro lado de cada renderização.

Prefere a rota da imagem de referência à bible textual? O Ideogram 3.0 Character trava o personagem a partir de uma imagem de referência enviada, e o guia de prompts dele mostra as mesmas técnicas em mascotes, páginas de livros de histórias e edições com máscara.

Artigos relacionados

Ver todos os artigos →

Comece a criar com artefactos de IA persistentes

Obtenha a sua chave de API e chame modelos de imagem, vídeo e áudio através de uma única API baseada em tasks.

Ler a documentação da API