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

# Wan2.1 14B - Text to Video

> Text-to-video with bilingual text

<CardGroup cols={1}>
  <Card title="Try Wan2.1 14B - Text to Video in the Workbench" icon="flask" href="https://www.oxen.ai/ai/workbench?model=wan-ai-wan2-1-t2v-14b-diffusers">
    Run this model interactively, tune parameters, and compare outputs.
  </Card>
</CardGroup>

**Model ID:** `wan-ai-wan2-1-t2v-14b-diffusers`

Wan-AI/Wan2.1-T2V-14B-Diffusers is a 14B parameter Large Vision Model (LVM) designed for high-fidelity text-to-video and image-to-video generation, including support for readable text in English and Chinese within generated videos.

It excels in generating temporally consistent videos from detailed prompts, offers customizable aspect ratios, and maintains stability at both 480p and 720p resolutions across consumer-grade hardware.

Some other noteworthy features of Wan-AI/Wan2.1-T2V-14B-Diffusers include prompt enhancement for improved video quality and precision, inspiration mode for artistic visual enrichment, sound effects generation, and efficient video encoding via a variational autoencoder (VAE).

| Metric             | Value      |
| ------------------ | ---------- |
| Parameter Count    | 14 billion |
| Mixture of Experts | No         |
| Context Length     | Unknown    |
| Multilingual       | Yes        |
| Quantized\*        | No         |

\**Quantization is specific to the inference provider and the model may be offered with different quantization levels by other providers.*

## Example request

<Tip>
  Use the [Workbench](https://www.oxen.ai/ai/workbench?model=wan-ai-wan2-1-t2v-14b-diffusers) as a request builder: configure parameters for this model in the UI, then open the **API** tab to copy the exact cURL or Python call.
</Tip>

<Tabs>
  <Tab title="Sync">
    This blocks until the video is ready (typically 5-15 minutes). Prefer **Async** or **Async with SSE** for anything beyond quick experimentation.

    See the [video generation reference](/inference-api/reference/video_generation) for more details.

    <Tabs>
      <Tab title="Minimal">
        <CodeGroup>
          ```bash cURL theme={null}
          curl -X POST https://hub.oxen.ai/api/ai/videos/generate \
            -H "Content-Type: application/json" \
            -H "Authorization: Bearer $OXEN_API_KEY" \
            -d '{
            "model": "wan-ai-wan2-1-t2v-14b-diffusers",
            "prompt": "A beautiful landscape painting of a serene lake with mountains in the background and an ox in the foreground."
          }'
          ```

          ```python Python theme={null}
          import os
          import requests

          response = requests.post(
              "https://hub.oxen.ai/api/ai/videos/generate",
              headers={
                  "Content-Type": "application/json",
                  "Authorization": f"Bearer {os.environ['OXEN_API_KEY']}",
              },
              json={
                  "model": "wan-ai-wan2-1-t2v-14b-diffusers",
                  "prompt": "A beautiful landscape painting of a serene lake with mountains in the background and an ox in the foreground."
              },
          )
          response.raise_for_status()
          print(response.json())
          ```
        </CodeGroup>
      </Tab>

      <Tab title="All parameters">
        <CodeGroup>
          ```bash cURL theme={null}
          curl -X POST https://hub.oxen.ai/api/ai/videos/generate \
            -H "Content-Type: application/json" \
            -H "Authorization: Bearer $OXEN_API_KEY" \
            -d '{
            "model": "wan-ai-wan2-1-t2v-14b-diffusers",
            "prompt": "A beautiful landscape painting of a serene lake with mountains in the background and an ox in the foreground.",
            "height": 480,
            "width": 832,
            "negative_prompt": " ",
            "num_inference_steps": 16,
            "num_frames": 81,
            "guidance_scale": 5.0
          }'
          ```

          ```python Python theme={null}
          import os
          import requests

          response = requests.post(
              "https://hub.oxen.ai/api/ai/videos/generate",
              headers={
                  "Content-Type": "application/json",
                  "Authorization": f"Bearer {os.environ['OXEN_API_KEY']}",
              },
              json={
                  "model": "wan-ai-wan2-1-t2v-14b-diffusers",
                  "prompt": "A beautiful landscape painting of a serene lake with mountains in the background and an ox in the foreground.",
                  "height": 480,
                  "width": 832,
                  "negative_prompt": " ",
                  "num_inference_steps": 16,
                  "num_frames": 81,
                  "guidance_scale": 5.0
              },
          )
          response.raise_for_status()
          print(response.json())
          ```
        </CodeGroup>
      </Tab>
    </Tabs>
  </Tab>

  <Tab title="Async">
    See the [async queue reference](/inference-api/reference/async_queue) for more details.

    <Tabs>
      <Tab title="Minimal">
        <CodeGroup>
          ```bash cURL theme={null}
          # Enqueue, capture the generation id.
          GEN_ID=$(curl -s -X POST https://hub.oxen.ai/api/ai/queue \
            -H "Content-Type: application/json" \
            -H "Authorization: Bearer $OXEN_API_KEY" \
            -d '{
            "model": "wan-ai-wan2-1-t2v-14b-diffusers",
            "prompt": "A beautiful landscape painting of a serene lake with mountains in the background and an ox in the foreground."
          }' | jq -r '.generations[0].generation_id')

          # Poll until the generation reaches a terminal status.
          while true; do
            STATUS=$(curl -s -H "Authorization: Bearer $OXEN_API_KEY" \
              "https://hub.oxen.ai/api/ai/queue/$GEN_ID" | jq -r '.status')
            echo "Status: $STATUS"
            case $STATUS in succeeded|failed|cancelled) break;; esac
            sleep 5
          done

          # Print the result.
          curl -s -H "Authorization: Bearer $OXEN_API_KEY" \
            "https://hub.oxen.ai/api/ai/queue/$GEN_ID" | jq .
          ```

          ```python Python theme={null}
          import os
          import time
          import requests

          HEADERS = {
              "Content-Type": "application/json",
              "Authorization": f"Bearer {os.environ['OXEN_API_KEY']}",
          }

          enqueue = requests.post(
              "https://hub.oxen.ai/api/ai/queue",
              headers=HEADERS,
              json={
                  "model": "wan-ai-wan2-1-t2v-14b-diffusers",
                  "prompt": "A beautiful landscape painting of a serene lake with mountains in the background and an ox in the foreground."
              },
          )
          enqueue.raise_for_status()
          generation_id = enqueue.json()["generations"][0]["generation_id"]

          while True:
              data = requests.get(
                  f"https://hub.oxen.ai/api/ai/queue/{generation_id}",
                  headers=HEADERS,
              ).json()
              if data["status"] in {"succeeded", "failed", "cancelled"}:
                  break
              time.sleep(5)

          if data["status"] == "succeeded":
              print(f"Result: {data['result_url']}")
          else:
              print(f"Generation {data['status']}: {data.get('error_message')}")
          ```
        </CodeGroup>
      </Tab>

      <Tab title="All parameters">
        <CodeGroup>
          ```bash cURL theme={null}
          # Enqueue, capture the generation id.
          GEN_ID=$(curl -s -X POST https://hub.oxen.ai/api/ai/queue \
            -H "Content-Type: application/json" \
            -H "Authorization: Bearer $OXEN_API_KEY" \
            -d '{
            "model": "wan-ai-wan2-1-t2v-14b-diffusers",
            "prompt": "A beautiful landscape painting of a serene lake with mountains in the background and an ox in the foreground.",
            "height": 480,
            "width": 832,
            "negative_prompt": " ",
            "num_inference_steps": 16,
            "num_frames": 81,
            "guidance_scale": 5.0
          }' | jq -r '.generations[0].generation_id')

          # Poll until the generation reaches a terminal status.
          while true; do
            STATUS=$(curl -s -H "Authorization: Bearer $OXEN_API_KEY" \
              "https://hub.oxen.ai/api/ai/queue/$GEN_ID" | jq -r '.status')
            echo "Status: $STATUS"
            case $STATUS in succeeded|failed|cancelled) break;; esac
            sleep 5
          done

          # Print the result.
          curl -s -H "Authorization: Bearer $OXEN_API_KEY" \
            "https://hub.oxen.ai/api/ai/queue/$GEN_ID" | jq .
          ```

          ```python Python theme={null}
          import os
          import time
          import requests

          HEADERS = {
              "Content-Type": "application/json",
              "Authorization": f"Bearer {os.environ['OXEN_API_KEY']}",
          }

          enqueue = requests.post(
              "https://hub.oxen.ai/api/ai/queue",
              headers=HEADERS,
              json={
                  "model": "wan-ai-wan2-1-t2v-14b-diffusers",
                  "prompt": "A beautiful landscape painting of a serene lake with mountains in the background and an ox in the foreground.",
                  "height": 480,
                  "width": 832,
                  "negative_prompt": " ",
                  "num_inference_steps": 16,
                  "num_frames": 81,
                  "guidance_scale": 5.0
              },
          )
          enqueue.raise_for_status()
          generation_id = enqueue.json()["generations"][0]["generation_id"]

          while True:
              data = requests.get(
                  f"https://hub.oxen.ai/api/ai/queue/{generation_id}",
                  headers=HEADERS,
              ).json()
              if data["status"] in {"succeeded", "failed", "cancelled"}:
                  break
              time.sleep(5)

          if data["status"] == "succeeded":
              print(f"Result: {data['result_url']}")
          else:
              print(f"Generation {data['status']}: {data.get('error_message')}")
          ```
        </CodeGroup>
      </Tab>
    </Tabs>
  </Tab>

  <Tab title="Async with SSE">
    See the [async queue reference](/inference-api/reference/async_queue) for more details.

    <Tabs>
      <Tab title="Minimal">
        <CodeGroup>
          ```bash cURL theme={null}
          # Enqueue, capture the generation id.
          GEN_ID=$(curl -s -X POST https://hub.oxen.ai/api/ai/queue \
            -H "Content-Type: application/json" \
            -H "Authorization: Bearer $OXEN_API_KEY" \
            -d '{
            "model": "wan-ai-wan2-1-t2v-14b-diffusers",
            "prompt": "A beautiful landscape painting of a serene lake with mountains in the background and an ox in the foreground."
          }' | jq -r '.generations[0].generation_id')

          # Stream the SSE channel, grab the data line that follows a
          # media_generation_completed event for our id, and pretty-print it.
          curl -sN -H "Authorization: Bearer $OXEN_API_KEY" https://hub.oxen.ai/api/events \
            | awk -v id="$GEN_ID" '
              /^event: media_generation_completed$/ { expect=1; next }
              /^data: / && expect {
                payload = substr($0, 7)
                if (index(payload, "\"generation_id\":\"" id "\"")) { print payload; exit }
                expect = 0
              }
            ' | jq .
          ```

          ```python Python theme={null}
          import json
          import os
          import requests

          API_KEY = os.environ["OXEN_API_KEY"]
          AUTH = {"Authorization": f"Bearer {API_KEY}"}

          enqueue = requests.post(
              "https://hub.oxen.ai/api/ai/queue",
              headers={**AUTH, "Content-Type": "application/json"},
              json={
                  "model": "wan-ai-wan2-1-t2v-14b-diffusers",
                  "prompt": "A beautiful landscape painting of a serene lake with mountains in the background and an ox in the foreground."
              },
          )
          enqueue.raise_for_status()
          generation_id = enqueue.json()["generations"][0]["generation_id"]

          with requests.get(
              "https://hub.oxen.ai/api/events",
              headers=AUTH,
              stream=True,
          ) as stream:
              event_name = None
              for line in stream.iter_lines(decode_unicode=True):
                  if line.startswith("event: "):
                      event_name = line.removeprefix("event: ")
                  elif line.startswith("data: ") and event_name == "media_generation_completed":
                      payload = json.loads(line.removeprefix("data: "))
                      if payload.get("generation_id") == generation_id:
                          print(payload)
                          break
          ```
        </CodeGroup>
      </Tab>

      <Tab title="All parameters">
        <CodeGroup>
          ```bash cURL theme={null}
          # Enqueue, capture the generation id.
          GEN_ID=$(curl -s -X POST https://hub.oxen.ai/api/ai/queue \
            -H "Content-Type: application/json" \
            -H "Authorization: Bearer $OXEN_API_KEY" \
            -d '{
            "model": "wan-ai-wan2-1-t2v-14b-diffusers",
            "prompt": "A beautiful landscape painting of a serene lake with mountains in the background and an ox in the foreground.",
            "height": 480,
            "width": 832,
            "negative_prompt": " ",
            "num_inference_steps": 16,
            "num_frames": 81,
            "guidance_scale": 5.0
          }' | jq -r '.generations[0].generation_id')

          # Stream the SSE channel, grab the data line that follows a
          # media_generation_completed event for our id, and pretty-print it.
          curl -sN -H "Authorization: Bearer $OXEN_API_KEY" https://hub.oxen.ai/api/events \
            | awk -v id="$GEN_ID" '
              /^event: media_generation_completed$/ { expect=1; next }
              /^data: / && expect {
                payload = substr($0, 7)
                if (index(payload, "\"generation_id\":\"" id "\"")) { print payload; exit }
                expect = 0
              }
            ' | jq .
          ```

          ```python Python theme={null}
          import json
          import os
          import requests

          API_KEY = os.environ["OXEN_API_KEY"]
          AUTH = {"Authorization": f"Bearer {API_KEY}"}

          enqueue = requests.post(
              "https://hub.oxen.ai/api/ai/queue",
              headers={**AUTH, "Content-Type": "application/json"},
              json={
                  "model": "wan-ai-wan2-1-t2v-14b-diffusers",
                  "prompt": "A beautiful landscape painting of a serene lake with mountains in the background and an ox in the foreground.",
                  "height": 480,
                  "width": 832,
                  "negative_prompt": " ",
                  "num_inference_steps": 16,
                  "num_frames": 81,
                  "guidance_scale": 5.0
              },
          )
          enqueue.raise_for_status()
          generation_id = enqueue.json()["generations"][0]["generation_id"]

          with requests.get(
              "https://hub.oxen.ai/api/events",
              headers=AUTH,
              stream=True,
          ) as stream:
              event_name = None
              for line in stream.iter_lines(decode_unicode=True):
                  if line.startswith("event: "):
                      event_name = line.removeprefix("event: ")
                  elif line.startswith("data: ") and event_name == "media_generation_completed":
                      payload = json.loads(line.removeprefix("data: "))
                      if payload.get("generation_id") == generation_id:
                          print(payload)
                          break
          ```
        </CodeGroup>
      </Tab>
    </Tabs>
  </Tab>
</Tabs>

## Fetch model details

The [models endpoint](/inference-api/reference/models/overview) returns the full model object, including its `json_request_schema`.

```bash theme={null}
curl -H "Authorization: Bearer $OXEN_API_KEY" https://hub.oxen.ai/api/ai/models/wan-ai-wan2-1-t2v-14b-diffusers
```

## Request parameters

### Required parameters

| Field    | Type     | Default                                                                                                           | Description                |
| -------- | -------- | ----------------------------------------------------------------------------------------------------------------- | -------------------------- |
| `prompt` | `string` | `"A beautiful landscape painting of a serene lake with mountains in the background and an ox in the foreground."` | Prompt for generated image |

### Optional parameters

| Field                 | Type      | Default | Description                                                                               |
| --------------------- | --------- | ------- | ----------------------------------------------------------------------------------------- |
| `height`              | `integer` | `480`   | Height of the video Range: 1 – 720.                                                       |
| `width`               | `integer` | `832`   | Width of the video Range: 1 – 1280.                                                       |
| `negative_prompt`     | `string`  | `" "`   | Negative prompt for generated image                                                       |
| `num_inference_steps` | `integer` | `16`    | Number of diffusion steps to take Range: 1 – 100.                                         |
| `num_frames`          | `integer` | `81`    | Number of frames of video to generate Range: 1 – 120.                                     |
| `guidance_scale`      | `number`  | `5.0`   | Guidance for generated video. Lower values can give more realistic videos. Range: 0 – 10. |
| `seed`                | `integer` | —       | Random seed. Set for reproducible generation                                              |
