Video Prompting
Write a production brief, not a vibe paragraph. Models fail when every asset competes for identity, motion, camera, and style.
Core rule
Assign authority before action. Every reference gets one job and an explicit boundary on what it must not control. Then: lock continuity → place screen geography → time the shot → light/sound → short negatives.
When to use which skill
| Need | Skill |
|---|---|
| Multimodal / cinematic / edit prompts | this skill |
| Face consistency across stills → video | character-pipeline |
| Documentary handheld / density maps | cinematic-motion |
| Overheard two-person podcast ad | podcast-ad |
| UGC talking-head / product selfie | ugc-photo-prompts → ugc-video-prompts |
| Assemble / caption finished clips | ugc-editing |
| Kinetic titles / flat glass UI / H3 product journey promos | motion-graphics |
Session gates
get_timeline— ifcanGenerateis false, ask user to sign in / subscribe.list_modelsforimage/video/audio— ids and caps drift.- Propose prompt + model + duration + aspect (+ refs). Wait for confirmation — paid, not undoable.
- Fire
generate_*; do not busy-poll. Ready whenget_media({ ids })has nogenerationStatus. Onfailed, report and ask before retry. - Organize with
folder(e.g.Hero/Sheets,Hero/Takes).
Reference wiring
| Tool argument | Prompt tags | Typical job |
|---|---|---|
startFrameMediaRef / endFrameMediaRef |
implied first/last frame | Image-to-video anchors |
referenceImageMediaRefs |
@Image1… (some Kling: @Element1) |
Identity, wardrobe, product, scene |
referenceVideoMediaRefs |
@Video1… |
Motion timing, camera rhythm |
referenceAudioMediaRefs |
@Audio1… |
Voice, lip-sync audio, music timing |
generate_image → referenceMediaRefs |
model-specific | Still identity lock |
Declare authority when multiple refs are passed:
@Image1 defines identity and wardrobe only. Ignore its background.
@Video1 defines motion timing and camera only. Do not inherit its people or location.
@Audio1 defines <Character>'s voice timbre and delivery only.
Never: “use all references to make the same scene.”
Prompt architecture
Stable truth first; time second; polish last.
[REFERENCE USE] — what each @ImageN / @VideoN / @AudioN controls + ignores
[IDENTITY LOCKS] — count, face, hair, wardrobe, props, voice ownership
[SCENE] — place, time of day, dramatic goal, emotional turn
[DIALOGUE] — exact quoted lines, speakers, delivery + voice pins
[SCREEN GEOGRAPHY] — who/what is left/right/front before anyone moves
[SHOT LIST] — time ranges: framing, action, dialogue, end state
[ACTING] — posture, gaze, gesture, emotional progression
[LIGHT / IMAGE] — light, palette, texture, lens, DoF
[CAMERA] — sizes, move rules, axis, transitions
[SOUND] — ambience, dialogue clarity, music rule
[NEGATIVES] — only the failure modes that matter
Length vs start frame: with startFrameMediaRef alone and simple motion, keep the prompt short (camera + action + speech/SFX) — do not re-describe the still. With multi-ref / timed performance / edits, use the full architecture.
Continuity + shot timing
Lock subject count, face/hair/wardrobe, prop ownership, screen direction, voice ownership. Place people before they move.
Treat duration as an editorial budget (list_models → durations). One primary beat per range: establish → escalate → resolve. Prefer one beat per generate_video call; assemble on the timeline. If dialogue rushes, shorten lines — do not cram two turns into one short clip.
Model routing
Confirm ids/caps via list_models before firing. Default stack for these skills:
| Stage | Prefer | How |
|---|---|---|
| Iterate | seedance-2-mini, MiniMax H3 (hailuo-03), or Flux 3 draft |
Mini / H3 as normal generates. Flux 3: draft: true (720p preview; supportsDraft must be true). |
| Final | seedance-2, MiniMax H3 (hailuo-03), or FLUX Enhance |
Seedance / H3: full-quality generate (ask before Seedance 1080p/4K). Flux 3 finals are not upscale_media — only enhance a completed draft. |
Flux 3 draft → enhance (not upscale)
- Iterate:
generate_video({ model: "flux-3", draft: true, … }) - When
get_mediashows the draft ready andcanEnhanceDraft: true, final:generate_video({ enhanceDraftMediaRef: "<draftId>" })alone — no prompt/model/inputs. Keeps motion; renders FLUX.3 at 1080p. - Do not use
upscale_mediafor this path. Enhance only works on Flux 3 drafts (canEnhanceDraft); other models have no enhance step.
| Other goals | Prefer | Notes |
|---|---|---|
| Synced spoken dialogue | Kling V3/O3, or Grok | Quoted line; pin voice every beat |
| Stills / sheets | grok-imagine, gpt-image-2, or seedream-v5-pro |
Best of multi-room podcast bakeoff; see character-pipeline / podcast-ad |
| Avoid as default | Veo | Content-checker failures common |
Precise editing
- Master — source /
@Video1owns timeline, subjects, camera, audio. - Changes — exact subject/object/region/line/time only.
- Preserve — identity, occlusion, eyelines, camera, dialogue, ambience, duration.
Text and titles
Most video models cannot render reliable readable text — use generate_image plates or add_texts. Exception: MiniMax H3 / H3 Max kinetic flat type with an exact string allowlist — follow motion-graphics (do not improvise long paragraphs of type).
Recipes (near-look patterns)
Beat-synced stylized title
Silhouette motion via generate_video; title plates via generate_image; cut on music with detect_beats.
@Image1 = silhouette identity only. Ignore photoreal BG.
Flat black silhouettes on solid poster colors (2–3 saturated fields). No naturalistic shading.
Comic-panel crops; freeze-holds dead-still for one full beat; hard cuts only; heavy grain/gate weave.
Alternate kinetic bursts with freeze holds. End frozen mid-pose on a solid field.
Then: generate geometric title stills → detect_beats → place clips/stills on downbeats.
Texture morph
@Image1 = source surface texture only. @Image2 = destination landscape only.
Continuous macro push; transform when contours align. No hard cut, tear, or seam.
Motion transfer
@Image1 = identity/wardrobe only. @Video1 = motion/timing/camera only — not its cast or location.
Ordered action with stable L/R geography. Physically believable contacts and shadows.
Voice lock
Reuse pitch + tone + accent + pace verbatim every beat. Better on Seedance: pass beat-1 audio as referenceAudioMediaRefs (@Audio1 = voice only) on later beats.
Surgical edit
Source is sole master. Replace/remove/add only listed items.
Preserve identity, timing, occlusion, eyeline, camera, layout, dialogue, ambience. Nothing else.
Troubleshooting
| Failure | Fix |
|---|---|
| Identity drifts | One primary identity ref; lock face/hair/wardrobe (character-pipeline) |
| Wrong voice owner | @Audio1 → named character + exact line |
| Motion ref changes cast | “Motion/timing only”; reject its actors/location |
| Action chaos | Chronological L/C/R state sequence |
| Edit rebuilds frame | Master + changes + preserve |
| Dialogue rushed | Shorter line; one turn per clip |
| Voice changes across beats | Same four voice pins every call, or @Audio1 lock |
| Stiff puppet | Mid-gesture still; one micro-action (cinematic-motion) |
| Room pops between people | Identical set wording on both stills (podcast-ad) |
| Bad burned-in titles | generate_image / add_texts, not video |
| Refs ignored | @Image1 = first referenceImageMediaRefs entry |
canGenerate false |
Sign in / subscribe |
Debug order: authority → locks → timing → preserve → then adjectives.
Bakeoff notes (T2V, cheap 480p/720p, Aug 2026)
Project: Skill Bakeoff CM+VP · timeline Video Prompting Bakeoff. No refs — text-only stress test of architecture vs vibe.
| Finding | Implication |
|---|---|
| Screen geography (woman LEFT / man RIGHT) held on Seedance Mini | Keep explicit L/R before action |
| Exact quoted dialogue landed on Grok + Gemini Omni Flash | Pin line + voice every call; works without audio refs |
| “Alone” failed when SCENE said busy café (extras appeared) | Negatives must ban extras: “no other people visible” |
| Vibe-only romantic prompt invented a kiss + uncontrolled action | Architecture buys control, not prettier stills |
| Chaos anti-prompt (swap sides / look at cam / third person) did all three | Geography + subject-count locks are load-bearing |
| Silhouette + solid field + freeze/kinetic (Seedance Mini, Happy Horse) | Stylized recipe works without refs |
| Texture morph macro→canyon (Seedance Mini) | Continuous transform recipe is strong |
| Product pour timed late on Flux draft | Shot-list timing is approximate; put critical action mid-clip |
| Landscape “one tracking shot” on LTX still cut angles | Prefer one beat per call; assemble multi-angle on timeline |
Kling V3 jobs often sit in generating much longer than Seedance/Grok/Flux draft |
Prefer Mini/Grok/Flux draft for cheap iteration |
Checklist before generate_video
- User confirmed cost;
list_modelscurrent - Every ref has authority + ignore; tags match tool arg order
- Subject count + geography locked
- Duration fits one beat; dialogue fits budget
- No readable text expected from the video model
- If editing: master + changes + preserve