Przejdź do treści głównej

Kontynuuj klip w Wan 2.7 Spicy: ostatnia klatka Twojego wideo otwiera nowy segment o długości od 2 do 15 sekund, a w odpowiedzi dostajesz jeden plik z połączonym oryginałem i kontynuacją, w 720p lub 1080p. Wygenerowany dźwięk albo Twoja ścieżka do synchronizacji ust.

Od $0.123/s

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
# 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-2.7-spicy/video-extend",
  "input": {
    "duration_seconds": 5,
    "prompt": "A slow aerial shot drifting over a misty pine forest at sunrise",
    "resolution": "720p",
    "video_url": "https://example.com/reference.mp4"
  }
}'

# 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.

video_urlstringWymagane

Klip do kontynuacji: MP4, MOV lub WebM, do 60 sekund. Jego ostatnia klatka staje się klatką początkową nowego segmentu, więc tnij go na czystej, ostrej klatce. Źródło nie jest rozliczane.

Domyślnie
Nie określono
Ograniczenia
minLength:1
format:"uri"
contentMediaType:["video/mp4","video/webm","video/quicktime"]
promptstringWymagane

Wymagane. Co dzieje się dalej: kolejna akcja, ruch kamery i linijka o dźwięku. Ostatnia klatka ustala już obiekt, strój i scenografię, więc słowa przeznacz na ruch.

Domyślnie
Nie określono
Ograniczenia
minLength:1
enable_prompt_expansionbooleanOpcjonalne

Domyślnie włączone, bez dodatkowej opłaty. Prompt jest przepisywany przed generacją, co pomaga przy krótkim opisie. Gdy opis ruchu jest już precyzyjny, ustaw false, żeby Twoje sformułowania nie zostały przepisane.

Domyślnie
true
generate_audiobooleanOpcjonalne

Domyślnie włączone, więc nowy segment dostaje dźwięk zgrany z obrazem. Twój oryginał w każdym przypadku zachowuje własny dźwięk; gdy jedna strona jest niema, połączony plik jest dopełniany ciszą. Przy false ścieżka podana w audio_url również nie jest używana.

Domyślnie
true
seedintegerOpcjonalne

Od 0 do 2147483647. Trzymaj stałą, gdy porównujesz 720p z 1080p albo pięć sekund z dziesięcioma.

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

Dźwięk nowego segmentu, który steruje synchronizacją ust i tempem: kwestia lub sygnał muzyczny, który musi trafić w konkretny moment. WAV lub MP3, od 2 do 30 sekund, do 15 MB. Kształtuje tylko nowy segment, a Twój oryginał zachowuje własny dźwięk. Wymaga włączonego generate_audio.

Domyślnie
Nie określono
Ograniczenia
contentMediaType:["audio/mpeg","audio/wav"]
resolutionstringOpcjonalneWpływa na cenę

Rozdzielczość, w jakiej powstaje nowy fragment: 720p lub 1080p, domyślnie 720p. Wybierz rozdzielczość oryginału, żeby na łączeniu nie było widać skoku ostrości. Połączony MP4 zachowuje liczbę klatek na sekundę i kadr Twojego klipu, bez czarnych pasów. Aby dopasować łączenie, obraz może zostać przycięty lub skorygowany o kilka procent na brzegach. Jeśli model zwróci wyraźnie inne proporcje, nowy segment zostanie przeskalowany tak, aby wypełnić Twój kadr, i wyśrodkowany, a to, co wystaje, zostanie przycięte. Wpływa na cenę i czas zadania.

Domyślnie
"720p"
Dozwolone wartości
"720p""1080p"
duration_secondsintegerOpcjonalneWpływa na cenę

Długość nowego segmentu: dowolna liczba całkowita od 2 do 15, domyślnie 5. Twój oryginał dochodzi z przodu i nie jest rozliczany. Po dziesięciu sekundach widać dryf dłoni i tkanin.

Domyślnie
5
Ograniczenia
minimum:2
maximum:15
negative_promptstringOpcjonalne

Czego nie może być w nowym segmencie: drugiej osoby, rekwizytu, tekstu na ścianie, znaku wodnego. To jedyne miejsce na wykluczenia. Do 500 znaków.

Domyślnie
Nie określono
Ograniczenia
maxLength:500

Ś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-2.7-spicy/video-extend",
    "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 2.7 Spicy · Video Extend. 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