Rice terraces

One still of the terraces, then six seconds of motion.

The scene

Early morning on the Yuanyang rice terraces in Yunnan: flooded terraces stepping down the mountainside, mirror-still water reflecting low clouds and a pale sky. In the foreground three Hani farmers, two women and a man, bent over, transplanting rice seedlings by hand, trousers rolled to the knee, mud on their legs, bundles of green seedlings floating beside them. Mist in the valley, a village of mushroom-roofed houses on the far ridge. Wide shot from a terrace edge, 50mm.

Elapsed–

Cost$0.635

Recorded run, replayed faster than it ran.

$0.635this recorded run's cost

  • 720p, 6 sdefault≈ $0.635
  • 1080p, 6 s≈ $1.235

Forking copies the 2 steps into your dashboard. You change the input, press Run, and each call is billed to your balance.

Build it yourself

Each step is one request to the Hyperouter API with your key. A later step reads an earlier one's output through {{steps.<id>…}}, and your inputs through {{vars.<name>}}. Models: bytedance/seedream-5.0-lite, alibaba/wan3.0.

The 2 requests
  1. Draw the terraces

    POST /v1/images/generationsbytedance/seedream-5.0-lite1 image · 2560×1440

    {
      "model": "bytedance/seedream-5.0-lite",
      "prompt": "{{vars.idea}} Documentary realism shot on 65mm large-format film: natural and practical light only, deep blacks with detail held in the shadows, fine organic film grain, true skin texture with pores and wrinkles, no retouching, no digital sharpening, no beauty filter.",
      "size": "2560x1440",
      "n": 1
    }
  2. Set the terraces moving

    POST /v1/videosalibaba/wan3.0720p · 6 s · 16:9 · silent

    {
      "model": "alibaba/wan3.0",
      "prompt": "{{vars.motion}}",
      "first_frame": "{{steps.still.url[0]}}",
      "seconds": 6,
      "resolution": "720p",
      "ratio": "16:9"
    }
Run the whole pipeline from code
API=https://api.hyperouter.app/v1
call() { curl -s "$API/$1" -H "Authorization: Bearer $HYPEROUTER_API_KEY" -H 'Content-Type: application/json' "${@:2}"; }

LOOK='Documentary realism shot on 65mm large-format film: natural and practical light only, deep blacks with detail held in the shadows, fine organic film grain, true skin texture with pores and wrinkles, no retouching, no digital sharpening, no beauty filter.'
IDEA='Early morning on the Yuanyang rice terraces in Yunnan: flooded terraces stepping down the mountainside, mirror-still water reflecting low clouds and a pale sky. In the foreground three Hani farmers, two women and a man, bent over, transplanting rice seedlings by hand, trousers rolled to the knee, mud on their legs, bundles of green seedlings floating beside them. Mist in the valley, a village of mushroom-roofed houses on the far ridge. Wide shot from a terrace edge, 50mm.'
MOTION='The three farmers keep transplanting rice seedlings, each push of a seedling into the mud sends small ripples across the mirror-still water; mist drifts slowly through the valley below and the clouds move in the reflection. A very slow lateral camera drift along the terrace edge. Natural, real-time motion.'

# 1. the still
STILL=$(jq -n --arg p "$IDEA $LOOK" '{model:"bytedance/seedream-5.0-lite", prompt:$p, size:"2560x1440", n:1}' | call images/generations -d @- | jq -r '.data[0].url')

# 2. six seconds from that still: create, then poll
ID=$(jq -n --arg p "$MOTION" --arg f "$STILL" '{model:"alibaba/wan3.0", prompt:$p, first_frame:$f, seconds:6, resolution:"720p", ratio:"16:9"}' | call videos -d @- | jq -r .id)
while s=$(call videos/$ID | jq -r .status); [ "$s" = queued ] || [ "$s" = in_progress ]; do sleep 5; done
echo "$s"
call videos/$ID/content -L -o film.mp4

Run Rice terraces on your account

One still of the terraces, then six seconds of motion. Fork it, change the input, and run it from the dashboard: ≈ $0.635 per run at the default settings.