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

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

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

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

Nano Banana Pro (Gemini 3 Pro Image) is Googles door redeneren gestuurd beeldmodel voor complex ontwerp, productmock-ups en feitelijke visualisaties. Het accepteert tekst en beeldreferenties en genereert beelden met tekst, met uitvoer in 1K–4K en gedetailleerde creatieve instellingen.

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

Over het model

Deze beschrijving gaat over de mogelijkheden van het model. De via Ailoot beschikbare invoer, uitvoer en opties staan hieronder voor de geselecteerde methode.

Nano Banana Pro is Googles model Gemini 3 Pro Image voor beeldgeneratie en bewerking op basis van redeneren. De fabrikant plaatst complex grafisch ontwerp, getrouwe productmock-ups en feitelijke gegevensvisualisatie centraal in het beoogde gebruik. Het accepteert tekst en beelden en produceert beeld en tekst. Deze benoemde Pro-beeldeditie is gebaseerd op Gemini 3 Pro en behoudt het eigen invoer- en capaciteitenprofiel voor beeldtaken.

Het model ondersteunt beelden in 1K, 2K en 4K. Gedocumenteerde vormen zijn 1:1, 2:3, 3:2, 3:4, 4:3, 4:5, 5:4, 9:16, 16:9 en 21:9. Een vierkant 4K-beeld is 4096 × 4096; een 16:9-beeld in 4K is 5504 × 3072. Kies resolutie en beeldverhouding voor het resultaat dat u nodig hebt, zoals een staande poster, productscène of brede verklarende afbeelding. De optie 0.5K en extra extreme verhoudingen van Gemini 3.1 Flash Image maken geen deel uit van deze Pro-tabel.

Tekstweergave ondersteunt heldere belettering in posters, diagrammen en andere ontwerpen. Geef voor een complexe infographic de onderliggende feiten, exacte formuleringen, een leesvolgorde en de relatie tussen labels en visuele elementen. Scheid de informatie die moet worden overgebracht van de gewenste artistieke stijl. Google raadt aan eerst de tekst voor te bereiden en daarna het beeld met die tekst te genereren. Dat is vooral nuttig wanneer een compositie een kop, diagram en meerdere korte bijschriften combineert.

Invoer met meerdere beelden ondersteunt maximaal 14 referenties. Googles functietabel beschrijft maximaal zes objectreferenties voor getrouwheid, maximaal vijf personagereferenties voor consistentie en maximaal drie stijlreferenties. Deze rollen helpen een samengesteld beeld voorbereiden: een productfoto definieert het uiterlijk, een afzonderlijk beeld legt de omgeving vast en een stijlbeeld stuurt de behandeling. Vertel het model welke details gezaghebbend zijn en welke referenties inspiratie bieden in plaats van te vragen elk zichtbaar kenmerk zonder onderscheid te combineren.

Google Search-grounding kan informatie uit de werkelijke wereld leveren voor een feitelijke visualisatie of een scène die door actuele omstandigheden wordt gestuurd. De Pro-beeldwerkstroom documenteert webgrounding; de Image Search-uitbreiding is specifiek voor Nano Banana 2.1 en Gemini 3.1 Flash Image gedocumenteerd. Geef voor een gegevensgrafiek de waarden die u wilt tonen of vraag om informatie met grounding in de producentwerkstroom en maak daarna de relatie, labels en indeling expliciet. Zoekgestuurde generatie levert nog steeds een beeld om te beoordelen, geen vervanging voor het controleren van de afgebeelde feiten.

Redeneren ondersteunt het samenstellen van een complexe prompt vóór de uiteindelijke rendering. De beeldhandleiding beschrijft tussentijdse beelden om compositie en logica te testen, los van het eindresultaat. Neem de instellingentabel minimal/high van Nano Banana 2 of de tabel met medium als standaard van Nano Banana 2.1 niet over naar deze Pro-editie. Geef voor een veeleisend ontwerp een volledige briefing met de visuele hiërarchie, vereiste objectrelaties en de elementen die latere bewerkingen moeten doorstaan.

De modelkaart beschrijft wezenlijke resterende beperkingen: zeer kleine tekst en lange passages kunnen slecht worden weergegeven, het uiterlijk van personages kan tussen referentie en resultaat veranderen en bewerkingen met maskers of schetsen kunnen de instructie maar gedeeltelijk volgen of sporen achterlaten. Het kan ook links en rechts verwarren of een bronelement in de nieuwe compositie kopiëren. Benoem bij een productrevisie expliciet de behouden geometrie en labels en inspecteer het bewerkte gebied; vergelijk voor een diagram de pijlrichting en relatieve objectposities.

De huidige API-tabel geeft een invoerlimiet van 65.536 tokens en een uitvoerlimiet van 32.768 tokens. Beeldgeneratie, denken, zoekgrounding en batchverwerking worden ondersteund; audiogeneratie, functieaanroepen, code-uitvoering, caching, gestructureerde uitvoer, zoeken in bestanden, URL-context en Live API niet. De beeldtaak accepteert in dit profiel geen audio- of video-invoer. Gegenereerde beelden bevatten SynthID en een gevraagd aantal uitvoerbeelden wordt niet altijd exact gevolgd.

Een praktische productbriefing kan een productbeeld, een belichtingsreferentie en de exacte kop combineren: “Behoud de verhoudingen en belettering van het product, toon het op een licht stenen oppervlak onder zacht zijlicht en laat het bovenste derde deel vrij voor de aangeleverde kop.” Benoem voor een feitelijk diagram elke entiteit en verbinding en geef de goedgekeurde labels. Verfijn het resultaat in een gesprek door één wijziging en de te behouden kenmerken te benoemen en bewaar het geselecteerde beeld en de bijbehorende uitleg samen als ontwerpresultaat.

Praktische taak

### Praktische taak

Technisch voorbeeld in het Engels

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

#### Verwacht resultaat

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

#### Resultaat controleren

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

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

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

Google /`gemini-3-pro-image`

Model-ID

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

### Aan de slag

Nano Banana Pro (Gemini 3 Pro Image) is Googles door redeneren gestuurd beeldmodel voor complex ontwerp, productmock-ups en feitelijke visualisaties. Het accepteert tekst en beeldreferenties en genereert beelden met tekst, met uitvoer in 1K–4K en gedetailleerde creatieve instellingen.

Toegestane invoer

Tekst

Resultaten

Afbeeldingen

### Beschikbaar in Ailoot · invoer en methoden

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

Invoertypen

`text`

Uitvoertypen

`image`

Context

65.536 tokens

Maximale uitvoer

32.768 tokens

Uitvoerformaat

Afbeeldingsbestand

| Veld | Type | Vereiste | Waarden en limieten | Standaard |
| --- | --- | --- | --- | --- |
| Veld`model` | Type`string` | VereisteVereist | Waarden en limieten gemini-3-pro-image | Standaard— |
| Veld`prompt` | Type`string` | VereisteVereist | Waarden en limieten Minimumlengte: 1 | Standaard— |
| Veld`n` | Type`integer` | VereisteOptioneel | Waarden en limieten Minimum: 1 | Standaard1 |
| Veld`response_format` | Type`string` | VereisteOptioneel | Waarden en limieten url, b64\_json | Standaard— |
| Veld`stream` | Type`boolean` | VereisteOptioneel | Waarden en limieten | Standaardfalse |
| Veld`size` | Type`string` | VereisteOptioneel | Waarden en limieten Afhankelijk van het model | Standaard— |
| Veld`quality` | Type`string` | VereisteOptioneel | Waarden en limieten Afhankelijk van het model | Standaard— |
| Veld`background` | Type`string` | VereisteOptioneel | Waarden en limieten Afhankelijk van het model | Standaard— |
| Veld`output_format` | Type`string` | VereisteOptioneel | Waarden en limieten Afhankelijk van het model | Standaard— |
| Veld`output_compression` | Type`integer` | VereisteOptioneel | Waarden en limieten Afhankelijk van het model | Standaard— |
| Veld`moderation` | Type`string` | VereisteOptioneel | Waarden en limieten Afhankelijk van het model | Standaard— |
| Veld`input_fidelity` | Type`string` | VereisteOptioneel | Waarden en limieten Afhankelijk van het model | Standaard— |
| Veld`style` | Type`string` | VereisteOptioneel | Waarden en limieten Afhankelijk van het model | Standaard— |
| Veld`partial_images` | Type`integer` | VereisteOptioneel | Waarden en limieten Afhankelijk van het model | Standaard— |

Combinaties van invoermaterialen

**Tekst naar afbeelding** · Vereist: prompt

Methodeparameters en levenscyclus

| Parameter | Contract |
| --- | --- |
| Parameter`material_types` | Contracttext |
| Parameter`required` | Contractmodel, prompt |
| Parameter`optional_controls` | Contractnull |
| Parameter`content_type` | Contractapplication/json |

Levenscyclus: `synchronous_result_then_owned_library`

`GET /v1/media/tasks/{task_id}` · de daadwerkelijk geretourneerde task\_id of het record in de mediabibliotheek

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

`GET /v1/media/assets`

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

De methodestructuren en ID’s zijn exact; de mogelijkheden van de leverancier staan los van toelating.

### Tarieven

#### Ailoot-methodetarieven

Invoer

US$ 0,002 */ 1K afbeeldingstokens*

Uitvoer

US$ 0,134 *per 1K-afbeelding*

Uitvoer

US$ 0,134 *per 2K-afbeelding*

Uitvoer

US$ 0,24 *per 4K-afbeelding*

Ailoot reserveert vóór een verzoek een geschat bedrag. Na het resultaat worden de uiteindelijke kosten afgerekend op basis van het gemeten verbruik. Bij streaming gebeurt de afrekening op basis van de definitieve verbruiksregistratie. [Zo werken reservering en afrekening →](https://ailoot.ai/docs/nl/billing/reserve/)

#### Details van het referentietarief

Referentiestaffels op modelniveau veranderen de methodeselectie, kostenramingen of afschrijvingen niet. Voor de actieve kostenberekening gelden de tarieven van de geselecteerde Ailoot-methode.

Referentiestaffels van het model

#### Prijzen per configuratie

| Configuratie | Tariefstaffel | Kosten |
| --- | --- | --- |
| ConfiguratieUltra | TariefstaffelBasistarief | Kosten Invoer · Invoertokens **$0.004000** / 1K tokens Uitvoer · Uitvoertokens **$0.024000** / 1K tokens Invoer · afbeelding **$0.004000** / 1K tokens Uitvoer · afbeeldingsuitvoer **$0.24000** / 1K tokens Invoer · audio **$0.004000** / 1K tokens Invoer · cache voor audio-invoer **$0.0004000** / 1K tokens Uitvoer · zoeken op het web **$0.028** per webzoekopdracht Uitvoer · intern redeneren **$0.024000** / 1K tokens Invoer · Cache lezen **$0.0004000** / 1K tokens Invoer · Cache schrijven **$0.000750000** / 1K tokens |

### Voorbeeldverzoeken

#### Ailoot · Afbeeldingen

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");
```

### Resultaten ophalen en opslaan

#### Ailoot · Afbeeldingen

Download elke teruggegeven afbeelding of sla de Base64-inhoud ervan op

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

##### Alle voltooide resultaten bewaren

Sla elke voltooide afbeelding op; haal elke teruggegeven URL op of decodeer de bijbehorende Base64-inhoud.

Sla elk data-item op. Decodeer elke b64\_json of haal elk bestand op via elke geretourneerde ondertekende URL. Kies een bestandsextensie op basis van de daadwerkelijke MIME/bytes.

##### Als het oorspronkelijke antwoord moet worden gecontroleerd

Als het resultaat van een afbeeldingsgeneratie of -bewerking moet worden gecontroleerd, bewaar dan de oorspronkelijke operation\_id/X-Client-Request-ID en de geretourneerde resultaatinformatie. Haal bestaande eigen resultaten terug via de mediabibliotheek met de daadwerkelijke task\_id- of asset\_id-waarden. Dien de generatie-/bewerkingsaanvraag niet opnieuw in en bouw geen polling-URL op basis van operation\_id.

Antwoordvelden

| Veld | Type |
| --- | --- |
| Veld`created` | Typeinteger |
| Veld`data[].url` | Typestring |
| Veld`data[].b64_json` | Typebase64 string |
| Veld`usage` | Typeobject |

Fouten en vervolgstappen

| Antwoord | Voorwaarde | Volgende stap |
| --- | --- | --- |
| Antwoord400 · `invalid_request_error` | VoorwaardeVerplichte velden, de materiaalrepresentatie of een parameterwaarde zijn ongeldig | Volgende stapCorrigeer de aangegeven velden vóór een nieuwe aanmaakaanvraag. |
| Antwoord`server_error` | VoorwaardeHet geretourneerde antwoord geeft aan dat de bewerking of het resultaat moet worden gecontroleerd | Volgende stapBewaar de oorspronkelijk geretourneerde bewerkings-/taak-ID, de aanvraagheaders en het antwoord; blijf de ondersteunde leesacties voor die oorspronkelijke bewerking uitvoeren. Dien de aanmaakaanvraag niet opnieuw in. |

### Aliasnamen

#### Modelaliasnamen

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

#### Aliasnamen voor methodepaden

`/v1/images`

#### Gerelateerde aanroeper-ID’s

[`google/gemini-3-pro-image`](https://ailoot.ai/models/nl/#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/nl/#m=google%2Fgemini-3-pro-image&route=Core&caller=gemini-3-pro-image-preview&fmt=images), [`nano-banana-pro`](https://ailoot.ai/models/nl/#m=google%2Fgemini-3-pro-image&route=Core&caller=nano-banana-pro&fmt=images), [`gemini-3-pro-image`](https://ailoot.ai/models/nl/#m=google%2Fgemini-3-pro-image&route=Core&caller=gemini-3-pro-image&fmt=images)

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

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

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

Model-ID

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

### Aan de slag

Nano Banana Pro (Gemini 3 Pro Image) is Googles door redeneren gestuurd beeldmodel voor complex ontwerp, productmock-ups en feitelijke visualisaties. Het accepteert tekst en beeldreferenties en genereert beelden met tekst, met uitvoer in 1K–4K en gedetailleerde creatieve instellingen.

Toegestane invoer

Tekst

Resultaten

Afbeeldingen

### Beschikbaar in Ailoot · invoer en methoden

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

Invoertypen

`text`

Uitvoertypen

`image`

Context

65.536 tokens

Maximale uitvoer

32.768 tokens

Uitvoerformaat

Afbeeldingsbestand

| Veld | Type | Vereiste | Waarden en limieten | Standaard |
| --- | --- | --- | --- | --- |
| Veld`model` | Type`string` | VereisteVereist | Waarden en limieten gemini-3-pro-image-preview | Standaard— |
| Veld`prompt` | Type`string` | VereisteVereist | Waarden en limieten Minimumlengte: 1 | Standaard— |
| Veld`n` | Type`integer` | VereisteOptioneel | Waarden en limieten Minimum: 1 | Standaard1 |
| Veld`response_format` | Type`string` | VereisteOptioneel | Waarden en limieten url, b64\_json | Standaard— |
| Veld`stream` | Type`boolean` | VereisteOptioneel | Waarden en limieten | Standaardfalse |
| Veld`size` | Type`string` | VereisteOptioneel | Waarden en limieten Afhankelijk van het model | Standaard— |
| Veld`quality` | Type`string` | VereisteOptioneel | Waarden en limieten Afhankelijk van het model | Standaard— |
| Veld`background` | Type`string` | VereisteOptioneel | Waarden en limieten Afhankelijk van het model | Standaard— |
| Veld`output_format` | Type`string` | VereisteOptioneel | Waarden en limieten Afhankelijk van het model | Standaard— |
| Veld`output_compression` | Type`integer` | VereisteOptioneel | Waarden en limieten Afhankelijk van het model | Standaard— |
| Veld`moderation` | Type`string` | VereisteOptioneel | Waarden en limieten Afhankelijk van het model | Standaard— |
| Veld`input_fidelity` | Type`string` | VereisteOptioneel | Waarden en limieten Afhankelijk van het model | Standaard— |
| Veld`style` | Type`string` | VereisteOptioneel | Waarden en limieten Afhankelijk van het model | Standaard— |
| Veld`partial_images` | Type`integer` | VereisteOptioneel | Waarden en limieten Afhankelijk van het model | Standaard— |

Combinaties van invoermaterialen

**Tekst naar afbeelding** · Vereist: prompt

Methodeparameters en levenscyclus

| Parameter | Contract |
| --- | --- |
| Parameter`material_types` | Contracttext |
| Parameter`required` | Contractmodel, prompt |
| Parameter`optional_controls` | Contractnull |
| Parameter`content_type` | Contractapplication/json |

Levenscyclus: `synchronous_result_then_owned_library`

`GET /v1/media/tasks/{task_id}` · de daadwerkelijk geretourneerde task\_id of het record in de mediabibliotheek

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

`GET /v1/media/assets`

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

De methodestructuren en ID’s zijn exact; de mogelijkheden van de leverancier staan los van toelating.

### Tarieven

#### Ailoot-methodetarieven

Invoer

US$ 0,002 */ 1K afbeeldingstokens*

Uitvoer

US$ 0,134 *per 1K-afbeelding*

Uitvoer

US$ 0,134 *per 2K-afbeelding*

Uitvoer

US$ 0,24 *per 4K-afbeelding*

Ailoot reserveert vóór een verzoek een geschat bedrag. Na het resultaat worden de uiteindelijke kosten afgerekend op basis van het gemeten verbruik. Bij streaming gebeurt de afrekening op basis van de definitieve verbruiksregistratie. [Zo werken reservering en afrekening →](https://ailoot.ai/docs/nl/billing/reserve/)

#### Details van het referentietarief

Referentiestaffels op modelniveau veranderen de methodeselectie, kostenramingen of afschrijvingen niet. Voor de actieve kostenberekening gelden de tarieven van de geselecteerde Ailoot-methode.

Referentiestaffels van het model

#### Prijzen per configuratie

| Configuratie | Tariefstaffel | Kosten |
| --- | --- | --- |
| ConfiguratieUltra | TariefstaffelBasistarief | Kosten Invoer · Invoertokens **$0.004000** / 1K tokens Uitvoer · Uitvoertokens **$0.024000** / 1K tokens Invoer · afbeelding **$0.004000** / 1K tokens Uitvoer · afbeeldingsuitvoer **$0.24000** / 1K tokens Invoer · audio **$0.004000** / 1K tokens Invoer · cache voor audio-invoer **$0.0004000** / 1K tokens Uitvoer · zoeken op het web **$0.028** per webzoekopdracht Uitvoer · intern redeneren **$0.024000** / 1K tokens Invoer · Cache lezen **$0.0004000** / 1K tokens Invoer · Cache schrijven **$0.000750000** / 1K tokens |

### Voorbeeldverzoeken

#### Ailoot · Afbeeldingen

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");
```

### Resultaten ophalen en opslaan

#### Ailoot · Afbeeldingen

Download elke teruggegeven afbeelding of sla de Base64-inhoud ervan op

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

##### Alle voltooide resultaten bewaren

Sla elke voltooide afbeelding op; haal elke teruggegeven URL op of decodeer de bijbehorende Base64-inhoud.

Sla elk data-item op. Decodeer elke b64\_json of haal elk bestand op via elke geretourneerde ondertekende URL. Kies een bestandsextensie op basis van de daadwerkelijke MIME/bytes.

##### Als het oorspronkelijke antwoord moet worden gecontroleerd

Als het resultaat van een afbeeldingsgeneratie of -bewerking moet worden gecontroleerd, bewaar dan de oorspronkelijke operation\_id/X-Client-Request-ID en de geretourneerde resultaatinformatie. Haal bestaande eigen resultaten terug via de mediabibliotheek met de daadwerkelijke task\_id- of asset\_id-waarden. Dien de generatie-/bewerkingsaanvraag niet opnieuw in en bouw geen polling-URL op basis van operation\_id.

Antwoordvelden

| Veld | Type |
| --- | --- |
| Veld`created` | Typeinteger |
| Veld`data[].url` | Typestring |
| Veld`data[].b64_json` | Typebase64 string |
| Veld`usage` | Typeobject |

Fouten en vervolgstappen

| Antwoord | Voorwaarde | Volgende stap |
| --- | --- | --- |
| Antwoord400 · `invalid_request_error` | VoorwaardeVerplichte velden, de materiaalrepresentatie of een parameterwaarde zijn ongeldig | Volgende stapCorrigeer de aangegeven velden vóór een nieuwe aanmaakaanvraag. |
| Antwoord`server_error` | VoorwaardeHet geretourneerde antwoord geeft aan dat de bewerking of het resultaat moet worden gecontroleerd | Volgende stapBewaar de oorspronkelijk geretourneerde bewerkings-/taak-ID, de aanvraagheaders en het antwoord; blijf de ondersteunde leesacties voor die oorspronkelijke bewerking uitvoeren. Dien de aanmaakaanvraag niet opnieuw in. |

### Aliasnamen

#### Modelaliasnamen

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

#### Aliasnamen voor methodepaden

`/v1/images`

#### Gerelateerde aanroeper-ID’s

[`google/gemini-3-pro-image`](https://ailoot.ai/models/nl/#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/nl/#m=google%2Fgemini-3-pro-image&route=Core&caller=gemini-3-pro-image-preview&fmt=images), [`nano-banana-pro`](https://ailoot.ai/models/nl/#m=google%2Fgemini-3-pro-image&route=Core&caller=nano-banana-pro&fmt=images), [`gemini-3-pro-image`](https://ailoot.ai/models/nl/#m=google%2Fgemini-3-pro-image&route=Core&caller=gemini-3-pro-image&fmt=images)

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

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

Google /`nano-banana-pro`

Model-ID

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

### Aan de slag

Nano Banana Pro (Gemini 3 Pro Image) is Googles door redeneren gestuurd beeldmodel voor complex ontwerp, productmock-ups en feitelijke visualisaties. Het accepteert tekst en beeldreferenties en genereert beelden met tekst, met uitvoer in 1K–4K en gedetailleerde creatieve instellingen.

Toegestane invoer

Tekst

Resultaten

Afbeeldingen

### Beschikbaar in Ailoot · invoer en methoden

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

Invoertypen

`text`

Uitvoertypen

`image`

Context

65.536 tokens

Maximale uitvoer

32.768 tokens

Uitvoerformaat

Afbeeldingsbestand

| Veld | Type | Vereiste | Waarden en limieten | Standaard |
| --- | --- | --- | --- | --- |
| Veld`model` | Type`string` | VereisteVereist | Waarden en limieten nano-banana-pro | Standaard— |
| Veld`prompt` | Type`string` | VereisteVereist | Waarden en limieten Minimumlengte: 1 | Standaard— |
| Veld`n` | Type`integer` | VereisteOptioneel | Waarden en limieten Minimum: 1 | Standaard1 |
| Veld`response_format` | Type`string` | VereisteOptioneel | Waarden en limieten url, b64\_json | Standaard— |
| Veld`stream` | Type`boolean` | VereisteOptioneel | Waarden en limieten | Standaardfalse |
| Veld`size` | Type`string` | VereisteOptioneel | Waarden en limieten Afhankelijk van het model | Standaard— |
| Veld`quality` | Type`string` | VereisteOptioneel | Waarden en limieten Afhankelijk van het model | Standaard— |
| Veld`background` | Type`string` | VereisteOptioneel | Waarden en limieten Afhankelijk van het model | Standaard— |
| Veld`output_format` | Type`string` | VereisteOptioneel | Waarden en limieten Afhankelijk van het model | Standaard— |
| Veld`output_compression` | Type`integer` | VereisteOptioneel | Waarden en limieten Afhankelijk van het model | Standaard— |
| Veld`moderation` | Type`string` | VereisteOptioneel | Waarden en limieten Afhankelijk van het model | Standaard— |
| Veld`input_fidelity` | Type`string` | VereisteOptioneel | Waarden en limieten Afhankelijk van het model | Standaard— |
| Veld`style` | Type`string` | VereisteOptioneel | Waarden en limieten Afhankelijk van het model | Standaard— |
| Veld`partial_images` | Type`integer` | VereisteOptioneel | Waarden en limieten Afhankelijk van het model | Standaard— |

Combinaties van invoermaterialen

**Tekst naar afbeelding** · Vereist: prompt

Methodeparameters en levenscyclus

| Parameter | Contract |
| --- | --- |
| Parameter`material_types` | Contracttext |
| Parameter`required` | Contractmodel, prompt |
| Parameter`optional_controls` | Contractnull |
| Parameter`content_type` | Contractapplication/json |

Levenscyclus: `synchronous_result_then_owned_library`

`GET /v1/media/tasks/{task_id}` · de daadwerkelijk geretourneerde task\_id of het record in de mediabibliotheek

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

`GET /v1/media/assets`

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

De methodestructuren en ID’s zijn exact; de mogelijkheden van de leverancier staan los van toelating.

### Tarieven

#### Ailoot-methodetarieven

Invoer

US$ 0,002 */ 1K afbeeldingstokens*

Uitvoer

US$ 0,134 *per 1K-afbeelding*

Uitvoer

US$ 0,134 *per 2K-afbeelding*

Uitvoer

US$ 0,24 *per 4K-afbeelding*

Ailoot reserveert vóór een verzoek een geschat bedrag. Na het resultaat worden de uiteindelijke kosten afgerekend op basis van het gemeten verbruik. Bij streaming gebeurt de afrekening op basis van de definitieve verbruiksregistratie. [Zo werken reservering en afrekening →](https://ailoot.ai/docs/nl/billing/reserve/)

#### Details van het referentietarief

Referentiestaffels op modelniveau veranderen de methodeselectie, kostenramingen of afschrijvingen niet. Voor de actieve kostenberekening gelden de tarieven van de geselecteerde Ailoot-methode.

Referentiestaffels van het model

#### Prijzen per configuratie

| Configuratie | Tariefstaffel | Kosten |
| --- | --- | --- |
| ConfiguratieUltra | TariefstaffelBasistarief | Kosten Invoer · Invoertokens **$0.004000** / 1K tokens Uitvoer · Uitvoertokens **$0.024000** / 1K tokens Invoer · afbeelding **$0.004000** / 1K tokens Uitvoer · afbeeldingsuitvoer **$0.24000** / 1K tokens Invoer · audio **$0.004000** / 1K tokens Invoer · cache voor audio-invoer **$0.0004000** / 1K tokens Uitvoer · zoeken op het web **$0.028** per webzoekopdracht Uitvoer · intern redeneren **$0.024000** / 1K tokens Invoer · Cache lezen **$0.0004000** / 1K tokens Invoer · Cache schrijven **$0.000750000** / 1K tokens |

### Voorbeeldverzoeken

#### Ailoot · Afbeeldingen

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");
```

### Resultaten ophalen en opslaan

#### Ailoot · Afbeeldingen

Download elke teruggegeven afbeelding of sla de Base64-inhoud ervan op

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

##### Alle voltooide resultaten bewaren

Sla elke voltooide afbeelding op; haal elke teruggegeven URL op of decodeer de bijbehorende Base64-inhoud.

Sla elk data-item op. Decodeer elke b64\_json of haal elk bestand op via elke geretourneerde ondertekende URL. Kies een bestandsextensie op basis van de daadwerkelijke MIME/bytes.

##### Als het oorspronkelijke antwoord moet worden gecontroleerd

Als het resultaat van een afbeeldingsgeneratie of -bewerking moet worden gecontroleerd, bewaar dan de oorspronkelijke operation\_id/X-Client-Request-ID en de geretourneerde resultaatinformatie. Haal bestaande eigen resultaten terug via de mediabibliotheek met de daadwerkelijke task\_id- of asset\_id-waarden. Dien de generatie-/bewerkingsaanvraag niet opnieuw in en bouw geen polling-URL op basis van operation\_id.

Antwoordvelden

| Veld | Type |
| --- | --- |
| Veld`created` | Typeinteger |
| Veld`data[].url` | Typestring |
| Veld`data[].b64_json` | Typebase64 string |
| Veld`usage` | Typeobject |

Fouten en vervolgstappen

| Antwoord | Voorwaarde | Volgende stap |
| --- | --- | --- |
| Antwoord400 · `invalid_request_error` | VoorwaardeVerplichte velden, de materiaalrepresentatie of een parameterwaarde zijn ongeldig | Volgende stapCorrigeer de aangegeven velden vóór een nieuwe aanmaakaanvraag. |
| Antwoord`server_error` | VoorwaardeHet geretourneerde antwoord geeft aan dat de bewerking of het resultaat moet worden gecontroleerd | Volgende stapBewaar de oorspronkelijk geretourneerde bewerkings-/taak-ID, de aanvraagheaders en het antwoord; blijf de ondersteunde leesacties voor die oorspronkelijke bewerking uitvoeren. Dien de aanmaakaanvraag niet opnieuw in. |

### Aliasnamen

#### Modelaliasnamen

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

#### Aliasnamen voor methodepaden

`/v1/images`

#### Gerelateerde aanroeper-ID’s

[`google/gemini-3-pro-image`](https://ailoot.ai/models/nl/#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/nl/#m=google%2Fgemini-3-pro-image&route=Core&caller=gemini-3-pro-image-preview&fmt=images), [`nano-banana-pro`](https://ailoot.ai/models/nl/#m=google%2Fgemini-3-pro-image&route=Core&caller=nano-banana-pro&fmt=images), [`gemini-3-pro-image`](https://ailoot.ai/models/nl/#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/nl/#m=google%2Fgemini-3-pro-image&route=Ultra&caller=google%2Fgemini-3-pro-image&fmt=chat)

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

### Aan de slag

Nano Banana Pro (Gemini 3 Pro Image) is Googles door redeneren gestuurd beeldmodel voor complex ontwerp, productmock-ups en feitelijke visualisaties. Het accepteert tekst en beeldreferenties en genereert beelden met tekst, met uitvoer in 1K–4K en gedetailleerde creatieve instellingen.

Toegestane invoer

Tekst

Resultaten

Tekst

### Beschikbaar in Ailoot · invoer en methoden

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

Invoertypen

`text`

Uitvoertypen

`text`

Uitvoerformaat

json of SSE

| Veld | Type | Vereiste | Waarden en limieten | Standaard |
| --- | --- | --- | --- | --- |
| Veld`model` | Type`string` | VereisteVereist | Waarden en limieten google/gemini-3-pro-image | Standaard— |
| Veld`messages` | Type`message[]` | VereisteVereist | Waarden en limieten Minimumaantal items: 1 | Standaard— |
| Veld`messages[].role` | Type`string` | VereisteVereist | Waarden en limieten Voorbeelden: system, user, assistant, tool, function Voorwaarden: Deze rollen worden expliciet weergegeven door compatibiliteitstypen in de broncode; de exacte rollenverzameling van het model blijft modelspecifiek. Afhankelijk van het model | Standaard— |
| Veld`messages[].content` | Type`string\|content_part[]\|null` | VereisteOptioneel | Waarden en limieten | Standaard— |
| Veld`messages[].tool_calls` | Type`tool_call[]` | VereisteOptioneel | Waarden en limieten | Standaard— |
| Veld`messages[].tool_call_id` | Type`string` | VereisteOptioneel | Waarden en limieten Geldt wanneer: role=tool; gebruik het werkelijk teruggegeven ID | Standaard— |
| Veld`messages[].name` | Type`string` | VereisteOptioneel | Waarden en limieten | Standaard— |
| Veld`messages[].reasoning_content` | Type`string` | VereisteOptioneel | Waarden en limieten Geldt wanneer: Stuur de werkelijk teruggegeven redeneringen terug wanneer dit model ze gebruikt | Standaard— |
| Veld`messages[].reasoning_details` | Type`object\|array` | VereisteOptioneel | Waarden en limieten Afhankelijk van het model | Standaard— |
| Veld`max_tokens` | Type`integer` | VereisteOptioneel | Waarden en limieten Minimum: 1 Afhankelijk van het model | Standaard— |
| Veld`max_completion_tokens` | Type`integer` | VereisteOptioneel | Waarden en limieten Minimum: 1 Afhankelijk van het model | Standaard— |
| Veld`stream` | Type`boolean` | VereisteOptioneel | Waarden en limieten | Standaardfalse |
| Veld`stream_options.include_usage` | Type`boolean` | VereisteOptioneel | Waarden en limieten Afhankelijk van het model | Standaard— |
| Veld`temperature` | Type`number` | VereisteOptioneel | Waarden en limieten Afhankelijk van het model | Standaard— |
| Veld`top_p` | Type`number` | VereisteOptioneel | Waarden en limieten Afhankelijk van het model | Standaard— |
| Veld`stop` | Type`string\|string[]` | VereisteOptioneel | Waarden en limieten Afhankelijk van het model | Standaard— |
| Veld`tools` | Type`function_tool[]` | VereisteOptioneel | Waarden en limieten Afhankelijk van het model | Standaard— |
| Veld`tools[].type` | Type`string` | VereisteOptioneel | Waarden en limieten function Afhankelijk van het model | Standaard— |
| Veld`tools[].function.name` | Type`string` | VereisteVereist | Waarden en limieten Geldt wanneer: functietool opgegeven | Standaard— |
| Veld`tools[].function.description` | Type`string` | VereisteOptioneel | Waarden en limieten | Standaard— |
| Veld`tools[].function.parameters` | Type`JSON_schema` | VereisteOptioneel | Waarden en limieten | Standaard— |
| Veld`tool_choice` | Type`string\|object` | VereisteOptioneel | Waarden en limieten Afhankelijk van het model | Standaard— |
| Veld`parallel_tool_calls` | Type`boolean` | VereisteOptioneel | Waarden en limieten Afhankelijk van het model | Standaard— |
| Veld`response_format` | Type`object` | VereisteOptioneel | Waarden en limieten Afhankelijk van het model | Standaard— |
| Veld`reasoning_effort` | Type`string` | VereisteOptioneel | Waarden en limieten Afhankelijk van het model | Standaard— |
| Veld`reasoning` | Type`object` | VereisteOptioneel | Waarden en limieten Afhankelijk van het model | Standaard— |
| Veld`service_tier` | Type`string` | VereisteOptioneel | Waarden en limieten Afhankelijk van het model | Standaard— |
| Veld`instructions` | Type`string` | VereisteOptioneel | Waarden en limieten Compatibiliteitsveld | Standaard— |
| Veld`functions` | Type`function[]` | VereisteOptioneel | Waarden en limieten Afhankelijk van het model | Standaard— |
| Veld`function_call` | Type`string\|object` | VereisteOptioneel | Waarden en limieten Afhankelijk van het model | Standaard— |
| Veld`prompt_cache_options` | Type`object` | VereisteOptioneel | Waarden en limieten Afhankelijk van het model | Standaard— |
| Veld`modalities` | Type`string[]` | VereisteOptioneel | Waarden en limieten text | Standaard— |
| Veld`provider` | Type`object` | VereisteOptioneel | Waarden en limieten Voorwaarden: provider.options wordt op deze Ultra-tekstroute geweigerd | Standaard— |
| Veld`cache_control.ttl` | Type`string` | VereisteOptioneel | Waarden en limieten Voorwaarden: 1h wordt op de daadwerkelijke locaties voor promptcaching geweigerd | Standaard— |

Combinaties van invoermaterialen

**Tekst** · UTF8-tekst

`messages[].content`

Methodeparameters en levenscyclus

| Parameter | Contract |
| --- | --- |
| Parameter`content_type` | Contractapplication/json |
| Parameter`required` | Contractmodel, messages |
| Parameter`material_types` | Contracttext |
| Parameter`messages` | Contractberichtenarray met de structuur role/content |
| Parameter`file_material` | Contractwerkelijk UTF-8-document ingevoegd als letterlijke tekst; er wordt geen bestands-ID afgeleid |
| Parameter`optional_controls` | Contractstream, temperature, top\_p, stop, max\_tokens, max\_completion\_tokens, reasoning, response\_format, tools, tool\_choice |
| Parameter`control_scope` | Contractmodelspecifiek; functietools van de gebruiker verschillen van gehoste tools |
| Parameter`output_modalities` | Contracttext |
| Parameter`hosted_operations` | Contractfalse |
| Parameter`multimodal_input_binding` | Contractnull |

Levenscyclus: `synchronous_or_streamed`

Stuur het exacte model-ID mee met messages.

Contextlengte is geen uitvoerlimiet.

Een tekstbestand kan letterlijke tekst aanleveren; beeld-, audio- en bestandsobjectinvoer vereisen een exacte koppeling.

### Tarieven

Tariefverwijzingen voegen geen verzoekopties toe. Ondersteunde parameters staan bij de geselecteerde methode.

Snelle modus

Standaardtarief Wanneer de snelle modus is geselecteerd

Flexmodus

Standaardtarief Wanneer de modus flex is geselecteerd

Maximale redeneerinspanning

Standaardtarief Wanneer bij maximale redeneerinspanning de default-aanpassing wordt gebruikt

Tarieven voor expliciete caching

Niet ingeschakeld Wanneer expliciete caching wordt aangevraagd

#### Ailoot-tarieven

#### Prijzen per configuratie

Koppel elke kostenpost aan de getoonde voorwaarden. Gebruik één tarief voor elke groep alternatieve configuraties.

| Configuratie | Tariefstaffel | Contexttokens, meer dan | Contexttokens, tot en met | Kosten |
| --- | --- | --- | --- | --- |
| ConfiguratieBasistarieven voor tokens | TariefstaffelBasistarief | Contexttokens, meer dan— | Contexttokens, tot en metGeen bovengrens | Kosten Invoer · Invoertokens **$0.004** / 1K tokens Uitvoer · Uitvoertokens **$0.024** / 1K tokens Invoer · Cache lezen **$0.0004** / 1K tokens Invoer · Cache schrijven **$0.00075** / 1K tokens Invoer · Cache schrijven, 1 uur **—** / 1K tokens Uitvoer · Tokens voor afbeeldingsuitvoer **$0.24** / 1K afbeeldingstokens |
| ConfiguratieNiveau 1 voor aanvraaglengte | Tariefstaffel— | Contexttokens, meer dan0 | Contexttokens, tot en metGeen bovengrens | Kosten Invoer · Invoertokens **$0.004** / 1K tokens Uitvoer · Uitvoertokens **$0.024** / 1K tokens Invoer · Cache lezen **$0.0004** / 1K tokens Invoer · Cache schrijven **$0.00075** / 1K tokens Invoer · Cache schrijven, 1 uur **—** / 1K tokens |

#### Details van het referentietarief

Referentiestaffels op modelniveau veranderen de methodeselectie, kostenramingen of afschrijvingen niet. Voor de actieve kostenberekening gelden de tarieven van de geselecteerde Ailoot-methode.

Google: Nano Banana Pro (Gemini 3 Pro Image)

#### Prijzen per configuratie

| Configuratie | Factureringsvoorwaarden | Kosten |
| --- | --- | --- |
| ConfiguratieGoogle: Nano Banana Pro (Gemini 3 Pro Image) · Standaardconfiguratie | FactureringsvoorwaardenStandaardconfiguratie | Kosten Invoer · Invoertokens **US$ 0,004** / 1K tokens Uitvoer · Uitvoertokens **US$ 0,024** / 1K tokens Invoer · Invoerafbeelding **US$ 0,004** / 1K tokens Uitvoer · Uitvoerafbeelding **US$ 0,24** / 1K tokens Invoer · Audio-invoer **US$ 0,004** / 1K tokens Invoer · Lezen uit audiocache **US$ 0,0004** / 1K tokens Uitvoer · Zoeken op het web **US$ 0,028** per zoekopdracht Uitvoer · Redeneertokens **US$ 0,024** / 1K tokens Invoer · Cache lezen **US$ 0,0004** / 1K tokens Invoer · Schrijven naar cache · 5 minuten **US$ 0,00075** / 1K tokens |

Ailoot reserveert vóór een verzoek een geschat bedrag. Na het resultaat worden de uiteindelijke kosten afgerekend op basis van het gemeten verbruik. Bij streaming gebeurt de afrekening op basis van de definitieve verbruiksregistratie. [Zo werken reservering en afrekening →](https://ailoot.ai/docs/nl/billing/reserve/)

### Voorbeeldverzoeken

#### Ailoot Ultra · OpenAI Chat

curlPython SDKPython-stream

```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")
```

### Resultaten ophalen en opslaan

#### Ailoot Ultra · OpenAI Chat

json of SSE

##### Alle voltooide resultaten bewaren

Bewaar elk volledig teruggegeven antwoord, bestand en inhoudsonderdeel.

Bewaar elke keuze en de bijbehorende inhoud, toolaanroepen en redeneringen. Voeg in SSE delta’s samen per keuze-/toolindex en bewaar de uiteindelijke reden van beëindiging en de verbruiksgegevens.

##### Als het oorspronkelijke antwoord moet worden gecontroleerd

Bewaar aanvraag-/antwoord-ID’s en headers. Er wordt geen algemene URL meegeleverd om teksttaken op te halen.

Antwoordvelden

| Veld | Type |
| --- | --- |
| Veld`choices[].index` | Typeinteger |
| Veld`choices[].message.content` | Typestring\|null |
| Veld`choices[].message.tool_calls` | Typetool\_call\[\] |
| Veld`choices[].message.reasoning_content` | Typestring |
| Veld`choices[].message.reasoning_details` | Typeobject\|array |
| Veld`choices[].finish_reason` | Typestring\|null |
| Veld`usage` | Typeobject |

Fouten en vervolgstappen

| Antwoord | Voorwaarde | Volgende stap |
| --- | --- | --- |
| Antwoord400 · `invalid_request_error` | VoorwaardeVerplichte velden, de materiaalrepresentatie of een parameterwaarde zijn ongeldig | Volgende stapCorrigeer de aangegeven velden vóór een nieuwe aanmaakaanvraag. |

### Aliasnamen

#### Modelaliasnamen

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

#### Aliasnamen voor methodepaden

`/v1/images`

#### Gerelateerde aanroeper-ID’s

[`google/gemini-3-pro-image`](https://ailoot.ai/models/nl/#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/nl/#m=google%2Fgemini-3-pro-image&route=Core&caller=gemini-3-pro-image-preview), [`nano-banana-pro`](https://ailoot.ai/models/nl/#m=google%2Fgemini-3-pro-image&route=Core&caller=nano-banana-pro), [`gemini-3-pro-image`](https://ailoot.ai/models/nl/#m=google%2Fgemini-3-pro-image&route=Core&caller=gemini-3-pro-image)

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

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

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

### Aan de slag

Nano Banana Pro (Gemini 3 Pro Image) is Googles door redeneren gestuurd beeldmodel voor complex ontwerp, productmock-ups en feitelijke visualisaties. Het accepteert tekst en beeldreferenties en genereert beelden met tekst, met uitvoer in 1K–4K en gedetailleerde creatieve instellingen.

Toegestane invoer

Tekst · Afbeeldingen

Resultaten

Afbeeldingen

### Beschikbaar in Ailoot · invoer en methoden

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

Invoertypen

`text`, `image`

Uitvoertypen

`image`

| Veld | Type | Vereiste | Waarden en limieten | Standaard |
| --- | --- | --- | --- | --- |
| Veld`model` | Type`string` | VereisteVereist | Waarden en limieten google/gemini-3-pro-image | Standaard— |
| Veld`prompt` | Type`string` | VereisteVereist | Waarden en limieten Minimumlengte: 1 | Standaard— |
| Veld`resolution` | Type`string` | VereisteOptioneel | Waarden en limieten 1K, 2K, 4K | Standaard— |
| Veld`aspect_ratio` | Type`string` | VereisteOptioneel | Waarden en limieten 1:1, 2:3, 3:2, 3:4, 4:3, 4:5, 5:4, 9:16, 16:9, 21:9 | Standaard— |
| Veld`n` | Type`integer` | VereisteOptioneel | Waarden en limieten Minimum: 1 Maximum: 1 | Standaard— |
| Veld`input_references` | Type`array` | VereisteOptioneel | Waarden en limieten Minimumaantal items: 0 Maximumaantal items: 14 | Standaard— |
| Veld`provider` | Type`object` | VereisteOptioneel | Waarden en limieten | Standaard— |

Methodeparameters en levenscyclus

| Parameter | Contract |
| --- | --- |
| Parameter`content_type` | Contractapplication/json |
| Parameter`required` | Contractmodel, prompt |
| Parameter`material_types` | Contracttext, image |

Levenscyclus: `synchronous_result_then_owned_library`

`GET /v1/media/tasks/{task_id}` · de daadwerkelijk geretourneerde task\_id of het record in de mediabibliotheek

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

`GET /v1/media/assets`

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

### Tarieven

##### Zo worden de uiteindelijke kosten berekend

De weergegeven tarieven geven een schatting van de kosten vóór de generatie. Het definitieve bedrag wordt berekend op basis van de kosten die voor de oorspronkelijke generatie zijn geregistreerd. De gemeten duur van de uitvoer en de geschatte hoeveelheden zijn niet de definitieve factureerbare hoeveelheid.

Tariefverwijzingen voegen geen verzoekopties toe. Ondersteunde parameters staan bij de geselecteerde methode.

Snelle modus

Niet opgegeven Wanneer de snelle modus is geselecteerd

Flexmodus

Niet opgegeven Wanneer de modus flex is geselecteerd

Maximale redeneerinspanning

Niet opgegeven Wanneer bij maximale redeneerinspanning de default-aanpassing wordt gebruikt

#### Geschatte tarieven ter vergelijking

#### Prijzen per configuratie

Koppel elke kostenpost aan de getoonde voorwaarden. Gebruik één tarief voor elke groep alternatieve configuraties.

| Configuratie | Tariefstaffel | Verwachte hoeveelheid | Kosten |
| --- | --- | --- | --- |
| ConfiguratieBasistarieven voor tokens | TariefstaffelBasistarief | Verwachte hoeveelheid— | Kosten Invoer · Invoertokens · Schatting uitsluitend ter vergelijking **—** / 1K tokens Uitvoer · Uitvoertokens · Schatting uitsluitend ter vergelijking **—** / 1K tokens Invoer · Cache lezen · Schatting uitsluitend ter vergelijking **—** / 1K tokens Invoer · Cache schrijven · Schatting uitsluitend ter vergelijking **—** / 1K tokens Invoer · Cache schrijven, 1 uur · Schatting uitsluitend ter vergelijking **—** / 1K tokens |
| ConfiguratieGeschatte generatiekosten | Tariefstaffel— | Verwachte hoeveelheidschatting voor één generatie | Kosten Uitvoer · Geschatte generatiekosten · Schatting uitsluitend ter vergelijking **$0.98304** schatting vóór generatie Deze schatting is geen extra bedrag of vast tarief voor de voltooide generatie. |

Ailoot reserveert vóór een verzoek een geschat bedrag. Na het resultaat worden de uiteindelijke kosten afgerekend op basis van het gemeten verbruik. Bij streaming gebeurt de afrekening op basis van de definitieve verbruiksregistratie. [Zo werken reservering en afrekening →](https://ailoot.ai/docs/nl/billing/reserve/)

### Voorbeeldverzoeken

#### Ailoot Ultra · Afbeeldingen

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
```

### Resultaten ophalen en opslaan

#### Ailoot Ultra · Afbeeldingen

Download elke teruggegeven afbeelding of sla de Base64-inhoud ervan op

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

Lezen van andere inhoud

Bestaande eigen bestanden ophalen

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

##### Alle voltooide resultaten bewaren

Sla elke voltooide afbeelding op; haal elke teruggegeven URL op of decodeer de bijbehorende Base64-inhoud.

Bewaar het volledige antwoord en de headers, alle daadwerkelijke uitvoer, de oorspronkelijk geretourneerde identificatoren en alle gebruiksvelden. Herstel de oorspronkelijke bewerking zonder de aanmaakaanvraag opnieuw in te dienen.

##### Als het oorspronkelijke antwoord moet worden gecontroleerd

Bewaar de geretourneerde X-Client-Request-ID voor reconciliatie. Lees alleen daadwerkelijk geretourneerde task\_id/asset\_id-waarden of de eigen mediabibliotheek uit; bouw nooit een taak-URL op basis van de bewerkings-ID en dien de aanmaakaanvraag nooit opnieuw in.

Antwoordvelden

| Veld | Type |
| --- | --- |
| Veld`created` | Type |
| Veld`data[].url` | Type |
| Veld`data[].b64_json` | Type |
| Veld`usage` | Type |

### Aliasnamen

#### Modelaliasnamen

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

#### Aliasnamen voor methodepaden

`/v1/images`

#### Gerelateerde aanroeper-ID’s

[`google/gemini-3-pro-image`](https://ailoot.ai/models/nl/#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/nl/#m=google%2Fgemini-3-pro-image&route=Core&caller=gemini-3-pro-image-preview&fmt=images), [`nano-banana-pro`](https://ailoot.ai/models/nl/#m=google%2Fgemini-3-pro-image&route=Core&caller=nano-banana-pro&fmt=images), [`gemini-3-pro-image`](https://ailoot.ai/models/nl/#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/nl/#m=google%2Fgemini-3-pro-image&route=Ultra&caller=google%2Fgemini-3-pro-image&fmt=messages)

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

### Aan de slag

Nano Banana Pro (Gemini 3 Pro Image) is Googles door redeneren gestuurd beeldmodel voor complex ontwerp, productmock-ups en feitelijke visualisaties. Het accepteert tekst en beeldreferenties en genereert beelden met tekst, met uitvoer in 1K–4K en gedetailleerde creatieve instellingen.

Toegestane invoer

Tekst

Resultaten

json · sse

### Beschikbaar in Ailoot · invoer en methoden

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

Invoertypen

`text`

Uitvoertypen

`json`, `sse`

Uitvoerformaat

JSON of SSE

| Veld | Type | Vereiste | Waarden en limieten | Standaard |
| --- | --- | --- | --- | --- |
| Veld`model` | Type`string` | VereisteVereist | Waarden en limieten google/gemini-3-pro-image | Standaard— |
| Veld`messages` | Type`message[]` | VereisteVereist | Waarden en limieten | Standaard— |
| Veld`messages[].role` | Type`string` | VereisteVereist | Waarden en limieten user, assistant | Standaard— |
| Veld`messages[].content` | Type`string` | VereisteVereist | Waarden en limieten | Standaard— |
| Veld`max_tokens` | Type`integer` | VereisteVereist | Waarden en limieten | Standaard— |
| Veld`stream` | Type`boolean` | VereisteOptioneel | Waarden en limieten | Standaardfalse |

Combinaties van invoermaterialen

**Tekst** · UTF-8-tekst

`messages[].content als tekenreeks`

Methodeparameters en levenscyclus

| Parameter | Contract |
| --- | --- |
| Parameter`content_type` | Contractapplication/json |
| Parameter`required` | Contractmodel, messages, max\_tokens |
| Parameter`optional_controls` | Contractstream |
| Parameter`material_types` | Contracttext |
| Parameter`text_file_material` | ContractLees het werkelijke UTF-8-document en plaats de tekst ervan in de aangegeven invoer of in de inhoudstekenreeks van een bericht. |

Levenscyclus: `synchronous_or_streamed`

### Tarieven

Tariefverwijzingen voegen geen verzoekopties toe. Ondersteunde parameters staan bij de geselecteerde methode.

Snelle modus

Standaardtarief Wanneer de snelle modus is geselecteerd

Flexmodus

Standaardtarief Wanneer de modus flex is geselecteerd

Maximale redeneerinspanning

Standaardtarief Wanneer bij maximale redeneerinspanning de default-aanpassing wordt gebruikt

Tarieven voor expliciete caching

Niet ingeschakeld Wanneer expliciete caching wordt aangevraagd

#### Ailoot-tarieven

#### Prijzen per configuratie

Koppel elke kostenpost aan de getoonde voorwaarden. Gebruik één tarief voor elke groep alternatieve configuraties.

| Configuratie | Tariefstaffel | Contexttokens, meer dan | Contexttokens, tot en met | Kosten |
| --- | --- | --- | --- | --- |
| ConfiguratieBasistarieven voor tokens | TariefstaffelBasistarief | Contexttokens, meer dan— | Contexttokens, tot en metGeen bovengrens | Kosten Invoer · Invoertokens **$0.004** / 1K tokens Uitvoer · Uitvoertokens **$0.024** / 1K tokens Invoer · Cache lezen **$0.0004** / 1K tokens Invoer · Cache schrijven **$0.00075** / 1K tokens Invoer · Cache schrijven, 1 uur **—** / 1K tokens Uitvoer · Tokens voor afbeeldingsuitvoer **$0.24** / 1K afbeeldingstokens |
| ConfiguratieNiveau 1 voor aanvraaglengte | Tariefstaffel— | Contexttokens, meer dan0 | Contexttokens, tot en metGeen bovengrens | Kosten Invoer · Invoertokens **$0.004** / 1K tokens Uitvoer · Uitvoertokens **$0.024** / 1K tokens Invoer · Cache lezen **$0.0004** / 1K tokens Invoer · Cache schrijven **$0.00075** / 1K tokens Invoer · Cache schrijven, 1 uur **—** / 1K tokens |

Ailoot reserveert vóór een verzoek een geschat bedrag. Na het resultaat worden de uiteindelijke kosten afgerekend op basis van het gemeten verbruik. Bij streaming gebeurt de afrekening op basis van de definitieve verbruiksregistratie. [Zo werken reservering en afrekening →](https://ailoot.ai/docs/nl/billing/reserve/)

### Voorbeeldverzoeken

#### Ailoot Ultra · Anthropic Messages

Volledige minimale JSON-bodycurl · gebruik je UTF-8-documentPython · sla het volledige resultaat op

```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))
```

### Resultaten ophalen en opslaan

#### Ailoot Ultra · Anthropic Messages

JSON of SSE

##### Alle voltooide resultaten bewaren

Bewaar elk volledig teruggegeven antwoord, bestand en inhoudsonderdeel.

Bewaar alle inhoudsblokken, handtekeningen van redeneringen en werkelijke toolgebruik-ID’s. Voeg alle SSE-blokdelta’s samen; het eerste tekstblok is niet de volledige uitvoer.

##### Als het oorspronkelijke antwoord moet worden gecontroleerd

Bewaar aanvraag-/antwoord-ID’s en headers. Er wordt geen algemene URL meegeleverd om teksttaken op te halen.

Antwoordvelden

| Veld | Type |
| --- | --- |
| Veld`id` | Typestring |
| Veld`model` | Typestring |
| Veld`content[]` | Typetext\|thinking\|tool\_use\|other content block |
| Veld`stop_reason` | Typestring\|null |
| Veld`usage` | Typeobject |

Fouten en vervolgstappen

| Antwoord | Voorwaarde | Volgende stap |
| --- | --- | --- |
| Antwoord400 · `invalid_request_error` | VoorwaardeVerplichte velden, de materiaalrepresentatie of een parameterwaarde zijn ongeldig | Volgende stapCorrigeer de aangegeven velden vóór een nieuwe aanmaakaanvraag. |

### Aliasnamen

#### Modelaliasnamen

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

#### Aliasnamen voor methodepaden

`/v1/images`

#### Gerelateerde aanroeper-ID’s

[`google/gemini-3-pro-image`](https://ailoot.ai/models/nl/#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/nl/#m=google%2Fgemini-3-pro-image&route=Core&caller=gemini-3-pro-image-preview), [`nano-banana-pro`](https://ailoot.ai/models/nl/#m=google%2Fgemini-3-pro-image&route=Core&caller=nano-banana-pro), [`gemini-3-pro-image`](https://ailoot.ai/models/nl/#m=google%2Fgemini-3-pro-image&route=Core&caller=gemini-3-pro-image)

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

Welke invoer en resultaten zijn beschikbaar?

`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`

Welke velden gebruikt het verzoek?

`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`

Welke limieten gelden?

`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`

Verbind Ailoot met Claude Code, OpenCode, Hermes of je eigen applicatie.

## Het bedrijf en zijn projectenportefeuille

Het bedrijf en zijn projectenportefeuille: miljoenen klanten; maandelijkse verkopen in de miljarden.

## Koop tokens met korting.

Abonnementsvoordeel voor regelmatig gebruik. Promotiecodes geven tot 50% korting op tokens.

Abonnement

Kies een abonnement met korting voor je terugkerende verzoeken.

Promotiecode tot 50%

Vul de code bij aankoop in. De prijs wordt volgens de lopende actie herberekend.

Kosten in de geschiedenis

Model, tokens en bedrag worden per verzoek bewaard.

[Kies een abonnement](https://ailoot.ai/docs/nl/billing/subscriptions/) · [Bekijk modelprijzen](https://ailoot.ai/models/nl/)

## Verbind de API met het product dat je verkoopt.

SaaS, apps en bots volgens de openbare aanbodvoorwaarden en licentieovereenkomst van Ailoot. Vraag voor doorverkoop een resellerlicentie aan.

Commerciële applicatie

Voeg tekst-, beeld-, video- en geluidsgeneratie aan betaalde functies van je service toe.

Resellerlicentie

Stuur een projectbeschrijving en toegangsschema. Vraag schriftelijke voorwaarden voor gebruik en doorverkoop.

Documenten op de site

Aanbodvoorwaarden, licentieovereenkomst en gegevensbeleid zijn vóór het verbinden beschikbaar.

[Vraag een resellerlicentie aan](mailto:support@ailoot.ai) · [Aanbodvoorwaarden en licentieovereenkomst](https://ailoot.ai/legal/offer?lang=nl)

## Ailoot · Het bedrijf en zijn projectenportefeuille





Ailoot bouwt op opgebouwde operationele ervaring, een groot klantenbestand, een stabiele dienst en doorlopende KPI-controle.





Het bedrijf en zijn projectenportefeuille: miljoenen klanten; maandelijkse verkopen in de miljarden.





Ailoot gebruikt die operationele ervaring voor API-toegang tot AI-functies in klantproducten, agents, applicaties en automatiseringen.
