Blog

Prompting3 min read

Wan 2.7 Prompts: Writing for the Expander vs Against It

Wan 2.7 ships with prompt expansion on by default. Your eight-word prompt becomes a 60-word rewrite before a single frame is generated, and the only way to stay sane is to read what actually gets sent.


The expander is the model

Most of the time you spend tuning Wan 2.7 is really tuning a small LLM that sits in front of the diffusion model. That is what enable_prompt_expansion: true does, and it is on by default. You type a subject. The expander adds camera language, lighting, lens feel, and motion qualifiers. Whatever comes back in actual_prompt is what the model actually saw.

This is good when you are prototyping. It is painful when you are trying to hold a visual style across a batch, because the expander is not deterministic even at a fixed seed.

Stage one: let it cook. Stage two: freeze what worked

The workflow that keeps you from losing a day:

  1. Run three to five generations with enable_prompt_expansion: true and a short seed prompt.
  2. Log actual_prompt from every response.
  3. Pick the expanded string that produced the shot you liked.
  4. Paste that string back in as your new prompt, set enable_prompt_expansion: false, lock the seed, and iterate from there.
TYPESCRIPT
1const result = await fal.subscribe("fal-ai/wan/v2.7/text-to-video", {
2 input: {
3 prompt: "A chef plating a dish in a professional kitchen",
4 enable_prompt_expansion: true,
5 duration: 5,
6 resolution: "720p",
7 },
8});
9
10console.log(result.data.actual_prompt);
11console.log("seed", result.data.seed);

Once you have an actual_prompt that works, that string plus that seed plus enable_prompt_expansion: false becomes your locked shot.

The short prompt that works

The expander prefers density over full sentences. Comma-separated clauses read as slots it can fill.

Good seed prompt:

CODE
1Luxury perfume bottle on marble, slow 360 rotation, warm rim light, macro lens, shallow depth of field

Bad seed prompt:

CODE
1Please generate a beautiful high quality cinematic video of a perfume bottle that looks amazing and premium

The bad version is not wrong, it is just empty. "Beautiful," "high quality," "amazing," "premium" are words the expander already assumes. You are using up prompt budget to tell it what it defaults to. The expander responds to what the scene contains, not to adjectives about how it should feel.

Raw seed prompt next to expanded prompt, bound with tape
Raw seed prompt next to expanded prompt, bound with tape

When to turn the expander off

Flip enable_prompt_expansion: false in these cases:

Locked run config pinned with red tape
Locked run config pinned with red tape
  • Image-to-video with a detailed reference frame. The expander will add elements the image contradicts.
  • Batch runs where every clip must match an approved look.
  • Continuation shots using end_image_url where you need the model to trust the frame anchor, not a rewrite of your prompt.
  • Any time you have already captured an actual_prompt you want to reuse.

Negative prompts

Wan 2.7 caps negative_prompt at 500 characters. Use them for mechanical failures, not vibes:

CODE
1negative_prompt: "extra fingers, deformed hands, neck warping, duplicate limbs, flickering, watermark, text overlay"

Skip abstract negatives like "bad quality" or "ugly." They do nothing. The model has no prior for how to avoid "ugly." It does have a clear prior for "extra fingers."

Two real examples

Product spot (exploration pass):

TYPESCRIPT
1{
2 prompt: "Amber whiskey glass on dark wood, ice cracking, slow dolly in",
3 enable_prompt_expansion: true,
4 duration: 5,
5 resolution: "1080p",
6 negative_prompt: "watermark, text, duplicate objects"
7}

You read actual_prompt from the response, decide which rewrite nailed the amber color and ice physics, then:

Product spot (locked pass):

TYPESCRIPT
1{
2 prompt: "[paste the actual_prompt string from your favorite run]",
3 enable_prompt_expansion: false,
4 seed: 88421,
5 duration: 5,
6 resolution: "1080p",
7 negative_prompt: "watermark, text, duplicate objects"
8}

The locked pass is the one you render variations from.

The trap to avoid

Do not write a 300-word prompt and leave expansion on. You end up competing with the expander, which has its own opinions about camera and lighting. The outputs drift in ways that are hard to debug because two rewrites happened: yours against the default, and the expander against your rewrite. Keep seed prompts under 40 words when expansion is on. Go long only after you turn it off.