Google: Nano Banana Pro (Gemini 3 Pro Image)
Nano Banana Pro (Gemini 3 Pro Image) on Googlen päättelyyn perustuva kuvamalli vaativiin suunnittelutehtäviin, tuotteiden havainnekuvien luomiseen ja faktatietoon perustuviin visualisointeihin. Se ottaa vastaan tekstiä ja viitekuvia ja tuottaa kuvia teksteineen 1K–4K-koossa. Luovaa toteutusta voi ohjata yksityiskohtaisesti.
- Ailoot · Kuvat
POST /v1/images/generationsgemini-3-pro-image - Ailoot · Kuvat
POST /v1/images/generationsgemini-3-pro-image-preview - Ailoot · Kuvat
POST /v1/images/generationsnano-banana-pro - Ailoot Ultra · OpenAI Chat
POST /v1/chat/completionsgoogle/gemini-3-pro-image - Ailoot Ultra · Kuvat
POST /v1/images/generationsgoogle/gemini-3-pro-image - Ailoot Ultra · Anthropic Messages
POST /v1/messagesgoogle/gemini-3-pro-image
Tietoa mallista
Tämä kuvaus kattaa mallin ominaisuudet. Ailootissa saatavilla olevat syötteet, tulosteet ja asetukset luetellaan alla valitulle menetelmälle.
Nano Banana Pro on Googlen Gemini 3 Pro Image -malli päättelyn ohjaamaan kuvien generointiin ja muokkaukseen. Valmistaja painottaa sen käyttökohteina vaativaa graafista suunnittelua, yksityiskohdiltaan tarkkoja tuotevisualisointeja ja tosiasioihin perustuvaa datan visualisointia. Malli hyväksyy syötteenä tekstiä ja kuvia ja tuottaa kuvia ja tekstiä. Tämä Pro-nimellä julkaistu kuvaversio perustuu Gemini 3 Pro -malliin, mutta säilyttää oman kuvatehtävien syöte- ja ominaisuusprofiilinsa.
Malli tukee 1K-, 2K- ja 4K-kuvia. Dokumentoidut kuvasuhteet ovat 1:1, 2:3, 3:2, 3:4, 4:3, 4:5, 5:4, 9:16, 16:9 ja 21:9. Neliönmuotoisen 4K-kuvan koko on 4096 × 4096; kuvasuhteeltaan 16:9 olevan 4K-kuvan koko on 5504 × 3072. Valitse resoluutio ja kuvasuhde tarvitsemasi tuotoksen mukaan, olipa kyseessä pystysuuntainen juliste, tuoteasetelma tai leveä havainnollistava grafiikka. Gemini 3.1 Flash Image -mallin 0.5K-vaihtoehto ja siinä lisäksi tuetut äärimmäiset kuvasuhteet eivät kuulu tähän Pro-taulukkoon.
Malli tukee selkeän tekstin renderöintiä julisteisiin, kaavioihin ja muihin suunniteltuihin visuaalisiin aineistoihin. Anna monimutkaista infografiikkaa varten sen pohjana olevat tosiasiat, täsmällinen sanamuoto, lukujärjestys sekä tieto siitä, miten merkinnät liittyvät visuaalisiin elementteihin. Erota välitettävä tieto halutusta taiteellisesta tyylistä. Google suosittelee valmistelemaan tekstin ensin ja generoimaan vasta sitten kuvan, joka sisältää tekstin. Tämä on erityisen hyödyllistä sommitelmassa, jossa yhdistyvät otsikko, kaavio ja useita lyhyitä kuvatekstejä.
Usean kuvan syöte tukee enintään 14 viitekuvaa. Googlen ominaisuustaulukossa mainitaan enintään kuusi kohteiden tarkkaa toistoa tukevaa viitekuvaa, enintään viisi hahmojen yhdenmukaisuutta tukevaa viitekuvaa ja enintään kolme tyyliviitekuvaa. Nämä roolit auttavat useista lähteistä koostetun kuvan valmistelussa: tuotevalokuva määrittää ulkoasun, erillinen kuva määrittää ympäristön ja tyyliviitekuva ohjaa visuaalista käsittelyä. Kerro mallille, mitkä yksityiskohdat ovat määrääviä ja mitkä viitekuvat toimivat inspiraation lähteinä, sen sijaan että pyytäisit sitä yhdistämään kaikki näkyvät piirteet valikoimatta.
Google Search -hakuun perustuva lähteistys voi tarjota todellista maailmaa koskevaa tietoa faktapohjaiseen visualisointiin tai ajankohtaiset olosuhteet huomioivaan kohtaukseen. Pro-kuvamallin työnkulun dokumentaatiossa kuvataan verkkolähteisiin perustuva lähteistys; Image Search -laajennus on dokumentoitu nimenomaan Nano Banana 2.1- ja Gemini 3.1 Flash Image -malleille. Kun teet dataa esittävää grafiikkaa, anna siinä näytettävät arvot tai pyydä lähteisiin perustuvia tietoja kuvan tuottamiseen käytettävässä työnkulussa. Määritä sitten suhteet, merkinnät ja asettelu yksiselitteisesti. Hakutietoa hyödyntävä generointi tuottaa edelleen tarkistettavan kuvan eikä korvaa kuvassa esitettyjen tosiasioiden tarkistamista.
Päättely tukee monimutkaisen kehotteen laatimista ennen lopullista renderöintiä. Kuvien generoinnin oppaassa kuvataan lopullisesta tuotoksesta erillisiä välivaiheen kuvia, joilla testataan sommittelua ja logiikkaa. Älä sovella tähän Pro-versioon Nano Banana 2 -mallin minimal/high-asetusten taulukkoa tai Nano Banana 2.1 -mallin taulukkoa, jossa medium on oletusasetus. Anna vaativaa suunnittelutehtävää varten kattava tehtävänanto, jossa määritellään visuaalinen hierarkia, kohteiden väliset vaaditut suhteet ja elementit, joiden on säilyttävä myöhemmissä muokkauksissa.
Mallikortissa kuvataan merkittäviä rajoituksia, joita mallilla edelleen on: hyvin pieni teksti ja pitkät tekstijaksot voivat renderöityä huonosti, hahmon ulkonäkö voi muuttua viitekuvaan nähden, ja maskin tai piirrosluonnoksen avulla tehdyt muokkaukset voivat noudattaa ohjetta vain osittain tai jättää kuvaan jälkiä. Malli voi myös sekoittaa vasemman ja oikean tai kopioida lähdeaineiston elementin uuteen sommitelmaan. Kun muokkaat tuotteen visualisointia, määritä selkeästi säilytettävä geometria ja merkinnät ja tarkista muokattu alue; kaavioissa vertaa nuolten suuntia ja kohteiden keskinäisiä sijainteja.
Nykyisen API-taulukon mukaan syötteen enimmäispituus on 65 536 tokenia ja tulosteen enimmäispituus 32 768 tokenia. Kuvien generointi, päättely, hakutuloksiin perustuva lähteistys ja eräkäsittely ovat tuettuja; äänen generointi, funktiokutsut, koodin suorittaminen, välimuistin käyttö, rakenteiset tulosteet, tiedostohaku, URL-konteksti ja Live API eivät ole tuettuja. Kuvatehtävä ei hyväksy ääni- eikä videosyötettä tässä profiilissa. Generoidut kuvat sisältävät SynthID:n, eikä malli aina tuota täsmälleen pyydettyä määrää kuvia.
Käytännön tuotevisualisointia koskevassa tehtävänannossa voi yhdistää tuotteen kuvan, valaistuksen viitekuvan ja täsmällisen otsikon: ”Säilytä tuotteen mittasuhteet ja sen tekstien ulkoasu, esitä tuote vaalealla kivipinnalla pehmeässä sivuvalossa ja jätä kuvan ylin kolmannes vapaaksi annetulle otsikolle.” Yksilöi faktapohjaista kaaviota varten jokainen kohde ja yhteys ja anna hyväksytyt merkinnät. Tarkenna tulosta keskustelussa nimeämällä yksi muutos ja säilytettävät piirteet. Pidä valittu kuva ja siihen liittyvä selittävä teksti yhdessä suunnittelutyön tuotoksena.
Käytännön tehtävä
Käytännön tehtävä
Tekninen esimerkki englanniksi
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.Odotettu tulos
One landscape image with four labeled stages and arrows matching the supplied cycle.Tarkista tulos
Inspect that arrows connect RETURN to INSPECT to WASH to REFILL in that order, with exact labels.Ailoot · Kuvat POST /v1/images/generations gemini-3-pro-image
gemini-3-pro-imagegemini-3-pro-imagegemini-3-pro-image-previewnano-banana-pro
Aloitus
Nano Banana Pro (Gemini 3 Pro Image) on Googlen päättelyyn perustuva kuvamalli vaativiin suunnittelutehtäviin, tuotteiden havainnekuvien luomiseen ja faktatietoon perustuviin visualisointeihin. Se ottaa vastaan tekstiä ja viitekuvia ja tuottaa kuvia teksteineen 1K–4K-koossa. Luovaa toteutusta voi ohjata yksityiskohtaisesti.
- Hyväksytyt syötteet
- Teksti
- Tulokset
- Kuvat
Saatavilla Ailootissa · syötteet & menetelmät
Ailoot · Kuvat POST /v1/images/generations
- Syötetyypit
text- Tulostyypit
image- Konteksti
- 65 536 tokens
- Enimmäistuloste
- 32 768 tokens
- Tulosteen muoto
- Kuvatiedosto
| Kenttä | Tyyppi | Vaatimus | Arvot & rajat | Oletus |
|---|---|---|---|---|
Kenttämodel | Tyyppistring | VaatimusPakollinen | Arvot & rajat gemini-3-pro-image | Oletus— |
Kenttäprompt | Tyyppistring | VaatimusPakollinen | Arvot & rajat Vähimmäispituus: 1 | Oletus— |
Kenttän | Tyyppiinteger | VaatimusValinnainen | Arvot & rajat Vähimmäismäärä: 1 | Oletus1 |
Kenttäresponse_format | Tyyppistring | VaatimusValinnainen | Arvot & rajat url, b64_json | Oletus— |
Kenttästream | Tyyppiboolean | VaatimusValinnainen | Arvot & rajat | Oletusfalse |
Kenttäsize | Tyyppistring | VaatimusValinnainen | Arvot & rajat Riippuu mallista | Oletus— |
Kenttäquality | Tyyppistring | VaatimusValinnainen | Arvot & rajat Riippuu mallista | Oletus— |
Kenttäbackground | Tyyppistring | VaatimusValinnainen | Arvot & rajat Riippuu mallista | Oletus— |
Kenttäoutput_format | Tyyppistring | VaatimusValinnainen | Arvot & rajat Riippuu mallista | Oletus— |
Kenttäoutput_compression | Tyyppiinteger | VaatimusValinnainen | Arvot & rajat Riippuu mallista | Oletus— |
Kenttämoderation | Tyyppistring | VaatimusValinnainen | Arvot & rajat Riippuu mallista | Oletus— |
Kenttäinput_fidelity | Tyyppistring | VaatimusValinnainen | Arvot & rajat Riippuu mallista | Oletus— |
Kenttästyle | Tyyppistring | VaatimusValinnainen | Arvot & rajat Riippuu mallista | Oletus— |
Kenttäpartial_images | Tyyppiinteger | VaatimusValinnainen | Arvot & rajat Riippuu mallista | Oletus— |
Syöteaineistojen yhdistelmät
Tekstistä kuvaksi · Pakollinen: prompt
Menetelmän parametrit ja elinkaari
| Parametri | Sopimus |
|---|---|
Parametrimaterial_types | Sopimustext |
Parametrirequired | Sopimusmodel, prompt |
Parametrioptional_controls | Sopimusnull |
Parametricontent_type | Sopimusapplication/json |
Elinkaari: synchronous_result_then_owned_library
GET /v1/media/tasks/{task_id} · todellisuudessa palautettu task_id tai mediakirjaston tietue
GET /v1/media/assets/{asset_id}/content
GET /v1/media/assets
GET /v1/media/assets/{asset_id}
Menetelmien rakenteet ja ID:t ovat täsmällisiä; toimittajan kyvykkyys on erillinen pyynnön hyväksymisestä.
Hinnoittelu
Ailoot-menetelmien hinnat
POST /v1/images/generations- Syöte
- 0,002 $ / 1K kuvatokenia
- Tuloste
- 0,134 $ 1K-kuvaa kohden
- Tuloste
- 0,134 $ 2K-kuvaa kohden
- Tuloste
- 0,24 $ 4K-kuvaa kohden
Ailoot varaa arvioidun summan ennen pyyntöä. Tuloksen jälkeen lopullinen veloitus toteutetaan mitatun käytön perusteella. Suoratoiston veloituksessa käytetään lopullista käyttötietuetta. Varauksen ja lopullisen veloituksen toiminta →
Viitehinnaston tiedot
Mallitason viitehinnastot eivät muuta menetelmän valintaa, hinta-arvioita tai veloituksia. Käytössä olevat veloitukset käyttävät valitun Ailoot-menetelmän hintoja.
Mallin viitehinnastot
Hinnat asetusten mukaan
| Asetukset | Hinnasto | Veloitus |
|---|---|---|
| AsetuksetUltra | HinnastoPerushinta | Veloitus Syöte · Syötetokenit $0.004000 / 1K tokenia Tuloste · Tulostokenit $0.024000 / 1K tokenia Syöte · kuva $0.004000 / 1K tokenia Tuloste · kuvatuloste $0.24000 / 1K tokenia Syöte · ääni $0.004000 / 1K tokenia Syöte · äänisyötteen välimuisti $0.0004000 / 1K tokenia Tuloste · verkkohaku $0.028 verkkohakua kohden Tuloste · sisäinen päättely $0.024000 / 1K tokenia Syöte · Välimuistin luku $0.0004000 / 1K tokenia Syöte · Välimuistiin kirjoitus $0.000750000 / 1K tokenia |
Esimerkkipyynnöt
Ailoot · Kuvat
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
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])
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");
Vastaanota ja tallenna tulokset
Ailoot · Kuvat
Lataa jokainen palautettu kuva tai tallenna sen Base64-sisältö
GET /v1/media/tasks/{task_id}GET /v1/media/assets/{asset_id}/contentGET /v1/media/assetsGET /v1/media/assets/{asset_id}
Säilytä kaikki valmistuneet tulokset
Tallenna jokainen valmistunut kuva; nouda jokainen palautettu URL tai pura sen Base64-sisältö.
Tallenna jokainen data-alkio. Pura jokainen b64_json-arvo tai lataa jokaisen palautetun allekirjoitetun URL-osoitteen sisältö. Valitse tiedostopääte todellisen MIME-tyypin tai tavusisällön perusteella.
Jos alkuperäinen vastaus on tarkistettava
Jos kuvan generoinnin tai muokkauksen tulos edellyttää tarkistusta, säilytä alkuperäinen operation_id/X-Client-Request-ID ja palautetut tulostiedot. Hae olemassa olevat omistamasi tulokset mediakirjastosta käyttämällä todellisia task_id- tai asset_id-arvoja. Älä lähetä generointi- tai muokkauspyyntöä uudelleen äläkä muodosta tilakyselyn URL-osoitetta operation_id-arvosta.
Vastauksen kentät
| Kenttä | Tyyppi |
|---|---|
Kenttäcreated | Tyyppiinteger |
Kenttädata[].url | Tyyppistring |
Kenttädata[].b64_json | Tyyppibase64 string |
Kenttäusage | Tyyppiobject |
Virheet ja seuraavat vaiheet
| Vastaus | Ehto | Seuraava vaihe |
|---|---|---|
Vastaus400 · invalid_request_error | EhtoVirheelliset pakolliset kentät, aineiston esitysmuoto tai parametrin arvo | Seuraava vaiheKorjaa ilmoitetut kentät ennen uutta luontipyyntöä. |
Vastausserver_error | EhtoPalautettu vastaus ilmoittaa, että operaatio tai tulos edellyttää tarkistusta | Seuraava vaiheSäilytä alkuperäinen palautettu operaation tai tehtävän ID, pyynnön otsakkeet ja vastaus; jatka kyseisen alkuperäisen operaation tuettuja lukutoimintoja. Älä lähetä luontipyyntöä uudelleen. |
Aliakset
Mallin aliakset
Ailoot gemini-3-pro-image, gemini-3-pro-image-preview, nano-banana-pro
Ailoot Ultra google/gemini-3-pro-image
Menetelmäpolkujen aliakset
/v1/images
Liittyvät kutsujan ID:t
google/gemini-3-pro-image, gemini-3-pro-image-preview, nano-banana-pro, gemini-3-pro-image
Ailoot · Kuvat POST /v1/images/generations gemini-3-pro-image-preview
gemini-3-pro-image-previewgemini-3-pro-imagegemini-3-pro-image-previewnano-banana-pro
Aloitus
Nano Banana Pro (Gemini 3 Pro Image) on Googlen päättelyyn perustuva kuvamalli vaativiin suunnittelutehtäviin, tuotteiden havainnekuvien luomiseen ja faktatietoon perustuviin visualisointeihin. Se ottaa vastaan tekstiä ja viitekuvia ja tuottaa kuvia teksteineen 1K–4K-koossa. Luovaa toteutusta voi ohjata yksityiskohtaisesti.
- Hyväksytyt syötteet
- Teksti
- Tulokset
- Kuvat
Saatavilla Ailootissa · syötteet & menetelmät
Ailoot · Kuvat POST /v1/images/generations
- Syötetyypit
text- Tulostyypit
image- Konteksti
- 65 536 tokens
- Enimmäistuloste
- 32 768 tokens
- Tulosteen muoto
- Kuvatiedosto
| Kenttä | Tyyppi | Vaatimus | Arvot & rajat | Oletus |
|---|---|---|---|---|
Kenttämodel | Tyyppistring | VaatimusPakollinen | Arvot & rajat gemini-3-pro-image-preview | Oletus— |
Kenttäprompt | Tyyppistring | VaatimusPakollinen | Arvot & rajat Vähimmäispituus: 1 | Oletus— |
Kenttän | Tyyppiinteger | VaatimusValinnainen | Arvot & rajat Vähimmäismäärä: 1 | Oletus1 |
Kenttäresponse_format | Tyyppistring | VaatimusValinnainen | Arvot & rajat url, b64_json | Oletus— |
Kenttästream | Tyyppiboolean | VaatimusValinnainen | Arvot & rajat | Oletusfalse |
Kenttäsize | Tyyppistring | VaatimusValinnainen | Arvot & rajat Riippuu mallista | Oletus— |
Kenttäquality | Tyyppistring | VaatimusValinnainen | Arvot & rajat Riippuu mallista | Oletus— |
Kenttäbackground | Tyyppistring | VaatimusValinnainen | Arvot & rajat Riippuu mallista | Oletus— |
Kenttäoutput_format | Tyyppistring | VaatimusValinnainen | Arvot & rajat Riippuu mallista | Oletus— |
Kenttäoutput_compression | Tyyppiinteger | VaatimusValinnainen | Arvot & rajat Riippuu mallista | Oletus— |
Kenttämoderation | Tyyppistring | VaatimusValinnainen | Arvot & rajat Riippuu mallista | Oletus— |
Kenttäinput_fidelity | Tyyppistring | VaatimusValinnainen | Arvot & rajat Riippuu mallista | Oletus— |
Kenttästyle | Tyyppistring | VaatimusValinnainen | Arvot & rajat Riippuu mallista | Oletus— |
Kenttäpartial_images | Tyyppiinteger | VaatimusValinnainen | Arvot & rajat Riippuu mallista | Oletus— |
Syöteaineistojen yhdistelmät
Tekstistä kuvaksi · Pakollinen: prompt
Menetelmän parametrit ja elinkaari
| Parametri | Sopimus |
|---|---|
Parametrimaterial_types | Sopimustext |
Parametrirequired | Sopimusmodel, prompt |
Parametrioptional_controls | Sopimusnull |
Parametricontent_type | Sopimusapplication/json |
Elinkaari: synchronous_result_then_owned_library
GET /v1/media/tasks/{task_id} · todellisuudessa palautettu task_id tai mediakirjaston tietue
GET /v1/media/assets/{asset_id}/content
GET /v1/media/assets
GET /v1/media/assets/{asset_id}
Menetelmien rakenteet ja ID:t ovat täsmällisiä; toimittajan kyvykkyys on erillinen pyynnön hyväksymisestä.
Hinnoittelu
Ailoot-menetelmien hinnat
POST /v1/images/generations- Syöte
- 0,002 $ / 1K kuvatokenia
- Tuloste
- 0,134 $ 1K-kuvaa kohden
- Tuloste
- 0,134 $ 2K-kuvaa kohden
- Tuloste
- 0,24 $ 4K-kuvaa kohden
Ailoot varaa arvioidun summan ennen pyyntöä. Tuloksen jälkeen lopullinen veloitus toteutetaan mitatun käytön perusteella. Suoratoiston veloituksessa käytetään lopullista käyttötietuetta. Varauksen ja lopullisen veloituksen toiminta →
Viitehinnaston tiedot
Mallitason viitehinnastot eivät muuta menetelmän valintaa, hinta-arvioita tai veloituksia. Käytössä olevat veloitukset käyttävät valitun Ailoot-menetelmän hintoja.
Mallin viitehinnastot
Hinnat asetusten mukaan
| Asetukset | Hinnasto | Veloitus |
|---|---|---|
| AsetuksetUltra | HinnastoPerushinta | Veloitus Syöte · Syötetokenit $0.004000 / 1K tokenia Tuloste · Tulostokenit $0.024000 / 1K tokenia Syöte · kuva $0.004000 / 1K tokenia Tuloste · kuvatuloste $0.24000 / 1K tokenia Syöte · ääni $0.004000 / 1K tokenia Syöte · äänisyötteen välimuisti $0.0004000 / 1K tokenia Tuloste · verkkohaku $0.028 verkkohakua kohden Tuloste · sisäinen päättely $0.024000 / 1K tokenia Syöte · Välimuistin luku $0.0004000 / 1K tokenia Syöte · Välimuistiin kirjoitus $0.000750000 / 1K tokenia |
Esimerkkipyynnöt
Ailoot · Kuvat
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
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])
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");
Vastaanota ja tallenna tulokset
Ailoot · Kuvat
Lataa jokainen palautettu kuva tai tallenna sen Base64-sisältö
GET /v1/media/tasks/{task_id}GET /v1/media/assets/{asset_id}/contentGET /v1/media/assetsGET /v1/media/assets/{asset_id}
Säilytä kaikki valmistuneet tulokset
Tallenna jokainen valmistunut kuva; nouda jokainen palautettu URL tai pura sen Base64-sisältö.
Tallenna jokainen data-alkio. Pura jokainen b64_json-arvo tai lataa jokaisen palautetun allekirjoitetun URL-osoitteen sisältö. Valitse tiedostopääte todellisen MIME-tyypin tai tavusisällön perusteella.
Jos alkuperäinen vastaus on tarkistettava
Jos kuvan generoinnin tai muokkauksen tulos edellyttää tarkistusta, säilytä alkuperäinen operation_id/X-Client-Request-ID ja palautetut tulostiedot. Hae olemassa olevat omistamasi tulokset mediakirjastosta käyttämällä todellisia task_id- tai asset_id-arvoja. Älä lähetä generointi- tai muokkauspyyntöä uudelleen äläkä muodosta tilakyselyn URL-osoitetta operation_id-arvosta.
Vastauksen kentät
| Kenttä | Tyyppi |
|---|---|
Kenttäcreated | Tyyppiinteger |
Kenttädata[].url | Tyyppistring |
Kenttädata[].b64_json | Tyyppibase64 string |
Kenttäusage | Tyyppiobject |
Virheet ja seuraavat vaiheet
| Vastaus | Ehto | Seuraava vaihe |
|---|---|---|
Vastaus400 · invalid_request_error | EhtoVirheelliset pakolliset kentät, aineiston esitysmuoto tai parametrin arvo | Seuraava vaiheKorjaa ilmoitetut kentät ennen uutta luontipyyntöä. |
Vastausserver_error | EhtoPalautettu vastaus ilmoittaa, että operaatio tai tulos edellyttää tarkistusta | Seuraava vaiheSäilytä alkuperäinen palautettu operaation tai tehtävän ID, pyynnön otsakkeet ja vastaus; jatka kyseisen alkuperäisen operaation tuettuja lukutoimintoja. Älä lähetä luontipyyntöä uudelleen. |
Aliakset
Mallin aliakset
Ailoot gemini-3-pro-image, gemini-3-pro-image-preview, nano-banana-pro
Ailoot Ultra google/gemini-3-pro-image
Menetelmäpolkujen aliakset
/v1/images
Liittyvät kutsujan ID:t
google/gemini-3-pro-image, gemini-3-pro-image-preview, nano-banana-pro, gemini-3-pro-image
Ailoot · Kuvat POST /v1/images/generations nano-banana-pro
nano-banana-progemini-3-pro-imagegemini-3-pro-image-previewnano-banana-pro
Aloitus
Nano Banana Pro (Gemini 3 Pro Image) on Googlen päättelyyn perustuva kuvamalli vaativiin suunnittelutehtäviin, tuotteiden havainnekuvien luomiseen ja faktatietoon perustuviin visualisointeihin. Se ottaa vastaan tekstiä ja viitekuvia ja tuottaa kuvia teksteineen 1K–4K-koossa. Luovaa toteutusta voi ohjata yksityiskohtaisesti.
- Hyväksytyt syötteet
- Teksti
- Tulokset
- Kuvat
Saatavilla Ailootissa · syötteet & menetelmät
Ailoot · Kuvat POST /v1/images/generations
- Syötetyypit
text- Tulostyypit
image- Konteksti
- 65 536 tokens
- Enimmäistuloste
- 32 768 tokens
- Tulosteen muoto
- Kuvatiedosto
| Kenttä | Tyyppi | Vaatimus | Arvot & rajat | Oletus |
|---|---|---|---|---|
Kenttämodel | Tyyppistring | VaatimusPakollinen | Arvot & rajat nano-banana-pro | Oletus— |
Kenttäprompt | Tyyppistring | VaatimusPakollinen | Arvot & rajat Vähimmäispituus: 1 | Oletus— |
Kenttän | Tyyppiinteger | VaatimusValinnainen | Arvot & rajat Vähimmäismäärä: 1 | Oletus1 |
Kenttäresponse_format | Tyyppistring | VaatimusValinnainen | Arvot & rajat url, b64_json | Oletus— |
Kenttästream | Tyyppiboolean | VaatimusValinnainen | Arvot & rajat | Oletusfalse |
Kenttäsize | Tyyppistring | VaatimusValinnainen | Arvot & rajat Riippuu mallista | Oletus— |
Kenttäquality | Tyyppistring | VaatimusValinnainen | Arvot & rajat Riippuu mallista | Oletus— |
Kenttäbackground | Tyyppistring | VaatimusValinnainen | Arvot & rajat Riippuu mallista | Oletus— |
Kenttäoutput_format | Tyyppistring | VaatimusValinnainen | Arvot & rajat Riippuu mallista | Oletus— |
Kenttäoutput_compression | Tyyppiinteger | VaatimusValinnainen | Arvot & rajat Riippuu mallista | Oletus— |
Kenttämoderation | Tyyppistring | VaatimusValinnainen | Arvot & rajat Riippuu mallista | Oletus— |
Kenttäinput_fidelity | Tyyppistring | VaatimusValinnainen | Arvot & rajat Riippuu mallista | Oletus— |
Kenttästyle | Tyyppistring | VaatimusValinnainen | Arvot & rajat Riippuu mallista | Oletus— |
Kenttäpartial_images | Tyyppiinteger | VaatimusValinnainen | Arvot & rajat Riippuu mallista | Oletus— |
Syöteaineistojen yhdistelmät
Tekstistä kuvaksi · Pakollinen: prompt
Menetelmän parametrit ja elinkaari
| Parametri | Sopimus |
|---|---|
Parametrimaterial_types | Sopimustext |
Parametrirequired | Sopimusmodel, prompt |
Parametrioptional_controls | Sopimusnull |
Parametricontent_type | Sopimusapplication/json |
Elinkaari: synchronous_result_then_owned_library
GET /v1/media/tasks/{task_id} · todellisuudessa palautettu task_id tai mediakirjaston tietue
GET /v1/media/assets/{asset_id}/content
GET /v1/media/assets
GET /v1/media/assets/{asset_id}
Menetelmien rakenteet ja ID:t ovat täsmällisiä; toimittajan kyvykkyys on erillinen pyynnön hyväksymisestä.
Hinnoittelu
Ailoot-menetelmien hinnat
POST /v1/images/generations- Syöte
- 0,002 $ / 1K kuvatokenia
- Tuloste
- 0,134 $ 1K-kuvaa kohden
- Tuloste
- 0,134 $ 2K-kuvaa kohden
- Tuloste
- 0,24 $ 4K-kuvaa kohden
Ailoot varaa arvioidun summan ennen pyyntöä. Tuloksen jälkeen lopullinen veloitus toteutetaan mitatun käytön perusteella. Suoratoiston veloituksessa käytetään lopullista käyttötietuetta. Varauksen ja lopullisen veloituksen toiminta →
Viitehinnaston tiedot
Mallitason viitehinnastot eivät muuta menetelmän valintaa, hinta-arvioita tai veloituksia. Käytössä olevat veloitukset käyttävät valitun Ailoot-menetelmän hintoja.
Mallin viitehinnastot
Hinnat asetusten mukaan
| Asetukset | Hinnasto | Veloitus |
|---|---|---|
| AsetuksetUltra | HinnastoPerushinta | Veloitus Syöte · Syötetokenit $0.004000 / 1K tokenia Tuloste · Tulostokenit $0.024000 / 1K tokenia Syöte · kuva $0.004000 / 1K tokenia Tuloste · kuvatuloste $0.24000 / 1K tokenia Syöte · ääni $0.004000 / 1K tokenia Syöte · äänisyötteen välimuisti $0.0004000 / 1K tokenia Tuloste · verkkohaku $0.028 verkkohakua kohden Tuloste · sisäinen päättely $0.024000 / 1K tokenia Syöte · Välimuistin luku $0.0004000 / 1K tokenia Syöte · Välimuistiin kirjoitus $0.000750000 / 1K tokenia |
Esimerkkipyynnöt
Ailoot · Kuvat
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
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])
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");
Vastaanota ja tallenna tulokset
Ailoot · Kuvat
Lataa jokainen palautettu kuva tai tallenna sen Base64-sisältö
GET /v1/media/tasks/{task_id}GET /v1/media/assets/{asset_id}/contentGET /v1/media/assetsGET /v1/media/assets/{asset_id}
Säilytä kaikki valmistuneet tulokset
Tallenna jokainen valmistunut kuva; nouda jokainen palautettu URL tai pura sen Base64-sisältö.
Tallenna jokainen data-alkio. Pura jokainen b64_json-arvo tai lataa jokaisen palautetun allekirjoitetun URL-osoitteen sisältö. Valitse tiedostopääte todellisen MIME-tyypin tai tavusisällön perusteella.
Jos alkuperäinen vastaus on tarkistettava
Jos kuvan generoinnin tai muokkauksen tulos edellyttää tarkistusta, säilytä alkuperäinen operation_id/X-Client-Request-ID ja palautetut tulostiedot. Hae olemassa olevat omistamasi tulokset mediakirjastosta käyttämällä todellisia task_id- tai asset_id-arvoja. Älä lähetä generointi- tai muokkauspyyntöä uudelleen äläkä muodosta tilakyselyn URL-osoitetta operation_id-arvosta.
Vastauksen kentät
| Kenttä | Tyyppi |
|---|---|
Kenttäcreated | Tyyppiinteger |
Kenttädata[].url | Tyyppistring |
Kenttädata[].b64_json | Tyyppibase64 string |
Kenttäusage | Tyyppiobject |
Virheet ja seuraavat vaiheet
| Vastaus | Ehto | Seuraava vaihe |
|---|---|---|
Vastaus400 · invalid_request_error | EhtoVirheelliset pakolliset kentät, aineiston esitysmuoto tai parametrin arvo | Seuraava vaiheKorjaa ilmoitetut kentät ennen uutta luontipyyntöä. |
Vastausserver_error | EhtoPalautettu vastaus ilmoittaa, että operaatio tai tulos edellyttää tarkistusta | Seuraava vaiheSäilytä alkuperäinen palautettu operaation tai tehtävän ID, pyynnön otsakkeet ja vastaus; jatka kyseisen alkuperäisen operaation tuettuja lukutoimintoja. Älä lähetä luontipyyntöä uudelleen. |
Aliakset
Mallin aliakset
Ailoot gemini-3-pro-image, gemini-3-pro-image-preview, nano-banana-pro
Ailoot Ultra google/gemini-3-pro-image
Menetelmäpolkujen aliakset
/v1/images
Liittyvät kutsujan ID:t
google/gemini-3-pro-image, gemini-3-pro-image-preview, nano-banana-pro, gemini-3-pro-image
Ailoot Ultra · OpenAI Chat POST /v1/chat/completions google/gemini-3-pro-image
google/gemini-3-pro-imageAloitus
Nano Banana Pro (Gemini 3 Pro Image) on Googlen päättelyyn perustuva kuvamalli vaativiin suunnittelutehtäviin, tuotteiden havainnekuvien luomiseen ja faktatietoon perustuviin visualisointeihin. Se ottaa vastaan tekstiä ja viitekuvia ja tuottaa kuvia teksteineen 1K–4K-koossa. Luovaa toteutusta voi ohjata yksityiskohtaisesti.
- Hyväksytyt syötteet
- Teksti
- Tulokset
- Teksti
Saatavilla Ailootissa · syötteet & menetelmät
Ailoot Ultra · OpenAI Chat POST /v1/chat/completions
- Syötetyypit
text- Tulostyypit
text- Tulosteen muoto
- json tai SSE
| Kenttä | Tyyppi | Vaatimus | Arvot & rajat | Oletus |
|---|---|---|---|---|
Kenttämodel | Tyyppistring | VaatimusPakollinen | Arvot & rajat google/gemini-3-pro-image | Oletus— |
Kenttämessages | Tyyppimessage[] | VaatimusPakollinen | Arvot & rajat Kohteiden vähimmäismäärä: 1 | Oletus— |
Kenttämessages[].role | Tyyppistring | VaatimusPakollinen | Arvot & rajat Esimerkit: system, user, assistant, tool, function Ehdot: Nämä roolit esitetään nimenomaisesti lähdekoodin yhteensopivuustyypeissä; mallin täsmällinen roolijoukko pysyy mallikohtaisena. Riippuu mallista | Oletus— |
Kenttämessages[].content | Tyyppistring|content_part[]|null | VaatimusValinnainen | Arvot & rajat | Oletus— |
Kenttämessages[].tool_calls | Tyyppitool_call[] | VaatimusValinnainen | Arvot & rajat | Oletus— |
Kenttämessages[].tool_call_id | Tyyppistring | VaatimusValinnainen | Arvot & rajat Sovelletaan, kun: role=tool; käytä todella palautettua ID:tä | Oletus— |
Kenttämessages[].name | Tyyppistring | VaatimusValinnainen | Arvot & rajat | Oletus— |
Kenttämessages[].reasoning_content | Tyyppistring | VaatimusValinnainen | Arvot & rajat Sovelletaan, kun: Palauta todella saatu päättely takaisin mallille, kun kyseinen malli käyttää sitä | Oletus— |
Kenttämessages[].reasoning_details | Tyyppiobject|array | VaatimusValinnainen | Arvot & rajat Riippuu mallista | Oletus— |
Kenttämax_tokens | Tyyppiinteger | VaatimusValinnainen | Arvot & rajat Vähimmäismäärä: 1 Riippuu mallista | Oletus— |
Kenttämax_completion_tokens | Tyyppiinteger | VaatimusValinnainen | Arvot & rajat Vähimmäismäärä: 1 Riippuu mallista | Oletus— |
Kenttästream | Tyyppiboolean | VaatimusValinnainen | Arvot & rajat | Oletusfalse |
Kenttästream_options.include_usage | Tyyppiboolean | VaatimusValinnainen | Arvot & rajat Riippuu mallista | Oletus— |
Kenttätemperature | Tyyppinumber | VaatimusValinnainen | Arvot & rajat Riippuu mallista | Oletus— |
Kenttätop_p | Tyyppinumber | VaatimusValinnainen | Arvot & rajat Riippuu mallista | Oletus— |
Kenttästop | Tyyppistring|string[] | VaatimusValinnainen | Arvot & rajat Riippuu mallista | Oletus— |
Kenttätools | Tyyppifunction_tool[] | VaatimusValinnainen | Arvot & rajat Riippuu mallista | Oletus— |
Kenttätools[].type | Tyyppistring | VaatimusValinnainen | Arvot & rajat function Riippuu mallista | Oletus— |
Kenttätools[].function.name | Tyyppistring | VaatimusPakollinen | Arvot & rajat Sovelletaan, kun: funktiotyökalu annettu | Oletus— |
Kenttätools[].function.description | Tyyppistring | VaatimusValinnainen | Arvot & rajat | Oletus— |
Kenttätools[].function.parameters | TyyppiJSON_schema | VaatimusValinnainen | Arvot & rajat | Oletus— |
Kenttätool_choice | Tyyppistring|object | VaatimusValinnainen | Arvot & rajat Riippuu mallista | Oletus— |
Kenttäparallel_tool_calls | Tyyppiboolean | VaatimusValinnainen | Arvot & rajat Riippuu mallista | Oletus— |
Kenttäresponse_format | Tyyppiobject | VaatimusValinnainen | Arvot & rajat Riippuu mallista | Oletus— |
Kenttäreasoning_effort | Tyyppistring | VaatimusValinnainen | Arvot & rajat Riippuu mallista | Oletus— |
Kenttäreasoning | Tyyppiobject | VaatimusValinnainen | Arvot & rajat Riippuu mallista | Oletus— |
Kenttäservice_tier | Tyyppistring | VaatimusValinnainen | Arvot & rajat Riippuu mallista | Oletus— |
Kenttäinstructions | Tyyppistring | VaatimusValinnainen | Arvot & rajat Yhteensopivuuskenttä | Oletus— |
Kenttäfunctions | Tyyppifunction[] | VaatimusValinnainen | Arvot & rajat Riippuu mallista | Oletus— |
Kenttäfunction_call | Tyyppistring|object | VaatimusValinnainen | Arvot & rajat Riippuu mallista | Oletus— |
Kenttäprompt_cache_options | Tyyppiobject | VaatimusValinnainen | Arvot & rajat Riippuu mallista | Oletus— |
Kenttämodalities | Tyyppistring[] | VaatimusValinnainen | Arvot & rajat text | Oletus— |
Kenttäprovider | Tyyppiobject | VaatimusValinnainen | Arvot & rajat Ehdot: provider.options hylätään tällä Ultran tekstireitillä | Oletus— |
Kenttäcache_control.ttl | Tyyppistring | VaatimusValinnainen | Arvot & rajat Ehdot: 1h hylätään varsinaisissa kehotevälimuistin kohdissa | Oletus— |
Syöteaineistojen yhdistelmät
Teksti · UTF8-teksti
messages[].content
Menetelmän parametrit ja elinkaari
| Parametri | Sopimus |
|---|---|
Parametricontent_type | Sopimusapplication/json |
Parametrirequired | Sopimusmodel, messages |
Parametrimaterial_types | Sopimustext |
Parametrimessages | Sopimusviestitaulukko role/content-rakenteella |
Parametrifile_material | Sopimusvarsinainen UTF-8-asiakirja lisätään sellaisenaan tekstinä; tiedoston ID:tä ei päätellä |
Parametrioptional_controls | Sopimusstream, temperature, top_p, stop, max_tokens, max_completion_tokens, reasoning, response_format, tools, tool_choice |
Parametricontrol_scope | Sopimusmallikohtainen; käyttäjän funktiotyökalut eroavat palvelun isännöimistä työkaluista |
Parametrioutput_modalities | Sopimustext |
Parametrihosted_operations | Sopimusfalse |
Parametrimultimodal_input_binding | Sopimusnull |
Elinkaari: synchronous_or_streamed
Lähetä mallin täsmällinen ID yhdessä messages-kentän kanssa.
Kontekstin pituus ei ole tuloksen yläraja.
Tekstitiedosto voi antaa tekstiä sellaisenaan; kuva-, ääni- ja tiedosto-objektisyötteet tarvitsevat täsmällisen sidonnan.
Hinnoittelu
Hintatiedot eivät lisää pyyntövalintoja. Tuetut parametrit on lueteltu valitulle menetelmälle.
- Nopea tila
- Vakiohinta Kun nopea tila on valittu
- Flex-tila
- Vakiohinta Kun flex-tila on valittu
- Päättelyn enimmäisteho
- Vakiohinta Kun päättelyn enimmäistehoon sovelletaan default-oletussäätöä
- Eksplisiittisen välimuistin hinnoittelu
- Ei käytössä Kun eksplisiittistä välimuistia pyydetään
Ailoot-hinnat
Hinnat asetusten mukaan
Kohdista kukin veloitus näytettyihin ehtoihin. Käytä yhtä hintaa kutakin vaihtoehtoisten asetusten ryhmää kohden.
| Asetukset | Hinnasto | Kontekstin tokenit, enemmän kuin | Kontekstin tokenit, enintään raja-arvo mukaan lukien | Veloitus |
|---|---|---|---|---|
| AsetuksetTokenien perushinnat | HinnastoPerushinta | Kontekstin tokenit, enemmän kuin— | Kontekstin tokenit, enintään raja-arvo mukaan lukienEi ylärajaa | Veloitus Syöte · Syötetokenit $0.004 / 1K tokenia Tuloste · Tulostokenit $0.024 / 1K tokenia Syöte · Välimuistin luku $0.0004 / 1K tokenia Syöte · Välimuistiin kirjoitus $0.00075 / 1K tokenia Syöte · Välimuistiin kirjoitus, 1 tunti — / 1K tokenia Tuloste · Kuvatulosteen tokenit $0.24 / 1K kuvatokenia |
| AsetuksetPyynnön pituusluokka 1 | Hinnasto— | Kontekstin tokenit, enemmän kuin0 | Kontekstin tokenit, enintään raja-arvo mukaan lukienEi ylärajaa | Veloitus Syöte · Syötetokenit $0.004 / 1K tokenia Tuloste · Tulostokenit $0.024 / 1K tokenia Syöte · Välimuistin luku $0.0004 / 1K tokenia Syöte · Välimuistiin kirjoitus $0.00075 / 1K tokenia Syöte · Välimuistiin kirjoitus, 1 tunti — / 1K tokenia |
Viitehinnaston tiedot
Mallitason viitehinnastot eivät muuta menetelmän valintaa, hinta-arvioita tai veloituksia. Käytössä olevat veloitukset käyttävät valitun Ailoot-menetelmän hintoja.
Google: Nano Banana Pro (Gemini 3 Pro Image)
Hinnat asetusten mukaan
| Asetukset | Laskutusehdot | Veloitus |
|---|---|---|
| AsetuksetGoogle: Nano Banana Pro (Gemini 3 Pro Image) · Oletusasetukset | LaskutusehdotOletuskokoonpano | Veloitus Syöte · Syötetokenit 0,004 $ / 1K tokenia Tuloste · Tulostokenit 0,024 $ / 1K tokenia Syöte · Syötekuva 0,004 $ / 1K tokenia Tuloste · Kuvatuloste 0,24 $ / 1K tokenia Syöte · Äänisyöte 0,004 $ / 1K tokenia Syöte · Äänivälimuistin luku 0,0004 $ / 1K tokenia Tuloste · Verkkohaku 0,028 $ hakua kohden Tuloste · Päättelytokenit 0,024 $ / 1K tokenia Syöte · Välimuistin luku 0,0004 $ / 1K tokenia Syöte · Välimuistiin kirjoittaminen · 5 minuuttia 0,00075 $ / 1K tokenia |
Ailoot varaa arvioidun summan ennen pyyntöä. Tuloksen jälkeen lopullinen veloitus toteutetaan mitatun käytön perusteella. Suoratoiston veloituksessa käytetään lopullista käyttötietuetta. Varauksen ja lopullisen veloituksen toiminta →
Esimerkkipyynnöt
Ailoot Ultra · OpenAI Chat
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
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"))
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")
Vastaanota ja tallenna tulokset
Ailoot Ultra · OpenAI Chat
json tai SSE
Säilytä kaikki valmistuneet tulokset
Säilytä jokainen kokonainen palautettu vastaus, tiedosto ja sisällön osa.
Säilytä jokainen vastausvaihtoehto sisältöineen, työkalukutsuineen ja päättelyineen. Kokoa SSE:ssä muutokset vastausvaihtoehdon ja työkalun indeksin mukaan ja säilytä lopullinen päättymissyy sekä käyttötiedot.
Jos alkuperäinen vastaus on tarkistettava
Säilytä pyyntöjen/vastausten ID:t ja otsakkeet. Yleistä tekstityön haku-URL:ää ei anneta.
Vastauksen kentät
| Kenttä | Tyyppi |
|---|---|
Kenttächoices[].index | Tyyppiinteger |
Kenttächoices[].message.content | Tyyppistring|null |
Kenttächoices[].message.tool_calls | Tyyppitool_call[] |
Kenttächoices[].message.reasoning_content | Tyyppistring |
Kenttächoices[].message.reasoning_details | Tyyppiobject|array |
Kenttächoices[].finish_reason | Tyyppistring|null |
Kenttäusage | Tyyppiobject |
Virheet ja seuraavat vaiheet
| Vastaus | Ehto | Seuraava vaihe |
|---|---|---|
Vastaus400 · invalid_request_error | EhtoVirheelliset pakolliset kentät, aineiston esitysmuoto tai parametrin arvo | Seuraava vaiheKorjaa ilmoitetut kentät ennen uutta luontipyyntöä. |
Aliakset
Mallin aliakset
Ailoot gemini-3-pro-image, gemini-3-pro-image-preview, nano-banana-pro
Ailoot Ultra google/gemini-3-pro-image
Menetelmäpolkujen aliakset
/v1/images
Liittyvät kutsujan ID:t
google/gemini-3-pro-image, gemini-3-pro-image-preview, nano-banana-pro, gemini-3-pro-image
Ailoot Ultra · Kuvat POST /v1/images/generations google/gemini-3-pro-image
google/gemini-3-pro-imageAloitus
Nano Banana Pro (Gemini 3 Pro Image) on Googlen päättelyyn perustuva kuvamalli vaativiin suunnittelutehtäviin, tuotteiden havainnekuvien luomiseen ja faktatietoon perustuviin visualisointeihin. Se ottaa vastaan tekstiä ja viitekuvia ja tuottaa kuvia teksteineen 1K–4K-koossa. Luovaa toteutusta voi ohjata yksityiskohtaisesti.
- Hyväksytyt syötteet
- Teksti · Kuvat
- Tulokset
- Kuvat
Saatavilla Ailootissa · syötteet & menetelmät
Ailoot Ultra · Kuvat POST /v1/images/generations
- Syötetyypit
text,image- Tulostyypit
image
| Kenttä | Tyyppi | Vaatimus | Arvot & rajat | Oletus |
|---|---|---|---|---|
Kenttämodel | Tyyppistring | VaatimusPakollinen | Arvot & rajat google/gemini-3-pro-image | Oletus— |
Kenttäprompt | Tyyppistring | VaatimusPakollinen | Arvot & rajat Vähimmäispituus: 1 | Oletus— |
Kenttäresolution | Tyyppistring | VaatimusValinnainen | Arvot & rajat 1K, 2K, 4K | Oletus— |
Kenttäaspect_ratio | Tyyppistring | VaatimusValinnainen | Arvot & rajat 1:1, 2:3, 3:2, 3:4, 4:3, 4:5, 5:4, 9:16, 16:9, 21:9 | Oletus— |
Kenttän | Tyyppiinteger | VaatimusValinnainen | Arvot & rajat Vähimmäismäärä: 1 Enimmäismäärä: 1 | Oletus— |
Kenttäinput_references | Tyyppiarray | VaatimusValinnainen | Arvot & rajat Kohteiden vähimmäismäärä: 0 Kohteiden enimmäismäärä: 14 | Oletus— |
Kenttäprovider | Tyyppiobject | VaatimusValinnainen | Arvot & rajat | Oletus— |
Menetelmän parametrit ja elinkaari
| Parametri | Sopimus |
|---|---|
Parametricontent_type | Sopimusapplication/json |
Parametrirequired | Sopimusmodel, prompt |
Parametrimaterial_types | Sopimustext, image |
Elinkaari: synchronous_result_then_owned_library
GET /v1/media/tasks/{task_id} · todellisuudessa palautettu task_id tai mediakirjaston tietue
GET /v1/media/assets/{asset_id}/content
GET /v1/media/assets
GET /v1/media/assets/{asset_id}
Hinnoittelu
Lopullisen veloituksen laskenta
Näytettyjen hintojen avulla arvioidaan kustannukset ennen generointia. Lopullinen veloitus lasketaan alkuperäiselle generoinnille kirjatun kustannuksen perusteella. Lopullisena laskutettavana määränä ei käytetä tulosteen mitattua kestoa eikä ennustettuja määriä.
Hintatiedot eivät lisää pyyntövalintoja. Tuetut parametrit on lueteltu valitulle menetelmälle.
- Nopea tila
- Ei määritetty Kun nopea tila on valittu
- Flex-tila
- Ei määritetty Kun flex-tila on valittu
- Päättelyn enimmäisteho
- Ei määritetty Kun päättelyn enimmäistehoon sovelletaan default-oletussäätöä
Arvioidut vertailuhinnat
Hinnat asetusten mukaan
Kohdista kukin veloitus näytettyihin ehtoihin. Käytä yhtä hintaa kutakin vaihtoehtoisten asetusten ryhmää kohden.
| Asetukset | Hinnasto | Ennustettu määrä | Veloitus |
|---|---|---|---|
| AsetuksetTokenien perushinnat | HinnastoPerushinta | Ennustettu määrä— | Veloitus Syöte · Syötetokenit · Arvio vain vertailua varten — / 1K tokenia Tuloste · Tulostokenit · Arvio vain vertailua varten — / 1K tokenia Syöte · Välimuistin luku · Arvio vain vertailua varten — / 1K tokenia Syöte · Välimuistiin kirjoitus · Arvio vain vertailua varten — / 1K tokenia Syöte · Välimuistiin kirjoitus, 1 tunti · Arvio vain vertailua varten — / 1K tokenia |
| AsetuksetArvioitu luontikustannus | Hinnasto— | Ennustettu määräyhden generoinnin arvio | Veloitus Tuloste · Arvioidut generointikustannukset · Arvio vain vertailua varten $0.98304 arvio ennen generointia Tämä arvio ei ole lisämaksu eikä valmistuneen generoinnin kiinteä hinta. |
Ailoot varaa arvioidun summan ennen pyyntöä. Tuloksen jälkeen lopullinen veloitus toteutetaan mitatun käytön perusteella. Suoratoiston veloituksessa käytetään lopullista käyttötietuetta. Varauksen ja lopullisen veloituksen toiminta →
Esimerkkipyynnöt
Ailoot Ultra · Kuvat
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
Vastaanota ja tallenna tulokset
Ailoot Ultra · Kuvat
Lataa jokainen palautettu kuva tai tallenna sen Base64-sisältö
GET /v1/media/tasks/{task_id}GET /v1/media/assets/{asset_id}/contentGET /v1/media/assetsGET /v1/media/assets/{asset_id}
Muut sisällön lukukerrat
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.
Säilytä kaikki valmistuneet tulokset
Tallenna jokainen valmistunut kuva; nouda jokainen palautettu URL tai pura sen Base64-sisältö.
Säilytä koko vastaus ja otsakkeet, jokainen todellinen tuloste, alkuperäiset palautetut tunnisteet ja kaikki käyttötietokentät. Selvitä alkuperäisen operaation tila lähettämättä luontipyyntöä uudelleen.
Jos alkuperäinen vastaus on tarkistettava
Säilytä palautettu X-Client-Request-ID täsmäytystä varten. Tee lukukyselyt vain todellisuudessa palautetuilla task_id/asset_id-arvoilla tai käytä omistamaasi mediakirjastoa; älä koskaan rakenna tehtävän URL-osoitetta operaation ID:n perusteella äläkä lähetä luontipyyntöä uudelleen.
Vastauksen kentät
| Kenttä | Tyyppi |
|---|---|
Kenttäcreated | Tyyppi |
Kenttädata[].url | Tyyppi |
Kenttädata[].b64_json | Tyyppi |
Kenttäusage | Tyyppi |
Aliakset
Mallin aliakset
Ailoot gemini-3-pro-image, gemini-3-pro-image-preview, nano-banana-pro
Ailoot Ultra google/gemini-3-pro-image
Menetelmäpolkujen aliakset
/v1/images
Liittyvät kutsujan ID:t
google/gemini-3-pro-image, gemini-3-pro-image-preview, nano-banana-pro, gemini-3-pro-image
Ailoot Ultra · Anthropic Messages POST /v1/messages google/gemini-3-pro-image
google/gemini-3-pro-imageAloitus
Nano Banana Pro (Gemini 3 Pro Image) on Googlen päättelyyn perustuva kuvamalli vaativiin suunnittelutehtäviin, tuotteiden havainnekuvien luomiseen ja faktatietoon perustuviin visualisointeihin. Se ottaa vastaan tekstiä ja viitekuvia ja tuottaa kuvia teksteineen 1K–4K-koossa. Luovaa toteutusta voi ohjata yksityiskohtaisesti.
- Hyväksytyt syötteet
- Teksti
- Tulokset
- json · sse
Saatavilla Ailootissa · syötteet & menetelmät
Ailoot Ultra · Anthropic Messages POST /v1/messages
- Syötetyypit
text- Tulostyypit
json,sse- Tulosteen muoto
- JSON tai SSE
| Kenttä | Tyyppi | Vaatimus | Arvot & rajat | Oletus |
|---|---|---|---|---|
Kenttämodel | Tyyppistring | VaatimusPakollinen | Arvot & rajat google/gemini-3-pro-image | Oletus— |
Kenttämessages | Tyyppimessage[] | VaatimusPakollinen | Arvot & rajat | Oletus— |
Kenttämessages[].role | Tyyppistring | VaatimusPakollinen | Arvot & rajat user, assistant | Oletus— |
Kenttämessages[].content | Tyyppistring | VaatimusPakollinen | Arvot & rajat | Oletus— |
Kenttämax_tokens | Tyyppiinteger | VaatimusPakollinen | Arvot & rajat | Oletus— |
Kenttästream | Tyyppiboolean | VaatimusValinnainen | Arvot & rajat | Oletusfalse |
Syöteaineistojen yhdistelmät
Teksti · UTF-8-teksti
messages[].content-merkkijono
Menetelmän parametrit ja elinkaari
| Parametri | Sopimus |
|---|---|
Parametricontent_type | Sopimusapplication/json |
Parametrirequired | Sopimusmodel, messages, max_tokens |
Parametrioptional_controls | Sopimusstream |
Parametrimaterial_types | Sopimustext |
Parametritext_file_material | SopimusLue varsinainen UTF-8-asiakirja ja sijoita sen teksti ilmoitettuun syöte- tai viestisisällön merkkijonoon. |
Elinkaari: synchronous_or_streamed
Hinnoittelu
Hintatiedot eivät lisää pyyntövalintoja. Tuetut parametrit on lueteltu valitulle menetelmälle.
- Nopea tila
- Vakiohinta Kun nopea tila on valittu
- Flex-tila
- Vakiohinta Kun flex-tila on valittu
- Päättelyn enimmäisteho
- Vakiohinta Kun päättelyn enimmäistehoon sovelletaan default-oletussäätöä
- Eksplisiittisen välimuistin hinnoittelu
- Ei käytössä Kun eksplisiittistä välimuistia pyydetään
Ailoot-hinnat
Hinnat asetusten mukaan
Kohdista kukin veloitus näytettyihin ehtoihin. Käytä yhtä hintaa kutakin vaihtoehtoisten asetusten ryhmää kohden.
| Asetukset | Hinnasto | Kontekstin tokenit, enemmän kuin | Kontekstin tokenit, enintään raja-arvo mukaan lukien | Veloitus |
|---|---|---|---|---|
| AsetuksetTokenien perushinnat | HinnastoPerushinta | Kontekstin tokenit, enemmän kuin— | Kontekstin tokenit, enintään raja-arvo mukaan lukienEi ylärajaa | Veloitus Syöte · Syötetokenit $0.004 / 1K tokenia Tuloste · Tulostokenit $0.024 / 1K tokenia Syöte · Välimuistin luku $0.0004 / 1K tokenia Syöte · Välimuistiin kirjoitus $0.00075 / 1K tokenia Syöte · Välimuistiin kirjoitus, 1 tunti — / 1K tokenia Tuloste · Kuvatulosteen tokenit $0.24 / 1K kuvatokenia |
| AsetuksetPyynnön pituusluokka 1 | Hinnasto— | Kontekstin tokenit, enemmän kuin0 | Kontekstin tokenit, enintään raja-arvo mukaan lukienEi ylärajaa | Veloitus Syöte · Syötetokenit $0.004 / 1K tokenia Tuloste · Tulostokenit $0.024 / 1K tokenia Syöte · Välimuistin luku $0.0004 / 1K tokenia Syöte · Välimuistiin kirjoitus $0.00075 / 1K tokenia Syöte · Välimuistiin kirjoitus, 1 tunti — / 1K tokenia |
Ailoot varaa arvioidun summan ennen pyyntöä. Tuloksen jälkeen lopullinen veloitus toteutetaan mitatun käytön perusteella. Suoratoiston veloituksessa käytetään lopullista käyttötietuetta. Varauksen ja lopullisen veloituksen toiminta →
Esimerkkipyynnöt
Ailoot Ultra · Anthropic Messages
{
"model": "google/gemini-3-pro-image",
"max_tokens": 128,
"messages": [
{
"role": "user",
"content": "Summarize the incident report."
}
],
"stream": false
}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
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))
Vastaanota ja tallenna tulokset
Ailoot Ultra · Anthropic Messages
JSON tai SSE
Säilytä kaikki valmistuneet tulokset
Säilytä jokainen kokonainen palautettu vastaus, tiedosto ja sisällön osa.
Säilytä kaikki sisältölohkot, päättelyallekirjoitukset ja todelliset työkalukäytön ID:t. Kokoa kaikki SSE-lohkomuutokset; ensimmäinen tekstilohko ei ole koko tulos.
Jos alkuperäinen vastaus on tarkistettava
Säilytä pyyntöjen/vastausten ID:t ja otsakkeet. Yleistä tekstityön haku-URL:ää ei anneta.
Vastauksen kentät
| Kenttä | Tyyppi |
|---|---|
Kenttäid | Tyyppistring |
Kenttämodel | Tyyppistring |
Kenttäcontent[] | Tyyppitext|thinking|tool_use|other content block |
Kenttästop_reason | Tyyppistring|null |
Kenttäusage | Tyyppiobject |
Virheet ja seuraavat vaiheet
| Vastaus | Ehto | Seuraava vaihe |
|---|---|---|
Vastaus400 · invalid_request_error | EhtoVirheelliset pakolliset kentät, aineiston esitysmuoto tai parametrin arvo | Seuraava vaiheKorjaa ilmoitetut kentät ennen uutta luontipyyntöä. |
Aliakset
Mallin aliakset
Ailoot gemini-3-pro-image, gemini-3-pro-image-preview, nano-banana-pro
Ailoot Ultra google/gemini-3-pro-image
Menetelmäpolkujen aliakset
/v1/images
Liittyvät kutsujan ID:t
google/gemini-3-pro-image, gemini-3-pro-image-preview, nano-banana-pro, gemini-3-pro-image
FAQ · Google: Nano Banana Pro (Gemini 3 Pro Image)
- Mitä syötteitä ja tuloksia on saatavilla?
POST /v1/images/generations·gemini-3-pro-image:text→imagePOST /v1/images/generations·gemini-3-pro-image-preview:text→imagePOST /v1/images/generations·nano-banana-pro:text→imagePOST /v1/chat/completions·google/gemini-3-pro-image:text→textPOST /v1/images/generations·google/gemini-3-pro-image:text,image→imagePOST /v1/messages·google/gemini-3-pro-image:text→json,sse- Mitä kenttiä pyyntö käyttää?
POST /v1/images/generations·gemini-3-pro-image:model,prompt,n,response_format,streamPOST /v1/images/generations·gemini-3-pro-image-preview:model,prompt,n,response_format,streamPOST /v1/images/generations·nano-banana-pro:model,prompt,n,response_format,streamPOST /v1/chat/completions·google/gemini-3-pro-image:model,messages,stream,modalities,providerPOST /v1/images/generations·google/gemini-3-pro-image:model,prompt,resolution,aspect_ratio,n,input_references,providerPOST /v1/messages·google/gemini-3-pro-image:model,messages,max_tokens,stream- Mitä rajoja sovelletaan?
POST /v1/images/generations·gemini-3-pro-image:ctx:65536;max_out:32768;n.minimum:1POST /v1/images/generations·gemini-3-pro-image-preview:ctx:65536;max_out:32768;n.minimum:1POST /v1/images/generations·nano-banana-pro:ctx:65536;max_out:32768;n.minimum:1POST /v1/chat/completions·google/gemini-3-pro-image:messages.min_items:1POST /v1/images/generations·google/gemini-3-pro-image:n.minimum:1;n.maximum:1