HiAPI
Блог

Руководство

Обеспечение консистентности персонажа с помощью Nano-Banana на hiapi: рабочий процесс для раскадровок и электронной коммерции

Техника «библии персонажа» (character bible) удерживает одно и то же лицо, один и тот же комплект одежды и одну и ту же ауру стабильными в совершенно разных сценах — сквозная демонстрация на Nano-Banana через асинхронные эндпоинты /v1/tasks от hiapi, текущий ориентировочный бюджет — $0.41.

Jun 16, 2026
Обеспечение консистентности персонажа с помощью Nano-Banana на hiapi: рабочий процесс для раскадровок и электронной коммерции

Резюме

Если вы когда-нибудь пытались генерировать повторяющегося персонажа — талисман для раскадровки, лицо бренда, модель для виртуальной примерки в электронной коммерции — вы уже знаете, как это обычно ломается: каждый рендер — это «человек, который примерно похож», а стоит поставить два кадра рядом, и различия бьют в глаза. Серия 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.

Что «консистентность персонажа» значит на практике

Консистентность — это не одно свойство, а небольшой набор свойств, которые должны одновременно выполняться во всех рендерах, чтобы результат воспринимался как один и тот же человек:

  1. Геометрия лица. Расстояние между глазами, длина носа, ширина челюсти, объём щёк.
  2. Метки кожи и волос. Тон, веснушки или родинки, цвет и текстура волос.
  3. Одежда и аксессуары. Та самая куртка, та самая шапка, тот самый пояс с инструментами.
  4. Аура. Библиотека поз и выражений лица — то, как персонаж проявляет себя.

Когда промпт достаточно плотный, модели 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."
)

В этой библии шесть намеренных решений:

  1. Дайте ей имя. «Mira» даёт модели стабильный идентификатор. Даже если имя не появляется на изображении, наличие имени в промпте, похоже, закрепляет идентичность.
  2. Смешанное происхождение указано явно, и обе половины названы. «Женщина» или «азиатка» — это расплывчато. «Филиппино-польская» заставляет модель прийти к конкретному смешению черт лица.
  3. Глаза, брови, волосы и кожа описаны по отдельности. Не полагайтесь на «красивая» или «естественная». Пишите геометрию явно.
  4. Одна уникальная метка на лице. Родинка на правой щеке. Даже если она иногда смещается, эта метка подталкивает модель в конкретное пространство идентичности.
  5. Одежда названа, а не описана в общих чертах. «Ржаво-оранжевая вязаная шапка с маленькой вышитой нашивкой-антенной» воспроизводима. «Шапка» — нет.
  6. В конце — фотографическая печать стиля. «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.

Практические правила, к которым я возвращаюсь снова и снова

  1. Напишите библию один раз, храните её в системе контроля версий, в модуле констант. Относитесь к ней как к любой другой конфигурационной строке. Версионируйте её.
  2. Одно имя на каждую библию. «Mira», «Aria». Даже если модель никогда не показывает имя, оно в промпте — стабильный идентификатор.
  3. Выберите три метки идентичности и жёстко опирайтесь на них. Для Mira это вязаная шапка с нашивкой-антенной, жёлтый пояс с инструментами и та родинка. Для Aria — родинка, волосы на прямой пробор и золотые серьги-гвоздики. Если эти три переживают рендер, персонаж пережил.
  4. Не доверяйте названиям цветов в стиле Pantone. «Rust-olive» дрейфует в табачно-коричневый. Если цвет важен, сначала отрендерите, потом скорректируйте ниже по потоку, или используйте Pro и намеренно снимите образец цвета бренда.
  5. Ставьте фотографическую печать стиля в конец библии. «Cinematic 35mm» или «50mm portrait lens, slight matte film finish» — в конце она переживает усечение длинного промпта.
  6. Сначала рендерите лист персонажа и ожидайте, что он дрейфует в мультяшность. Это нормально. Лист персонажа — для вас, а не для публикации. Для производственных кадров используйте ту же библию плюс сценный фрагмент промпта, чтобы сохранить фотореализм.
  7. Для черновиков и массового производства используйте nano-banana-2 в 1K ($0.036), для главных кадров и всего, где нужен 2K, — nano-banana-pro ($0.057 и в 1K, и в 2K). Постройте небольшой планировщик на клиенте, который выбирает модель по параметру quality и передаёт правильное разрешение.
  8. Фиксированная по цене nano-banana отвергает resolution. На клиенте отсекайте это поле по имени модели. Это 400, полученный на собственных ошибках.

Вот и весь рабочий процесс. Возьмите библию, выберите три метки идентичности, соберите сценные фрагменты, запустите через POST /v1/tasks — и один и тот же человек выйдет с другого конца каждого рендера.

Предпочитаете маршрут с референсным изображением вместо текстовой библии? Ideogram 3.0 Character вместо этого закрепляет персонажа по одному загруженному референсному изображению, а его руководство по промптам показывает те же приёмы на талисманах, страницах книг с картинками и маскированных правках.

Похожие статьи

Все статьи →

Начните работать с постоянными артефактами ИИ

Получите API-ключ и вызывайте модели изображений, видео и аудио через один API на основе tasks.

Читать документацию API