Руководство
Обеспечение консистентности персонажа с помощью Nano-Banana на hiapi: рабочий процесс для раскадровок и электронной коммерции
Техника «библии персонажа» (character bible) удерживает одно и то же лицо, один и тот же комплект одежды и одну и ту же ауру стабильными в совершенно разных сценах — сквозная демонстрация на Nano-Banana через асинхронные эндпоинты /v1/tasks от hiapi, текущий ориентировочный бюджет — $0.41.
Резюме
Если вы когда-нибудь пытались генерировать повторяющегося персонажа — талисман для раскадровки, лицо бренда, модель для виртуальной примерки в электронной коммерции — вы уже знаете, как это обычно ломается: каждый рендер — это «человек, который примерно похож», а стоит поставить два кадра рядом, и различия бьют в глаза. Серия Nano-Banana на hiapi как раз настроена под эту проблему. Эта статья — тот рабочий процесс, которым я реально пользуюсь:
- Три модели Nano-Banana на hiapi, все с меткой консистентности персонажа:
nano-banana(фиксированные $0.05),nano-banana-2(1K / 2K / 4K — $0.036 / $0.057 / $0.086 соответственно) иnano-banana-pro(1K и 2K — $0.057, 4K — $0.10). Все три — асинхронные задачи заPOST /v1/tasks. - Приём — это библия персонажа, а не референсное изображение. Плотная, повторяемая, детерминированная строка описания, которая добавляется как префикс к каждому посценному промпту. Без image-to-image, без дообучения, без LoRA. Она переживает обновления моделей и легко версионируется в системе контроля версий.
- Две демонстрации в этой статье, обе отрендерены в реальном времени через hiapi: последовательность из четырёх кадров раскадровки, где один и тот же персонаж («Mira») появляется при совершенно разном освещении и в разных местах; и последовательность из трёх кадров для электронной коммерции, где одна и та же модель («Aria») проходит через переодевание.
- Все семь рендеров Nano-Banana стоят $0.35. Дополнительный рендер Mira в тарифе Pro для сравнения качества рядом — $0.057. Общий ориентировочный бюджет статьи: $0.41.

Что «консистентность персонажа» значит на практике
Консистентность — это не одно свойство, а небольшой набор свойств, которые должны одновременно выполняться во всех рендерах, чтобы результат воспринимался как один и тот же человек:
- Геометрия лица. Расстояние между глазами, длина носа, ширина челюсти, объём щёк.
- Метки кожи и волос. Тон, веснушки или родинки, цвет и текстура волос.
- Одежда и аксессуары. Та самая куртка, та самая шапка, тот самый пояс с инструментами.
- Аура. Библиотека поз и выражений лица — то, как персонаж проявляет себя.
Когда промпт достаточно плотный, модели Nano-Banana на hiapi хорошо справляются с пунктами 1, 2 и 3. Пункт 4 — на вас, авторе: вписывайте подсказки по позам и выражениям лица в библию персонажа, а не только внешность.
Три модели Nano-Banana на hiapi
Из живого каталога /api/pricing на момент написания:
| Модель | Разрешения | Цена (долл. США за изображение) | Когда выбирать |
|---|---|---|---|
nano-banana |
Только соотношение сторон, без параметра разрешения | Фиксированные $0.05 | Быстрые итерации. Модель, на которой черновики персонажа. |
nano-banana-2 |
1K / 2K / 4K | $0.036 / $0.057 / $0.086 | Вывод в 4K, гораздо лучше рендерит мелкий текст. По текущей политике уровень 2K дороже 1K. |
nano-banana-pro |
1K / 2K / 4K | $0.057 / $0.057 / $0.10 | Более резкие детали, глубже микроособенности, самое стойкое сохранение идентичности при резких сменах сцены. |
Все три принимают input.prompt и input.aspect_ratio. Варианты Pro и -2 дополнительно принимают input.resolution (одно из 1K / 2K / 4K). Фиксированная по цене nano-banana отклоняет поле resolution с ошибкой 400 — задавайте его только когда выбрали модель с уровнями.
Моё эмпирическое правило:
- Итерируйте библию на
nano-banana-2в 1K — $0.036 сейчас самое дешёвое из трёх. - Рендерите производственные партии на
nano-banana-2в 1K или 2K. В 2K цена $0.057, как у Pro, так что если вам всё равно нужен 2K, Pro стоит попробовать. - Ключевые кадры — тот кадр, который попадёт на главную страницу, в медиакит, в печатный лукбук — рендерите на
nano-banana-pro.
Техника библии персонажа
Библия персонажа — это плотный абзац, который вы добавляете как префикс к каждому промпту для этого персонажа. Он должен быть достаточно конкретным, чтобы модели некуда было дрейфовать, но не настолько предписывающим, чтобы у вас не осталось места для сцены.
Вот точная библия, которую я написал для персонажа раскадровки в этой статье:
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."
)
В этой библии шесть намеренных решений:
- Дайте ей имя. «Mira» даёт модели стабильный идентификатор. Даже если имя не появляется на изображении, наличие имени в промпте, похоже, закрепляет идентичность.
- Смешанное происхождение указано явно, и обе половины названы. «Женщина» или «азиатка» — это расплывчато. «Филиппино-польская» заставляет модель прийти к конкретному смешению черт лица.
- Глаза, брови, волосы и кожа описаны по отдельности. Не полагайтесь на «красивая» или «естественная». Пишите геометрию явно.
- Одна уникальная метка на лице. Родинка на правой щеке. Даже если она иногда смещается, эта метка подталкивает модель в конкретное пространство идентичности.
- Одежда названа, а не описана в общих чертах. «Ржаво-оранжевая вязаная шапка с маленькой вышитой нашивкой-антенной» воспроизводима. «Шапка» — нет.
- В конце — фотографическая печать стиля. «Cinematic photography, 35mm lens look, natural film grain, neutral colour grade.» Это удерживает язык освещения согласованным между в остальном совершенно разными сценами.
Тогда посценный промпт — это просто: библия + разделитель + короткий абзац сцены. Я использую " | Scene: " как разделитель. В логах он читается ясно, а модель воспринимает вторую половину как новый запрос.
Вызов асинхронного эндпоинта задач hiapi
Все модели изображений на hiapi идут через один и тот же асинхронный шаблон: POST /v1/tasks создаёт задачу, GET /v1/tasks/{taskId} опрашивает её, а после успеха вы читаете data.output[0].url, чтобы получить отрендеренное изображение. Выходные URL живут недолго (с expireAt), поэтому сразу скачивайте байты в своё хранилище.
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))
Для Nano-Banana интервал опроса в 6 секунд — разумное значение по умолчанию: в хороший день одно изображение готово примерно за 10–60 секунд. Более частый опрос только тратит лишние запросы.
Демонстрация A — раскадровка из четырёх кадров с одним персонажем
Весь смысл раскадровки в том, что между кадрами меняется история, а главный герой остаётся константой. Я сгенерирую лист персонажа и два сценных кадра, все с абсолютно одной и той же библией Mira.
Шаг 1 — визуализируйте библию
Прежде чем коммитить библию в репозиторий, отрендерите с её помощью лист персонажа. Это самый дешёвый способ выяснить, достаточно ли библия закрепляет персонажа.
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."
),
)

Здесь произошло кое-что примечательное: хотя библия явно говорит «Cinematic photography, 35mm lens look», модель выдала 3D-мультяшный лист персонажа. Это самый частый режим отказа при запросе «model sheet» или «character sheet» — эти токены тянут эстетику к анимационным референсам из обучающего набора. Есть два способа с этим справиться:
- Принять это. Лист персонажа — это справочный документ библии, а не часть публикуемого результата. Одежда, аксессуары и примерные пропорции видны, а это именно то, что вам реально нужно.
- Оттолкнуть назад в сценном фрагменте с помощью
"shot on Kodak Portra 400, full-frame DSLR, no illustration, no toon, no 3D render"— обычно этого достаточно, чтобы вернуть фотореализм.
Я выбрал вариант 1, потому что следующие два сценных кадра и есть производственные кадры.
Шаг 2 — поместите ту же Mira в две совершенно разные среды
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."
))


У двух сцен нет ничего общего по окружению — тёплый вольфрамовый свет в тесном интерьере против холодного дневного света на открытой крыше. Но ржавая шапка с нашивкой-антенной та же, джинсовая куртка та же, пояс с инструментами тот же, и лицо на обоих кадрах читается как одна и та же молодая женщина. Вот библия и работает.
Что изменилось между сценами (а что нет)
| Свойство | Мастерская | Крыша |
|---|---|---|
| Температура света | Тёплый вольфрамовый | Холодный пасмурный |
| Поза | Сидя, склонившись | На коленях |
| Фон | Захламлённый интерьер | Открытая городская крыша |
| Время суток | Поздний вечер | Раннее утро |
| Вязаная шапка | ✅ Тот же ржаво-оранжевый + нашивка | ✅ Та же |
| Джинсовая куртка | ✅ Та же стирка | ✅ Та же |
| Пояс с инструментами | ✅ Та же жёлтая кожа | ✅ Тот же |
| Геометрия лица | ✅ Та же | ✅ Та же |
| Родинка | На правой щеке | Есть (чуть бледнее) |
Последняя строка — самая важная. При двух совершенно разных условиях освещения маленькая родинка осталась на правой щеке. Это именно тот сигнал, который вам нужен.
Демонстрация B — последовательность из трёх кадров для электронной коммерции с одной моделью
Электронная коммерция — более сложная из двух демонстраций в этой статье. Модель должна выглядеть буквально одинаково с разных ракурсов и при смене одежды, потому что покупатели бренда будут мысленно сравнивать эти фото на странице товара. Даже небольшой дрейф ломает иллюзию.
Вот библия 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."
)
Эта библия делает три вещи, которых библия Mira не делает:
- Она фиксирует свет и фон. Модель каталога должна жить на чистом сером фоне под плоским студийным светом слева спереди. Записав оба в библию, вы задаёте отправную точку для каждого рендера.
- Она задаёт кадрирование. «Full-body framing, 50mm portrait lens look» воспроизводимо согласуется во всех трёх кадрах.
- Она прибивает негативное пространство. «No other jewellery» — короткая фраза, которая не даёт Nano-Banana импровизировать с цепочками или часами в половине рендеров.
Шаг 1 — фронтальный главный кадр
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."
))

Честное замечание о рендере пиджака: в промпте был ржаво-оливковый, а Nano-Banana интерпретировала его как тёплый табачно-коричневый. Конкретные названия цветов в стиле Pantone («rust-olive», «burnt sienna», «ultramarine») не воспроизводятся надёжно в генерации. Если вам нужен точный цвет бренда, сначала отрендерите базовое изображение, а затем прогоните одно image-to-image на модели, специализирующейся на цвете, — или только для главного кадра купите на nano-banana-pro одно изображение с точным цветом и примите цену.
Шаг 2 — ракурс три четверти в той же одежде
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."
))

Именно здесь демонстрации консистентности персонажа обычно и ломаются: тот же человек, но повёрнутый. Лицо должно остаться тем же, причёска — той же, и то, как одежда сидит на ней, — тоже. Рядом эти два фото воспринимаются как одна съёмка — одна модель, один вызов на съёмку, одно кресло визажиста. Это и есть нужный результат.
Шаг 3 — та же модель, совершенно другая одежда
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."
))

Вот та демонстрация, которая и заслужила для Nano-Banana метку консистентности персонажа. То же лицо, та же родинка под левым глазом, та же длина волос и тот же пробор, те же золотые серьги-гвоздики, тот же словарь поз — меняются только одежда и силуэт. Если вы строите виртуальную примерку, автоматический генератор лукбуков или поток PDP-съёмок массового производства, это именно то преобразование, которое вы будете запускать тысячи раз.
Когда стоит использовать Nano-Banana-Pro
Я дополнительно отрендерил одну Mira на nano-banana-pro в 1K, текущая оценка: $0.057, просто чтобы закрепить компромисс между ценой и качеством:

Та же библия Mira. Тот же разделитель " | Scene: ". Изменено только имя модели. За $0.007 доплаты за изображение (Pro за $0.057 против фиксированных $0.05 у Nano-Banana) вы фактически получаете:
- Более резкие микродетали — отдельные волосы, текстуру денима, вышитую нашивку на вязаной шапке.
- Лучшее сохранение менее заметных меток идентичности — форма глаз и изгиб брови читаются больше похожими на остальную часть серии Mira.
- Лучший рендер мелкого текста. Если в вашей сцене нужна вывеска, бирка или логотип, читаемые в размере миниатюры, вам нужен Pro.
Для сценариев с высоким объёмом (например, сотни кадров раскадровки в день или программная генерация каталогов) nano-banana-2 в 1K за $0.036 — подходящее значение по умолчанию. Pro и в 1K, и в 2K стоит $0.057, столько же, сколько nano-banana-2 в 2K, поэтому используйте его там, где вам нужен 2K или главные кадры — обложки, главные изображения лукбука, маркетинговые одностраничники.
Текущий ориентировочный бюджет этой статьи
| Рендер | Модель | Уровень | Текущая оценка |
|---|---|---|---|
| Обложка (Mira на солнечной электростанции) | Nano-Banana | 16:9 фикс. | $0.05 |
| Лист персонажа | Nano-Banana | 3:2 фикс. | $0.05 |
| Раскадровка 1 — мастерская | Nano-Banana | 3:2 фикс. | $0.05 |
| Раскадровка 2 — крыша | Nano-Banana | 3:2 фикс. | $0.05 |
| Электронная коммерция — фронт | Nano-Banana | 3:4 фикс. | $0.05 |
| Электронная коммерция — сбоку | Nano-Banana | 3:4 фикс. | $0.05 |
| Электронная коммерция — переодевание | Nano-Banana | 3:4 фикс. | $0.05 |
| Сравнительный кадр Pro | Nano-Banana-Pro | 3:2, 1K | $0.057 |
| Итого | $0.41 |
Восемь изображений, один Bearer token, один HTTP-эндпоинт, не нужно собирать SDK, не нужно управлять вышестоящими аккаунтами — вот для чего нужен hiapi.
Практические правила, к которым я возвращаюсь снова и снова
- Напишите библию один раз, храните её в системе контроля версий, в модуле констант. Относитесь к ней как к любой другой конфигурационной строке. Версионируйте её.
- Одно имя на каждую библию. «Mira», «Aria». Даже если модель никогда не показывает имя, оно в промпте — стабильный идентификатор.
- Выберите три метки идентичности и жёстко опирайтесь на них. Для Mira это вязаная шапка с нашивкой-антенной, жёлтый пояс с инструментами и та родинка. Для Aria — родинка, волосы на прямой пробор и золотые серьги-гвоздики. Если эти три переживают рендер, персонаж пережил.
- Не доверяйте названиям цветов в стиле Pantone. «Rust-olive» дрейфует в табачно-коричневый. Если цвет важен, сначала отрендерите, потом скорректируйте ниже по потоку, или используйте Pro и намеренно снимите образец цвета бренда.
- Ставьте фотографическую печать стиля в конец библии. «Cinematic 35mm» или «50mm portrait lens, slight matte film finish» — в конце она переживает усечение длинного промпта.
- Сначала рендерите лист персонажа и ожидайте, что он дрейфует в мультяшность. Это нормально. Лист персонажа — для вас, а не для публикации. Для производственных кадров используйте ту же библию плюс сценный фрагмент промпта, чтобы сохранить фотореализм.
- Для черновиков и массового производства используйте
nano-banana-2в 1K ($0.036), для главных кадров и всего, где нужен 2K, —nano-banana-pro($0.057 и в 1K, и в 2K). Постройте небольшой планировщик на клиенте, который выбирает модель по параметруqualityи передаёт правильное разрешение. - Фиксированная по цене
nano-bananaотвергаетresolution. На клиенте отсекайте это поле по имени модели. Это 400, полученный на собственных ошибках.
Вот и весь рабочий процесс. Возьмите библию, выберите три метки идентичности, соберите сценные фрагменты, запустите через POST /v1/tasks — и один и тот же человек выйдет с другого конца каждого рендера.
Предпочитаете маршрут с референсным изображением вместо текстовой библии? Ideogram 3.0 Character вместо этого закрепляет персонажа по одному загруженному референсному изображению, а его руководство по промптам показывает те же приёмы на талисманах, страницах книг с картинками и маскированных правках.
Похожие статьи
Все статьи →-
Руководство
Как вызвать hailuo-2.3-fast/image-to-video через HiAPI API: практика с curl и Python
Первый рабочий запрос к быстрому и недорогому уровню генерации видео по изображению — от ID модели до загрузки MP4
-
Руководство
Как вызывать hailuo-2.3/text-to-video через API HiAPI: curl, Python и рабочие примеры запросов
-
Руководство
Использование Kandinsky 6.0 Pro для преобразования текста в видео на HiAPI: руководство по curl и Python
Практическая демонстрация с упором на запросы: построение вызова от промпта до видеоклипа, отправка запроса, опрос статуса завершения и скачивание результата