Avec une image de produit claire, Claude Code et l'API AIHubMix, vous pouvez générer des références de personnages dans Seedream, les enregistrer en tant qu'actifs de personne virtuelle et utiliser Seedance pour créer une annonce de produit AI.
Ce tutoriel est basé sur une véritable campagne de brume d'aloe et comprend la structure du projet, la configuration, les commandes et l'invite vidéo complète. La sortie cible est une annonce verticale de 20 secondes, 720p, 9:16 avec une personne et un décor générés par AI.
Claude Code et AIHubMix alimentent l'ensemble du flux de travail. Claude Code lit le brief du projet, révise les invites et organise l'exécution. AIHubMix fournit un point d'entrée de modèle unique afin que la génération d'images et de vidéos puisse fonctionner à l'intérieur du même projet.
Les ID de modèle, les paramètres et la gestion des erreurs proviennent d'un instantané de projet daté du 16 septembre 2026. Vérifiez l'API actuelle avant de les réutiliser. Les commandes utilisent le flow.py inclus et doivent être exécutées depuis la racine du projet.Télécharger le Starter Complet
Téléchargez le code, les invites, la configuration et les images d'exemple
Après l'avoir extrait, entrez dans le répertoire seedance-starter. Le package comprend flow.py, deux instantanés de schéma, cinq fichiers d'invite, l'image du produit et trois images de référence. Le script Python utilise uniquement la bibliothèque standard.
- Commencez par l'étape vidéo : utilisez les trois références incluses, configurez votre clé et commencez par l'étape 4.
- Commencez avec votre propre produit : remplacez l'image du produit et les détails de l'invite, déplacez les images de référence incluses hors de
assets/, et commencez par l'étape 3.
Copiez .env.example dans .env et ajoutez votre propre clé API. Votre compte doit avoir accès aux modèles pertinents, à toute autorisation de tâche asynchrone requise et à un quota suffisant. La génération API entraîne des frais d'utilisation.
1. Préparer l'image du produit et le projet
Le produit exemple est Nature Republic Aloe Vera Mist. Lors de l'adaptation du flux de travail, mettez à jour l'image, la description du produit et utilisez l'action ensemble.
| Fichier | But |
|---|---|
assets/product.png | Image originale du produit |
prompts/prompt-a.txt | Invite de portrait du personnage principal |
prompts/prompt-b.txt | Invite pour le personnage tenant le produit |
prompts/prompt-c.txt | Invite d'utilisation du produit |
prompts/prompt-video.txt | Chronologie vidéo, exigences de caméra et audio |
prompts.json | Dimensions, durée, dépendances de référence et chemins d'invite |
flow.py | Requêtes API, enregistrement d'actifs, sondage et téléchargements |
seedream.schema.json, seedance.schema.json | Instantanés de schéma API mis en cache |
Claude Code aide à lire le brief du projet et à réviser la configuration et les invites. flow.py envoie les requêtes réelles via AIHubMix.
Pourquoi AIHubMix convient à ce flux de travail
Un flux de travail d'annonce de produit AI 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, vous permettant de sélectionner des modèles par tâche via un service API unique au lieu de maintenir des comptes séparés, une authentification et des points d'entrée de requête pour chaque fournisseur.
AIHubMix se connecte également à plusieurs fournisseurs et sélectionne automatiquement un itinéraire à faible latence disponible. Cela peut réduire l'effet de l'instabilité d'un fournisseur unique sur un flux de travail qui doit compléter la génération d'images, le traitement des actifs et la génération de vidéos en séquence. La disponibilité des modèles, le routage et le temps de réponse dépendent toujours des conditions de service actuelles.
Créez .env dans la racine du projet, ou fournissez la même variable dans votre environnement :
AIHUBMIX_API_KEY=replace_with_your_api_key
Le projet exclut .env via .gitignore. Partagez uniquement le nom de la variable et un exemple, jamais la vraie clé.

L'ensemble du flux de travail commence par une image de produit claire.
2. Définir l'objectif de sortie et séparer les paramètres d'image des paramètres vidéo
La partie pertinente de prompts.json ressemble à ceci. Conservez le tableau stills existant et les autres champs lors de l'édition 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 appartient à la génération d'images. aspect_ratio, duration, resolution et generate_audio appartiennent à la génération vidéo. Le script construit des requêtes séparées plutôt que d'envoyer l'objet de configuration complet aux deux points de terminaison.
Le projet utilise ces ID de modèle :
- Seedream:
doubao-seedream-5-0-pro-260628 - Seedance:
doubao-seedance-2-5-260628
Les instantanés de schéma regroupés montrent que le point de terminaison d'image accepte size, tandis que le point de terminaison vidéo accepte aspect_ratio. Les mélanger entraîne un rejet. flow.py vérifie les propriétés de schéma mises 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 personnages 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 | Invite de texte uniquement dans cet exemple |
| B : Tenant le produit | La même personne tient la bouteille avec l'étiquette face à la caméra | Image du produit + A |
| C : Utilisant le produit | La même personne presse la pompe de pulvérisation | Image du produit + B |
Les invites répètent les détails du personnage et décrivent la forme, les couleurs, la disposition de l'étiquette et la manipulation naturelle du produit.
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 des personnages, la fidélité de l'emballage et le réalisme de l'action d'utilisation.
Le script ignore les fichiers existants. Si vous changez une invite, sauvegardez et déplacez la sortie correspondante avant de relancer. Changer A peut également 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 l'utilisation du produit.
4. Héberger les images et enregistrer les actifs de portrait virtuel
Le starter ne contient aucun ID d'actif du compte de l'auteur. Enregistrez les références dans votre propre compte.
Ce projet utilise des URL d'image publiques pour l'enregistrement. Le flux de travail source a utilisé des URL brutes GitHub épinglées à un SHA de commit, mais tout hébergement qui renvoie l'image directement sans authentification peut fonctionner.
Une URL GitHub /blob/ renvoie une page HTML et ne peut pas être utilisée comme URL d'image.
Remplacez cet hôte de remplacement par l'emplacement réel de vos fichiers téléchargé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 HTTP 200 et un type de contenu image. assets crée ou réutilise un groupe d'actifs virtual_portrait, enregistre chaque image, attend qu'elle devienne active, et écrit les ID d'actifs dans state.json.
Cette étape provient d'un échec réel dans le projet : passer des URL de personnages photoréalistes directement au point de terminaison vidéo a renvoyé doubao_real_person_required. La personne dans cette campagne a été générée par AI, 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 actifs utilisés dans une demande vidéo doivent appartenir au même groupe.

Les références ont été générées et les trois actifs étaient actifs ; la tâche vidéo était encore en cours d'exécution lorsque cette capture d'écran a été prise.
5. Rédiger l'invite vidéo comme une 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 la bouteille | À côté de son visage, étiquette tournée vers la caméra |
| 5–10 secondes | Lève la bouteille et presse la pompe | Reste à l'intérieur du cadre |
| 10–15 secondes | Ferme les yeux et ressent le brouillard se poser | Tiers inférieur du cadre |
| 15–20 secondes | Ouvre les yeux et présente à nouveau le produit | De nouveau à côté de son visage, étiquette tournée vers la caméra |
Un résultat précédent a rapproché la caméra trop près et a perdu le produit. Le prompt final limite donc le mouvement à un plan rapproché, exige que le produit reste visible et demande une étiquette lisible pendant les trois premières et dernières secondes.
Voici le 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 révision de la sortie.
Une prise continue de 20 secondes d'une publicité de beauté verticale, sans coupures, dans un coin de vanité minimaliste baigné de lumière du soleil.
0-5s : la même femme est-asiatique de 24 ans portant une chemise en lin vert sauge sur un débardeur blanc côtelé se tient à la vanité tenant le gel apaisant Nature Republic Aloe Vera 92% dans une bouteille translucide vert clair à côté de sa joue, l'étiquette tournée vers la caméra et entièrement lisible. Elle regarde la caméra avec un sourire chaleureux et facile et tourne légèrement la bouteille pour que l'étiquette capte la lumière du matin.
5-10s : elle soulève la bouteille juste au-dessus du niveau des yeux et presse la pompe à brume fine. Un doux cône de brume d'aloe se pulvérise sur son visage et capte la lumière comme un léger éclat de micro-gouttelettes.
10-15s : ses yeux se ferment et son menton se lève dans un petit sourire satisfait alors que la brume se dépose, de petites gouttelettes reposant sur son os de la joue et son front. La bouteille reste visible dans le tiers inférieur du cadre tout au long de cette prise.
15-20s : elle ouvre les yeux, ramène la bouteille à côté de sa joue avec l'étiquette carrée face à la caméra, et maintient un dernier regard calme vers l'objectif.
Caméra : un lent et doux rapprochement d'un cadrage poitrine à un cadrage mi-rapproché UNIQUEMENT. Ne pas dépasser un plan mi-rapproché. Le produit doit rester à l'intérieur du cadre pendant toute la prise, et l'étiquette doit être clairement lisible dans les trois premières secondes et les trois dernières secondes.
Aspect : lumière du matin douce et diffuse venant de la gauche de la caméra, texture de peau photoréaliste avec une réelle humidité sur la peau, brume rendue comme un spray photographié plutôt que des particules numériques, publicité K-beauty premium. Gardez l'emballage du produit, les couleurs, les matériaux, la disposition de l'étiquette et le texte de l'étiquette exactement comme dans les images de référence ; ne pas redessiner ou réécrire le produit. Pas de superpositions de texte, pas de légendes, pas de filigranes.
Audio : une pièce calme et lumineuse, un doux bruit de pulvérisation, une douce respiration. Pas de musique, pas de voix off.
La génération audio est activée, mais le prompt demande uniquement le ton de la pièce, un son de pulvérisation et une douce respiration—pas de musique ni de voix off.
6. Générer et enregistrer la vidéo
Après l'enregistrement des actifs, soumettez les références asset://. Cette commande lit les ID sauvegardés et passe chacun comme un argument séparé :
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 également un problème zsh du projet source, où plusieurs ID stockés dans une seule chaîne simple pouvaient atteindre le script comme un argument invalide.
Le script enregistre l'ID de tâche vidéo, interroge jusqu'à ce qu'il soit completed, et télécharge la sortie dans out/video.mp4. Un autre téléchargement peut écraser ce chemin, donc sauvegardez les versions que vous souhaitez comparer.
Reprenez une tâche existante ou redownload son résultat avec :
python3 flow.py status
Si la réponse de création a été perdue, listez les tâches récentes et reprenez l'ID pertinent :
python3 flow.py tasks
python3 flow.py status VIDEO_TASK_ID
Rechercher une tâche existante avant d'en créer une autre évite la génération accidentelle de doublons.
7. Réviser la sortie et itérer
Le projet source conserve video-v1-10s.mp4 et le final video.mp4. La première version n'a duré que 10 secondes et n'a pas montré suffisamment d'utilisation du produit, donc le flux de travail a traversé une seconde itération d'invite.
Vérifiez chaque résultat par rapport à cette liste de contrôle :
- [ ] La durée, la résolution et le rapport d'aspect correspondent à la cible.
- [ ] Le visage, la garde-robe et le décor du personnage restent cohérents.
- [ ] Le produit reste visible et son étiquette peut être lue au début et à la fin.
- [ ] Les actions de manipulation et de pulvérisation correspondent à l'utilisation réelle du produit.
- [ ] La forme de la bouteille, l'emballage et le texte ne changent pas de manière significative.
- [ ] La caméra ne se rapproche pas trop, et l'audio correspond à la demande.
Si la durée est incorrecte, inspectez à la fois la configuration et la requête réelle. Si le produit quitte le cadre, renforcez les limites de la caméra. Si l'action d'utilisation est trop courte, allouez plus explicitement le temps et le comportement. Modifier uniquement prompts/prompt-video.txt ne nécessite pas de régénérer les images de référence ; régénérez et enregistrez-les uniquement lorsque les références visuelles doivent changer.
Questions Fréquemment Posées
Pourquoi un nom de modèle qui semble correct renvoie-t-il 404 ?
Le nom abrégé de Seedream a renvoyé model_not_found dans le projet source. Utilisez l'ID de modèle API complet accepté par le point de terminaison actuel plutôt que de supposer que le nom d'affichage marketing est également l'identifiant API.
Pourquoi puis-je ouvrir une image dans mon navigateur mais échouer à l'enregistrer ?
Confirmez que l'URL renvoie l'image elle-même plutôt qu'une page HTML, une page de partage ou une page de connexion. Utilisez python3 flow.py check URL... avant l'enregistrement.
Pourquoi le changement d'une invite n'a-t-il pas changé l'image de référence ?
stills ignore les fichiers existants. Sauvegardez et déplacez toute image qui nécessite une régénération, puis vérifiez si les références en aval doivent également être régénérées.
HTTP 200 signifie-t-il que la vidéo est terminée ?
Non. Le script se divise en fonction du status de la tâche et télécharge uniquement après que la tâche atteint completed.
Commencez 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. Ensuite, laissez Claude Code adapter la description du produit et les invites. Générez les trois références, révisez et enregistrez-les, créez la vidéo et utilisez la liste de contrôle pour décider de la prochaine itération.
Lorsqu'un projet futur nécessite un autre modèle, conservez la même structure de fichiers et le même flux de travail, puis mettez à jour la sélection de modèles AIHubMix et les paramètres spécifiques au modèle. C'est la valeur pratique d'un service API unifié pour une équipe de contenu utilisant plusieurs modèles AI : les modèles peuvent changer par tâche tandis que le flux de travail reste réutilisable.



