Hoe maak je een AI-productadvertentie met Claude Code en AIHubMix

AIHubMix9 min leestijd
Hoe maak je een AI-productadvertentie met Claude Code en AIHubMix

Met één duidelijke productafbeelding, Claude Code en de AIHubMix API kun je karakterreferenties genereren in Seedream, deze registreren als virtuele-persoon-assets en met Seedance een AI-productadvertentie maken.

Deze tutorial is gebaseerd op een echte aloë-mist-campagne en bevat de projectstructuur, configuratie, commando's en de volledige videoprompt. Het beoogde resultaat is een advertentie van 20 seconden, 720p, verticaal 9:16 met een door AI gegenereerd persoon en omgeving.

Claude Code en AIHubMix vormen samen de volledige workflow. Claude Code leest de projectbeschrijving, past prompts aan en organiseert de uitvoering. AIHubMix biedt één modelingang, zodat beeld- en videogeneratie binnen hetzelfde project kunnen werken.

Modelcodes, parameters en foutafhandeling komen uit een projectsnapshot van 16 september 2026. Controleer de huidige API voordat je ze opnieuw gebruikt. Commando's gebruiken het meegeleverde flow.py en moeten vanuit de projectroot worden uitgevoerd.

Download de volledige starter

Download de code, prompts, configuratie en voorbeeldafbeeldingen:

https://drive.google.com/uc?export=download&id=1nXcj26Fq3daHeTd0SynS7_QEXgH8z4u_

Ga na het uitpakken naar de map seedance-starter . Het pakket bevat flow.py, twee schema-snapshots, vijf promptbestanden, de productafbeelding en drie referentieafbeeldingen. Het Python-script gebruikt alleen de standaardbibliotheek.

  • Begin met de videofase: gebruik de drie meegeleverde referenties, configureer je sleutel en begin bij stap 4.
  • Begin met je eigen product: vervang de productafbeelding en promptdetails, verplaats de meegeleverde referentieafbeeldingen uit assets/ en begin bij stap 3.

Kopieer .env.example naar .env en voeg je eigen API-sleutel toe. Je account moet toegang hebben tot de relevante modellen, eventuele vereiste toestemming voor asynchrone taken en voldoende quota. API-generatie brengt gebruikskosten met zich mee.

1. Bereid de productafbeelding en het project voor

Het voorbeeldproduct is Nature Republic Aloe Vera Mist. Werk bij het aanpassen van de workflow de afbeelding, productbeschrijving en gebruikshandeling samen bij.

BestandDoel
assets/product.pngOorspronkelijke productafbeelding
prompts/prompt-a.txtPrompt voor hoofdportret van het personage
prompts/prompt-b.txtPrompt voor personage dat het product vasthoudt
prompts/prompt-c.txtPrompt voor productgebruik
prompts/prompt-video.txtVideotijdlijn, camera- en audiovereisten
prompts.jsonAfmetingen, duur, referentie-afhankelijkheden en promptpaden
flow.pyAPI-verzoeken, asset-registratie, polling en downloads
seedream.schema.json, seedance.schema.jsonGecachete API-schema-snapshots

Claude Code helpt bij het lezen van de projectbeschrijving en het aanpassen van configuratie en prompts. flow.py stuurt de daadwerkelijke verzoeken via AIHubMix.

Waarom AIHubMix goed past bij deze workflow

Een AI-productadvertentie-workflow heeft meestal meer dan één model nodig. Een beeldmodel maakt de persoon- en productreferenties; een videomodel maakt beweging en cameragedrag. AIHubMix dekt de meeste gangbare modellen, zodat je modellen per taak kunt kiezen via één API-service in plaats van voor elke aanbieder afzonderlijke accounts, authenticatie en aanvraagpunten te beheren.

AIHubMix is ook verbonden met meerdere leveranciers en kiest automatisch een beschikbare route met lage latentie. Dit kan het effect verminderen van de instabiliteit van één leverancier op een workflow die beeldgeneratie, asset-verwerking en videogeneratie na elkaar moet voltooien. Modelbeschikbaarheid, routering en responstijd hangen nog steeds af van de actuele serviceomstandigheden.

Maak .env in de projectroot, of geef dezelfde variabele op in je omgeving:

AIHUBMIX_API_KEY=replace_with_your_api_key

Het project sluit .env uit via .gitignore. Deel alleen de variabelenaam en het voorbeeld, nooit de echte sleutel.

De hele workflow begint met één duidelijke productafbeelding.

2. Stel het uitvoerdoel in en scheid beeld- en videoparameters

Het relevante deel van prompts.json ziet er zo uit. Behoud de bestaande stills-array en andere velden wanneer je het echte bestand bewerkt.

{
  "size": "1080x1920",
  "aspect_ratio": "9:16",
  "duration": 20,
  "resolution": "720p",
  "generate_audio": true,
  "video_prompt_file": "prompts/prompt-video.txt"
}

size hoort bij beeldgeneratie. aspect_ratio, duration, resolution en generate_audio horen bij videogeneratie. Het script bouwt afzonderlijke verzoeken in plaats van de volledige configuratie naar beide endpoints te sturen.

Het project gebruikt deze model-ID's:

  • Seedream: doubao-seedream-5-0-pro-260628
  • Seedance: doubao-seedance-2-5-260628

De meegeleverde schema-snapshots laten zien dat het beeld-endpoint size accepteert, terwijl het video-endpoint aspect_ratio accepteert. Ze door elkaar gebruiken leidt tot afwijzing. flow.py controleert de gecachete schema-eigenschappen voordat een verzoek wordt verstuurd, maar dit is geen volledige parametervalidatie.

3. Genereer de drie karakterreferenties in volgorde

Elke afbeelding heeft een andere rol, en latere afbeeldingen zijn afhankelijk van eerdere:

ReferentieInhoudInvoer
A: KarakterportretVastleggen van gezicht, haar, kleding, kamer en belichtingIn dit voorbeeld alleen een tekstprompt
B: Het product vasthoudenDezelfde persoon houdt de fles vast met het etiket naar de cameraProductafbeelding + A
C: Het product gebruikenDezelfde persoon drukt op de spraypompProductafbeelding + B

De prompts herhalen de karakterdetails en beschrijven de vorm, kleuren, etiketindeling en natuurlijke hantering van het product.

Voer uit:

python3 flow.py stills

De resultaten worden opgeslagen als assets/frame-01.jpg, frame-02.jpg en frame-03.jpg. Controleer de consistentie van het personage, de getrouwheid van de verpakking en de realistische uitstraling van de gebruikshandeling.

Het script slaat bestaande bestanden over. Als je een prompt wijzigt, maak dan een back-up van het bijbehorende uitvoerbestand en verplaats het voordat je opnieuw uitvoert. Het wijzigen van A kan ook vereisen dat B en C opnieuw worden gegenereerd.

De referenties leggen de identiteit van het personage, de productpresentatie en het productgebruik vast.

4. Host de afbeeldingen en registreer virtuele-portretassets

De starter bevat geen asset-ID uit het account van de auteur. Registreer de referenties in je eigen account.

Dit project gebruikt publieke afbeeldings-URL's voor registratie. De oorspronkelijke workflow gebruikte GitHub raw-URL's die vastgepind waren aan een commit-SHA, maar elke hosting die de afbeelding direct en zonder authenticatie teruggeeft, werkt.

Een GitHub /blob/ -URL geeft een HTML-pagina terug en kan niet als afbeeldings-URL worden gebruikt.

Vervang deze voorbeeldhost door de echte locatie van je geüploade bestanden:

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 verifieert HTTP 200 en een afbeeldings-Content-Type. assets maakt of hergebruikt een virtual_portrait -assetgroep, registreert elke afbeelding, wacht tot deze active wordt en schrijft de asset-ID's naar state.json.

Deze stap komt voort uit een echte fout in het project: het direct doorgeven van fotorealistische karakter-URL's aan het video-endpoint leverde doubao_real_person_required op. De persoon in deze campagne was door AI gegenereerd, dus virtual_portrait was de juiste classificatie. Een foto van een echt persoon moet het bijbehorende verificatieproces doorlopen en mag niet als virtueel worden gelabeld.

Alle assets die in één videoverzoek worden gebruikt, moeten tot dezelfde groep behoren.

De referenties zijn gegenereerd en alle drie de assets waren actief; de videotaak liep nog toen deze schermafbeelding werd gemaakt.

5. Schrijf de videoprompt als tijdlijn met cameragrenzen

De uiteindelijke projectprompt verdeelt één doorlopende shot van 20 seconden in vier fasen:

TijdHandeling van het personagePositie van het product
0–5 secondenKijkt naar de camera en presenteert de flesNaast haar gezicht, etiket naar de camera
5–10 secondenTilt de fles op en drukt op de pompBlijft binnen het beeld
10–15 secondenSluit haar ogen en voelt de mist neerdalenOnderste derde van het beeld
15–20 secondenOpent haar ogen en presenteert het product opnieuwTerug naast haar gezicht, etiket naar de camera

Een eerder resultaat duwde de camera te dicht op het product en verloor het. De uiteindelijke prompt beperkt de beweging daarom tot een halfnabije shot, vereist dat het product zichtbaar blijft en vraagt om een leesbaar etiket tijdens de eerste en laatste drie seconden.

Hier is het volledige prompts/prompt-video.txt. Voor een ander product pas je het merk, de verpakkingsbeschrijving en de gebruikshandeling aan. Deze instructies zijn generatiedoelen en vereisen nog steeds controle van het resultaat.

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.

Audiogeneratie is ingeschakeld, maar de prompt vraagt alleen om kamergeluid, één spuitgeluid en een zachte ademhaling, geen muziek of voice-over.

6. Genereer en sla de video op

Na de asset-registratie dien je asset:// -referenties in. Dit commando leest de opgeslagen ID's en geeft elk ID als afzonderlijk argument door:

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

Het gebruik van een argumentenlijst voorkomt ook een zsh-probleem uit het oorspronkelijke project, waarbij meerdere ID's in één gewone string het script als één ongeldig argument konden bereiken.

Het script slaat het video-taak-ID op, wacht tot completed wordt bereikt en downloadt de uitvoer naar out/video.mp4. Een andere download kan dat pad overschrijven, dus maak een back-up van versies die je wilt vergelijken.

Hervat een bestaande taak of download het resultaat opnieuw met:

python3 flow.py status

Als het antwoord van het aanmaken verloren is gegaan, toon dan recente taken en hervat het relevante ID:

python3 flow.py tasks
python3 flow.py status VIDEO_TASK_ID

Eerst zoeken naar een bestaande taak voordat je een nieuwe aanmaakt, voorkomt per ongeluk dubbele generatie.

7. Controleer de uitvoer en itereer

Het oorspronkelijke project bewaart video-v1-10s.mp4 en de definitieve video.mp4. De eerste versie duurde slechts 10 seconden en toonde onvoldoende productgebruik, dus de workflow doorliep een tweede promptiteratie.

Controleer elk resultaat aan de hand van deze checklist:

  • [ ] Duur, resolutie en beeldverhouding komen overeen met het doel.
  • [ ] Gezicht, kleding en omgeving van het personage blijven consistent.
  • [ ] Het product blijft zichtbaar en het etiket is aan het begin en einde leesbaar.
  • [ ] Hantering en spuitacties komen overeen met het echte gebruik van het product.
  • [ ] Vorm van de fles, verpakking en tekst veranderen niet merkbaar.
  • [ ] De camera komt niet te dichtbij en het geluid komt overeen met het verzoek.

Als de duur niet klopt, controleer dan zowel de configuratie als het daadwerkelijke verzoek. Als het product uit beeld verdwijnt, verscherp dan de cameralimieten. Als de gebruiksactie te kort is, geef dan tijd en gedrag explicieter aan. Alleen prompts/prompt-video.txt bewerken vereist niet dat je de referentie-afbeeldingen opnieuw genereert; genereer en registreer ze alleen opnieuw wanneer de visuele referenties moeten veranderen.

Veelgestelde vragen

Waarom geeft een modelnaam die correct lijkt een 404?

De ingekorte Seedream-naam gaf in het bronproject model_not_found terug. Gebruik de volledige API-model-ID die het huidige endpoint accepteert, in plaats van aan te nemen dat de marketingnaam ook de API-identificatie is.

Waarom kan ik een afbeelding in mijn browser openen maar lukt registratie toch niet?

Controleer of de URL de afbeelding zelf teruggeeft en niet HTML, een deelpagina of een inlogpagina. Gebruik python3 flow.py check URL... vóór registratie.

Waarom veranderde de referentie-afbeelding niet toen ik een prompt wijzigde?

stills slaat bestaande bestanden over. Maak een back-up van elke afbeelding die opnieuw gegenereerd moet worden en verplaats die, en controleer daarna of afhankelijke referenties ook opnieuw gegenereerd moeten worden.

Betekent HTTP 200 dat de video klaar is?

Nee. Het script kijkt naar de status van de taak en downloadt pas wanneer de taak completed bereikt.

Begin met je eerste versie

Bereid één productafbeelding voor, configureer de AIHubMix-toegang en kies de afbeeldings- en videomodellen. Laat Claude Code vervolgens de productbeschrijving en prompts aanpassen. Genereer de drie referenties, controleer en registreer ze, maak de video en gebruik de checklist om te bepalen wat de volgende iteratie wordt.

Wanneer een toekomstig project een ander model nodig heeft, behoud dan dezelfde bestandsstructuur en workflow en werk daarna de modelselectie in AIHubMix en de modelspecifieke parameters bij. Dat is de praktische waarde van een uniforme API-service voor een contentteam dat meerdere AI-modellen gebruikt: modellen kunnen per taak wisselen terwijl de workflow herbruikbaar blijft.

Eén gateway naar meerdere AI-aanbieders. Gebouwd voor productie.

Bezoek AIHubMix