Seedance 2.0
Generuj wideo w Seedance 2.0 przez oficjalne API zadań ModelArk: tekst na wideo, pierwsza i ostatnia klatka oraz referencje obrazów, wideo i audio, od 480p do 4K.
Seedance 2.0 to model generowania wideo od ByteDance (Dreamina Seedance 2.0). Wyślij oficjalną treść żądania zadania ModelArk, zachowaj zwrócony identyfikator zadania i odczytaj gotowe wideo z tego zadania. Obrazy, wideo i audio umieszczasz w content jako adresy URL.
ID modeli
| ID modelu | Rozdzielczości | Uwagi |
|---|---|---|
dreamina-seedance-2-0 | 480p, 720p, 1080p, 4K | Pełny model |
dreamina-seedance-2-0-fast | 480p, 720p | Niższa cena za sekundę |
dreamina-seedance-2-0-mini | 480p, 720p | Najniższa cena za sekundę |
Wszystkie trzy ID przyjmują te same parametry. Aktualne ceny znajdziesz na stronie modelu.
Krótki przykład
curl https://api.seedrouter.ai/v1/contents/generations/tasks \
-H "Authorization: Bearer $SEEDROUTER_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "dreamina-seedance-2-0",
"content": [{"type": "text", "text": "A red paper boat drifts across a calm pond at sunrise, slow dolly-in"}],
"resolution": "720p",
"ratio": "16:9",
"duration": 5,
"generate_audio": true
}'Punkt końcowy
POST https://api.seedrouter.ai/v1/contents/generations/tasks| Nagłówek | Wartość |
|---|---|
| Authorization | Bearer YOUR_API_KEY |
| Content-Type | application/json |
Treść to oficjalne żądanie ModelArk „utwórz zadanie generowania wideo”. Jeśli już wywołujesz ModelArk, zmień tylko bazowy adres URL na https://api.seedrouter.ai/v1 oraz klucz API. Odpowiedź to {"id": "task_..."}, a nie gotowe wideo. Klucze API trzymaj w kodzie po stronie serwera.
Parametry
| Nazwa | Typ | Wymagany | Domyślnie | Uwagi |
|---|---|---|---|---|
model | string | Tak | — | Jeden z trzech powyższych ID modeli. |
content | object[] | Tak | — | Prompt i multimedia; szczegóły poniżej. |
resolution | enum | Nie | 720p | 480p, 720p, 1080p, 4k; ID Fast i Mini przyjmują tylko 480p i 720p. |
ratio | enum | Nie | adaptive | 16:9, 4:3, 1:1, 3:4, 9:16, 21:9, adaptive. |
duration | integer | Nie | 5 | 4–15 sekund lub -1, aby wybór pozostawić modelowi. |
generate_audio | boolean | Nie | true | Generuje dźwięk razem z wideo. |
watermark | boolean | Nie | false | Dodaje znak wodny. |
return_last_frame | boolean | Nie | false | Zwraca też ostatnią klatkę jako adres URL obrazu. |
execution_expires_after | integer | Nie | 172800 | 3600–259200 sekund. Zadanie, które po tym czasie nadal nie jest zakończone, przechodzi w stan expired i nie jest naliczane. |
priority | integer | Nie | 0 | 0–9. |
safety_identifier | string | Nie | — | 1–64 znaki identyfikujące Twojego użytkownika końcowego. Może to być hash. |
service_tier | enum | Nie | default | Tylko default. |
content_filter | boolean | Nie | true | Rozszerzenie SeedRouter. false wyłącza filtrowanie treści dla tego żądania. |
Elementy content
| Element | Postać | Rola | Limit |
|---|---|---|---|
| Tekst | {"type": "text", "text": "..."} | — | Jeden. |
| Obraz | {"type": "image_url", "image_url": {"url": "https://..."}, "role": "..."} | first_frame, last_frame, reference_image | Do 9 obrazów referencyjnych. |
| Wideo | {"type": "video_url", "video_url": {"url": "https://..."}, "role": "reference_video"} | reference_video | Do 3. |
| Audio | {"type": "audio_url", "audio_url": {"url": "https://..."}, "role": "reference_audio"} | reference_audio | Do 3. Wymaga obrazu lub wideo referencyjnego. |
Nieznane pola są odrzucane. Nieobsługiwane: seed, callback_url (zamiast tego odpytuj zadanie), draft i draft_task, tools, dostępne tylko w 1.x frames i camera_fixed, a także output_format i omni_reference_task_type (tylko Seedance 2.5). Zadań nie można anulować ani usunąć.
Tryby
Tryb wynika z elementów content; nie ma parametru trybu.
| Tryb | content |
|---|---|
| Tekst na wideo | jeden element tekstowy |
| Pierwsza klatka | tekst (opcjonalnie) + jeden obraz z rolą first_frame albo jeden obraz bez roli |
| Pierwsza i ostatnia klatka | tekst (opcjonalnie) + jeden obraz first_frame + jeden obraz last_frame |
| Referencja multimodalna | tekst + dowolne połączenie elementów reference_image, reference_video i reference_audio |
Trybów z pierwszą klatką nie można łączyć z elementami referencyjnymi. Przy kilku obrazach lub jakichkolwiek innych multimediach każdy obraz wymaga role.
Przykład z referencjami
curl https://api.seedrouter.ai/v1/contents/generations/tasks \
-H "Authorization: Bearer $SEEDROUTER_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "dreamina-seedance-2-0",
"content": [
{"type": "text", "text": "The character from the image walks through the market in the video, same camera move"},
{"type": "image_url", "image_url": {"url": "https://example.com/character.png"}, "role": "reference_image"},
{"type": "video_url", "video_url": {"url": "https://example.com/market.mp4"}, "role": "reference_video"}
],
"ratio": "adaptive",
"duration": 8
}'Zastąp przykładowe adresy URL własnymi, dostępnymi plikami.
Dane wejściowe multimediów
To API przyjmuje wyłącznie odwołania przez adres URL. Base64, adresy data:, identyfikatory asset:// oraz przesyłanie multipart nie są przyjmowane. Playground najpierw wysyła wybrane pliki do magazynu, a dopiero potem przesyła ich adresy URL.
Multimedia muszą być publicznymi adresami HTTP(S) i spełniać oficjalne limity modelu:
| Multimedia | Formaty | Limity |
|---|---|---|
| Obraz | JPEG, PNG, WebP, BMP, TIFF, GIF, HEIC, HEIF | Mniej niż 30 MB; szerokość i wysokość 300–6000 px; proporcje (szerokość / wysokość) 0,4–2,5; 1–9 obrazów referencyjnych |
| Wideo | MP4, MOV (H.264 lub H.265) | 2–15 sekund każde, maksymalnie 3, łącznie najwyżej 15 sekund; najwyżej 200 MB; 24–60 FPS; szerokość i wysokość 300–6000 px; proporcje 0,4–2,5; 407 696–8 295 044 pikseli (szerokość × wysokość) |
| Audio | WAV, MP3 | 2–15 sekund każde, maksymalnie 3, łącznie najwyżej 15 sekund; wymaga obrazu lub wideo referencyjnego; najwyżej 15 MB |
Model nie obsługuje obrazów ani wideo referencyjnych, które zawierają prawdziwe ludzkie twarze.
Multimedia są sprawdzane w chwili uruchomienia zadania, przed jakimkolwiek generowaniem. Zadanie, którego multimedia naruszają któryś z tych limitów, kończy się stanem failed z invalid_request_error i komunikatem wskazującym regułę, na przykład The request was rejected: content reference videos must total at most 15 seconds., i nie jest naliczane. Plik, którego nie da się w tym momencie odczytać, zostaje przekazany modelowi, który go przyjmuje lub odrzuca; nieudane zadanie w żadnym z tych przypadków nie jest naliczane.
Czynniki wpływające na koszt
Aktualne stawki znajdziesz w sekcji cen modelu. Seedance 2.0 nalicza opłaty za tokeny wideo, czyli oficjalną jednostkę:
video tokens = (output seconds + reference video seconds) × width × height × 24 / 1024Stawka za milion tokenów zależy od rozdzielczości wyjściowej oraz od tego, czy żądanie zawiera wideo referencyjne; żądanie z wideo referencyjnym korzysta z niższej stawki dla wszystkich swoich tokenów. Tekst, obrazy i audio na wejściu nie są naliczane. Przy 16:9 jedna sekunda to 10 044 tokenów w 480p (864×496), 21 600 w 720p, 48 600 w 1080p i 194 400 w 4K.
Opłata wynika z liczby tokenów raportowanej przez gotowe wideo (usage.completion_tokens), dlatego przy duration: -1 naliczana jest faktycznie wygenerowana długość. Wyrenderowane klipy są nieco dłuższe od żądanej długości: 5-sekundowe żądanie 720p 16:9 renderuje 121 klatek i raportuje 108 900 tokenów zamiast 108 000. Ostateczne opłaty zobaczysz w historii zużycia swojego konta. Nieudane i wygasłe zadania nie są naliczane.
Schemat odpowiedzi
Wysłanie zwraca identyfikator zadania:
{"id": "task_..."}Pobieranie zadania
curl https://api.seedrouter.ai/v1/contents/generations/tasks/YOUR_TASK_ID \
-H "Authorization: Bearer $SEEDROUTER_API_KEY"Odpytuj co 10–20 sekund, aż status przyjmie wartość succeeded, failed lub expired. Przekroczenie limitu czasu sieci podczas odpytywania nie oznacza, że generowanie się nie powiodło: zachowaj identyfikator zadania i wznów sprawdzanie. Nie twórz kolejnego zadania, aby sprawdzić postęp.
Pełny przykład odpytywania
Uruchom to po powyższym przykładzie wysyłania w Pythonie.
import time
deadline = time.monotonic() + 1800
while time.monotonic() < deadline:
result = requests.get(
f"https://api.seedrouter.ai/v1/contents/generations/tasks/{task_id}",
headers={"Authorization": f"Bearer {os.environ['SEEDROUTER_API_KEY']}"},
timeout=30,
)
result.raise_for_status()
task = result.json()
if task["status"] == "succeeded":
print(task["content"]["video_url"])
break
if task["status"] in ("failed", "expired"):
raise RuntimeError(task["error"]["message"])
time.sleep(15)
else:
raise TimeoutError(f"Still waiting. Resume polling task {task_id}.")Zadanie zakończone powodzeniem
{
"id": "task_...",
"model": "dreamina-seedance-2-0",
"status": "succeeded",
"content": {
"video_url": "https://static.seedrouter.ai/media/tasks/task_example/0.mp4",
"last_frame_url": "https://static.seedrouter.ai/media/tasks/task_example/last_frame/0.jpg"
},
"usage": {"completion_tokens": 108900, "total_tokens": 108900},
"seed": 42,
"resolution": "720p",
"ratio": "16:9",
"duration": 5,
"framespersecond": 24,
"generate_audio": true,
"draft": false,
"output_format": "mp4",
"service_tier": "default",
"execution_expires_after": 172800,
"priority": 0,
"created_at": 1790321515,
"updated_at": 1790321652
}| Pole | Znaczenie |
|---|---|
id | Zachowaj ten identyfikator na potrzeby późniejszych zapytań. |
status | queued, running, succeeded, failed lub expired. |
content.video_url | Wygenerowane wideo. |
content.last_frame_url | Ostatnia klatka, gdy return_last_frame ma wartość true. |
usage.completion_tokens | Tokeny wideo gotowego klipu; ilość, za którą naliczana jest opłata. |
duration, resolution, ratio, framespersecond, seed | Faktycznie wyrenderowane wartości; seed to wartość wybrana przez model. |
created_at, updated_at | Znaczniki czasu Unix w sekundach. |
error | {"code", "message"} w nieudanym lub wygasłym zadaniu. |
Adresy URL wideo są hostowane w naszym magazynie. Zapisz plik we własnym magazynie, jeśli potrzebujesz trwałej kopii.
Lista zadań
curl "https://api.seedrouter.ai/v1/contents/generations/tasks?page_num=1&page_size=20&filter.status=succeeded" \
-H "Authorization: Bearer $SEEDROUTER_API_KEY"Zwraca {"total": N, "items": [...]} z obiektami zadań z ostatnich 7 dni, od najnowszych. page_num i page_size przyjmują wartości 1–500 (domyślnie 1 i 20). Filtry: filter.status, filter.model, filter.task_ids (można powtarzać) i filter.service_tier.
Błędy
Żądania odrzucone przed utworzeniem zadania zwracają błąd HTTP wraz z obiektem error i nie są naliczane. Zadanie, które zawiodło po przyjęciu, przy odpytaniu zwraca HTTP 200 z status: "failed" (lub "expired") i obiektem error. Wynik wstrzymany przez filtrowanie treści kończy się niepowodzeniem z content_policy_violation; zadanie, które przekroczy execution_expires_after, kończy się stanem expired z task_expired.
Kody, statusy HTTP i wskazówki dotyczące ponawiania znajdziesz we wspólnym katalogu błędów.
{
"id": "task_...",
"model": "dreamina-seedance-2-0",
"status": "failed",
"error": {
"code": 60001,
"message": "The request was rejected by the content policy. Please revise the prompt or input images."
}
}Jeśli limit czasu został przekroczony przy samym wysyłaniu, przed ponownym wysłaniem sprawdź listę zadań: pierwsze żądanie mogło już zostać przyjęte.
Wskazówki
- Opisz obiekt, akcję, ruch kamery i oświetlenie pełnymi zdaniami.
- Twórz szkice w 480p z krótkim
duration, a wybraną wersję wyrenderuj w wyższej rozdzielczości. - Łącz ujęcia za pomocą
return_last_frame: użyj zwróconej klatki jakofirst_framekolejnego zadania.
