Имея одно чёткое изображение продукта, Claude Code и API AIHubMix, вы можете создать референсы персонажей в Seedream, зарегистрировать их как ассеты виртуальных персон и использовать Seedance для создания рекламы AI-продукта.
Этот туториал основан на реальной кампании спрей-тоника с алоэ и включает структуру проекта, конфигурацию, команды и полный промпт для видео. Целевой результат — рекламный ролик 20 секунд, 720p, вертикальный формат 9:16 с персонажем и обстановкой, созданными ИИ.
Claude Code и AIHubMix обеспечивают работу всего процесса. Claude Code читает бриф проекта, дорабатывает промпты и организует выполнение. AIHubMix предоставляет единую точку входа к моделям, поэтому генерация изображений и видео может выполняться в одном проекте.
Идентификаторы моделей, параметры и обработка ошибок взяты из снимка проекта от 16 сентября 2026 года. Перед повторным использованием проверьте текущий API. Команды используют включённый файл flow.py и должны запускаться из корневой папки проекта.Скачайте полный стартовый набор
Скачайте код, промпты, конфигурацию и примеры изображений:
https://drive.google.com/uc?export=download&id=1nXcj26Fq3daHeTd0SynS7_QEXgH8z4u_
После распаковки перейдите в папку seedance-starter. Пакет включает flow.py, два снимка схем, пять файлов с промптами, изображение продукта и три референсных изображения. Python-скрипт использует только стандартную библиотеку.
- Начните с этапа видео: используйте три прилагаемых референса, настройте ключ и начните с шага 4.
- Начните со своим продуктом: замените изображение продукта и детали в промптах, переместите прилагаемые референсные изображения из
assets/и начните с шага 3.
Скопируйте .env.example в .env и добавьте свой API-ключ. Ваш аккаунт должен иметь доступ к нужным моделям, необходимое разрешение на асинхронные задачи и достаточную квоту. Генерация через API оплачивается по факту использования.
1. Подготовка изображения продукта и проекта
Пример продукта — Nature Republic Aloe Vera Mist. При адаптации процесса обновляйте изображение, описание продукта и действие использования вместе.
| Файл | Назначение |
|---|---|
assets/product.png | Исходное изображение продукта |
prompts/prompt-a.txt | Промпт главного портрета персонажа |
prompts/prompt-b.txt | Промпт персонажа с продуктом в руках |
prompts/prompt-c.txt | Промпт использования продукта |
prompts/prompt-video.txt | Таймлайн видео, камера и требования к аудио |
prompts.json | Размеры, длительность, зависимости от референсов и пути к промптам |
flow.py | API-запросы, регистрация ассетов, опрос статуса и загрузки |
seedream.schema.json, seedance.schema.json | Закэшированные снимки схем API |
Claude Code помогает читать бриф проекта и дорабатывать конфигурацию и промпты. flow.py отправляет фактические запросы через AIHubMix.
Почему AIHubMix подходит для этого процесса
Рабочий процесс рекламы AI-продукта обычно требует более одной модели. Модель изображений создаёт референсы персонажа и продукта, а видеомодель создаёт движение и поведение камеры. AIHubMix охватывает большинство основных моделей, поэтому вы можете выбирать модели под конкретную задачу через один API-сервис, а не поддерживать отдельные аккаунты, аутентификацию и точки входа для каждого провайдера.
AIHubMix также подключается к нескольким поставщикам и автоматически выбирает доступный маршрут с низкой задержкой. Это может снизить влияние нестабильности одного поставщика на процесс, который должен последовательно выполнять генерацию изображений, обработку ассетов и генерацию видео. Доступность моделей, маршрутизация и время ответа по-прежнему зависят от текущего состояния сервиса.
Создайте .env в корневой папке проекта или задайте такую же переменную в окружении:
AIHUBMIX_API_KEY=replace_with_your_api_key
Проект исключает .env через .gitignore. Делитесь только именем переменной и примером, но никогда не настоящим ключом.

Весь процесс начинается с одного чёткого изображения продукта.
2. Задайте целевой результат и разделите параметры изображения и видео
Соответствующая часть prompts.json выглядит так. При редактировании реального файла сохраняйте существующий массив stills и другие поля.
{
"size": "1080x1920",
"aspect_ratio": "9:16",
"duration": 20,
"resolution": "720p",
"generate_audio": true,
"video_prompt_file": "prompts/prompt-video.txt"
}
size относится к генерации изображений. aspect_ratio, duration, resolution и generate_audio относятся к генерации видео. Скрипт формирует отдельные запросы, а не отправляет весь объект конфигурации на оба эндпоинта.
В проекте используются такие идентификаторы моделей:
- Seedream:
doubao-seedream-5-0-pro-260628 - Seedance:
doubao-seedance-2-5-260628
Прилагаемые снимки схем показывают, что эндпоинт изображений принимает size, а эндпоинт видео — aspect_ratio. Их смешение приводит к отказу. flow.py проверяет закэшированные свойства схемы перед отправкой запроса, но это не полная валидация параметров.
3. Последовательно создайте три референса персонажа
Каждое изображение играет свою роль, а последующие зависят от предыдущих:
| Референс | Содержание | Входные данные |
|---|---|---|
| A: Портрет персонажа | Задаёт лицо, волосы, одежду, комнату и освещение | В этом примере — только текстовый промпт |
| B: Персонаж с продуктом | Тот же человек держит флакон этикеткой к камере | Изображение продукта + A |
| C: Использование продукта | Тот же человек нажимает на распылитель | Изображение продукта + B |
Промпты повторяют детали персонажа и описывают форму продукта, цвета, расположение этикетки и естественное обращение с ним.
Запустите:
python3 flow.py stills
Результаты сохраняются как assets/frame-01.jpg, frame-02.jpg и frame-03.jpg. Проверьте согласованность персонажа, точность передачи упаковки и реалистичность действия использования.
Скрипт пропускает существующие файлы. Если вы меняете промпт, сделайте резервную копию соответствующего результата и переместите его перед повторным запуском. Изменение A может потребовать и повторной генерации B и C.

Референсы задают идентичность персонажа, презентацию продукта и его использование.
4. Размещение изображений и регистрация ассетов виртуального портрета
Стартовый набор не содержит ID ассетов из аккаунта автора. Зарегистрируйте референсы в своём аккаунте.
Этот проект использует публичные URL изображений для регистрации. Исходный процесс использовал GitHub raw-ссылки, закреплённые за SHA коммита, но подойдёт любой хостинг, который отдаёт изображение напрямую без аутентификации.
URL вида GitHub /blob/ возвращает HTML-страницу и не может использоваться как URL изображения.
Замените этот placeholder-хост на реальное расположение загруженных файлов:
IMAGE_BASE='https://your-public-image-host.example/campaign'
python3 flow.py check "$IMAGE_BASE/frame-01.jpg" "$IMAGE_BASE/frame-02.jpg" "$IMAGE_BASE/frame-03.jpg"
python3 flow.py assets "$IMAGE_BASE/frame-01.jpg" "$IMAGE_BASE/frame-02.jpg" "$IMAGE_BASE/frame-03.jpg"
check проверяет HTTP 200 и Content-Type изображения. assets создаёт или переиспользует группу ассетов virtual_portrait, регистрирует каждое изображение, ждёт, пока оно станет active, и записывает ID ассетов в state.json.
Этот шаг возник из реальной ошибки проекта: передача фотореалистичных URL персонажей напрямую в эндпоинт видео возвращала doubao_real_person_required. Человек в этой кампании был создан ИИ, поэтому virtual_portrait была правильной классификацией. Фотография реального человека должна проходить соответствующую процедуру верификации и не должна маркироваться как виртуальная.
Все ассеты, используемые в одном видеозапросе, должны принадлежать одной группе.

Референсы были созданы, все три ассета активны; видеозадача всё ещё выполнялась на момент снимка экрана.
5. Напишите промпт для видео как таймлайн с ограничениями камеры
Итоговый промпт проекта делит один непрерывный 20-секундный кадр на четыре фазы:
| Время | Действие персонажа | Положение продукта |
|---|---|---|
| 0–5 секунд | Смотрит в камеру и демонстрирует флакон | Рядом с лицом, этикеткой к камере |
| 5–10 секунд | Поднимает флакон и нажимает на распылитель | Остаётся в кадре |
| 10–15 секунд | Закрывает глаза и ощущает, как оседает туман | Нижняя треть кадра |
| 15–20 секунд | Открывает глаза и снова демонстрирует продукт | Снова рядом с лицом, этикеткой к камере |
Предыдущий результат приблизил камеру слишком близко и потерял продукт. Поэтому итоговый промпт ограничивает движение средним крупным планом, требует, чтобы продукт оставался видимым, и просит читаемую этикетку в первые и последние три секунды.
Вот полный prompts/prompt-video.txt. Для другого продукта обновите бренд, описание упаковки и действие использования. Эти инструкции — цели генерации, и результат всё равно требует проверки.
One continuous 20-second vertical beauty commercial take, no cuts, in a sunlit minimalist vanity corner.
0-5s: the same 24-year-old East Asian woman in an oversized sage-green linen shirt over a white ribbed tank top stands at the vanity holding the translucent light-green Nature Republic Aloe Vera 92% Soothing Gel Mist beside her cheek, the label facing camera and fully legible. She looks to camera with a warm, easy smile and turns the bottle slightly so the label catches the morning light.
5-10s: she lifts the bottle just above eye level and presses the fine-mist pump. A soft cone of aloe mist sprays across her face and catches the light as a faint sparkle of micro-droplets.
10-15s: her eyes close and her chin lifts into a small contented smile as the mist settles, tiny droplets resting on her cheekbone and brow. The bottle stays visible in the lower third of the frame throughout this beat.
15-20s: she opens her eyes, brings the bottle back up beside her cheek with the label square to camera, and holds a final calm look at the lens.
Camera: one slow, smooth push-in from a chest-up framing to a mid-close framing ONLY. Do not push past a mid-close shot. The product must stay inside the frame for the entire take, and the label must be clearly legible in both the first three seconds and the last three seconds.
Look: soft diffused morning sunlight from camera left, photorealistic skin texture with real moisture on the skin, mist rendered as genuinely photographed spray rather than digital particles, premium K-beauty advertising. Keep the product packaging, colours, materials, label layout and label text exactly as in the reference images; do not redesign or re-letter the product. No text overlays, no captions, no watermarks.
Audio: a quiet bright room, one soft short pump-spray hiss, a gentle breath. No music, no voiceover.
Генерация аудио включена, но промпт запрашивает только фоновый шум комнаты, один звук распыления и мягкий вдох — без музыки и закадрового голоса.
6. Генерация и сохранение видео
После регистрации ассетов отправьте ссылки asset://. Эта команда читает сохранённые ID и передаёт каждый из них как отдельный аргумент:
python3 - <<'PYCODE'
import json
import subprocess
import sys
from pathlib import Path
state = json.loads(Path("state.json").read_text())
refs = ["asset://" + asset_id for asset_id in state["asset_ids"]]
subprocess.run([sys.executable, "flow.py", "video", *refs], check=True)
PYCODE
Использование списка аргументов также позволяет избежать проблемы zsh из исходного проекта, когда несколько ID, сохранённых одной обычной строкой, могли попасть в скрипт как один некорректный аргумент.
Скрипт сохраняет ID видеозадачи, опрашивает статус до completed и загружает результат в out/video.mp4. Другая загрузка может перезаписать этот путь, поэтому сохраняйте копии версий, которые хотите сравнить.
Чтобы продолжить существующую задачу или заново загрузить её результат, используйте:
python3 flow.py status
Если ответ на создание потерян, выведите список последних задач и продолжите нужный ID:
python3 flow.py tasks
python3 flow.py status VIDEO_TASK_ID
Поиск существующей задачи перед созданием новой предотвращает случайную дублирующую генерацию.
7. Проверка результата и итерации
Исходный проект хранит video-v1-10s.mp4 и итоговый video.mp4. Первая версия длилась только 10 секунд и не показывала достаточного использования продукта, поэтому процесс прошёл вторую итерацию промпта.
Проверяйте каждый результат по этому списку:
- [ ] Длительность, разрешение и соотношение сторон соответствуют цели.
- [ ] Лицо, одежда и обстановка персонажа остаются согласованными.
- [ ] Продукт остаётся видимым, а его этикетку можно прочитать в начале и в конце.
- [ ] Обращение с продуктом и действие распыления соответствуют его реальному использованию.
- [ ] Форма флакона, упаковка и текст заметно не меняются.
- [ ] Камера не приближается слишком сильно, а аудио соответствует запросу.
Если длительность неверная, проверьте и конфигурацию, и фактический запрос. Если продукт выходит за кадр, ужесточите ограничения камеры. Если действие использования слишком короткое, более явно задайте распределение времени и поведение. Если редактировать только prompts/prompt-video.txt , заново генерировать опорные изображения не нужно; регенерируйте и регистрируйте их только тогда, когда визуальные референсы действительно должны измениться.
Часто задаваемые вопросы
Почему название модели, которое выглядит правильным, возвращает 404?
В исходном проекте сокращённое название Seedream вернуло model_not_found . Используйте полный идентификатор модели API, который принимает текущий эндпоинт, а не предполагайте, что маркетинговое отображаемое название совпадает с идентификатором API.
Почему я могу открыть изображение в браузере, но всё равно не могу его зарегистрировать?
Убедитесь, что по URL возвращается само изображение, а не HTML, страница публикации или страница входа. Перед регистрацией выполните python3 flow.py check URL... .
Почему изменение промпта не изменило опорное изображение?
stills пропускает существующие файлы. Сделайте резервную копию и переместите любое изображение, которое нужно перегенерировать, затем проверьте, не нужно ли также перегенерировать зависимые опорные изображения.
Означает ли HTTP 200, что видео готово?
Нет. Скрипт анализирует status задачи и загружает файл только после того, как задача переходит в состояние completed.
Создайте свою первую версию
Подготовьте одно изображение продукта, настройте доступ к AIHubMix и выберите модели для изображений и видео. Затем позвольте Claude Code адаптировать описание продукта и промпты. Сгенерируйте три референса, проверьте и зарегистрируйте их, создайте видео и используйте чек-лист, чтобы решить, что улучшить в следующей итерации.
Когда в будущем проекту понадобится другая модель, сохраните ту же структуру файлов и рабочий процесс, а затем обновите выбор модели в AIHubMix и параметры, специфичные для модели. В этом практическая ценность единого API-сервиса для контент-команды, которая использует несколько ИИ-моделей: модели можно менять в зависимости от задачи, а рабочий процесс остаётся пригодным для повторного использования.



