Przejdź do treści głównej

Wan 3.0 reference-to-video od Alibaba utrzymuje spójność postaci, stroju, miejsca lub głosu dzięki maks. 10 obrazom, 5 wideo i 5 plikom audio. Zwraca 2–30 sekund w 480p–1080p, a prompt jest opcjonalny.

Od $0.045/s10% poniżej ceny katalogowej twórcy modelu

Obszar roboczy

Wyślij żądanie

Szybki start

Przykłady korzystają z publicznych definicji parametrów wybranego endpointu. Podmień klucz API i przykładowe media, a potem wyślij żądanie ze swojego serwera.

SDK i integracje
POSThttps://api.spicyapi.ai/api/v1/jobs/createTask

Uwierzytelnianie API

Klucz API trzymaj w zmiennej środowiskowej serwera SPICY_API_KEY. Dla żądań JSON używaj uwierzytelniania Bearer i Content-Type: application/json.

Authorization: Bearer $SPICY_API_KEY
Przykładowy wynikUżyj tego przykładu
# Generate the idempotency key once; reuse it when retrying after a lost response.
export SPICY_IDEMPOTENCY_KEY="${SPICY_IDEMPOTENCY_KEY:-$(uuidgen)}"
curl -X POST https://api.spicyapi.ai/api/v1/jobs/createTask \
  -H "Authorization: Bearer $SPICY_API_KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: $SPICY_IDEMPOTENCY_KEY" \
  -d '{
  "model": "alibaba/wan-3.0/reference-to-video",
  "input": {
    "aspect_ratio": "16:9",
    "duration_seconds": 5,
    "prompt": "A slow aerial shot drifting over a misty pine forest at sunrise",
    "reference_image_urls": [
      "https://example.com/reference.png"
    ],
    "resolution": "720p"
  }
}'

# Copy data.taskId from the response into TASK_ID, then poll the status.
TASK_ID="TASK_ID_FROM_RESPONSE"
curl "https://api.spicyapi.ai/api/v1/jobs/recordInfo?taskId=$TASK_ID" \
  -H "Authorization: Bearer $SPICY_API_KEY"

Wygenerowane ze schematu wejścia tego modelu – tego samego, względem którego API waliduje każde żądanie.

Parametry wejściowe

Te pola umieść w obiekcie input w ciele żądania. Nazwy i typy odpowiadają API. Gdy wartości domyślnej nie podano, nie zakładaj żadnej.

Ten model ma zależności między polami. Pola oznaczone jako wymagane warunkowo zależą od innych danych wejściowych; reguły znajdziesz w pełnym JSON Schema poniżej.

seedintegerOpcjonalne

Od 0 do 2147483647. Trzymaj go na stałe, aby porównywać po jednym zmienionym polu; pomiń go, gdy chcesz różnorodności.

Domyślnie
Nie określono
Ograniczenia
minimum:0
maximum:2147483647
enable_prompt_expansionbooleanOpcjonalne

Domyślnie wyłączone. Po włączeniu prompt jest przepisywany przed generowaniem: pomaga przy ubogich briefach, a przy szczegółowych działa przeciwko tobie. Jeśli go nie ustawisz i dołączysz reference_file_url albo reference_link_url, włączy się dla tego żądania, bo dokument lub strona są czytane właśnie na tym etapie. Jeśli jawnie ustawisz false, plik lub strona i tak zostaną przeczytane, tylko bez przepisywania promptu.

Domyślnie
Nie określono
generate_audiobooleanOpcjonalne

Domyślnie włączone. Klip wraca z dźwiękiem już zsynchronizowanym z obrazem. Ustaw false, jeśli udźwiękawiasz ujęcie samodzielnie.

Domyślnie
true
duration_secondsintegerOpcjonalneWpływa na cenę

Dowolna liczba całkowita od 2 do 30 albo -1 dla inteligentnego czasu trwania. Domyślnie 5. Przy wideo referencyjnych ich łączna długość plus ta wartość musi zmieścić się w 30 sekundach, a te sekundy są rozliczane dodatkowo, ponad materiał wyjściowy. Dopracuj wygląd na 5 sekundach, zanim wydłużysz.

Domyślnie
5
Dozwolone wartości
-123456789101112131415161718192021222324252627282930
resolutionstringOpcjonalneWpływa na cenę

480p, 720p lub 1080p. Domyślnie 720p. Rozdzielczość zmienia i cenę, i czas, po jakim zadanie wraca.

Domyślnie
"720p"
Dozwolone wartości
"480p""720p""1080p"
enable_thinkingbooleanOpcjonalne

Każe modelowi przemyśleć polecenie i materiały referencyjne przed generowaniem. Pomaga przy obszernych dokumentach, stronach WWW i złożonych obrazach referencyjnych, ale wydłuża przebieg. Domyślnie wyłączone; włącza się samo, gdy podasz plik lub link referencyjny. Nie wpływa na cenę.

Domyślnie
false
aspect_ratiostringOpcjonalne

16:9, 9:16, 1:1, 4:3, 3:4 albo adaptive, przy którym wybiera model. Domyślnie 16:9.

Domyślnie
"16:9"
Dozwolone wartości
"16:9""9:16""1:1""4:3""3:4""adaptive"
reference_link_urlstringWymagane warunkowo

Jedna publiczna strona internetowa, którą model czyta jako materiał referencyjny, na przykład artykuł, strona produktu albo profil postaci. Musi otwierać się bez logowania. Niektóre serwisy blokują automatyczne czytniki, a strony z bardzo małą ilością tekstu nie da się użyć; w obu przypadkach zadanie kończy się błędem z informacją, że adresu URL nie udało się odczytać, a nieudane zadania nie są płatne. Nie razem z reference_file_url; jeśli enable_prompt_expansion nie jest ustawione, dołączenie linku również włącza rozszerzanie promptu. Linki nie są płatne.

Domyślnie
Nie określono
Ograniczenia
format:"uri"
reference_file_urlstringWymagane warunkowo

Jeden dokument, który model czyta, zanim wyreżyseruje ujęcie: karta postaci, scenariusz, lista ujęć albo brief produktu. PDF, DOCX, DOC, TXT, MD, PPTX, PPT, XLSX, XLS, KEY, PAGES lub NUMBERS, do 100 MB i 50 stron. Działa samodzielnie albo razem z obrazami, wideo i audio referencyjnym, ale nie razem z reference_link_url. Jeśli enable_prompt_expansion nie jest ustawione, dołączenie pliku włącza rozszerzanie promptu dla tego żądania, bo dokument jest czytany właśnie na tym etapie. Pliki nie są płatne.

Domyślnie
Nie określono
Ograniczenia
format:"uri"
contentMediaType:["application/pdf","application/msword","application/vnd.openxmlformats-officedocument.wordprocessingml.document","application/vnd.ms-excel","application/vnd.openxmlformats-officedocument.spreadsheetml.sheet","application/vnd.ms-powerpoint","application/vnd.openxmlformats-officedocument.presentationml.presentation","application/vnd.apple.keynote","application/vnd.apple.pages","application/vnd.apple.numbers","text/plain","text/markdown"]
reference_audio_urlsarray<string>Wymagane warunkowo

Do 5 klipów, każdy od 1 do 15 sekund i łącznie 15 sekund – głos, sposób podania kwestii albo ton pomieszczenia, do którego ujęcie ma pasować. Audio referencyjne nie jest rozliczane. WAV lub MP3, do 15 MB na klip. Podobnie jak przy wideo, limity są sprawdzane w trakcie generowania, a nie przy przyjęciu zadania.

Domyślnie
Nie określono
Ograniczenia
minItems:1
maxItems:5
reference_video_urlsarray<string>Wymagane warunkowoWpływa na cenę

Do 5 klipów, każdy od 1 do 15 sekund i łącznie 15 sekund. Używaj ich do ruchu i stylu kamery, a nie do twarzy. Ich długość jest rozliczana razem z wyjściem, a wideo referencyjne plus wyjście muszą zmieścić się w 30 sekundach. MP4 lub MOV, co najmniej 16 kl./s, od 240 do 4096 px na bok, proporcje nie szersze niż 8:1, do 100 MB na klip. Te limity są sprawdzane w trakcie generowania, a nie przy przyjęciu zadania, więc sprawdź długość klipów przed wysłaniem.

Domyślnie
Nie określono
Ograniczenia
minItems:1
maxItems:5
reference_image_urlsarray<string>Wymagane warunkowo

Od 1 do 10 obrazów jako plansze tożsamości, garderoby i scenografii. Nazwij każdy w prompcie – postać, ubranie, scenografia – inaczej zostaną uśrednione. Obrazy referencyjne nie są rozliczane. JPEG, PNG bez przezroczystości, BMP lub WEBP; od 240 do 8000 px na bok, proporcje nie szersze niż 8:1, najwyżej 20 MB na plik. Kontrola twarzy w tym modelu często odrzuca zdjęcia prawdziwych osób, a zadanie kończy się błędem „The input content is suspected to include real human faces.”. Zamiast tego użyj postaci ilustrowanych lub renderowanych w 3D; odrzucone zadania nie są rozliczane.

Domyślnie
Nie określono
Ograniczenia
minItems:1
maxItems:10
promptstringOpcjonalne

Opcjonalny. Jeśli go piszesz, najpierw nazwij, za co odpowiada każda referencja, a potem opisz ujęcie: podmiot, jedna akcja, jeden ruch kamery, światło i dźwięk. Jedna wyraźna akcja zmienia wynik bardziej niż długa lista przymiotników.

Domyślnie
Nie określono
Ograniczenia
minLength:1

Śledź zadanie

HTTP 202 oznacza, że zadanie zostało przyjęte, a nie ukończone. Zapisz zwrócone taskId i odpytuj właśnie to zadanie. Nie twórz kolejnego zadania, czekając na jego wynik.

Odpowiedź o przyjęciu
HTTP/1.1 202 Accepted
Location: /api/v1/jobs/recordInfo?taskId=job_01k3m8x9q2z4v7n5p6r8s0t1w3

{
  "code": 200,
  "msg": "success",
  "request_id": "req_example_create",
  "data": {
    "taskId": "job_01k3m8x9q2z4v7n5p6r8s0t1w3",
    "state": "queued",
    "estimatedCost": "0.750000"
  }
}

Odpowiedź o przyjęciu zawiera szacunek, dzięki czemu twoja aplikacja pokaże tę samą kwotę w historii zadań i w rozliczeniach.

Odczytaj zadanie
curl --get "https://api.spicyapi.ai/api/v1/jobs/recordInfo" \
  --data-urlencode "taskId=$TASK_ID" \
  -H "Authorization: Bearer $SPICY_API_KEY"

Zacznij odpytywać mniej więcej co 2 sekundy i stopniowo wydłużaj odstęp. Zatrzymaj się na stanie końcowym. Po zerwaniu połączenia odpytaj pierwotne taskId. Tworzenie ponawiaj wyłącznie z pierwotnym kluczem idempotentności i pierwotnym ciałem żądania.

Albo odbierz wynik przez callback
import { verifyWebhook } from "@spicyapi/sdk";

// express.raw keeps the bytes we signed; express.json never matches.
app.post("/hooks/spicy", express.raw({ type: "application/json" }), (req, res) => {
  const { payload } = verifyWebhook({
    rawBody: req.body,
    timestamp: req.header("X-Webhook-Timestamp"),
    signature: req.header("X-Webhook-Signature"),
    payloadVersion: Number(req.header("X-Webhook-Payload-Version")),
    secret: process.env.SPICY_WEBHOOK_SECRET,
  });
  res.status(200).end();
  void handleFinishedTask(payload);
});

Podaj callBackUrl przy tworzeniu zadania, a gotowy rekord przyjdzie do ciebie metodą POST – bez żadnej pętli odpytywania. Każda dostawa niesie X-Webhook-Timestamp, X-Webhook-Signature i X-Webhook-Payload-Version. Podpis to HMAC-SHA256 w base64 z taskId.timestamp.sha256(body), więc trzeba go sprawdzać na surowych bajtach: sparsowanie JSON-a i ponowne zserializowanie zmienia je i weryfikacja się nie powiedzie. Nieudane dostawy są ponawiane, więc to samo taskId może przyjść dwa razy – zrób obsługę idempotentną. Najpierw odpowiedz kodem 2xx, a pracę wykonaj potem; wolna obsługa jest traktowana jak nieudana dostawa.

Odczytaj wynik

Wynik wykorzystuj dopiero przy stanie succeeded. Przy niepowodzeniu skorzystaj z errorCode, errorMessage i request_id. Przykładowe koszty i stany nie odpowiadają rzeczywistemu rozliczeniu.

Przykład odpowiedzi po zakończeniu
{
  "code": 200,
  "msg": "success",
  "request_id": "req_example_record",
  "data": {
    "taskId": "job_01k3m8x9q2z4v7n5p6r8s0t1w3",
    "model": "alibaba/wan-3.0/reference-to-video",
    "state": "succeeded",
    "output": {
      "assets": [
        {
          "key": "tasks/2026/08/28/job_01k3m8x9q2z4v7n5p6r8s0t1w3/3f7a1c9e5b2d48f0a6c1e3d5b7f9a1c3.mp4",
          "mime": "video/mp4",
          "url": "https://example.r2.cloudflarestorage.com/results/job_01k3m8x9q2z4v7n5p6r8s0t1w3/result.mp4?X-Amz-Signature=SIGNATURE_FROM_RESPONSE",
          "expiresAt": "2026-08-28T12:20:08.000Z"
        }
      ]
    },
    "cost": "0.750000",
    "settled": true,
    "createdAt": "2026-08-28T12:00:00Z",
    "completedAt": "2026-08-28T12:00:30Z"
  }
}

Każdy dostępny materiał otwieraj lub pobieraj bezpośrednio spod assets[].url, bez nagłówka Authorization. Podpisany adres wygasa o expiresAt; odpytaj zadanie ponownie, żeby go odświeżyć, dopóki materiał mieści się w okresie przechowywania. Materiał oczekujący lub niedostępny nie ma adresu. Podpisane adresy traktuj jako prywatne.

SDK i integracje

Korzystaj ze SpicyAPI w aplikacji, terminalu, asystencie AI lub wizualnym przepływie pracy. Wybierz instrukcję konfiguracji.

Użyj w ComfyUI

Zainstaluj węzły SpicyAPI przez ComfyUI Manager albo poleceniem poniżej, a potem wyszukaj na płótnie Wan 3.0 · Reference to Video. Węzeł ma te same opcje co ta strona i pokazuje cenę, zanim ruszy.

cd ComfyUI/custom_nodes
git clone https://github.com/spicyapi-ai/comfyui-spicyapi