# Wan 동영상 생성 API

> LMU AI를 통해 네이티브 비동기 프로토콜로 Wan(Alibaba DashScope) 동영상 생성을 호출합니다. 작업 생성, 결과 폴링, 기본값, 전체 폴링 예제를 다룹니다.

URL: https://docs.lmuai.ai/ko/docs/api/wan-video



Wan(Alibaba Cloud Model Studio, DashScope) 동영상 생성은 공식 DashScope 프로토콜과 동일한 벤더의 **네이티브 비동기 프로토콜**을 사용합니다. 공식 SDK나 curl 명령의 주소를 LMU AI 주소로, 키를 LMU AI API 키로 바꾸기만 하면 되며 요청 본문은 그대로 유지됩니다. 인증, 과금 및 워터마크, 동시 실행 제한, 오류 코드에 관한 공통 규칙은 [동영상 생성 API 개요](/ko/docs/api/video-generation)를 참조하세요.

<Callout type="info" title="Base URL">
  ```text
  https://api.lmuai.ai
  ```

  | 작업    | 엔드포인트                                                         |
  | ----- | ------------------------------------------------------------- |
  | 작업 생성 | `POST /api/v1/services/aigc/video-generation/video-synthesis` |
  | 작업 조회 | `GET /api/v1/tasks/{task_id}`                                 |
</Callout>

<Callout type="warn" title="그룹에 동영상 생성이 활성화되어 있어야 합니다">
  API 키가 속한 그룹에 "동영상 생성"이 활성화되어 있어야 하며, 그렇지 않으면 호출 시 `403`이 반환됩니다. 모델 이름은 그룹에 활성화된 이름과 **정확히** 일치해야 합니다(대소문자 구분). 사용 가능한 모델은 `GET /v1/models`로 확인하세요.
</Callout>

## 1. 작업 생성 [#create-task]

### `POST /api/v1/services/aigc/video-generation/video-synthesis` [#post-apiv1servicesaigcvideo-generationvideo-synthesis]

비동기 헤더 `X-DashScope-Async: enable`은 선택 사항이며, 플랫폼이 자동으로 추가합니다.

| 매개변수                    | 타입      | 필수  | 설명                                                                                                  |
| ----------------------- | ------- | --- | --------------------------------------------------------------------------------------------------- |
| `model`                 | string  | 예   | 예: `wan3.0-video`                                                                                   |
| `input.prompt`          | string  | 예   | 프롬프트                                                                                                |
| `input.media`           | array   | 아니요 | 참조 미디어. 예: `[{"type":"first_frame","url":"…"}]`. `type`은 `first_frame` 또는 `reference_image`일 수 있습니다 |
| `parameters.resolution` | string  | 아니요 | 해상도 등급: `480P` / `720P` / `1080P`, 기본값 `1080P`                                                      |
| `parameters.duration`   | integer | 아니요 | 길이(초), 기본값 5                                                                                        |
| `parameters.watermark`  | boolean | 아니요 | 그룹 정책에 따라 플랫폼이 일괄 설정하며, 클라이언트가 지정한 값은 무시될 수 있습니다                                                    |

<Tabs items="['cURL', 'Python', 'Node.js']">
  <Tab value="cURL">
    ```bash
    curl https://api.lmuai.ai/api/v1/services/aigc/video-generation/video-synthesis \
      -H "Authorization: Bearer YOUR_API_KEY" \
      -H "Content-Type: application/json" \
      -d '{
        "model": "wan3.0-video",
        "input": {"prompt": "A Shiba Inu running across a sunny meadow"},
        "parameters": {"resolution": "720P", "duration": 5}
      }'
    ```
  </Tab>

  <Tab value="Python">
    ```python
    import requests

    BASE = "https://api.lmuai.ai"
    HEADERS = {"Authorization": "Bearer YOUR_API_KEY"}

    resp = requests.post(f"{BASE}/api/v1/services/aigc/video-generation/video-synthesis", headers=HEADERS, json={
        "model": "wan3.0-video",
        "input": {"prompt": "A Shiba Inu running across a sunny meadow"},
        "parameters": {"resolution": "720P", "duration": 5},
    })
    resp.raise_for_status()
    task_id = resp.json()["output"]["task_id"]
    print(task_id)
    ```
  </Tab>

  <Tab value="Node.js">
    ```js
    const BASE = "https://api.lmuai.ai";
    const headers = {
      Authorization: "Bearer YOUR_API_KEY",
      "Content-Type": "application/json",
    };

    const resp = await fetch(`${BASE}/api/v1/services/aigc/video-generation/video-synthesis`, {
      method: "POST",
      headers,
      body: JSON.stringify({
        model: "wan3.0-video",
        input: { prompt: "A Shiba Inu running across a sunny meadow" },
        parameters: { resolution: "720P", duration: 5 },
      }),
    });
    const data = await resp.json();
    console.log(data.output.task_id);
    ```
  </Tab>
</Tabs>

응답:

```json
{
  "request_id": "4909100c-…",
  "output": {
    "task_id": "c65c77fe-323b-4140-8de6-5a7241d9ec44",
    "task_status": "PENDING"
  }
}
```

## 2. 작업 조회 [#query-task]

### `GET /api/v1/tasks/{task_id}` [#get-apiv1taskstask_id]

`output.task_status` 값: `PENDING` → `RUNNING` → `SUCCEEDED` / `FAILED` / `CANCELED`. 성공 시 동영상 URL은 `output.video_url`에, 과금된 초는 `usage.duration`에 있습니다.

```bash
curl https://api.lmuai.ai/api/v1/tasks/TASK_ID \
  -H "Authorization: Bearer YOUR_API_KEY"
```

응답(성공):

```json
{
  "request_id": "…",
  "output": {
    "task_id": "c65c77fe-323b-4140-8de6-5a7241d9ec44",
    "task_status": "SUCCEEDED",
    "video_url": "https://…/output.mp4"
  },
  "usage": {
    "duration": 2.0,
    "video_count": 1
  }
}
```

<Callout type="info" title="취소 엔드포인트 없음">
  Wan에는 취소 엔드포인트가 없습니다. 제출된 작업은 항상 끝까지 실행됩니다. 실패한 작업은 과금되지 않습니다.
</Callout>

## 3. 전체 예제: 생성 및 폴링 [#poll-example]

```python
import time, requests

BASE = "https://api.lmuai.ai"
HEADERS = {"Authorization": "Bearer YOUR_API_KEY"}

# 1. Create the task
resp = requests.post(f"{BASE}/api/v1/services/aigc/video-generation/video-synthesis", headers=HEADERS, json={
    "model": "wan3.0-video",
    "input": {"prompt": "A Shiba Inu running across a sunny meadow"},
    "parameters": {"resolution": "720P", "duration": 5},
})
resp.raise_for_status()
task_id = resp.json()["output"]["task_id"]

# 2. Poll until a final state (every 10 seconds)
while True:
    task = requests.get(f"{BASE}/api/v1/tasks/{task_id}", headers=HEADERS).json()
    status = task["output"]["task_status"]
    if status in ("SUCCEEDED", "FAILED", "CANCELED", "CANCELLED", "UNKNOWN"):
        break
    time.sleep(10)

# 3. Download (the link is valid for 24 hours)
if status == "SUCCEEDED":
    url = task["output"]["video_url"]
    with open(f"{task_id}.mp4", "wb") as f:
        f.write(requests.get(url).content)
else:
    print("Generation failed:", task)
```

## 4. 과금 및 오류 코드 [#billing]

Wan은 "실제 초 × 해상도 등급 단가"로 과금되며, 과금된 초는 조회 결과의 `usage.duration`에 있습니다. 작업 생성 시 예상 금액이 동결되며, 잔액이 부족하면 `402`가 반환됩니다. 성공 시 실제 사용량으로 정산되고, 실패한 작업은 전액 환불됩니다. 각 사용자와 각 API 키는 동시에 최대 5개의 작업을 생성할 수 있으며, 이를 초과하면 요청 시 `429`가 반환됩니다.

전체 규칙은 개요의 [과금 및 워터마크](/ko/docs/api/video-generation#billing), [동시 실행 제한](/ko/docs/api/video-generation#limits), [오류 코드](/ko/docs/api/video-generation#errors)를 참조하세요. 다른 제공업체는 [Seedance 동영상 생성 API](/ko/docs/api/seedance-video)를 참조하세요.
