promptstringObrigatórioPrimeiro a palavra-gatilho, se o seu LoRA tiver uma, depois o sujeito, o lugar, a luz e a lente. Até 5.000 caracteres; não há prompt negativo.
- Valor padrão
- Não especificado
- Restrições
- minLength:1maxLength:5000
alibaba/wan-2.2-image-lora/text-to-imageO texto para imagem do Wan 2.2 Image LoRA renderiza uma imagem com o Wan 2.2 A14B da Alibaba e até nove arquivos LoRA seus em três slots. Nove proporções até 1536 pixels, um preço fixo por imagem, sem filtro de conteúdo.
Os exemplos usam as definições públicas de parâmetros do endpoint selecionado. Troque a chave de API e as mídias de exemplo e envie a requisição a partir do seu servidor.
SDKs e integraçõeshttps://api.spicyapi.ai/api/v1/jobs/createTaskGuarde a chave de API na variável de ambiente do servidor SPICY_API_KEY. Use autenticação Bearer e Content-Type: application/json nas requisições 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-image-lora/text-to-image",
"input": {
"aspect_ratio": "1:1",
"output_format": "jpeg",
"prompt": "A ceramic teapot on a linen cloth, soft window light, muted palette"
}
}'
# 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"Gerado a partir do schema de entrada deste modelo — o mesmo que a API usa para validar cada requisição.
Coloque estes campos no objeto input do corpo da requisição. Nomes e tipos são os mesmos da API. Quando nenhum valor padrão estiver indicado, não presuma que exista um.
promptstringObrigatórioPrimeiro a palavra-gatilho, se o seu LoRA tiver uma, depois o sujeito, o lugar, a luz e a lente. Até 5.000 caracteres; não há prompt negativo.
seedintegerOpcionalNos nossos testes, repetiu a imagem quando todas as outras entradas ficaram iguais, o que deixa limpas as comparações de scale de LoRA; não é uma garantia de pixels idênticos. Deixe vazio para uma imagem nova a cada vez.
output_formatstringOpcionaljpeg (o padrão), png ou webp. O formato não altera o preço.
"jpeg""png""webp"low_noise_lorasarray<object>OpcionalAté três entradas {path, scale} aplicadas só ao especialista de baixo ruído, que define cor, textura e detalhe. Coloque aqui o arquivo low_noise de um par de LoRAs do Wan 2.2 A14B; scale de 0 a 4, 1 por padrão. Sem cobrança extra.
low_noise_loras[].pathstringObrigatório no objetoDirect URL of a LoRA weights file.
low_noise_loras[].scalenumberObrigatório no objetoWeight strength from zero to four.
high_noise_lorasarray<object>OpcionalAté três entradas {path, scale} aplicadas só ao especialista de alto ruído, que define o layout, a pose e o enquadramento. Coloque aqui o arquivo high_noise de um par de LoRAs do Wan 2.2 A14B; scale de 0 a 4, 1 por padrão. Sem cobrança extra.
high_noise_loras[].pathstringObrigatório no objetoDirect URL of a LoRA weights file.
high_noise_loras[].scalenumberObrigatório no objetoWeight strength from zero to four.
lorasarray<object>OpcionalAté três entradas {path, scale} aplicadas aos dois especialistas de ruído; scale de 0 a 4, 1 por padrão. Um LoRA do Wan 2.2 A14B de arquivo único vai aqui. Use um link público e direto para o arquivo .safetensors. Sem cobrança extra.
loras[].pathstringObrigatório no objetoDirect URL of a LoRA weights file.
loras[].scalenumberObrigatório no objetoWeight strength from zero to four.
aspect_ratiostringOpcionalNove formatos: 1:1 (1328 x 1328, o padrão), 16:9 (1536 x 864), 9:16, 4:3 (1472 x 1104), 3:4, 3:2 (1536 x 1024), 2:3, 21:9 (1536 x 656) e 9:21. O formato não altera o preço.
"1:1""16:9""9:16""4:3""3:4""3:2""2:3""21:9""9:21"{
"additionalProperties": false,
"properties": {
"aspect_ratio": {
"default": "1:1",
"description": "Output aspect ratio.",
"enum": [
"1:1",
"16:9",
"9:16",
"4:3",
"3:4",
"3:2",
"2:3",
"21:9",
"9:21"
],
"type": "string",
"x-ui": {
"order": 80,
"widget": "select"
}
},
"high_noise_loras": {
"default": [],
"description": "Up to three LoRA weight files applied to the high-noise expert only (layout and composition).",
"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": 45,
"widget": "object-list"
}
},
"loras": {
"default": [],
"description": "Up to three LoRA weight files applied to both noise experts of Wan 2.2 A14B.",
"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"
}
},
"low_noise_loras": {
"default": [],
"description": "Up to three LoRA weight files applied to the low-noise expert only (detail and texture).",
"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": 40,
"widget": "object-list"
}
},
"output_format": {
"default": "jpeg",
"description": "Container of the returned image.",
"enum": [
"jpeg",
"png",
"webp"
],
"type": "string",
"x-ui": {
"order": 20,
"widget": "select"
}
},
"prompt": {
"description": "Describe the subject, the place, the light and the lens. Put a LoRA trigger word first.",
"maxLength": 5000,
"minLength": 1,
"type": "string",
"x-ui": {
"order": 100,
"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 quer dizer que a tarefa foi aceita, não que terminou. Guarde o taskId devolvido e consulte essa tarefa. Não crie outra enquanto espera o resultado.
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"
}
}A resposta de aceitação já traz a estimativa, para que o seu aplicativo mostre o mesmo valor no histórico de tarefas e na cobrança.
curl --get "https://api.spicyapi.ai/api/v1/jobs/recordInfo" \
--data-urlencode "taskId=$TASK_ID" \
-H "Authorization: Bearer $SPICY_API_KEY"Comece consultando a cada 2 segundos, mais ou menos, e vá espaçando. Pare em um estado final. Se a conexão cair, consulte o taskId original. Só recrie a tarefa com a chave de idempotência e o corpo originais.
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);
});Passe callBackUrl ao criar a tarefa e o registro concluído chega até você via POST — sem nenhum laço de polling. Toda entrega traz X-Webhook-Timestamp, X-Webhook-Signature e X-Webhook-Payload-Version. A assinatura é um HMAC-SHA256 em base64 sobre taskId.timestamp.sha256(body), então confira contra os bytes brutos: se você analisar o JSON e serializar de novo, os bytes mudam e a verificação falha. Entregas com erro são repetidas, ou seja, o mesmo taskId pode chegar duas vezes — deixe seu handler idempotente. Responda 2xx primeiro e faça o trabalho depois; um handler lento conta como entrega falha.
Só consuma output quando state for succeeded. Em caso de falha, use errorCode, errorMessage e request_id para investigar. Os custos e estados de exemplo não representam uma cobrança real.
{
"code": 200,
"msg": "success",
"request_id": "req_example_record",
"data": {
"taskId": "job_01k3m8x9q2z4v7n5p6r8s0t1w3",
"model": "alibaba/wan-2.2-image-lora/text-to-image",
"state": "succeeded",
"output": {
"assets": [
{
"key": "tasks/2026/08/28/job_01k3m8x9q2z4v7n5p6r8s0t1w3/3f7a1c9e5b2d48f0a6c1e3d5b7f9a1c3.png",
"mime": "image/png",
"url": "https://example.r2.cloudflarestorage.com/results/job_01k3m8x9q2z4v7n5p6r8s0t1w3/result.png?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"
}
}Para cada arquivo disponível, abra ou baixe assets[].url direto, sem o cabeçalho Authorization da API. O link assinado expira em expiresAt: consulte a tarefa de novo para renovar enquanto o arquivo estiver dentro do prazo de retenção. Arquivo pendente ou indisponível não tem URL. Trate os links assinados como dado privado.
Use a SpicyAPI no seu app, terminal, assistente de IA ou fluxo visual. Escolha um guia de configuração.
Você não precisa escrever nada do código acima. Conecte o servidor MCP uma vez e qualquer agente que fale MCP — Claude Code, Codex, Cursor, Windsurf, VS Code, Gemini CLI, Cline, LibreChat — chama este modelo pelo nome. Ou rode direto do terminal, em um comando só.
Com alibaba/wan-2.2-image-lora/text-to-image, gere o retrato de uma dançarina sob luz de neon e salve em ./out/.
O agente procura o modelo no catálogo atual e envia o arquivo local por você. Em seguida, mostra a estimativa exata de preço e o valor máximo de cobrança e espera sua confirmação. Nada é cobrado até você autorizar.
claude mcp add spicyapi -e SPICY_API_KEY=$SPICY_API_KEY \
-- npx --yes --package=@spicyapi/mcp spicyapi-mcp
npx skills add spicyapi-ai/spicy-skillA primeira linha entrega as ferramentas ao agente; a segunda, a Skill com as regras de uso: mostrar a estimativa antes de cobrar, enviar arquivos locais em vez de colar bytes e ler a URL do arquivo concluído em vez de adivinhá-la. Os demais clientes usam o mesmo servidor pelo próprio arquivo de configuração: veja a área do desenvolvedor.
npx @spicyapi/cli tasks create --model alibaba/wan-2.2-image-lora/text-to-image \
--input-json '{"aspect_ratio":"1:1","output_format":"jpeg","prompt":"A ceramic teapot on a linen cloth, soft window light, muted palette"}' \
--waitA entrada vem do schema deste endpoint, igual aos exemplos acima. --wait acompanha a tarefa até o fim e imprime o resultado; use --yes para pular a confirmação na CI. Defina antes o SPICY_API_KEY — a mesma chave serve para a API, a CLI e o servidor MCP.
npx @spicyapi/cli tasks create --model alibaba/wan-2.2-image-lora/text-to-image \
--input-json '{…}' --retention 1h --wait
npx @spicyapi/cli tasks get $TASK_ID # read back the retention that appliedO --retention só encurta o prazo — 30m, 1h, 7d, ou 0 para apagar assim que a tarefa chega a um estado final. O valor que realmente vale é o menor entre a sua requisição, as configurações da conta e o limite da plataforma; então releia do registro da tarefa em vez de supor que o número pedido valeu. Pedir um prazo maior do que a conta permite não faz nada.
Instale os nós da SpicyAPI pelo ComfyUI Manager ou com o comando abaixo e procure por Wan 2.2 Image LoRA · Text to Image no canvas. O nó tem as mesmas opções desta página e mostra o preço antes da execução.
cd ComfyUI/custom_nodes
git clone https://github.com/spicyapi-ai/comfyui-spicyapiO painel incorporado lê o mesmo schema desta página, então não tem como sair de sincronia com a API. Se a sua documentação precisar de conteúdo indexável, pegue o JSON em /api/embed/models/ e renderize por conta própria.
<iframe src="https://spicyapi.ai/embed/pt-BR/models/wan-2-2-image-lora/api?model=alibaba%2Fwan-2.2-image-lora%2Ftext-to-image" width="100%" height="560" loading="lazy" title="Exemplo de requisição" style="border:1px solid rgba(0,0,0,.12)"></iframe>