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.
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), enano-banana-pro(1K e 2K por $0.057, 4K por $0.10). Todos os três são tarefas assíncronas por trás dePOST /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:
- Geometria facial. Distância entre os olhos, comprimento do nariz, largura do maxilar, volume das bochechas.
- Marcas de pele e cabelo. Tom de pele, sardas ou sinais, cor e textura do cabelo.
- Roupas e acessórios. Aquela jaqueta específica, aquele gorro específico, aquele cinto de ferramentas específico.
- 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:
- 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.
- 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.
- Olhos, sobrancelhas, cabelo e pele descritos separadamente. Não confie em "bonita" ou "natural". Escreva a geometria com clareza.
- 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.
- 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 é.
- 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
- 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.
- Um nome por bible. "Mira", "Aria". Mesmo que o modelo nunca exiba o nome, tê-lo no prompt é um identificador estável.
- 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.
- 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.
- 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.
- 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.
- Use
nano-banana-21K ($0.036) para rascunhos e produção em massa, enano-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âmetroqualitye encaminhe a resolução correta. - O
nano-bananade preço fixo rejeitaresolution. 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 →-
Tutorial
Como chamar hailuo-2.3-fast/image-to-video pela API HiAPI: curl e Python na prática
A primeira requisição executável do nível rápido e econômico de geração de vídeo a partir de imagem — do ID do modelo ao download do MP4
-
Tutorial
Como chamar hailuo-2.3/text-to-video pela API HiAPI: curl, Python e exemplos de requisição executáveis
-
Tutorial
Usar Kandinsky 6.0 Pro text-to-video na HiAPI: tutorial de curl e Python
Demonstração prática com foco na requisição: montar a chamada de prompt para clipe de vídeo, enviar a requisição, consultar o status de conclusão e baixar o resultado