Communitygithub.com

funi-ai/ads

Production publicitaire structurée pour un produit réel de l'utilisateur : vidéos UGC et vidéos polies (présentateur, déballage, démonstration, témoignage, spot TV) et publicités statiques avec texte. Pour produits physiques, applications et SaaS.

Qu'est-ce que ads ?

Cette compétence permet de créer des publicités vidéo et statiques professionnelles à partir du produit réel de l'utilisateur, en respectant deux règles fondamentales : la fidélité du produit (chaque image d'un produit physique provient de la photo réelle de l'utilisateur via un point de terminaison d'édition, et les logiciels sont présentés uniquement via des captures d'écran et enregistrements réels) et la discipline des affirmations (toute allégation, citation, chiffre ou prix doit être justifié par une source fournie par l'utilisateur). Le système prend en charge de nombreux formats : vidéos UGC avec présentateur, déballage, démonstration, témoignage, spot TV, ainsi que des publicités statiques. Il est compatible avec les agents comme Claude Code et fonctionne via une chaîne de traitement qui commence par la vérification préalable avec les outils `genmedia`, suit un budget de questions limité, et gère le routage entre différents modèles (Seedance, Wan, OmniHuman, GPT Image, etc.) selon la langue, la durée et le type de contenu. La compétence inclut des vérifications de coûts, des étapes de validation clés, et une gestion des erreurs avec jusqu'à trois tentatives par étape. Les sorties sont des fichiers vidéo ou image assemblés localement avec ffmpeg, accompagnés d'un manifeste. Idéal pour les marketeurs, développeurs et créateurs de contenu souhaitant produire rapidement des publicités de haute qualité sans compromettre l'authenticité du produit.

Compatible avec✓Claude Code✓Codex CLI~Cursor✓Gemini CLI
npx skills add https://github.com/funi-ai/claude-plugins/tree/main/plugins/genmedia-skills/skills/ads

Demander à votre IA préférée

Ouvre une nouvelle conversation avec cette compétence d'agent déjà préchargée.

Documentation

Annonces

Une production publicitaire scénarisée pour un produit que l'utilisateur possède déjà : faits, script, liste de plans, images clés approuvées, clips, voix, montage, Assurance Qualité. Deux règles principales. Fidélité du produit : chaque image montrant un produit physique part de la photo de l'utilisateur via un point de terminaison d'édition ; rien n'est ré-imaginé à partir de texte ; les logiciels ne sont montrés qu'à travers les captures d'écran et enregistrements réels de l'utilisateur, composités et jamais passés par un modèle génératif (references/software-route.md). Discipline des affirmations : toute allégation, citation, chiffre et prix dans le script ou à l'écran provient de quelque chose que l'utilisateur a fourni ; rien n'est inventé.

Étape 0 — Pré-vol

command -v genmedia
python3 "${CLAUDE_SKILL_DIR}/scripts/gm.py" preflight
  • blockers non vide, CLI manquant ou plus ancien que 0.7.0 → /genmedia-skills:setup. Clé manquante → l'utilisateur exécute genmedia setup ou exporte FAL_KEY lui-même ; attendre. Ne jamais lire, imprimer, demander ou taper une clé.
  • Conserver config.announce_above_usd et config.confirm_above_usd (par défaut 0,50 et 2) pour le seuil de coût, et ffmpeg.found pour le chemin de montage.
  • Reprendre d'abord : Parcourir .genmedia/projects/*/plan.md. Un plan pour cette annonce existe → le lire, exécuter python3 "${CLAUDE_SKILL_DIR}/scripts/pipeline.py" urls --label <slug>, continuer à la première étape non terminée. Ne jamais redémarrer un projet qui a des entrées de registre. Un plan product-photoshoot pour le même produit → réutiliser son VERROU PRODUIT et les photos approuvées comme références d'images clés.

Règles UX

  1. Répondre dans la langue de l'utilisateur (Turc entrant → Turc sortant). Les invites du modèle sont en anglais ; les lignes parlées, les légendes et le texte sur l'image restent dans la langue du public, entre guillemets, orthographiés exactement comme approuvés.
  2. Pas de JSON, d'ID de requête ou de narration d'outil dans le chat. Attendre silencieusement ; au plus une ligne de statut par lot.
  3. Budget de questions : 3 avant le plan, une à la fois, sous forme d'options étiquetées (AskUserQuestion quand disponible), chacune avec un défaut que vous utilisez lorsque l'utilisateur saute. Ordre :
    • Produit : photo(s), ou pour un logiciel les captures réelles et un enregistrement d'écran, plus ce que c'est et ce qui est vrai à son sujet. Rien de joint → demander ; c'est la seule question sans défaut. Photo mais pas de faits → utiliser uniquement ce qui est imprimé sur l'emballage et visible sur la photo, et lister le reste sous "Omis".
    • Présentateur et voix. Défaut : un présentateur synthétique généré correspondant au public, voix dans la langue du public (la langue dans laquelle l'utilisateur écrit sauf indication contraire). Options : généré · un @handle · ma propre photo (consentement) · pas de présentateur.
    • Mode et plateforme. Défaut : présentateur parlant UGC, 15 s, 9:16 pour les flux de courte durée. "Statique" → format de titre, 4:5 plus 1:1. Sauter toute question à laquelle la demande répond déjà. Demande vague ("fais une annonce pour ça") → tous les défauts, listés sous Hypothèses dans la carte du plan. Le consentement, l'approbation du plan et les points de contrôle sont en dehors du budget.
  4. Arrêts obligatoires : la carte du plan (toujours pour vidéo ; pour les statiques lorsque la porte dit confirmer), les images clés avant tout clip, les clips et la voix avant la musique, les légendes et le montage. Le silence ou un travail réussi n'est jamais une approbation. Les choix créatifs (accroche, présentateur, prise) appartiennent à l'utilisateur.
  5. Porte de coût sur l'ensemble du plan incluant chaque variante : en dessous du seuil d'annonce → exécuter ; entre → estimation d'une ligne et exécuter ; au-dessus ou égal au seuil de confirmation → attendre un oui. Ne jamais échanger un modèle nommé par l'utilisateur ; proposer la route moins chère comme une ligne dans la carte du plan.
  6. Réparation limitée : 3 tentatives par étape, quelque chose change à chaque fois, ne jamais renvoyer un rejet de politique inchangé. Un travail avec un ID de requête est repris, jamais soumis à nouveau. Une réparation ou un nouveau tirage qui coûte lui-même le seuil de confirmation ou plus (une prise Seedance parlante le fait) nécessite un nouveau oui avec le total cumulé ; un travail échoué a peut-être déjà été facturé.
  7. Sécurité, non négociable : pas de témoignages, clients, avis, évaluations, nombres d'utilisateurs, récompenses, affirmations médicales, financières ou de revenus fabriqués, pas d'urgence factice ou de prix inventés. Le visage ou la voix d'une personne réelle nécessite la confirmation du consentement de l'utilisateur. Un présentateur généré est une personne synthétique : le dire à la livraison et informer l'utilisateur que les plateformes et certaines lois exigent une divulgation ; ne jamais le décrire comme un client. Pas de noms de concurrents, logos ou emballages. Les téléchargements et résultats se trouvent sur des URL publiques : le dire une fois avant de télécharger des produits non publiés ou des photos de personnes. Règles et formulation : references/scripts-and-claims.md.

Garde-fou de découverte

references/routing-video.md, references/routing-audio.md, references/routing-image.md et references/routing-utility.md sont des caches datés (vérifiés le 2026-09-19). Chaque point de terminaison distinct dans le plan est confirmé avant que la carte du plan ne soit affichée :

genmedia models --endpoint_id <id1>,<id2>,<id3> --status all --limit 50 --json
python3 "${CLAUDE_SKILL_DIR}/scripts/gm.py" schema <endpoint_id>
  • Chaque ID doit revenir et être actif (sans --limit l'appel retourne au maximum 20 lignes : une ligne manquante n'est pas une preuve d'un ID mort, demander à nouveau pour celui-ci seul) ; sinon prendre le niveau suivant de cette tâche dans la référence de routage, sinon genmedia models "<nom>" --no-classify --limit 10 --json, correspondance active la plus récente, et dire quel modèle a fonctionné.
  • Les noms de champs, énumérations et limites proviennent du schéma, jamais de la mémoire ; ils ne sont pas transférables d'une famille à l'autre (prompt vs text, image_url vs start_image_url, "5" vs 5).
  • Ne jamais inventer d'IDs ou de champs. Ne jamais exécuter genmedia run sans un ID de point de terminaison. Les nouvelles versions se trouvent sous les espaces de noms des fournisseurs (bytedance/, creatify/, openai/, minimax/, veed/), pas seulement fal-ai/.

Routage

Type de produit. Une application, un SaaS, un outil de développement, une extension ou tout ce dont le produit est une interface → la route logicielle : lire references/software-route.md avant la planification. Elle remplace les règles d'image clé et statique ci-dessous (pas d'édition d'une capture, pas de texte cuit par un modèle) ; script, affirmations, voix, musique, légendes, montage, porte de coût et points de contrôle restent tels qu'écrits ici.

Livrable. Mots statiques ("görsel", "bannière", "statique", "carrousel", un titre donné) → format statique, references/static-formats.md. Mots de mouvement ou de voix, ou rien dit → vidéo, mode depuis references/ad-modes.md : presenter (défaut), how-to, unboxing, showcase, problem-solution, testimonial (uniquement avec une citation réelle fournie par l'utilisateur), tv-spot.

Voie de production pour la vidéo (la première correspondance gagne) :

SituationRoute
Pas de parole à l'écran : vitrine, spot TV ou tutoriel avec voix-offB sans tête parlante : images de coupe + voix-off + musique
La langue parlée n'est pas l'anglaisB. Turc sur route A uniquement sur Wan 3.0, jamais Seedance : dans une écoute native (references/platform.md section 10) Wan était correct, tandis que chaque version de Seedance a mal prononcé (ş comme s, "merhala") ; Veo 3.1 Lite, impeccable là, n'est plus listé sur fal. A seulement après qu'un clip de test a passé le contrôle d'écoute de l'utilisateur
Le libellé doit être exact (nom de marque, prix, mention légale), une voix de marque fixe, ou la même voix sur toutes les variantesB : TTS dit exactement le texte ; les modèles audio natifs paraphrase et mal prononcent
Plus long que 15 s, ou présentateur plus coupures d'images de coupeB
Anglais, une prise continue de 6 à 15 s, le présentateur parle à la caméraA
  • Route A : une génération prononce la ligne. Image clé approuvée (présentateur avec le vrai produit) → image-vers-vidéo audio native.
  • Route B : TTS par bloc (blocs à l'écran, blocs voix-off) → tête parlante pour les blocs à l'écran uniquement → images de coupe à partir d'images clés approuvées → monter. Voix d'abord : sa longueur mesurée définit la durée de chaque clip.

Valeurs par défaut des rôles (actif le 2026-09-19 ; les prix sont des indices datés, gm.py price décide)

RôlePoint de terminaisonPourquoiIndice de prix
Image clé, présentateur ou scène avec le produitbytedance/seedream/v5/pro/editjusqu'à 10 références gardent le produit et le présentateur~USD 0.07/image + USD 0.0045 par référence supplémentaire
Carte de fin, annonce statique, toute image avec texte exactopenai/gpt-image-2.5/flare/editla plus forte fidélité textuelle, jusqu'à 16 références~USD 0.06/image à quality: "high"
Plaque de présentateur généré (une personne seulement, jamais le produit)bytedance/seedream/v5/pro/text-to-imagequalité par défaut pour les personnes~USD 0.07/image
A : clip parlant, qualitébytedance/seedance-2.5/us/image-to-videoarène #1 pour la parole native synchronisée ; 4 à 30 s~USD 0.57/s à 720p, ~USD 0.26/s à 480p
A : clip parlant, turcalibaba/wan-3.0/image-to-video (start_image_url)le seul modèle audio natif listé dont le turc a passé une écoute native (2026-09-21) ; duration entier, définir resolution~USD 0.05/s à 480p, ~USD 0.10/s à 720p
A : clip parlant, brouillon ou budget, anglaiscreatify/borealconçu pour les annonces ; invite [VISUAL] [SPEECH] [SOUNDS] ; sa page de modèle nomme l'anglais comme langue validée ; étiquette IA visible optionnelle~USD 0.01/s à 720p
B : voix, anglaisfal-ai/elevenlabs/tts/eleven-v3TTS par défaut~USD 0.10 par 1000 caractères
B : voix, turc et autres langues listéesfal-ai/gemini-3.1-flash-ttsl'énumération language_code liste "Turc (Turquie)" ; style_instructions~USD 0.05 par 1000 caractères
B : tête parlantefal-ai/bytedance/omnihuman/v1.5image + audio ; moins de 60 s à 720p~USD 0.16/s d'audio
B : tête parlante, brouillonveed/fabric-1.0 à 480pmoitié du prix ; resolution est requis~USD 0.08/s
Images de coupe, qualitébytedance/seedance-2.5/us/image-to-videoend_image_url optionnel pour les révélations~USD 0.57/s à 720p
Images de coupe, brouillon ou budgetminimax/h3-max-turbo/image-to-videocentimes par clip~USD 0.04/s à 768P (remise de lancement terminée le 2026-09-30)
Fond musicalelevenlabs/music/v2.5durée exacte via music_length_ms~USD 0.60 par minute commencée
Sous-titresfal-ai/workflow-utilities/auto-subtitle ; texte exact (toute langue) : veed/subtitlesincrusté sans drawtext local~USD 0.03/min ; veed ~USD 0.10/min, 1 min minimum
Concat, mux, redimensionnement, clip de carte de finffmpeg local, sinon references/routing-utility.mdgratuit et exact quand ffmpeg.foundcentimes

Critères de départage :

  1. L'utilisateur a nommé un modèle → l'utiliser après la vérification en direct ; mentionner le défaut en une ligne, ne jamais échanger silencieusement.
  2. La voie qualité franchit le seuil de confirmation (une prise Seedance 2.5 de 15 s à 720p coûte environ 8,50 USD) → la carte du plan montre le prix qualité et le prix brouillon côte à côte ; l'utilisateur choisit. Ne jamais choisir le moins cher silencieusement.
  3. @handle → /genmedia-skills:character le résout en URL de référence et texte d'ancrage ; utiliser ceux-ci comme références de présentateur dans le travail d'image clé. Ne jamais laisser @handle dans une invite.
  4. Pas de photo du produit → en demander une (logiciel : captures). Aucune n'existe → concept seulement : passer à /genmedia-skills:image et dire que ce ne sera pas leur vrai produit. Un logiciel sans captures obtient un script et une liste de captures, jamais une interface inventée.
  5. Captures d'écran de listing de magasin, cartes de lien ou images Product Hunt, et toute "création" Apple Ads (Apple construit ses annonces à partir de la page produit) → /genmedia-skills:launch-graphics. Seules des photos de produit sans texte sont souhaitées → /genmedia-skills:product-photoshoot. Un seul clip sans script → /genmedia-skills:video. Un court organique sans intention publicitaire → /genmedia-skills:short-video. Un explainer narré → /genmedia-skills:video-explainer. Cartes de listing de marketplace → /genmedia-skills:marketplace-cards. Une miniature ou couverture → /genmedia-skills:youtube-thumbnail.

Pièges nommés :

  • Produit ré-imaginé. Le texte-vers-vidéo ou texte-vers-image dessine un sosie. Chaque image de produit est une édition de la photo de l'utilisateur, et chaque clip de produit commence par une image clé approuvée.
  • Interface générée. Une édition, un texte-vers-image ou un travail vidéo qui touche une capture retourne une interface mal orthographiée et inventée, et les plateformes rejettent les annonces qui montrent des fonctionnalités que l'application n'a pas. Les pixels d'interface proviennent des pages launch-graphics et de l'enregistrement ; le mouvement provient de l'enregistrement ou d'une poussée locale.
  • Texte issu d'un modèle vidéo. Les titres, prix, logos, légendes et mentions légales issus d'un modèle vidéo sortent déformés. Laisser un espace négatif dans l'image clé ; le texte arrive sur la carte de fin (modèle typographique), sous forme de légendes incrustées, ou dans l'éditeur de l'utilisateur.
  • Discours Kling. Kling v3 parle uniquement chinois ou anglais et traduit automatiquement tout le reste en anglais. Ne jamais y router un dialogue en turc.
  • Toile Flashtalk. Le schéma de fal-ai/flashtalk documente une sortie paysage fixe de 768x448 : inutilisable pour une annonce 9:16. Les têtes de brouillon vont vers veed/fabric-1.0.
  • Mux coupe à l'entrée la plus courte. fal-ai/ffmpeg-api/merge-audio-video est aussi long que le plus court entre l'image et le son (une longue voix perd sa fin, une courte coupe l'image) et remplace l'audio propre du clip. Toujours la même longueur pour les deux.
  • duration: "auto" sur Seedance rend le coût inconnu. Toujours le définir. Boreal et MiniMax prennent un nombre, Seedance une chaîne.
  • Défaut OmniHuman. resolution est par défaut 1080p (audio moins de 30 s). Envoyer "720p" sauf si l'utilisateur a demandé 1080p.
  • Client synthétique. Un visage généré disant "J'ai perdu 8 kilos" est un témoignage fabriqué, quelle que soit l'invite. Voir references/scripts-and-claims.md.

Flux de travail

  1. Prise en charge dans le budget de questions. Choisir un slug (serum-ugc) : c'est l'étiquette du lot, le filtre du registre, genmedia-output/<slug>/ et .genmedia/projects/<slug>/. Tout libellé en langage naturel fonctionne ; les aides translittèrent les lettres turques. Plateforme → format et durée : references/ad-modes.md (tableau des plateformes ; vérifier les spécifications publicitaires actuelles de la plateforme).
  2. Examiner chaque photo du produit avec l'outil Read. HEIC, AVIF, TIFF ou CMJN → convertir d'abord en PNG ou JPEG sRVB (references/troubleshooting-ads.md). Écrire le VERROU PRODUIT dans .genmedia/projects/<slug>/plan.md : forme, proportions, matériaux, couleurs, texte de l'étiquette textuellement, ce qui ne doit jamais changer, quels côtés ne sont pas visibles.
  3. Fiche de faits. Lister ce qui est vrai à propos du produit et d'où vient chaque fait : le message de l'utilisateur, les notes de marque, l'emballage lui-même, ou une page produit.
  4. Script. Format : references/scripts-and-claims.md. L'écrire dans .genmedia/projects/<slug>/plan.md. Le script comprend les lignes parlées, les instructions d'écran (b-roll, changements de plans), le texte à l'écran (légendes, titres, texte sur l'image) et les notes sonores. Les citations, chiffres et des prix sont marqués avec des vérifications de source. Le script détermine la durée totale de la vidéo et des lignes parlées.
  5. Liste de plans : Décomposer chaque scène en prises individuelles avec le type de plan (gros plan, plan moyen, plan large), la durée et ce qui se passe. La liste de plans est dans .genmedia/projects/<slug>/plan.md.
  6. Images clés : Générer une image clé par scène ou clip. Chaque image clé est une édition de la photo du produit avec le présentateur et l'arrière-plan, jamais un rendu de texte à image. Approuver chaque image clé avant de passer aux clips.
  7. Clips vidéo : Générer des clips vidéo à partir d'images clés approuvées en utilisant la voie de production sélectionnée (A ou B). Le premier clip est toujours le clip parlant (le cas échéant) ; les images de coupe viennent ensuite.
  8. Voix et Musique : Générer la voix-off (TTS) si la route B. Générer la musique de fond avec elevenlabs/music/v2.5.
  9. Montage et Sous-titres : Concaténer tous les clips, mixer l'audio (voix, musique), et ajouter des sous-titres avec fal-ai/workflow-utilities/auto-subtitle ou veed/subtitles. Le montage est effectué localement avec ffmpeg.
  10. Assurance Qualité : Vérifier que la vidéo finale respecte les spécifications de la plateforme (format, durée, taille de fichier). Vérifier que toutes les affirmations sont vérifiables à partir du script. Signaler la vidéo comme terminée.

Structure de sortie

Le travail final est stocké dans genmedia-output/<slug>/ et comprend :

  • manifest.json : liste de tous les actifs générés avec leurs URL, types et rôles.
  • <slug>.mp4 ou <slug>.png : le livrable final (vidéo ou image).
  • plan.md : le plan complet avec le script, la liste de plans et les décisions.
  • *.jpg, *.png : images clés et b-roll.
  • *.wav, *.mp3 : fichiers audio (voix, musique).
  • *.srt : fichiers de sous-titres (le cas échéant).

Le manifeste est formaté comme suit :

{
  "label": "<slug>",
  "type": "ad-video" | "ad-static",
  "created_at": "<timestamp ISO 8601>",
  "assets": [
    { "role": "keyframe", "url": "..." },
    { "role": "clip", "url": "..." },
    { "role": "voice", "url": "..." },
    { "role": "music", "url": "..." },
    { "role": "final", "url": "..." }
  ]
}

Commandes CLI utiles

  • genmedia models --endpoint_id <id> --status active : Vérifier la disponibilité d'un point de terminaison.
  • genmedia run --endpoint_id <id> --input <json> : Exécuter un point de terminaison avec des entrées spécifiques.
  • python3 scripts/pipeline.py urls --label <slug> : Récupérer les URL d'un projet existant.
  • python3 scripts/gm.py preflight : Exécuter les vérifications pré-vol.
  • python3 scripts/gm.py price --model <id> : Obtenir une estimation de prix pour un modèle.
  • python3 scripts/gm.py schema <id> : Obtenir le schéma JSON d'un point de terminaison.

Notes importantes

  • Conserver les fichiers dans genmedia-output/<slug>/ pour chaque projet.
  • Les fichiers de plan persistent dans .genmedia/projects/<slug>/plan.md.
  • Les fichiers de registre persistent dans .genmedia/ledger.jsonl.
  • L'image de sortie est toujours dans l'espace colorimétrique sRVB.
  • L'audio de sortie est toujours de l'AAC à 44,1 kHz.
  • La vidéo de sortie est toujours H.264 avec des dimensions et un débit binaire appropriés pour la plateforme cible.

Individual skills in this repo

This repo contains 2 individual skills — each has its own dedicated page.

funi-ai/demo-video

Product demos, store previews, App Store header/search videos and loops cut from the user's REAL screen recording: trimmed, sped, zoomed, framed, captioned, voiced with local ffmpeg. Models add only what is not the product: narration (Eleven v3, Gemini TTS for Turkish), music and UI sound. Use when: "make a demo video of my app", "App Store preview video", "App Store header video", "Google Play promo video", "turn this screen recording into a demo", "GIF loop for my changelog", "Product Hunt launch video", "ekran kaydımdan tanıtım videosu yap", "changelog için GIF döngüsü". Chain: takes recordings, device frames (`layers`) and end cards from `launch-graphics`; produces MP4, WebM, GIF, SRT/VTT and posters. NOT for: generated b-roll shorts (use `short-video`); explainers with generated pictures (use `video-explainer`); paid ads (use `ads`); store screenshots, link cards (use `launch-graphics`); one generated clip (use `video`); voice or music alone (use `audio`); joining finished files (use `pipelines`).

funi-ai/youtube-thumbnail

Thumbnails and covers that survive at small size: YouTube thumbnails (16:9), Shorts, Reels and TikTok covers (9:16), podcast and course covers (1:1), from a title plus an optional face photo, @handle character, brand colours or a frame of the user's own video. Text baked in by GPT Image 2.5; faces locked through reference edits. Use when: "make a thumbnail for my video", "YouTube thumbnail with my face", "Shorts cover", "podcast cover art", "thumbnail from this frame", "change only the text on the thumbnail", "videoma thumbnail yap", "kapak görseli hazırla", "küçük resimdeki yazıyı değiştir". Chain: consumes an @handle from `character` and stills or frames from `image` and `video`; produces sized PNG and JPEG. NOT for: posters, photo edits (use `image`); logos (use `brandkit`); link cards, OG images (use `launch-graphics`); ad creatives (use `ads`); the video (use `video`, `short-video`); new characters (use `character`); batches (use `pipelines`); model choice (use `models`); setup problems (use `setup`).

Skills associés