Przejdź do treści głównej

Tekst na obraz w Nano Banana 2.1 to najnowszy model Nano Banana od Google. Generuje w 1k, 2k lub 4k w czternastu proporcjach do 8:1, poprawnie zapisuje tekst w cudzysłowie i przed rysowaniem może przeszukać sieć lub obrazy referencyjne.

Od $0.022/obraz30% poniżej ceny katalogowej twórcy modeluZ opcją Official fallback: do $0.048

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
Nano Banana 2.1 · Text to Image · Przykładowy wynik
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": "google/nano-banana-2.1/text-to-image",
  "input": {
    "prompt": "A ceramic teapot on a linen cloth, soft window light, muted palette",
    "resolution": "1k",
    "aspect_ratio": "16:9",
    "output_format": "png",
    "enable_web_search": false,
    "enable_image_search": false
  }
}'

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

promptstringWymagane

Do 5000 znaków. Opisz obiekt, otoczenie, światło i obiektyw zwykłymi zdaniami; słowa w cudzysłowie są drukowane na obrazie.

Domyślnie
Nie określono
Ograniczenia
minLength:1
maxLength:5000
official_fallbackbooleanOpcjonalne

Domyślnie włączone. Każde żądanie najpierw wykonuje się ścieżką ekonomiczną. Jeśli ta ścieżka nie może go zrealizować, na przykład dlatego, że odrzuca prompt na poziomie Łagodny, żądanie uruchamia się ponownie oficjalną ścieżką i jest rozliczane po oficjalnej, a nie ekonomicznej cenie. Wyłącz, aby płacić tylko cenę ekonomiczną; żądanie może wtedy zostać odrzucone lub zakończyć się błędem, a wyszukiwanie w sieci i wyszukiwanie obrazów są niedostępne.

Domyślnie
true
output_formatstringOpcjonalne

png (domyślnie) lub jpeg. Pliki JPEG są kilkukrotnie mniejsze; cena jest taka sama.

Domyślnie
"png"
Dozwolone wartości
"png""jpeg"
enable_image_searchbooleanOpcjonalneWpływa na cenę

Domyślnie wyłączone. Po włączeniu model przed rysowaniem szuka w sieci obrazów referencyjnych, co pomaga przy prawdziwych miejscach i produktach. Dolicza do żądania opłatę za wyszukiwanie, widoczną w wycenie. W takim przypadku żądanie idzie oficjalną trasą po cenie oficjalnej, więc zostaw opcję Official fallback włączoną.

Domyślnie
false
enable_web_searchbooleanOpcjonalneWpływa na cenę

Domyślnie wyłączone. Po włączeniu model przed rysowaniem sprawdza aktualne fakty, takie jak daty, pogoda czy wydarzenia. Dolicza do żądania opłatę za wyszukiwanie, widoczną w wycenie. W takim przypadku żądanie idzie oficjalną trasą po cenie oficjalnej, więc zostaw opcję Official fallback włączoną.

Domyślnie
false
resolutionstringOpcjonalneWpływa na cenę

1k (domyślnie), 2k lub 4k. Kwadratowy kadr ma bok 1024, 2048 lub 4096 pikseli; każdy poziom ma własną cenę.

Domyślnie
"1k"
Dozwolone wartości
"1k""2k""4k"
aspect_ratiostringOpcjonalne

Jedna z czternastu proporcji, domyślnie 16:9; proporcje nie zmieniają ceny. Skrajne proporcje 4:1, 1:4, 8:1 i 1:8 czasem wracają jako kilka zszytych ujęć, zależnie od tego, co pokazują: przy 4:1 i 8:1 trzymaj ludzi małych i blisko środka albo pokaż krajobraz, a 1:4 i 1:8 daj obiekt, który sam jest wysoki. Sprawdź wynik, zanim go użyjesz.

Domyślnie
"16:9"
Dozwolone wartości
"1:1""3:2""2:3""3:4""4:3""4:5""5:4""9:16""16:9""21:9""1:4""4:1""1:8""8:1"

Ś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": "google/nano-banana-2.1/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"
  }
}

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 Nano Banana 2.1 · Text to Image. 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