Real outputs from the public examples of this model on Replicate, with the prompt and settings that produced them. They were not generated live on this page.
Prompt
A cinematic anime character intimate closeup, she is sitting at a cafe on a busy city street in the morning, it is cold
Luma AI, founded in 2021 by Amit Jain (ex-Apple) and Alex Yu (ex-UC Berkeley), began as a 3D / NeRF capture company before becoming a generative-video lab with the launch of Dream Machine in mid-2024. Luma followed with the Ray family of higher-fidelity models: Ray 1 (early 2025), Ray 2 (mid-2025) and Ray Flash 2 (late 2025). Ray Flash 2 is the speed-tier sibling of Ray 2: distilled and quantized for substantially faster and cheaper inference at near-Ray-2 visual quality. The Ray family is available via the Luma web app, the Luma API, and integrations such as Amazon Bedrock and Adobe Firefly partnerships. Luma's investors include a16z, Amplify Partners, NVIDIA and Matrix Partners, with a 2025 valuation above $4B.
Distilled latent video diffusion (DiT-style) speed tier
Luma Ray Flash 2 is the distilled, low-step variant of Ray 2, Luma's flagship video diffusion-transformer model. The base Ray 2 is a multi-billion-parameter latent video diffusion model with a transformer denoiser operating on a learned spatio-temporal latent space and conditioned on text embeddings (multilingual) and optional image embeddings. Flash 2 is produced via consistency-style distillation and quantization, compressing the sampler into far fewer denoising steps and reducing per-clip latency and cost while preserving most of Ray 2's prompt adherence and motion physics. Ray Flash 2 supports text-to-video, image-to-video (first frame), end-frame conditioning and 'extend' operations; output is 5-second clips at 720p / 24 fps with optional upscaling to 1080p.
Speed-tier distilled video model with near-Ray-2 quality
Text-to-video and image-to-video
First-frame and end-frame conditioning
5-second clips at 720p / 24 fps, upscalable to 1080p
Extend operations for ~20-second sequences
Strong cinematic camera moves and physics
Available via Luma web app, API and Amazon Bedrock
Lower cost per second than Ray 2
Best for: high-volume creative iteration, social shorts, ad creative.
Entraînement et licence
Closed corpus combining licensed stock footage, curated web video and synthetic data; bilingual captions from an in-house vision-language captioner. Exact dataset size undisclosed.
Licence: Proprietary commercial licence via Luma API and Bedrock terms.
curl https://railwail.com/api/v1/videos/generations \
-H "Authorization: Bearer $RAILWAIL_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "luma-ray-flash",
"prompt": "A slow drone shot over a misty pine forest at sunrise"
}'
# Response: {"job_id": "...", "status": "queued", ...}
# Poll until status is completed, failed or cancelled:
curl https://railwail.com/api/v1/jobs/JOB_ID \
-H "Authorization: Bearer $RAILWAIL_API_KEY"
import os
import time
import requests
API = "https://railwail.com/api/v1"
headers = {"Authorization": f"Bearer {os.environ['RAILWAIL_API_KEY']}"}
job = requests.post(
f"{API}/videos/generations",
headers=headers,
json={
"model": "luma-ray-flash",
"prompt": "A slow drone shot over a misty pine forest at sunrise",
},
).json()
while True:
status = requests.get(f"{API}/jobs/{job['job_id']}", headers=headers).json()
if status["status"] in ("completed", "failed", "cancelled"):
break
time.sleep(5)
print(status["status"], status.get("output_url"))
const API = "https://railwail.com/api/v1";
const headers = {
Authorization: `Bearer ${process.env.RAILWAIL_API_KEY}`,
"Content-Type": "application/json",
};
const job = await fetch(`${API}/videos/generations`, {
method: "POST",
headers,
body: JSON.stringify({
model: "luma-ray-flash",
prompt: "A slow drone shot over a misty pine forest at sunrise"
}),
}).then((r) => r.json());
let status;
do {
await new Promise((r) => setTimeout(r, 5000));
status = await fetch(`${API}/jobs/${job.job_id}`, { headers }).then((r) => r.json());
} while (!["completed", "failed", "cancelled"].includes(status.status));
console.log(status.status, status.output_url);