Source: https://ailoot.ai/models/pl/gemini-3-pro-image/
Canonical: https://ailoot.ai/models/pl/gemini-3-pro-image/
Language: pl

# Google: Nano Banana Pro (Gemini 3 Pro Image)

[Markdown](https://ailoot.ai/models/pl/gemini-3-pro-image/index.md) · [JSON](https://ailoot.ai/models/pl/gemini-3-pro-image/facts.json)

## [Google: Nano Banana Pro (Gemini 3 Pro Image)](https://ailoot.ai/models/pl/gemini-3-pro-image/)

Nano Banana Pro (Gemini 3 Pro Image) to oparty na rozumowaniu model obrazowy Google do złożonych projektów, makiet produktów i wizualizacji faktograficznych. Przyjmuje tekst i referencje obrazowe oraz generuje obrazy z tekstem, z wyjściem 1K–4K i szczegółowym sterowaniem kreatywnym.

- [**Ailoot · Obrazy** `POST /v1/images/generations` `gemini-3-pro-image`](https://ailoot.ai/models/pl/gemini-3-pro-image/#method-0)
- [**Ailoot · Obrazy** `POST /v1/images/generations` `gemini-3-pro-image-preview`](https://ailoot.ai/models/pl/gemini-3-pro-image/#method-1)
- [**Ailoot · Obrazy** `POST /v1/images/generations` `nano-banana-pro`](https://ailoot.ai/models/pl/gemini-3-pro-image/#method-2)
- [**Ailoot Ultra · OpenAI Chat** `POST /v1/chat/completions` `google/gemini-3-pro-image`](https://ailoot.ai/models/pl/gemini-3-pro-image/#method-3)
- [**Ailoot Ultra · Obrazy** `POST /v1/images/generations` `google/gemini-3-pro-image`](https://ailoot.ai/models/pl/gemini-3-pro-image/#method-4)
- [**Ailoot Ultra · Anthropic Messages** `POST /v1/messages` `google/gemini-3-pro-image`](https://ailoot.ai/models/pl/gemini-3-pro-image/#method-5)

O modelu

Ten opis przedstawia możliwości modelu. Dane wejściowe, wyniki i opcje dostępne w Ailoot podano poniżej dla wybranej metody.

Nano Banana Pro to model Gemini 3 Pro Image firmy Google do generowania i edycji obrazów kierowanych rozumowaniem. Producent umieszcza w centrum zamierzonych zastosowań złożone projektowanie graficzne, makiety produktów o wysokiej wierności i wizualizację danych faktograficznych. Przyjmuje tekst i obrazy, a generuje obraz i tekst. Ta nazwana edycja obrazowa Pro opiera się na Gemini 3 Pro, zachowując własny profil wejścia i możliwości zadań obrazowych.

Model obsługuje obrazy 1K, 2K i 4K. Udokumentowane formaty obejmują 1:1, 2:3, 3:2, 3:4, 4:3, 4:5, 5:4, 9:16, 16:9 i 21:9. Kwadratowy obraz 4K ma 4096 × 4096; obraz 16:9 4K ma 5504 × 3072. Dobierz rozdzielczość i proporcje do potrzebnego rezultatu, czy jest to pionowy plakat, scena produktowa, czy szeroka grafika objaśniająca. Opcja 0.5K i dodatkowe skrajne proporcje Gemini 3.1 Flash Image nie należą do tej tabeli Pro.

Renderowanie tekstu wspiera czytelne napisy na plakatach, diagramach i innych projektowanych zasobach. Dla złożonej infografiki podaj fakty bazowe, dokładne sformułowania, kolejność czytania i relację między etykietami a elementami wizualnymi. Oddziel informacje do przekazania od pożądanego stylu artystycznego. Google zaleca najpierw przygotowanie tekstu, a następnie generowanie zawierającego go obrazu. Jest to szczególnie przydatne, gdy kompozycja łączy nagłówek, diagram i kilka krótkich podpisów.

Wejście wieloobrazowe obsługuje do 14 referencji. Tabela funkcji Google opisuje do sześciu referencji obiektów dla wierności, do pięciu referencji postaci dla spójności i do trzech referencji stylu. Role te pomagają przygotować wizualizację złożoną: fotografia produktu określa wygląd, osobny obraz ustala otoczenie, a obraz stylu wpływa na sposób opracowania. Wyjaśnij modelowi, które szczegóły są wiążące, a które referencje dostarczają inspiracji, zamiast żądać bezkrytycznego łączenia każdej widocznej cechy.

Ugruntowanie Google Search może dostarczać informacji o rzeczywistym świecie do wizualizacji faktograficznej lub sceny opartej na aktualnych warunkach. Przepływ obrazowy Pro dokumentuje ugruntowanie internetowe; rozszerzenie Image Search udokumentowano konkretnie dla Nano Banana 2.1 i Gemini 3.1 Flash Image. Dla grafiki danych podaj wartości do pokazania lub poproś o informacje ugruntowane w przepływie producenta, a następnie jasno określ relacje, etykiety i układ. Generowanie wspomagane wyszukiwaniem nadal tworzy obraz do sprawdzenia, a nie substytut kontroli przedstawionych faktów.

Rozumowanie wspiera komponowanie złożonego promptu przed renderowaniem końcowym. Przewodnik obrazowy opisuje obrazy pośrednie używane do testowania kompozycji i logiki, odrębne od rezultatu końcowego. Nie przenoś tabeli ustawień minimal/high z Nano Banana 2 ani tabeli z domyślnym medium z Nano Banana 2.1 na tę edycję Pro. Dla wymagającego projektu podaj kompletny opis z hierarchią wizualną, wymaganymi relacjami obiektów i elementami, które muszą przetrwać późniejsze edycje.

Karta modelu opisuje istotne pozostałe ograniczenia: bardzo mały tekst i długie fragmenty mogą renderować się źle, wygląd postaci może zmienić się między referencją a wynikiem, a edycje z maską lub szkicem mogą tylko częściowo wykonywać instrukcję lub pozostawiać ślady. Model może też mylić lewo i prawo albo kopiować element źródła do nowej kompozycji. Przy poprawce produktu jawnie określ zachowywaną geometrię i etykiety oraz sprawdź edytowany obszar; przy diagramie porównaj kierunek strzałek i względne położenia obiektów.

Obecna tabela API podaje limit wejścia 65,536 tokenów i limit wyjścia 32,768 tokenów. Obsługiwane są generowanie obrazów, myślenie, ugruntowanie przez wyszukiwanie i przetwarzanie wsadowe; generowanie audio, wywoływanie funkcji, wykonywanie kodu, buforowanie, structured outputs, wyszukiwanie plików, kontekst URL i Live API są nieobsługiwane. Zadanie obrazowe w tym profilu nie przyjmuje wejścia audio ani wideo. Wygenerowane obrazy zawierają SynthID, a żądana liczba obrazów wyjściowych nie zawsze jest dokładnie zachowywana.

Praktyczny opis produktu może łączyć obraz produktu, referencję oświetlenia i dokładny nagłówek: „Zachowaj proporcje i napisy produktu, pokaż go na jasnej kamiennej powierzchni w miękkim świetle bocznym i pozostaw górną trzecią część pustą na dostarczony nagłówek”. Dla diagramu faktograficznego wskaż każdą encję i połączenie oraz podaj zatwierdzone etykiety. Dopracowuj wynik w rozmowie, nazywając jedną zmianę i cechy do zachowania, przechowując wybrany obraz i jego tekst objaśniający razem jako rezultat projektowy.

Zadanie praktyczne

### Zadanie praktyczne

Przykład techniczny po angielsku

```
Visualize a supplied packaging cycle

Create one landscape explanatory graphic showing this packaging return cycle: customer returns an empty jar, store inspects it, accepted jars are washed, clean jars are refilled. Use four large illustrated stages connected clockwise. Add only these exact labels: 'RETURN', 'INSPECT', 'WASH', 'REFILL'. Make the arrow direction and stage order unmistakable.
```

#### Oczekiwany wynik

```
One landscape image with four labeled stages and arrows matching the supplied cycle.
```

#### Sprawdź wynik

```
Inspect that arrows connect RETURN to INSPECT to WASH to REFILL in that order, with exact labels.
```

**Ailoot · Obrazy** `POST /v1/images/generations` `gemini-3-pro-image`

[`gemini-3-pro-image`](https://ailoot.ai/models/pl/#m=google%2Fgemini-3-pro-image&route=Core&caller=gemini-3-pro-image&fmt=images)

Google /`gemini-3-pro-image`

ID modelu

- `gemini-3-pro-image`
- `gemini-3-pro-image-preview`
- `nano-banana-pro`

### Start

Nano Banana Pro (Gemini 3 Pro Image) to oparty na rozumowaniu model obrazowy Google do złożonych projektów, makiet produktów i wizualizacji faktograficznych. Przyjmuje tekst i referencje obrazowe oraz generuje obrazy z tekstem, z wyjściem 1K–4K i szczegółowym sterowaniem kreatywnym.

Akceptowane dane wejściowe

Tekst

Wyniki

Obrazy

### Dostępne w Ailoot · dane wejściowe i metody

**Ailoot · Obrazy** `POST /v1/images/generations`

Wejście

`text`

Wyjście

`image`

Kontekst

65 536 tokens

Maksymalny wynik

32 768 tokens

Format wyjściowy

Plik obrazu

| Pole | Typ | Wymaganie | Wartości i limity | Domyślnie |
| --- | --- | --- | --- | --- |
| Pole`model` | Typ`string` | WymaganieWymagane | Wartości i limity gemini-3-pro-image | Domyślnie— |
| Pole`prompt` | Typ`string` | WymaganieWymagane | Wartości i limity Minimalna długość: 1 | Domyślnie— |
| Pole`n` | Typ`integer` | WymaganieOpcjonalne | Wartości i limity Minimum: 1 | Domyślnie1 |
| Pole`response_format` | Typ`string` | WymaganieOpcjonalne | Wartości i limity url, b64\_json | Domyślnie— |
| Pole`stream` | Typ`boolean` | WymaganieOpcjonalne | Wartości i limity | Domyślniefalse |
| Pole`size` | Typ`string` | WymaganieOpcjonalne | Wartości i limity Zależy od modelu | Domyślnie— |
| Pole`quality` | Typ`string` | WymaganieOpcjonalne | Wartości i limity Zależy od modelu | Domyślnie— |
| Pole`background` | Typ`string` | WymaganieOpcjonalne | Wartości i limity Zależy od modelu | Domyślnie— |
| Pole`output_format` | Typ`string` | WymaganieOpcjonalne | Wartości i limity Zależy od modelu | Domyślnie— |
| Pole`output_compression` | Typ`integer` | WymaganieOpcjonalne | Wartości i limity Zależy od modelu | Domyślnie— |
| Pole`moderation` | Typ`string` | WymaganieOpcjonalne | Wartości i limity Zależy od modelu | Domyślnie— |
| Pole`input_fidelity` | Typ`string` | WymaganieOpcjonalne | Wartości i limity Zależy od modelu | Domyślnie— |
| Pole`style` | Typ`string` | WymaganieOpcjonalne | Wartości i limity Zależy od modelu | Domyślnie— |
| Pole`partial_images` | Typ`integer` | WymaganieOpcjonalne | Wartości i limity Zależy od modelu | Domyślnie— |

Kombinacje materiałów wejściowych

**Tekst na obraz** · Wymagane: prompt

Parametry i cykl życia metody

| Parametr | Kontrakt |
| --- | --- |
| Parametr`material_types` | Kontrakttext |
| Parametr`required` | Kontraktmodel, prompt |
| Parametr`optional_controls` | Kontraktnull |
| Parametr`content_type` | Kontraktapplication/json |

Cykl życia: `synchronous_result_then_owned_library`

`GET /v1/media/tasks/{task_id}` · Rzeczywiście zwrócony task\_id lub wpis w bibliotece multimediów

`GET /v1/media/assets/{asset_id}/content`

`GET /v1/media/assets`

`GET /v1/media/assets/{asset_id}`

Struktury metod i ID są dokładne; możliwości dostawcy są odrębne od dopuszczenia żądania.

### Cennik

#### Stawki metod Ailoot

Wejście

0,002 USD */ 1K tokenów obrazu*

Wyjście

0,134 USD *za obraz o rozdzielczości 1K*

Wyjście

0,134 USD *za obraz o rozdzielczości 2K*

Wyjście

0,24 USD *za obraz o rozdzielczości 4K*

Ailoot rezerwuje szacowaną kwotę przed żądaniem. Po otrzymaniu wyniku rozlicza ostateczną opłatę według zmierzonego użycia. Rozliczenie strumieniowania korzysta z końcowego rekordu użycia. [Jak działają rezerwacja i rozliczenie →](https://ailoot.ai/docs/pl/billing/reserve/)

#### Szczegóły taryfy referencyjnej

Referencyjne tabele modelu nie zmieniają wyboru metody, wyceny ani opłat. Naliczane opłaty korzystają ze stawek wybranej metody Ailoot.

Referencyjne tabele modelu

#### Ceny według konfiguracji

| Konfiguracja | Tabela stawek | Opłata |
| --- | --- | --- |
| KonfiguracjaUltra | Tabela stawekStawka podstawowa | Opłata Wejście · Tokeny wejściowe **$0.004000** / 1K tokenów Wyjście · Tokeny wyjściowe **$0.024000** / 1K tokenów Wejście · obraz **$0.004000** / 1K tokenów Wyjście · obraz na wyjściu **$0.24000** / 1K tokenów Wejście · audio **$0.004000** / 1K tokenów Wejście · pamięć podręczna wejściowego audio **$0.0004000** / 1K tokenów Wyjście · wyszukiwanie w internecie **$0.028** za wyszukiwanie w sieci Wyjście · wewnętrzne rozumowanie **$0.024000** / 1K tokenów Wejście · Odczyt cache **$0.0004000** / 1K tokenów Wejście · Zapis do cache **$0.000750000** / 1K tokenów |

### Przykładowe żądania

#### Ailoot · Obrazy

curlPython SDKNode.js SDK

```bash
set -eu
: "${AILOOT_API_KEY:?Set your Ailoot API key}"
export AILOOT_API_KEY
export AILOOT_API_KEY
: "${AILOOT_PROMPT_FILE:?Set your actual UTF-8 image brief}"
export AILOOT_PROMPT_FILE
python3 - <<'PY_REQUEST'
import json,os
from pathlib import Path
p=json.loads('{"model": "gemini-3-pro-image", "prompt": ""}')
f=Path(os.environ["AILOOT_PROMPT_FILE"])
if not f.is_file():raise SystemExit("Choose your actual UTF-8 brief")
p['prompt']=f.read_text(encoding="utf-8")
if not p['prompt'].strip():raise SystemExit("Brief must contain text")
Path("request.json").write_text(json.dumps(p,ensure_ascii=False))
PY_REQUEST
curl --fail-with-body --silent --show-error https://api.ailoot.ai/v1/images/generations \
  -H "Authorization: Bearer $AILOOT_API_KEY" -H 'Content-Type: application/json' \
  --data-binary @request.json -D response-headers.txt -o result.json
python3 - <<'PY_RESULT'
import base64, json, os, subprocess
from pathlib import Path
from urllib.parse import urlsplit, urljoin

def save_images(items):
    if not items: raise SystemExit("No completed images; retain the full response")
    for index, item in enumerate(items):
        encoded=item.get("b64_json")
        uri=item.get("url", "")
        if not encoded and uri.startswith("data:image/"):
            header, separator, encoded=uri.partition(",")
            if not separator or ";base64" not in header: raise SystemExit("Unsupported image data URI")
        if encoded:
            raw=base64.b64decode(encoded,validate=True)
        elif uri:
            uri=urljoin("https://api.ailoot.ai",uri)
            parsed=urlsplit(uri)
            if parsed.scheme!="https" or not parsed.netloc or parsed.username or parsed.password:
                raise SystemExit("Invalid returned image URL")
            owned=parsed.netloc=="api.ailoot.ai" and parsed.path.startswith("/v1/media/assets/") and parsed.path.endswith("/content")
            args=["curl","--fail-with-body","--silent","--show-error",uri]
            if owned: args += ["-H","Authorization: Bearer "+os.environ["AILOOT_API_KEY"]]
            temporary=Path(f"image-{index}.bin")
            subprocess.run(args+["-o",str(temporary)],check=True)
            raw=temporary.read_bytes()
            temporary.unlink()
        else: raise SystemExit("Image has neither bytes nor URL")
        if not raw: raise SystemExit("Empty image result")
        ext="png" if raw.startswith(b"\x89PNG") else "jpg" if raw.startswith(b"\xff\xd8") else "webp" if raw[:4]==b"RIFF" and raw[8:12]==b"WEBP" else "svg" if raw.lstrip().startswith((b"<svg",b"<?xml")) else "bin"
        Path(f"image-{index}.{ext}").write_bytes(raw)
    print("Every returned image saved; complete response metadata retained")
save_images(json.loads(Path("result.json").read_text())["data"])
PY_RESULT
```

```python
from openai import OpenAI
import base64, json, os, subprocess
from pathlib import Path
from urllib.parse import urlsplit, urljoin

def save_images(items):
    if not items: raise SystemExit("No completed images; retain the full response")
    for index, item in enumerate(items):
        encoded=item.get("b64_json")
        uri=item.get("url", "")
        if not encoded and uri.startswith("data:image/"):
            header, separator, encoded=uri.partition(",")
            if not separator or ";base64" not in header: raise SystemExit("Unsupported image data URI")
        if encoded:
            raw=base64.b64decode(encoded,validate=True)
        elif uri:
            uri=urljoin("https://api.ailoot.ai",uri)
            parsed=urlsplit(uri)
            if parsed.scheme!="https" or not parsed.netloc or parsed.username or parsed.password:
                raise SystemExit("Invalid returned image URL")
            owned=parsed.netloc=="api.ailoot.ai" and parsed.path.startswith("/v1/media/assets/") and parsed.path.endswith("/content")
            args=["curl","--fail-with-body","--silent","--show-error",uri]
            if owned: args += ["-H","Authorization: Bearer "+os.environ["AILOOT_API_KEY"]]
            temporary=Path(f"image-{index}.bin")
            subprocess.run(args+["-o",str(temporary)],check=True)
            raw=temporary.read_bytes()
            temporary.unlink()
        else: raise SystemExit("Image has neither bytes nor URL")
        if not raw: raise SystemExit("Empty image result")
        ext="png" if raw.startswith(b"\x89PNG") else "jpg" if raw.startswith(b"\xff\xd8") else "webp" if raw[:4]==b"RIFF" and raw[8:12]==b"WEBP" else "svg" if raw.lstrip().startswith((b"<svg",b"<?xml")) else "bin"
        Path(f"image-{index}.{ext}").write_bytes(raw)
    print("Every returned image saved; complete response metadata retained")

f=Path(os.environ["AILOOT_PROMPT_FILE"])
if not f.is_file():raise SystemExit("Set your actual UTF-8 image brief file")
request={'model': 'gemini-3-pro-image', 'prompt': ''}
request["prompt"]=f.read_text(encoding="utf-8")
client=OpenAI(base_url="https://api.ailoot.ai/v1",api_key=os.environ["AILOOT_API_KEY"],max_retries=0)
result=client.images.generate(**request)
Path("sdk-result.txt").write_text(str(result),encoding="utf-8")
save_images([{"b64_json":getattr(item,"b64_json",None),"url":getattr(item,"url",None)} for item in result.data])
```

```js
import OpenAI from "openai";
import { readFileSync, writeFileSync } from "node:fs";
const key=process.env.AILOOT_API_KEY;
if(!key) throw new Error("Set your actual Ailoot API key");
const client=new OpenAI({baseURL:"https://api.ailoot.ai/v1",apiKey:key,maxRetries:0});
const request={"model": "gemini-3-pro-image", "prompt": ""};
if(!process.env.AILOOT_PROMPT_FILE)throw new Error("Set your actual UTF-8 image brief file");
request.prompt=readFileSync(process.env.AILOOT_PROMPT_FILE,"utf8");
const result=await client.images.generate(request);
writeFileSync("sdk-result.json",JSON.stringify(result,null,2));
if(!result.data?.length) throw new Error("No completed images");
for(let index=0;index<result.data.length;index++) {
  const item=result.data[index];let encoded=item.b64_json,uri=item.url||"",raw;
  if(!encoded && uri.startsWith("data:image/")) {
    const comma=uri.indexOf(",");if(comma<0 || !uri.slice(0,comma).includes(";base64")) throw new Error("Unsupported image data URI");
    encoded=uri.slice(comma+1);
  }
  if(encoded) {
    if(encoded.length%4!==0 || !/^[A-Za-z0-9+/]*={0,2}$/.test(encoded)) throw new Error("Invalid Base64");
    raw=Buffer.from(encoded,"base64");
  } else if(uri) {
    const u=new URL(uri,"https://api.ailoot.ai");
    if(u.protocol!=="https:" || u.username || u.password) throw new Error("Invalid returned URL");
    const owned=u.origin==="https://api.ailoot.ai" && u.pathname.startsWith("/v1/media/assets/") && u.pathname.endsWith("/content");
    const response=await fetch(u,{headers:owned?{Authorization:"Bearer "+key}:{},redirect:"manual"});
    if(!response.ok) throw new Error("Image content download failed: "+response.status);
    raw=Buffer.from(await response.arrayBuffer());
  } else throw new Error("Image has neither bytes nor URL");
  if(!raw.length) throw new Error("Empty image result");
  const ext=raw.subarray(0,4).equals(Buffer.from([137,80,78,71]))?"png":raw[0]===255&&raw[1]===216?"jpg":raw.toString("ascii",0,4)==="RIFF"&&raw.toString("ascii",8,12)==="WEBP"?"webp":raw.toString("utf8").trimStart().startsWith("<svg")||raw.toString("utf8").trimStart().startsWith("<?xml")?"svg":"bin";
  writeFileSync(`image-${index}.${ext}`,raw);
}
console.log("Every returned image saved; sdk-result.json retains complete metadata");
```

### Odbieranie i zapisywanie wyników

#### Ailoot · Obrazy

Pobierz każdy zwrócony obraz lub zapisz jego zawartość Base64

- `GET /v1/media/tasks/{task_id}`
- `GET /v1/media/assets/{asset_id}/content`
- `GET /v1/media/assets`
- `GET /v1/media/assets/{asset_id}`

##### Zachowaj wszystkie ukończone wyniki

Zapisz każdy ukończony obraz; pobierz każdy zwrócony URL lub zdekoduj zawartość Base64.

Zachowaj każdy element danych. Zdekoduj każdą wartość b64\_json lub pobierz dane z każdego zwróconego podpisanego adresu URL. Dobierz rozszerzenie nazwy pliku na podstawie rzeczywistego typu MIME lub bajtów.

##### Jeśli trzeba sprawdzić pierwotną odpowiedź

Jeśli wynik generowania lub edycji obrazu wymaga sprawdzenia, zachowaj pierwotny operation\_id/X-Client-Request-ID oraz zwrócone informacje o wyniku. Odzyskaj istniejące własne wyniki z biblioteki multimediów, używając rzeczywistych wartości task\_id lub asset\_id. Nie wysyłaj ponownie żądania generowania lub edycji ani nie twórz adresu URL do sprawdzania stanu na podstawie operation\_id.

Pola odpowiedzi

| Pole | Typ |
| --- | --- |
| Pole`created` | Typinteger |
| Pole`data[].url` | Typstring |
| Pole`data[].b64_json` | Typbase64 string |
| Pole`usage` | Typobject |

Błędy i dalsze kroki

| Odpowiedź | Warunek | Następny krok |
| --- | --- | --- |
| Odpowiedź400 · `invalid_request_error` | WarunekNieprawidłowe wymagane pola, sposób reprezentacji materiału lub wartość parametru | Następny krokPopraw wskazane pola przed nowym żądaniem utworzenia. |
| Odpowiedź`server_error` | WarunekZwrócona odpowiedź wskazuje, że operacja lub wynik wymaga sprawdzenia | Następny krokZachowaj pierwotnie zwrócony identyfikator operacji lub zadania, nagłówki żądania i odpowiedź; kontynuuj obsługiwane odczyty tej pierwotnej operacji. Nie wysyłaj ponownie żądania utworzenia. |

### Aliasy

#### Aliasy modelu

<strong>Ailoot</strong> [`gemini-3-pro-image`](https://ailoot.ai/models/pl/#m=google%2Fgemini-3-pro-image&route=Core&caller=gemini-3-pro-image&fmt=images), [`gemini-3-pro-image-preview`](https://ailoot.ai/models/pl/#m=google%2Fgemini-3-pro-image&route=Core&caller=gemini-3-pro-image-preview&fmt=images), [`nano-banana-pro`](https://ailoot.ai/models/pl/#m=google%2Fgemini-3-pro-image&route=Core&caller=nano-banana-pro&fmt=images)
**Ailoot Ultra** [`google/gemini-3-pro-image`](https://ailoot.ai/models/pl/#m=google%2Fgemini-3-pro-image&route=Ultra&caller=google%2Fgemini-3-pro-image&fmt=images)

#### Aliasy ścieżek metod

`/v1/images`

#### Powiązane ID modeli

[`google/gemini-3-pro-image`](https://ailoot.ai/models/pl/#m=google%2Fgemini-3-pro-image&route=Ultra&caller=google%2Fgemini-3-pro-image&fmt=images), [`gemini-3-pro-image-preview`](https://ailoot.ai/models/pl/#m=google%2Fgemini-3-pro-image&route=Core&caller=gemini-3-pro-image-preview&fmt=images), [`nano-banana-pro`](https://ailoot.ai/models/pl/#m=google%2Fgemini-3-pro-image&route=Core&caller=nano-banana-pro&fmt=images), [`gemini-3-pro-image`](https://ailoot.ai/models/pl/#m=google%2Fgemini-3-pro-image&route=Core&caller=gemini-3-pro-image&fmt=images)

**Ailoot · Obrazy** `POST /v1/images/generations` `gemini-3-pro-image-preview`

[`gemini-3-pro-image-preview`](https://ailoot.ai/models/pl/#m=google%2Fgemini-3-pro-image&route=Core&caller=gemini-3-pro-image-preview&fmt=images)

Google /`gemini-3-pro-image-preview`

ID modelu

- `gemini-3-pro-image`
- `gemini-3-pro-image-preview`
- `nano-banana-pro`

### Start

Nano Banana Pro (Gemini 3 Pro Image) to oparty na rozumowaniu model obrazowy Google do złożonych projektów, makiet produktów i wizualizacji faktograficznych. Przyjmuje tekst i referencje obrazowe oraz generuje obrazy z tekstem, z wyjściem 1K–4K i szczegółowym sterowaniem kreatywnym.

Akceptowane dane wejściowe

Tekst

Wyniki

Obrazy

### Dostępne w Ailoot · dane wejściowe i metody

**Ailoot · Obrazy** `POST /v1/images/generations`

Wejście

`text`

Wyjście

`image`

Kontekst

65 536 tokens

Maksymalny wynik

32 768 tokens

Format wyjściowy

Plik obrazu

| Pole | Typ | Wymaganie | Wartości i limity | Domyślnie |
| --- | --- | --- | --- | --- |
| Pole`model` | Typ`string` | WymaganieWymagane | Wartości i limity gemini-3-pro-image-preview | Domyślnie— |
| Pole`prompt` | Typ`string` | WymaganieWymagane | Wartości i limity Minimalna długość: 1 | Domyślnie— |
| Pole`n` | Typ`integer` | WymaganieOpcjonalne | Wartości i limity Minimum: 1 | Domyślnie1 |
| Pole`response_format` | Typ`string` | WymaganieOpcjonalne | Wartości i limity url, b64\_json | Domyślnie— |
| Pole`stream` | Typ`boolean` | WymaganieOpcjonalne | Wartości i limity | Domyślniefalse |
| Pole`size` | Typ`string` | WymaganieOpcjonalne | Wartości i limity Zależy od modelu | Domyślnie— |
| Pole`quality` | Typ`string` | WymaganieOpcjonalne | Wartości i limity Zależy od modelu | Domyślnie— |
| Pole`background` | Typ`string` | WymaganieOpcjonalne | Wartości i limity Zależy od modelu | Domyślnie— |
| Pole`output_format` | Typ`string` | WymaganieOpcjonalne | Wartości i limity Zależy od modelu | Domyślnie— |
| Pole`output_compression` | Typ`integer` | WymaganieOpcjonalne | Wartości i limity Zależy od modelu | Domyślnie— |
| Pole`moderation` | Typ`string` | WymaganieOpcjonalne | Wartości i limity Zależy od modelu | Domyślnie— |
| Pole`input_fidelity` | Typ`string` | WymaganieOpcjonalne | Wartości i limity Zależy od modelu | Domyślnie— |
| Pole`style` | Typ`string` | WymaganieOpcjonalne | Wartości i limity Zależy od modelu | Domyślnie— |
| Pole`partial_images` | Typ`integer` | WymaganieOpcjonalne | Wartości i limity Zależy od modelu | Domyślnie— |

Kombinacje materiałów wejściowych

**Tekst na obraz** · Wymagane: prompt

Parametry i cykl życia metody

| Parametr | Kontrakt |
| --- | --- |
| Parametr`material_types` | Kontrakttext |
| Parametr`required` | Kontraktmodel, prompt |
| Parametr`optional_controls` | Kontraktnull |
| Parametr`content_type` | Kontraktapplication/json |

Cykl życia: `synchronous_result_then_owned_library`

`GET /v1/media/tasks/{task_id}` · Rzeczywiście zwrócony task\_id lub wpis w bibliotece multimediów

`GET /v1/media/assets/{asset_id}/content`

`GET /v1/media/assets`

`GET /v1/media/assets/{asset_id}`

Struktury metod i ID są dokładne; możliwości dostawcy są odrębne od dopuszczenia żądania.

### Cennik

#### Stawki metod Ailoot

Wejście

0,002 USD */ 1K tokenów obrazu*

Wyjście

0,134 USD *za obraz o rozdzielczości 1K*

Wyjście

0,134 USD *za obraz o rozdzielczości 2K*

Wyjście

0,24 USD *za obraz o rozdzielczości 4K*

Ailoot rezerwuje szacowaną kwotę przed żądaniem. Po otrzymaniu wyniku rozlicza ostateczną opłatę według zmierzonego użycia. Rozliczenie strumieniowania korzysta z końcowego rekordu użycia. [Jak działają rezerwacja i rozliczenie →](https://ailoot.ai/docs/pl/billing/reserve/)

#### Szczegóły taryfy referencyjnej

Referencyjne tabele modelu nie zmieniają wyboru metody, wyceny ani opłat. Naliczane opłaty korzystają ze stawek wybranej metody Ailoot.

Referencyjne tabele modelu

#### Ceny według konfiguracji

| Konfiguracja | Tabela stawek | Opłata |
| --- | --- | --- |
| KonfiguracjaUltra | Tabela stawekStawka podstawowa | Opłata Wejście · Tokeny wejściowe **$0.004000** / 1K tokenów Wyjście · Tokeny wyjściowe **$0.024000** / 1K tokenów Wejście · obraz **$0.004000** / 1K tokenów Wyjście · obraz na wyjściu **$0.24000** / 1K tokenów Wejście · audio **$0.004000** / 1K tokenów Wejście · pamięć podręczna wejściowego audio **$0.0004000** / 1K tokenów Wyjście · wyszukiwanie w internecie **$0.028** za wyszukiwanie w sieci Wyjście · wewnętrzne rozumowanie **$0.024000** / 1K tokenów Wejście · Odczyt cache **$0.0004000** / 1K tokenów Wejście · Zapis do cache **$0.000750000** / 1K tokenów |

### Przykładowe żądania

#### Ailoot · Obrazy

curlPython SDKNode.js SDK

```bash
set -eu
: "${AILOOT_API_KEY:?Set your Ailoot API key}"
export AILOOT_API_KEY
export AILOOT_API_KEY
: "${AILOOT_PROMPT_FILE:?Set your actual UTF-8 image brief}"
export AILOOT_PROMPT_FILE
python3 - <<'PY_REQUEST'
import json,os
from pathlib import Path
p=json.loads('{"model": "gemini-3-pro-image-preview", "prompt": ""}')
f=Path(os.environ["AILOOT_PROMPT_FILE"])
if not f.is_file():raise SystemExit("Choose your actual UTF-8 brief")
p['prompt']=f.read_text(encoding="utf-8")
if not p['prompt'].strip():raise SystemExit("Brief must contain text")
Path("request.json").write_text(json.dumps(p,ensure_ascii=False))
PY_REQUEST
curl --fail-with-body --silent --show-error https://api.ailoot.ai/v1/images/generations \
  -H "Authorization: Bearer $AILOOT_API_KEY" -H 'Content-Type: application/json' \
  --data-binary @request.json -D response-headers.txt -o result.json
python3 - <<'PY_RESULT'
import base64, json, os, subprocess
from pathlib import Path
from urllib.parse import urlsplit, urljoin

def save_images(items):
    if not items: raise SystemExit("No completed images; retain the full response")
    for index, item in enumerate(items):
        encoded=item.get("b64_json")
        uri=item.get("url", "")
        if not encoded and uri.startswith("data:image/"):
            header, separator, encoded=uri.partition(",")
            if not separator or ";base64" not in header: raise SystemExit("Unsupported image data URI")
        if encoded:
            raw=base64.b64decode(encoded,validate=True)
        elif uri:
            uri=urljoin("https://api.ailoot.ai",uri)
            parsed=urlsplit(uri)
            if parsed.scheme!="https" or not parsed.netloc or parsed.username or parsed.password:
                raise SystemExit("Invalid returned image URL")
            owned=parsed.netloc=="api.ailoot.ai" and parsed.path.startswith("/v1/media/assets/") and parsed.path.endswith("/content")
            args=["curl","--fail-with-body","--silent","--show-error",uri]
            if owned: args += ["-H","Authorization: Bearer "+os.environ["AILOOT_API_KEY"]]
            temporary=Path(f"image-{index}.bin")
            subprocess.run(args+["-o",str(temporary)],check=True)
            raw=temporary.read_bytes()
            temporary.unlink()
        else: raise SystemExit("Image has neither bytes nor URL")
        if not raw: raise SystemExit("Empty image result")
        ext="png" if raw.startswith(b"\x89PNG") else "jpg" if raw.startswith(b"\xff\xd8") else "webp" if raw[:4]==b"RIFF" and raw[8:12]==b"WEBP" else "svg" if raw.lstrip().startswith((b"<svg",b"<?xml")) else "bin"
        Path(f"image-{index}.{ext}").write_bytes(raw)
    print("Every returned image saved; complete response metadata retained")
save_images(json.loads(Path("result.json").read_text())["data"])
PY_RESULT
```

```python
from openai import OpenAI
import base64, json, os, subprocess
from pathlib import Path
from urllib.parse import urlsplit, urljoin

def save_images(items):
    if not items: raise SystemExit("No completed images; retain the full response")
    for index, item in enumerate(items):
        encoded=item.get("b64_json")
        uri=item.get("url", "")
        if not encoded and uri.startswith("data:image/"):
            header, separator, encoded=uri.partition(",")
            if not separator or ";base64" not in header: raise SystemExit("Unsupported image data URI")
        if encoded:
            raw=base64.b64decode(encoded,validate=True)
        elif uri:
            uri=urljoin("https://api.ailoot.ai",uri)
            parsed=urlsplit(uri)
            if parsed.scheme!="https" or not parsed.netloc or parsed.username or parsed.password:
                raise SystemExit("Invalid returned image URL")
            owned=parsed.netloc=="api.ailoot.ai" and parsed.path.startswith("/v1/media/assets/") and parsed.path.endswith("/content")
            args=["curl","--fail-with-body","--silent","--show-error",uri]
            if owned: args += ["-H","Authorization: Bearer "+os.environ["AILOOT_API_KEY"]]
            temporary=Path(f"image-{index}.bin")
            subprocess.run(args+["-o",str(temporary)],check=True)
            raw=temporary.read_bytes()
            temporary.unlink()
        else: raise SystemExit("Image has neither bytes nor URL")
        if not raw: raise SystemExit("Empty image result")
        ext="png" if raw.startswith(b"\x89PNG") else "jpg" if raw.startswith(b"\xff\xd8") else "webp" if raw[:4]==b"RIFF" and raw[8:12]==b"WEBP" else "svg" if raw.lstrip().startswith((b"<svg",b"<?xml")) else "bin"
        Path(f"image-{index}.{ext}").write_bytes(raw)
    print("Every returned image saved; complete response metadata retained")

f=Path(os.environ["AILOOT_PROMPT_FILE"])
if not f.is_file():raise SystemExit("Set your actual UTF-8 image brief file")
request={'model': 'gemini-3-pro-image-preview', 'prompt': ''}
request["prompt"]=f.read_text(encoding="utf-8")
client=OpenAI(base_url="https://api.ailoot.ai/v1",api_key=os.environ["AILOOT_API_KEY"],max_retries=0)
result=client.images.generate(**request)
Path("sdk-result.txt").write_text(str(result),encoding="utf-8")
save_images([{"b64_json":getattr(item,"b64_json",None),"url":getattr(item,"url",None)} for item in result.data])
```

```js
import OpenAI from "openai";
import { readFileSync, writeFileSync } from "node:fs";
const key=process.env.AILOOT_API_KEY;
if(!key) throw new Error("Set your actual Ailoot API key");
const client=new OpenAI({baseURL:"https://api.ailoot.ai/v1",apiKey:key,maxRetries:0});
const request={"model": "gemini-3-pro-image-preview", "prompt": ""};
if(!process.env.AILOOT_PROMPT_FILE)throw new Error("Set your actual UTF-8 image brief file");
request.prompt=readFileSync(process.env.AILOOT_PROMPT_FILE,"utf8");
const result=await client.images.generate(request);
writeFileSync("sdk-result.json",JSON.stringify(result,null,2));
if(!result.data?.length) throw new Error("No completed images");
for(let index=0;index<result.data.length;index++) {
  const item=result.data[index];let encoded=item.b64_json,uri=item.url||"",raw;
  if(!encoded && uri.startsWith("data:image/")) {
    const comma=uri.indexOf(",");if(comma<0 || !uri.slice(0,comma).includes(";base64")) throw new Error("Unsupported image data URI");
    encoded=uri.slice(comma+1);
  }
  if(encoded) {
    if(encoded.length%4!==0 || !/^[A-Za-z0-9+/]*={0,2}$/.test(encoded)) throw new Error("Invalid Base64");
    raw=Buffer.from(encoded,"base64");
  } else if(uri) {
    const u=new URL(uri,"https://api.ailoot.ai");
    if(u.protocol!=="https:" || u.username || u.password) throw new Error("Invalid returned URL");
    const owned=u.origin==="https://api.ailoot.ai" && u.pathname.startsWith("/v1/media/assets/") && u.pathname.endsWith("/content");
    const response=await fetch(u,{headers:owned?{Authorization:"Bearer "+key}:{},redirect:"manual"});
    if(!response.ok) throw new Error("Image content download failed: "+response.status);
    raw=Buffer.from(await response.arrayBuffer());
  } else throw new Error("Image has neither bytes nor URL");
  if(!raw.length) throw new Error("Empty image result");
  const ext=raw.subarray(0,4).equals(Buffer.from([137,80,78,71]))?"png":raw[0]===255&&raw[1]===216?"jpg":raw.toString("ascii",0,4)==="RIFF"&&raw.toString("ascii",8,12)==="WEBP"?"webp":raw.toString("utf8").trimStart().startsWith("<svg")||raw.toString("utf8").trimStart().startsWith("<?xml")?"svg":"bin";
  writeFileSync(`image-${index}.${ext}`,raw);
}
console.log("Every returned image saved; sdk-result.json retains complete metadata");
```

### Odbieranie i zapisywanie wyników

#### Ailoot · Obrazy

Pobierz każdy zwrócony obraz lub zapisz jego zawartość Base64

- `GET /v1/media/tasks/{task_id}`
- `GET /v1/media/assets/{asset_id}/content`
- `GET /v1/media/assets`
- `GET /v1/media/assets/{asset_id}`

##### Zachowaj wszystkie ukończone wyniki

Zapisz każdy ukończony obraz; pobierz każdy zwrócony URL lub zdekoduj zawartość Base64.

Zachowaj każdy element danych. Zdekoduj każdą wartość b64\_json lub pobierz dane z każdego zwróconego podpisanego adresu URL. Dobierz rozszerzenie nazwy pliku na podstawie rzeczywistego typu MIME lub bajtów.

##### Jeśli trzeba sprawdzić pierwotną odpowiedź

Jeśli wynik generowania lub edycji obrazu wymaga sprawdzenia, zachowaj pierwotny operation\_id/X-Client-Request-ID oraz zwrócone informacje o wyniku. Odzyskaj istniejące własne wyniki z biblioteki multimediów, używając rzeczywistych wartości task\_id lub asset\_id. Nie wysyłaj ponownie żądania generowania lub edycji ani nie twórz adresu URL do sprawdzania stanu na podstawie operation\_id.

Pola odpowiedzi

| Pole | Typ |
| --- | --- |
| Pole`created` | Typinteger |
| Pole`data[].url` | Typstring |
| Pole`data[].b64_json` | Typbase64 string |
| Pole`usage` | Typobject |

Błędy i dalsze kroki

| Odpowiedź | Warunek | Następny krok |
| --- | --- | --- |
| Odpowiedź400 · `invalid_request_error` | WarunekNieprawidłowe wymagane pola, sposób reprezentacji materiału lub wartość parametru | Następny krokPopraw wskazane pola przed nowym żądaniem utworzenia. |
| Odpowiedź`server_error` | WarunekZwrócona odpowiedź wskazuje, że operacja lub wynik wymaga sprawdzenia | Następny krokZachowaj pierwotnie zwrócony identyfikator operacji lub zadania, nagłówki żądania i odpowiedź; kontynuuj obsługiwane odczyty tej pierwotnej operacji. Nie wysyłaj ponownie żądania utworzenia. |

### Aliasy

#### Aliasy modelu

<strong>Ailoot</strong> [`gemini-3-pro-image`](https://ailoot.ai/models/pl/#m=google%2Fgemini-3-pro-image&route=Core&caller=gemini-3-pro-image&fmt=images), [`gemini-3-pro-image-preview`](https://ailoot.ai/models/pl/#m=google%2Fgemini-3-pro-image&route=Core&caller=gemini-3-pro-image-preview&fmt=images), [`nano-banana-pro`](https://ailoot.ai/models/pl/#m=google%2Fgemini-3-pro-image&route=Core&caller=nano-banana-pro&fmt=images)
**Ailoot Ultra** [`google/gemini-3-pro-image`](https://ailoot.ai/models/pl/#m=google%2Fgemini-3-pro-image&route=Ultra&caller=google%2Fgemini-3-pro-image&fmt=images)

#### Aliasy ścieżek metod

`/v1/images`

#### Powiązane ID modeli

[`google/gemini-3-pro-image`](https://ailoot.ai/models/pl/#m=google%2Fgemini-3-pro-image&route=Ultra&caller=google%2Fgemini-3-pro-image&fmt=images), [`gemini-3-pro-image-preview`](https://ailoot.ai/models/pl/#m=google%2Fgemini-3-pro-image&route=Core&caller=gemini-3-pro-image-preview&fmt=images), [`nano-banana-pro`](https://ailoot.ai/models/pl/#m=google%2Fgemini-3-pro-image&route=Core&caller=nano-banana-pro&fmt=images), [`gemini-3-pro-image`](https://ailoot.ai/models/pl/#m=google%2Fgemini-3-pro-image&route=Core&caller=gemini-3-pro-image&fmt=images)

**Ailoot · Obrazy** `POST /v1/images/generations` `nano-banana-pro`

[`nano-banana-pro`](https://ailoot.ai/models/pl/#m=google%2Fgemini-3-pro-image&route=Core&caller=nano-banana-pro&fmt=images)

Google /`nano-banana-pro`

ID modelu

- `gemini-3-pro-image`
- `gemini-3-pro-image-preview`
- `nano-banana-pro`

### Start

Nano Banana Pro (Gemini 3 Pro Image) to oparty na rozumowaniu model obrazowy Google do złożonych projektów, makiet produktów i wizualizacji faktograficznych. Przyjmuje tekst i referencje obrazowe oraz generuje obrazy z tekstem, z wyjściem 1K–4K i szczegółowym sterowaniem kreatywnym.

Akceptowane dane wejściowe

Tekst

Wyniki

Obrazy

### Dostępne w Ailoot · dane wejściowe i metody

**Ailoot · Obrazy** `POST /v1/images/generations`

Wejście

`text`

Wyjście

`image`

Kontekst

65 536 tokens

Maksymalny wynik

32 768 tokens

Format wyjściowy

Plik obrazu

| Pole | Typ | Wymaganie | Wartości i limity | Domyślnie |
| --- | --- | --- | --- | --- |
| Pole`model` | Typ`string` | WymaganieWymagane | Wartości i limity nano-banana-pro | Domyślnie— |
| Pole`prompt` | Typ`string` | WymaganieWymagane | Wartości i limity Minimalna długość: 1 | Domyślnie— |
| Pole`n` | Typ`integer` | WymaganieOpcjonalne | Wartości i limity Minimum: 1 | Domyślnie1 |
| Pole`response_format` | Typ`string` | WymaganieOpcjonalne | Wartości i limity url, b64\_json | Domyślnie— |
| Pole`stream` | Typ`boolean` | WymaganieOpcjonalne | Wartości i limity | Domyślniefalse |
| Pole`size` | Typ`string` | WymaganieOpcjonalne | Wartości i limity Zależy od modelu | Domyślnie— |
| Pole`quality` | Typ`string` | WymaganieOpcjonalne | Wartości i limity Zależy od modelu | Domyślnie— |
| Pole`background` | Typ`string` | WymaganieOpcjonalne | Wartości i limity Zależy od modelu | Domyślnie— |
| Pole`output_format` | Typ`string` | WymaganieOpcjonalne | Wartości i limity Zależy od modelu | Domyślnie— |
| Pole`output_compression` | Typ`integer` | WymaganieOpcjonalne | Wartości i limity Zależy od modelu | Domyślnie— |
| Pole`moderation` | Typ`string` | WymaganieOpcjonalne | Wartości i limity Zależy od modelu | Domyślnie— |
| Pole`input_fidelity` | Typ`string` | WymaganieOpcjonalne | Wartości i limity Zależy od modelu | Domyślnie— |
| Pole`style` | Typ`string` | WymaganieOpcjonalne | Wartości i limity Zależy od modelu | Domyślnie— |
| Pole`partial_images` | Typ`integer` | WymaganieOpcjonalne | Wartości i limity Zależy od modelu | Domyślnie— |

Kombinacje materiałów wejściowych

**Tekst na obraz** · Wymagane: prompt

Parametry i cykl życia metody

| Parametr | Kontrakt |
| --- | --- |
| Parametr`material_types` | Kontrakttext |
| Parametr`required` | Kontraktmodel, prompt |
| Parametr`optional_controls` | Kontraktnull |
| Parametr`content_type` | Kontraktapplication/json |

Cykl życia: `synchronous_result_then_owned_library`

`GET /v1/media/tasks/{task_id}` · Rzeczywiście zwrócony task\_id lub wpis w bibliotece multimediów

`GET /v1/media/assets/{asset_id}/content`

`GET /v1/media/assets`

`GET /v1/media/assets/{asset_id}`

Struktury metod i ID są dokładne; możliwości dostawcy są odrębne od dopuszczenia żądania.

### Cennik

#### Stawki metod Ailoot

Wejście

0,002 USD */ 1K tokenów obrazu*

Wyjście

0,134 USD *za obraz o rozdzielczości 1K*

Wyjście

0,134 USD *za obraz o rozdzielczości 2K*

Wyjście

0,24 USD *za obraz o rozdzielczości 4K*

Ailoot rezerwuje szacowaną kwotę przed żądaniem. Po otrzymaniu wyniku rozlicza ostateczną opłatę według zmierzonego użycia. Rozliczenie strumieniowania korzysta z końcowego rekordu użycia. [Jak działają rezerwacja i rozliczenie →](https://ailoot.ai/docs/pl/billing/reserve/)

#### Szczegóły taryfy referencyjnej

Referencyjne tabele modelu nie zmieniają wyboru metody, wyceny ani opłat. Naliczane opłaty korzystają ze stawek wybranej metody Ailoot.

Referencyjne tabele modelu

#### Ceny według konfiguracji

| Konfiguracja | Tabela stawek | Opłata |
| --- | --- | --- |
| KonfiguracjaUltra | Tabela stawekStawka podstawowa | Opłata Wejście · Tokeny wejściowe **$0.004000** / 1K tokenów Wyjście · Tokeny wyjściowe **$0.024000** / 1K tokenów Wejście · obraz **$0.004000** / 1K tokenów Wyjście · obraz na wyjściu **$0.24000** / 1K tokenów Wejście · audio **$0.004000** / 1K tokenów Wejście · pamięć podręczna wejściowego audio **$0.0004000** / 1K tokenów Wyjście · wyszukiwanie w internecie **$0.028** za wyszukiwanie w sieci Wyjście · wewnętrzne rozumowanie **$0.024000** / 1K tokenów Wejście · Odczyt cache **$0.0004000** / 1K tokenów Wejście · Zapis do cache **$0.000750000** / 1K tokenów |

### Przykładowe żądania

#### Ailoot · Obrazy

curlPython SDKNode.js SDK

```bash
set -eu
: "${AILOOT_API_KEY:?Set your Ailoot API key}"
export AILOOT_API_KEY
export AILOOT_API_KEY
: "${AILOOT_PROMPT_FILE:?Set your actual UTF-8 image brief}"
export AILOOT_PROMPT_FILE
python3 - <<'PY_REQUEST'
import json,os
from pathlib import Path
p=json.loads('{"model": "nano-banana-pro", "prompt": ""}')
f=Path(os.environ["AILOOT_PROMPT_FILE"])
if not f.is_file():raise SystemExit("Choose your actual UTF-8 brief")
p['prompt']=f.read_text(encoding="utf-8")
if not p['prompt'].strip():raise SystemExit("Brief must contain text")
Path("request.json").write_text(json.dumps(p,ensure_ascii=False))
PY_REQUEST
curl --fail-with-body --silent --show-error https://api.ailoot.ai/v1/images/generations \
  -H "Authorization: Bearer $AILOOT_API_KEY" -H 'Content-Type: application/json' \
  --data-binary @request.json -D response-headers.txt -o result.json
python3 - <<'PY_RESULT'
import base64, json, os, subprocess
from pathlib import Path
from urllib.parse import urlsplit, urljoin

def save_images(items):
    if not items: raise SystemExit("No completed images; retain the full response")
    for index, item in enumerate(items):
        encoded=item.get("b64_json")
        uri=item.get("url", "")
        if not encoded and uri.startswith("data:image/"):
            header, separator, encoded=uri.partition(",")
            if not separator or ";base64" not in header: raise SystemExit("Unsupported image data URI")
        if encoded:
            raw=base64.b64decode(encoded,validate=True)
        elif uri:
            uri=urljoin("https://api.ailoot.ai",uri)
            parsed=urlsplit(uri)
            if parsed.scheme!="https" or not parsed.netloc or parsed.username or parsed.password:
                raise SystemExit("Invalid returned image URL")
            owned=parsed.netloc=="api.ailoot.ai" and parsed.path.startswith("/v1/media/assets/") and parsed.path.endswith("/content")
            args=["curl","--fail-with-body","--silent","--show-error",uri]
            if owned: args += ["-H","Authorization: Bearer "+os.environ["AILOOT_API_KEY"]]
            temporary=Path(f"image-{index}.bin")
            subprocess.run(args+["-o",str(temporary)],check=True)
            raw=temporary.read_bytes()
            temporary.unlink()
        else: raise SystemExit("Image has neither bytes nor URL")
        if not raw: raise SystemExit("Empty image result")
        ext="png" if raw.startswith(b"\x89PNG") else "jpg" if raw.startswith(b"\xff\xd8") else "webp" if raw[:4]==b"RIFF" and raw[8:12]==b"WEBP" else "svg" if raw.lstrip().startswith((b"<svg",b"<?xml")) else "bin"
        Path(f"image-{index}.{ext}").write_bytes(raw)
    print("Every returned image saved; complete response metadata retained")
save_images(json.loads(Path("result.json").read_text())["data"])
PY_RESULT
```

```python
from openai import OpenAI
import base64, json, os, subprocess
from pathlib import Path
from urllib.parse import urlsplit, urljoin

def save_images(items):
    if not items: raise SystemExit("No completed images; retain the full response")
    for index, item in enumerate(items):
        encoded=item.get("b64_json")
        uri=item.get("url", "")
        if not encoded and uri.startswith("data:image/"):
            header, separator, encoded=uri.partition(",")
            if not separator or ";base64" not in header: raise SystemExit("Unsupported image data URI")
        if encoded:
            raw=base64.b64decode(encoded,validate=True)
        elif uri:
            uri=urljoin("https://api.ailoot.ai",uri)
            parsed=urlsplit(uri)
            if parsed.scheme!="https" or not parsed.netloc or parsed.username or parsed.password:
                raise SystemExit("Invalid returned image URL")
            owned=parsed.netloc=="api.ailoot.ai" and parsed.path.startswith("/v1/media/assets/") and parsed.path.endswith("/content")
            args=["curl","--fail-with-body","--silent","--show-error",uri]
            if owned: args += ["-H","Authorization: Bearer "+os.environ["AILOOT_API_KEY"]]
            temporary=Path(f"image-{index}.bin")
            subprocess.run(args+["-o",str(temporary)],check=True)
            raw=temporary.read_bytes()
            temporary.unlink()
        else: raise SystemExit("Image has neither bytes nor URL")
        if not raw: raise SystemExit("Empty image result")
        ext="png" if raw.startswith(b"\x89PNG") else "jpg" if raw.startswith(b"\xff\xd8") else "webp" if raw[:4]==b"RIFF" and raw[8:12]==b"WEBP" else "svg" if raw.lstrip().startswith((b"<svg",b"<?xml")) else "bin"
        Path(f"image-{index}.{ext}").write_bytes(raw)
    print("Every returned image saved; complete response metadata retained")

f=Path(os.environ["AILOOT_PROMPT_FILE"])
if not f.is_file():raise SystemExit("Set your actual UTF-8 image brief file")
request={'model': 'nano-banana-pro', 'prompt': ''}
request["prompt"]=f.read_text(encoding="utf-8")
client=OpenAI(base_url="https://api.ailoot.ai/v1",api_key=os.environ["AILOOT_API_KEY"],max_retries=0)
result=client.images.generate(**request)
Path("sdk-result.txt").write_text(str(result),encoding="utf-8")
save_images([{"b64_json":getattr(item,"b64_json",None),"url":getattr(item,"url",None)} for item in result.data])
```

```js
import OpenAI from "openai";
import { readFileSync, writeFileSync } from "node:fs";
const key=process.env.AILOOT_API_KEY;
if(!key) throw new Error("Set your actual Ailoot API key");
const client=new OpenAI({baseURL:"https://api.ailoot.ai/v1",apiKey:key,maxRetries:0});
const request={"model": "nano-banana-pro", "prompt": ""};
if(!process.env.AILOOT_PROMPT_FILE)throw new Error("Set your actual UTF-8 image brief file");
request.prompt=readFileSync(process.env.AILOOT_PROMPT_FILE,"utf8");
const result=await client.images.generate(request);
writeFileSync("sdk-result.json",JSON.stringify(result,null,2));
if(!result.data?.length) throw new Error("No completed images");
for(let index=0;index<result.data.length;index++) {
  const item=result.data[index];let encoded=item.b64_json,uri=item.url||"",raw;
  if(!encoded && uri.startsWith("data:image/")) {
    const comma=uri.indexOf(",");if(comma<0 || !uri.slice(0,comma).includes(";base64")) throw new Error("Unsupported image data URI");
    encoded=uri.slice(comma+1);
  }
  if(encoded) {
    if(encoded.length%4!==0 || !/^[A-Za-z0-9+/]*={0,2}$/.test(encoded)) throw new Error("Invalid Base64");
    raw=Buffer.from(encoded,"base64");
  } else if(uri) {
    const u=new URL(uri,"https://api.ailoot.ai");
    if(u.protocol!=="https:" || u.username || u.password) throw new Error("Invalid returned URL");
    const owned=u.origin==="https://api.ailoot.ai" && u.pathname.startsWith("/v1/media/assets/") && u.pathname.endsWith("/content");
    const response=await fetch(u,{headers:owned?{Authorization:"Bearer "+key}:{},redirect:"manual"});
    if(!response.ok) throw new Error("Image content download failed: "+response.status);
    raw=Buffer.from(await response.arrayBuffer());
  } else throw new Error("Image has neither bytes nor URL");
  if(!raw.length) throw new Error("Empty image result");
  const ext=raw.subarray(0,4).equals(Buffer.from([137,80,78,71]))?"png":raw[0]===255&&raw[1]===216?"jpg":raw.toString("ascii",0,4)==="RIFF"&&raw.toString("ascii",8,12)==="WEBP"?"webp":raw.toString("utf8").trimStart().startsWith("<svg")||raw.toString("utf8").trimStart().startsWith("<?xml")?"svg":"bin";
  writeFileSync(`image-${index}.${ext}`,raw);
}
console.log("Every returned image saved; sdk-result.json retains complete metadata");
```

### Odbieranie i zapisywanie wyników

#### Ailoot · Obrazy

Pobierz każdy zwrócony obraz lub zapisz jego zawartość Base64

- `GET /v1/media/tasks/{task_id}`
- `GET /v1/media/assets/{asset_id}/content`
- `GET /v1/media/assets`
- `GET /v1/media/assets/{asset_id}`

##### Zachowaj wszystkie ukończone wyniki

Zapisz każdy ukończony obraz; pobierz każdy zwrócony URL lub zdekoduj zawartość Base64.

Zachowaj każdy element danych. Zdekoduj każdą wartość b64\_json lub pobierz dane z każdego zwróconego podpisanego adresu URL. Dobierz rozszerzenie nazwy pliku na podstawie rzeczywistego typu MIME lub bajtów.

##### Jeśli trzeba sprawdzić pierwotną odpowiedź

Jeśli wynik generowania lub edycji obrazu wymaga sprawdzenia, zachowaj pierwotny operation\_id/X-Client-Request-ID oraz zwrócone informacje o wyniku. Odzyskaj istniejące własne wyniki z biblioteki multimediów, używając rzeczywistych wartości task\_id lub asset\_id. Nie wysyłaj ponownie żądania generowania lub edycji ani nie twórz adresu URL do sprawdzania stanu na podstawie operation\_id.

Pola odpowiedzi

| Pole | Typ |
| --- | --- |
| Pole`created` | Typinteger |
| Pole`data[].url` | Typstring |
| Pole`data[].b64_json` | Typbase64 string |
| Pole`usage` | Typobject |

Błędy i dalsze kroki

| Odpowiedź | Warunek | Następny krok |
| --- | --- | --- |
| Odpowiedź400 · `invalid_request_error` | WarunekNieprawidłowe wymagane pola, sposób reprezentacji materiału lub wartość parametru | Następny krokPopraw wskazane pola przed nowym żądaniem utworzenia. |
| Odpowiedź`server_error` | WarunekZwrócona odpowiedź wskazuje, że operacja lub wynik wymaga sprawdzenia | Następny krokZachowaj pierwotnie zwrócony identyfikator operacji lub zadania, nagłówki żądania i odpowiedź; kontynuuj obsługiwane odczyty tej pierwotnej operacji. Nie wysyłaj ponownie żądania utworzenia. |

### Aliasy

#### Aliasy modelu

<strong>Ailoot</strong> [`gemini-3-pro-image`](https://ailoot.ai/models/pl/#m=google%2Fgemini-3-pro-image&route=Core&caller=gemini-3-pro-image&fmt=images), [`gemini-3-pro-image-preview`](https://ailoot.ai/models/pl/#m=google%2Fgemini-3-pro-image&route=Core&caller=gemini-3-pro-image-preview&fmt=images), [`nano-banana-pro`](https://ailoot.ai/models/pl/#m=google%2Fgemini-3-pro-image&route=Core&caller=nano-banana-pro&fmt=images)
**Ailoot Ultra** [`google/gemini-3-pro-image`](https://ailoot.ai/models/pl/#m=google%2Fgemini-3-pro-image&route=Ultra&caller=google%2Fgemini-3-pro-image&fmt=images)

#### Aliasy ścieżek metod

`/v1/images`

#### Powiązane ID modeli

[`google/gemini-3-pro-image`](https://ailoot.ai/models/pl/#m=google%2Fgemini-3-pro-image&route=Ultra&caller=google%2Fgemini-3-pro-image&fmt=images), [`gemini-3-pro-image-preview`](https://ailoot.ai/models/pl/#m=google%2Fgemini-3-pro-image&route=Core&caller=gemini-3-pro-image-preview&fmt=images), [`nano-banana-pro`](https://ailoot.ai/models/pl/#m=google%2Fgemini-3-pro-image&route=Core&caller=nano-banana-pro&fmt=images), [`gemini-3-pro-image`](https://ailoot.ai/models/pl/#m=google%2Fgemini-3-pro-image&route=Core&caller=gemini-3-pro-image&fmt=images)

**Ailoot Ultra · OpenAI Chat** `POST /v1/chat/completions` `google/gemini-3-pro-image`

[`google/gemini-3-pro-image`](https://ailoot.ai/models/pl/#m=google%2Fgemini-3-pro-image&route=Ultra&caller=google%2Fgemini-3-pro-image&fmt=chat)

Google /`google/gemini-3-pro-image`

### Start

Nano Banana Pro (Gemini 3 Pro Image) to oparty na rozumowaniu model obrazowy Google do złożonych projektów, makiet produktów i wizualizacji faktograficznych. Przyjmuje tekst i referencje obrazowe oraz generuje obrazy z tekstem, z wyjściem 1K–4K i szczegółowym sterowaniem kreatywnym.

Akceptowane dane wejściowe

Tekst

Wyniki

Tekst

### Dostępne w Ailoot · dane wejściowe i metody

**Ailoot Ultra · OpenAI Chat** `POST /v1/chat/completions`

Wejście

`text`

Wyjście

`text`

Format wyjściowy

json lub SSE

| Pole | Typ | Wymaganie | Wartości i limity | Domyślnie |
| --- | --- | --- | --- | --- |
| Pole`model` | Typ`string` | WymaganieWymagane | Wartości i limity google/gemini-3-pro-image | Domyślnie— |
| Pole`messages` | Typ`message[]` | WymaganieWymagane | Wartości i limity Minimalna liczba elementów: 1 | Domyślnie— |
| Pole`messages[].role` | Typ`string` | WymaganieWymagane | Wartości i limity Przykłady: system, user, assistant, tool, function Warunki: Te role są jawnie reprezentowane przez typy zgodności w kodzie źródłowym; dokładny zestaw ról pozostaje właściwy dla danego modelu. Zależy od modelu | Domyślnie— |
| Pole`messages[].content` | Typ`string\|content_part[]\|null` | WymaganieOpcjonalne | Wartości i limity | Domyślnie— |
| Pole`messages[].tool_calls` | Typ`tool_call[]` | WymaganieOpcjonalne | Wartości i limity | Domyślnie— |
| Pole`messages[].tool_call_id` | Typ`string` | WymaganieOpcjonalne | Wartości i limity Obowiązuje, gdy: role=tool; użyj rzeczywiście zwróconego ID | Domyślnie— |
| Pole`messages[].name` | Typ`string` | WymaganieOpcjonalne | Wartości i limity | Domyślnie— |
| Pole`messages[].reasoning_content` | Typ`string` | WymaganieOpcjonalne | Wartości i limity Obowiązuje, gdy: Przekazuj z powrotem rzeczywiście zwróconą treść rozumowania, gdy ten model jej używa | Domyślnie— |
| Pole`messages[].reasoning_details` | Typ`object\|array` | WymaganieOpcjonalne | Wartości i limity Zależy od modelu | Domyślnie— |
| Pole`max_tokens` | Typ`integer` | WymaganieOpcjonalne | Wartości i limity Minimum: 1 Zależy od modelu | Domyślnie— |
| Pole`max_completion_tokens` | Typ`integer` | WymaganieOpcjonalne | Wartości i limity Minimum: 1 Zależy od modelu | Domyślnie— |
| Pole`stream` | Typ`boolean` | WymaganieOpcjonalne | Wartości i limity | Domyślniefalse |
| Pole`stream_options.include_usage` | Typ`boolean` | WymaganieOpcjonalne | Wartości i limity Zależy od modelu | Domyślnie— |
| Pole`temperature` | Typ`number` | WymaganieOpcjonalne | Wartości i limity Zależy od modelu | Domyślnie— |
| Pole`top_p` | Typ`number` | WymaganieOpcjonalne | Wartości i limity Zależy od modelu | Domyślnie— |
| Pole`stop` | Typ`string\|string[]` | WymaganieOpcjonalne | Wartości i limity Zależy od modelu | Domyślnie— |
| Pole`tools` | Typ`function_tool[]` | WymaganieOpcjonalne | Wartości i limity Zależy od modelu | Domyślnie— |
| Pole`tools[].type` | Typ`string` | WymaganieOpcjonalne | Wartości i limity function Zależy od modelu | Domyślnie— |
| Pole`tools[].function.name` | Typ`string` | WymaganieWymagane | Wartości i limity Obowiązuje, gdy: udostępnione narzędzie funkcji | Domyślnie— |
| Pole`tools[].function.description` | Typ`string` | WymaganieOpcjonalne | Wartości i limity | Domyślnie— |
| Pole`tools[].function.parameters` | Typ`JSON_schema` | WymaganieOpcjonalne | Wartości i limity | Domyślnie— |
| Pole`tool_choice` | Typ`string\|object` | WymaganieOpcjonalne | Wartości i limity Zależy od modelu | Domyślnie— |
| Pole`parallel_tool_calls` | Typ`boolean` | WymaganieOpcjonalne | Wartości i limity Zależy od modelu | Domyślnie— |
| Pole`response_format` | Typ`object` | WymaganieOpcjonalne | Wartości i limity Zależy od modelu | Domyślnie— |
| Pole`reasoning_effort` | Typ`string` | WymaganieOpcjonalne | Wartości i limity Zależy od modelu | Domyślnie— |
| Pole`reasoning` | Typ`object` | WymaganieOpcjonalne | Wartości i limity Zależy od modelu | Domyślnie— |
| Pole`service_tier` | Typ`string` | WymaganieOpcjonalne | Wartości i limity Zależy od modelu | Domyślnie— |
| Pole`instructions` | Typ`string` | WymaganieOpcjonalne | Wartości i limity Pole zgodności | Domyślnie— |
| Pole`functions` | Typ`function[]` | WymaganieOpcjonalne | Wartości i limity Zależy od modelu | Domyślnie— |
| Pole`function_call` | Typ`string\|object` | WymaganieOpcjonalne | Wartości i limity Zależy od modelu | Domyślnie— |
| Pole`prompt_cache_options` | Typ`object` | WymaganieOpcjonalne | Wartości i limity Zależy od modelu | Domyślnie— |
| Pole`modalities` | Typ`string[]` | WymaganieOpcjonalne | Wartości i limity text | Domyślnie— |
| Pole`provider` | Typ`object` | WymaganieOpcjonalne | Wartości i limity Warunki: provider.options jest odrzucane na tej tekstowej trasie Ultra | Domyślnie— |
| Pole`cache_control.ttl` | Typ`string` | WymaganieOpcjonalne | Wartości i limity Warunki: 1h jest odrzucane w rzeczywistych miejscach pamięci podręcznej promptów | Domyślnie— |

Kombinacje materiałów wejściowych

**Tekst** · tekst UTF8

`messages[].content`

Parametry i cykl życia metody

| Parametr | Kontrakt |
| --- | --- |
| Parametr`content_type` | Kontraktapplication/json |
| Parametr`required` | Kontraktmodel, messages |
| Parametr`material_types` | Kontrakttext |
| Parametr`messages` | Kontrakttablica wiadomości o strukturze role/content |
| Parametr`file_material` | Kontraktrzeczywisty dokument UTF-8 wstawiony jako dosłowny tekst; bez wywnioskowanego ID pliku |
| Parametr`optional_controls` | Kontraktstream, temperature, top\_p, stop, max\_tokens, max\_completion\_tokens, reasoning, response\_format, tools, tool\_choice |
| Parametr`control_scope` | Kontraktwłaściwe dla modelu; narzędzia funkcji użytkownika różnią się od narzędzi hostowanych |
| Parametr`output_modalities` | Kontrakttext |
| Parametr`hosted_operations` | Kontraktfalse |
| Parametr`multimodal_input_binding` | Kontraktnull |

Cykl życia: `synchronous_or_streamed`

Wyślij dokładne ID modelu wraz z messages.

Długość kontekstu nie jest limitem wyjścia.

Plik tekstowy może dostarczyć dosłowny tekst; wejścia obrazowe/dźwiękowe/obiekty plików wymagają dokładnego powiązania.

### Cennik

Informacje taryfowe nie dodają opcji żądania. Obsługiwane parametry podano przy wybranej metodzie.

Tryb szybki

Stawka standardowa Gdy wybrany jest tryb szybki

Tryb flex

Stawka standardowa Gdy wybrany jest tryb flex

Maksymalna intensywność rozumowania

Stawka standardowa Gdy dla maksymalnej intensywności rozumowania stosowana jest domyślna korekta (default)

Wycena jawnej pamięci podręcznej

Niewłączone Gdy zażądano jawnej pamięci podręcznej

#### Stawki Ailoot

#### Ceny według konfiguracji

Dopasuj każdą opłatę do pokazanych warunków. Użyj jednej stawki dla każdego zestawu alternatywnych konfiguracji.

| Konfiguracja | Tabela stawek | Tokeny kontekstu, więcej niż | Tokeny kontekstu, do podanej wartości włącznie | Opłata |
| --- | --- | --- | --- | --- |
| KonfiguracjaPodstawowe stawki za tokeny | Tabela stawekStawka podstawowa | Tokeny kontekstu, więcej niż— | Tokeny kontekstu, do podanej wartości włącznieBez górnej granicy | Opłata Wejście · Tokeny wejściowe **$0.004** / 1K tokenów Wyjście · Tokeny wyjściowe **$0.024** / 1K tokenów Wejście · Odczyt cache **$0.0004** / 1K tokenów Wejście · Zapis do cache **$0.00075** / 1K tokenów Wejście · Zapis do cache, 1 godz. **—** / 1K tokenów Wyjście · Tokeny obrazu wyjściowego **$0.24** / 1K tokenów obrazu |
| KonfiguracjaPrzedział długości żądania 1 | Tabela stawek— | Tokeny kontekstu, więcej niż0 | Tokeny kontekstu, do podanej wartości włącznieBez górnej granicy | Opłata Wejście · Tokeny wejściowe **$0.004** / 1K tokenów Wyjście · Tokeny wyjściowe **$0.024** / 1K tokenów Wejście · Odczyt cache **$0.0004** / 1K tokenów Wejście · Zapis do cache **$0.00075** / 1K tokenów Wejście · Zapis do cache, 1 godz. **—** / 1K tokenów |

#### Szczegóły taryfy referencyjnej

Referencyjne tabele modelu nie zmieniają wyboru metody, wyceny ani opłat. Naliczane opłaty korzystają ze stawek wybranej metody Ailoot.

Google: Nano Banana Pro (Gemini 3 Pro Image)

#### Ceny według konfiguracji

| Konfiguracja | Warunki rozliczania | Opłata |
| --- | --- | --- |
| KonfiguracjaGoogle: Nano Banana Pro (Gemini 3 Pro Image) · Domyślna konfiguracja | Warunki rozliczaniaKonfiguracja domyślna | Opłata Wejście · Tokeny wejściowe **0,004 USD** / 1K tokenów Wyjście · Tokeny wyjściowe **0,024 USD** / 1K tokenów Wejście · Obraz wejściowy **0,004 USD** / 1K tokenów Wyjście · Obraz wyjściowy **0,24 USD** / 1K tokenów Wejście · Wejście audio **0,004 USD** / 1K tokenów Wejście · Odczyt z pamięci podręcznej audio **0,0004 USD** / 1K tokenów Wyjście · Wyszukiwanie w internecie **0,028 USD** za wyszukiwanie Wyjście · Tokeny rozumowania **0,024 USD** / 1K tokenów Wejście · Odczyt cache **0,0004 USD** / 1K tokenów Wejście · Zapis do pamięci podręcznej · 5 minut **0,00075 USD** / 1K tokenów |

Ailoot rezerwuje szacowaną kwotę przed żądaniem. Po otrzymaniu wyniku rozlicza ostateczną opłatę według zmierzonego użycia. Rozliczenie strumieniowania korzysta z końcowego rekordu użycia. [Jak działają rezerwacja i rozliczenie →](https://ailoot.ai/docs/pl/billing/reserve/)

### Przykładowe żądania

#### Ailoot Ultra · OpenAI Chat

curlPython SDKStrumień w Pythonie

```bash
set -eu
: "${AILOOT_API_KEY:?Set your Ailoot API key}"
python3 - <<'PY_REQUEST'
import json,os
from pathlib import Path
p=json.loads('{"model": "google/gemini-3-pro-image", "messages": [{"role": "user", "content": "Explain the difference between an observation and a hypothesis in three sentences."}]}')

Path("request.json").write_text(json.dumps(p,ensure_ascii=False))
PY_REQUEST
curl --fail-with-body --silent --show-error https://api.ailoot.ai/v1/chat/completions \
  -H "Authorization: Bearer $AILOOT_API_KEY" -H 'Content-Type: application/json' \
  --data-binary @request.json -D response-headers.txt -o result.json
python3 - <<'PY_RESULT'
import json
from pathlib import Path
r=json.loads(Path("result.json").read_text())
for x in r.get("choices",[]):
    if x.get("message",{}).get("content"): print(x["message"]["content"])
PY_RESULT
```

```python
from openai import OpenAI
import os

if not os.environ.get("AILOOT_API_KEY", "").strip(): raise SystemExit("Set AILOOT_API_KEY before making a request")
client=OpenAI(base_url="https://api.ailoot.ai/v1",api_key=os.environ["AILOOT_API_KEY"],max_retries=0)
result=client.chat.completions.create(model='google/gemini-3-pro-image',messages=[{"role":"user","content":"Explain observations and hypotheses in three sentences."}])
import base64, json
from pathlib import Path

def save_result(data, stem="result"):
    # Keep every field, including usage, IDs, reasoning and tool requests.
    Path(stem + ".json").write_text(json.dumps(data, ensure_ascii=False, indent=2), encoding="utf-8")
    print(json.dumps(data, ensure_ascii=False, indent=2))
    def save_blob(encoded, suffix, label):
        raw = base64.b64decode(encoded, altchars=b"-_", validate=True)
        ext = "png" if raw.startswith(b"\x89PNG\r\n\x1a\n") else "jpg" if raw.startswith(b"\xff\xd8") else "webp" if raw[:4] == b"RIFF" and raw[8:12] == b"WEBP" else suffix
        file = Path(stem + "-" + label + "." + ext)
        file.write_bytes(raw)
        print("Saved", file)
    for index, block in enumerate(data.get("content") or []):
        print("Content", index, json.dumps(block, ensure_ascii=False))
    for choice in data.get("choices") or []:
        print("Choice", choice.get("index"), json.dumps(choice.get("message", choice.get("delta", {})), ensure_ascii=False))
    for index, item in enumerate(data.get("output") or []):
        print("Output", index, json.dumps(item, ensure_ascii=False))
        if item.get("type") == "image_generation_call" and item.get("result"):
            save_blob(item["result"], item.get("output_format") or "bin", "output-" + str(index))
    for ci, candidate in enumerate(data.get("candidates") or []):
        for pi, part in enumerate((candidate.get("content") or {}).get("parts") or []):
            print("Candidate/part", ci, pi, json.dumps(part, ensure_ascii=False))
            blob = part.get("inlineData") or part.get("inline_data")
            if blob and blob.get("data"):
                mime = blob.get("mimeType") or blob.get("mime_type")
                suffix = {"image/png":"png", "image/jpeg":"jpg", "image/webp":"webp", "audio/wav":"wav", "audio/mpeg":"mp3", "video/mp4":"mp4"}.get(mime, "bin")
                save_blob(blob["data"], suffix, "candidate-" + str(ci) + "-part-" + str(pi))

save_result(result.to_dict(mode="json"))
```

```python
from openai import OpenAI
import os
from pathlib import Path

if not os.environ.get("AILOOT_API_KEY", "").strip(): raise SystemExit("Set AILOOT_API_KEY before making a request")
client=OpenAI(base_url="https://api.ailoot.ai/v1",api_key=os.environ["AILOOT_API_KEY"],max_retries=0)
import base64, json
from pathlib import Path

def save_result(data, stem="result"):
    # Keep every field, including usage, IDs, reasoning and tool requests.
    Path(stem + ".json").write_text(json.dumps(data, ensure_ascii=False, indent=2), encoding="utf-8")
    print(json.dumps(data, ensure_ascii=False, indent=2))
    def save_blob(encoded, suffix, label):
        raw = base64.b64decode(encoded, altchars=b"-_", validate=True)
        ext = "png" if raw.startswith(b"\x89PNG\r\n\x1a\n") else "jpg" if raw.startswith(b"\xff\xd8") else "webp" if raw[:4] == b"RIFF" and raw[8:12] == b"WEBP" else suffix
        file = Path(stem + "-" + label + "." + ext)
        file.write_bytes(raw)
        print("Saved", file)
    for index, block in enumerate(data.get("content") or []):
        print("Content", index, json.dumps(block, ensure_ascii=False))
    for choice in data.get("choices") or []:
        print("Choice", choice.get("index"), json.dumps(choice.get("message", choice.get("delta", {})), ensure_ascii=False))
    for index, item in enumerate(data.get("output") or []):
        print("Output", index, json.dumps(item, ensure_ascii=False))
        if item.get("type") == "image_generation_call" and item.get("result"):
            save_blob(item["result"], item.get("output_format") or "bin", "output-" + str(index))
    for ci, candidate in enumerate(data.get("candidates") or []):
        for pi, part in enumerate((candidate.get("content") or {}).get("parts") or []):
            print("Candidate/part", ci, pi, json.dumps(part, ensure_ascii=False))
            blob = part.get("inlineData") or part.get("inline_data")
            if blob and blob.get("data"):
                mime = blob.get("mimeType") or blob.get("mime_type")
                suffix = {"image/png":"png", "image/jpeg":"jpg", "image/webp":"webp", "audio/wav":"wav", "audio/mpeg":"mp3", "video/mp4":"mp4"}.get(mime, "bin")
                save_blob(blob["data"], suffix, "candidate-" + str(ci) + "-part-" + str(pi))

with client.chat.completions.stream(model='google/gemini-3-pro-image',messages=[{"role":"user","content":"Explain observations and hypotheses in three sentences."}]) as stream:
    with Path("stream-events.jsonl").open("w",encoding="utf-8") as log:
        for event in stream:
            payload=event.to_dict(mode="json")
            log.write(json.dumps(payload,ensure_ascii=False)+"\n"); log.flush()
            print(json.dumps(payload,ensure_ascii=False))
    final=stream.get_final_completion()
    save_result(final.to_dict(mode="json"),"stream-result")
```

### Odbieranie i zapisywanie wyników

#### Ailoot Ultra · OpenAI Chat

json lub SSE

##### Zachowaj wszystkie ukończone wyniki

Zachowaj każdą kompletną zwróconą odpowiedź, plik i część treści.

Zachowaj każdy wariant i jego treść/wywołania narzędzi/rozumowanie. W SSE składaj przyrosty według indeksu wariantu/narzędzia, zachowując końcowy powód zakończenia i dane użycia.

##### Jeśli trzeba sprawdzić pierwotną odpowiedź

Zachowaj ID i nagłówki żądań/odpowiedzi. Nie udostępniono ogólnego URL pobierania zadania tekstowego.

Pola odpowiedzi

| Pole | Typ |
| --- | --- |
| Pole`choices[].index` | Typinteger |
| Pole`choices[].message.content` | Typstring\|null |
| Pole`choices[].message.tool_calls` | Typtool\_call\[\] |
| Pole`choices[].message.reasoning_content` | Typstring |
| Pole`choices[].message.reasoning_details` | Typobject\|array |
| Pole`choices[].finish_reason` | Typstring\|null |
| Pole`usage` | Typobject |

Błędy i dalsze kroki

| Odpowiedź | Warunek | Następny krok |
| --- | --- | --- |
| Odpowiedź400 · `invalid_request_error` | WarunekNieprawidłowe wymagane pola, sposób reprezentacji materiału lub wartość parametru | Następny krokPopraw wskazane pola przed nowym żądaniem utworzenia. |

### Aliasy

#### Aliasy modelu

<strong>Ailoot</strong> [`gemini-3-pro-image`](https://ailoot.ai/models/pl/#m=google%2Fgemini-3-pro-image&route=Core&caller=gemini-3-pro-image), [`gemini-3-pro-image-preview`](https://ailoot.ai/models/pl/#m=google%2Fgemini-3-pro-image&route=Core&caller=gemini-3-pro-image-preview), [`nano-banana-pro`](https://ailoot.ai/models/pl/#m=google%2Fgemini-3-pro-image&route=Core&caller=nano-banana-pro)
**Ailoot Ultra** [`google/gemini-3-pro-image`](https://ailoot.ai/models/pl/#m=google%2Fgemini-3-pro-image&route=Ultra&caller=google%2Fgemini-3-pro-image&fmt=chat)

#### Aliasy ścieżek metod

`/v1/images`

#### Powiązane ID modeli

[`google/gemini-3-pro-image`](https://ailoot.ai/models/pl/#m=google%2Fgemini-3-pro-image&route=Ultra&caller=google%2Fgemini-3-pro-image&fmt=chat), [`gemini-3-pro-image-preview`](https://ailoot.ai/models/pl/#m=google%2Fgemini-3-pro-image&route=Core&caller=gemini-3-pro-image-preview), [`nano-banana-pro`](https://ailoot.ai/models/pl/#m=google%2Fgemini-3-pro-image&route=Core&caller=nano-banana-pro), [`gemini-3-pro-image`](https://ailoot.ai/models/pl/#m=google%2Fgemini-3-pro-image&route=Core&caller=gemini-3-pro-image)

**Ailoot Ultra · Obrazy** `POST /v1/images/generations` `google/gemini-3-pro-image`

[`google/gemini-3-pro-image`](https://ailoot.ai/models/pl/#m=google%2Fgemini-3-pro-image&route=Ultra&caller=google%2Fgemini-3-pro-image&fmt=images)

Google /`google/gemini-3-pro-image`

### Start

Nano Banana Pro (Gemini 3 Pro Image) to oparty na rozumowaniu model obrazowy Google do złożonych projektów, makiet produktów i wizualizacji faktograficznych. Przyjmuje tekst i referencje obrazowe oraz generuje obrazy z tekstem, z wyjściem 1K–4K i szczegółowym sterowaniem kreatywnym.

Akceptowane dane wejściowe

Tekst · Obrazy

Wyniki

Obrazy

### Dostępne w Ailoot · dane wejściowe i metody

**Ailoot Ultra · Obrazy** `POST /v1/images/generations`

Wejście

`text`, `image`

Wyjście

`image`

| Pole | Typ | Wymaganie | Wartości i limity | Domyślnie |
| --- | --- | --- | --- | --- |
| Pole`model` | Typ`string` | WymaganieWymagane | Wartości i limity google/gemini-3-pro-image | Domyślnie— |
| Pole`prompt` | Typ`string` | WymaganieWymagane | Wartości i limity Minimalna długość: 1 | Domyślnie— |
| Pole`resolution` | Typ`string` | WymaganieOpcjonalne | Wartości i limity 1K, 2K, 4K | Domyślnie— |
| Pole`aspect_ratio` | Typ`string` | WymaganieOpcjonalne | Wartości i limity 1:1, 2:3, 3:2, 3:4, 4:3, 4:5, 5:4, 9:16, 16:9, 21:9 | Domyślnie— |
| Pole`n` | Typ`integer` | WymaganieOpcjonalne | Wartości i limity Minimum: 1 Maksimum: 1 | Domyślnie— |
| Pole`input_references` | Typ`array` | WymaganieOpcjonalne | Wartości i limity Minimalna liczba elementów: 0 Maksymalna liczba elementów: 14 | Domyślnie— |
| Pole`provider` | Typ`object` | WymaganieOpcjonalne | Wartości i limity | Domyślnie— |

Parametry i cykl życia metody

| Parametr | Kontrakt |
| --- | --- |
| Parametr`content_type` | Kontraktapplication/json |
| Parametr`required` | Kontraktmodel, prompt |
| Parametr`material_types` | Kontrakttext, image |

Cykl życia: `synchronous_result_then_owned_library`

`GET /v1/media/tasks/{task_id}` · Rzeczywiście zwrócony task\_id lub wpis w bibliotece multimediów

`GET /v1/media/assets/{asset_id}/content`

`GET /v1/media/assets`

`GET /v1/media/assets/{asset_id}`

### Cennik

##### Jak obliczana jest ostateczna opłata

Wyświetlane stawki służą do oszacowania kosztu przed generowaniem. Ostateczna opłata jest obliczana na podstawie kosztu zarejestrowanego dla pierwotnego generowania. Zmierzony czas trwania wyniku i prognozowane ilości nie stanowią ostatecznej ilości podlegającej rozliczeniu.

Informacje taryfowe nie dodają opcji żądania. Obsługiwane parametry podano przy wybranej metodzie.

Tryb szybki

Nie określono Gdy wybrany jest tryb szybki

Tryb flex

Nie określono Gdy wybrany jest tryb flex

Maksymalna intensywność rozumowania

Nie określono Gdy dla maksymalnej intensywności rozumowania stosowana jest domyślna korekta (default)

#### Szacunkowe stawki do porównania

#### Ceny według konfiguracji

Dopasuj każdą opłatę do pokazanych warunków. Użyj jednej stawki dla każdego zestawu alternatywnych konfiguracji.

| Konfiguracja | Tabela stawek | Przewidywana ilość | Opłata |
| --- | --- | --- | --- |
| KonfiguracjaBazowe stawki za tokeny | Tabela stawekStawka podstawowa | Przewidywana ilość— | Opłata Wejście · Tokeny wejściowe · Szacunek tylko do porównania **—** / 1K tokenów Wyjście · Tokeny wyjściowe · Szacunek tylko do porównania **—** / 1K tokenów Wejście · Odczyt cache · Szacunek tylko do porównania **—** / 1K tokenów Wejście · Zapis do cache · Szacunek tylko do porównania **—** / 1K tokenów Wejście · Zapis do cache, 1 godz. · Szacunek tylko do porównania **—** / 1K tokenów |
| KonfiguracjaSzacowany koszt generowania | Tabela stawek— | Przewidywana ilośćszacunek dla jednego generowania | Opłata Wyjście · Szacowany koszt generowania · Szacunek tylko do porównania **$0.98304** szacunek przed generowaniem Ten szacunek nie jest dodatkową opłatą ani stałą stawką za ukończone generowanie. |

Ailoot rezerwuje szacowaną kwotę przed żądaniem. Po otrzymaniu wyniku rozlicza ostateczną opłatę według zmierzonego użycia. Rozliczenie strumieniowania korzysta z końcowego rekordu użycia. [Jak działają rezerwacja i rozliczenie →](https://ailoot.ai/docs/pl/billing/reserve/)

### Przykładowe żądania

#### Ailoot Ultra · Obrazy

curl

```bash
set -eu
: "${AILOOT_API_KEY:?Set your Ailoot API key}"
export AILOOT_API_KEY
python3 - <<'PY_REQUEST'
import json,os
from pathlib import Path
p={'model': 'google/gemini-3-pro-image', 'prompt': 'a red panda astronaut floating in space, studio lighting'}

Path("request.json").write_text(json.dumps(p,ensure_ascii=False))
PY_REQUEST
curl --fail-with-body --silent --show-error https://api.ailoot.ai/v1/images/generations \
  -H "Authorization: Bearer $AILOOT_API_KEY" -H 'Content-Type: application/json' \
  --data-binary @request.json -D response-headers.txt -o result.json
python3 - <<'PY_RESULT'
import base64, json, os, subprocess
from pathlib import Path
from urllib.parse import urlsplit, urljoin

def save_images(items):
    if not items: raise SystemExit("No completed images; retain the full response")
    for index, item in enumerate(items):
        encoded=item.get("b64_json")
        uri=item.get("url", "")
        if not encoded and uri.startswith("data:image/"):
            header, separator, encoded=uri.partition(",")
            if not separator or ";base64" not in header: raise SystemExit("Unsupported image data URI")
        if encoded:
            raw=base64.b64decode(encoded,validate=True)
        elif uri:
            uri=urljoin("https://api.ailoot.ai",uri)
            parsed=urlsplit(uri)
            if parsed.scheme!="https" or not parsed.netloc or parsed.username or parsed.password:
                raise SystemExit("Invalid returned image URL")
            owned=parsed.netloc=="api.ailoot.ai" and parsed.path.startswith("/v1/media/assets/") and parsed.path.endswith("/content")
            args=["curl","--fail-with-body","--silent","--show-error",uri]
            if owned: args += ["-H","Authorization: Bearer "+os.environ["AILOOT_API_KEY"]]
            temporary=Path(f"image-{index}.bin")
            subprocess.run(args+["-o",str(temporary)],check=True)
            raw=temporary.read_bytes()
            temporary.unlink()
        else: raise SystemExit("Image has neither bytes nor URL")
        if not raw: raise SystemExit("Empty image result")
        ext="png" if raw.startswith(b"\x89PNG") else "jpg" if raw.startswith(b"\xff\xd8") else "webp" if raw[:4]==b"RIFF" and raw[8:12]==b"WEBP" else "svg" if raw.lstrip().startswith((b"<svg",b"<?xml")) else "bin"
        Path(f"image-{index}.{ext}").write_bytes(raw)
    print("Every returned image saved; complete response metadata retained")
save_images(json.loads(Path("result.json").read_text())["data"])
PY_RESULT
```

### Odbieranie i zapisywanie wyników

#### Ailoot Ultra · Obrazy

Pobierz każdy zwrócony obraz lub zapisz jego zawartość Base64

- `GET /v1/media/tasks/{task_id}`
- `GET /v1/media/assets/{asset_id}/content`
- `GET /v1/media/assets`
- `GET /v1/media/assets/{asset_id}`

Inne odczyty treści

Odczytaj istniejące zasoby należące do Ciebie

```bash
set -eu
: "${AILOOT_API_KEY:?Set your Ailoot API key}"
curl --fail-with-body --silent --show-error https://api.ailoot.ai/v1/media/assets \
  -H "Authorization: Bearer $AILOOT_API_KEY" -o owned-assets.json
# Preserve every returned asset and follow its exact signed content URL. Do not construct a signed token.
```

##### Zachowaj wszystkie ukończone wyniki

Zapisz każdy ukończony obraz; pobierz każdy zwrócony URL lub zdekoduj zawartość Base64.

Zachowaj pełną odpowiedź i nagłówki, wszystkie rzeczywiście uzyskane wyniki, pierwotnie zwrócone identyfikatory oraz wszystkie pola zużycia. Odzyskaj pierwotną operację bez ponownego wysyłania żądania utworzenia.

##### Jeśli trzeba sprawdzić pierwotną odpowiedź

Zachowaj zwrócony X-Client-Request-ID do uzgodnienia danych. Odczytuj wyłącznie rzeczywiście zwrócone wartości task\_id/asset\_id lub własną bibliotekę multimediów; nigdy nie buduj adresu URL zadania na podstawie identyfikatora operacji i nigdy nie wysyłaj ponownie żądania utworzenia.

Pola odpowiedzi

| Pole | Typ |
| --- | --- |
| Pole`created` | Typ |
| Pole`data[].url` | Typ |
| Pole`data[].b64_json` | Typ |
| Pole`usage` | Typ |

### Aliasy

#### Aliasy modelu

<strong>Ailoot</strong> [`gemini-3-pro-image`](https://ailoot.ai/models/pl/#m=google%2Fgemini-3-pro-image&route=Core&caller=gemini-3-pro-image&fmt=images), [`gemini-3-pro-image-preview`](https://ailoot.ai/models/pl/#m=google%2Fgemini-3-pro-image&route=Core&caller=gemini-3-pro-image-preview&fmt=images), [`nano-banana-pro`](https://ailoot.ai/models/pl/#m=google%2Fgemini-3-pro-image&route=Core&caller=nano-banana-pro&fmt=images)
**Ailoot Ultra** [`google/gemini-3-pro-image`](https://ailoot.ai/models/pl/#m=google%2Fgemini-3-pro-image&route=Ultra&caller=google%2Fgemini-3-pro-image&fmt=images)

#### Aliasy ścieżek metod

`/v1/images`

#### Powiązane ID modeli

[`google/gemini-3-pro-image`](https://ailoot.ai/models/pl/#m=google%2Fgemini-3-pro-image&route=Ultra&caller=google%2Fgemini-3-pro-image&fmt=images), [`gemini-3-pro-image-preview`](https://ailoot.ai/models/pl/#m=google%2Fgemini-3-pro-image&route=Core&caller=gemini-3-pro-image-preview&fmt=images), [`nano-banana-pro`](https://ailoot.ai/models/pl/#m=google%2Fgemini-3-pro-image&route=Core&caller=nano-banana-pro&fmt=images), [`gemini-3-pro-image`](https://ailoot.ai/models/pl/#m=google%2Fgemini-3-pro-image&route=Core&caller=gemini-3-pro-image&fmt=images)

**Ailoot Ultra · Anthropic Messages** `POST /v1/messages` `google/gemini-3-pro-image`

[`google/gemini-3-pro-image`](https://ailoot.ai/models/pl/#m=google%2Fgemini-3-pro-image&route=Ultra&caller=google%2Fgemini-3-pro-image&fmt=messages)

Google /`google/gemini-3-pro-image`

### Start

Nano Banana Pro (Gemini 3 Pro Image) to oparty na rozumowaniu model obrazowy Google do złożonych projektów, makiet produktów i wizualizacji faktograficznych. Przyjmuje tekst i referencje obrazowe oraz generuje obrazy z tekstem, z wyjściem 1K–4K i szczegółowym sterowaniem kreatywnym.

Akceptowane dane wejściowe

Tekst

Wyniki

json · sse

### Dostępne w Ailoot · dane wejściowe i metody

**Ailoot Ultra · Anthropic Messages** `POST /v1/messages`

Wejście

`text`

Wyjście

`json`, `sse`

Format wyjściowy

JSON lub SSE

| Pole | Typ | Wymaganie | Wartości i limity | Domyślnie |
| --- | --- | --- | --- | --- |
| Pole`model` | Typ`string` | WymaganieWymagane | Wartości i limity google/gemini-3-pro-image | Domyślnie— |
| Pole`messages` | Typ`message[]` | WymaganieWymagane | Wartości i limity | Domyślnie— |
| Pole`messages[].role` | Typ`string` | WymaganieWymagane | Wartości i limity user, assistant | Domyślnie— |
| Pole`messages[].content` | Typ`string` | WymaganieWymagane | Wartości i limity | Domyślnie— |
| Pole`max_tokens` | Typ`integer` | WymaganieWymagane | Wartości i limity | Domyślnie— |
| Pole`stream` | Typ`boolean` | WymaganieOpcjonalne | Wartości i limity | Domyślniefalse |

Kombinacje materiałów wejściowych

**Tekst** · tekst UTF-8

`ciąg messages[].content`

Parametry i cykl życia metody

| Parametr | Kontrakt |
| --- | --- |
| Parametr`content_type` | Kontraktapplication/json |
| Parametr`required` | Kontraktmodel, messages, max\_tokens |
| Parametr`optional_controls` | Kontraktstream |
| Parametr`material_types` | Kontrakttext |
| Parametr`text_file_material` | KontraktOdczytaj rzeczywisty dokument UTF-8 i umieść jego tekst we wskazanym polu input lub w ciągu treści wiadomości. |

Cykl życia: `synchronous_or_streamed`

### Cennik

Informacje taryfowe nie dodają opcji żądania. Obsługiwane parametry podano przy wybranej metodzie.

Tryb szybki

Stawka standardowa Gdy wybrany jest tryb szybki

Tryb flex

Stawka standardowa Gdy wybrany jest tryb flex

Maksymalna intensywność rozumowania

Stawka standardowa Gdy dla maksymalnej intensywności rozumowania stosowana jest domyślna korekta (default)

Wycena jawnej pamięci podręcznej

Niewłączone Gdy zażądano jawnej pamięci podręcznej

#### Stawki Ailoot

#### Ceny według konfiguracji

Dopasuj każdą opłatę do pokazanych warunków. Użyj jednej stawki dla każdego zestawu alternatywnych konfiguracji.

| Konfiguracja | Tabela stawek | Tokeny kontekstu, więcej niż | Tokeny kontekstu, do podanej wartości włącznie | Opłata |
| --- | --- | --- | --- | --- |
| KonfiguracjaPodstawowe stawki za tokeny | Tabela stawekStawka podstawowa | Tokeny kontekstu, więcej niż— | Tokeny kontekstu, do podanej wartości włącznieBez górnej granicy | Opłata Wejście · Tokeny wejściowe **$0.004** / 1K tokenów Wyjście · Tokeny wyjściowe **$0.024** / 1K tokenów Wejście · Odczyt cache **$0.0004** / 1K tokenów Wejście · Zapis do cache **$0.00075** / 1K tokenów Wejście · Zapis do cache, 1 godz. **—** / 1K tokenów Wyjście · Tokeny obrazu wyjściowego **$0.24** / 1K tokenów obrazu |
| KonfiguracjaPrzedział długości żądania 1 | Tabela stawek— | Tokeny kontekstu, więcej niż0 | Tokeny kontekstu, do podanej wartości włącznieBez górnej granicy | Opłata Wejście · Tokeny wejściowe **$0.004** / 1K tokenów Wyjście · Tokeny wyjściowe **$0.024** / 1K tokenów Wejście · Odczyt cache **$0.0004** / 1K tokenów Wejście · Zapis do cache **$0.00075** / 1K tokenów Wejście · Zapis do cache, 1 godz. **—** / 1K tokenów |

Ailoot rezerwuje szacowaną kwotę przed żądaniem. Po otrzymaniu wyniku rozlicza ostateczną opłatę według zmierzonego użycia. Rozliczenie strumieniowania korzysta z końcowego rekordu użycia. [Jak działają rezerwacja i rozliczenie →](https://ailoot.ai/docs/pl/billing/reserve/)

### Przykładowe żądania

#### Ailoot Ultra · Anthropic Messages

Kompletna minimalna treść żądania JSONcurl · użyj swojego dokumentu UTF-8Python · zapisz kompletny wynik

```json
{
  "model": "google/gemini-3-pro-image",
  "max_tokens": 128,
  "messages": [
    {
      "role": "user",
      "content": "Summarize the incident report."
    }
  ],
  "stream": false
}
```

```bash
set -eu
: "${AILOOT_API_KEY:?Set your Ailoot API key}"
: "${AILOOT_TEXT_FILE:?Set your actual UTF-8 document}"
export AILOOT_TEXT_FILE
python3 - <<'PY_REQUEST'
import json, os
from pathlib import Path

source_file = Path(os.environ['AILOOT_TEXT_FILE'])
if not source_file.is_file():
    raise SystemExit('Set AILOOT_TEXT_FILE to your actual UTF-8 document')
text = source_file.read_text(encoding='utf-8')
if not text.strip():
    raise SystemExit('Choose a document containing text')
payload = {'model': 'google/gemini-3-pro-image', 'max_tokens': 128, 'messages': [{'role': 'user', 'content': 'Summarize the incident report.'}]}
payload['messages'][0]['content'] = 'Summarize this material and quote supporting source passages.\n\n' + text
Path('request.json').write_text(json.dumps(payload, ensure_ascii=False), encoding='utf-8')
PY_REQUEST
curl --fail-with-body --silent --show-error https://api.ailoot.ai/v1/messages \
  -H "x-api-key: $AILOOT_API_KEY" -H 'anthropic-version: 2023-06-01' -H 'Content-Type: application/json' \
  --data-binary @request.json -D response-headers.txt -o result.json
python3 - <<'PY_RESULT'
import json
from pathlib import Path

result = json.loads(Path('result.json').read_text(encoding='utf-8'))
print(json.dumps(result, ensure_ascii=False, indent=2))
PY_RESULT
```

```python
import json, os
from pathlib import Path

source_file = Path(os.environ['AILOOT_TEXT_FILE'])
if not source_file.is_file():
    raise SystemExit('Set AILOOT_TEXT_FILE to your actual UTF-8 document')
text = source_file.read_text(encoding='utf-8')
if not text.strip():
    raise SystemExit('Choose a document containing text')
payload = {'model': 'google/gemini-3-pro-image', 'max_tokens': 128, 'messages': [{'role': 'user', 'content': 'Summarize the incident report.'}]}
payload['messages'][0]['content'] = 'Summarize this material and quote supporting source passages.\n\n' + text
from urllib.request import Request, urlopen
from urllib.error import HTTPError

api_key = os.environ['AILOOT_API_KEY']
if not api_key.strip():
    raise SystemExit('Set AILOOT_API_KEY before making a request')
headers = {'x-api-key': 'PLACEHOLDER_KEY', 'anthropic-version': '2023-06-01', 'Content-Type': 'application/json'}
headers['x-api-key'] = api_key
request = Request('https://api.ailoot.ai/v1/messages', data=json.dumps(payload, ensure_ascii=False).encode('utf-8'), headers=headers, method='POST')
try:
    with urlopen(request, timeout=120) as response:
        raw = response.read()
        Path('response-headers.txt').write_text(str(response.headers), encoding='utf-8')
except HTTPError as error:
    Path('result.json').write_bytes(error.read())
    Path('response-headers.txt').write_text(str(error.headers), encoding='utf-8')
    raise
Path('result.json').write_bytes(raw)
import json
from pathlib import Path

result = json.loads(Path('result.json').read_text(encoding='utf-8'))
print(json.dumps(result, ensure_ascii=False, indent=2))
```

### Odbieranie i zapisywanie wyników

#### Ailoot Ultra · Anthropic Messages

JSON lub SSE

##### Zachowaj wszystkie ukończone wyniki

Zachowaj każdą kompletną zwróconą odpowiedź, plik i część treści.

Zachowaj wszystkie bloki treści, sygnatury myślenia i rzeczywiste ID użycia narzędzi. Złóż wszystkie przyrosty bloków SSE; pierwszy blok tekstowy nie jest pełnym wyjściem.

##### Jeśli trzeba sprawdzić pierwotną odpowiedź

Zachowaj ID i nagłówki żądań/odpowiedzi. Nie udostępniono ogólnego URL pobierania zadania tekstowego.

Pola odpowiedzi

| Pole | Typ |
| --- | --- |
| Pole`id` | Typstring |
| Pole`model` | Typstring |
| Pole`content[]` | Typtext\|thinking\|tool\_use\|other content block |
| Pole`stop_reason` | Typstring\|null |
| Pole`usage` | Typobject |

Błędy i dalsze kroki

| Odpowiedź | Warunek | Następny krok |
| --- | --- | --- |
| Odpowiedź400 · `invalid_request_error` | WarunekNieprawidłowe wymagane pola, sposób reprezentacji materiału lub wartość parametru | Następny krokPopraw wskazane pola przed nowym żądaniem utworzenia. |

### Aliasy

#### Aliasy modelu

<strong>Ailoot</strong> [`gemini-3-pro-image`](https://ailoot.ai/models/pl/#m=google%2Fgemini-3-pro-image&route=Core&caller=gemini-3-pro-image), [`gemini-3-pro-image-preview`](https://ailoot.ai/models/pl/#m=google%2Fgemini-3-pro-image&route=Core&caller=gemini-3-pro-image-preview), [`nano-banana-pro`](https://ailoot.ai/models/pl/#m=google%2Fgemini-3-pro-image&route=Core&caller=nano-banana-pro)
**Ailoot Ultra** [`google/gemini-3-pro-image`](https://ailoot.ai/models/pl/#m=google%2Fgemini-3-pro-image&route=Ultra&caller=google%2Fgemini-3-pro-image&fmt=messages)

#### Aliasy ścieżek metod

`/v1/images`

#### Powiązane ID modeli

[`google/gemini-3-pro-image`](https://ailoot.ai/models/pl/#m=google%2Fgemini-3-pro-image&route=Ultra&caller=google%2Fgemini-3-pro-image&fmt=messages), [`gemini-3-pro-image-preview`](https://ailoot.ai/models/pl/#m=google%2Fgemini-3-pro-image&route=Core&caller=gemini-3-pro-image-preview), [`nano-banana-pro`](https://ailoot.ai/models/pl/#m=google%2Fgemini-3-pro-image&route=Core&caller=nano-banana-pro), [`gemini-3-pro-image`](https://ailoot.ai/models/pl/#m=google%2Fgemini-3-pro-image&route=Core&caller=gemini-3-pro-image)

FAQ · Google: Nano Banana Pro (Gemini 3 Pro Image)

Jakie dane wejściowe i wyniki są dostępne?

`POST /v1/images/generations` · `gemini-3-pro-image`: `text` → `image` `POST /v1/images/generations` · `gemini-3-pro-image-preview`: `text` → `image` `POST /v1/images/generations` · `nano-banana-pro`: `text` → `image` `POST /v1/chat/completions` · `google/gemini-3-pro-image`: `text` → `text` `POST /v1/images/generations` · `google/gemini-3-pro-image`: `text`, `image` → `image` `POST /v1/messages` · `google/gemini-3-pro-image`: `text` → `json`, `sse`

Jakich pól używa żądanie?

`POST /v1/images/generations` · `gemini-3-pro-image`: `model`, `prompt`, `n`, `response_format`, `stream` `POST /v1/images/generations` · `gemini-3-pro-image-preview`: `model`, `prompt`, `n`, `response_format`, `stream` `POST /v1/images/generations` · `nano-banana-pro`: `model`, `prompt`, `n`, `response_format`, `stream` `POST /v1/chat/completions` · `google/gemini-3-pro-image`: `model`, `messages`, `stream`, `modalities`, `provider` `POST /v1/images/generations` · `google/gemini-3-pro-image`: `model`, `prompt`, `resolution`, `aspect_ratio`, `n`, `input_references`, `provider` `POST /v1/messages` · `google/gemini-3-pro-image`: `model`, `messages`, `max_tokens`, `stream`

Jakie limity obowiązują?

`POST /v1/images/generations` · `gemini-3-pro-image`: `ctx`: `65536`; `max_out`: `32768`; `n.minimum`: `1` `POST /v1/images/generations` · `gemini-3-pro-image-preview`: `ctx`: `65536`; `max_out`: `32768`; `n.minimum`: `1` `POST /v1/images/generations` · `nano-banana-pro`: `ctx`: `65536`; `max_out`: `32768`; `n.minimum`: `1` `POST /v1/chat/completions` · `google/gemini-3-pro-image`: `messages.min_items`: `1` `POST /v1/images/generations` · `google/gemini-3-pro-image`: `n.minimum`: `1`; `n.maximum`: `1`

Połącz Ailoot z Claude Code, OpenCode, Hermes albo własną aplikacją.

## Firma i jej portfel projektów

Firma i jej portfel projektów: miliony klientów; miesięczna sprzedaż liczona w miliardach.

## Kupuj tokeny z rabatem.

Rabat subskrypcji do regularnej pracy. Kody promocyjne — do 50% na tokeny.

Subskrypcja

Wybierz plan z rabatem do regularnych żądań.

Kod promocyjny do 50%

Wpisz kod przy zakupie. Cena zostanie przeliczona według aktualnej promocji.

Koszty w historii

Model, tokeny i kwota są zapisywane dla każdego żądania.

[Wybierz subskrypcję](https://ailoot.ai/docs/pl/billing/subscriptions/) · [Sprawdź ceny modeli](https://ailoot.ai/models/pl/)

## Połącz API z produktem, który sprzedajesz.

SaaS, aplikacje i boty na warunkach oferty i umowy licencyjnej Ailoot. Do odsprzedaży poproś o licencję resellerską.

Aplikacja komercyjna

Wbuduj generowanie tekstu, obrazów, wideo i dźwięku w płatne funkcje usługi.

Licencja resellerska

Prześlij opis projektu i schemat dostępu. Poproś o pisemne warunki używania i odsprzedaży.

Dokumenty na stronie

Oferta, umowa licencyjna i polityka przetwarzania danych są dostępne przed połączeniem.

[Poproś o licencję resellerską](mailto:support@ailoot.ai) · [Oferta i umowa licencyjna](https://ailoot.ai/legal/offer?lang=pl)

## Ailoot · Firma i jej portfel projektów





Ailoot opiera się na zgromadzonym doświadczeniu operacyjnym, szerokiej bazie klientów, stabilnej usłudze i stałej kontroli KPI.





Firma i jej portfel projektów: miliony klientów; miesięczna sprzedaż liczona w miliardach.





Ailoot wykorzystuje to doświadczenie operacyjne, zapewniając dostęp przez API do funkcji AI w produktach klientów, agentach, aplikacjach i automatyzacjach.
