비디오 생성 API 호출 문서
kozeai는 OpenAI Sora와 호환되는 비디오 생성 인터페이스를 제공하며, **비동기 작업** 모드를 사용합니다. 먼저 작업을 제출하여 `task_id`를 획득한 후, 작업 상태를 주기적으로 확인하고, 작업이 완료되면 비디오 콘텐츠를 다운로드합니다.
인증
모든 요청은 `Authorization: Bearer
export KOZEAI_API_KEY='sk-your-token'
export KOZEAI_BASE_URL='https://api.kozeai.com'
인터페이스 개요
<표> <머리글>/v1/videos/generations/v1/videos/{task_id}/v1/videos/{task_id}/content제출 인터페이스에서 반환되는
task_12345형식의 작업 ID는 현재 사용자에게만 해당됩니다.
1. 비디오 작업 생성
curl "$KOZEAI_BASE_URL/v1/videos/generations" \
-H "Authorization: Bearer $KOZEAI_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "video-ds-2.0",
"prompt":
요청 매개변수
| 매개변수 | 유형 | 필수 | 설명 |
|---|---|---|---|
모델 |
문자열 | 예 | 비디오 모델 이름(예: video-ds-2.0 | )
프롬프트 |
문자열 | 예 | 비디오 콘텐츠 설명 | 초 |
정수 | 아니요 | 업스트림 모델 지원 범위에 따른 비디오 재생 시간(초) |
화면 비율 |
문자열 | 아니요 | 화면 비율, 일반적으로 9:16, 16:9, 1:1 |
이미지 |
배열 | 아니요 | 참조 이미지 URL 또는 base64 |
비디오 |
배열 | 아니요 | 참조 비디오 URL |
오디오 |
배열 | 아니요 | 참조 오디오 URL |
업스트림 모델에 따라 지원하는 매개변수가 다를 수 있습니다.
명시되지 않은 매개변수는 상위 프로토콜에 따라 전달됩니다.
이미지 기반 비디오(참조 이미지 포함)
참조 이미지를 기반으로 비디오를 생성하려면 images 배열을 전달하세요.
curl "$KOZEAI_BASE_URL/v1/videos/generations" \
-H "Authorization: Bearer $KOZEAI_API_KEY" \
-H "Content-Type: application/json" \
-d {
모델: video-ds-2.0,
프롬프트: 참조 이미지 스타일을 사용하여 부드러운 제품 비디오를 만드세요,
초: 15,
화면 비율: 9:16,
이미지: ["https://example.com/input.png"],
"videos": ["https://example.com/input.mp4"],
"audios": ["https://example.com/input.mp3"]
}'
images는 이미지 URL 또는 base64를 지원합니다.videos/audios는 선택적인 참조 자료입니다.- 채팅 자동 완성 인터페이스(본문 끝부분 참조)를 통해 호출할 경우, 이미지를 메시지에 첨부하기만 하면 됩니다. 시스템에서 자동으로
images 매개변수로 변환합니다.
응답 (제출 성공)
{
"id": "task_12345",
"task_id": "task_12345",
"object": "video",
"model": 'video-ds-2.0',
'상태': '대기 중',
'진행률': 0,
'생성 시간':
}
상태 값: 대기 중 (대기열에 있음), 진행 중 (진행 중), 완료됨 (완료됨), 실패됨 (실패).
2. 작업 상태 폴링
제출에서 반환된 id를 사용하여 3~5초 간격으로 폴링하세요.
curl "$KOZEAI_BASE_URL/v1/videos/task_12345" \
-H "Authorization: Bearer $KOZEAI_API_KEY"
응답(생성 중)
{
"id": 'task_12345',
'object': 'video',
'model': 'video-ds-2.0',
'status': 'in_progress',
'progress': 45,
'created_at': 1751000000
}
응답 (완료)
{
'id': 'task_12345',
'object': 'video',
'model': 'video-ds-2.0',
'status': &34;완료&34;,
&34;진행률&34;: 100,
&34;생성 시간&34;: 1751000000,
완료 후, `metadata.content_url`에는 바로 접속 가능한 비디오 주소가 제공됩니다. 아래 콘텐츠 인터페이스를 사용하여 다운로드할 수도 있습니다.
응답(실패)
{
'id': 'task_12345',
'object': 'video',
'status': 'failed',
'error': { 'message': '실패 사유' }
}
3. 비디오 콘텐츠 다운로드
curl -L "$KOZEAI_BASE_URL/v1/videos/task_12345/content" \
-H "Authorization: Bearer $KOZEAI_API_KEY" \
-o result.mp4
- 작업이 완료되지 않은 경우(대기열에 있거나 생성 중인 경우) 409 Conflict 오류를 반환합니다.
요청 헤더를 사용하여 분할 다운로드/드래그 앤 드롭 재생을 지원합니다.
를 반환합니다.
전체 예제
JavaScript (fetch + polling)
const BASE = process.env.KOZEAI_BASE_URL;
const KEY = process.env.KOZEAI_API_KEY;
const headers = { Authorization: `Bearer ${KEY}` };
// 1. 작업 제출
const submit = await fetch(`${BASE}/v1/videos/generations`, {
method: 'POST',
headers: { ...headers, 'Content-Type': 'application/json' },
body: JSON.stringify({
model: video-ds-2.0,
prompt: 유리 위에 놓인 향수병의 부드러운 광고 영상,
seconds: 15,
aspect_ratio: 9:16,
}),
});
const task = await submit.json();
const taskId = task.id;
// 2. 완료될 때까지 폴링
async function 폴링() {
while (true) {
const res = await fetch(`${BASE}/v1/videos/${taskId}`, { headers });
const data = await res.json();
if (data.status === 'completed') return data;
if (data.status === 'failed') throw new Error(data.error?.message || 'failed');
await new Promise((r) => setTimeout(r, 5000));
}
}
const done = await poll();
// 3. 비디오 주소 가져오기
console.log('비디오 주소:', done.metadata?.content_url
|| `${BASE}/v1/videos/${taskId}/content`);
Python (요청 + 폴링)
import os, time, requests
BASE = os.environ["KOZEAI_BASE_URL"]
KEY = os.environ["KOZEAI_API_KEY"]
headers = {"Authorization": f"Bearer {KEY}"}
# 1. 작업 제출
resp = requests.post(
f"{BASE}/v1/videos/generations",
headers=headers,
json={
"model": "video-ds-2.0",
"prompt": "따뜻한 햇살 속을 달리는 고양이의 영화 같은 9:16 영상",
초: 15,
종횡비: 9:16,
},
)
task_id = resp.json()[id]
# 2. 폴링
while True:
data = requests.get(f{BASE}/v1/videos/{task_id}, headers=headers).json()
if data["status"] == "completed":
if data["status"] == "failed":
raise RuntimeError(data.get("error", {}).get("message", "failed"))
time.sleep(5)
# 3. 다운로드
mp4 = requests.get(f{BASE}/v1/videos/{task_id}/content, headers=headers)
with open(&34;result.mp4, &34;wb) as f: f.write(mp4.content)
채팅 자동 완성 인터페이스에서 호출됨(호환 사용)
비디오 모델은 다음을 통해서도 호출할 수 있습니다. /v1/chat/completions를 통해 채팅 클라이언트의 재사용을 용이하게 합니다.
요청 시 `model`에 비디오 모델 이름을 전달하기만 하면 시스템에서 자동으로 비디오 작업으로 변환합니다.
curl $KOZEAI_BASE_URL/v1/chat/completions \
-H Authorization: Bearer $KOZEAI_API_KEY \
-H Content-Type: application/json \
-d {
Model: } `returns "video-ds-2.0
,
"messages: [{"role: "user, "content: "햇살 아래 달리는 고양이, 영화 같은 영상, 9:16}]
}
채팅 완료를 반환합니다.
형식은 `message.content`이며, 작업 상태와 `/v1/videos/{task_id}` 링크가 포함됩니다. 이 링크를 클릭하면 작업이 완료되면 영상이 재생됩니다. 채팅 로비 페이지에서 이 메서드를 사용합니다.
두 진입점(/v1/videos/generations 및 /v1/chat/completions)은 동일한 작업 시스템을 공유하므로 서로 충돌하지 않습니다. 직접 통합하려면 표준 `/v1/videos/*` 인터페이스를 사용하는 것이 좋습니다.
오류 코드
상태 코드
의미
401
토큰이 없거나 만료되었거나 유효하지 않습니다
403
잔액이 부족하거나 현재 그룹에 이 모델에 대한 권한이 없습니다
404
작업 ID가 존재하지 않거나 현재 사용자에게 속하지 않거나 모델이 구성되지 않았습니다.
409
비디오 콘텐츠를 준비하지 못했습니다(작업이 아직 진행 중입니다). 대기열/생성 중)
429
속도 제한 트리거
502
상위 공급자가 실패했거나 유효하지 않은 결과를 반환했습니다