Vai al contenuto principale

La modifica immagini Qwen Image 2.1 rivede da una a dieci immagini di riferimento da un’istruzione scritta e restituisce un fotogramma a 1k, 1.5k o 2k. Fa anche modifiche locali con una maschera in bianco e nero, dove il bianco viene ridipinto.

Da $0.036/immagine

Playground

Invia una richiesta

Guida rapida

Gli esempi usano le definizioni pubbliche dei parametri dell’endpoint selezionato. Sostituisci la chiave API e i media di esempio, poi invia la richiesta dal tuo server.

SDK e integrazioni
POSThttps://api.spicyapi.ai/api/v1/jobs/createTask

Autenticazione dell’API

Tieni la chiave API nella variabile d’ambiente del server SPICY_API_KEY. Per le richieste JSON usa l’autenticazione Bearer e Content-Type: application/json.

Authorization: Bearer $SPICY_API_KEY
Qwen Image 2.1 · Image Editing · Risultato di esempio
Risultato di esempioUsa questo esempio
# 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/qwen-image-2.1/edit",
  "input": {
    "aspect_ratio": "1:1",
    "background": "opaque",
    "image_urls": [
      "https://example.com/reference.png"
    ],
    "output_format": "jpeg",
    "prompt": "A ceramic teapot on a linen cloth, soft window light, muted palette",
    "resolution": "1k"
  }
}'

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

Generato dallo schema di input di questo modello, lo stesso su cui l’API valida ogni richiesta.

Parametri di input

Metti questi campi dentro l’oggetto input del corpo della richiesta. Nomi e tipi corrispondono all’API. Quando un valore predefinito non è indicato, non darlo per scontato.

image_urlsarray<string>ObbligatorioIncide sul prezzo

Da una a dieci immagini di riferimento. Il modello non assegna i ruoli da solo, quindi dichiara nel prompt che cosa porta ogni sorgente: qual è la persona, quale l'ambiente, quale il capo di abbigliamento. Ogni riferimento in più alza il preventivo, quindi manda solo quelli che servono davvero.

Predefinito
Non specificato
Vincoli
minItems:1
maxItems:10
promptstringObbligatorio

Fino a 5.000 caratteri. In questa famiglia non c'è un negative prompt, quindi anche le esclusioni stanno qui: elenca che cosa c'è nell'inquadratura, poi di' chiaramente che cosa non ci deve essere. Una descrizione continua rende più di un mucchio di parole chiave.

Predefinito
Non specificato
Vincoli
minLength:1
maxLength:5000
seedintegerFacoltativo

Stabilizza l'estrazione, così una serie resta nella stessa zona. Non è una garanzia di riproducibilità: abbiamo inviato due volte lo stesso prompt con lo stesso seed e ottenuto due inquadrature diverse. Conserva l'asset restituito quando ti serve di nuovo quell'immagine esatta.

Predefinito
Non specificato
Vincoli
minimum:0
maximum:2147483647
output_formatstringFacoltativo

JPEG di default. PNG quando l'immagine entra in una fase di compositing, WebP quando va dritta in pagina. Il contenitore non cambia né il prezzo né la resa.

Predefinito
"jpeg"
Valori ammessi
"jpeg""png""webp"
backgroundstringFacoltativo

opaque di default. transparent restituisce il solo soggetto su un vero canale alfa: abbinalo a un output png o webp (jpeg non ha canale alfa e la richiesta viene rifiutata) e descrivi solo il soggetto, perché nominare una stanza, una superficie o una scena può riportare uno sfondo. Disponibile a 1k e 2k, non a 1.5k. Non cambia il prezzo. Non si può combinare con mask_url.

Predefinito
"opaque"
Valori ammessi
"opaque""transparent"
enable_prompt_expansionbooleanFacoltativo

Attivo di default: prima della generazione il prompt viene riscritto in una descrizione di scena più completa. Disattivalo per usare la tua formulazione così com'è. Disattivarlo è possibile a 1k e 2k, non a 1.5k. Non cambia il prezzo. Non ha effetto quando è presente mask_url.

Predefinito
true
resolutionstringFacoltativoIncide sul prezzo

La fascia che fissa dimensione dell'output e prezzo: 1k è il default ed è la più economica, 1.5k sta in mezzo, a 2k la grana della pelle, i capelli e la trama dei tessuti reggono. Itera a 1k e promuovi a 2k l'immagine che tieni.

Predefinito
"1k"
Valori ammessi
"1k""1.5k""2k"
aspect_ratiostringFacoltativo

Compone l'inquadratura prima della generazione invece di ritagliarla dopo, quindi scegli la forma in cui pubblicherai. Quindici opzioni, dalle strisce 3:1 e 21:9 alle colonne 1:3 e 9:21. Tutti i formati costano uguale.

Predefinito
"1:1"
Valori ammessi
"1:1""16:9""9:16""4:3""3:4""3:2""2:3""21:9""9:21""2:1""1:2""3:1""1:3""5:4""4:5"
mask_urlstringFacoltativo

Immagine in bianco e nero facoltativa che porta la modifica in modalità locale: il bianco indica la zona da ridipingere, il nero resta com'è e qualche pixel di bordo sfumato aiuta la fusione. Usala con esattamente un'immagine di riferimento con le stesse proporzioni (una maschera di dimensioni diverse viene riscalata) e descrivi nel prompt cosa deve comparire nella zona bianca. L'output mantiene la forma dell'immagine di riferimento, quindi aspect_ratio viene ignorato, e non si può combinare con uno sfondo trasparente. Disponibile a 1k e 2k, non a 1.5k. Non cambia il prezzo.

Predefinito
Non specificato
Vincoli
format:"uri"
contentMediaType:["image/jpeg","image/png","image/webp","image/gif"]

Segui l’attività

HTTP 202 significa che l’attività è stata accettata, non che sia finita. Salva il taskId restituito e interroga quell’attività. Non crearne un’altra mentre aspetti il risultato.

Risposta di accettazione
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"
  }
}

La risposta di accettazione include la stima, così la tua applicazione può mostrare lo stesso importo nella cronologia delle attività e nella fatturazione.

Leggi l’attività
curl --get "https://api.spicyapi.ai/api/v1/jobs/recordInfo" \
  --data-urlencode "taskId=$TASK_ID" \
  -H "Authorization: Bearer $SPICY_API_KEY"

Comincia a interrogare ogni 2 secondi circa e allunga l’intervallo man mano. Fermati a uno stato terminale. Dopo una caduta di connessione, interroga il taskId originale. Ripeti la creazione solo con la chiave di idempotenza e il corpo originali.

Oppure lascia che sia la callback a trovarti
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);
});

Passa callBackUrl quando crei l’attività e il record finito ti arriva via POST: nessun ciclo di polling. Ogni consegna porta X-Webhook-Timestamp, X-Webhook-Signature e X-Webhook-Payload-Version. La firma è un HMAC-SHA256 in base64 su taskId.timestamp.sha256(body), quindi va verificata sui byte grezzi: se analizzi il JSON e lo riserializzi i byte cambiano e la verifica fallisce. Le consegne fallite vengono ritentate, quindi lo stesso taskId può arrivare due volte: rendi idempotente il gestore. Rispondi prima con un 2xx e fai il lavoro dopo; un gestore lento viene trattato come una consegna fallita.

Leggi il risultato

Usa l’output solo quando lo stato è succeeded. In caso di fallimento, indaga con errorCode, errorMessage e request_id. Costi e stati degli esempi non rappresentano un addebito reale.

Esempio di risposta completata
{
  "code": 200,
  "msg": "success",
  "request_id": "req_example_record",
  "data": {
    "taskId": "job_01k3m8x9q2z4v7n5p6r8s0t1w3",
    "model": "alibaba/qwen-image-2.1/edit",
    "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"
  }
}

Per ogni asset disponibile, apri o scarica assets[].url direttamente, senza l’header Authorization dell’API. L’URL firmato scade a expiresAt; interroga di nuovo l’attività per rinnovarlo finché l’asset resta entro il periodo di conservazione. Un asset in attesa o non disponibile non ha URL. Tratta gli URL firmati come privati.

SDK e integrazioni

Usa SpicyAPI nella tua app, nel terminale, con un assistente IA o in un workflow visivo. Scegli una guida di configurazione.

Usalo in ComfyUI

Installa i nodi SpicyAPI da ComfyUI Manager o con il comando qui sotto, poi cerca Qwen Image 2.1 · Image Editing sulla tela. Il nodo ha le stesse opzioni di questa pagina e mostra il prezzo prima dell’esecuzione.

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