> ## Documentation Index
> Fetch the complete documentation index at: https://docs.sglang.io/llms.txt
> Use this file to discover all available pages before exploring further.

# SANA-Video

> Serve the native SANA-Video 2B 480p text-to-video model with SGLang Diffusion.

export const DiffusionModelTags = ({tags = []}) => {
  const normalizedTags = Array.isArray(tags) ? tags : [tags];
  return <div className="not-prose sgd-model-tags">
      {normalizedTags.map(tag => <span key={tag} className="sgd-chip">
          {tag}
        </span>)}
    </div>;
};

<DiffusionModelTags tags={["video", "text-to-video", "480p", "2B lightweight"]} />

## 1. Model Introduction

[SANA-Video 2B 480p](https://huggingface.co/Efficient-Large-Model/SANA-Video_2B_480p_diffusers)
is a lightweight text-to-video model served through a native SGLang Diffusion
pipeline. Its main advantage is deployment cost: at 2B parameters it serves
480p video from a single GPU with a plain `sglang serve` invocation, no
parallelism flags required.

The released generation profile produces 832×480 output at 81 frames and
16 FPS over 50 inference steps; a compact 17-frame, 8-step profile is covered
by server CI for quick validation. Motion strength can be steered directly
from the prompt with an optional `motion score: N.` suffix.

| Model ID                                             | Task          | Default output               |
| ---------------------------------------------------- | ------------- | ---------------------------- |
| `Efficient-Large-Model/SANA-Video_2B_480p_diffusers` | Text to video | 832x480, 81 frames at 16 FPS |

## 2. Installation

Install SGLang with the diffusion dependencies:

```bash Command theme={null}
uv pip install "sglang[diffusion]" --prerelease=allow
```

See the [SGLang Diffusion installation guide](/docs/sglang-diffusion/installation)
for platform-specific setup.

## 3. Serve SANA-Video

```bash Command theme={null}
sglang serve \
  --model-path Efficient-Large-Model/SANA-Video_2B_480p_diffusers \
  --port 30010
```

## 4. Generate a video

The following request uses the compact 17-frame, 8-step profile covered by
server CI. Use the model defaults of 81 frames and 50 steps for the released
generation profile.

```python Python theme={null}
import time
from pathlib import Path

import requests

base_url = "http://127.0.0.1:30010"
response = requests.post(
    f"{base_url}/v1/videos",
    json={
        "model": "Efficient-Large-Model/SANA-Video_2B_480p_diffusers",
        "prompt": (
            "A red tram moves slowly through a sunlit city square while "
            "pedestrians cross behind it. motion score: 30."
        ),
        "size": "832x480",
        "num_frames": 17,
        "fps": 16,
        "num_inference_steps": 8,
        "guidance_scale": 6.0,
        "seed": 42,
    },
    timeout=60,
)
response.raise_for_status()
video_id = response.json()["id"]

while True:
    job = requests.get(f"{base_url}/v1/videos/{video_id}", timeout=30).json()
    if job["status"] == "completed":
        break
    if job["status"] == "failed":
        raise RuntimeError(job.get("error") or "Video generation failed")
    time.sleep(1)

video = requests.get(
    f"{base_url}/v1/videos/{video_id}/content",
    timeout=300,
)
video.raise_for_status()
Path("sana_video.mp4").write_bytes(video.content)
```

## 5. Request constraints

* The default profile uses `832x480`, 81 frames, 50 inference steps, and 16 FPS.
* Frame counts are aligned to `4n+1`; for example, a request for 80 frames is
  adjusted to 77.
* Use width and height values divisible by 16.
* The prompt supports an optional `motion score: N.` suffix to express the
  desired amount of motion.
