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-personenactiva en Seedance gebruiken om een AI-productadvertentie te maken.

Deze tutorial is gebaseerd op een echte aloe-mistcampagne en omvat de projectstructuur, configuratie, commando's en een complete videoprompt. De doeloutput is een 20-seconden, 720p, 9:16 verticale advertentie met een AI-gegeneerde persoon en setting.

Claude Code en AIHubMix ondersteunen de volledige workflow. Claude Code leest de projectbrief, herziet prompts en organiseert de uitvoering. AIHubMix biedt één modeltoegangspunt, zodat beeld- en videoproductie binnen hetzelfde project kan plaatsvinden.

Model-ID's, parameters en foutafhandeling komen uit een projectsnapshot van 16 september 2026. Controleer de huidige API voordat je ze opnieuw gebruikt. Commando's gebruiken de meegeleverde flow.py en moeten vanuit de projectroot worden uitgevoerd.
0:00
/0:20

Download de Complete Starter

Download de code, prompts, configuratie en voorbeeldafbeeldingen

Na het uitpakken ga je naar de seedance-starter directory. 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 met Stap 4.
  • Begin met je eigen product: vervang de productafbeelding en promptdetails, verplaats de meegeleverde referentieafbeeldingen uit assets/, en begin met Stap 3.

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

1. Bereid de Productafbeelding en het Project Voor

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

BestandDoel
assets/product.pngOriginele productafbeelding
prompts/prompt-a.txtHoofdpersonage portret prompt
prompts/prompt-b.txtKarakter-houdend-product prompt
prompts/prompt-c.txtProduct-gebruik prompt
prompts/prompt-video.txtVideotijdlijn, camera- en audiobehoeften
prompts.jsonAfmetingen, duur, referentieafhankelijkheden en promptpaden
flow.pyAPI-aanvragen, activa-registratie, polling en downloads
seedream.schema.json, seedance.schema.jsonGecachede API-schema-snapshots

Claude Code helpt bij het lezen van de projectbrief en het herzien van configuratie en prompts. flow.py stuurt de daadwerkelijke aanvragen via AIHubMix.

Waarom AIHubMix past in deze workflow

Een AI-productadvertentieworkflow heeft meestal meer dan één model nodig. Een afbeeldingsmodel creëert de persoon en productreferenties; een videomodel creëert beweging en cameragedrag. AIHubMix dekt de meeste gangbare modellen, zodat je modellen per taak kunt selecteren via één API-service in plaats van aparte accounts, authenticatie en aanvraagtoegangspunten voor elke provider te onderhouden.

AIHubMix verbindt ook met meerdere leveranciers en selecteert automatisch een beschikbare route met lage latentie. Dit kan het effect van de instabiliteit van een enkele leverancier op een workflow verminderen die beeldgeneratie, activa-verwerking en videoproductie in volgorde moet voltooien. Modelbeschikbaarheid, routering en responstijd zijn nog steeds afhankelijk van de huidige servicevoorwaarden.

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

AIHUBMIX_API_KEY=vervang_met_jouw_api_sleutel

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

De gehele workflow begint met één duidelijke productafbeelding.

2. Stel het Doel van de Output In en Scheid Afbeelding van Videoparameters

Het relevante deel van prompts.json ziet er als volgt uit. Houd de bestaande stills array en andere velden aan bij het bewerken van het echte bestand.

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

size behoort tot beeldgeneratie. aspect_ratiodurationresolution, en generate_audio behoren tot videoproductie. Het script bouwt aparte aanvragen in plaats van het gehele configuratieobject naar beide eindpunten 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 tonen aan dat het afbeeldings-eindpunt size accepteert, terwijl het video-eindpunt aspect_ratio accepteert. Het mengen ervan veroorzaakt een afwijzing. flow.py controleert gecachede schema-eigenschappen voordat een aanvraag wordt verzonden, 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: KarakterportretBepaal gezicht, haar, garderobe, kamer en verlichtingTekstprompt alleen in dit voorbeeld
B: Houdt het product vastDezelfde persoon houdt de fles vast met het etiket naar de camera gerichtProductafbeelding + A
C: Het product gebruikenDezelfde persoon drukt op de spraypompProductafbeelding + B

De prompts herhalen de details van het karakter en beschrijven de vorm, kleuren, etikettenlay-out en natuurlijke hantering van het product.

Voer uit:

python3 flow.py stills

De resultaten worden opgeslagen als assets/frame-01.jpgframe-02.jpg en frame-03.jpg. Controleer de consistentie van het karakter, de trouw aan de verpakking en de realiteit van de gebruiksactie.

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

A: Karakterportret
AI-gegeneerd karakterportret
B: Houdt het product vast
Dezelfde persoon die het product vasthoudt
C: Het product gebruiken
Dezelfde persoon die het product gebruikt

De referenties vestigen de identiteit van het karakter, de presentatie van het product en het gebruik van het product.

4. Host de Afbeeldingen en Registreer Virtuele Portretactiva

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

Dit project gebruikt openbare afbeeldings-URL's voor registratie. De bronworkflow gebruikte GitHub-ruwe URL's die aan een commit SHA waren vastgepind, maar elke hosting die de afbeelding rechtstreeks zonder authenticatie retourneert, kan werken.

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

Vervang deze tijdelijke host 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 activa-groep, registreert elke afbeelding, wacht tot deze actief wordt, en schrijft de activa-ID's naar state.json.

Deze stap komt voort uit een daadwerkelijke mislukking in het project: het rechtstreeks doorgeven van fotorealistische karakter-URL's aan het video-eindpunt resulteerde in doubao_real_person_required. De persoon in deze campagne was AI-gegeneerd, dus virtual_portrait was de juiste classificatie. Een foto van een echte persoon moet het bijbehorende verificatieproces volgen en mag niet als virtueel worden geclassificeerd.

Alle activa die in één video-aanvraag worden gebruikt, moeten tot dezelfde groep behoren.

De referenties werden gegenereerd en alle drie activa waren actief; de videotask was nog steeds aan het draaien toen deze screenshot werd gemaakt.

5. Schrijf de Videoprompt als een Tijdlijn met Camerabeperkingen

De uiteindelijke projectprompt verdeelt één continue opname van 20 seconden in vier fasen:

TijdActie van het karakterProductpositie
0–5 secondenKijkt naar de camera en presenteert de flesNaast haar gezicht, etiket naar de camera gericht
5–10 secondenHef de fles op en druk op de pompBlijft binnen het kader
10–15 secondenSluit haar ogen en voelt de mist neerdalenOnderste derde van het kader
15–20 secondenOpent haar ogen en presenteert het product opnieuwTerug naast haar gezicht, etiket naar de camera gericht

Een eerder resultaat duwde de camera te dichtbij en verloor het product. De uiteindelijke prompt beperkt daarom de beweging tot een mid-close opname, vereist dat het product zichtbaar blijft en vraagt om een leesbaar etiket tijdens de eerste en laatste drie seconden.

prompts/prompt-video.txt. Voor een ander product, werk het merk, de verpakkingbeschrijving en de gebruiksactie bij. Deze instructies zijn generatie-doelen en vereisen nog steeds outputbeoordeling.

Een continue 20-seconden verticale beautycommercialopname, zonder snits, in een zonnige minimalistische vanityhoek.

0-5s: dezelfde 24-jarige Oost-Aziatische vrouw in een oversized saliegroene linnen shirt over een witte geribbelde tanktop staat bij de vanity met de doorschijnende lichtgroene Nature Republic Aloe Vera 92% Soothing Gel Mist naast haar wang, het etiket naar de camera gericht en volledig leesbaar. Ze kijkt naar de camera met een warme, gemakkelijke glimlach en draait de fles iets zodat het etiket het ochtendlicht vangt.

5-10s: ze tilt de fles net boven ooghoogte en drukt op de fijne mistpomp. Een zachte kegel van aloë-mist spuit over haar gezicht en vangt het licht als een vage sprankeling van micro-druppels.

10-15s: haar ogen sluiten en haar kin heft zich in een kleine tevreden glimlach terwijl de mist neerdwarrelt, kleine druppels rustend op haar jukbeen en voorhoofd. De fles blijft zichtbaar in de onderste derde van het kader gedurende deze beat.

15-20s: ze opent haar ogen, brengt de fles weer naast haar wang met het etiket vierkant naar de camera, en houdt een laatste rustige blik in de lens.

Camera: één langzame, soepele push-in van een borst-hoogte kader naar een mid-close kader ALLEEN. Duw niet voorbij een mid-close opname. Het product moet gedurende de hele opname binnen het kader blijven, en het etiket moet duidelijk leesbaar zijn in zowel de eerste drie seconden als de laatste drie seconden.

Uiterlijk: zacht diffuus ochtendlicht van camera links, fotorealistische huidtextuur met echte vochtigheid op de huid, mist weergegeven als echt gefotografeerde spray in plaats van digitale deeltjes, premium K-beauty reclame. Houd de productverpakking, kleuren, materialen, etikettenlay-out en etikettekst precies zoals in de referentieafbeeldingen; herontwerp of herletter het product niet. Geen tekstoverlays, geen bijschriften, geen watermerken.

Audio: een stille heldere kamer, één zachte korte pomp-spray fluit, een zachte adem. Geen muziek, geen voice-over.

Audio-generatie is ingeschakeld, maar de prompt vraagt alleen om kamertoon, één spraysound en een zachte adem—geen muziek of voice-over.

6. Genereer en Sla de Video Op

Na de registratie van activa, dien asset:// referenties in. Dit commando leest de opgeslagen ID's en geeft elke als een aparte 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 bronproject, waar verschillende ID's die in één gewone string zijn opgeslagen, als één ongeldige argument naar het script konden komen.

Het script slaat de video-taak-ID op, pollt totdat completed is bereikt, en downloadt de output naar out/video.mp4. Een andere download kan dat pad overschrijven, dus maak back-ups van versies die je wilt vergelijken.

Herstart een bestaande taak of download het resultaat opnieuw met:

python3 flow.py status

Als de create-respons verloren is gegaan, lijst recente taken en hervat de relevante ID:

python3 flow.py tasks
python3 flow.py status VIDEO_TASK_ID

Zoeken naar een bestaande taak voordat je een andere aanmaakt, voorkomt per ongeluk dubbele generatie.

7. Beoordeel de Output en Itereer

Het bronproject houdt video-v1-10s.mp4 en de finale video.mp4. De eerste versie duurde slechts 10 seconden en toonde niet genoeg productgebruik, dus de workflow ging door een tweede promptiteratie.

Beoordeel elk resultaat aan de hand van deze checklist:

  • [ ] Duur, resolutie en beeldverhouding komen overeen met het doel.
  • [ ] Het gezicht, de garderobe en de setting van het karakter blijven consistent.
  • [ ] Het product blijft zichtbaar en het etiket kan aan het begin en het einde worden gelezen.
  • [ ] Hantering en sprayacties komen overeen met het echte gebruik van het product.
  • [ ] Flesvorm, verpakking en tekst veranderen niet merkbaar.
  • [ ] De camera beweegt niet te dichtbij, en de audio komt overeen met de aanvraag.

Als de duur verkeerd is, inspecteer dan zowel de configuratie als de daadwerkelijke aanvraag. Als het product het kader verlaat, versterk dan de camerabeperkingen. Als de gebruiksactie te kort is, wijs dan tijd en gedrag explicieter toe. Het bewerken van alleen prompts/prompt-video.txt vereist geen regeneratie van referentieafbeeldingen; regenereer en registreer ze alleen wanneer de visuele referenties moeten veranderen.

0:00
/0:10

Veelgestelde Vragen

Waarom geeft een modelnaam die correct lijkt 404 terug?

De verkorte Seedream-naam gaf model_not_found terug in het bronproject. Gebruik de volledige API-model-ID die door het huidige eindpunt wordt geaccepteerd in plaats van aan te nemen dat de marketingweergavenaam ook de API-identificator is.

Waarom kan ik een afbeelding in mijn browser openen maar faal ik nog steeds om deze te registreren?

Bevestig dat de URL de afbeelding zelf retourneert in plaats van HTML, een deelpagina of een inlogpagina. Gebruik python3 flow.py check URL... voor registratie.

Waarom veranderde het wijzigen van een prompt de referentieafbeelding niet?

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

Betekent HTTP 200 dat de video is afgelopen?

Nee. Het script takelt op de taak's status en downloadt alleen nadat de taak completed heeft bereikt.

Begin je Eerste Versie

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

Wanneer een toekomstig project een ander model nodig heeft, houd dan dezelfde bestandsstructuur en workflow aan, en werk vervolgens de modelselectie en model-specifieke parameters van AIHubMix bij. Dat is de praktische waarde van een uniforme API-service voor een contentteam dat verschillende AI-modellen gebruikt: modellen kunnen per taak veranderen terwijl de workflow herbruikbaar blijft.