Avec une image claire de produit, Claude Code et l'API AIHubMix, vous pouvez générer des références de personnages dans Seedream, les enregistrer comme assets de personnes virtuelles, puis utiliser Seedance pour créer une publicité produit IA.
Ce tutoriel est basé sur une véritable campagne de brume à l'aloe vera et comprend la structure du projet, la configuration, les commandes et le prompt vidéo complet. Le résultat visé est une publicité verticale de 20 secondes, en 720p, au format 9:16, avec une personne et un décor générés par IA.
Claude Code et AIHubMix alimentent l'ensemble du flux de travail. Claude Code lit le brief du projet, révise les prompts et organise l'exécution. AIHubMix fournit un point d'entrée unique vers les modèles, afin que la génération d'images et de vidéos puisse fonctionner dans le même projet.
Les identifiants de modèles, les paramètres et la gestion des erreurs proviennent d'un instantané du projet daté du 16 septembre 2026. Vérifiez l'API actuelle avant de les réutiliser. Les commandes utilisent le fichier flow.py inclus et doivent être exécutées depuis la racine du projet.Télécharger le kit de démarrage complet
Téléchargez le code, les prompts, la configuration et les images d'exemple :
https://drive.google.com/uc?export=download&id=1nXcj26Fq3daHeTd0SynS7_QEXgH8z4u_
Après l'extraction, accédez au répertoire seedance-starter. Le paquet comprend flow.py, deux instantanés de schémas, cinq fichiers de prompts, l'image du produit et trois images de référence. Le script Python n'utilise que la bibliothèque standard.
- Commencer par l'étape vidéo : utilisez les trois références incluses, configurez votre clé et commencez à l'étape 4.
- Commencer avec votre propre produit : remplacez l'image du produit et les détails des prompts, déplacez les images de référence incluses hors de
assets/, puis commencez à l'étape 3.
Copiez .env.example vers .env et ajoutez votre propre clé API. Votre compte doit avoir accès aux modèles concernés, à l'éventuelle autorisation des tâches asynchrones et disposer d'un quota suffisant. La génération via l'API entraîne des frais d'utilisation.
1. Préparer l'image du produit et le projet
Le produit d'exemple est Nature Republic Aloe Vera Mist. Lors de l'adaptation du flux de travail, mettez à jour ensemble l'image, la description du produit et l'action d'utilisation.
| Fichier | Rôle |
|---|---|
assets/product.png | Image originale du produit |
prompts/prompt-a.txt | Prompt du portrait principal du personnage |
prompts/prompt-b.txt | Prompt du personnage tenant le produit |
prompts/prompt-c.txt | Prompt d'utilisation du produit |
prompts/prompt-video.txt | Chronologie de la vidéo, exigences de caméra et d'audio |
prompts.json | Dimensions, durée, dépendances aux références et chemins des prompts |
flow.py | Requêtes API, enregistrement des assets, interrogation et téléchargements |
seedream.schema.json, seedance.schema.json | Instantanés en cache des schémas API |
Claude Code aide à lire le brief du projet et à réviser la configuration et les prompts. flow.py envoie les requêtes réelles via AIHubMix.
Pourquoi AIHubMix convient à ce flux de travail
Un flux de travail de publicité produit IA nécessite généralement plus d'un modèle. Un modèle d'image crée les références de la personne et du produit ; un modèle vidéo crée le mouvement et le comportement de la caméra. AIHubMix couvre la plupart des modèles grand public, ce qui vous permet de sélectionner les modèles selon la tâche via un seul service API, au lieu de gérer des comptes, des authentifications et des points d'entrée de requêtes distincts pour chaque fournisseur.
AIHubMix se connecte également à plusieurs fournisseurs et sélectionne automatiquement une route disponible à faible latence. Cela peut réduire l'impact de l'instabilité d'un seul fournisseur sur un flux de travail qui doit enchaîner la génération d'images, le traitement des assets et la génération vidéo. La disponibilité des modèles, le routage et le temps de réponse dépendent toujours des conditions actuelles du service.
Créez .env à la racine du projet, ou définissez la même variable dans votre environnement :
AIHUBMIX_API_KEY=replace_with_your_api_key
Le projet exclut .env via .gitignore. Ne partagez que le nom de la variable et l'exemple, jamais la clé réelle.

Tout le flux de travail commence par une image claire du produit.
2. Définir la cible de sortie et séparer les paramètres d'image et de vidéo
La partie pertinente de prompts.json ressemble à ceci. Conservez le tableau stills existant et les autres champs lors de la modification du fichier réel.
{
"size": "1080x1920",
"aspect_ratio": "9:16",
"duration": 20,
"resolution": "720p",
"generate_audio": true,
"video_prompt_file": "prompts/prompt-video.txt"
}
size concerne la génération d'images. aspect_ratio, duration, resolution et generate_audio concernent la génération vidéo. Le script construit des requêtes distinctes au lieu d'envoyer l'objet de configuration complet aux deux points d'entrée.
Le projet utilise ces identifiants de modèles :
- Seedream :
doubao-seedream-5-0-pro-260628 - Seedance :
doubao-seedance-2-5-260628
Les instantanés de schémas inclus montrent que le point d'entrée d'image accepte size, tandis que le point d'entrée vidéo accepte aspect_ratio. Les mélanger entraîne un rejet. flow.py vérifie les propriétés des schémas en cache avant d'envoyer une requête, mais cela ne constitue pas une validation complète des paramètres.
3. Générer les trois références de personnage dans l'ordre
Chaque image a un rôle différent, et les images suivantes dépendent des précédentes :
| Référence | Contenu | Entrées |
|---|---|---|
| A : Portrait du personnage | Établir le visage, les cheveux, la garde-robe, la pièce et l'éclairage | Uniquement un prompt textuel dans cet exemple |
| B : Tenant le produit | La même personne tient le flacon, l'étiquette face à la caméra | Image du produit + A |
| C : Utilisant le produit | La même personne appuie sur la pompe du spray | Image du produit + B |
Les prompts reprennent les détails du personnage et décrivent la forme du produit, ses couleurs, la mise en page de l'étiquette et une manipulation naturelle.
Exécutez :
python3 flow.py stills
Les résultats sont enregistrés sous assets/frame-01.jpg, frame-02.jpg et frame-03.jpg. Vérifiez la cohérence du personnage, la fidélité de l'emballage et le réalisme de l'action d'utilisation.
Le script ignore les fichiers existants. Si vous modifiez un prompt, sauvegardez puis déplacez la sortie correspondante avant de relancer. Modifier A peut aussi nécessiter de régénérer B et C.

Les références établissent l'identité du personnage, la présentation du produit et son utilisation.
4. Héberger les images et enregistrer les assets de portrait virtuel
Le kit de démarrage ne contient aucun identifiant d'asset du compte de l'auteur. Enregistrez les références dans votre propre compte.
Ce projet utilise des URL d'images publiques pour l'enregistrement. Le flux de travail d'origine utilisait des URL GitHub raw épinglées à un SHA de commit, mais tout hébergement renvoyant directement l'image sans authentification peut convenir.
Une URL GitHub contenant /blob/ renvoie une page HTML et ne peut pas être utilisée comme URL d'image.
Remplacez cet hôte d'exemple par l'emplacement réel de vos fichiers téléversés :
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 vérifie le code HTTP 200 et le Content-Type d'image. assets crée ou réutilise un groupe d'assets virtual_portrait, enregistre chaque image, attend qu'elle passe à active, et écrit les identifiants d'assets dans state.json.
Cette étape provient d'un véritable échec rencontré dans le projet : transmettre directement à l'endpoint vidéo des URL de personnages photoréalistes a renvoyé doubao_real_person_required. La personne de cette campagne était générée par IA, donc virtual_portrait était la classification correcte. Une photographie de personne réelle doit suivre le processus de vérification correspondant et ne doit pas être étiquetée comme virtuelle.
Tous les assets utilisés dans une même requête vidéo doivent appartenir au même groupe.

Les références ont été générées et les trois assets étaient actifs ; la tâche vidéo était encore en cours lors de la capture de cette capture d'écran.
5. Rédiger le prompt vidéo sous forme de chronologie avec des limites de caméra
Le prompt final du projet divise un plan continu de 20 secondes en quatre phases :
| Temps | Action du personnage | Position du produit |
|---|---|---|
| 0–5 secondes | Regarde la caméra et présente le flacon | À côté de son visage, étiquette vers la caméra |
| 5–10 secondes | Lève le flacon et appuie sur la pompe | Reste dans le cadre |
| 10–15 secondes | Ferme les yeux et ressent la brume se déposer | Tiers inférieur du cadre |
| 15–20 secondes | Ouvre les yeux et présente à nouveau le produit | De retour à côté de son visage, étiquette vers la caméra |
Un résultat précédent poussait la caméra trop près et faisait disparaître le produit. Le prompt final limite donc le mouvement à un plan rapproché moyen, exige que le produit reste visible et demande une étiquette lisible pendant les trois premières et les trois dernières secondes.
Voici le fichier prompts/prompt-video.txt complet. Pour un autre produit, mettez à jour la marque, la description de l'emballage et l'action d'utilisation. Ces instructions sont des cibles de génération et nécessitent toujours une vérification du résultat.
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.
La génération audio est activée, mais le prompt demande uniquement l'ambiance de la pièce, un seul son de pulvérisation et une respiration douce, sans musique ni voix off.
6. Générer et enregistrer la vidéo
Après l'enregistrement des assets, soumettez les références asset://. Cette commande lit les identifiants enregistrés et transmet chacun comme argument distinct :
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
Utiliser une liste d'arguments évite aussi un problème zsh du projet source, où plusieurs identifiants stockés dans une seule chaîne simple pouvaient arriver au script comme un argument invalide unique.
Le script enregistre l'identifiant de la tâche vidéo, interroge jusqu'à obtenir completed, puis télécharge le résultat dans out/video.mp4. Un autre téléchargement peut écraser ce chemin, sauvegardez donc les versions que vous voulez comparer.
Pour reprendre une tâche existante ou retélécharger son résultat, utilisez :
python3 flow.py status
Si la réponse de création a été perdue, listez les tâches récentes et reprenez l'identifiant concerné :
python3 flow.py tasks
python3 flow.py status VIDEO_TASK_ID
Rechercher une tâche existante avant d'en créer une nouvelle évite une génération en double accidentelle.
7. Examiner le résultat et itérer
Le projet source conserve video-v1-10s.mp4 et la version finale video.mp4. La première version ne durait que 10 secondes et ne montrait pas assez l'utilisation du produit, ce qui a conduit à une deuxième itération du prompt.
Vérifiez chaque résultat avec cette liste de contrôle :
- [ ] La durée, la résolution et le format d'image correspondent à la cible.
- [ ] Le visage, la garde-robe et le décor du personnage restent cohérents.
- [ ] Le produit reste visible et son étiquette est lisible au début et à la fin.
- [ ] La manipulation et les gestes de pulvérisation correspondent à l'usage réel du produit.
- [ ] La forme du flacon, l'emballage et le texte ne changent pas de manière notable.
- [ ] La caméra ne se rapproche pas trop, et l'audio correspond à la demande.
Si la durée est incorrecte, vérifiez à la fois la configuration et la requête réellement envoyée. Si le produit sort du cadre, renforcez les limites de la caméra. Si l'action d'utilisation est trop courte, répartissez le temps et le comportement de manière plus explicite. Modifier uniquement prompts/prompt-video.txt ne nécessite pas de régénérer les images de référence ; ne les régénérez et ne les enregistrez de nouveau que si les références visuelles doivent changer.
Questions fréquentes
Pourquoi un nom de modèle qui semble correct renvoie-t-il une erreur 404 ?
Le nom Seedream raccourci a renvoyé model_not_found dans le projet source. Utilisez l'identifiant de modèle API complet accepté par le point de terminaison actuel plutôt que de supposer que le nom commercial est aussi l'identifiant API.
Pourquoi puis-je ouvrir une image dans mon navigateur sans parvenir à l'enregistrer ?
Vérifiez que l'URL renvoie l'image elle-même et non du HTML, une page de partage ou une page de connexion. Utilisez python3 flow.py check URL... avant l'enregistrement.
Pourquoi la modification d'un prompt n'a-t-elle pas changé l'image de référence ?
stills ignore les fichiers existants. Sauvegardez et déplacez toute image devant être régénérée, puis vérifiez si les références en aval doivent aussi être régénérées.
Un code HTTP 200 signifie-t-il que la vidéo est terminée ?
Non. Le script se base sur le status de la tâche et ne télécharge qu'une fois que la tâche atteint completed.
Lancez votre première version
Préparez une image de produit, configurez l'accès à AIHubMix et choisissez les modèles d'image et de vidéo. Laissez ensuite Claude Code adapter la description du produit et les prompts. Générez les trois références, vérifiez-les et enregistrez-les, créez la vidéo, puis utilisez la checklist pour décider de la prochaine itération.
Lorsqu'un futur projet nécessitera un autre modèle, conservez la même structure de fichiers et le même workflow, puis mettez à jour la sélection du modèle sur AIHubMix ainsi que les paramètres propres à chaque modèle. C'est l'intérêt concret d'un service d'API unifié pour une équipe de contenu qui utilise plusieurs modèles d'IA : les modèles peuvent changer selon la tâche, tandis que le workflow reste réutilisable.



