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
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 }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.mjs import OpenAI from 'openai'; const c = new OpenAI({ baseURL: 'https://api.hyperouter.app/v1', apiKey: process.env.HYPEROUTER_API_KEY }); const 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.'; const 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.'; const 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 const still = (await c.post('/images/generations', { body: { model: 'bytedance/seedream-5.0-lite', prompt: IDEA + ' ' + LOOK, size: '2560x1440', n: 1 } })).data[0].url; // 2. six seconds from that still: create, then poll let v = await c.post('/videos', { body: { model: 'alibaba/wan3.0', prompt: MOTION, first_frame: still, seconds: 6, resolution: '720p', ratio: '16:9' } }); while (['queued', 'in_progress'].includes(v.status)) { await new Promise((ok) => setTimeout(ok, 5000)); v = await c.get('/videos/' + v.id); } if (v.status !== 'completed') throw new Error(JSON.stringify(v.error)); console.log((await c.get('/generations/' + v.id)).data.outputs[0].url);
import os, time from openai import OpenAI c = OpenAI(base_url='https://api.hyperouter.app/v1', api_key=os.environ['HYPEROUTER_API_KEY']) 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 = c.post('/images/generations', cast_to=object, body={ 'model': 'bytedance/seedream-5.0-lite', 'prompt': IDEA + ' ' + LOOK, 'size': '2560x1440', 'n': 1})['data'][0]['url'] # 2. six seconds from that still: create, then poll v = c.post('/videos', cast_to=object, body={ 'model': 'alibaba/wan3.0', 'prompt': MOTION, 'first_frame': still, 'seconds': 6, 'resolution': '720p', 'ratio': '16:9'}) while v['status'] in ('queued', 'in_progress'): time.sleep(5) v = c.get('/videos/' + v['id'], cast_to=object) assert v['status'] == 'completed', v['error'] print(c.get('/generations/' + v['id'], cast_to=object)['data']['outputs'][0]['url'])
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.