Google: Nano Banana Pro (Gemini 3 Pro Image)
Nano Banana Pro (Gemini 3 Pro Image) to oparty na rozumowaniu model obrazowy Google do złożonych projektów, makiet produktów i wizualizacji faktograficznych. Przyjmuje tekst i referencje obrazowe oraz generuje obrazy z tekstem, z wyjściem 1K–4K i szczegółowym sterowaniem kreatywnym.
- Ailoot · Obrazy
POST /v1/images/generationsgemini-3-pro-image - Ailoot · Obrazy
POST /v1/images/generationsgemini-3-pro-image-preview - Ailoot · Obrazy
POST /v1/images/generationsnano-banana-pro - Ailoot Ultra · OpenAI Chat
POST /v1/chat/completionsgoogle/gemini-3-pro-image - Ailoot Ultra · Obrazy
POST /v1/images/generationsgoogle/gemini-3-pro-image - Ailoot Ultra · Anthropic Messages
POST /v1/messagesgoogle/gemini-3-pro-image
O modelu
Ten opis przedstawia możliwości modelu. Dane wejściowe, wyniki i opcje dostępne w Ailoot podano poniżej dla wybranej metody.
Nano Banana Pro to model Gemini 3 Pro Image firmy Google do generowania i edycji obrazów kierowanych rozumowaniem. Producent umieszcza w centrum zamierzonych zastosowań złożone projektowanie graficzne, makiety produktów o wysokiej wierności i wizualizację danych faktograficznych. Przyjmuje tekst i obrazy, a generuje obraz i tekst. Ta nazwana edycja obrazowa Pro opiera się na Gemini 3 Pro, zachowując własny profil wejścia i możliwości zadań obrazowych.
Model obsługuje obrazy 1K, 2K i 4K. Udokumentowane formaty obejmują 1:1, 2:3, 3:2, 3:4, 4:3, 4:5, 5:4, 9:16, 16:9 i 21:9. Kwadratowy obraz 4K ma 4096 × 4096; obraz 16:9 4K ma 5504 × 3072. Dobierz rozdzielczość i proporcje do potrzebnego rezultatu, czy jest to pionowy plakat, scena produktowa, czy szeroka grafika objaśniająca. Opcja 0.5K i dodatkowe skrajne proporcje Gemini 3.1 Flash Image nie należą do tej tabeli Pro.
Renderowanie tekstu wspiera czytelne napisy na plakatach, diagramach i innych projektowanych zasobach. Dla złożonej infografiki podaj fakty bazowe, dokładne sformułowania, kolejność czytania i relację między etykietami a elementami wizualnymi. Oddziel informacje do przekazania od pożądanego stylu artystycznego. Google zaleca najpierw przygotowanie tekstu, a następnie generowanie zawierającego go obrazu. Jest to szczególnie przydatne, gdy kompozycja łączy nagłówek, diagram i kilka krótkich podpisów.
Wejście wieloobrazowe obsługuje do 14 referencji. Tabela funkcji Google opisuje do sześciu referencji obiektów dla wierności, do pięciu referencji postaci dla spójności i do trzech referencji stylu. Role te pomagają przygotować wizualizację złożoną: fotografia produktu określa wygląd, osobny obraz ustala otoczenie, a obraz stylu wpływa na sposób opracowania. Wyjaśnij modelowi, które szczegóły są wiążące, a które referencje dostarczają inspiracji, zamiast żądać bezkrytycznego łączenia każdej widocznej cechy.
Ugruntowanie Google Search może dostarczać informacji o rzeczywistym świecie do wizualizacji faktograficznej lub sceny opartej na aktualnych warunkach. Przepływ obrazowy Pro dokumentuje ugruntowanie internetowe; rozszerzenie Image Search udokumentowano konkretnie dla Nano Banana 2.1 i Gemini 3.1 Flash Image. Dla grafiki danych podaj wartości do pokazania lub poproś o informacje ugruntowane w przepływie producenta, a następnie jasno określ relacje, etykiety i układ. Generowanie wspomagane wyszukiwaniem nadal tworzy obraz do sprawdzenia, a nie substytut kontroli przedstawionych faktów.
Rozumowanie wspiera komponowanie złożonego promptu przed renderowaniem końcowym. Przewodnik obrazowy opisuje obrazy pośrednie używane do testowania kompozycji i logiki, odrębne od rezultatu końcowego. Nie przenoś tabeli ustawień minimal/high z Nano Banana 2 ani tabeli z domyślnym medium z Nano Banana 2.1 na tę edycję Pro. Dla wymagającego projektu podaj kompletny opis z hierarchią wizualną, wymaganymi relacjami obiektów i elementami, które muszą przetrwać późniejsze edycje.
Karta modelu opisuje istotne pozostałe ograniczenia: bardzo mały tekst i długie fragmenty mogą renderować się źle, wygląd postaci może zmienić się między referencją a wynikiem, a edycje z maską lub szkicem mogą tylko częściowo wykonywać instrukcję lub pozostawiać ślady. Model może też mylić lewo i prawo albo kopiować element źródła do nowej kompozycji. Przy poprawce produktu jawnie określ zachowywaną geometrię i etykiety oraz sprawdź edytowany obszar; przy diagramie porównaj kierunek strzałek i względne położenia obiektów.
Obecna tabela API podaje limit wejścia 65,536 tokenów i limit wyjścia 32,768 tokenów. Obsługiwane są generowanie obrazów, myślenie, ugruntowanie przez wyszukiwanie i przetwarzanie wsadowe; generowanie audio, wywoływanie funkcji, wykonywanie kodu, buforowanie, structured outputs, wyszukiwanie plików, kontekst URL i Live API są nieobsługiwane. Zadanie obrazowe w tym profilu nie przyjmuje wejścia audio ani wideo. Wygenerowane obrazy zawierają SynthID, a żądana liczba obrazów wyjściowych nie zawsze jest dokładnie zachowywana.
Praktyczny opis produktu może łączyć obraz produktu, referencję oświetlenia i dokładny nagłówek: „Zachowaj proporcje i napisy produktu, pokaż go na jasnej kamiennej powierzchni w miękkim świetle bocznym i pozostaw górną trzecią część pustą na dostarczony nagłówek”. Dla diagramu faktograficznego wskaż każdą encję i połączenie oraz podaj zatwierdzone etykiety. Dopracowuj wynik w rozmowie, nazywając jedną zmianę i cechy do zachowania, przechowując wybrany obraz i jego tekst objaśniający razem jako rezultat projektowy.
Zadanie praktyczne
Zadanie praktyczne
Przykład techniczny po angielsku
Visualize a supplied packaging cycle
Create one landscape explanatory graphic showing this packaging return cycle: customer returns an empty jar, store inspects it, accepted jars are washed, clean jars are refilled. Use four large illustrated stages connected clockwise. Add only these exact labels: 'RETURN', 'INSPECT', 'WASH', 'REFILL'. Make the arrow direction and stage order unmistakable.Oczekiwany wynik
One landscape image with four labeled stages and arrows matching the supplied cycle.Sprawdź wynik
Inspect that arrows connect RETURN to INSPECT to WASH to REFILL in that order, with exact labels.Ailoot · Obrazy POST /v1/images/generations gemini-3-pro-image
gemini-3-pro-imagegemini-3-pro-imagegemini-3-pro-image-previewnano-banana-pro
Start
Nano Banana Pro (Gemini 3 Pro Image) to oparty na rozumowaniu model obrazowy Google do złożonych projektów, makiet produktów i wizualizacji faktograficznych. Przyjmuje tekst i referencje obrazowe oraz generuje obrazy z tekstem, z wyjściem 1K–4K i szczegółowym sterowaniem kreatywnym.
- Akceptowane dane wejściowe
- Tekst
- Wyniki
- Obrazy
Dostępne w Ailoot · dane wejściowe i metody
Ailoot · Obrazy POST /v1/images/generations
- Wejście
text- Wyjście
image- Kontekst
- 65 536 tokens
- Maksymalny wynik
- 32 768 tokens
- Format wyjściowy
- Plik obrazu
| Pole | Typ | Wymaganie | Wartości i limity | Domyślnie |
|---|---|---|---|---|
Polemodel | Typstring | WymaganieWymagane | Wartości i limity gemini-3-pro-image | Domyślnie— |
Poleprompt | Typstring | WymaganieWymagane | Wartości i limity Minimalna długość: 1 | Domyślnie— |
Polen | Typinteger | WymaganieOpcjonalne | Wartości i limity Minimum: 1 | Domyślnie1 |
Poleresponse_format | Typstring | WymaganieOpcjonalne | Wartości i limity url, b64_json | Domyślnie— |
Polestream | Typboolean | WymaganieOpcjonalne | Wartości i limity | Domyślniefalse |
Polesize | Typstring | WymaganieOpcjonalne | Wartości i limity Zależy od modelu | Domyślnie— |
Polequality | Typstring | WymaganieOpcjonalne | Wartości i limity Zależy od modelu | Domyślnie— |
Polebackground | Typstring | WymaganieOpcjonalne | Wartości i limity Zależy od modelu | Domyślnie— |
Poleoutput_format | Typstring | WymaganieOpcjonalne | Wartości i limity Zależy od modelu | Domyślnie— |
Poleoutput_compression | Typinteger | WymaganieOpcjonalne | Wartości i limity Zależy od modelu | Domyślnie— |
Polemoderation | Typstring | WymaganieOpcjonalne | Wartości i limity Zależy od modelu | Domyślnie— |
Poleinput_fidelity | Typstring | WymaganieOpcjonalne | Wartości i limity Zależy od modelu | Domyślnie— |
Polestyle | Typstring | WymaganieOpcjonalne | Wartości i limity Zależy od modelu | Domyślnie— |
Polepartial_images | Typinteger | WymaganieOpcjonalne | Wartości i limity Zależy od modelu | Domyślnie— |
Kombinacje materiałów wejściowych
Tekst na obraz · Wymagane: prompt
Parametry i cykl życia metody
| Parametr | Kontrakt |
|---|---|
Parametrmaterial_types | Kontrakttext |
Parametrrequired | Kontraktmodel, prompt |
Parametroptional_controls | Kontraktnull |
Parametrcontent_type | Kontraktapplication/json |
Cykl życia: synchronous_result_then_owned_library
GET /v1/media/tasks/{task_id} · Rzeczywiście zwrócony task_id lub wpis w bibliotece multimediów
GET /v1/media/assets/{asset_id}/content
GET /v1/media/assets
GET /v1/media/assets/{asset_id}
Struktury metod i ID są dokładne; możliwości dostawcy są odrębne od dopuszczenia żądania.
Cennik
Stawki metod Ailoot
POST /v1/images/generations- Wejście
- 0,002 USD / 1K tokenów obrazu
- Wyjście
- 0,134 USD za obraz o rozdzielczości 1K
- Wyjście
- 0,134 USD za obraz o rozdzielczości 2K
- Wyjście
- 0,24 USD za obraz o rozdzielczości 4K
Ailoot rezerwuje szacowaną kwotę przed żądaniem. Po otrzymaniu wyniku rozlicza ostateczną opłatę według zmierzonego użycia. Rozliczenie strumieniowania korzysta z końcowego rekordu użycia. Jak działają rezerwacja i rozliczenie →
Szczegóły taryfy referencyjnej
Referencyjne tabele modelu nie zmieniają wyboru metody, wyceny ani opłat. Naliczane opłaty korzystają ze stawek wybranej metody Ailoot.
Referencyjne tabele modelu
Ceny według konfiguracji
| Konfiguracja | Tabela stawek | Opłata |
|---|---|---|
| KonfiguracjaUltra | Tabela stawekStawka podstawowa | Opłata Wejście · Tokeny wejściowe $0.004000 / 1K tokenów Wyjście · Tokeny wyjściowe $0.024000 / 1K tokenów Wejście · obraz $0.004000 / 1K tokenów Wyjście · obraz na wyjściu $0.24000 / 1K tokenów Wejście · audio $0.004000 / 1K tokenów Wejście · pamięć podręczna wejściowego audio $0.0004000 / 1K tokenów Wyjście · wyszukiwanie w internecie $0.028 za wyszukiwanie w sieci Wyjście · wewnętrzne rozumowanie $0.024000 / 1K tokenów Wejście · Odczyt cache $0.0004000 / 1K tokenów Wejście · Zapis do cache $0.000750000 / 1K tokenów |
Przykładowe żądania
Ailoot · Obrazy
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");
Odbieranie i zapisywanie wyników
Ailoot · Obrazy
Pobierz każdy zwrócony obraz lub zapisz jego zawartość Base64
GET /v1/media/tasks/{task_id}GET /v1/media/assets/{asset_id}/contentGET /v1/media/assetsGET /v1/media/assets/{asset_id}
Zachowaj wszystkie ukończone wyniki
Zapisz każdy ukończony obraz; pobierz każdy zwrócony URL lub zdekoduj zawartość Base64.
Zachowaj każdy element danych. Zdekoduj każdą wartość b64_json lub pobierz dane z każdego zwróconego podpisanego adresu URL. Dobierz rozszerzenie nazwy pliku na podstawie rzeczywistego typu MIME lub bajtów.
Jeśli trzeba sprawdzić pierwotną odpowiedź
Jeśli wynik generowania lub edycji obrazu wymaga sprawdzenia, zachowaj pierwotny operation_id/X-Client-Request-ID oraz zwrócone informacje o wyniku. Odzyskaj istniejące własne wyniki z biblioteki multimediów, używając rzeczywistych wartości task_id lub asset_id. Nie wysyłaj ponownie żądania generowania lub edycji ani nie twórz adresu URL do sprawdzania stanu na podstawie operation_id.
Pola odpowiedzi
| Pole | Typ |
|---|---|
Polecreated | Typinteger |
Poledata[].url | Typstring |
Poledata[].b64_json | Typbase64 string |
Poleusage | Typobject |
Błędy i dalsze kroki
| Odpowiedź | Warunek | Następny krok |
|---|---|---|
Odpowiedź400 · invalid_request_error | WarunekNieprawidłowe wymagane pola, sposób reprezentacji materiału lub wartość parametru | Następny krokPopraw wskazane pola przed nowym żądaniem utworzenia. |
Odpowiedźserver_error | WarunekZwrócona odpowiedź wskazuje, że operacja lub wynik wymaga sprawdzenia | Następny krokZachowaj pierwotnie zwrócony identyfikator operacji lub zadania, nagłówki żądania i odpowiedź; kontynuuj obsługiwane odczyty tej pierwotnej operacji. Nie wysyłaj ponownie żądania utworzenia. |
Aliasy
Aliasy modelu
Ailoot gemini-3-pro-image, gemini-3-pro-image-preview, nano-banana-pro
Ailoot Ultra google/gemini-3-pro-image
Aliasy ścieżek metod
/v1/images
Powiązane ID modeli
google/gemini-3-pro-image, gemini-3-pro-image-preview, nano-banana-pro, gemini-3-pro-image
Ailoot · Obrazy POST /v1/images/generations gemini-3-pro-image-preview
gemini-3-pro-image-previewgemini-3-pro-imagegemini-3-pro-image-previewnano-banana-pro
Start
Nano Banana Pro (Gemini 3 Pro Image) to oparty na rozumowaniu model obrazowy Google do złożonych projektów, makiet produktów i wizualizacji faktograficznych. Przyjmuje tekst i referencje obrazowe oraz generuje obrazy z tekstem, z wyjściem 1K–4K i szczegółowym sterowaniem kreatywnym.
- Akceptowane dane wejściowe
- Tekst
- Wyniki
- Obrazy
Dostępne w Ailoot · dane wejściowe i metody
Ailoot · Obrazy POST /v1/images/generations
- Wejście
text- Wyjście
image- Kontekst
- 65 536 tokens
- Maksymalny wynik
- 32 768 tokens
- Format wyjściowy
- Plik obrazu
| Pole | Typ | Wymaganie | Wartości i limity | Domyślnie |
|---|---|---|---|---|
Polemodel | Typstring | WymaganieWymagane | Wartości i limity gemini-3-pro-image-preview | Domyślnie— |
Poleprompt | Typstring | WymaganieWymagane | Wartości i limity Minimalna długość: 1 | Domyślnie— |
Polen | Typinteger | WymaganieOpcjonalne | Wartości i limity Minimum: 1 | Domyślnie1 |
Poleresponse_format | Typstring | WymaganieOpcjonalne | Wartości i limity url, b64_json | Domyślnie— |
Polestream | Typboolean | WymaganieOpcjonalne | Wartości i limity | Domyślniefalse |
Polesize | Typstring | WymaganieOpcjonalne | Wartości i limity Zależy od modelu | Domyślnie— |
Polequality | Typstring | WymaganieOpcjonalne | Wartości i limity Zależy od modelu | Domyślnie— |
Polebackground | Typstring | WymaganieOpcjonalne | Wartości i limity Zależy od modelu | Domyślnie— |
Poleoutput_format | Typstring | WymaganieOpcjonalne | Wartości i limity Zależy od modelu | Domyślnie— |
Poleoutput_compression | Typinteger | WymaganieOpcjonalne | Wartości i limity Zależy od modelu | Domyślnie— |
Polemoderation | Typstring | WymaganieOpcjonalne | Wartości i limity Zależy od modelu | Domyślnie— |
Poleinput_fidelity | Typstring | WymaganieOpcjonalne | Wartości i limity Zależy od modelu | Domyślnie— |
Polestyle | Typstring | WymaganieOpcjonalne | Wartości i limity Zależy od modelu | Domyślnie— |
Polepartial_images | Typinteger | WymaganieOpcjonalne | Wartości i limity Zależy od modelu | Domyślnie— |
Kombinacje materiałów wejściowych
Tekst na obraz · Wymagane: prompt
Parametry i cykl życia metody
| Parametr | Kontrakt |
|---|---|
Parametrmaterial_types | Kontrakttext |
Parametrrequired | Kontraktmodel, prompt |
Parametroptional_controls | Kontraktnull |
Parametrcontent_type | Kontraktapplication/json |
Cykl życia: synchronous_result_then_owned_library
GET /v1/media/tasks/{task_id} · Rzeczywiście zwrócony task_id lub wpis w bibliotece multimediów
GET /v1/media/assets/{asset_id}/content
GET /v1/media/assets
GET /v1/media/assets/{asset_id}
Struktury metod i ID są dokładne; możliwości dostawcy są odrębne od dopuszczenia żądania.
Cennik
Stawki metod Ailoot
POST /v1/images/generations- Wejście
- 0,002 USD / 1K tokenów obrazu
- Wyjście
- 0,134 USD za obraz o rozdzielczości 1K
- Wyjście
- 0,134 USD za obraz o rozdzielczości 2K
- Wyjście
- 0,24 USD za obraz o rozdzielczości 4K
Ailoot rezerwuje szacowaną kwotę przed żądaniem. Po otrzymaniu wyniku rozlicza ostateczną opłatę według zmierzonego użycia. Rozliczenie strumieniowania korzysta z końcowego rekordu użycia. Jak działają rezerwacja i rozliczenie →
Szczegóły taryfy referencyjnej
Referencyjne tabele modelu nie zmieniają wyboru metody, wyceny ani opłat. Naliczane opłaty korzystają ze stawek wybranej metody Ailoot.
Referencyjne tabele modelu
Ceny według konfiguracji
| Konfiguracja | Tabela stawek | Opłata |
|---|---|---|
| KonfiguracjaUltra | Tabela stawekStawka podstawowa | Opłata Wejście · Tokeny wejściowe $0.004000 / 1K tokenów Wyjście · Tokeny wyjściowe $0.024000 / 1K tokenów Wejście · obraz $0.004000 / 1K tokenów Wyjście · obraz na wyjściu $0.24000 / 1K tokenów Wejście · audio $0.004000 / 1K tokenów Wejście · pamięć podręczna wejściowego audio $0.0004000 / 1K tokenów Wyjście · wyszukiwanie w internecie $0.028 za wyszukiwanie w sieci Wyjście · wewnętrzne rozumowanie $0.024000 / 1K tokenów Wejście · Odczyt cache $0.0004000 / 1K tokenów Wejście · Zapis do cache $0.000750000 / 1K tokenów |
Przykładowe żądania
Ailoot · Obrazy
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");
Odbieranie i zapisywanie wyników
Ailoot · Obrazy
Pobierz każdy zwrócony obraz lub zapisz jego zawartość Base64
GET /v1/media/tasks/{task_id}GET /v1/media/assets/{asset_id}/contentGET /v1/media/assetsGET /v1/media/assets/{asset_id}
Zachowaj wszystkie ukończone wyniki
Zapisz każdy ukończony obraz; pobierz każdy zwrócony URL lub zdekoduj zawartość Base64.
Zachowaj każdy element danych. Zdekoduj każdą wartość b64_json lub pobierz dane z każdego zwróconego podpisanego adresu URL. Dobierz rozszerzenie nazwy pliku na podstawie rzeczywistego typu MIME lub bajtów.
Jeśli trzeba sprawdzić pierwotną odpowiedź
Jeśli wynik generowania lub edycji obrazu wymaga sprawdzenia, zachowaj pierwotny operation_id/X-Client-Request-ID oraz zwrócone informacje o wyniku. Odzyskaj istniejące własne wyniki z biblioteki multimediów, używając rzeczywistych wartości task_id lub asset_id. Nie wysyłaj ponownie żądania generowania lub edycji ani nie twórz adresu URL do sprawdzania stanu na podstawie operation_id.
Pola odpowiedzi
| Pole | Typ |
|---|---|
Polecreated | Typinteger |
Poledata[].url | Typstring |
Poledata[].b64_json | Typbase64 string |
Poleusage | Typobject |
Błędy i dalsze kroki
| Odpowiedź | Warunek | Następny krok |
|---|---|---|
Odpowiedź400 · invalid_request_error | WarunekNieprawidłowe wymagane pola, sposób reprezentacji materiału lub wartość parametru | Następny krokPopraw wskazane pola przed nowym żądaniem utworzenia. |
Odpowiedźserver_error | WarunekZwrócona odpowiedź wskazuje, że operacja lub wynik wymaga sprawdzenia | Następny krokZachowaj pierwotnie zwrócony identyfikator operacji lub zadania, nagłówki żądania i odpowiedź; kontynuuj obsługiwane odczyty tej pierwotnej operacji. Nie wysyłaj ponownie żądania utworzenia. |
Aliasy
Aliasy modelu
Ailoot gemini-3-pro-image, gemini-3-pro-image-preview, nano-banana-pro
Ailoot Ultra google/gemini-3-pro-image
Aliasy ścieżek metod
/v1/images
Powiązane ID modeli
google/gemini-3-pro-image, gemini-3-pro-image-preview, nano-banana-pro, gemini-3-pro-image
Ailoot · Obrazy POST /v1/images/generations nano-banana-pro
nano-banana-progemini-3-pro-imagegemini-3-pro-image-previewnano-banana-pro
Start
Nano Banana Pro (Gemini 3 Pro Image) to oparty na rozumowaniu model obrazowy Google do złożonych projektów, makiet produktów i wizualizacji faktograficznych. Przyjmuje tekst i referencje obrazowe oraz generuje obrazy z tekstem, z wyjściem 1K–4K i szczegółowym sterowaniem kreatywnym.
- Akceptowane dane wejściowe
- Tekst
- Wyniki
- Obrazy
Dostępne w Ailoot · dane wejściowe i metody
Ailoot · Obrazy POST /v1/images/generations
- Wejście
text- Wyjście
image- Kontekst
- 65 536 tokens
- Maksymalny wynik
- 32 768 tokens
- Format wyjściowy
- Plik obrazu
| Pole | Typ | Wymaganie | Wartości i limity | Domyślnie |
|---|---|---|---|---|
Polemodel | Typstring | WymaganieWymagane | Wartości i limity nano-banana-pro | Domyślnie— |
Poleprompt | Typstring | WymaganieWymagane | Wartości i limity Minimalna długość: 1 | Domyślnie— |
Polen | Typinteger | WymaganieOpcjonalne | Wartości i limity Minimum: 1 | Domyślnie1 |
Poleresponse_format | Typstring | WymaganieOpcjonalne | Wartości i limity url, b64_json | Domyślnie— |
Polestream | Typboolean | WymaganieOpcjonalne | Wartości i limity | Domyślniefalse |
Polesize | Typstring | WymaganieOpcjonalne | Wartości i limity Zależy od modelu | Domyślnie— |
Polequality | Typstring | WymaganieOpcjonalne | Wartości i limity Zależy od modelu | Domyślnie— |
Polebackground | Typstring | WymaganieOpcjonalne | Wartości i limity Zależy od modelu | Domyślnie— |
Poleoutput_format | Typstring | WymaganieOpcjonalne | Wartości i limity Zależy od modelu | Domyślnie— |
Poleoutput_compression | Typinteger | WymaganieOpcjonalne | Wartości i limity Zależy od modelu | Domyślnie— |
Polemoderation | Typstring | WymaganieOpcjonalne | Wartości i limity Zależy od modelu | Domyślnie— |
Poleinput_fidelity | Typstring | WymaganieOpcjonalne | Wartości i limity Zależy od modelu | Domyślnie— |
Polestyle | Typstring | WymaganieOpcjonalne | Wartości i limity Zależy od modelu | Domyślnie— |
Polepartial_images | Typinteger | WymaganieOpcjonalne | Wartości i limity Zależy od modelu | Domyślnie— |
Kombinacje materiałów wejściowych
Tekst na obraz · Wymagane: prompt
Parametry i cykl życia metody
| Parametr | Kontrakt |
|---|---|
Parametrmaterial_types | Kontrakttext |
Parametrrequired | Kontraktmodel, prompt |
Parametroptional_controls | Kontraktnull |
Parametrcontent_type | Kontraktapplication/json |
Cykl życia: synchronous_result_then_owned_library
GET /v1/media/tasks/{task_id} · Rzeczywiście zwrócony task_id lub wpis w bibliotece multimediów
GET /v1/media/assets/{asset_id}/content
GET /v1/media/assets
GET /v1/media/assets/{asset_id}
Struktury metod i ID są dokładne; możliwości dostawcy są odrębne od dopuszczenia żądania.
Cennik
Stawki metod Ailoot
POST /v1/images/generations- Wejście
- 0,002 USD / 1K tokenów obrazu
- Wyjście
- 0,134 USD za obraz o rozdzielczości 1K
- Wyjście
- 0,134 USD za obraz o rozdzielczości 2K
- Wyjście
- 0,24 USD za obraz o rozdzielczości 4K
Ailoot rezerwuje szacowaną kwotę przed żądaniem. Po otrzymaniu wyniku rozlicza ostateczną opłatę według zmierzonego użycia. Rozliczenie strumieniowania korzysta z końcowego rekordu użycia. Jak działają rezerwacja i rozliczenie →
Szczegóły taryfy referencyjnej
Referencyjne tabele modelu nie zmieniają wyboru metody, wyceny ani opłat. Naliczane opłaty korzystają ze stawek wybranej metody Ailoot.
Referencyjne tabele modelu
Ceny według konfiguracji
| Konfiguracja | Tabela stawek | Opłata |
|---|---|---|
| KonfiguracjaUltra | Tabela stawekStawka podstawowa | Opłata Wejście · Tokeny wejściowe $0.004000 / 1K tokenów Wyjście · Tokeny wyjściowe $0.024000 / 1K tokenów Wejście · obraz $0.004000 / 1K tokenów Wyjście · obraz na wyjściu $0.24000 / 1K tokenów Wejście · audio $0.004000 / 1K tokenów Wejście · pamięć podręczna wejściowego audio $0.0004000 / 1K tokenów Wyjście · wyszukiwanie w internecie $0.028 za wyszukiwanie w sieci Wyjście · wewnętrzne rozumowanie $0.024000 / 1K tokenów Wejście · Odczyt cache $0.0004000 / 1K tokenów Wejście · Zapis do cache $0.000750000 / 1K tokenów |
Przykładowe żądania
Ailoot · Obrazy
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");
Odbieranie i zapisywanie wyników
Ailoot · Obrazy
Pobierz każdy zwrócony obraz lub zapisz jego zawartość Base64
GET /v1/media/tasks/{task_id}GET /v1/media/assets/{asset_id}/contentGET /v1/media/assetsGET /v1/media/assets/{asset_id}
Zachowaj wszystkie ukończone wyniki
Zapisz każdy ukończony obraz; pobierz każdy zwrócony URL lub zdekoduj zawartość Base64.
Zachowaj każdy element danych. Zdekoduj każdą wartość b64_json lub pobierz dane z każdego zwróconego podpisanego adresu URL. Dobierz rozszerzenie nazwy pliku na podstawie rzeczywistego typu MIME lub bajtów.
Jeśli trzeba sprawdzić pierwotną odpowiedź
Jeśli wynik generowania lub edycji obrazu wymaga sprawdzenia, zachowaj pierwotny operation_id/X-Client-Request-ID oraz zwrócone informacje o wyniku. Odzyskaj istniejące własne wyniki z biblioteki multimediów, używając rzeczywistych wartości task_id lub asset_id. Nie wysyłaj ponownie żądania generowania lub edycji ani nie twórz adresu URL do sprawdzania stanu na podstawie operation_id.
Pola odpowiedzi
| Pole | Typ |
|---|---|
Polecreated | Typinteger |
Poledata[].url | Typstring |
Poledata[].b64_json | Typbase64 string |
Poleusage | Typobject |
Błędy i dalsze kroki
| Odpowiedź | Warunek | Następny krok |
|---|---|---|
Odpowiedź400 · invalid_request_error | WarunekNieprawidłowe wymagane pola, sposób reprezentacji materiału lub wartość parametru | Następny krokPopraw wskazane pola przed nowym żądaniem utworzenia. |
Odpowiedźserver_error | WarunekZwrócona odpowiedź wskazuje, że operacja lub wynik wymaga sprawdzenia | Następny krokZachowaj pierwotnie zwrócony identyfikator operacji lub zadania, nagłówki żądania i odpowiedź; kontynuuj obsługiwane odczyty tej pierwotnej operacji. Nie wysyłaj ponownie żądania utworzenia. |
Aliasy
Aliasy modelu
Ailoot gemini-3-pro-image, gemini-3-pro-image-preview, nano-banana-pro
Ailoot Ultra google/gemini-3-pro-image
Aliasy ścieżek metod
/v1/images
Powiązane ID modeli
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-imageStart
Nano Banana Pro (Gemini 3 Pro Image) to oparty na rozumowaniu model obrazowy Google do złożonych projektów, makiet produktów i wizualizacji faktograficznych. Przyjmuje tekst i referencje obrazowe oraz generuje obrazy z tekstem, z wyjściem 1K–4K i szczegółowym sterowaniem kreatywnym.
- Akceptowane dane wejściowe
- Tekst
- Wyniki
- Tekst
Dostępne w Ailoot · dane wejściowe i metody
Ailoot Ultra · OpenAI Chat POST /v1/chat/completions
- Wejście
text- Wyjście
text- Format wyjściowy
- json lub SSE
| Pole | Typ | Wymaganie | Wartości i limity | Domyślnie |
|---|---|---|---|---|
Polemodel | Typstring | WymaganieWymagane | Wartości i limity google/gemini-3-pro-image | Domyślnie— |
Polemessages | Typmessage[] | WymaganieWymagane | Wartości i limity Minimalna liczba elementów: 1 | Domyślnie— |
Polemessages[].role | Typstring | WymaganieWymagane | Wartości i limity Przykłady: system, user, assistant, tool, function Warunki: Te role są jawnie reprezentowane przez typy zgodności w kodzie źródłowym; dokładny zestaw ról pozostaje właściwy dla danego modelu. Zależy od modelu | Domyślnie— |
Polemessages[].content | Typstring|content_part[]|null | WymaganieOpcjonalne | Wartości i limity | Domyślnie— |
Polemessages[].tool_calls | Typtool_call[] | WymaganieOpcjonalne | Wartości i limity | Domyślnie— |
Polemessages[].tool_call_id | Typstring | WymaganieOpcjonalne | Wartości i limity Obowiązuje, gdy: role=tool; użyj rzeczywiście zwróconego ID | Domyślnie— |
Polemessages[].name | Typstring | WymaganieOpcjonalne | Wartości i limity | Domyślnie— |
Polemessages[].reasoning_content | Typstring | WymaganieOpcjonalne | Wartości i limity Obowiązuje, gdy: Przekazuj z powrotem rzeczywiście zwróconą treść rozumowania, gdy ten model jej używa | Domyślnie— |
Polemessages[].reasoning_details | Typobject|array | WymaganieOpcjonalne | Wartości i limity Zależy od modelu | Domyślnie— |
Polemax_tokens | Typinteger | WymaganieOpcjonalne | Wartości i limity Minimum: 1 Zależy od modelu | Domyślnie— |
Polemax_completion_tokens | Typinteger | WymaganieOpcjonalne | Wartości i limity Minimum: 1 Zależy od modelu | Domyślnie— |
Polestream | Typboolean | WymaganieOpcjonalne | Wartości i limity | Domyślniefalse |
Polestream_options.include_usage | Typboolean | WymaganieOpcjonalne | Wartości i limity Zależy od modelu | Domyślnie— |
Poletemperature | Typnumber | WymaganieOpcjonalne | Wartości i limity Zależy od modelu | Domyślnie— |
Poletop_p | Typnumber | WymaganieOpcjonalne | Wartości i limity Zależy od modelu | Domyślnie— |
Polestop | Typstring|string[] | WymaganieOpcjonalne | Wartości i limity Zależy od modelu | Domyślnie— |
Poletools | Typfunction_tool[] | WymaganieOpcjonalne | Wartości i limity Zależy od modelu | Domyślnie— |
Poletools[].type | Typstring | WymaganieOpcjonalne | Wartości i limity function Zależy od modelu | Domyślnie— |
Poletools[].function.name | Typstring | WymaganieWymagane | Wartości i limity Obowiązuje, gdy: udostępnione narzędzie funkcji | Domyślnie— |
Poletools[].function.description | Typstring | WymaganieOpcjonalne | Wartości i limity | Domyślnie— |
Poletools[].function.parameters | TypJSON_schema | WymaganieOpcjonalne | Wartości i limity | Domyślnie— |
Poletool_choice | Typstring|object | WymaganieOpcjonalne | Wartości i limity Zależy od modelu | Domyślnie— |
Poleparallel_tool_calls | Typboolean | WymaganieOpcjonalne | Wartości i limity Zależy od modelu | Domyślnie— |
Poleresponse_format | Typobject | WymaganieOpcjonalne | Wartości i limity Zależy od modelu | Domyślnie— |
Polereasoning_effort | Typstring | WymaganieOpcjonalne | Wartości i limity Zależy od modelu | Domyślnie— |
Polereasoning | Typobject | WymaganieOpcjonalne | Wartości i limity Zależy od modelu | Domyślnie— |
Poleservice_tier | Typstring | WymaganieOpcjonalne | Wartości i limity Zależy od modelu | Domyślnie— |
Poleinstructions | Typstring | WymaganieOpcjonalne | Wartości i limity Pole zgodności | Domyślnie— |
Polefunctions | Typfunction[] | WymaganieOpcjonalne | Wartości i limity Zależy od modelu | Domyślnie— |
Polefunction_call | Typstring|object | WymaganieOpcjonalne | Wartości i limity Zależy od modelu | Domyślnie— |
Poleprompt_cache_options | Typobject | WymaganieOpcjonalne | Wartości i limity Zależy od modelu | Domyślnie— |
Polemodalities | Typstring[] | WymaganieOpcjonalne | Wartości i limity text | Domyślnie— |
Poleprovider | Typobject | WymaganieOpcjonalne | Wartości i limity Warunki: provider.options jest odrzucane na tej tekstowej trasie Ultra | Domyślnie— |
Polecache_control.ttl | Typstring | WymaganieOpcjonalne | Wartości i limity Warunki: 1h jest odrzucane w rzeczywistych miejscach pamięci podręcznej promptów | Domyślnie— |
Kombinacje materiałów wejściowych
Tekst · tekst UTF8
messages[].content
Parametry i cykl życia metody
| Parametr | Kontrakt |
|---|---|
Parametrcontent_type | Kontraktapplication/json |
Parametrrequired | Kontraktmodel, messages |
Parametrmaterial_types | Kontrakttext |
Parametrmessages | Kontrakttablica wiadomości o strukturze role/content |
Parametrfile_material | Kontraktrzeczywisty dokument UTF-8 wstawiony jako dosłowny tekst; bez wywnioskowanego ID pliku |
Parametroptional_controls | Kontraktstream, temperature, top_p, stop, max_tokens, max_completion_tokens, reasoning, response_format, tools, tool_choice |
Parametrcontrol_scope | Kontraktwłaściwe dla modelu; narzędzia funkcji użytkownika różnią się od narzędzi hostowanych |
Parametroutput_modalities | Kontrakttext |
Parametrhosted_operations | Kontraktfalse |
Parametrmultimodal_input_binding | Kontraktnull |
Cykl życia: synchronous_or_streamed
Wyślij dokładne ID modelu wraz z messages.
Długość kontekstu nie jest limitem wyjścia.
Plik tekstowy może dostarczyć dosłowny tekst; wejścia obrazowe/dźwiękowe/obiekty plików wymagają dokładnego powiązania.
Cennik
Informacje taryfowe nie dodają opcji żądania. Obsługiwane parametry podano przy wybranej metodzie.
- Tryb szybki
- Stawka standardowa Gdy wybrany jest tryb szybki
- Tryb flex
- Stawka standardowa Gdy wybrany jest tryb flex
- Maksymalna intensywność rozumowania
- Stawka standardowa Gdy dla maksymalnej intensywności rozumowania stosowana jest domyślna korekta (default)
- Wycena jawnej pamięci podręcznej
- Niewłączone Gdy zażądano jawnej pamięci podręcznej
Stawki Ailoot
Ceny według konfiguracji
Dopasuj każdą opłatę do pokazanych warunków. Użyj jednej stawki dla każdego zestawu alternatywnych konfiguracji.
| Konfiguracja | Tabela stawek | Tokeny kontekstu, więcej niż | Tokeny kontekstu, do podanej wartości włącznie | Opłata |
|---|---|---|---|---|
| KonfiguracjaPodstawowe stawki za tokeny | Tabela stawekStawka podstawowa | Tokeny kontekstu, więcej niż— | Tokeny kontekstu, do podanej wartości włącznieBez górnej granicy | Opłata Wejście · Tokeny wejściowe $0.004 / 1K tokenów Wyjście · Tokeny wyjściowe $0.024 / 1K tokenów Wejście · Odczyt cache $0.0004 / 1K tokenów Wejście · Zapis do cache $0.00075 / 1K tokenów Wejście · Zapis do cache, 1 godz. — / 1K tokenów Wyjście · Tokeny obrazu wyjściowego $0.24 / 1K tokenów obrazu |
| KonfiguracjaPrzedział długości żądania 1 | Tabela stawek— | Tokeny kontekstu, więcej niż0 | Tokeny kontekstu, do podanej wartości włącznieBez górnej granicy | Opłata Wejście · Tokeny wejściowe $0.004 / 1K tokenów Wyjście · Tokeny wyjściowe $0.024 / 1K tokenów Wejście · Odczyt cache $0.0004 / 1K tokenów Wejście · Zapis do cache $0.00075 / 1K tokenów Wejście · Zapis do cache, 1 godz. — / 1K tokenów |
Szczegóły taryfy referencyjnej
Referencyjne tabele modelu nie zmieniają wyboru metody, wyceny ani opłat. Naliczane opłaty korzystają ze stawek wybranej metody Ailoot.
Google: Nano Banana Pro (Gemini 3 Pro Image)
Ceny według konfiguracji
| Konfiguracja | Warunki rozliczania | Opłata |
|---|---|---|
| KonfiguracjaGoogle: Nano Banana Pro (Gemini 3 Pro Image) · Domyślna konfiguracja | Warunki rozliczaniaKonfiguracja domyślna | Opłata Wejście · Tokeny wejściowe 0,004 USD / 1K tokenów Wyjście · Tokeny wyjściowe 0,024 USD / 1K tokenów Wejście · Obraz wejściowy 0,004 USD / 1K tokenów Wyjście · Obraz wyjściowy 0,24 USD / 1K tokenów Wejście · Wejście audio 0,004 USD / 1K tokenów Wejście · Odczyt z pamięci podręcznej audio 0,0004 USD / 1K tokenów Wyjście · Wyszukiwanie w internecie 0,028 USD za wyszukiwanie Wyjście · Tokeny rozumowania 0,024 USD / 1K tokenów Wejście · Odczyt cache 0,0004 USD / 1K tokenów Wejście · Zapis do pamięci podręcznej · 5 minut 0,00075 USD / 1K tokenów |
Ailoot rezerwuje szacowaną kwotę przed żądaniem. Po otrzymaniu wyniku rozlicza ostateczną opłatę według zmierzonego użycia. Rozliczenie strumieniowania korzysta z końcowego rekordu użycia. Jak działają rezerwacja i rozliczenie →
Przykładowe żądania
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")
Odbieranie i zapisywanie wyników
Ailoot Ultra · OpenAI Chat
json lub SSE
Zachowaj wszystkie ukończone wyniki
Zachowaj każdą kompletną zwróconą odpowiedź, plik i część treści.
Zachowaj każdy wariant i jego treść/wywołania narzędzi/rozumowanie. W SSE składaj przyrosty według indeksu wariantu/narzędzia, zachowując końcowy powód zakończenia i dane użycia.
Jeśli trzeba sprawdzić pierwotną odpowiedź
Zachowaj ID i nagłówki żądań/odpowiedzi. Nie udostępniono ogólnego URL pobierania zadania tekstowego.
Pola odpowiedzi
| Pole | Typ |
|---|---|
Polechoices[].index | Typinteger |
Polechoices[].message.content | Typstring|null |
Polechoices[].message.tool_calls | Typtool_call[] |
Polechoices[].message.reasoning_content | Typstring |
Polechoices[].message.reasoning_details | Typobject|array |
Polechoices[].finish_reason | Typstring|null |
Poleusage | Typobject |
Błędy i dalsze kroki
| Odpowiedź | Warunek | Następny krok |
|---|---|---|
Odpowiedź400 · invalid_request_error | WarunekNieprawidłowe wymagane pola, sposób reprezentacji materiału lub wartość parametru | Następny krokPopraw wskazane pola przed nowym żądaniem utworzenia. |
Aliasy
Aliasy modelu
Ailoot gemini-3-pro-image, gemini-3-pro-image-preview, nano-banana-pro
Ailoot Ultra google/gemini-3-pro-image
Aliasy ścieżek metod
/v1/images
Powiązane ID modeli
google/gemini-3-pro-image, gemini-3-pro-image-preview, nano-banana-pro, gemini-3-pro-image
Ailoot Ultra · Obrazy POST /v1/images/generations google/gemini-3-pro-image
google/gemini-3-pro-imageStart
Nano Banana Pro (Gemini 3 Pro Image) to oparty na rozumowaniu model obrazowy Google do złożonych projektów, makiet produktów i wizualizacji faktograficznych. Przyjmuje tekst i referencje obrazowe oraz generuje obrazy z tekstem, z wyjściem 1K–4K i szczegółowym sterowaniem kreatywnym.
- Akceptowane dane wejściowe
- Tekst · Obrazy
- Wyniki
- Obrazy
Dostępne w Ailoot · dane wejściowe i metody
Ailoot Ultra · Obrazy POST /v1/images/generations
- Wejście
text,image- Wyjście
image
| Pole | Typ | Wymaganie | Wartości i limity | Domyślnie |
|---|---|---|---|---|
Polemodel | Typstring | WymaganieWymagane | Wartości i limity google/gemini-3-pro-image | Domyślnie— |
Poleprompt | Typstring | WymaganieWymagane | Wartości i limity Minimalna długość: 1 | Domyślnie— |
Poleresolution | Typstring | WymaganieOpcjonalne | Wartości i limity 1K, 2K, 4K | Domyślnie— |
Poleaspect_ratio | Typstring | WymaganieOpcjonalne | Wartości i limity 1:1, 2:3, 3:2, 3:4, 4:3, 4:5, 5:4, 9:16, 16:9, 21:9 | Domyślnie— |
Polen | Typinteger | WymaganieOpcjonalne | Wartości i limity Minimum: 1 Maksimum: 1 | Domyślnie— |
Poleinput_references | Typarray | WymaganieOpcjonalne | Wartości i limity Minimalna liczba elementów: 0 Maksymalna liczba elementów: 14 | Domyślnie— |
Poleprovider | Typobject | WymaganieOpcjonalne | Wartości i limity | Domyślnie— |
Parametry i cykl życia metody
| Parametr | Kontrakt |
|---|---|
Parametrcontent_type | Kontraktapplication/json |
Parametrrequired | Kontraktmodel, prompt |
Parametrmaterial_types | Kontrakttext, image |
Cykl życia: synchronous_result_then_owned_library
GET /v1/media/tasks/{task_id} · Rzeczywiście zwrócony task_id lub wpis w bibliotece multimediów
GET /v1/media/assets/{asset_id}/content
GET /v1/media/assets
GET /v1/media/assets/{asset_id}
Cennik
Jak obliczana jest ostateczna opłata
Wyświetlane stawki służą do oszacowania kosztu przed generowaniem. Ostateczna opłata jest obliczana na podstawie kosztu zarejestrowanego dla pierwotnego generowania. Zmierzony czas trwania wyniku i prognozowane ilości nie stanowią ostatecznej ilości podlegającej rozliczeniu.
Informacje taryfowe nie dodają opcji żądania. Obsługiwane parametry podano przy wybranej metodzie.
- Tryb szybki
- Nie określono Gdy wybrany jest tryb szybki
- Tryb flex
- Nie określono Gdy wybrany jest tryb flex
- Maksymalna intensywność rozumowania
- Nie określono Gdy dla maksymalnej intensywności rozumowania stosowana jest domyślna korekta (default)
Szacunkowe stawki do porównania
Ceny według konfiguracji
Dopasuj każdą opłatę do pokazanych warunków. Użyj jednej stawki dla każdego zestawu alternatywnych konfiguracji.
| Konfiguracja | Tabela stawek | Przewidywana ilość | Opłata |
|---|---|---|---|
| KonfiguracjaBazowe stawki za tokeny | Tabela stawekStawka podstawowa | Przewidywana ilość— | Opłata Wejście · Tokeny wejściowe · Szacunek tylko do porównania — / 1K tokenów Wyjście · Tokeny wyjściowe · Szacunek tylko do porównania — / 1K tokenów Wejście · Odczyt cache · Szacunek tylko do porównania — / 1K tokenów Wejście · Zapis do cache · Szacunek tylko do porównania — / 1K tokenów Wejście · Zapis do cache, 1 godz. · Szacunek tylko do porównania — / 1K tokenów |
| KonfiguracjaSzacowany koszt generowania | Tabela stawek— | Przewidywana ilośćszacunek dla jednego generowania | Opłata Wyjście · Szacowany koszt generowania · Szacunek tylko do porównania $0.98304 szacunek przed generowaniem Ten szacunek nie jest dodatkową opłatą ani stałą stawką za ukończone generowanie. |
Ailoot rezerwuje szacowaną kwotę przed żądaniem. Po otrzymaniu wyniku rozlicza ostateczną opłatę według zmierzonego użycia. Rozliczenie strumieniowania korzysta z końcowego rekordu użycia. Jak działają rezerwacja i rozliczenie →
Przykładowe żądania
Ailoot Ultra · Obrazy
set -eu
: "${AILOOT_API_KEY:?Set your Ailoot API key}"
export AILOOT_API_KEY
python3 - <<'PY_REQUEST'
import json,os
from pathlib import Path
p={'model': 'google/gemini-3-pro-image', 'prompt': 'a red panda astronaut floating in space, studio lighting'}
Path("request.json").write_text(json.dumps(p,ensure_ascii=False))
PY_REQUEST
curl --fail-with-body --silent --show-error https://api.ailoot.ai/v1/images/generations \
-H "Authorization: Bearer $AILOOT_API_KEY" -H 'Content-Type: application/json' \
--data-binary @request.json -D response-headers.txt -o result.json
python3 - <<'PY_RESULT'
import base64, json, os, subprocess
from pathlib import Path
from urllib.parse import urlsplit, urljoin
def save_images(items):
if not items: raise SystemExit("No completed images; retain the full response")
for index, item in enumerate(items):
encoded=item.get("b64_json")
uri=item.get("url", "")
if not encoded and uri.startswith("data:image/"):
header, separator, encoded=uri.partition(",")
if not separator or ";base64" not in header: raise SystemExit("Unsupported image data URI")
if encoded:
raw=base64.b64decode(encoded,validate=True)
elif uri:
uri=urljoin("https://api.ailoot.ai",uri)
parsed=urlsplit(uri)
if parsed.scheme!="https" or not parsed.netloc or parsed.username or parsed.password:
raise SystemExit("Invalid returned image URL")
owned=parsed.netloc=="api.ailoot.ai" and parsed.path.startswith("/v1/media/assets/") and parsed.path.endswith("/content")
args=["curl","--fail-with-body","--silent","--show-error",uri]
if owned: args += ["-H","Authorization: Bearer "+os.environ["AILOOT_API_KEY"]]
temporary=Path(f"image-{index}.bin")
subprocess.run(args+["-o",str(temporary)],check=True)
raw=temporary.read_bytes()
temporary.unlink()
else: raise SystemExit("Image has neither bytes nor URL")
if not raw: raise SystemExit("Empty image result")
ext="png" if raw.startswith(b"\x89PNG") else "jpg" if raw.startswith(b"\xff\xd8") else "webp" if raw[:4]==b"RIFF" and raw[8:12]==b"WEBP" else "svg" if raw.lstrip().startswith((b"<svg",b"<?xml")) else "bin"
Path(f"image-{index}.{ext}").write_bytes(raw)
print("Every returned image saved; complete response metadata retained")
save_images(json.loads(Path("result.json").read_text())["data"])
PY_RESULT
Odbieranie i zapisywanie wyników
Ailoot Ultra · Obrazy
Pobierz każdy zwrócony obraz lub zapisz jego zawartość Base64
GET /v1/media/tasks/{task_id}GET /v1/media/assets/{asset_id}/contentGET /v1/media/assetsGET /v1/media/assets/{asset_id}
Inne odczyty treści
set -eu
: "${AILOOT_API_KEY:?Set your Ailoot API key}"
curl --fail-with-body --silent --show-error https://api.ailoot.ai/v1/media/assets \
-H "Authorization: Bearer $AILOOT_API_KEY" -o owned-assets.json
# Preserve every returned asset and follow its exact signed content URL. Do not construct a signed token.
Zachowaj wszystkie ukończone wyniki
Zapisz każdy ukończony obraz; pobierz każdy zwrócony URL lub zdekoduj zawartość Base64.
Zachowaj pełną odpowiedź i nagłówki, wszystkie rzeczywiście uzyskane wyniki, pierwotnie zwrócone identyfikatory oraz wszystkie pola zużycia. Odzyskaj pierwotną operację bez ponownego wysyłania żądania utworzenia.
Jeśli trzeba sprawdzić pierwotną odpowiedź
Zachowaj zwrócony X-Client-Request-ID do uzgodnienia danych. Odczytuj wyłącznie rzeczywiście zwrócone wartości task_id/asset_id lub własną bibliotekę multimediów; nigdy nie buduj adresu URL zadania na podstawie identyfikatora operacji i nigdy nie wysyłaj ponownie żądania utworzenia.
Pola odpowiedzi
| Pole | Typ |
|---|---|
Polecreated | Typ |
Poledata[].url | Typ |
Poledata[].b64_json | Typ |
Poleusage | Typ |
Aliasy
Aliasy modelu
Ailoot gemini-3-pro-image, gemini-3-pro-image-preview, nano-banana-pro
Ailoot Ultra google/gemini-3-pro-image
Aliasy ścieżek metod
/v1/images
Powiązane ID modeli
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-imageStart
Nano Banana Pro (Gemini 3 Pro Image) to oparty na rozumowaniu model obrazowy Google do złożonych projektów, makiet produktów i wizualizacji faktograficznych. Przyjmuje tekst i referencje obrazowe oraz generuje obrazy z tekstem, z wyjściem 1K–4K i szczegółowym sterowaniem kreatywnym.
- Akceptowane dane wejściowe
- Tekst
- Wyniki
- json · sse
Dostępne w Ailoot · dane wejściowe i metody
Ailoot Ultra · Anthropic Messages POST /v1/messages
- Wejście
text- Wyjście
json,sse- Format wyjściowy
- JSON lub SSE
| Pole | Typ | Wymaganie | Wartości i limity | Domyślnie |
|---|---|---|---|---|
Polemodel | Typstring | WymaganieWymagane | Wartości i limity google/gemini-3-pro-image | Domyślnie— |
Polemessages | Typmessage[] | WymaganieWymagane | Wartości i limity | Domyślnie— |
Polemessages[].role | Typstring | WymaganieWymagane | Wartości i limity user, assistant | Domyślnie— |
Polemessages[].content | Typstring | WymaganieWymagane | Wartości i limity | Domyślnie— |
Polemax_tokens | Typinteger | WymaganieWymagane | Wartości i limity | Domyślnie— |
Polestream | Typboolean | WymaganieOpcjonalne | Wartości i limity | Domyślniefalse |
Kombinacje materiałów wejściowych
Tekst · tekst UTF-8
ciąg messages[].content
Parametry i cykl życia metody
| Parametr | Kontrakt |
|---|---|
Parametrcontent_type | Kontraktapplication/json |
Parametrrequired | Kontraktmodel, messages, max_tokens |
Parametroptional_controls | Kontraktstream |
Parametrmaterial_types | Kontrakttext |
Parametrtext_file_material | KontraktOdczytaj rzeczywisty dokument UTF-8 i umieść jego tekst we wskazanym polu input lub w ciągu treści wiadomości. |
Cykl życia: synchronous_or_streamed
Cennik
Informacje taryfowe nie dodają opcji żądania. Obsługiwane parametry podano przy wybranej metodzie.
- Tryb szybki
- Stawka standardowa Gdy wybrany jest tryb szybki
- Tryb flex
- Stawka standardowa Gdy wybrany jest tryb flex
- Maksymalna intensywność rozumowania
- Stawka standardowa Gdy dla maksymalnej intensywności rozumowania stosowana jest domyślna korekta (default)
- Wycena jawnej pamięci podręcznej
- Niewłączone Gdy zażądano jawnej pamięci podręcznej
Stawki Ailoot
Ceny według konfiguracji
Dopasuj każdą opłatę do pokazanych warunków. Użyj jednej stawki dla każdego zestawu alternatywnych konfiguracji.
| Konfiguracja | Tabela stawek | Tokeny kontekstu, więcej niż | Tokeny kontekstu, do podanej wartości włącznie | Opłata |
|---|---|---|---|---|
| KonfiguracjaPodstawowe stawki za tokeny | Tabela stawekStawka podstawowa | Tokeny kontekstu, więcej niż— | Tokeny kontekstu, do podanej wartości włącznieBez górnej granicy | Opłata Wejście · Tokeny wejściowe $0.004 / 1K tokenów Wyjście · Tokeny wyjściowe $0.024 / 1K tokenów Wejście · Odczyt cache $0.0004 / 1K tokenów Wejście · Zapis do cache $0.00075 / 1K tokenów Wejście · Zapis do cache, 1 godz. — / 1K tokenów Wyjście · Tokeny obrazu wyjściowego $0.24 / 1K tokenów obrazu |
| KonfiguracjaPrzedział długości żądania 1 | Tabela stawek— | Tokeny kontekstu, więcej niż0 | Tokeny kontekstu, do podanej wartości włącznieBez górnej granicy | Opłata Wejście · Tokeny wejściowe $0.004 / 1K tokenów Wyjście · Tokeny wyjściowe $0.024 / 1K tokenów Wejście · Odczyt cache $0.0004 / 1K tokenów Wejście · Zapis do cache $0.00075 / 1K tokenów Wejście · Zapis do cache, 1 godz. — / 1K tokenów |
Ailoot rezerwuje szacowaną kwotę przed żądaniem. Po otrzymaniu wyniku rozlicza ostateczną opłatę według zmierzonego użycia. Rozliczenie strumieniowania korzysta z końcowego rekordu użycia. Jak działają rezerwacja i rozliczenie →
Przykładowe żądania
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))
Odbieranie i zapisywanie wyników
Ailoot Ultra · Anthropic Messages
JSON lub SSE
Zachowaj wszystkie ukończone wyniki
Zachowaj każdą kompletną zwróconą odpowiedź, plik i część treści.
Zachowaj wszystkie bloki treści, sygnatury myślenia i rzeczywiste ID użycia narzędzi. Złóż wszystkie przyrosty bloków SSE; pierwszy blok tekstowy nie jest pełnym wyjściem.
Jeśli trzeba sprawdzić pierwotną odpowiedź
Zachowaj ID i nagłówki żądań/odpowiedzi. Nie udostępniono ogólnego URL pobierania zadania tekstowego.
Pola odpowiedzi
| Pole | Typ |
|---|---|
Poleid | Typstring |
Polemodel | Typstring |
Polecontent[] | Typtext|thinking|tool_use|other content block |
Polestop_reason | Typstring|null |
Poleusage | Typobject |
Błędy i dalsze kroki
| Odpowiedź | Warunek | Następny krok |
|---|---|---|
Odpowiedź400 · invalid_request_error | WarunekNieprawidłowe wymagane pola, sposób reprezentacji materiału lub wartość parametru | Następny krokPopraw wskazane pola przed nowym żądaniem utworzenia. |
Aliasy
Aliasy modelu
Ailoot gemini-3-pro-image, gemini-3-pro-image-preview, nano-banana-pro
Ailoot Ultra google/gemini-3-pro-image
Aliasy ścieżek metod
/v1/images
Powiązane ID modeli
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)
- Jakie dane wejściowe i wyniki są dostępne?
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- Jakich pól używa żądanie?
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- Jakie limity obowiązują?
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