diff --git a/projects/judge-dashboard/index.html b/projects/judge-dashboard/index.html index 76f8723..0d3d869 100644 --- a/projects/judge-dashboard/index.html +++ b/projects/judge-dashboard/index.html @@ -1590,8 +1590,8 @@

Step 5: Generate variants

-
- Total cost (internal) +
+ Total cost
@@ -1669,7 +1669,7 @@

Step 5: Generate variants

{ label: "Holiday gift", headline: "Make hers unforgettable", subhead: "From the icon to the everyday", cta: "Shop the collection" }, { label: "Fragrance loyalist", headline: "Your signature, refined", subhead: "Three icons, one collection", cta: "Discover" } ], - formats: ["1:1", "9:16"] + formats: ["1:1", "9:16", "4:5"] }, uploads: { hero1: { preview_url: `${PRESET_ASSET_BASE}/chanel/hero1.jpg`, runflow_uri: `${PRESET_ASSET_BASE}/chanel/hero1.jpg`, filename: "hero1.jpg" }, @@ -1680,16 +1680,22 @@

Step 5: Generate variants

runs: [ {"hero_idx": 1, "cut_idx": 1, "format": "1:1", "status": "succeeded", "image": "https://templates.runflow.io/judge-dashboard/presets/chanel/runs/h1-c1-1x1.jpg", "cost": null, "duration_ms": null}, {"hero_idx": 1, "cut_idx": 1, "format": "9:16", "status": "succeeded", "image": "https://templates.runflow.io/judge-dashboard/presets/chanel/runs/h1-c1-9x16.jpg", "cost": null, "duration_ms": null}, + {"hero_idx": 1, "cut_idx": 1, "format": "4:5", "status": "succeeded", "image": "https://templates.runflow.io/judge-dashboard/presets/chanel/runs/h1-c1-4x5.jpg", "cost": null, "duration_ms": null}, {"hero_idx": 1, "cut_idx": 2, "format": "1:1", "status": "succeeded", "image": "https://templates.runflow.io/judge-dashboard/presets/chanel/runs/h1-c2-1x1.jpg", "cost": null, "duration_ms": null}, {"hero_idx": 1, "cut_idx": 2, "format": "9:16", "status": "succeeded", "image": "https://templates.runflow.io/judge-dashboard/presets/chanel/runs/h1-c2-9x16.jpg", "cost": null, "duration_ms": null}, - {"hero_idx": 2, "cut_idx": 1, "format": "1:1", "status": "succeeded", "image": "https://templates.runflow.io/judge-dashboard/presets/chanel/runs/h2-c1-1x1.jpg", "cost": 0.027811, "duration_ms": 39172}, + {"hero_idx": 1, "cut_idx": 2, "format": "4:5", "status": "succeeded", "image": "https://templates.runflow.io/judge-dashboard/presets/chanel/runs/h1-c2-4x5.jpg", "cost": null, "duration_ms": null}, + {"hero_idx": 2, "cut_idx": 1, "format": "1:1", "status": "succeeded", "image": "https://templates.runflow.io/judge-dashboard/presets/chanel/runs/h2-c1-1x1.jpg", "cost": null, "duration_ms": null}, {"hero_idx": 2, "cut_idx": 1, "format": "9:16", "status": "succeeded", "image": "https://templates.runflow.io/judge-dashboard/presets/chanel/runs/h2-c1-9x16.jpg", "cost": null, "duration_ms": null}, + {"hero_idx": 2, "cut_idx": 1, "format": "4:5", "status": "succeeded", "image": "https://templates.runflow.io/judge-dashboard/presets/chanel/runs/h2-c1-4x5.jpg", "cost": null, "duration_ms": null}, {"hero_idx": 2, "cut_idx": 2, "format": "1:1", "status": "succeeded", "image": "https://templates.runflow.io/judge-dashboard/presets/chanel/runs/h2-c2-1x1.jpg", "cost": null, "duration_ms": null}, {"hero_idx": 2, "cut_idx": 2, "format": "9:16", "status": "succeeded", "image": "https://templates.runflow.io/judge-dashboard/presets/chanel/runs/h2-c2-9x16.jpg", "cost": null, "duration_ms": null}, + {"hero_idx": 2, "cut_idx": 2, "format": "4:5", "status": "succeeded", "image": "https://templates.runflow.io/judge-dashboard/presets/chanel/runs/h2-c2-4x5.jpg", "cost": null, "duration_ms": null}, {"hero_idx": 3, "cut_idx": 1, "format": "1:1", "status": "succeeded", "image": "https://templates.runflow.io/judge-dashboard/presets/chanel/runs/h3-c1-1x1.jpg", "cost": null, "duration_ms": null}, {"hero_idx": 3, "cut_idx": 1, "format": "9:16", "status": "succeeded", "image": "https://templates.runflow.io/judge-dashboard/presets/chanel/runs/h3-c1-9x16.jpg", "cost": null, "duration_ms": null}, + {"hero_idx": 3, "cut_idx": 1, "format": "4:5", "status": "succeeded", "image": "https://templates.runflow.io/judge-dashboard/presets/chanel/runs/h3-c1-4x5.jpg", "cost": 0.028979, "duration_ms": 40824}, {"hero_idx": 3, "cut_idx": 2, "format": "1:1", "status": "succeeded", "image": "https://templates.runflow.io/judge-dashboard/presets/chanel/runs/h3-c2-1x1.jpg", "cost": null, "duration_ms": null}, - {"hero_idx": 3, "cut_idx": 2, "format": "9:16", "status": "succeeded", "image": "https://templates.runflow.io/judge-dashboard/presets/chanel/runs/h3-c2-9x16.jpg", "cost": null, "duration_ms": null} + {"hero_idx": 3, "cut_idx": 2, "format": "9:16", "status": "succeeded", "image": "https://templates.runflow.io/judge-dashboard/presets/chanel/runs/h3-c2-9x16.jpg", "cost": null, "duration_ms": null}, + {"hero_idx": 3, "cut_idx": 2, "format": "4:5", "status": "succeeded", "image": "https://templates.runflow.io/judge-dashboard/presets/chanel/runs/h3-c2-4x5.jpg", "cost": 0.026492, "duration_ms": 37290} ] }, { @@ -1704,7 +1710,7 @@

Step 5: Generate variants

{ label: "Performance marketer", headline: "Variants overnight, on-brand", subhead: "Cut creative-refresh costs by 4x", cta: "Get started" }, { label: "Indie founder", headline: "Ship the ad today", subhead: "From one hero to a full set", cta: "Try Runflow" } ], - formats: ["16:9", "4:5"] + formats: ["16:9", "4:5", "1:1"] }, uploads: { hero1: { preview_url: `${PRESET_ASSET_BASE}/runflow/hero1.jpg`, runflow_uri: `${PRESET_ASSET_BASE}/runflow/hero1.jpg`, filename: "hero1.jpg" }, @@ -1715,16 +1721,22 @@

Step 5: Generate variants

runs: [ {"hero_idx": 1, "cut_idx": 1, "format": "16:9", "status": "succeeded", "image": "https://templates.runflow.io/judge-dashboard/presets/runflow/runs/h1-c1-16x9.jpg", "cost": null, "duration_ms": null}, {"hero_idx": 1, "cut_idx": 1, "format": "4:5", "status": "succeeded", "image": "https://templates.runflow.io/judge-dashboard/presets/runflow/runs/h1-c1-4x5.jpg", "cost": null, "duration_ms": null}, + {"hero_idx": 1, "cut_idx": 1, "format": "1:1", "status": "succeeded", "image": "https://templates.runflow.io/judge-dashboard/presets/runflow/runs/h1-c1-1x1.jpg", "cost": null, "duration_ms": null}, {"hero_idx": 1, "cut_idx": 2, "format": "16:9", "status": "succeeded", "image": "https://templates.runflow.io/judge-dashboard/presets/runflow/runs/h1-c2-16x9.jpg", "cost": null, "duration_ms": null}, {"hero_idx": 1, "cut_idx": 2, "format": "4:5", "status": "succeeded", "image": "https://templates.runflow.io/judge-dashboard/presets/runflow/runs/h1-c2-4x5.jpg", "cost": null, "duration_ms": null}, + {"hero_idx": 1, "cut_idx": 2, "format": "1:1", "status": "succeeded", "image": "https://templates.runflow.io/judge-dashboard/presets/runflow/runs/h1-c2-1x1.jpg", "cost": null, "duration_ms": null}, {"hero_idx": 2, "cut_idx": 1, "format": "16:9", "status": "succeeded", "image": "https://templates.runflow.io/judge-dashboard/presets/runflow/runs/h2-c1-16x9.jpg", "cost": null, "duration_ms": null}, {"hero_idx": 2, "cut_idx": 1, "format": "4:5", "status": "succeeded", "image": "https://templates.runflow.io/judge-dashboard/presets/runflow/runs/h2-c1-4x5.jpg", "cost": null, "duration_ms": null}, + {"hero_idx": 2, "cut_idx": 1, "format": "1:1", "status": "succeeded", "image": "https://templates.runflow.io/judge-dashboard/presets/runflow/runs/h2-c1-1x1.jpg", "cost": null, "duration_ms": null}, {"hero_idx": 2, "cut_idx": 2, "format": "16:9", "status": "succeeded", "image": "https://templates.runflow.io/judge-dashboard/presets/runflow/runs/h2-c2-16x9.jpg", "cost": null, "duration_ms": null}, {"hero_idx": 2, "cut_idx": 2, "format": "4:5", "status": "succeeded", "image": "https://templates.runflow.io/judge-dashboard/presets/runflow/runs/h2-c2-4x5.jpg", "cost": null, "duration_ms": null}, + {"hero_idx": 2, "cut_idx": 2, "format": "1:1", "status": "succeeded", "image": "https://templates.runflow.io/judge-dashboard/presets/runflow/runs/h2-c2-1x1.jpg", "cost": 0.025475, "duration_ms": 35885}, {"hero_idx": 3, "cut_idx": 1, "format": "16:9", "status": "succeeded", "image": "https://templates.runflow.io/judge-dashboard/presets/runflow/runs/h3-c1-16x9.jpg", "cost": null, "duration_ms": null}, {"hero_idx": 3, "cut_idx": 1, "format": "4:5", "status": "succeeded", "image": "https://templates.runflow.io/judge-dashboard/presets/runflow/runs/h3-c1-4x5.jpg", "cost": null, "duration_ms": null}, + {"hero_idx": 3, "cut_idx": 1, "format": "1:1", "status": "succeeded", "image": "https://templates.runflow.io/judge-dashboard/presets/runflow/runs/h3-c1-1x1.jpg", "cost": 0.026282, "duration_ms": 37070}, {"hero_idx": 3, "cut_idx": 2, "format": "16:9", "status": "succeeded", "image": "https://templates.runflow.io/judge-dashboard/presets/runflow/runs/h3-c2-16x9.jpg", "cost": null, "duration_ms": null}, - {"hero_idx": 3, "cut_idx": 2, "format": "4:5", "status": "succeeded", "image": "https://templates.runflow.io/judge-dashboard/presets/runflow/runs/h3-c2-4x5.jpg", "cost": null, "duration_ms": null} + {"hero_idx": 3, "cut_idx": 2, "format": "4:5", "status": "succeeded", "image": "https://templates.runflow.io/judge-dashboard/presets/runflow/runs/h3-c2-4x5.jpg", "cost": null, "duration_ms": null}, + {"hero_idx": 3, "cut_idx": 2, "format": "1:1", "status": "succeeded", "image": "https://templates.runflow.io/judge-dashboard/presets/runflow/runs/h3-c2-1x1.jpg", "cost": null, "duration_ms": null} ] }, { @@ -1739,7 +1751,7 @@

Step 5: Generate variants

{ label: "Performance marketer", headline: "Variants overnight, on-brand", subhead: "Cut creative-refresh costs by 4x", cta: "Get started" }, { label: "Indie founder", headline: "Ship the ad today", subhead: "From one hero to a full set", cta: "Try Runflow" } ], - formats: ["9:16", "16:9"] + formats: ["9:16", "16:9", "4:5"] }, uploads: { hero1: { preview_url: `${PRESET_ASSET_BASE}/ikea/hero1.jpg`, runflow_uri: `${PRESET_ASSET_BASE}/ikea/hero1.jpg`, filename: "hero1.jpg" }, @@ -1750,16 +1762,22 @@

Step 5: Generate variants

runs: [ {"hero_idx": 1, "cut_idx": 1, "format": "9:16", "status": "succeeded", "image": "https://templates.runflow.io/judge-dashboard/presets/ikea/runs/h1-c1-9x16.jpg", "cost": null, "duration_ms": null}, {"hero_idx": 1, "cut_idx": 1, "format": "16:9", "status": "succeeded", "image": "https://templates.runflow.io/judge-dashboard/presets/ikea/runs/h1-c1-16x9.jpg", "cost": null, "duration_ms": null}, + {"hero_idx": 1, "cut_idx": 1, "format": "4:5", "status": "succeeded", "image": "https://templates.runflow.io/judge-dashboard/presets/ikea/runs/h1-c1-4x5.jpg", "cost": null, "duration_ms": null}, {"hero_idx": 1, "cut_idx": 2, "format": "9:16", "status": "succeeded", "image": "https://templates.runflow.io/judge-dashboard/presets/ikea/runs/h1-c2-9x16.jpg", "cost": null, "duration_ms": null}, {"hero_idx": 1, "cut_idx": 2, "format": "16:9", "status": "succeeded", "image": "https://templates.runflow.io/judge-dashboard/presets/ikea/runs/h1-c2-16x9.jpg", "cost": null, "duration_ms": null}, + {"hero_idx": 1, "cut_idx": 2, "format": "4:5", "status": "succeeded", "image": "https://templates.runflow.io/judge-dashboard/presets/ikea/runs/h1-c2-4x5.jpg", "cost": null, "duration_ms": null}, {"hero_idx": 2, "cut_idx": 1, "format": "9:16", "status": "succeeded", "image": "https://templates.runflow.io/judge-dashboard/presets/ikea/runs/h2-c1-9x16.jpg", "cost": null, "duration_ms": null}, {"hero_idx": 2, "cut_idx": 1, "format": "16:9", "status": "succeeded", "image": "https://templates.runflow.io/judge-dashboard/presets/ikea/runs/h2-c1-16x9.jpg", "cost": null, "duration_ms": null}, + {"hero_idx": 2, "cut_idx": 1, "format": "4:5", "status": "succeeded", "image": "https://templates.runflow.io/judge-dashboard/presets/ikea/runs/h2-c1-4x5.jpg", "cost": null, "duration_ms": null}, {"hero_idx": 2, "cut_idx": 2, "format": "9:16", "status": "succeeded", "image": "https://templates.runflow.io/judge-dashboard/presets/ikea/runs/h2-c2-9x16.jpg", "cost": null, "duration_ms": null}, {"hero_idx": 2, "cut_idx": 2, "format": "16:9", "status": "succeeded", "image": "https://templates.runflow.io/judge-dashboard/presets/ikea/runs/h2-c2-16x9.jpg", "cost": null, "duration_ms": null}, + {"hero_idx": 2, "cut_idx": 2, "format": "4:5", "status": "succeeded", "image": "https://templates.runflow.io/judge-dashboard/presets/ikea/runs/h2-c2-4x5.jpg", "cost": null, "duration_ms": null}, {"hero_idx": 3, "cut_idx": 1, "format": "9:16", "status": "succeeded", "image": "https://templates.runflow.io/judge-dashboard/presets/ikea/runs/h3-c1-9x16.jpg", "cost": null, "duration_ms": null}, {"hero_idx": 3, "cut_idx": 1, "format": "16:9", "status": "succeeded", "image": "https://templates.runflow.io/judge-dashboard/presets/ikea/runs/h3-c1-16x9.jpg", "cost": null, "duration_ms": null}, + {"hero_idx": 3, "cut_idx": 1, "format": "4:5", "status": "succeeded", "image": "https://templates.runflow.io/judge-dashboard/presets/ikea/runs/h3-c1-4x5.jpg", "cost": null, "duration_ms": null}, {"hero_idx": 3, "cut_idx": 2, "format": "9:16", "status": "succeeded", "image": "https://templates.runflow.io/judge-dashboard/presets/ikea/runs/h3-c2-9x16.jpg", "cost": null, "duration_ms": null}, - {"hero_idx": 3, "cut_idx": 2, "format": "16:9", "status": "succeeded", "image": "https://templates.runflow.io/judge-dashboard/presets/ikea/runs/h3-c2-16x9.jpg", "cost": null, "duration_ms": null} + {"hero_idx": 3, "cut_idx": 2, "format": "16:9", "status": "succeeded", "image": "https://templates.runflow.io/judge-dashboard/presets/ikea/runs/h3-c2-16x9.jpg", "cost": null, "duration_ms": null}, + {"hero_idx": 3, "cut_idx": 2, "format": "4:5", "status": "succeeded", "image": "https://templates.runflow.io/judge-dashboard/presets/ikea/runs/h3-c2-4x5.jpg", "cost": null, "duration_ms": null} ] } ]; @@ -2094,15 +2112,18 @@

Step 5: Generate variants

`Preserve the focal subject from the primary design reference. Avoid warped text or floating overlays.` ].filter(Boolean); - const hero2 = urlOrUpload("hero2") || logo || heroUrl; - const hero3 = urlOrUpload("hero3") || logo || heroUrl; + // The workflow requires three reference fields, but mixing different heroes + // in one run causes the model to composite them together (e.g. all three + // perfume bottles in a single Chanel ad). Per the runflow-ad-creative skill, + // satisfy all three slots with the SAME hero — each (hero × angle × format) + // gets its own clean run. return { "prompt": promptLines.join(" "), "aspect_ratio": aspect || "1:1", "logo": logo, "primary_design_ref": heroUrl, - "Aux Reference 1": hero2, - "Aux Reference 2": hero3 + "Aux Reference 1": heroUrl, + "Aux Reference 2": heroUrl }; } @@ -3080,7 +3101,7 @@

Step 5: Generate variants

const pos = visible.indexOf(LIGHTBOX_IDX) + 1; document.getElementById("lightboxCaption").innerHTML = `${pos}/${visible.length} · Hero ${r.hero_idx} · Angle ${r.cut_idx} · ${r.format}` + - (IS_ADMIN ? ` · $${(r.cost||0).toFixed(3)}` : "") + + ` · $${(r.cost||0).toFixed(3)}` + ` · ${((r.duration_ms||0)/1000).toFixed(1)}s`; updateLightboxRateButtons(); } diff --git a/projects/judge-dashboard/presets/chanel/runs/h1-c1-4x5.jpg b/projects/judge-dashboard/presets/chanel/runs/h1-c1-4x5.jpg new file mode 100644 index 0000000..c9f7ea4 Binary files /dev/null and b/projects/judge-dashboard/presets/chanel/runs/h1-c1-4x5.jpg differ diff --git a/projects/judge-dashboard/presets/chanel/runs/h1-c2-4x5.jpg b/projects/judge-dashboard/presets/chanel/runs/h1-c2-4x5.jpg new file mode 100644 index 0000000..864a598 Binary files /dev/null and b/projects/judge-dashboard/presets/chanel/runs/h1-c2-4x5.jpg differ diff --git a/projects/judge-dashboard/presets/chanel/runs/h2-c1-4x5.jpg b/projects/judge-dashboard/presets/chanel/runs/h2-c1-4x5.jpg new file mode 100644 index 0000000..16496c1 Binary files /dev/null and b/projects/judge-dashboard/presets/chanel/runs/h2-c1-4x5.jpg differ diff --git a/projects/judge-dashboard/presets/chanel/runs/h2-c2-4x5.jpg b/projects/judge-dashboard/presets/chanel/runs/h2-c2-4x5.jpg new file mode 100644 index 0000000..72e26aa Binary files /dev/null and b/projects/judge-dashboard/presets/chanel/runs/h2-c2-4x5.jpg differ diff --git a/projects/judge-dashboard/presets/chanel/runs/h3-c1-4x5.jpg b/projects/judge-dashboard/presets/chanel/runs/h3-c1-4x5.jpg new file mode 100644 index 0000000..a1c1896 Binary files /dev/null and b/projects/judge-dashboard/presets/chanel/runs/h3-c1-4x5.jpg differ diff --git a/projects/judge-dashboard/presets/chanel/runs/h3-c2-4x5.jpg b/projects/judge-dashboard/presets/chanel/runs/h3-c2-4x5.jpg new file mode 100644 index 0000000..5ed153e Binary files /dev/null and b/projects/judge-dashboard/presets/chanel/runs/h3-c2-4x5.jpg differ diff --git a/projects/judge-dashboard/presets/ikea/runs/h1-c1-4x5.jpg b/projects/judge-dashboard/presets/ikea/runs/h1-c1-4x5.jpg new file mode 100644 index 0000000..8b44ea9 Binary files /dev/null and b/projects/judge-dashboard/presets/ikea/runs/h1-c1-4x5.jpg differ diff --git a/projects/judge-dashboard/presets/ikea/runs/h1-c2-4x5.jpg b/projects/judge-dashboard/presets/ikea/runs/h1-c2-4x5.jpg new file mode 100644 index 0000000..f89f40a Binary files /dev/null and b/projects/judge-dashboard/presets/ikea/runs/h1-c2-4x5.jpg differ diff --git a/projects/judge-dashboard/presets/ikea/runs/h2-c1-4x5.jpg b/projects/judge-dashboard/presets/ikea/runs/h2-c1-4x5.jpg new file mode 100644 index 0000000..5098013 Binary files /dev/null and b/projects/judge-dashboard/presets/ikea/runs/h2-c1-4x5.jpg differ diff --git a/projects/judge-dashboard/presets/ikea/runs/h2-c2-4x5.jpg b/projects/judge-dashboard/presets/ikea/runs/h2-c2-4x5.jpg new file mode 100644 index 0000000..b86fe52 Binary files /dev/null and b/projects/judge-dashboard/presets/ikea/runs/h2-c2-4x5.jpg differ diff --git a/projects/judge-dashboard/presets/ikea/runs/h3-c1-4x5.jpg b/projects/judge-dashboard/presets/ikea/runs/h3-c1-4x5.jpg new file mode 100644 index 0000000..eaaf44b Binary files /dev/null and b/projects/judge-dashboard/presets/ikea/runs/h3-c1-4x5.jpg differ diff --git a/projects/judge-dashboard/presets/ikea/runs/h3-c2-4x5.jpg b/projects/judge-dashboard/presets/ikea/runs/h3-c2-4x5.jpg new file mode 100644 index 0000000..7f65e6a Binary files /dev/null and b/projects/judge-dashboard/presets/ikea/runs/h3-c2-4x5.jpg differ diff --git a/projects/judge-dashboard/presets/runflow/runs/h1-c1-1x1.jpg b/projects/judge-dashboard/presets/runflow/runs/h1-c1-1x1.jpg new file mode 100644 index 0000000..0ce6690 Binary files /dev/null and b/projects/judge-dashboard/presets/runflow/runs/h1-c1-1x1.jpg differ diff --git a/projects/judge-dashboard/presets/runflow/runs/h1-c2-1x1.jpg b/projects/judge-dashboard/presets/runflow/runs/h1-c2-1x1.jpg new file mode 100644 index 0000000..6dec32a Binary files /dev/null and b/projects/judge-dashboard/presets/runflow/runs/h1-c2-1x1.jpg differ diff --git a/projects/judge-dashboard/presets/runflow/runs/h2-c1-1x1.jpg b/projects/judge-dashboard/presets/runflow/runs/h2-c1-1x1.jpg new file mode 100644 index 0000000..db037b7 Binary files /dev/null and b/projects/judge-dashboard/presets/runflow/runs/h2-c1-1x1.jpg differ diff --git a/projects/judge-dashboard/presets/runflow/runs/h2-c2-1x1.jpg b/projects/judge-dashboard/presets/runflow/runs/h2-c2-1x1.jpg new file mode 100644 index 0000000..655a2e0 Binary files /dev/null and b/projects/judge-dashboard/presets/runflow/runs/h2-c2-1x1.jpg differ diff --git a/projects/judge-dashboard/presets/runflow/runs/h3-c1-1x1.jpg b/projects/judge-dashboard/presets/runflow/runs/h3-c1-1x1.jpg new file mode 100644 index 0000000..a108808 Binary files /dev/null and b/projects/judge-dashboard/presets/runflow/runs/h3-c1-1x1.jpg differ diff --git a/projects/judge-dashboard/presets/runflow/runs/h3-c2-1x1.jpg b/projects/judge-dashboard/presets/runflow/runs/h3-c2-1x1.jpg new file mode 100644 index 0000000..478ee04 Binary files /dev/null and b/projects/judge-dashboard/presets/runflow/runs/h3-c2-1x1.jpg differ diff --git a/projects/judge-dashboard/tools/build-presets.py b/projects/judge-dashboard/tools/build-presets.py index 46f0f63..1dd149f 100644 --- a/projects/judge-dashboard/tools/build-presets.py +++ b/projects/judge-dashboard/tools/build-presets.py @@ -87,7 +87,11 @@ def poll(run_id, max_wait=900, interval=5): return {"status_code": "timeout", "failure_message": "client poll timeout", "output": r.get("output")} time.sleep(interval) -def build_payload(hero_url, aspect, cut, brand, logo_url, aux1_url, aux2_url): +def build_payload(hero_url, aspect, cut, brand, logo_url, _unused_aux1=None, _unused_aux2=None): + """Per the runflow-ad-creative skill: each (hero × angle × format) is its + own clean run with the SAME hero in all three reference slots. Passing + different heroes to Aux Reference 1/2 causes the model to composite them + (e.g. three perfume bottles in one Chanel ad).""" lines = [ "Produce a brand-locked ad variant from the provided primary design reference.", f'Headline text: "{cut["headline"]}".' if cut.get("headline") else "", @@ -106,8 +110,8 @@ def build_payload(hero_url, aspect, cut, brand, logo_url, aux1_url, aux2_url): "aspect_ratio": aspect or "1:1", "logo": logo_url or "", "primary_design_ref": hero_url, - "Aux Reference 1": aux1_url or logo_url or hero_url, - "Aux Reference 2": aux2_url or logo_url or hero_url, + "Aux Reference 1": hero_url, + "Aux Reference 2": hero_url, } def download(url, dest): @@ -125,7 +129,7 @@ def download(url, dest): {"label": "Holiday gift", "headline": "Make hers unforgettable", "subhead": "From the icon to the everyday", "cta": "Shop the collection"}, {"label": "Fragrance loyalist", "headline": "Your signature, refined", "subhead": "Three icons, one collection", "cta": "Discover"}, ], - "formats": ["1:1", "9:16"], + "formats": ["1:1", "9:16", "4:5"], }, { "id": "runflow", @@ -136,7 +140,7 @@ def download(url, dest): {"label": "Performance marketer", "headline": "Variants overnight, on-brand", "subhead": "Cut creative-refresh costs by 4x", "cta": "Get started"}, {"label": "Indie founder", "headline": "Ship the ad today", "subhead": "From one hero to a full set", "cta": "Try Runflow"}, ], - "formats": ["16:9", "4:5"], + "formats": ["16:9", "4:5", "1:1"], }, { "id": "ikea", @@ -147,7 +151,7 @@ def download(url, dest): {"label": "Performance marketer", "headline": "Variants overnight, on-brand", "subhead": "Cut creative-refresh costs by 4x", "cta": "Get started"}, {"label": "Indie founder", "headline": "Ship the ad today", "subhead": "From one hero to a full set", "cta": "Try Runflow"}, ], - "formats": ["9:16", "16:9"], + "formats": ["9:16", "16:9", "4:5"], }, ]