---
title: "Draft → Final Campaign Film — FLUX.3 draft/keyframes/extend + real finishing"
tier: hero
format: video
theme: campaign | premium-video | draft-to-final
persona: brand marketer, founder, creative director
duration: "~20–45 min"
budget_usd: "~$2–$10 depending on which drafts you enhance"
caps: ["flux-3-draft-t2v", "flux-3-draft-i2v", "flux-3-draft-extend", "flux-3-draft-enhance", "flux-3-t2v", "flux-3-i2v", "flux-3-keyframes", "flux-3-extend", "ffmpeg-concat", "ffmpeg-export"]
skills: ["flux-3", "cinematography", "commercial", "finishing-quality"]
showcases: ["/chapters/draft-to-final-campaign-film-example.html"]
status: "live"
reliability: 3.1 # draft iteration is stable; final-quality upgrades are expensive and may need retries
---

# Draft → Final Campaign Film — agent playbook

> Paste this whole file (with the BRIEF filled in) into Claude cowork, chat, or Code. Livepeer Agent iterates fast in FLUX.3 draft mode, then upgrades the chosen takes to final quality and ships a stitched campaign film.

## What you'll get

- **A 3–6 shot campaign film** — coherent visual language, platform-ready export
- **Draft takes you can pick from** — cheap iteration before committing spend
- **A final-quality upgrade** — either “re-render final” or “enhance this exact draft”
- **A stitched MP4** — real finishing (concat + export), not a folder of clips

## Tell the agent about the campaign film

```yaml
campaign_goal:         # 1 sentence: what the film must sell
product_image_url:     # OPTIONAL https URL (use as i2v first frame for the hero shot)
script_beats:          # 3–6 bullet lines (hook → proof → payoff → CTA)
style_brief:           # 1–2 sentences (lighting, camera, grade, typography)
shot_count: 4          # 3–6
seconds_per_shot: 6    # 4–10 recommended
aspect_ratio: 16:9     # "16:9" or "9:16"
max_spend_usd: 12.00   # hard ceiling
output_slug:           # kebab-case filename prefix
```

## Conventions (how the agent must run)

1. **Spend gates**:
   - STOP before the **draft batch** (cheap but still billable).
   - STOP before any **final upgrade** (can dominate cost).
2. **Identity gate**: after drafts, STOP and lock the visual direction (don’t “fix” by random re-rolls).
3. **Final review gate**: STOP before stitching/export.

## The stages

### Stage 0 — Confirm + shot plan (no render)

Turn `script_beats` into `shot_count` shots (one line each): what we see + what text (if any) appears.

**STOP**: “Plan looks right? (approve / edit [shot #])”

### Stage 1 — Cost preview for drafts (no render)

Estimate draft spend:
- Draft video is **$0.06 / second** (`flux-3-draft-t2v|i2v|transition|keyframes`)
- Draft extend is **$0.12 / second** (`flux-3-draft-extend`)
- Draft batch cost ≈ `shot_count × seconds_per_shot × 0.06` (plus any optional extends)

If it risks exceeding `max_spend_usd`, propose fewer shots or shorter shots.

**STOP**: “Approve spend to generate drafts? (approve / reduce / abort)”

### Stage 2 — Generate draft takes (FLUX.3 draft)

Render each shot as a draft:
- If `product_image_url` is set, use **one** hero shot as `flux-3-draft-i2v` from that image.
- Other shots use `flux-3-draft-t2v`.

**STOP**: “Pick drafts to upgrade: (upgrade [shot #…] / redo [shot #…] / abort)”

### Stage 3 — Identity + direction lock (no render)

Summarize what’s now locked:
- palette/grade (from `style_brief`)
- product identity constraints (if any)
- pacing (seconds_per_shot)

**STOP**: “Direction locked? (approve / adjust style_brief)”

### Stage 4 — Upgrade to final quality (two options)

For each selected shot, pick one upgrade path:

- **Option A (cheaper, re-render final):** re-run with `flux-3-t2v` / `flux-3-i2v` at 1080p using the refined prompt.
- **Option B (same motion, expensive):** `flux-3-draft-enhance` using the draft’s `draft_cache_url` from `structuredContent.draft_cache_url` (**$0.29 / second**).

The agent must show a per-shot cost estimate before running upgrades.

**STOP**: “Approve spend for final upgrades? (approve / switch option / skip a shot)”

### Stage 4B — Optional keyframes take (demonstrate precise control)

When a shot needs **exact timing** (e.g. three beats in one 10s clip), run `flux-3-keyframes` instead of a free-form t2v.

- Pick 3 stills (they can be your own images, or keyframes you generated earlier).
- Use the proven frame indices from the registry example for a 10-second clip: 0, 120, 240.

**STOP**: “Keyframes shot worth it, or stick to normal shots? (use keyframes / skip)”

### Stage 5 — Optional extend (only if needed)

If the film is too short, extend a chosen clip with `flux-3-extend` (or `flux-3-draft-extend` for a cheap test).
Pricing: `flux-3-extend` **$0.41 / second**, `flux-3-draft-extend` **$0.12 / second**.

**STOP**: “Extension ok? (approve / undo extension)”

### Stage 6 — Stitch + export (deterministic)

1) `ffmpeg-concat` in order (hard cuts)  
2) If `aspect_ratio: 9:16`, run `ffmpeg-export` with `preset:"tiktok-portrait"`. If `aspect_ratio: 16:9`, skip export (stitched output is already correct).

**STOP**: “Export the final campaign film? (approve / reorder shots)”

### Stage 7 — Deliver

Return:
- final MP4 URL
- per-shot URLs (draft + final)
- the exact prompts and upgrade choices (so this is reproducible)

## FINAL OUTPUT

Print exactly:

```
✅ Final campaign film: <URL>
✅ Shots (final):       <URL × N>
✅ Shots (drafts):      <URL × N>
✅ Upgrade ledger:      <shot # → {draft|final|enhance|keyframes|extend} + cost>

Total spent: $X.XX (ceiling $max_spend_usd)
```

## AFTERCARE

- If the film works: rerun with a different hook (only Shot 1) and keep the rest locked.
- If you need a longer cut: use `flux-3-draft-extend` first (cheap), then upgrade only if the extension is worth it.

## Notes for the agent (exact calls; keep compact)

- Draft: `mcp__livepeer-agent__run_capability({ capability:"flux-3-draft-t2v" | "flux-3-draft-i2v", prompt, source_url?, inputs:{ duration: seconds_per_shot } })` → read `structuredContent.draft_cache_url` (draft endpoints do not accept `resolution`)
- Enhance: `mcp__livepeer-agent__run_capability({ capability:"flux-3-draft-enhance", inputs:{ draft_cache_url } })`
- Keyframes: `mcp__livepeer-agent__run_capability({ capability:"flux-3-keyframes", prompt, inputs:{ resolution:"720p", duration: 10, keyframes:[{ image_url:"<kf1>", frame_index:0 },{ image_url:"<kf2>", frame_index:120 },{ image_url:"<kf3>", frame_index:240 }] } })`
- Draft extend: `mcp__livepeer-agent__run_capability({ capability:"flux-3-draft-extend", prompt:"continue seamlessly", inputs:{ video_url:"<clip_url>", duration:"auto" } })` (draft endpoints do not accept `resolution`)
- Stitch: `mcp__livepeer-agent__run_capability({ capability:"ffmpeg-concat", inputs:{ clips:[...], transition:"cut" } })`
- Export (9:16 only): `mcp__livepeer-agent__run_capability({ capability:"ffmpeg-export", inputs:{ source_url:"<stitched_url>", preset:"tiktok-portrait", crop:"center-crop" } })`
