Veo 3 và Sora đưa text-to-video lên cùng chuẩn chất lượng mà text-to-image đạt được cách đây mười tám tháng. Điểm khó là các nhà cung cấp kiểm soát quyền truy cập bằng danh sách chờ, hạn chế khu vực và quy trình thanh toán riêng, không tương thích tốt với phần còn lại của stack AI.
Trên Kunavo, mô hình text-to-video đang hoạt động hiện nay là Google Veo 3, được cung cấp qua một endpoint tương thích OpenAI — không cần danh sách chờ, xác thực tương thích OpenAI, tính phí theo video và kết quả được cung cấp từ URL vĩnh viễn. Sora (sora-2) nằm trong lộ trình: vì endpoint không phụ thuộc mô hình, sau này chuyển sang nó chỉ cần thay đổi một từ ở model. Hướng dẫn này giúp bạn chạy cuộc gọi Veo 3 đầu tiên trong khoảng năm phút. Xem hướng dẫn Sora API để biết toàn cảnh.
Thiết lập
- Đăng ký tại kunavo.com/app/signup. Nạp từ $10 theo mức dùng — đủ để chạy mỗi ví dụ trong hướng dẫn này vài lần, và số dư không hết hạn.
- Tạo key tại /app/keys. Key bắt đầu bằng
sk-kn-. - Export key:
export KUNAVO_API_KEY=sk-kn-....
Text-to-video với Veo 3
Veo 3 hiện là mô hình text-to-video tốt nhất trên thị trường cho các cảnh điện ảnh — hiểu ngôn ngữ máy quay (dolly, push-in, rack focus), tạo ánh sáng ổn định giữa các cảnh cắt và xử lý chuyển động 24fps chính xác. Quá trình tạo mất từ 30 giây đến vài phút; phản hồi HTTP là đồng bộ — hãy đặt timeout client dài.
import requests, os, time
KEY = os.environ["KUNAVO_API_KEY"]
resp = requests.post(
"https://api.kunavo.com/v1/video/generations",
headers={"Authorization": f"Bearer {KEY}"},
json={
"model": "veo-3",
"prompt": "A drone shot pulling back from a quiet mountain lake at dawn, mist rising off the water. Cinematic, 24fps, soft golden light.",
"aspect_ratio": "16:9",
"resolution": "1080p",
},
timeout=600, # generations take 30s to several minutes
)
resp.raise_for_status()
data = resp.json()
print(data["data"][0]["url"])duration (giây) đặt độ dài clip trên các mô hình tính phí theo giây: các mô hình Seedance và mô hình Wan 2.7. Các mô hình Veo bỏ qua tham số này; mỗi clip Veo dài 8 giây và được tính phí theo video.
Phản hồi theo kiểu OpenAI: { data: [{ url: '...' }] }. URL là vĩnh viễn, được cung cấp từ files.kunavo.com — nếu cần lưu trữ lâu dài, hãy tải xuống một lần vào hệ thống lưu trữ của riêng bạn.
Chuyển hình ảnh thành video
Neo bằng hình ảnh thường là cách tạo ra kết quả đạt chất lượng production. Veo 3 hỗ trợ hai chế độ hình ảnh:
image_mode: "frame"— một hình ảnh là khung hình đầu tiên; hai hình ảnh là khung đầu + khung cuối. Mặc định choimage_url.image_mode: "reference"— tối đa 3 hình ảnh tham chiếu phong cách để giữ nhất quán nhân vật / trang phục mà không ép buộc khung hình.
# image-to-video: pass an image_url to anchor the first frame.
resp = requests.post(
"https://api.kunavo.com/v1/video/generations",
headers={"Authorization": f"Bearer {KEY}"},
json={
"model": "veo-3",
"prompt": "She smiles, then walks out of frame to the left",
"image_url": "https://example.com/anchor.jpg",
"image_mode": "frame", # one image => first frame
"aspect_ratio": "9:16", # vertical, mobile-native
},
timeout=600,
)
print(resp.json()["data"][0]["url"])Nếu chưa có URL công khai cho hình ảnh neo, hãy gửi bytes đến /v1/files và Kunavo sẽ lưu trữ tệp cho bạn tại một URL công khai vĩnh viễn:
# If you don't have a public URL, upload bytes; Kunavo hosts the file.
with open("anchor.jpg", "rb") as f:
up = requests.post(
"https://api.kunavo.com/v1/files",
headers={"Authorization": f"Bearer {KEY}"},
files={"file": f},
)
image_url = up.json()["url"] # a permanent public URLSora và các mô hình khác
Cùng một dạng endpoint hoạt động với mọi mô hình video trong danh mục — truyền slug mô hình tương ứng:
veo-3— điện ảnh, 1080p, hỗ trợ image-to-video. Đang hoạt động.seedance-2,seedance-2-5— ByteDance, rất mạnh về chuyển động nhân vật.
OpenAI Sora (sora-2) nằm trong lộ trình — hiện chưa thể gọi trên Kunavo. Vì /v1/video/generations không phụ thuộc mô hình, vào ngày mô hình này ra mắt, thay đổi duy nhất đối với các cuộc gọi ở trên là trường model; cho đến lúc đó, Veo 3 là lựa chọn tương đương đang hoạt động trên cùng endpoint.
Xem /models để biết danh sách đang hoạt động và giá của từng mô hình.
Từ Node / TypeScript
// OpenAI's SDK sends videos.create as a multipart form, which /v1/videos
// refuses (it takes JSON), so call it with fetch. A clip takes minutes and
// Node's fetch stops waiting for a response after 300 s: submit a task, then
// poll it.
const API = "https://api.kunavo.com/v1";
const headers = {
"Content-Type": "application/json",
Authorization: `Bearer ${process.env.KUNAVO_API_KEY}`,
};
let task = await fetch(`${API}/videos`, {
method: "POST",
headers,
body: JSON.stringify({
model: "veo-3",
prompt: "A red origami crane unfolding into a paper plane and flying away through a window",
resolution: "1080p",
}),
}).then((r) => r.json());
while (task.status === "queued" || task.status === "in_progress") {
await new Promise((r) => setTimeout(r, 10_000));
task = await fetch(`${API}/videos/${task.id}`, { headers }).then((r) => r.json());
}
if (task.status !== "completed") throw new Error(JSON.stringify(task.error ?? task));
console.log(task.output.url);Mô hình giá
Mô hình video tính phí theo video hoặc theo giây đầu ra, không theo token: các mô hình Veo theo video, với mỗi clip đều dài 8 giây, còn các mô hình Seedance và Wan 2.7 theo giây. Kunavo công bố mức phí của từng mô hình tại /pricing. Một clip Veo 3 1080p dài 8 giây tốn $0,42. Video tạo thất bại (4xx / 5xx) không bao giờ bị tính phí.
Checklist production
- Đặt thời gian chờ HTTP là 10 phút. Cổng trung gian thăm dò dịch vụ thượng nguồn trong tối đa 540 giây và trả về 504 nếu mô hình vẫn đang xử lý sau thời gian đó. Mỗi lần thử lại là một tác vụ mới, và mọi tác vụ thành công đều bị tính phí. Với các tác vụ kéo dài rất lâu, hãy chuyển sang gửi yêu cầu tới
/v1/videosvà thăm dò tác vụ mà nó trả về: khi có tiêu đềIdempotency-Key, lần gửi thứ hai với cùng một khóa sẽ trả về tác vụ đó thay vì bắt đầu một tác vụ khác. - Hàm
fetchtích hợp sẵn của Node ngừng chờ header phản hồi sau 300 giây, bất kể bạn đặt thời gian chờ là bao nhiêu: khi gọi từ Node, hãy dùng API bất đồng bộ, hoặc gọi hàmfetchtừ góiundicivới tùy chọndispatcher: new Agent({ headersTimeout: 600_000 }). - Lưu URL kết quả. Dù URL files.kunavo.com là vĩnh viễn, sản phẩm của bạn nên giữ một bản sao riêng trong hệ thống lưu trữ do bạn kiểm soát.
- Xử lý 429 bằng backoff. Mô hình video phụ thuộc GPU; tranh chấp ngắn hạn là bình thường. Header retry-after được tôn trọng khi có.
- Cache theo hash của prompt nếu phù hợp. Gửi cùng một prompt hai lần sẽ tạo ra hai clip và bị tính phí hai lần: gateway không dùng lại kết quả trước đó và không gửi seed cho mô hình.
Câu hỏi: contact@kunavo.com. Đội ngũ đứng sau gateway đọc mọi email và trả lời trong vòng 24 giờ.