GPT-6 Sol & Claude Opus 5.5 kini tersediaGPT-6 Sol: setengah harga 5.6 Sol

API Seedance 2.0: teks ke video dan gambar ke video dengan Python

Satu skrip membuat tugas, melakukan polling, dan menyimpan MP4. Berikut field, batasnya, dan dua klip 5 detik yang kami buat pada 30 Oktober 2026.

Kiki, OmniaKey COO11 menit baca
Di halaman ini

Seedance 2.0 berjalan di API media OmniaKey dengan ID model dreamina-seedance-2-0-260128. Anda POST tugas ke https://api.omniakey.com/v1/media/tasks, melakukan polling ID tugas, lalu mengunduh MP4-nya. Dua klip 720p 5 detik kami, satu dari teks dan satu dari gambar diam, selesai dalam 159 dan 139 detik pada 30 Oktober 2026.

Jawaban singkat

  • ID model dreamina-seedance-2-0-260128, dengan tiga operasi: text_to_video, image_to_video dan reference_to_video (dokumentasi video API OmniaKey, diperiksa 30 Oktober 2026).
  • Buat, polling, unduh: panggilan buat menjawab 202 dengan sebuah id, lalu Anda GET /v1/media/tasks/{id} setiap beberapa detik sampai statusnya succeeded (ringkasan API media OmniaKey, diperiksa 30 Oktober 2026).
  • Durasi berjalan dari 4 sampai 15 detik penuh, dan ID 2.0 lengkap merender 480P, 720P dan 1080P.
  • Seluruh body permintaan tetap di bawah 1 MiB, termasuk base64 inline.
  • Dua render 720p 5 detik kami selesai dalam 159 detik (teks ke video) dan 139 detik (frame pertama).

Apa yang perlu disiapkan sebelum panggilan pertama?

Kunci API OmniaKey, Python 3, dan ID model yang tepat. Skrip hanya mengimpor pustaka standar, jadi bisa dijalankan tanpa virtualenv dan tanpa memasang paket.

Ekspor kunci sebagai OMNIAKEY_API_KEY sebelum panggilan pertama. Skrip membacanya sekali dan mengirimkannya sebagai Bearer token di setiap permintaan, sehingga kunci tetap berada di luar file dan riwayat git Anda.

Buat dengan POST https://api.omniakey.com/v1/media/tasks dan polling dengan GET https://api.omniakey.com/v1/media/tasks/{id}. Keduanya ditambah POST /v1/media/tasks/{id}/cancel adalah seluruh API media (ringkasan API media, diperiksa 30 Oktober 2026).

Tulis ID model secara lengkap. OmniaKey tidak melayani alias pendek seedance-2 dan seedance-2-5, dan keduanya menjawab 503 no_available_channel (dokumentasi video API, diperiksa 30 Oktober 2026).

Tugas video ditagih di muka per detik output yang dihasilkan, dan biayanya kembali otomatis saat tugas berakhir failed atau canceled (ringkasan API media, diperiksa 30 Oktober 2026). Untuk tarif per detik saat ini, lihat halaman model Seedance 2.0.

Field apa saja yang dipakai permintaan Seedance 2.0?

Empat field tingkat atas membawa tugas, dan objek parameters membawa pengaturan output. Hanya duration yang tidak punya nilai bawaan yang masuk akal, jadi selalu kirimkan.

  • model: ID model lengkap (alias pendek gagal)
  • type: video (jenis media)
  • operation: text_to_video, image_to_video, reference_to_video (nama tanpa awalan)
  • input.prompt: satu string (adegan, aksi dan kamera, hingga 12,000 karakter)
  • input.media[]: {"type": "first_frame", "url": …} (frame pertama, atau reference_image)

Di dalam parameters:

  • duration: 4 sampai 15, detik penuh (menentukan harga)
  • resolution: 480P, 720P, 1080P (Fast dan Mini berhenti di 720P)
  • ratio: 16:9, 9:16, 1:1, 4:3, 3:4, 21:9, adaptive (adaptive mengikuti frame)
  • generate_audio: true secara bawaan, atau false (false menghasilkan MP4 tanpa suara)
  • n: 1 (harus 1)

Kedua daftar mengikuti dokumentasi video API dan ringkasan API media OmniaKey (diperiksa 30 Oktober 2026), dengan batas prompt dari halaman model.

Kirim nama operasi tanpa awalan; OmniaKey menambahkan awalan jenis media sendiri (dokumentasi video API, diperiksa 30 Oktober 2026). Parameter yang tidak dikenali diteruskan ke penyedia apa adanya (ringkasan API media, diperiksa 30 Oktober 2026).

Satu jebakan menanti mereka yang mulai dari dokumentasi vendor: API buat-tugas BytePlus menaruh field di dalam content[] dan di tingkat atas, jadi kode dari tutorial BytePlus tidak berjalan apa adanya terhadap /v1/media/tasks (API buat-tugas BytePlus, diperiksa 30 Oktober 2026).

Skrip Python

Satu file menjalankan kedua operasi, dan satu-satunya perbedaan adalah body yang disusunnya. Simpan sebagai seedance_video.py dan jalankan python3 seedance_video.py.

python
import base64
import json
import os
import time
import urllib.error
import urllib.request
import uuid

API = "https://api.omniakey.com/v1/media/tasks"
KEY = os.environ["OMNIAKEY_API_KEY"]
MODEL = "dreamina-seedance-2-0-260128"

def request(method, url, body=None, extra_headers=None):
    headers = {"Authorization": f"Bearer {KEY}", "User-Agent": "omniakey-example/1"}
    data = None
    if body is not None:
        headers["Content-Type"] = "application/json"
        data = json.dumps(body).encode()
    headers.update(extra_headers or {})
    req = urllib.request.Request(url, data=data, headers=headers, method=method)
    with urllib.request.urlopen(req, timeout=120) as resp:
        return json.load(resp)

def poll(url, attempts=5):
    for attempt in range(attempts):
        try:
            return request("GET", url)
        except urllib.error.HTTPError as err:
            if err.code < 500 or attempt == attempts - 1:
                raise
        except urllib.error.URLError:
            if attempt == attempts - 1:
                raise
        time.sleep(5 * (attempt + 1))

def run_task(body, out_path):
    task = request("POST", API, body, {"Idempotency-Key": str(uuid.uuid4())})["id"]
    print("task", task, flush=True)
    for _ in range(180):  # polling 5 detik, sampai 15 menit
        time.sleep(5)
        state = poll(f"{API}/{task}")
        if state["status"] not in ("queued", "processing"):
            break
    else:
        raise TimeoutError(f"{task} is still {state['status']}: poll it again later, do not resubmit")
    if state["status"] != "succeeded":
        raise RuntimeError(state.get("error") or state["status"])
    asset_url = state["assets"][0]["url"]  # tautan bertanda tangan: berumur pendek, unduh sekarang
    req = urllib.request.Request(asset_url, headers={"User-Agent": "omniakey-example/1"})
    with urllib.request.urlopen(req, timeout=300) as resp, open(out_path, "wb") as f:
        f.write(resp.read())
    return task

def text_to_video(prompt, out_path, duration=5, resolution="720P", ratio="16:9"):
    body = {
        "model": MODEL,
        "type": "video",
        "operation": "text_to_video",
        "input": {"prompt": prompt},
        "parameters": {"duration": duration, "resolution": resolution, "ratio": ratio},
    }
    return run_task(body, out_path)

def image_to_video(prompt, image_path, out_path, duration=5, resolution="720P", audio=False):
    with open(image_path, "rb") as f:
        raw = f.read()
    if len(raw) > 700_000:  # base64 menambah sepertiga, dan seluruh body harus di bawah 1 MiB
        raise ValueError("first frame too large: save it as a JPEG about 1024 px wide")
    frame = "data:image/jpeg;base64," + base64.b64encode(raw).decode()
    body = {
        "model": MODEL,
        "type": "video",
        "operation": "image_to_video",
        "input": {"prompt": prompt, "media": [{"type": "first_frame", "url": frame}]},
        "parameters": {"duration": duration, "resolution": resolution, "ratio": "adaptive",
                       "generate_audio": audio},
    }
    return run_task(body, out_path)

if __name__ == "__main__":
    print("done", text_to_video(
        "Close-up of a tall glass on a wooden bar counter. Sparkling water is poured over ice; bubbles "
        "rise and the ice cubes clink and shift. Warm evening light from the left. The camera slowly "
        "pushes in. Sound of pouring, fizzing and clinking ice. No people, no text.",
        "sparkling-glass.mp4",
    ))
    print("done", image_to_video(
        "The cat slowly wakes, stretches its front paws and yawns, then looks toward the window. "
        "Raindrops keep running down the glass. The camera stays still.",
        "cat.jpg",
        "cat-wakes.mp4",
    ))

Ada enam bagian file ini yang perlu Anda pahami sebelum mengubah apa pun.

  • Setiap permintaan buat membawa Idempotency-Key acak; memutar ulang kunci itu dengan body yang sama mengembalikan tugas asli dengan HTTP 200 dan tidak menagih dua kali (ringkasan API media, diperiksa 30 Oktober 2026).
  • Loop tidur 5 detik di antara polling dan berhenti setelah 180 percobaan, yaitu 15 menit.
  • Timeout berarti tugas masih dirender. Polling ID tugas yang sama lagi nanti dan jangan pernah mengirim ulang, atau Anda membayar klip kedua.
  • assets[0].url adalah tautan bertanda tangan yang berlaku sekitar satu jam, jadi skrip mengunduh begitu tugas berhasil (ringkasan API media, diperiksa 30 Oktober 2026).
  • progress.percent bisa tertahan di 0 selama tugas berjalan, jadi loop hanya mengikuti status dan tidak yang lain (dokumentasi video API, diperiksa 30 Oktober 2026).
  • Fungsi gambar menolak file di atas 700,000 byte, karena base64 menambah sepertiga dan body harus tetap di bawah 1 MiB.

Bentuk permintaan sama dengan Kling 3.0 di API yang sama, jadi berganti model hanya mengubah ID model dan parameternya, bukan kode di sekitarnya.

Bagaimana cara mengirim frame pertama untuk gambar ke video?

Letakkan gambar di input.media[] dengan "type": "first_frame", inline sebagai URI data:image/jpeg;base64,..., bentuk yang dipakai klip kucing kami.

input.media[] menerima URL HTTPS publik atau data URI inline, dan seluruh body dibatasi 1 MiB (dokumentasi video API, diperiksa 30 Oktober 2026). Uji OmniaKey sendiri melihat tautan frame HTTPS biasa ditolak dengan provider_submit_rejected, karena itu contoh ini mengirim data URI (dokumentasi video API, diperiksa 30 Oktober 2026).

Base64 menambah sepertiga, jadi mulai dari JPEG selebar sekitar 1024 piksel: frame pertama kami 134,356 byte, dan PNG 4 MB akan ditolak.

Pertahankan parameters.ratio di adaptive di sini: nilainya mengikuti bentuk gambar yang Anda kirim, dan begitulah gambar diam 1024×571 menjadi klip 1280×720. Untuk reference_to_video, array yang sama menerima "type": "reference_image" (dokumentasi video API, diperiksa 30 Oktober 2026).

Dua klip yang kami buat

Kedua tugas dikirim pada 30 Oktober 2026 dengan file di atas, tanpa perubahan. Yang pertama teks ke video, tugas task_uF2QUtbeAAUW11lXEaLxNw1ZnBUoqvNk, dibuat pukul 01:39:43 UTC dan berhasil pukul 01:42:22 UTC. Prompt meminta suara tuangan, jadi audio tetap menyala.

prompt
Close-up of a tall glass on a wooden bar counter. Sparkling water is poured over ice; bubbles rise and the ice cubes clink and shift. Warm evening light from the left. The camera slowly pushes in. Sound of pouring, fizzing and clinking ice. No people, no text.
Delapan frame gelas tinggi berisi air soda di atas bar kayu, dari tuangan pertama sampai gelas penuh dengan gelembung di dekat dasar.
Delapan frame dari klip gelas dalam urutan waktu, 0.0 sampai 5.0 detik. Seedance 2.0 melalui API OmniaKey, teks ke video, 5 detik, 720P, dibuat 30 Oktober 2026.

Frame-frame itu memperlihatkan gelas berisi es di atas bar kayu, dengan botol dan cahaya hangat yang kabur di belakangnya. Gelas membesar dari frame pertama ke frame terakhir, dorongan kamera yang diminta prompt, dan berakhir penuh dengan gelembung di dekat dasar.

Yang kedua gambar ke video, tugas task_u85W0jn1sQLkrszJlxqXF1hxJYhsndxK, dibuat pukul 01:42:33 UTC dan berhasil pukul 01:44:52 UTC. Frame pertamanya adalah gambar diam kucing oranye yang tidur di atas tumpukan buku tua di dekat jendela berhujan (1024×571 piksel), dikirim sebagai data URI dengan "type": "first_frame".

prompt
The cat slowly wakes, stretches its front paws and yawns, then looks toward the window. Raindrops keep running down the glass. The camera stays still.
Delapan frame kucing oranye yang tidur di atas tumpukan buku di dekat jendela berhujan, bangun, meregangkan kaki, dan menguap.
Delapan frame dari klip kucing dalam urutan waktu, 0.0 sampai 5.0 detik. Seedance 2.0 melalui API OmniaKey, gambar ke video, 5 detik, 720P, dibuat 30 Oktober 2026.

Kucing mengangkat kepala, membuka mata, meregangkan kedua kaki depannya melewati tepi buku, menguap lebar, dan menoleh ke jendela, sesuai urutan yang diberikan prompt. Hujan terus mengalir di kaca dan pembingkaian tetap diam seperti diminta.

Di kiri, gambar kucing oranye yang dikirim sebagai frame pertama; di kanan, frame terakhir klip itu dengan kaki terentang di atas buku dan kepala menoleh ke jendela.
Kiri: gambar diam yang dikirim sebagai frame pertama. Kanan: frame terakhir klip kucing. Seedance 2.0 melalui API OmniaKey, gambar ke video, 5 detik, 720P, dibuat 30 Oktober 2026.

Dua percobaan ini mencakup teks ke video dan frame pertama pada 720P selama 5 detik. Kami tidak menguji 1080P, Fast, Mini, 2.5, reference_to_video, tautan frame HTTPS, atau durasi lain.

Apa yang terukur dari file

Kedua unduhan adalah MP4 H.264 1280×720 dan 24 fps: 121 frame, 5.04 detik.

KlipGelasKucing
Operasiteks ke videogambar ke video
Waktu selesai159 s139 s
Ukuran file2,070,248 bytes1,352,027 bytes
Video1280×720, 24 fps, 121 frame1280×720, 24 fps, 121 frame
Audiotrek AACtidak ada

Trek klip gelas membawa suara tuangan, desis, dan denting es, tanpa suara manusia dan tanpa musik. Klip kucing tidak punya trek sama sekali, karena permintaannya mengirim generate_audio: false.

Kedua catatan tugas melaporkan usage.completion_tokens: 108900, yaitu 121 × 1280 × 720 ÷ 1024, rumus token yang dipakai BytePlus untuk memperkirakan tagihan video (halaman harga BytePlus, diperiksa 30 Oktober 2026).

Dokumentasi OmniaKey menyebut klip 720p 6 detik biasanya selesai dalam sekitar satu menit (dokumentasi video API, diperiksa 30 Oktober 2026). Milik kami butuh 159 dan 139 detik, dan tiga klip 720p 5 detik dalam perbandingan kami pada 26 Oktober butuh 144.8, 319.0 dan 184.7 detik. Rencanakan 2 sampai 5 menit dan lakukan polling alih-alih menahan permintaan tetap terbuka.

Error dan batas apa yang akan Anda temui?

Periksa tiga pengaturan lebih dulu: ID model, durasi 4 sampai 15, dan audio yang bisa ditolak filter penyedia.

Status / KodeYang perlu diubah
400 invalid_requestbody atau input.prompt
400 model_price_errordurasi ke 4–15 s
403 model_not_allowedakses model kunci
409 idempotency_key_reusedkunci baru per body
503 no_available_channelID lengkap, operasi tanpa awalan
tugas gagal, error penyediabaca error, lalu coba lagi

Kode-kode itu berasal dari ringkasan API media dan dokumentasi video API (diperiksa 30 Oktober 2026). Tugas yang berakhir failed mengembalikan tagihan di muka, jadi render yang ditolak hanya memakan waktu Anda.

Perhatikan pengaturan audio. Seedance merender trek secara bawaan, dan membiarkannya menyala membuat penyedia menolak permintaan 480P 4 detik dengan OutputAudioSensitiveContentDetected.PolicyViolation, jadi kirim parameters.generate_audio: false kecuali adegan membutuhkan suara (dokumentasi video API, diperiksa 30 Oktober 2026).

BytePlus menyebut seri 2.0 tidak menerima gambar atau video referensi yang memuat wajah manusia asli (halaman Seedance 2.0 BytePlus, diperiksa 30 Oktober 2026). Seedance 2.0 juga tidak punya seed dan camera_fixed, padahal keduanya field di API buat-tugas vendor (API buat-tugas BytePlus, diperiksa 30 Oktober 2026).

Lima belas detik adalah plafon keluarga ini, dan duration: -1 tidak memberi lebih; rekaman 20 atau 30 detik termasuk ke Seedance 2.5 (halaman model Seedance 2.0, diperiksa 30 Oktober 2026).

OmniaKey tidak menerbitkan batas laju tetap; perlakukan HTTP 429 sebagai bisa dicoba ulang dengan backoff eksponensial (halaman error API OmniaKey, diperiksa 30 Oktober 2026).

Seedance 2.0, Fast, Mini, atau 2.5?

Empat tingkatan menerima body permintaan yang sama, jadi berpindah hanya butuh satu ID model dan, pada Fast serta Mini, plafon resolusi yang lebih rendah.

  • Seedance 2.0, dreamina-seedance-2-0-260128: 480P, 720P dan 1080P, 4 sampai 15 detik. Harga daftar BytePlus untuk klip 5 detik adalah $0.76 pada 720p dan $0.35 pada 480p (halaman harga BytePlus, diperiksa 30 Oktober 2026).
  • Seedance 2.0 Fast, dreamina-seedance-2-0-fast-260128: 480P dan 720P, 4 sampai 15 detik. Harga daftar BytePlus untuk klip 5 detik adalah $0.60 pada 720p dan $0.28 pada 480p.
  • Seedance 2.0 Mini, dreamina-seedance-2-0-mini-260615: 480P dan 720P, 4 sampai 15 detik. Harga daftar BytePlus untuk klip 5 detik adalah $0.38 pada 720p dan $0.18 pada 480p.
  • Seedance 2.5, dreamina-seedance-2-5-260628: satu-satunya ID di keluarga ini yang menerima rekaman 20 atau 30 detik, dan yang paling lambat: sekitar empat menit untuk klip 480P 4 detik (dokumentasi video API, diperiksa 30 Oktober 2026). Sisi gambarnya dibahas di ulasan Seedance 2.5 kami.

Halaman model OmniaKey melaporkan klip 480P 4 detik sekitar satu menit di 2.0, dua menit di Fast, dan 100 detik di Mini (diperiksa 30 Oktober 2026).

Ambil ID 2.0 lengkap saat Anda butuh master 1080P, karena Fast dan Mini berhenti di 720P (dokumentasi video API, diperiksa 30 Oktober 2026). OmniaKey menetapkan tarifnya sendiri untuk ID ini, jadi lihat tarif terkini di halaman model Seedance 2.0.

FAQ

Apakah ada API Seedance 2.0 resmi?

Ada. BytePlus ModelArk menjualnya, dan mengaktifkannya di sana membutuhkan saldo akun di atas USD 30, Savings Plan, atau paket sumber daya Seedance (halaman Seedance 2.0 BytePlus, diperiksa 30 Oktober 2026). Skrip di atas memanggil ID model yang sama melalui API media OmniaKey.

Bisakah saya mengirim URL gambar alih-alih base64?

Dokumentasi OmniaKey mencantumkan URL HTTPS publik di samping data URI inline (dokumentasi video API, diperiksa 30 Oktober 2026). Percobaan kami memakai inline karena tautan frame HTTPS kembali sebagai provider_submit_rejected dalam uji OmniaKey sendiri, jadi coba URL pada klip uji lebih dulu.

Bagaimana cara mematikan suara?

Kirim parameters.generate_audio: false, dan MP4 datang tanpa trek audio sama sekali, seperti klip kucing. Audio menyala secara bawaan di model ini.

Mengapa permintaan saya timeout?

Klipnya biasanya masih dirender, karena tugas 720p 5 detik butuh 139 sampai 319 detik dalam percobaan kami. Polling ID tugas yang sama lagi, jangan pernah mengirim ulang, dan naikkan batas loop 15 menit untuk klip 15 detik.

Berapa lama tautan video berlaku?

Tautan bertanda tangan di assets[0].url berlaku sekitar satu jam, dan catatan tugas disimpan 24 jam setelah dibuat (ringkasan API media, diperiksa 30 Oktober 2026). Unduh pada keberhasilan pertama, atau polling tugas lagi untuk tautan baru.

Sumber yang diperiksa

Dokumentasi OmniaKey sendiri, diperiksa 30 Oktober 2026: video API, ringkasan API media dan error API.

Model di artikel ini

Seedance 2.0video AIAPI videogambar ke videoPython

Artikel terkait

Artikel terbaru