promptstringWymaganeNajpierw słowo wyzwalające, jeśli twoja LoRA je ma, potem kto jest w kadrze, jedna akcja i ruch kamery. Pięć sekund mieści jeden moment.
- Domyślnie
- Nie określono
- Ograniczenia
- minLength:1
Tekst na wideo w Wan 2.2 5B LoRA zamienia prompt w jeden pięciosekundowy klip 720p na modelu TI2V-5B od Alibaba, z maks. trzema twoimi plikami LoRA. Poziomo lub pionowo, jedna stała cena za klip, bez filtra treści.
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 integracjehttps://api.spicyapi.ai/api/v1/jobs/createTaskKlucz 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.2-5b-lora/text-to-video",
"input": {
"aspect_ratio": "16:9",
"prompt": "A slow aerial shot drifting over a misty pine forest at sunrise"
}
}'
# 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.
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.
promptstringWymaganeNajpierw słowo wyzwalające, jeśli twoja LoRA je ma, potem kto jest w kadrze, jedna akcja i ruch kamery. Pięć sekund mieści jeden moment.
seedintegerOpcjonalneUtrzymuje porównywalność przebiegów, gdy zmieniasz scale jednej LoRA naraz. Dwa identyczne żądania mogą nadal nieco się różnić, więc to nie jest gwarancja klipu identycznego co do klatki.
lorasarray<object>OpcjonalneDo trzech wpisów {path, scale} wytrenowanych pod Wan 2.2 TI2V-5B; scale od 0 do 4, domyślnie 1 (LoRA stylów zacznij od 0,5). Użyj publicznego, bezpośredniego linku do pliku .safetensors. LoRA stworzone pod modele Wan 2.2 14B ładują się tu bez błędu i nic nie zmieniają. Bez dodatkowej opłaty.
loras[].pathstringWymagane wewnątrz obiektuDirect URL of a LoRA weights file.
loras[].scalenumberWymagane wewnątrz obiektuWeight strength from zero to four.
aspect_ratiostringOpcjonalne16:9 daje 1280 x 704 (domyślnie); 9:16 daje 704 x 1280. Kształt kadru nie zmienia ceny.
"16:9""9:16"{
"additionalProperties": false,
"properties": {
"aspect_ratio": {
"default": "16:9",
"description": "Output aspect ratio.",
"enum": [
"16:9",
"9:16"
],
"type": "string",
"x-ui": {
"order": 70,
"widget": "radio"
}
},
"loras": {
"default": [],
"description": "Up to three LoRA weight files trained for Wan 2.2 TI2V-5B, each with its own strength.",
"items": {
"additionalProperties": false,
"properties": {
"path": {
"contentMediaType": [
"application/octet-stream"
],
"description": "Direct URL of a LoRA weights file.",
"format": "uri",
"minLength": 1,
"type": "string"
},
"scale": {
"default": 1,
"description": "Weight strength from zero to four.",
"maximum": 4,
"minimum": 0,
"type": "number"
}
},
"required": [
"path",
"scale"
],
"type": "object"
},
"maxItems": 3,
"type": "array",
"x-ui": {
"order": 50,
"widget": "object-list"
}
},
"prompt": {
"description": "Describe the scene, the action and the camera move. Put a LoRA trigger word first.",
"minLength": 1,
"type": "string",
"x-ui": {
"order": 100,
"primary": true,
"widget": "textarea"
}
},
"seed": {
"description": "Random seed for controlled comparisons, not a frame-identical guarantee.",
"maximum": 2147483647,
"minimum": 0,
"type": "integer",
"x-ui": {
"order": 10,
"widget": "number"
}
}
},
"required": [
"prompt"
],
"type": "object",
"x-pricing": {
"billingMode": "per_unit",
"variantFields": []
}
}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.
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.
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.
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.
Wynik wykorzystuj dopiero przy stanie succeeded. Przy niepowodzeniu skorzystaj z errorCode, errorMessage i request_id. Przykładowe koszty i stany nie odpowiadają rzeczywistemu rozliczeniu.
{
"code": 200,
"msg": "success",
"request_id": "req_example_record",
"data": {
"taskId": "job_01k3m8x9q2z4v7n5p6r8s0t1w3",
"model": "alibaba/wan-2.2-5b-lora/text-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.
Korzystaj ze SpicyAPI w aplikacji, terminalu, asystencie AI lub wizualnym przepływie pracy. Wybierz instrukcję konfiguracji.
Nie musisz pisać żadnego z powyższych fragmentów kodu. Wystarczy raz podłączyć serwer MCP, a każdy agent obsługujący MCP — Claude Code, Codex, Cursor, Windsurf, VS Code, Gemini CLI, Cline, LibreChat — może uruchomić ten model po nazwie. Można go też wywołać z powłoki jednym poleceniem.
Użyj alibaba/wan-2.2-5b-lora/text-to-video, żeby zrobić pięciosekundowe ujęcie dachu w neonach o zmierzchu, z powolnym najazdem, i zapisz je do ./out/.
Agent znajduje model w aktualnym katalogu, sam wysyła plik lokalny, a potem pokazuje dokładną wycenę wraz z maksymalną opłatą i czeka na twoje potwierdzenie. Nic nie zostaje naliczone, dopóki nie zgodzisz się wprost.
claude mcp add spicyapi -e SPICY_API_KEY=$SPICY_API_KEY \
-- npx --yes --package=@spicyapi/mcp spicyapi-mcp
npx skills add spicyapi-ai/spicy-skillPierwsza linia daje agentowi narzędzia; druga daje mu Skill, czyli reguły ich używania: najpierw wycena, potem opłata, wysyłanie plików lokalnych zamiast wklejania bajtów i odczyt gotowego adresu materiału zamiast zgadywania. Każdy inny klient podłącza ten sam serwer przez własny plik konfiguracyjny – zobacz centrum dla deweloperów.
npx @spicyapi/cli tasks create --model alibaba/wan-2.2-5b-lora/text-to-video \
--input-json '{"aspect_ratio":"16:9","prompt":"A slow aerial shot drifting over a misty pine forest at sunrise"}' \
--waitWejściem jest własny schemat tego endpointu, ten sam co w przykładach powyżej. --wait odpytuje aż do zakończenia zadania i wypisuje wynik; dodaj --yes, żeby pominąć pytanie o potwierdzenie w CI. Najpierw ustaw SPICY_API_KEY – jeden klucz działa w API, w CLI i na serwerze MCP.
npx @spicyapi/cli tasks create --model alibaba/wan-2.2-5b-lora/text-to-video \
--input-json '{…}' --retention 1h --wait
npx @spicyapi/cli tasks get $TASK_ID # read back the retention that applied--retention potrafi wyłącznie skrócić okno – 30m, 1h, 7d albo 0, żeby usunąć zaraz po osiągnięciu przez zadanie stanu końcowego. Obowiązuje najkrótsza z trzech wartości: twojego żądania, ustawień konta i maksimum platformy, więc odczytaj ją z rekordu zadania, zamiast zakładać, że podana liczba zadziałała. Podanie okna dłuższego, niż pozwala konto, nic nie zmienia.
Zainstaluj węzły SpicyAPI przez ComfyUI Manager albo poleceniem poniżej, a potem wyszukaj na płótnie Wan 2.2 5B LoRA · Text 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-spicyapiOsadzony panel czyta ten sam schemat co ta strona, więc nie może się od API rozjechać. Jeśli twoja dokumentacja potrzebuje treści przeszukiwalnej, pobierz JSON spod /api/embed/models/ i wyrenderuj go samodzielnie.
<iframe src="https://spicyapi.ai/embed/pl/models/wan-2-2-5b-lora/api?model=alibaba%2Fwan-2.2-5b-lora%2Ftext-to-video" width="100%" height="560" loading="lazy" title="Przykładowe żądanie" style="border:1px solid rgba(0,0,0,.12)"></iframe>