Source: https://ailoot.ai/models/ko/happyhorse-1-1-t2v/
Canonical: https://ailoot.ai/models/ko/happyhorse-1-1-t2v/
Language: ko

# happyhorse-1.1-t2v

[Markdown](https://ailoot.ai/models/ko/happyhorse-1-1-t2v/index.md) · [JSON](https://ailoot.ai/models/ko/happyhorse-1-1-t2v/facts.json)

## [happyhorse-1.1-t2v](https://ailoot.ai/models/ko/happyhorse-1-1-t2v/)

텍스트 설명을 바탕으로 사운드가 있는 짧은 동영상을 만드는 모델입니다. 움직임, 구도, 시각적 스타일을 말로 지정하는 장면에 적합합니다.

- [**Ailoot · 동영상** `POST /v1/videos/generations` `happyhorse-1.1-t2v`](https://ailoot.ai/models/ko/happyhorse-1-1-t2v/#method-0)
- [**Ailoot · 동영상** `POST /v1/videos/generations` `happyhorse-t2v`](https://ailoot.ai/models/ko/happyhorse-1-1-t2v/#method-1)
- [**Ailoot · 동영상** `POST /v1/videos/generations` `happyhorse-t2v-latest`](https://ailoot.ai/models/ko/happyhorse-1-1-t2v/#method-2)

모델 소개

이 설명은 모델의 기능을 다룹니다. Ailoot에서 사용할 수 있는 입력, 출력 및 옵션은 아래에 선택한 메서드별로 표시됩니다.

HappyHorse-1.1-T2V는 텍스트를 바탕으로 짧은 동영상 장면을 만드는 Alibaba 모델입니다. 설명으로 캐릭터, 동작, 배경, 시각적 표현을 지정하며, 이 모드에는 원본 이미지가 필요하지 않습니다. 모델은 영상을 구성하고 함께 재생할 사운드도 만들 수 있습니다.

개발사는 장면의 의미에 대한 이해, 영화적인 연출, 표현력 있는 움직임을 강조합니다. 텍스트로 분위기, 캐릭터의 동작, 사물의 움직임, 물리적인 역동성을 정할 수 있습니다. 무엇이 일어나야 하는지를 중심으로 장면을 구성한 뒤, 조명, 앵글, 카메라 움직임으로 연출 방향을 잡을 수 있습니다.

#### 말로 정하는 연출

지시는 필수이며 모든 언어로 작성할 수 있습니다. 중국어가 아닌 문자는 최대 5000자, 중국어 문자는 최대 2500자까지 입력할 수 있으며, 초과한 부분은 잘립니다. 동작, 주변 환경, 중요한 시각적 세부 사항을 이 제한 안에 설명해야 합니다. 이러한 지시는 완성된 첫 프레임을 제공하는 대신, 모델이 새로운 장면을 만들 여지를 남깁니다.

이 모드에서는 텍스트가 주된 제어 수단입니다. 캐릭터나 사물의 구체적인 모습은 말로 묘사할 수 있습니다. 외형을 별도의 이미지로 전달하는 기능은 같은 제품군의 다른 모드에 해당합니다. 결과는 전체 지시에 따라 달라지므로, 같은 초기 난수 시드는 비슷한 결과를 얻는 데 도움이 되지만 정확한 재현을 보장하지는 않습니다.

#### 영상과 사운드

HappyHorse-1.1의 동영상 길이는 3~15초 범위에서 정수로 선택합니다. 480P, 720P, 1080P 해상도를 지원합니다. 완성된 파일은 초당 24프레임의 MP4입니다. 모델은 영상과 함께 사운드를 생성해 장면에서 일어나는 일과 연결할 수 있습니다.

화면 비율은 미리 지정할 수 있습니다. 16:9, 9:16, 1:1, 4:3, 3:4, 4:5, 5:4, 9:21, 21:9를 지원하며, 넓은 영화적 화면부터 길쭉한 세로 영상까지 선택할 수 있습니다. 해상도, 형식, 길이는 결과물의 크기를 정하고, 내용과 움직임은 텍스트로 정합니다.

이 버전은 말로 표현한 구상에서 새로운 장면을 만드는 용도입니다. 연출을 텍스트로 설명해야 하는 짧은 에피소드, 시각적 아이디어, 분위기 있는 동영상에 적합합니다.

**Ailoot · 동영상** `POST /v1/videos/generations` `happyhorse-1.1-t2v`

[`happyhorse-1.1-t2v`](https://ailoot.ai/models/ko/#m=happyhorse-1.1-t2v&route=Core&caller=happyhorse-1.1-t2v&fmt=videos)

Alibaba /`happyhorse-1.1-t2v`

모델 ID

- `happyhorse-1.1-t2v`
- `happyhorse-t2v`
- `happyhorse-t2v-latest`

### 시작하기

텍스트 설명을 바탕으로 사운드가 있는 짧은 동영상을 만드는 모델입니다. 움직임, 구도, 시각적 스타일을 말로 지정하는 장면에 적합합니다.

허용 입력

텍스트

결과

동영상

### Ailoot에서 사용 가능 · 입력 및 메서드

**Ailoot · 동영상** `POST /v1/videos/generations`

입력

`text`

출력

`video`

출력 형식

mp4

| 필드 | 유형 | 요건 | 값과 한도 | 기본값 |
| --- | --- | --- | --- | --- |
| 필드`model` | 유형`string` | 요건필수 | 값과 한도 happyhorse-1.1-t2v | 기본값— |
| 필드`prompt` | 유형`string` | 요건필수 | 값과 한도 최소 길이: 1 | 기본값— |
| 필드`duration` | 유형`integer` | 요건선택 사항 | 값과 한도 최솟값: 3 최댓값: 15 단위: 초 | 기본값5 |
| 필드`resolution` | 유형`string` | 요건선택 사항 | 값과 한도 480P, 720P, 1080P | 기본값720P |
| 필드`ratio` | 유형`string` | 요건선택 사항 | 값과 한도 16:9, 9:16, 1:1, 4:3, 3:4, 4:5, 5:4, 9:21, 21:9 | 기본값16:9 |
| 필드`image_urls` | 유형`https_url\|data_image_url[]` | 요건선택 사항 | 값과 한도 최소 항목 수: 0 최대 항목 수: 0 디코딩 후 최대 바이트 수: 20,971,520 MIME 유형: image/jpeg, image/png, image/webp | 기본값— |

입력 자료 조합

**텍스트로 동영상 생성** · 필수: prompt

메서드 매개변수와 수명 주기

| 매개변수 | 명세 |
| --- | --- |
| 매개변수`content_type` | 명세application/json |
| 매개변수`required` | 명세model, prompt |
| 매개변수`material_types` | 명세text |
| 매개변수`optional` | 명세duration, resolution, ratio |
| 매개변수`duration_integer_range` | 명세3, 15 |
| 매개변수`default_duration` | 명세5 |
| 매개변수`resolution` | 명세480P, 720P, 1080P |
| 매개변수`default_resolution` | 명세720P |
| 매개변수`ratio` | 명세16:9, 9:16, 1:1, 4:3, 3:4, 4:5, 5:4, 9:21, 21:9 |
| 매개변수`ratio_must_omit` | 명세false |
| 매개변수`image_urls` | 명세{"max\_count":0} |

수명 주기: `submit_once_poll_original`

`GET /v1/videos/{request_id}`

`GET /v1/videos/generations/{request_id}`

`GET /v1/videos/{request_id}/content`

`GET /v1/videos/generations/{request_id}/content`

메서드 형식과 ID는 정확합니다. 공급자의 기능 지원과 요청 수락은 별개입니다.

### 요금

#### Ailoot 메서드 요금

출력

US$0.18 *1080p 해상도 초당*

출력

US$0.07 *480p 해상도 초당*

출력

US$0.14 *720p 해상도 초당*

Ailoot는 요청 전에 예상 금액을 미리 확보합니다. 결과를 받은 뒤 측정된 사용량을 기준으로 최종 요금을 정산합니다. 스트리밍 정산에는 최종 사용량 기록을 사용합니다. [금액 확보와 정산 방식 →](https://ailoot.ai/docs/ko/billing/reserve/)

### 요청 예제

#### Ailoot · 동영상

장면 예제

```bash
set -eu
: "${AILOOT_API_KEY:?Set your Ailoot API key}"
: "${AILOOT_PROMPT_FILE:?Set your actual UTF-8 scene brief}"
export AILOOT_PROMPT_FILE
python3 - <<'PY_REQUEST'
import json,os
from pathlib import Path
p=json.loads('{"model": "happyhorse-1.1-t2v", "prompt": "", "duration": 5, "resolution": "720P", "ratio": "16:9"}')
f=Path(os.environ["AILOOT_PROMPT_FILE"])
if not f.is_file():raise SystemExit("Choose your actual UTF-8 brief")
p['prompt']=f.read_text(encoding="utf-8")
if not p['prompt'].strip():raise SystemExit("Brief must contain text")
Path("request.json").write_text(json.dumps(p,ensure_ascii=False))
PY_REQUEST
curl --fail-with-body --silent --show-error https://api.ailoot.ai/v1/videos/generations \
  -H "Authorization: Bearer $AILOOT_API_KEY" -H 'Content-Type: application/json' \
  --data-binary @request.json -D response-headers.txt -o result.json
python3 - <<'PY_RESULT'
import json
from pathlib import Path
print(json.dumps(json.loads(Path("result.json").read_text()),ensure_ascii=False,indent=2))
PY_RESULT
```

### 결과 수신 및 저장

#### Ailoot · 동영상

mp4

- `GET /v1/videos/{request_id}`
- `GET /v1/videos/generations/{request_id}`
- `GET /v1/videos/{request_id}/content`
- `GET /v1/videos/generations/{request_id}/content`

##### 작업 상태 확인

GET · 상태 조회

```bash
set -eu
: "${AILOOT_API_KEY:?Set your Ailoot API key}"
: "${AILOOT_OPERATION_ID:?Set the actual Ailoot operation ID returned by creation}"
export AILOOT_OPERATION_ID
operation_id=$(python3 -c 'import os,urllib.parse;print(urllib.parse.quote(os.environ["AILOOT_OPERATION_ID"],safe=""))')
curl --fail-with-body --silent --show-error "https://api.ailoot.ai/v1/videos/generations/$operation_id" \
  -H "Authorization: Bearer $AILOOT_API_KEY" -o status.json
python3 - <<'PY_STATUS'
import json
from pathlib import Path
r=json.loads(Path("status.json").read_text())
print(json.dumps(r))
if r.get("status")=="completed":
    for x in r.get("data",[]):print(x)
PY_STATUS
```

##### 완료된 자산 모두 저장

GET · 완료된 모든 자산 조회

```bash
set -eu
: "${AILOOT_API_KEY:?Set your Ailoot API key}"
: "${AILOOT_STATUS_FILE:?Set the actual completed status JSON file}"
export AILOOT_STATUS_FILE
python3 - <<'PY_REQUEST'
import json,os
from pathlib import Path
from urllib.parse import urlsplit,urljoin
f=Path(os.environ["AILOOT_STATUS_FILE"])
if not f.is_file():raise SystemExit("Choose the actual completed status file")
r=json.loads(f.read_text())
if r.get("status")!="completed" or not isinstance(r.get("data"),list) or not r["data"]:raise SystemExit("Wait for a completed status with asset paths")
urls=[]
for x in r["data"]:
    if not isinstance(x,str) or "\n" in x or "\r" in x:raise SystemExit("Invalid asset path")
    u=urljoin("https://api.ailoot.ai",x)
    z=urlsplit(u)
    if z.scheme!="https" or z.netloc!="api.ailoot.ai" or z.username or z.password:raise SystemExit("Use the actual Ailoot asset paths from status")
    urls.append(u)
Path("asset-urls.txt").write_text("\n".join(urls)+"\n")
PY_REQUEST
index=0
while IFS= read -r asset_url; do
  curl --fail-with-body --silent --show-error "$asset_url" \
    -H "Authorization: Bearer $AILOOT_API_KEY" -o "video-${index}.mp4"
  index=$((index + 1))
done < asset-urls.txt
```

기타 콘텐츠 조회

GET · 콘텐츠 조회

```bash
set -eu
: "${AILOOT_API_KEY:?Set your Ailoot API key}"
: "${AILOOT_OPERATION_ID:?Set the actual Ailoot operation ID returned by creation}"
export AILOOT_OPERATION_ID
operation_id=$(python3 -c 'import os,urllib.parse;print(urllib.parse.quote(os.environ["AILOOT_OPERATION_ID"],safe=""))')
curl --fail-with-body --silent --show-error "https://api.ailoot.ai/v1/videos/generations/$operation_id/content" \
  -H "Authorization: Bearer $AILOOT_API_KEY" -o video.mp4
```

##### 완료된 결과 모두 보관

완료된 모든 동영상과 반환된 파일을 저장하고, 실제로 반환된 모든 자산 URL에서 가져오세요.

반환된 모든 데이터 항목/출력 인덱스를 보존하세요. content\_url은 첫 번째 출력만 가리킵니다. 실제 콘텐츠 경로/자산을 모두 가져오세요. index 없는 콘텐츠 GET은 전체 출력을 의미하지 않습니다.

##### 원래 응답을 확인해야 할 경우

기존 원래 작업을 조회하세요. 전송 결과를 알 수 없는 요청을 절대로 다시 제출하지 마세요.

응답 필드

| 필드 | 유형 |
| --- | --- |
| 필드`id` | 유형string |
| 필드`object` | 유형string |
| 필드`model` | 유형string |
| 필드`status` | 유형string |
| 필드`content_url` | 유형signed URL |
| 필드`data[]` | 유형signed URL |
| 필드`usage` | 유형object |
| 필드`result_pending_check` | 유형boolean |

오류와 다음 단계

| 응답 | 조건 | 다음 단계 |
| --- | --- | --- |
| 응답400 · `invalid_request_error` | 조건필수 필드, 자료 표현 방식 또는 파라미터 값이 올바르지 않음 | 다음 단계새 생성 요청 전에 표시된 필드를 수정하세요. |
| 응답409 · `video_not_ready` | 조건원래 결과 콘텐츠를 아직 사용할 수 없음 | 다음 단계원래 반환된 ID를 폴링하고 Retry-After를 준수하세요. |
| 응답`server_error` | 조건반환된 응답에 작업 또는 결과 확인이 필요하다고 표시되어 있습니다 | 다음 단계최초로 반환된 작업/태스크 ID, 요청 헤더와 응답을 보관하고, 지원되는 조회 방식으로 해당 최초 작업을 계속 조회하세요. 생성 요청을 다시 제출하지 마세요. |

### 별칭

#### 모델 별칭

**Ailoot** [`happyhorse-1.1-t2v`](https://ailoot.ai/models/ko/#m=happyhorse-1.1-t2v&route=Core&caller=happyhorse-1.1-t2v&fmt=videos), [`happyhorse-t2v`](https://ailoot.ai/models/ko/#m=happyhorse-1.1-t2v&route=Core&caller=happyhorse-t2v&fmt=videos), [`happyhorse-t2v-latest`](https://ailoot.ai/models/ko/#m=happyhorse-1.1-t2v&route=Core&caller=happyhorse-t2v-latest&fmt=videos)

#### 메서드 경로 별칭

위에 표시된 메서드 경로를 사용하세요.

#### 관련 호출용 ID

[`happyhorse-1.1-t2v`](https://ailoot.ai/models/ko/#m=happyhorse-1.1-t2v&route=Core&caller=happyhorse-1.1-t2v&fmt=videos), [`happyhorse-t2v`](https://ailoot.ai/models/ko/#m=happyhorse-1.1-t2v&route=Core&caller=happyhorse-t2v&fmt=videos), [`happyhorse-t2v-latest`](https://ailoot.ai/models/ko/#m=happyhorse-1.1-t2v&route=Core&caller=happyhorse-t2v-latest&fmt=videos)

**Ailoot · 동영상** `POST /v1/videos/generations` `happyhorse-t2v`

[`happyhorse-t2v`](https://ailoot.ai/models/ko/#m=happyhorse-1.1-t2v&route=Core&caller=happyhorse-t2v&fmt=videos)

Alibaba /`happyhorse-t2v`

모델 ID

- `happyhorse-1.1-t2v`
- `happyhorse-t2v`
- `happyhorse-t2v-latest`

### 시작하기

텍스트 설명을 바탕으로 사운드가 있는 짧은 동영상을 만드는 모델입니다. 움직임, 구도, 시각적 스타일을 말로 지정하는 장면에 적합합니다.

허용 입력

텍스트

결과

동영상

### Ailoot에서 사용 가능 · 입력 및 메서드

**Ailoot · 동영상** `POST /v1/videos/generations`

입력

`text`

출력

`video`

출력 형식

mp4

| 필드 | 유형 | 요건 | 값과 한도 | 기본값 |
| --- | --- | --- | --- | --- |
| 필드`model` | 유형`string` | 요건필수 | 값과 한도 happyhorse-t2v | 기본값— |
| 필드`prompt` | 유형`string` | 요건필수 | 값과 한도 최소 길이: 1 | 기본값— |
| 필드`duration` | 유형`integer` | 요건선택 사항 | 값과 한도 최솟값: 3 최댓값: 15 단위: 초 | 기본값5 |
| 필드`resolution` | 유형`string` | 요건선택 사항 | 값과 한도 480P, 720P, 1080P | 기본값720P |
| 필드`ratio` | 유형`string` | 요건선택 사항 | 값과 한도 16:9, 9:16, 1:1, 4:3, 3:4, 4:5, 5:4, 9:21, 21:9 | 기본값16:9 |
| 필드`image_urls` | 유형`https_url\|data_image_url[]` | 요건선택 사항 | 값과 한도 최소 항목 수: 0 최대 항목 수: 0 디코딩 후 최대 바이트 수: 20,971,520 MIME 유형: image/jpeg, image/png, image/webp | 기본값— |

입력 자료 조합

**텍스트로 동영상 생성** · 필수: prompt

메서드 매개변수와 수명 주기

| 매개변수 | 명세 |
| --- | --- |
| 매개변수`material_types` | 명세text |
| 매개변수`required` | 명세null |
| 매개변수`optional_controls` | 명세null |

수명 주기: `submit_once_poll_original`

`GET /v1/videos/{request_id}`

`GET /v1/videos/generations/{request_id}`

`GET /v1/videos/{request_id}/content`

`GET /v1/videos/generations/{request_id}/content`

메서드 형식과 ID는 정확합니다. 공급자의 기능 지원과 요청 수락은 별개입니다.

### 요금

#### Ailoot 메서드 요금

출력

US$0.18 *1080p 해상도 초당*

출력

US$0.07 *480p 해상도 초당*

출력

US$0.14 *720p 해상도 초당*

Ailoot는 요청 전에 예상 금액을 미리 확보합니다. 결과를 받은 뒤 측정된 사용량을 기준으로 최종 요금을 정산합니다. 스트리밍 정산에는 최종 사용량 기록을 사용합니다. [금액 확보와 정산 방식 →](https://ailoot.ai/docs/ko/billing/reserve/)

### 요청 예제

#### Ailoot · 동영상

장면 예제

```bash
set -eu
: "${AILOOT_API_KEY:?Set your Ailoot API key}"
: "${AILOOT_PROMPT_FILE:?Set your actual UTF-8 scene brief}"
export AILOOT_PROMPT_FILE
python3 - <<'PY_REQUEST'
import json,os
from pathlib import Path
p=json.loads('{"model": "happyhorse-t2v", "prompt": "", "duration": 5, "resolution": "720P", "ratio": "16:9"}')
f=Path(os.environ["AILOOT_PROMPT_FILE"])
if not f.is_file():raise SystemExit("Choose your actual UTF-8 brief")
p['prompt']=f.read_text(encoding="utf-8")
if not p['prompt'].strip():raise SystemExit("Brief must contain text")
Path("request.json").write_text(json.dumps(p,ensure_ascii=False))
PY_REQUEST
curl --fail-with-body --silent --show-error https://api.ailoot.ai/v1/videos/generations \
  -H "Authorization: Bearer $AILOOT_API_KEY" -H 'Content-Type: application/json' \
  --data-binary @request.json -D response-headers.txt -o result.json
python3 - <<'PY_RESULT'
import json
from pathlib import Path
print(json.dumps(json.loads(Path("result.json").read_text()),ensure_ascii=False,indent=2))
PY_RESULT
```

### 결과 수신 및 저장

#### Ailoot · 동영상

mp4

- `GET /v1/videos/{request_id}`
- `GET /v1/videos/generations/{request_id}`
- `GET /v1/videos/{request_id}/content`
- `GET /v1/videos/generations/{request_id}/content`

##### 작업 상태 확인

GET · 상태 조회

```bash
set -eu
: "${AILOOT_API_KEY:?Set your Ailoot API key}"
: "${AILOOT_OPERATION_ID:?Set the actual Ailoot operation ID returned by creation}"
export AILOOT_OPERATION_ID
operation_id=$(python3 -c 'import os,urllib.parse;print(urllib.parse.quote(os.environ["AILOOT_OPERATION_ID"],safe=""))')
curl --fail-with-body --silent --show-error "https://api.ailoot.ai/v1/videos/generations/$operation_id" \
  -H "Authorization: Bearer $AILOOT_API_KEY" -o status.json
python3 - <<'PY_STATUS'
import json
from pathlib import Path
r=json.loads(Path("status.json").read_text())
print(json.dumps(r))
if r.get("status")=="completed":
    for x in r.get("data",[]):print(x)
PY_STATUS
```

##### 완료된 자산 모두 저장

GET · 완료된 모든 자산 조회

```bash
set -eu
: "${AILOOT_API_KEY:?Set your Ailoot API key}"
: "${AILOOT_STATUS_FILE:?Set the actual completed status JSON file}"
export AILOOT_STATUS_FILE
python3 - <<'PY_REQUEST'
import json,os
from pathlib import Path
from urllib.parse import urlsplit,urljoin
f=Path(os.environ["AILOOT_STATUS_FILE"])
if not f.is_file():raise SystemExit("Choose the actual completed status file")
r=json.loads(f.read_text())
if r.get("status")!="completed" or not isinstance(r.get("data"),list) or not r["data"]:raise SystemExit("Wait for a completed status with asset paths")
urls=[]
for x in r["data"]:
    if not isinstance(x,str) or "\n" in x or "\r" in x:raise SystemExit("Invalid asset path")
    u=urljoin("https://api.ailoot.ai",x)
    z=urlsplit(u)
    if z.scheme!="https" or z.netloc!="api.ailoot.ai" or z.username or z.password:raise SystemExit("Use the actual Ailoot asset paths from status")
    urls.append(u)
Path("asset-urls.txt").write_text("\n".join(urls)+"\n")
PY_REQUEST
index=0
while IFS= read -r asset_url; do
  curl --fail-with-body --silent --show-error "$asset_url" \
    -H "Authorization: Bearer $AILOOT_API_KEY" -o "video-${index}.mp4"
  index=$((index + 1))
done < asset-urls.txt
```

기타 콘텐츠 조회

GET · 콘텐츠 조회

```bash
set -eu
: "${AILOOT_API_KEY:?Set your Ailoot API key}"
: "${AILOOT_OPERATION_ID:?Set the actual Ailoot operation ID returned by creation}"
export AILOOT_OPERATION_ID
operation_id=$(python3 -c 'import os,urllib.parse;print(urllib.parse.quote(os.environ["AILOOT_OPERATION_ID"],safe=""))')
curl --fail-with-body --silent --show-error "https://api.ailoot.ai/v1/videos/generations/$operation_id/content" \
  -H "Authorization: Bearer $AILOOT_API_KEY" -o video.mp4
```

##### 완료된 결과 모두 보관

완료된 모든 동영상과 반환된 파일을 저장하고, 실제로 반환된 모든 자산 URL에서 가져오세요.

반환된 모든 데이터 항목/출력 인덱스를 보존하세요. content\_url은 첫 번째 출력만 가리킵니다. 실제 콘텐츠 경로/자산을 모두 가져오세요. index 없는 콘텐츠 GET은 전체 출력을 의미하지 않습니다.

##### 원래 응답을 확인해야 할 경우

기존 원래 작업을 조회하세요. 전송 결과를 알 수 없는 요청을 절대로 다시 제출하지 마세요.

응답 필드

| 필드 | 유형 |
| --- | --- |
| 필드`id` | 유형string |
| 필드`object` | 유형string |
| 필드`model` | 유형string |
| 필드`status` | 유형string |
| 필드`content_url` | 유형signed URL |
| 필드`data[]` | 유형signed URL |
| 필드`usage` | 유형object |
| 필드`result_pending_check` | 유형boolean |

오류와 다음 단계

| 응답 | 조건 | 다음 단계 |
| --- | --- | --- |
| 응답400 · `invalid_request_error` | 조건필수 필드, 자료 표현 방식 또는 파라미터 값이 올바르지 않음 | 다음 단계새 생성 요청 전에 표시된 필드를 수정하세요. |
| 응답409 · `video_not_ready` | 조건원래 결과 콘텐츠를 아직 사용할 수 없음 | 다음 단계원래 반환된 ID를 폴링하고 Retry-After를 준수하세요. |
| 응답`server_error` | 조건반환된 응답에 작업 또는 결과 확인이 필요하다고 표시되어 있습니다 | 다음 단계최초로 반환된 작업/태스크 ID, 요청 헤더와 응답을 보관하고, 지원되는 조회 방식으로 해당 최초 작업을 계속 조회하세요. 생성 요청을 다시 제출하지 마세요. |

### 별칭

#### 모델 별칭

**Ailoot** [`happyhorse-1.1-t2v`](https://ailoot.ai/models/ko/#m=happyhorse-1.1-t2v&route=Core&caller=happyhorse-1.1-t2v&fmt=videos), [`happyhorse-t2v`](https://ailoot.ai/models/ko/#m=happyhorse-1.1-t2v&route=Core&caller=happyhorse-t2v&fmt=videos), [`happyhorse-t2v-latest`](https://ailoot.ai/models/ko/#m=happyhorse-1.1-t2v&route=Core&caller=happyhorse-t2v-latest&fmt=videos)

#### 메서드 경로 별칭

위에 표시된 메서드 경로를 사용하세요.

#### 관련 호출용 ID

[`happyhorse-1.1-t2v`](https://ailoot.ai/models/ko/#m=happyhorse-1.1-t2v&route=Core&caller=happyhorse-1.1-t2v&fmt=videos), [`happyhorse-t2v`](https://ailoot.ai/models/ko/#m=happyhorse-1.1-t2v&route=Core&caller=happyhorse-t2v&fmt=videos), [`happyhorse-t2v-latest`](https://ailoot.ai/models/ko/#m=happyhorse-1.1-t2v&route=Core&caller=happyhorse-t2v-latest&fmt=videos)

**Ailoot · 동영상** `POST /v1/videos/generations` `happyhorse-t2v-latest`

[`happyhorse-t2v-latest`](https://ailoot.ai/models/ko/#m=happyhorse-1.1-t2v&route=Core&caller=happyhorse-t2v-latest&fmt=videos)

Alibaba /`happyhorse-t2v-latest`

모델 ID

- `happyhorse-1.1-t2v`
- `happyhorse-t2v`
- `happyhorse-t2v-latest`

### 시작하기

텍스트 설명을 바탕으로 사운드가 있는 짧은 동영상을 만드는 모델입니다. 움직임, 구도, 시각적 스타일을 말로 지정하는 장면에 적합합니다.

허용 입력

텍스트

결과

동영상

### Ailoot에서 사용 가능 · 입력 및 메서드

**Ailoot · 동영상** `POST /v1/videos/generations`

입력

`text`

출력

`video`

출력 형식

mp4

| 필드 | 유형 | 요건 | 값과 한도 | 기본값 |
| --- | --- | --- | --- | --- |
| 필드`model` | 유형`string` | 요건필수 | 값과 한도 happyhorse-t2v-latest | 기본값— |
| 필드`prompt` | 유형`string` | 요건필수 | 값과 한도 최소 길이: 1 | 기본값— |
| 필드`duration` | 유형`integer` | 요건선택 사항 | 값과 한도 최솟값: 3 최댓값: 15 단위: 초 | 기본값5 |
| 필드`resolution` | 유형`string` | 요건선택 사항 | 값과 한도 480P, 720P, 1080P | 기본값720P |
| 필드`ratio` | 유형`string` | 요건선택 사항 | 값과 한도 16:9, 9:16, 1:1, 4:3, 3:4, 4:5, 5:4, 9:21, 21:9 | 기본값16:9 |
| 필드`image_urls` | 유형`https_url\|data_image_url[]` | 요건선택 사항 | 값과 한도 최소 항목 수: 0 최대 항목 수: 0 디코딩 후 최대 바이트 수: 20,971,520 MIME 유형: image/jpeg, image/png, image/webp | 기본값— |

입력 자료 조합

**텍스트로 동영상 생성** · 필수: prompt

메서드 매개변수와 수명 주기

| 매개변수 | 명세 |
| --- | --- |
| 매개변수`material_types` | 명세text |
| 매개변수`required` | 명세null |
| 매개변수`optional_controls` | 명세null |

수명 주기: `submit_once_poll_original`

`GET /v1/videos/{request_id}`

`GET /v1/videos/generations/{request_id}`

`GET /v1/videos/{request_id}/content`

`GET /v1/videos/generations/{request_id}/content`

메서드 형식과 ID는 정확합니다. 공급자의 기능 지원과 요청 수락은 별개입니다.

### 요금

#### Ailoot 메서드 요금

출력

US$0.18 *1080p 해상도 초당*

출력

US$0.07 *480p 해상도 초당*

출력

US$0.14 *720p 해상도 초당*

Ailoot는 요청 전에 예상 금액을 미리 확보합니다. 결과를 받은 뒤 측정된 사용량을 기준으로 최종 요금을 정산합니다. 스트리밍 정산에는 최종 사용량 기록을 사용합니다. [금액 확보와 정산 방식 →](https://ailoot.ai/docs/ko/billing/reserve/)

### 요청 예제

#### Ailoot · 동영상

장면 예제

```bash
set -eu
: "${AILOOT_API_KEY:?Set your Ailoot API key}"
: "${AILOOT_PROMPT_FILE:?Set your actual UTF-8 scene brief}"
export AILOOT_PROMPT_FILE
python3 - <<'PY_REQUEST'
import json,os
from pathlib import Path
p=json.loads('{"model": "happyhorse-t2v-latest", "prompt": "", "duration": 5, "resolution": "720P", "ratio": "16:9"}')
f=Path(os.environ["AILOOT_PROMPT_FILE"])
if not f.is_file():raise SystemExit("Choose your actual UTF-8 brief")
p['prompt']=f.read_text(encoding="utf-8")
if not p['prompt'].strip():raise SystemExit("Brief must contain text")
Path("request.json").write_text(json.dumps(p,ensure_ascii=False))
PY_REQUEST
curl --fail-with-body --silent --show-error https://api.ailoot.ai/v1/videos/generations \
  -H "Authorization: Bearer $AILOOT_API_KEY" -H 'Content-Type: application/json' \
  --data-binary @request.json -D response-headers.txt -o result.json
python3 - <<'PY_RESULT'
import json
from pathlib import Path
print(json.dumps(json.loads(Path("result.json").read_text()),ensure_ascii=False,indent=2))
PY_RESULT
```

### 결과 수신 및 저장

#### Ailoot · 동영상

mp4

- `GET /v1/videos/{request_id}`
- `GET /v1/videos/generations/{request_id}`
- `GET /v1/videos/{request_id}/content`
- `GET /v1/videos/generations/{request_id}/content`

##### 작업 상태 확인

GET · 상태 조회

```bash
set -eu
: "${AILOOT_API_KEY:?Set your Ailoot API key}"
: "${AILOOT_OPERATION_ID:?Set the actual Ailoot operation ID returned by creation}"
export AILOOT_OPERATION_ID
operation_id=$(python3 -c 'import os,urllib.parse;print(urllib.parse.quote(os.environ["AILOOT_OPERATION_ID"],safe=""))')
curl --fail-with-body --silent --show-error "https://api.ailoot.ai/v1/videos/generations/$operation_id" \
  -H "Authorization: Bearer $AILOOT_API_KEY" -o status.json
python3 - <<'PY_STATUS'
import json
from pathlib import Path
r=json.loads(Path("status.json").read_text())
print(json.dumps(r))
if r.get("status")=="completed":
    for x in r.get("data",[]):print(x)
PY_STATUS
```

##### 완료된 자산 모두 저장

GET · 완료된 모든 자산 조회

```bash
set -eu
: "${AILOOT_API_KEY:?Set your Ailoot API key}"
: "${AILOOT_STATUS_FILE:?Set the actual completed status JSON file}"
export AILOOT_STATUS_FILE
python3 - <<'PY_REQUEST'
import json,os
from pathlib import Path
from urllib.parse import urlsplit,urljoin
f=Path(os.environ["AILOOT_STATUS_FILE"])
if not f.is_file():raise SystemExit("Choose the actual completed status file")
r=json.loads(f.read_text())
if r.get("status")!="completed" or not isinstance(r.get("data"),list) or not r["data"]:raise SystemExit("Wait for a completed status with asset paths")
urls=[]
for x in r["data"]:
    if not isinstance(x,str) or "\n" in x or "\r" in x:raise SystemExit("Invalid asset path")
    u=urljoin("https://api.ailoot.ai",x)
    z=urlsplit(u)
    if z.scheme!="https" or z.netloc!="api.ailoot.ai" or z.username or z.password:raise SystemExit("Use the actual Ailoot asset paths from status")
    urls.append(u)
Path("asset-urls.txt").write_text("\n".join(urls)+"\n")
PY_REQUEST
index=0
while IFS= read -r asset_url; do
  curl --fail-with-body --silent --show-error "$asset_url" \
    -H "Authorization: Bearer $AILOOT_API_KEY" -o "video-${index}.mp4"
  index=$((index + 1))
done < asset-urls.txt
```

기타 콘텐츠 조회

GET · 콘텐츠 조회

```bash
set -eu
: "${AILOOT_API_KEY:?Set your Ailoot API key}"
: "${AILOOT_OPERATION_ID:?Set the actual Ailoot operation ID returned by creation}"
export AILOOT_OPERATION_ID
operation_id=$(python3 -c 'import os,urllib.parse;print(urllib.parse.quote(os.environ["AILOOT_OPERATION_ID"],safe=""))')
curl --fail-with-body --silent --show-error "https://api.ailoot.ai/v1/videos/generations/$operation_id/content" \
  -H "Authorization: Bearer $AILOOT_API_KEY" -o video.mp4
```

##### 완료된 결과 모두 보관

완료된 모든 동영상과 반환된 파일을 저장하고, 실제로 반환된 모든 자산 URL에서 가져오세요.

반환된 모든 데이터 항목/출력 인덱스를 보존하세요. content\_url은 첫 번째 출력만 가리킵니다. 실제 콘텐츠 경로/자산을 모두 가져오세요. index 없는 콘텐츠 GET은 전체 출력을 의미하지 않습니다.

##### 원래 응답을 확인해야 할 경우

기존 원래 작업을 조회하세요. 전송 결과를 알 수 없는 요청을 절대로 다시 제출하지 마세요.

응답 필드

| 필드 | 유형 |
| --- | --- |
| 필드`id` | 유형string |
| 필드`object` | 유형string |
| 필드`model` | 유형string |
| 필드`status` | 유형string |
| 필드`content_url` | 유형signed URL |
| 필드`data[]` | 유형signed URL |
| 필드`usage` | 유형object |
| 필드`result_pending_check` | 유형boolean |

오류와 다음 단계

| 응답 | 조건 | 다음 단계 |
| --- | --- | --- |
| 응답400 · `invalid_request_error` | 조건필수 필드, 자료 표현 방식 또는 파라미터 값이 올바르지 않음 | 다음 단계새 생성 요청 전에 표시된 필드를 수정하세요. |
| 응답409 · `video_not_ready` | 조건원래 결과 콘텐츠를 아직 사용할 수 없음 | 다음 단계원래 반환된 ID를 폴링하고 Retry-After를 준수하세요. |
| 응답`server_error` | 조건반환된 응답에 작업 또는 결과 확인이 필요하다고 표시되어 있습니다 | 다음 단계최초로 반환된 작업/태스크 ID, 요청 헤더와 응답을 보관하고, 지원되는 조회 방식으로 해당 최초 작업을 계속 조회하세요. 생성 요청을 다시 제출하지 마세요. |

### 별칭

#### 모델 별칭

**Ailoot** [`happyhorse-1.1-t2v`](https://ailoot.ai/models/ko/#m=happyhorse-1.1-t2v&route=Core&caller=happyhorse-1.1-t2v&fmt=videos), [`happyhorse-t2v`](https://ailoot.ai/models/ko/#m=happyhorse-1.1-t2v&route=Core&caller=happyhorse-t2v&fmt=videos), [`happyhorse-t2v-latest`](https://ailoot.ai/models/ko/#m=happyhorse-1.1-t2v&route=Core&caller=happyhorse-t2v-latest&fmt=videos)

#### 메서드 경로 별칭

위에 표시된 메서드 경로를 사용하세요.

#### 관련 호출용 ID

[`happyhorse-1.1-t2v`](https://ailoot.ai/models/ko/#m=happyhorse-1.1-t2v&route=Core&caller=happyhorse-1.1-t2v&fmt=videos), [`happyhorse-t2v`](https://ailoot.ai/models/ko/#m=happyhorse-1.1-t2v&route=Core&caller=happyhorse-t2v&fmt=videos), [`happyhorse-t2v-latest`](https://ailoot.ai/models/ko/#m=happyhorse-1.1-t2v&route=Core&caller=happyhorse-t2v-latest&fmt=videos)

FAQ · happyhorse-1.1-t2v

어떤 입력과 결과를 사용할 수 있나요?

`POST /v1/videos/generations` · `happyhorse-1.1-t2v`: `text` → `video` `POST /v1/videos/generations` · `happyhorse-t2v`: `text` → `video` `POST /v1/videos/generations` · `happyhorse-t2v-latest`: `text` → `video`

요청은 어떤 필드를 사용하나요?

`POST /v1/videos/generations` · `happyhorse-1.1-t2v`: `model`, `prompt`, `duration`, `resolution`, `ratio`, `image_urls` `POST /v1/videos/generations` · `happyhorse-t2v`: `model`, `prompt`, `duration`, `resolution`, `ratio`, `image_urls` `POST /v1/videos/generations` · `happyhorse-t2v-latest`: `model`, `prompt`, `duration`, `resolution`, `ratio`, `image_urls`

어떤 제한이 적용되나요?

`POST /v1/videos/generations` · `happyhorse-1.1-t2v`: `duration.minimum`: `3`; `duration.maximum`: `15` `POST /v1/videos/generations` · `happyhorse-t2v`: `duration.minimum`: `3`; `duration.maximum`: `15` `POST /v1/videos/generations` · `happyhorse-t2v-latest`: `duration.minimum`: `3`; `duration.maximum`: `15`

Claude Code, OpenCode, Hermes, 자체 앱에 Ailoot를 연결하세요.

## 회사와 그 프로젝트 포트폴리오

회사와 그 프로젝트 포트폴리오: 수백만 고객, 매월 수십억 규모의 매출.

## 할인받아 토큰을 구매하세요.

정기 작업에는 구독 할인, 토큰 구매에는 최대 50% 프로모션 코드.

구독

정기 요청에 맞는 할인 요금제를 선택하세요.

최대 50% 프로모션 코드

구매할 때 코드를 넣으면 진행 중 행사에 따라 가격을 다시 계산합니다.

이력의 지출

요청마다 모델, 토큰, 금액을 저장합니다.

[구독 선택](https://ailoot.ai/docs/ko/billing/subscriptions/) · [모델 가격 보기](https://ailoot.ai/models/ko/)

## 판매하는 제품에 API를 연결하세요.

Ailoot 공식 이용 조건과 라이선스 계약으로 SaaS, 앱, 봇에 사용하세요. 재판매에는 리셀러 라이선스를 요청하세요.

상업용 앱

서비스의 유료 기능에 텍스트, 이미지, 영상, 소리 생성을 넣으세요.

리셀러 라이선스

프로젝트 설명과 접근 구조를 보내 사용·재판매의 서면 조건을 요청하세요.

사이트의 문서

연결 전에 공식 이용 조건, 라이선스 계약, 데이터 처리 정책을 읽을 수 있습니다.

[리셀러 라이선스 요청](mailto:support@ailoot.ai) · [공식 이용 조건과 라이선스 계약](https://ailoot.ai/legal/offer?lang=ko)

## Ailoot · 회사와 그 프로젝트 포트폴리오





Ailoot는 축적된 운영 경험, 폭넓은 고객 기반, 안정적인 서비스, 지속적인 KPI 관리를 바탕으로 합니다.





회사와 그 프로젝트 포트폴리오: 수백만 고객, 매월 수십억 규모의 매출.





Ailoot는 이러한 운영 경험을 고객의 제품, 에이전트, 애플리케이션, 자동화에서 AI 기능을 이용할 수 있는 API 접근에 활용합니다.
