Tạo video bằng API tác vụ ONE
Gửi tác vụ video theo cấu trúc OpenAI, giữ mã tác vụ công khai, thăm dò đúng đường dẫn trạng thái ONE đến trạng thái kết thúc và chỉ tải nội dung sau khi hoàn thành.
Xác nhận giao thức trước khi chi phí phát sinh
- Chọn mô hình hiện tại trong danh mục công bố rõ điểm cuối video OpenAI.
- Xem giá hiện tại và các trường đầu vào được mô hình hỗ trợ; công việc video có thể bất đồng bộ và bị tính phí.
- Dùng câu lệnh ngắn, ít rủi ro cho lần thử đầu tiên được chấp nhận.
POST https://www.getapi.one/v1/videos
GET https://www.getapi.one/v1/videos/{task_id}
GET https://www.getapi.one/v1/videos/{task_id}/contentGửi, thăm dò và tải
- Gửi POST https://www.getapi.one/v1/videos và lưu chính xác mã tác vụ trả về.
- Thăm dò GET https://www.getapi.one/v1/videos/{task_id} theo khoảng thời gian cố định với số lần kiểm tra có giới hạn; không tạo tác vụ mới trong khi chờ.
- Tiếp tục khi queued hoặc in_progress; chỉ kết thúc thành công khi completed.
- Dừng và hiển thị lỗi khi failed. Xem trạng thái không rõ là chưa thành công và giữ phản hồi để chẩn đoán.
- Sau completed, tải GET https://www.getapi.one/v1/videos/{task_id}/content.
- Truyền nội dung theo khối kích thước cố định dưới giới hạn tích lũy. Ví dụ dùng trần cục bộ 512 MiB và xóa tệp dở dang khi xảy ra lỗi đọc, xác minh, ghi hoặc hủy.
curl --fail-with-body https://www.getapi.one/v1/videos \
-H "Authorization: Bearer $GETAPI_ONE_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "<OPENAI_VIDEO_MODEL_ID_FROM_CURRENT_CATALOG>",
"prompt": "A five-second locked-camera product turntable on a neutral background"
}' > video-submit.jsonimport json
import os
import time
from pathlib import Path
from urllib.parse import quote
from urllib.request import Request, urlopen
base_url = "https://www.getapi.one"
api_key = os.environ["GETAPI_ONE_API_KEY"]
submitted = json.loads(Path("video-submit.json").read_text(encoding="utf-8"))
task_id = submitted.get("id") or submitted.get("task_id")
if not task_id:
raise ValueError("Submit response did not contain id or task_id")
safe_id = quote(task_id, safe="")
headers = {"Authorization": f"Bearer {api_key}"}
for attempt in range(30):
request = Request(f"{base_url}/v1/videos/{safe_id}", headers=headers)
with urlopen(request, timeout=30) as response:
task = json.load(response)
status = task.get("status")
if status == "completed":
break
if status == "failed":
raise RuntimeError(f"video task failed: {task.get('error')}")
if status not in {"queued", "in_progress"}:
raise RuntimeError(f"unknown non-success status: {status}")
if attempt == 29:
raise TimeoutError("video was not complete after 30 status checks")
time.sleep(10)
content_request = Request(
f"{base_url}/v1/videos/{safe_id}/content",
headers=headers,
)
MAX_VIDEO_BYTES = 512 * 1024 * 1024
CHUNK_BYTES = 1024 * 1024
output_path = Path("result.mp4")
created_output = False
with urlopen(content_request, timeout=60) as response:
content_type = response.headers.get_content_type()
if not content_type.startswith("video/"):
raise ValueError(f"unexpected content type: {content_type}")
try:
output = output_path.open("xb")
created_output = True
with output:
total_bytes = 0
while chunk := response.read(CHUNK_BYTES):
total_bytes += len(chunk)
if total_bytes > MAX_VIDEO_BYTES:
raise ValueError("video exceeds the local 512 MiB limit")
output.write(chunk)
except BaseException:
if created_output:
output_path.unlink(missing_ok=True)
raiseTriển khai máy trạng thái
| Trạng thái | Hành động của ứng dụng khách |
|---|---|
| queued | Chờ khoảng thời gian cố định rồi truy vấn cùng mã tác vụ trong số lần kiểm tra có giới hạn. |
| in_progress | Hiển thị tiến độ nếu có và tiếp tục thăm dò. |
| completed | Dừng thăm dò và gọi đường dẫn nội dung. |
| failed | Dừng thăm dò, ghi chi tiết lỗi an toàn và chỉ thử lại khi có quyết định chủ động. |
Xác minh kết quả mong đợi
- Phản hồi gửi tác vụ cung cấp mã tác vụ và ứng dụng khách lưu mã đủ bền vững cho quy trình.
- Mọi yêu cầu trạng thái dùng cùng mã đó và không tạo công việc trùng lặp.
- Nội dung tải xuống có kiểu nội dung video và chỉ được mở sau completed.
Khôi phục mà không tạo trùng tác vụ
- Khi gửi bị hết thời gian chờ, đừng gửi lại tùy tiện: kiểm tra xem mã tác vụ hoặc bản ghi bảng điều khiển đã được tạo hay chưa.
- Khi nhận 404 trong lúc thăm dò, xác minh mã tác vụ công khai, đúng đường dẫn số ít/số nhiều và cùng khóa tài khoản.
- Khi nhận failed, giữ mô hình, tóm tắt yêu cầu an toàn, mã tác vụ và chi tiết lỗi trước khi thay đầu vào.
Bảo vệ tác vụ và kết quả đa phương tiện
- Giữ khóa và việc tra cứu tác vụ trên backend có xác thực của bạn.
- Kiểm tra câu lệnh, tệp tải lên, thời lượng, kích thước và số lượng theo đặc tả mô hình đã chọn trước khi chuyển tiếp.
- Lưu kết quả đã phê duyệt trong bộ lưu trữ có kiểm soát; không giả định URL nội dung tồn tại vĩnh viễn hoặc an toàn để công khai.
- Đặt giới hạn tải xuống tích lũy thấp hơn ngân sách bộ nhớ và lưu trữ, truyền dữ liệu theo khối kích thước cố định và dọn sản phẩm dở dang khi tải không hoàn tất.