Przejdź do treści głównej

Wan 2.1 LoRA wideo na wideo przerysowuje klip, który już masz, według promptu, zachowując jego ruch i rytm, z maksymalnie trzema twoimi plikami LoRA na modelu 14B firmy Alibaba. Wynik w 480p lub 720p w kształcie źródła, nic nie jest filtrowane.

Od $0.24/żądanie

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-2.1-lora/video-edit",
  "input": {
    "duration_seconds": 5,
    "prompt": "A slow aerial shot drifting over a misty pine forest at sunrise",
    "resolution": "480p",
    "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

Źródłowy klip. Jego ruch i tempo przechodzą do wyniku; wynik zachowuje jego kształt i nigdy nie jest dłuższy. To musi być wideo: link do obrazu nie jest odrzucany i zwraca jednoklatkowy klip, który i tak jest rozliczany.

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

Wymagane. Opisz cały wynik (temat, ubiór, miejsce, światło, styl), nie tylko zmianę. Najpierw słowa wyzwalające, jeśli twoja LoRA je ma.

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

Pozwala porównywać przebiegi, gdy zmieniasz jedną LoRA lub jedną wartość scale naraz. Nie obiecuje identycznego wyniku.

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

Kroki odszumiania, od 1 do 40, domyślnie 30. Mniej kroków to szybciej i bardziej miękko. Nie wpływa na cenę.

Domyślnie
30
Ograniczenia
minimum:1
maximum:40
flow_shiftnumberOpcjonalne

Przesunięcie kroków czasowych flow matching, od 1 do 10. Pomiń, by użyć 3 w 480p i 5 w 720p; zmieniaj tylko wtedy, gdy autor LoRA zaleca wartość. Nie wpływa na cenę.

Domyślnie
Nie określono
Ograniczenia
minimum:1
maximum:10
guidance_scalenumberOpcjonalne

Jak ściśle klip trzyma się promptu, od 0 do 20, domyślnie 5. Podnoszenie go przy jednoczesnym obniżaniu kroków dawało nam przesycone kadry z artefaktami. Nie wpływa na cenę.

Domyślnie
5
Ograniczenia
minimum:0
maximum:20
lorasarray<object>Opcjonalne

Do trzech wpisów {path, scale} wytrenowanych pod Wan 2.1 14B; path to publiczny bezpośredni link do pliku .safetensors, scale od 0 do 4 (domyślnie 1). Ładowanie LoRA nie zmienia ceny.

Domyślnie
[]
Ograniczenia
maxItems:3
duration_secondsintegerOpcjonalneWpływa na cenę

5 (domyślnie) lub 10. Wynik nigdy nie jest dłuższy niż źródło, ale 10 jest rozliczane po stawce 10-sekundowej, więc używaj go tylko dla źródeł o długości co najmniej 10 sekund. Inne długości są odrzucane.

Domyślnie
5
Dozwolone wartości
510
strengthnumberOpcjonalne

Jak daleko odejść od źródła, od 0,1 do 1, domyślnie 0,9. W naszym teście 0,9 przerysowało klip, a 0,5 zwróciło go prawie bez zmian. Nie wpływa na cenę.

Domyślnie
0.9
Ograniczenia
minimum:0.1
maximum:1
resolutionstringOpcjonalneWpływa na cenę

480p (domyślnie) lub 720p. 720p kosztuje więcej za klip i trwa dłużej; kształt wynika ze źródła.

Domyślnie
"480p"
Dozwolone wartości
"480p""720p"
negative_promptstringOpcjonalne

Co ma zostać poza klipem, np. rozmycie, dodatkowe palce, tekst lub znaki wodne. Opcjonalny, nie wpływa na cenę.

Domyślnie
Nie określono

Ś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.1-lora/video-edit",
    "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.1 LoRA · Video 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